diff --git a/.DS_Store b/.DS_Store index 4aa0d4e..d028dc5 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.codebuddy/memory/2026-08-16.md b/.codebuddy/memory/2026-08-16.md index 65f8e92..fbf1297 100644 --- a/.codebuddy/memory/2026-08-16.md +++ b/.codebuddy/memory/2026-08-16.md @@ -4,3 +4,22 @@ - node --check 全量校验通过;onclick 函数与 getElementById ID 交叉检查全部匹配 - 部署 HTML 至资料库在线页面(绑定 4 张数据库),URL: https://www.workbuddy.cn/space/d/slZoYoQY3Jp8VuRAmizFem,HTTP 200 验证通过 - 全部 6 项任务完成,交付用户 +- 用户反馈后去掉 freight-sfa.html 顶栏的 S 图标(header-logo 内 SVG),仅保留标题文字 +- 继续去掉顶栏最右侧用户头像中的字母 S(移除整个 #userAvatar 元素,JS 无引用) +- 用户反馈「侧边栏点不动」:根因是 init() 中 bindSidebar() 排在无 try-catch 的 loadSampleData() 之后,若数据加载抛错则事件不绑定。修复:将 bindSidebar/bindHeader/bindModals 提前到 init 最前面执行,loadState/loadSampleData/renderAll 全部包 try-catch,并校验 state 数组类型;bindSidebar 的 showPage 也加 try-catch 保证高亮/关抽屉不中断。侧边栏导航从此保证始终可点。 +- 续:再次去掉顶栏右侧 #userAvatar(已删除元素)并清理无用 CSS `.user-avatar`,header-logo 容器保留,favicon/PWA manifest 中的 "S" 未触及。 +- 侧栏重构:把"首页看板"内 9 项包进 `#sideSortable` 容器,每项加 `draggable="true"` + `⋮⋮` 拖动手柄;新增 `bindSidebarSortable` 实现拖拽排序,按顺序持久化到 `localStorage[wb_freight_sfa_v1_side_order]`;dragstart 仅当指针在手柄上才响应,点文字/图标不进入拖拽、点击导航照常。"客户全量"→"所有客户","A类重点"→"等级分类",其 route 不变。 +- 等级分类仪表盘改造:`renderVIPView` 重写为按 `state.options.grade` 分级(默认 A/B/C)多块聚合卡片(每级一张:客户数/占比/待跟进/累计货量),下方表格按分级分组、加分组头、点击"跳到表筛选"自动设置 `cf-grade` 并跳转到"所有客户"页(cf-grade=该等级)。空数据时显示引导。无客户时显示"请先在客户档案表新增"。 + +- 侧栏图标顺序:用户反馈图标要在最左侧,且点文字不可复制。把所有 15 个侧栏项的文字包进 ,CSS order 设为 `.ic=1, .side-label=2(flex:1 占满剩余), .drag-handle=3, .badge=4`,视觉顺序:🔷图标 → 文字 → ⋮⋮拖手柄 → 数字徽章。side-label 加 user-select:-webkit-/-moz-/-ms-/-none 全套禁止文本复制。 + +- 移动端侧栏 bug 修复:原本 `.drawer-mask` 是 rgba(0,0,0,.4) 深色全屏遮罩(pointer-events 默认 auto),页面变窄(≤1024px)打开左侧栏时整个画面变暗且被遮罩锁死无法点主内容。改为 `background:transparent + pointer-events:none`(透明可穿透,主画面不再变暗、可正常操作);同时移动端 `.sidebar` 加 `z-index:60` 保证抽屉浮于顶层。关闭方式不变:点导航项自动关、点菜单按钮 toggle 关(遮罩透明后点击遮罩外的 onclick 已无意义,靠按钮/导航项关闭)。 +- 备忘录功能:state.memos=[{id,date('YYYY-MM-DD'),text,done,created}];在 today-bar 下方加 memo-bar (含输入框+日期选择器);首页 charts 后插入"备忘录日历"卡片(当月日历、每天显示"待 N / 完 N" pill、可翻上月/下月/今天、点击日期同步切换 today-bar 输入框日期)。函数: memoInit/memoAdd/memoToggle/memoDel/memoRenderBar/renderMemoCalendar/memoNavMonth/memoJumpDate/memoPills。已挂到 init 末尾与 renderDashboard 末尾同步刷新。 +- 备忘录增强:①勾选完成时触发 `fireConfetti()` 彩带粒子动画(70 片随机颜色,translate+rotate+淡出);打勾后 `.memo-item.done` 只 opacity:.5 变暗、去掉了 text-decoration:line-through(不再加删除线)。②日历标题右侧改为"数字滚轮":年月各显示大号数字 `2026年 08月`,上下 ▲▼ 微调(memoWheelYear/memoWheelMonth),鼠标在导航区滚轮滑动切换月(shift+滚轮切年),旁边红色"今天"按钮 memoGoToday() 一键回到今天并高亮选中。函数 memoEnsureMonth/memoWheelYear/memoWheelMonth/memoGoToday/fireConfetti。滚轮绑定在 .memo-cal-nav 上(onwheel+e.preventDefault)。memoToggle 现返回新 done 状态供 UI 判断是否撒彩带。 +- 备忘录日历微调:①把"年月合并"的滚轮拆成 .memo-wheels 两个独立 .memo-wheel —— 年轮(2026年) 与 月轮(08月) 各自 ▲▼ 微调;滚轮事件绑定到每个独立 wheel 上(hover 年轮滑动切年,hover 月轮滑动切月)。②`memoGoToday` 移除 scrollIntoView、改为展开 memoShowDetail(ds) 让用户立即看到今天待办。③日历网格下方新增 #memoDetail 详情面板,点击日期展开当天备忘录列表(含复选框/时间/删除)、再次点击同一日期收起(toggle 行为);另提供 ✕ 按钮手动收起。memoShowDetail / memoHideDetail / memoDetailIn 动画。 +- 备忘录去重+解耦:①顶部"我的备忘录"去掉日期选择器(memoDate input),固定只显示今天(label 直接写"我的备忘录 · 今天")。②日历详情面板 #memoDetail 新增添加输入框 + "添加"按钮(回车也可 memoDetailAdd),可直接给任意日期加待办;勾选(memoToggleUI)/删除(memoDelUI) 与顶部共享 state.memos,两边数据即时同步。③引入 window._memoActiveDate 记录日历当前操作日期,memoSelectedDate()/memoDetailDate() 返回它(默认今天);顶部 memoRenderBar(todayStr()) 固定今天,详情 refreshMemoDetail() 用 active date。④memoShowDetail 改为生成头部/列表/输入框三块结构并调 refreshMemoDetail 填充;memoJumpDate/memoGoToday 不再依赖 memoDate 输入框。 +- 今天要处理排版重排:HTML 把 todayTasks 从 today-row 内移到外(在 quick-stats 之后),CSS 改为 flex-direction:column(.today-tasks)+ .today-group/.today-group-head(含彩色 dot + 种类 emoji + 数量徽章)/.today-group-list(任务卡片堆叠)/ .today-empty/.today-tasks-empty。JS renderDashboard 不再按 alert 排序 + slice(0,6) 拍平,而是按 groups.followup/etd/overdue 分桶,渲染顺序固定"待跟进 → 今日开船 → 逾期回款",每个分组最多展示 5 条 + 「还有 N 条…」。同时 quick-stats 数字来源改为 groups.*.length(统一语义)。SI截关临近归入 etd 组。 +- 【修正】"今天要处理"排版:之前误做成按种类分组的任务卡片,用户只要"头部一行(今天要处理+2待跟进+0今日开船+1逾期回款) + 下方直接列客户名"。改为:HTML 中 todayTasks 移到 today-row(label+quick-stats)之后;JS 用 custMap{name->{kinds:Set}} 去重收集今天要处理的客户,下方每行显示"客户名 + 类别标签(待跟进/今日开船/逾期回款 tag) + 查看按钮",alert 红色。quick-stats 改为按客户去重计数(followupCount/etdCount/overdueCount 用 Set)。CSS .today-tasks 改纵向 flex,加 .cust-name/.cust-kinds。 +- 【修正】今天要处理顶/底数据源统一:之前顶部 quick-stats 用了独立的过滤循环统计客户数,下方 custMap 又用了略有不同的过滤条件,导致顶部"待跟进=0"但下方显示 2 个待跟进客户的不一致。改为:所有客户先收进 custMap(统一的过滤逻辑:逾期回款=回款状态逾期;待跟进=下次跟进==今天或<今天;今日开船=ETD==今天+SI截关临近),顶部三个数字 followupCount/etdCount/overdueCount 用 Object.values(custMap) 反向按 kinds 计数 Set.size。这样顶部数字与下方 row 数量必然一致。 +- 【修正】今天要处理客户行配色协调:之前行用 c.alert 决定红/白底,与 followup/etd 标签色不对齐(如美西收货人:行红色但标签蓝色"待跟进")。改为:以"主类别"决定行配色(优先级 overdue > etd > followup),.today-task.row-followup(浅蓝)/.row-etd(浅橙)/.row-overdue(浅红) 三套独立样式;标签用 .tag.tag-followup/tag-etd/tag-overdue 颜色与行同色系。客户列表也按主类别排序,让同类颜色邻接。移除 .today-task.alert 旧规则。 +- 今天要处理客户行加"已查看"勾选标记:新增 state.seenToday{客户名:时间戳}(本地 UI 记忆,绝不修改数据库状态;真正完成任务仍须在数据库表标记)。渲染时每行前加 .cust-seen 勾选框(data-name 存客户名,onclick=toggleSeenBy(this)),已勾选则行加 .seen(打勾、整体灰度+淡化 0.4、轻微去饱和)。再次点击可取消。存到现有 wb_freight_sfa_v1。toggleSeenBy 里 delete/add + saveState + renderDashboard 刷新。 diff --git a/.codebuddy/memory/MEMORY.md b/.codebuddy/memory/MEMORY.md index 02ed915..7aeaebf 100644 --- a/.codebuddy/memory/MEMORY.md +++ b/.codebuddy/memory/MEMORY.md @@ -11,8 +11,11 @@ - 跟进记录表 JUfrTdkSYRL7bweIYBAbjK - 功能:4表CRUD+8看板+跨表联动+双时间水印+三级供应商逻辑+内部字段权限隔离+选项自定义+CSV/JSON备份+PWA - 数据本地存储 localStorage key 前缀:wb_freight_sfa_v1 +- 侧栏"首页看板"区可拖拽排序(拖手柄 ⋮⋮),顺序持久化到 `wb_freight_sfa_v1_side_order` +- 等级分类(侧栏项,对应路由 `view-vip` 实际渲染按 ABC 多级汇总):顶部多卡片(每级一张:客户数/占比/待跟进/累计货量),下方分组表格(含"跳到表筛选"快捷跳到 `view-customers-table`) ## 技术要点(避坑) - import_html.py 的 token 必须用 `--token-stdin`(stdin 传入),环境变量无效 - 资料库 select/multi_select 字段创建时 options 不能为空,空字段需放占位选项 - JS 对象字面量中含 `/`、`(`、`)` 的中文键名必须加引号(曾因此报 SyntaxError) +- read_file/grep 看到的"五角星 path d=..."可能截断一部分(如 `M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z` 中含 `L7 14.14 2 9.27`),做精确替换前要先 `od -c` 或 `awk` 看真实字节再写 old_str diff --git a/.gitignore b/.gitignore index e43b0f9..65d2992 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .DS_Store +.DS_Store diff --git a/freight-sfa-workspace/freight-sfa.html b/freight-sfa-workspace/freight-sfa.html index f151726..ab655f4 100644 --- a/freight-sfa-workspace/freight-sfa.html +++ b/freight-sfa-workspace/freight-sfa.html @@ -60,7 +60,6 @@ ul,ol{list-style:none} .icon-btn{width:38px;height:38px;border-radius:10px;background:rgba(255,255,255,.12);display:flex;align-items:center;justify-content:center;color:#fff;transition:background .15s} .icon-btn:hover{background:rgba(255,255,255,.22)} .icon-btn svg{width:18px;height:18px} -.user-avatar{width:38px;height:38px;border-radius:50%;background:linear-gradient(135deg,#F5E9D7,#E8D8C0);color:var(--primary-deep);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;border:2px solid rgba(255,255,255,.3)} .menu-toggle{display:none;width:38px;height:38px;border-radius:10px;background:rgba(255,255,255,.12);align-items:center;justify-content:center;color:#fff} .menu-toggle svg{width:20px;height:20px} @@ -77,6 +76,17 @@ ul,ol{list-style:none} .side-item .badge{margin-left:auto;background:var(--accent-cream);color:var(--primary-deep);padding:1px 7px;border-radius:10px;font-size:10px;font-weight:700} .side-item.active .badge{background:rgba(255,255,255,.25);color:#fff} .side-item.alert-badge .badge{background:var(--danger);color:#fff} +.side-drag-hint{margin-left:6px;font-size:11px;color:var(--ink-mute);letter-spacing:-1px;cursor:default;user-select:none} +.side-list{display:flex;flex-direction:column;gap:0} +.side-item .drag-handle{display:inline-flex;align-items:center;justify-content:center;width:14px;font-size:11px;color:var(--ink-mute);cursor:grab;user-select:none;margin-right:-2px;letter-spacing:-1px;opacity:.55;transition:opacity .15s} +.side-item .drag-handle:hover{opacity:1;color:var(--primary)} +.side-item.dragging{opacity:.35;background:var(--primary-soft)} +.side-item.drag-over-top{box-shadow:inset 0 2px 0 var(--primary)} +.side-item.drag-over-bottom{box-shadow:inset 0 -2px 0 var(--primary)} +.side-item .side-label{order:2;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none} +.side-item .ic{order:1} +.side-item .drag-handle{order:3} +.side-item .badge{order:4} .side-divider{height:1px;background:var(--border-soft);margin:14px 12px} .side-footer-card{margin:16px 12px 0;padding:14px;background:linear-gradient(135deg,var(--accent-cream) 0%,#EDDFCC 100%);border-radius:12px;font-size:12px;color:var(--ink-soft)} .side-footer-card h4{font-size:13px;font-weight:700;color:var(--primary-deep);margin-bottom:4px} @@ -109,12 +119,107 @@ ul,ol{list-style:none} .today-bar{background:linear-gradient(135deg,var(--accent-cream) 0%,#EDDFCC 100%);border-radius:var(--radius);padding:18px 22px;margin-bottom:20px;border:1px solid rgba(212,148,74,.15);display:flex;align-items:center;gap:16px;flex-wrap:wrap} .today-bar .label{font-size:13px;font-weight:600;color:var(--primary-deep);display:flex;align-items:center;gap:6px} .today-bar .label svg{width:16px;height:16px} -.today-tasks{display:flex;gap:10px;flex-wrap:wrap;flex:1} -.today-task{background:#fff;border-radius:20px;padding:6px 14px;font-size:12px;font-weight:500;color:var(--ink-soft);box-shadow:var(--shadow-sm);display:flex;align-items:center;gap:8px;max-width:280px} -.today-task.alert{background:var(--danger-soft);color:var(--danger);font-weight:600} -.today-task.alert::before{content:'';width:6px;height:6px;border-radius:50%;background:var(--danger)} -.today-task button{margin-left:auto;color:var(--primary);font-size:11px;font-weight:700} -.today-task button:hover{color:var(--primary-deep)} +.today-tasks{display:flex;flex-direction:column;gap:8px;width:100%;margin-top:10px} +.today-task{border-radius:10px;padding:8px 12px;font-size:13px;font-weight:600;display:flex;align-items:center;gap:10px;border:1px solid transparent} +.today-task .cust-seen{flex-shrink:0;width:20px;height:20px;border:1.5px solid currentColor;border-radius:5px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;opacity:.55;transition:all .18s;background:transparent} +.today-task .cust-seen:hover{opacity:1;transform:scale(1.08)} +.today-task .cust-seen svg{width:14px;height:14px;display:none} +.today-task.seen .cust-seen{background:currentColor;color:inherit;opacity:.85} +.today-task.seen .cust-seen svg{display:block;stroke:#fff} +.today-task.seen .cust-name,.today-task.seen .cust-kinds,.today-task.seen button{opacity:.4} +.today-task.seen{filter:grayscale(.6)} +.today-task .cust-name{flex-shrink:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.today-task .cust-kinds{display:flex;gap:4px;flex-shrink:0;margin-left:auto} +.today-task button{margin-left:8px;font-size:11px;font-weight:700;flex-shrink:0;opacity:.85} +.today-task button:hover{opacity:1} +/* 待跟进:蓝色调 */ +.today-task.row-followup{background:#EEF3FB;color:#3A5A8C;border-color:#C4D2EA} +.today-task.row-followup button{color:#3A5A8C} +/* 今日开船:橙色调 */ +.today-task.row-etd{background:#FBF1E5;color:#9C6A1A;border-color:#EBD3A3} +.today-task.row-etd button{color:#9C6A1A} +/* 逾期回款:红色调 */ +.today-task.row-overdue{background:#FBE8E8;color:#A74242;border-color:#EFC4C4} +.today-task.row-overdue button{color:#A74242} +/* 标签 color 与行色调一致(避免冲突) */ +.today-task .tag.tag-followup{background:#C4D2EA;color:#3A5A8C} +.today-task .tag.tag-etd{background:#EBD3A3;color:#9C6A1A} +.today-task .tag.tag-overdue{background:#EFC4C4;color:#A74242} +.today-tasks-empty{font-size:12px;color:var(--ink-mute);padding:6px 0;text-align:center} +.today-row{display:flex;align-items:center;gap:16px;flex-wrap:wrap;width:100%} +.memo-bar{margin-top:12px;width:100%;padding-top:12px;border-top:1px dashed rgba(212,148,74,.25);display:flex;flex-direction:column;gap:8px} +.memo-label{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--primary-deep)} +.memo-label svg{width:14px;height:14px} +.memo-progress{font-size:11px;color:var(--ink-mute);font-weight:500;margin-left:6px} +.memo-items{display:flex;flex-direction:column;gap:6px;max-height:170px;overflow-y:auto;padding-right:4px} +.memo-item{display:flex;align-items:center;gap:10px;background:rgba(255,255,255,.7);border:1px solid rgba(212,148,74,.18);border-radius:8px;padding:6px 10px;font-size:12px;transition:opacity .15s} +.memo-item.done{opacity:.5;color:var(--ink-mute)} +.memo-item .memo-text{transition:opacity .2s} +.memo-confetti-wrap{position:relative;display:inline-block} +.memo-confetti{position:fixed;width:8px;height:8px;border-radius:2px;pointer-events:none;z-index:9999} +.memo-item .memo-check{flex-shrink:0;width:18px;height:18px;border:1.5px solid var(--primary);border-radius:4px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;background:#fff;transition:all .15s} +.memo-item.done .memo-check{background:var(--primary);color:#fff} +.memo-item .memo-check svg{width:12px;height:12px;display:none} +.memo-item.done .memo-check svg{display:block} +.memo-item .memo-text{flex:1;min-width:0;word-break:break-all} +.memo-item .memo-del{flex-shrink:0;color:var(--ink-mute);cursor:pointer;font-size:14px;padding:2px 6px;border-radius:4px} +.memo-item .memo-del:hover{color:var(--danger);background:var(--danger-soft)} +.memo-add{display:flex;gap:8px;align-items:center;flex-wrap:wrap} +.memo-add input[type=text]{flex:1;min-width:180px;border:1px solid rgba(212,148,74,.3);background:rgba(255,255,255,.7);border-radius:8px;padding:7px 12px;font-size:12px;outline:none;transition:border .15s} +.memo-add input[type=text]:focus{border-color:var(--primary)} +.memo-add input[type=date]{border:1px solid rgba(212,148,74,.3);background:rgba(255,255,255,.7);border-radius:8px;padding:7px 10px;font-size:12px;outline:none;color:var(--ink-soft)} +.memo-calendar-card .card-title svg{width:18px;height:18px;color:var(--primary)} +.memo-calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-top:10px} +.memo-cal-dow{font-size:11px;color:var(--ink-mute);text-align:center;padding:4px 0;font-weight:600} +.memo-cal-cell{background:rgba(255,255,255,.4);border:1px solid rgba(212,148,74,.18);border-radius:8px;padding:6px 6px 4px;min-height:64px;display:flex;flex-direction:column;gap:2px;cursor:pointer;transition:all .15s;position:relative;overflow:hidden} +.memo-cal-cell:hover{background:var(--primary-soft);border-color:var(--primary)} +.memo-cal-cell.is-today{background:var(--primary);color:#fff;border-color:var(--primary-deep)} +.memo-cal-cell.is-today .memo-cal-date{color:#fff;font-weight:700} +.memo-cal-cell.is-other-month{opacity:.35} +.memo-cal-cell.is-selected{outline:2px solid var(--warning);outline-offset:-2px} +.memo-cal-date{font-size:13px;font-weight:600;color:var(--ink-soft)} +.memo-cal-counts{display:flex;gap:4px;font-size:9px;color:var(--ink-mute);margin-top:auto;flex-wrap:wrap} +.memo-cal-counts .pill{padding:1px 5px;border-radius:8px;font-weight:600;line-height:1.3} +.memo-cal-counts .pill.todo{background:var(--primary);color:#fff} +.memo-cal-counts .pill.done{background:var(--success);color:#fff} +.memo-cal-cell.is-today .memo-cal-counts .pill.muted{background:rgba(255,255,255,.25);color:#fff} +.memo-cal-month{display:inline-block;min-width:96px;text-align:center;font-weight:700;font-size:14px;color:var(--primary-deep)} +.memo-wheel{display:flex;flex-direction:column;align-items:center;gap:2px;background:var(--bg-soft);border:1px solid var(--border);border-radius:10px;padding:4px 10px} +.memo-wheel-btn{width:22px;height:18px;display:flex;align-items:center;justify-content:center;font-size:9px;color:var(--primary);border-radius:4px;cursor:pointer;user-select:none;transition:background .15s} +.memo-wheel-btn:hover{background:var(--primary-soft)} +.memo-wheel-btn:active{transform:scale(.9)} +.memo-wheel-val{display:flex;align-items:baseline;gap:2px;padding:2px 0} +.memo-wheel-num{font-size:18px;font-weight:800;color:var(--primary-deep);font-variant-numeric:tabular-nums;min-width:2ch;text-align:right} +.memo-wheel-unit{font-size:11px;color:var(--ink-mute);margin-right:6px} +.memo-wheel-val .memo-wheel-unit:last-child{margin-right:0} +.memo-detail{margin-top:14px;padding:14px 16px;background:linear-gradient(135deg,rgba(245,233,215,.6),rgba(232,216,192,.4));border:1px solid rgba(212,148,74,.25);border-radius:14px;animation:memoDetailIn .25s ease-out} +.memo-detail[hidden]{display:none} +@keyframes memoDetailIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}} +.memo-detail-head{display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap} +.memo-detail-date{font-size:13px;font-weight:700;color:var(--primary-deep)} +.memo-detail-summary{margin-left:auto;font-size:11px;color:var(--ink-mute)} +.memo-detail-close{flex-shrink:0;width:24px;height:24px;border-radius:6px;color:var(--ink-mute);cursor:pointer;font-size:13px;display:flex;align-items:center;justify-content:center;background:transparent;transition:all .15s} +.memo-detail-close:hover{background:var(--danger-soft);color:var(--danger)} +.memo-detail-list{display:flex;flex-direction:column;gap:6px;max-height:240px;overflow-y:auto} +.memo-detail-row{display:flex;align-items:center;gap:10px;background:rgba(255,255,255,.85);border:1px solid rgba(212,148,74,.18);border-radius:8px;padding:7px 10px;font-size:13px;transition:opacity .2s} +.memo-detail-row.is-done{opacity:.5;color:var(--ink-mute)} +.memo-check-lg{flex-shrink:0;width:20px;height:20px;border:1.5px solid var(--primary);border-radius:4px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;background:#fff;transition:all .15s} +.memo-detail-row.is-done .memo-check-lg{background:var(--primary);color:#fff} +.memo-check-lg svg{width:12px;height:12px} +.memo-detail-text{flex:1;min-width:0;word-break:break-all} +.memo-detail-time{flex-shrink:0;font-size:10px;color:var(--ink-mute);font-variant-numeric:tabular-nums} +.memo-detail-del{flex-shrink:0;color:var(--ink-mute);cursor:pointer;font-size:14px;padding:2px 6px;border-radius:4px;transition:all .15s} +.memo-detail-del:hover{color:var(--danger);background:var(--danger-soft)} +.memo-detail-empty{font-size:12px;color:var(--ink-mute);padding:8px 4px} +.memo-detail-add{display:flex;gap:8px;align-items:center;margin-top:10px} +.memo-detail-add input[type=text]{flex:1;min-width:0;border:1px solid rgba(212,148,74,.3);background:rgba(255,255,255,.9);border-radius:8px;padding:8px 12px;font-size:13px;outline:none;transition:border .15s} +.memo-detail-add input[type=text]:focus{border-color:var(--primary)} +@media (max-width:768px){ + .memo-calendar{gap:3px} + .memo-cal-cell{min-height:48px;padding:4px 3px 3px} + .memo-cal-date{font-size:11px} + .memo-cal-counts .pill{font-size:8px} +} .today-bar .quick-stats{display:flex;gap:18px;font-size:12px;color:var(--ink-soft)} .today-bar .quick-stats b{font-size:18px;color:var(--primary-deep);font-weight:700;display:block;margin-bottom:2px} @@ -299,10 +404,10 @@ table.data td{padding:12px;vertical-align:middle} .switch::after{content:'';position:absolute;top:2px;left:2px;width:20px;height:20px;border-radius:50%;background:#fff;transition:transform .15s;box-shadow:0 1px 3px rgba(0,0,0,.2)} .switch.on::after{transform:translateX(18px)} -.drawer-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:50} +.drawer-mask{display:none;position:fixed;inset:0;background:transparent;z-index:50;pointer-events:none} .drawer-mask.open{display:block;animation:fadeIn .2s} @media (max-width:1024px){ - .sidebar{position:fixed;left:-260px;transition:left .25s;box-shadow:var(--shadow-lg)} + .sidebar{position:fixed;left:-260px;transition:left .25s;box-shadow:var(--shadow-lg);z-index:60} .sidebar.open{left:0} :root{--sidebar-w:0px} .app{grid-template-columns:1fr;grid-template-areas:"header" "main"} @@ -346,7 +451,6 @@ table.data td{padding:12px;vertical-align:middle}