From caa5cac7b72c60757691e4ebefacafe4d2b2f533 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 17 Oct 2026 16:05:34 +0800 Subject: [PATCH] test: demo seed now 18 footprints across two academic years --- app/server/db.mjs | 103 +++++++----- app/src/lib/zongce.ts | 47 +++--- app/src/pages/assessment/AssessmentPage.tsx | 149 ++++++++++++++---- scripts/test-integration.mjs | 6 +- ...Page-Dch0cjFb.js => AdminPage-C5wOCwKf.js} | 6 +- .../www/assets/AssessmentPage-7AoxKy-P.js | 1 - .../www/assets/AssessmentPage-Dvd34CqC.js | 13 ++ ...-DpgwpbHV.js => DashboardPage-B2FldowF.js} | 2 +- ...age-CVTBUD3I.js => GradesPage-JJ6n0CJZ.js} | 2 +- ...ge-ByBFpCNn.js => ProfilePage-CNbjDB4w.js} | 2 +- ...ge-C0AcNVzM.js => RecordsPage-A-isVkg3.js} | 2 +- ...age-Z8eiwwzo.js => ResumePage-CsGwAj0V.js} | 2 +- ...e-B1I0kN2Q.js => TaxonomyPage-DfBe5HxB.js} | 2 +- ...Page-BbQujrm2.js => TypesPage-DPbRIcZM.js} | 2 +- .../{card-jktDkcYF.js => card-65YyMNIi.js} | 2 +- sync-server/www/assets/index-Cn3Zl9XQ.css | 1 - sync-server/www/assets/index-D9uCsgi6.css | 1 + .../{index-DYhSDydL.js => index-DhGFbjWw.js} | 4 +- ...D-Y_aNE.js => mammoth.browser-DbBNylDz.js} | 2 +- ...-cw-CP7uPCIx.js => refresh-cw-C3HYho-f.js} | 2 +- ...ccw-CE3bwRx2.js => rotate-ccw-DGANt55P.js} | 2 +- ...Chart-DgHaQNyb.js => useChart-BbOzH_LJ.js} | 2 +- sync-server/www/assets/zongceWord-DuzvenT-.js | 1 - sync-server/www/index.html | 4 +- 24 files changed, 247 insertions(+), 113 deletions(-) rename sync-server/www/assets/{AdminPage-Dch0cjFb.js => AdminPage-C5wOCwKf.js} (97%) delete mode 100644 sync-server/www/assets/AssessmentPage-7AoxKy-P.js create mode 100644 sync-server/www/assets/AssessmentPage-Dvd34CqC.js rename sync-server/www/assets/{DashboardPage-DpgwpbHV.js => DashboardPage-B2FldowF.js} (94%) rename sync-server/www/assets/{GradesPage-CVTBUD3I.js => GradesPage-JJ6n0CJZ.js} (99%) rename sync-server/www/assets/{ProfilePage-ByBFpCNn.js => ProfilePage-CNbjDB4w.js} (99%) rename sync-server/www/assets/{RecordsPage-C0AcNVzM.js => RecordsPage-A-isVkg3.js} (99%) rename sync-server/www/assets/{ResumePage-Z8eiwwzo.js => ResumePage-CsGwAj0V.js} (99%) rename sync-server/www/assets/{TaxonomyPage-B1I0kN2Q.js => TaxonomyPage-DfBe5HxB.js} (97%) rename sync-server/www/assets/{TypesPage-BbQujrm2.js => TypesPage-DPbRIcZM.js} (98%) rename sync-server/www/assets/{card-jktDkcYF.js => card-65YyMNIi.js} (89%) delete mode 100644 sync-server/www/assets/index-Cn3Zl9XQ.css create mode 100644 sync-server/www/assets/index-D9uCsgi6.css rename sync-server/www/assets/{index-DYhSDydL.js => index-DhGFbjWw.js} (99%) rename sync-server/www/assets/{mammoth.browser-BD-Y_aNE.js => mammoth.browser-DbBNylDz.js} (99%) rename sync-server/www/assets/{refresh-cw-CP7uPCIx.js => refresh-cw-C3HYho-f.js} (91%) rename sync-server/www/assets/{rotate-ccw-CE3bwRx2.js => rotate-ccw-DGANt55P.js} (94%) rename sync-server/www/assets/{useChart-DgHaQNyb.js => useChart-BbOzH_LJ.js} (92%) delete mode 100644 sync-server/www/assets/zongceWord-DuzvenT-.js diff --git a/app/server/db.mjs b/app/server/db.mjs index fb58fb5..130d990 100644 --- a/app/server/db.mjs +++ b/app/server/db.mjs @@ -359,51 +359,59 @@ function openDb(dbPath) { // ---------- 演示数据(demo 账号播种 / 本地 seed 共用) ---------- // 行格式: [类型, 标题, 角色, 级别, 获奖等级, 主办方, 开始, 结束, 状态, 描述, 结果, 标签, 维度, extras, metrics] export const DEMO_ROWS = [ - ['竞赛', '2025 全国大学生数学建模竞赛', '主导', '国家级', '省市级二等奖', '中国工业与应用数学学会', '2025-09-05', '2025-09-08', 'finished', - '担任队长,负责模型建立与论文主笔;协调三人分工与时间安排', '重庆赛区二等奖', ['建模', '团队协作'], ['学业深造'], - { my_work: '模型建立与论文主笔', deliverable: '参赛论文《基于优化模型的共享单车调度研究》', team_members: '张三、李四、王五' }, {}], - ['竞赛', '第十六届蓝桥杯程序设计大赛', '参加', '省市级', '省市级二等奖', '工业和信息化部人才交流中心', '2025-04-12', '2025-06-20', 'finished', - '备战算法与数据结构,完成省赛', '重庆赛区 C/C++ B 组二等奖', ['算法'], ['职业发展', '学业深造'], - { my_work: '独立参赛', deliverable: '省赛获奖证书' }, {}], - ['竞赛', '全国大学生信息安全竞赛', '核心', '国家级', null, '教育部高等学校网络空间安全专业教学指导委员会', '2025-05-01', '2025-08-15', 'submitted', - '负责 Web 漏洞挖掘与利用脚本编写,参与作品报告撰写', '已提交作品,等待国赛评审', ['安全', 'CTF'], ['职业发展'], - { my_work: 'Web 漏洞挖掘与利用脚本编写', deliverable: '参赛作品与报告' }, {}], - ['志愿公益', '校图书馆迎新志愿服务', '参加', '校级', null, '校图书馆', '2025-09-01', '2025-09-05', 'finished', - '新生入馆引导与借阅咨询,共服务 5 天', '获馆方感谢信', ['志愿'], ['综合素养'], - { hours: 24, contact: '李老师' }, { volunteer_hours: 24 }], + // ---- 大一(2023-2024 学年):学生工作 / 志愿 / 文体 / 证书 ---- + ['学生工作', '院学生会宣传部干事', '干事', '院级', null, '院学生会', '2023-09-01', '2024-06-30', 'finished', + '负责活动推文撰写与海报设计,全年产出推文 20 篇', '获优秀干事', ['宣传'], ['综合素养'], + { duties: '推文撰写、海报设计、活动现场摄影', term: '2023.09 - 2024.06' }, {}], + ['志愿公益', '校迎新志愿服务', '参加', '校级', null, '校青年志愿者联合会', '2023-09-01', '2023-09-03', 'finished', + '新生入馆引导与借阅咨询', '获馆方感谢信', ['志愿'], ['综合素养'], + { hours: 24 }, { volunteer_hours: 24 }], + ['志愿公益', '无偿献血', '参加', null, null, '市中心血站', '2024-03-15', '2024-03-15', 'finished', + '全血献血 400ml', '', ['公益'], ['综合素养'], + { hours: 2 }, { volunteer_hours: 2 }], + ['文体活动', '校运动会男子3000米', '参加', '校级', '三等奖', '校体育运动委员会', '2024-04-18', '2024-04-20', 'finished', + '坚持训练一个月,决赛第三名', '', ['文体'], ['兴趣生活'], + { participation: '男子3000米决赛' }, {}], + ['证书技能', '大学英语四级(CET-4)', '参加', '国家级', null, '教育部教育考试院', '2024-06-15', '2024-08-20', 'finished', + '笔试 562 分', 'CET-4 562 分', ['英语'], ['学业深造', '职业发展'], + { score: '562' }, {}], + // ---- 大二(2024-2025 学年):竞赛 / 科研 / 荣誉 / 证书 ---- + ['竞赛', '全国大学生数学建模竞赛', '主导', '省市级', '一等奖', '中国工业与应用数学学会', '2024-09-05', '2024-09-08', 'finished', + '担任队长,负责模型建立与论文主笔;协调三人分工', '重庆赛区一等奖', ['建模', '团队协作'], ['学业深造'], + { my_work: '模型建立与论文主笔', team_members: '张三、李四' }, {}], + ['竞赛', '第十六届蓝桥杯程序设计大赛', '参加', '省市级', '二等奖', '工业和信息化部人才交流中心', '2025-04-12', '2025-06-01', 'finished', + '备战算法与数据结构,完成省赛', '重庆赛区 C/C++ B 组二等奖', ['算法'], ['职业发展'], + { my_work: '独立参赛' }, {}], + ['竞赛', '全国大学生信息安全竞赛', '核心', '国家级', '三等奖', '网络空间安全专业教指委', '2025-05-01', '2025-08-15', 'finished', + '负责 Web 漏洞挖掘与利用脚本编写', '全国总决赛三等奖', ['安全', 'CTF'], ['职业发展'], + { my_work: 'Web 漏洞挖掘与利用脚本' }, {}], + ['科研', '大学生创新创业训练计划项目', '主导', '校级', null, '校创新创业学院', '2025-03-01', null, 'ongoing', + '主持校级大创项目「基于流量特征的入侵检测研究」,带 2 名成员', '中期检查通过', ['科研', '安全'], ['学业深造'], + { authors: '主持人', outcome: '研究报告' }, {}], + ['文体活动', '校园十佳歌手大赛', '参加', '校级', '二等奖', '校团委', '2024-12-01', '2024-12-15', 'finished', + '初赛复赛决赛三轮', '校园十佳歌手', ['文体'], ['兴趣生活'], + {}, {}], ['志愿公益', '社区敬老院慰问活动', '参加', '区县级', null, '所在社区居委会', '2025-03-15', '2025-03-15', 'finished', '陪伴老人、协助整理活动室', '', ['志愿', '公益'], ['综合素养'], { hours: 6 }, { volunteer_hours: 6 }], - ['学生工作', '院学生会宣传部干事', '参加', '院级', null, '院学生会', '2024-09-01', '2025-06-30', 'finished', - '负责活动推文撰写与排版,全年产出推文 20 篇', '获优秀干事', ['宣传'], ['综合素养'], - { duties: '推文撰写与排版、活动现场摄影', term: '2024.09 - 2025.06' }, {}], - ['学生工作', '院学生会宣传部副部长', '主导', '院级', null, '院学生会', '2025-09-01', null, 'ongoing', - '统筹部门工作,管理 8 名干事,主导院级活动宣传方案', '', ['管理'], ['综合素养', '职业发展'], - { duties: '部门统筹、活动宣传方案设计', term: '2025.09 - 至今' }, {}], - ['荣誉惩处', '校级二等奖学金', '参加', '校级', null, '云川理工学院', '2025-10-15', '2025-10-15', 'finished', - '2024-2025 学年综合测评前列', '二等奖学金', ['奖学金'], ['学业深造'], - { issued_by: '云川理工学院' }, {}], + ['学生工作', '校学生会学习部干事', '干事', '校级', null, '校学生会', '2024-09-01', null, 'ongoing', + '负责学风建设活动组织与学业帮扶配对', '', ['学风'], ['综合素养'], + { duties: '学风活动组织、学业帮扶配对', term: '2024.09 - 至今' }, {}], ['荣誉惩处', '优秀共青团员', '参加', '校级', null, '校团委', '2025-05-04', '2025-05-04', 'finished', '五四表彰', '优秀共青团员', ['表彰'], ['综合素养'], - { issued_by: '共青团重庆城市科技学院委员会' }, {}], - ['证书技能', '大学英语六级', '参加', '国家级', null, '教育部教育考试院', '2025-06-14', '2025-08-20', 'finished', - '笔试 528 分', 'CET-6 528 分', ['英语'], ['学业深造', '职业发展'], - { cert_no: '510001251200123', score: '528' }, {}], - ['证书技能', '计算机技术与软件专业技术资格(中级)', '参加', '国家级', null, '工业和信息化部', '2025-11-08', null, 'ongoing', - '备考软件设计师', '', ['软考'], ['职业发展'], - { score: '' }, {}], - ['学业', '2024-2025 学年秋季学期', '参加', null, null, null, '2024-09-01', '2025-01-15', 'finished', - '学期绩点 3.72,专业排名 12/156', '', ['绩点'], ['学业深造'], - { semester_label: '2024-2025-1' }, {}], - ['学业', '2024-2025 学年春季学期', '参加', null, null, null, '2025-02-24', '2025-07-05', 'finished', - '学期绩点 3.85,专业排名 9/156', '', ['绩点'], ['学业深造'], - { semester_label: '2024-2025-2' }, {}], - ['文体活动', '校运动会开幕式方阵', '参加', '校级', null, '校体育运动委员会', '2025-04-18', '2025-04-20', 'finished', - '学院方阵队员,参与排练与开幕式表演', '', ['文体'], ['兴趣生活'], - { participation: '方阵队员' }, {}], - ['科研', '大学生创新创业训练计划项目', '主导', '校级', null, '校创新创业学院', '2025-03-01', null, 'ongoing', - '主持校级大创项目「基于流量特征的入侵检测研究」,带 2 名成员', '中期检查通过', ['科研', '安全'], ['学业深造', '职业发展'], - { authors: '主持人', outcome: '研究报告' }, {}], + {}, {}], + ['荣誉惩处', '综合测评奖学金', '参加', '校级', null, '云川理工学院', '2025-10-15', '2025-10-15', 'finished', + '2024-2025 学年综合测评前列(细则规定综测奖学金不加分,用于验证排除逻辑)', '二等奖学金', ['奖学金'], ['学业深造'], + {}, {}], + ['证书技能', '全国计算机等级考试二级', '参加', '国家级', null, '教育部考试中心', '2025-03-22', '2025-05-10', 'finished', + 'MS Office 高级应用', '二级合格证书', ['计算机'], ['职业发展'], + {}, {}], + ['证书技能', '机动车驾驶证(C1)', '参加', null, null, '市公安局交通管理局', '2024-07-01', '2024-08-10', 'finished', + '科目一到科目四一次通过', 'C1 驾驶证', ['驾照'], ['生活技能'], + {}, {}], + ['证书技能', '计算机技术与软件专业技术资格(软件设计师)', '参加', '国家级', null, '工业和信息化部', '2025-11-08', null, 'ongoing', + '备考软件设计师(中级)', '', ['软考'], ['职业发展'], + {}, {}], ['实习实践', '某安全公司渗透测试实习生', '参加', null, null, '某网络安全科技有限公司', '2025-07-01', '2025-08-25', 'finished', '参与企业授权渗透测试项目 3 个,编写测试报告', '获实习优秀评价', ['实习', '安全'], ['职业发展'], { position: '渗透测试实习生', mentor: '陈工' }, {}] @@ -421,7 +429,10 @@ export const DEMO_PROFILE = { } }; -// 学期: { term, gpa, rank, total, courses: [课程名, 学分, 分数, 绩点][] } +// 演示附件用真实 PNG(1x1,可在预览查看并进入综测证明材料) +const DEMO_PNG = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=='; + +// 学期: { term, gpa, rank, total, courses: [课程名, 学分, 分数, 绩点, 类别][] } export const DEMO_SEMESTERS = [ { term: '2023-2024-1', gpa: 3.42, rank: 38, total: 156, courses: [ ['高等数学(上)', 5, 78, 3.0, '必修课'], ['大学英语(一)', 3, 85, 3.7, '必修课'], ['程序设计基础', 4, 91, 4.0, '必修课'], @@ -433,7 +444,7 @@ export const DEMO_SEMESTERS = [ ]}, { term: '2024-2025-1', gpa: 3.78, rank: 18, total: 156, courses: [ ['概率论与数理统计', 3, 88, 3.9, '必修课'], ['操作系统', 4, 92, 4.0, '必修课'], ['计算机网络', 4, 86, 3.8, '必修课'], - ['数据库原理', 3, 94, 4.0, '必修课'], ['马克思主义基本原理', 2, 81, 3.3, '必修课'] + ['数据库原理', 3, 94, 4.0, '必修课'], ['马克思主义基本原理', 2, 81, 3.3, '必修课'], ['体育(三)', 1, 88, 3.9, '必修课'] ]}, { term: '2024-2025-2', gpa: 3.85, rank: 12, total: 156, courses: [ ['软件工程', 3, 90, 4.0, '必修课'], ['信息安全导论', 3, 95, 4.0, '必修课'], ['密码学基础', 3, 89, 3.9, '必修课'], @@ -1225,13 +1236,19 @@ function listFootprints(d, query) { for (const [t, title, role, level, grade, organizer, start, end, status, desc, result, tags, dimNames, extras, metrics] of DEMO_ROWS) { const typeId = typeIds[t]; if (!typeId) continue; - handleCommand('footprint_upsert', { item: { + const fr = handleCommand('footprint_upsert', { item: { type_id: typeId, title, role, level, award_grade: grade, organizer, start_date: start, end_date: end, status, description: desc, result, tags, metrics, extras, dimension_ids: (dimNames || []).map((nm) => dimIds[nm]).filter(Boolean), }}); n++; + // 演示附件:竞赛/荣誉记录附带证书图片(可预览、可进综测证明材料) + if (/竞赛|优秀共青团员/.test(String(title)) && status === 'finished') { + try { + handleCommand('attachment_add', { owner_id: fr.item.id, file_name: '获奖证书.png', mime: 'image/png', size: DEMO_PNG.length, data_b64: DEMO_PNG, thumb_b64: DEMO_PNG }); + } catch {} + } } let sems = 0; for (const s of DEMO_SEMESTERS) { diff --git a/app/src/lib/zongce.ts b/app/src/lib/zongce.ts index ce2888a..71517fe 100644 --- a/app/src/lib/zongce.ts +++ b/app/src/lib/zongce.ts @@ -38,12 +38,21 @@ export interface ZcOverrides { manual?: { title: string; section: string; score: number }[]; } -// 学期 → 统计时间窗 [start, end) -export function termRange(term: string): [string, string] | null { - const m = /^(\d{4})-(\d{4})-(1|2)$/.exec(term); +// 学年('2024-2025')→ 统计时间窗 [2024-09-01, 2025-09-01) +export function yearRange(year: string): [string, string] | null { + const m = /^(\d{4})-(\d{4})$/.exec(year); if (!m) return null; - const y1 = Number(m[1]); - return m[3] === '1' ? [y1 + '-09-01', (y1 + 1) + '-03-01'] : [(y1 + 1) + '-03-01', (y1 + 1) + '-09-01']; + return [m[1] + '-09-01', m[2] + '-09-01']; +} + +// 学年 → 年级名(按个人信息入学年份推算:大一~大四) +export function gradeLabel(year: string, eduStart?: string): string { + const m = /^(\d{4})-/.exec(year); + const e = /^(\d{4})/.exec(eduStart ?? ''); + if (!m || !e) return year + ' 学年'; + const n = Number(m[1]) - Number(e[1]) + 1; + const names = ['大一', '大二', '大三', '大四', '大五']; + return (names[n - 1] ?? n + '年级') + '(' + year + ' 学年)'; } function inRange(d: string | null | undefined, range: [string, string] | null): boolean { @@ -80,6 +89,7 @@ export interface ZcItem { score: number; overridden?: boolean; note?: string; + fromRecord?: number; } export interface ZcSection { key: string; label: string; cap: number; items: ZcItem[]; subtotal: number } export interface ZcResult { sections: ZcSection[]; total: number; gpa: number | null } @@ -94,7 +104,7 @@ function pickScore(r: ZcRules, levelKey: string | null, gradeKey: string | null) // 计算某学期(term,或 'all' 全年)的综测 export function computeZongce(opts: { - term: string; + year: string; records: FootprintRow[]; semesters: { term: string; gpa?: number | null; courses: CourseGrade[] }[]; bands?: GradeBand[]; @@ -103,14 +113,14 @@ export function computeZongce(opts: { rules: ZcRules; ov: ZcOverrides; }): ZcResult { - const { term, records, semesters, bands, weights, profile, rules: r, ov } = opts; - const range = term === 'all' ? null : termRange(term); + const { year, records, semesters, bands, weights, profile, rules: r, ov } = opts; + const range = year === 'all' ? null : yearRange(year); const scoped = records.filter(x => x.status !== 'draft' && inRange(x.start_date ?? x.created_at, range)); const ovItem = (k: string) => ov.itemOverrides?.[k]; - const mk = (k: string, title: string, source: string, auto: number | null, note?: string): ZcItem => { + const mk = (k: string, title: string, source: string, auto: number | null, note?: string, fromRecord?: number): ZcItem => { const o = ovItem(k); const score = o?.score ?? (auto ?? 0); - return { itemKey: k, title, source, score, overridden: o?.score != null, note }; + return { itemKey: k, title, source, score, overridden: o?.score != null, note, fromRecord }; }; const sec = (key: string, label: string, cap: number, items: ZcItem[]): ZcSection => ({ key, label, cap, items, @@ -133,9 +143,9 @@ export function computeZongce(opts: { // ---- 学业成绩(60):学年平均学分绩点 × 10 ---- const scopedCourses: CourseGrade[] = []; for (const x of semesters) { - if (!inRange(null, null)) continue; - const rng = term === 'all' ? null : termRange(x.term); - const hit = term === 'all' || (range && rng && !(rng[1] <= range[0] || rng[0] >= range[1])); + if (range && !yearRange(x.term)) continue; + const rng = yearRange(x.term); + const hit = range === null || (rng && !(rng[1] <= range[0] || rng[0] >= range[1])); if (hit) scopedCourses.push(...x.courses); } let gpa: number | null = null; @@ -174,7 +184,7 @@ export function computeZongce(opts: { for (const rec of scoped.filter(x => x.type_name === '文体活动')) { const auto = pickScore(r, normLevel(rec.level), normGrade(rec.award_grade)); if (auto == null && !ovItem('w' + rec.id)?.score) continue; - wItems.push(mk('w' + rec.id, rec.title, rec.type_name + ' · ' + (rec.level ?? '') + ' ' + (rec.award_grade ?? ''), auto)); + wItems.push(mk('w' + rec.id, rec.title, rec.type_name + ' · ' + (rec.level ?? '') + ' ' + (rec.award_grade ?? ''), auto, undefined, rec.id)); } const wCap = round2(Math.min(wItems.reduce((a, x) => a + x.score, 0), 5)); sections.push(sec('sports', '文体素质', 10, [...sportsItems, { itemKey: 'wcap', title: '文体类加分(上限 5 分)', source: wItems.length + ' 条记录', score: wCap, note: wItems.map(x => x.title + ' ' + x.score + '分').join(';') || '无匹配记录' }])); @@ -184,7 +194,7 @@ export function computeZongce(opts: { for (const rec of scoped.filter(x => x.type_name === '竞赛' || x.type_name === '科研')) { const auto = pickScore(r, normLevel(rec.level), normGrade(rec.award_grade)); if (auto == null && !ovItem('c' + rec.id)?.score) continue; - compItems.push(mk('c' + rec.id, rec.title, rec.type_name + ' · ' + (rec.level ?? '') + ' ' + (rec.award_grade ?? ''), auto)); + compItems.push(mk('c' + rec.id, rec.title, rec.type_name + ' · ' + (rec.level ?? '') + ' ' + (rec.award_grade ?? ''), auto, undefined, rec.id)); } const compCap = round2(Math.min(compItems.reduce((a, x) => a + x.score, 0), 10)); const workItems: ZcItem[] = []; @@ -195,7 +205,7 @@ export function computeZongce(opts: { let auto: number | null = null; for (const [k, v] of Object.entries(tbl)) { if (role.includes(k)) { auto = v; break; } } if (auto == null && !ovItem('k' + rec.id)?.score) continue; - workItems.push(mk('k' + rec.id, rec.title, '学生工作 · ' + (rec.level ?? '院级') + ' ' + (rec.role ?? ''), auto, auto == null ? '请手动填写分值' : undefined)); + workItems.push(mk('k' + rec.id, rec.title, '学生工作 · ' + (rec.level ?? '院级') + ' ' + (rec.role ?? ''), auto, auto == null ? '请手动填写分值' : undefined, rec.id)); } const workCap = round2(Math.min(workItems.reduce((a, x) => a + x.score, 0), 4)); const pubItems: ZcItem[] = []; @@ -204,7 +214,7 @@ export function computeZongce(opts: { const blood = /献血/.test(rec.title); let auto: number | null = blood ? r.publicGood['无偿献血'] : (lvl ? r.publicGood[lvl] ?? null : null); if (auto == null && !ovItem('g' + rec.id)?.score) continue; - pubItems.push(mk('g' + rec.id, rec.title, '公益 · ' + (blood ? '无偿献血' : rec.level ?? '校级'), auto)); + pubItems.push(mk('g' + rec.id, rec.title, '公益 · ' + (blood ? '无偿献血' : rec.level ?? '校级'), auto, undefined, rec.id)); } const pubCap = round2(Math.min(pubItems.reduce((a, x) => a + x.score, 0), 3)); sections.push(sec('expand', '拓展性素质', 17, [ @@ -218,6 +228,7 @@ export function computeZongce(opts: { for (const rec of scoped.filter(x => x.type_name === '荣誉惩处' || x.type_name === '证书技能')) { const o = ovItem('h' + rec.id); const text = rec.title + ' ' + (rec.award_grade ?? ''); + if (/综合测评奖学金/.test(text)) continue; // 细则:综合测评奖学金不加分 let auto: number | null = null; let source = rec.type_name; if (/留校察看/.test(text)) auto = -r.penalties['留校察看']; @@ -241,7 +252,7 @@ export function computeZongce(opts: { if (lkey && r.rewards['荣誉称号'][lkey] != null) { auto = r.rewards['荣誉称号'][lkey]; source = '荣誉 · ' + lkey; } } if (auto == null && !o?.score) continue; - rwItems.push(mk('h' + rec.id, rec.title, source, auto)); + rwItems.push(mk('h' + rec.id, rec.title, source, auto, undefined, rec.id)); } const rwCap = round2(Math.max(Math.min(rwItems.reduce((a, x) => a + x.score, 0), 5), -5)); sections.push(sec('rewards', '奖惩分', 5, [{ itemKey: 'hcap', title: '奖惩合计(±5 分)', source: rwItems.length + ' 条记录', score: rwCap, note: rwItems.map(x => x.title + ' ' + x.score + '分').join(';') || '无匹配记录' }])); diff --git a/app/src/pages/assessment/AssessmentPage.tsx b/app/src/pages/assessment/AssessmentPage.tsx index 92b124b..17cae44 100644 --- a/app/src/pages/assessment/AssessmentPage.tsx +++ b/app/src/pages/assessment/AssessmentPage.tsx @@ -1,11 +1,65 @@ import { useEffect, useMemo, useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Download, Printer, RotateCcw } from 'lucide-react'; -import { footprintList, gradesOverview, profileGet, profileUpsert } from '@/lib/api'; +import { attachmentList, attachmentThumb, footprintList, gradesOverview, profileGet, profileUpsert } from '@/lib/api'; import type { FootprintRow, ProfileInfo, ZcOverrides } from '@/lib/types'; -import { computeZongce, ZC_DEFAULT_RULES, type ZcRules } from '@/lib/zongce'; +import { computeZongce, gradeLabel, ZC_DEFAULT_RULES, type ZcRules, type ZcResult } from '@/lib/zongce'; import { Button, Select, useToast } from '@/components/ui'; +interface Evidence { recordId: number; title: string; images: string[] } + +function esc(t: unknown) { return String(t ?? '').replace(/&/g, '&').replace(//g, '>'); } + +// MHTML:把图片内嵌进 Word(.doc)的可靠方式 +function buildMhtml(html: string, images: { name: string; dataUri: string }[]): Blob { + const boundary = '----=_fp_zongce'; + const parts: string[] = []; + parts.push('--' + boundary + '\r\nContent-Type: text/html; charset="utf-8"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n' + html + '\r\n'); + for (const img of images) { + const idx = img.dataUri.indexOf(','); + const meta = img.dataUri.slice(0, idx); + const b64 = img.dataUri.slice(idx + 1); + const mime = /data:([^;]+)/.exec(meta)?.[1] ?? 'image/png'; + parts.push('--' + boundary + '\r\nContent-Type: ' + mime + '\r\nContent-Transfer-Encoding: base64\r\nContent-Location: ' + img.name + '\r\n\r\n' + b64 + '\r\n'); + } + parts.push('--' + boundary + '--\r\n'); + return new Blob([parts.join('')], { type: 'multipart/related; type="text/html"; boundary="' + boundary + '"' }); +} + +function zongceWordMhtml(termLabel: string, result: ZcResult, profile: Partial, evidence: Evidence[]): Blob { + const body = result.sections.map(sec => { + const subtotal = sec.key === 'rewards' ? sec.subtotal : Math.min(sec.subtotal, sec.cap); + const rows = sec.items.map(it => + '' + + '' + esc(it.title) + '' + + '' + esc(it.note || it.source) + '' + + '' + esc(it.score) + '').join(''); + return '

' + esc(sec.label) + '(上限 ' + esc(sec.cap) + ' 分,小计 ' + esc(subtotal) + ' 分)

' + + '' + rows + '
'; + }).join(''); + const images: { name: string; dataUri: string }[] = []; + const annex = evidence.map(ev => { + let imgs = ''; + ev.images.forEach((uri, i) => { + const name = 'ev' + ev.recordId + '_' + i; + images.push({ name, dataUri: uri }); + imgs += '
图 ' + (i + 1) + '
'; + }); + return '
' + esc(ev.title) + '' + imgs + '
'; + }).join(''); + const html = '' + + '综合素质测评' + + '' + + '

学生综合素质测评

' + + '
' + esc(profile.name ?? '') + ' · ' + esc(profile.className ?? '') + ' · 统计周期:' + esc(termLabel) + '
' + + '

综合素质总分:' + esc(result.total) + ' 分

' + + body + (annex ? '

附:证明材料

' + annex : '') + + '' + + '
学生签名:______辅导员签名:______日期:______
' + + ''; + return buildMhtml(html, images); +} + export function AssessmentPage() { const toast = useToast(); const profileQ = useQuery({ queryKey: ['profile'], queryFn: profileGet }); @@ -15,61 +69,86 @@ export function AssessmentPage() { const stored = profileQ.data?.content; const profile: Partial = { ...(stored?.info ?? {}) }; const rules: ZcRules = stored?.zongce?.rules ?? ZC_DEFAULT_RULES; - const [term, setTerm] = useState(''); + const [year, setYear] = useState(''); const [ovMap, setOvMap] = useState>({}); + const [evidence, setEvidence] = useState([]); useEffect(() => { if (!stored) return; setOvMap(stored.zongce?.overrides ?? {}); - const sems = (gradesQ.data?.semesters ?? []).map(x => x.term); - if (!term && sems.length) setTerm(sems[0]); + const years = Array.from(new Set((gradesQ.data?.semesters ?? []).map(x => x.term.slice(0, 7)))); + if (!year && years.length) setYear(years[0]); }, [stored, gradesQ.data]); const records: FootprintRow[] = listQ.data?.items ?? []; - const ov: ZcOverrides = ovMap[term] ?? {}; + const ov: ZcOverrides = ovMap[year] ?? {}; const result = useMemo( () => computeZongce({ - term: term || 'all', records, + year: year || 'all', records, semesters: gradesQ.data?.semesters ?? [], bands: gradesQ.data?.bands, weights: gradesQ.data?.weights, profile, rules, ov, }), - [records, gradesQ.data, profile, rules, ov, term] + [records, gradesQ.data, profile, rules, ov, year] ); - const persistOv = (next: ZcOverrides) => { - setOvMap(m => ({ ...m, [term]: next })); - void profileUpsert({ info: profile, zongce: { rules, overrides: { ...ovMap, [term]: next } } }).catch(e => toast('error', e.message)); - }; + // 证明材料:匹配条目对应记录的附件缩略图 + const matchedIds = useMemo(() => { + const ids: number[] = []; + result.sections.forEach(sec => sec.items.forEach(it => { if (it.fromRecord) ids.push(it.fromRecord); })); + return ids; + }, [result]); + useEffect(() => { + let alive = true; + (async () => { + const out: Evidence[] = []; + for (const rid of matchedIds) { + const rec = records.find(r => r.id === rid); + try { + const attList = await attachmentList(rid); + const images: string[] = []; + for (const att of attList.items.filter(x => x.id).slice(0, 3)) { + const th = await attachmentThumb(att.id); + if (th.data_b64) images.push('data:' + (att.mime === 'image/jpeg' ? 'image/jpeg' : 'image/webp') + ';base64,' + th.data_b64); + } + if (images.length) out.push({ recordId: rid, title: rec?.title ?? '记录 ' + rid, images }); + } catch {} + } + if (alive) setEvidence(out); + })(); + return () => { alive = false; }; + }, [matchedIds.join(',')]); + + const persistOv = (next: ZcOverrides) => { + setOvMap(m => ({ ...m, [year]: next })); + void profileUpsert({ info: profile, zongce: { rules, overrides: { ...ovMap, [year]: next } } }).catch(e => toast('error', e.message)); + }; const resetOverrides = () => { const next = { ...ovMap }; - delete next[term]; + delete next[year]; setOvMap(next); void profileUpsert({ info: profile, zongce: { rules, overrides: next } }).then(() => toast('success', '已恢复自动计算')).catch(e => toast('error', e.message)); }; - const termLabel = term === 'all' ? '全学年' : term; + const termLabel = year === 'all' ? '全部学年' : gradeLabel(year, profile.eduStart); const exportWord = () => { - void import('@/lib/zongceWord').then(({ zongceToWordHtml }) => { - const html = zongceToWordHtml(termLabel, result.sections, result.total, profile); - const blob = new Blob(['\ufeff' + html], { type: 'application/msword' }); - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; a.download = '综合素质测评_' + termLabel + '.doc'; a.click(); - setTimeout(() => URL.revokeObjectURL(url), 60000); - toast('success', '综测材料已导出'); - }); + const blob = zongceWordMhtml(termLabel, result, profile, evidence); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; a.download = '综合素质测评_' + termLabel + '.doc'; a.click(); + setTimeout(() => URL.revokeObjectURL(url), 60000); + toast('success', '综测材料已导出' + (evidence.length ? '(含 ' + evidence.length + ' 条证明材料图片)' : '')); }; return (
-

综合测评(自动计算)

+

综合测评(按学年自动计算)

- setYear(e.target.value)} + options={[...Array.from(new Set((gradesQ.data?.semesters ?? []).map(x => x.term.slice(0, 7)))).map(y => ({ value: y, label: gradeLabel(y, profile.eduStart) })), { value: 'all', label: '全部学年' }]} /> @@ -116,9 +195,25 @@ export function AssessmentPage() {
))} + {evidence.length > 0 && ( +
+
附:证明材料
+ {evidence.map(ev => ( +
+
{ev.title}
+
+ {ev.images.map((src, i) => ( + {'证明 + ))} +
+
+ ))} +
+ )} +
计分依据:《计算机与网络安全学院学生综合素质测评评分细则》。自动匹配条目均可手动修正分值; - 「恢复自动」清除本学期全部手动修正。导出材料前请核对每条加分记录与证明材料一致。 + 「恢复自动」清除本学年全部手动修正。导出材料前请核对每条加分记录与证明材料一致。
diff --git a/scripts/test-integration.mjs b/scripts/test-integration.mjs index 755258d..f43a33e 100644 --- a/scripts/test-integration.mjs +++ b/scripts/test-integration.mjs @@ -57,7 +57,7 @@ const rootMe = await api(A, 'GET', '/auth/me', undefined, T); ok(rootMe.body?.data?.username === 'root' && rootMe.body?.data?.is_admin === true, 'root 是管理员', rootMe.body); const fp = await api(A, 'POST', '/api/footprint_list', { query: { page: 1, page_size: 50 } }, D); -ok(fp.body?.data?.total === 16, '演示足迹 16 条(播种成功)', fp.body?.data?.total); +ok(fp.body?.data?.total === 18, '演示足迹 18 条(播种成功)', fp.body?.data?.total); const grades = await api(A, 'POST', '/api/grades_overview', {}, D); ok(grades.body?.data?.semesters?.length === 4, '演示学期 4 个', grades.body?.data?.semesters?.length); const tl = await api(A, 'POST', '/api/timeline', { query: {} }, D); @@ -167,7 +167,7 @@ ok(reseed.body?.data?.seeded === false, '重复播种幂等跳过', reseed.body) // demo 重建路由(管理员):重置 demo 数据为初始播种态 const re2 = await api(A, 'POST', '/admin/demo-rebuild', {}, T); -ok(re2.status === 200 && re2.body?.data?.seeded?.footprints === 16, 'demo 重建路由可达', re2.body); +ok(re2.status === 200 && re2.body?.data?.seeded?.footprints === 18, 'demo 重建路由可达', re2.body); // ---------- Phase B:同一数据目录「重启」(新模块实例 + 新端口) ---------- console.log('\n== Phase B:重启后(持久化 + 不重复播种) =='); @@ -180,7 +180,7 @@ const rootLogin2 = await api(B, 'POST', '/auth/login', { username: 'root', passw ok(rootLogin2.status === 200, '重启后 root 可登录', rootLogin2.body); const T2 = rootLogin2.body.data.token; const fp2 = await api(B, 'POST', '/api/footprint_list', { query: { page: 1, page_size: 50 } }, D2); -ok(fp2.body?.data?.total === 16, '重启后仍是 16 条(测试足迹已被级联删除)', fp2.body?.data?.total); +ok(fp2.body?.data?.total === 18, '重启后仍是 18 条(测试足迹已被级联删除)', fp2.body?.data?.total); const list2 = (await api(B, 'GET', '/admin/invites', undefined, T2)).body.data.invites; ok(list2.some((i) => i.code === 'XIONG-FRIEND-2025'), '邀请码跨重启持久化'); diff --git a/sync-server/www/assets/AdminPage-Dch0cjFb.js b/sync-server/www/assets/AdminPage-C5wOCwKf.js similarity index 97% rename from sync-server/www/assets/AdminPage-Dch0cjFb.js rename to sync-server/www/assets/AdminPage-C5wOCwKf.js index 3209d90..fabfaa0 100644 --- a/sync-server/www/assets/AdminPage-Dch0cjFb.js +++ b/sync-server/www/assets/AdminPage-C5wOCwKf.js @@ -1,5 +1,5 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DYhSDydL.js","assets/index-Cn3Zl9XQ.css"])))=>i.map(i=>d[i]); -import{c as j,u as je,d as ve,$ as ge,f as q,a0 as T,r as i,g as o,j as e,E as f,B as t,a1 as te,m as x,k as ne,a2 as ie,T as re,P as be,I as k,l as ye,H as le,a3 as fe,a4 as ke,a5 as Ne,a6 as Ce,a7 as _e,a8 as we,a9 as ze,aa as Se,ab as Ee}from"./index-DYhSDydL.js";import{C as D,a as P,b as R}from"./card-jktDkcYF.js";import{R as Me}from"./refresh-cw-CP7uPCIx.js";/** +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DhGFbjWw.js","assets/index-D9uCsgi6.css"])))=>i.map(i=>d[i]); +import{c as j,u as je,d as ve,$ as ge,f as q,a0 as T,r as i,g as o,j as e,E as f,B as t,a1 as te,m as x,k as ne,a2 as ie,T as re,P as be,I as k,l as ye,H as le,a3 as fe,a4 as ke,a5 as Ne,a6 as Ce,a7 as _e,a8 as we,a9 as ze,aa as Se,ab as Ee}from"./index-DhGFbjWw.js";import{C as D,a as P,b as R}from"./card-65YyMNIi.js";import{R as Me}from"./refresh-cw-C3HYho-f.js";/** * @license lucide-react v0.475.0 - ISC * * This source code is licensed under the ISC license. @@ -24,5 +24,5 @@ import{c as j,u as je,d as ve,$ as ge,f as q,a0 as T,r as i,g as o,j as e,E as f * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Re=[["path",{d:"M18 21a8 8 0 0 0-16 0",key:"3ypg7q"}],["circle",{cx:"10",cy:"8",r:"5",key:"o932ke"}],["path",{d:"M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3",key:"10s06x"}]],Q=j("UsersRound",Re);function Qe({i:d}){return d.used_by?e.jsx(x,{color:"var(--text-3)",children:"已使用"}):d.valid?e.jsx(x,{color:"var(--success)",children:"可用"}):e.jsx(x,{color:"var(--warning)",children:"已停用"})}function $e(){var Z,J,Y,ee,se,ae;const d=je(),K=ve(),r=ge(),N=q({queryKey:["me-admin"],queryFn:async()=>(await ze(()=>import("./index-DYhSDydL.js").then(a=>a.ak),__vite__mapDeps([0,1]))).serverMe(r),enabled:!!T()}),m=q({queryKey:["admin-users"],queryFn:()=>Se(r),enabled:!!T()}),C=q({queryKey:["admin-invites"],queryFn:()=>Ee(r),enabled:!!T()}),[O,l]=i.useState(""),[oe,A]=i.useState(null),[xe,_]=i.useState(!1),[v,w]=i.useState(""),[$,z]=i.useState(""),[me,u]=i.useState(null),[S,E]=i.useState(""),[h,ue]=i.useState("all"),[n,g]=i.useState(null),[B,M]=i.useState(""),[he,b]=i.useState(!1),y=()=>{d.invalidateQueries({queryKey:["admin-invites"]})},c=s=>l(s.message||"操作失败"),L=o({mutationFn:()=>we(r),onSuccess:s=>{var a,p;b(!1),l(""),K("success","演示账号已重建:"+(((a=s.seeded)==null?void 0:a.footprints)??0)+" 条记录 + "+(((p=s.seeded)==null?void 0:p.semesters)??0)+" 学期"),d.invalidateQueries({queryKey:["admin-users"]})},onError:c}),H=o({mutationFn:s=>_e(s,r),onSuccess:s=>{d.invalidateQueries({queryKey:["admin-users"]}),g(null),M(""),l(""),K("success","用户「"+s.username+"」及其全部数据已删除")},onError:c}),V=o({mutationFn:()=>fe(5,r),onSuccess:s=>{y(),l(""),navigator.clipboard.writeText(s.codes.join(` + */const Re=[["path",{d:"M18 21a8 8 0 0 0-16 0",key:"3ypg7q"}],["circle",{cx:"10",cy:"8",r:"5",key:"o932ke"}],["path",{d:"M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3",key:"10s06x"}]],Q=j("UsersRound",Re);function Qe({i:d}){return d.used_by?e.jsx(x,{color:"var(--text-3)",children:"已使用"}):d.valid?e.jsx(x,{color:"var(--success)",children:"可用"}):e.jsx(x,{color:"var(--warning)",children:"已停用"})}function $e(){var Z,J,Y,ee,se,ae;const d=je(),K=ve(),r=ge(),N=q({queryKey:["me-admin"],queryFn:async()=>(await ze(()=>import("./index-DhGFbjWw.js").then(a=>a.am),__vite__mapDeps([0,1]))).serverMe(r),enabled:!!T()}),m=q({queryKey:["admin-users"],queryFn:()=>Se(r),enabled:!!T()}),C=q({queryKey:["admin-invites"],queryFn:()=>Ee(r),enabled:!!T()}),[O,l]=i.useState(""),[oe,A]=i.useState(null),[xe,_]=i.useState(!1),[v,w]=i.useState(""),[$,z]=i.useState(""),[me,u]=i.useState(null),[S,E]=i.useState(""),[h,ue]=i.useState("all"),[n,g]=i.useState(null),[B,M]=i.useState(""),[he,b]=i.useState(!1),y=()=>{d.invalidateQueries({queryKey:["admin-invites"]})},c=s=>l(s.message||"操作失败"),L=o({mutationFn:()=>we(r),onSuccess:s=>{var a,p;b(!1),l(""),K("success","演示账号已重建:"+(((a=s.seeded)==null?void 0:a.footprints)??0)+" 条记录 + "+(((p=s.seeded)==null?void 0:p.semesters)??0)+" 学期"),d.invalidateQueries({queryKey:["admin-users"]})},onError:c}),H=o({mutationFn:s=>_e(s,r),onSuccess:s=>{d.invalidateQueries({queryKey:["admin-users"]}),g(null),M(""),l(""),K("success","用户「"+s.username+"」及其全部数据已删除")},onError:c}),V=o({mutationFn:()=>fe(5,r),onSuccess:s=>{y(),l(""),navigator.clipboard.writeText(s.codes.join(` `)).catch(()=>{})},onError:c}),F=o({mutationFn:()=>ke(v.trim(),$.trim(),r),onSuccess:()=>{y(),_(!1),w(""),z(""),l("")},onError:c}),I=o({mutationFn:s=>Ne(s.id,s.patch,r),onSuccess:()=>{y(),u(null),l("")},onError:c}),pe=o({mutationFn:s=>Ce(s,r),onSuccess:()=>{y(),l("")},onError:c}),G=i.useMemo(()=>{var s;return((s=C.data)==null?void 0:s.invites)??[]},[C.data]),W=((Z=m.data)==null?void 0:Z.users)??[],X=i.useMemo(()=>G.filter(s=>h==="valid"?s.valid&&!s.used_by:h==="used"?!!s.used_by:h==="disabled"?!s.valid&&!s.used_by:!0),[G,h]);if(N.data&&!N.data.is_admin)return e.jsx(f,{title:"需要管理员账号",description:"当前登录账号不是管理员。"});const U=s=>{navigator.clipboard.writeText(s.code),A(s.id),setTimeout(()=>A(a=>a===s.id?null:a),1500)};return e.jsxs("div",{className:"mx-auto max-w-[1080px] px-3 py-4 sm:px-6 sm:py-5",children:[e.jsxs("div",{className:"mb-4 flex items-center justify-between",children:[e.jsx("h2",{className:"text-[15px] font-semibold text-ink-1",children:"管理"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(t,{variant:"secondary",onClick:()=>b(!0),children:[e.jsx(Q,{size:13})," 重建演示账号"]}),e.jsxs(t,{variant:"secondary",onClick:()=>{d.invalidateQueries()},children:[e.jsx(Me,{size:13})," 刷新"]})]})]}),O&&e.jsxs("div",{className:"mb-3 flex items-center justify-between rounded-md border border-danger/30 bg-danger-subtle px-3 py-2 text-[12px] text-danger",children:[e.jsx("span",{children:O}),e.jsx("button",{className:"rounded p-0.5 hover:bg-surface-3",onClick:()=>l(""),"aria-label":"关闭",children:e.jsx(te,{size:13})})]}),e.jsxs(D,{children:[e.jsx(P,{title:"用户管理("+(((J=m.data)==null?void 0:J.total)??0)+")",extra:e.jsx(Q,{size:14,className:"text-ink-3"})}),e.jsx(R,{className:"p-0",children:e.jsxs("div",{className:"divide-y divide-line",children:[(((Y=m.data)==null?void 0:Y.users)??[]).map(s=>{var p;const a=String(s.id)===String(((p=N.data)==null?void 0:p.user_id)??"");return e.jsxs("div",{className:"flex items-center gap-3 px-4 py-2.5",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"truncate text-[13px] font-medium text-ink-1",children:s.username}),s.is_admin&&e.jsx(x,{color:"var(--brand-text)",children:"管理员"}),a&&e.jsx(x,{color:"var(--text-3)",children:"当前登录"})]}),e.jsxs("div",{className:"num mt-0.5 text-[11px] text-ink-3",children:[ne(s.created_at)," · 记录 ",s.records," · 附件 ",s.attachments,"(",ie(s.attachment_bytes||0),")"]})]}),!a&&e.jsxs(t,{size:"sm",variant:"ghost",className:"text-danger hover:bg-danger-subtle",onClick:()=>{g({id:s.id,username:s.username}),M("")},children:[e.jsx(re,{size:13})," 删除"]})]},s.id)}),!(((ee=m.data)==null?void 0:ee.users)??[]).length&&e.jsx(f,{title:"暂无用户"})]})})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-2",children:[e.jsxs(D,{children:[e.jsx(P,{title:"邀请码("+(((se=C.data)==null?void 0:se.total)??0)+")",extra:e.jsxs("div",{className:"flex gap-1.5",children:[e.jsxs(t,{size:"sm",variant:"secondary",onClick:()=>{_(s=>!s),l("")},children:[e.jsx(be,{size:13})," 新建"]}),e.jsx(t,{size:"sm",variant:"primary",disabled:V.isPending,onClick:()=>V.mutate(),children:"批量生成 5 个"})]})}),e.jsxs(R,{className:"p-0",children:[xe&&e.jsxs("div",{className:"flex flex-wrap items-end gap-2 border-b border-line bg-surface-2 px-4 py-3",children:[e.jsxs("label",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[11px] font-medium text-ink-3",children:"邀请码(4-32 位字母数字-_)"}),e.jsx(k,{className:"w-[210px]",value:v,placeholder:"如 XIONG-2025",onChange:s=>w(s.target.value)})]}),e.jsxs("label",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[11px] font-medium text-ink-3",children:"备注(可选)"}),e.jsx(k,{className:"w-[180px]",value:$,placeholder:"发给谁 / 用途",onChange:s=>z(s.target.value),onKeyDown:s=>{s.key==="Enter"&&v.trim()&&F.mutate()}})]}),e.jsxs("div",{className:"flex gap-1.5 pb-0.5",children:[e.jsx(t,{size:"sm",variant:"primary",disabled:!v.trim()||F.isPending,onClick:()=>F.mutate(),children:"创建"}),e.jsx(t,{size:"sm",variant:"ghost",onClick:()=>{_(!1),w(""),z("")},children:"取消"})]})]}),e.jsx("div",{className:"flex gap-1 border-b border-line px-4 py-2 text-[12px]",children:[["all","全部"],["valid","可用"],["used","已使用"],["disabled","已停用"]].map(([s,a])=>e.jsx("button",{className:"rounded-md px-2.5 py-1 transition-colors "+(h===s?"bg-brand-subtle font-medium text-brand-text":"text-ink-3 hover:bg-surface-3"),onClick:()=>ue(s),children:a},s))}),X.length?e.jsx("div",{className:"divide-y divide-line max-h-[430px] overflow-y-auto",children:X.map(s=>e.jsxs("div",{className:"flex flex-wrap items-center gap-2 px-4 py-2.5 text-[12.5px]",children:[e.jsx("button",{className:"num shrink-0 cursor-pointer rounded-sm bg-surface-3 px-1.5 py-0.5 font-mono text-[12px] text-ink-1 transition-colors hover:bg-brand-subtle hover:text-brand-text",title:"点击复制",onClick:()=>U(s),children:oe===s.id?e.jsxs("span",{className:"inline-flex items-center gap-1 text-success",children:[e.jsx(de,{size:11}),"已复制"]}):s.code}),e.jsx(Qe,{i:s}),me===s.id?e.jsxs("span",{className:"ml-1 flex min-w-0 flex-1 items-center gap-1",children:[e.jsx(k,{className:"h-7 flex-1 text-[12px]",value:S,autoFocus:!0,placeholder:"备注(64 字以内)",onChange:a=>E(a.target.value),onKeyDown:a=>{a.key==="Enter"&&I.mutate({id:s.id,patch:{remark:S}}),a.key==="Escape"&&u(null)}}),e.jsx(t,{size:"icon-sm",variant:"ghost","aria-label":"保存备注",className:"text-success",onClick:()=>I.mutate({id:s.id,patch:{remark:S}}),children:e.jsx(de,{size:13})}),e.jsx(t,{size:"icon-sm",variant:"ghost","aria-label":"取消",className:"text-ink-3",onClick:()=>u(null),children:e.jsx(te,{size:13})})]}):e.jsx("button",{className:"min-w-0 flex-1 truncate text-left text-[12px] text-ink-3 hover:text-ink-2",title:s.remark?"点击编辑备注":s.created_by_name?"由 "+s.created_by_name+" 创建 · 点击添加备注":"点击添加备注",onClick:()=>{u(s.id),E(s.remark??"")},children:s.remark||(s.created_by_name?"由 "+s.created_by_name+" 创建":e.jsx("span",{className:"opacity-60",children:"添加备注…"}))}),s.used_by_name&&e.jsxs("span",{className:"shrink-0 text-ink-3",children:["被 ",s.used_by_name," 使用于 ",ne(s.used_at)]}),e.jsxs("span",{className:"ml-auto flex shrink-0 items-center gap-0.5",children:[e.jsx(t,{size:"icon-sm",variant:"ghost","aria-label":"复制",className:"text-ink-3",onClick:()=>U(s),children:e.jsx(qe,{size:13})}),!s.used_by&&e.jsxs(e.Fragment,{children:[e.jsx(t,{size:"icon-sm",variant:"ghost","aria-label":"编辑备注",className:"text-ink-3",onClick:()=>{u(s.id),E(s.remark??"")},children:e.jsx(ye,{size:13})}),e.jsx(t,{size:"sm",variant:"ghost",className:s.valid?"text-ink-3 hover:text-warning":"text-ink-3 hover:text-success",onClick:()=>I.mutate({id:s.id,patch:{valid:!s.valid}}),children:s.valid?"停用":"启用"})]}),e.jsx(t,{size:"icon-sm",variant:"ghost","aria-label":"删除",className:"text-ink-3 hover:text-danger",onClick:()=>{window.confirm("删除邀请码 "+s.code+"?此操作不可恢复。")&&pe.mutate(s.id)},children:e.jsx(re,{size:13})})]})]},s.id))}):e.jsx(f,{icon:e.jsx(De,{size:32,strokeWidth:1.5}),title:"暂无符合条件的邀请码",description:"新建自定义邀请码,或批量生成后发给需要注册的用户。"})]})]}),e.jsxs(D,{children:[e.jsx(P,{title:"用户("+(((ae=m.data)==null?void 0:ae.total)??0)+")"}),e.jsx(R,{className:"p-0",children:W.length?e.jsx("div",{className:"divide-y divide-line max-h-[520px] overflow-y-auto",children:W.map(s=>e.jsxs("div",{className:"flex flex-wrap items-center gap-2 px-4 py-2.5 text-[12.5px]",children:[e.jsx("span",{className:"font-medium text-ink-1",children:s.username}),s.is_admin&&e.jsx(x,{color:"var(--brand-text)",children:"管理员"}),e.jsxs("span",{className:"num ml-auto text-ink-3",children:[s.devices," 设备 · ",s.records," 记录 · ",ie(s.attachment_bytes)]})]},s.id))}):e.jsx(f,{icon:e.jsx(Q,{size:32,strokeWidth:1.5}),title:"暂无用户"})})]})]}),e.jsx(le,{open:!!n,onClose:()=>g(null),width:460,title:"删除用户(高危操作)",footer:e.jsxs(e.Fragment,{children:[e.jsx(t,{variant:"ghost",onClick:()=>g(null),children:"取消"}),e.jsxs(t,{variant:"primary",className:"!bg-danger !text-white",disabled:B!==(n==null?void 0:n.username)||H.isPending,onClick:()=>n&&H.mutate(n.id),children:[e.jsx(ce,{size:13})," 永久删除"]})]}),children:e.jsxs("div",{className:"flex flex-col gap-3 text-[12.5px]",children:[e.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-danger/30 bg-danger-subtle px-3 py-2.5 text-danger",children:[e.jsx(ce,{size:15,className:"mt-0.5 shrink-0"}),e.jsxs("div",{children:[e.jsx("b",{children:"此操作不可撤销!"}),"将永久删除用户「",n==null?void 0:n.username,"」的全部数据:",e.jsxs("ul",{className:"mt-1 list-disc pl-4 text-[12px] leading-relaxed",children:[e.jsx("li",{children:"账号与登录会话(所有设备将被登出)"}),e.jsx("li",{children:"全部记录、成绩、维度与统计数据"}),e.jsx("li",{children:"全部附件文件(服务器本地与图床 COS 上的副本)"})]})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1.5 text-ink-2",children:["请输入用户名 ",e.jsx("b",{className:"text-danger",children:n==null?void 0:n.username})," 以确认:"]}),e.jsx(k,{value:B,onChange:s=>M(s.target.value),placeholder:(n==null?void 0:n.username)??"",autoFocus:!0})]})]})}),e.jsx(le,{open:he,onClose:()=>b(!1),width:440,title:"重建演示账号",footer:e.jsxs(e.Fragment,{children:[e.jsx(t,{variant:"ghost",onClick:()=>b(!1),children:"取消"}),e.jsx(t,{variant:"primary",disabled:L.isPending,onClick:()=>L.mutate(),children:"重建并重新播种"})]}),children:e.jsxs("div",{className:"text-[12.5px] leading-relaxed text-ink-2",children:["将",e.jsx("b",{children:"删除现有 demo 账号及其全部数据"}),",然后重新创建并播种全套虚拟演示数据 (个人信息档案、16 条足迹、4 学期成绩、简历内容)。",e.jsx("div",{className:"mt-2 text-ink-3",children:"demo / demo1234 · 仅影响演示账号,其他用户不受影响。"})]})})]})}export{$e as AdminPage}; diff --git a/sync-server/www/assets/AssessmentPage-7AoxKy-P.js b/sync-server/www/assets/AssessmentPage-7AoxKy-P.js deleted file mode 100644 index bc972a6..0000000 --- a/sync-server/www/assets/AssessmentPage-7AoxKy-P.js +++ /dev/null @@ -1 +0,0 @@ -import{d as ae,f as Q,r as G,j as c,S as ie,B as A,ah as ue,af as $,a9 as de,ag as me,v as pe,M as fe}from"./index-DYhSDydL.js";import{R as xe,P as he}from"./rotate-ccw-CE3bwRx2.js";const ge={politics:{中共党员:3,中共预备党员:2.5,入党积极分子:2,共青团员:1.5,群众:1},conductDefault:8,integrityDefault:2,sportsFactor:.025,gpaFactor:10,table2:{国家级:{一等奖:3,二等奖:2,三等奖:1,优秀奖:.5},省市级:{一等奖:2,二等奖:1,三等奖:.5,优秀奖:.2},区县级:{一等奖:1,二等奖:.5,三等奖:.2,优秀奖:.1},校级:{一等奖:.5,二等奖:.2,三等奖:.1,优秀奖:.05},二级学院:{一等奖:.2,二等奖:.1,三等奖:.05,优秀奖:0}},table4:{校级:{干部:4,干事:2,社团干部:1,学工助理:2},院级:{干部:3,干事:1.5,支部委员:1.5,支部组长:1,班长:1,团支书:1,班委:.5,社团干部:1,学工助理:2}},publicGood:{无偿献血:.5,捐献骨髓:3,国家级:1.5,省市级:1,区县级:.5,校级:.2,二级学院:.1},rewards:{荣誉称号:{院级:.3,校级:.5,区级:1,市级:1.5,国家级:2},英语等级:{三级:.5,四级:1,六级:2},计算机等级:{一级:.5,二级:1,三级:2},职业资格:{从业资格:.5,初级:1,中级:2,高级:3}},penalties:{留校察看:5,记过:4,严重警告:3,警告:2,通报批评:1}};function J(i){const o=/^(\d{4})-(\d{4})-(1|2)$/.exec(i);if(!o)return null;const m=Number(o[1]);return o[3]==="1"?[m+"-09-01",m+1+"-03-01"]:[m+1+"-03-01",m+1+"-09-01"]}function X(i,o){if(!o)return!0;const m=(i??"").slice(0,10);return m>=o[0]&&mMath.round(i*100)/100;function ee(i,o,m){var u;return!o||!m?null:((u=i.table2[o])==null?void 0:u[m])??null}function ve(i){var W,Z,H,V;const{term:o,records:m,semesters:y,bands:u,weights:g,profile:F,rules:r,ov:j}=i,M=o==="all"?null:J(o),_=m.filter(e=>e.status!=="draft"&&X(e.start_date??e.created_at,M)),N=e=>{var t;return(t=j.itemOverrides)==null?void 0:t[e]},x=(e,t,s,l,v)=>{const d=N(e),C=(d==null?void 0:d.score)??l??0;return{itemKey:e,title:t,source:s,score:C,overridden:(d==null?void 0:d.score)!=null,note:v}},b=(e,t,s,l)=>({key:e,label:t,cap:s,items:l,subtotal:h(l.reduce((v,d)=>v+d.score,0))}),f=[],L=F.political??"",R=Object.keys(r.politics).find(e=>L.includes(e)),P=R?r.politics[R]:1,S=j.conduct??r.conductDefault,E=j.integrity??r.integrityDefault;f.push(b("conduct","品行素质",13,[{itemKey:"politics",title:"思想政治基础分("+(L||"群众")+")",source:"个人信息 · 政治面貌",score:P},{itemKey:"conduct",title:"操行考评成绩",source:"辅导员考评(可修改)",score:S,overridden:j.conduct!=null},{itemKey:"integrity",title:"诚信分",source:"默认满分(可修改)",score:E,overridden:j.integrity!=null}]));const O=[];for(const e of y){if(!X(null,null))continue;const t=o==="all"?null:J(e.term);(o==="all"||M&&t&&!(t[1]<=M[0]||t[0]>=M[1]))&&O.push(...e.courses)}let w=null;const n=e=>{if(e.grade_point!=null)return e.grade_point;if(u&&e.score!=null){const t=u.find(s=>e.score>=s.min&&(e.score=100&&e.score<=s.max));if(t&&t.gp!=null){if(t.gpTop!=null){const s=t.max>=100?t.max:t.max-1,l=(t.gpTop-t.gp)/Math.max(1,s-t.min);return h(t.gp+(e.score-t.min)*l)}return t.gp}}return null},a=e=>g?g[e.category??"其他"]??g.其他??1:1,p=O.map(e=>({...e,grade_point:n(e)})).filter(e=>e.grade_point!=null&&e.credit>0);if(p.length){const e=p.reduce((t,s)=>t+s.credit,0);w=h(p.reduce((t,s)=>t+s.grade_point*a(s)*s.credit,0)/e)}const K=w!=null?Math.min(h(w*r.gpaFactor),60):0;f.push(b("academic","学业成绩",60,[{itemKey:"gpa",title:"平均学分绩点 "+(w!=null?w.toFixed(2):"—")+" × 10",source:"成绩模块 · "+O.length+" 门课程",score:K,note:w==null?"该学期暂无课程成绩":void 0}]));const k=O.filter(e=>/体育/.test(e.course_name)),te=h(k.reduce((e,t)=>e+(t.score??0),0)*r.sportsFactor),B=[];k.length&&B.push({itemKey:"sports",title:"体育成绩("+k.length+" 学期体育课)",source:"体育课成绩之和 × "+r.sportsFactor,score:Math.min(te,5)});const I=[];for(const e of _.filter(t=>t.type_name==="文体活动")){const t=ee(r,z(e.level),Y(e.award_grade));t==null&&!((W=N("w"+e.id))!=null&&W.score)||I.push(x("w"+e.id,e.title,e.type_name+" · "+(e.level??"")+" "+(e.award_grade??""),t))}const se=h(Math.min(I.reduce((e,t)=>e+t.score,0),5));f.push(b("sports","文体素质",10,[...B,{itemKey:"wcap",title:"文体类加分(上限 5 分)",source:I.length+" 条记录",score:se,note:I.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"}]));const T=[];for(const e of _.filter(t=>t.type_name==="竞赛"||t.type_name==="科研")){const t=ee(r,z(e.level),Y(e.award_grade));t==null&&!((Z=N("c"+e.id))!=null&&Z.score)||T.push(x("c"+e.id,e.title,e.type_name+" · "+(e.level??"")+" "+(e.award_grade??""),t))}const re=h(Math.min(T.reduce((e,t)=>e+t.score,0),10)),D=[];for(const e of _.filter(t=>t.type_name==="学生工作")){const t=z(e.level)??"院级",s=(e.role??"")+" "+e.title,l=r.table4[t==="国家级"||t==="省市级"||t==="区县级"?"校级":t]??r.table4.院级;let v=null;for(const[d,C]of Object.entries(l))if(s.includes(d)){v=C;break}v==null&&!((H=N("k"+e.id))!=null&&H.score)||D.push(x("k"+e.id,e.title,"学生工作 · "+(e.level??"院级")+" "+(e.role??""),v,v==null?"请手动填写分值":void 0))}const ne=h(Math.min(D.reduce((e,t)=>e+t.score,0),4)),U=[];for(const e of _.filter(t=>t.type_name==="志愿公益")){const t=z(e.level),s=/献血/.test(e.title);let l=s?r.publicGood.无偿献血:t?r.publicGood[t]??null:null;l==null&&!((V=N("g"+e.id))!=null&&V.score)||U.push(x("g"+e.id,e.title,"公益 · "+(s?"无偿献血":e.level??"校级"),l))}const oe=h(Math.min(U.reduce((e,t)=>e+t.score,0),3));f.push(b("expand","拓展性素质",17,[{itemKey:"ccap",title:"竞赛获奖(上限 10 分)",source:T.length+" 条记录",score:re,note:T.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"},{itemKey:"kcap",title:"担任学生工作(上限 4 分)",source:D.length+" 条记录",score:ne,note:D.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"},{itemKey:"gcap",title:"公益活动(上限 3 分)",source:U.length+" 条记录",score:oe,note:U.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"}]));const q=[];for(const e of _.filter(t=>t.type_name==="荣誉惩处"||t.type_name==="证书技能")){const t=N("h"+e.id),s=e.title+" "+(e.award_grade??"");let l=null,v=e.type_name;if(/留校察看/.test(s))l=-r.penalties.留校察看;else if(/记过/.test(s))l=-r.penalties.记过;else if(/严重警告/.test(s))l=-r.penalties.严重警告;else if(/警告/.test(s))l=-r.penalties.警告;else if(/通报批评/.test(s))l=-r.penalties.通报批评;else if(/六级|专八/.test(s))l=r.rewards.英语等级.六级;else if(/四级|专四/.test(s))l=r.rewards.英语等级.四级;else if(/三级/.test(s)&&/英语/.test(s))l=r.rewards.英语等级.三级;else if(/计算机/.test(s)&&/三级/.test(s))l=r.rewards.计算机等级.三级;else if(/计算机/.test(s)&&/二级/.test(s))l=r.rewards.计算机等级.二级;else if(/计算机/.test(s)&&/一级/.test(s))l=r.rewards.计算机等级.一级;else if(/高级/.test(s))l=r.rewards.职业资格.高级;else if(/中级/.test(s))l=r.rewards.职业资格.中级;else if(/初级/.test(s))l=r.rewards.职业资格.初级;else if(/从业|资格证|教师资格|普通话|驾驶证|软考/.test(s))l=r.rewards.职业资格.从业资格;else{const d=z(e.level),C=d==="省市级"?"市级":d==="区县级"?"区级":d==="二级学院"?"院级":d;C&&r.rewards.荣誉称号[C]!=null&&(l=r.rewards.荣誉称号[C],v="荣誉 · "+C)}l==null&&!(t!=null&&t.score)||q.push(x("h"+e.id,e.title,v,l))}const le=h(Math.max(Math.min(q.reduce((e,t)=>e+t.score,0),5),-5));f.push(b("rewards","奖惩分",5,[{itemKey:"hcap",title:"奖惩合计(±5 分)",source:q.length+" 条记录",score:le,note:q.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"}]));for(const e of j.manual??[]){const t=f.find(s=>s.label===e.section)??f[f.length-1];t.items.push({itemKey:"m"+e.title+e.score,title:e.title,source:"手动添加",score:e.score}),t.subtotal=h(t.items.reduce((s,l)=>s+l.score,0))}const ce=h(f.reduce((e,t)=>{const s=t.key==="rewards"?t.subtotal:Math.min(t.subtotal,t.cap);return e+s},0));return{sections:f,total:ce,gpa:w}}function we(){var S,E,O,w;const i=ae(),o=Q({queryKey:["profile"],queryFn:me}),m=Q({queryKey:["zc-records"],queryFn:()=>pe({page:1,page_size:500})}),y=Q({queryKey:["grades"],queryFn:fe}),u=(S=o.data)==null?void 0:S.content,g={...(u==null?void 0:u.info)??{}},F=((E=u==null?void 0:u.zongce)==null?void 0:E.rules)??ge,[r,j]=G.useState(""),[M,_]=G.useState({});G.useEffect(()=>{var a,p;if(!u)return;_(((a=u.zongce)==null?void 0:a.overrides)??{});const n=(((p=y.data)==null?void 0:p.semesters)??[]).map(K=>K.term);!r&&n.length&&j(n[0])},[u,y.data]);const N=((O=m.data)==null?void 0:O.items)??[],x=M[r]??{},b=G.useMemo(()=>{var n,a,p;return ve({term:r||"all",records:N,semesters:((n=y.data)==null?void 0:n.semesters)??[],bands:(a=y.data)==null?void 0:a.bands,weights:(p=y.data)==null?void 0:p.weights,profile:g,rules:F,ov:x})},[N,y.data,g,F,x,r]),f=n=>{_(a=>({...a,[r]:n})),$({info:g,zongce:{rules:F,overrides:{...M,[r]:n}}}).catch(a=>i("error",a.message))},L=()=>{const n={...M};delete n[r],_(n),$({info:g,zongce:{rules:F,overrides:n}}).then(()=>i("success","已恢复自动计算")).catch(a=>i("error",a.message))},R=r==="all"?"全学年":r,P=()=>{de(async()=>{const{zongceToWordHtml:n}=await import("./zongceWord-DuzvenT-.js");return{zongceToWordHtml:n}},[]).then(({zongceToWordHtml:n})=>{const a=n(R,b.sections,b.total,g),p=new Blob(["\uFEFF"+a],{type:"application/msword"}),K=URL.createObjectURL(p),k=document.createElement("a");k.href=K,k.download="综合素质测评_"+R+".doc",k.click(),setTimeout(()=>URL.revokeObjectURL(K),6e4),i("success","综测材料已导出")})};return c.jsxs("div",{className:"mx-auto max-w-[1080px] px-3 py-4 sm:px-6 sm:py-5",children:[c.jsxs("div",{className:"no-print mb-4 flex flex-wrap items-center justify-between gap-2",children:[c.jsx("h2",{className:"text-[15px] font-semibold text-ink-1",children:"综合测评(自动计算)"}),c.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[c.jsx(ie,{className:"w-[150px]",value:r,onChange:n=>j(n.target.value),options:[...(((w=y.data)==null?void 0:w.semesters)??[]).map(n=>({value:n.term,label:n.term})),{value:"all",label:"全学年"}]}),c.jsxs(A,{variant:"secondary",onClick:L,children:[c.jsx(xe,{size:13})," 恢复自动"]}),c.jsxs(A,{variant:"secondary",onClick:P,children:[c.jsx(ue,{size:13})," 导出材料"]}),c.jsxs(A,{variant:"primary",onClick:()=>window.print(),children:[c.jsx(he,{size:13})," 打印"]})]})]}),c.jsxs("div",{className:"print-sheet mx-auto w-full max-w-[794px] rounded-lg border border-line bg-white p-5 shadow-card sm:p-8",children:[c.jsx("h1",{className:"text-center text-[18px] font-bold text-neutral-900",children:"学生综合素质测评"}),c.jsxs("div",{className:"mt-1 text-center text-[12px] text-neutral-500",children:[g.name??""," · ",g.className??""," · 统计周期:",R]}),c.jsxs("div",{className:"mt-5 rounded-md bg-neutral-100 px-4 py-2 text-center text-[15px] font-bold text-neutral-900",children:["综合素质总分:",c.jsx("span",{className:"num",children:b.total})," 分"]}),b.sections.map(n=>c.jsxs("div",{className:"mt-5",children:[c.jsxs("div",{className:"flex items-baseline justify-between border-b-2 border-neutral-800 pb-1",children:[c.jsxs("span",{className:"text-[13.5px] font-bold text-neutral-900",children:[n.label,"(上限 ",n.cap," 分)"]}),c.jsxs("span",{className:"num text-[12.5px] text-neutral-600",children:["小计 ",n.key==="rewards"?n.subtotal:Math.min(n.subtotal,n.cap)," 分"]})]}),c.jsxs("div",{className:"mt-2 flex flex-col gap-1.5",children:[n.items.map(a=>c.jsxs("div",{className:"flex items-center gap-2 text-[12.5px]",children:[c.jsxs("span",{className:"min-w-0 flex-1",children:[c.jsx("span",{className:"text-neutral-900",children:a.title}),c.jsx("span",{className:"ml-2 text-[11px] text-neutral-400",children:a.source}),a.note&&c.jsx("div",{className:"text-[11px] text-neutral-400",children:a.note})]}),c.jsx("input",{type:"number",step:"0.1",className:"num w-[72px] rounded-sm border border-neutral-200 px-1 py-0.5 text-right text-[12px]",value:a.score,onChange:p=>{var K;if(a.itemKey==="conduct"||a.itemKey==="integrity")f({...x,[a.itemKey]:Number(p.target.value)});else{const k={...x.itemOverrides??{},[a.itemKey]:{...((K=x.itemOverrides)==null?void 0:K[a.itemKey])??{},score:Number(p.target.value)}};f({...x,itemOverrides:k})}}})]},a.itemKey)),!n.items.length&&c.jsx("div",{className:"text-[12px] text-neutral-400",children:"暂无数据"})]})]},n.key)),c.jsx("div",{className:"mt-6 border-t border-neutral-200 pt-3 text-[11px] leading-relaxed text-neutral-400",children:"计分依据:《计算机与网络安全学院学生综合素质测评评分细则》。自动匹配条目均可手动修正分值; 「恢复自动」清除本学期全部手动修正。导出材料前请核对每条加分记录与证明材料一致。"})]})]})}export{we as AssessmentPage}; diff --git a/sync-server/www/assets/AssessmentPage-Dvd34CqC.js b/sync-server/www/assets/AssessmentPage-Dvd34CqC.js new file mode 100644 index 0000000..e9b2aed --- /dev/null +++ b/sync-server/www/assets/AssessmentPage-Dvd34CqC.js @@ -0,0 +1,13 @@ +import{d as de,f as Y,r as L,ai as ue,aj as me,j as i,S as pe,B as $,ah as fe,af as te,ag as he,v as ge,M as xe}from"./index-DhGFbjWw.js";import{R as be,P as ye}from"./rotate-ccw-DGANt55P.js";const ve={politics:{中共党员:3,中共预备党员:2.5,入党积极分子:2,共青团员:1.5,群众:1},conductDefault:8,integrityDefault:2,sportsFactor:.025,gpaFactor:10,table2:{国家级:{一等奖:3,二等奖:2,三等奖:1,优秀奖:.5},省市级:{一等奖:2,二等奖:1,三等奖:.5,优秀奖:.2},区县级:{一等奖:1,二等奖:.5,三等奖:.2,优秀奖:.1},校级:{一等奖:.5,二等奖:.2,三等奖:.1,优秀奖:.05},二级学院:{一等奖:.2,二等奖:.1,三等奖:.05,优秀奖:0}},table4:{校级:{干部:4,干事:2,社团干部:1,学工助理:2},院级:{干部:3,干事:1.5,支部委员:1.5,支部组长:1,班长:1,团支书:1,班委:.5,社团干部:1,学工助理:2}},publicGood:{无偿献血:.5,捐献骨髓:3,国家级:1.5,省市级:1,区县级:.5,校级:.2,二级学院:.1},rewards:{荣誉称号:{院级:.3,校级:.5,区级:1,市级:1.5,国家级:2},英语等级:{三级:.5,四级:1,六级:2},计算机等级:{一级:.5,二级:1,三级:2},职业资格:{从业资格:.5,初级:1,中级:2,高级:3}},penalties:{留校察看:5,记过:4,严重警告:3,警告:2,通报批评:1}};function H(c){const o=/^(\d{4})-(\d{4})$/.exec(c);return o?[o[1]+"-09-01",o[2]+"-09-01"]:null}function se(c,o){const f=/^(\d{4})-/.exec(c),h=/^(\d{4})/.exec(o??"");if(!f||!h)return c+" 学年";const u=Number(f[1])-Number(h[1])+1;return(["大一","大二","大三","大四","大五"][u-1]??u+"年级")+"("+c+" 学年)"}function we(c,o){if(!o)return!0;const f=(c??"").slice(0,10);return f>=o[0]&&fMath.round(c*100)/100;function ne(c,o,f){var u;return!o||!f?null:((u=c.table2[o])==null?void 0:u[f])??null}function je(c){var J,V,X,ee;const{year:o,records:f,semesters:h,bands:u,weights:p,profile:w,rules:r,ov:m}=c,b=o==="all"?null:H(o),y=f.filter(e=>e.status!=="draft"&&we(e.start_date??e.created_at,b)),g=e=>{var t;return(t=m.itemOverrides)==null?void 0:t[e]},z=(e,t,s,l,_,M)=>{const v=g(e),ce=(v==null?void 0:v.score)??l??0;return{itemKey:e,title:t,source:s,score:ce,overridden:(v==null?void 0:v.score)!=null,note:_,fromRecord:M}},S=(e,t,s,l)=>({key:e,label:t,cap:s,items:l,subtotal:j(l.reduce((_,M)=>_+M.score,0))}),x=[],O=w.political??"",F=Object.keys(r.politics).find(e=>O.includes(e)),G=F?r.politics[F]:1,Z=m.conduct??r.conductDefault,T=m.integrity??r.integrityDefault;x.push(S("conduct","品行素质",13,[{itemKey:"politics",title:"思想政治基础分("+(O||"群众")+")",source:"个人信息 · 政治面貌",score:G},{itemKey:"conduct",title:"操行考评成绩",source:"辅导员考评(可修改)",score:Z,overridden:m.conduct!=null},{itemKey:"integrity",title:"诚信分",source:"默认满分(可修改)",score:T,overridden:m.integrity!=null}]));const R=[];for(const e of h){if(b&&!H(e.term))continue;const t=H(e.term);(b===null||t&&!(t[1]<=b[0]||t[0]>=b[1]))&&R.push(...e.courses)}let C=null;const A=e=>{if(e.grade_point!=null)return e.grade_point;if(u&&e.score!=null){const t=u.find(s=>e.score>=s.min&&(e.score=100&&e.score<=s.max));if(t&&t.gp!=null){if(t.gpTop!=null){const s=t.max>=100?t.max:t.max-1,l=(t.gpTop-t.gp)/Math.max(1,s-t.min);return j(t.gp+(e.score-t.min)*l)}return t.gp}}return null},Q=e=>p?p[e.category??"其他"]??p.其他??1:1,I=R.map(e=>({...e,grade_point:A(e)})).filter(e=>e.grade_point!=null&&e.credit>0);if(I.length){const e=I.reduce((t,s)=>t+s.credit,0);C=j(I.reduce((t,s)=>t+s.grade_point*Q(s)*s.credit,0)/e)}const n=C!=null?Math.min(j(C*r.gpaFactor),60):0;x.push(S("academic","学业成绩",60,[{itemKey:"gpa",title:"平均学分绩点 "+(C!=null?C.toFixed(2):"—")+" × 10",source:"成绩模块 · "+R.length+" 门课程",score:n,note:C==null?"该学期暂无课程成绩":void 0}]));const a=R.filter(e=>/体育/.test(e.course_name)),d=j(a.reduce((e,t)=>e+(t.score??0),0)*r.sportsFactor),N=[];a.length&&N.push({itemKey:"sports",title:"体育成绩("+a.length+" 学期体育课)",source:"体育课成绩之和 × "+r.sportsFactor,score:Math.min(d,5)});const K=[];for(const e of y.filter(t=>t.type_name==="文体活动")){const t=ne(r,D(e.level),re(e.award_grade));t==null&&!((J=g("w"+e.id))!=null&&J.score)||K.push(z("w"+e.id,e.title,e.type_name+" · "+(e.level??"")+" "+(e.award_grade??""),t,void 0,e.id))}const q=j(Math.min(K.reduce((e,t)=>e+t.score,0),5));x.push(S("sports","文体素质",10,[...N,{itemKey:"wcap",title:"文体类加分(上限 5 分)",source:K.length+" 条记录",score:q,note:K.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"}]));const E=[];for(const e of y.filter(t=>t.type_name==="竞赛"||t.type_name==="科研")){const t=ne(r,D(e.level),re(e.award_grade));t==null&&!((V=g("c"+e.id))!=null&&V.score)||E.push(z("c"+e.id,e.title,e.type_name+" · "+(e.level??"")+" "+(e.award_grade??""),t,void 0,e.id))}const U=j(Math.min(E.reduce((e,t)=>e+t.score,0),10)),B=[];for(const e of y.filter(t=>t.type_name==="学生工作")){const t=D(e.level)??"院级",s=(e.role??"")+" "+e.title,l=r.table4[t==="国家级"||t==="省市级"||t==="区县级"?"校级":t]??r.table4.院级;let _=null;for(const[M,v]of Object.entries(l))if(s.includes(M)){_=v;break}_==null&&!((X=g("k"+e.id))!=null&&X.score)||B.push(z("k"+e.id,e.title,"学生工作 · "+(e.level??"院级")+" "+(e.role??""),_,_==null?"请手动填写分值":void 0,e.id))}const oe=j(Math.min(B.reduce((e,t)=>e+t.score,0),4)),P=[];for(const e of y.filter(t=>t.type_name==="志愿公益")){const t=D(e.level),s=/献血/.test(e.title);let l=s?r.publicGood.无偿献血:t?r.publicGood[t]??null:null;l==null&&!((ee=g("g"+e.id))!=null&&ee.score)||P.push(z("g"+e.id,e.title,"公益 · "+(s?"无偿献血":e.level??"校级"),l,void 0,e.id))}const ae=j(Math.min(P.reduce((e,t)=>e+t.score,0),3));x.push(S("expand","拓展性素质",17,[{itemKey:"ccap",title:"竞赛获奖(上限 10 分)",source:E.length+" 条记录",score:U,note:E.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"},{itemKey:"kcap",title:"担任学生工作(上限 4 分)",source:B.length+" 条记录",score:oe,note:B.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"},{itemKey:"gcap",title:"公益活动(上限 3 分)",source:P.length+" 条记录",score:ae,note:P.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"}]));const W=[];for(const e of y.filter(t=>t.type_name==="荣誉惩处"||t.type_name==="证书技能")){const t=g("h"+e.id),s=e.title+" "+(e.award_grade??"");if(/综合测评奖学金/.test(s))continue;let l=null,_=e.type_name;if(/留校察看/.test(s))l=-r.penalties.留校察看;else if(/记过/.test(s))l=-r.penalties.记过;else if(/严重警告/.test(s))l=-r.penalties.严重警告;else if(/警告/.test(s))l=-r.penalties.警告;else if(/通报批评/.test(s))l=-r.penalties.通报批评;else if(/六级|专八/.test(s))l=r.rewards.英语等级.六级;else if(/四级|专四/.test(s))l=r.rewards.英语等级.四级;else if(/三级/.test(s)&&/英语/.test(s))l=r.rewards.英语等级.三级;else if(/计算机/.test(s)&&/三级/.test(s))l=r.rewards.计算机等级.三级;else if(/计算机/.test(s)&&/二级/.test(s))l=r.rewards.计算机等级.二级;else if(/计算机/.test(s)&&/一级/.test(s))l=r.rewards.计算机等级.一级;else if(/高级/.test(s))l=r.rewards.职业资格.高级;else if(/中级/.test(s))l=r.rewards.职业资格.中级;else if(/初级/.test(s))l=r.rewards.职业资格.初级;else if(/从业|资格证|教师资格|普通话|驾驶证|软考/.test(s))l=r.rewards.职业资格.从业资格;else{const M=D(e.level),v=M==="省市级"?"市级":M==="区县级"?"区级":M==="二级学院"?"院级":M;v&&r.rewards.荣誉称号[v]!=null&&(l=r.rewards.荣誉称号[v],_="荣誉 · "+v)}l==null&&!(t!=null&&t.score)||W.push(z("h"+e.id,e.title,_,l,void 0,e.id))}const ie=j(Math.max(Math.min(W.reduce((e,t)=>e+t.score,0),5),-5));x.push(S("rewards","奖惩分",5,[{itemKey:"hcap",title:"奖惩合计(±5 分)",source:W.length+" 条记录",score:ie,note:W.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"}]));for(const e of m.manual??[]){const t=x.find(s=>s.label===e.section)??x[x.length-1];t.items.push({itemKey:"m"+e.title+e.score,title:e.title,source:"手动添加",score:e.score}),t.subtotal=j(t.items.reduce((s,l)=>s+l.score,0))}const le=j(x.reduce((e,t)=>{const s=t.key==="rewards"?t.subtotal:Math.min(t.subtotal,t.cap);return e+s},0));return{sections:x,total:le,gpa:C}}function k(c){return String(c??"").replace(/&/g,"&").replace(//g,">")}function Ne(c,o){var u;const f="----=_fp_zongce",h=[];h.push("--"+f+`\r +Content-Type: text/html; charset="utf-8"\r +Content-Transfer-Encoding: 8bit\r +\r +`+c+`\r +`);for(const p of o){const w=p.dataUri.indexOf(","),r=p.dataUri.slice(0,w),m=p.dataUri.slice(w+1),b=((u=/data:([^;]+)/.exec(r))==null?void 0:u[1])??"image/png";h.push("--"+f+`\r +Content-Type: `+b+`\r +Content-Transfer-Encoding: base64\r +Content-Location: `+p.name+`\r +\r +`+m+`\r +`)}return h.push("--"+f+`--\r +`),new Blob([h.join("")],{type:'multipart/related; type="text/html"; boundary="'+f+'"'})}function _e(c,o,f,h){const u=o.sections.map(m=>{const b=m.key==="rewards"?m.subtotal:Math.min(m.subtotal,m.cap),y=m.items.map(g=>''+k(g.title)+''+k(g.note||g.source)+''+k(g.score)+"").join("");return'

'+k(m.label)+"(上限 "+k(m.cap)+" 分,小计 "+k(b)+' 分)

'+y+"
"}).join(""),p=[],w=h.map(m=>{let b="";return m.images.forEach((y,g)=>{const z="ev"+m.recordId+"_"+g;p.push({name:z,dataUri:y}),b+='
图 '+(g+1)+'
'}),'
'+k(m.title)+""+b+"
"}).join(""),r='综合素质测评

学生综合素质测评

'+k(f.name??"")+" · "+k(f.className??"")+" · 统计周期:"+k(c)+'

综合素质总分:'+k(o.total)+" 分

"+u+(w?'

附:证明材料

'+w:"")+'
学生签名:______辅导员签名:______日期:______
';return Ne(r,p)}function Ce(){var C,A,Q,I;const c=de(),o=Y({queryKey:["profile"],queryFn:he}),f=Y({queryKey:["zc-records"],queryFn:()=>ge({page:1,page_size:500})}),h=Y({queryKey:["grades"],queryFn:xe}),u=(C=o.data)==null?void 0:C.content,p={...(u==null?void 0:u.info)??{}},w=((A=u==null?void 0:u.zongce)==null?void 0:A.rules)??ve,[r,m]=L.useState(""),[b,y]=L.useState({}),[g,z]=L.useState([]);L.useEffect(()=>{var a,d;if(!u)return;y(((a=u.zongce)==null?void 0:a.overrides)??{});const n=Array.from(new Set((((d=h.data)==null?void 0:d.semesters)??[]).map(N=>N.term.slice(0,7))));!r&&n.length&&m(n[0])},[u,h.data]);const S=((Q=f.data)==null?void 0:Q.items)??[],x=b[r]??{},O=L.useMemo(()=>{var n,a,d;return je({year:r||"all",records:S,semesters:((n=h.data)==null?void 0:n.semesters)??[],bands:(a=h.data)==null?void 0:a.bands,weights:(d=h.data)==null?void 0:d.weights,profile:p,rules:w,ov:x})},[S,h.data,p,w,x,r]),F=L.useMemo(()=>{const n=[];return O.sections.forEach(a=>a.items.forEach(d=>{d.fromRecord&&n.push(d.fromRecord)})),n},[O]);L.useEffect(()=>{let n=!0;return(async()=>{const a=[];for(const d of F){const N=S.find(K=>K.id===d);try{const K=await ue(d),q=[];for(const E of K.items.filter(U=>U.id).slice(0,3)){const U=await me(E.id);U.data_b64&&q.push("data:"+(E.mime==="image/jpeg"?"image/jpeg":"image/webp")+";base64,"+U.data_b64)}q.length&&a.push({recordId:d,title:(N==null?void 0:N.title)??"记录 "+d,images:q})}catch{}}n&&z(a)})(),()=>{n=!1}},[F.join(",")]);const G=n=>{y(a=>({...a,[r]:n})),te({info:p,zongce:{rules:w,overrides:{...b,[r]:n}}}).catch(a=>c("error",a.message))},Z=()=>{const n={...b};delete n[r],y(n),te({info:p,zongce:{rules:w,overrides:n}}).then(()=>c("success","已恢复自动计算")).catch(a=>c("error",a.message))},T=r==="all"?"全部学年":se(r,p.eduStart),R=()=>{const n=_e(T,O,p,g),a=URL.createObjectURL(n),d=document.createElement("a");d.href=a,d.download="综合素质测评_"+T+".doc",d.click(),setTimeout(()=>URL.revokeObjectURL(a),6e4),c("success","综测材料已导出"+(g.length?"(含 "+g.length+" 条证明材料图片)":""))};return i.jsxs("div",{className:"mx-auto max-w-[1080px] px-3 py-4 sm:px-6 sm:py-5",children:[i.jsxs("div",{className:"no-print mb-4 flex flex-wrap items-center justify-between gap-2",children:[i.jsx("h2",{className:"text-[15px] font-semibold text-ink-1",children:"综合测评(按学年自动计算)"}),i.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[i.jsx(pe,{className:"w-[190px]",value:r,onChange:n=>m(n.target.value),options:[...Array.from(new Set((((I=h.data)==null?void 0:I.semesters)??[]).map(n=>n.term.slice(0,7)))).map(n=>({value:n,label:se(n,p.eduStart)})),{value:"all",label:"全部学年"}]}),i.jsxs($,{variant:"secondary",onClick:Z,children:[i.jsx(be,{size:13})," 恢复自动"]}),i.jsxs($,{variant:"secondary",onClick:R,children:[i.jsx(fe,{size:13})," 导出材料"]}),i.jsxs($,{variant:"primary",onClick:()=>window.print(),children:[i.jsx(ye,{size:13})," 打印"]})]})]}),i.jsxs("div",{className:"print-sheet mx-auto w-full max-w-[794px] rounded-lg border border-line bg-white p-5 shadow-card sm:p-8",children:[i.jsx("h1",{className:"text-center text-[18px] font-bold text-neutral-900",children:"学生综合素质测评"}),i.jsxs("div",{className:"mt-1 text-center text-[12px] text-neutral-500",children:[p.name??""," · ",p.className??""," · 统计周期:",T]}),i.jsxs("div",{className:"mt-5 rounded-md bg-neutral-100 px-4 py-2 text-center text-[15px] font-bold text-neutral-900",children:["综合素质总分:",i.jsx("span",{className:"num",children:O.total})," 分"]}),O.sections.map(n=>i.jsxs("div",{className:"mt-5",children:[i.jsxs("div",{className:"flex items-baseline justify-between border-b-2 border-neutral-800 pb-1",children:[i.jsxs("span",{className:"text-[13.5px] font-bold text-neutral-900",children:[n.label,"(上限 ",n.cap," 分)"]}),i.jsxs("span",{className:"num text-[12.5px] text-neutral-600",children:["小计 ",n.key==="rewards"?n.subtotal:Math.min(n.subtotal,n.cap)," 分"]})]}),i.jsxs("div",{className:"mt-2 flex flex-col gap-1.5",children:[n.items.map(a=>i.jsxs("div",{className:"flex items-center gap-2 text-[12.5px]",children:[i.jsxs("span",{className:"min-w-0 flex-1",children:[i.jsx("span",{className:"text-neutral-900",children:a.title}),i.jsx("span",{className:"ml-2 text-[11px] text-neutral-400",children:a.source}),a.note&&i.jsx("div",{className:"text-[11px] text-neutral-400",children:a.note})]}),i.jsx("input",{type:"number",step:"0.1",className:"num w-[72px] rounded-sm border border-neutral-200 px-1 py-0.5 text-right text-[12px]",value:a.score,onChange:d=>{var N;if(a.itemKey==="conduct"||a.itemKey==="integrity")G({...x,[a.itemKey]:Number(d.target.value)});else{const K={...x.itemOverrides??{},[a.itemKey]:{...((N=x.itemOverrides)==null?void 0:N[a.itemKey])??{},score:Number(d.target.value)}};G({...x,itemOverrides:K})}}})]},a.itemKey)),!n.items.length&&i.jsx("div",{className:"text-[12px] text-neutral-400",children:"暂无数据"})]})]},n.key)),g.length>0&&i.jsxs("div",{className:"mt-6 border-t border-neutral-300 pt-4",children:[i.jsx("div",{className:"mb-3 text-[13.5px] font-bold text-neutral-900",children:"附:证明材料"}),g.map(n=>i.jsxs("div",{className:"mb-4",children:[i.jsx("div",{className:"text-[12px] font-semibold text-neutral-800",children:n.title}),i.jsx("div",{className:"mt-1.5 flex flex-wrap gap-3",children:n.images.map((a,d)=>i.jsx("img",{src:a,alt:"证明 "+(d+1),className:"max-h-[180px] rounded border border-neutral-200"},d))})]},n.recordId))]}),i.jsx("div",{className:"mt-6 border-t border-neutral-200 pt-3 text-[11px] leading-relaxed text-neutral-400",children:"计分依据:《计算机与网络安全学院学生综合素质测评评分细则》。自动匹配条目均可手动修正分值; 「恢复自动」清除本学年全部手动修正。导出材料前请核对每条加分记录与证明材料一致。"})]})]})}export{Ce as AssessmentPage}; diff --git a/sync-server/www/assets/DashboardPage-DpgwpbHV.js b/sync-server/www/assets/DashboardPage-B2FldowF.js similarity index 94% rename from sync-server/www/assets/DashboardPage-DpgwpbHV.js rename to sync-server/www/assets/DashboardPage-B2FldowF.js index 365b01b..202ce32 100644 --- a/sync-server/www/assets/DashboardPage-DpgwpbHV.js +++ b/sync-server/www/assets/DashboardPage-B2FldowF.js @@ -1 +1 @@ -import{r as g,f as v,j as t,S as j,t as S}from"./index-DYhSDydL.js";import{C as c,a as d,b as x}from"./card-jktDkcYF.js";import{u as N,i as u,a as m}from"./useChart-DgHaQNyb.js";import{u as k,i as w,a as C,b as L,c as R,d as $,e as z,f as T}from"./echarts-BIWefrIc.js";k([w,C,L,R,$,z,T]);function q(){const[l,n]=g.useState(""),i=N(),e=v({queryKey:["stats",l||void 0],queryFn:()=>S(l?Number(l):void 0)}).data,p=u("2"),r=u("3"),h=m(()=>({grid:{left:34,right:12,top:14,bottom:24},tooltip:{trigger:"axis"},xAxis:{type:"category",data:(e==null?void 0:e.monthly.map(a=>a.ym.slice(2)))??[],axisLine:{lineStyle:{color:r}},axisTick:{show:!1},axisLabel:{color:r,fontSize:10}},yAxis:{type:"value",splitLine:{lineStyle:{color:"rgba(128,138,155,0.15)"}},axisLabel:{color:r,fontSize:10}},series:[{type:"bar",data:(e==null?void 0:e.monthly.map(a=>a.count))??[],barMaxWidth:18,itemStyle:{color:"#3056d3",borderRadius:[3,3,0,0]}}]}),[e,i]),b=m(()=>{const a=((e==null?void 0:e.by_type)??[]).filter(s=>s.count>0);return{tooltip:{trigger:"item"},legend:{orient:"vertical",right:4,top:"middle",textStyle:{color:p,fontSize:11},itemWidth:10,itemHeight:10},series:[{type:"pie",radius:["48%","72%"],center:["34%","50%"],label:{show:!1},data:a.map(s=>({name:s.label,value:s.count,itemStyle:{color:s.color||"#64748b"}}))}]}},[e,i]),y=m(()=>{const a=((e==null?void 0:e.by_level)??[]).filter(s=>s.count>0).slice().reverse();return{grid:{left:64,right:24,top:8,bottom:22},tooltip:{trigger:"axis"},xAxis:{type:"value",splitLine:{lineStyle:{color:"rgba(128,138,155,0.15)"}},axisLabel:{color:r,fontSize:10}},yAxis:{type:"category",data:a.map(s=>s.label),axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:p,fontSize:11}},series:[{type:"bar",data:a.map(s=>({value:s.count,itemStyle:{color:s.color||"#3056d3",borderRadius:[0,3,3,0]}})),barMaxWidth:14}]}},[e,i]),f=((e==null?void 0:e.metrics)??[]).slice(0,3);return t.jsxs("div",{className:"mx-auto max-w-[1080px] px-3 py-4 sm:px-6 sm:py-5",children:[t.jsxs("div",{className:"mb-4 flex flex-wrap items-center justify-between gap-3",children:[t.jsxs("div",{className:"flex flex-wrap gap-3",children:[t.jsx(o,{label:"总记录",value:(e==null?void 0:e.total)??0}),t.jsx(o,{label:l?l+" 年新增":"本年新增",value:(e==null?void 0:e.total_this_year)??0}),t.jsx(o,{label:"附件总数",value:(e==null?void 0:e.attachment_total)??0}),f.map(a=>t.jsx(o,{label:a.label,value:a.value,unit:a.unit??""},a.key))]}),t.jsx(j,{className:"w-[120px]",value:l,onChange:a=>n(a.target.value),options:[{value:"",label:"全部年份"},...((e==null?void 0:e.years)??[]).map(a=>({value:String(a),label:a+" 年"}))]})]}),!(e!=null&&e.metrics.length)&&t.jsx("div",{className:"mb-4 rounded-md border border-dashed border-line px-4 py-2 text-[12px] text-ink-3",children:"提示:在「统计」配置中注册指标(如志愿时长、读书本数),带单位的数值字段即可在此量化展示。"}),t.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-4",children:[t.jsxs(c,{children:[t.jsx(d,{title:"近 12 个月活跃度"}),t.jsx(x,{children:t.jsx("div",{ref:h,className:"h-[220px]"})})]}),t.jsxs(c,{children:[t.jsx(d,{title:"类型分布"}),t.jsx(x,{children:t.jsx("div",{ref:b,className:"h-[220px]"})})]}),t.jsxs(c,{className:"lg:col-span-2",children:[t.jsx(d,{title:"级别分布"}),t.jsx(x,{children:t.jsx("div",{ref:y,className:"h-[200px]"})})]})]})]})}function o({label:l,value:n,unit:i}){return t.jsxs("div",{className:"min-w-[120px] rounded-lg border border-line bg-surface px-4 py-3 shadow-card",children:[t.jsx("div",{className:"text-[12px] text-ink-3",children:l}),t.jsxs("div",{className:"num mt-0.5 text-[22px] font-semibold leading-tight text-ink-1",children:[n,i&&t.jsx("span",{className:"ml-1 text-[12px] font-normal text-ink-3",children:i})]})]})}export{q as DashboardPage}; +import{r as g,f as v,j as t,S as j,t as S}from"./index-DhGFbjWw.js";import{C as c,a as d,b as x}from"./card-65YyMNIi.js";import{u as N,i as u,a as m}from"./useChart-BbOzH_LJ.js";import{u as k,i as w,a as C,b as L,c as R,d as $,e as z,f as T}from"./echarts-BIWefrIc.js";k([w,C,L,R,$,z,T]);function q(){const[l,n]=g.useState(""),i=N(),e=v({queryKey:["stats",l||void 0],queryFn:()=>S(l?Number(l):void 0)}).data,p=u("2"),r=u("3"),h=m(()=>({grid:{left:34,right:12,top:14,bottom:24},tooltip:{trigger:"axis"},xAxis:{type:"category",data:(e==null?void 0:e.monthly.map(a=>a.ym.slice(2)))??[],axisLine:{lineStyle:{color:r}},axisTick:{show:!1},axisLabel:{color:r,fontSize:10}},yAxis:{type:"value",splitLine:{lineStyle:{color:"rgba(128,138,155,0.15)"}},axisLabel:{color:r,fontSize:10}},series:[{type:"bar",data:(e==null?void 0:e.monthly.map(a=>a.count))??[],barMaxWidth:18,itemStyle:{color:"#3056d3",borderRadius:[3,3,0,0]}}]}),[e,i]),b=m(()=>{const a=((e==null?void 0:e.by_type)??[]).filter(s=>s.count>0);return{tooltip:{trigger:"item"},legend:{orient:"vertical",right:4,top:"middle",textStyle:{color:p,fontSize:11},itemWidth:10,itemHeight:10},series:[{type:"pie",radius:["48%","72%"],center:["34%","50%"],label:{show:!1},data:a.map(s=>({name:s.label,value:s.count,itemStyle:{color:s.color||"#64748b"}}))}]}},[e,i]),y=m(()=>{const a=((e==null?void 0:e.by_level)??[]).filter(s=>s.count>0).slice().reverse();return{grid:{left:64,right:24,top:8,bottom:22},tooltip:{trigger:"axis"},xAxis:{type:"value",splitLine:{lineStyle:{color:"rgba(128,138,155,0.15)"}},axisLabel:{color:r,fontSize:10}},yAxis:{type:"category",data:a.map(s=>s.label),axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:p,fontSize:11}},series:[{type:"bar",data:a.map(s=>({value:s.count,itemStyle:{color:s.color||"#3056d3",borderRadius:[0,3,3,0]}})),barMaxWidth:14}]}},[e,i]),f=((e==null?void 0:e.metrics)??[]).slice(0,3);return t.jsxs("div",{className:"mx-auto max-w-[1080px] px-3 py-4 sm:px-6 sm:py-5",children:[t.jsxs("div",{className:"mb-4 flex flex-wrap items-center justify-between gap-3",children:[t.jsxs("div",{className:"flex flex-wrap gap-3",children:[t.jsx(o,{label:"总记录",value:(e==null?void 0:e.total)??0}),t.jsx(o,{label:l?l+" 年新增":"本年新增",value:(e==null?void 0:e.total_this_year)??0}),t.jsx(o,{label:"附件总数",value:(e==null?void 0:e.attachment_total)??0}),f.map(a=>t.jsx(o,{label:a.label,value:a.value,unit:a.unit??""},a.key))]}),t.jsx(j,{className:"w-[120px]",value:l,onChange:a=>n(a.target.value),options:[{value:"",label:"全部年份"},...((e==null?void 0:e.years)??[]).map(a=>({value:String(a),label:a+" 年"}))]})]}),!(e!=null&&e.metrics.length)&&t.jsx("div",{className:"mb-4 rounded-md border border-dashed border-line px-4 py-2 text-[12px] text-ink-3",children:"提示:在「统计」配置中注册指标(如志愿时长、读书本数),带单位的数值字段即可在此量化展示。"}),t.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-4",children:[t.jsxs(c,{children:[t.jsx(d,{title:"近 12 个月活跃度"}),t.jsx(x,{children:t.jsx("div",{ref:h,className:"h-[220px]"})})]}),t.jsxs(c,{children:[t.jsx(d,{title:"类型分布"}),t.jsx(x,{children:t.jsx("div",{ref:b,className:"h-[220px]"})})]}),t.jsxs(c,{className:"lg:col-span-2",children:[t.jsx(d,{title:"级别分布"}),t.jsx(x,{children:t.jsx("div",{ref:y,className:"h-[200px]"})})]})]})]})}function o({label:l,value:n,unit:i}){return t.jsxs("div",{className:"min-w-[120px] rounded-lg border border-line bg-surface px-4 py-3 shadow-card",children:[t.jsx("div",{className:"text-[12px] text-ink-3",children:l}),t.jsxs("div",{className:"num mt-0.5 text-[22px] font-semibold leading-tight text-ink-1",children:[n,i&&t.jsx("span",{className:"ml-1 text-[12px] font-normal text-ink-3",children:i})]})]})}export{q as DashboardPage}; diff --git a/sync-server/www/assets/GradesPage-CVTBUD3I.js b/sync-server/www/assets/GradesPage-JJ6n0CJZ.js similarity index 99% rename from sync-server/www/assets/GradesPage-CVTBUD3I.js rename to sync-server/www/assets/GradesPage-JJ6n0CJZ.js index 139c4ec..7ec403a 100644 --- a/sync-server/www/assets/GradesPage-CVTBUD3I.js +++ b/sync-server/www/assets/GradesPage-JJ6n0CJZ.js @@ -1,4 +1,4 @@ -import{c as $,f as O,j as e,E as H,w as U,u as k,d as C,r as u,g as y,x as W,y as J,B as j,P as E,I as g,z as Y,C as A,A as V,D as B,F as X,m as S,l as Q,T as q,H as Z,J as z,K as M,S as T,M as D}from"./index-DYhSDydL.js";import{C as w,a as G,b as F}from"./card-jktDkcYF.js";import{u as ee,i as K,a as P}from"./useChart-DgHaQNyb.js";import{u as se,i as te,b as ae,a as re,c as ne,d as le,e as ie,f as oe}from"./echarts-BIWefrIc.js";/** +import{c as $,f as O,j as e,E as H,w as U,u as k,d as C,r as u,g as y,x as W,y as J,B as j,P as E,I as g,z as Y,C as A,A as V,D as B,F as X,m as S,l as Q,T as q,H as Z,J as z,K as M,S as T,M as D}from"./index-DhGFbjWw.js";import{C as w,a as G,b as F}from"./card-65YyMNIi.js";import{u as ee,i as K,a as P}from"./useChart-BbOzH_LJ.js";import{u as se,i as te,b as ae,a as re,c as ne,d as le,e as ie,f as oe}from"./echarts-BIWefrIc.js";/** * @license lucide-react v0.475.0 - ISC * * This source code is licensed under the ISC license. diff --git a/sync-server/www/assets/ProfilePage-ByBFpCNn.js b/sync-server/www/assets/ProfilePage-CNbjDB4w.js similarity index 99% rename from sync-server/www/assets/ProfilePage-ByBFpCNn.js rename to sync-server/www/assets/ProfilePage-CNbjDB4w.js index 7616804..cf32291 100644 --- a/sync-server/www/assets/ProfilePage-ByBFpCNn.js +++ b/sync-server/www/assets/ProfilePage-CNbjDB4w.js @@ -1,4 +1,4 @@ -import{c as E,u as P,d as S,r as p,f as q,g as F,j as e,B as f,l as B,ac as L,H as z,J as k,S as M,I as Q,ad as _,ae as K,af as v,ag as T}from"./index-DYhSDydL.js";/** +import{c as E,u as P,d as S,r as p,f as q,g as F,j as e,B as f,l as B,ac as L,H as z,J as k,S as M,I as Q,ad as _,ae as K,af as v,ag as T}from"./index-DhGFbjWw.js";/** * @license lucide-react v0.475.0 - ISC * * This source code is licensed under the ISC license. diff --git a/sync-server/www/assets/RecordsPage-C0AcNVzM.js b/sync-server/www/assets/RecordsPage-A-isVkg3.js similarity index 99% rename from sync-server/www/assets/RecordsPage-C0AcNVzM.js rename to sync-server/www/assets/RecordsPage-A-isVkg3.js index 99e6d86..c69f5cd 100644 --- a/sync-server/www/assets/RecordsPage-C0AcNVzM.js +++ b/sync-server/www/assets/RecordsPage-A-isVkg3.js @@ -1,4 +1,4 @@ -import{c as fe,j as e,a as N,r as s,b as he,u as ve,d as ge,e as je,f as L,g as ye,I as be,S as k,B as w,P as Q,h as te,L as se,G as ae,R as Ne,i as ne,k as ke,l as we,T as Ce,E as le,m as Ee,n as Se,o as _e,C as ze,p as qe,q as Le,s as Re,t as De,v as Ie}from"./index-DYhSDydL.js";/** +import{c as fe,j as e,a as N,r as s,b as he,u as ve,d as ge,e as je,f as L,g as ye,I as be,S as k,B as w,P as Q,h as te,L as se,G as ae,R as Ne,i as ne,k as ke,l as we,T as Ce,E as le,m as Ee,n as Se,o as _e,C as ze,p as qe,q as Le,s as Re,t as De,v as Ie}from"./index-DhGFbjWw.js";/** * @license lucide-react v0.475.0 - ISC * * This source code is licensed under the ISC license. diff --git a/sync-server/www/assets/ResumePage-Z8eiwwzo.js b/sync-server/www/assets/ResumePage-CsGwAj0V.js similarity index 99% rename from sync-server/www/assets/ResumePage-Z8eiwwzo.js rename to sync-server/www/assets/ResumePage-CsGwAj0V.js index 248826d..3cd429a 100644 --- a/sync-server/www/assets/ResumePage-Z8eiwwzo.js +++ b/sync-server/www/assets/ResumePage-CsGwAj0V.js @@ -1,4 +1,4 @@ -import{c as A,d as we,f as se,r as T,j as e,B as R,ah as Ce,af as M,J as B,S as ne,ad as de,P as $,H as Se,a9 as _e,T as ie,I as V,ag as ze,v as Re}from"./index-DYhSDydL.js";import{C as ae,a as le,b as re}from"./card-jktDkcYF.js";import{R as Pe}from"./refresh-cw-CP7uPCIx.js";import{R as oe,P as Ee}from"./rotate-ccw-CE3bwRx2.js";/** +import{c as A,d as we,f as se,r as T,j as e,B as R,ah as Ce,af as M,J as B,S as ne,ad as de,P as $,H as Se,a9 as _e,T as ie,I as V,ag as ze,v as Re}from"./index-DhGFbjWw.js";import{C as ae,a as le,b as re}from"./card-65YyMNIi.js";import{R as Pe}from"./refresh-cw-C3HYho-f.js";import{R as oe,P as Ee}from"./rotate-ccw-DGANt55P.js";/** * @license lucide-react v0.475.0 - ISC * * This source code is licensed under the ISC license. diff --git a/sync-server/www/assets/TaxonomyPage-B1I0kN2Q.js b/sync-server/www/assets/TaxonomyPage-DfBe5HxB.js similarity index 97% rename from sync-server/www/assets/TaxonomyPage-B1I0kN2Q.js rename to sync-server/www/assets/TaxonomyPage-DfBe5HxB.js index 0489748..22c9ff8 100644 --- a/sync-server/www/assets/TaxonomyPage-B1I0kN2Q.js +++ b/sync-server/www/assets/TaxonomyPage-DfBe5HxB.js @@ -1 +1 @@ -import{j as e,u as k,d as q,f as z,r as g,g as h,W as F,X as w,B as j,T as D,I as Q,P as T,C as E,Y as M,Z as B,s as P,_ as I}from"./index-DYhSDydL.js";import{C as K,a as S}from"./card-jktDkcYF.js";const f=["#3056d3","#7c3aed","#0891b2","#16a34a","#d97706","#dc2626","#db2777","#64748b"];function A(){return e.jsxs("div",{className:"mx-auto max-w-[1080px] px-3 py-4 sm:px-6 sm:py-5",children:[e.jsx("p",{className:"mb-4 text-[12px] text-ink-3",children:"字典驱动录入表单中的下拉选项;维度是自定义的成长分类轴,一条记录可挂多个维度。"}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-4",children:[e.jsx(C,{kind:"level",title:"级别字典",description:"国际级、国家级、省市级等,可按学校口径增改"}),e.jsx(C,{kind:"role",title:"角色字典",description:"主导、核心、参加等参与角色"}),e.jsx(O,{})]})]})}function C({kind:r,title:x,description:N}){var v;const l=k(),o=q(),n=(((v=z({queryKey:["taxonomy-all"],queryFn:()=>P()}).data)==null?void 0:v.items)??[]).filter(s=>s.kind===r).sort((s,m)=>s.sort-m.sort),[a,c]=g.useState(""),[u,d]=g.useState(null),t=h({mutationFn:F,onSuccess:()=>void l.invalidateQueries({queryKey:["taxonomy-all"]})}),i=h({mutationFn:s=>w(s),onSuccess:()=>{l.invalidateQueries({queryKey:["taxonomy-all"]}),o("success","已删除"),d(null)},onError:s=>{o("error",s.message),d(null)}});return e.jsxs(K,{children:[e.jsx(S,{title:x,extra:e.jsx("span",{className:"text-[11px] text-ink-3",children:N})}),e.jsxs("div",{className:"flex flex-col gap-1 p-3",children:[n.map((s,m)=>e.jsxs("div",{className:"flex items-center gap-2 rounded-md px-1 py-1 hover:bg-surface-2",children:[e.jsx("input",{type:"color",value:s.color??f[m%f.length],className:"size-5 cursor-pointer rounded border border-line bg-surface",onChange:y=>t.mutate({id:s.id,kind:r,value:s.value,color:y.target.value,sort:s.sort})}),e.jsx("input",{className:"h-7 flex-1 rounded border border-transparent bg-transparent px-1.5 text-[13px] text-ink-1 hover:border-line focus:border-brand focus:outline-none",value:s.value,onChange:()=>{},onBlur:y=>{const b=y.target.value.trim();b&&b!==s.value&&t.mutate({id:s.id,kind:r,value:b,color:s.color,sort:s.sort})},defaultValue:s.value},s.value),e.jsxs("span",{className:"num w-14 text-right text-[11px] text-ink-3",children:["#",s.sort]}),s.is_builtin?e.jsx("span",{className:"w-7 text-center text-[11px] text-ink-3",children:"内置"}):e.jsx(j,{variant:"ghost",size:"icon-sm","aria-label":"删除",onClick:()=>d({id:s.id,value:s.value}),children:e.jsx(D,{size:13})})]},s.id)),e.jsxs("div",{className:"mt-1 flex items-center gap-2 border-t border-line pt-2",children:[e.jsx(Q,{className:"flex-1",placeholder:"新增条目,回车或点击按钮",value:a,onChange:s=>c(s.target.value),onKeyDown:s=>{var m;s.key==="Enter"&&a.trim()&&(t.mutate({kind:r,value:a.trim(),sort:(((m=n.at(-1))==null?void 0:m.sort)??0)+10}),c(""))}}),e.jsxs(j,{size:"sm",variant:"secondary",disabled:!a.trim(),onClick:()=>{var s;t.mutate({kind:r,value:a.trim(),sort:(((s=n.at(-1))==null?void 0:s.sort)??0)+10}),c("")},children:[e.jsx(T,{size:13})," 添加"]})]})]}),e.jsx(E,{open:!!u,title:"删除字典条目",content:u?"确定删除「"+u.value+"」吗?":"",onCancel:()=>d(null),onOk:()=>u&&i.mutate(u.id)})]})}function O(){var d;const r=k(),x=q(),l=[...((d=z({queryKey:["dimensions"],queryFn:I}).data)==null?void 0:d.items)??[]].sort((t,i)=>t.sort-i.sort),[o,p]=g.useState(""),[n,a]=g.useState(null),c=h({mutationFn:M,onSuccess:()=>void r.invalidateQueries({queryKey:["dimensions"]})}),u=h({mutationFn:t=>B(t),onSuccess:()=>{r.invalidateQueries({queryKey:["dimensions"]}),x("success","已删除"),a(null)},onError:t=>{x("error",t.message),a(null)}});return e.jsxs(K,{children:[e.jsx(S,{title:"成长维度",extra:e.jsx("span",{className:"text-[11px] text-ink-3",children:"如:学业深造 / 职业发展 / 兴趣生活"})}),e.jsxs("div",{className:"flex flex-col gap-1 p-3",children:[l.map((t,i)=>e.jsxs("div",{className:"flex items-center gap-2 rounded-md px-1 py-1 hover:bg-surface-2",children:[e.jsx("span",{className:"size-3 rounded-full",style:{backgroundColor:t.color??f[i%f.length]}}),e.jsx("input",{className:"h-7 flex-1 rounded border border-transparent bg-transparent px-1.5 text-[13px] text-ink-1 hover:border-line focus:border-brand focus:outline-none",defaultValue:t.name,onBlur:v=>{const s=v.target.value.trim();s&&s!==t.name&&c.mutate({id:t.id,name:s,color:t.color,sort:t.sort})}},t.name),e.jsx(j,{variant:"ghost",size:"icon-sm","aria-label":"删除",onClick:()=>a({id:t.id,name:t.name}),children:e.jsx(D,{size:13})})]},t.id)),!l.length&&e.jsx("div",{className:"py-2 text-center text-[12px] text-ink-3",children:"尚未配置维度"}),e.jsxs("div",{className:"mt-1 flex items-center gap-2 border-t border-line pt-2",children:[e.jsx(Q,{className:"flex-1",placeholder:"新增维度名称",value:o,onChange:t=>p(t.target.value),onKeyDown:t=>{var i;t.key==="Enter"&&o.trim()&&(c.mutate({name:o.trim(),sort:(((i=l.at(-1))==null?void 0:i.sort)??0)+10}),p(""))}}),e.jsxs(j,{size:"sm",variant:"secondary",disabled:!o.trim(),onClick:()=>{var t;c.mutate({name:o.trim(),sort:(((t=l.at(-1))==null?void 0:t.sort)??0)+10}),p("")},children:[e.jsx(T,{size:13})," 添加"]})]})]}),e.jsx(E,{open:!!n,title:"删除维度",content:n?"确定删除「"+n.name+"」吗?记录与该维度的关联将一并移除。":"",onCancel:()=>a(null),onOk:()=>n&&u.mutate(n.id)})]})}export{A as TaxonomyPage}; +import{j as e,u as k,d as q,f as z,r as g,g as h,W as F,X as w,B as j,T as D,I as Q,P as T,C as E,Y as M,Z as B,s as P,_ as I}from"./index-DhGFbjWw.js";import{C as K,a as S}from"./card-65YyMNIi.js";const f=["#3056d3","#7c3aed","#0891b2","#16a34a","#d97706","#dc2626","#db2777","#64748b"];function A(){return e.jsxs("div",{className:"mx-auto max-w-[1080px] px-3 py-4 sm:px-6 sm:py-5",children:[e.jsx("p",{className:"mb-4 text-[12px] text-ink-3",children:"字典驱动录入表单中的下拉选项;维度是自定义的成长分类轴,一条记录可挂多个维度。"}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-4",children:[e.jsx(C,{kind:"level",title:"级别字典",description:"国际级、国家级、省市级等,可按学校口径增改"}),e.jsx(C,{kind:"role",title:"角色字典",description:"主导、核心、参加等参与角色"}),e.jsx(O,{})]})]})}function C({kind:r,title:x,description:N}){var v;const l=k(),o=q(),n=(((v=z({queryKey:["taxonomy-all"],queryFn:()=>P()}).data)==null?void 0:v.items)??[]).filter(s=>s.kind===r).sort((s,m)=>s.sort-m.sort),[a,c]=g.useState(""),[u,d]=g.useState(null),t=h({mutationFn:F,onSuccess:()=>void l.invalidateQueries({queryKey:["taxonomy-all"]})}),i=h({mutationFn:s=>w(s),onSuccess:()=>{l.invalidateQueries({queryKey:["taxonomy-all"]}),o("success","已删除"),d(null)},onError:s=>{o("error",s.message),d(null)}});return e.jsxs(K,{children:[e.jsx(S,{title:x,extra:e.jsx("span",{className:"text-[11px] text-ink-3",children:N})}),e.jsxs("div",{className:"flex flex-col gap-1 p-3",children:[n.map((s,m)=>e.jsxs("div",{className:"flex items-center gap-2 rounded-md px-1 py-1 hover:bg-surface-2",children:[e.jsx("input",{type:"color",value:s.color??f[m%f.length],className:"size-5 cursor-pointer rounded border border-line bg-surface",onChange:y=>t.mutate({id:s.id,kind:r,value:s.value,color:y.target.value,sort:s.sort})}),e.jsx("input",{className:"h-7 flex-1 rounded border border-transparent bg-transparent px-1.5 text-[13px] text-ink-1 hover:border-line focus:border-brand focus:outline-none",value:s.value,onChange:()=>{},onBlur:y=>{const b=y.target.value.trim();b&&b!==s.value&&t.mutate({id:s.id,kind:r,value:b,color:s.color,sort:s.sort})},defaultValue:s.value},s.value),e.jsxs("span",{className:"num w-14 text-right text-[11px] text-ink-3",children:["#",s.sort]}),s.is_builtin?e.jsx("span",{className:"w-7 text-center text-[11px] text-ink-3",children:"内置"}):e.jsx(j,{variant:"ghost",size:"icon-sm","aria-label":"删除",onClick:()=>d({id:s.id,value:s.value}),children:e.jsx(D,{size:13})})]},s.id)),e.jsxs("div",{className:"mt-1 flex items-center gap-2 border-t border-line pt-2",children:[e.jsx(Q,{className:"flex-1",placeholder:"新增条目,回车或点击按钮",value:a,onChange:s=>c(s.target.value),onKeyDown:s=>{var m;s.key==="Enter"&&a.trim()&&(t.mutate({kind:r,value:a.trim(),sort:(((m=n.at(-1))==null?void 0:m.sort)??0)+10}),c(""))}}),e.jsxs(j,{size:"sm",variant:"secondary",disabled:!a.trim(),onClick:()=>{var s;t.mutate({kind:r,value:a.trim(),sort:(((s=n.at(-1))==null?void 0:s.sort)??0)+10}),c("")},children:[e.jsx(T,{size:13})," 添加"]})]})]}),e.jsx(E,{open:!!u,title:"删除字典条目",content:u?"确定删除「"+u.value+"」吗?":"",onCancel:()=>d(null),onOk:()=>u&&i.mutate(u.id)})]})}function O(){var d;const r=k(),x=q(),l=[...((d=z({queryKey:["dimensions"],queryFn:I}).data)==null?void 0:d.items)??[]].sort((t,i)=>t.sort-i.sort),[o,p]=g.useState(""),[n,a]=g.useState(null),c=h({mutationFn:M,onSuccess:()=>void r.invalidateQueries({queryKey:["dimensions"]})}),u=h({mutationFn:t=>B(t),onSuccess:()=>{r.invalidateQueries({queryKey:["dimensions"]}),x("success","已删除"),a(null)},onError:t=>{x("error",t.message),a(null)}});return e.jsxs(K,{children:[e.jsx(S,{title:"成长维度",extra:e.jsx("span",{className:"text-[11px] text-ink-3",children:"如:学业深造 / 职业发展 / 兴趣生活"})}),e.jsxs("div",{className:"flex flex-col gap-1 p-3",children:[l.map((t,i)=>e.jsxs("div",{className:"flex items-center gap-2 rounded-md px-1 py-1 hover:bg-surface-2",children:[e.jsx("span",{className:"size-3 rounded-full",style:{backgroundColor:t.color??f[i%f.length]}}),e.jsx("input",{className:"h-7 flex-1 rounded border border-transparent bg-transparent px-1.5 text-[13px] text-ink-1 hover:border-line focus:border-brand focus:outline-none",defaultValue:t.name,onBlur:v=>{const s=v.target.value.trim();s&&s!==t.name&&c.mutate({id:t.id,name:s,color:t.color,sort:t.sort})}},t.name),e.jsx(j,{variant:"ghost",size:"icon-sm","aria-label":"删除",onClick:()=>a({id:t.id,name:t.name}),children:e.jsx(D,{size:13})})]},t.id)),!l.length&&e.jsx("div",{className:"py-2 text-center text-[12px] text-ink-3",children:"尚未配置维度"}),e.jsxs("div",{className:"mt-1 flex items-center gap-2 border-t border-line pt-2",children:[e.jsx(Q,{className:"flex-1",placeholder:"新增维度名称",value:o,onChange:t=>p(t.target.value),onKeyDown:t=>{var i;t.key==="Enter"&&o.trim()&&(c.mutate({name:o.trim(),sort:(((i=l.at(-1))==null?void 0:i.sort)??0)+10}),p(""))}}),e.jsxs(j,{size:"sm",variant:"secondary",disabled:!o.trim(),onClick:()=>{var t;c.mutate({name:o.trim(),sort:(((t=l.at(-1))==null?void 0:t.sort)??0)+10}),p("")},children:[e.jsx(T,{size:13})," 添加"]})]})]}),e.jsx(E,{open:!!n,title:"删除维度",content:n?"确定删除「"+n.name+"」吗?记录与该维度的关联将一并移除。":"",onCancel:()=>a(null),onOk:()=>n&&u.mutate(n.id)})]})}export{A as TaxonomyPage}; diff --git a/sync-server/www/assets/TypesPage-BbQujrm2.js b/sync-server/www/assets/TypesPage-DPbRIcZM.js similarity index 98% rename from sync-server/www/assets/TypesPage-BbQujrm2.js rename to sync-server/www/assets/TypesPage-DPbRIcZM.js index 98ec3c9..18160c9 100644 --- a/sync-server/www/assets/TypesPage-BbQujrm2.js +++ b/sync-server/www/assets/TypesPage-DPbRIcZM.js @@ -1,4 +1,4 @@ -import{c as D,u as K,d as I,f as L,r,g as q,j as e,B as p,P as F,N as O,m as _,l as H,T as P,C as R,O as G,H as J,J as i,I as j,Q as U,S as z,U as V,V as W,q as X}from"./index-DYhSDydL.js";import{C as Y}from"./card-jktDkcYF.js";/** +import{c as D,u as K,d as I,f as L,r,g as q,j as e,B as p,P as F,N as O,m as _,l as H,T as P,C as R,O as G,H as J,J as i,I as j,Q as U,S as z,U as V,V as W,q as X}from"./index-DhGFbjWw.js";import{C as Y}from"./card-65YyMNIi.js";/** * @license lucide-react v0.475.0 - ISC * * This source code is licensed under the ISC license. diff --git a/sync-server/www/assets/card-jktDkcYF.js b/sync-server/www/assets/card-65YyMNIi.js similarity index 89% rename from sync-server/www/assets/card-jktDkcYF.js rename to sync-server/www/assets/card-65YyMNIi.js index 6c8381b..a663a37 100644 --- a/sync-server/www/assets/card-jktDkcYF.js +++ b/sync-server/www/assets/card-65YyMNIi.js @@ -1 +1 @@ -import{j as s,a}from"./index-DYhSDydL.js";function i({className:r,...e}){return s.jsx("div",{className:a("rounded-lg border border-line bg-surface shadow-card",r),...e})}function t({title:r,extra:e,className:n}){return s.jsxs("div",{className:a("flex min-h-11 flex-wrap items-center justify-between gap-2 border-b border-line px-4 py-1.5",n),children:[s.jsx("h3",{className:"text-[13px] font-semibold text-ink-1",children:r}),e&&s.jsx("div",{className:"flex flex-wrap items-center gap-2",children:e})]})}function c({className:r,...e}){return s.jsx("div",{className:a("p-4",r),...e})}export{i as C,t as a,c as b}; +import{j as s,a}from"./index-DhGFbjWw.js";function i({className:r,...e}){return s.jsx("div",{className:a("rounded-lg border border-line bg-surface shadow-card",r),...e})}function t({title:r,extra:e,className:n}){return s.jsxs("div",{className:a("flex min-h-11 flex-wrap items-center justify-between gap-2 border-b border-line px-4 py-1.5",n),children:[s.jsx("h3",{className:"text-[13px] font-semibold text-ink-1",children:r}),e&&s.jsx("div",{className:"flex flex-wrap items-center gap-2",children:e})]})}function c({className:r,...e}){return s.jsx("div",{className:a("p-4",r),...e})}export{i as C,t as a,c as b}; diff --git a/sync-server/www/assets/index-Cn3Zl9XQ.css b/sync-server/www/assets/index-Cn3Zl9XQ.css deleted file mode 100644 index 272ec72..0000000 --- a/sync-server/www/assets/index-Cn3Zl9XQ.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--leading-tight:1.25;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.right-2{right:calc(var(--spacing) * 2)}.right-5{right:calc(var(--spacing) * 5)}.bottom-0{bottom:0}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.left-0{left:0}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-\[7px\]{left:7px}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-3{margin-inline:calc(var(--spacing) * -3)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-auto{margin-block:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-auto{margin-right:auto}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-20{width:calc(var(--spacing) * 20);height:calc(var(--spacing) * 20)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-\[22px\]{height:22px}.h-\[34px\]{height:34px}.h-\[60px\]{height:60px}.h-\[72vh\]{height:72vh}.h-\[110px\]{height:110px}.h-\[200px\]{height:200px}.h-\[220px\]{height:220px}.h-full{height:100%}.max-h-\[68vh\]{max-height:68vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[72vh\]{max-height:72vh}.max-h-\[430px\]{max-height:430px}.max-h-\[520px\]{max-height:520px}.max-h-\[calc\(100vh-260px\)\]{max-height:calc(100vh - 260px)}.min-h-0{min-height:0}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-\[72px\]{min-height:72px}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-\[3px\]{width:3px}.w-\[32\%\]{width:32%}.w-\[52px\]{width:52px}.w-\[56px\]{width:56px}.w-\[64px\]{width:64px}.w-\[72px\]{width:72px}.w-\[82px\]{width:82px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[150px\]{width:150px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[210px\]{width:210px}.w-\[236px\]{width:236px}.w-\[240px\]{width:240px}.w-full{width:100%}.w-px{width:1px}.max-w-\[220px\]{max-width:220px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[794px\]{max-width:794px}.max-w-\[880px\]{max-width:880px}.max-w-\[1080px\]{max-width:1080px}.max-w-\[1280px\]{max-width:1280px}.min-w-0{min-width:0}.min-w-\[52px\]{min-width:52px}.min-w-\[80px\]{min-width:80px}.min-w-\[120px\]{min-width:120px}.min-w-\[128px\]{min-width:128px}.min-w-\[160px\]{min-width:160px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize{resize:both}.resize-y{resize:vertical}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[76px_1fr\]{grid-template-columns:76px 1fr}.grid-cols-\[84px_1fr\]{grid-template-columns:84px 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-x-2\.5{column-gap:calc(var(--spacing) * 2.5)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.gap-y-3\.5{row-gap:calc(var(--spacing) * 3.5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-line>:not(:last-child)){border-color:var(--border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:12px}.rounded-md{border-radius:8px}.rounded-sm{border-radius:5px}.rounded-b-lg{border-bottom-right-radius:12px;border-bottom-left-radius:12px}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-brand,.border-brand\/30{border-color:var(--brand)}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--brand) 30%,transparent)}}.border-brand\/40{border-color:var(--brand)}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--brand) 40%,transparent)}}.border-danger\/30{border-color:var(--danger)}@supports (color:color-mix(in lab,red,red)){.border-danger\/30{border-color:color-mix(in oklab,var(--danger) 30%,transparent)}}.border-ink-1{border-color:var(--text-1)}.border-line{border-color:var(--border)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-transparent{border-color:#0000}.border-warning{border-color:var(--warning)}.\!bg-danger{background-color:var(--danger)!important}.bg-bg,.bg-bg\/90{background-color:var(--bg)}@supports (color:color-mix(in lab,red,red)){.bg-bg\/90{background-color:color-mix(in oklab,var(--bg) 90%,transparent)}}.bg-bg\/95{background-color:var(--bg)}@supports (color:color-mix(in lab,red,red)){.bg-bg\/95{background-color:color-mix(in oklab,var(--bg) 95%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/45{background-color:#00000073}@supports (color:color-mix(in lab,red,red)){.bg-black\/45{background-color:color-mix(in oklab,var(--color-black) 45%,transparent)}}.bg-brand{background-color:var(--brand)}.bg-brand-subtle,.bg-brand-subtle\/40{background-color:var(--brand-subtle)}@supports (color:color-mix(in lab,red,red)){.bg-brand-subtle\/40{background-color:color-mix(in oklab,var(--brand-subtle) 40%,transparent)}}.bg-danger{background-color:var(--danger)}.bg-danger-subtle{background-color:var(--danger-subtle)}.bg-line{background-color:var(--border)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-success-subtle{background-color:var(--success-subtle)}.bg-surface{background-color:var(--surface)}.bg-surface-2{background-color:var(--surface-2)}.bg-surface-3{background-color:var(--surface-3)}.bg-transparent{background-color:#0000}.bg-warning-subtle{background-color:var(--warning-subtle)}.bg-white{background-color:var(--color-white)}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-black\/60{--tw-gradient-from:#0009}@supports (color:color-mix(in lab,red,red)){.from-black\/60{--tw-gradient-from:color-mix(in oklab, var(--color-black) 60%, transparent)}}.from-black\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-px{padding-block:1px}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[26px\]{font-size:26px}.leading-\[18px\]{--tw-leading:18px;line-height:18px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-white{color:var(--color-white)!important}.text-\[var\(--accent\)\]{color:var(--accent)}.text-brand{color:var(--brand)}.text-brand-text{color:var(--brand-text)}.text-danger{color:var(--danger)}.text-ink-1{color:var(--text-1)}.text-ink-2{color:var(--text-2)}.text-ink-3,.text-ink-3\/60{color:var(--text-3)}@supports (color:color-mix(in lab,red,red)){.text-ink-3\/60{color:color-mix(in oklab,var(--text-3) 60%,transparent)}}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-900{color:var(--color-neutral-900)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.shadow-card{--tw-shadow:0 1px 2px var(--tw-shadow-color,#00000008), 0 2px 8px var(--tw-shadow-color,#0000000a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-pop{--tw-shadow:0 4px 12px var(--tw-shadow-color,#00000014), 0 16px 48px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.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,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:scale-\[1\.04\]:is(:where(.group):hover *){scale:1.04}.group-hover\:text-brand-text:is(:where(.group):hover *){color:var(--brand-text)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-ink-3::placeholder{color:var(--text-3)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.focus-within\:border-brand:focus-within{border-color:var(--brand)}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-brand\/40:hover{border-color:var(--brand)}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/40:hover{border-color:color-mix(in oklab,var(--brand) 40%,transparent)}}.hover\:border-line:hover{border-color:var(--border)}.hover\:border-line-strong:hover{border-color:var(--border-strong)}.hover\:bg-brand-hover:hover{background-color:var(--brand-hover)}.hover\:bg-brand-subtle:hover{background-color:var(--brand-subtle)}.hover\:bg-danger-subtle:hover{background-color:var(--danger-subtle)}.hover\:bg-surface-2:hover{background-color:var(--surface-2)}.hover\:bg-surface-3:hover{background-color:var(--surface-3)}.hover\:text-brand-text:hover{color:var(--brand-text)}.hover\:text-danger:hover{color:var(--danger)}.hover\:text-ink-1:hover{color:var(--text-1)}.hover\:text-ink-2:hover{color:var(--text-2)}.hover\:text-success:hover{color:var(--success)}.hover\:text-warning:hover{color:var(--warning)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-brand:hover{--tw-shadow:0 2px 8px var(--tw-shadow-color,#3056d347);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-pop:hover{--tw-shadow:0 4px 12px var(--tw-shadow-color,#00000014), 0 16px 48px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:brightness-110:hover{--tw-brightness:brightness(110%);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,)}.hover\:brightness-\[0\.97\]:hover{--tw-brightness:brightness(.97);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,)}}.focus\:border-brand:focus{border-color:var(--brand)}.focus\:shadow-\[0_0_0_1\.5px_rgba\(48\,86\,211\,0\.5\)\]:focus{--tw-shadow:0 0 0 1.5px var(--tw-shadow-color,#3056d380);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:bg-surface-2:active{background-color:var(--surface-2)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}@media not all and (min-width:64rem){.max-lg\:fixed{position:fixed}.max-lg\:inset-y-0{inset-block:0}.max-lg\:left-0{left:0}.max-lg\:z-40{z-index:40}.max-lg\:-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.max-lg\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.max-lg\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}@media(min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:-mx-6{margin-inline:calc(var(--spacing) * -6)}.sm\:ml-auto{margin-left:auto}.sm\:contents{display:contents}.sm\:flex{display:flex}.sm\:inline{display:inline}.sm\:h-14{height:calc(var(--spacing) * 14)}.sm\:w-\[96px\]{width:96px}.sm\:w-\[100px\]{width:100px}.sm\:w-\[110px\]{width:110px}.sm\:w-\[120px\]{width:120px}.sm\:w-\[130px\]{width:130px}.sm\:w-\[220px\]{width:220px}.sm\:w-auto{width:auto}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr_120px_100px\]{grid-template-columns:1fr 120px 100px}.sm\:grid-cols-\[1fr_130px_120px_1fr_28px\]{grid-template-columns:1fr 130px 120px 1fr 28px}.sm\:grid-cols-\[200px_1fr\]{grid-template-columns:200px 1fr}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-10{padding:calc(var(--spacing) * 10)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-0{padding-block:0}.sm\:py-4{padding-block:calc(var(--spacing) * 4)}.sm\:py-5{padding-block:calc(var(--spacing) * 5)}}@media(min-width:48rem){.md\:block{display:block}.md\:hidden{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-4{top:calc(var(--spacing) * 4)}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:hidden{display:none}.lg\:max-h-\[calc\(100vh-2rem\)\]{max-height:calc(100vh - 2rem)}.lg\:w-\[280px\]{width:280px}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[1fr_340px\]{grid-template-columns:1fr 340px}.lg\:self-start{align-self:flex-start}.lg\:overflow-y-auto{overflow-y:auto}.lg\:pr-1{padding-right:var(--spacing)}}.\[\&_img\]\:max-w-full img{max-width:100%}.\[\&_table\]\:border-collapse table{border-collapse:collapse}.\[\&_td\]\:border td{border-style:var(--tw-border-style);border-width:1px}.\[\&_td\]\:border-line td{border-color:var(--border)}.\[\&_td\]\:px-2 td{padding-inline:calc(var(--spacing) * 2)}.\[\&_td\]\:py-1 td{padding-block:var(--spacing)}.\[\&_th\]\:border th{border-style:var(--tw-border-style);border-width:1px}.\[\&_th\]\:border-line th{border-color:var(--border)}.\[\&_th\]\:px-2 th{padding-inline:calc(var(--spacing) * 2)}.\[\&_th\]\:py-1 th{padding-block:var(--spacing)}}:root{--bg:#f3f4f6;--surface:#fff;--surface-2:#f8f9fa;--surface-3:#eceef1;--border:#e3e6ea;--border-strong:#c8cdd6;--text-1:#111318;--text-2:#3d434f;--text-3:#747c8a;--brand:#3346d3;--brand-hover:#2a3ab8;--brand-subtle:#eef1ff;--brand-text:#2a3ab8;--success:#177245;--success-subtle:#ebfaf1;--warning:#a86509;--warning-subtle:#fef8eb;--danger:#d5304f;--danger-subtle:#fef0f2;color-scheme:light}.dark{--bg:#0c0d10;--surface:#141519;--surface-2:#1a1c22;--surface-3:#23262e;--border:#262932;--border-strong:#363b47;--text-1:#e9ebf0;--text-2:#a0a8b8;--text-3:#68707e;--brand:#6d8bfa;--brand-hover:#8aa2fb;--brand-subtle:#1a2144;--brand-text:#96adfa;--success:#34d399;--success-subtle:#0d2921;--warning:#fbbf24;--warning-subtle:#2b2109;--danger:#f87171;--danger-subtle:#2d1317;color-scheme:dark}html,body,#root{height:100%}html,body{overflow-x:clip}body{-webkit-tap-highlight-color:transparent;touch-action:manipulation;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)}@media(pointer:coarse){button,[role=button],a{min-height:36px}input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]),select,textarea{font-size:16px!important}}body{background:var(--bg);color:var(--text-1);letter-spacing:.003em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;font-feature-settings:"cv02","cv03","cv04","cv11";font-family:Inter Variable,Inter,system-ui,-apple-system,Segoe UI Variable Text,Segoe UI,Microsoft YaHei UI,Microsoft YaHei,PingFang SC,sans-serif;font-size:14px;line-height:1.55}h1,h2,h3{letter-spacing:-.022em;text-wrap:balance}@media(max-width:640px){.hover-lift:hover{transform:none}}.num{font-variant-numeric:tabular-nums lining-nums;font-feature-settings:"tnum" 1,"lnum" 1}::selection{background:var(--brand)}@supports (color:color-mix(in lab,red,red)){::selection{background:color-mix(in srgb,var(--brand) 18%,transparent)}}*{scrollbar-width:thin;scrollbar-color:var(--text-3) transparent}@supports (color:color-mix(in lab,red,red)){*{scrollbar-color:color-mix(in srgb,var(--text-3) 30%,transparent) transparent}}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-thumb{background:var(--text-3)}@supports (color:color-mix(in lab,red,red)){::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--text-3) 25%,transparent)}}::-webkit-scrollbar-thumb{border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--text-3)}@supports (color:color-mix(in lab,red,red)){::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--text-3) 45%,transparent)}}::-webkit-scrollbar-track{background:0 0}:focus-visible{outline:2px solid var(--brand)}@supports (color:color-mix(in lab,red,red)){:focus-visible{outline:2px solid color-mix(in srgb,var(--brand) 50%,transparent)}}:focus-visible{outline-offset:2px;border-radius:inherit}.animate-in{animation:.22s cubic-bezier(.16,1,.3,1) fp-in}@keyframes fp-in{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:none}}.animate-fade{animation:.3s ease-out fp-fade}@keyframes fp-fade{0%{opacity:0}to{opacity:1}}input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.hover-lift{transition:transform .2s cubic-bezier(.16,1,.3,1),box-shadow .2s}.hover-lift:hover{transform:translateY(-1px);box-shadow:0 4px 16px #00000014,0 1px 4px #0000000a}.nav-active:before{content:"";background:var(--brand);border-radius:0 3px 3px 0;width:3px;position:absolute;top:6px;bottom:6px;left:0}@page{size:A4;margin:10mm}@media print{.no-print{display:none!important}html,body,#root{background:#fff!important;height:auto!important}body{padding:0!important}.app-scroll,.print-scroll{height:auto!important;max-height:none!important;overflow:visible!important}.print-sheet{box-shadow:none!important;border:none!important;border-radius:0!important;width:100%!important;max-width:none!important;margin:0!important;padding:0!important}*{scrollbar-width:none!important}::-webkit-scrollbar{width:0!important;height:0!important;display:none!important}}.resume-tpl-tech .r-sec-title{color:var(--accent);border-left:3px solid var(--accent);padding-left:8px}.resume-tpl-tech .r-item-title,.resume-tpl-tech .num{color:var(--accent)}.resume-tpl-minimal .r-sec-title{color:#666;letter-spacing:.12em;text-transform:uppercase;border-bottom:1px solid #e2e2e2;padding-bottom:4px;font-size:11px;font-weight:600}.resume-tpl-classic .r-sec-title{border-bottom:2px solid #222;padding-bottom:4px}.resume-tpl-minimal .r-item-title{font-weight:600}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/sync-server/www/assets/index-D9uCsgi6.css b/sync-server/www/assets/index-D9uCsgi6.css new file mode 100644 index 0000000..5eb0427 --- /dev/null +++ b/sync-server/www/assets/index-D9uCsgi6.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--leading-tight:1.25;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.right-2{right:calc(var(--spacing) * 2)}.right-5{right:calc(var(--spacing) * 5)}.bottom-0{bottom:0}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.left-0{left:0}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-\[7px\]{left:7px}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-3{margin-inline:calc(var(--spacing) * -3)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-auto{margin-block:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-auto{margin-right:auto}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-20{width:calc(var(--spacing) * 20);height:calc(var(--spacing) * 20)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-\[22px\]{height:22px}.h-\[34px\]{height:34px}.h-\[60px\]{height:60px}.h-\[72vh\]{height:72vh}.h-\[110px\]{height:110px}.h-\[200px\]{height:200px}.h-\[220px\]{height:220px}.h-full{height:100%}.max-h-\[68vh\]{max-height:68vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[72vh\]{max-height:72vh}.max-h-\[180px\]{max-height:180px}.max-h-\[430px\]{max-height:430px}.max-h-\[520px\]{max-height:520px}.max-h-\[calc\(100vh-260px\)\]{max-height:calc(100vh - 260px)}.min-h-0{min-height:0}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-\[72px\]{min-height:72px}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-\[3px\]{width:3px}.w-\[32\%\]{width:32%}.w-\[52px\]{width:52px}.w-\[56px\]{width:56px}.w-\[64px\]{width:64px}.w-\[72px\]{width:72px}.w-\[82px\]{width:82px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[190px\]{width:190px}.w-\[210px\]{width:210px}.w-\[236px\]{width:236px}.w-\[240px\]{width:240px}.w-full{width:100%}.w-px{width:1px}.max-w-\[220px\]{max-width:220px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[794px\]{max-width:794px}.max-w-\[880px\]{max-width:880px}.max-w-\[1080px\]{max-width:1080px}.max-w-\[1280px\]{max-width:1280px}.min-w-0{min-width:0}.min-w-\[52px\]{min-width:52px}.min-w-\[80px\]{min-width:80px}.min-w-\[120px\]{min-width:120px}.min-w-\[128px\]{min-width:128px}.min-w-\[160px\]{min-width:160px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize{resize:both}.resize-y{resize:vertical}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[76px_1fr\]{grid-template-columns:76px 1fr}.grid-cols-\[84px_1fr\]{grid-template-columns:84px 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-x-2\.5{column-gap:calc(var(--spacing) * 2.5)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.gap-y-3\.5{row-gap:calc(var(--spacing) * 3.5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-line>:not(:last-child)){border-color:var(--border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:12px}.rounded-md{border-radius:8px}.rounded-sm{border-radius:5px}.rounded-b-lg{border-bottom-right-radius:12px;border-bottom-left-radius:12px}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-brand,.border-brand\/30{border-color:var(--brand)}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--brand) 30%,transparent)}}.border-brand\/40{border-color:var(--brand)}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--brand) 40%,transparent)}}.border-danger\/30{border-color:var(--danger)}@supports (color:color-mix(in lab,red,red)){.border-danger\/30{border-color:color-mix(in oklab,var(--danger) 30%,transparent)}}.border-ink-1{border-color:var(--text-1)}.border-line{border-color:var(--border)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-transparent{border-color:#0000}.border-warning{border-color:var(--warning)}.\!bg-danger{background-color:var(--danger)!important}.bg-bg,.bg-bg\/90{background-color:var(--bg)}@supports (color:color-mix(in lab,red,red)){.bg-bg\/90{background-color:color-mix(in oklab,var(--bg) 90%,transparent)}}.bg-bg\/95{background-color:var(--bg)}@supports (color:color-mix(in lab,red,red)){.bg-bg\/95{background-color:color-mix(in oklab,var(--bg) 95%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/45{background-color:#00000073}@supports (color:color-mix(in lab,red,red)){.bg-black\/45{background-color:color-mix(in oklab,var(--color-black) 45%,transparent)}}.bg-brand{background-color:var(--brand)}.bg-brand-subtle,.bg-brand-subtle\/40{background-color:var(--brand-subtle)}@supports (color:color-mix(in lab,red,red)){.bg-brand-subtle\/40{background-color:color-mix(in oklab,var(--brand-subtle) 40%,transparent)}}.bg-danger{background-color:var(--danger)}.bg-danger-subtle{background-color:var(--danger-subtle)}.bg-line{background-color:var(--border)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-success-subtle{background-color:var(--success-subtle)}.bg-surface{background-color:var(--surface)}.bg-surface-2{background-color:var(--surface-2)}.bg-surface-3{background-color:var(--surface-3)}.bg-transparent{background-color:#0000}.bg-warning-subtle{background-color:var(--warning-subtle)}.bg-white{background-color:var(--color-white)}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-black\/60{--tw-gradient-from:#0009}@supports (color:color-mix(in lab,red,red)){.from-black\/60{--tw-gradient-from:color-mix(in oklab, var(--color-black) 60%, transparent)}}.from-black\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-px{padding-block:1px}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[26px\]{font-size:26px}.leading-\[18px\]{--tw-leading:18px;line-height:18px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-white{color:var(--color-white)!important}.text-\[var\(--accent\)\]{color:var(--accent)}.text-brand{color:var(--brand)}.text-brand-text{color:var(--brand-text)}.text-danger{color:var(--danger)}.text-ink-1{color:var(--text-1)}.text-ink-2{color:var(--text-2)}.text-ink-3,.text-ink-3\/60{color:var(--text-3)}@supports (color:color-mix(in lab,red,red)){.text-ink-3\/60{color:color-mix(in oklab,var(--text-3) 60%,transparent)}}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.shadow-card{--tw-shadow:0 1px 2px var(--tw-shadow-color,#00000008), 0 2px 8px var(--tw-shadow-color,#0000000a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-pop{--tw-shadow:0 4px 12px var(--tw-shadow-color,#00000014), 0 16px 48px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.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,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:scale-\[1\.04\]:is(:where(.group):hover *){scale:1.04}.group-hover\:text-brand-text:is(:where(.group):hover *){color:var(--brand-text)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-ink-3::placeholder{color:var(--text-3)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.focus-within\:border-brand:focus-within{border-color:var(--brand)}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-brand\/40:hover{border-color:var(--brand)}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/40:hover{border-color:color-mix(in oklab,var(--brand) 40%,transparent)}}.hover\:border-line:hover{border-color:var(--border)}.hover\:border-line-strong:hover{border-color:var(--border-strong)}.hover\:bg-brand-hover:hover{background-color:var(--brand-hover)}.hover\:bg-brand-subtle:hover{background-color:var(--brand-subtle)}.hover\:bg-danger-subtle:hover{background-color:var(--danger-subtle)}.hover\:bg-surface-2:hover{background-color:var(--surface-2)}.hover\:bg-surface-3:hover{background-color:var(--surface-3)}.hover\:text-brand-text:hover{color:var(--brand-text)}.hover\:text-danger:hover{color:var(--danger)}.hover\:text-ink-1:hover{color:var(--text-1)}.hover\:text-ink-2:hover{color:var(--text-2)}.hover\:text-success:hover{color:var(--success)}.hover\:text-warning:hover{color:var(--warning)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-brand:hover{--tw-shadow:0 2px 8px var(--tw-shadow-color,#3056d347);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-pop:hover{--tw-shadow:0 4px 12px var(--tw-shadow-color,#00000014), 0 16px 48px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:brightness-110:hover{--tw-brightness:brightness(110%);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,)}.hover\:brightness-\[0\.97\]:hover{--tw-brightness:brightness(.97);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,)}}.focus\:border-brand:focus{border-color:var(--brand)}.focus\:shadow-\[0_0_0_1\.5px_rgba\(48\,86\,211\,0\.5\)\]:focus{--tw-shadow:0 0 0 1.5px var(--tw-shadow-color,#3056d380);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:bg-surface-2:active{background-color:var(--surface-2)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}@media not all and (min-width:64rem){.max-lg\:fixed{position:fixed}.max-lg\:inset-y-0{inset-block:0}.max-lg\:left-0{left:0}.max-lg\:z-40{z-index:40}.max-lg\:-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.max-lg\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.max-lg\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}@media(min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:-mx-6{margin-inline:calc(var(--spacing) * -6)}.sm\:ml-auto{margin-left:auto}.sm\:contents{display:contents}.sm\:flex{display:flex}.sm\:inline{display:inline}.sm\:h-14{height:calc(var(--spacing) * 14)}.sm\:w-\[96px\]{width:96px}.sm\:w-\[100px\]{width:100px}.sm\:w-\[110px\]{width:110px}.sm\:w-\[120px\]{width:120px}.sm\:w-\[130px\]{width:130px}.sm\:w-\[220px\]{width:220px}.sm\:w-auto{width:auto}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr_120px_100px\]{grid-template-columns:1fr 120px 100px}.sm\:grid-cols-\[1fr_130px_120px_1fr_28px\]{grid-template-columns:1fr 130px 120px 1fr 28px}.sm\:grid-cols-\[200px_1fr\]{grid-template-columns:200px 1fr}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-10{padding:calc(var(--spacing) * 10)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-0{padding-block:0}.sm\:py-4{padding-block:calc(var(--spacing) * 4)}.sm\:py-5{padding-block:calc(var(--spacing) * 5)}}@media(min-width:48rem){.md\:block{display:block}.md\:hidden{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-4{top:calc(var(--spacing) * 4)}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:hidden{display:none}.lg\:max-h-\[calc\(100vh-2rem\)\]{max-height:calc(100vh - 2rem)}.lg\:w-\[280px\]{width:280px}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[1fr_340px\]{grid-template-columns:1fr 340px}.lg\:self-start{align-self:flex-start}.lg\:overflow-y-auto{overflow-y:auto}.lg\:pr-1{padding-right:var(--spacing)}}.\[\&_img\]\:max-w-full img{max-width:100%}.\[\&_table\]\:border-collapse table{border-collapse:collapse}.\[\&_td\]\:border td{border-style:var(--tw-border-style);border-width:1px}.\[\&_td\]\:border-line td{border-color:var(--border)}.\[\&_td\]\:px-2 td{padding-inline:calc(var(--spacing) * 2)}.\[\&_td\]\:py-1 td{padding-block:var(--spacing)}.\[\&_th\]\:border th{border-style:var(--tw-border-style);border-width:1px}.\[\&_th\]\:border-line th{border-color:var(--border)}.\[\&_th\]\:px-2 th{padding-inline:calc(var(--spacing) * 2)}.\[\&_th\]\:py-1 th{padding-block:var(--spacing)}}:root{--bg:#f3f4f6;--surface:#fff;--surface-2:#f8f9fa;--surface-3:#eceef1;--border:#e3e6ea;--border-strong:#c8cdd6;--text-1:#111318;--text-2:#3d434f;--text-3:#747c8a;--brand:#3346d3;--brand-hover:#2a3ab8;--brand-subtle:#eef1ff;--brand-text:#2a3ab8;--success:#177245;--success-subtle:#ebfaf1;--warning:#a86509;--warning-subtle:#fef8eb;--danger:#d5304f;--danger-subtle:#fef0f2;color-scheme:light}.dark{--bg:#0c0d10;--surface:#141519;--surface-2:#1a1c22;--surface-3:#23262e;--border:#262932;--border-strong:#363b47;--text-1:#e9ebf0;--text-2:#a0a8b8;--text-3:#68707e;--brand:#6d8bfa;--brand-hover:#8aa2fb;--brand-subtle:#1a2144;--brand-text:#96adfa;--success:#34d399;--success-subtle:#0d2921;--warning:#fbbf24;--warning-subtle:#2b2109;--danger:#f87171;--danger-subtle:#2d1317;color-scheme:dark}html,body,#root{height:100%}html,body{overflow-x:clip}body{-webkit-tap-highlight-color:transparent;touch-action:manipulation;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)}@media(pointer:coarse){button,[role=button],a{min-height:36px}input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]),select,textarea{font-size:16px!important}}body{background:var(--bg);color:var(--text-1);letter-spacing:.003em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;font-feature-settings:"cv02","cv03","cv04","cv11";font-family:Inter Variable,Inter,system-ui,-apple-system,Segoe UI Variable Text,Segoe UI,Microsoft YaHei UI,Microsoft YaHei,PingFang SC,sans-serif;font-size:14px;line-height:1.55}h1,h2,h3{letter-spacing:-.022em;text-wrap:balance}@media(max-width:640px){.hover-lift:hover{transform:none}}.num{font-variant-numeric:tabular-nums lining-nums;font-feature-settings:"tnum" 1,"lnum" 1}::selection{background:var(--brand)}@supports (color:color-mix(in lab,red,red)){::selection{background:color-mix(in srgb,var(--brand) 18%,transparent)}}*{scrollbar-width:thin;scrollbar-color:var(--text-3) transparent}@supports (color:color-mix(in lab,red,red)){*{scrollbar-color:color-mix(in srgb,var(--text-3) 30%,transparent) transparent}}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-thumb{background:var(--text-3)}@supports (color:color-mix(in lab,red,red)){::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--text-3) 25%,transparent)}}::-webkit-scrollbar-thumb{border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--text-3)}@supports (color:color-mix(in lab,red,red)){::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--text-3) 45%,transparent)}}::-webkit-scrollbar-track{background:0 0}:focus-visible{outline:2px solid var(--brand)}@supports (color:color-mix(in lab,red,red)){:focus-visible{outline:2px solid color-mix(in srgb,var(--brand) 50%,transparent)}}:focus-visible{outline-offset:2px;border-radius:inherit}.animate-in{animation:.22s cubic-bezier(.16,1,.3,1) fp-in}@keyframes fp-in{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:none}}.animate-fade{animation:.3s ease-out fp-fade}@keyframes fp-fade{0%{opacity:0}to{opacity:1}}input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.hover-lift{transition:transform .2s cubic-bezier(.16,1,.3,1),box-shadow .2s}.hover-lift:hover{transform:translateY(-1px);box-shadow:0 4px 16px #00000014,0 1px 4px #0000000a}.nav-active:before{content:"";background:var(--brand);border-radius:0 3px 3px 0;width:3px;position:absolute;top:6px;bottom:6px;left:0}@page{size:A4;margin:10mm}@media print{.no-print{display:none!important}html,body,#root{background:#fff!important;height:auto!important}body{padding:0!important}.app-scroll,.print-scroll{height:auto!important;max-height:none!important;overflow:visible!important}.print-sheet{box-shadow:none!important;border:none!important;border-radius:0!important;width:100%!important;max-width:none!important;margin:0!important;padding:0!important}*{scrollbar-width:none!important}::-webkit-scrollbar{width:0!important;height:0!important;display:none!important}}.resume-tpl-tech .r-sec-title{color:var(--accent);border-left:3px solid var(--accent);padding-left:8px}.resume-tpl-tech .r-item-title,.resume-tpl-tech .num{color:var(--accent)}.resume-tpl-minimal .r-sec-title{color:#666;letter-spacing:.12em;text-transform:uppercase;border-bottom:1px solid #e2e2e2;padding-bottom:4px;font-size:11px;font-weight:600}.resume-tpl-classic .r-sec-title{border-bottom:2px solid #222;padding-bottom:4px}.resume-tpl-minimal .r-item-title{font-weight:600}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/sync-server/www/assets/index-DYhSDydL.js b/sync-server/www/assets/index-DhGFbjWw.js similarity index 99% rename from sync-server/www/assets/index-DYhSDydL.js rename to sync-server/www/assets/index-DhGFbjWw.js index dfcf944..37e3093 100644 --- a/sync-server/www/assets/index-DYhSDydL.js +++ b/sync-server/www/assets/index-DhGFbjWw.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DashboardPage-DpgwpbHV.js","assets/card-jktDkcYF.js","assets/useChart-DgHaQNyb.js","assets/echarts-BIWefrIc.js","assets/GradesPage-CVTBUD3I.js","assets/TypesPage-BbQujrm2.js","assets/TaxonomyPage-B1I0kN2Q.js","assets/AdminPage-Dch0cjFb.js","assets/refresh-cw-CP7uPCIx.js","assets/ResumePage-Z8eiwwzo.js","assets/rotate-ccw-CE3bwRx2.js","assets/AssessmentPage-7AoxKy-P.js"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DashboardPage-B2FldowF.js","assets/card-65YyMNIi.js","assets/useChart-BbOzH_LJ.js","assets/echarts-BIWefrIc.js","assets/GradesPage-JJ6n0CJZ.js","assets/TypesPage-DPbRIcZM.js","assets/TaxonomyPage-DfBe5HxB.js","assets/AdminPage-C5wOCwKf.js","assets/refresh-cw-C3HYho-f.js","assets/ResumePage-CsGwAj0V.js","assets/rotate-ccw-DGANt55P.js","assets/AssessmentPage-Dvd34CqC.js"])))=>i.map(i=>d[i]); var Cv=n=>{throw TypeError(n)};var Kf=(n,r,s)=>r.has(n)||Cv("Cannot "+s);var T=(n,r,s)=>(Kf(n,r,"read from private field"),s?s.call(n):r.get(n)),he=(n,r,s)=>r.has(n)?Cv("Cannot add the same private member more than once"):r instanceof WeakSet?r.add(n):r.set(n,s),P=(n,r,s,o)=>(Kf(n,r,"write to private field"),o?o.call(n,s):r.set(n,s),s),Se=(n,r,s)=>(Kf(n,r,"access private method"),s);var Ys=(n,r,s,o)=>({set _(f){P(n,r,f,s)},get _(){return T(n,r,o)}});(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))o(f);new MutationObserver(f=>{for(const m of f)if(m.type==="childList")for(const d of m.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&o(d)}).observe(document,{childList:!0,subtree:!0});function s(f){const m={};return f.integrity&&(m.integrity=f.integrity),f.referrerPolicy&&(m.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?m.credentials="include":f.crossOrigin==="anonymous"?m.credentials="omit":m.credentials="same-origin",m}function o(f){if(f.ep)return;f.ep=!0;const m=s(f);fetch(f.href,m)}})();var V5=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Ag(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Zf={exports:{}},Iu={};/** * @license React * react-jsx-runtime.production.js @@ -334,4 +334,4 @@ Please change the parent to Te("app_info"),T4=()=>Te("sync_status"),ro=()=>Te("type_list"),N4=n=>Te("type_upsert",n),C4=n=>Te("type_delete",{id:n}),E0=n=>Te("taxonomy_list",{kind:n}),w4=n=>Te("taxonomy_upsert",n),j4=n=>Te("taxonomy_delete",{id:n}),Wd=()=>Te("dimension_list"),z4=n=>Te("dimension_upsert",n),O4=n=>Te("dimension_delete",{id:n}),_0=(n={})=>Te("footprint_list",{query:n}),Id=n=>Te("footprint_get",{id:n}),T0=n=>Te("footprint_upsert",{item:n}),R4=n=>Te("footprint_delete",{id:n}),N0=(n={})=>Te("timeline",{query:n}),A4=n=>Te("stats_overview",{year:n}),M4=()=>Te("metric_list"),D4=n=>Te("metric_upsert",n),U4=n=>Te("metric_delete",{key:n}),k4=()=>Te("grades_overview"),H4=n=>Te("semester_upsert",n),q4=n=>Te("semester_delete",{id:n}),L4=n=>Te("course_upsert",n),B4=n=>Te("course_delete",{id:n}),Q4=n=>Te("band_upsert",n),G4=n=>Te("band_delete",{id:n}),C0=n=>Te("attachment_list",{owner_id:n}),w0=n=>Te("attachment_delete",{id:n}),eo=n=>Te("attachment_read",{id:n});async function Td(n,r,s){const o=new URLSearchParams({owner:String(n),name:r.name,mime:r.type||"application/octet-stream"}),f=await fetch(Ol()+"/sync/attachment/raw?"+o,{method:"PUT",headers:{authorization:"Bearer "+pl(),"content-type":r.type||"application/octet-stream"},body:r}),m=await f.json().catch(()=>({ok:!1,error:"HTTP "+f.status}));if(!m.ok)throw new Error(m.error||"上传失败");const d=m.data.item;if(s)try{await Te("attachment_set_thumb",{id:d.id,thumb_b64:s})}catch{}return d}async function j0(n){var f;const r=await fetch(Ol()+"/api/attachment_download",{method:"POST",headers:{"content-type":"application/json",authorization:"Bearer "+pl()},body:JSON.stringify({id:n})});if(!r.ok){const m=await r.json().catch(()=>null);throw new Error((m==null?void 0:m.error)||"下载失败")}const s=decodeURIComponent(r.headers.get("x-file-name")||((f=(r.headers.get("content-disposition")||"").match(/UTF-8''([^;]+)/))==null?void 0:f[1])||"file"),o=r.headers.get("content-type")||void 0;return{blob:await r.blob(),file_name:s,mime:o}}const z0=n=>Te("attachment_thumb",{id:n}),Y4=()=>Te("view_list"),V4=n=>Te("view_upsert",n),X4=n=>Te("view_delete",{id:n});async function nu(n,r,s){const o=await fetch((s||Ol())+n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+pl()},body:JSON.stringify(r??{})}),f=await o.json().catch(()=>({ok:!1,error:"HTTP "+o.status}));if(!f.ok)throw new Error(f.error||"请求失败");return f.data}async function O0(n,r){const s=await fetch((r||Ol())+n,{headers:{Authorization:"Bearer "+pl()}}),o=await s.json().catch(()=>({ok:!1,error:"HTTP "+s.status}));if(!o.ok)throw new Error(o.error||"请求失败");return o.data}const K4=n=>O0("/admin/invites",n),Z4=n=>O0("/admin/users",n),J4=(n,r)=>nu("/admin/invites/generate",{count:n},r),F4=(n,r,s)=>nu("/admin/invites/create",{code:n,remark:r},s),$4=(n,r,s)=>nu("/admin/invites/update",{id:n,...r},s),P4=n=>nu("/admin/demo-rebuild",{},n),W4=(n,r)=>nu("/admin/users/delete",{user_id:n},r),I4=(n,r)=>nu("/admin/invites/delete",{id:n},r),e_=()=>Te("gpa_settings_get",{}),t_=n=>Te("gpa_settings_upsert",{weights:n}),l_=()=>Te("profile_get",{}),a_=n=>Te("profile_upsert",{content:n});async function n_(n){const r=await new Promise((f,m)=>{const d=new FileReader;d.onload=()=>f(String(d.result||"").split(",")[1]||""),d.onerror=()=>m(new Error("读取文件失败")),d.readAsDataURL(n)}),o=await(await fetch(Ol()+"/api/profile_photo",{method:"POST",headers:{"content-type":"application/json",authorization:"Bearer "+pl()},body:JSON.stringify({data_b64:r,file_name:n.name,mime:n.type||"image/png"})})).json().catch(()=>null);if(!(o!=null&&o.ok))throw new Error((o==null?void 0:o.error)||"证件照上传失败");return o.data.url}const i_=Object.freeze(Object.defineProperty({__proto__:null,AuthError:_d,adminCreateInvite:F4,adminDeleteInvite:I4,adminDeleteUser:W4,adminDemoRebuild:P4,adminGenerateInvites:J4,adminListInvites:K4,adminListUsers:Z4,adminUpdateInvite:$4,appInfo:_4,attachmentDelete:w0,attachmentDownload:j0,attachmentList:C0,attachmentRead:eo,attachmentThumb:z0,attachmentUploadRaw:Td,bandDelete:G4,bandUpsert:Q4,clearToken:Fd,courseDelete:B4,courseUpsert:L4,deleteDimension:O4,deleteTaxonomy:j4,deleteType:C4,footprintDelete:R4,footprintGet:Id,footprintList:_0,footprintUpsert:T0,getServerUrl:Ol,getToken:pl,gpaSettingsGet:e_,gpaSettingsUpsert:t_,gradesOverview:k4,listDimensions:Wd,listTaxonomy:E0,listTypes:ro,metricDelete:U4,metricList:M4,metricUpsert:D4,profileGet:l_,profilePhotoUpload:n_,profileUpsert:a_,semesterDelete:q4,semesterUpsert:H4,serverLogin:$d,serverMe:b0,serverRegister:Pd,setServerUrl:S0,setToken:Jd,statsOverview:A4,syncStatus:T4,timeline:N0,upsertDimension:z4,upsertTaxonomy:w4,upsertType:N4,viewDelete:X4,viewList:Y4,viewUpsert:V4},Symbol.toStringTag,{value:"Module"}));function R0(n){var r,s,o="";if(typeof n=="string"||typeof n=="number")o+=n;else if(typeof n=="object")if(Array.isArray(n)){var f=n.length;for(r=0;rtypeof n=="boolean"?`${n}`:n===0?"0":n,ag=A0,u_=(n,r)=>s=>{var o;if((r==null?void 0:r.variants)==null)return ag(n,s==null?void 0:s.class,s==null?void 0:s.className);const{variants:f,defaultVariants:m}=r,d=Object.keys(f).map(v=>{const x=s==null?void 0:s[v],g=m==null?void 0:m[v];if(x===null)return null;const _=lg(x)||lg(g);return f[v][_]}),p=s&&Object.entries(s).reduce((v,x)=>{let[g,_]=x;return _===void 0||(v[g]=_),v},{}),b=r==null||(o=r.compoundVariants)===null||o===void 0?void 0:o.reduce((v,x)=>{let{class:g,className:_,...k}=x;return Object.entries(k).every(K=>{let[q,D]=K;return Array.isArray(D)?D.includes({...m,...p}[q]):{...m,...p}[q]===D})?[...v,g,_]:v},[]);return ag(n,d,b,s==null?void 0:s.class,s==null?void 0:s.className)},r_=(n,r)=>{const s=new Array(n.length+r.length);for(let o=0;o({classGroupId:n,validator:r}),M0=(n=new Map,r=null,s)=>({nextPart:n,validators:r,classGroupId:s}),to="-",ng=[],o_="arbitrary..",c_=n=>{const r=d_(n),{conflictingClassGroups:s,conflictingClassGroupModifiers:o}=n;return{getClassGroupId:d=>{if(d.startsWith("[")&&d.endsWith("]"))return f_(d);const p=d.split(to),b=p[0]===""&&p.length>1?1:0;return D0(p,b,r)},getConflictingClassGroupIds:(d,p)=>{if(p){const b=o[d],v=s[d];return b?v?r_(v,b):b:v||ng}return s[d]||ng}}},D0=(n,r,s)=>{if(n.length-r===0)return s.classGroupId;const f=n[r],m=s.nextPart.get(f);if(m){const v=D0(n,r+1,m);if(v)return v}const d=s.validators;if(d===null)return;const p=r===0?n.join(to):n.slice(r).join(to),b=d.length;for(let v=0;vn.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const r=n.slice(1,-1),s=r.indexOf(":"),o=r.slice(0,s);return o?o_+o:void 0})(),d_=n=>{const{theme:r,classGroups:s}=n;return h_(s,r)},h_=(n,r)=>{const s=M0();for(const o in n){const f=n[o];eh(f,s,o,r)}return s},eh=(n,r,s,o)=>{const f=n.length;for(let m=0;m{if(typeof n=="string"){y_(n,r,s);return}if(typeof n=="function"){p_(n,r,s,o);return}v_(n,r,s,o)},y_=(n,r,s)=>{const o=n===""?r:U0(r,n);o.classGroupId=s},p_=(n,r,s,o)=>{if(g_(n)){eh(n(o),r,s,o);return}r.validators===null&&(r.validators=[]),r.validators.push(s_(s,n))},v_=(n,r,s,o)=>{const f=Object.entries(n),m=f.length;for(let d=0;d{let s=n;const o=r.split(to),f=o.length;for(let m=0;m"isThemeGetter"in n&&n.isThemeGetter===!0,b_=n=>{if(n<1)return{get:()=>{},set:()=>{}};let r=0,s=Object.create(null),o=Object.create(null);const f=(m,d)=>{s[m]=d,r++,r>n&&(r=0,o=s,s=Object.create(null))};return{get(m){let d=s[m];if(d!==void 0)return d;if((d=o[m])!==void 0)return f(m,d),d},set(m,d){m in s?s[m]=d:f(m,d)}}},Nd="!",ig=":",x_=[],ug=(n,r,s,o,f)=>({modifiers:n,hasImportantModifier:r,baseClassName:s,maybePostfixModifierPosition:o,isExternal:f}),S_=n=>{const{prefix:r,experimentalParseClassName:s}=n;let o=f=>{const m=[];let d=0,p=0,b=0,v;const x=f.length;for(let q=0;qb?v-b:void 0;return ug(m,k,_,K)};if(r){const f=r+ig,m=o;o=d=>d.startsWith(f)?m(d.slice(f.length)):ug(x_,!1,d,void 0,!0)}if(s){const f=o;o=m=>s({className:m,parseClassName:f})}return o},E_=n=>{const r=new Map;return n.orderSensitiveModifiers.forEach((s,o)=>{r.set(s,1e6+o)}),s=>{const o=[];let f=[];for(let m=0;m0&&(f.sort(),o.push(...f),f=[]),o.push(d)):f.push(d)}return f.length>0&&(f.sort(),o.push(...f)),o}},__=n=>({cache:b_(n.cacheSize),parseClassName:S_(n),sortModifiers:E_(n),postfixLookupClassGroupIds:T_(n),...c_(n)}),T_=n=>{const r=Object.create(null),s=n.postfixLookupClassGroups;if(s)for(let o=0;o{const{parseClassName:s,getClassGroupId:o,getConflictingClassGroupIds:f,sortModifiers:m,postfixLookupClassGroupIds:d}=r,p=[],b=n.trim().split(N_);let v="";for(let x=b.length-1;x>=0;x-=1){const g=b[x],{isExternal:_,modifiers:k,hasImportantModifier:K,baseClassName:q,maybePostfixModifierPosition:D}=s(g);if(_){v=g+(v.length>0?" "+v:v);continue}let H=!!D,Q;if(H){const F=q.substring(0,D);Q=o(F);const U=Q&&d[Q]?o(q):void 0;U&&U!==Q&&(Q=U,H=!1)}else Q=o(q);if(!Q){if(!H){v=g+(v.length>0?" "+v:v);continue}if(Q=o(q),!Q){v=g+(v.length>0?" "+v:v);continue}H=!1}const Z=k.length===0?"":k.length===1?k[0]:m(k).join(":"),J=K?Z+Nd:Z,Y=J+Q;if(p.indexOf(Y)>-1)continue;p.push(Y);const de=f(Q,H);for(let F=0;F0?" "+v:v)}return v},w_=(...n)=>{let r=0,s,o,f="";for(;r{if(typeof n=="string")return n;let r,s="";for(let o=0;o{let s,o,f,m;const d=b=>{const v=r.reduce((x,g)=>g(x),n());return s=__(v),o=s.cache.get,f=s.cache.set,m=p,p(b)},p=b=>{const v=o(b);if(v)return v;const x=C_(b,s);return f(b,x),x};return m=d,(...b)=>m(w_(...b))},z_=[],ct=n=>{const r=s=>s[n]||z_;return r.isThemeGetter=!0,r.themeKey=n,r},H0=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,q0=/^\((?:(\w[\w-]*):)?(.+)\)$/i,O_=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,R_=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,A_=/\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$/,M_=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix|color|light-dark)\(.+\)$/,D_=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,U_=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Ja=n=>O_.test(n),_e=n=>!!n&&!Number.isNaN(Number(n)),Xl=n=>!!n&&Number.isInteger(Number(n)),ad=n=>n.endsWith("%")&&_e(n.slice(0,-1)),fa=n=>R_.test(n),L0=()=>!0,k_=n=>A_.test(n)&&!M_.test(n),th=()=>!1,H_=n=>D_.test(n),q_=n=>U_.test(n),L_=n=>!ne(n)&&!ue(n),B_=n=>n.startsWith("@container")&&(n[10]==="/"&&n[11]!==void 0||n[11]==="s"&&n[16]!==void 0&&n.startsWith("-size/",10)||n[11]==="n"&&n[18]!==void 0&&n.startsWith("-normal/",10)),Q_=n=>nn(n,G0,th),ne=n=>H0.test(n),zn=n=>nn(n,Y0,k_),rg=n=>nn(n,F_,_e),G_=n=>nn(n,X0,L0),Y_=n=>nn(n,V0,th),sg=n=>nn(n,B0,th),V_=n=>nn(n,Q0,q_),Ks=n=>nn(n,K0,H_),ue=n=>q0.test(n),lr=n=>Vn(n,Y0),X_=n=>Vn(n,V0),og=n=>Vn(n,B0),K_=n=>Vn(n,G0),Z_=n=>Vn(n,Q0),Zs=n=>Vn(n,K0,!0),J_=n=>Vn(n,X0,!0),nn=(n,r,s)=>{const o=H0.exec(n);return o?o[1]?r(o[1]):s(o[2]):!1},Vn=(n,r,s=!1)=>{const o=q0.exec(n);return o?o[1]?r(o[1]):s:!1},B0=n=>n==="position"||n==="percentage",Q0=n=>n==="image"||n==="url",G0=n=>n==="length"||n==="size"||n==="bg-size",Y0=n=>n==="length",F_=n=>n==="number",V0=n=>n==="family-name",X0=n=>n==="number"||n==="weight",K0=n=>n==="shadow",$_=()=>{const n=ct("color"),r=ct("font"),s=ct("text"),o=ct("font-weight"),f=ct("tracking"),m=ct("leading"),d=ct("breakpoint"),p=ct("container"),b=ct("spacing"),v=ct("radius"),x=ct("shadow"),g=ct("inset-shadow"),_=ct("text-shadow"),k=ct("drop-shadow"),K=ct("blur"),q=ct("perspective"),D=ct("aspect"),H=ct("ease"),Q=ct("animate"),Z=()=>["auto","avoid","all","avoid-page","page","left","right","column"],J=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],Y=()=>[...J(),ue,ne],de=()=>["auto","hidden","clip","visible","scroll"],F=()=>["auto","contain","none"],U=()=>[ue,ne,b],I=()=>[Ja,"full","auto",...U()],le=()=>[Xl,"none","subgrid",ue,ne],Ve=()=>["auto",{span:["full",Xl,ue,ne]},Xl,ue,ne],Fe=()=>[Xl,"auto",ue,ne],ie=()=>["auto","min","max","fr",ue,ne],Ne=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],re=()=>["start","end","center","stretch","center-safe","end-safe"],V=()=>["auto",...U()],ee=()=>[Ja,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...U()],R=()=>[p,Ja,"screen","full","dvw","lvw","svw","min","max","fit",...U()],ae=()=>[Ja,"screen","full","lh","dvh","lvh","svh","min","max","fit",...U()],X=()=>[n,ue,ne],ke=()=>[...J(),og,sg,{position:[ue,ne]}],Nt=()=>["no-repeat",{repeat:["","x","y","space","round"]}],Rl=()=>["auto","cover","contain",K_,Q_,{size:[ue,ne]}],C=()=>[ad,lr,zn],G=()=>["","none","full",v,ue,ne],W=()=>["",_e,lr,zn],ce=()=>["solid","dashed","dotted","double"],je=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],me=()=>[_e,ad,og,sg],Ae=()=>["","none",K,ue,ne],se=()=>["none",_e,ue,ne],ye=()=>["none",_e,ue,ne],Vt=()=>[_e,ue,ne],ga=()=>[Ja,"full",...U()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[fa],breakpoint:[fa],color:[L0],container:[fa],"drop-shadow":[fa],ease:["in","out","in-out"],font:[L_],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[fa],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[fa],shadow:[fa],spacing:["px",_e],text:[fa],"text-shadow":[fa],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",Ja,ne,ue,D]}],container:["container"],"container-type":[{"@container":["","normal","size",ue,ne]}],"container-named":[B_],columns:[{columns:[_e,"auto",ne,ue,p]}],"break-after":[{"break-after":Z()}],"break-before":[{"break-before":Z()}],"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:Y()}],overflow:[{overflow:de()}],"overflow-x":[{"overflow-x":de()}],"overflow-y":[{"overflow-y":de()}],overscroll:[{overscroll:F()}],"overscroll-x":[{"overscroll-x":F()}],"overscroll-y":[{"overscroll-y":F()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:I()}],"inset-x":[{"inset-x":I()}],"inset-y":[{"inset-y":I()}],start:[{"inset-s":I(),start:I()}],end:[{"inset-e":I(),end:I()}],"inset-bs":[{"inset-bs":I()}],"inset-be":[{"inset-be":I()}],top:[{top:I()}],right:[{right:I()}],bottom:[{bottom:I()}],left:[{left:I()}],visibility:["visible","invisible","collapse"],z:[{z:[Xl,"auto",ue,ne]}],basis:[{basis:[Ja,"full","auto",p,...U()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[_e,Ja,"auto","initial","none",ne]}],grow:[{grow:["",_e,ue,ne]}],shrink:[{shrink:["",_e,ue,ne]}],order:[{order:[Xl,"first","last","none",ue,ne]}],"grid-cols":[{"grid-cols":le()}],"col-start-end":[{col:Ve()}],"col-start":[{"col-start":Fe()}],"col-end":[{"col-end":Fe()}],"grid-rows":[{"grid-rows":le()}],"row-start-end":[{row:Ve()}],"row-start":[{"row-start":Fe()}],"row-end":[{"row-end":Fe()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":ie()}],"auto-rows":[{"auto-rows":ie()}],gap:[{gap:U()}],"gap-x":[{"gap-x":U()}],"gap-y":[{"gap-y":U()}],"justify-content":[{justify:[...Ne(),"normal"]}],"justify-items":[{"justify-items":[...re(),"normal"]}],"justify-self":[{"justify-self":["auto",...re()]}],"align-content":[{content:["normal",...Ne()]}],"align-items":[{items:[...re(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...re(),{baseline:["","last"]}]}],"place-content":[{"place-content":Ne()}],"place-items":[{"place-items":[...re(),"baseline"]}],"place-self":[{"place-self":["auto",...re()]}],p:[{p:U()}],px:[{px:U()}],py:[{py:U()}],ps:[{ps:U()}],pe:[{pe:U()}],pbs:[{pbs:U()}],pbe:[{pbe:U()}],pt:[{pt:U()}],pr:[{pr:U()}],pb:[{pb:U()}],pl:[{pl:U()}],m:[{m:V()}],mx:[{mx:V()}],my:[{my:V()}],ms:[{ms:V()}],me:[{me:V()}],mbs:[{mbs:V()}],mbe:[{mbe:V()}],mt:[{mt:V()}],mr:[{mr:V()}],mb:[{mb:V()}],ml:[{ml:V()}],"space-x":[{"space-x":U()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":U()}],"space-y-reverse":["space-y-reverse"],size:[{size:ee()}],"inline-size":[{inline:["auto",...R()]}],"min-inline-size":[{"min-inline":["auto",...R()]}],"max-inline-size":[{"max-inline":["none",...R()]}],"block-size":[{block:["auto",...ae()]}],"min-block-size":[{"min-block":["auto",...ae()]}],"max-block-size":[{"max-block":["none",...ae()]}],w:[{w:[p,"screen",...ee()]}],"min-w":[{"min-w":[p,"screen","none",...ee()]}],"max-w":[{"max-w":[p,"screen","none","prose",{screen:[d]},...ee()]}],h:[{h:["screen","lh",...ee()]}],"min-h":[{"min-h":["screen","lh","none",...ee()]}],"max-h":[{"max-h":["screen","lh","none",...ee()]}],"font-size":[{text:["base",s,lr,zn]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[o,J_,G_]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",ad,ne]}],"font-family":[{font:[X_,Y_,r]}],"font-features":[{"font-features":[ne]}],"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:[f,ue,ne]}],"line-clamp":[{"line-clamp":[_e,"none",ue,rg]}],leading:[{leading:["none",m,...U()]}],"list-image":[{"list-image":["none",ue,ne]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",ue,ne]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:X()}],"text-color":[{text:X()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ce(),"wavy"]}],"text-decoration-thickness":[{decoration:[_e,"from-font","auto",ue,zn]}],"text-decoration-color":[{decoration:X()}],"underline-offset":[{"underline-offset":[_e,"auto",ue,ne]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:U()}],"tab-size":[{tab:[Xl,ue,ne]}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",ue,ne]}],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",ue,ne]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:ke()}],"bg-repeat":[{bg:Nt()}],"bg-size":[{bg:Rl()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},Xl,ue,ne],radial:["",ue,ne],conic:["",Xl,ue,ne]},Z_,V_]}],"bg-color":[{bg:X()}],"gradient-from-pos":[{from:C()}],"gradient-via-pos":[{via:C()}],"gradient-to-pos":[{to:C()}],"gradient-from":[{from:X()}],"gradient-via":[{via:X()}],"gradient-to":[{to:X()}],rounded:[{rounded:G()}],"rounded-s":[{"rounded-s":G()}],"rounded-e":[{"rounded-e":G()}],"rounded-t":[{"rounded-t":G()}],"rounded-r":[{"rounded-r":G()}],"rounded-b":[{"rounded-b":G()}],"rounded-l":[{"rounded-l":G()}],"rounded-ss":[{"rounded-ss":G()}],"rounded-se":[{"rounded-se":G()}],"rounded-ee":[{"rounded-ee":G()}],"rounded-es":[{"rounded-es":G()}],"rounded-tl":[{"rounded-tl":G()}],"rounded-tr":[{"rounded-tr":G()}],"rounded-br":[{"rounded-br":G()}],"rounded-bl":[{"rounded-bl":G()}],"border-w":[{border:W()}],"border-w-x":[{"border-x":W()}],"border-w-y":[{"border-y":W()}],"border-w-s":[{"border-s":W()}],"border-w-e":[{"border-e":W()}],"border-w-bs":[{"border-bs":W()}],"border-w-be":[{"border-be":W()}],"border-w-t":[{"border-t":W()}],"border-w-r":[{"border-r":W()}],"border-w-b":[{"border-b":W()}],"border-w-l":[{"border-l":W()}],"divide-x":[{"divide-x":W()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":W()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...ce(),"hidden","none"]}],"divide-style":[{divide:[...ce(),"hidden","none"]}],"border-color":[{border:X()}],"border-color-x":[{"border-x":X()}],"border-color-y":[{"border-y":X()}],"border-color-s":[{"border-s":X()}],"border-color-e":[{"border-e":X()}],"border-color-bs":[{"border-bs":X()}],"border-color-be":[{"border-be":X()}],"border-color-t":[{"border-t":X()}],"border-color-r":[{"border-r":X()}],"border-color-b":[{"border-b":X()}],"border-color-l":[{"border-l":X()}],"divide-color":[{divide:X()}],"outline-style":[{outline:[...ce(),"none","hidden"]}],"outline-offset":[{"outline-offset":[_e,ue,ne]}],"outline-w":[{outline:["",_e,lr,zn]}],"outline-color":[{outline:X()}],shadow:[{shadow:["","inner","none",x,Zs,Ks]}],"shadow-color":[{shadow:X()}],"inset-shadow":[{"inset-shadow":["none",g,Zs,Ks]}],"inset-shadow-color":[{"inset-shadow":X()}],"ring-w":[{ring:W()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:X()}],"ring-offset-w":[{"ring-offset":[_e,zn]}],"ring-offset-color":[{"ring-offset":X()}],"inset-ring-w":[{"inset-ring":W()}],"inset-ring-color":[{"inset-ring":X()}],"text-shadow":[{"text-shadow":["none",_,Zs,Ks]}],"text-shadow-color":[{"text-shadow":X()}],opacity:[{opacity:[_e,ue,ne]}],"mix-blend":[{"mix-blend":[...je(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":je()}],"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":[_e]}],"mask-image-linear-from-pos":[{"mask-linear-from":me()}],"mask-image-linear-to-pos":[{"mask-linear-to":me()}],"mask-image-linear-from-color":[{"mask-linear-from":X()}],"mask-image-linear-to-color":[{"mask-linear-to":X()}],"mask-image-t-from-pos":[{"mask-t-from":me()}],"mask-image-t-to-pos":[{"mask-t-to":me()}],"mask-image-t-from-color":[{"mask-t-from":X()}],"mask-image-t-to-color":[{"mask-t-to":X()}],"mask-image-r-from-pos":[{"mask-r-from":me()}],"mask-image-r-to-pos":[{"mask-r-to":me()}],"mask-image-r-from-color":[{"mask-r-from":X()}],"mask-image-r-to-color":[{"mask-r-to":X()}],"mask-image-b-from-pos":[{"mask-b-from":me()}],"mask-image-b-to-pos":[{"mask-b-to":me()}],"mask-image-b-from-color":[{"mask-b-from":X()}],"mask-image-b-to-color":[{"mask-b-to":X()}],"mask-image-l-from-pos":[{"mask-l-from":me()}],"mask-image-l-to-pos":[{"mask-l-to":me()}],"mask-image-l-from-color":[{"mask-l-from":X()}],"mask-image-l-to-color":[{"mask-l-to":X()}],"mask-image-x-from-pos":[{"mask-x-from":me()}],"mask-image-x-to-pos":[{"mask-x-to":me()}],"mask-image-x-from-color":[{"mask-x-from":X()}],"mask-image-x-to-color":[{"mask-x-to":X()}],"mask-image-y-from-pos":[{"mask-y-from":me()}],"mask-image-y-to-pos":[{"mask-y-to":me()}],"mask-image-y-from-color":[{"mask-y-from":X()}],"mask-image-y-to-color":[{"mask-y-to":X()}],"mask-image-radial":[{"mask-radial":[ue,ne]}],"mask-image-radial-from-pos":[{"mask-radial-from":me()}],"mask-image-radial-to-pos":[{"mask-radial-to":me()}],"mask-image-radial-from-color":[{"mask-radial-from":X()}],"mask-image-radial-to-color":[{"mask-radial-to":X()}],"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":J()}],"mask-image-conic-pos":[{"mask-conic":[_e]}],"mask-image-conic-from-pos":[{"mask-conic-from":me()}],"mask-image-conic-to-pos":[{"mask-conic-to":me()}],"mask-image-conic-from-color":[{"mask-conic-from":X()}],"mask-image-conic-to-color":[{"mask-conic-to":X()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:ke()}],"mask-repeat":[{mask:Nt()}],"mask-size":[{mask:Rl()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",ue,ne]}],filter:[{filter:["","none",ue,ne]}],blur:[{blur:Ae()}],brightness:[{brightness:[_e,ue,ne]}],contrast:[{contrast:[_e,ue,ne]}],"drop-shadow":[{"drop-shadow":["","none",k,Zs,Ks]}],"drop-shadow-color":[{"drop-shadow":X()}],grayscale:[{grayscale:["",_e,ue,ne]}],"hue-rotate":[{"hue-rotate":[_e,ue,ne]}],invert:[{invert:["",_e,ue,ne]}],saturate:[{saturate:[_e,ue,ne]}],sepia:[{sepia:["",_e,ue,ne]}],"backdrop-filter":[{"backdrop-filter":["","none",ue,ne]}],"backdrop-blur":[{"backdrop-blur":Ae()}],"backdrop-brightness":[{"backdrop-brightness":[_e,ue,ne]}],"backdrop-contrast":[{"backdrop-contrast":[_e,ue,ne]}],"backdrop-grayscale":[{"backdrop-grayscale":["",_e,ue,ne]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[_e,ue,ne]}],"backdrop-invert":[{"backdrop-invert":["",_e,ue,ne]}],"backdrop-opacity":[{"backdrop-opacity":[_e,ue,ne]}],"backdrop-saturate":[{"backdrop-saturate":[_e,ue,ne]}],"backdrop-sepia":[{"backdrop-sepia":["",_e,ue,ne]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":U()}],"border-spacing-x":[{"border-spacing-x":U()}],"border-spacing-y":[{"border-spacing-y":U()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",ue,ne]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[_e,"initial",ue,ne]}],ease:[{ease:["linear","initial",H,ue,ne]}],delay:[{delay:[_e,ue,ne]}],animate:[{animate:["none",Q,ue,ne]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[q,ue,ne]}],"perspective-origin":[{"perspective-origin":Y()}],rotate:[{rotate:se()}],"rotate-x":[{"rotate-x":se()}],"rotate-y":[{"rotate-y":se()}],"rotate-z":[{"rotate-z":se()}],scale:[{scale:ye()}],"scale-x":[{"scale-x":ye()}],"scale-y":[{"scale-y":ye()}],"scale-z":[{"scale-z":ye()}],"scale-3d":["scale-3d"],skew:[{skew:Vt()}],"skew-x":[{"skew-x":Vt()}],"skew-y":[{"skew-y":Vt()}],transform:[{transform:[ue,ne,"","none","gpu","cpu"]}],"transform-origin":[{origin:Y()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:ga()}],"translate-x":[{"translate-x":ga()}],"translate-y":[{"translate-y":ga()}],"translate-z":[{"translate-z":ga()}],"translate-none":["translate-none"],zoom:[{zoom:[Xl,ue,ne]}],accent:[{accent:X()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:X()}],"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",ue,ne]}],"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":X()}],"scrollbar-track-color":[{"scrollbar-track":X()}],"scrollbar-gutter":[{"scrollbar-gutter":["auto","stable","both"]}],"scrollbar-w":[{scrollbar:["auto","thin","none"]}],"scroll-m":[{"scroll-m":U()}],"scroll-mx":[{"scroll-mx":U()}],"scroll-my":[{"scroll-my":U()}],"scroll-ms":[{"scroll-ms":U()}],"scroll-me":[{"scroll-me":U()}],"scroll-mbs":[{"scroll-mbs":U()}],"scroll-mbe":[{"scroll-mbe":U()}],"scroll-mt":[{"scroll-mt":U()}],"scroll-mr":[{"scroll-mr":U()}],"scroll-mb":[{"scroll-mb":U()}],"scroll-ml":[{"scroll-ml":U()}],"scroll-p":[{"scroll-p":U()}],"scroll-px":[{"scroll-px":U()}],"scroll-py":[{"scroll-py":U()}],"scroll-ps":[{"scroll-ps":U()}],"scroll-pe":[{"scroll-pe":U()}],"scroll-pbs":[{"scroll-pbs":U()}],"scroll-pbe":[{"scroll-pbe":U()}],"scroll-pt":[{"scroll-pt":U()}],"scroll-pr":[{"scroll-pr":U()}],"scroll-pb":[{"scroll-pb":U()}],"scroll-pl":[{"scroll-pl":U()}],"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",ue,ne]}],fill:[{fill:["none",...X()]}],"stroke-w":[{stroke:[_e,lr,zn,rg]}],stroke:[{stroke:["none",...X()]}],"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":["start","end","right","left"],"inset-y":["inset-bs","inset-be","top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pbs","pbe","pt","pr","pb","pl"],px:["ps","pe","pr","pl"],py:["pbs","pbe","pt","pb"],m:["mx","my","ms","me","mbs","mbe","mt","mr","mb","ml"],mx:["ms","me","mr","ml"],my:["mbs","mbe","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-s","border-w-e","border-w-r","border-w-l"],"border-w-y":["border-w-bs","border-w-be","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-s","border-color-e","border-color-r","border-color-l"],"border-color-y":["border-color-bs","border-color-be","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-ms","scroll-me","scroll-mr","scroll-ml"],"scroll-my":["scroll-mbs","scroll-mbe","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-ps","scroll-pe","scroll-pr","scroll-pl"],"scroll-py":["scroll-pbs","scroll-pbe","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"]}},P_=j_($_);function gl(...n){return P_(A0(n))}const W_=u_("inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-md font-medium transition-colors select-none disabled:pointer-events-none disabled:opacity-45",{variants:{variant:{primary:"bg-brand text-white hover:bg-brand-hover shadow-card",secondary:"bg-surface text-ink-1 border border-line hover:bg-surface-3 hover:border-line-strong",ghost:"text-ink-2 hover:bg-surface-3 hover:text-ink-1",subtle:"bg-brand-subtle text-brand-text hover:brightness-[0.97]",danger:"bg-danger text-white hover:brightness-110","danger-ghost":"text-danger hover:bg-danger-subtle"},size:{sm:"h-7 px-2.5 text-[12px]",md:"h-8 px-3 text-[13px]",lg:"h-9 px-4 text-sm",icon:"h-8 w-8 p-0","icon-sm":"h-7 w-7 p-0"}},defaultVariants:{variant:"secondary",size:"md"}}),zt=E.forwardRef(function({className:r,variant:s,size:o,...f},m){return h.jsx("button",{ref:m,className:gl(W_({variant:s,size:o}),r),...f})}),Z0="w-full rounded-md border border-line bg-surface px-2.5 text-[13px] text-ink-1 placeholder:text-ink-3 transition-colors hover:border-line-strong focus:border-brand focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed",nt=E.forwardRef(function({className:r,...s},o){return h.jsx("input",{ref:o,className:gl(Z0,"h-8",r),...s})}),Cd=E.forwardRef(function({className:r,...s},o){return h.jsx("textarea",{ref:o,className:gl(Z0,"py-2 min-h-[72px] resize-y leading-relaxed",r),...s})});function De({label:n,required:r,hint:s,className:o,children:f}){return h.jsxs("div",{className:gl("flex flex-col gap-1.5",o),children:[h.jsxs("label",{className:"text-[12px] font-medium text-ink-2",children:[n,r&&h.jsx("span",{className:"text-danger ml-0.5",children:"*"}),s&&h.jsx("span",{className:"text-ink-3 font-normal ml-2",children:s})]}),f]})}const ml=E.forwardRef(function({className:r,options:s,children:o,...f},m){return h.jsxs("div",{className:gl("relative",r?r.split(" ").filter(d=>/^w-|^min-w|^flex-/.test(d)).join(" "):""),children:[h.jsx("select",{ref:m,className:gl("w-full h-8 appearance-none rounded-md border border-line bg-surface pl-2.5 pr-7 text-[13px] text-ink-1","transition-colors hover:border-line-strong focus:border-brand focus:outline-none disabled:opacity-50",r),...f,children:s?s.map(d=>h.jsx("option",{value:d.value,children:d.label},d.value)):o}),h.jsx(J3,{size:14,className:"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-ink-3"})]})});function Ii({className:n,color:r,...s}){return h.jsx("span",{className:gl("inline-flex items-center gap-1 rounded-sm border px-1.5 py-px text-[11px] leading-[18px] font-medium whitespace-nowrap",n),style:r?{color:r,borderColor:r+"44",backgroundColor:r+"14"}:void 0,...s})}function I_({className:n,...r}){return h.jsx("span",{className:gl("inline-flex items-center gap-1 rounded-sm border border-line bg-surface-2 px-1.5 py-px text-[11px] leading-[18px] font-medium text-ink-2 whitespace-nowrap",n),...r})}function so({open:n,onClose:r,title:s,width:o=560,children:f,footer:m}){return E.useEffect(()=>{if(!n)return;const d=p=>{p.key==="Escape"&&r()};return document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)},[n,r]),n?KS.createPortal(h.jsxs("div",{className:"fixed inset-0 z-50 flex justify-center overflow-y-auto p-3 sm:p-6",children:[h.jsx("div",{className:"fixed inset-0 bg-black/45",onClick:r}),h.jsxs("div",{className:"animate-in relative my-auto w-full rounded-lg border border-line bg-surface shadow-pop",style:{maxWidth:o},role:"dialog",children:[h.jsxs("div",{className:"flex h-12 items-center justify-between border-b border-line px-4",children:[h.jsx("div",{className:"text-sm font-semibold text-ink-1",children:s}),h.jsx(zt,{variant:"ghost",size:"icon-sm",onClick:r,"aria-label":"关闭",children:h.jsx(g0,{size:15})})]}),h.jsx("div",{className:"max-h-[70vh] overflow-y-auto px-3 py-3 sm:px-4 sm:py-4",children:f}),m&&h.jsx("div",{className:"flex flex-wrap items-center justify-end gap-2 border-t border-line px-3 py-2.5 sm:h-14 sm:flex-nowrap sm:px-4 sm:py-0",children:m})]})]}),document.body):null}function e5({icon:n,title:r,description:s,action:o}){return h.jsxs("div",{className:"flex flex-col items-center justify-center gap-2 py-16 text-center",children:[h.jsx("div",{className:"text-ink-3",children:n??h.jsx(xE,{size:36,strokeWidth:1.5})}),h.jsx("div",{className:"text-[13px] font-medium text-ink-2",children:r}),s&&h.jsx("div",{className:"max-w-[360px] text-[12px] text-ink-3",children:s}),o&&h.jsx("div",{className:"mt-2",children:o})]})}const J0=E.createContext(()=>{});function oo(){return E.useContext(J0)}const t5={success:h.jsx(W3,{size:15,className:"text-success"}),error:h.jsx($3,{size:15,className:"text-danger"}),info:h.jsx(EE,{size:15,className:"text-brand"})};function l5({children:n}){const[r,s]=E.useState([]),o=E.useRef(0),f=E.useCallback((m,d)=>{const p=++o.current;s(b=>[...b,{id:p,kind:m,text:d}]),setTimeout(()=>s(b=>b.filter(v=>v.id!==p)),3200)},[]);return h.jsxs(J0.Provider,{value:f,children:[n,h.jsx("div",{className:"pointer-events-none fixed bottom-5 right-5 z-[60] flex flex-col gap-2",children:r.map(m=>h.jsxs("div",{className:gl("pointer-events-auto flex items-center gap-2 rounded-md border border-line bg-surface px-3 py-2 text-[13px] text-ink-1 shadow-pop","animate-in"),children:[t5[m.kind],m.text]},m.id))})]})}function a5({open:n,title:r,content:s,onCancel:o,onOk:f,loading:m}){return h.jsx(so,{open:n,onClose:o,title:r,width:420,footer:h.jsxs(h.Fragment,{children:[h.jsx(zt,{variant:"secondary",onClick:o,children:"取消"}),h.jsx(zt,{variant:"danger",onClick:f,disabled:m,children:"确认"})]}),children:h.jsx("p",{className:"text-[13px] text-ink-2",children:s??"该操作不可撤销,请确认。"})})}function n5({size:n=44}){return h.jsxs("svg",{width:n,height:n,viewBox:"0 0 26 26",fill:"none","aria-hidden":!0,children:[h.jsx("rect",{x:"1",y:"1",width:"24",height:"24",rx:"6",fill:"var(--brand)"}),h.jsx("ellipse",{cx:"11",cy:"10",rx:"4.2",ry:"5.2",fill:"#fff",opacity:"0.95",transform:"rotate(-18 11 10)"}),h.jsx("circle",{cx:"17.5",cy:"17.5",r:"3.1",fill:"#fff",opacity:"0.7"})]})}function i5({open:n,onClose:r,defaultUrl:s}){const o=lu(),f=oo(),[m,d]=E.useState("login"),[p,b]=E.useState(s||"https://footpr.linyux.cn"),[v,x]=E.useState(""),[g,_]=E.useState(""),[k,K]=E.useState(""),[q,D]=E.useState(""),[H,Q]=E.useState(!1),Z=async()=>{if(!v.trim()||!g){D("请填写账号与密码");return}let J=p.trim();J&&!J.startsWith("http")&&(J="https://"+J),Q(!0),D("");try{if(m==="login")await $d(v.trim(),g,J);else{if(!k.trim())throw new Error("请填写邀请码");await Pd(v.trim(),g,k.trim(),J)}o.invalidateQueries(),f("success",m==="login"?"已登录 · 同步已开启":"已注册登录 · 同步已开启"),r(),setTimeout(()=>window.location.reload(),300)}catch(Y){D(Y.message)}finally{Q(!1)}};return n?h.jsx("div",{className:"fixed inset-0 z-[70] flex items-center justify-center bg-bg/95",children:h.jsxs("div",{className:"w-full max-w-[380px] rounded-lg border border-line bg-surface p-6 shadow-pop",children:[h.jsxs("div",{className:"flex flex-col items-center gap-1.5 pb-5",children:[h.jsx(n5,{}),h.jsx("div",{className:"text-[17px] font-semibold tracking-tight text-ink-1",children:"足迹"}),h.jsx("div",{className:"text-[10px] font-medium tracking-[0.2em] text-ink-3",children:"FOOTPRINTS"})]}),h.jsxs("div",{className:"mb-4 flex rounded-md border border-line bg-surface-2 p-0.5 text-[12.5px]",children:[h.jsx("button",{className:"flex-1 rounded-sm px-2 py-1 transition-colors "+(m==="login"?"bg-surface font-medium text-ink-1 shadow-card":"text-ink-3"),onClick:()=>{d("login"),D("")},children:"登录"}),h.jsx("button",{className:"flex-1 rounded-sm px-2 py-1 transition-colors "+(m==="register"?"bg-surface font-medium text-ink-1 shadow-card":"text-ink-3"),onClick:()=>{d("register"),D("")},children:"注册"})]}),h.jsxs("div",{className:"flex flex-col gap-3",children:[h.jsx(De,{label:"服务器地址",hint:"与网页版同一账号体系",children:h.jsx(nt,{value:p,onChange:J=>b(J.target.value),placeholder:"https://footpr.linyux.cn"})}),h.jsx(De,{label:"用户名",required:!0,children:h.jsx(nt,{value:v,onChange:J=>x(J.target.value),placeholder:"3-32 位字母数字-_"})}),h.jsx(De,{label:"密码",required:!0,children:h.jsx(nt,{type:"password",value:g,onChange:J=>_(J.target.value),placeholder:"至少 8 位"})}),m==="register"&&h.jsx(De,{label:"邀请码",required:!0,hint:"向管理员索取",children:h.jsx(nt,{value:k,onChange:J=>K(J.target.value),placeholder:"邀请码"})}),q&&h.jsx("div",{className:"text-[12px] text-danger",children:q}),h.jsx(zt,{variant:"primary",size:"lg",onClick:()=>void Z(),disabled:H,children:H?"请稍候…":m==="login"?"登录并同步":"注册并同步"}),h.jsx("p",{className:"text-center text-[11px] text-ink-3",children:"登录后本机数据将多端同步"})]})]})}):null}const u5=[{section:"工作区",items:[{to:"/timeline",label:"时间线",icon:m0},{to:"/records",label:"记录",icon:PE},{to:"/grades",label:"成绩",icon:p0},{to:"/dashboard",label:"统计",icon:K3}]},{section:"个人",items:[{to:"/profile",label:"个人信息",icon:b4},{to:"/resume",label:"我的简历",icon:IE},{to:"/assessment",label:"综合测评",icon:eE}]},{section:"配置",items:[{to:"/admin",label:"管理",icon:r4},{to:"/types",label:"记录类型",icon:a4},{to:"/taxonomy",label:"字典与维度",icon:o4}]}];function r5(){return h.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 26 26",fill:"none","aria-hidden":!0,children:[h.jsx("defs",{children:h.jsxs("linearGradient",{id:"lg",x1:"0",y1:"0",x2:"0",y2:"26",children:[h.jsx("stop",{stopColor:"#4359e8"}),h.jsx("stop",{offset:"1",stopColor:"#2a3ab8"})]})}),h.jsx("rect",{x:"1",y:"1",width:"24",height:"24",rx:"7",fill:"url(#lg)"}),h.jsx("ellipse",{cx:"11",cy:"10",rx:"4.2",ry:"5.2",fill:"#fff",opacity:".95",transform:"rotate(-18 11 10)"}),h.jsx("circle",{cx:"17.5",cy:"17.5",r:"3.1",fill:"#fff",opacity:".7"})]})}function s5({open:n,onClose:r}){const s=lu(),f=yl({queryKey:["me",pl()??""],refetchOnMount:"always",queryFn:()=>b0(),enabled:!!pl(),retry:0}).data??null,[m,d]=E.useState(!1);return h.jsxs("aside",{className:gl("no-print","flex w-[236px] shrink-0 flex-col border-r border-line bg-surface","max-lg:fixed max-lg:inset-y-0 max-lg:left-0 max-lg:z-40 max-lg:transition-transform",n?"max-lg:translate-x-0":"max-lg:-translate-x-full"),children:[h.jsx(i5,{open:m,onClose:()=>d(!1),defaultUrl:"https://footpr.linyux.cn"}),h.jsxs("div",{className:"flex h-[60px] items-center gap-3 border-b border-line px-5",children:[h.jsx(r5,{}),h.jsxs("div",{className:"leading-tight",children:[h.jsx("div",{className:"text-[15px] font-bold tracking-tight text-ink-1",children:"足迹"}),h.jsx("div",{className:"text-[9px] font-medium tracking-[0.24em] text-ink-3",children:"FOOTPRINTS"})]})]}),h.jsx("nav",{className:"flex-1 overflow-y-auto px-2.5 py-4",children:u5.map(p=>h.jsxs("div",{className:"mb-5",children:[h.jsx("div",{className:"px-2.5 pb-1.5 text-[10px] font-semibold uppercase tracking-[0.08em] text-ink-3",children:p.section}),h.jsx("div",{className:"flex flex-col gap-0.5",children:p.items.map(b=>h.jsxs(e0,{to:b.to,onClick:r,className:({isActive:v})=>gl("relative flex h-[34px] items-center gap-3 rounded-lg px-3 text-[13px] font-medium transition-all duration-150",v?"bg-brand-subtle text-brand-text nav-active":"text-ink-2 hover:bg-surface-3 hover:text-ink-1"),children:[h.jsx(b.icon,{size:16,strokeWidth:1.8}),b.label]},b.to))})]},p.section))}),h.jsx("div",{className:"border-t border-line px-3 py-3",children:pl()&&f?h.jsxs("div",{className:"rounded-lg bg-surface-2 px-3 py-2.5",children:[h.jsxs("div",{className:"flex items-center justify-between gap-2",children:[h.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[h.jsx("div",{className:"flex size-6 shrink-0 items-center justify-center rounded-full bg-brand text-[10px] font-bold text-white",children:f.username.charAt(0).toUpperCase()}),h.jsxs("div",{className:"min-w-0",children:[h.jsx("div",{className:"truncate text-[12px] font-semibold text-ink-1",title:f.username,children:f.username}),f.is_admin&&h.jsx("div",{className:"text-[10px] text-brand-text",children:"管理员"})]})]}),h.jsx("button",{className:"shrink-0 rounded p-1 text-ink-3 transition-colors hover:bg-surface-3 hover:text-danger",title:"退出登录",onClick:()=>{Fd(),s.clear(),window.location.reload()},children:h.jsx(OE,{size:13})})]}),h.jsxs("div",{className:"mt-1.5 flex items-center gap-1 text-[10px] text-success",children:[h.jsx(lE,{size:10}),"云端同步已开启"]})]}):h.jsxs("button",{className:"flex w-full items-center justify-center gap-2 rounded-lg border border-brand/30 bg-brand-subtle px-3 py-2 text-[13px] font-medium text-brand-text transition-all hover:shadow-brand",onClick:()=>d(!0),children:[h.jsx(jE,{size:14}),"登录我的档案"]})})]})}const o5={"/timeline":{title:"时间线",sub:"按学年与月份回顾全部足迹"},"/records":{title:"记录",sub:"全部足迹的检索与管理"},"/grades":{title:"成绩",sub:"学年学科成绩 · 梯度与总览"},"/dashboard":{title:"统计",sub:"量化个人成长收获"},"/types":{title:"记录类型",sub:"类型与字段模板管理"},"/taxonomy":{title:"字典与维度",sub:"级别、角色与成长维度"}};function c5({onMenu:n}){const{pathname:r}=bl(),s=no(),[o,f]=E.useState(""),[m,d]=E.useState(document.documentElement.classList.contains("dark")),p=o5[r]??{title:""},b=()=>{const v=!m;d(v),document.documentElement.classList.toggle("dark",v),localStorage.setItem("fp-theme",v?"dark":"light"),window.dispatchEvent(new CustomEvent("fp-theme-change"))};return h.jsxs("header",{className:"no-print flex h-14 shrink-0 items-center gap-2 border-b border-line bg-surface px-3 sm:gap-4 sm:px-5",children:[h.jsx(zt,{variant:"ghost",size:"icon",className:"lg:hidden",onClick:n,"aria-label":"打开导航",children:h.jsx(AE,{size:17})}),h.jsxs("div",{className:"min-w-0",children:[h.jsx("h1",{className:"truncate text-[15px] font-semibold leading-tight text-ink-1",children:p.title}),p.sub&&h.jsx("p",{className:"truncate text-[11px] leading-tight text-ink-3",children:p.sub})]}),h.jsxs("div",{className:"relative ml-auto hidden w-[240px] md:block lg:w-[280px]",children:[h.jsx(t4,{size:14,className:"pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-ink-3"}),h.jsx(nt,{className:"pl-8",placeholder:"搜索标题、内容、结果、标签",value:o,onChange:v=>f(v.target.value),onKeyDown:v=>{v.key==="Enter"&&o.trim()&&s("/records?q="+encodeURIComponent(o.trim()))}})]}),h.jsx(zt,{variant:"ghost",size:"icon",onClick:b,"aria-label":"切换主题",children:m?h.jsx(h4,{size:15}):h.jsx(kE,{size:15})}),h.jsxs(zt,{variant:"primary",onClick:()=>s("/records?new=1"),"aria-label":"新建记录",children:[h.jsx(ZE,{size:14}),h.jsx("span",{className:"hidden sm:inline",children:"新建记录"})]})]})}function f5(){return h.jsxs("svg",{width:"44",height:"44",viewBox:"0 0 26 26",fill:"none","aria-hidden":!0,children:[h.jsx("rect",{x:"1",y:"1",width:"24",height:"24",rx:"6",fill:"var(--brand)"}),h.jsx("ellipse",{cx:"11",cy:"10",rx:"4.2",ry:"5.2",fill:"#fff",opacity:"0.95",transform:"rotate(-18 11 10)"}),h.jsx("circle",{cx:"17.5",cy:"17.5",r:"3.1",fill:"#fff",opacity:"0.7"})]})}function d5(){const[n,r]=E.useState("login"),[s,o]=E.useState(""),[f,m]=E.useState(""),[d,p]=E.useState(""),[b,v]=E.useState(""),[x,g]=E.useState(!1),_="__TAURI_INTERNALS__"in window,[k,K]=E.useState(Ol()),q=H=>{K(H),S0(H)},D=async()=>{if(!s.trim()||!f){v("请填写账号与密码");return}g(!0),v("");try{if(n==="login")await $d(s.trim(),f,k);else{if(!d.trim())throw new Error("请填写邀请码");await Pd(s.trim(),f,d.trim(),k)}setTimeout(()=>window.location.reload(),200)}catch(H){v(H.message)}finally{g(!1)}};return h.jsx("div",{className:"flex h-full items-center justify-center bg-bg px-4",children:h.jsxs("div",{className:"w-full max-w-[380px] rounded-lg border border-line bg-surface p-6 shadow-pop",children:[h.jsxs("div",{className:"flex flex-col items-center gap-1.5 pb-5",children:[h.jsx(f5,{}),h.jsx("div",{className:"text-[18px] font-semibold tracking-tight text-ink-1",children:"足迹"}),h.jsx("div",{className:"text-[11px] font-medium tracking-[0.2em] text-ink-3",children:"FOOTPRINTS"})]}),h.jsxs("div",{className:"mb-4 flex rounded-md border border-line bg-surface-2 p-0.5 text-[12.5px]",children:[h.jsx("button",{className:"flex-1 rounded-sm px-2 py-1 transition-colors "+(n==="login"?"bg-surface font-medium text-ink-1 shadow-card":"text-ink-3"),onClick:()=>{r("login"),v("")},children:"登录"}),h.jsx("button",{className:"flex-1 rounded-sm px-2 py-1 transition-colors "+(n==="register"?"bg-surface font-medium text-ink-1 shadow-card":"text-ink-3"),onClick:()=>{r("register"),v("")},children:"注册"})]}),h.jsxs("div",{className:"flex flex-col gap-3",children:[_&&h.jsx(De,{label:"服务器地址",hint:"默认即可",children:h.jsx(nt,{value:k,onChange:H=>q(H.target.value),placeholder:"https://footpr.linyux.cn"})}),h.jsx(De,{label:"用户名",required:!0,children:h.jsx(nt,{value:s,onChange:H=>o(H.target.value),placeholder:"3-32 位字母数字-_",onKeyDown:H=>{H.key==="Enter"&&D()}})}),h.jsx(De,{label:"密码",required:!0,children:h.jsx(nt,{type:"password",value:f,onChange:H=>m(H.target.value),placeholder:"至少 8 位",onKeyDown:H=>{H.key==="Enter"&&D()}})}),n==="register"&&h.jsx(De,{label:"邀请码",required:!0,hint:"向管理员索取",children:h.jsx(nt,{value:d,onChange:H=>p(H.target.value),placeholder:"邀请码",onKeyDown:H=>{H.key==="Enter"&&D()}})}),b&&h.jsx("div",{className:"text-[12px] text-danger",children:b}),h.jsx(zt,{variant:"primary",size:"lg",onClick:()=>void D(),disabled:x,children:x?"请稍候…":n==="login"?"进入我的档案":"创建我的档案"}),h.jsx("button",{type:"button",className:"mt-1 flex w-full items-center justify-center gap-1.5 rounded-md border border-dashed border-line px-3 py-2 text-[11.5px] text-ink-3 transition-colors hover:border-brand/40 hover:text-brand-text",onClick:()=>{o("demo"),m("demo1234")},children:"演示账号:demo / demo1234(点击填充)"})]})]})})}function h5(){const[n,r]=E.useState(()=>!!pl()),[s,o]=E.useState(!1);return E.useEffect(()=>{const f=()=>r(!1);return window.addEventListener("fp-auth-required",f),()=>window.removeEventListener("fp-auth-required",f)},[]),n?h.jsx(l5,{children:h.jsxs("div",{className:"flex h-full",children:[s&&h.jsx("div",{className:"fixed inset-0 z-30 bg-black/45 lg:hidden",onClick:()=>o(!1),"aria-hidden":!0}),h.jsx(s5,{open:s,onClose:()=>o(!1)}),h.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[h.jsx(c5,{onMenu:()=>o(!0)}),h.jsx("main",{className:"app-scroll min-h-0 flex-1 overflow-y-auto",children:h.jsx(cS,{})})]})]})}):h.jsx(d5,{})}const Gn="inline-flex h-[22px] min-w-[52px] items-center justify-center gap-1 rounded-sm border px-2 text-[11.5px] font-medium whitespace-nowrap",cg={draft:{label:"草稿",color:"var(--text-3)",bg:"var(--surface-3)"},ongoing:{label:"进行中",color:"var(--brand-text)",bg:"var(--brand-subtle)"},submitted:{label:"已提交待果",color:"var(--warning)",bg:"var(--warning-subtle)"},finished:{label:"已完结",color:"var(--success)",bg:"var(--success-subtle)"}};function F0({status:n}){const r=cg[n]??cg.draft;return h.jsx("span",{className:Gn+" border-transparent",style:{color:r.color,backgroundColor:r.bg},children:r.label})}const m5={国际级:"#7c3aed",国家级:"#dc2626",省市级:"#ea580c",区县级:"#2563eb",校级:"#16a34a",院级:"#0891b2"};function $0({level:n}){return n?h.jsx(Ii,{color:m5[n]??"var(--text-3)",className:Gn,children:n}):null}const y5={特等奖:"#b45309",一等奖:"#b45309",二等奖:"#ea580c",三等奖:"#2563eb",优秀奖:"#64748b"};function P0({grade:n}){return n?h.jsx(Ii,{color:y5[n]??"var(--text-3)",className:Gn,children:n}):null}function W0({role:n}){return n?h.jsx(I_,{className:Gn,children:n}):null}function I0(){return h.jsx(Ii,{color:"var(--danger)",className:Gn,children:"负面"})}const Z5=[{name:"tag",label:"通用"},{name:"graduation-cap",label:"学业"},{name:"trophy",label:"竞赛"},{name:"flask-conical",label:"科研"},{name:"briefcase",label:"实习"},{name:"network",label:"学生工作"},{name:"heart-handshake",label:"志愿"},{name:"palette",label:"文体"},{name:"award",label:"荣誉"},{name:"file-badge",label:"证书"},{name:"star",label:"收藏"},{name:"shield-alert",label:"惩处"},{name:"book-open",label:"阅读"},{name:"code-2",label:"技术"},{name:"languages",label:"语言"},{name:"mic-2",label:"文艺"},{name:"pen-line",label:"发表"},{name:"rocket",label:"项目"},{name:"users",label:"团队"},{name:"building-2",label:"组织"},{name:"dumbbell",label:"体育"}],p5={tag:v0,"graduation-cap":p0,trophy:v4,"flask-conical":hE,briefcase:Q3,network:qE,"heart-handshake":pE,palette:BE,award:H3,"file-badge":cE,star:f4,"shield-alert":i4,"book-open":L3,"code-2":nE,languages:TE,"mic-2":DE,"pen-line":YE,rocket:FE,users:S4,"building-2":Y3,dumbbell:sE};function v5({name:n,color:r,size:s=14,className:o}){const f=p5[n]??v0;return h.jsx(f,{size:s,color:r,className:o,strokeWidth:2})}const fg=new Map,g5=25*1024*1024;async function b5(n){const r=fg.get(n.id);if(r)return r;const s=await eo(n.id);return(n.size??0)<=g5&&fg.set(n.id,s),s}function dg(n){const r=(n.mime||"").toLowerCase(),s=(n.file_name.split(".").pop()||"").toLowerCase();return r.startsWith("image/")||["png","jpg","jpeg","gif","webp","bmp","svg"].includes(s)?"image":r==="application/pdf"||s==="pdf"?"pdf":s==="docx"||r.includes("wordprocessingml")?"docx":s==="xlsx"||s==="xls"||r.includes("spreadsheetml")||r==="application/vnd.ms-excel"?"xlsx":r.startsWith("audio/")||["mp3","wav","m4a","flac","ogg"].includes(s)?"audio":r.startsWith("video/")||["mp4","mov","webm","mkv"].includes(s)?"video":r.startsWith("text/")||["txt","md","csv","json","log","srt"].includes(s)?"text":"other"}function x5(n){return Uint8Array.from(atob(n),r=>r.charCodeAt(0))}const S5={image:"图片",pdf:"PDF 文档",text:"文本文件",audio:"音频",video:"视频",docx:"Word 文档(.docx)",xlsx:"Excel 表格(.xlsx)",other:"该类型暂不支持在线预览"};function e1({att:n,onClose:r}){const s=oo(),[o,f]=E.useState(!1),[m,d]=E.useState(""),[p,b]=E.useState(null);E.useEffect(()=>{if(!n){b(null),d("");return}let x=!1;const g=[];return f(!0),d(""),b(null),(async()=>{try{const _=dg(n),k=n.remote_url||null;if(k&&(_==="image"||_==="pdf"||_==="audio"||_==="video")){b({kind:_,objectUrl:k}),f(!1);return}let K=n.mime??void 0,q;if(k)q=new Uint8Array(await(await fetch(k)).arrayBuffer());else{const D=await b5(n);K=D.mime,q=x5(D.data_b64)}if(x)return;if(_==="text"){const D=new TextDecoder().decode(q);b({kind:_,text:D.length>4e5?D.slice(0,4e5)+` -…(已截断)`:D})}else if(_==="docx"){const H=(await(await vl(()=>import("./mammoth.browser-BD-Y_aNE.js").then(Q=>Q.m),[])).convertToHtml({arrayBuffer:q.buffer})).value;if(x)return;b({kind:_,html:H})}else if(_==="xlsx"){const D=await vl(()=>import("./xlsx-CbTSpprj.js"),[]),H=D.read(q,{type:"array"}),Q=D.utils.sheet_to_html(H.Sheets[H.SheetNames[0]]);if(x)return;b({kind:_,html:Q})}else{const D=URL.createObjectURL(new Blob([q],{type:K||"application/octet-stream"}));if(x){URL.revokeObjectURL(D);return}g.push(D),b({kind:_,objectUrl:D})}}catch(_){x||d(_.message||"预览加载失败")}finally{x||f(!1)}})(),()=>{x=!0,g.forEach(_=>URL.revokeObjectURL(_))}},[n==null?void 0:n.id,n==null?void 0:n.file_name,n==null?void 0:n.remote_url]);const v=n?dg(n):"other";return h.jsxs(so,{open:!!n,onClose:r,width:v==="image"||v==="pdf"?880:680,title:(n?"附件预览 · "+n.file_name:"附件预览")+(n?"("+S5[v]+")":""),footer:n?h.jsxs(h.Fragment,{children:[h.jsxs(zt,{variant:"secondary",className:"mr-auto",onClick:()=>{(async()=>{try{const{blob:x,file_name:g}=await j0(n.id),_=URL.createObjectURL(x),k=document.createElement("a");k.href=_,k.download=g,k.click(),setTimeout(()=>URL.revokeObjectURL(_),6e4),s("success","已下载:"+g)}catch(x){s("error","下载失败:"+x.message)}})()},children:[h.jsx(uE,{size:13})," 下载"]}),h.jsx(zt,{variant:"primary",onClick:r,children:"关闭"})]}):null,children:[o&&h.jsxs("div",{className:"flex items-center justify-center gap-2 py-16 text-[13px] text-ink-3",children:[h.jsx(CE,{className:"animate-spin",size:16})," 正在加载预览…"]}),!o&&!!m&&h.jsx("div",{className:"py-10 text-center text-[13px] text-danger",children:m}),!o&&!m&&p&&h.jsxs(h.Fragment,{children:[p.kind==="image"&&h.jsx("img",{src:p.objectUrl,alt:n==null?void 0:n.file_name,className:"mx-auto max-h-[72vh] rounded-md"}),p.kind==="pdf"&&h.jsx("iframe",{src:p.objectUrl,title:n==null?void 0:n.file_name,className:"h-[72vh] w-full rounded-md border border-line bg-white"}),p.kind==="audio"&&h.jsx("audio",{controls:!0,src:p.objectUrl,className:"w-full"}),p.kind==="video"&&h.jsx("video",{controls:!0,src:p.objectUrl,className:"max-h-[70vh] w-full rounded-md bg-black"}),p.kind==="text"&&h.jsx("pre",{className:"max-h-[68vh] overflow-auto whitespace-pre-wrap rounded-md bg-surface-2 p-3 text-[12.5px] leading-relaxed text-ink-1",children:p.text}),(p.kind==="docx"||p.kind==="xlsx")&&h.jsx("div",{className:"max-h-[70vh] overflow-auto rounded-md border border-line bg-white p-4 text-[13px] leading-relaxed [&_img]:max-w-full [&_table]:border-collapse [&_td]:border [&_td]:border-line [&_td]:px-2 [&_td]:py-1 [&_th]:border [&_th]:border-line [&_th]:px-2 [&_th]:py-1",dangerouslySetInnerHTML:{__html:p.html||""}}),p.kind==="other"&&h.jsxs("div",{className:"py-10 text-center",children:[h.jsx("p",{className:"text-[13px] text-ink-2",children:"该文件类型暂不支持在线预览"}),h.jsx("p",{className:"mt-1 text-[12px] text-ink-3",children:"请点击左下角「下载」,用本地应用打开"})]})]})]})}function E5({value:n,onChange:r,placeholder:s}){const[o,f]=E.useState(""),m=()=>{const p=o.trim();p&&!n.includes(p)&&r([...n,p]),f("")},d=p=>{p.key==="Enter"||p.key===","?(p.preventDefault(),m()):p.key==="Backspace"&&!o&&n.length&&r(n.slice(0,-1))};return h.jsxs("div",{className:gl("flex min-h-8 w-full flex-wrap items-center gap-1 rounded-md border border-line bg-surface px-1.5 py-1","transition-colors hover:border-line-strong focus-within:border-brand"),children:[n.map(p=>h.jsxs("span",{className:"inline-flex items-center gap-0.5 rounded-sm bg-surface-3 px-1.5 text-[12px] text-ink-2",children:[p,h.jsx("button",{type:"button",className:"text-ink-3 hover:text-ink-1",onClick:()=>r(n.filter(b=>b!==p)),children:h.jsx(g0,{size:11})})]},p)),h.jsx("input",{className:"min-w-[80px] flex-1 border-0 bg-transparent text-[13px] outline-none placeholder:text-ink-3",value:o,placeholder:n.length?"":s??"输入后回车添加",onChange:p=>f(p.target.value),onKeyDown:d,onBlur:m})]})}function hg(n,r){return n.options?Array.isArray(n.options)?n.options.map(s=>({value:s,label:s})):r[n.options.taxonomy]??[]:[]}function _5({fields:n,value:r,onChange:s,taxonomies:o}){if(!n.length)return null;const f=(d,p)=>s({...r,[d]:p}),m=d=>{const p=r[d.key],b=d.required&&(p==null||p==="")?"该项必填":"",v=x=>d.unit?h.jsxs("div",{className:"flex items-center gap-2",children:[x,h.jsx("span",{className:"text-[12px] text-ink-3 shrink-0",children:d.unit})]}):x;switch(d.widget){case"textarea":return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsx(Cd,{value:String(p??""),onChange:x=>f(d.key,x.target.value),placeholder:d.placeholder})},d.key);case"number":return h.jsx(De,{label:d.label,required:d.required,hint:b,children:v(h.jsx(nt,{type:"number",step:"any",className:"num",value:p==null?"":String(p),onChange:x=>f(d.key,x.target.value===""?void 0:Number(x.target.value))}))},d.key);case"date":return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsx(nt,{type:"date",value:String(p??""),onChange:x=>f(d.key,x.target.value)})},d.key);case"select":return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsx(ml,{value:String(p??""),onChange:x=>f(d.key,x.target.value||void 0),options:[{value:"",label:"请选择"},...hg(d,o)]})},d.key);case"multiselect":{const x=hg(d,o),g=Array.isArray(p)?p:[];return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[x.map(_=>{const k=g.includes(_.value);return h.jsx("button",{type:"button",className:"rounded-sm border px-2 py-0.5 text-[12px] transition-colors "+(k?"border-brand bg-brand-subtle text-brand-text":"border-line bg-surface text-ink-2 hover:border-line-strong"),onClick:()=>f(d.key,k?g.filter(K=>K!==_.value):[...g,_.value]),children:_.label},_.value)}),!x.length&&h.jsx("span",{className:"text-[12px] text-ink-3",children:"未配置选项"})]})},d.key)}case"link":return h.jsx(De,{label:d.label,required:d.required,hint:b||"关联记录功能规划中,暂以文本记录",children:h.jsx(nt,{value:String(p??""),onChange:x=>f(d.key,x.target.value),placeholder:d.placeholder})},d.key);default:return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsx(nt,{value:String(p??""),onChange:x=>f(d.key,x.target.value),placeholder:d.placeholder})},d.key)}};return h.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-3 gap-y-3.5",children:n.map(d=>h.jsx("div",{className:d.widget==="textarea"?"sm:col-span-2":"",children:m(d)},d.key))})}function mg(n){return n?n.slice(0,16).replace("T"," "):""}function T5(n,r){const s=n?n.slice(0,10):"",o=r?r.slice(0,10):"";return s&&o?s+" ~ "+o:s?s+(r===""?"":" 起"):o?"至 "+o:""}function wd(n){return n<1024?n+" B":n<1024*1024?(n/1024).toFixed(1)+" KB":(n/1024/1024).toFixed(1)+" MB"}function t1(n,r,s=480,o=.82){return new Promise((f,m)=>{const d=new Image;d.onload=()=>{try{const p=Math.min(1,s/Math.max(d.naturalWidth,d.naturalHeight)),b=Math.max(1,Math.round(d.naturalWidth*p)),v=Math.max(1,Math.round(d.naturalHeight*p)),x=document.createElement("canvas");x.width=b,x.height=v;const g=x.getContext("2d");if(!g)return m(new Error("canvas 不可用"));g.drawImage(d,0,0,b,v),f(x.toDataURL("image/webp",o))}catch(p){m(p instanceof Error?p:new Error(String(p)))}},d.onerror=()=>m(new Error("图片解码失败")),d.src="data:"+r+";base64,"+n})}function yg({items:n,pending:r,onPick:s,onDeleteSaved:o,onDeletePending:f,onOpenSaved:m,uploading:d}){const p=E.useRef(null),b=n.length+r.length;return h.jsxs("div",{className:"rounded-md border border-line bg-surface-2 p-3",children:[h.jsxs("div",{className:"mb-2 flex items-center justify-between",children:[h.jsxs("div",{className:"flex items-center gap-1.5 text-[12px] font-medium text-ink-2",children:[h.jsx(Kd,{size:13}),"附件(",b,")"]}),h.jsx(zt,{size:"sm",variant:"secondary",disabled:d,onClick:()=>{var v;return(v=p.current)==null?void 0:v.click()},children:d?"上传中…":"添加文件"}),h.jsx("input",{ref:p,type:"file",multiple:!0,className:"hidden",onChange:v=>{var x;(x=v.target.files)!=null&&x.length&&s(v.target.files),v.target.value=""}})]}),h.jsxs("div",{className:"flex flex-col gap-1",children:[n.map(v=>h.jsxs("div",{className:"flex items-center gap-2 rounded-sm bg-surface px-2 py-1.5 text-[12px]",children:[h.jsx(y0,{size:13,className:"text-ink-3 shrink-0"}),h.jsx("span",{className:"truncate "+(m?"cursor-pointer text-ink-1 hover:text-brand-text hover:underline":"text-ink-1"),onClick:()=>m==null?void 0:m(v),title:v.file_name,children:v.file_name}),h.jsx("span",{className:"num ml-auto shrink-0 text-ink-3",children:wd(v.size)}),h.jsx("button",{className:"text-ink-3 hover:text-danger shrink-0",onClick:()=>o(v.id),"aria-label":"删除附件",children:h.jsx(Ed,{size:13})})]},"s"+v.id)),r.map((v,x)=>{var g;return h.jsxs("div",{className:"flex items-center gap-2 rounded-sm bg-surface px-2 py-1.5 text-[12px]",children:[(g=v.mime)!=null&&g.startsWith("image/")&&v.preview?h.jsx("img",{src:v.preview,alt:v.file_name,className:"size-7 shrink-0 rounded object-cover"}):h.jsx(gE,{size:13,className:"text-ink-3 shrink-0"}),h.jsx("span",{className:"truncate text-ink-1",children:v.file_name}),h.jsx("span",{className:"text-[11px] text-brand-text",children:"待上传"}),h.jsx("span",{className:"num ml-auto shrink-0 text-ink-3",children:wd(v.size)}),h.jsx("button",{className:"text-ink-3 hover:text-danger shrink-0",onClick:()=>f(x),"aria-label":"移除",children:h.jsx(Ed,{size:13})})]},"p"+x)}),!b&&h.jsx("div",{className:"py-1 text-[12px] text-ink-3",children:"证书扫描件、照片、文档等佐证材料"})]})]})}async function pg(n){var d,p,b,v;let r=n;if(n.type==="image/jpeg"&&n.size>3*1024*1024)try{const x=await createImageBitmap(n),g=Math.min(1,2560/Math.max(x.width,x.height)),_=document.createElement("canvas");_.width=Math.round(x.width*g),_.height=Math.round(x.height*g),(d=_.getContext("2d"))==null||d.drawImage(x,0,0,_.width,_.height);const k=await new Promise(K=>_.toBlob(K,"image/jpeg",.85));k&&k.size{const _=new FileReader;_.onload=()=>x(String(_.result||"")),_.onerror=()=>g(new Error("读取文件失败")),_.readAsDataURL(r)}),o=s.indexOf(","),f=o>=0?s.slice(o+1):s;let m;if((b=n.type)!=null&&b.startsWith("image/")&&!n.type.includes("gif"))try{m=(await t1(f,n.type)).split(",")[1]||void 0}catch{m=void 0}return{file:r,file_name:n.name,mime:r.type||void 0,size:r.size,data_b64:f,thumb_b64:m,preview:(v=n.type)!=null&&v.startsWith("image/")?URL.createObjectURL(n):void 0}}const Ps={竞赛:{core:["level","award_grade","role","organizer"]},科研:{core:["level","role","organizer"]},实习实践:{core:["organizer"]},学生工作:{core:["role","organizer"]},志愿公益:{core:["organizer"]},文体活动:{core:["level","organizer"]},证书技能:{core:["level","organizer"]},荣誉惩处:{core:["award_grade","level","organizer"]},学业:{core:["rank"]}},vg={core:["level","role","award_grade","organizer"]},J5=[{value:"",label:"通用布局(级别/角色/奖等/组织方)"},...Object.keys(Ps).map(n=>({value:n,label:n+"式布局"}))];function N5(n,r){return r&&Ps[r]?Ps[r]:n?Ps[n]??vg:vg}const gg={type_id:null,title:"",organizer:"",start_date:"",end_date:"",status:"draft",role:"",level:"",award_grade:"",rank:"",polarity:"positive",weight:"3",description:"",result:"",tags:[],dimension_ids:[],group_id:"",parent_id:"",extras:{}},C5=["特等奖","一等奖","二等奖","三等奖","优秀奖","无"],bg=80*1024*1024,w5=[{value:"draft",label:"草稿"},{value:"ongoing",label:"进行中"},{value:"submitted",label:"已提交待果"},{value:"finished",label:"已完结"}];function j5({open:n,onClose:r,footprintId:s,onSaved:o}){var ie,Ne,re,V,ee;const f=lu(),m=oo(),[d,p]=E.useState(gg),[b,v]=E.useState([]),[x,g]=E.useState(!1),[_,k]=E.useState(null),[K,q]=E.useState(""),D=yl({queryKey:["types"],queryFn:ro,enabled:n}),H=yl({queryKey:["taxonomy-all"],queryFn:()=>E0(),enabled:n}),Q=yl({queryKey:["dimensions"],queryFn:Wd,enabled:n}),Z=yl({queryKey:["footprint",s],queryFn:()=>Id(s),enabled:n&&!!s}),J=yl({queryKey:["attachments",s],queryFn:()=>C0(s),enabled:n&&!!s}),Y=E.useMemo(()=>{var R;return(R=D.data)==null?void 0:R.items.find(ae=>ae.id===d.type_id)},[D.data,d.type_id]),de=N5(Y==null?void 0:Y.name,Y==null?void 0:Y.profile),F=yl({queryKey:["parent-candidates",d.type_id],queryFn:()=>_0({types:d.type_id?[d.type_id]:void 0,page_size:200,sort:"date_desc"}),enabled:n&&!!d.type_id});E.useEffect(()=>{if(n)if(q(""),v([]),s&&Z.data){const R=Z.data.item;p({type_id:R.type_id,title:R.title,organizer:R.organizer??"",start_date:(R.start_date??"").slice(0,10),end_date:(R.end_date??"").slice(0,10),status:R.status,role:R.role??"",level:R.level??"",award_grade:R.award_grade??"",rank:R.rank!=null?String(R.rank):"",polarity:R.polarity,weight:String(R.weight??3),description:R.description??"",result:R.result??"",tags:R.tags??[],dimension_ids:R.dimensions??[],group_id:R.group_id??"",parent_id:R.parent_id!=null?String(R.parent_id):"",extras:R.extras??{}})}else p(gg)},[n,s,Z.data]);const U=E.useMemo(()=>{var ae,X;const R={};for(const ke of((ae=H.data)==null?void 0:ae.items)??[])(R[X=ke.kind]??(R[X]=[])).push({value:ke.value,label:ke.value});return R},[H.data]),I=Sd({mutationFn:async()=>{if(!d.type_id)throw new Error("请选择记录类型");if(!d.title.trim())throw new Error("请填写标题");const R={};for(const ke of(Y==null?void 0:Y.form_template)??[])if(ke.metric&&ke.widget==="number"){const Nt=d.extras[ke.key];typeof Nt=="number"&&!Number.isNaN(Nt)&&(R[ke.metric]=Nt)}const ae={id:s??void 0,type_id:d.type_id,title:d.title.trim(),organizer:d.organizer||null,start_date:d.start_date||null,end_date:d.end_date||null,status:d.status,role:d.role||null,level:d.level||null,award_grade:d.award_grade&&d.award_grade!=="无"?d.award_grade:null,rank:d.rank?Number(d.rank):null,polarity:d.polarity,description:d.description,result:d.result,tags:d.tags,dimension_ids:d.dimension_ids,group_id:d.group_id||null,parent_id:d.parent_id?Number(d.parent_id):null,weight:Number(d.weight)||3,extras:d.extras,metrics:R},X=await T0(ae);for(const ke of b)await Td(X.id,ke.file,ke.thumb_b64);return X.id},onSuccess:R=>{f.invalidateQueries({queryKey:["footprints"]}),f.invalidateQueries({queryKey:["timeline"]}),f.invalidateQueries({queryKey:["stats"]}),f.invalidateQueries({queryKey:["footprint"]}),f.invalidateQueries({queryKey:["attachments",R]}),f.invalidateQueries({queryKey:["types"]}),m("success",s?"记录已更新":"记录已创建"),o==null||o(R),r()},onError:R=>q(R.message)}),le=(R,ae)=>p(X=>({...X,[R]:ae})),Ve=Sd({mutationFn:R=>w0(R),onSuccess:()=>void f.invalidateQueries({queryKey:["attachments",s]})}),Fe=R=>R==="organizer"?h.jsx(De,{label:"组织方 / 所在组织",children:h.jsx(nt,{value:d.organizer,onChange:ae=>le("organizer",ae.target.value),placeholder:"如:中国工业与应用数学学会"})},"organizer"):R==="role"?h.jsx(De,{label:"角色",children:h.jsx(ml,{value:d.role,onChange:ae=>le("role",ae.target.value),options:[{value:"",label:"未设置"},...U.role??[]]})},"role"):R==="level"?h.jsx(De,{label:"级别",children:h.jsx(ml,{value:d.level,onChange:ae=>le("level",ae.target.value),options:[{value:"",label:"未设置"},...U.level??[]]})},"level"):R==="award_grade"?h.jsx(De,{label:"奖等",children:h.jsx(ml,{value:d.award_grade,onChange:ae=>le("award_grade",ae.target.value),options:[{value:"",label:"未设置"},...C5.map(ae=>({value:ae,label:ae}))]})},"award_grade"):R==="rank"?h.jsx(De,{label:"名次",children:h.jsx(nt,{type:"number",className:"num",value:d.rank,onChange:ae=>le("rank",ae.target.value),placeholder:"如 2"})},"rank"):null;return h.jsxs(so,{open:n,onClose:r,width:760,title:s?"编辑记录":"新建记录",footer:h.jsxs(h.Fragment,{children:[K&&h.jsx("span",{className:"mr-auto text-[12px] text-danger",children:K}),h.jsx(zt,{variant:"secondary",onClick:r,children:"取消"}),h.jsx(zt,{variant:"primary",onClick:()=>I.mutate(),disabled:I.isPending,children:I.isPending?"保存中…":"保存"})]}),children:[h.jsxs("div",{className:"flex flex-col gap-4",children:[h.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-[200px_1fr] gap-x-3 gap-y-3.5",children:[h.jsx(De,{label:"类型",required:!0,children:h.jsx(ml,{value:d.type_id!=null?String(d.type_id):"",onChange:R=>le("type_id",R.target.value?Number(R.target.value):null),options:[{value:"",label:"请选择"},...(((ie=D.data)==null?void 0:ie.items)??[]).map(R=>({value:String(R.id),label:R.name}))]})}),h.jsx(De,{label:"标题",required:!0,children:h.jsx(nt,{value:d.title,onChange:R=>le("title",R.target.value),placeholder:"事项名称,如:2025 全国大学生数学建模竞赛"})})]}),h.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-x-3 gap-y-3.5",children:[h.jsx(De,{label:"开始日期",children:h.jsx(nt,{type:"date",value:d.start_date,onChange:R=>le("start_date",R.target.value)})}),h.jsx(De,{label:"结束日期",children:h.jsx(nt,{type:"date",value:d.end_date,onChange:R=>le("end_date",R.target.value)})}),h.jsx(De,{label:"状态",children:h.jsx(ml,{value:d.status,onChange:R=>le("status",R.target.value),options:w5})})]}),h.jsxs("div",{className:"border-t border-line pt-4",children:[h.jsxs("div",{className:"mb-3 flex items-center gap-2 text-[12px] font-semibold text-ink-2",children:["类型要素",Y?" · "+Y.name:""]}),h.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-3 gap-y-3.5",children:de.core.map(R=>Fe(R))}),Y&&Y.form_template.length>0&&h.jsxs("div",{className:"mt-3.5",children:[h.jsx("div",{className:"mb-2 text-[11.5px] text-ink-3",children:"专项信息"}),h.jsx(_5,{fields:Y.form_template,value:d.extras,onChange:R=>le("extras",R),taxonomies:U})]})]}),h.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-3 gap-y-3.5 border-t border-line pt-4",children:[h.jsx(De,{label:"工作内容 / 描述",children:h.jsx(Cd,{value:d.description,onChange:R=>le("description",R.target.value),placeholder:"具体做了什么、承担什么分工"})}),h.jsx(De,{label:"结果 / 产出",children:h.jsx(Cd,{value:d.result,onChange:R=>le("result",R.target.value),placeholder:"获奖等级、成果、最终产品等"})})]}),h.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-3 gap-y-3.5 border-t border-line pt-4",children:[h.jsx(De,{label:"标签",children:h.jsx(E5,{value:d.tags,onChange:R=>le("tags",R)})}),h.jsx(De,{label:"成长维度",children:h.jsxs("div",{className:"flex flex-wrap gap-1.5 min-h-8 items-center",children:[(((Ne=Q.data)==null?void 0:Ne.items)??[]).map(R=>{const ae=d.dimension_ids.includes(R.id);return h.jsx("button",{type:"button",className:"rounded-sm border px-2 py-0.5 text-[12px] transition-colors "+(ae?"border-brand bg-brand-subtle text-brand-text":"border-line bg-surface text-ink-2 hover:border-line-strong"),onClick:()=>le("dimension_ids",ae?d.dimension_ids.filter(X=>X!==R.id):[...d.dimension_ids,R.id]),children:R.name},R.id)}),!((re=Q.data)!=null&&re.items.length)&&h.jsx("span",{className:"text-[12px] text-ink-3",children:"尚未配置维度(配置页可添加)"})]})})]}),h.jsxs("details",{className:"border-t border-line pt-4",children:[h.jsx("summary",{className:"cursor-pointer select-none text-[12px] text-ink-3 transition-colors hover:text-ink-2",children:"高级选项(重要度 · 名次 · 性质 · 关联)"}),h.jsxs("div",{className:"mt-3 grid grid-cols-2 sm:grid-cols-4 gap-x-3 gap-y-3.5",children:[h.jsx(De,{label:"重要度",children:h.jsx(ml,{value:d.weight,onChange:R=>le("weight",R.target.value),options:[1,2,3,4,5].map(R=>({value:String(R),label:String(R)}))})}),!de.core.includes("rank")&&h.jsx(De,{label:"名次",children:h.jsx(nt,{type:"number",className:"num",value:d.rank,onChange:R=>le("rank",R.target.value),placeholder:"如 2"})}),h.jsx(De,{label:"性质",children:h.jsx(ml,{value:d.polarity,onChange:R=>le("polarity",R.target.value),options:[{value:"positive",label:"正面"},{value:"negative",label:"负面"}]})}),h.jsx(De,{label:"上级记录",hint:"晋升链",children:h.jsx(ml,{value:d.parent_id,onChange:R=>le("parent_id",R.target.value),options:[{value:"",label:"无"},...(((V=F.data)==null?void 0:V.items)??[]).filter(R=>R.id!==s).map(R=>({value:String(R.id),label:R.title.slice(0,24)}))]})})]}),h.jsx("div",{className:"mt-3 grid grid-cols-1 sm:grid-cols-2 gap-x-3",children:h.jsx(De,{label:"事件组 ID",hint:"同一场事件的多条记录共享",children:h.jsx(nt,{value:d.group_id,onChange:R=>le("group_id",R.target.value),placeholder:"如 g2025001(可选)"})})})]}),s?h.jsxs("div",{className:"border-t border-line pt-4",children:[h.jsx(yg,{items:((ee=J.data)==null?void 0:ee.items)??[],pending:b,uploading:x,onPick:async R=>{if(s){g(!0);try{let ae=0;for(const X of Array.from(R)){if(X.size>bg){m("error","「"+X.name+"」超过 80MB,已跳过");continue}const ke=await pg(X);await Td(s,ke.file,ke.thumb_b64),ae++}ae>0&&(f.invalidateQueries({queryKey:["attachments",s]}),m("success","已上传 "+ae+" 个附件"))}catch(ae){m("error",ae.message)}finally{g(!1)}}},onDeleteSaved:R=>Ve.mutate(R),onDeletePending:()=>{},onOpenSaved:R=>k(R)}),h.jsx("div",{className:"mt-1.5 text-[11px] text-ink-3",children:"点击文件名可在线预览(图片 · PDF · 文本 · Word · Excel · 音视频)· 单个文件不超过 80MB"})]}):h.jsxs("div",{className:"border-t border-line pt-4",children:[h.jsx(yg,{items:[],pending:b,onPick:async R=>{const ae=[];for(const X of Array.from(R)){if(X.size>bg){m("error","「"+X.name+"」超过 80MB,已跳过");continue}ae.push(await pg(X))}v(X=>[...X,...ae])},onDeleteSaved:()=>{},onDeletePending:R=>v(ae=>ae.filter((X,ke)=>ke!==R))}),h.jsx("div",{className:"mt-1.5 text-[11px] text-ink-3",children:"保存记录时将一并上传 · 单个文件不超过 80MB"})]})]}),h.jsx(e1,{att:_,onClose:()=>k(null)})]})}const ki=new Map;function z5({open:n,onClose:r,footprintId:s,onEdit:o}){var U,I,le,Ve,Fe;const f=lu(),m=oo(),d=yl({queryKey:["footprint",s],queryFn:()=>Id(s),enabled:n&&!!s}),p=yl({queryKey:["types"],queryFn:ro,enabled:n}),b=yl({queryKey:["dimensions"],queryFn:Wd,enabled:n}),v=(U=d.data)==null?void 0:U.item,x=(I=p.data)==null?void 0:I.items.find(ie=>ie.id===(v==null?void 0:v.type_id)),g=((v==null?void 0:v.dimensions)??[]).map(ie=>{var Ne,re;return(re=(Ne=b.data)==null?void 0:Ne.items.find(V=>V.id===ie))==null?void 0:re.name}).filter(Boolean),[_,k]=E.useState(!1),[K,q]=E.useState(null),D=Sd({mutationFn:()=>vl(()=>Promise.resolve().then(()=>i_),void 0).then(ie=>ie.footprintDelete(s)),onSuccess:()=>{f.invalidateQueries({queryKey:["footprints"]}),f.invalidateQueries({queryKey:["timeline"]}),f.invalidateQueries({queryKey:["stats"]}),m("success","记录已删除"),k(!1),r()}}),[H,Q]=E.useState({}),Z=(v==null?void 0:v.attachments)??[],J=Z.filter(ie=>{var Ne;return(Ne=ie.mime)==null?void 0:Ne.startsWith("image/")}),Y=Z.filter(ie=>{var Ne;return!((Ne=ie.mime)!=null&&Ne.startsWith("image/"))}),de=Z.map(ie=>ie.id).join(",");E.useEffect(()=>{if(!n||!de)return;let ie=!1;const Ne=Z.filter(re=>{var V;return(V=re.mime)==null?void 0:V.startsWith("image/")});return(async()=>{for(const re of Ne){if(ie)return;if(ki.has(re.id)){Q(V=>({...V,[re.id]:ki.get(re.id)}));continue}if(re.remote_thumb){ki.set(re.id,re.remote_thumb),Q(V=>({...V,[re.id]:re.remote_thumb}));continue}try{if(re.thumb_rel_path){const V=await z0(re.id);if(ie)return;const ee="data:"+(V.mime||"image/webp")+";base64,"+V.data_b64;ki.set(re.id,ee),Q(R=>({...R,[re.id]:ee}))}else{const V=await eo(re.id);if(ie)return;const ee=await t1(V.data_b64,V.mime||"image/png");ki.set(re.id,ee),Q(R=>({...R,[re.id]:ee}))}}catch{try{const V=await eo(re.id);if(ie)return;const ee="data:"+(V.mime||"image/png")+";base64,"+V.data_b64;ki.set(re.id,ee),Q(R=>({...R,[re.id]:ee}))}catch{}}}})(),()=>{ie=!0}},[n,s,de]);const F=[];if(v&&x)for(const ie of x.form_template??[]){const Ne=(v.extras??{})[ie.key];if(Ne==null||Ne==="")continue;const re=Array.isArray(Ne)?Ne.join("、"):String(Ne);F.push({label:ie.label,value:ie.unit?re+" "+ie.unit:re})}return h.jsxs(so,{open:n,onClose:r,width:680,title:"记录详情",footer:v?h.jsxs(h.Fragment,{children:[h.jsxs(zt,{variant:"danger-ghost",className:"mr-auto",onClick:()=>k(!0),disabled:D.isPending,children:[h.jsx(Ed,{size:13})," 删除"]}),h.jsx(zt,{variant:"secondary",onClick:r,children:"关闭"}),h.jsxs(zt,{variant:"primary",onClick:()=>s&&(o==null?void 0:o(s)),children:[h.jsx(XE,{size:13})," 编辑"]})]}):null,children:[d.isLoading||!v?h.jsx("div",{className:"py-10 text-center text-[13px] text-ink-3",children:"加载中…"}):h.jsxs("div",{className:"flex flex-col gap-4",children:[h.jsxs("div",{children:[h.jsx("h2",{className:"text-[20px] font-bold leading-tight tracking-tight text-ink-1",style:{textWrap:"balance"},children:v.title}),h.jsxs("div",{className:"mt-2.5 flex flex-wrap items-center gap-1.5",children:[h.jsx(Ii,{color:v.type_color,className:Gn,children:v.type_name}),h.jsx($0,{level:v.level}),h.jsx(P0,{grade:v.award_grade}),h.jsx(W0,{role:v.role}),h.jsx(F0,{status:v.status}),v.polarity==="negative"&&h.jsx(I0,{}),v.rank!=null&&h.jsxs(Ii,{color:"var(--text-3)",className:Gn,children:["第 ",v.rank," 名"]})]})]}),h.jsx(Hi,{title:"事项要素",children:h.jsxs("div",{className:"grid grid-cols-1 gap-x-4 gap-y-2 rounded-md border border-line bg-surface-2 px-3 py-2.5 text-[12.5px] sm:grid-cols-2",children:[h.jsx(nd,{label:"时间",value:T5(v.start_date,v.end_date)||"—"}),h.jsx(nd,{label:"组织方",value:v.organizer||"—"}),F.map(ie=>h.jsx(nd,{label:ie.label,value:ie.value},ie.label))]})}),(((le=v.attachments)==null?void 0:le.length)??0)>0&&h.jsx(Hi,{title:"附件("+(((Ve=v.attachments)==null?void 0:Ve.length)??0)+")",children:Z.length?h.jsxs("div",{className:"flex flex-col gap-2.5",children:[J.length>0&&h.jsx("div",{className:"grid grid-cols-3 gap-2 sm:grid-cols-4",children:J.map(ie=>h.jsxs("button",{className:"group relative aspect-square overflow-hidden rounded-md border border-line bg-surface-2",onClick:()=>q(ie),title:"点击预览:"+ie.file_name,children:[H[ie.id]?h.jsx("img",{src:H[ie.id],alt:ie.file_name,loading:"lazy",className:"h-full w-full object-cover transition-transform duration-200 group-hover:scale-[1.04]"}):h.jsx("div",{className:"h-full w-full animate-pulse bg-surface-3"}),h.jsx("span",{className:"absolute inset-x-0 bottom-0 truncate bg-gradient-to-t from-black/60 to-transparent px-1.5 pb-1 pt-3 text-[10px] text-white opacity-0 transition-opacity group-hover:opacity-100",children:ie.file_name})]},ie.id))}),Y.length>0&&h.jsx("div",{className:"flex flex-col gap-1",children:Y.map(ie=>h.jsxs("button",{className:"flex items-center gap-2 rounded-md border border-line bg-surface px-2.5 py-2 text-left text-[12.5px] transition-colors hover:border-line-strong",onClick:()=>q(ie),children:[h.jsx(y0,{size:14,className:"shrink-0 text-ink-3"}),h.jsx("span",{className:"truncate text-ink-1",children:ie.file_name}),h.jsx("span",{className:"num ml-auto shrink-0 text-ink-3",children:wd(ie.size)}),h.jsx(Kd,{size:12,className:"shrink-0 text-ink-3"})]},ie.id))}),h.jsx("div",{className:"text-[11px] text-ink-3",children:"点击图片 / 文件可在线预览(图片 · PDF · 文本 · Word · Excel · 音视频)"})]}):h.jsx("p",{className:"text-[12px] text-ink-3",children:"暂无佐证附件"})}),v.description&&h.jsx(Hi,{title:"工作内容 / 描述",children:h.jsx("p",{className:"whitespace-pre-wrap text-[13px] leading-relaxed text-ink-2",children:v.description})}),v.result&&h.jsx(Hi,{title:"结果 / 产出",children:h.jsx("p",{className:"whitespace-pre-wrap rounded-md bg-success-subtle px-3 py-2 text-[13px] leading-relaxed text-success",children:v.result})}),v.metrics&&Object.keys(v.metrics).length>0&&h.jsx(Hi,{title:"量化指标",children:h.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(v.metrics).map(([ie,Ne])=>h.jsxs("span",{className:"num rounded-sm border border-line bg-surface-2 px-2 py-0.5 text-[12px] text-ink-2",children:[ie,": ",h.jsx("span",{className:"font-medium text-ink-1",children:Ne})]},ie))})}),((((Fe=v.tags)==null?void 0:Fe.length)??0)>0||g.length>0)&&h.jsx(Hi,{title:"标签与维度",children:h.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[v.tags.map(ie=>h.jsx("span",{className:"rounded-sm bg-surface-3 px-1.5 py-0.5 text-[12px] text-ink-2",children:ie},ie)),g.map(ie=>h.jsx("span",{className:"rounded-sm border border-brand/30 bg-brand-subtle px-1.5 py-0.5 text-[12px] text-brand-text",children:ie},ie))]})}),h.jsxs("div",{className:"flex flex-wrap gap-x-4 gap-y-1 border-t border-line pt-3 text-[11.5px] text-ink-3",children:[h.jsxs("span",{children:["创建于 ",mg(v.created_at)]}),h.jsxs("span",{children:["更新于 ",mg(v.updated_at)]}),v.group_id&&h.jsxs("span",{children:["事件组 ",v.group_id]}),v.parent_id!=null&&h.jsxs("span",{children:["上级 #",v.parent_id]})]})]}),h.jsx(e1,{att:K,onClose:()=>q(null)}),h.jsx(a5,{open:_,title:"删除记录",content:v?"确定删除「"+v.title+"」吗?该操作不可撤销。":"",onCancel:()=>k(!1),onOk:()=>D.mutate(),loading:D.isPending})]})}function nd({label:n,value:r}){return h.jsxs("div",{className:"grid min-w-0 grid-cols-[76px_1fr] gap-x-2.5",children:[h.jsx("span",{className:"shrink-0 text-right text-ink-3",children:n}),h.jsx("span",{className:"min-w-0 truncate font-medium text-ink-1",title:r,children:r})]})}function Hi({title:n,children:r}){return h.jsxs("div",{children:[h.jsx("div",{className:"mb-1.5 text-[12px] font-semibold text-ink-2",children:n}),r]})}function O5(){var Y,de,F;const[n,r]=E.useState(""),[s,o]=E.useState(""),[f,m]=E.useState(""),[d,p]=E.useState(""),[b,v]=E.useState(null),[x,g]=E.useState(!1),[_,k]=E.useState(null),[K,q]=E.useState(!1),D=yl({queryKey:["types"],queryFn:ro}),H=E.useMemo(()=>({q:n||void 0,types:s?[Number(s)]:void 0,year:f?Number(f):void 0,polarity:d||void 0,sort:"date_desc",page_size:2e3}),[n,s,f,d]),Q=yl({queryKey:["timeline",H],queryFn:()=>N0(H)}),Z=E.useMemo(()=>{var I;const U=new Set;for(const le of((I=Q.data)==null?void 0:I.groups)??[])U.add(le.year);return Array.from(U).sort((le,Ve)=>Ve-le)},[Q.data]),J=U=>{k(U),q(!0)};return h.jsxs("div",{className:"mx-auto max-w-[880px] px-3 py-4 sm:px-6 sm:py-5",children:[h.jsxs("div",{className:"mb-4 flex flex-wrap items-center gap-2",children:[h.jsx(nt,{className:"w-full sm:w-[220px]",placeholder:"搜索足迹…",value:n,onChange:U=>r(U.target.value)}),h.jsxs("div",{className:"grid w-full grid-cols-2 gap-2 sm:flex sm:w-auto sm:items-center sm:gap-2",children:[h.jsx(ml,{className:"w-full sm:w-[130px]",value:s,onChange:U=>o(U.target.value),options:[{value:"",label:"全部类型"},...(((Y=D.data)==null?void 0:Y.items)??[]).map(U=>({value:String(U.id),label:U.name}))]}),h.jsx(ml,{className:"w-full sm:w-[120px]",value:f,onChange:U=>m(U.target.value),options:[{value:"",label:"全部年份"},...Z.map(U=>({value:String(U),label:U+" 年"}))]}),h.jsx(ml,{className:"w-full sm:w-[110px]",value:d,onChange:U=>p(U.target.value),options:[{value:"",label:"全部性质"},{value:"positive",label:"正面"},{value:"negative",label:"负面"}]})]}),h.jsxs("span",{className:"num ml-auto text-[12px] text-ink-3",children:["共 ",((de=Q.data)==null?void 0:de.total)??0," 条"]})]}),Q.isLoading?h.jsx("div",{className:"py-16 text-center text-[13px] text-ink-3",children:"加载中…"}):(F=Q.data)!=null&&F.groups.length?h.jsxs("div",{className:"relative",children:[h.jsx("div",{className:"absolute bottom-0 left-[7px] top-0 w-px bg-line","aria-hidden":!0}),Q.data.groups.map(U=>h.jsxs("section",{className:"mb-2",children:[h.jsxs("div",{className:"sticky top-0 z-10 -mx-3 flex items-center gap-2 bg-bg/90 px-3 py-2 backdrop-blur sm:-mx-6 sm:px-6",children:[h.jsx("span",{className:"num text-[16px] font-semibold text-ink-1",children:U.year}),h.jsxs("span",{className:"text-[12px] text-ink-3",children:[U.count," 条记录"]})]}),U.months.map(I=>h.jsxs("div",{className:"mb-3",children:[h.jsxs("div",{className:"mb-2 pl-6 text-[12px] font-medium text-ink-3",children:[I.month," 月"]}),h.jsx("div",{className:"flex flex-col gap-2",children:I.items.map(le=>h.jsx(R5,{row:le,onClick:()=>J(le.id)},le.id))})]},I.month))]},U.year))]}):h.jsx(e5,{icon:h.jsx(m0,{size:36,strokeWidth:1.5}),title:"暂无足迹",description:"点击右上角「新建记录」,开始记录你的第一段足迹。"}),h.jsx(z5,{open:K,onClose:()=>q(!1),footprintId:_,onEdit:U=>{q(!1),v(U),g(!0)}}),h.jsx(j5,{open:x,onClose:()=>g(!1),footprintId:b})]})}function R5({row:n,onClick:r}){const s=(n.start_date??n.created_at).slice(0,10);return h.jsxs("button",{onClick:r,className:"group relative w-full rounded-lg border border-line bg-surface px-4 py-3 text-left shadow-card transition-all hover:border-line-strong hover:shadow-pop",children:[h.jsx("span",{className:"absolute left-0 top-3 bottom-3 w-[3px] rounded-full",style:{backgroundColor:n.type_color},"aria-hidden":!0}),h.jsxs("div",{className:"flex items-start gap-3",children:[h.jsxs("div",{className:"num w-[52px] shrink-0 pt-0.5 text-[12px] leading-relaxed text-ink-3",children:[s.slice(5,7),"-",s.slice(8,10)]}),h.jsxs("div",{className:"min-w-0 flex-1",children:[h.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[h.jsx("span",{className:"text-[13.5px] font-medium text-ink-1 group-hover:text-brand-text",children:n.title}),h.jsx(Ii,{color:n.type_color,children:n.type_name}),h.jsx($0,{level:n.level}),h.jsx(P0,{grade:n.award_grade}),h.jsx(W0,{role:n.role}),h.jsx(F0,{status:n.status}),n.polarity==="negative"&&h.jsx(I0,{})]}),n.organizer&&h.jsx("div",{className:"mt-0.5 text-[12px] text-ink-3",children:n.organizer}),n.description&&h.jsx("p",{className:"mt-1 line-clamp-2 text-[12.5px] leading-relaxed text-ink-2",children:n.description}),(n.result||n.tags.length>0||n.attachment_count>0)&&h.jsxs("div",{className:"mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11.5px] text-ink-3",children:[n.result&&h.jsxs("span",{className:"text-success",children:["结果:",n.result]}),n.tags.map(o=>h.jsx("span",{className:"rounded-sm bg-surface-3 px-1.5 py-px",children:o},o)),n.attachment_count>0&&h.jsxs("span",{className:"inline-flex items-center gap-1",children:[h.jsx(Kd,{size:11}),n.attachment_count]})]})]}),h.jsx("div",{className:"shrink-0 pt-1 text-ink-3",children:h.jsx(v5,{name:n.type_icon,color:n.type_color,size:16})})]})]})}const A5=E.lazy(()=>vl(()=>import("./RecordsPage-C0AcNVzM.js"),[]).then(n=>({default:n.RecordsPage}))),M5=E.lazy(()=>vl(()=>import("./DashboardPage-DpgwpbHV.js"),__vite__mapDeps([0,1,2,3])).then(n=>({default:n.DashboardPage}))),D5=E.lazy(()=>vl(()=>import("./GradesPage-CVTBUD3I.js"),__vite__mapDeps([4,1,2,3])).then(n=>({default:n.GradesPage}))),U5=E.lazy(()=>vl(()=>import("./TypesPage-BbQujrm2.js"),__vite__mapDeps([5,1])).then(n=>({default:n.TypesPage}))),k5=E.lazy(()=>vl(()=>import("./TaxonomyPage-B1I0kN2Q.js"),__vite__mapDeps([6,1])).then(n=>({default:n.TaxonomyPage}))),H5=E.lazy(()=>vl(()=>import("./AdminPage-Dch0cjFb.js"),__vite__mapDeps([7,1,8])).then(n=>({default:n.AdminPage}))),q5=E.lazy(()=>vl(()=>import("./ProfilePage-ByBFpCNn.js"),[]).then(n=>({default:n.ProfilePage}))),L5=E.lazy(()=>vl(()=>import("./ResumePage-Z8eiwwzo.js"),__vite__mapDeps([9,1,8,10])).then(n=>({default:n.ResumePage}))),B5=E.lazy(()=>vl(()=>import("./AssessmentPage-7AoxKy-P.js"),__vite__mapDeps([11,10])).then(n=>({default:n.AssessmentPage})));function da(){return h.jsx("div",{className:"py-16 text-center text-[13px] text-ink-3",children:"加载中…"})}function Q5(){return h.jsx(dS,{children:h.jsxs(Yt,{element:h.jsx(h5,{}),children:[h.jsx(Yt,{path:"/",element:h.jsx(Vv,{to:"/timeline",replace:!0})}),h.jsx(Yt,{path:"/timeline",element:h.jsx(O5,{})}),h.jsx(Yt,{path:"/records",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(A5,{})})}),h.jsx(Yt,{path:"/grades",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(D5,{})})}),h.jsx(Yt,{path:"/dashboard",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(M5,{})})}),h.jsx(Yt,{path:"/types",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(U5,{})})}),h.jsx(Yt,{path:"/taxonomy",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(k5,{})})}),h.jsx(Yt,{path:"/admin",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(H5,{})})}),h.jsx(Yt,{path:"/profile",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(q5,{})})}),h.jsx(Yt,{path:"/resume",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(L5,{})})}),h.jsx(Yt,{path:"/assessment",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(B5,{})})}),h.jsx(Yt,{path:"*",element:h.jsx(Vv,{to:"/timeline",replace:!0})})]})})}const G5=new b3({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!0,staleTime:0,gcTime:0}}}),xg=localStorage.getItem("fp-theme");(xg==="dark"||!xg&&window.matchMedia("(prefers-color-scheme: dark)").matches)&&document.documentElement.classList.add("dark");function l1(){var r;const n=getComputedStyle(document.documentElement).getPropertyValue("--bg").trim();n&&((r=document.querySelector('meta[name="theme-color"]'))==null||r.setAttribute("content",n))}l1();window.addEventListener("fp-theme-change",l1);"serviceWorker"in navigator&&!("__TAURI_INTERNALS__"in window)&&window.addEventListener("load",()=>{navigator.serviceWorker.register("/sw.js").catch(()=>{})});o2.createRoot(document.getElementById("root")).render(h.jsx(l2.StrictMode,{children:h.jsx(ZS,{client:G5,children:h.jsx(HS,{children:h.jsx(Q5,{})})})}));export{Ol as $,B4 as A,zt as B,a5 as C,H4 as D,e5 as E,q4 as F,P0 as G,so as H,nt as I,De as J,L4 as K,$0 as L,k4 as M,v5 as N,N4 as O,ZE as P,Z5 as Q,W0 as R,ml as S,Ed as T,J5 as U,C4 as V,w4 as W,j4 as X,z4 as Y,O4 as Z,Wd as _,gl as a,pl as a0,g0 as a1,wd as a2,J4 as a3,F4 as a4,$4 as a5,I4 as a6,W4 as a7,P4 as a8,vl as a9,Z4 as aa,K4 as ab,b4 as ac,Cd as ad,n_ as ae,a_ as af,l_ as ag,uE as ah,V5 as ai,Ag as aj,i_ as ak,KS as b,pe as c,oo as d,X5 as e,yl as f,Sd as g,T5 as h,F0 as i,h as j,mg as k,XE as l,Ii as m,z5 as n,j5 as o,R4 as p,ro as q,E as r,E0 as s,A4 as t,lu as u,_0 as v,p0 as w,Q4 as x,G4 as y,t_ as z}; +…(已截断)`:D})}else if(_==="docx"){const H=(await(await vl(()=>import("./mammoth.browser-DbBNylDz.js").then(Q=>Q.m),[])).convertToHtml({arrayBuffer:q.buffer})).value;if(x)return;b({kind:_,html:H})}else if(_==="xlsx"){const D=await vl(()=>import("./xlsx-CbTSpprj.js"),[]),H=D.read(q,{type:"array"}),Q=D.utils.sheet_to_html(H.Sheets[H.SheetNames[0]]);if(x)return;b({kind:_,html:Q})}else{const D=URL.createObjectURL(new Blob([q],{type:K||"application/octet-stream"}));if(x){URL.revokeObjectURL(D);return}g.push(D),b({kind:_,objectUrl:D})}}catch(_){x||d(_.message||"预览加载失败")}finally{x||f(!1)}})(),()=>{x=!0,g.forEach(_=>URL.revokeObjectURL(_))}},[n==null?void 0:n.id,n==null?void 0:n.file_name,n==null?void 0:n.remote_url]);const v=n?dg(n):"other";return h.jsxs(so,{open:!!n,onClose:r,width:v==="image"||v==="pdf"?880:680,title:(n?"附件预览 · "+n.file_name:"附件预览")+(n?"("+S5[v]+")":""),footer:n?h.jsxs(h.Fragment,{children:[h.jsxs(zt,{variant:"secondary",className:"mr-auto",onClick:()=>{(async()=>{try{const{blob:x,file_name:g}=await j0(n.id),_=URL.createObjectURL(x),k=document.createElement("a");k.href=_,k.download=g,k.click(),setTimeout(()=>URL.revokeObjectURL(_),6e4),s("success","已下载:"+g)}catch(x){s("error","下载失败:"+x.message)}})()},children:[h.jsx(uE,{size:13})," 下载"]}),h.jsx(zt,{variant:"primary",onClick:r,children:"关闭"})]}):null,children:[o&&h.jsxs("div",{className:"flex items-center justify-center gap-2 py-16 text-[13px] text-ink-3",children:[h.jsx(CE,{className:"animate-spin",size:16})," 正在加载预览…"]}),!o&&!!m&&h.jsx("div",{className:"py-10 text-center text-[13px] text-danger",children:m}),!o&&!m&&p&&h.jsxs(h.Fragment,{children:[p.kind==="image"&&h.jsx("img",{src:p.objectUrl,alt:n==null?void 0:n.file_name,className:"mx-auto max-h-[72vh] rounded-md"}),p.kind==="pdf"&&h.jsx("iframe",{src:p.objectUrl,title:n==null?void 0:n.file_name,className:"h-[72vh] w-full rounded-md border border-line bg-white"}),p.kind==="audio"&&h.jsx("audio",{controls:!0,src:p.objectUrl,className:"w-full"}),p.kind==="video"&&h.jsx("video",{controls:!0,src:p.objectUrl,className:"max-h-[70vh] w-full rounded-md bg-black"}),p.kind==="text"&&h.jsx("pre",{className:"max-h-[68vh] overflow-auto whitespace-pre-wrap rounded-md bg-surface-2 p-3 text-[12.5px] leading-relaxed text-ink-1",children:p.text}),(p.kind==="docx"||p.kind==="xlsx")&&h.jsx("div",{className:"max-h-[70vh] overflow-auto rounded-md border border-line bg-white p-4 text-[13px] leading-relaxed [&_img]:max-w-full [&_table]:border-collapse [&_td]:border [&_td]:border-line [&_td]:px-2 [&_td]:py-1 [&_th]:border [&_th]:border-line [&_th]:px-2 [&_th]:py-1",dangerouslySetInnerHTML:{__html:p.html||""}}),p.kind==="other"&&h.jsxs("div",{className:"py-10 text-center",children:[h.jsx("p",{className:"text-[13px] text-ink-2",children:"该文件类型暂不支持在线预览"}),h.jsx("p",{className:"mt-1 text-[12px] text-ink-3",children:"请点击左下角「下载」,用本地应用打开"})]})]})]})}function E5({value:n,onChange:r,placeholder:s}){const[o,f]=E.useState(""),m=()=>{const p=o.trim();p&&!n.includes(p)&&r([...n,p]),f("")},d=p=>{p.key==="Enter"||p.key===","?(p.preventDefault(),m()):p.key==="Backspace"&&!o&&n.length&&r(n.slice(0,-1))};return h.jsxs("div",{className:gl("flex min-h-8 w-full flex-wrap items-center gap-1 rounded-md border border-line bg-surface px-1.5 py-1","transition-colors hover:border-line-strong focus-within:border-brand"),children:[n.map(p=>h.jsxs("span",{className:"inline-flex items-center gap-0.5 rounded-sm bg-surface-3 px-1.5 text-[12px] text-ink-2",children:[p,h.jsx("button",{type:"button",className:"text-ink-3 hover:text-ink-1",onClick:()=>r(n.filter(b=>b!==p)),children:h.jsx(g0,{size:11})})]},p)),h.jsx("input",{className:"min-w-[80px] flex-1 border-0 bg-transparent text-[13px] outline-none placeholder:text-ink-3",value:o,placeholder:n.length?"":s??"输入后回车添加",onChange:p=>f(p.target.value),onKeyDown:d,onBlur:m})]})}function hg(n,r){return n.options?Array.isArray(n.options)?n.options.map(s=>({value:s,label:s})):r[n.options.taxonomy]??[]:[]}function _5({fields:n,value:r,onChange:s,taxonomies:o}){if(!n.length)return null;const f=(d,p)=>s({...r,[d]:p}),m=d=>{const p=r[d.key],b=d.required&&(p==null||p==="")?"该项必填":"",v=x=>d.unit?h.jsxs("div",{className:"flex items-center gap-2",children:[x,h.jsx("span",{className:"text-[12px] text-ink-3 shrink-0",children:d.unit})]}):x;switch(d.widget){case"textarea":return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsx(Cd,{value:String(p??""),onChange:x=>f(d.key,x.target.value),placeholder:d.placeholder})},d.key);case"number":return h.jsx(De,{label:d.label,required:d.required,hint:b,children:v(h.jsx(nt,{type:"number",step:"any",className:"num",value:p==null?"":String(p),onChange:x=>f(d.key,x.target.value===""?void 0:Number(x.target.value))}))},d.key);case"date":return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsx(nt,{type:"date",value:String(p??""),onChange:x=>f(d.key,x.target.value)})},d.key);case"select":return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsx(ml,{value:String(p??""),onChange:x=>f(d.key,x.target.value||void 0),options:[{value:"",label:"请选择"},...hg(d,o)]})},d.key);case"multiselect":{const x=hg(d,o),g=Array.isArray(p)?p:[];return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[x.map(_=>{const k=g.includes(_.value);return h.jsx("button",{type:"button",className:"rounded-sm border px-2 py-0.5 text-[12px] transition-colors "+(k?"border-brand bg-brand-subtle text-brand-text":"border-line bg-surface text-ink-2 hover:border-line-strong"),onClick:()=>f(d.key,k?g.filter(K=>K!==_.value):[...g,_.value]),children:_.label},_.value)}),!x.length&&h.jsx("span",{className:"text-[12px] text-ink-3",children:"未配置选项"})]})},d.key)}case"link":return h.jsx(De,{label:d.label,required:d.required,hint:b||"关联记录功能规划中,暂以文本记录",children:h.jsx(nt,{value:String(p??""),onChange:x=>f(d.key,x.target.value),placeholder:d.placeholder})},d.key);default:return h.jsx(De,{label:d.label,required:d.required,hint:b,children:h.jsx(nt,{value:String(p??""),onChange:x=>f(d.key,x.target.value),placeholder:d.placeholder})},d.key)}};return h.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-3 gap-y-3.5",children:n.map(d=>h.jsx("div",{className:d.widget==="textarea"?"sm:col-span-2":"",children:m(d)},d.key))})}function mg(n){return n?n.slice(0,16).replace("T"," "):""}function T5(n,r){const s=n?n.slice(0,10):"",o=r?r.slice(0,10):"";return s&&o?s+" ~ "+o:s?s+(r===""?"":" 起"):o?"至 "+o:""}function wd(n){return n<1024?n+" B":n<1024*1024?(n/1024).toFixed(1)+" KB":(n/1024/1024).toFixed(1)+" MB"}function t1(n,r,s=480,o=.82){return new Promise((f,m)=>{const d=new Image;d.onload=()=>{try{const p=Math.min(1,s/Math.max(d.naturalWidth,d.naturalHeight)),b=Math.max(1,Math.round(d.naturalWidth*p)),v=Math.max(1,Math.round(d.naturalHeight*p)),x=document.createElement("canvas");x.width=b,x.height=v;const g=x.getContext("2d");if(!g)return m(new Error("canvas 不可用"));g.drawImage(d,0,0,b,v),f(x.toDataURL("image/webp",o))}catch(p){m(p instanceof Error?p:new Error(String(p)))}},d.onerror=()=>m(new Error("图片解码失败")),d.src="data:"+r+";base64,"+n})}function yg({items:n,pending:r,onPick:s,onDeleteSaved:o,onDeletePending:f,onOpenSaved:m,uploading:d}){const p=E.useRef(null),b=n.length+r.length;return h.jsxs("div",{className:"rounded-md border border-line bg-surface-2 p-3",children:[h.jsxs("div",{className:"mb-2 flex items-center justify-between",children:[h.jsxs("div",{className:"flex items-center gap-1.5 text-[12px] font-medium text-ink-2",children:[h.jsx(Kd,{size:13}),"附件(",b,")"]}),h.jsx(zt,{size:"sm",variant:"secondary",disabled:d,onClick:()=>{var v;return(v=p.current)==null?void 0:v.click()},children:d?"上传中…":"添加文件"}),h.jsx("input",{ref:p,type:"file",multiple:!0,className:"hidden",onChange:v=>{var x;(x=v.target.files)!=null&&x.length&&s(v.target.files),v.target.value=""}})]}),h.jsxs("div",{className:"flex flex-col gap-1",children:[n.map(v=>h.jsxs("div",{className:"flex items-center gap-2 rounded-sm bg-surface px-2 py-1.5 text-[12px]",children:[h.jsx(y0,{size:13,className:"text-ink-3 shrink-0"}),h.jsx("span",{className:"truncate "+(m?"cursor-pointer text-ink-1 hover:text-brand-text hover:underline":"text-ink-1"),onClick:()=>m==null?void 0:m(v),title:v.file_name,children:v.file_name}),h.jsx("span",{className:"num ml-auto shrink-0 text-ink-3",children:wd(v.size)}),h.jsx("button",{className:"text-ink-3 hover:text-danger shrink-0",onClick:()=>o(v.id),"aria-label":"删除附件",children:h.jsx(Ed,{size:13})})]},"s"+v.id)),r.map((v,x)=>{var g;return h.jsxs("div",{className:"flex items-center gap-2 rounded-sm bg-surface px-2 py-1.5 text-[12px]",children:[(g=v.mime)!=null&&g.startsWith("image/")&&v.preview?h.jsx("img",{src:v.preview,alt:v.file_name,className:"size-7 shrink-0 rounded object-cover"}):h.jsx(gE,{size:13,className:"text-ink-3 shrink-0"}),h.jsx("span",{className:"truncate text-ink-1",children:v.file_name}),h.jsx("span",{className:"text-[11px] text-brand-text",children:"待上传"}),h.jsx("span",{className:"num ml-auto shrink-0 text-ink-3",children:wd(v.size)}),h.jsx("button",{className:"text-ink-3 hover:text-danger shrink-0",onClick:()=>f(x),"aria-label":"移除",children:h.jsx(Ed,{size:13})})]},"p"+x)}),!b&&h.jsx("div",{className:"py-1 text-[12px] text-ink-3",children:"证书扫描件、照片、文档等佐证材料"})]})]})}async function pg(n){var d,p,b,v;let r=n;if(n.type==="image/jpeg"&&n.size>3*1024*1024)try{const x=await createImageBitmap(n),g=Math.min(1,2560/Math.max(x.width,x.height)),_=document.createElement("canvas");_.width=Math.round(x.width*g),_.height=Math.round(x.height*g),(d=_.getContext("2d"))==null||d.drawImage(x,0,0,_.width,_.height);const k=await new Promise(K=>_.toBlob(K,"image/jpeg",.85));k&&k.size{const _=new FileReader;_.onload=()=>x(String(_.result||"")),_.onerror=()=>g(new Error("读取文件失败")),_.readAsDataURL(r)}),o=s.indexOf(","),f=o>=0?s.slice(o+1):s;let m;if((b=n.type)!=null&&b.startsWith("image/")&&!n.type.includes("gif"))try{m=(await t1(f,n.type)).split(",")[1]||void 0}catch{m=void 0}return{file:r,file_name:n.name,mime:r.type||void 0,size:r.size,data_b64:f,thumb_b64:m,preview:(v=n.type)!=null&&v.startsWith("image/")?URL.createObjectURL(n):void 0}}const Ps={竞赛:{core:["level","award_grade","role","organizer"]},科研:{core:["level","role","organizer"]},实习实践:{core:["organizer"]},学生工作:{core:["role","organizer"]},志愿公益:{core:["organizer"]},文体活动:{core:["level","organizer"]},证书技能:{core:["level","organizer"]},荣誉惩处:{core:["award_grade","level","organizer"]},学业:{core:["rank"]}},vg={core:["level","role","award_grade","organizer"]},J5=[{value:"",label:"通用布局(级别/角色/奖等/组织方)"},...Object.keys(Ps).map(n=>({value:n,label:n+"式布局"}))];function N5(n,r){return r&&Ps[r]?Ps[r]:n?Ps[n]??vg:vg}const gg={type_id:null,title:"",organizer:"",start_date:"",end_date:"",status:"draft",role:"",level:"",award_grade:"",rank:"",polarity:"positive",weight:"3",description:"",result:"",tags:[],dimension_ids:[],group_id:"",parent_id:"",extras:{}},C5=["特等奖","一等奖","二等奖","三等奖","优秀奖","无"],bg=80*1024*1024,w5=[{value:"draft",label:"草稿"},{value:"ongoing",label:"进行中"},{value:"submitted",label:"已提交待果"},{value:"finished",label:"已完结"}];function j5({open:n,onClose:r,footprintId:s,onSaved:o}){var ie,Ne,re,V,ee;const f=lu(),m=oo(),[d,p]=E.useState(gg),[b,v]=E.useState([]),[x,g]=E.useState(!1),[_,k]=E.useState(null),[K,q]=E.useState(""),D=yl({queryKey:["types"],queryFn:ro,enabled:n}),H=yl({queryKey:["taxonomy-all"],queryFn:()=>E0(),enabled:n}),Q=yl({queryKey:["dimensions"],queryFn:Wd,enabled:n}),Z=yl({queryKey:["footprint",s],queryFn:()=>Id(s),enabled:n&&!!s}),J=yl({queryKey:["attachments",s],queryFn:()=>C0(s),enabled:n&&!!s}),Y=E.useMemo(()=>{var R;return(R=D.data)==null?void 0:R.items.find(ae=>ae.id===d.type_id)},[D.data,d.type_id]),de=N5(Y==null?void 0:Y.name,Y==null?void 0:Y.profile),F=yl({queryKey:["parent-candidates",d.type_id],queryFn:()=>_0({types:d.type_id?[d.type_id]:void 0,page_size:200,sort:"date_desc"}),enabled:n&&!!d.type_id});E.useEffect(()=>{if(n)if(q(""),v([]),s&&Z.data){const R=Z.data.item;p({type_id:R.type_id,title:R.title,organizer:R.organizer??"",start_date:(R.start_date??"").slice(0,10),end_date:(R.end_date??"").slice(0,10),status:R.status,role:R.role??"",level:R.level??"",award_grade:R.award_grade??"",rank:R.rank!=null?String(R.rank):"",polarity:R.polarity,weight:String(R.weight??3),description:R.description??"",result:R.result??"",tags:R.tags??[],dimension_ids:R.dimensions??[],group_id:R.group_id??"",parent_id:R.parent_id!=null?String(R.parent_id):"",extras:R.extras??{}})}else p(gg)},[n,s,Z.data]);const U=E.useMemo(()=>{var ae,X;const R={};for(const ke of((ae=H.data)==null?void 0:ae.items)??[])(R[X=ke.kind]??(R[X]=[])).push({value:ke.value,label:ke.value});return R},[H.data]),I=Sd({mutationFn:async()=>{if(!d.type_id)throw new Error("请选择记录类型");if(!d.title.trim())throw new Error("请填写标题");const R={};for(const ke of(Y==null?void 0:Y.form_template)??[])if(ke.metric&&ke.widget==="number"){const Nt=d.extras[ke.key];typeof Nt=="number"&&!Number.isNaN(Nt)&&(R[ke.metric]=Nt)}const ae={id:s??void 0,type_id:d.type_id,title:d.title.trim(),organizer:d.organizer||null,start_date:d.start_date||null,end_date:d.end_date||null,status:d.status,role:d.role||null,level:d.level||null,award_grade:d.award_grade&&d.award_grade!=="无"?d.award_grade:null,rank:d.rank?Number(d.rank):null,polarity:d.polarity,description:d.description,result:d.result,tags:d.tags,dimension_ids:d.dimension_ids,group_id:d.group_id||null,parent_id:d.parent_id?Number(d.parent_id):null,weight:Number(d.weight)||3,extras:d.extras,metrics:R},X=await T0(ae);for(const ke of b)await Td(X.id,ke.file,ke.thumb_b64);return X.id},onSuccess:R=>{f.invalidateQueries({queryKey:["footprints"]}),f.invalidateQueries({queryKey:["timeline"]}),f.invalidateQueries({queryKey:["stats"]}),f.invalidateQueries({queryKey:["footprint"]}),f.invalidateQueries({queryKey:["attachments",R]}),f.invalidateQueries({queryKey:["types"]}),m("success",s?"记录已更新":"记录已创建"),o==null||o(R),r()},onError:R=>q(R.message)}),le=(R,ae)=>p(X=>({...X,[R]:ae})),Ve=Sd({mutationFn:R=>w0(R),onSuccess:()=>void f.invalidateQueries({queryKey:["attachments",s]})}),Fe=R=>R==="organizer"?h.jsx(De,{label:"组织方 / 所在组织",children:h.jsx(nt,{value:d.organizer,onChange:ae=>le("organizer",ae.target.value),placeholder:"如:中国工业与应用数学学会"})},"organizer"):R==="role"?h.jsx(De,{label:"角色",children:h.jsx(ml,{value:d.role,onChange:ae=>le("role",ae.target.value),options:[{value:"",label:"未设置"},...U.role??[]]})},"role"):R==="level"?h.jsx(De,{label:"级别",children:h.jsx(ml,{value:d.level,onChange:ae=>le("level",ae.target.value),options:[{value:"",label:"未设置"},...U.level??[]]})},"level"):R==="award_grade"?h.jsx(De,{label:"奖等",children:h.jsx(ml,{value:d.award_grade,onChange:ae=>le("award_grade",ae.target.value),options:[{value:"",label:"未设置"},...C5.map(ae=>({value:ae,label:ae}))]})},"award_grade"):R==="rank"?h.jsx(De,{label:"名次",children:h.jsx(nt,{type:"number",className:"num",value:d.rank,onChange:ae=>le("rank",ae.target.value),placeholder:"如 2"})},"rank"):null;return h.jsxs(so,{open:n,onClose:r,width:760,title:s?"编辑记录":"新建记录",footer:h.jsxs(h.Fragment,{children:[K&&h.jsx("span",{className:"mr-auto text-[12px] text-danger",children:K}),h.jsx(zt,{variant:"secondary",onClick:r,children:"取消"}),h.jsx(zt,{variant:"primary",onClick:()=>I.mutate(),disabled:I.isPending,children:I.isPending?"保存中…":"保存"})]}),children:[h.jsxs("div",{className:"flex flex-col gap-4",children:[h.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-[200px_1fr] gap-x-3 gap-y-3.5",children:[h.jsx(De,{label:"类型",required:!0,children:h.jsx(ml,{value:d.type_id!=null?String(d.type_id):"",onChange:R=>le("type_id",R.target.value?Number(R.target.value):null),options:[{value:"",label:"请选择"},...(((ie=D.data)==null?void 0:ie.items)??[]).map(R=>({value:String(R.id),label:R.name}))]})}),h.jsx(De,{label:"标题",required:!0,children:h.jsx(nt,{value:d.title,onChange:R=>le("title",R.target.value),placeholder:"事项名称,如:2025 全国大学生数学建模竞赛"})})]}),h.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-x-3 gap-y-3.5",children:[h.jsx(De,{label:"开始日期",children:h.jsx(nt,{type:"date",value:d.start_date,onChange:R=>le("start_date",R.target.value)})}),h.jsx(De,{label:"结束日期",children:h.jsx(nt,{type:"date",value:d.end_date,onChange:R=>le("end_date",R.target.value)})}),h.jsx(De,{label:"状态",children:h.jsx(ml,{value:d.status,onChange:R=>le("status",R.target.value),options:w5})})]}),h.jsxs("div",{className:"border-t border-line pt-4",children:[h.jsxs("div",{className:"mb-3 flex items-center gap-2 text-[12px] font-semibold text-ink-2",children:["类型要素",Y?" · "+Y.name:""]}),h.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-3 gap-y-3.5",children:de.core.map(R=>Fe(R))}),Y&&Y.form_template.length>0&&h.jsxs("div",{className:"mt-3.5",children:[h.jsx("div",{className:"mb-2 text-[11.5px] text-ink-3",children:"专项信息"}),h.jsx(_5,{fields:Y.form_template,value:d.extras,onChange:R=>le("extras",R),taxonomies:U})]})]}),h.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-3 gap-y-3.5 border-t border-line pt-4",children:[h.jsx(De,{label:"工作内容 / 描述",children:h.jsx(Cd,{value:d.description,onChange:R=>le("description",R.target.value),placeholder:"具体做了什么、承担什么分工"})}),h.jsx(De,{label:"结果 / 产出",children:h.jsx(Cd,{value:d.result,onChange:R=>le("result",R.target.value),placeholder:"获奖等级、成果、最终产品等"})})]}),h.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-3 gap-y-3.5 border-t border-line pt-4",children:[h.jsx(De,{label:"标签",children:h.jsx(E5,{value:d.tags,onChange:R=>le("tags",R)})}),h.jsx(De,{label:"成长维度",children:h.jsxs("div",{className:"flex flex-wrap gap-1.5 min-h-8 items-center",children:[(((Ne=Q.data)==null?void 0:Ne.items)??[]).map(R=>{const ae=d.dimension_ids.includes(R.id);return h.jsx("button",{type:"button",className:"rounded-sm border px-2 py-0.5 text-[12px] transition-colors "+(ae?"border-brand bg-brand-subtle text-brand-text":"border-line bg-surface text-ink-2 hover:border-line-strong"),onClick:()=>le("dimension_ids",ae?d.dimension_ids.filter(X=>X!==R.id):[...d.dimension_ids,R.id]),children:R.name},R.id)}),!((re=Q.data)!=null&&re.items.length)&&h.jsx("span",{className:"text-[12px] text-ink-3",children:"尚未配置维度(配置页可添加)"})]})})]}),h.jsxs("details",{className:"border-t border-line pt-4",children:[h.jsx("summary",{className:"cursor-pointer select-none text-[12px] text-ink-3 transition-colors hover:text-ink-2",children:"高级选项(重要度 · 名次 · 性质 · 关联)"}),h.jsxs("div",{className:"mt-3 grid grid-cols-2 sm:grid-cols-4 gap-x-3 gap-y-3.5",children:[h.jsx(De,{label:"重要度",children:h.jsx(ml,{value:d.weight,onChange:R=>le("weight",R.target.value),options:[1,2,3,4,5].map(R=>({value:String(R),label:String(R)}))})}),!de.core.includes("rank")&&h.jsx(De,{label:"名次",children:h.jsx(nt,{type:"number",className:"num",value:d.rank,onChange:R=>le("rank",R.target.value),placeholder:"如 2"})}),h.jsx(De,{label:"性质",children:h.jsx(ml,{value:d.polarity,onChange:R=>le("polarity",R.target.value),options:[{value:"positive",label:"正面"},{value:"negative",label:"负面"}]})}),h.jsx(De,{label:"上级记录",hint:"晋升链",children:h.jsx(ml,{value:d.parent_id,onChange:R=>le("parent_id",R.target.value),options:[{value:"",label:"无"},...(((V=F.data)==null?void 0:V.items)??[]).filter(R=>R.id!==s).map(R=>({value:String(R.id),label:R.title.slice(0,24)}))]})})]}),h.jsx("div",{className:"mt-3 grid grid-cols-1 sm:grid-cols-2 gap-x-3",children:h.jsx(De,{label:"事件组 ID",hint:"同一场事件的多条记录共享",children:h.jsx(nt,{value:d.group_id,onChange:R=>le("group_id",R.target.value),placeholder:"如 g2025001(可选)"})})})]}),s?h.jsxs("div",{className:"border-t border-line pt-4",children:[h.jsx(yg,{items:((ee=J.data)==null?void 0:ee.items)??[],pending:b,uploading:x,onPick:async R=>{if(s){g(!0);try{let ae=0;for(const X of Array.from(R)){if(X.size>bg){m("error","「"+X.name+"」超过 80MB,已跳过");continue}const ke=await pg(X);await Td(s,ke.file,ke.thumb_b64),ae++}ae>0&&(f.invalidateQueries({queryKey:["attachments",s]}),m("success","已上传 "+ae+" 个附件"))}catch(ae){m("error",ae.message)}finally{g(!1)}}},onDeleteSaved:R=>Ve.mutate(R),onDeletePending:()=>{},onOpenSaved:R=>k(R)}),h.jsx("div",{className:"mt-1.5 text-[11px] text-ink-3",children:"点击文件名可在线预览(图片 · PDF · 文本 · Word · Excel · 音视频)· 单个文件不超过 80MB"})]}):h.jsxs("div",{className:"border-t border-line pt-4",children:[h.jsx(yg,{items:[],pending:b,onPick:async R=>{const ae=[];for(const X of Array.from(R)){if(X.size>bg){m("error","「"+X.name+"」超过 80MB,已跳过");continue}ae.push(await pg(X))}v(X=>[...X,...ae])},onDeleteSaved:()=>{},onDeletePending:R=>v(ae=>ae.filter((X,ke)=>ke!==R))}),h.jsx("div",{className:"mt-1.5 text-[11px] text-ink-3",children:"保存记录时将一并上传 · 单个文件不超过 80MB"})]})]}),h.jsx(e1,{att:_,onClose:()=>k(null)})]})}const ki=new Map;function z5({open:n,onClose:r,footprintId:s,onEdit:o}){var U,I,le,Ve,Fe;const f=lu(),m=oo(),d=yl({queryKey:["footprint",s],queryFn:()=>Id(s),enabled:n&&!!s}),p=yl({queryKey:["types"],queryFn:ro,enabled:n}),b=yl({queryKey:["dimensions"],queryFn:Wd,enabled:n}),v=(U=d.data)==null?void 0:U.item,x=(I=p.data)==null?void 0:I.items.find(ie=>ie.id===(v==null?void 0:v.type_id)),g=((v==null?void 0:v.dimensions)??[]).map(ie=>{var Ne,re;return(re=(Ne=b.data)==null?void 0:Ne.items.find(V=>V.id===ie))==null?void 0:re.name}).filter(Boolean),[_,k]=E.useState(!1),[K,q]=E.useState(null),D=Sd({mutationFn:()=>vl(()=>Promise.resolve().then(()=>i_),void 0).then(ie=>ie.footprintDelete(s)),onSuccess:()=>{f.invalidateQueries({queryKey:["footprints"]}),f.invalidateQueries({queryKey:["timeline"]}),f.invalidateQueries({queryKey:["stats"]}),m("success","记录已删除"),k(!1),r()}}),[H,Q]=E.useState({}),Z=(v==null?void 0:v.attachments)??[],J=Z.filter(ie=>{var Ne;return(Ne=ie.mime)==null?void 0:Ne.startsWith("image/")}),Y=Z.filter(ie=>{var Ne;return!((Ne=ie.mime)!=null&&Ne.startsWith("image/"))}),de=Z.map(ie=>ie.id).join(",");E.useEffect(()=>{if(!n||!de)return;let ie=!1;const Ne=Z.filter(re=>{var V;return(V=re.mime)==null?void 0:V.startsWith("image/")});return(async()=>{for(const re of Ne){if(ie)return;if(ki.has(re.id)){Q(V=>({...V,[re.id]:ki.get(re.id)}));continue}if(re.remote_thumb){ki.set(re.id,re.remote_thumb),Q(V=>({...V,[re.id]:re.remote_thumb}));continue}try{if(re.thumb_rel_path){const V=await z0(re.id);if(ie)return;const ee="data:"+(V.mime||"image/webp")+";base64,"+V.data_b64;ki.set(re.id,ee),Q(R=>({...R,[re.id]:ee}))}else{const V=await eo(re.id);if(ie)return;const ee=await t1(V.data_b64,V.mime||"image/png");ki.set(re.id,ee),Q(R=>({...R,[re.id]:ee}))}}catch{try{const V=await eo(re.id);if(ie)return;const ee="data:"+(V.mime||"image/png")+";base64,"+V.data_b64;ki.set(re.id,ee),Q(R=>({...R,[re.id]:ee}))}catch{}}}})(),()=>{ie=!0}},[n,s,de]);const F=[];if(v&&x)for(const ie of x.form_template??[]){const Ne=(v.extras??{})[ie.key];if(Ne==null||Ne==="")continue;const re=Array.isArray(Ne)?Ne.join("、"):String(Ne);F.push({label:ie.label,value:ie.unit?re+" "+ie.unit:re})}return h.jsxs(so,{open:n,onClose:r,width:680,title:"记录详情",footer:v?h.jsxs(h.Fragment,{children:[h.jsxs(zt,{variant:"danger-ghost",className:"mr-auto",onClick:()=>k(!0),disabled:D.isPending,children:[h.jsx(Ed,{size:13})," 删除"]}),h.jsx(zt,{variant:"secondary",onClick:r,children:"关闭"}),h.jsxs(zt,{variant:"primary",onClick:()=>s&&(o==null?void 0:o(s)),children:[h.jsx(XE,{size:13})," 编辑"]})]}):null,children:[d.isLoading||!v?h.jsx("div",{className:"py-10 text-center text-[13px] text-ink-3",children:"加载中…"}):h.jsxs("div",{className:"flex flex-col gap-4",children:[h.jsxs("div",{children:[h.jsx("h2",{className:"text-[20px] font-bold leading-tight tracking-tight text-ink-1",style:{textWrap:"balance"},children:v.title}),h.jsxs("div",{className:"mt-2.5 flex flex-wrap items-center gap-1.5",children:[h.jsx(Ii,{color:v.type_color,className:Gn,children:v.type_name}),h.jsx($0,{level:v.level}),h.jsx(P0,{grade:v.award_grade}),h.jsx(W0,{role:v.role}),h.jsx(F0,{status:v.status}),v.polarity==="negative"&&h.jsx(I0,{}),v.rank!=null&&h.jsxs(Ii,{color:"var(--text-3)",className:Gn,children:["第 ",v.rank," 名"]})]})]}),h.jsx(Hi,{title:"事项要素",children:h.jsxs("div",{className:"grid grid-cols-1 gap-x-4 gap-y-2 rounded-md border border-line bg-surface-2 px-3 py-2.5 text-[12.5px] sm:grid-cols-2",children:[h.jsx(nd,{label:"时间",value:T5(v.start_date,v.end_date)||"—"}),h.jsx(nd,{label:"组织方",value:v.organizer||"—"}),F.map(ie=>h.jsx(nd,{label:ie.label,value:ie.value},ie.label))]})}),(((le=v.attachments)==null?void 0:le.length)??0)>0&&h.jsx(Hi,{title:"附件("+(((Ve=v.attachments)==null?void 0:Ve.length)??0)+")",children:Z.length?h.jsxs("div",{className:"flex flex-col gap-2.5",children:[J.length>0&&h.jsx("div",{className:"grid grid-cols-3 gap-2 sm:grid-cols-4",children:J.map(ie=>h.jsxs("button",{className:"group relative aspect-square overflow-hidden rounded-md border border-line bg-surface-2",onClick:()=>q(ie),title:"点击预览:"+ie.file_name,children:[H[ie.id]?h.jsx("img",{src:H[ie.id],alt:ie.file_name,loading:"lazy",className:"h-full w-full object-cover transition-transform duration-200 group-hover:scale-[1.04]"}):h.jsx("div",{className:"h-full w-full animate-pulse bg-surface-3"}),h.jsx("span",{className:"absolute inset-x-0 bottom-0 truncate bg-gradient-to-t from-black/60 to-transparent px-1.5 pb-1 pt-3 text-[10px] text-white opacity-0 transition-opacity group-hover:opacity-100",children:ie.file_name})]},ie.id))}),Y.length>0&&h.jsx("div",{className:"flex flex-col gap-1",children:Y.map(ie=>h.jsxs("button",{className:"flex items-center gap-2 rounded-md border border-line bg-surface px-2.5 py-2 text-left text-[12.5px] transition-colors hover:border-line-strong",onClick:()=>q(ie),children:[h.jsx(y0,{size:14,className:"shrink-0 text-ink-3"}),h.jsx("span",{className:"truncate text-ink-1",children:ie.file_name}),h.jsx("span",{className:"num ml-auto shrink-0 text-ink-3",children:wd(ie.size)}),h.jsx(Kd,{size:12,className:"shrink-0 text-ink-3"})]},ie.id))}),h.jsx("div",{className:"text-[11px] text-ink-3",children:"点击图片 / 文件可在线预览(图片 · PDF · 文本 · Word · Excel · 音视频)"})]}):h.jsx("p",{className:"text-[12px] text-ink-3",children:"暂无佐证附件"})}),v.description&&h.jsx(Hi,{title:"工作内容 / 描述",children:h.jsx("p",{className:"whitespace-pre-wrap text-[13px] leading-relaxed text-ink-2",children:v.description})}),v.result&&h.jsx(Hi,{title:"结果 / 产出",children:h.jsx("p",{className:"whitespace-pre-wrap rounded-md bg-success-subtle px-3 py-2 text-[13px] leading-relaxed text-success",children:v.result})}),v.metrics&&Object.keys(v.metrics).length>0&&h.jsx(Hi,{title:"量化指标",children:h.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(v.metrics).map(([ie,Ne])=>h.jsxs("span",{className:"num rounded-sm border border-line bg-surface-2 px-2 py-0.5 text-[12px] text-ink-2",children:[ie,": ",h.jsx("span",{className:"font-medium text-ink-1",children:Ne})]},ie))})}),((((Fe=v.tags)==null?void 0:Fe.length)??0)>0||g.length>0)&&h.jsx(Hi,{title:"标签与维度",children:h.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[v.tags.map(ie=>h.jsx("span",{className:"rounded-sm bg-surface-3 px-1.5 py-0.5 text-[12px] text-ink-2",children:ie},ie)),g.map(ie=>h.jsx("span",{className:"rounded-sm border border-brand/30 bg-brand-subtle px-1.5 py-0.5 text-[12px] text-brand-text",children:ie},ie))]})}),h.jsxs("div",{className:"flex flex-wrap gap-x-4 gap-y-1 border-t border-line pt-3 text-[11.5px] text-ink-3",children:[h.jsxs("span",{children:["创建于 ",mg(v.created_at)]}),h.jsxs("span",{children:["更新于 ",mg(v.updated_at)]}),v.group_id&&h.jsxs("span",{children:["事件组 ",v.group_id]}),v.parent_id!=null&&h.jsxs("span",{children:["上级 #",v.parent_id]})]})]}),h.jsx(e1,{att:K,onClose:()=>q(null)}),h.jsx(a5,{open:_,title:"删除记录",content:v?"确定删除「"+v.title+"」吗?该操作不可撤销。":"",onCancel:()=>k(!1),onOk:()=>D.mutate(),loading:D.isPending})]})}function nd({label:n,value:r}){return h.jsxs("div",{className:"grid min-w-0 grid-cols-[76px_1fr] gap-x-2.5",children:[h.jsx("span",{className:"shrink-0 text-right text-ink-3",children:n}),h.jsx("span",{className:"min-w-0 truncate font-medium text-ink-1",title:r,children:r})]})}function Hi({title:n,children:r}){return h.jsxs("div",{children:[h.jsx("div",{className:"mb-1.5 text-[12px] font-semibold text-ink-2",children:n}),r]})}function O5(){var Y,de,F;const[n,r]=E.useState(""),[s,o]=E.useState(""),[f,m]=E.useState(""),[d,p]=E.useState(""),[b,v]=E.useState(null),[x,g]=E.useState(!1),[_,k]=E.useState(null),[K,q]=E.useState(!1),D=yl({queryKey:["types"],queryFn:ro}),H=E.useMemo(()=>({q:n||void 0,types:s?[Number(s)]:void 0,year:f?Number(f):void 0,polarity:d||void 0,sort:"date_desc",page_size:2e3}),[n,s,f,d]),Q=yl({queryKey:["timeline",H],queryFn:()=>N0(H)}),Z=E.useMemo(()=>{var I;const U=new Set;for(const le of((I=Q.data)==null?void 0:I.groups)??[])U.add(le.year);return Array.from(U).sort((le,Ve)=>Ve-le)},[Q.data]),J=U=>{k(U),q(!0)};return h.jsxs("div",{className:"mx-auto max-w-[880px] px-3 py-4 sm:px-6 sm:py-5",children:[h.jsxs("div",{className:"mb-4 flex flex-wrap items-center gap-2",children:[h.jsx(nt,{className:"w-full sm:w-[220px]",placeholder:"搜索足迹…",value:n,onChange:U=>r(U.target.value)}),h.jsxs("div",{className:"grid w-full grid-cols-2 gap-2 sm:flex sm:w-auto sm:items-center sm:gap-2",children:[h.jsx(ml,{className:"w-full sm:w-[130px]",value:s,onChange:U=>o(U.target.value),options:[{value:"",label:"全部类型"},...(((Y=D.data)==null?void 0:Y.items)??[]).map(U=>({value:String(U.id),label:U.name}))]}),h.jsx(ml,{className:"w-full sm:w-[120px]",value:f,onChange:U=>m(U.target.value),options:[{value:"",label:"全部年份"},...Z.map(U=>({value:String(U),label:U+" 年"}))]}),h.jsx(ml,{className:"w-full sm:w-[110px]",value:d,onChange:U=>p(U.target.value),options:[{value:"",label:"全部性质"},{value:"positive",label:"正面"},{value:"negative",label:"负面"}]})]}),h.jsxs("span",{className:"num ml-auto text-[12px] text-ink-3",children:["共 ",((de=Q.data)==null?void 0:de.total)??0," 条"]})]}),Q.isLoading?h.jsx("div",{className:"py-16 text-center text-[13px] text-ink-3",children:"加载中…"}):(F=Q.data)!=null&&F.groups.length?h.jsxs("div",{className:"relative",children:[h.jsx("div",{className:"absolute bottom-0 left-[7px] top-0 w-px bg-line","aria-hidden":!0}),Q.data.groups.map(U=>h.jsxs("section",{className:"mb-2",children:[h.jsxs("div",{className:"sticky top-0 z-10 -mx-3 flex items-center gap-2 bg-bg/90 px-3 py-2 backdrop-blur sm:-mx-6 sm:px-6",children:[h.jsx("span",{className:"num text-[16px] font-semibold text-ink-1",children:U.year}),h.jsxs("span",{className:"text-[12px] text-ink-3",children:[U.count," 条记录"]})]}),U.months.map(I=>h.jsxs("div",{className:"mb-3",children:[h.jsxs("div",{className:"mb-2 pl-6 text-[12px] font-medium text-ink-3",children:[I.month," 月"]}),h.jsx("div",{className:"flex flex-col gap-2",children:I.items.map(le=>h.jsx(R5,{row:le,onClick:()=>J(le.id)},le.id))})]},I.month))]},U.year))]}):h.jsx(e5,{icon:h.jsx(m0,{size:36,strokeWidth:1.5}),title:"暂无足迹",description:"点击右上角「新建记录」,开始记录你的第一段足迹。"}),h.jsx(z5,{open:K,onClose:()=>q(!1),footprintId:_,onEdit:U=>{q(!1),v(U),g(!0)}}),h.jsx(j5,{open:x,onClose:()=>g(!1),footprintId:b})]})}function R5({row:n,onClick:r}){const s=(n.start_date??n.created_at).slice(0,10);return h.jsxs("button",{onClick:r,className:"group relative w-full rounded-lg border border-line bg-surface px-4 py-3 text-left shadow-card transition-all hover:border-line-strong hover:shadow-pop",children:[h.jsx("span",{className:"absolute left-0 top-3 bottom-3 w-[3px] rounded-full",style:{backgroundColor:n.type_color},"aria-hidden":!0}),h.jsxs("div",{className:"flex items-start gap-3",children:[h.jsxs("div",{className:"num w-[52px] shrink-0 pt-0.5 text-[12px] leading-relaxed text-ink-3",children:[s.slice(5,7),"-",s.slice(8,10)]}),h.jsxs("div",{className:"min-w-0 flex-1",children:[h.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[h.jsx("span",{className:"text-[13.5px] font-medium text-ink-1 group-hover:text-brand-text",children:n.title}),h.jsx(Ii,{color:n.type_color,children:n.type_name}),h.jsx($0,{level:n.level}),h.jsx(P0,{grade:n.award_grade}),h.jsx(W0,{role:n.role}),h.jsx(F0,{status:n.status}),n.polarity==="negative"&&h.jsx(I0,{})]}),n.organizer&&h.jsx("div",{className:"mt-0.5 text-[12px] text-ink-3",children:n.organizer}),n.description&&h.jsx("p",{className:"mt-1 line-clamp-2 text-[12.5px] leading-relaxed text-ink-2",children:n.description}),(n.result||n.tags.length>0||n.attachment_count>0)&&h.jsxs("div",{className:"mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11.5px] text-ink-3",children:[n.result&&h.jsxs("span",{className:"text-success",children:["结果:",n.result]}),n.tags.map(o=>h.jsx("span",{className:"rounded-sm bg-surface-3 px-1.5 py-px",children:o},o)),n.attachment_count>0&&h.jsxs("span",{className:"inline-flex items-center gap-1",children:[h.jsx(Kd,{size:11}),n.attachment_count]})]})]}),h.jsx("div",{className:"shrink-0 pt-1 text-ink-3",children:h.jsx(v5,{name:n.type_icon,color:n.type_color,size:16})})]})]})}const A5=E.lazy(()=>vl(()=>import("./RecordsPage-A-isVkg3.js"),[]).then(n=>({default:n.RecordsPage}))),M5=E.lazy(()=>vl(()=>import("./DashboardPage-B2FldowF.js"),__vite__mapDeps([0,1,2,3])).then(n=>({default:n.DashboardPage}))),D5=E.lazy(()=>vl(()=>import("./GradesPage-JJ6n0CJZ.js"),__vite__mapDeps([4,1,2,3])).then(n=>({default:n.GradesPage}))),U5=E.lazy(()=>vl(()=>import("./TypesPage-DPbRIcZM.js"),__vite__mapDeps([5,1])).then(n=>({default:n.TypesPage}))),k5=E.lazy(()=>vl(()=>import("./TaxonomyPage-DfBe5HxB.js"),__vite__mapDeps([6,1])).then(n=>({default:n.TaxonomyPage}))),H5=E.lazy(()=>vl(()=>import("./AdminPage-C5wOCwKf.js"),__vite__mapDeps([7,1,8])).then(n=>({default:n.AdminPage}))),q5=E.lazy(()=>vl(()=>import("./ProfilePage-CNbjDB4w.js"),[]).then(n=>({default:n.ProfilePage}))),L5=E.lazy(()=>vl(()=>import("./ResumePage-CsGwAj0V.js"),__vite__mapDeps([9,1,8,10])).then(n=>({default:n.ResumePage}))),B5=E.lazy(()=>vl(()=>import("./AssessmentPage-Dvd34CqC.js"),__vite__mapDeps([11,10])).then(n=>({default:n.AssessmentPage})));function da(){return h.jsx("div",{className:"py-16 text-center text-[13px] text-ink-3",children:"加载中…"})}function Q5(){return h.jsx(dS,{children:h.jsxs(Yt,{element:h.jsx(h5,{}),children:[h.jsx(Yt,{path:"/",element:h.jsx(Vv,{to:"/timeline",replace:!0})}),h.jsx(Yt,{path:"/timeline",element:h.jsx(O5,{})}),h.jsx(Yt,{path:"/records",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(A5,{})})}),h.jsx(Yt,{path:"/grades",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(D5,{})})}),h.jsx(Yt,{path:"/dashboard",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(M5,{})})}),h.jsx(Yt,{path:"/types",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(U5,{})})}),h.jsx(Yt,{path:"/taxonomy",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(k5,{})})}),h.jsx(Yt,{path:"/admin",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(H5,{})})}),h.jsx(Yt,{path:"/profile",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(q5,{})})}),h.jsx(Yt,{path:"/resume",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(L5,{})})}),h.jsx(Yt,{path:"/assessment",element:h.jsx(E.Suspense,{fallback:h.jsx(da,{}),children:h.jsx(B5,{})})}),h.jsx(Yt,{path:"*",element:h.jsx(Vv,{to:"/timeline",replace:!0})})]})})}const G5=new b3({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!0,staleTime:0,gcTime:0}}}),xg=localStorage.getItem("fp-theme");(xg==="dark"||!xg&&window.matchMedia("(prefers-color-scheme: dark)").matches)&&document.documentElement.classList.add("dark");function l1(){var r;const n=getComputedStyle(document.documentElement).getPropertyValue("--bg").trim();n&&((r=document.querySelector('meta[name="theme-color"]'))==null||r.setAttribute("content",n))}l1();window.addEventListener("fp-theme-change",l1);"serviceWorker"in navigator&&!("__TAURI_INTERNALS__"in window)&&window.addEventListener("load",()=>{navigator.serviceWorker.register("/sw.js").catch(()=>{})});o2.createRoot(document.getElementById("root")).render(h.jsx(l2.StrictMode,{children:h.jsx(ZS,{client:G5,children:h.jsx(HS,{children:h.jsx(Q5,{})})})}));export{Ol as $,B4 as A,zt as B,a5 as C,H4 as D,e5 as E,q4 as F,P0 as G,so as H,nt as I,De as J,L4 as K,$0 as L,k4 as M,v5 as N,N4 as O,ZE as P,Z5 as Q,W0 as R,ml as S,Ed as T,J5 as U,C4 as V,w4 as W,j4 as X,z4 as Y,O4 as Z,Wd as _,gl as a,pl as a0,g0 as a1,wd as a2,J4 as a3,F4 as a4,$4 as a5,I4 as a6,W4 as a7,P4 as a8,vl as a9,Z4 as aa,K4 as ab,b4 as ac,Cd as ad,n_ as ae,a_ as af,l_ as ag,uE as ah,C0 as ai,z0 as aj,V5 as ak,Ag as al,i_ as am,KS as b,pe as c,oo as d,X5 as e,yl as f,Sd as g,T5 as h,F0 as i,h as j,mg as k,XE as l,Ii as m,z5 as n,j5 as o,R4 as p,ro as q,E as r,E0 as s,A4 as t,lu as u,_0 as v,p0 as w,Q4 as x,G4 as y,t_ as z}; diff --git a/sync-server/www/assets/mammoth.browser-BD-Y_aNE.js b/sync-server/www/assets/mammoth.browser-DbBNylDz.js similarity index 99% rename from sync-server/www/assets/mammoth.browser-BD-Y_aNE.js rename to sync-server/www/assets/mammoth.browser-DbBNylDz.js index cda9f37..8663c6b 100644 --- a/sync-server/www/assets/mammoth.browser-BD-Y_aNE.js +++ b/sync-server/www/assets/mammoth.browser-DbBNylDz.js @@ -1,4 +1,4 @@ -import{ai as dt,aj as mn}from"./index-DYhSDydL.js";function vn(ut,Et){for(var P=0;Poe[R]})}}}return Object.freeze(Object.defineProperty(ut,Symbol.toStringTag,{value:"Module"}))}function bt(ut){throw new Error('Could not dynamically require "'+ut+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Xt={exports:{}},hr;function yn(){return hr||(hr=1,(function(ut,Et){(function(P){ut.exports=P()})(function(){return(function P(oe,R,M){function E(p,u){if(!R[p]){if(!oe[p]){var i=typeof bt=="function"&&bt;if(!u&&i)return i(p,!0);if(a)return a(p,!0);var e=new Error("Cannot find module '"+p+"'");throw e.code="MODULE_NOT_FOUND",e}var s=R[p]={exports:{}};oe[p][0].call(s.exports,function(d){var y=oe[p][1][d];return E(y||d)},s,s.exports,P,oe,R,M)}return R[p].exports}for(var a=typeof bt=="function"&&bt,g=0;goe[R]})}}}return Object.freeze(Object.defineProperty(ut,Symbol.toStringTag,{value:"Module"}))}function bt(ut){throw new Error('Could not dynamically require "'+ut+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Xt={exports:{}},hr;function yn(){return hr||(hr=1,(function(ut,Et){(function(P){ut.exports=P()})(function(){return(function P(oe,R,M){function E(p,u){if(!R[p]){if(!oe[p]){var i=typeof bt=="function"&&bt;if(!u&&i)return i(p,!0);if(a)return a(p,!0);var e=new Error("Cannot find module '"+p+"'");throw e.code="MODULE_NOT_FOUND",e}var s=R[p]={exports:{}};oe[p][0].call(s.exports,function(d){var y=oe[p][1][d];return E(y||d)},s,s.exports,P,oe,R,M)}return R[p].exports}for(var a=typeof bt=="function"&&bt,g=0;g0&&(Ee=X.concat(Ee),X=[]),r.map(ne(fe),K(Ee),function(Se,Me){return new a.Paragraph(Me,Se)}).insertExtra()},"w:r":function(re){return r.map(ie(re.firstOrEmpty("w:rPr")),K(re.children),function(fe,_e){var Ee=Ie();return Ee!==null&&(_e=[new a.Hyperlink(_e,Ee)]),new a.Run(_e,fe)})},"w:fldChar":be,"w:instrText":Le,"w:t":function(re){return c(new a.Text(re.text()))},"w:tab":function(re){return c(new a.Tab)},"w:noBreakHyphen":function(){return c(new a.Text("‑"))},"w:softHyphen":function(re){return c(new a.Text("­"))},"w:sym":Be,"w:hyperlink":function(re){var fe=re.attributes["r:id"],_e=re.attributes["w:anchor"];return K(re.children).map(function(Ee){function Se(Pe){var Fe=re.attributes["w:tgtFrame"]||null;return new a.Hyperlink(Ee,E.extend({targetFrame:Fe},Pe))}if(fe){var Me=x.findTargetByRelationshipId(fe);return _e&&(Me=e.replaceFragment(Me,_e)),Se({href:Me})}else return _e?Se({anchor:_e}):Ee})},"w:tbl":l,"w:tr":o,"w:tc":D,"w:footnoteReference":f("footnote"),"w:endnoteReference":f("endnote"),"w:commentReference":$,"w:br":function(re){var fe=re.attributes["w:type"];return fe==null||fe==="textWrapping"?c(a.lineBreak):fe==="page"?c(a.pageBreak):fe==="column"?c(a.columnBreak):h([p("Unsupported break type: "+fe)])},"w:bookmarkStart":function(re){var fe=re.attributes["w:name"];return fe==="_GoBack"?_():c(new a.BookmarkStart({name:fe}))},"mc:AlternateContent":function(re){return V(re.firstOrEmpty("mc:Fallback"))},"w:sdt":function(re){var fe=K(re.firstOrEmpty("w:sdtContent").children);return fe.map(function(_e){var Ee=re.firstOrEmpty("w:sdtPr").first("wordml:checkbox");if(Ee){var Se=Ee.first("wordml:checked"),Me=!!Se&&Q(Se.attributes["wordml:val"]),Pe=a.checkbox({checked:Me}),Fe=!1,Ze=_e.map(i._elementsOfType(a.types.text,function(N){return N.value.length>0&&!Fe?(Fe=!0,Pe):N}));return Fe?Ze:Pe}else return _e})},"w:customXml":V,"w:ins":V,"w:moveFromRangeEnd":V,"w:moveFromRangeStart":V,"w:moveTo":V,"w:moveToRangeEnd":V,"w:moveToRangeStart":V,"w:object":V,"w:smartTag":V,"w:drawing":V,"w:pict":function(re){return V(re).toExtra()},"v:roundrect":V,"v:shape":V,"v:textbox":V,"w:txbxContent":V,"wp:inline":ae,"wp:anchor":ae,"v:imagedata":Ae,"v:group":V,"v:rect":V};return{readXmlElement:pe,readXmlElements:K};function l(re){var fe=t(re.firstOrEmpty("w:tblPr"));return K(re.children).flatMap(G).flatMap(function(_e){return fe.map(function(Ee){return a.Table(_e,Ee)})})}function t(re){return Re(re).map(function(fe){return{styleId:fe.styleId,styleName:fe.name}})}function o(re){var fe=re.firstOrEmpty("w:trPr"),_e=!!fe.first("w:del");if(_e)return _();var Ee=!!fe.first("w:tblHeader");return K(re.children).map(function(Se){return a.TableRow(Se,{isHeader:Ee})})}function D(re){return K(re.children).map(function(fe){var _e=re.firstOrEmpty("w:tcPr"),Ee=_e.firstOrEmpty("w:gridSpan").attributes["w:val"],Se=Ee?parseInt(Ee,10):1,Me=a.TableCell(fe,{colSpan:Se});return Me._vMerge=C(_e),Me})}function C(re){var fe=re.first("w:vMerge");if(fe){var _e=fe.attributes["w:val"];return _e==="continue"||!_e}else return null}function G(re){var fe=E.any(re,function(Se){return Se.type!==a.types.tableRow});if(fe)return te(re),n(re,[p("unexpected non-row element in table, cell merging may be incorrect")]);var _e=E.any(re,function(Se){return E.any(Se.children,function(Me){return Me.type!==a.types.tableCell})});if(_e)return te(re),n(re,[p("unexpected non-cell element in table row, cell merging may be incorrect")]);var Ee={};return re.forEach(function(Se){var Me=0;Se.children.forEach(function(Pe){Pe._vMerge&&Ee[Me]?Ee[Me].rowSpan++:(Ee[Me]=Pe,Pe._vMerge=!1),Me+=Pe.colSpan})}),re.forEach(function(Se){Se.children=Se.children.filter(function(Me){return!Me._vMerge}),Se.children.forEach(function(Me){delete Me._vMerge})}),c(re)}function te(re){re.forEach(function(fe){var _e=i.getDescendantsOfType(fe,a.types.tableCell);_e.forEach(function(Ee){delete Ee._vMerge})})}function ae(re){var fe=re.getElementsByTagName("a:graphic").getElementsByTagName("a:graphicData").getElementsByTagName("pic:pic").getElementsByTagName("pic:blipFill").getElementsByTagName("a:blip");return m(fe.map(de.bind(null,re)))}function de(re,fe){var _e=re.firstOrEmpty("wp:docPr"),Ee=_e.attributes,Se=Te(Ee.descr)?Ee.title:Ee.descr,Me=me(fe);return Me===null?h([p("Could not find image file for a:blip element")]):ze(Me,Se).map(function(Pe){var Fe=_e.firstOrEmpty("a:hlinkClick"),Ze=Fe.attributes["r:id"];if(Ze){var N=x.findTargetByRelationshipId(Ze);return new a.Hyperlink([Pe],{href:N})}else return Pe})}function Te(re){return re==null||/^\s*$/.test(re)}function me(re){var fe=re.attributes["r:embed"],_e=re.attributes["r:link"];if(fe)return Ue(fe);if(_e){var Ee=x.findTargetByRelationshipId(_e);return{path:Ee,read:B.read.bind(B,Ee)}}else return null}function Ae(re){var fe=re.attributes["r:id"];return fe?ze(Ue(fe),re.attributes["o:title"]):h([p("A v:imagedata element without a relationship ID was ignored")])}function Ue(re){var fe=e.uriToZipEntryName("word",x.findTargetByRelationshipId(re));return{path:fe,read:ee.read.bind(ee,fe)}}function ze(re,fe){var _e=W.findContentType(re.path),Ee=a.Image({readImage:re.read,altText:fe,contentType:_e}),Se=w[_e]?[]:p("Image of type "+_e+" is unlikely to display in web browsers");return n(Ee,Se)}function He(re,fe){return p(re+" style with ID "+fe+" was referenced but not defined in the document")}}function y(k,A,O){var X=A.firstOrEmpty("w:ilvl").attributes["w:val"],x=A.firstOrEmpty("w:numId").attributes["w:val"];if(X!==void 0&&x!==void 0)return O.findLevel(x,X);if(k!=null){var W=O.findLevelByParagraphStyleId(k);if(W!=null)return W}return x!==void 0?O.findLevel(x,"0"):null}var w={"image/png":!0,"image/gif":!0,"image/jpeg":!0,"image/svg+xml":!0,"image/tiff":!0},v={"office-word:wrap":!0,"v:shadow":!0,"v:shapetype":!0,"w:annotationRef":!0,"w:bookmarkEnd":!0,"w:sectPr":!0,"w:proofErr":!0,"w:lastRenderedPageBreak":!0,"w:commentRangeStart":!0,"w:commentRangeEnd":!0,"w:del":!0,"w:footnoteRef":!0,"w:endnoteRef":!0,"w:moveFrom":!0,"w:pPr":!0,"w:rPr":!0,"w:tblPr":!0,"w:tblGrid":!0,"w:trPr":!0,"w:tcPr":!0};function h(k){return new r(null,null,k)}function _(){return new r(null)}function c(k){return new r(k)}function n(k,A){return new r(k,null,A)}function r(k,A,O){this.value=k||[],this.extra=A||[],this._result=new g({element:this.value,extra:A},O),this.messages=this._result.messages}r.prototype.toExtra=function(){return new r(null,I(this.extra,this.value),this.messages)},r.prototype.insertExtra=function(){var k=this.extra;return k&&k.length?new r(I(this.value,k),null,this.messages):this},r.prototype.map=function(k){var A=this._result.map(function(O){return k(O.element)});return new r(A.value,this.extra,A.messages)},r.prototype.flatMap=function(k){var A=this._result.flatMap(function(O){return k(O.element)._result});return new r(A.value.element,I(this.extra,A.value.extra),A.messages)},r.map=function(k,A,O){return new r(O(k.value,A.value),I(k.extra,A.extra),k.messages.concat(A.messages))};function m(k){var A=g.combine(E.pluck(k,"_result"));return new r(E.flatten(E.pluck(A.value,"element")),E.filter(E.flatten(E.pluck(A.value,"extra")),U),A.messages)}function I(k,A){return E.flatten([k,A])}function U(k){return k}},{"../documents":4,"../results":25,"../transforms":30,"../xml":35,"./uris":16,"dingbat-to-unicode":50,underscore:67}],6:[function(P,oe,R){var M=P("../documents"),E=P("../results").Result;function a(g){function p(i){return E.combine(i.getElementsByTagName("w:comment").map(u))}function u(i){var e=i.attributes["w:id"];function s(d){return(i.attributes[d]||"").trim()||null}return g.readXmlElements(i.children).map(function(d){return M.comment({commentId:e,body:d,authorName:s("w:author"),authorInitials:s("w:initials")})})}return p}R.createCommentsReader=a},{"../documents":4,"../results":25}],7:[function(P,oe,R){R.readContentTypesFromXml=E;var M={png:"png",gif:"gif",jpeg:"jpeg",jpg:"jpeg",tif:"tiff",tiff:"tiff",bmp:"bmp"};R.defaultContentTypes=a({},{});function E(g){var p=Object.create(null),u=Object.create(null);return g.children.forEach(function(i){if(i.name==="content-types:Default"&&(p[i.attributes.Extension]=i.attributes.ContentType),i.name==="content-types:Override"){var e=i.attributes.PartName;e.charAt(0)==="/"&&(e=e.substring(1)),u[e]=i.attributes.ContentType}}),a(u,p)}function a(g,p){return{findContentType:function(u){var i=g[u];if(i)return i;var e=u.split("."),s=e[e.length-1];if(Object.prototype.hasOwnProperty.call(p,s))return p[s];var d=M[s.toLowerCase()];return d?"image/"+d:null}}}},{}],8:[function(P,oe,R){R.DocumentXmlReader=a;var M=P("../documents"),E=P("../results").Result;function a(g){var p=g.bodyReader;function u(i){var e=i.first("w:body");if(e==null)throw new Error("Could not find the body element: are you sure this is a docx file?");var s=p.readXmlElements(e.children).map(function(d){return new M.Document(d,{notes:g.notes,comments:g.comments})});return new E(s.value,s.messages)}return{convertXmlToDocument:u}}},{"../documents":4,"../results":25}],9:[function(P,oe,R){R.read=_,R._findPartPaths=c;var M=P("../promises"),E=P("../documents"),a=P("../results").Result,g=P("../zipfile"),p=P("./office-xml-reader").readXmlFromZipFile,u=P("./body-reader").createBodyReader,i=P("./document-xml-reader").DocumentXmlReader,e=P("./relationships-reader"),s=P("./content-types-reader"),d=P("./numbering-xml"),y=P("./styles-reader"),w=P("./notes-reader"),v=P("./comments-reader"),h=P("./files").Files;function _(x,W,ee){W=W||{},ee=ee||{};var B=new h({externalFileAccess:ee.externalFileAccess,relativeToFile:W.path});return M.props({contentTypes:k(x),partPaths:c(x),docxFile:x,files:B}).also(function(Y){return{styles:O(x,Y.partPaths.styles)}}).also(function(Y){return{numbering:A(x,Y.partPaths.numbering,Y.styles)}}).also(function(Y){return{footnotes:I(Y.partPaths.footnotes,Y,function(T,K){return K?w.createFootnotesReader(T)(K):new a([])}),endnotes:I(Y.partPaths.endnotes,Y,function(T,K){return K?w.createEndnotesReader(T)(K):new a([])}),comments:I(Y.partPaths.comments,Y,function(T,K){return K?v.createCommentsReader(T)(K):new a([])})}}).also(function(Y){return{notes:Y.footnotes.flatMap(function(T){return Y.endnotes.map(function(K){return new E.Notes(T.concat(K))})})}}).then(function(Y){return I(Y.partPaths.mainDocument,Y,function(T,K){return Y.notes.flatMap(function(pe){return Y.comments.flatMap(function(ne){var ce=new i({bodyReader:T,notes:pe,comments:ne});return ce.convertXmlToDocument(K)})})})})}function c(x){return X(x).then(function(W){var ee=n({docxFile:x,relationships:W,relationshipType:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",basePath:"",fallbackPath:"word/document.xml"});if(!x.exists(ee))throw new Error("Could not find main document part. Are you sure this is a valid .docx file?");return m({filename:U(ee),readElement:e.readRelationships,defaultValue:e.defaultValue})(x).then(function(B){function Y(T){return n({docxFile:x,relationships:B,relationshipType:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/"+T,basePath:g.splitPath(ee).dirname,fallbackPath:"word/"+T+".xml"})}return{mainDocument:ee,comments:Y("comments"),endnotes:Y("endnotes"),footnotes:Y("footnotes"),numbering:Y("numbering"),styles:Y("styles")}})})}function n(x){var W=x.docxFile,ee=x.relationships,B=x.relationshipType,Y=x.basePath,T=x.fallbackPath,K=ee.findTargetsByType(B),pe=K.map(function(ce){return r(g.joinPath(Y,ce),"/")}),ne=pe.filter(function(ce){return W.exists(ce)});return ne.length===0?T:ne[0]}function r(x,W){return x.substring(0,W.length)===W?x.substring(W.length):x}function m(x){return function(W){return p(W,x.filename).then(function(ee){return ee?x.readElement(ee):x.defaultValue})}}function I(x,W,ee){var B=m({filename:U(x),readElement:e.readRelationships,defaultValue:e.defaultValue});return B(W.docxFile).then(function(Y){var T=new u({relationships:Y,contentTypes:W.contentTypes,docxFile:W.docxFile,numbering:W.numbering,styles:W.styles,files:W.files});return p(W.docxFile,x).then(function(K){return ee(T,K)})})}function U(x){var W=g.splitPath(x);return g.joinPath(W.dirname,"_rels",W.basename+".rels")}var k=m({filename:"[Content_Types].xml",readElement:s.readContentTypesFromXml,defaultValue:s.defaultContentTypes});function A(x,W,ee){return m({filename:W,readElement:function(B){return d.readNumberingXml(B,{styles:ee})},defaultValue:d.defaultNumbering})(x)}function O(x,W){return m({filename:W,readElement:y.readStylesXml,defaultValue:y.defaultStyles})(x)}var X=m({filename:"_rels/.rels",readElement:e.readRelationships,defaultValue:e.defaultValue})},{"../documents":4,"../promises":23,"../results":25,"../zipfile":40,"./body-reader":5,"./comments-reader":6,"./content-types-reader":7,"./document-xml-reader":8,"./files":1,"./notes-reader":10,"./numbering-xml":11,"./office-xml-reader":12,"./relationships-reader":13,"./styles-reader":15}],10:[function(P,oe,R){var M=P("../documents"),E=P("../results").Result;R.createFootnotesReader=a.bind(this,"footnote"),R.createEndnotesReader=a.bind(this,"endnote");function a(g,p){function u(s){return E.combine(s.getElementsByTagName("w:"+g).filter(i).map(e))}function i(s){var d=s.attributes["w:type"];return d!=="continuationSeparator"&&d!=="separator"}function e(s){var d=s.attributes["w:id"];return p.readXmlElements(s.children).map(function(y){return M.Note({noteType:g,noteId:d,body:y})})}return u}},{"../documents":4,"../results":25}],11:[function(P,oe,R){var M=P("underscore");R.readNumberingXml=a,R.Numbering=E,R.defaultNumbering=new E({},{});function E(i,e,s){var d=M.flatten(M.values(e).map(function(_){return M.values(_.levels)})),y=M.indexBy(d.filter(function(_){return _.paragraphStyleId!=null}),"paragraphStyleId");function w(_,c){return v(_,c,Object.create(null))}function v(_,c,n){if(n[_])return null;n[_]=!0;var r=i[_];if(!r)return null;var m=e[r.abstractNumId];if(m){if(m.numStyleLink==null)return e[r.abstractNumId].levels[c];var I=s.findNumberingStyleById(m.numStyleLink);return v(I.numId,c,n)}else return null}function h(_){return y[_]||null}return{findLevel:w,findLevelByParagraphStyleId:h}}function a(i,e){if(!e||!e.styles)throw new Error("styles is missing");var s=g(i),d=u(i);return new E(d,s,e.styles)}function g(i){var e=Object.create(null);return i.getElementsByTagName("w:abstractNum").forEach(function(s){var d=s.attributes["w:abstractNumId"];e[d]=p(s)}),e}function p(i){var e=Object.create(null),s=null;i.getElementsByTagName("w:lvl").forEach(function(y){var w=y.attributes["w:ilvl"],v=y.firstOrEmpty("w:numFmt").attributes["w:val"],h=v!=="bullet",_=y.firstOrEmpty("w:pStyle").attributes["w:val"];w===void 0?s={isOrdered:h,level:"0",paragraphStyleId:_}:e[w]={isOrdered:h,level:w,paragraphStyleId:_}}),s!==null&&e[s.level]===void 0&&(e[s.level]=s);var d=i.firstOrEmpty("w:numStyleLink").attributes["w:val"];return{levels:e,numStyleLink:d}}function u(i){var e=Object.create(null);return i.getElementsByTagName("w:num").forEach(function(s){var d=s.attributes["w:numId"],y=s.first("w:abstractNumId").attributes["w:val"];e[d]={abstractNumId:y}}),e}},{underscore:67}],12:[function(P,oe,R){var M=P("underscore"),E=P("../promises"),a=P("../xml");R.read=p,R.readXmlFromZipFile=u;var g={"http://schemas.openxmlformats.org/wordprocessingml/2006/main":"w","http://schemas.openxmlformats.org/officeDocument/2006/relationships":"r","http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing":"wp","http://schemas.openxmlformats.org/drawingml/2006/main":"a","http://schemas.openxmlformats.org/drawingml/2006/picture":"pic","http://purl.oclc.org/ooxml/wordprocessingml/main":"w","http://purl.oclc.org/ooxml/officeDocument/relationships":"r","http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing":"wp","http://purl.oclc.org/ooxml/drawingml/main":"a","http://purl.oclc.org/ooxml/drawingml/picture":"pic","http://schemas.openxmlformats.org/package/2006/content-types":"content-types","http://schemas.openxmlformats.org/package/2006/relationships":"relationships","http://schemas.openxmlformats.org/markup-compatibility/2006":"mc","urn:schemas-microsoft-com:vml":"v","urn:schemas-microsoft-com:office:word":"office-word","http://schemas.microsoft.com/office/word/2010/wordml":"wordml"};function p(s){return a.readString(s,g).then(function(d){return e(d)[0]})}function u(s,d){return s.exists(d)?s.read(d,"utf-8").then(i).then(p):E.resolve(null)}function i(s){return s.replace(/^\uFEFF/g,"")}function e(s){return s.type==="element"?s.name==="mc:AlternateContent"?s.firstOrEmpty("mc:Fallback").children:(s.children=M.flatten(s.children.map(e,!0)),[s]):[s]}},{"../promises":23,"../xml":35,underscore:67}],13:[function(P,oe,R){R.readRelationships=M,R.defaultValue=new E([]),R.Relationships=E;function M(a){var g=[];return a.children.forEach(function(p){if(p.name==="relationships:Relationship"){var u={relationshipId:p.attributes.Id,target:p.attributes.Target,type:p.attributes.Type};g.push(u)}}),new E(g)}function E(a){var g=Object.create(null);a.forEach(function(u){g[u.relationshipId]=u.target});var p=Object.create(null);return a.forEach(function(u){p[u.type]||(p[u.type]=[]),p[u.type].push(u.target)}),{findTargetByRelationshipId:function(u){return g[u]},findTargetsByType:function(u){return p[u]||[]}}}},{}],14:[function(P,oe,R){var M=P("underscore"),E=P("../promises"),a=P("../xml");R.writeStyleMap=i,R.readStyleMap=y;var g="http://schemas.zwobble.org/mammoth/style-map",p="mammoth/style-map",u="/"+p;function i(w,v){return w.write(p,v),e(w).then(function(){return s(w)})}function e(w){var v="word/_rels/document.xml.rels",h="http://schemas.openxmlformats.org/package/2006/relationships",_="{"+h+"}Relationship";return w.read(v,"utf8").then(a.readString).then(function(c){var n=c.children;d(n,_,"Id",{Id:"rMammothStyleMap",Type:g,Target:u});var r={"":h};return w.write(v,a.writeString(c,r))})}function s(w){var v="[Content_Types].xml",h="http://schemas.openxmlformats.org/package/2006/content-types",_="{"+h+"}Override";return w.read(v,"utf8").then(a.readString).then(function(c){var n=c.children;d(n,_,"PartName",{PartName:u,ContentType:"text/prs.mammoth.style-map"});var r={"":h};return w.write(v,a.writeString(c,r))})}function d(w,v,h,_){var c=M.find(w,function(n){return n.name===v&&n.attributes[h]===_[h]});c?c.attributes=_:w.push(a.element(v,_))}function y(w){return w.exists(p)?w.read(p,"utf8"):E.resolve(null)}},{"../promises":23,"../xml":35,underscore:67}],15:[function(P,oe,R){R.readStylesXml=E,R.Styles=M,R.defaultStyles=new M({},{});function M(i,e,s,d){return{findParagraphStyleById:function(y){return i[y]},findCharacterStyleById:function(y){return e[y]},findTableStyleById:function(y){return s[y]},findNumberingStyleById:function(y){return d[y]}}}M.EMPTY=new M({},{},{},{});function E(i){var e=Object.create(null),s=Object.create(null),d=Object.create(null),y=Object.create(null);return i.getElementsByTagName("w:style").forEach(function(w){var v=a(w),h;switch(v.type){case"paragraph":h=e;break;case"character":h=s;break;case"table":h=d;break;case"numbering":h=y;break}h&&h[v.styleId]===void 0&&(h[v.styleId]=v)}),new M(e,s,d,y)}function a(i){var e=i.attributes["w:type"];if(e==="numbering")return p(e,i);var s=u(i),d=g(i);return{type:e,styleId:s,name:d}}function g(i){var e=i.first("w:name");return e?e.attributes["w:val"]:null}function p(i,e){var s=u(e),d=e.firstOrEmpty("w:pPr").firstOrEmpty("w:numPr").firstOrEmpty("w:numId").attributes["w:val"];return{type:i,numId:d,styleId:s}}function u(i){return i.attributes["w:styleId"]}},{}],16:[function(P,oe,R){R.uriToZipEntryName=M,R.replaceFragment=E;function M(a,g){return g.charAt(0)==="/"?g.substr(1):a+"/"+g}function E(a,g){var p=a.indexOf("#");return p!==-1&&(a=a.substring(0,p)),a+"#"+g}},{}],17:[function(P,oe,R){var M=P("../styles/html-paths");function E(s,d,y){return g(M.element(s,d,{fresh:!1}),y)}function a(s,d,y){var w=M.element(s,d,{fresh:!0});return g(w,y)}function g(s,d){return{type:"element",tag:s,children:d||[]}}function p(s){return{type:"text",value:s}}var u={type:"forceWrite"};R.freshElement=a,R.nonFreshElement=E,R.elementWithTag=g,R.text=p,R.forceWrite=u;var i={br:!0,hr:!0,img:!0,input:!0};function e(s){return s.children.length===0&&i[s.tag.tagName]}R.isVoidElement=e},{"../styles/html-paths":28}],18:[function(P,oe,R){var M=P("./ast");R.freshElement=M.freshElement,R.nonFreshElement=M.nonFreshElement,R.elementWithTag=M.elementWithTag,R.text=M.text,R.forceWrite=M.forceWrite,R.simplify=P("./simplify");function E(i,e){e.forEach(function(s){a(i,s)})}function a(i,e){g[e.type](i,e)}var g={element:p,text:u,forceWrite:function(){}};function p(i,e){M.isVoidElement(e)?i.selfClosing(e.tag.tagName,e.tag.attributes):(i.open(e.tag.tagName,e.tag.attributes),E(i,e.children),i.close(e.tag.tagName))}function u(i,e){i.text(e.value)}R.write=E},{"./ast":17,"./simplify":19}],19:[function(P,oe,R){var M=P("underscore"),E=P("./ast");function a(c){return g(d(c))}function g(c){var n=[];return c.map(p).forEach(function(r){s(n,r)}),n}function p(c){return u[c.type](c)}var u={element:i,text:e,forceWrite:e};function i(c){return E.elementWithTag(c.tag,g(c.children))}function e(c){return c}function s(c,n){var r=c[c.length-1];n.type==="element"&&!n.tag.fresh&&r&&r.type==="element"&&n.tag.matchesElement(r.tag)?(n.tag.separator&&s(r.children,E.text(n.tag.separator)),n.children.forEach(function(m){s(r.children,m)})):c.push(n)}function d(c){return y(c,function(n){return w[n.type](n)})}function y(c,n){return M.flatten(M.map(c,n),!0)}var w={element:h,text:_,forceWrite:v};function v(c){return[c]}function h(c){var n=d(c.children);return n.length===0&&!E.isVoidElement(c)?[]:[E.elementWithTag(c.tag,n)]}function _(c){return c.value.length===0?[]:[c]}oe.exports=a},{"./ast":17,underscore:67}],20:[function(P,oe,R){var M=P("underscore"),E=P("./promises"),a=P("./html");R.imgElement=g;function g(u){return function(i,e){return E.resolve(u(i)).then(function(s){var d={};return i.altText&&(d.alt=i.altText),M.extend(d,s),[a.freshElement("img",d)]})}}R.inline=R.imgElement,R.dataUri=g(function(u){return u.readAsBase64String().then(function(i){return{src:"data:"+u.contentType+";base64,"+i}})});function p(u){return u.contentType.split(/\/|\\/)[1]}R.imageFilenameExtension=p},{"./html":18,"./promises":23,underscore:67}],21:[function(P,oe,R){(function(M){var E=P("underscore"),a=P("./docx/docx-reader"),g=P("./docx/style-map"),p=P("./document-to-html").DocumentConverter,u=P("./raw-text").convertElementToRawText,i=P("./style-reader").readStyle,e=P("./options-reader").readOptions,s=P("./promises"),d=P("./unzip"),y=P("./results").Result;R.convertToHtml=w,R.convertToMarkdown=v,R.convert=h,R.extractRawText=r,R.images=P("./images"),R.transforms=P("./transforms"),R.underline=P("./underline"),R.embedStyleMap=m,R.readEmbeddedStyleMap=_;function w(I,U){return h(I,U)}function v(I,U){var k=Object.create(U||{});return k.outputFormat="markdown",h(I,k)}function h(I,U){U=e(U);var k=d.openZip(I).then(function(A){return g.readStyleMap(A).then(function(O){return U.embeddedStyleMap=O,A})}).then(function(A){return a.read(A,I,U).then(function(O){return O.map(U.transformDocument)}).then(function(O){return c(O,U)})});return s.toExternalPromise(k)}function _(I){var U=d.openZip(I).then(g.readStyleMap);return s.toExternalPromise(U)}function c(I,U){var k=n(U.readStyleMap()),A=E.extend({},U,{styleMap:k.value}),O=new p(A);return I.flatMapThen(function(X){return k.flatMapThen(function(x){return O.convertToHtml(X)})})}function n(I){return y.combine((I||[]).map(i)).map(function(U){return U.filter(function(k){return!!k})})}function r(I){var U=d.openZip(I).then(a.read).then(function(k){return k.map(u)});return s.toExternalPromise(U)}function m(I,U){var k=d.openZip(I).then(function(A){return g.writeStyleMap(A,U).then(function(){return A})}).then(function(A){return A.toArrayBuffer()}).then(function(A){return{toArrayBuffer:function(){return A},toBuffer:function(){return M.from(A)}}});return s.toExternalPromise(k)}R.styleMapping=function(){throw new Error(`Use a raw string instead of mammoth.styleMapping e.g. "p[style-name='Title'] => h1" instead of mammoth.styleMapping("p[style-name='Title'] => h1")`)}}).call(this,P("buffer").Buffer)},{"./document-to-html":3,"./docx/docx-reader":9,"./docx/style-map":14,"./images":20,"./options-reader":22,"./promises":23,"./raw-text":24,"./results":25,"./style-reader":26,"./transforms":30,"./underline":31,"./unzip":2,buffer:48,underscore:67}],22:[function(P,oe,R){R.readOptions=g;var M=P("underscore"),E=R._defaultStyleMap=["p.Heading1 => h1:fresh","p.Heading2 => h2:fresh","p.Heading3 => h3:fresh","p.Heading4 => h4:fresh","p.Heading5 => h5:fresh","p.Heading6 => h6:fresh","p[style-name='Heading 1'] => h1:fresh","p[style-name='Heading 2'] => h2:fresh","p[style-name='Heading 3'] => h3:fresh","p[style-name='Heading 4'] => h4:fresh","p[style-name='Heading 5'] => h5:fresh","p[style-name='Heading 6'] => h6:fresh","p[style-name='heading 1'] => h1:fresh","p[style-name='heading 2'] => h2:fresh","p[style-name='heading 3'] => h3:fresh","p[style-name='heading 4'] => h4:fresh","p[style-name='heading 5'] => h5:fresh","p[style-name='heading 6'] => h6:fresh","p.Heading => h1:fresh","p[style-name='Heading'] => h1:fresh","r[style-name='Strong'] => strong","p[style-name='footnote text'] => p:fresh","r[style-name='footnote reference'] =>","p[style-name='endnote text'] => p:fresh","r[style-name='endnote reference'] =>","p[style-name='annotation text'] => p:fresh","r[style-name='annotation reference'] =>","p[style-name='Footnote'] => p:fresh","r[style-name='Footnote anchor'] =>","p[style-name='Endnote'] => p:fresh","r[style-name='Endnote anchor'] =>","p:unordered-list(1) => ul > li:fresh","p:unordered-list(2) => ul|ol > li > ul > li:fresh","p:unordered-list(3) => ul|ol > li > ul|ol > li > ul > li:fresh","p:unordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh","p:unordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh","p:ordered-list(1) => ol > li:fresh","p:ordered-list(2) => ul|ol > li > ol > li:fresh","p:ordered-list(3) => ul|ol > li > ul|ol > li > ol > li:fresh","p:ordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh","p:ordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh","r[style-name='Hyperlink'] =>","p[style-name='Normal'] => p:fresh","p.Body => p:fresh","p[style-name='Body'] => p:fresh"],a=R._standardOptions={externalFileAccess:!1,transformDocument:u,includeDefaultStyleMap:!0,includeEmbeddedStyleMap:!0};function g(i){return i=i||{},M.extend({},a,i,{customStyleMap:p(i.styleMap),readStyleMap:function(){var e=this.customStyleMap;return this.includeEmbeddedStyleMap&&(e=e.concat(p(this.embeddedStyleMap))),this.includeDefaultStyleMap&&(e=e.concat(E)),e}})}function p(i){return i?M.isString(i)?i.split(` `).map(function(e){return e.trim()}).filter(function(e){return e!==""&&e.charAt(0)!=="#"}):i:[]}function u(i){return i}},{underscore:67}],23:[function(P,oe,R){(function(M){var E=P("underscore");R.defer=u,R.Promise=Promise,R.resolve=Promise.resolve.bind(Promise),R.reject=Promise.reject.bind(Promise),R.forEachSeries=function(d,y){var w=0,v=u(),h=function(){if(w"u"?!1:{}.toString.call(M).toLowerCase()==="[object process]"}}).call(this,P("_process"))},{_process:66,underscore:67}],24:[function(P,oe,R){var M=P("./documents");function E(a){if(a.type==="text")return a.value;if(a.type===M.types.tab)return" ";var g=a.type==="paragraph"?` diff --git a/sync-server/www/assets/refresh-cw-CP7uPCIx.js b/sync-server/www/assets/refresh-cw-C3HYho-f.js similarity index 91% rename from sync-server/www/assets/refresh-cw-CP7uPCIx.js rename to sync-server/www/assets/refresh-cw-C3HYho-f.js index d99f054..c62092f 100644 --- a/sync-server/www/assets/refresh-cw-CP7uPCIx.js +++ b/sync-server/www/assets/refresh-cw-C3HYho-f.js @@ -1,4 +1,4 @@ -import{c as e}from"./index-DYhSDydL.js";/** +import{c as e}from"./index-DhGFbjWw.js";/** * @license lucide-react v0.475.0 - ISC * * This source code is licensed under the ISC license. diff --git a/sync-server/www/assets/rotate-ccw-CE3bwRx2.js b/sync-server/www/assets/rotate-ccw-DGANt55P.js similarity index 94% rename from sync-server/www/assets/rotate-ccw-CE3bwRx2.js rename to sync-server/www/assets/rotate-ccw-DGANt55P.js index 9cf22db..7977c92 100644 --- a/sync-server/www/assets/rotate-ccw-CE3bwRx2.js +++ b/sync-server/www/assets/rotate-ccw-DGANt55P.js @@ -1,4 +1,4 @@ -import{c as t}from"./index-DYhSDydL.js";/** +import{c as t}from"./index-DhGFbjWw.js";/** * @license lucide-react v0.475.0 - ISC * * This source code is licensed under the ISC license. diff --git a/sync-server/www/assets/useChart-DgHaQNyb.js b/sync-server/www/assets/useChart-BbOzH_LJ.js similarity index 92% rename from sync-server/www/assets/useChart-DgHaQNyb.js rename to sync-server/www/assets/useChart-BbOzH_LJ.js index cc4811f..6808a05 100644 --- a/sync-server/www/assets/useChart-DgHaQNyb.js +++ b/sync-server/www/assets/useChart-BbOzH_LJ.js @@ -1 +1 @@ -import{r}from"./index-DYhSDydL.js";import{g as f}from"./echarts-BIWefrIc.js";function p(){const[n,o]=r.useState(0);return r.useEffect(()=>{const s=()=>o(t=>t+1);return window.addEventListener("fp-theme-change",s),()=>window.removeEventListener("fp-theme-change",s)},[]),n}function d(n){return getComputedStyle(document.documentElement).getPropertyValue("--text-"+n).trim()||"#454e5c"}function h(n,o){const s=r.useRef(null),[t,i]=r.useState(null),u=r.useRef(n);return u.current=n,r.useEffect(()=>{if(!t)return;const e=f(t);s.current=e,e.setOption(u.current(),{notMerge:!0});const c=new ResizeObserver(()=>e.resize());return c.observe(t),()=>{c.disconnect(),e.dispose(),s.current=null}},[t]),r.useEffect(()=>{var e;(e=s.current)==null||e.setOption(u.current(),{notMerge:!0})},[t,...o]),e=>i(e)}export{h as a,d as i,p as u}; +import{r}from"./index-DhGFbjWw.js";import{g as f}from"./echarts-BIWefrIc.js";function p(){const[n,o]=r.useState(0);return r.useEffect(()=>{const s=()=>o(t=>t+1);return window.addEventListener("fp-theme-change",s),()=>window.removeEventListener("fp-theme-change",s)},[]),n}function d(n){return getComputedStyle(document.documentElement).getPropertyValue("--text-"+n).trim()||"#454e5c"}function h(n,o){const s=r.useRef(null),[t,i]=r.useState(null),u=r.useRef(n);return u.current=n,r.useEffect(()=>{if(!t)return;const e=f(t);s.current=e,e.setOption(u.current(),{notMerge:!0});const c=new ResizeObserver(()=>e.resize());return c.observe(t),()=>{c.disconnect(),e.dispose(),s.current=null}},[t]),r.useEffect(()=>{var e;(e=s.current)==null||e.setOption(u.current(),{notMerge:!0})},[t,...o]),e=>i(e)}export{h as a,d as i,p as u}; diff --git a/sync-server/www/assets/zongceWord-DuzvenT-.js b/sync-server/www/assets/zongceWord-DuzvenT-.js deleted file mode 100644 index cb292b3..0000000 --- a/sync-server/www/assets/zongceWord-DuzvenT-.js +++ /dev/null @@ -1 +0,0 @@ -const t=l=>String(l??"").replace(/&/g,"&").replace(//g,">");function c(l,r,d,i){const n=r.map(e=>{const s=e.key==="rewards"?e.subtotal:Math.min(e.subtotal,e.cap),a=e.items.map(o=>''+t(o.title)+''+t(o.note||o.source)+''+t(o.score)+"").join("");return'

'+t(e.label)+"(上限 "+t(e.cap)+" 分,小计 "+t(s)+' 分)

'+a+"
"}).join("");return'综合素质测评

学生综合素质测评

'+('
'+t(i.name??"")+" · "+t(i.className??"")+" · 统计周期:"+t(l)+"
")+'

综合素质总分:'+t(d)+" 分

"+n+'
计分依据:《计算机与网络安全学院学生综合素质测评评分细则》。以上自动匹配条目均经过人工核对。
学生签名:______辅导员签名:______日期:______
'}export{c as zongceToWordHtml}; diff --git a/sync-server/www/index.html b/sync-server/www/index.html index 27d0ecf..ac8f32e 100644 --- a/sync-server/www/index.html +++ b/sync-server/www/index.html @@ -9,8 +9,8 @@ 足迹 Footprints - - + +