@starwish-ai/xingyuan-dsh 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,23 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.1] - 2026-09-05
9
+
10
+ ### Added
11
+ - **Wishes page: collapsible task area**: each wish card's task list now starts collapsed
12
+ behind a full-row disclosure toggle ("N 个任务" / "Tasks (N)" with a chevron that flips
13
+ when expanded). Card-header progress, the "N to claim" badge and the wrap-up guidance
14
+ line stay visible while collapsed; expanding restores the task rows exactly as before —
15
+ claim / check-in buttons and the inline per-task detail expansion now nest inside the
16
+ card-level disclosure. Achieved wishes collapse the same way; wishes without tasks keep
17
+ their existing hint and get no toggle. Expanded cards are remembered across view-tab
18
+ switches (view-state snapshot). Client-only: no API, storage or write-path changes.
19
+
20
+ ### Changed
21
+ - Wish-card copy de-jargoned: the empty hint now says "还没有任务" (was "暂无下属任务")
22
+ and the delete-wish confirmation says "它的任务…" (was "下属任务…"), matching the
23
+ established plain-wording standard for user-facing surfaces.
24
+
8
25
  ## [0.6.0] - 2026-09-05
9
26
 
10
27
  > **Note:** behavioral revision — long-term ratios (wish progress, progress charts) join
@@ -64,7 +64,8 @@ export const ZH_DICT = {
64
64
  'wish.settled': '待收尾',
65
65
  'wish.settleHint': '答应自己的都做完了——待领取的领了继续,或删掉就达成',
66
66
  'wish.eta': '预计完成 {date}',
67
- 'wish.noTasks': '暂无下属任务——在对话里告诉我,让我为它推荐打卡任务',
67
+ 'wish.noTasks': '还没有任务——在对话里告诉我,让我为它推荐打卡任务',
68
+ 'wish.tasksToggle': '{n} 个任务',
68
69
  'wish.pageTitle': '我的愿望',
69
70
  'wish.summary': '{active} 个进行中{planning}{settled}{achieved}',
70
71
  'wish.planningSuffix': ' · {n} 个计划中',
@@ -128,7 +129,7 @@ export const ZH_DICT = {
128
129
  'confirm.undoAt': '确定撤销「{name}」在{date}的打卡吗?进度将回退。',
129
130
  'confirm.futureAt': '「{name}」的打卡日 {date} 在今天之后,提前打卡表示承诺当天完成。确认?',
130
131
  'confirm.deleteTask': '确定删除任务「{name}」吗?其打卡记录与微行动拆解将一并删除,不可恢复。',
131
- 'confirm.deleteWish': '确定删除愿望「{name}」吗?下属任务、打卡记录与微行动拆解将一并删除,不可恢复。',
132
+ 'confirm.deleteWish': '确定删除愿望「{name}」吗?它的任务、打卡记录与微行动拆解将一并删除,不可恢复。',
132
133
  'confirm.renameCategory': '把分类「{old}」下的全部愿望改名为「{new}」吗?(共 {count} 个)', 'confirm.deleteEmptyCategory': '删除空分类「{name}」的自定义颜色吗?',
133
134
  // --- 今日页 ---
134
135
  'today.title': '今日打卡 · {date}',
@@ -493,6 +494,7 @@ const EN_DICT = {
493
494
  'wish.settleHint': 'Everything you committed to is done — claim the rest to keep going, or delete them to achieve the wish',
494
495
  'wish.eta': 'Target date {date}',
495
496
  'wish.noTasks': 'No tasks yet — tell me in chat and I will suggest check-in tasks for it',
497
+ 'wish.tasksToggle': 'Tasks ({n})',
496
498
  'wish.pageTitle': 'My Wishes',
497
499
  'wish.summary': '{active} in progress{planning}{settled}{achieved}',
498
500
  'wish.planningSuffix': ' · {n} planning',
@@ -1,11 +1,11 @@
1
- /** 愿望页:进行中/已达成愿望卡 + 下属任务行(领取/打卡/详情聚合)+ 愿望删除 + 分类管理 + 快速新建。 */
1
+ /** 愿望页:进行中/已达成愿望卡 + 任务区披露(默认收起,展开集合跨标签保留)+ 任务行(领取/打卡/详情聚合)+ 愿望删除 + 分类管理 + 快速新建。 */
2
2
  import { createElement, useState, useSyncExternalStore } from 'react';
3
3
  import { postAction } from '../api.js';
4
4
  import { useXyT } from '../i18n.js';
5
5
  import { softConfirmDanger, useActionGuard, usePageData, useScrollTopOnMount, useStableScrollbar } from '../hooks.js';
6
6
  import { getViewState, setViewState } from '../view-state.js';
7
7
  import { todayHintStore } from '../tab-hint.js';
8
- import { PageEmpty, PageError, PageSkeleton, StaleBanner, toast, IconTrash, focusPageTitle } from '../ui.js';
8
+ import { PageEmpty, PageError, PageSkeleton, StaleBanner, toast, IconTrash, IconChevronDown, focusPageTitle } from '../ui.js';
9
9
  import { categoryVars } from '../../category-color.js';
10
10
  import { TaskLine } from './task-line.js';
11
11
  import { formatMediumDate } from './format.js';
@@ -34,6 +34,19 @@ export function WishesPage() {
34
34
  next.add(taskId);
35
35
  setExpanded(next);
36
36
  };
37
+ // 愿望卡任务区披露集合(默认收起):愿望页定位总览,任务明细是二级信息;打卡/领取
38
+ // 主触点在今日页/日历,卡头进度/待领取数/收尾指引不受收起影响。展开集合与任务详情
39
+ // 展开集分开(两个粒度互不覆盖),同样经 view-state 跨标签切换保留
40
+ const [tasksOpen, setTasksOpenRaw] = useState(() => getViewState('wishes.tasksOpen', new Set()));
41
+ const setTasksOpen = (next) => { setViewState('wishes.tasksOpen', next); setTasksOpenRaw(next); };
42
+ const toggleTasks = (wishId) => {
43
+ const next = new Set(tasksOpen);
44
+ if (next.has(wishId))
45
+ next.delete(wishId);
46
+ else
47
+ next.add(wishId);
48
+ setTasksOpen(next);
49
+ };
37
50
  if (page.error !== undefined && page.data === undefined)
38
51
  return createElement(PageError, { message: page.error, onRetry: () => void page.reload() });
39
52
  const data = page.data;
@@ -104,9 +117,23 @@ export function WishesPage() {
104
117
  'aria-valuemax': 100,
105
118
  'aria-valuenow': wish.progress,
106
119
  'aria-label': progressLabel + pendingMeta,
107
- }, createElement('div', { className: 'xy-bar-fill', style: { transform: `scaleX(${Math.min(wish.progress, 100) / 100})` } })), settled ? createElement('div', { className: 'xy-meta' }, t('wish.settleHint')) : null, wish.tasks.length > 0
108
- ? createElement('div', { className: 'xy-wishtasks' }, ...wishTasks(wish))
109
- : createElement('div', { className: 'xy-meta' }, t('wish.noTasks')));
120
+ }, createElement('div', { className: 'xy-bar-fill', style: { transform: `scaleX(${Math.min(wish.progress, 100) / 100})` } })), settled ? createElement('div', { className: 'xy-meta' }, t('wish.settleHint')) : null,
121
+ // 任务区披露:有任务时默认收起为整行开关(文本=任务数 + 箭头,aria-controls 关联
122
+ // 容器 id;展开后开关仍在列表上方兼作收起控件);无任务维持原文案,不出开关
123
+ ...(wish.tasks.length > 0
124
+ ? [
125
+ createElement('button', {
126
+ key: 'wishtoggle',
127
+ className: 'xy-wishtoggle',
128
+ 'aria-expanded': tasksOpen.has(wish.wishId),
129
+ 'aria-controls': `xy-wishtasks-${wish.wishId}`,
130
+ onClick: () => toggleTasks(wish.wishId),
131
+ }, t('wish.tasksToggle', { n: wish.tasks.length }), createElement(IconChevronDown)),
132
+ tasksOpen.has(wish.wishId)
133
+ ? createElement('div', { key: 'wishtasks', id: `xy-wishtasks-${wish.wishId}`, className: 'xy-wishtasks' }, ...wishTasks(wish))
134
+ : null,
135
+ ]
136
+ : [createElement('div', { key: 'notasks', className: 'xy-meta' }, t('wish.noTasks'))]));
110
137
  };
111
138
  return createElement('div', { className: 'xy-page', ref: stabilize }, page.error !== undefined ? createElement(StaleBanner, { onRetry: () => void page.reload() }) : null, showNoPresetHint ? createElement('p', { className: 'xy-hint' }, t('today.noPresetHint')) : null, createElement('div', { className: 'xy-page-head' }, createElement('h2', { className: 'xy-page-title' }, t('wish.pageTitle')), createElement('span', { className: 'xy-meta' }, t('wish.summary', {
112
139
  // 四态计数各计各的(进行中扣除计划中与待收尾,不相套);列表渲染仍归未完成组(未完成≠进行中计数)
@@ -236,9 +236,9 @@ body[data-ds-dark-theme] .xy-badge-cat{background:hsl(var(--cat-h,275) calc(var(
236
236
  }
237
237
  .xy-btn:active:not(:disabled){transform:scale(.97)}
238
238
  .xy-btn:disabled{opacity:.55;cursor:not-allowed}
239
- .xy-btn:focus-visible,.xy-input:focus-visible,.xy-cell:focus-visible,.xy-seg-btn:focus-visible,.xy-toggle:focus-visible,.xy-swatch:focus-visible,.xy-growth-col:focus-visible{outline:2px solid var(--xyd-accent);outline-offset:2px}
239
+ .xy-btn:focus-visible,.xy-input:focus-visible,.xy-cell:focus-visible,.xy-seg-btn:focus-visible,.xy-toggle:focus-visible,.xy-swatch:focus-visible,.xy-growth-col:focus-visible,.xy-wishtoggle:focus-visible{outline:2px solid var(--xyd-accent);outline-offset:2px}
240
240
  /* 触控基线:消除移动端双击缩放延迟与系统点按高亮(交互反馈统一由 hover/active 承担) */
241
- .xy-btn,.xy-seg-btn,.xy-cell,.xy-swatch,.xy-toggle,.xy-growth-col{touch-action:manipulation;-webkit-tap-highlight-color:transparent}
241
+ .xy-btn,.xy-seg-btn,.xy-cell,.xy-swatch,.xy-toggle,.xy-growth-col,.xy-wishtoggle{touch-action:manipulation;-webkit-tap-highlight-color:transparent}
242
242
  /* 行内按钮:≥26px 命中目标(卡片头/操作行的紧凑主战按钮) */
243
243
  .xy-btn-inline{margin-left:auto;padding:3px 10px;font-size:12px;min-height:26px;display:inline-flex;align-items:center}
244
244
  /* 图标幽灵键(≥26px 方形命中目标):编辑/删除这类高频重复的行内低频动作降噪——
@@ -321,9 +321,17 @@ body[data-ds-dark-theme] .xy-badge-cat{background:hsl(var(--cat-h,275) calc(var(
321
321
  .xy-wishcard:hover{border-color:var(--dsw-alias-border-l2);box-shadow:var(--xyd-shadow-card)}
322
322
  }
323
323
  .xy-progress-num{margin-left:auto;flex:none;color:var(--dsw-alias-label-secondary);font-size:12px;font-variant-numeric:tabular-nums}
324
- /* 卡内子任务列表:分隔线替代裸 gap 堆叠;行留白由任务行自身 padding 承担。
324
+ /* 任务区披露开关(默认收起,展开集合走 view-state):整行按钮继承虚线分隔(原属
325
+ * .xy-wishtasks 的卡内分界),箭头旋转只动 transform;按钮文本含任务数(口语化,无状态词)。 */
326
+ .xy-wishtoggle{margin-top:8px;display:flex;align-items:center;gap:5px;width:100%;padding:8px 0 5px;background:none;border:0;border-top:1px dashed var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;cursor:pointer;text-align:left}
327
+ @media (hover:hover) and (pointer:fine){
328
+ .xy-wishtoggle:hover{color:var(--dsw-alias-label-primary)}
329
+ }
330
+ .xy-wishtoggle svg{flex:none;transition:transform .15s ease}
331
+ .xy-wishtoggle[aria-expanded='true'] svg{transform:rotate(180deg)}
332
+ /* 卡内子任务列表:分隔线已上移到披露开关,行留白由任务行自身 padding 承担。
325
333
  * 结构为 [taskline, detail?, taskline, detail?] —— 相邻选择器精确命中「新任务行」边界。 */
326
- .xy-wishtasks{margin-top:8px;display:flex;flex-direction:column;border-top:1px dashed var(--dsw-alias-border-l1)}
334
+ .xy-wishtasks{display:flex;flex-direction:column}
327
335
  .xy-wishtasks>.xy-taskline+.xy-taskline,.xy-wishtasks>.xy-detail+.xy-taskline{border-top:1px solid var(--dsw-alias-border-l1)}
328
336
  .xy-wishtasks>.xy-taskline{padding:9px 0}
329
337
  /* 展开详情是卡内最后一个元素时收掉底部留白:卡片自身 padding 已承担收尾 */
@@ -581,6 +589,6 @@ body[data-ds-dark-theme] .xy-dcell-checked{color:var(--xyd-on-dcell)}
581
589
  @media (prefers-reduced-motion: reduce){
582
590
  .xy-skel,.xy-toast,.xy-modal-backdrop,.xy-modal{animation:none}
583
591
  .xy-toast-out,.xy-modal-backdrop.xy-modal-out,.xy-modal-out .xy-modal{transition:none}
584
- .xy-bar-fill,.xy-btn,.xy-toggle,.xy-toggle::after,.xy-wishcard,.xy-cell,.xy-daynum,.xy-seg-btn,.xy-input,.xy-swatch,.xy-grouprow{transition:none}
592
+ .xy-bar-fill,.xy-btn,.xy-toggle,.xy-toggle::after,.xy-wishcard,.xy-cell,.xy-daynum,.xy-seg-btn,.xy-input,.xy-swatch,.xy-grouprow,.xy-wishtoggle svg{transition:none}
585
593
  }
586
594
  `;
package/lib/client/ui.js CHANGED
@@ -200,6 +200,13 @@ export function IconEdit() {
200
200
  style: { display: 'block', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round' },
201
201
  }, createElement('path', { d: 'M13.5 5l5.5 5.5' }), createElement('path', { d: 'M5 19l1-4L17.5 3.5a2.12 2.12 0 0 1 3 3L9 18z' }));
202
202
  }
203
+ /** 下箭头线性图标(披露开关方向指示;展开态旋转由宿主按钮的 aria-expanded 选择器驱动)。 */
204
+ export function IconChevronDown() {
205
+ return createElement('svg', {
206
+ viewBox: '0 0 24 24', width: 14, height: 14, 'aria-hidden': 'true', focusable: 'false',
207
+ style: { display: 'block', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round' },
208
+ }, createElement('path', { d: 'M6 9l6 6 6-6' }));
209
+ }
203
210
  // ===== 页面三态 =====
204
211
  export function PageError(props) {
205
212
  return createElement('div', { className: 'xy-page-center' }, createElement('div', { className: 'xy-empty-title' }, props.message), createElement('button', { className: 'xy-btn', onClick: props.onRetry }, props.retryLabel ?? t('common.retry')));
package/lib/client.js CHANGED
@@ -67,7 +67,8 @@ const ZH_DICT = {
67
67
  "wish.settled": "待收尾",
68
68
  "wish.settleHint": "答应自己的都做完了——待领取的领了继续,或删掉就达成",
69
69
  "wish.eta": "预计完成 {date}",
70
- "wish.noTasks": "暂无下属任务——在对话里告诉我,让我为它推荐打卡任务",
70
+ "wish.noTasks": "还没有任务——在对话里告诉我,让我为它推荐打卡任务",
71
+ "wish.tasksToggle": "{n} 个任务",
71
72
  "wish.pageTitle": "我的愿望",
72
73
  "wish.summary": "{active} 个进行中{planning}{settled}{achieved}",
73
74
  "wish.planningSuffix": " · {n} 个计划中",
@@ -127,7 +128,7 @@ const ZH_DICT = {
127
128
  "confirm.undoAt": "确定撤销「{name}」在{date}的打卡吗?进度将回退。",
128
129
  "confirm.futureAt": "「{name}」的打卡日 {date} 在今天之后,提前打卡表示承诺当天完成。确认?",
129
130
  "confirm.deleteTask": "确定删除任务「{name}」吗?其打卡记录与微行动拆解将一并删除,不可恢复。",
130
- "confirm.deleteWish": "确定删除愿望「{name}」吗?下属任务、打卡记录与微行动拆解将一并删除,不可恢复。",
131
+ "confirm.deleteWish": "确定删除愿望「{name}」吗?它的任务、打卡记录与微行动拆解将一并删除,不可恢复。",
131
132
  "confirm.renameCategory": "把分类「{old}」下的全部愿望改名为「{new}」吗?(共 {count} 个)",
132
133
  "confirm.deleteEmptyCategory": "删除空分类「{name}」的自定义颜色吗?",
133
134
  "today.title": "今日打卡 · {date}",
@@ -474,6 +475,7 @@ const EN_DICT = {
474
475
  "wish.settleHint": "Everything you committed to is done — claim the rest to keep going, or delete them to achieve the wish",
475
476
  "wish.eta": "Target date {date}",
476
477
  "wish.noTasks": "No tasks yet — tell me in chat and I will suggest check-in tasks for it",
478
+ "wish.tasksToggle": "Tasks ({n})",
477
479
  "wish.pageTitle": "My Wishes",
478
480
  "wish.summary": "{active} in progress{planning}{settled}{achieved}",
479
481
  "wish.planningSuffix": " · {n} planning",
@@ -1239,6 +1241,24 @@ function IconEdit() {
1239
1241
  }
1240
1242
  }, (0, react.createElement)("path", { d: "M13.5 5l5.5 5.5" }), (0, react.createElement)("path", { d: "M5 19l1-4L17.5 3.5a2.12 2.12 0 0 1 3 3L9 18z" }));
1241
1243
  }
1244
+ /** 下箭头线性图标(披露开关方向指示;展开态旋转由宿主按钮的 aria-expanded 选择器驱动)。 */
1245
+ function IconChevronDown() {
1246
+ return (0, react.createElement)("svg", {
1247
+ viewBox: "0 0 24 24",
1248
+ width: 14,
1249
+ height: 14,
1250
+ "aria-hidden": "true",
1251
+ focusable: "false",
1252
+ style: {
1253
+ display: "block",
1254
+ fill: "none",
1255
+ stroke: "currentColor",
1256
+ strokeWidth: 2,
1257
+ strokeLinecap: "round",
1258
+ strokeLinejoin: "round"
1259
+ }
1260
+ }, (0, react.createElement)("path", { d: "M6 9l6 6 6-6" }));
1261
+ }
1242
1262
  function PageError(props) {
1243
1263
  return (0, react.createElement)("div", { className: "xy-page-center" }, (0, react.createElement)("div", { className: "xy-empty-title" }, props.message), (0, react.createElement)("button", {
1244
1264
  className: "xy-btn",
@@ -1524,9 +1544,9 @@ body[data-ds-dark-theme] .xy-badge-cat{background:hsl(var(--cat-h,275) calc(var(
1524
1544
  }
1525
1545
  .xy-btn:active:not(:disabled){transform:scale(.97)}
1526
1546
  .xy-btn:disabled{opacity:.55;cursor:not-allowed}
1527
- .xy-btn:focus-visible,.xy-input:focus-visible,.xy-cell:focus-visible,.xy-seg-btn:focus-visible,.xy-toggle:focus-visible,.xy-swatch:focus-visible,.xy-growth-col:focus-visible{outline:2px solid var(--xyd-accent);outline-offset:2px}
1547
+ .xy-btn:focus-visible,.xy-input:focus-visible,.xy-cell:focus-visible,.xy-seg-btn:focus-visible,.xy-toggle:focus-visible,.xy-swatch:focus-visible,.xy-growth-col:focus-visible,.xy-wishtoggle:focus-visible{outline:2px solid var(--xyd-accent);outline-offset:2px}
1528
1548
  /* 触控基线:消除移动端双击缩放延迟与系统点按高亮(交互反馈统一由 hover/active 承担) */
1529
- .xy-btn,.xy-seg-btn,.xy-cell,.xy-swatch,.xy-toggle,.xy-growth-col{touch-action:manipulation;-webkit-tap-highlight-color:transparent}
1549
+ .xy-btn,.xy-seg-btn,.xy-cell,.xy-swatch,.xy-toggle,.xy-growth-col,.xy-wishtoggle{touch-action:manipulation;-webkit-tap-highlight-color:transparent}
1530
1550
  /* 行内按钮:≥26px 命中目标(卡片头/操作行的紧凑主战按钮) */
1531
1551
  .xy-btn-inline{margin-left:auto;padding:3px 10px;font-size:12px;min-height:26px;display:inline-flex;align-items:center}
1532
1552
  /* 图标幽灵键(≥26px 方形命中目标):编辑/删除这类高频重复的行内低频动作降噪——
@@ -1609,9 +1629,17 @@ body[data-ds-dark-theme] .xy-badge-cat{background:hsl(var(--cat-h,275) calc(var(
1609
1629
  .xy-wishcard:hover{border-color:var(--dsw-alias-border-l2);box-shadow:var(--xyd-shadow-card)}
1610
1630
  }
1611
1631
  .xy-progress-num{margin-left:auto;flex:none;color:var(--dsw-alias-label-secondary);font-size:12px;font-variant-numeric:tabular-nums}
1612
- /* 卡内子任务列表:分隔线替代裸 gap 堆叠;行留白由任务行自身 padding 承担。
1632
+ /* 任务区披露开关(默认收起,展开集合走 view-state):整行按钮继承虚线分隔(原属
1633
+ * .xy-wishtasks 的卡内分界),箭头旋转只动 transform;按钮文本含任务数(口语化,无状态词)。 */
1634
+ .xy-wishtoggle{margin-top:8px;display:flex;align-items:center;gap:5px;width:100%;padding:8px 0 5px;background:none;border:0;border-top:1px dashed var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;cursor:pointer;text-align:left}
1635
+ @media (hover:hover) and (pointer:fine){
1636
+ .xy-wishtoggle:hover{color:var(--dsw-alias-label-primary)}
1637
+ }
1638
+ .xy-wishtoggle svg{flex:none;transition:transform .15s ease}
1639
+ .xy-wishtoggle[aria-expanded='true'] svg{transform:rotate(180deg)}
1640
+ /* 卡内子任务列表:分隔线已上移到披露开关,行留白由任务行自身 padding 承担。
1613
1641
  * 结构为 [taskline, detail?, taskline, detail?] —— 相邻选择器精确命中「新任务行」边界。 */
1614
- .xy-wishtasks{margin-top:8px;display:flex;flex-direction:column;border-top:1px dashed var(--dsw-alias-border-l1)}
1642
+ .xy-wishtasks{display:flex;flex-direction:column}
1615
1643
  .xy-wishtasks>.xy-taskline+.xy-taskline,.xy-wishtasks>.xy-detail+.xy-taskline{border-top:1px solid var(--dsw-alias-border-l1)}
1616
1644
  .xy-wishtasks>.xy-taskline{padding:9px 0}
1617
1645
  /* 展开详情是卡内最后一个元素时收掉底部留白:卡片自身 padding 已承担收尾 */
@@ -1869,7 +1897,7 @@ body[data-ds-dark-theme] .xy-dcell-checked{color:var(--xyd-on-dcell)}
1869
1897
  @media (prefers-reduced-motion: reduce){
1870
1898
  .xy-skel,.xy-toast,.xy-modal-backdrop,.xy-modal{animation:none}
1871
1899
  .xy-toast-out,.xy-modal-backdrop.xy-modal-out,.xy-modal-out .xy-modal{transition:none}
1872
- .xy-bar-fill,.xy-btn,.xy-toggle,.xy-toggle::after,.xy-wishcard,.xy-cell,.xy-daynum,.xy-seg-btn,.xy-input,.xy-swatch,.xy-grouprow{transition:none}
1900
+ .xy-bar-fill,.xy-btn,.xy-toggle,.xy-toggle::after,.xy-wishcard,.xy-cell,.xy-daynum,.xy-seg-btn,.xy-input,.xy-swatch,.xy-grouprow,.xy-wishtoggle svg{transition:none}
1873
1901
  }
1874
1902
  `;
1875
1903
 
@@ -3642,7 +3670,7 @@ function TaskQuickForm(props) {
3642
3670
 
3643
3671
  //#endregion
3644
3672
  //#region src/client/pages/wishes.ts
3645
- /** 愿望页:进行中/已达成愿望卡 + 下属任务行(领取/打卡/详情聚合)+ 愿望删除 + 分类管理 + 快速新建。 */
3673
+ /** 愿望页:进行中/已达成愿望卡 + 任务区披露(默认收起,展开集合跨标签保留)+ 任务行(领取/打卡/详情聚合)+ 愿望删除 + 分类管理 + 快速新建。 */
3646
3674
  function WishesPage() {
3647
3675
  const t = useXyT();
3648
3676
  const showNoPresetHint = (0, react.useSyncExternalStore)(todayHintStore.subscribe, todayHintStore.getSnapshot);
@@ -3663,6 +3691,17 @@ function WishesPage() {
3663
3691
  else next.add(taskId);
3664
3692
  setExpanded(next);
3665
3693
  };
3694
+ const [tasksOpen, setTasksOpenRaw] = (0, react.useState)(() => getViewState("wishes.tasksOpen", /* @__PURE__ */ new Set()));
3695
+ const setTasksOpen = (next) => {
3696
+ setViewState("wishes.tasksOpen", next);
3697
+ setTasksOpenRaw(next);
3698
+ };
3699
+ const toggleTasks = (wishId) => {
3700
+ const next = new Set(tasksOpen);
3701
+ if (next.has(wishId)) next.delete(wishId);
3702
+ else next.add(wishId);
3703
+ setTasksOpen(next);
3704
+ };
3666
3705
  if (page.error !== void 0 && page.data === void 0) return (0, react.createElement)(PageError, {
3667
3706
  message: page.error,
3668
3707
  onRetry: () => void page.reload()
@@ -3733,7 +3772,20 @@ function WishesPage() {
3733
3772
  }, (0, react.createElement)("div", {
3734
3773
  className: "xy-bar-fill",
3735
3774
  style: { transform: `scaleX(${Math.min(wish.progress, 100) / 100})` }
3736
- })), settled ? (0, react.createElement)("div", { className: "xy-meta" }, t("wish.settleHint")) : null, wish.tasks.length > 0 ? (0, react.createElement)("div", { className: "xy-wishtasks" }, ...wishTasks(wish)) : (0, react.createElement)("div", { className: "xy-meta" }, t("wish.noTasks")));
3775
+ })), settled ? (0, react.createElement)("div", { className: "xy-meta" }, t("wish.settleHint")) : null, ...wish.tasks.length > 0 ? [(0, react.createElement)("button", {
3776
+ key: "wishtoggle",
3777
+ className: "xy-wishtoggle",
3778
+ "aria-expanded": tasksOpen.has(wish.wishId),
3779
+ "aria-controls": `xy-wishtasks-${wish.wishId}`,
3780
+ onClick: () => toggleTasks(wish.wishId)
3781
+ }, t("wish.tasksToggle", { n: wish.tasks.length }), (0, react.createElement)(IconChevronDown)), tasksOpen.has(wish.wishId) ? (0, react.createElement)("div", {
3782
+ key: "wishtasks",
3783
+ id: `xy-wishtasks-${wish.wishId}`,
3784
+ className: "xy-wishtasks"
3785
+ }, ...wishTasks(wish)) : null] : [(0, react.createElement)("div", {
3786
+ key: "notasks",
3787
+ className: "xy-meta"
3788
+ }, t("wish.noTasks"))]);
3737
3789
  };
3738
3790
  return (0, react.createElement)("div", {
3739
3791
  className: "xy-page",
@@ -44,7 +44,8 @@ export declare const ZH_DICT: {
44
44
  readonly 'wish.settled': "待收尾";
45
45
  readonly 'wish.settleHint': "答应自己的都做完了——待领取的领了继续,或删掉就达成";
46
46
  readonly 'wish.eta': "预计完成 {date}";
47
- readonly 'wish.noTasks': "暂无下属任务——在对话里告诉我,让我为它推荐打卡任务";
47
+ readonly 'wish.noTasks': "还没有任务——在对话里告诉我,让我为它推荐打卡任务";
48
+ readonly 'wish.tasksToggle': "{n} 个任务";
48
49
  readonly 'wish.pageTitle': "我的愿望";
49
50
  readonly 'wish.summary': "{active} 个进行中{planning}{settled}{achieved}";
50
51
  readonly 'wish.planningSuffix': " · {n} 个计划中";
@@ -104,7 +105,7 @@ export declare const ZH_DICT: {
104
105
  readonly 'confirm.undoAt': "确定撤销「{name}」在{date}的打卡吗?进度将回退。";
105
106
  readonly 'confirm.futureAt': "「{name}」的打卡日 {date} 在今天之后,提前打卡表示承诺当天完成。确认?";
106
107
  readonly 'confirm.deleteTask': "确定删除任务「{name}」吗?其打卡记录与微行动拆解将一并删除,不可恢复。";
107
- readonly 'confirm.deleteWish': "确定删除愿望「{name}」吗?下属任务、打卡记录与微行动拆解将一并删除,不可恢复。";
108
+ readonly 'confirm.deleteWish': "确定删除愿望「{name}」吗?它的任务、打卡记录与微行动拆解将一并删除,不可恢复。";
108
109
  readonly 'confirm.renameCategory': "把分类「{old}」下的全部愿望改名为「{new}」吗?(共 {count} 个)";
109
110
  readonly 'confirm.deleteEmptyCategory': "删除空分类「{name}」的自定义颜色吗?";
110
111
  readonly 'today.title': "今日打卡 · {date}";
@@ -1,3 +1,3 @@
1
- /** 愿望页:进行中/已达成愿望卡 + 下属任务行(领取/打卡/详情聚合)+ 愿望删除 + 分类管理 + 快速新建。 */
1
+ /** 愿望页:进行中/已达成愿望卡 + 任务区披露(默认收起,展开集合跨标签保留)+ 任务行(领取/打卡/详情聚合)+ 愿望删除 + 分类管理 + 快速新建。 */
2
2
  import { type ReactElement } from 'react';
3
3
  export declare function WishesPage(): ReactElement;
@@ -16,4 +16,4 @@
16
16
  * 令牌区**(:root 与深色覆盖块,即「会话卡片」分段注释之前),正文区一律引用
17
17
  * 令牌;该约束由 test/style-contract.test.ts 机械锁定(含 gen-mock 产物)。
18
18
  */
19
- export declare const STYLE_TEXT = "\n/* ===== \u54C1\u724C\u4E0E\u8BED\u4E49\u4EE4\u724C ===== */\n:root{\n --xyd-accent:#1a6fe0;\n --xyd-on-accent:#ffffff;\n --xyd-accent-strong:#1e40af;\n --xyd-accent-soft:rgba(26,111,224,.12);\n --xyd-danger:#c0392b;\n --xyd-danger-bg:#c0392b;\n --xyd-warn:#b45309;\n --xyd-ok:#0f766e;\n /* \u5F69\u5E95\u5C0F\u5706\u6807\u7684\u524D\u666F\u5BF9\uFF1A\u6309\u4E3B\u9898\u914D\u5BF9\u4FDD\u8BC1 \u22654.5:1\uFF08\u6DF1\u8272\u4EAE\u5E95\u914D\u6DF1\u5B57\uFF09 */\n --xyd-on-ok:#ffffff;\n --xyd-on-danger:#ffffff;\n /* \u6B21\u8981\u6587\u5B57\u5728\u6B21\u7EA7\u9762\u677F\u5E95\uFF08layer-2\uFF09\u4E0A\u7684\u4E13\u7528\u5BF9\uFF1A\u58F3\u901A\u7528\u6B21\u8981\u8272\u5BF9 layer-2 \u53EA\u6709\n * \u22484.3:1\uFF0C\u672C\u5BF9\u6309 5.0+:1 \u6821\u51C6\uFF08\u9884\u89C8\u6761/\u7EC4\u8BA1\u6570/\u7B49\u7EA7\u7F16\u53F7/\u672A\u6765\u683C/\u6210\u957F\u8F74\u523B\u5EA6\uFF09 */\n --xyd-label-on-2:#5d6a7d;\n /* \u534A\u900F\u660E\u884D\u751F\u8272\uFF08\u7981 color-mix\uFF0C\u6309\u4E3B\u9898\u663E\u5F0F rgba\uFF09\uFF1A\u5F3A\u8C03\u63CF\u8FB9 / \u5F3A\u8C03\u60AC\u505C\u73AF /\n \u5371\u9669\u63CF\u8FB9 / \u5371\u9669\u60AC\u505C\u5E95 / \u4E2D\u6027\u884C\u60AC\u505C\u5E95 / \u659C\u7EB9\u7EB9\u7406\u4E0E\u5F31\u5316\u5E95 */\n --xyd-accent-border:rgba(26,111,224,.38);\n --xyd-accent-ring:rgba(26,111,224,.72);\n --xyd-accent-ring-soft:rgba(26,111,224,.55);\n --xyd-danger-border:rgba(192,57,43,.4);\n --xyd-danger-soft:rgba(192,57,43,.09);\n --xyd-hover:rgba(15,23,42,.05);\n --xyd-hatch:rgba(100,116,139,.36);\n --xyd-hatch-faint:rgba(100,116,139,.14);\n /* \u6210\u529F/\u8B66\u793A\u8BED\u4E49\u67D4\u548C\u5E95\u4E0E\u63CF\u8FB9\u5BF9\uFF08\u6253\u5361\u5361/\u5FAE\u884C\u52A8\u5361/\u6210\u529F\u6A2A\u5E45/\u56FE\u8868\u5FBD\u7AE0\uFF09\uFF1A\n * \u6B64\u524D\u5355\u503C\u900F\u660E\u5EA6\u4E24\u4E3B\u9898\u5171\u7528\uFF0C\u6DF1\u8272\u4E0B .08 \u7EFF\u6D17\u51E0\u4E4E\u4E0D\u53EF\u89C1 */\n --xyd-ok-soft:rgba(56,217,169,.09);\n --xyd-ok-border:rgba(56,217,169,.4);\n --xyd-ok-badge:rgba(56,217,169,.18);\n --xyd-warn-soft:rgba(255,169,77,.2);\n --xyd-warn-border:rgba(255,169,77,.4);\n /* \u65E5\u5386\u72B6\u6001\u5E95\uFF08\u90E8\u5206/\u5168\u90E8\u5B8C\u6210\uFF09\u4E0E\u6253\u5361\u8BB0\u5F55\u683C\uFF08\u5DF2\u6253\u5361\uFF09\u7684\u6210\u5BF9\u5E95\u8272 */\n --xyd-c2-soft:rgba(255,169,77,.32);\n --xyd-c3-soft:rgba(16,185,129,.22);\n --xyd-c3-soft-dot:rgba(16,185,129,.30);\n --xyd-dcell-checked:rgba(56,217,169,.42);\n --xyd-dcell-checked-dot:rgba(56,217,169,.55);\n /* \u4E0A\u8FF0\u6210\u5BF9\u5E95\u8272\u7684\u524D\u666F\u4F19\u4F34\uFF08\u540C\u4F7F\u7528\u70B9\u6536\u8FDB\u4EE4\u724C\u533A\uFF0C\u6F02\u79FB\u5373\u7EA2\uFF09 */\n --xyd-on-c2:#7c4a03;\n --xyd-on-c3:#065f46;\n --xyd-on-dcell:#0b3d26;\n /* \u9634\u5F71\u5BF9\uFF08\u5361\u7247\u60AC\u505C/toast/\u5F39\u7A97/\u82F1\u96C4\u5361\uFF09\uFF1A\u6DF1\u6D45\u5404\u81EA\u914D\u6863\uFF0C\u7981\u6B62\u6B63\u6587\u533A\u88F8\u5199 rgba */\n --xyd-shadow-card:0 2px 10px rgba(15,23,42,.07);\n --xyd-shadow-toast:0 8px 24px -8px rgba(15,23,42,.2),0 2px 8px -2px rgba(15,23,42,.1);\n --xyd-shadow-modal:0 24px 48px -16px rgba(15,23,42,.35),0 4px 12px -4px rgba(15,23,42,.2);\n --xyd-shadow-hero:0 2px 10px rgba(30,25,60,.16);\n --xyd-hero-border:rgba(255,255,255,.16);\n --xyd-on-hero:rgba(255,255,255,.92);\n --xyd-bar-on-hero:rgba(255,255,255,.28);\n --xyd-swatch-ring:rgba(255,255,255,.85);\n --xyd-swatch-glyph-shadow:0 0 2px rgba(0,0,0,.85),0 1px 3px rgba(0,0,0,.6);\n --xyd-herobadge-glyph-shadow:0 1px 2px rgba(0,0,0,.18);\n /* \u58F3\u906E\u7F69\u4EE4\u724C\u7F3A\u5E2D\u65F6\u7684\u515C\u5E95\uFF08\u4E0D\u518D\u5728\u89C4\u5219\u884C\u5185\u88F8\u5199 rgba \u515C\u5E95\u503C\uFF09 */\n --xyd-mask:rgba(15,23,42,.45);\n /* \u5706\u89D2\u523B\u5EA6 */\n --xyd-r-card:12px;--xyd-r-inner:9px;--xyd-r-ctl:8px;\n}\nbody[data-ds-dark-theme]{\n --xyd-accent:#60a5fa;\n --xyd-on-accent:#0f172a;\n --xyd-accent-strong:#93c5fd;\n --xyd-accent-soft:rgba(96,165,250,.16);\n --xyd-danger:#ff9b8f;\n --xyd-danger-bg:#e2635a;\n --xyd-warn:#fbbf24;\n --xyd-ok:#34d399;\n --xyd-on-ok:#052e21;\n --xyd-on-danger:#3f1008;\n --xyd-label-on-2:#9aa6b7;\n --xyd-accent-border:rgba(96,165,250,.38);\n --xyd-accent-ring:rgba(96,165,250,.72);\n --xyd-accent-ring-soft:rgba(96,165,250,.55);\n --xyd-danger-border:rgba(255,155,143,.4);\n --xyd-danger-soft:rgba(255,155,143,.12);\n --xyd-hover:rgba(148,163,184,.1);\n --xyd-hatch:rgba(139,152,171,.4);\n --xyd-hatch-faint:rgba(139,152,171,.16);\n --xyd-ok-soft:rgba(52,211,153,.14);\n --xyd-ok-border:rgba(52,211,153,.55);\n --xyd-ok-badge:rgba(52,211,153,.22);\n --xyd-warn-soft:rgba(255,169,77,.26);\n --xyd-warn-border:rgba(255,169,77,.5);\n --xyd-c2-soft:rgba(255,169,77,.24);\n --xyd-c3-soft:rgba(52,211,153,.22);\n --xyd-c3-soft-dot:rgba(52,211,153,.30);\n --xyd-dcell-checked:rgba(46,160,105,.32);\n --xyd-dcell-checked-dot:rgba(46,160,105,.45);\n --xyd-on-c2:#ffd9a8;\n --xyd-on-c3:#a7f3c9;\n --xyd-on-dcell:#a7f3c9;\n --xyd-shadow-card:0 2px 10px rgba(0,0,0,.32);\n --xyd-shadow-toast:0 8px 24px -8px rgba(0,0,0,.5),0 2px 8px -2px rgba(0,0,0,.35);\n --xyd-shadow-modal:0 24px 48px -16px rgba(0,0,0,.55),0 4px 12px -4px rgba(0,0,0,.4);\n --xyd-shadow-hero:0 2px 10px rgba(0,0,0,.4);\n --xyd-hero-border:rgba(255,255,255,.16);\n --xyd-on-hero:rgba(255,255,255,.92);\n --xyd-bar-on-hero:rgba(255,255,255,.28);\n --xyd-swatch-ring:rgba(255,255,255,.85);\n --xyd-swatch-glyph-shadow:0 0 2px rgba(0,0,0,.85),0 1px 3px rgba(0,0,0,.6);\n --xyd-herobadge-glyph-shadow:0 1px 2px rgba(0,0,0,.18);\n --xyd-mask:rgba(0,0,0,.5);\n}\n\n.xy-visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n\n/* ===== \u4F1A\u8BDD\u5361\u7247 ===== */\n.xy-card{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);padding:11px 14px;margin:6px 0;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font-size:14px}\n.xy-card-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n/* \u957F\u5185\u5BB9\u7EAA\u5F8B\uFF1A\u5FBD\u7AE0\u4E0D\u6536\u7F29\uFF1B\u6807\u9898\u5141\u8BB8\u65AD\u884C\u6536\u7F29\u2014\u2014\u675C\u7EDD\u957F\u82F1\u6587\u8BCD\u6A2A\u5411\u6EA2\u51FA\u4E0E\u6574\u884C\u6296\u52A8 */\n.xy-badge{flex:none;font-size:12px;border-radius:6px;padding:1px 7px;color:var(--dsw-alias-label-primary)}\n/* \u5206\u7C7B\u5FBD\u7AE0\uFF1AHSL \u53D8\u91CF\u4F9B\u8272\uFF0C\u4EAE\u5EA6\u6309\u4E3B\u9898\u5206\u5C42\uFF08\u5BF9\u9F50 Web wish-category \u7684 .dark \u8986\u76D6\u53E3\u5F84\uFF09 */\n.xy-badge-cat{background:hsl(var(--cat-h,275) calc(var(--cat-sbg,58)*1%) 92%);color:hsl(var(--cat-h,275) calc(var(--cat-sfg,46)*1%) 30%);border:1px solid hsl(var(--cat-h,275) calc(var(--cat-sbd,46)*1%) 55% / .12)}\nbody[data-ds-dark-theme] .xy-badge-cat{background:hsl(var(--cat-h,275) calc(var(--cat-sbg,58)*1%) 22%);color:hsl(var(--cat-h,275) calc(var(--cat-sfg,46)*1%) 80%);border-color:hsl(var(--cat-h,275) calc(var(--cat-sbd,46)*1%) 70% / .2)}\n.xy-badge-task{background:var(--xyd-accent-soft)}\n.xy-badge-chart{background:var(--xyd-ok-badge)}\n.xy-badge-micro{background:var(--xyd-warn-soft)}\n.xy-title{min-width:0;font-weight:600;color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}\n.xy-deleted{opacity:.65}\n.xy-deleted .xy-title{text-decoration:line-through}\n.xy-meta{color:var(--dsw-alias-label-secondary);font-size:12px;margin-top:4px;overflow-wrap:anywhere}\n/* \u6B21\u7EA7\u9762\u677F\u5E95\u4E0A\u7684\u6B21\u8981\u6587\u5B57\u7528\u4E13\u7528\u5BF9\uFF08\u58F3\u901A\u7528\u6B21\u8981\u8272\u5BF9 layer-2 \u4EC5 \u22484.3:1\uFF0C\u53CC\u4E3B\u9898\u540C\u75C5\uFF09 */\n.xy-preview{margin-top:6px;font-size:12px;color:var(--xyd-label-on-2);background:var(--dsw-alias-bg-layer-2);border-radius:var(--xyd-r-inner);padding:6px 8px}\n.xy-checkin{border-color:var(--xyd-ok-border);background:var(--xyd-ok-soft)}\n.xy-glyph{font-size:15px;font-weight:700;line-height:1}\n.xy-glyph-ok{color:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n.xy-glyph-back{color:var(--dsw-alias-label-secondary)}\n.xy-actioned{margin-left:auto;color:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n\n/* \u5FAE\u884C\u52A8\u5361 */\n.xy-micro{border-color:var(--xyd-warn-border)}\n.xy-microsteps{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}\n.xy-microstep{display:flex;align-items:flex-start;gap:8px;padding:7px 10px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-inner);background:var(--dsw-alias-bg-layer-2)}\n.xy-microstep.xy-done .xy-microsteptext{text-decoration:line-through}\n/* \u5B8C\u6210/\u8DF3\u8FC7\u6B65\u7684\u6587\u5B57\u964D\u6743\u8D70\u6B21\u8981\u8272\u800C\u975E\u6574\u884C opacity\uFF08\u5BF9\u6BD4\u5EA6\u4F9D\u636E\u540C\u4E0A .xy-done \u6CE8\uFF09 */\n.xy-microstep.xy-done .xy-microsteptext,.xy-microstep.xy-skipped .xy-microsteptext{color:var(--dsw-alias-label-secondary)}\n.xy-microstepnum{flex:none;width:20px;height:20px;border-radius:50%;background:var(--xyd-accent);color:var(--xyd-on-accent);display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;margin-top:1px}\n.xy-microsteptext{font-size:13px;display:flex;flex-direction:column;min-width:0}\n/* \u5361\u5185\u6B65\u9AA4\u8BF4\u660E/\u72B6\u6001\u8BCD\u7684\u80CC\u666F\u662F layer-2\uFF1A\u6B21\u8981\u6587\u5B57\u7528 label-on-2 \u4E13\u7528\u5BF9\uFF08\u58F3\u901A\u7528\n * \u6B21\u8981\u8272\u5BF9 layer-2 \u4EC5 \u22484.3:1\uFF0C\u53CC\u4E3B\u9898\u540C\u75C5\u2014\u2014\u4E0E xy-preview \u540C\u4E00\u6CBB\u7406\u7EBF\uFF09 */\n.xy-microstep .xy-meta{color:var(--xyd-label-on-2)}\n.xy-microstate{margin-left:auto;flex:none}\n\n/* \u56FE\u8868\u5361 */\n.xy-chart{background:var(--dsw-alias-bg-layer-1)}\n.xy-chart-legend{display:flex;gap:12px;margin-top:8px;font-size:12px;color:var(--dsw-alias-label-secondary);align-items:center}\n.xy-arcwrap{margin-top:8px}\n.xy-arcnum{font-size:22px;font-weight:700;color:var(--xyd-accent);font-variant-numeric:tabular-nums}\n.xy-bar{height:8px;border-radius:999px;background:var(--dsw-alias-bg-layer-2);margin-top:6px;overflow:hidden}\n/* \u586B\u5145\u8D70 scaleX\uFF08\u5408\u6210\u5668\u52A8\u753B\uFF09\uFF1Awidth \u8FC7\u6E21\u4F1A\u9010\u5E27\u89E6\u53D1\u5E03\u5C40\uFF0Ctransform \u53EA\u8FDB\u5408\u6210\u5668 */\n.xy-bar-fill{height:100%;border-radius:inherit;background:var(--xyd-accent);transform-origin:0 50%;transition:transform .35s cubic-bezier(.22,1,.36,1)}\n.xy-rows{list-style:none;margin-top:6px;display:flex;flex-direction:column;gap:4px;padding:0}\n.xy-row{display:flex;justify-content:space-between;font-size:13px}\n.xy-rowval{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums}\n.xy-heat{display:grid;grid-template-columns:repeat(auto-fill,minmax(14px,1fr));gap:2px;margin-top:8px}\n.xy-heatcell{aspect-ratio:1;border-radius:3px;background:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n.xy-svg{width:100%;height:auto;margin-top:6px}\n\n/* ===== Toast \u8F7B\u63D0\u793A ===== */\n.xy-toasts{position:fixed;top:14px;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:8px;z-index:9999;pointer-events:none;max-width:min(92vw,460px)}\n.xy-toast{pointer-events:auto;display:flex;align-items:center;gap:9px;padding:9px 14px;border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);font-size:13px;box-shadow:var(--xyd-shadow-toast);animation:xy-toast-in .24s cubic-bezier(.22,1,.36,1);cursor:pointer}\n.xy-toast-out{opacity:0;transform:translateY(-6px);transition:opacity .22s ease,transform .22s ease}\n@keyframes xy-toast-in{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}\n.xy-toast-glyph{flex:none;width:18px;height:18px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}\n.xy-toast-ok .xy-toast-glyph{background:var(--dsw-alias-state-success-primary,var(--xyd-ok));color:var(--xyd-on-ok)}\n.xy-toast-info .xy-toast-glyph{background:var(--xyd-accent);color:var(--xyd-on-accent)}\n.xy-toast-error .xy-toast-glyph{background:var(--xyd-danger-bg);color:var(--xyd-on-danger)}\n.xy-toast-text{min-width:0;overflow-wrap:anywhere}\n\n/* ===== \u5E94\u7528\u5185\u786E\u8BA4\u5F39\u7A97 =====\n * \u539F\u751F window.confirm \u7684\u66FF\u4EE3\uFF1A\u906E\u7F69 + \u9762\u677F\u5361\uFF0C\u5168\u90E8\u8D70\u4E3B\u9898\u4EE4\u724C\uFF08\u6DF1\u6D45\u8272\u81EA\u9002\u5E94\uFF09\u3002\n * \u52A8\u6548\u53EA\u7528 opacity/transform\uFF1Bz-index \u538B\u8FC7 toast \u5C42\uFF0C\u907F\u514D\u8F7B\u63D0\u793A\u6D6E\u5728\u5F39\u7A97\u4E4B\u4E0A\u3002 */\n.xy-modal-backdrop{position:fixed;inset:0;z-index:10000;display:flex;align-items:center;justify-content:center;padding:20px;background:var(--dsw-alias-bg-mask-1,var(--xyd-mask));animation:xy-fade-in .16s ease-out}\n.xy-modal-backdrop.xy-modal-out{opacity:0;transition:opacity .15s ease}\n.xy-modal{width:min(400px,100%);background:var(--dsw-alias-bg-overlay,var(--dsw-alias-bg-layer-1));border:1px solid var(--dsw-alias-border-l2);border-radius:var(--xyd-r-card);padding:16px 18px;box-shadow:var(--xyd-shadow-modal);animation:xy-pop-in .18s cubic-bezier(.22,1,.36,1)}\n.xy-modal-out .xy-modal{transform:scale(.98);transition:transform .15s ease}\n.xy-modal-msg{margin:0;font-size:14px;line-height:1.65;color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;max-height:min(56vh,440px);overflow-y:auto}\n.xy-modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}\n@keyframes xy-fade-in{from{opacity:0}to{opacity:1}}\n@keyframes xy-pop-in{from{opacity:0;transform:translateY(8px) scale(.97)}to{opacity:1;transform:none}}\n/* \u5B9E\u5FC3\u5371\u9669\u786E\u8BA4\u952E\uFF08\u5220\u9664\u7C7B\u52A8\u4F5C\u4E13\u7528\uFF09\uFF1A\u4E0E\u63CF\u8FB9\u5371\u9669\u952E\u533A\u5206\u300C\u5DF2\u786E\u8BA4\u5C06\u6267\u884C\u300D\u7684\u91CD\u91CF */\n.xy-btn-danger-solid{background:var(--xyd-danger-bg);border-color:transparent;color:var(--xyd-on-danger)}\n@media (hover:hover) and (pointer:fine){\n .xy-btn-danger-solid:hover:not(:disabled){filter:brightness(1.08);color:var(--xyd-on-danger)}\n}\n\n/* ===== \u9AA8\u67B6\u5C4F\u52A0\u8F7D\u6001 ===== */\n.xy-skel{border-radius:var(--xyd-r-inner);background:linear-gradient(90deg,var(--dsw-alias-bg-layer-2) 25%,var(--dsw-alias-bg-layer-1) 45%,var(--dsw-alias-bg-layer-2) 65%);background-size:200% 100%;animation:xy-shimmer 1.4s ease infinite}\n.xy-skel-title{height:22px;width:38%;margin-bottom:14px}\n.xy-skel-row{height:64px;margin-top:10px}\n@keyframes xy-shimmer{from{background-position:180% 0}to{background-position:-20% 0}}\n\n/* ===== \u7A7A\u6001\uFF08\u7EAF\u6587\u5B57\u7248\u5F0F\uFF0C\u63D2\u753B\u5DF2\u79FB\u9664\uFF1A\u89C1 PageEmpty \u6CE8\u91CA\uFF09===== */\n.xy-page-center{display:flex;flex-direction:column;align-items:center;gap:6px;padding:44px 0;text-align:center}\n.xy-empty-title{font-weight:600;color:var(--dsw-alias-label-primary);margin-top:4px}\n.xy-empty-hint{margin-top:2px;max-width:360px}\n\n/* ===== \u4F1A\u8BDD\u89C6\u56FE\u9875\u9AA8\u67B6 ===== */\n/* \u8282\u594F\u9501\uFF1A\u9875 padding 18/20 \u00B7 \u533A\u5757\u95F4 14\uFF08section-title \u4E0A\u8FB9\u8DDD\uFF09\u00B7 \u884C\u95F4\u8DDD 6/10 */\n.xy-page{box-sizing:border-box;width:100%;max-width:min(780px,100%);min-width:0;margin:0 auto;padding:18px 20px 26px;color:var(--dsw-alias-label-primary);font-size:14px;overflow-x:clip}\n.xy-page-head{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}\n/* \u5C45\u4E2D\u884C\u5185\u7684 .xy-meta \u5173\u95ED\u9ED8\u8BA4 4px \u4E0A\u8FB9\u8DDD\uFF1Aflex \u6309\u542B margin \u7684\u76D2\u5B50\u5C45\u4E2D\uFF0C\u9876\u8DDD\u4F1A\u8BA9\n * \u6B21\u8981\u6587\u5B57\u6052\u5B9A\u4F4E 2px\uFF08\u4E0E .xy-detail>div>.xy-meta \u540C\u4E00\u6761\u6CBB\u7406\u7EBF\uFF0C\u5934\u90E8\u6F0F\u6CBB\u70B9\u5728\u6B64\u6536\u53E3\uFF09 */\n.xy-card-head .xy-meta,.xy-page-head .xy-meta{margin-top:0}\n.xy-page-title{font-size:17px;font-weight:700;margin:0;color:var(--dsw-alias-label-primary)}\n.xy-section-title{font-size:12px;color:var(--dsw-alias-label-secondary);margin:14px 0 6px;font-weight:600;letter-spacing:.02em}\n/* \u9875\u5934\u52A8\u4F5C\u7EC4\uFF1A\u5355\u4E00 margin-left:auto \u6574\u4F53\u53F3\u7F6E\u2014\u2014\u591A\u6309\u94AE\u5404\u81EA auto \u4F1A\u5E73\u5206\u5269\u4F59\u7A7A\u95F4 */\n.xy-page-actions{display:flex;align-items:center;gap:8px;margin-left:auto;flex-wrap:wrap}\n\n/* \u63A7\u4EF6\u4F53\u7CFB */\n.xy-btn{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border-radius:var(--xyd-r-ctl);padding:5px 12px;min-height:28px;font-size:13px;cursor:pointer;line-height:1.5;transition:border-color .15s ease,background-color .15s ease,color .15s ease,filter .15s ease,transform .12s ease}\n/* \u60AC\u505C\u53CD\u9988\u4EC5\u5728\u300C\u771F\u60AC\u505C\u300D\u8BBE\u5907\u751F\u6548\uFF1A\u89E6\u5C4F\u6CA1\u6709\u53EF\u9760\u7684 hover \u9000\u51FA\uFF0C\u884C/\u683C/\u6309\u94AE\u7684\n * \u60AC\u505C\u5E95\u8272\u4F1A\u7C98\u6EDE\u5230\u4E0B\u4E00\u6B21\u70B9\u6309\uFF08hover \u95E8\u63A7 = (hover:hover) and (pointer:fine)\uFF09 */\n@media (hover:hover) and (pointer:fine){\n .xy-btn:hover:not(:disabled){border-color:var(--xyd-accent);color:var(--xyd-accent-strong)}\n}\n.xy-btn:active:not(:disabled){transform:scale(.97)}\n.xy-btn:disabled{opacity:.55;cursor:not-allowed}\n.xy-btn:focus-visible,.xy-input:focus-visible,.xy-cell:focus-visible,.xy-seg-btn:focus-visible,.xy-toggle:focus-visible,.xy-swatch:focus-visible,.xy-growth-col:focus-visible{outline:2px solid var(--xyd-accent);outline-offset:2px}\n/* \u89E6\u63A7\u57FA\u7EBF\uFF1A\u6D88\u9664\u79FB\u52A8\u7AEF\u53CC\u51FB\u7F29\u653E\u5EF6\u8FDF\u4E0E\u7CFB\u7EDF\u70B9\u6309\u9AD8\u4EAE\uFF08\u4EA4\u4E92\u53CD\u9988\u7EDF\u4E00\u7531 hover/active \u627F\u62C5\uFF09 */\n.xy-btn,.xy-seg-btn,.xy-cell,.xy-swatch,.xy-toggle,.xy-growth-col{touch-action:manipulation;-webkit-tap-highlight-color:transparent}\n/* \u884C\u5185\u6309\u94AE\uFF1A\u226526px \u547D\u4E2D\u76EE\u6807\uFF08\u5361\u7247\u5934/\u64CD\u4F5C\u884C\u7684\u7D27\u51D1\u4E3B\u6218\u6309\u94AE\uFF09 */\n.xy-btn-inline{margin-left:auto;padding:3px 10px;font-size:12px;min-height:26px;display:inline-flex;align-items:center}\n/* \u56FE\u6807\u5E7D\u7075\u952E\uFF08\u226526px \u65B9\u5F62\u547D\u4E2D\u76EE\u6807\uFF09\uFF1A\u7F16\u8F91/\u5220\u9664\u8FD9\u7C7B\u9AD8\u9891\u91CD\u590D\u7684\u884C\u5185\u4F4E\u9891\u52A8\u4F5C\u964D\u566A\u2014\u2014\n * \u56FE\u6807\u7EBF\u7A3F\u627F\u8BB8\u53EF\u4E49\u3001\u6587\u5B57\u8BED\u4E49\u8D70 aria-label\uFF1Bhover/focus \u624D\u663E\u5E95\u8272\u3002 */\n.xy-btn-icon{width:26px;height:26px;min-height:26px;padding:0;display:inline-flex;align-items:center;justify-content:center;flex:none}\n.xy-btn-primary{background:var(--xyd-accent);border-color:transparent;color:var(--xyd-on-accent)}\n@media (hover:hover) and (pointer:fine){\n .xy-btn-primary:hover:not(:disabled){filter:brightness(1.06);color:var(--xyd-on-accent)}\n}\n.xy-btn-danger{color:var(--xyd-danger);border-color:var(--xyd-danger-border);background:transparent}\n@media (hover:hover) and (pointer:fine){\n .xy-btn-danger:hover:not(:disabled){background:var(--xyd-danger-soft);color:var(--xyd-danger)}\n}\n.xy-input{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:var(--xyd-r-ctl);padding:5px 8px;font-size:13px;font-family:inherit;transition:border-color .15s ease}\n@media (hover:hover) and (pointer:fine){\n .xy-input:hover:not(:disabled){border-color:var(--dsw-alias-border-l3)}\n}\n.xy-input::placeholder{color:var(--dsw-alias-label-secondary)}\n.xy-input:disabled{opacity:.55;cursor:not-allowed}\n.xy-field-err{color:var(--xyd-danger);font-size:12px;margin-top:4px}\n/* \u6570\u5B57\u5FAE\u8F93\u5165\uFF08\u8BBE\u7F6E\u9875\u6CE8\u5165\u4E0A\u9650\u7B49\uFF09\uFF1A\u6309\u5185\u5BB9\u957F\u5EA6\u5B9A\u5BBD\uFF0C\u4E0D\u968F\u6D4F\u89C8\u5668\u9ED8\u8BA4 size \u62C9\u6210\u5BBD\u6761 */\n.xy-input-num{width:96px}\n\n/* \u5217\u8868\u884C */\n.xy-rowmain{display:flex;flex-direction:column;gap:2px;min-width:0}\n.xy-rowtitle{font-weight:600;color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}\n/* \u5B8C\u6210\u6001\u884C\u9996\u88C5\u9970\u52FE\uFF08aria-hidden\uFF0C\u8BED\u4E49\u7531\u884C\u6587\u6848\u627F\u62C5\uFF09 */\n.xy-done-glyph{color:var(--dsw-alias-state-success-primary,var(--xyd-ok));margin-right:2px}\n/* \u9AD8\u91CD\u8981\u5EA6\u661F\u6807\uFF1A\u7425\u73C0\u8B66\u793A\u8272\uFF08\u4E0D\u590D\u7528\u5B8C\u6210\u52FE\u7684\u7EFF\u8272\uFF0C\u8BED\u4E49\u4E0D\u649E\u8F66\uFF09 */\n.xy-star-hi{color:var(--xyd-warn);margin-right:2px}\n/* \u5B8C\u6210\u6001\u884C\uFF1A\u6807\u9898\u7528\u6B21\u8981\u8272\u964D\u6743\uFF08secondary \u5B9E\u6D4B\u6D45 4.76 / \u6DF1 5.15 \u22654.5:1\uFF09\u2014\u2014\u4E0D\u7528\u6574\u884C\n * opacity\uFF1A0.78 \u6DF7\u5E95\u540E\u6587\u5B57\u6709\u6548\u5BF9\u6BD4\u4EC5 \u22483.1:1\uFF0C\u8DCC\u7834 WCAG 1.4.3 AA\uFF08opacity \u53EA\u7559\u7ED9\n * aria-hidden \u7684\u88C5\u9970\u5143\u7D20\uFF0C\u884C\u5185\u53EF\u8BFB\u6587\u5B57\u4E00\u5F8B\u8D70\u989C\u8272\u964D\u6743\uFF09 */\n.xy-done .xy-rowtitle{color:var(--dsw-alias-label-secondary)}\n.xy-banner-ok{margin-top:10px;padding:10px 12px;border-radius:var(--xyd-r-inner);background:var(--xyd-ok-soft);border:1px solid var(--xyd-ok-border);font-size:13px}\n/* \u5237\u65B0\u5931\u8D25\u4F46\u65E7\u6570\u636E\u4ECD\u5728\u7684\u8BDA\u5B9E\u964D\u7EA7\u6A2A\u5E45\uFF1A\u7425\u73C0\u865A\u7EBF\u9762\u677F\uFF08\u8B66\u793A\u4F46\u4E0D\u6050\u5413\u2014\u2014\u52A8\u4F5C\u5DF2\u6210\u529F\uFF09 */\n.xy-stalerow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;padding:8px 12px;border:1px dashed var(--xyd-warn-border);border-radius:var(--xyd-r-inner);background:var(--xyd-warn-soft)}\n.xy-stalerow .xy-btn-inline{margin-left:0}\n\n/* ===== \u5206\u7EC4\u5361\uFF08\u4EFB\u52A1\u9875\u72B6\u6001\u5206\u6876 / \u4ECA\u65E5\u9875\u5F85\u6253\u5361\u00B7\u5DF2\u5B8C\u6210\u5171\u7528\uFF09=====\n * \u5361\u7247\u5BB9\u5668 + \u72B6\u6001\u70B9\u6807\u9898\u884C + \u5206\u9694\u7EBF\u884C\u5217\u8868\uFF1A\u66FF\u4EE3\u88F8\u5806\u53E0\u7684 section-title+wishtasks\uFF1B\n * \u7EC4\u95F4\u8DDD 12 \u4E0E\u9875\u5934 margin-bottom 12 \u540C\u62CD\uFF0C\u884C\u5185\u8FB9\u8DDD 11/14 \u5BF9\u9F50\u5361\u7247\u4F53\u7CFB\u8282\u594F\u9501\u3002 */\n.xy-group{margin-top:12px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);overflow:hidden}\n.xy-group-head{display:flex;align-items:center;gap:8px;margin:0;padding:9px 14px;font-size:12px;font-weight:600;letter-spacing:.02em;color:var(--dsw-alias-label-secondary);border-bottom:1px solid var(--dsw-alias-border-l1)}\n.xy-group-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--dsw-alias-label-secondary)}\n.xy-group-dot-accent{background:var(--xyd-accent)}\n.xy-group-dot-warn{background:var(--xyd-warn)}\n.xy-group-dot-ok{background:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n.xy-group-count{margin-left:auto;flex:none;font-size:12px;line-height:1.7;padding:0 8px;border-radius:999px;background:var(--dsw-alias-bg-layer-2);color:var(--xyd-label-on-2);font-variant-numeric:tabular-nums}\n.xy-grouplist{list-style:none;display:flex;flex-direction:column;margin:0;padding:0}\n.xy-grouprow{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:11px 14px;border-top:1px solid var(--dsw-alias-border-l1);transition:background-color .15s ease}\n.xy-grouprow:first-child{border-top:none}\n@media (hover:hover) and (pointer:fine){\n .xy-grouprow:hover{background:var(--xyd-hover)}\n}\n/* \u5206\u7EC4\u5361\u7684\u5757\u7EA7\u884C\u53D8\u4F53\uFF08\u4EFB\u52A1\u884C + \u53EF\u9009\u5185\u8054\u8BE6\u60C5\uFF09\uFF1BTaskLine \u57FA\u7C7B\u672C\u8EAB\u5373\u4E24\u680F\u7F51\u683C\uFF08\u89C1\u613F\u671B\u5361\u6BB5\uFF09 */\n.xy-taskrow{display:block}\n.xy-taskrow .xy-detail{margin-bottom:2px}\n\n/* ===== \u9762\u677F\u5361\uFF08\u65E5\u5386/\u6210\u957F\u56FE\u8868/\u8BBE\u7F6E\u5206\u8282\u7B49\u901A\u7528\u5BB9\u5668\uFF09=====\n * \u4E0E\u613F\u671B\u5361\u540C\u4E00\u5361\u7247\u8BED\u6CD5\u4F46\u65E0 hover \u6001\uFF1A\u7EAF\u5BB9\u5668\u3002\u5B50\u5143\u7D20\u95F4\u8DDD\u7531\u5404\u9875\u65E2\u6709 margin \u8D1F\u8D23\u3002 */\n.xy-panel{margin-top:12px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);padding:12px 14px}\n.xy-panel>.xy-skel:first-child{margin-top:0}\n.xy-panel-head{margin:0;font-size:14px;font-weight:600;display:flex;align-items:center;gap:8px;color:var(--dsw-alias-label-primary)}\n\n/* ===== \u4ECA\u65E5\u6982\u89C8\u5361 =====\n * \u6807\u9898\u3001\u5B8C\u6210\u8BA1\u6570\u4E0E\u8FDB\u5EA6\u6761\u540C\u5361\u5448\u73B0\uFF1A\u8FDB\u5EA6\u6761\u4E0D\u518D\u4F5C\u4E3A\u88F8\u6761\u60AC\u5728\u9875\u5934\u4E0B\u65B9\n * \uFF080% \u65F6\u5373\u7528\u6237\u6240\u89C1\u300C\u7A7A\u767D\u6A2A\u6761\u300D\uFF09\uFF1B\u54C1\u724C\u8272\u8F7B\u6655\u67D3\u63D0\u4F9B\u4ECA\u65E5\u9875\u7684\u89C6\u89C9\u951A\u70B9\u3002 */\n.xy-todayhero{margin-top:12px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);padding:13px 16px;display:flex;flex-direction:column;gap:9px;background:linear-gradient(135deg,var(--xyd-accent-soft),transparent 55%),var(--dsw-alias-bg-layer-1)}\n.xy-todayhero-top{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}\n/* \u5B8C\u6210\u8BA1\u6570\u662F\u4ECA\u65E5\u9875\u7684\u89C6\u89C9\u951A\u70B9\uFF08habit \u7C7B App \u5934\u90E8\u60EF\u4F8B\uFF09\uFF1A\u5347\u5927\u53F7 tabular \u6570\u5B57 */\n.xy-todayhero-num{margin-left:auto;font-size:22px;font-weight:700;color:var(--xyd-accent);font-variant-numeric:tabular-nums;line-height:1.2}\n.xy-todayhero-all .xy-todayhero-num{color:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n.xy-todayhero .xy-bar{height:10px;margin-top:0}\n.xy-todayhero .xy-banner-ok{margin-top:0}\n\n/* \u613F\u671B\u5361\uFF08\u9875\u9762\uFF09 */\n.xy-wishcard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:var(--xyd-r-card);padding:12px 14px;margin-top:10px;transition:border-color .15s ease,box-shadow .15s ease}\n@media (hover:hover) and (pointer:fine){\n .xy-wishcard:hover{border-color:var(--dsw-alias-border-l2);box-shadow:var(--xyd-shadow-card)}\n}\n.xy-progress-num{margin-left:auto;flex:none;color:var(--dsw-alias-label-secondary);font-size:12px;font-variant-numeric:tabular-nums}\n/* \u5361\u5185\u5B50\u4EFB\u52A1\u5217\u8868\uFF1A\u5206\u9694\u7EBF\u66FF\u4EE3\u88F8 gap \u5806\u53E0\uFF1B\u884C\u7559\u767D\u7531\u4EFB\u52A1\u884C\u81EA\u8EAB padding \u627F\u62C5\u3002\n * \u7ED3\u6784\u4E3A [taskline, detail?, taskline, detail?] \u2014\u2014 \u76F8\u90BB\u9009\u62E9\u5668\u7CBE\u786E\u547D\u4E2D\u300C\u65B0\u4EFB\u52A1\u884C\u300D\u8FB9\u754C\u3002 */\n.xy-wishtasks{margin-top:8px;display:flex;flex-direction:column;border-top:1px dashed var(--dsw-alias-border-l1)}\n.xy-wishtasks>.xy-taskline+.xy-taskline,.xy-wishtasks>.xy-detail+.xy-taskline{border-top:1px solid var(--dsw-alias-border-l1)}\n.xy-wishtasks>.xy-taskline{padding:9px 0}\n/* \u5C55\u5F00\u8BE6\u60C5\u662F\u5361\u5185\u6700\u540E\u4E00\u4E2A\u5143\u7D20\u65F6\u6536\u6389\u5E95\u90E8\u7559\u767D\uFF1A\u5361\u7247\u81EA\u8EAB padding \u5DF2\u627F\u62C5\u6536\u5C3E */\n.xy-wishtasks>.xy-detail:last-child{margin-bottom:0}\n/* TaskLine \u57FA\u7C7B = \u4E24\u680F\u7F51\u683C\uFF1A\u540D\u79F0/\u5143\u4FE1\u606F\u5C45\u5DE6\u6536\u7F29\u6362\u884C\uFF0C\u52A8\u4F5C\u7C07\uFF08\u9886\u53D6/\u6253\u5361 + \u8BE6\u60C5\u5F00\u5173\uFF09\u53F3\u7F6E\u5782\u76F4\u5C45\u4E2D\uFF1B\n * \u613F\u671B\u5361\u5B50\u4EFB\u52A1\u4E0E\u4EFB\u52A1\u9875\u5171\u7528\u540C\u4E00\u884C\u8BED\u6CD5\u3002 */\n.xy-taskline{display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:12px;row-gap:2px;align-items:center}\n.xy-taskname{grid-column:1;grid-row:1;font-weight:600;font-size:13px;overflow-wrap:anywhere}\n.xy-taskline>.xy-meta{grid-column:1;grid-row:2;margin-top:0}\n.xy-taskline>div:last-child{grid-column:2;grid-row:1/span 2;justify-self:end}\n/* \u5371\u9669\u56FE\u6807\u952E\u7EDF\u4E00\u9759\u9ED8\u6863\uFF08\u957F\u5217\u8868\u9010\u884C\u91CD\u590D\u7684\u4F4E\u9891\u9AD8\u5371\u52A8\u4F5C\uFF1A\u613F\u671B\u5361\u5934\u5220\u9664 / \u8BB0\u5FC6\u884C\u5220\u9664\uFF09\uFF1A\n * \u57FA\u7840\u900F\u660E\u5EA6 0.78\u2014\u2014\u6DF7\u5E95\u540E\u56FE\u6807\u63CF\u8FB9\u5BF9\u6BD4\u6D45\u8272 3.73 / \u6DF1\u8272 5.06\uFF0C\u6EE1\u8DB3 WCAG 1.4.11\n * \u975E\u6587\u5B57 \u22653:1\uFF08\u539F\u6CE8\u300C\u22654.5:1\u300D\u4EC5\u6DF1\u8272\u6210\u7ACB\uFF0C\u5DF2\u6309\u975E\u6587\u5B57\u53E3\u5F84\u66F4\u6B63\uFF09\uFF0Chover/focus \u6062\u590D\n * \u6EE1\u5F3A\u5EA6\uFF1B\u6587\u5B57\u5371\u9669\u952E\uFF08.xy-btn-danger \u65E0 .xy-btn-icon\uFF09\u4FDD\u6301\u6EE1\u5F3A\u5EA6\u4E0D\u53D7\u6B64\u6863\u3002 */\n.xy-btn-danger.xy-btn-icon{opacity:.78}\n.xy-btn-danger.xy-btn-icon:focus-visible{opacity:1}\n@media (hover:hover) and (pointer:fine){\n .xy-btn-danger.xy-btn-icon:hover:not(:disabled){opacity:1}\n}\n\n/* ===== \u65E5\u5386 ===== */\n/* \u73B0\u4EE3\u65E5\u5386\u8BED\u6CD5\uFF08Apple/Google Calendar \u60EF\u4F8B\uFF09\uFF1A\u65E0\u8FB9\u6846\u8FDE\u7EED\u7F51\u683C\uFF0C\u65E5\u671F\u53F7\u5750\u5728\u5706\u7AE0\u4E0A\uFF0C\n * \u72B6\u6001\u8BED\u4E49\u5168\u90E8\u7531\u5706\u7AE0\u627F\u8F7D\uFF08\u5F85\u6253\u5361=\u4E2D\u6027\u8BA1\u5212\u5E95\u3001\u90E8\u5206\u5B8C\u6210=\u7425\u73C0\u3001\u5168\u90E8\u5B8C\u6210=\u7EFF\uFF09\uFF0C\n * today/picked \u8D70\u5706\u7AE0\u7684\u73AF\u4E0E\u5B9E\u5E95\uFF0C\u4E0D\u518D\u6574\u683C\u5237\u8272/\u6574\u683C\u63CF\u8FB9\u3002\n * \u90BB\u6708\u8865\u4F4D\u65E5 = \u4F4E\u900F\u660E\u5EA6\u6570\u5B57\uFF08\u7EAF\u89C6\u89C9\u5EF6\u7EED\uFF0C\u5207\u6708\u6B8B\u884C\u4E0D\u788E\u7247\u5316\uFF09\u3002 */\n.xy-calcard{padding:0;overflow:hidden}\n/* \u6708\u4EFD\u5BFC\u822A\u6210\u7EC4\u5C45\u4E2D\uFF1B\u300C\u56DE\u5230\u672C\u6708\u300D\u7EDD\u5BF9\u5B9A\u4F4D\u8D34\u53F3\u7F18\uFF0C\u4E0D\u6324\u5360\u4E2D\u8F74\uFF08\u7A84\u5C4F\u6539\u968F\u6D41\u907F\u514D\u76F8\u649E\uFF09 */\n.xy-calnav{position:relative;justify-content:center}\n.xy-calnav-back{position:absolute;right:0}\n@media (max-width:520px){.xy-calnav-back{position:static;margin-left:4px}}\n.xy-calhead{display:grid;grid-template-columns:repeat(7,1fr);padding:11px 0 8px}\n.xy-calhead-cell{text-align:center;font-size:12px;color:var(--dsw-alias-label-secondary)}\n.xy-cal{display:flex;flex-direction:column;border-top:1px solid var(--dsw-alias-border-l1)}\n.xy-week{display:grid;grid-template-columns:repeat(7,1fr)}\n.xy-cell{height:42px;border:none;background:transparent;cursor:pointer;font-size:13px;display:flex;align-items:center;justify-content:center;padding:0;font-family:inherit;color:var(--dsw-alias-label-primary)}\n/* \u5706\u7AE0\uFF1A32px \u5706\u5F62\uFF0C\u72B6\u6001\u5E95\u8272/\u73AF/\u5B9E\u5E95\u90FD\u6302\u8FD9\u91CC */\n.xy-daynum{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;font-variant-numeric:tabular-nums;transition:background-color .15s ease,box-shadow .15s ease,color .15s ease}\n.xy-cell:focus-visible{outline-offset:-3px}\n/* \u90BB\u6708\u8865\u4F4D\u65E5\uFF1A\u5F31\u5316\u6570\u5B57\uFF08\u4E0D\u53EF\u805A\u7126\u4E0D\u53EF\u70B9\uFF09\u3002opacity .45 \u5728\u6D45\u8272\u4E0B\u4EC5 1.8:1\uFF0C\n * \u63D0\u5230 .55 \u4FDD\u6301\u300C\u4F4E\u4E00\u6863\u300D\u7684\u89C6\u89C9\u6B21\u5E8F\u540C\u65F6\u4E0D\u518D\u8FD1\u4E4E\u9690\u5F62 */\n.xy-outside{cursor:default}\n.xy-outside .xy-daynum{color:var(--dsw-alias-label-secondary);opacity:.55}\n/* \u65E0\u5B89\u6392 = \u7559\u767D + \u6B21\u8981\u5B57 */\n.xy-c0{cursor:default}\n.xy-c0 .xy-daynum{color:var(--dsw-alias-label-secondary)}\n/* \u5F85\u6253\u5361 = \u4E2D\u6027\u8BA1\u5212\u5E95\uFF08\u9AD8\u9891\u72B6\u6001\u4E0D\u4F5C\u8B66\u793A\u8272\uFF09\uFF1Binset \u63CF\u8FB9\u8BA9 c1 \u5706\u7AE0\u4E0E\u56FE\u4F8B\u70B9\u540C\u6784\n * \uFF08c1 \u5E95\u8272\u5BF9\u5361\u5E95\u4EC5 \u22481.1:1\uFF0C\u56FE\u4F8B\u70B9\u6709\u63CF\u8FB9\u800C\u5706\u7AE0\u6CA1\u6709\u2014\u2014\u4E24\u4FA7\u89C2\u611F\u4E0D\u4E00\u81F4\uFF09 */\n.xy-c1 .xy-daynum{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2)}\n/* \u90E8\u5206\u5B8C\u6210 / \u5168\u90E8\u5B8C\u6210 = \u67D4\u548C\u8BED\u4E49\u5E95\uFF0C\u5B57\u8272\u6309\u4E3B\u9898\u914D\u5BF9\u4FDD\u8BC1 \u22654.5:1 */\n.xy-c2 .xy-daynum{background:var(--xyd-c2-soft);color:var(--xyd-on-c2)}\n.xy-c3 .xy-daynum{background:var(--xyd-c3-soft);color:var(--xyd-on-c3)}\nbody[data-ds-dark-theme] .xy-c2 .xy-daynum{color:var(--xyd-on-c2)}\nbody[data-ds-dark-theme] .xy-c3 .xy-daynum{color:var(--xyd-on-c3)}\n/* hover \u6655\u5E95\u6392\u9664\u5DF2\u9009\u4E2D\u683C\u4E0E\u8BED\u4E49\u72B6\u6001\u683C\uFF1Aspecificity \u9AD8\u4E8E\u5355\u7C7B\u9009\u62E9\u5668\uFF0C\u4E0D\u6392\u9664\u7684\u8BDD\n * \u60AC\u505C\u5728\u5DF2\u9009\u65E5\u4E0A\u4F1A\u7528\u6655\u5E95\u76D6\u6389\u9009\u4E2D\u5B9E\u5E95\uFF08\u89C6\u89C9\u4E0A\u300C\u53D6\u6D88\u9009\u4E2D\u300D\uFF09\uFF1Bc2/c3 \u540C\u7406\u2014\u2014\n * \u72B6\u6001\u5E95\u8272\u6B63\u662F\u7528\u6237\u60AC\u505C\u6838\u5BF9\u7684\u90A3\u4E2A\u4FE1\u606F\uFF0C\u4E0D\u80FD\u5728\u60AC\u505C\u77AC\u95F4\u88AB\u6655\u5E95\u62B9\u6389 */\n@media (hover:hover) and (pointer:fine){\n .xy-cell:not(.xy-outside):not(.xy-picked):not(.xy-c2):not(.xy-c3):hover .xy-daynum{background:var(--xyd-accent-soft)}\n}\n/* \u4ECA\u65E5 = accent \u73AF\u5305\u5706\u7AE0\uFF1A\u4E0D\u8986\u76D6\u72B6\u6001\u5E95\u8272\uFF08\u300C\u4ECA\u5929\u8BE5\u6253\u5361\u300D\u7684\u63D0\u793A\u4E0D\u80FD\u88AB\u5403\u6389\uFF09 */\n.xy-today .xy-daynum{box-shadow:0 0 0 2px var(--xyd-accent)}\n/* \u9009\u4E2D = accent \u5B9E\u5E95\u5706\u7AE0\uFF08\u5373\u65F6\u53CD\u9988\u77ED\u6682\u6001\uFF0C\u8986\u76D6\u72B6\u6001\u8272\u53EF\u63A5\u53D7\uFF0C\u8BE6\u60C5\u9762\u677F\u7D27\u968F\u5176\u4E0B\uFF09 */\n.xy-picked .xy-daynum{background:var(--xyd-accent);color:var(--xyd-on-accent)}\n.xy-legend{display:flex;gap:14px;margin-top:10px;font-size:12px;color:var(--dsw-alias-label-secondary);align-items:center;flex-wrap:wrap}\n.xy-dot{width:10px;height:10px;border-radius:3px;display:inline-block;margin-right:4px;vertical-align:-1px}\n.xy-dot.xy-dot-checked{background:var(--xyd-accent)}\n/* \u56FE\u4F8B\u7F3A\u53E3\u70B9\uFF1A\u4E0E\u67F1\u4F53\u540C\u4E00\u659C\u7EB9\u8BED\u6CD5\uFF08\u5355\u4E00\u4E8B\u5B9E\u6E90\uFF0C\u4E24\u5904\u6C38\u4E0D\u6F02\u79FB\uFF09 */\n.xy-dot.xy-dot-gap{border:1px solid var(--dsw-alias-border-l2);background:repeating-linear-gradient(135deg,var(--xyd-hatch) 0 2px,transparent 2px 4px)}\n/* \u56FE\u4F8B\u4E0E\u5706\u7AE0\u540C\u6784\uFF1A\u65E0\u5B89\u6392=\u63CF\u8FB9\u7A7A\u5FC3\u3001\u5F85\u6253\u5361=\u4E2D\u6027\u5E95\u3001\u90E8\u5206/\u5168\u90E8\u5B8C\u6210=\u8BED\u4E49\u67D4\u548C\u5E95 */\n.xy-dot.xy-c0{background:transparent;border:1px solid var(--dsw-alias-border-l2)}\n.xy-dot.xy-c1{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2)}\n.xy-dot.xy-c2{background:var(--xyd-c2-soft)}\n.xy-dot.xy-c3{background:var(--xyd-c3-soft-dot)}\n/* \u5361\u5373\u8868\u540E\uFF1A\u56FE\u4F8B\u8D34\u5361\u5E95\u5E76\u4EE5 hairline \u4E0E\u7F51\u683C\u5206\u754C */\n.xy-calcard .xy-legend{margin-top:0;padding:10px 14px 12px;border-top:1px solid var(--dsw-alias-border-l1)}\n/* \u8BE6\u60C5\u9762\u677F\u5E38\u9A7B\u5E76\u5347\u7EA7\u4E3A\u9644\u5361\uFF1A\u56FA\u5B9A\u6700\u5C0F\u9AD8\u5EA6 + \u8D85\u957F\u5185\u90E8\u6EDA\u52A8\uFF0C\u70B9\u51FB\u4E0D\u540C\u65E5\u671F\u4E0D\u518D\u5F15\u8D77\u6574\u9875\u9AD8\u5EA6\u6296\u52A8 */\n.xy-daypanel{margin-top:10px;min-height:112px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);padding:11px 14px}\n.xy-daypanel .xy-daydetail{max-height:300px;overflow-y:auto;scrollbar-gutter:stable}\n/* \u8BE6\u60C5\u4EFB\u52A1\u884C\u590D\u7528\u5206\u7EC4\u5361\u884C\u8BED\u6CD5\uFF1A\u8D34\u9762\u677F\u5185\u8FB9\u8DDD\uFF0C\u4E0D\u7559\u53CC\u91CD\u5927\u8FB9\u8DDD */\n.xy-daypanel .xy-grouprow{padding:9px 0}\n.xy-daypanel .xy-section-title{margin-top:2px}\n.xy-dayhint{padding-top:0}\n/* \u62FE\u53D6\u52A0\u8F7D\u884C\uFF1A\u70B9\u51FB\u65E5\u671F\u53D6\u8BE6\u60C5\u671F\u95F4\u7684\u7EC6\u6761\u9AA8\u67B6\uFF08\u5360\u4F4D\u9AD8\u5EA6\u6052\u5B9A\uFF0C\u9762\u677F\u4E0D\u8DF3\uFF09 */\n.xy-pickline{height:12px;width:46%;margin-top:2px}\n\n/* ===== \u7EDF\u8BA1\u5361 & \u6210\u957F ===== */\n.xy-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin-top:8px}\n.xy-statcard{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);padding:14px;text-align:center}\n/* \u5C42\u7EA7\uFF1A\u666E\u901A\u7EDF\u8BA1\u6570\u5B57\u7528\u4E3B\u6587\u5B57\u8272\uFF08\u9875\u9762\u66F4\u5B89\u9759\uFF09\uFF0C\u4EC5\u300C\u5F53\u524D\u8FDE\u7EED\u300D\u8FD9\u5F20\u5361\u4EE5\u54C1\u724C\u8272+\u6D45\u6655\u5E95\u7A81\u51FA\n * \uFF08habit \u7C7B App \u628A streak \u4F5C\u4E3A\u82F1\u96C4\u6307\u6807\u7F6E\u4E8E\u70ED\u529B\u56FE\u65C1\u7684\u60EF\u4F8B\uFF09 */\n.xy-statnum{font-size:24px;font-weight:700;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums}\n.xy-statcard-hot{border-color:var(--xyd-accent-border);background:linear-gradient(160deg,var(--xyd-accent-soft),transparent 62%),var(--dsw-alias-bg-layer-1)}\n.xy-statcard-hot .xy-statnum{color:var(--xyd-accent)}\n/* \u7F3A\u7701\u503C\uFF08\u6682\u65E0/N/A\uFF09\uFF1A\u6B21\u8981\u8272\u5C0F\u4E00\u53F7\uFF0C\u7F3A\u5931\u4FE1\u606F\u4E0D\u5F97\u6BD4\u771F\u5B9E\u6570\u636E\u66F4\u54CD */\n.xy-statcard-muted .xy-statnum{color:var(--dsw-alias-label-secondary);font-size:18px}\n/* \u7A84\u9762\u677F\uFF08\u4F1A\u8BDD\u89C6\u56FE\u9875\u968F\u58F3\u6536\u7F29\uFF09\u4E0B 30 \u6839\u67F1\u88AB flex \u6324\u538B\u5230 ~10px \u5BBD\uFF0C\u89E6\u5C4F\u96BE\u4EE5\u547D\u4E2D\uFF1A\n * \u5BB9\u5668\u6A2A\u5411\u6EDA\u52A8 + \u6700\u5C0F\u5BBD\u515C\u5E95\uFF08\u2264520px \u4E0E\u65E5\u5386\u65AD\u70B9\u540C\u53E3\u5F84\uFF09\u628A\u67F1\u5BBD\u62AC\u5230 ~13px\u2014\u2014\n * \u662F\u547D\u4E2D\u4F53\u9A8C\u7684\u6539\u5584\u4F46\u672A\u8FBE WCAG 2.5.8 \u7684 24px\uFF08\u8FBE\u6807\u9700 min-width ~810px\uFF0C\u6EDA\u52A8\u6210\u672C\n * \u8FDC\u8D85\u8BEF\u89E6\u4EE3\u4EF7\uFF0C\u56FE\u8868 tooltip \u5C5E\u4F4E\u98CE\u9669\u4FE1\u606F\u67E5\u8BE2\uFF0C\u6709\u610F\u53D6\u820D\uFF09\uFF1B\u5BBD\u9762\u677F\uFF08\u72EC\u7ACB\n * /xingyuan/growth \u9875\uFF09\u5185\u5BB9\u4E0D\u8D85\u5BBD\u3001\u6EDA\u52A8\u5BB9\u5668\u65E0\u611F\u77E5 */\n.xy-growth-scroll{overflow-x:auto}\n.xy-growth{display:flex;gap:3px;align-items:stretch;height:120px;margin-top:10px}\n.xy-growth-col{flex:1;display:flex;flex-direction:column;height:100%;min-width:0;border:none;background:transparent;padding:0;cursor:default;border-radius:3px 3px 0 0}\n.xy-growth-stack{flex:1;display:flex;flex-direction:column;justify-content:flex-end;width:100%}\n.xy-growth-bar{background:var(--xyd-accent);border-radius:2px 2px 0 0;width:100%}\n.xy-growth-col.xy-full .xy-growth-bar{background:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n/* \u672A\u5B8C\u6210\u7F3A\u53E3\uFF1A\u659C\u7EB9\u5197\u4F59\u7F16\u7801\uFF08\u8DDF\u968F\u4E3B\u9898\u6587\u5B57\u8272\u6DF7\u5408\uFF09\u2014\u2014layer-2 \u5B9E\u8272\u5728\u6DF1\u8272\u58F3\u4E0E\u9762\u677F\u5E95\n * \u51E0\u4E4E\u540C\u4EAE\u5EA6\u800C\u9690\u5F62\uFF0C\u659C\u7EB9\u5728\u4E24\u79CD\u4E3B\u9898\u4E0B\u90FD\u6709\u7A33\u5B9A\u7684\u7EB9\u7406\u53EF\u89C1\u5EA6\uFF0C\u4E14\u4E0E\u5B9E\u5FC3\u5B8C\u6210\u67F1\u5F62\u6210\n * \u300C\u5F62\u72B6 \u00D7 \u989C\u8272\u300D\u53CC\u901A\u9053\u533A\u5206\uFF0C\u4E0D\u4F9D\u8D56\u8272\u89C9\u5355\u901A\u9053 */\n.xy-growth-missed{width:100%;border-radius:2px 2px 0 0;background:repeating-linear-gradient(135deg,var(--xyd-hatch) 0 2px,transparent 2px 5px),var(--xyd-hatch-faint)}\nbutton.xy-growth-col{cursor:pointer}\nbutton.xy-growth-col.xy-hover{box-shadow:inset 0 0 0 2px var(--xyd-accent-ring)}\n@media (hover:hover) and (pointer:fine){\n button.xy-growth-col:hover{box-shadow:inset 0 0 0 2px var(--xyd-accent-ring)}\n}\n@media (max-width:520px){\n .xy-growth-scroll .xy-growth,.xy-growth-scroll .xy-growth-axis{min-width:480px}\n}\n/* \u57FA\u7EBF\u8D34\u67F1\u5E95\uFF08\u4E0E\u804A\u5929\u56FE\u8868\u5361\u7684 SVG \u57FA\u7EBF\u540C\u4E00\u8BED\u6CD5\uFF09\uFF0C\u523B\u5EA6\u5C42\u4E0B\u79FB\u8BA9\u51FA\u7EBF\u7684\u4F4D\u7F6E */\n.xy-growth-axis{position:relative;height:20px;margin-top:0;border-top:1px solid var(--dsw-alias-border-l2)}\n.xy-growth-tick{position:absolute;top:4px;font-size:12px;line-height:16px;color:var(--xyd-label-on-2);white-space:nowrap;font-variant-numeric:tabular-nums}\n/* \u6210\u957F\u9875\u60AC\u6D6E\u660E\u7EC6 */\n.xy-tip{position:relative;margin-top:0;min-height:20px;font-size:12px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-inner);padding:3px 10px;display:inline-block;font-variant-numeric:tabular-nums}\n.xy-tip:empty{visibility:hidden}\n/* \u56FE\u8868\u52A0\u8F7D\u5360\u4F4D\uFF1A\u4E0E\u6210\u54C1\u56FE\u7B49\u9AD8\uFF0C\u6570\u636E\u5230\u8FBE\u4E0D\u5F15\u8D77\u4E0B\u65B9\u5185\u5BB9\u4F4D\u79FB */\n.xy-chartload{height:150px;margin-top:8px}\n\n/* ===== \u6210\u957F\u9875\uFF1A\u7B49\u7EA7\u82F1\u96C4\u5361 + \u7B49\u7EA7\u8BF4\u660E ===== */\n/* \u6E10\u53D8\u4E24\u7AEF\u5747\u4E3A\u5B9E\u8272\uFF08\u6DF1\u6863\u2192\u57FA\u6863\uFF0Cgrowth.ts \u5185\u8054 darkenHex \u9884\u6DF7\uFF09\uFF0C\u767D\u5B57\u5BF9\u5E95\u8272 \u22654.5:1\n * \u5728\u6D45\u8272\u58F3\u4E0B\u540C\u6837\u6210\u7ACB\u2014\u2014\u534A\u900F\u660E\u6E10\u53D8\u6DF7\u5165\u9875\u9762\u767D\u5E95\u540E\u53F3\u7AEF\u4F1A\u8DCC\u7834 3:1\uFF0C\u5DF2\u5F03\u7528\u3002 */\n.xy-hero{display:flex;gap:14px;align-items:center;border-radius:var(--xyd-r-card);padding:18px;margin-top:12px;border:1px solid var(--xyd-hero-border);box-shadow:var(--xyd-shadow-hero)}\n.xy-herobadge{width:54px;height:54px;border-radius:12px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800;font-size:16px;flex:none;text-shadow:var(--xyd-herobadge-glyph-shadow)}\n.xy-heromain{flex:1;min-width:0}\n.xy-onhero{color:var(--xyd-on-hero)!important}\n.xy-herotitle{font-size:19px;font-weight:700;margin:3px 0 8px;color:#fff}\n.xy-bar-onhero{background:var(--xyd-bar-on-hero)}\n.xy-bar-fill-solid{background:#fff}\n.xy-heroreward{margin-top:8px}\n.xy-levels{display:flex;flex-direction:column;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);padding:4px 14px}\n/* \u7B49\u7EA7\u884C\u7684\u300C\u672A\u8FBE\u6210\u300D\u964D\u6743\u8D70\u6587\u5B57\u8272\u800C\u975E\u6574\u884C opacity\uFF080.68 \u6DF7\u5E95\u540E label-on-2/secondary\n * \u5747\u8DCC\u7834 AA\uFF0C\u6700\u4F4E \u22482.6:1\uFF09\uFF1A\u540D\u79F0/\u5956\u52B1\u7528 secondary\uFF08\u22654.5:1\uFF09\uFF0C\u5FBD\u7AE0\u672C\u5C31\u662F\u4E2D\u6027\u5E95 +\n * label-on-2\uFF08\u6821\u51C6 5.0:1\uFF09\uFF1B\u547D\u4E2D\u884C\u6062\u590D\u4E3B\u6587\u5B57\u8272 + \u5F69\u8272\u5FBD\u7AE0\uFF0C\u5C42\u7EA7\u611F\u4E0D\u9760\u900F\u660E\u5EA6 */\n.xy-levelrow{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--dsw-alias-border-l1);font-size:13px}\n.xy-levelrow:last-child{border-bottom:none}\n.xy-levelrow .xy-lvname{color:var(--dsw-alias-label-secondary)}\n.xy-levelhit .xy-lvname{color:var(--dsw-alias-label-primary)}\n.xy-lvnum{width:42px;height:24px;border-radius:8px;background:var(--dsw-alias-bg-layer-2);color:var(--xyd-label-on-2);display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex:none}\n.xy-lvname{font-weight:600;width:64px;color:var(--dsw-alias-label-primary)}\n.xy-lvreward{margin-left:auto;text-align:right}\n\n/* ===== \u8BB0\u5FC6\u9875 ===== */\n/* \u6DFB\u52A0/\u7F16\u8F91\u8BB0\u5FC6\u8868\u5355\uFF1A\u865A\u7EBF\u9762\u677F\u5361\uFF08\u4E0E\u5FEB\u901F\u65B0\u5EFA\u540C\u4E00\u300C\u53EF\u4E66\u5199\u300D\u8BED\u6CD5\uFF09 */\n.xy-compose{margin-top:12px;border:1px dashed var(--dsw-alias-border-l2);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);padding:12px 14px;display:flex;gap:8px;flex-wrap:wrap}\n.xy-compose .xy-input-grow{flex:1 1 170px;width:auto;min-width:140px}\n.xy-compose select.xy-input{width:auto}\n.xy-editing{display:flex;align-items:center;gap:10px;margin-top:12px;padding:7px 10px;border:1px dashed var(--dsw-alias-border-l2);border-radius:var(--xyd-r-inner)}\n.xy-memactions{display:flex;gap:6px;flex:none}\n.xy-membar{display:flex;align-items:center;gap:10px;margin-top:14px;flex-wrap:wrap}\n.xy-membar .xy-input-search{width:min(250px,100%)}\n.xy-memcap{margin-top:6px}\n/* \u8D85\u957F\u8BB0\u5FC6\u503C 3 \u884C\u622A\u65AD\uFF08\u22641000 \u5B57\u7B26\u8BB0\u5F55\u4E0D\u518D\u6491\u51FA\u6570\u5C4F\u9AD8\u884C\uFF1B\u5B8C\u6574\u503C\u5728\u5220\u9664\u786E\u8BA4\u5F39\u7A97\u53EF\u89C1\uFF09 */\n.xy-memval{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}\n.xy-saved{color:var(--dsw-alias-state-success-primary,var(--xyd-ok));font-size:13px}\n.xy-memfoot{display:flex;align-items:center;gap:12px;margin-top:14px}\n\n/* ===== \u8BBE\u7F6E\u9875 ===== */\n.xy-settings{display:flex;flex-direction:column;gap:16px;max-width:560px;color:var(--dsw-alias-label-primary);font-size:14px}\n/* \u8BBE\u7F6E\u4E09\u4E2A\u5206\u8282\u5404\u81EA\u6210\u9762\u677F\u5361\uFF1B\u95F4\u8DDD\u4EA4\u7ED9 xy-settings \u7684 gap\uFF0C\u5361\u5185\u5B50\u5143\u7D20\u7EDF\u4E00 10px \u7EB5\u5411\u8282\u594F */\n.xy-settings .xy-panel{margin-top:0}\n.xy-settings .xy-panel>*+*{margin-top:10px}\n.xy-field{display:flex;flex-direction:column;gap:6px}\n.xy-field-head{display:flex;align-items:center;gap:8px;font-weight:600}\n.xy-input-wide{width:100%;max-width:360px;box-sizing:border-box}\n.xy-seg{display:flex;gap:6px;flex-wrap:wrap}\n.xy-seg-btn{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:999px;padding:5px 14px;font-size:13px;cursor:pointer;transition:border-color .15s ease,background-color .15s ease,color .15s ease}\n@media (hover:hover) and (pointer:fine){\n .xy-seg-btn:hover{border-color:var(--xyd-accent)}\n}\n/* \u9009\u4E2D\u6001\u53CC\u9009\u62E9\u5668\uFF1A\u7C7B\u540D\u4E0E aria-pressed \u5C5E\u6027\u7B49\u4EF7\uFF08\u7EC4\u4EF6\u4FA7\u7528\u5C5E\u6027\u8868\u8FBE\u72B6\u6001\u8BED\u4E49\uFF09 */\n.xy-seg-btn.xy-on,.xy-seg-btn[aria-pressed='true']{background:var(--xyd-accent);border-color:transparent;color:var(--xyd-on-accent)}\n.xy-save-row{display:flex;align-items:center;gap:10px;margin-top:2px}\n.xy-toggle{width:38px;height:22px;appearance:none;border-radius:999px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);position:relative;cursor:pointer;transition:background .15s}\n.xy-toggle:checked{background:var(--xyd-accent);border-color:transparent}\n.xy-toggle::after{content:'';position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--dsw-alias-label-primary);transition:transform .15s}\n.xy-toggle:checked::after{transform:translateX(16px);background:var(--xyd-on-accent)}\n.xy-hint{color:var(--dsw-alias-label-secondary);font-size:12px;margin:0}\n\n/* ===== \u8BE6\u60C5\u805A\u5408\u89C6\u56FE ===== */\n/* \u6BB5\u95F4 10px \u547C\u5438\uFF1B\u6BCF\u6BB5\u5185\u90E8\u300C\u6807\u7B7E \u2192 \u5185\u5BB9\u300D\u56FA\u5B9A 5px \u7EB5\u5411\u8282\u594F\uFF08label \u4E0D\u518D\u4E0E\u5185\u5BB9\u6587\u5B57\u6324\u884C\uFF09\u3002\n * \u5E95\u90E8\u7559 8px\uFF1A\u64CD\u4F5C\u6309\u94AE\u4E0E\u4E0B\u4E00\u6761\u4EFB\u52A1\u7684\u5206\u5272\u7EBF\u4E0D\u5F97\u8D34\u6B7B\uFF08\u613F\u671B\u5361\u91CC\u5206\u5272\u7EBF\u76F4\u63A5\u538B\u5728\u8BE6\u60C5\u4E0B\u7F18\uFF09\uFF0C\n * \u4EFB\u52A1\u9875\u7531 xy-taskrow \u8986\u76D6\u4E3A 2px\uFF08\u5206\u7EC4\u5361\u884C\u81EA\u5E26 11px \u5185\u8FB9\u8DDD\uFF0C\u603B\u91CF\u5DF2\u591F\uFF09\u3002 */\n.xy-detail{margin-top:8px;margin-bottom:8px;border-top:1px dashed var(--dsw-alias-border-l1);padding-top:10px;display:flex;flex-direction:column;gap:10px}\n.xy-detail>div{display:flex;flex-direction:column;gap:5px;align-items:flex-start;min-width:0}\n.xy-detail>div>.xy-meta{margin-top:0}\n.xy-detail-grid{display:grid;grid-template-columns:repeat(7,max-content);gap:4px;padding:2px 0}\n/* \u6253\u5361\u683C\uFF1A22px + 11px \u6570\u5B57\uFF08\u53EF\u8BFB\u6027\u4E0B\u9650\uFF09\uFF1Bradius 6 \u4E3A\u5FBD\u7AE0\u7EA7\u5FAE\u5143\u7D20\u4F8B\u5916\u6863\u3002\n * \u7F51\u683C\u6309\u5468\u5BF9\u9F50\uFF08\u5468\u4E00\u59CB\uFF0C\u4E0E\u65E5\u5386\u9875\u8868\u5934\u540C\u6784\uFF09\uFF1A\u8FDE\u7EED\u6027\u4E00\u773C\u53EF\u8BFB\uFF08GitHub/Streaks \u60EF\u4F8B\uFF09\uFF0C\n * \u9996\u884C\u524D\u7F6E\u7A7A\u4F4D\u7531 .xy-dcell-blank \u5360\u4F4D\u3002 */\n.xy-dcell{width:22px;height:22px;border-radius:6px;font-size:11px;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;padding:0;border:none;cursor:default;font-variant-numeric:tabular-nums}\n.xy-dcell-blank{visibility:hidden}\n/* \u4ECA\u65E5\u683C = accent \u73AF\u5305\u5E95\u8272\uFF1A\u4E0E\u65E5\u5386\u9875\u5706\u7AE0\u7684 today \u73AF\u540C\u4E00\u8BED\u6CD5 */\n.xy-dcell.xy-dcell-today{box-shadow:0 0 0 2px var(--xyd-accent)}\n.xy-dcell-checked{background:var(--xyd-dcell-checked);color:var(--xyd-on-dcell)}\nbody[data-ds-dark-theme] .xy-dcell-checked{color:var(--xyd-on-dcell)}\n.xy-dcell-missed{background:transparent;border:1px dashed var(--dsw-alias-border-l3);color:var(--dsw-alias-label-secondary)}\n.xy-dcell-future{background:var(--dsw-alias-bg-layer-2);color:var(--xyd-label-on-2);border:1px solid var(--dsw-alias-border-l1)}\n/* \u56FE\u4F8B\u590D\u7528 xy-dot \u65F6\u501F\u683C\u5B50\u7684\u8BED\u4E49\u5E95\u8272\uFF08\u540C\u8272\u7CFB\u5C0F\u5C3A\u5BF8\uFF09 */\n.xy-dot.xy-dcell-missed{background:transparent;border:1px dashed var(--dsw-alias-border-l3)}\n.xy-dot.xy-dcell-future{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1)}\n.xy-dot.xy-dcell-checked{background:var(--xyd-dcell-checked-dot)}\n.xy-detail-next{font-size:12px;color:var(--dsw-alias-label-secondary)}\n/* \u64CD\u4F5C\u884C\u4E0E\u5168\u7AD9\u6309\u94AE\u7EC4\u540C\u62CD\uFF08gap 8\uFF09\uFF1A\u5220\u9664\u5728\u540C\u4E00\u884C\u6D41\u5185\u9760 danger \u63CF\u8FB9\u533A\u5206\uFF0C\n * \u786E\u8BA4\u5F39\u7A97\u515C\u5E95\u9632\u8BEF\u89E6\u2014\u2014\u4E0D\u518D margin-left:auto \u6F02\u5230\u5361\u7F18\uFF08\u7A84\u9762\u677F\u91CC\u662F\u4E00\u6BB5\u7A81\u5140\u7A7A\u767D\uFF0C\n * \u613F\u671B\u5361\u91CC\u8FD8\u4F1A\u4E0E\u5361\u5934\u7684\u613F\u671B\u7EA7\u5220\u9664\u540C\u4FA7\u5BF9\u9F50\u9020\u6210\u8BED\u4E49\u6DF7\u6DC6\uFF09 */\n.xy-detail-ops{display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n\n/* ===== \u5206\u7C7B\u7BA1\u7406 ===== */\n.xy-catpanel{margin-top:10px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);padding:12px 14px}\n.xy-catrow{display:flex;align-items:center;gap:10px;padding:7px 0;border-bottom:1px solid var(--dsw-alias-border-l1)}\n.xy-catrow:last-child{border-bottom:none}\n.xy-catcount{margin-left:auto}\n.xy-catops{display:flex;gap:6px}\n.xy-swatchrow{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;align-items:center}\n/* \u8272\u677F\u683C\uFF1A24px \u547D\u4E2D\u76EE\u6807 + hover \u63CF\u8FB9 + \u4E3B\u9898\u4EE4\u724C\u63CF\u8FB9\uFF08\u6DF1\u8272\u4E0B\u4E0D\u518D\u9690\u8EAB\uFF09 */\n.xy-swatch{width:24px;height:24px;border-radius:8px;border:1px solid var(--dsw-alias-border-l2);cursor:pointer;padding:0;position:relative;transition:box-shadow .15s ease}\n.xy-swatch:disabled{opacity:.55;cursor:not-allowed}\n@media (hover:hover) and (pointer:fine){\n .xy-swatch:hover:not(:disabled){box-shadow:inset 0 0 0 2px var(--xyd-accent-ring-soft)}\n}\n/* \u9009\u4E2D\u6001\u53CC\u73AF\uFF08\u5185\u767D\u9699 + \u5916\u5F3A\u8C03\u5708\uFF09\uFF1A\u4EFB\u4F55\u8272\u76F8\u4E0B\u90FD\u6E05\u6670\u53EF\u8FA8\uFF0C\u4E0D\u4F9D\u8D56\u5BF9\u52FE\u672C\u8EAB\u7684\u5BF9\u51B2 */\n.xy-swatch.xy-picked{box-shadow:inset 0 0 0 2px var(--xyd-swatch-ring),0 0 0 2px var(--xyd-accent)}\n.xy-swatch.xy-picked::after{content:'\u2713';position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff;font-size:12px;font-weight:700;text-shadow:var(--xyd-swatch-glyph-shadow)}\n.xy-catloading{padding:6px 0}\n/* \u884C\u5185\u6539\u540D\u7F16\u8F91\u5668\uFF1A\u8F93\u5165\u5728\u7A84\u9762\u677F\u6536\u7F29\uFF08\u65E0 min-width:0 \u65F6 input \u56FA\u6709\u5BBD\u5EA6\u4F1A\u628A\n * \u4FDD\u5B58/\u53D6\u6D88\u952E\u6324\u51FA 320px \u9762\u677F\u88AB overflow-x:clip \u65E0\u58F0\u88C1\u6389\uFF09 */\n.xy-rename{display:flex;gap:6px;align-items:center;margin-top:8px;flex-wrap:wrap}\n.xy-rename .xy-input{flex:1 1 120px;min-width:0;width:auto}\n\n/* ===== \u5FEB\u901F\u65B0\u5EFA ===== */\n.xy-quick{margin-top:10px;border:1px dashed var(--dsw-alias-border-l2);border-radius:var(--xyd-r-card);padding:12px 14px;display:flex;flex-direction:column;gap:10px;background:var(--dsw-alias-bg-layer-1)}\n.xy-quick-row{display:flex;gap:10px;flex-wrap:wrap}\n.xy-quick-field{display:flex;flex-direction:column;gap:4px;min-width:150px;flex:1}\n.xy-quick-label{font-size:12px;color:var(--dsw-alias-label-secondary);font-weight:600}\n.xy-quick-actions{display:flex;gap:10px;align-items:center}\n\n/* ===== \u6EDA\u52A8\u6761\u69FD\u4F4D\u6052\u5B9A\uFF08\u5BBD\u5EA6\u9632\u6296\u7B2C\u4E8C\u9053\u4FDD\u9669\uFF09=====\n * \u58F3\u7684\u4F1A\u8BDD\u6EDA\u52A8\u5BB9\u5668\uFF08CSS Modules\u300C\u54C8\u5E0C\u524D\u7F00_\u8BED\u4E49\u540E\u7F00\u300D\u7A33\u5B9A\u547D\u540D + data-conversation-scroll\n * \u6807\u8BB0\uFF09\u9ED8\u8BA4 gutter stable\uFF0C\u4F46\u8F93\u5165\u6846\u6D6E\u5C42\u6A21\u5F0F\u4F1A\u4E3B\u52A8\u653E\u5F00\u4E3A auto\u2014\u2014\u7ECF\u5178\u6EDA\u52A8\u6761\u6309\u9700\u51FA\u73B0\u4F1A\u62BD\u8D70\n * ~15px \u5BBD\u5EA6\uFF08\u70B9\u300C\u65B0\u5EFA\u300D\u5C55\u5F00\u8868\u5355\u3001\u5C55\u5F00\u8BE6\u60C5\u5373\u89E6\u53D1\uFF09\uFF0C\u5C45\u4E2D\u9875\u9762\u968F\u4E4B\u6574\u5E27\u5DE6\u53F3\u5F39\u8DF3\u3002\n * \u8FD9\u91CC\u5BF9\u6EDA\u52A8\u5BB9\u5668\u672C\u8EAB\u65E0\u6761\u4EF6\u5F3A\u5236\u5E38\u9A7B\u69FD\u4F4D\uFF1B\u4E0E useStableScrollbar \u7684 useLayoutEffect\n * \u8FD0\u884C\u65F6\u9489\u4F4F\u4E92\u4E3A\u5197\u4F59\uFF08\u6837\u5F0F\u5148\u4E8E\u9996\u5E27\uFF0C\u8FD0\u884C\u65F6\u515C\u5E95\u58F3\u4FA7\u8282\u70B9\u66FF\u6362\uFF09\u3002 */\n[class*='_scrollBody'][data-conversation-scroll]{scrollbar-gutter:stable!important}\n\n/* \u5F31\u5316\u52A8\u753B\u504F\u597D\uFF1A\u5C0A\u91CD prefers-reduced-motion\uFF08\u542B\u5F00\u5173\u6ED1\u5757\u3001hover \u8FC7\u6E21\u3001\u63D2\u753B\u65E0\u52A8\u753B\u3001toast \u8FDB\u51FA\u573A\u3001\u786E\u8BA4\u5F39\u7A97\uFF09 */\n@media (prefers-reduced-motion: reduce){\n .xy-skel,.xy-toast,.xy-modal-backdrop,.xy-modal{animation:none}\n .xy-toast-out,.xy-modal-backdrop.xy-modal-out,.xy-modal-out .xy-modal{transition:none}\n .xy-bar-fill,.xy-btn,.xy-toggle,.xy-toggle::after,.xy-wishcard,.xy-cell,.xy-daynum,.xy-seg-btn,.xy-input,.xy-swatch,.xy-grouprow{transition:none}\n}\n";
19
+ export declare const STYLE_TEXT = "\n/* ===== \u54C1\u724C\u4E0E\u8BED\u4E49\u4EE4\u724C ===== */\n:root{\n --xyd-accent:#1a6fe0;\n --xyd-on-accent:#ffffff;\n --xyd-accent-strong:#1e40af;\n --xyd-accent-soft:rgba(26,111,224,.12);\n --xyd-danger:#c0392b;\n --xyd-danger-bg:#c0392b;\n --xyd-warn:#b45309;\n --xyd-ok:#0f766e;\n /* \u5F69\u5E95\u5C0F\u5706\u6807\u7684\u524D\u666F\u5BF9\uFF1A\u6309\u4E3B\u9898\u914D\u5BF9\u4FDD\u8BC1 \u22654.5:1\uFF08\u6DF1\u8272\u4EAE\u5E95\u914D\u6DF1\u5B57\uFF09 */\n --xyd-on-ok:#ffffff;\n --xyd-on-danger:#ffffff;\n /* \u6B21\u8981\u6587\u5B57\u5728\u6B21\u7EA7\u9762\u677F\u5E95\uFF08layer-2\uFF09\u4E0A\u7684\u4E13\u7528\u5BF9\uFF1A\u58F3\u901A\u7528\u6B21\u8981\u8272\u5BF9 layer-2 \u53EA\u6709\n * \u22484.3:1\uFF0C\u672C\u5BF9\u6309 5.0+:1 \u6821\u51C6\uFF08\u9884\u89C8\u6761/\u7EC4\u8BA1\u6570/\u7B49\u7EA7\u7F16\u53F7/\u672A\u6765\u683C/\u6210\u957F\u8F74\u523B\u5EA6\uFF09 */\n --xyd-label-on-2:#5d6a7d;\n /* \u534A\u900F\u660E\u884D\u751F\u8272\uFF08\u7981 color-mix\uFF0C\u6309\u4E3B\u9898\u663E\u5F0F rgba\uFF09\uFF1A\u5F3A\u8C03\u63CF\u8FB9 / \u5F3A\u8C03\u60AC\u505C\u73AF /\n \u5371\u9669\u63CF\u8FB9 / \u5371\u9669\u60AC\u505C\u5E95 / \u4E2D\u6027\u884C\u60AC\u505C\u5E95 / \u659C\u7EB9\u7EB9\u7406\u4E0E\u5F31\u5316\u5E95 */\n --xyd-accent-border:rgba(26,111,224,.38);\n --xyd-accent-ring:rgba(26,111,224,.72);\n --xyd-accent-ring-soft:rgba(26,111,224,.55);\n --xyd-danger-border:rgba(192,57,43,.4);\n --xyd-danger-soft:rgba(192,57,43,.09);\n --xyd-hover:rgba(15,23,42,.05);\n --xyd-hatch:rgba(100,116,139,.36);\n --xyd-hatch-faint:rgba(100,116,139,.14);\n /* \u6210\u529F/\u8B66\u793A\u8BED\u4E49\u67D4\u548C\u5E95\u4E0E\u63CF\u8FB9\u5BF9\uFF08\u6253\u5361\u5361/\u5FAE\u884C\u52A8\u5361/\u6210\u529F\u6A2A\u5E45/\u56FE\u8868\u5FBD\u7AE0\uFF09\uFF1A\n * \u6B64\u524D\u5355\u503C\u900F\u660E\u5EA6\u4E24\u4E3B\u9898\u5171\u7528\uFF0C\u6DF1\u8272\u4E0B .08 \u7EFF\u6D17\u51E0\u4E4E\u4E0D\u53EF\u89C1 */\n --xyd-ok-soft:rgba(56,217,169,.09);\n --xyd-ok-border:rgba(56,217,169,.4);\n --xyd-ok-badge:rgba(56,217,169,.18);\n --xyd-warn-soft:rgba(255,169,77,.2);\n --xyd-warn-border:rgba(255,169,77,.4);\n /* \u65E5\u5386\u72B6\u6001\u5E95\uFF08\u90E8\u5206/\u5168\u90E8\u5B8C\u6210\uFF09\u4E0E\u6253\u5361\u8BB0\u5F55\u683C\uFF08\u5DF2\u6253\u5361\uFF09\u7684\u6210\u5BF9\u5E95\u8272 */\n --xyd-c2-soft:rgba(255,169,77,.32);\n --xyd-c3-soft:rgba(16,185,129,.22);\n --xyd-c3-soft-dot:rgba(16,185,129,.30);\n --xyd-dcell-checked:rgba(56,217,169,.42);\n --xyd-dcell-checked-dot:rgba(56,217,169,.55);\n /* \u4E0A\u8FF0\u6210\u5BF9\u5E95\u8272\u7684\u524D\u666F\u4F19\u4F34\uFF08\u540C\u4F7F\u7528\u70B9\u6536\u8FDB\u4EE4\u724C\u533A\uFF0C\u6F02\u79FB\u5373\u7EA2\uFF09 */\n --xyd-on-c2:#7c4a03;\n --xyd-on-c3:#065f46;\n --xyd-on-dcell:#0b3d26;\n /* \u9634\u5F71\u5BF9\uFF08\u5361\u7247\u60AC\u505C/toast/\u5F39\u7A97/\u82F1\u96C4\u5361\uFF09\uFF1A\u6DF1\u6D45\u5404\u81EA\u914D\u6863\uFF0C\u7981\u6B62\u6B63\u6587\u533A\u88F8\u5199 rgba */\n --xyd-shadow-card:0 2px 10px rgba(15,23,42,.07);\n --xyd-shadow-toast:0 8px 24px -8px rgba(15,23,42,.2),0 2px 8px -2px rgba(15,23,42,.1);\n --xyd-shadow-modal:0 24px 48px -16px rgba(15,23,42,.35),0 4px 12px -4px rgba(15,23,42,.2);\n --xyd-shadow-hero:0 2px 10px rgba(30,25,60,.16);\n --xyd-hero-border:rgba(255,255,255,.16);\n --xyd-on-hero:rgba(255,255,255,.92);\n --xyd-bar-on-hero:rgba(255,255,255,.28);\n --xyd-swatch-ring:rgba(255,255,255,.85);\n --xyd-swatch-glyph-shadow:0 0 2px rgba(0,0,0,.85),0 1px 3px rgba(0,0,0,.6);\n --xyd-herobadge-glyph-shadow:0 1px 2px rgba(0,0,0,.18);\n /* \u58F3\u906E\u7F69\u4EE4\u724C\u7F3A\u5E2D\u65F6\u7684\u515C\u5E95\uFF08\u4E0D\u518D\u5728\u89C4\u5219\u884C\u5185\u88F8\u5199 rgba \u515C\u5E95\u503C\uFF09 */\n --xyd-mask:rgba(15,23,42,.45);\n /* \u5706\u89D2\u523B\u5EA6 */\n --xyd-r-card:12px;--xyd-r-inner:9px;--xyd-r-ctl:8px;\n}\nbody[data-ds-dark-theme]{\n --xyd-accent:#60a5fa;\n --xyd-on-accent:#0f172a;\n --xyd-accent-strong:#93c5fd;\n --xyd-accent-soft:rgba(96,165,250,.16);\n --xyd-danger:#ff9b8f;\n --xyd-danger-bg:#e2635a;\n --xyd-warn:#fbbf24;\n --xyd-ok:#34d399;\n --xyd-on-ok:#052e21;\n --xyd-on-danger:#3f1008;\n --xyd-label-on-2:#9aa6b7;\n --xyd-accent-border:rgba(96,165,250,.38);\n --xyd-accent-ring:rgba(96,165,250,.72);\n --xyd-accent-ring-soft:rgba(96,165,250,.55);\n --xyd-danger-border:rgba(255,155,143,.4);\n --xyd-danger-soft:rgba(255,155,143,.12);\n --xyd-hover:rgba(148,163,184,.1);\n --xyd-hatch:rgba(139,152,171,.4);\n --xyd-hatch-faint:rgba(139,152,171,.16);\n --xyd-ok-soft:rgba(52,211,153,.14);\n --xyd-ok-border:rgba(52,211,153,.55);\n --xyd-ok-badge:rgba(52,211,153,.22);\n --xyd-warn-soft:rgba(255,169,77,.26);\n --xyd-warn-border:rgba(255,169,77,.5);\n --xyd-c2-soft:rgba(255,169,77,.24);\n --xyd-c3-soft:rgba(52,211,153,.22);\n --xyd-c3-soft-dot:rgba(52,211,153,.30);\n --xyd-dcell-checked:rgba(46,160,105,.32);\n --xyd-dcell-checked-dot:rgba(46,160,105,.45);\n --xyd-on-c2:#ffd9a8;\n --xyd-on-c3:#a7f3c9;\n --xyd-on-dcell:#a7f3c9;\n --xyd-shadow-card:0 2px 10px rgba(0,0,0,.32);\n --xyd-shadow-toast:0 8px 24px -8px rgba(0,0,0,.5),0 2px 8px -2px rgba(0,0,0,.35);\n --xyd-shadow-modal:0 24px 48px -16px rgba(0,0,0,.55),0 4px 12px -4px rgba(0,0,0,.4);\n --xyd-shadow-hero:0 2px 10px rgba(0,0,0,.4);\n --xyd-hero-border:rgba(255,255,255,.16);\n --xyd-on-hero:rgba(255,255,255,.92);\n --xyd-bar-on-hero:rgba(255,255,255,.28);\n --xyd-swatch-ring:rgba(255,255,255,.85);\n --xyd-swatch-glyph-shadow:0 0 2px rgba(0,0,0,.85),0 1px 3px rgba(0,0,0,.6);\n --xyd-herobadge-glyph-shadow:0 1px 2px rgba(0,0,0,.18);\n --xyd-mask:rgba(0,0,0,.5);\n}\n\n.xy-visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n\n/* ===== \u4F1A\u8BDD\u5361\u7247 ===== */\n.xy-card{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);padding:11px 14px;margin:6px 0;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font-size:14px}\n.xy-card-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n/* \u957F\u5185\u5BB9\u7EAA\u5F8B\uFF1A\u5FBD\u7AE0\u4E0D\u6536\u7F29\uFF1B\u6807\u9898\u5141\u8BB8\u65AD\u884C\u6536\u7F29\u2014\u2014\u675C\u7EDD\u957F\u82F1\u6587\u8BCD\u6A2A\u5411\u6EA2\u51FA\u4E0E\u6574\u884C\u6296\u52A8 */\n.xy-badge{flex:none;font-size:12px;border-radius:6px;padding:1px 7px;color:var(--dsw-alias-label-primary)}\n/* \u5206\u7C7B\u5FBD\u7AE0\uFF1AHSL \u53D8\u91CF\u4F9B\u8272\uFF0C\u4EAE\u5EA6\u6309\u4E3B\u9898\u5206\u5C42\uFF08\u5BF9\u9F50 Web wish-category \u7684 .dark \u8986\u76D6\u53E3\u5F84\uFF09 */\n.xy-badge-cat{background:hsl(var(--cat-h,275) calc(var(--cat-sbg,58)*1%) 92%);color:hsl(var(--cat-h,275) calc(var(--cat-sfg,46)*1%) 30%);border:1px solid hsl(var(--cat-h,275) calc(var(--cat-sbd,46)*1%) 55% / .12)}\nbody[data-ds-dark-theme] .xy-badge-cat{background:hsl(var(--cat-h,275) calc(var(--cat-sbg,58)*1%) 22%);color:hsl(var(--cat-h,275) calc(var(--cat-sfg,46)*1%) 80%);border-color:hsl(var(--cat-h,275) calc(var(--cat-sbd,46)*1%) 70% / .2)}\n.xy-badge-task{background:var(--xyd-accent-soft)}\n.xy-badge-chart{background:var(--xyd-ok-badge)}\n.xy-badge-micro{background:var(--xyd-warn-soft)}\n.xy-title{min-width:0;font-weight:600;color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}\n.xy-deleted{opacity:.65}\n.xy-deleted .xy-title{text-decoration:line-through}\n.xy-meta{color:var(--dsw-alias-label-secondary);font-size:12px;margin-top:4px;overflow-wrap:anywhere}\n/* \u6B21\u7EA7\u9762\u677F\u5E95\u4E0A\u7684\u6B21\u8981\u6587\u5B57\u7528\u4E13\u7528\u5BF9\uFF08\u58F3\u901A\u7528\u6B21\u8981\u8272\u5BF9 layer-2 \u4EC5 \u22484.3:1\uFF0C\u53CC\u4E3B\u9898\u540C\u75C5\uFF09 */\n.xy-preview{margin-top:6px;font-size:12px;color:var(--xyd-label-on-2);background:var(--dsw-alias-bg-layer-2);border-radius:var(--xyd-r-inner);padding:6px 8px}\n.xy-checkin{border-color:var(--xyd-ok-border);background:var(--xyd-ok-soft)}\n.xy-glyph{font-size:15px;font-weight:700;line-height:1}\n.xy-glyph-ok{color:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n.xy-glyph-back{color:var(--dsw-alias-label-secondary)}\n.xy-actioned{margin-left:auto;color:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n\n/* \u5FAE\u884C\u52A8\u5361 */\n.xy-micro{border-color:var(--xyd-warn-border)}\n.xy-microsteps{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}\n.xy-microstep{display:flex;align-items:flex-start;gap:8px;padding:7px 10px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-inner);background:var(--dsw-alias-bg-layer-2)}\n.xy-microstep.xy-done .xy-microsteptext{text-decoration:line-through}\n/* \u5B8C\u6210/\u8DF3\u8FC7\u6B65\u7684\u6587\u5B57\u964D\u6743\u8D70\u6B21\u8981\u8272\u800C\u975E\u6574\u884C opacity\uFF08\u5BF9\u6BD4\u5EA6\u4F9D\u636E\u540C\u4E0A .xy-done \u6CE8\uFF09 */\n.xy-microstep.xy-done .xy-microsteptext,.xy-microstep.xy-skipped .xy-microsteptext{color:var(--dsw-alias-label-secondary)}\n.xy-microstepnum{flex:none;width:20px;height:20px;border-radius:50%;background:var(--xyd-accent);color:var(--xyd-on-accent);display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;margin-top:1px}\n.xy-microsteptext{font-size:13px;display:flex;flex-direction:column;min-width:0}\n/* \u5361\u5185\u6B65\u9AA4\u8BF4\u660E/\u72B6\u6001\u8BCD\u7684\u80CC\u666F\u662F layer-2\uFF1A\u6B21\u8981\u6587\u5B57\u7528 label-on-2 \u4E13\u7528\u5BF9\uFF08\u58F3\u901A\u7528\n * \u6B21\u8981\u8272\u5BF9 layer-2 \u4EC5 \u22484.3:1\uFF0C\u53CC\u4E3B\u9898\u540C\u75C5\u2014\u2014\u4E0E xy-preview \u540C\u4E00\u6CBB\u7406\u7EBF\uFF09 */\n.xy-microstep .xy-meta{color:var(--xyd-label-on-2)}\n.xy-microstate{margin-left:auto;flex:none}\n\n/* \u56FE\u8868\u5361 */\n.xy-chart{background:var(--dsw-alias-bg-layer-1)}\n.xy-chart-legend{display:flex;gap:12px;margin-top:8px;font-size:12px;color:var(--dsw-alias-label-secondary);align-items:center}\n.xy-arcwrap{margin-top:8px}\n.xy-arcnum{font-size:22px;font-weight:700;color:var(--xyd-accent);font-variant-numeric:tabular-nums}\n.xy-bar{height:8px;border-radius:999px;background:var(--dsw-alias-bg-layer-2);margin-top:6px;overflow:hidden}\n/* \u586B\u5145\u8D70 scaleX\uFF08\u5408\u6210\u5668\u52A8\u753B\uFF09\uFF1Awidth \u8FC7\u6E21\u4F1A\u9010\u5E27\u89E6\u53D1\u5E03\u5C40\uFF0Ctransform \u53EA\u8FDB\u5408\u6210\u5668 */\n.xy-bar-fill{height:100%;border-radius:inherit;background:var(--xyd-accent);transform-origin:0 50%;transition:transform .35s cubic-bezier(.22,1,.36,1)}\n.xy-rows{list-style:none;margin-top:6px;display:flex;flex-direction:column;gap:4px;padding:0}\n.xy-row{display:flex;justify-content:space-between;font-size:13px}\n.xy-rowval{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums}\n.xy-heat{display:grid;grid-template-columns:repeat(auto-fill,minmax(14px,1fr));gap:2px;margin-top:8px}\n.xy-heatcell{aspect-ratio:1;border-radius:3px;background:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n.xy-svg{width:100%;height:auto;margin-top:6px}\n\n/* ===== Toast \u8F7B\u63D0\u793A ===== */\n.xy-toasts{position:fixed;top:14px;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:8px;z-index:9999;pointer-events:none;max-width:min(92vw,460px)}\n.xy-toast{pointer-events:auto;display:flex;align-items:center;gap:9px;padding:9px 14px;border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);font-size:13px;box-shadow:var(--xyd-shadow-toast);animation:xy-toast-in .24s cubic-bezier(.22,1,.36,1);cursor:pointer}\n.xy-toast-out{opacity:0;transform:translateY(-6px);transition:opacity .22s ease,transform .22s ease}\n@keyframes xy-toast-in{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}\n.xy-toast-glyph{flex:none;width:18px;height:18px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}\n.xy-toast-ok .xy-toast-glyph{background:var(--dsw-alias-state-success-primary,var(--xyd-ok));color:var(--xyd-on-ok)}\n.xy-toast-info .xy-toast-glyph{background:var(--xyd-accent);color:var(--xyd-on-accent)}\n.xy-toast-error .xy-toast-glyph{background:var(--xyd-danger-bg);color:var(--xyd-on-danger)}\n.xy-toast-text{min-width:0;overflow-wrap:anywhere}\n\n/* ===== \u5E94\u7528\u5185\u786E\u8BA4\u5F39\u7A97 =====\n * \u539F\u751F window.confirm \u7684\u66FF\u4EE3\uFF1A\u906E\u7F69 + \u9762\u677F\u5361\uFF0C\u5168\u90E8\u8D70\u4E3B\u9898\u4EE4\u724C\uFF08\u6DF1\u6D45\u8272\u81EA\u9002\u5E94\uFF09\u3002\n * \u52A8\u6548\u53EA\u7528 opacity/transform\uFF1Bz-index \u538B\u8FC7 toast \u5C42\uFF0C\u907F\u514D\u8F7B\u63D0\u793A\u6D6E\u5728\u5F39\u7A97\u4E4B\u4E0A\u3002 */\n.xy-modal-backdrop{position:fixed;inset:0;z-index:10000;display:flex;align-items:center;justify-content:center;padding:20px;background:var(--dsw-alias-bg-mask-1,var(--xyd-mask));animation:xy-fade-in .16s ease-out}\n.xy-modal-backdrop.xy-modal-out{opacity:0;transition:opacity .15s ease}\n.xy-modal{width:min(400px,100%);background:var(--dsw-alias-bg-overlay,var(--dsw-alias-bg-layer-1));border:1px solid var(--dsw-alias-border-l2);border-radius:var(--xyd-r-card);padding:16px 18px;box-shadow:var(--xyd-shadow-modal);animation:xy-pop-in .18s cubic-bezier(.22,1,.36,1)}\n.xy-modal-out .xy-modal{transform:scale(.98);transition:transform .15s ease}\n.xy-modal-msg{margin:0;font-size:14px;line-height:1.65;color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;max-height:min(56vh,440px);overflow-y:auto}\n.xy-modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}\n@keyframes xy-fade-in{from{opacity:0}to{opacity:1}}\n@keyframes xy-pop-in{from{opacity:0;transform:translateY(8px) scale(.97)}to{opacity:1;transform:none}}\n/* \u5B9E\u5FC3\u5371\u9669\u786E\u8BA4\u952E\uFF08\u5220\u9664\u7C7B\u52A8\u4F5C\u4E13\u7528\uFF09\uFF1A\u4E0E\u63CF\u8FB9\u5371\u9669\u952E\u533A\u5206\u300C\u5DF2\u786E\u8BA4\u5C06\u6267\u884C\u300D\u7684\u91CD\u91CF */\n.xy-btn-danger-solid{background:var(--xyd-danger-bg);border-color:transparent;color:var(--xyd-on-danger)}\n@media (hover:hover) and (pointer:fine){\n .xy-btn-danger-solid:hover:not(:disabled){filter:brightness(1.08);color:var(--xyd-on-danger)}\n}\n\n/* ===== \u9AA8\u67B6\u5C4F\u52A0\u8F7D\u6001 ===== */\n.xy-skel{border-radius:var(--xyd-r-inner);background:linear-gradient(90deg,var(--dsw-alias-bg-layer-2) 25%,var(--dsw-alias-bg-layer-1) 45%,var(--dsw-alias-bg-layer-2) 65%);background-size:200% 100%;animation:xy-shimmer 1.4s ease infinite}\n.xy-skel-title{height:22px;width:38%;margin-bottom:14px}\n.xy-skel-row{height:64px;margin-top:10px}\n@keyframes xy-shimmer{from{background-position:180% 0}to{background-position:-20% 0}}\n\n/* ===== \u7A7A\u6001\uFF08\u7EAF\u6587\u5B57\u7248\u5F0F\uFF0C\u63D2\u753B\u5DF2\u79FB\u9664\uFF1A\u89C1 PageEmpty \u6CE8\u91CA\uFF09===== */\n.xy-page-center{display:flex;flex-direction:column;align-items:center;gap:6px;padding:44px 0;text-align:center}\n.xy-empty-title{font-weight:600;color:var(--dsw-alias-label-primary);margin-top:4px}\n.xy-empty-hint{margin-top:2px;max-width:360px}\n\n/* ===== \u4F1A\u8BDD\u89C6\u56FE\u9875\u9AA8\u67B6 ===== */\n/* \u8282\u594F\u9501\uFF1A\u9875 padding 18/20 \u00B7 \u533A\u5757\u95F4 14\uFF08section-title \u4E0A\u8FB9\u8DDD\uFF09\u00B7 \u884C\u95F4\u8DDD 6/10 */\n.xy-page{box-sizing:border-box;width:100%;max-width:min(780px,100%);min-width:0;margin:0 auto;padding:18px 20px 26px;color:var(--dsw-alias-label-primary);font-size:14px;overflow-x:clip}\n.xy-page-head{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}\n/* \u5C45\u4E2D\u884C\u5185\u7684 .xy-meta \u5173\u95ED\u9ED8\u8BA4 4px \u4E0A\u8FB9\u8DDD\uFF1Aflex \u6309\u542B margin \u7684\u76D2\u5B50\u5C45\u4E2D\uFF0C\u9876\u8DDD\u4F1A\u8BA9\n * \u6B21\u8981\u6587\u5B57\u6052\u5B9A\u4F4E 2px\uFF08\u4E0E .xy-detail>div>.xy-meta \u540C\u4E00\u6761\u6CBB\u7406\u7EBF\uFF0C\u5934\u90E8\u6F0F\u6CBB\u70B9\u5728\u6B64\u6536\u53E3\uFF09 */\n.xy-card-head .xy-meta,.xy-page-head .xy-meta{margin-top:0}\n.xy-page-title{font-size:17px;font-weight:700;margin:0;color:var(--dsw-alias-label-primary)}\n.xy-section-title{font-size:12px;color:var(--dsw-alias-label-secondary);margin:14px 0 6px;font-weight:600;letter-spacing:.02em}\n/* \u9875\u5934\u52A8\u4F5C\u7EC4\uFF1A\u5355\u4E00 margin-left:auto \u6574\u4F53\u53F3\u7F6E\u2014\u2014\u591A\u6309\u94AE\u5404\u81EA auto \u4F1A\u5E73\u5206\u5269\u4F59\u7A7A\u95F4 */\n.xy-page-actions{display:flex;align-items:center;gap:8px;margin-left:auto;flex-wrap:wrap}\n\n/* \u63A7\u4EF6\u4F53\u7CFB */\n.xy-btn{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border-radius:var(--xyd-r-ctl);padding:5px 12px;min-height:28px;font-size:13px;cursor:pointer;line-height:1.5;transition:border-color .15s ease,background-color .15s ease,color .15s ease,filter .15s ease,transform .12s ease}\n/* \u60AC\u505C\u53CD\u9988\u4EC5\u5728\u300C\u771F\u60AC\u505C\u300D\u8BBE\u5907\u751F\u6548\uFF1A\u89E6\u5C4F\u6CA1\u6709\u53EF\u9760\u7684 hover \u9000\u51FA\uFF0C\u884C/\u683C/\u6309\u94AE\u7684\n * \u60AC\u505C\u5E95\u8272\u4F1A\u7C98\u6EDE\u5230\u4E0B\u4E00\u6B21\u70B9\u6309\uFF08hover \u95E8\u63A7 = (hover:hover) and (pointer:fine)\uFF09 */\n@media (hover:hover) and (pointer:fine){\n .xy-btn:hover:not(:disabled){border-color:var(--xyd-accent);color:var(--xyd-accent-strong)}\n}\n.xy-btn:active:not(:disabled){transform:scale(.97)}\n.xy-btn:disabled{opacity:.55;cursor:not-allowed}\n.xy-btn:focus-visible,.xy-input:focus-visible,.xy-cell:focus-visible,.xy-seg-btn:focus-visible,.xy-toggle:focus-visible,.xy-swatch:focus-visible,.xy-growth-col:focus-visible,.xy-wishtoggle:focus-visible{outline:2px solid var(--xyd-accent);outline-offset:2px}\n/* \u89E6\u63A7\u57FA\u7EBF\uFF1A\u6D88\u9664\u79FB\u52A8\u7AEF\u53CC\u51FB\u7F29\u653E\u5EF6\u8FDF\u4E0E\u7CFB\u7EDF\u70B9\u6309\u9AD8\u4EAE\uFF08\u4EA4\u4E92\u53CD\u9988\u7EDF\u4E00\u7531 hover/active \u627F\u62C5\uFF09 */\n.xy-btn,.xy-seg-btn,.xy-cell,.xy-swatch,.xy-toggle,.xy-growth-col,.xy-wishtoggle{touch-action:manipulation;-webkit-tap-highlight-color:transparent}\n/* \u884C\u5185\u6309\u94AE\uFF1A\u226526px \u547D\u4E2D\u76EE\u6807\uFF08\u5361\u7247\u5934/\u64CD\u4F5C\u884C\u7684\u7D27\u51D1\u4E3B\u6218\u6309\u94AE\uFF09 */\n.xy-btn-inline{margin-left:auto;padding:3px 10px;font-size:12px;min-height:26px;display:inline-flex;align-items:center}\n/* \u56FE\u6807\u5E7D\u7075\u952E\uFF08\u226526px \u65B9\u5F62\u547D\u4E2D\u76EE\u6807\uFF09\uFF1A\u7F16\u8F91/\u5220\u9664\u8FD9\u7C7B\u9AD8\u9891\u91CD\u590D\u7684\u884C\u5185\u4F4E\u9891\u52A8\u4F5C\u964D\u566A\u2014\u2014\n * \u56FE\u6807\u7EBF\u7A3F\u627F\u8BB8\u53EF\u4E49\u3001\u6587\u5B57\u8BED\u4E49\u8D70 aria-label\uFF1Bhover/focus \u624D\u663E\u5E95\u8272\u3002 */\n.xy-btn-icon{width:26px;height:26px;min-height:26px;padding:0;display:inline-flex;align-items:center;justify-content:center;flex:none}\n.xy-btn-primary{background:var(--xyd-accent);border-color:transparent;color:var(--xyd-on-accent)}\n@media (hover:hover) and (pointer:fine){\n .xy-btn-primary:hover:not(:disabled){filter:brightness(1.06);color:var(--xyd-on-accent)}\n}\n.xy-btn-danger{color:var(--xyd-danger);border-color:var(--xyd-danger-border);background:transparent}\n@media (hover:hover) and (pointer:fine){\n .xy-btn-danger:hover:not(:disabled){background:var(--xyd-danger-soft);color:var(--xyd-danger)}\n}\n.xy-input{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:var(--xyd-r-ctl);padding:5px 8px;font-size:13px;font-family:inherit;transition:border-color .15s ease}\n@media (hover:hover) and (pointer:fine){\n .xy-input:hover:not(:disabled){border-color:var(--dsw-alias-border-l3)}\n}\n.xy-input::placeholder{color:var(--dsw-alias-label-secondary)}\n.xy-input:disabled{opacity:.55;cursor:not-allowed}\n.xy-field-err{color:var(--xyd-danger);font-size:12px;margin-top:4px}\n/* \u6570\u5B57\u5FAE\u8F93\u5165\uFF08\u8BBE\u7F6E\u9875\u6CE8\u5165\u4E0A\u9650\u7B49\uFF09\uFF1A\u6309\u5185\u5BB9\u957F\u5EA6\u5B9A\u5BBD\uFF0C\u4E0D\u968F\u6D4F\u89C8\u5668\u9ED8\u8BA4 size \u62C9\u6210\u5BBD\u6761 */\n.xy-input-num{width:96px}\n\n/* \u5217\u8868\u884C */\n.xy-rowmain{display:flex;flex-direction:column;gap:2px;min-width:0}\n.xy-rowtitle{font-weight:600;color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}\n/* \u5B8C\u6210\u6001\u884C\u9996\u88C5\u9970\u52FE\uFF08aria-hidden\uFF0C\u8BED\u4E49\u7531\u884C\u6587\u6848\u627F\u62C5\uFF09 */\n.xy-done-glyph{color:var(--dsw-alias-state-success-primary,var(--xyd-ok));margin-right:2px}\n/* \u9AD8\u91CD\u8981\u5EA6\u661F\u6807\uFF1A\u7425\u73C0\u8B66\u793A\u8272\uFF08\u4E0D\u590D\u7528\u5B8C\u6210\u52FE\u7684\u7EFF\u8272\uFF0C\u8BED\u4E49\u4E0D\u649E\u8F66\uFF09 */\n.xy-star-hi{color:var(--xyd-warn);margin-right:2px}\n/* \u5B8C\u6210\u6001\u884C\uFF1A\u6807\u9898\u7528\u6B21\u8981\u8272\u964D\u6743\uFF08secondary \u5B9E\u6D4B\u6D45 4.76 / \u6DF1 5.15 \u22654.5:1\uFF09\u2014\u2014\u4E0D\u7528\u6574\u884C\n * opacity\uFF1A0.78 \u6DF7\u5E95\u540E\u6587\u5B57\u6709\u6548\u5BF9\u6BD4\u4EC5 \u22483.1:1\uFF0C\u8DCC\u7834 WCAG 1.4.3 AA\uFF08opacity \u53EA\u7559\u7ED9\n * aria-hidden \u7684\u88C5\u9970\u5143\u7D20\uFF0C\u884C\u5185\u53EF\u8BFB\u6587\u5B57\u4E00\u5F8B\u8D70\u989C\u8272\u964D\u6743\uFF09 */\n.xy-done .xy-rowtitle{color:var(--dsw-alias-label-secondary)}\n.xy-banner-ok{margin-top:10px;padding:10px 12px;border-radius:var(--xyd-r-inner);background:var(--xyd-ok-soft);border:1px solid var(--xyd-ok-border);font-size:13px}\n/* \u5237\u65B0\u5931\u8D25\u4F46\u65E7\u6570\u636E\u4ECD\u5728\u7684\u8BDA\u5B9E\u964D\u7EA7\u6A2A\u5E45\uFF1A\u7425\u73C0\u865A\u7EBF\u9762\u677F\uFF08\u8B66\u793A\u4F46\u4E0D\u6050\u5413\u2014\u2014\u52A8\u4F5C\u5DF2\u6210\u529F\uFF09 */\n.xy-stalerow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;padding:8px 12px;border:1px dashed var(--xyd-warn-border);border-radius:var(--xyd-r-inner);background:var(--xyd-warn-soft)}\n.xy-stalerow .xy-btn-inline{margin-left:0}\n\n/* ===== \u5206\u7EC4\u5361\uFF08\u4EFB\u52A1\u9875\u72B6\u6001\u5206\u6876 / \u4ECA\u65E5\u9875\u5F85\u6253\u5361\u00B7\u5DF2\u5B8C\u6210\u5171\u7528\uFF09=====\n * \u5361\u7247\u5BB9\u5668 + \u72B6\u6001\u70B9\u6807\u9898\u884C + \u5206\u9694\u7EBF\u884C\u5217\u8868\uFF1A\u66FF\u4EE3\u88F8\u5806\u53E0\u7684 section-title+wishtasks\uFF1B\n * \u7EC4\u95F4\u8DDD 12 \u4E0E\u9875\u5934 margin-bottom 12 \u540C\u62CD\uFF0C\u884C\u5185\u8FB9\u8DDD 11/14 \u5BF9\u9F50\u5361\u7247\u4F53\u7CFB\u8282\u594F\u9501\u3002 */\n.xy-group{margin-top:12px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);overflow:hidden}\n.xy-group-head{display:flex;align-items:center;gap:8px;margin:0;padding:9px 14px;font-size:12px;font-weight:600;letter-spacing:.02em;color:var(--dsw-alias-label-secondary);border-bottom:1px solid var(--dsw-alias-border-l1)}\n.xy-group-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--dsw-alias-label-secondary)}\n.xy-group-dot-accent{background:var(--xyd-accent)}\n.xy-group-dot-warn{background:var(--xyd-warn)}\n.xy-group-dot-ok{background:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n.xy-group-count{margin-left:auto;flex:none;font-size:12px;line-height:1.7;padding:0 8px;border-radius:999px;background:var(--dsw-alias-bg-layer-2);color:var(--xyd-label-on-2);font-variant-numeric:tabular-nums}\n.xy-grouplist{list-style:none;display:flex;flex-direction:column;margin:0;padding:0}\n.xy-grouprow{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:11px 14px;border-top:1px solid var(--dsw-alias-border-l1);transition:background-color .15s ease}\n.xy-grouprow:first-child{border-top:none}\n@media (hover:hover) and (pointer:fine){\n .xy-grouprow:hover{background:var(--xyd-hover)}\n}\n/* \u5206\u7EC4\u5361\u7684\u5757\u7EA7\u884C\u53D8\u4F53\uFF08\u4EFB\u52A1\u884C + \u53EF\u9009\u5185\u8054\u8BE6\u60C5\uFF09\uFF1BTaskLine \u57FA\u7C7B\u672C\u8EAB\u5373\u4E24\u680F\u7F51\u683C\uFF08\u89C1\u613F\u671B\u5361\u6BB5\uFF09 */\n.xy-taskrow{display:block}\n.xy-taskrow .xy-detail{margin-bottom:2px}\n\n/* ===== \u9762\u677F\u5361\uFF08\u65E5\u5386/\u6210\u957F\u56FE\u8868/\u8BBE\u7F6E\u5206\u8282\u7B49\u901A\u7528\u5BB9\u5668\uFF09=====\n * \u4E0E\u613F\u671B\u5361\u540C\u4E00\u5361\u7247\u8BED\u6CD5\u4F46\u65E0 hover \u6001\uFF1A\u7EAF\u5BB9\u5668\u3002\u5B50\u5143\u7D20\u95F4\u8DDD\u7531\u5404\u9875\u65E2\u6709 margin \u8D1F\u8D23\u3002 */\n.xy-panel{margin-top:12px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);padding:12px 14px}\n.xy-panel>.xy-skel:first-child{margin-top:0}\n.xy-panel-head{margin:0;font-size:14px;font-weight:600;display:flex;align-items:center;gap:8px;color:var(--dsw-alias-label-primary)}\n\n/* ===== \u4ECA\u65E5\u6982\u89C8\u5361 =====\n * \u6807\u9898\u3001\u5B8C\u6210\u8BA1\u6570\u4E0E\u8FDB\u5EA6\u6761\u540C\u5361\u5448\u73B0\uFF1A\u8FDB\u5EA6\u6761\u4E0D\u518D\u4F5C\u4E3A\u88F8\u6761\u60AC\u5728\u9875\u5934\u4E0B\u65B9\n * \uFF080% \u65F6\u5373\u7528\u6237\u6240\u89C1\u300C\u7A7A\u767D\u6A2A\u6761\u300D\uFF09\uFF1B\u54C1\u724C\u8272\u8F7B\u6655\u67D3\u63D0\u4F9B\u4ECA\u65E5\u9875\u7684\u89C6\u89C9\u951A\u70B9\u3002 */\n.xy-todayhero{margin-top:12px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);padding:13px 16px;display:flex;flex-direction:column;gap:9px;background:linear-gradient(135deg,var(--xyd-accent-soft),transparent 55%),var(--dsw-alias-bg-layer-1)}\n.xy-todayhero-top{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}\n/* \u5B8C\u6210\u8BA1\u6570\u662F\u4ECA\u65E5\u9875\u7684\u89C6\u89C9\u951A\u70B9\uFF08habit \u7C7B App \u5934\u90E8\u60EF\u4F8B\uFF09\uFF1A\u5347\u5927\u53F7 tabular \u6570\u5B57 */\n.xy-todayhero-num{margin-left:auto;font-size:22px;font-weight:700;color:var(--xyd-accent);font-variant-numeric:tabular-nums;line-height:1.2}\n.xy-todayhero-all .xy-todayhero-num{color:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n.xy-todayhero .xy-bar{height:10px;margin-top:0}\n.xy-todayhero .xy-banner-ok{margin-top:0}\n\n/* \u613F\u671B\u5361\uFF08\u9875\u9762\uFF09 */\n.xy-wishcard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:var(--xyd-r-card);padding:12px 14px;margin-top:10px;transition:border-color .15s ease,box-shadow .15s ease}\n@media (hover:hover) and (pointer:fine){\n .xy-wishcard:hover{border-color:var(--dsw-alias-border-l2);box-shadow:var(--xyd-shadow-card)}\n}\n.xy-progress-num{margin-left:auto;flex:none;color:var(--dsw-alias-label-secondary);font-size:12px;font-variant-numeric:tabular-nums}\n/* \u4EFB\u52A1\u533A\u62AB\u9732\u5F00\u5173\uFF08\u9ED8\u8BA4\u6536\u8D77\uFF0C\u5C55\u5F00\u96C6\u5408\u8D70 view-state\uFF09\uFF1A\u6574\u884C\u6309\u94AE\u7EE7\u627F\u865A\u7EBF\u5206\u9694\uFF08\u539F\u5C5E\n * .xy-wishtasks \u7684\u5361\u5185\u5206\u754C\uFF09\uFF0C\u7BAD\u5934\u65CB\u8F6C\u53EA\u52A8 transform\uFF1B\u6309\u94AE\u6587\u672C\u542B\u4EFB\u52A1\u6570\uFF08\u53E3\u8BED\u5316\uFF0C\u65E0\u72B6\u6001\u8BCD\uFF09\u3002 */\n.xy-wishtoggle{margin-top:8px;display:flex;align-items:center;gap:5px;width:100%;padding:8px 0 5px;background:none;border:0;border-top:1px dashed var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;cursor:pointer;text-align:left}\n@media (hover:hover) and (pointer:fine){\n .xy-wishtoggle:hover{color:var(--dsw-alias-label-primary)}\n}\n.xy-wishtoggle svg{flex:none;transition:transform .15s ease}\n.xy-wishtoggle[aria-expanded='true'] svg{transform:rotate(180deg)}\n/* \u5361\u5185\u5B50\u4EFB\u52A1\u5217\u8868\uFF1A\u5206\u9694\u7EBF\u5DF2\u4E0A\u79FB\u5230\u62AB\u9732\u5F00\u5173\uFF0C\u884C\u7559\u767D\u7531\u4EFB\u52A1\u884C\u81EA\u8EAB padding \u627F\u62C5\u3002\n * \u7ED3\u6784\u4E3A [taskline, detail?, taskline, detail?] \u2014\u2014 \u76F8\u90BB\u9009\u62E9\u5668\u7CBE\u786E\u547D\u4E2D\u300C\u65B0\u4EFB\u52A1\u884C\u300D\u8FB9\u754C\u3002 */\n.xy-wishtasks{display:flex;flex-direction:column}\n.xy-wishtasks>.xy-taskline+.xy-taskline,.xy-wishtasks>.xy-detail+.xy-taskline{border-top:1px solid var(--dsw-alias-border-l1)}\n.xy-wishtasks>.xy-taskline{padding:9px 0}\n/* \u5C55\u5F00\u8BE6\u60C5\u662F\u5361\u5185\u6700\u540E\u4E00\u4E2A\u5143\u7D20\u65F6\u6536\u6389\u5E95\u90E8\u7559\u767D\uFF1A\u5361\u7247\u81EA\u8EAB padding \u5DF2\u627F\u62C5\u6536\u5C3E */\n.xy-wishtasks>.xy-detail:last-child{margin-bottom:0}\n/* TaskLine \u57FA\u7C7B = \u4E24\u680F\u7F51\u683C\uFF1A\u540D\u79F0/\u5143\u4FE1\u606F\u5C45\u5DE6\u6536\u7F29\u6362\u884C\uFF0C\u52A8\u4F5C\u7C07\uFF08\u9886\u53D6/\u6253\u5361 + \u8BE6\u60C5\u5F00\u5173\uFF09\u53F3\u7F6E\u5782\u76F4\u5C45\u4E2D\uFF1B\n * \u613F\u671B\u5361\u5B50\u4EFB\u52A1\u4E0E\u4EFB\u52A1\u9875\u5171\u7528\u540C\u4E00\u884C\u8BED\u6CD5\u3002 */\n.xy-taskline{display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:12px;row-gap:2px;align-items:center}\n.xy-taskname{grid-column:1;grid-row:1;font-weight:600;font-size:13px;overflow-wrap:anywhere}\n.xy-taskline>.xy-meta{grid-column:1;grid-row:2;margin-top:0}\n.xy-taskline>div:last-child{grid-column:2;grid-row:1/span 2;justify-self:end}\n/* \u5371\u9669\u56FE\u6807\u952E\u7EDF\u4E00\u9759\u9ED8\u6863\uFF08\u957F\u5217\u8868\u9010\u884C\u91CD\u590D\u7684\u4F4E\u9891\u9AD8\u5371\u52A8\u4F5C\uFF1A\u613F\u671B\u5361\u5934\u5220\u9664 / \u8BB0\u5FC6\u884C\u5220\u9664\uFF09\uFF1A\n * \u57FA\u7840\u900F\u660E\u5EA6 0.78\u2014\u2014\u6DF7\u5E95\u540E\u56FE\u6807\u63CF\u8FB9\u5BF9\u6BD4\u6D45\u8272 3.73 / \u6DF1\u8272 5.06\uFF0C\u6EE1\u8DB3 WCAG 1.4.11\n * \u975E\u6587\u5B57 \u22653:1\uFF08\u539F\u6CE8\u300C\u22654.5:1\u300D\u4EC5\u6DF1\u8272\u6210\u7ACB\uFF0C\u5DF2\u6309\u975E\u6587\u5B57\u53E3\u5F84\u66F4\u6B63\uFF09\uFF0Chover/focus \u6062\u590D\n * \u6EE1\u5F3A\u5EA6\uFF1B\u6587\u5B57\u5371\u9669\u952E\uFF08.xy-btn-danger \u65E0 .xy-btn-icon\uFF09\u4FDD\u6301\u6EE1\u5F3A\u5EA6\u4E0D\u53D7\u6B64\u6863\u3002 */\n.xy-btn-danger.xy-btn-icon{opacity:.78}\n.xy-btn-danger.xy-btn-icon:focus-visible{opacity:1}\n@media (hover:hover) and (pointer:fine){\n .xy-btn-danger.xy-btn-icon:hover:not(:disabled){opacity:1}\n}\n\n/* ===== \u65E5\u5386 ===== */\n/* \u73B0\u4EE3\u65E5\u5386\u8BED\u6CD5\uFF08Apple/Google Calendar \u60EF\u4F8B\uFF09\uFF1A\u65E0\u8FB9\u6846\u8FDE\u7EED\u7F51\u683C\uFF0C\u65E5\u671F\u53F7\u5750\u5728\u5706\u7AE0\u4E0A\uFF0C\n * \u72B6\u6001\u8BED\u4E49\u5168\u90E8\u7531\u5706\u7AE0\u627F\u8F7D\uFF08\u5F85\u6253\u5361=\u4E2D\u6027\u8BA1\u5212\u5E95\u3001\u90E8\u5206\u5B8C\u6210=\u7425\u73C0\u3001\u5168\u90E8\u5B8C\u6210=\u7EFF\uFF09\uFF0C\n * today/picked \u8D70\u5706\u7AE0\u7684\u73AF\u4E0E\u5B9E\u5E95\uFF0C\u4E0D\u518D\u6574\u683C\u5237\u8272/\u6574\u683C\u63CF\u8FB9\u3002\n * \u90BB\u6708\u8865\u4F4D\u65E5 = \u4F4E\u900F\u660E\u5EA6\u6570\u5B57\uFF08\u7EAF\u89C6\u89C9\u5EF6\u7EED\uFF0C\u5207\u6708\u6B8B\u884C\u4E0D\u788E\u7247\u5316\uFF09\u3002 */\n.xy-calcard{padding:0;overflow:hidden}\n/* \u6708\u4EFD\u5BFC\u822A\u6210\u7EC4\u5C45\u4E2D\uFF1B\u300C\u56DE\u5230\u672C\u6708\u300D\u7EDD\u5BF9\u5B9A\u4F4D\u8D34\u53F3\u7F18\uFF0C\u4E0D\u6324\u5360\u4E2D\u8F74\uFF08\u7A84\u5C4F\u6539\u968F\u6D41\u907F\u514D\u76F8\u649E\uFF09 */\n.xy-calnav{position:relative;justify-content:center}\n.xy-calnav-back{position:absolute;right:0}\n@media (max-width:520px){.xy-calnav-back{position:static;margin-left:4px}}\n.xy-calhead{display:grid;grid-template-columns:repeat(7,1fr);padding:11px 0 8px}\n.xy-calhead-cell{text-align:center;font-size:12px;color:var(--dsw-alias-label-secondary)}\n.xy-cal{display:flex;flex-direction:column;border-top:1px solid var(--dsw-alias-border-l1)}\n.xy-week{display:grid;grid-template-columns:repeat(7,1fr)}\n.xy-cell{height:42px;border:none;background:transparent;cursor:pointer;font-size:13px;display:flex;align-items:center;justify-content:center;padding:0;font-family:inherit;color:var(--dsw-alias-label-primary)}\n/* \u5706\u7AE0\uFF1A32px \u5706\u5F62\uFF0C\u72B6\u6001\u5E95\u8272/\u73AF/\u5B9E\u5E95\u90FD\u6302\u8FD9\u91CC */\n.xy-daynum{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;font-variant-numeric:tabular-nums;transition:background-color .15s ease,box-shadow .15s ease,color .15s ease}\n.xy-cell:focus-visible{outline-offset:-3px}\n/* \u90BB\u6708\u8865\u4F4D\u65E5\uFF1A\u5F31\u5316\u6570\u5B57\uFF08\u4E0D\u53EF\u805A\u7126\u4E0D\u53EF\u70B9\uFF09\u3002opacity .45 \u5728\u6D45\u8272\u4E0B\u4EC5 1.8:1\uFF0C\n * \u63D0\u5230 .55 \u4FDD\u6301\u300C\u4F4E\u4E00\u6863\u300D\u7684\u89C6\u89C9\u6B21\u5E8F\u540C\u65F6\u4E0D\u518D\u8FD1\u4E4E\u9690\u5F62 */\n.xy-outside{cursor:default}\n.xy-outside .xy-daynum{color:var(--dsw-alias-label-secondary);opacity:.55}\n/* \u65E0\u5B89\u6392 = \u7559\u767D + \u6B21\u8981\u5B57 */\n.xy-c0{cursor:default}\n.xy-c0 .xy-daynum{color:var(--dsw-alias-label-secondary)}\n/* \u5F85\u6253\u5361 = \u4E2D\u6027\u8BA1\u5212\u5E95\uFF08\u9AD8\u9891\u72B6\u6001\u4E0D\u4F5C\u8B66\u793A\u8272\uFF09\uFF1Binset \u63CF\u8FB9\u8BA9 c1 \u5706\u7AE0\u4E0E\u56FE\u4F8B\u70B9\u540C\u6784\n * \uFF08c1 \u5E95\u8272\u5BF9\u5361\u5E95\u4EC5 \u22481.1:1\uFF0C\u56FE\u4F8B\u70B9\u6709\u63CF\u8FB9\u800C\u5706\u7AE0\u6CA1\u6709\u2014\u2014\u4E24\u4FA7\u89C2\u611F\u4E0D\u4E00\u81F4\uFF09 */\n.xy-c1 .xy-daynum{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2)}\n/* \u90E8\u5206\u5B8C\u6210 / \u5168\u90E8\u5B8C\u6210 = \u67D4\u548C\u8BED\u4E49\u5E95\uFF0C\u5B57\u8272\u6309\u4E3B\u9898\u914D\u5BF9\u4FDD\u8BC1 \u22654.5:1 */\n.xy-c2 .xy-daynum{background:var(--xyd-c2-soft);color:var(--xyd-on-c2)}\n.xy-c3 .xy-daynum{background:var(--xyd-c3-soft);color:var(--xyd-on-c3)}\nbody[data-ds-dark-theme] .xy-c2 .xy-daynum{color:var(--xyd-on-c2)}\nbody[data-ds-dark-theme] .xy-c3 .xy-daynum{color:var(--xyd-on-c3)}\n/* hover \u6655\u5E95\u6392\u9664\u5DF2\u9009\u4E2D\u683C\u4E0E\u8BED\u4E49\u72B6\u6001\u683C\uFF1Aspecificity \u9AD8\u4E8E\u5355\u7C7B\u9009\u62E9\u5668\uFF0C\u4E0D\u6392\u9664\u7684\u8BDD\n * \u60AC\u505C\u5728\u5DF2\u9009\u65E5\u4E0A\u4F1A\u7528\u6655\u5E95\u76D6\u6389\u9009\u4E2D\u5B9E\u5E95\uFF08\u89C6\u89C9\u4E0A\u300C\u53D6\u6D88\u9009\u4E2D\u300D\uFF09\uFF1Bc2/c3 \u540C\u7406\u2014\u2014\n * \u72B6\u6001\u5E95\u8272\u6B63\u662F\u7528\u6237\u60AC\u505C\u6838\u5BF9\u7684\u90A3\u4E2A\u4FE1\u606F\uFF0C\u4E0D\u80FD\u5728\u60AC\u505C\u77AC\u95F4\u88AB\u6655\u5E95\u62B9\u6389 */\n@media (hover:hover) and (pointer:fine){\n .xy-cell:not(.xy-outside):not(.xy-picked):not(.xy-c2):not(.xy-c3):hover .xy-daynum{background:var(--xyd-accent-soft)}\n}\n/* \u4ECA\u65E5 = accent \u73AF\u5305\u5706\u7AE0\uFF1A\u4E0D\u8986\u76D6\u72B6\u6001\u5E95\u8272\uFF08\u300C\u4ECA\u5929\u8BE5\u6253\u5361\u300D\u7684\u63D0\u793A\u4E0D\u80FD\u88AB\u5403\u6389\uFF09 */\n.xy-today .xy-daynum{box-shadow:0 0 0 2px var(--xyd-accent)}\n/* \u9009\u4E2D = accent \u5B9E\u5E95\u5706\u7AE0\uFF08\u5373\u65F6\u53CD\u9988\u77ED\u6682\u6001\uFF0C\u8986\u76D6\u72B6\u6001\u8272\u53EF\u63A5\u53D7\uFF0C\u8BE6\u60C5\u9762\u677F\u7D27\u968F\u5176\u4E0B\uFF09 */\n.xy-picked .xy-daynum{background:var(--xyd-accent);color:var(--xyd-on-accent)}\n.xy-legend{display:flex;gap:14px;margin-top:10px;font-size:12px;color:var(--dsw-alias-label-secondary);align-items:center;flex-wrap:wrap}\n.xy-dot{width:10px;height:10px;border-radius:3px;display:inline-block;margin-right:4px;vertical-align:-1px}\n.xy-dot.xy-dot-checked{background:var(--xyd-accent)}\n/* \u56FE\u4F8B\u7F3A\u53E3\u70B9\uFF1A\u4E0E\u67F1\u4F53\u540C\u4E00\u659C\u7EB9\u8BED\u6CD5\uFF08\u5355\u4E00\u4E8B\u5B9E\u6E90\uFF0C\u4E24\u5904\u6C38\u4E0D\u6F02\u79FB\uFF09 */\n.xy-dot.xy-dot-gap{border:1px solid var(--dsw-alias-border-l2);background:repeating-linear-gradient(135deg,var(--xyd-hatch) 0 2px,transparent 2px 4px)}\n/* \u56FE\u4F8B\u4E0E\u5706\u7AE0\u540C\u6784\uFF1A\u65E0\u5B89\u6392=\u63CF\u8FB9\u7A7A\u5FC3\u3001\u5F85\u6253\u5361=\u4E2D\u6027\u5E95\u3001\u90E8\u5206/\u5168\u90E8\u5B8C\u6210=\u8BED\u4E49\u67D4\u548C\u5E95 */\n.xy-dot.xy-c0{background:transparent;border:1px solid var(--dsw-alias-border-l2)}\n.xy-dot.xy-c1{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2)}\n.xy-dot.xy-c2{background:var(--xyd-c2-soft)}\n.xy-dot.xy-c3{background:var(--xyd-c3-soft-dot)}\n/* \u5361\u5373\u8868\u540E\uFF1A\u56FE\u4F8B\u8D34\u5361\u5E95\u5E76\u4EE5 hairline \u4E0E\u7F51\u683C\u5206\u754C */\n.xy-calcard .xy-legend{margin-top:0;padding:10px 14px 12px;border-top:1px solid var(--dsw-alias-border-l1)}\n/* \u8BE6\u60C5\u9762\u677F\u5E38\u9A7B\u5E76\u5347\u7EA7\u4E3A\u9644\u5361\uFF1A\u56FA\u5B9A\u6700\u5C0F\u9AD8\u5EA6 + \u8D85\u957F\u5185\u90E8\u6EDA\u52A8\uFF0C\u70B9\u51FB\u4E0D\u540C\u65E5\u671F\u4E0D\u518D\u5F15\u8D77\u6574\u9875\u9AD8\u5EA6\u6296\u52A8 */\n.xy-daypanel{margin-top:10px;min-height:112px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);padding:11px 14px}\n.xy-daypanel .xy-daydetail{max-height:300px;overflow-y:auto;scrollbar-gutter:stable}\n/* \u8BE6\u60C5\u4EFB\u52A1\u884C\u590D\u7528\u5206\u7EC4\u5361\u884C\u8BED\u6CD5\uFF1A\u8D34\u9762\u677F\u5185\u8FB9\u8DDD\uFF0C\u4E0D\u7559\u53CC\u91CD\u5927\u8FB9\u8DDD */\n.xy-daypanel .xy-grouprow{padding:9px 0}\n.xy-daypanel .xy-section-title{margin-top:2px}\n.xy-dayhint{padding-top:0}\n/* \u62FE\u53D6\u52A0\u8F7D\u884C\uFF1A\u70B9\u51FB\u65E5\u671F\u53D6\u8BE6\u60C5\u671F\u95F4\u7684\u7EC6\u6761\u9AA8\u67B6\uFF08\u5360\u4F4D\u9AD8\u5EA6\u6052\u5B9A\uFF0C\u9762\u677F\u4E0D\u8DF3\uFF09 */\n.xy-pickline{height:12px;width:46%;margin-top:2px}\n\n/* ===== \u7EDF\u8BA1\u5361 & \u6210\u957F ===== */\n.xy-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin-top:8px}\n.xy-statcard{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);padding:14px;text-align:center}\n/* \u5C42\u7EA7\uFF1A\u666E\u901A\u7EDF\u8BA1\u6570\u5B57\u7528\u4E3B\u6587\u5B57\u8272\uFF08\u9875\u9762\u66F4\u5B89\u9759\uFF09\uFF0C\u4EC5\u300C\u5F53\u524D\u8FDE\u7EED\u300D\u8FD9\u5F20\u5361\u4EE5\u54C1\u724C\u8272+\u6D45\u6655\u5E95\u7A81\u51FA\n * \uFF08habit \u7C7B App \u628A streak \u4F5C\u4E3A\u82F1\u96C4\u6307\u6807\u7F6E\u4E8E\u70ED\u529B\u56FE\u65C1\u7684\u60EF\u4F8B\uFF09 */\n.xy-statnum{font-size:24px;font-weight:700;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums}\n.xy-statcard-hot{border-color:var(--xyd-accent-border);background:linear-gradient(160deg,var(--xyd-accent-soft),transparent 62%),var(--dsw-alias-bg-layer-1)}\n.xy-statcard-hot .xy-statnum{color:var(--xyd-accent)}\n/* \u7F3A\u7701\u503C\uFF08\u6682\u65E0/N/A\uFF09\uFF1A\u6B21\u8981\u8272\u5C0F\u4E00\u53F7\uFF0C\u7F3A\u5931\u4FE1\u606F\u4E0D\u5F97\u6BD4\u771F\u5B9E\u6570\u636E\u66F4\u54CD */\n.xy-statcard-muted .xy-statnum{color:var(--dsw-alias-label-secondary);font-size:18px}\n/* \u7A84\u9762\u677F\uFF08\u4F1A\u8BDD\u89C6\u56FE\u9875\u968F\u58F3\u6536\u7F29\uFF09\u4E0B 30 \u6839\u67F1\u88AB flex \u6324\u538B\u5230 ~10px \u5BBD\uFF0C\u89E6\u5C4F\u96BE\u4EE5\u547D\u4E2D\uFF1A\n * \u5BB9\u5668\u6A2A\u5411\u6EDA\u52A8 + \u6700\u5C0F\u5BBD\u515C\u5E95\uFF08\u2264520px \u4E0E\u65E5\u5386\u65AD\u70B9\u540C\u53E3\u5F84\uFF09\u628A\u67F1\u5BBD\u62AC\u5230 ~13px\u2014\u2014\n * \u662F\u547D\u4E2D\u4F53\u9A8C\u7684\u6539\u5584\u4F46\u672A\u8FBE WCAG 2.5.8 \u7684 24px\uFF08\u8FBE\u6807\u9700 min-width ~810px\uFF0C\u6EDA\u52A8\u6210\u672C\n * \u8FDC\u8D85\u8BEF\u89E6\u4EE3\u4EF7\uFF0C\u56FE\u8868 tooltip \u5C5E\u4F4E\u98CE\u9669\u4FE1\u606F\u67E5\u8BE2\uFF0C\u6709\u610F\u53D6\u820D\uFF09\uFF1B\u5BBD\u9762\u677F\uFF08\u72EC\u7ACB\n * /xingyuan/growth \u9875\uFF09\u5185\u5BB9\u4E0D\u8D85\u5BBD\u3001\u6EDA\u52A8\u5BB9\u5668\u65E0\u611F\u77E5 */\n.xy-growth-scroll{overflow-x:auto}\n.xy-growth{display:flex;gap:3px;align-items:stretch;height:120px;margin-top:10px}\n.xy-growth-col{flex:1;display:flex;flex-direction:column;height:100%;min-width:0;border:none;background:transparent;padding:0;cursor:default;border-radius:3px 3px 0 0}\n.xy-growth-stack{flex:1;display:flex;flex-direction:column;justify-content:flex-end;width:100%}\n.xy-growth-bar{background:var(--xyd-accent);border-radius:2px 2px 0 0;width:100%}\n.xy-growth-col.xy-full .xy-growth-bar{background:var(--dsw-alias-state-success-primary,var(--xyd-ok))}\n/* \u672A\u5B8C\u6210\u7F3A\u53E3\uFF1A\u659C\u7EB9\u5197\u4F59\u7F16\u7801\uFF08\u8DDF\u968F\u4E3B\u9898\u6587\u5B57\u8272\u6DF7\u5408\uFF09\u2014\u2014layer-2 \u5B9E\u8272\u5728\u6DF1\u8272\u58F3\u4E0E\u9762\u677F\u5E95\n * \u51E0\u4E4E\u540C\u4EAE\u5EA6\u800C\u9690\u5F62\uFF0C\u659C\u7EB9\u5728\u4E24\u79CD\u4E3B\u9898\u4E0B\u90FD\u6709\u7A33\u5B9A\u7684\u7EB9\u7406\u53EF\u89C1\u5EA6\uFF0C\u4E14\u4E0E\u5B9E\u5FC3\u5B8C\u6210\u67F1\u5F62\u6210\n * \u300C\u5F62\u72B6 \u00D7 \u989C\u8272\u300D\u53CC\u901A\u9053\u533A\u5206\uFF0C\u4E0D\u4F9D\u8D56\u8272\u89C9\u5355\u901A\u9053 */\n.xy-growth-missed{width:100%;border-radius:2px 2px 0 0;background:repeating-linear-gradient(135deg,var(--xyd-hatch) 0 2px,transparent 2px 5px),var(--xyd-hatch-faint)}\nbutton.xy-growth-col{cursor:pointer}\nbutton.xy-growth-col.xy-hover{box-shadow:inset 0 0 0 2px var(--xyd-accent-ring)}\n@media (hover:hover) and (pointer:fine){\n button.xy-growth-col:hover{box-shadow:inset 0 0 0 2px var(--xyd-accent-ring)}\n}\n@media (max-width:520px){\n .xy-growth-scroll .xy-growth,.xy-growth-scroll .xy-growth-axis{min-width:480px}\n}\n/* \u57FA\u7EBF\u8D34\u67F1\u5E95\uFF08\u4E0E\u804A\u5929\u56FE\u8868\u5361\u7684 SVG \u57FA\u7EBF\u540C\u4E00\u8BED\u6CD5\uFF09\uFF0C\u523B\u5EA6\u5C42\u4E0B\u79FB\u8BA9\u51FA\u7EBF\u7684\u4F4D\u7F6E */\n.xy-growth-axis{position:relative;height:20px;margin-top:0;border-top:1px solid var(--dsw-alias-border-l2)}\n.xy-growth-tick{position:absolute;top:4px;font-size:12px;line-height:16px;color:var(--xyd-label-on-2);white-space:nowrap;font-variant-numeric:tabular-nums}\n/* \u6210\u957F\u9875\u60AC\u6D6E\u660E\u7EC6 */\n.xy-tip{position:relative;margin-top:0;min-height:20px;font-size:12px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-inner);padding:3px 10px;display:inline-block;font-variant-numeric:tabular-nums}\n.xy-tip:empty{visibility:hidden}\n/* \u56FE\u8868\u52A0\u8F7D\u5360\u4F4D\uFF1A\u4E0E\u6210\u54C1\u56FE\u7B49\u9AD8\uFF0C\u6570\u636E\u5230\u8FBE\u4E0D\u5F15\u8D77\u4E0B\u65B9\u5185\u5BB9\u4F4D\u79FB */\n.xy-chartload{height:150px;margin-top:8px}\n\n/* ===== \u6210\u957F\u9875\uFF1A\u7B49\u7EA7\u82F1\u96C4\u5361 + \u7B49\u7EA7\u8BF4\u660E ===== */\n/* \u6E10\u53D8\u4E24\u7AEF\u5747\u4E3A\u5B9E\u8272\uFF08\u6DF1\u6863\u2192\u57FA\u6863\uFF0Cgrowth.ts \u5185\u8054 darkenHex \u9884\u6DF7\uFF09\uFF0C\u767D\u5B57\u5BF9\u5E95\u8272 \u22654.5:1\n * \u5728\u6D45\u8272\u58F3\u4E0B\u540C\u6837\u6210\u7ACB\u2014\u2014\u534A\u900F\u660E\u6E10\u53D8\u6DF7\u5165\u9875\u9762\u767D\u5E95\u540E\u53F3\u7AEF\u4F1A\u8DCC\u7834 3:1\uFF0C\u5DF2\u5F03\u7528\u3002 */\n.xy-hero{display:flex;gap:14px;align-items:center;border-radius:var(--xyd-r-card);padding:18px;margin-top:12px;border:1px solid var(--xyd-hero-border);box-shadow:var(--xyd-shadow-hero)}\n.xy-herobadge{width:54px;height:54px;border-radius:12px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800;font-size:16px;flex:none;text-shadow:var(--xyd-herobadge-glyph-shadow)}\n.xy-heromain{flex:1;min-width:0}\n.xy-onhero{color:var(--xyd-on-hero)!important}\n.xy-herotitle{font-size:19px;font-weight:700;margin:3px 0 8px;color:#fff}\n.xy-bar-onhero{background:var(--xyd-bar-on-hero)}\n.xy-bar-fill-solid{background:#fff}\n.xy-heroreward{margin-top:8px}\n.xy-levels{display:flex;flex-direction:column;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);padding:4px 14px}\n/* \u7B49\u7EA7\u884C\u7684\u300C\u672A\u8FBE\u6210\u300D\u964D\u6743\u8D70\u6587\u5B57\u8272\u800C\u975E\u6574\u884C opacity\uFF080.68 \u6DF7\u5E95\u540E label-on-2/secondary\n * \u5747\u8DCC\u7834 AA\uFF0C\u6700\u4F4E \u22482.6:1\uFF09\uFF1A\u540D\u79F0/\u5956\u52B1\u7528 secondary\uFF08\u22654.5:1\uFF09\uFF0C\u5FBD\u7AE0\u672C\u5C31\u662F\u4E2D\u6027\u5E95 +\n * label-on-2\uFF08\u6821\u51C6 5.0:1\uFF09\uFF1B\u547D\u4E2D\u884C\u6062\u590D\u4E3B\u6587\u5B57\u8272 + \u5F69\u8272\u5FBD\u7AE0\uFF0C\u5C42\u7EA7\u611F\u4E0D\u9760\u900F\u660E\u5EA6 */\n.xy-levelrow{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--dsw-alias-border-l1);font-size:13px}\n.xy-levelrow:last-child{border-bottom:none}\n.xy-levelrow .xy-lvname{color:var(--dsw-alias-label-secondary)}\n.xy-levelhit .xy-lvname{color:var(--dsw-alias-label-primary)}\n.xy-lvnum{width:42px;height:24px;border-radius:8px;background:var(--dsw-alias-bg-layer-2);color:var(--xyd-label-on-2);display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex:none}\n.xy-lvname{font-weight:600;width:64px;color:var(--dsw-alias-label-primary)}\n.xy-lvreward{margin-left:auto;text-align:right}\n\n/* ===== \u8BB0\u5FC6\u9875 ===== */\n/* \u6DFB\u52A0/\u7F16\u8F91\u8BB0\u5FC6\u8868\u5355\uFF1A\u865A\u7EBF\u9762\u677F\u5361\uFF08\u4E0E\u5FEB\u901F\u65B0\u5EFA\u540C\u4E00\u300C\u53EF\u4E66\u5199\u300D\u8BED\u6CD5\uFF09 */\n.xy-compose{margin-top:12px;border:1px dashed var(--dsw-alias-border-l2);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);padding:12px 14px;display:flex;gap:8px;flex-wrap:wrap}\n.xy-compose .xy-input-grow{flex:1 1 170px;width:auto;min-width:140px}\n.xy-compose select.xy-input{width:auto}\n.xy-editing{display:flex;align-items:center;gap:10px;margin-top:12px;padding:7px 10px;border:1px dashed var(--dsw-alias-border-l2);border-radius:var(--xyd-r-inner)}\n.xy-memactions{display:flex;gap:6px;flex:none}\n.xy-membar{display:flex;align-items:center;gap:10px;margin-top:14px;flex-wrap:wrap}\n.xy-membar .xy-input-search{width:min(250px,100%)}\n.xy-memcap{margin-top:6px}\n/* \u8D85\u957F\u8BB0\u5FC6\u503C 3 \u884C\u622A\u65AD\uFF08\u22641000 \u5B57\u7B26\u8BB0\u5F55\u4E0D\u518D\u6491\u51FA\u6570\u5C4F\u9AD8\u884C\uFF1B\u5B8C\u6574\u503C\u5728\u5220\u9664\u786E\u8BA4\u5F39\u7A97\u53EF\u89C1\uFF09 */\n.xy-memval{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}\n.xy-saved{color:var(--dsw-alias-state-success-primary,var(--xyd-ok));font-size:13px}\n.xy-memfoot{display:flex;align-items:center;gap:12px;margin-top:14px}\n\n/* ===== \u8BBE\u7F6E\u9875 ===== */\n.xy-settings{display:flex;flex-direction:column;gap:16px;max-width:560px;color:var(--dsw-alias-label-primary);font-size:14px}\n/* \u8BBE\u7F6E\u4E09\u4E2A\u5206\u8282\u5404\u81EA\u6210\u9762\u677F\u5361\uFF1B\u95F4\u8DDD\u4EA4\u7ED9 xy-settings \u7684 gap\uFF0C\u5361\u5185\u5B50\u5143\u7D20\u7EDF\u4E00 10px \u7EB5\u5411\u8282\u594F */\n.xy-settings .xy-panel{margin-top:0}\n.xy-settings .xy-panel>*+*{margin-top:10px}\n.xy-field{display:flex;flex-direction:column;gap:6px}\n.xy-field-head{display:flex;align-items:center;gap:8px;font-weight:600}\n.xy-input-wide{width:100%;max-width:360px;box-sizing:border-box}\n.xy-seg{display:flex;gap:6px;flex-wrap:wrap}\n.xy-seg-btn{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:999px;padding:5px 14px;font-size:13px;cursor:pointer;transition:border-color .15s ease,background-color .15s ease,color .15s ease}\n@media (hover:hover) and (pointer:fine){\n .xy-seg-btn:hover{border-color:var(--xyd-accent)}\n}\n/* \u9009\u4E2D\u6001\u53CC\u9009\u62E9\u5668\uFF1A\u7C7B\u540D\u4E0E aria-pressed \u5C5E\u6027\u7B49\u4EF7\uFF08\u7EC4\u4EF6\u4FA7\u7528\u5C5E\u6027\u8868\u8FBE\u72B6\u6001\u8BED\u4E49\uFF09 */\n.xy-seg-btn.xy-on,.xy-seg-btn[aria-pressed='true']{background:var(--xyd-accent);border-color:transparent;color:var(--xyd-on-accent)}\n.xy-save-row{display:flex;align-items:center;gap:10px;margin-top:2px}\n.xy-toggle{width:38px;height:22px;appearance:none;border-radius:999px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);position:relative;cursor:pointer;transition:background .15s}\n.xy-toggle:checked{background:var(--xyd-accent);border-color:transparent}\n.xy-toggle::after{content:'';position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--dsw-alias-label-primary);transition:transform .15s}\n.xy-toggle:checked::after{transform:translateX(16px);background:var(--xyd-on-accent)}\n.xy-hint{color:var(--dsw-alias-label-secondary);font-size:12px;margin:0}\n\n/* ===== \u8BE6\u60C5\u805A\u5408\u89C6\u56FE ===== */\n/* \u6BB5\u95F4 10px \u547C\u5438\uFF1B\u6BCF\u6BB5\u5185\u90E8\u300C\u6807\u7B7E \u2192 \u5185\u5BB9\u300D\u56FA\u5B9A 5px \u7EB5\u5411\u8282\u594F\uFF08label \u4E0D\u518D\u4E0E\u5185\u5BB9\u6587\u5B57\u6324\u884C\uFF09\u3002\n * \u5E95\u90E8\u7559 8px\uFF1A\u64CD\u4F5C\u6309\u94AE\u4E0E\u4E0B\u4E00\u6761\u4EFB\u52A1\u7684\u5206\u5272\u7EBF\u4E0D\u5F97\u8D34\u6B7B\uFF08\u613F\u671B\u5361\u91CC\u5206\u5272\u7EBF\u76F4\u63A5\u538B\u5728\u8BE6\u60C5\u4E0B\u7F18\uFF09\uFF0C\n * \u4EFB\u52A1\u9875\u7531 xy-taskrow \u8986\u76D6\u4E3A 2px\uFF08\u5206\u7EC4\u5361\u884C\u81EA\u5E26 11px \u5185\u8FB9\u8DDD\uFF0C\u603B\u91CF\u5DF2\u591F\uFF09\u3002 */\n.xy-detail{margin-top:8px;margin-bottom:8px;border-top:1px dashed var(--dsw-alias-border-l1);padding-top:10px;display:flex;flex-direction:column;gap:10px}\n.xy-detail>div{display:flex;flex-direction:column;gap:5px;align-items:flex-start;min-width:0}\n.xy-detail>div>.xy-meta{margin-top:0}\n.xy-detail-grid{display:grid;grid-template-columns:repeat(7,max-content);gap:4px;padding:2px 0}\n/* \u6253\u5361\u683C\uFF1A22px + 11px \u6570\u5B57\uFF08\u53EF\u8BFB\u6027\u4E0B\u9650\uFF09\uFF1Bradius 6 \u4E3A\u5FBD\u7AE0\u7EA7\u5FAE\u5143\u7D20\u4F8B\u5916\u6863\u3002\n * \u7F51\u683C\u6309\u5468\u5BF9\u9F50\uFF08\u5468\u4E00\u59CB\uFF0C\u4E0E\u65E5\u5386\u9875\u8868\u5934\u540C\u6784\uFF09\uFF1A\u8FDE\u7EED\u6027\u4E00\u773C\u53EF\u8BFB\uFF08GitHub/Streaks \u60EF\u4F8B\uFF09\uFF0C\n * \u9996\u884C\u524D\u7F6E\u7A7A\u4F4D\u7531 .xy-dcell-blank \u5360\u4F4D\u3002 */\n.xy-dcell{width:22px;height:22px;border-radius:6px;font-size:11px;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;padding:0;border:none;cursor:default;font-variant-numeric:tabular-nums}\n.xy-dcell-blank{visibility:hidden}\n/* \u4ECA\u65E5\u683C = accent \u73AF\u5305\u5E95\u8272\uFF1A\u4E0E\u65E5\u5386\u9875\u5706\u7AE0\u7684 today \u73AF\u540C\u4E00\u8BED\u6CD5 */\n.xy-dcell.xy-dcell-today{box-shadow:0 0 0 2px var(--xyd-accent)}\n.xy-dcell-checked{background:var(--xyd-dcell-checked);color:var(--xyd-on-dcell)}\nbody[data-ds-dark-theme] .xy-dcell-checked{color:var(--xyd-on-dcell)}\n.xy-dcell-missed{background:transparent;border:1px dashed var(--dsw-alias-border-l3);color:var(--dsw-alias-label-secondary)}\n.xy-dcell-future{background:var(--dsw-alias-bg-layer-2);color:var(--xyd-label-on-2);border:1px solid var(--dsw-alias-border-l1)}\n/* \u56FE\u4F8B\u590D\u7528 xy-dot \u65F6\u501F\u683C\u5B50\u7684\u8BED\u4E49\u5E95\u8272\uFF08\u540C\u8272\u7CFB\u5C0F\u5C3A\u5BF8\uFF09 */\n.xy-dot.xy-dcell-missed{background:transparent;border:1px dashed var(--dsw-alias-border-l3)}\n.xy-dot.xy-dcell-future{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1)}\n.xy-dot.xy-dcell-checked{background:var(--xyd-dcell-checked-dot)}\n.xy-detail-next{font-size:12px;color:var(--dsw-alias-label-secondary)}\n/* \u64CD\u4F5C\u884C\u4E0E\u5168\u7AD9\u6309\u94AE\u7EC4\u540C\u62CD\uFF08gap 8\uFF09\uFF1A\u5220\u9664\u5728\u540C\u4E00\u884C\u6D41\u5185\u9760 danger \u63CF\u8FB9\u533A\u5206\uFF0C\n * \u786E\u8BA4\u5F39\u7A97\u515C\u5E95\u9632\u8BEF\u89E6\u2014\u2014\u4E0D\u518D margin-left:auto \u6F02\u5230\u5361\u7F18\uFF08\u7A84\u9762\u677F\u91CC\u662F\u4E00\u6BB5\u7A81\u5140\u7A7A\u767D\uFF0C\n * \u613F\u671B\u5361\u91CC\u8FD8\u4F1A\u4E0E\u5361\u5934\u7684\u613F\u671B\u7EA7\u5220\u9664\u540C\u4FA7\u5BF9\u9F50\u9020\u6210\u8BED\u4E49\u6DF7\u6DC6\uFF09 */\n.xy-detail-ops{display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n\n/* ===== \u5206\u7C7B\u7BA1\u7406 ===== */\n.xy-catpanel{margin-top:10px;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--xyd-r-card);background:var(--dsw-alias-bg-layer-1);padding:12px 14px}\n.xy-catrow{display:flex;align-items:center;gap:10px;padding:7px 0;border-bottom:1px solid var(--dsw-alias-border-l1)}\n.xy-catrow:last-child{border-bottom:none}\n.xy-catcount{margin-left:auto}\n.xy-catops{display:flex;gap:6px}\n.xy-swatchrow{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;align-items:center}\n/* \u8272\u677F\u683C\uFF1A24px \u547D\u4E2D\u76EE\u6807 + hover \u63CF\u8FB9 + \u4E3B\u9898\u4EE4\u724C\u63CF\u8FB9\uFF08\u6DF1\u8272\u4E0B\u4E0D\u518D\u9690\u8EAB\uFF09 */\n.xy-swatch{width:24px;height:24px;border-radius:8px;border:1px solid var(--dsw-alias-border-l2);cursor:pointer;padding:0;position:relative;transition:box-shadow .15s ease}\n.xy-swatch:disabled{opacity:.55;cursor:not-allowed}\n@media (hover:hover) and (pointer:fine){\n .xy-swatch:hover:not(:disabled){box-shadow:inset 0 0 0 2px var(--xyd-accent-ring-soft)}\n}\n/* \u9009\u4E2D\u6001\u53CC\u73AF\uFF08\u5185\u767D\u9699 + \u5916\u5F3A\u8C03\u5708\uFF09\uFF1A\u4EFB\u4F55\u8272\u76F8\u4E0B\u90FD\u6E05\u6670\u53EF\u8FA8\uFF0C\u4E0D\u4F9D\u8D56\u5BF9\u52FE\u672C\u8EAB\u7684\u5BF9\u51B2 */\n.xy-swatch.xy-picked{box-shadow:inset 0 0 0 2px var(--xyd-swatch-ring),0 0 0 2px var(--xyd-accent)}\n.xy-swatch.xy-picked::after{content:'\u2713';position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff;font-size:12px;font-weight:700;text-shadow:var(--xyd-swatch-glyph-shadow)}\n.xy-catloading{padding:6px 0}\n/* \u884C\u5185\u6539\u540D\u7F16\u8F91\u5668\uFF1A\u8F93\u5165\u5728\u7A84\u9762\u677F\u6536\u7F29\uFF08\u65E0 min-width:0 \u65F6 input \u56FA\u6709\u5BBD\u5EA6\u4F1A\u628A\n * \u4FDD\u5B58/\u53D6\u6D88\u952E\u6324\u51FA 320px \u9762\u677F\u88AB overflow-x:clip \u65E0\u58F0\u88C1\u6389\uFF09 */\n.xy-rename{display:flex;gap:6px;align-items:center;margin-top:8px;flex-wrap:wrap}\n.xy-rename .xy-input{flex:1 1 120px;min-width:0;width:auto}\n\n/* ===== \u5FEB\u901F\u65B0\u5EFA ===== */\n.xy-quick{margin-top:10px;border:1px dashed var(--dsw-alias-border-l2);border-radius:var(--xyd-r-card);padding:12px 14px;display:flex;flex-direction:column;gap:10px;background:var(--dsw-alias-bg-layer-1)}\n.xy-quick-row{display:flex;gap:10px;flex-wrap:wrap}\n.xy-quick-field{display:flex;flex-direction:column;gap:4px;min-width:150px;flex:1}\n.xy-quick-label{font-size:12px;color:var(--dsw-alias-label-secondary);font-weight:600}\n.xy-quick-actions{display:flex;gap:10px;align-items:center}\n\n/* ===== \u6EDA\u52A8\u6761\u69FD\u4F4D\u6052\u5B9A\uFF08\u5BBD\u5EA6\u9632\u6296\u7B2C\u4E8C\u9053\u4FDD\u9669\uFF09=====\n * \u58F3\u7684\u4F1A\u8BDD\u6EDA\u52A8\u5BB9\u5668\uFF08CSS Modules\u300C\u54C8\u5E0C\u524D\u7F00_\u8BED\u4E49\u540E\u7F00\u300D\u7A33\u5B9A\u547D\u540D + data-conversation-scroll\n * \u6807\u8BB0\uFF09\u9ED8\u8BA4 gutter stable\uFF0C\u4F46\u8F93\u5165\u6846\u6D6E\u5C42\u6A21\u5F0F\u4F1A\u4E3B\u52A8\u653E\u5F00\u4E3A auto\u2014\u2014\u7ECF\u5178\u6EDA\u52A8\u6761\u6309\u9700\u51FA\u73B0\u4F1A\u62BD\u8D70\n * ~15px \u5BBD\u5EA6\uFF08\u70B9\u300C\u65B0\u5EFA\u300D\u5C55\u5F00\u8868\u5355\u3001\u5C55\u5F00\u8BE6\u60C5\u5373\u89E6\u53D1\uFF09\uFF0C\u5C45\u4E2D\u9875\u9762\u968F\u4E4B\u6574\u5E27\u5DE6\u53F3\u5F39\u8DF3\u3002\n * \u8FD9\u91CC\u5BF9\u6EDA\u52A8\u5BB9\u5668\u672C\u8EAB\u65E0\u6761\u4EF6\u5F3A\u5236\u5E38\u9A7B\u69FD\u4F4D\uFF1B\u4E0E useStableScrollbar \u7684 useLayoutEffect\n * \u8FD0\u884C\u65F6\u9489\u4F4F\u4E92\u4E3A\u5197\u4F59\uFF08\u6837\u5F0F\u5148\u4E8E\u9996\u5E27\uFF0C\u8FD0\u884C\u65F6\u515C\u5E95\u58F3\u4FA7\u8282\u70B9\u66FF\u6362\uFF09\u3002 */\n[class*='_scrollBody'][data-conversation-scroll]{scrollbar-gutter:stable!important}\n\n/* \u5F31\u5316\u52A8\u753B\u504F\u597D\uFF1A\u5C0A\u91CD prefers-reduced-motion\uFF08\u542B\u5F00\u5173\u6ED1\u5757\u3001hover \u8FC7\u6E21\u3001\u63D2\u753B\u65E0\u52A8\u753B\u3001toast \u8FDB\u51FA\u573A\u3001\u786E\u8BA4\u5F39\u7A97\uFF09 */\n@media (prefers-reduced-motion: reduce){\n .xy-skel,.xy-toast,.xy-modal-backdrop,.xy-modal{animation:none}\n .xy-toast-out,.xy-modal-backdrop.xy-modal-out,.xy-modal-out .xy-modal{transition:none}\n .xy-bar-fill,.xy-btn,.xy-toggle,.xy-toggle::after,.xy-wishcard,.xy-cell,.xy-daynum,.xy-seg-btn,.xy-input,.xy-swatch,.xy-grouprow,.xy-wishtoggle svg{transition:none}\n}\n";
@@ -38,6 +38,8 @@ export declare function disposeConfirms(): void;
38
38
  export declare function IconTrash(): ReactElement;
39
39
  /** 铅笔线性图标(编辑动作)。 */
40
40
  export declare function IconEdit(): ReactElement;
41
+ /** 下箭头线性图标(披露开关方向指示;展开态旋转由宿主按钮的 aria-expanded 选择器驱动)。 */
42
+ export declare function IconChevronDown(): ReactElement;
41
43
  export declare function PageError(props: {
42
44
  message: string;
43
45
  onRetry: () => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starwish-ai/xingyuan-dsh",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "星愿 XingYuan for DeepSeek Harness: 对话创建愿望/任务、机会日打卡、微行动、记忆与图表的 Agent Preset 组合包",
5
5
  "type": "module",
6
6
  "license": "MIT",