/* ── 标准玻璃与玻璃时钟 (docs/HOME_LOCK_REDESIGN.md §0 §1) ──
   --glass-*: the standard glass of the desktop layer (bell, Dock, lock cards, notification cards, edit toolbar); lighter
   on a dark wallpaper (.icons-on-dark: it follows the wallpaper, not dark mode). Fraunces is self-hosted (fonts/, digits
   and ":" only) for the clock digits and nothing else; on Apple devices ui-serif (New York) comes first. */
@font-face{font-family:'Fraunces';src:url('../fonts/fraunces-clock.woff2') format('woff2');font-weight:600;font-style:normal;font-display:swap;unicode-range:U+0030-003A}
:root{--glass-bg:rgb(255 255 255/18%);--glass-line:rgb(255 255 255/32%);--glass-blur:blur(26px) saturate(160%);--glass-shadow:inset 0 1px 0 rgb(255 255 255/38%),0 10px 30px -12px rgb(0 0 0/30%)}
.icons-on-dark{--glass-bg:rgb(255 255 255/12%);--glass-line:rgb(255 255 255/24%)}
/* 时钟: --clock-font (桌面设置 字体), --clock-density (浓度) and --clock-mix (0 white glass .. 1 theme-colour glass, theme-engine applyClockMix) */
.glass-clock{position:relative;display:inline-block;font-family:var(--clock-font,ui-serif,'Fraunces',var(--font-display));font-weight:600;letter-spacing:-.02em;line-height:1.05;font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1;white-space:nowrap;color:transparent;-webkit-text-fill-color:transparent}
/* 主题色玻璃: the digits themselves carry the theme's --pri-deep, denser at the top, as dense as 浓度 and as present as the background asks */
.glass-clock{background-image:linear-gradient(175deg,color-mix(in srgb,var(--pri-deep) calc(var(--clock-density,.62) * var(--clock-mix,0) * 100%),transparent),color-mix(in srgb,var(--pri-deep) calc(var(--clock-density,.62) * var(--clock-mix,0) * 68%),transparent));-webkit-background-clip:text;background-clip:text;filter:drop-shadow(0 6px 14px rgb(60 80 110/calc(.18 * var(--clock-mix,0)))) drop-shadow(0 1px 0 rgb(255 255 255/calc(.8 * var(--clock-mix,0))))}
.glass-clock::before,.glass-clock::after{content:attr(data-t);content:attr(data-t) / "";position:absolute;left:0;top:0;white-space:nowrap;pointer-events:none;color:transparent;-webkit-text-fill-color:transparent}
/* 白色玻璃: the blurred wallpaper seen through the digits (--wall-blur, aligned by theme-engine alignGlassClocks); it gives way to the theme glass */
.glass-clock::before{opacity:calc(1 - var(--clock-mix,0));background-image:var(--wall-blur,linear-gradient(170deg,rgb(255 255 255/85%),rgb(255 255 255/55%)));background-repeat:no-repeat;background-size:var(--wb-w,100%) var(--wb-h,100%);background-position:var(--wb-x,0) var(--wb-y,0);-webkit-background-clip:text;background-clip:text;filter:drop-shadow(0 1px 1px rgb(0 0 0/14%))}
/* the bright rim: a light-to-clear gradient over the digits and a faint white glow (no -webkit-text-stroke: it leaves hairlines where Fraunces strokes cross) */
.glass-clock::after{background:linear-gradient(165deg,rgb(255 255 255/55%),transparent 40%,transparent 70%,rgb(255 255 255/25%));-webkit-background-clip:text;background-clip:text;text-shadow:0 0 1px rgb(255 255 255/30%)}
/* the date follows the clock: theme colour with the theme glass (unless the wallpaper under it asks for light ink: 主题色 forced on a dark wallpaper) */
#v-home.clock-tint:not([data-wall-tone="light"]) .home-date,#lockscreen.clock-tint:not([data-wall-tone="light"]) .lock-date,.ds-phone.clock-tint:not([data-wall-tone="light"]) .ds-pv-date{color:var(--accent-text)}

/* ── Desktop editing: grid, dock, paging, edit-mode toolbar ──
   (.home-topbar / .home-bell sizing lives in notifications.css, next to the bell) */

/* ── Desktop glass tokens: theme-aware frosted glass for App icons, the top "..."/bell controls and
   the Dock. bg/fg are derived from --surface/--pri-pale/--pri-deep via color-mix(), which already
   hold the CURRENT preset's real colours (set by theme-engine.js), so these tokens automatically
   repaint for all 4 presets and both light/dark with zero JS branching here - same architecture as
   wechat.css's #wechat-chat-detail --glass-bar/--im-theirs/--im-hi/--im-shadow tokens (the chat-bubble
   glass this was modelled on), just under desktop-specific names so this file never depends on
   wechat.css. line/highlight/shadow are fixed light/dark rgba (a glass reflection or ambient shadow
   isn't itself theme-tinted) and get their own dark-mode overrides, same two-selector pattern as
   wechat.css's --im-mine/--im-theirs dark block. Layering: icon = strongest tint (most legible as
   "this theme's glass"), top controls = lightest/most transparent (floating utility chips), Dock =
   largest surface so its tint is diluted more to stay calm. */
:root{
  --desktop-icon-glass-bg:color-mix(in srgb,var(--pri-pale) 42%,color-mix(in srgb,var(--surface) 62%,transparent));
  --desktop-icon-glass-fg:var(--pri-deep);
  --desktop-icon-glass-line:rgba(255,255,255,.4);
  --desktop-icon-glass-highlight:rgba(255,255,255,.5);
  --desktop-icon-glass-shadow:0 4px 14px rgba(40,60,90,.12);
  --desktop-control-glass-bg:color-mix(in srgb,var(--pri-pale) 30%,color-mix(in srgb,var(--surface) 45%,transparent));
  --desktop-control-glass-line:rgba(255,255,255,.3);
  --desktop-control-glass-highlight:rgba(255,255,255,.4);
  --desktop-control-glass-shadow:0 2px 10px rgba(40,60,90,.08);
  --desktop-dock-glass-top:rgb(255 255 255/22%);
  --desktop-dock-glass-bottom:rgb(255 255 255/10%);
  --desktop-dock-glass-line:rgb(255 255 255/28%);
  --desktop-dock-glass-highlight:rgb(255 255 255/36%);
  --desktop-dock-glass-shadow:0 4px 12px rgb(30 48 72/8%);
}
@media(prefers-color-scheme:dark){:root:not([data-theme="light"]){
  --desktop-icon-glass-bg:color-mix(in srgb,var(--pri-pale) 30%,color-mix(in srgb,var(--surface) 55%,transparent));
  --desktop-icon-glass-line:rgba(255,255,255,.1);
  --desktop-icon-glass-highlight:rgba(255,255,255,.08);
  --desktop-icon-glass-shadow:0 4px 14px rgba(0,0,0,.35);
  --desktop-control-glass-bg:color-mix(in srgb,var(--pri-pale) 20%,color-mix(in srgb,var(--surface) 40%,transparent));
  --desktop-control-glass-line:rgba(255,255,255,.08);
  --desktop-control-glass-highlight:rgba(255,255,255,.06);
  --desktop-control-glass-shadow:0 2px 10px rgba(0,0,0,.3);
  --desktop-dock-glass-top:rgb(255 255 255/12%);
  --desktop-dock-glass-bottom:rgb(255 255 255/5%);
  --desktop-dock-glass-line:rgb(255 255 255/14%);
  --desktop-dock-glass-highlight:rgb(255 255 255/16%);
  --desktop-dock-glass-shadow:0 4px 12px rgb(0 0 0/22%);
}}
:root[data-theme="dark"]{
  --desktop-icon-glass-bg:color-mix(in srgb,var(--pri-pale) 30%,color-mix(in srgb,var(--surface) 55%,transparent));
  --desktop-icon-glass-line:rgba(255,255,255,.1);
  --desktop-icon-glass-highlight:rgba(255,255,255,.08);
  --desktop-icon-glass-shadow:0 4px 14px rgba(0,0,0,.35);
  --desktop-control-glass-bg:color-mix(in srgb,var(--pri-pale) 20%,color-mix(in srgb,var(--surface) 40%,transparent));
  --desktop-control-glass-line:rgba(255,255,255,.08);
  --desktop-control-glass-highlight:rgba(255,255,255,.06);
  --desktop-control-glass-shadow:0 2px 10px rgba(0,0,0,.3);
  --desktop-dock-glass-top:rgb(255 255 255/12%);
  --desktop-dock-glass-bottom:rgb(255 255 255/5%);
  --desktop-dock-glass-line:rgb(255 255 255/14%);
  --desktop-dock-glass-highlight:rgb(255 255 255/16%);
  --desktop-dock-glass-shadow:0 4px 12px rgb(0 0 0/22%);
}

/* #desk-settings-body / #desk-library-body render <div class="app-top">+<div class="app-body ...">
   directly, same shape as every Settings screen - but unlike #settings-app-root (settings.css), these
   two ids never got display:flex;flex-direction:column;height:100%, so .app-body's flex:1/min-height:0
   had no flex container to size against: it just grew to its content height instead of the view's
   height, so overflow-y:auto never had anything to scroll (content silently got clipped by .view's own
   overflow:hidden instead). Not noticed before because both pages' content used to be short enough to
   fit on screen; the desktop-settings redesign's longer content was the first to actually overflow. */
#desk-settings-body,#desk-library-body{display:flex;flex-direction:column;height:100%}

.desk-root{--desk-widget-opacity:1;flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;touch-action:none}
.desk-pages-window{flex:1;min-height:0;overflow:hidden}
.desk-pages-track{height:100%;min-height:0;display:flex;width:100%;transform:translateX(-100%);transition:transform .3s cubic-bezier(.22,.61,.36,1)}
.desk-page{flex:0 0 100%;width:100%;height:100%;min-height:0;overflow:hidden;display:grid;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(4,var(--desk-row-h,minmax(0,1fr)));align-content:start;grid-auto-flow:row dense;gap:14px 10px;padding:10px 4px 6px}
.desk-page.has-clock{grid-template-rows:auto repeat(4,var(--desk-row-h,minmax(0,1fr)))}   /* 第一页：时钟一行 + 4 行图标 */
.desk-page-empty{visibility:hidden}
.desk-root.compact .desk-page{gap:10px 6px}
/* Custom pointer-driven drag (dock/grid reorder) and swipe (page paging) own gestures on these
   items end to end; without this, a real mouse/touch press-and-drag starts a native text/image
   selection instead of reaching our pointerdown handler at all (see .dating-card, same fix). */
.desk-item,.desk-dock-item{position:relative;min-width:0;user-select:none;-webkit-user-select:none;touch-action:none}
.desk-item.desk-app .app-btn{width:100%;border:none;background:transparent;color:var(--ink2);display:flex;flex-direction:column;align-items:center;gap:6px;font-family:inherit;font-size:11.5px;cursor:pointer}
/* 百搭图标（docs/ICON_STYLE_HANDOFF.md v2）：白磨砂底座只带一点主题色，图形用主题色线条，桌面与 Dock 共用。
   暗（深色模式 / 暗壁纸 / 手动「深色」）由 theme-engine 在 #v-home 上切 .icons-on-dark。
   用户设置照旧生效：--icon-radius、--icon-bg-opacity（整个底座的不透明度乘数）、--icon-bg-color（换掉主题色那一层）、
   --icon-border / --icon-shadow / --icon-backdrop / --icon-fg（线条色）。::after 留给 .glow 新消息动画（notifications.css）。 */
.desk-item.desk-app .app-icon,.dock-icon,.desk-widget-inner.w-glass{--k:var(--icon-bg-opacity,1);--ln:var(--icon-fg,var(--pri-deep));
  position:relative;display:flex;align-items:center;justify-content:center;color:var(--ln);
  background:linear-gradient(160deg,rgb(255 255 255/calc(80% * var(--k))) 0%,color-mix(in srgb,color-mix(in srgb,var(--icon-bg-color,var(--pri-pale)) 50%,rgb(255 255 255/35%)) calc(100% * var(--k)),transparent) 60%,rgb(255 255 255/calc(62% * var(--k))) 100%);
  -webkit-backdrop-filter:var(--icon-backdrop,blur(14px) saturate(150%));backdrop-filter:var(--icon-backdrop,blur(14px) saturate(150%));
  border:var(--icon-border,1px solid rgb(255 255 255/90%));
  box-shadow:var(--icon-shadow,inset 0 1.5px 0 #fff,inset 0 -3px 7px color-mix(in srgb,var(--pri-deep) 10%,transparent),0 5px 14px color-mix(in srgb,var(--pri-deep) 15%,transparent))}
.desk-item.desk-app .app-icon{width:64px;height:64px;margin:0 auto;border-radius:var(--icon-radius,19px)}
/* 顶部轻高光 */
.desk-item.desk-app .app-icon::before,.dock-icon::before,.desk-widget-inner.w-glass::before{content:"";position:absolute;left:14%;right:14%;top:5%;height:28%;pointer-events:none;border-radius:50% 50% 45% 45% / 75% 75% 25% 25%;background:linear-gradient(180deg,rgb(255 255 255/90%),rgb(255 255 255/0%));opacity:.5}
/* 云白（纯白背景）补一圈极细边，底座不只靠阴影 */
html[data-theme-id="warm-paper"] .desk-item.desk-app .app-icon,html[data-theme-id="warm-paper"] .dock-icon{border-color:rgb(120 130 140/14%)}
/* 暗 */
.icons-on-dark .desk-item.desk-app .app-icon,.icons-on-dark .dock-icon,.icons-on-dark .desk-widget-inner.w-glass{--ln:var(--icon-fg,rgb(255 255 255/95%));background:linear-gradient(160deg,rgb(255 255 255/calc(22% * var(--k))),rgb(255 255 255/calc(6% * var(--k))) 60%,rgb(255 255 255/calc(12% * var(--k))));border-color:rgb(255 255 255/28%);box-shadow:var(--icon-shadow,inset 0 1px 0 rgb(255 255 255/40%),0 6px 16px rgb(0 0 0/30%))}
.icons-on-dark .desk-item.desk-app .app-icon::before,.icons-on-dark .dock-icon::before,.icons-on-dark .desk-widget-inner.w-glass::before{opacity:.25}
/* 图形（js/desk-glyphs.js）：只用 class 上色，深浅切换只改这里。64 画布显示约 40px（紧凑 34px） */
.desk-item.desk-app .app-icon svg.glass-glyph,.dock-icon svg.glass-glyph{position:relative;z-index:1;width:62.5%;height:62.5%;overflow:visible}
.glass-glyph .ln{fill:none;stroke:var(--ln);stroke-linecap:round;stroke-linejoin:round}
.glass-glyph .f1{fill:rgb(255 255 255/95%);stroke:var(--ln);stroke-linejoin:round}
.glass-glyph .f2{fill:var(--pri-pale);stroke:var(--ln);stroke-linejoin:round}
.glass-glyph .dot{fill:var(--ln)}
.glass-glyph .ac{fill:var(--icon-accent,#F7D27A)}
.glass-glyph .w1{stroke-width:2.4}.glass-glyph .w2{stroke-width:2}
.icons-on-dark .glass-glyph .f1{fill:rgb(255 255 255/28%)}
.icons-on-dark .glass-glyph .f2{fill:rgb(255 255 255/12%)}
.desk-item.desk-app .app-icon>.app-badge,.desk-item.desk-app .app-icon>.app-icon-status-dot,.dock-icon>.app-badge,.dock-icon>.app-icon-status-dot{z-index:2}
/* 图标文字（ICON_STYLE_HANDOFF §5）：浅 = --ink + 白色光晕，暗 = #EEF1F6 + 淡阴影；跟壁纸亮暗（.icons-on-dark），不跟深色模式。
   壁纸「文字颜色」手动选了浅色 / 深色（data-wall-manual）时，桌面图标名字仍按它（wallpaper.css）；Dock 名字总是按这里。 */
#v-home:not([data-wall-manual]) .desk-item.desk-app .app-btn,#v-home .desk-dock-item .app-btn{color:var(--ink);text-shadow:0 0 3px rgb(255 255 255/95%),0 0 8px rgb(255 255 255/75%),0 0 14px rgb(255 255 255/45%)}
#v-home.icons-on-dark:not([data-wall-manual]) .desk-item.desk-app .app-btn,#v-home.icons-on-dark .desk-dock-item .app-btn{color:#EEF1F6;text-shadow:0 1px 4px rgb(0 0 0/35%)}
/* 顶部两个按钮和 Dock 背板：同一个壁纸判断（这里重新声明，值才会按这个节点的变量算，而不是 :root 的深色模式变量） */
#v-home{--desktop-control-glass-bg:color-mix(in srgb,var(--pri-pale) 30%,color-mix(in srgb,var(--surface) 45%,transparent));--desktop-control-glass-line:rgb(255 255 255/30%);--desktop-control-glass-highlight:rgb(255 255 255/40%);--desktop-control-glass-shadow:0 2px 10px rgb(40 60 90/8%);
  --desktop-dock-glass-top:rgb(255 255 255/22%);--desktop-dock-glass-bottom:rgb(255 255 255/10%);--desktop-dock-glass-line:rgb(255 255 255/28%);--desktop-dock-glass-highlight:rgb(255 255 255/36%);--desktop-dock-glass-shadow:0 4px 12px rgb(30 48 72/8%)}
#v-home.icons-on-dark{--desktop-control-glass-bg:rgb(255 255 255/14%);--desktop-control-glass-line:rgb(255 255 255/22%);--desktop-control-glass-highlight:rgb(255 255 255/30%);--desktop-control-glass-shadow:0 4px 12px rgb(0 0 0/22%)}
#v-home.icons-on-dark .home-bell{color:#EEF1F6}
/* Dock 背板跟随 .icons-on-dark */
/* 日历的日期：无衬线、线条色，落在日历本体左侧，右下留给点缀 */
.desk-item.desk-app #home-calendar-icon .app-icon-daynum{z-index:2;padding:17% 13% 0 0;font-family:-apple-system,"PingFang SC","Helvetica Neue",Arial,sans-serif;font-weight:600;font-size:14px;color:var(--ln)}
.desk-root.compact .desk-item.desk-app .app-icon{width:54px;height:54px;border-radius:calc(var(--icon-radius,19px) * .84)}
.desk-root{--ic:64px}
.desk-root.compact{--ic:54px}
.desk-item.desk-app .app-icon svg{position:relative;z-index:1;width:28px;height:28px;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
.desk-item.desk-app .app-btn>span:last-child{display:-webkit-box;max-width:76px;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:1;-webkit-box-orient:vertical;line-height:1.25;text-align:center}
html[data-ui-lang="en"] .desk-item.desk-app .app-btn{font-size:10.5px}
html[data-ui-lang="en"] .desk-item.desk-app .app-btn>span:last-child{max-width:70px;-webkit-line-clamp:2;line-height:1.12;word-break:normal;overflow-wrap:break-word}

/* iOS long-press callout menu ("拷贝"/保存图片...) and text-select handles don't belong on app icons
   or their buttons - and a quick press-scale reads as a native tap. Scoped to the INNER icon/button,
   never to .desk-item/.desk-dock-item themselves, so it never fights deskJiggle's own transform
   (applied to those outer wrappers, see "Edit mode" below) during editing - and since
   .desk-root.editing .desk-item.desk-app .app-btn{pointer-events:none} already, the icon can't even
   receive :active while editing, so this naturally never engages then without any extra guarding. */
.desk-item.desk-app .app-icon,.dock-icon,.desk-item.desk-app .app-btn,.desk-dock-item .app-btn{-webkit-touch-callout:none;user-select:none;-webkit-user-select:none}
.desk-item.desk-app .app-icon:active,.dock-icon:active{transform:scale(.94);transition:transform .12s ease}

.desk-dots{display:flex;justify-content:center;gap:6px;padding:2px 0 8px}
.desk-dots i{width:5px;height:5px;border-radius:50%;background:var(--wall-ink2,var(--ink2));opacity:.35}
.desk-dots i.active{background:var(--wall-ink,var(--ink));opacity:.85;width:14px;border-radius:3px;transition:width .2s}

/* Dock：标准玻璃（跟壁纸亮暗），圆角 30 */
.dock{position:relative;box-sizing:border-box;height:calc(var(--dock-icon) + 40px);border-radius:30px;--dock-icon:64px;--dock-r:1;background:var(--glass-bg);border:1px solid var(--glass-line);-webkit-backdrop-filter:var(--glass-blur);backdrop-filter:var(--glass-blur);box-shadow:var(--glass-shadow)}
.dock-apps{position:absolute;inset:0;display:grid;grid-template-columns:repeat(4,1fr);align-items:center;justify-items:center;padding:0 16px}
.desk-dock-item{width:100%;display:flex;justify-content:center}
.desk-dock-item .app-btn{border:none;background:transparent;padding:4px 0;min-width:56px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:var(--ink2);font-family:inherit;font-size:11px;line-height:1.25;cursor:pointer}
.dock-icon{width:46px;height:46px;border-radius:calc(var(--icon-radius,19px) * .74)}
/* Dock 里的图标和桌面图标同尺寸同圆角（64 / 小屏 60 / 56 / 紧凑 54），Dock 的高度跟着图标走 */
.desk-dock-item .dock-icon{width:var(--dock-icon);height:var(--dock-icon);border-radius:calc(var(--icon-radius,19px) * var(--dock-r))}
.dock.compact{--dock-icon:54px;--dock-r:.84}
.dock-icon svg{position:relative;z-index:1;width:24px;height:24px;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.dock-label{max-width:58px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ── Edit mode ──
   The Dock keeps its own icons (they are dragged in place); the whole Dock and the page dots lift to make room for the
   floating toolbar. Icons and widgets lean ±1.2° in turn (no endless shaking; none with reduced motion / 编辑时图标轻晃 off),
   and carry a × badge (not 设置 / 应用中心, not the Dock's icons). */
.desk-root.editing .desk-item.desk-app .app-btn{pointer-events:none}
/* 编辑桌面：像手机一样抖动。每个图标节奏略不同（不整齐划一才自然），组件幅度更小（大块转同样角度会晃得夸张） */
@keyframes deskJiggle{0%{transform:rotate(-1.4deg) translateY(.4px)}50%{transform:rotate(1.4deg) translateY(-.4px)}100%{transform:rotate(-1.4deg) translateY(.4px)}}
@keyframes deskJiggleWide{0%{transform:rotate(-.5deg)}50%{transform:rotate(.5deg)}100%{transform:rotate(-.5deg)}}
.desk-root.editing .desk-item,.desk-root.editing .desk-dock-item{animation:deskJiggle .28s ease-in-out infinite;transform-origin:50% 50%}
.desk-root.editing .desk-item.desk-widget{animation-name:deskJiggleWide;animation-duration:.34s}
.desk-root.editing .desk-item:nth-child(3n){animation-duration:.31s;animation-delay:-.12s}
.desk-root.editing .desk-item:nth-child(3n+1){animation-duration:.26s;animation-delay:-.05s}
.desk-root.editing .desk-item:nth-child(2n){animation-direction:reverse}
.desk-root.editing .desk-dock-item:nth-child(2n){animation-direction:reverse;animation-delay:-.09s}
.desk-root.editing .dragging-source{animation:none}
html.desk-no-wiggle .desk-root.editing .desk-item,html.desk-no-wiggle .desk-root.editing .desk-dock-item{animation:none;transform:none}
@media (prefers-reduced-motion:reduce){.desk-root.editing .desk-item,.desk-root.editing .desk-dock-item{animation:none;transform:none;transition:none}}
@media (prefers-reduced-motion:reduce){.desk-pages-track{transition:none}}
#v-home .dock,#v-home .desk-dots{transition:transform .25s ease}
#v-home.desk-editing .dock,#v-home.desk-editing .desk-dots{transform:translateY(-86px)}
@media (prefers-reduced-motion:reduce){#v-home .dock,#v-home .desk-dots{transition:none}}
#v-home.desk-editing .home-bell{opacity:.35;pointer-events:none}
.desk-remove-btn{position:absolute;top:-6px;left:calc(50% - var(--ic,64px) / 2 - 8px);width:22px;height:22px;border-radius:50%;border:none;background:rgb(255 255 255/92%);color:#475a73;box-shadow:0 2px 6px rgb(0 0 0/20%);display:flex;align-items:center;justify-content:center;z-index:2;cursor:pointer}
.desk-item.desk-widget>.desk-remove-btn{left:-6px}
.desk-remove-btn::before{content:"";position:absolute;inset:-9px;border-radius:50%}
.desk-remove-btn svg{width:11px;height:11px;stroke-width:2.2}
.dragging-source{opacity:.25}
.desk-drag-clone{position:fixed;z-index:500;pointer-events:none;transform:scale(1.05);box-shadow:0 10px 28px rgba(20,26,34,.28);border-radius:18px;transition:none}

.desk-toolbar{position:absolute;left:16px;right:16px;bottom:calc(18px + var(--sab));z-index:6;height:64px;box-sizing:border-box;border-radius:32px;display:flex;align-items:center;gap:2px;padding:0 10px 0 6px;background:rgb(255 255 255/22%);border:1px solid var(--glass-line);-webkit-backdrop-filter:blur(26px) saturate(160%);backdrop-filter:blur(26px) saturate(160%);box-shadow:var(--glass-shadow);opacity:0;transform:translateY(14px);pointer-events:none;transition:opacity .2s ease,transform .25s ease}
.desk-toolbar[hidden]{display:none}
.desk-toolbar.show{opacity:1;transform:none;pointer-events:auto}
.desk-toolbar.drag-through{opacity:.35;pointer-events:none}
.desk-toolbar button{flex:1;min-width:0;border:none;background:none;color:var(--wall-ink,var(--ink));display:flex;flex-direction:column;align-items:center;gap:4px;font-family:inherit;font-size:11.5px;padding:6px 4px;border-radius:14px;cursor:pointer}
.desk-toolbar button svg{width:20px;height:20px}
/* 完成: the one solid-ish button on the page, because it leaves edit mode */
/* 完成: the toolbar's own glass, a little brighter (no solid white block); it is still the one button that leaves edit mode */
.desk-toolbar button.primary{flex:0 0 auto;flex-direction:row;gap:6px;height:40px;padding:0 18px 0 14px;border-radius:999px;background:rgb(255 255 255/30%);border:1px solid rgb(255 255 255/55%);box-shadow:inset 0 1px 0 rgb(255 255 255/50%);color:var(--wall-ink,var(--ink));font-weight:600}
.desk-toolbar button.primary svg{width:16px;height:16px}

/* ── Desktop-management bottom menu (light rows, not thick cards) ── */
.desk-menu-sheet{padding-bottom:calc(10px + var(--sab))}
.desk-menu-row{width:100%;min-height:48px;border:none;background:none;color:var(--ink);font-family:inherit;font-size:14.5px;font-weight:500;display:flex;align-items:center;gap:12px;padding:0 4px;text-align:left;cursor:pointer;border-top:.5px solid color-mix(in srgb,var(--border) 70%,transparent)}
.desk-menu-row:first-of-type{border-top:none}
.desk-menu-row:active{background:var(--surface-alt)}
.desk-menu-row svg:first-child{width:19px;height:19px;color:var(--ink2-soft,var(--ink2));flex-shrink:0}
.desk-menu-row span{flex:1}
.desk-menu-row svg:last-child{width:16px;height:16px;color:var(--mist);flex-shrink:0}
/* avatarHtml() output (a character picker row) never had a size of its own before this - it's an
   unstyled <img> or .avatar-placeholder span, so without this it renders at its native image size.
   The placeholder is a <span>, so `.desk-menu-row span{flex:1}` above also matches it and stretches
   it edge-to-edge (flex:1 implies flex-basis:0%, which a plain width can't override) - `flex:none`
   resets grow/shrink/basis together so the fixed 34px size actually holds. */
.desk-menu-row img,.desk-menu-row .avatar-placeholder{flex:none;width:34px;height:34px;border-radius:50%;object-fit:cover;background:var(--surface-alt);display:flex;align-items:center;justify-content:center;overflow:hidden}
.desk-menu-row .avatar-placeholder svg{width:17px;height:17px;color:var(--ink2-soft,var(--ink2))}

/* ── Add-widget panel ── */

/* ── Desktop settings / App library pages ── */
.desk-settings-scroll{flex:1;min-height:0;overflow-y:auto;padding:14px 16px calc(20px + var(--sab));display:flex;flex-direction:column;gap:14px}

/* ── 桌面设置 v2 (docs/DESK_SETTINGS_REDESIGN.md) ──
   #v-desk-settings gets .from-desk (opened from the edit toolbar: the desktop wallpaper, blurred, under a veil - like 应用中心)
   or .from-settings (opened from the 设置 App: the theme background, like the other settings pages). Only the background
   differs. The top is a live phone with the user's own wallpaper, date, glass clock, a widget and the first four icons; when it
   scrolls away a small strip with the same picture sits at the bottom. */
#desk-settings-body{position:relative;overflow:hidden;background:var(--bg);color:var(--ink)}
/* a bright wallpaper: blurred and dimmed a little, then the theme background at 20% (no white veil: it blew the picture out); a dark one keeps its dark veil */
.ds-bg{position:absolute;inset:-50px;z-index:0;filter:blur(30px) brightness(.85);pointer-events:none;display:none}
#v-desk-settings.icons-on-dark .ds-bg{inset:-30px;filter:blur(10px)}
.ds-bg .wp-layer{position:absolute;inset:0}
.ds-veil{position:absolute;inset:0;z-index:0;background:color-mix(in srgb,var(--bg) 20%,transparent);pointer-events:none;display:none}
#v-desk-settings.from-desk.has-wall .ds-bg,#v-desk-settings.from-desk.has-wall .ds-veil{display:block}
#v-desk-settings.from-desk.has-wall.icons-on-dark .ds-veil{background:rgb(14 20 32/50%)}
/* cards over a bright wallpaper: nearly opaque white with a white edge and a deeper shadow, so they stand off the picture */
#v-desk-settings.from-desk.has-wall:not(.icons-on-dark) .ds-card{background:rgb(255 255 255/75%);border-color:rgb(255 255 255/90%);box-shadow:0 14px 30px -14px rgb(30 45 75/35%)}
.ds-top{position:relative;z-index:2;flex-shrink:0;display:flex;align-items:center;gap:10px;padding:8px 16px}
.ds-round{flex-shrink:0;width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;border:1px solid var(--glass-line);background:color-mix(in srgb,var(--surface) 62%,transparent);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);box-shadow:0 4px 12px -4px color-mix(in srgb,var(--pri-deep) 28%,transparent);color:var(--ink);cursor:pointer}
.ds-round svg{width:20px;height:20px}
.ds-title{flex:1;margin:0 50px 0 0;text-align:center;font-size:17px}
#desk-settings-body .desk-settings-scroll.ds-scroll{position:relative;z-index:1;gap:0;padding:6px 16px calc(96px + var(--sab))}
/* uncarded text on the dark-wallpaper veil */
#v-desk-settings.from-desk.has-wall.icons-on-dark .ds-title,#v-desk-settings.from-desk.has-wall.icons-on-dark .ds-gt,#v-desk-settings.from-desk.has-wall.icons-on-dark .ds-caption,#v-desk-settings.from-desk.has-wall.icons-on-dark .ds-link{color:#EEF1F6}
#v-desk-settings.from-desk.has-wall.icons-on-dark .ds-card{--ds-a:84%}
/* the live phone */
.ds-phone-wrap{display:flex;flex-direction:column;align-items:center;margin:6px 0 0}
.ds-phone{position:relative;width:220px;height:300px;border-radius:30px;overflow:hidden;background:var(--surface-alt);box-shadow:0 0 0 5px rgb(255 255 255/55%),0 22px 40px -18px color-mix(in srgb,var(--pri-deep) 60%,transparent);color:var(--wall-ink,var(--ink));pointer-events:none;-webkit-user-select:none;user-select:none}
.ds-phone .wp-layer{position:absolute;inset:0}
.ds-pv{position:absolute;inset:0;display:flex;flex-direction:column;padding:26px 12px 0}
.ds-pv-date{text-align:center;font-size:9.5px;font-weight:600;color:var(--wall-ink2,var(--ink2));text-shadow:var(--wall-shadow,none)}
.ds-pv-ck{display:flex;justify-content:center;margin:2px 0 14px}
.ds-pv-ck .glass-clock{font-size:46px}
.ds-pv-w{display:flex;align-items:center;gap:6px;padding:8px 10px;border-radius:14px;background:var(--glass-bg);border:1px solid var(--glass-line);-webkit-backdrop-filter:var(--glass-blur);backdrop-filter:var(--glass-blur);box-shadow:var(--glass-shadow);font-size:8.5px;line-height:1.35;opacity:var(--ds-wo,1)}
.ds-pv-w i{width:20px;height:20px;border-radius:50%;background:linear-gradient(150deg,var(--pri-pale),var(--pri));border:1px solid rgb(255 255 255/85%);flex-shrink:0}
.ds-pv-w b{font-weight:600}
.ds-pv-icons{display:grid;grid-template-columns:repeat(4,1fr);gap:8px 0;padding:14px 0 0;justify-items:center}
.ds-pv-ic{display:flex;flex-direction:column;align-items:center;gap:3px;font-size:7px;color:var(--wall-ink2,var(--ink2));text-shadow:var(--wall-shadow,none);white-space:nowrap}
.ds-phone .ds-pv-ic .dock-icon{position:relative;width:var(--dsic,34px);height:var(--dsic,34px);border-radius:calc(var(--icon-radius,19px) * .6)}
.ds-phone.compact{--dsic:29px}
.ds-phone .ds-pv-ic .app-badge{transform:scale(.6);transform-origin:100% 0}
.ds-caption{margin:10px 0 0;font-size:11.5px;color:var(--ink2)}
/* the strip: the same picture, small, once the phone has scrolled away */
.ds-strip{position:absolute;z-index:4;left:16px;right:16px;bottom:calc(16px + var(--sab));display:flex;align-items:center;gap:12px;padding:9px 14px;border-radius:22px;border:1px solid var(--glass-line);background:color-mix(in srgb,var(--surface) 68%,transparent);-webkit-backdrop-filter:blur(22px) saturate(150%);backdrop-filter:blur(22px) saturate(150%);box-shadow:0 14px 30px -14px color-mix(in srgb,var(--pri-deep) 55%,transparent);color:var(--ink);font-family:inherit;font-size:13.5px;font-weight:600;text-align:left;cursor:pointer}
.ds-strip[hidden]{display:none}
.ds-thumb{position:relative;width:46px;height:62px;border-radius:10px;overflow:hidden;flex-shrink:0;box-shadow:0 0 0 2px rgb(255 255 255/70%)}
.ds-thumb .ds-phone{position:absolute;left:0;top:0;transform:scale(.2091);transform-origin:0 0;box-shadow:none;border-radius:0}
/* cards and rows */
.ds-gt{display:flex;align-items:baseline;justify-content:space-between;margin:20px 8px 8px;font-family:var(--font-display);font-size:13px;font-weight:600;color:var(--ink2)}
.ds-link{border:none;background:none;padding:4px 2px;font-family:inherit;font-size:12.5px;font-weight:500;color:var(--accent-text);cursor:pointer}
.ds-card{--ds-a:66%;border-radius:22px;padding:0 16px;background:color-mix(in srgb,var(--surface) var(--ds-a),transparent);border:1px solid var(--glass-line);-webkit-backdrop-filter:blur(22px) saturate(150%);backdrop-filter:blur(22px) saturate(150%);box-shadow:inset 0 1px 0 var(--glass-line),0 10px 24px -16px color-mix(in srgb,var(--pri-deep) 60%,transparent)}
.ds-phone-wrap+.ds-card{margin-top:16px}
.ds-row{display:flex;align-items:center;gap:12px;width:100%;min-height:54px;box-sizing:border-box;padding:0;border:none;background:none;color:var(--ink);font-family:inherit;font-size:14.5px;text-align:left}
.ds-row+.ds-row,.ds-row+.ds-fonts{border-top:1px solid color-mix(in srgb,var(--pri) 18%,transparent)}
.ds-row-btn{cursor:pointer}
.ds-row-text{display:flex;flex-direction:column;min-width:0;flex:1}
.ds-row-sub{margin-top:2px;font-size:11.5px;line-height:1.4;color:var(--ink2)}
.ds-row-label.danger,.ds-danger .ds-row-label{color:#b8706a}
.ds-ico{width:34px;height:34px;border-radius:11px;display:flex;align-items:center;justify-content:center;background:var(--pri-pale);color:var(--accent-text);flex-shrink:0}
.ds-ico svg{width:19px;height:19px}
.ds-pill{margin-left:auto;flex-shrink:0;padding:7px 14px;border-radius:16px;background:var(--surface);color:var(--accent-text);font-size:13px;font-weight:600;box-shadow:0 4px 10px -5px color-mix(in srgb,var(--pri-deep) 50%,transparent)}
.ds-chev{margin-left:auto;flex-shrink:0;color:var(--ink2);font-size:18px}
.ds-seg{display:flex;gap:4px;margin-left:auto;padding:3px;border-radius:13px;background:color-mix(in srgb,var(--pri) 15%,transparent)}
.ds-seg button{border:none;background:none;padding:6px 11px;border-radius:10px;font-family:inherit;font-size:12.5px;color:var(--ink2);cursor:pointer;white-space:nowrap}
.ds-seg button.active{background:var(--surface);color:var(--ink);box-shadow:0 2px 6px -3px color-mix(in srgb,var(--pri-deep) 55%,transparent),inset 0 0 0 1px color-mix(in srgb,var(--pri-deep) 22%,transparent)}
.ds-slide{flex:1;min-width:0;display:flex;align-items:center;gap:10px}
.ds-slider{-webkit-appearance:none;appearance:none;flex:1;min-width:0;height:4px;border-radius:2px;outline:none;cursor:pointer;margin:0;background:linear-gradient(to right,var(--pri) var(--p,50%),color-mix(in srgb,var(--pri) 20%,transparent) var(--p,50%))}
.ds-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:20px;height:20px;border-radius:50%;background:#fff;box-shadow:0 2px 6px rgb(0 0 0/25%)}
.ds-slider::-moz-range-thumb{width:20px;height:20px;border:none;border-radius:50%;background:#fff;box-shadow:0 2px 6px rgb(0 0 0/25%)}
.ds-slider::-moz-range-track{height:4px;border-radius:2px;background:transparent}
.ds-slider:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px color-mix(in srgb,var(--pri) 35%,transparent),0 2px 6px rgb(0 0 0/25%)}
.ds-val{width:40px;text-align:right;font-size:12.5px;color:var(--ink2);flex-shrink:0}
.ds-fonts{display:flex;gap:8px;padding:2px 0 14px}
.ds-fonts button{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:2px;padding:10px 0 8px;border:1px solid var(--glass-line);border-radius:14px;background:color-mix(in srgb,var(--surface) 50%,transparent);font-family:inherit;font-size:11px;color:var(--ink2);cursor:pointer}
.ds-fonts button b{font-size:24px;line-height:1.1;font-weight:600;color:var(--ink)}
.ds-fonts button.active{background:var(--surface);box-shadow:0 0 0 2px var(--pri-deep)}
.ds-card[hidden],.ds-row[hidden]{display:none}

.settings-row-label.reset{color:var(--coral-text)}

@media (max-width:390px){
  .desk-item.desk-app .app-icon{width:60px;height:60px}
  .dock{--dock-icon:60px}
  .desk-root{--ic:60px}
}

/* Short-screen adaptation (see spec §七): shrink clock, widget padding and grid gaps first,
   in that order, before ever touching the dock — the dock must always stay fully visible. */
@media (max-height:760px){
  .home-clock-wrap{padding-block:2px 2px}
  .home-clock{font-size:clamp(40px,8vh,64px)}
  .home-date{margin:0 0 1px;font-size:11.5px}
  .desk-page{gap:10px 8px;padding:6px 4px 4px}
  .desk-item.desk-app .app-icon{width:56px;height:56px}
  .desk-widget-inner.w-glass{padding-block:9px}
  .dock{--dock-icon:56px}
  .desk-root{--ic:56px}
  .desk-dock-item .app-btn{gap:4px}
}
@media (min-height:761px) and (max-height:900px){
  .home-clock{font-size:clamp(48px,10vh,80px)}
}
@media (min-height:901px){
  .home-clock-wrap{padding-block:10px 6px}
}

/* ── 桌面小组件（docs/WIDGETS_REDESIGN.md）：与图标同一底座（上面的 .desk-widget-inner.w-glass）和 .icons-on-dark。
   高度：4×1 = 一个图标 + 名字，4×2 / 2×2 到第二行名字底边（--desk-widget-slack 由 desktop.js 量出）。
   --desk-widget-opacity 只乘在底座上（--k），文字不变淡。 ── */
.desk-widget-inner{width:100%;height:calc(100% - var(--desk-widget-slack,0px));box-sizing:border-box;min-height:0}
.desk-widget-inner.w-glass{--k:var(--desk-widget-opacity,1);--w-ink:var(--ink);--w-ink2:var(--ink2);border-radius:24px;padding:12px 14px;margin:0;opacity:1;color:var(--w-ink);overflow:hidden;display:flex;flex-direction:column;justify-content:center}
.desk-widget-inner.w-glass::before{opacity:.35;left:8%;right:8%;height:22%}
.icons-on-dark .desk-widget-inner.w-glass{--w-ink:#EEF1F6;--w-ink2:rgb(238 241 246/72%)}
.icons-on-dark .desk-widget-inner.w-glass::before{opacity:.18}
.desk-widget-inner.w-glass>*{position:relative;z-index:1}
.desk-widget-inner.w-glass button{border:none;background:none;padding:0;margin:0;font-family:inherit;color:inherit;text-align:left;cursor:pointer;width:100%}
.w-empty{font-size:12.5px;color:var(--w-ink2);text-align:center}
.w-small{font-size:11px;color:var(--w-ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.w-chip{align-self:flex-start;margin-top:5px;padding:2px 8px;border-radius:999px;font-size:10.5px;color:var(--w-ink2);background:rgb(255 255 255/55%)}
.icons-on-dark .w-chip{background:rgb(255 255 255/12%)}
.w-av{position:relative;flex-shrink:0;width:42px;height:42px;border-radius:50%;overflow:hidden;background:var(--surface-alt);display:flex;align-items:center;justify-content:center;border:2px solid rgb(255 255 255/90%);box-shadow:0 2px 6px color-mix(in srgb,var(--pri-deep) 18%,transparent)}
.w-av img{width:100%;height:100%;object-fit:cover}

/* 专属关系 */
.w-rel{display:flex;align-items:center;gap:14px;height:100%}
.w-rel-avs{position:relative;display:flex;align-items:center;flex-shrink:0}
.w-rel .rel-avatar{width:44px;height:44px;border:2px solid #fff;box-shadow:0 2px 6px color-mix(in srgb,var(--pri-deep) 18%,transparent)}
.w-rel .rel-avatar.second{margin-left:-12px}
.w-rel-ghost{background:none!important;border:1.5px dashed var(--w-ink2)!important;box-shadow:none!important}
.w-rel-knot{position:absolute;left:50%;bottom:-2px;z-index:2;width:18px;height:18px;margin-left:-9px;border-radius:50%;background:var(--surface);display:flex;align-items:center;justify-content:center;box-shadow:0 1px 3px rgb(0 0 0/12%)}
.w-rel-knot svg{width:11px;height:11px;fill:var(--couple-accent,var(--icon-accent,#F7D27A));stroke:var(--couple-accent,var(--icon-accent,#F7D27A))}
.w-rel-main{display:flex;flex-direction:column;min-width:0;flex:1}
.w-rel-days{font-family:var(--font-display);font-size:13px;color:var(--w-ink);line-height:1.1}
.w-rel-days b{font-size:30px;font-weight:400;margin:0 2px}
html[data-ui-lang="en"] .w-unit-day{display:none}
.w-rel-with{font-size:11px;color:var(--w-ink2)}
.w-rel-line{margin-top:3px;font-size:11.5px;color:var(--w-ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.w-rel-large{flex-direction:column;align-items:stretch;justify-content:space-between;gap:10px}
.w-rel-top{display:flex;align-items:center;gap:14px}
.w-rel-bottom{display:flex;gap:10px;align-items:stretch;flex:1;min-height:0;max-height:92px}
.w-rel-tear{flex:0 0 31%;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:10px;background:var(--surface);overflow:hidden;box-shadow:0 2px 6px rgb(0 0 0/6%)}
.w-rel-tear i{align-self:stretch;text-align:center;font-style:normal;font-size:10.5px;padding:2px 0;color:#5A5040;background:color-mix(in srgb,var(--couple-accent,var(--icon-accent,#F7D27A)) 70%,#fff)}
.w-rel-tear b{font-family:var(--font-display);font-weight:400;font-size:26px;line-height:1.15;color:var(--ink)}
.w-rel-tear em{font-style:normal;font-size:10px;color:var(--ink2);padding:0 4px 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.w-rel-note{flex:1;min-width:0;position:relative;display:flex;flex-direction:column;justify-content:center;gap:4px;padding:10px 12px;border-radius:4px;background:#FFF6DE;color:#5A5040;transform:rotate(-1.2deg);box-shadow:0 3px 8px rgb(0 0 0/8%)}
.w-rel-note::before{content:"";position:absolute;top:-6px;left:50%;width:34px;height:12px;margin-left:-17px;background:rgb(255 227 158/75%)}
.w-rel-note-text{font-size:12px;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.w-rel-note-text.muted{color:#9A8E78}
.w-rel-note-by{align-self:flex-end;font-size:10.5px;color:#B0805A}
.desk-widget-inner.w-glass .rel-dots{bottom:4px}

/* 最近消息 */
.w-msg{display:flex;align-items:center;gap:12px;height:100%}
.w-msg-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.w-msg-top{display:flex;justify-content:space-between;align-items:baseline;gap:8px;padding-right:18px}
.w-msg-top b{font-family:var(--font-display);font-weight:400;font-size:13.5px;color:var(--w-ink)}
.w-msg-top time{font-size:10.5px;color:var(--w-ink2);flex-shrink:0}
.w-msg-bubble{align-self:stretch;padding:6px 11px;border-radius:14px 14px 14px 4px;background:rgb(255 255 255/48%);border:1px solid rgb(255 255 255/75%);color:var(--w-ink);font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.icons-on-dark .w-msg-bubble{background:rgb(255 255 255/16%);color:#EEF1F6}
.w-msg .hw-unread{position:absolute;top:-4px;right:-2px;min-width:18px;height:18px;padding:0 5px;font-size:10.5px;line-height:18px}   /* colours: .hw-unread (notifications.css) */
.w-msg{position:relative}

/* 今日安排 */
.w-sched{display:flex;align-items:center;gap:14px;height:100%}
.w-cal-page{position:relative;flex-shrink:0;width:58px;height:64px;border-radius:10px;background:var(--surface);box-shadow:0 2px 6px color-mix(in srgb,var(--pri-deep) 14%,transparent);display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--ink)}
.w-cal-page i{position:absolute;top:-4px;width:5px;height:11px;border-radius:3px;background:var(--pri-deep)}
.w-cal-page i:first-child{left:15px}.w-cal-page i:nth-child(2){right:15px}
.w-cal-page b{font-family:var(--font-display);font-weight:400;font-size:28px;line-height:1}
.w-cal-page em{font-style:normal;font-size:10px;color:var(--ink2);margin-top:3px}
.w-sched-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.w-sched-title{font-family:var(--font-display);font-size:16px;color:var(--w-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.w-sched-dots{display:flex;align-items:center;gap:5px;margin-top:2px;min-width:0}
.w-sched-dots i{flex-shrink:0;width:7px;height:7px;border-radius:50%;background:color-mix(in srgb,var(--pri-deep) 28%,transparent)}
.w-sched-dots i.done{background:var(--icon-accent,#F7D27A);box-shadow:0 0 0 1.5px color-mix(in srgb,var(--icon-accent,#F7D27A) 45%,transparent)}
.w-sched-dots .w-small{margin-left:4px}

/* 角色动态 */
.w-char{display:flex;align-items:center;gap:14px;height:100%}
.w-ring{border:none;padding:3px;background:linear-gradient(140deg,var(--icon-accent,#F7D27A),var(--pri));box-shadow:none}
.w-ring img,.w-ring>*{border-radius:50%;border:2px solid #fff;box-sizing:border-box}
.w-char-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}
.w-char-quote{font-family:var(--font-display);font-size:15px;color:var(--w-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* 经期摘要 */
.w-period{display:flex;align-items:center;gap:14px;height:100%}
.w-ring-chart{flex-shrink:0;width:58px;height:58px;border-radius:50%;display:flex;align-items:center;justify-content:center}
.w-ring-chart{background:conic-gradient(color-mix(in srgb,var(--mark-period-actual) 35%,transparent) 0 var(--w-p,18%),var(--pri-pale) var(--w-p,18%) 100%)}
.w-ring-chart.in-period{background:conic-gradient(var(--mark-period-actual) 0 var(--w-p,18%),var(--pri-pale) var(--w-p,18%) 100%)}
.w-ring-chart>span{width:44px;height:44px;border-radius:50%;background:var(--surface);display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--ink)}
.w-ring-chart b{font-family:var(--font-display);font-weight:400;font-size:18px;line-height:1}
.w-ring-chart em{font-style:normal;font-size:8.5px;color:var(--ink2);margin-top:1px}
.w-ring-chart svg{width:16px;height:16px;color:var(--ink2)}
.w-period-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.w-period-title{font-family:var(--font-display);font-size:16px;color:var(--w-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* ── 2×2（square）和 4×2（large）的排版 ── */
/* 专属关系 2×2 */
.w-rel-square{flex-direction:column;align-items:flex-start;justify-content:space-between;gap:4px}
.w-rel-sq-days{display:flex;flex-direction:column;gap:1px}
.w-rel-square .w-rel-days b{font-size:40px;font-weight:300}
.w-rel-square .w-rel-line{max-width:100%;margin-top:0}
.w-rel-square.w-rel-empty{justify-content:center;gap:12px}
.w-rel-square.w-rel-empty .w-rel-main{flex:none;max-width:100%}
.w-rel-square.w-rel-empty .w-rel-line{white-space:normal;line-height:1.45}
/* 最近消息 2×2：一条消息看全 */
.w-msg-square{flex-direction:column;align-items:stretch;gap:8px}
.w-msg-sq-top{display:flex;align-items:center;gap:8px;min-width:0}
.w-msg-sq-top .w-av{width:32px;height:32px}
.w-msg-sq-who{flex:1;min-width:0;display:flex;flex-direction:column}
.w-msg-sq-who b{font-family:var(--font-display);font-weight:400;font-size:13px;color:var(--w-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.w-msg-sq-who time{font-size:10.5px;color:var(--w-ink2)}
.w-msg-square .hw-unread{position:static;flex-shrink:0}
.w-msg-square .w-msg-bubble{min-height:0;white-space:normal;line-height:1.55;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical}
/* 最近消息 4×2：最近三个对话 */
.w-msg-list{display:flex;flex-direction:column;justify-content:center;width:100%;height:100%;gap:1px}
.desk-widget-inner.w-glass .w-msg-row{display:flex;align-items:center;gap:10px;padding:4px 0}
.w-msg-row-av{position:relative;flex-shrink:0}
.w-msg-row-av .w-av{width:32px;height:32px}
.w-msg-row-av .hw-unread{position:absolute;top:-5px;right:-7px;min-width:16px;height:16px;padding:0 4px;font-size:10px;line-height:16px}
.w-msg-row-main{flex:1;min-width:0;display:flex;flex-direction:column}
.w-msg-row-main b{font-family:var(--font-display);font-weight:400;font-size:13px;color:var(--w-ink)}
.w-msg-row-main span{font-size:11.5px;color:var(--w-ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.w-msg-row time{align-self:flex-start;margin-top:2px;flex-shrink:0;font-size:10.5px;color:var(--w-ink2)}
/* 今日安排 2×2：下一件 */
.w-sched-square{flex-direction:column;align-items:stretch;justify-content:space-between;gap:4px}
.w-sched-sq-top{display:flex;justify-content:space-between;align-items:flex-start}
.w-sched-sq-date{display:flex;flex-direction:column}
.w-sched-sq-date b{font-family:var(--font-display);font-weight:300;font-size:30px;line-height:1;color:var(--w-ink)}
.w-sched-sq-date em{font-style:normal;font-size:11px;color:var(--w-ink2);margin-top:2px}
.w-sched-square .w-sched-dots{margin-top:6px}
.w-sched-sq-main{display:flex;flex-direction:column;gap:2px;min-width:0}
.w-sched-square .w-sched-title{white-space:normal;line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
/* 今日安排 4×2：今天前三件 */
.w-sched-large .w-cal-page{width:66px;height:74px}
.w-sched-large .w-cal-page b{font-size:32px}
.w-sched-list{flex:1;min-width:0;display:flex;flex-direction:column}
.w-sched-ev{display:flex;align-items:center;gap:8px;padding:5px 0;font-size:12.5px;color:var(--w-ink);border-bottom:1px solid color-mix(in srgb,var(--w-ink2) 18%,transparent)}
.w-sched-ev:last-of-type{border-bottom:none}
.w-sched-ev time{width:36px;flex-shrink:0;font-size:11px;color:var(--w-ink2)}
.w-sched-ev i{width:13px;height:13px;flex-shrink:0;box-sizing:border-box;border-radius:50%;border:1.5px solid color-mix(in srgb,var(--w-ink2) 60%,transparent)}
.w-sched-ev.done i{background:var(--icon-accent,#F7D27A);border-color:var(--icon-accent,#F7D27A)}
.w-sched-ev span{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.w-sched-ev.done span{color:var(--w-ink2);text-decoration:line-through}
.w-sched-more{margin-top:3px}
/* 经期摘要 2×2：大圆环 */
.w-period-square{flex-direction:column;justify-content:center;gap:8px;text-align:center}
.w-period-square .w-ring-chart{width:86px;height:86px}
.w-period-square .w-ring-chart>span{width:66px;height:66px}
.w-period-square .w-ring-chart b{font-size:26px;font-weight:300}
.w-period-square .w-period-main{flex:none;align-items:center;max-width:100%}
.w-period-square .w-period-title{font-size:13.5px}
.w-period-square .w-chip{align-self:center}
/* 经期摘要 4×2：本周，经期用荧光笔划过（记录的深，预测的浅），今天加粗 + 小圆点 */
.w-period-large{flex-direction:column;align-items:stretch;justify-content:center;gap:16px}
.w-period-top{display:flex;align-items:center;gap:14px}
.w-pweek{display:grid;grid-template-columns:repeat(7,1fr);text-align:center}
.w-pweek-d{display:flex;flex-direction:column;align-items:center;gap:3px}
.w-pweek-d em{font-style:normal;font-size:10px;color:var(--w-ink2)}
.w-pweek-d b{position:relative;display:block;width:100%;height:24px;line-height:24px;font-weight:400;font-size:12.5px;color:var(--w-ink)}
.w-pweek-d b>span{position:relative;z-index:1}
.w-pweek-d b.today{font-weight:700}
.w-pweek-d b.today::after{content:"";position:absolute;left:50%;bottom:-5px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:var(--w-ink)}
.w-pweek-hl{position:absolute;left:7px;right:7px;top:5px;height:16px;border-radius:8px 4px 9px 5px;background:color-mix(in srgb,var(--mark-period-actual,#C98A9A) 48%,transparent)}
.w-pweek-hl.pred{background:color-mix(in srgb,var(--mark-period-actual,#C98A9A) 22%,transparent)}
.w-pweek-hl.join-l{left:0;border-top-left-radius:0;border-bottom-left-radius:0}
.w-pweek-hl.join-r{right:0;border-top-right-radius:0;border-bottom-right-radius:0}

/* ── 他此刻 (character-feed): now + his day. 4×2 flips between the two views on tap ── */
.w-now{display:flex;height:100%;width:100%;color:var(--w-ink)}
.w-now-live{display:inline-block;width:6px;height:6px;margin-right:6px;border-radius:50%;background:#8FC3A4;box-shadow:0 0 0 3px rgb(143 195 164/28%);vertical-align:1px}
.w-now-lbl{font-size:11px;color:var(--w-ink2);letter-spacing:.5px}
.w-now-title{font-family:var(--font-display);font-size:16px;color:var(--w-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.w-now-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.w-now-bar{display:block;height:5px;border-radius:5px;background:color-mix(in srgb,var(--w-ink2) 18%,transparent);overflow:hidden}
.w-now-bar i{display:block;height:100%;width:var(--p,0%);border-radius:5px;background:var(--pri-deep);animation:wNowFill .7s cubic-bezier(.22,.61,.36,1) .1s both}
@keyframes wNowFill{from{width:0}}
.w-now-medium{align-items:center;gap:12px}
.w-now-square{flex-direction:column;justify-content:space-between;gap:4px}
.w-now-who{display:flex;align-items:center;gap:8px;min-width:0}
.w-now-who .w-av{width:30px;height:30px}
.w-now-square .w-now-title{font-size:20px;font-weight:600;white-space:normal;line-height:1.25;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.w-now-large{position:relative;flex-direction:column}
.w-now-hint{position:absolute;right:0;top:0;font-size:10px;color:var(--w-ink2);opacity:.8}
.w-now-body{display:flex;flex:1;min-height:0;transition:opacity .14s ease,transform .14s ease}
.w-now-body.out{opacity:0;transform:scale(.97)}
.w-now-view{display:flex;flex-direction:column;justify-content:space-between;gap:8px;width:100%;animation:wNowIn .3s cubic-bezier(.22,.61,.36,1)}
@keyframes wNowIn{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
.w-now-row{display:flex;align-items:center;gap:12px;min-width:0}
.w-now-large .w-now-title{font-size:21px;font-weight:600}
.w-now-next{opacity:.85}
.w-now-view.w-now-day{justify-content:flex-start;gap:10px}
.w-now-square .w-small{white-space:normal;line-height:1.4}
.w-now-tl{display:flex;flex-direction:column;gap:3px}
.w-now-tl-row{display:flex;align-items:center;gap:10px;font-size:12.5px;opacity:0;animation:wNowRow .42s cubic-bezier(.34,1.56,.64,1) forwards}
.w-now-tl-row:nth-child(2){animation-delay:.05s}.w-now-tl-row:nth-child(3){animation-delay:.1s}.w-now-tl-row:nth-child(4){animation-delay:.15s}
@keyframes wNowRow{from{opacity:0;transform:translateY(8px) scale(.96)}to{opacity:1;transform:none}}
.w-now-tl-row time{width:36px;flex-shrink:0;font-size:11px;color:var(--w-ink2)}
.w-now-tl-row span{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.w-now-tl-row em{font-style:normal;font-size:10px;padding:1px 6px;border-radius:6px;background:color-mix(in srgb,var(--w-ink2) 14%,transparent);color:var(--w-ink2);flex-shrink:0}
.w-now-tl-row.done span{color:var(--w-ink2)}
.w-now-tl-row.ongoing em{background:rgb(143 195 164/28%);color:#3F6E55}
.w-now-none{margin:auto 0}
@media (prefers-reduced-motion:reduce){.w-now-view,.w-now-tl-row,.w-now-bar i{animation:none;opacity:1}.w-now-body{transition:none}}
/* 编辑弹窗里的角色选择（他此刻等跟角色绑定的组件） */
.w-edit-chars{display:flex;gap:10px;overflow-x:auto;scrollbar-width:none;padding:2px}
.w-edit-char{display:flex;flex-direction:column;align-items:center;gap:4px;flex-shrink:0;width:54px;padding:0;border:none;background:none;font-family:inherit;font-size:11px;color:var(--ink2);cursor:pointer}
.w-edit-char .w-av{width:40px;height:40px}
.w-edit-char.active .w-av{outline:2px solid var(--pri-deep);outline-offset:2px}
.w-edit-char.active{color:var(--ink)}
.w-edit-char span:last-child{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* ── 1×1 小组件：和图标一样大，放在一个图标格子里 ── */
.desk-widget-inner[data-size="small"]{width:auto;aspect-ratio:1;max-width:100%;margin:0 auto;border-radius:var(--icon-radius,19px);padding:6px}
.desk-widget-inner.w-glass[data-size="small"]{padding:6px}
.w-mini{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;width:100%;height:100%;color:var(--w-ink)}
.w-mini-lbl{font-size:10px;color:var(--w-ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.w-mini-num{font-family:var(--font-display);font-weight:400;font-size:20px;line-height:1;color:var(--w-ink)}
.w-mini .w-av{width:30px;height:30px}
.w-poke-ring{position:absolute;inset:-3px;width:calc(100% + 6px);height:calc(100% + 6px);pointer-events:none}
.w-poke-ring circle{fill:none;stroke:var(--pri-deep);stroke-width:3;stroke-linecap:round;stroke-dasharray:232;transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dashoffset 1s linear}
.w-poke:not(.cool) .w-poke-ring{display:none}
.w-poke.cool .w-av{filter:grayscale(.3);opacity:.75}
.w-poke.hit .w-av{animation:wSquish .45s}
.w-poke.nope{animation:wShake .35s}
@keyframes wSquish{30%{transform:scale(1.15,.82)}60%{transform:scale(.92,1.08)}100%{transform:none}}
@keyframes wShake{25%{transform:translateX(-3px)}75%{transform:translateX(3px)}}
.w-poke-heart{position:absolute;left:50%;top:20%;color:#C98A9A;font-size:13px;pointer-events:none;animation:wFloat 1s ease-out forwards}
@keyframes wFloat{from{opacity:1;transform:translate(-50%,0)}to{opacity:0;transform:translate(-50%,-30px)}}
.w-night svg{width:22px;height:22px;fill:none;stroke:var(--w-ink);stroke-width:1.6;stroke-linejoin:round}
.w-night.done{opacity:.7}
.w-favor-ring{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;background:conic-gradient(#C98A9A 0 var(--p,0%),color-mix(in srgb,var(--w-ink2) 18%,transparent) var(--p,0%) 100%)}
.w-favor-ring span{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;background:var(--surface);color:var(--ink);font-size:10.5px}

/* ── 他记得 ── */
.w-mem{display:flex;width:100%;height:100%;color:var(--w-ink)}
.w-mem-lbl{font-size:11px;color:var(--w-ink2);letter-spacing:.5px;flex-shrink:0}
.w-mem-large{flex-direction:column;justify-content:space-between;gap:6px}
.w-mem-top,.w-mem-foot{display:flex;align-items:center;justify-content:space-between;gap:8px}
.w-mem-text{font-family:var(--font-display);font-size:16px;line-height:1.55;cursor:pointer;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;animation:wNowIn .25s ease-out}
.w-mem-medium{align-items:center;gap:10px}
.w-mem-medium .w-mem-text{flex:1;min-width:0;font-size:13.5px;-webkit-line-clamp:2}
.w-mem-star{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--w-ink2);cursor:pointer}
.w-mem-star svg{width:14px;height:14px;fill:none;stroke:currentColor}
.w-mem-star i{font-style:normal}
.w-mem-star.on{color:var(--pri-deep)}.w-mem-star.on svg{fill:currentColor}
.w-mem-nav{display:flex;align-items:center;gap:6px;flex-shrink:0}
.w-mem-nav [role="button"]{width:24px;height:24px;border-radius:50%;display:grid;place-items:center;background:rgb(255 255 255/50%);color:var(--w-ink2);cursor:pointer;font-size:14px;line-height:1}
.icons-on-dark .w-mem-nav [role="button"]{background:rgb(255 255 255/14%)}
.w-mem-count{font-size:10.5px;color:var(--w-ink2);font-variant-numeric:tabular-nums}

/* ── 他的便利贴：默认是一张黄色纸条；套了外观（data-skin）就跟着外观走 ── */
.desk-widget[data-widget-id="couple-note"] .desk-widget-inner.w-glass:not([data-skin]){background:none;border-color:transparent;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;padding:4px;overflow:visible}
.desk-widget[data-widget-id="couple-note"] .desk-widget-inner.w-glass:not([data-skin])::before{display:none}
.w-panel-slot .desk-widget-inner[data-size].w-glass:has(.w-note):not([data-skin]){background:none;border-color:transparent;box-shadow:none;padding:4px;overflow:visible}
.w-note{position:relative;width:100%;height:100%;perspective:700px}
.w-note-card{position:absolute;inset:0;transition:transform .5s;transform-style:preserve-3d}
.w-note.flip .w-note-card{transform:rotateY(180deg)}
.w-note-face{position:absolute;inset:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}
.w-note-front{cursor:pointer}
.w-note-back{transform:rotateY(180deg);display:flex;flex-direction:column;gap:6px;padding:10px;border-radius:16px;background:var(--surface);box-shadow:0 6px 16px rgb(40 55 80/16%)}
.w-note-back textarea{flex:1;min-height:0;resize:none;border:1px solid var(--line-soft,rgb(0 0 0/8%));border-radius:10px;padding:7px 8px;font:inherit;font-size:12.5px;color:var(--ink);background:var(--surface-alt)}
.w-note-btns{display:flex;gap:6px}
.w-note-btns [role="button"]{flex:1;text-align:center;padding:6px 0;border-radius:10px;font-size:12px;cursor:pointer;background:color-mix(in srgb,var(--pri) 15%,transparent);color:var(--ink2)}
.w-note-btns .ok{background:var(--surface-alt);color:var(--ink);font-weight:600;box-shadow:0 3px 8px -2px color-mix(in srgb,var(--pri-deep) 30%,transparent)}
.w-note-paper{position:absolute;inset:4px;display:flex;flex-direction:column;gap:4px;padding:16px 12px 10px;border-radius:6px 6px 16px 6px;background:#FFF6DE;color:#5A5040;box-shadow:0 6px 14px rgb(90 80 64/14%);transform:rotate(-2deg);overflow:hidden}
.w-note-paper::before{content:"";position:absolute;top:-5px;left:50%;width:40px;height:12px;margin-left:-20px;background:rgb(255 226 160/80%);transform:rotate(-3deg)}
.w-note-paper.mine{inset:auto -2px -4px 22%;height:52%;padding:12px 10px 7px;background:#EEF3F9;color:#3D4B5C;transform:rotate(3deg);box-shadow:0 8px 18px rgb(60 80 110/20%)}
.w-note-paper.mine .w-note-text{font-size:12px;-webkit-line-clamp:2}
.w-note-paper:has(+ .w-note-paper.mine) .w-note-text{-webkit-line-clamp:3}
.w-note-paper.mine::before{background:rgb(190 206 226/85%)}
.w-note-text{flex:1;min-height:0;font-size:13px;line-height:1.6;display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden}
.w-note-text.muted{color:#9A8E78}
.w-note-by{align-self:flex-end;font-size:10.5px;color:#A98A62}
.w-note-paper.mine .w-note-by{color:#7D8EA4}
.desk-widget-inner[data-skin] .w-note-paper{background:color-mix(in srgb,#FFFFFF 55%,transparent);color:var(--w-ink);box-shadow:none}
.desk-widget-inner[data-skin] .w-note-paper .w-note-by{color:var(--w-ink2)}

/* ── 记录心情：4×1 一排小脸 / 2×2 两行三个 ── */
.w-mood{display:flex;width:100%;height:100%;color:var(--w-ink)}
.w-face{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;flex-shrink:0;background:var(--f-bg);box-shadow:inset 0 1px 0 rgb(255 255 255/70%),0 2px 6px rgb(95 120 149/16%);transition:transform .25s cubic-bezier(.34,1.56,.64,1),opacity .2s}
.w-face svg{width:18px;height:18px;fill:none;stroke:var(--f-ink);stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.w-face[role="button"]{cursor:pointer}
.w-face[role="button"]:hover,.w-face[role="button"]:focus-visible{transform:scale(1.15)}
.w-face.chosen{transform:scale(1.4)}
.w-mood.picking .w-face:not(.chosen){opacity:.35;transform:scale(.85)}
.w-mood-row{align-items:center;gap:12px}
.w-mood-q{font-size:13px;white-space:nowrap;flex-shrink:0}
.w-mood-faces{flex:1;display:flex;align-items:center;justify-content:space-between}
.w-mood-row .w-face{width:30px;height:30px}
.w-mood-ask{flex-direction:column}
.w-mood-lbl{font-size:11px;color:var(--w-ink2);letter-spacing:.5px}
.w-mood-faces.grid23{display:grid;grid-template-columns:repeat(3,36px);grid-auto-rows:36px;justify-content:space-between;align-content:center;row-gap:10px}
.w-mood-faces.grid23 .w-face{width:36px;height:36px}.w-mood-faces.grid23 .w-face svg{width:22px;height:22px}
.w-mood-faces.grid23 .w-face.chosen{transform:scale(1.28)}
.w-mood-hint{text-align:center}
.w-mood-done{flex-direction:column;gap:8px;animation:wNowIn .3s ease-out}
.w-mood-pick{display:flex;align-items:center;gap:8px;font-size:14px}
.w-mood-pick b{font-weight:600}.w-mood-pick time{margin-left:auto;font-size:10.5px;color:var(--w-ink2)}
.w-mood-reply{font-size:12px;line-height:1.55;padding:7px 10px;border-radius:12px 12px 12px 4px;background:rgb(255 255 255/48%);border:1px solid rgb(255 255 255/75%);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.icons-on-dark .w-mood-reply{background:rgb(255 255 255/12%);border-color:rgb(255 255 255/18%)}
.w-mood-change{margin-top:auto;align-self:flex-start;font-size:11px;color:var(--w-ink2);cursor:pointer;text-decoration:underline;text-underline-offset:3px}
.w-mood-row.done .w-face{width:32px;height:32px}
.w-mood-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.w-mood-main b{font-size:13px;display:flex;gap:8px;align-items:baseline}.w-mood-main b time{font-weight:400;font-size:10.5px;color:var(--w-ink2)}
.w-mood-row.done .w-mood-change{margin:0;align-self:center}
.w-typing{display:inline-flex;gap:3px}.w-typing i{width:4px;height:4px;border-radius:50%;background:var(--w-ink2);animation:wBlink 1s infinite}.w-typing i:nth-child(2){animation-delay:.15s}.w-typing i:nth-child(3){animation-delay:.3s}
@keyframes wBlink{50%{opacity:.25}}

/* ── 今日安排 4×2：在桌面上直接打勾 ── */
.w-sched-ev[role="checkbox"]{cursor:pointer}
.w-sched-ev i{display:grid;place-items:center;transition:background .2s,border-color .2s}
.w-sched-ev i svg{width:9px;height:9px;fill:none;stroke:#fff;stroke-width:2.4;opacity:0}
.w-sched-ev.done i svg{opacity:1;animation:wTick .3s ease-out}
@keyframes wTick{from{stroke-dasharray:12;stroke-dashoffset:12}to{stroke-dashoffset:0}}
.w-sched-ev.done i{background:var(--pri-deep);border-color:var(--pri-deep)}
@media (prefers-reduced-motion:reduce){.w-face,.w-note-card,.w-poke-ring circle{transition:none}.w-poke.hit .w-av,.w-poke.nope,.w-poke-heart,.w-mem-text,.w-mood-done,.w-sched-ev.done i svg{animation:none}}

/* 照片相框：无框（默认）不变；拍立得 / 胶带 用玻璃底，图片自己裁圆角，胶带可以露出组件边缘 */
.desk-widget-inner.photo-widget.w-glass{--k:var(--desk-widget-opacity,1);opacity:1;display:flex;flex-direction:column;overflow:visible;padding:9px}
.desk-widget-inner.photo-widget.frame-tape{padding:8px}
.photo-frame-pic{position:relative;flex:1;min-height:0;align-self:stretch;width:100%;overflow:hidden;background:var(--surface-alt)}
.photo-frame-cap{flex-shrink:0;align-self:stretch;padding:7px 4px 1px;text-align:center;font-family:var(--font-display);font-size:12px;color:var(--w-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.desk-widget-inner.w-glass>.photo-tape,.photo-tape{position:absolute;z-index:2;width:40px;height:13px;background:rgb(255 255 255/70%);box-shadow:0 1px 3px rgb(0 0 0/10%);pointer-events:none}
.photo-tape.a{top:-3px;left:-8px;transform:rotate(-38deg)}
.photo-tape.b{right:-8px;bottom:-3px;transform:rotate(-38deg)}
.photo-widget-hint{position:absolute;left:8px;bottom:8px;padding:3px 9px;border-radius:999px;background:var(--overlay-scrim);color:#fff;font-size:10.5px;font-weight:600;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}

/* ── 组件外观（js/apps/desktop.js applyDeskSkin）：质感 data-skin = clear / semi / frost / liquid，颜色 --sk-a → --sk-b，
   浓淡 --sk-k 是底色的不透明度。data-ink 只在底色足够浓时决定文字深浅，否则仍跟壁纸（.icons-on-dark）。
   没有 data-skin 的组件 = 上面的默认玻璃，完全不变。 ── */
.desk-widget-inner.w-glass.w-glass[data-skin]{
  background:linear-gradient(150deg,color-mix(in srgb,var(--sk-a) var(--sk-k,40%),transparent),color-mix(in srgb,var(--sk-b) var(--sk-k,40%),transparent));
  border:1px solid rgb(255 255 255/55%);box-shadow:0 10px 26px -8px rgb(40 55 80/28%);-webkit-backdrop-filter:none;backdrop-filter:none}
.desk-widget-inner.w-glass.w-glass[data-skin]::before{display:none}
.desk-widget-inner.w-glass.w-glass[data-skin="frost"]{-webkit-backdrop-filter:blur(20px) saturate(115%);backdrop-filter:blur(20px) saturate(115%);border-color:rgb(255 255 255/65%)}
/* 液态：轻模糊 + 亮边高光（网页做不出 iOS 的边缘折射，这是近似） */
.desk-widget-inner.w-glass.w-glass[data-skin="liquid"]{-webkit-backdrop-filter:blur(4px) saturate(120%) brightness(1.04);backdrop-filter:blur(4px) saturate(120%) brightness(1.04);border-color:rgb(255 255 255/35%);
  box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/95%),inset -1px -1px 0 rgb(255 255 255/45%),inset 0 0 18px rgb(255 255 255/35%),inset 0 -10px 22px rgb(255 255 255/18%),0 12px 30px -8px rgb(40 60 90/26%)}
.desk-widget-inner.w-glass.w-glass[data-skin="liquid"]::before{display:block;left:10%;right:10%;top:1px;height:14px;border-radius:999px;background:linear-gradient(180deg,rgb(255 255 255/55%),rgb(255 255 255/0%));opacity:1}
/* 透明：没有底，颜色给文字 */
.desk-widget-inner.w-glass.w-glass[data-skin="clear"]{background:none;border-color:transparent;box-shadow:none;--w-ink:var(--sk-text);--w-ink2:color-mix(in srgb,var(--sk-text) 82%,transparent);color:var(--w-ink)}
.desk-widget-inner.w-glass[data-ink="clear-light"]{text-shadow:0 1px 8px rgb(20 30 45/45%)}
.desk-widget-inner.w-glass[data-ink="clear-dark"]{text-shadow:0 1px 8px rgb(255 255 255/70%)}
.desk-widget-inner.w-glass[data-skin][data-ink="light"]{--w-ink:#FFFFFF;--w-ink2:rgb(255 255 255/80%);color:var(--w-ink)}
.desk-widget-inner.w-glass[data-skin][data-ink="dark"]{--w-ink:#2F3A48;--w-ink2:rgb(47 58 72/72%);color:var(--w-ink)}
/* 降低透明效果（低端机）：毛玻璃 / 液态降成半透明 */
html.desk-reduce-glass .desk-widget-inner.w-glass[data-skin]{-webkit-backdrop-filter:none!important;backdrop-filter:none!important}

/* ── 组件编辑弹窗（长按组件）：居中，上方实时预览 ── */
.sheet-ov.w-edit-ov{align-items:center;padding:16px}
.sheet.w-edit{max-width:380px;border-radius:28px;border-bottom:1px solid rgb(255 255 255/40%);padding:18px 18px 16px;max-height:calc(100dvh - 32px);background:color-mix(in srgb,var(--surface) 90%,transparent);box-shadow:0 24px 50px rgb(30 45 70/26%);animation:fadeIn .18s ease-out}
.w-edit-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.w-edit-head h2{font-family:var(--font-display);font-size:17px;font-weight:600;color:var(--ink);margin:0}
.w-edit-x{width:32px;height:32px;border:none;border-radius:50%;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--pri) 13%,transparent);color:var(--ink2);cursor:pointer}
.w-edit-x svg{width:15px;height:15px}
.w-edit-stage{position:relative;border-radius:22px;overflow:hidden;padding:20px 12px;isolation:isolate}
.w-edit-stage-slot{position:relative;z-index:1;display:flex;justify-content:center;align-items:flex-start;pointer-events:none}
.w-edit-slot{flex-shrink:0;transform-origin:top center}
.w-edit-slot>.desk-widget-inner{height:100%}
.w-edit-sec{display:flex;justify-content:space-between;align-items:center;gap:8px;margin:14px 2px 8px;font-size:12px;color:var(--ink2)}
.w-edit-seg{margin-left:0}
.w-edit-seg:not(.sm){display:flex}
.w-edit-seg:not(.sm) button{flex:1}
.w-edit-seg.sm button{padding:4px 12px;font-size:12px}
.w-edit-link{border:none;background:none;padding:0;font-family:inherit;font-size:12px;color:var(--accent-text,var(--pri-deep));cursor:pointer}
.w-edit-hint{font-size:11.5px;color:var(--ink3,var(--ink2))}
.w-edit-val{font-variant-numeric:tabular-nums}
.w-edit-texs{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.w-edit-tex{border:none;background:none;padding:0;font-family:inherit;display:flex;flex-direction:column;align-items:center;gap:5px;font-size:11.5px;color:var(--ink2);cursor:pointer}
.w-edit-tex.active{color:var(--ink)}
.w-edit-tex-box{display:block;width:100%;height:50px;box-sizing:border-box;padding:3px;border-radius:14px;border:1.5px solid transparent;background:rgb(255 255 255/50%)}
.w-edit-tex.active .w-edit-tex-box{border-color:var(--pri-deep);background:var(--surface)}
.w-edit-tex-wp{position:relative;display:block;width:100%;height:100%;border-radius:10px;overflow:hidden;background:linear-gradient(180deg,#E9C6B4 50%,#9CB3D4 50%)}
.w-edit-tex-wp::after{content:"";position:absolute;left:0;right:0;top:50%;bottom:0;background:repeating-linear-gradient(180deg,rgb(255 255 255/35%) 0 1px,transparent 1px 5px)}
.w-edit-tex-wp i{position:absolute;inset:8px 11px;z-index:1;border-radius:7px}
.w-edit-tex-wp .tx-clear{border:1px dashed rgb(255 255 255/90%)}
.w-edit-tex-wp .tx-semi{background:rgb(255 255 255/45%);border:1px solid rgb(255 255 255/70%)}
.w-edit-tex-wp .tx-frost{background:rgb(255 255 255/40%);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid rgb(255 255 255/70%)}
.w-edit-tex-wp .tx-liquid{background:rgb(255 255 255/12%);-webkit-backdrop-filter:blur(1.5px) saturate(120%);backdrop-filter:blur(1.5px) saturate(120%);box-shadow:inset 1px 1px 0 #fff,inset -1px -1px 0 rgb(255 255 255/50%),inset 0 0 8px rgb(255 255 255/40%)}
.w-edit-sws{display:flex;flex-wrap:wrap;gap:10px;padding:2px}
.w-edit-sw{position:relative;width:30px;height:30px;padding:0;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;overflow:hidden;font-size:15px;color:var(--ink2);box-shadow:inset 0 0 0 2px rgb(255 255 255/85%),0 2px 5px rgb(60 80 110/16%)}
.w-edit-sw.active{outline:2px solid var(--pri-deep);outline-offset:2px}
.w-edit-sw-add{background:var(--surface)}
.w-edit-sw-add input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer;border:none;padding:0}
.w-edit-range{-webkit-appearance:none;appearance:none;display:block;width:100%;height:6px;margin:6px 0 2px;border-radius:4px;outline:none;background:linear-gradient(90deg,color-mix(in srgb,var(--sk-a) 15%,transparent),var(--sk-b))}
.w-edit-range::-webkit-slider-thumb{-webkit-appearance:none;width:20px;height:20px;border-radius:50%;background:#fff;box-shadow:0 2px 6px rgb(60 80 110/30%);cursor:pointer}
.w-edit-range::-moz-range-thumb{width:20px;height:20px;border:none;border-radius:50%;background:#fff;box-shadow:0 2px 6px rgb(60 80 110/30%);cursor:pointer}
.w-edit-more{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:16px;padding-top:10px;border-top:1px solid var(--line-soft,rgb(0 0 0/6%))}
.w-edit-more button{display:flex;align-items:center;gap:5px;padding:5px 0;border:none;background:none;font-family:inherit;font-size:12.5px;color:var(--ink2);cursor:pointer}
.w-edit-more button svg{width:14px;height:14px}
.w-edit-more button.danger{color:var(--coral-text,#C0686B)}
.w-edit-btns{display:flex;gap:10px;margin-top:14px}
.w-edit-btns button{flex:1;padding:11px 0;border:none;border-radius:14px;font-family:inherit;font-size:14px;cursor:pointer;background:color-mix(in srgb,var(--pri) 15%,transparent);color:var(--ink2)}
.w-edit-btns button.ok{background:var(--surface);color:var(--ink);font-weight:600;box-shadow:0 4px 12px -2px color-mix(in srgb,var(--pri-deep) 28%,transparent)}

/* 添加组件：整页（不是底部弹窗），毛玻璃盖在桌面上 */
.sheet-ov.w-panel-ov{padding:0;align-items:stretch;justify-content:center;background:rgb(0 0 0/12%)}
.sheet.w-panel{height:100%;max-height:none;border-radius:0;border:none;display:flex;flex-direction:column;padding:calc(10px + env(safe-area-inset-top,0px)) 16px calc(10px + var(--sab));background:color-mix(in srgb,var(--surface) 74%,transparent);animation:fadeIn .2s ease-out}
.w-panel-top{display:flex;align-items:center;gap:10px;margin:4px 0 2px}
.w-panel-back{width:36px;height:36px;flex-shrink:0;border:none;border-radius:50%;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--surface) 80%,transparent);color:var(--ink);box-shadow:0 2px 8px -3px color-mix(in srgb,var(--pri-deep) 40%,transparent);cursor:pointer}
.w-panel-back svg{width:18px;height:18px}
.w-panel-title{font-family:var(--font-display);font-weight:500;font-size:20px;margin:0}
.w-panel-cats{display:flex;gap:8px;margin:12px 0;overflow-x:auto;scrollbar-width:none;flex-shrink:0}
.w-panel-cats button{flex-shrink:0;border:none;border-radius:999px;padding:6px 14px;font-family:inherit;font-size:12.5px;background:color-mix(in srgb,var(--pri) 13%,transparent);color:var(--ink2);cursor:pointer}
.w-panel-cats button.active{background:var(--surface);color:var(--ink);box-shadow:0 2px 6px -3px color-mix(in srgb,var(--pri-deep) 55%,transparent),inset 0 0 0 1px color-mix(in srgb,var(--pri-deep) 22%,transparent)}
.w-panel-list{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:12px;padding-bottom:6px}
.w-panel-card{border-radius:22px;padding:12px;background:color-mix(in srgb,var(--surface) 55%,transparent);border:1px solid rgb(255 255 255/45%)}
.w-panel-head{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.w-panel-head b{flex:1;font-size:14px;font-weight:600;color:var(--ink)}
.w-panel-sizes.ds-seg{margin-left:0;padding:2px;border-radius:11px}
.w-panel-sizes.ds-seg button{padding:3px 9px;font-size:11.5px;border-radius:9px}
.w-panel-add{flex-shrink:0;width:32px;height:32px;border:none;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--surface);color:var(--pri-deep);box-shadow:0 3px 10px -3px color-mix(in srgb,var(--pri-deep) 45%,transparent),inset 0 0 0 1px color-mix(in srgb,var(--pri-deep) 14%,transparent);cursor:pointer}
.w-panel-add svg{width:16px;height:16px;stroke-width:2.2}
.w-panel-add.done{background:transparent;box-shadow:none;color:var(--mist);cursor:default}
.w-panel-preview{display:flex;gap:10px;justify-content:center;pointer-events:none;user-select:none}
.w-panel-slot{flex-shrink:0;max-width:100%}
.w-panel-slot>.desk-widget-inner{height:100%}
.w-panel-note{margin:8px 2px 0;font-size:11.5px;color:var(--ink2)}
.w-panel-frame{border:none;background:none;padding:0 2px;font-family:inherit;font-size:11.5px;color:var(--ink2);cursor:pointer}
.w-panel-frame.active{color:var(--ink);font-weight:700;text-decoration:underline;text-underline-offset:3px}

/* ── 应用中心 v2 (docs/APP_CENTER_REDESIGN.md): 桌面层。图标是桌面同款 v2 玻璃图标（.dock-icon 底座），颜色全部跟主题变量；
   暗（.icons-on-dark）由 initAppCenter 按桌面壁纸的判断加到 #desk-library-body 上 ── */
#desk-library-body{position:relative;display:flex;flex-direction:column;height:100%;overflow:hidden;background:var(--bg);color:var(--ink)}
.ac-bg{position:absolute;inset:-40px;z-index:0;filter:blur(26px);pointer-events:none}
.ac-bg .wp-layer{position:absolute;inset:0}
.ac-veil{position:absolute;inset:0;z-index:0;background:rgb(232 238 245/35%);pointer-events:none}
.icons-on-dark .ac-veil{background:rgb(14 20 32/45%)}
/* 没设壁纸：主题底色晕染 */
#desk-library-body.ac-nowall .ac-bg,#desk-library-body.ac-nowall .ac-veil{display:none}
#desk-library-body.ac-nowall{background:radial-gradient(70% 30% at 15% 5%,color-mix(in srgb,var(--pri-pale) 90%,#fff),transparent 70%),radial-gradient(60% 30% at 90% 60%,color-mix(in srgb,var(--pri) 25%,transparent),transparent 70%),var(--bg)}
#desk-library-body.ac-nowall.icons-on-dark{background:radial-gradient(70% 30% at 15% 5%,color-mix(in srgb,var(--pri-pale) 45%,transparent),transparent 70%),radial-gradient(60% 30% at 90% 60%,color-mix(in srgb,var(--pri) 12%,transparent),transparent 70%),var(--bg)}

.ac-top{position:relative;z-index:2;flex-shrink:0;display:flex;align-items:center;gap:12px;padding:8px 16px}
.ac-round{flex-shrink:0;width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;border:1px solid rgb(255 255 255/90%);background:rgb(255 255 255/62%);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:0 4px 12px -4px color-mix(in srgb,var(--pri-deep) 28%,transparent);color:var(--ink);cursor:pointer}
.ac-round svg{width:20px;height:20px}
#desk-library-body .ac-title{flex:1;min-width:0;margin:0}
.ac-pill{flex-shrink:0;border-radius:999px;padding:8px 16px;font-family:inherit;font-size:13px;cursor:pointer;border:1px solid rgb(255 255 255/90%);background:rgb(255 255 255/62%);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:var(--ink);box-shadow:0 4px 12px -4px color-mix(in srgb,var(--pri-deep) 28%,transparent)}
.ac-pill.is-done{border-color:transparent;background:linear-gradient(180deg,color-mix(in srgb,var(--pri) 80%,#fff),var(--pri));color:var(--on-pri,#fff);box-shadow:inset 0 1px 0 rgb(255 255 255/50%),0 6px 14px color-mix(in srgb,var(--pri-deep) 25%,transparent)}
.ac-scroll{position:relative;z-index:1;flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:14px;padding:4px 16px calc(24px + var(--sab))}
.ac-note{margin:0 4px;display:flex;gap:6px;align-items:flex-start;font-size:11.5px;line-height:1.55;color:var(--ink2)}
.ac-note[hidden]{display:none}
.ac-note svg{flex-shrink:0;width:14px;height:14px;margin-top:1px}
.ac-search{position:relative;display:block;flex-shrink:0;height:44px;border-radius:999px;border:1px solid rgb(255 255 255/90%);background:rgb(255 255 255/62%);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:var(--ink2)}
.ac-search svg{position:absolute;left:16px;top:50%;width:17px;height:17px;margin-top:-8.5px;pointer-events:none}
/* the input fills the whole pill, so the project's keyboard focus ring (index.html, 8A) follows the pill's outline */
#desk-library-body .ac-search .desk-library-search{display:block;width:100%;height:100%;box-sizing:border-box;padding:0 16px 0 42px;border:none;background:none;box-shadow:none;border-radius:999px;font-family:inherit;font-size:14px;color:var(--ink)}
#app-center-list{display:flex;flex-direction:column;gap:18px}
.ac-section{display:flex;flex-direction:column;gap:8px}
.ac-head{display:flex;align-items:baseline;justify-content:space-between;padding:0 6px}
.ac-head h2{margin:0;font-family:var(--font-display);font-size:15px;font-weight:500;color:var(--ink)}
.ac-head span{font-size:11.5px;color:var(--ink2)}
.ac-card{padding:14px 6px 8px;border-radius:22px;border:1px solid rgb(255 255 255/85%);background:rgb(255 255 255/48%);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);box-shadow:inset 0 1px 0 #fff,0 14px 28px -16px color-mix(in srgb,var(--pri-deep) 38%,transparent)}
.ac-grid{display:grid;grid-template-columns:repeat(4,1fr);row-gap:12px}
.ac-cell{display:flex;flex-direction:column;align-items:center;gap:6px;min-width:0;padding:0 0 4px;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;touch-action:manipulation;border-radius:14px}
.ac-icon-wrap{position:relative;display:block}
.ac-icon{width:54px;height:54px;border-radius:calc(var(--icon-radius,19px) * .9)}
.ac-name{max-width:100%;font-size:11.5px;line-height:1.25;color:var(--ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ac-dockbar{position:absolute;left:50%;bottom:-7px;width:14px;height:3px;margin-left:-7px;border-radius:2px;background:color-mix(in srgb,var(--pri-deep) 60%,transparent)}
/* 还没放到桌面的：半透明 + 虚线边 */
.ac-cell.is-hidden .ac-icon{opacity:.55;border:1px dashed color-mix(in srgb,var(--pri-deep) 40%,transparent)}
/* 整理模式 */
/* 整理: icons wiggle like the desktop's edit mode (same keyframes), each one offset so they do not swing in step; the +/- badge sits outside the icon and stays still, so it is easy to hit */
.ac-cell.manage .ac-icon{animation:deskJiggle .3s ease-in-out infinite;animation-delay:calc(var(--ac-i,0) * -47ms);transform-origin:50% 50%}
/* entering 整理: the +/- badges pop in one after another (only on that render, see appCenterSetManage) */
@keyframes acBadgeIn{from{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}
.ac-entering .ac-badge{animation:acBadgeIn .26s cubic-bezier(.3,1.5,.5,1) backwards;animation-delay:calc(var(--ac-i,0) * 18ms)}
.ac-note:not([hidden]){animation:moPageIn var(--mo-slow,190ms) var(--mo-ease-out,ease-out) backwards}
.ac-badge{position:absolute;top:-6px;left:-6px;z-index:3;width:20px;height:20px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 2px 6px rgb(0 0 0/18%)}
.ac-badge::before{content:"";position:absolute;inset:-8px;border-radius:50%}
.ac-badge svg{width:12px;height:12px;stroke-width:2.4}
.ac-badge.minus{background:var(--surface-alt);color:var(--ink2)}
.ac-badge.plus{background:var(--pri-deep);color:var(--on-pri-deep,#fff)}
/* 长按 / 点击菜单：整页模糊，图标原位浮起，玻璃菜单从图标下方长出来 */
.ac-menu-ov{position:absolute;inset:0;z-index:20;background:rgb(232 238 245/25%);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;transition:opacity .18s ease}
.ac-menu-ov.show{opacity:1}
.ac-lift{position:absolute;display:flex;flex-direction:column;align-items:center;gap:6px;transform:scale(1.08);transform-origin:50% 0}
.ac-lift .ac-icon{box-shadow:inset 0 1.5px 0 #fff,0 18px 30px -8px color-mix(in srgb,var(--pri-deep) 45%,transparent)}
.ac-menu{position:absolute;width:240px;border-radius:20px;border:1px solid rgb(255 255 255/90%);background:rgb(255 255 255/62%);-webkit-backdrop-filter:blur(24px) saturate(150%);backdrop-filter:blur(24px) saturate(150%);box-shadow:inset 0 1px 0 #fff,0 22px 40px -16px color-mix(in srgb,var(--pri-deep) 45%,transparent);overflow:hidden;opacity:0;transform:scale(.6);transform-origin:var(--ac-origin,50% 0);transition:transform .22s cubic-bezier(.2,.9,.3,1.1),opacity .16s ease}
.ac-menu-ov.show .ac-menu{opacity:1;transform:none}
.ac-menu-head{padding:14px 16px 12px}
.ac-menu-head b{font-family:var(--font-display);font-size:15px;font-weight:500;color:var(--ink)}
.ac-menu-head em{margin-left:8px;font-style:normal;font-size:11px;color:var(--ink2)}
.ac-menu-head span{display:block;margin-top:4px;font-size:12px;line-height:1.45;color:var(--ink2)}
.ac-menu-row{width:100%;height:46px;padding:0 16px;display:flex;align-items:center;justify-content:space-between;border:none;border-top:1px solid color-mix(in srgb,var(--ink) 9%,transparent);background:none;font-family:inherit;font-size:14px;color:var(--ink);text-align:left;cursor:pointer}
.ac-menu-row.primary{color:var(--accent-text);font-weight:500}
.ac-menu-row svg{width:18px;height:18px;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;color:var(--ink2)}
.ac-menu-row.primary svg{color:var(--accent-text)}
.app-center-empty{display:flex;flex-direction:column;align-items:center;gap:10px;margin:40px 0;color:var(--ink2)}
.ac-empty-ill{width:64px;height:64px;border-radius:50%;background:rgb(255 255 255/55%);display:flex;align-items:center;justify-content:center}
.ac-empty-ill svg{width:26px;height:26px}
.app-center-empty p{margin:0;font-size:13px}
@media (prefers-reduced-motion:reduce){.ac-menu,.ac-menu-ov{transition:none}}

/* 应用中心 · 深色（及暗壁纸）：与桌面深色版一致 —— 深色玻璃卡、白线条图标（.icons-on-dark 底座）、深色菜单 */
.icons-on-dark .ac-round,.icons-on-dark .ac-pill,.icons-on-dark .ac-search{background:rgb(255 255 255/10%);border-color:rgb(255 255 255/16%);color:#EEF1F6;box-shadow:none}
.icons-on-dark .ac-pill.is-done{border-color:transparent;background:linear-gradient(180deg,color-mix(in srgb,var(--pri) 80%,#fff),var(--pri));color:var(--on-pri,#fff)}
.icons-on-dark #desk-library-body .ac-title,.icons-on-dark .ac-title,#desk-library-body.icons-on-dark .ac-title{color:#EEF1F6}
#desk-library-body.icons-on-dark .desk-library-search{color:#EEF1F6}
.icons-on-dark .ac-card{background:rgb(255 255 255/7%);border-color:rgb(255 255 255/14%);box-shadow:0 14px 28px -16px rgb(0 0 0/50%)}
.icons-on-dark .ac-head h2,.icons-on-dark .ac-menu-head b{color:#EEF1F6}
.icons-on-dark .ac-name{color:#EEF1F6}
.icons-on-dark .ac-dockbar{background:var(--pri)}
.icons-on-dark .ac-cell.is-hidden .ac-icon{border-color:rgb(255 255 255/30%)}
.icons-on-dark .ac-badge.plus{background:var(--pri)}
.icons-on-dark .ac-menu-ov{background:rgb(0 0 0/35%)}
.icons-on-dark .ac-menu{background:rgb(40 44 54/72%);border-color:rgb(255 255 255/14%);color:#EEF1F6;box-shadow:0 22px 40px -16px rgb(0 0 0/60%)}
.icons-on-dark .ac-menu-row{color:#EEF1F6;border-top-color:rgb(255 255 255/10%)}
.icons-on-dark .ac-menu-row svg,.icons-on-dark .ac-menu-head em,.icons-on-dark .ac-menu-head span{color:rgb(238 241 246/70%)}
.icons-on-dark .ac-empty-ill{background:rgb(255 255 255/10%)}

/* ── 桌面修正 2026-10-13 ──
   1) 编辑模式下组件内部不接手指（照片 img 原生拖拽 / 组件里的按钮会吞掉拖动），整块组件跟着手指走 */
.desk-root img{-webkit-user-drag:none;user-select:none}
.desk-root.editing .desk-widget-inner,.desk-root.editing .desk-widget-inner *{pointer-events:none}
/* 2) 桌面文字（图标名字 / Dock 名字 / 日期）跟着壁纸自动换颜色：theme-engine pickTone 量壁纸放字的地方，
      偏亮才用深字，其余用白字加阴影（像手机桌面）；壁纸设置里「文字颜色」选了浅色/深色就按选的来。名字一律加粗。 */
#v-home .desk-item.desk-app .app-btn,#v-home .desk-dock-item .app-btn{font-weight:600}
#v-home[data-wall-tone="light"] .desk-item.desk-app .app-btn,#v-home[data-wall-tone="light"] .desk-dock-item .app-btn,#v-home[data-wall-tone="light"] .home-date{color:#fff;text-shadow:0 1px 2px rgb(20 35 55/50%),0 0 8px rgb(20 35 55/25%)}
#v-home[data-wall-tone="dark"] .desk-item.desk-app .app-btn,#v-home[data-wall-tone="dark"] .desk-dock-item .app-btn{color:#1D232B;text-shadow:0 0 3px rgb(255 255 255/90%),0 0 8px rgb(255 255 255/60%)}
/* 3) 时钟一点立体感：上沿一道亮边 + 下面 1.5px 的“厚度” + 一层很淡的落影。只加在整体上，不改字体和玻璃质感 */
.glass-clock{filter:drop-shadow(0 -1px 0 rgb(255 255 255/55%)) drop-shadow(0 1.5px 0 rgb(60 85 120/22%)) drop-shadow(0 6px 12px rgb(40 60 90/18%))}
/* focus polish (hand-written, keep LAST): 应用中心 App 搜索 - same bug/fix as character.css's search box.
   index.html's global input:focus rule draws a square border+glow directly on the <input>, inside this
   rounded pill. Suppress it and ring the pill instead via :focus-within. */
#desk-library-body .ac-search .desk-library-search{-webkit-appearance:none;appearance:none}
#desk-library-body .ac-search .desk-library-search:focus{outline:none!important;border-color:transparent!important;box-shadow:none!important}
#desk-library-body .ac-search:focus-within{box-shadow:0 0 0 3px color-mix(in srgb,var(--pri) 22%,transparent)}

/* ── 小组件第三批（claude/widgets-batch3-quick-say-2026-10-14.md）
   打开即查看：组件被点开时（deskWidgetSetOpen），展开的内容可以超出组件、盖住旁边，收起后还原。
   配色：applyDeskPalette 把 --wp-* 写在组件容器上，纸张类组件的 CSS 只读这些变量。 ── */
.desk-widget{position:relative}
.desk-widget.w-open{z-index:30}
.desk-widget.w-open .desk-widget-inner.w-glass,.desk-widget-inner.w-glass.w-open{overflow:visible}
.w-edit-sw.w-edit-pal{border:1px solid rgb(0 0 0/8%)}
.w-edit-sw.w-edit-pal.active{outline:2px solid var(--pri-deep);outline-offset:2px}

/* ───────── 快捷一句 (小组件第三批, 定稿 QuickB4 / QuickHint) ─────────
   桌面上：和 App 图标一样大的染色玻璃方块（该动作的线条色，约 50–62% 浓度，轻模糊）+ 下面的名字。
   编辑弹窗：半透明毛玻璃，透出壁纸，有厚度（左上亮边、右下暗边、内发光、多层投影）。 */
.desk-widget-inner.qk-cell,.desk-widget-inner.qk-cell[data-size="small"]{width:100%;aspect-ratio:auto;padding:0;background:none;border:0;box-shadow:none;border-radius:0;overflow:visible}
.qk-btn{width:100%;border:none;background:transparent;padding:0;display:flex;flex-direction:column;align-items:center;gap:6px;font-family:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.5,.5,1)}
.qk-btn:active{transform:scale(.9,.88);transition:transform .1s ease-out}
.qk-tile{position:relative;width:var(--ic,64px);height:var(--ic,64px);border-radius:var(--icon-radius,19px);display:flex;align-items:center;justify-content:center;color:var(--qk-c);
  background:linear-gradient(160deg,rgba(var(--qk-t),.5),rgba(var(--qk-t),.62));-webkit-backdrop-filter:blur(5px) saturate(160%);backdrop-filter:blur(5px) saturate(160%);
  border:1px solid rgb(255 255 255/65%);box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/90%),inset -1px -1px 0 rgb(255 255 255/30%),0 8px 18px -8px rgb(30 48 72/40%)}
.qk-ic{width:26px;height:26px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.qk-lbl{font-size:11.5px;font-weight:600;color:var(--ink);text-shadow:0 0 3px rgb(255 255 255/95%),0 0 8px rgb(255 255 255/75%);white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
#v-home.icons-on-dark .qk-lbl{color:#EEF1F6;text-shadow:0 1px 4px rgb(0 0 0/35%)}
html[data-ui-lang="en"] .qk-lbl{font-size:10.5px}
.qk-tile.pop{animation:qkPop .6s linear both}
.qk-tile.nope{animation:qkNo .45s ease both}
@keyframes qkPop{0%{transform:scale(.9,.89)}25%{transform:scale(1.07,1.03)}45%{transform:scale(.98,1.03)}65%{transform:scale(1.015,.99)}100%{transform:scale(1)}}
@keyframes qkNo{0%,100%{transform:translateX(0)}20%{transform:translateX(-4px) rotate(-3deg)}40%{transform:translateX(4px) rotate(3deg)}60%{transform:translateX(-2px) rotate(-1.5deg)}80%{transform:translateX(2px)}}
/* 超频提示：方块上方的玻璃气泡；第一列 / 最后一列贴边，不被屏幕切掉 */
.qk-tip{position:absolute;bottom:100%;margin-bottom:8px;z-index:40;white-space:nowrap;padding:8px 12px;border-radius:16px;font-size:12.5px;color:#2F3D4B;pointer-events:none;
  background:rgb(255 255 255/30%);-webkit-backdrop-filter:blur(18px) saturate(130%);backdrop-filter:blur(18px) saturate(130%);border:1px solid rgb(255 255 255/60%);
  box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/85%),inset -1px -1px 0 rgb(255 255 255/30%),0 10px 24px -10px rgb(30 48 72/40%);--tx:-50%;left:50%;animation:qkTip 2.4s ease both}
.qk-tip[data-edge="l"]{left:0;--tx:0px}
.qk-tip[data-edge="r"]{left:auto;right:0;--tx:0px}
@keyframes qkTip{0%{opacity:0;transform:translate(var(--tx),8px) scale(.8)}12%{opacity:1;transform:translate(var(--tx),-2px) scale(1.04)}20%{transform:translate(var(--tx),0) scale(1)}85%{opacity:1;transform:translate(var(--tx),0)}100%{opacity:0;transform:translate(var(--tx),-6px)}}
/* 顶部玻璃通知：「Ghost 回复了你的晚安」 */
.qk-banner{position:fixed;left:12px;right:12px;top:calc(env(safe-area-inset-top,0px) + 14px);z-index:900;display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:22px;text-align:left;font-family:inherit;color:#2F3D4B;cursor:pointer;
  background:rgb(255 255 255/30%);-webkit-backdrop-filter:blur(18px) saturate(130%);backdrop-filter:blur(18px) saturate(130%);border:1px solid rgb(255 255 255/60%);
  box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/85%),inset -1px -1px 0 rgb(255 255 255/30%),0 10px 24px -10px rgb(30 48 72/40%);animation:qkBanner 3.3s ease both}
.qk-banner .w-av{width:38px;height:38px;flex-shrink:0;border:2px solid rgb(255 255 255/90%)}
.qk-banner-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}
.qk-banner-txt b{font-size:14px;font-weight:600}
.qk-banner-txt span,.qk-banner-t{font-size:12.5px;color:#44546A}
.qk-banner-t{font-size:12px;flex-shrink:0}
@keyframes qkBanner{0%{opacity:0;transform:translateY(-24px) scale(.96)}10%{opacity:1;transform:translateY(2px)}16%{transform:none}88%{opacity:1;transform:none}100%{opacity:0;transform:translateY(-16px)}}

/* 编辑弹窗 */
.sheet-ov.qk-ov{align-items:center;justify-content:center;padding:16px;background:rgb(30 48 72/6%)}
.qk-glass{position:relative;background:linear-gradient(160deg,rgb(255 255 255/38%),rgb(255 255 255/16%) 55%,rgb(255 255 255/26%));-webkit-backdrop-filter:blur(28px) saturate(130%);backdrop-filter:blur(28px) saturate(130%);border:1px solid rgb(255 255 255/50%);
  box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/80%),inset -1px -1px 0 rgb(255 255 255/30%),inset 0 0 28px rgb(255 255 255/22%),0 2px 4px rgb(30 48 72/6%),0 14px 26px -14px rgb(30 48 72/30%),0 40px 70px -28px rgb(30 48 72/50%)}
.qk-glass::before{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:linear-gradient(135deg,rgb(255 255 255/42%) 0%,rgb(255 255 255/0%) 32%,rgb(255 255 255/0%) 72%,rgb(255 255 255/20%) 100%)}
.qk-glass::after{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:linear-gradient(0deg,rgb(30 48 72/7%),rgb(30 48 72/0%) 28%)}
.qk-glass>*{position:relative;z-index:1}
.qk-in{position:relative;overflow:hidden;background:rgb(255 255 255/28%);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid rgb(255 255 255/55%);box-shadow:inset 1px 1px 0 rgb(255 255 255/85%),inset -1px -1px 0 rgb(255 255 255/25%),0 8px 18px -12px rgb(30 48 72/35%)}
.qk-ed{box-sizing:border-box;width:min(370px,100%);max-height:calc(100dvh - 32px);overflow-y:auto;scrollbar-width:none;border-radius:38px;padding:24px 22px 18px;display:flex;flex-direction:column;gap:20px;color:#364554;font-family:var(--font-body,inherit);animation:qkIn .5s cubic-bezier(.34,1.4,.5,1) both}
.qk-ed::-webkit-scrollbar{display:none}
@keyframes qkIn{0%{opacity:0;transform:scale(.92) translateY(10px)}100%{opacity:1;transform:none}}
.qk-head{display:flex;justify-content:space-between;align-items:center}
.qk-head h2{margin:0;font-size:19px;font-weight:600;color:#364554}
.qk-tap{font-family:inherit;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.5,.5,1),background .25s,box-shadow .25s,border-color .25s}
.qk-tap:active{transform:scale(.9,.88)!important;transition:transform .1s ease-out}
.qk-done{width:44px;height:44px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#4E6780;padding:0}
.qk-done svg{position:relative;z-index:1;width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.qk-done.go svg path{stroke-dasharray:24;animation:qkDraw .4s ease .05s both}
@keyframes qkDraw{0%{stroke-dashoffset:24}100%{stroke-dashoffset:0}}
.qk-pv{border-radius:26px;padding:18px;display:flex;align-items:center;gap:16px}
.qk-pv-tile{position:relative;overflow:hidden;width:78px;height:78px;border-radius:24px;flex-shrink:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;color:var(--qk-c)}
.qk-pv-ic{width:24px;height:24px;position:relative;z-index:1}
.qk-pv-lbl{position:relative;z-index:1;font-size:11.5px;color:#44546A}
.qk-pv-name{font-size:17px}
.qk-pv-rule{font-size:12px;color:#44546A;margin-top:3px}
.qk-sec{font-size:12px;color:#44546A;letter-spacing:.5px;margin-bottom:-10px}
.qk-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.qk-opt{position:relative;overflow:hidden;height:84px;border-radius:22px;display:flex;flex-direction:column;align-items:flex-start;justify-content:space-between;padding:14px;text-align:left;
  background:rgb(255 255 255/22%);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgb(255 255 255/55%);box-shadow:inset 1px 1px 0 rgb(255 255 255/85%),inset -1px -1px 0 rgb(255 255 255/20%),0 6px 14px -8px rgb(30 48 72/30%)}
.qk-opt .qk-ic{width:21px;height:21px;color:var(--qk-c);position:relative;z-index:1}
.qk-opt-lbl{position:relative;z-index:1;font-size:13px;color:#44546A}
/* 选中：该动作线条色的半透明染色（预览方块同样） */
.qk-opt.on,.qk-pv-tile{background:rgba(var(--qk-t),.7);border:1px solid rgb(255 255 255/85%);box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/95%),inset -1px -1px 0 rgb(255 255 255/35%),inset 0 0 14px rgb(255 255 255/35%),0 10px 20px -8px rgb(30 48 72/40%)}
.qk-opt.on .qk-opt-lbl{color:#364554;font-weight:600}
.qk-shine{display:none;position:absolute;top:-20%;bottom:-20%;left:0;width:38%;pointer-events:none;z-index:0;background:linear-gradient(90deg,rgb(255 255 255/0%),rgb(255 255 255/75%),rgb(255 255 255/0%))}
.qk-rip{position:absolute;width:12px;height:12px;margin:-6px 0 0 -6px;border-radius:50%;pointer-events:none;z-index:0;background:radial-gradient(circle,rgb(255 255 255/95%) 0%,rgb(255 255 255/0%) 70%);animation:qkRip .6s cubic-bezier(.2,.7,.3,1) forwards}
@keyframes qkRip{0%{transform:scale(0);opacity:.95}100%{transform:scale(22);opacity:0}}
/* 选中方块弹两下 + 一道高光扫过 + 图标跳一下；预览的图标 / 字小幅冒出。两份一样的 keyframes 交替用，才能每次重播 */
.qk-ed[data-n="a"] .qk-opt.go{animation:qkPopA .55s linear both}
.qk-ed[data-n="b"] .qk-opt.go{animation:qkPopB .55s linear both}
.qk-opt.go .qk-shine,.qk-pv-tile.go .qk-shine{display:block;animation:qkShine .6s ease-out .05s both}
.qk-pv-tile.go .qk-shine{animation-duration:.7s}
.qk-opt.go .qk-ic{animation:qkHop .6s ease-out .12s both}
.qk-pv-tile.go{animation:qkPopA .6s linear both}
.qk-pv-tile.go .qk-pv-ic{animation:qkRise .45s ease-out both,qkHop .6s ease-out .25s both}
.qk-pv-tile.go .qk-pv-lbl{animation:qkRise .45s ease-out .06s both}
.qk-pv-txt.go{animation:qkRise .5s ease-out .08s both}
@keyframes qkPopA{0%{transform:scale(.9,.89)}25%{transform:scale(1.07,1.03)}45%{transform:scale(.98,1.03)}65%{transform:scale(1.015,.99)}100%{transform:scale(1)}}
@keyframes qkPopB{0%{transform:scale(.9,.89)}25%{transform:scale(1.07,1.03)}45%{transform:scale(.98,1.03)}65%{transform:scale(1.015,.99)}100%{transform:scale(1)}}
@keyframes qkShine{0%{transform:translateX(-140%) skewX(-18deg)}100%{transform:translateX(260%) skewX(-18deg)}}
@keyframes qkHop{0%{transform:translateY(0) scale(1)}15%{transform:translateY(1px) scale(1.07,.9)}40%{transform:translateY(-6px) scale(.95,1.07) rotate(-6deg)}62%{transform:translateY(0) scale(1.04,.96) rotate(2deg)}80%{transform:translateY(-1px) scale(.99,1.01)}100%{transform:translateY(0) scale(1)}}
@keyframes qkRise{0%{transform:translateY(8px) scale(.7);opacity:0}60%{transform:translateY(-2px) scale(1.06);opacity:1}80%{transform:scale(.98)}100%{transform:none;opacity:1}}
.qk-who{width:100%;border-radius:22px;min-height:60px;display:flex;align-items:center;gap:14px;padding:0 18px;text-align:left}
.qk-who>*{position:relative;z-index:1}
.qk-who .w-av{width:36px;height:36px;flex-shrink:0;border:2px solid rgb(255 255 255/90%)}
.qk-who-name{flex:1;font-size:16px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qk-who-go{font-size:13px;color:#44546A}
.qk-who:disabled{cursor:default}
.qk-who-list{display:flex;gap:10px;overflow-x:auto;scrollbar-width:none;padding:12px 2px 2px;animation:qkRise .35s ease-out both}
.qk-more{display:flex;justify-content:center;align-items:center;gap:10px;font-size:13px;color:#44546A}
.qk-more button{border:none;background:none;font-family:inherit;font-size:13px;color:#44546A;padding:6px 4px;cursor:pointer}
.qk-more button.danger{color:#A0525E}
.qk-more i{font-style:normal;opacity:.5}
/* 降低透明效果：退回不透明 */
html.desk-reduce-glass .qk-glass,html.desk-reduce-glass .qk-in,html.desk-reduce-glass .qk-opt,html.desk-reduce-glass .qk-tile,html.desk-reduce-glass .qk-tip,html.desk-reduce-glass .qk-banner{-webkit-backdrop-filter:none!important;backdrop-filter:none!important}
html.desk-reduce-glass .qk-glass{background:color-mix(in srgb,var(--surface,#F4F7FB) 96%,transparent)}
html.desk-reduce-glass .qk-in,html.desk-reduce-glass .qk-opt:not(.on),html.desk-reduce-glass .qk-tip,html.desk-reduce-glass .qk-banner{background:rgb(255 255 255/88%)}
html.desk-reduce-glass .qk-tile{background:rgb(var(--qk-t))}
@media (prefers-reduced-motion:reduce){.qk-btn,.qk-tap,.qk-tile.pop,.qk-tile.nope,.qk-tip,.qk-banner,.qk-ed,.qk-opt.go,.qk-opt.go .qk-ic,.qk-pv-tile.go,.qk-pv-tile.go *,.qk-pv-txt.go,.qk-done.go svg path,.qk-who-list,.qk-rip{animation:none!important;transition:none!important}.qk-shine{display:none!important}.qk-tip,.qk-banner{opacity:1}}
.desk-widget:has(.qk-tip){z-index:30}

/* ───────── 叠放 (小组件第三批 方案 B, 定稿 StackDesk / StackGlass) ─────────
   桌面上：一张玻璃卡（里面是那个组件自己的样子），底边露两层薄玻璃；右侧小点；新卡带回弹从上 / 下滑入。 */
.desk-widget-inner.stk-cell{position:relative;padding:0;background:none;border:0;box-shadow:none;overflow:visible}
.stk-view{position:absolute;inset:0;overflow:hidden;border-radius:24px}
.stk-card.desk-widget-inner{position:absolute;inset:0;height:auto;padding-right:34px;box-sizing:border-box}
.stk-card.stk-in.up{animation:stkInUp .55s cubic-bezier(.2,.8,.3,1) both}
.stk-card.stk-in.dn{animation:stkInDn .55s cubic-bezier(.2,.8,.3,1) both}
.stk-card.stk-out{pointer-events:none;z-index:0}
.stk-card.stk-out.up{animation:stkOutUp .35s ease-in forwards}
.stk-card.stk-out.dn{animation:stkOutDn .35s ease-in forwards}
@keyframes stkInUp{0%{transform:translateY(60%) scale(.88);opacity:0}55%{transform:translateY(-4%) scale(1.02);opacity:1}75%{transform:translateY(1%) scale(.995)}100%{transform:none;opacity:1}}
@keyframes stkInDn{0%{transform:translateY(-60%) scale(.88);opacity:0}55%{transform:translateY(4%) scale(1.02);opacity:1}75%{transform:translateY(-1%) scale(.995)}100%{transform:none;opacity:1}}
@keyframes stkOutUp{0%{transform:none;opacity:1}100%{transform:translateY(-45%) scale(.86);opacity:0}}
@keyframes stkOutDn{0%{transform:none;opacity:1}100%{transform:translateY(45%) scale(.86);opacity:0}}
.stk-sliver{position:absolute;height:24px;border-radius:0 0 22px 22px;pointer-events:none;background:rgb(255 255 255/28%);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);border:1px solid rgb(255 255 255/55%);border-top:0;box-shadow:inset 0 -1px 0 rgb(255 255 255/60%),0 8px 14px -10px rgb(30 48 72/40%)}
.stk-sliver.s2{left:6%;right:6%;bottom:-14px}
.stk-sliver.s1{left:3%;right:3%;bottom:-7px;background:rgb(255 255 255/36%)}
.stk-dots{position:absolute;right:9px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:2px;z-index:3}
.stk-dot{width:20px;height:20px;display:flex;align-items:center;justify-content:center;border:0;background:none;padding:0;cursor:pointer;-webkit-tap-highlight-color:transparent}
.stk-dot i{display:block;width:6px;height:6px;border-radius:3px;background:rgb(54 69 84/25%);transition:height .35s cubic-bezier(.34,1.5,.5,1),background .35s}
.stk-dot.on i{height:16px;background:rgb(54 69 84/75%)}
.icons-on-dark .stk-dot i{background:rgb(255 255 255/35%)}
.icons-on-dark .stk-dot.on i{background:rgb(255 255 255/90%)}

/* 编辑弹窗：叠起来的预览 + 一排玻璃小方块（4 列，按住拖动排序） */
.stk-pv{border-radius:28px;padding:30px 16px 16px;display:flex;flex-direction:column;align-items:center;gap:14px}
.stk-pile{position:relative;transition:width .4s cubic-bezier(.34,1.4,.5,1),height .4s cubic-bezier(.34,1.4,.5,1)}
.stk-pv-s{position:absolute;height:50px;border-radius:20px;background:rgb(255 255 255/22%);border:1px solid rgb(255 255 255/55%);box-shadow:inset 1px 1px 0 rgb(255 255 255/80%)}
.stk-pv-s.s2{left:28px;right:28px;top:-18px}
.stk-pv-s.s1{left:14px;right:14px;top:-9px;border-radius:22px;background:rgb(255 255 255/30%);border-color:rgb(255 255 255/65%);box-shadow:inset 1px 1px 0 rgb(255 255 255/85%)}
.stk-pv-card{position:absolute;inset:0;border-radius:24px;overflow:hidden;box-shadow:0 12px 24px -12px rgb(30 48 72/40%)}
.stk-pv-card.go{animation:stkPvIn .5s ease-out both}
@keyframes stkPvIn{0%{transform:translateY(26px) scale(.9);opacity:0}60%{transform:translateY(-3px) scale(1.02);opacity:1}100%{transform:none;opacity:1}}
.stk-pv-scale{transform-origin:0 0;pointer-events:none}
.stk-pv-scale>.desk-widget-inner{height:100%}
.stk-pv-card>.w-empty{display:flex;align-items:center;justify-content:center;height:100%;font-size:12px;color:#44546A;background:rgb(255 255 255/40%)}
.stk-pv-dots{display:flex;gap:6px}
.stk-pv-dots i{display:block;width:6px;height:6px;border-radius:3px;background:rgb(78 103 128/30%);transition:width .3s,background .3s}
.stk-pv-dots i.on{width:16px;background:#4E6780}
.stk-sec{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:12px;color:#44546A;letter-spacing:.5px;margin-bottom:-6px}
.stk-sec span:last-child{letter-spacing:0}
.stk-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.stk-tile{position:relative;height:72px;border-radius:20px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;touch-action:none;cursor:grab;user-select:none;-webkit-user-select:none;
  background:rgb(255 255 255/22%);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgb(255 255 255/55%);box-shadow:inset 1px 1px 0 rgb(255 255 255/85%),inset -1px -1px 0 rgb(255 255 255/20%),0 6px 14px -8px rgb(30 48 72/30%);
  transition:transform .4s cubic-bezier(.34,1.4,.5,1),background .25s,box-shadow .25s}
.stk-tile .qk-ic{width:20px;height:20px;color:var(--qk-c)}
.stk-tile-lbl{font-size:12px;color:#44546A}
.stk-tile.on{background:linear-gradient(160deg,rgba(var(--qk-t),.5),rgba(var(--qk-t),.62));-webkit-backdrop-filter:blur(6px) saturate(160%);backdrop-filter:blur(6px) saturate(160%);border:1px solid rgb(255 255 255/80%);box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/90%),inset -1px -1px 0 rgb(255 255 255/30%),0 8px 16px -8px rgb(30 48 72/35%)}
.stk-tile.on .stk-tile-lbl{color:#2F3D4B;font-weight:600}
.stk-tile.drag{z-index:5;cursor:grabbing;transition:background .25s,box-shadow .2s;box-shadow:inset 1.5px 1.5px 0 #fff,0 18px 28px -10px rgb(30 48 72/50%)}
.stk-tile.go{animation:qkPopA .55s linear both}
.stk-tile.off{opacity:.55}
.stk-tile-note{position:absolute;bottom:5px;font-size:9.5px;color:#5B6B7C;white-space:nowrap}
.stk-tile.off .stk-tile-lbl{margin-bottom:8px}
.stk-tile-x{position:absolute;top:-6px;right:-6px;width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0;cursor:pointer;color:#5B6B7C;
  background:rgb(255 255 255/75%);border:1px solid rgb(255 255 255/90%);box-shadow:0 3px 8px -3px rgb(30 48 72/40%);animation:qkRise .3s ease-out both}
.stk-tile-x svg{width:11px;height:11px}
.stk-addlist{display:flex;flex-wrap:wrap;gap:8px;animation:qkRise .35s ease-out both}
.stk-addone{display:flex;align-items:center;gap:8px;height:40px;padding:0 14px 0 10px;border-radius:14px;font-size:13px;color:#364554}
.stk-addone .qk-ic{width:17px;height:17px;color:var(--qk-c);position:relative;z-index:1}
.stk-addone span{position:relative;z-index:1}
.stk-none{font-size:12px;color:#44546A}
.stk-row{display:flex;gap:10px}
.stk-seg{flex:1;display:flex;border-radius:18px;padding:4px}
.stk-seg button{flex:1;height:40px;border:1px solid transparent;border-radius:14px;background:none;font-size:14px;color:#44546A}
.stk-seg button.on{color:#2F3D4B;background:rgb(255 255 255/60%);border-color:rgb(255 255 255/90%);box-shadow:inset 1px 1px 0 #fff,0 4px 10px -4px rgb(30 48 72/30%)}
.stk-addbtn{height:48px;padding:0 16px;border-radius:18px;font-size:14px;color:#4E6780}
.stk-addbtn:disabled{color:#7A8896;cursor:default}
.stk-auto{display:flex;align-items:center;gap:12px;padding:0 2px}
.stk-auto>div{flex:1;min-width:0}
.stk-auto-t{font-size:14.5px}
.stk-auto-s{font-size:12px;color:#44546A;margin-top:2px}
.stk-sw{position:relative;width:52px;height:32px;border-radius:16px;flex-shrink:0;padding:0;cursor:pointer;transition:background .25s;border:1px solid rgb(255 255 255/70%);box-shadow:inset 1px 1px 0 rgb(255 255 255/70%),inset 0 2px 6px rgb(30 48 72/12%);background:rgb(255 255 255/25%)}
.stk-sw.on{background:rgb(126 155 184/75%)}
.stk-sw i{position:absolute;top:3px;left:3px;width:24px;height:24px;border-radius:50%;background:rgb(255 255 255/95%);box-shadow:inset 0 -1px 2px rgb(30 48 72/10%),0 2px 6px rgb(30 48 72/25%);transition:left .45s cubic-bezier(.34,1.5,.5,1)}
.stk-sw.on i{left:23px}
html.desk-reduce-glass .stk-sliver,html.desk-reduce-glass .stk-tile{-webkit-backdrop-filter:none!important;backdrop-filter:none!important}
html.desk-reduce-glass .stk-tile:not(.on){background:rgb(255 255 255/88%)}
html.desk-reduce-glass .stk-tile.on{background:rgb(var(--qk-t))}
@media (prefers-reduced-motion:reduce){.stk-card.stk-in,.stk-card.stk-out,.stk-pv-card.go,.stk-tile,.stk-tile.go,.stk-tile-x,.stk-addlist,.stk-pile,.stk-dot i,.stk-sw,.stk-sw i{animation:none!important;transition:none!important}.stk-card.stk-out{display:none}}

/* ───────── 情书信箱 (小组件第三批, 定稿 Letter3 / LetterSizes) ─────────
   整只航空信封：纸纹 + 斜条纹边 + 火漆印；信纸不透明，信在信封里时看不到字。颜色 = 这封信的信纸（--lt-*）。 */
.lt{position:relative;display:block;width:100%;height:100%;border:0;background:none;padding:0;margin:0;font-family:inherit;color:#364554;text-align:left;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.5,.5,1)}
.lt:active{transform:scale(.96,.94);transition:transform .1s ease-out}
.desk-widget-inner.w-glass:has(>.lt){padding:0}
.lt-cap{font-size:12px;color:#44546A}
.lt-name{font-size:15px;color:#2F3D4B}
.lt-badge{font-size:11px;padding:1px 8px;border-radius:9px;border:1px solid rgb(255 255 255/80%);color:#63464F;background:rgba(240,204,214,.6);transition:color .3s,background .3s;white-space:nowrap}
.lt-badge.read{color:#44546A;background:rgb(255 255 255/45%)}
.lt-fib{background-image:repeating-linear-gradient(0deg,rgba(120,100,80,.03) 0 1px,transparent 1px 3px),repeating-linear-gradient(90deg,rgba(120,100,80,.02) 0 1px,transparent 1px 4px)}
.lt-env{position:absolute;width:var(--ew);height:var(--eh);perspective:calc(var(--ew) * 3);z-index:10;transition:transform .6s cubic-bezier(.34,1.45,.5,1)}
.lt-env.settle{animation:ltSettle .55s ease both}
@keyframes ltSettle{0%{transform:scale(1)}35%{transform:scale(1.06,.96)}60%{transform:scale(.98,1.03)}80%{transform:scale(1.01,.99)}100%{transform:scale(1)}}
.lt-inside{position:absolute;inset:0;border-radius:6px;background-color:var(--lt-in);box-shadow:inset 0 0 0 1px rgb(0 0 0/8%)}
.lt-paper{position:absolute;left:7%;right:7%;top:6px;height:calc(var(--eh) - 12px);border-radius:3px;padding:7px 9px;box-sizing:border-box;font-size:10px;line-height:1.6;color:var(--lt-ink);z-index:2;overflow:hidden;background-color:var(--lt-bg);box-shadow:0 2px 6px rgb(60 40 20/22%);transition:transform .7s cubic-bezier(.34,1.45,.5,1) 0s}
.lt.open .lt-paper{transform:translateY(calc(var(--rise) * -1));transition-delay:.55s}
.lt-paper-txt{display:block;opacity:0;transition:opacity .35s ease 0s}
.lt.open .lt-paper-txt{opacity:1;transition-delay:.9s}
.lt-to{display:block;font-size:.95em;opacity:.7;margin-bottom:2px}
.lt-stripes{position:absolute;inset:0;border-radius:6px;z-index:3;clip-path:polygon(0 0,50% 50%,100% 0,100% 100%,0 100%);background-color:var(--lt-bg);background-image:repeating-linear-gradient(135deg,var(--lt-s1) 0 5px,transparent 5px 10px,var(--lt-s2) 10px 15px,transparent 15px 20px)}
.lt-pocket{position:absolute;inset:4px;border-radius:3px;z-index:3;clip-path:polygon(0 0,50% 50%,100% 0,100% 100%,0 100%);background-color:var(--lt-bg);box-shadow:inset 0 -6px 10px -8px rgb(60 40 20/35%)}
.lt-flap{position:absolute;left:0;right:0;top:0;height:calc(var(--eh) * .55);border-radius:6px 6px 0 0;clip-path:polygon(0 0,100% 0,50% 100%);transform-origin:50% 0;background-color:var(--lt-bg);filter:drop-shadow(0 2px 2px rgb(60 40 20/20%));z-index:4;transition:transform .5s ease .2s,z-index 0s .45s}
.lt.open .lt-flap{transform:rotateX(178deg);z-index:1;transition:transform .5s ease .15s,z-index 0s .4s}
.lt-seal{position:absolute;width:calc(var(--eh) * .3);height:calc(var(--eh) * .3);left:calc(var(--ew) / 2 - var(--eh) * .15);top:calc(var(--eh) * .55 - var(--eh) * .165);border-radius:50% 46% 52% 48%;z-index:5;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 38% 32%,var(--lt-w0) 0%,var(--lt-w1) 45%,var(--lt-w2) 100%);box-shadow:0 2px 3px rgb(40 20 20/40%),inset 0 0 0 3px rgb(0 0 0/15%),inset 1px 1px 2px rgb(255 255 255/40%);transition:transform .45s cubic-bezier(.5,-.4,.6,1.4),opacity .35s ease .1s}
.lt-seal b{font-size:calc(var(--eh) * .12);font-weight:700;color:rgb(255 240 244/85%);text-shadow:0 -1px 0 rgb(0 0 0/35%),0 1px 0 rgb(255 255 255/30%)}
.lt.open .lt-seal{transform:scale(1.25) rotate(-25deg) translateY(-6px);opacity:0}
.lt-hint{transition:opacity .3s ease 0s}
/* 2×2：标题行 + 居中的信封；拆开后信封下沉、信纸升起盖住标题 */
.lt[data-size="square"]{--ew:138px;--eh:90px;--rise:78px}
.lt[data-size="square"] .lt-top{position:absolute;left:16px;right:16px;top:15px;display:flex;justify-content:space-between;align-items:center;z-index:9}
.lt[data-size="square"] .lt-env{left:calc(50% - 69px);top:calc(50% - 40px)}
.lt[data-size="square"].open .lt-env{transform:translateY(14px)}
.lt[data-size="square"] .lt-hint{position:absolute;left:0;right:0;bottom:10px;text-align:center;z-index:9;opacity:0}
.lt[data-size="square"].open .lt-hint{opacity:1;transition-delay:1.1s}
/* 4×2：信封在左，右边一列字 */
.lt[data-size="large"]{--ew:196px;--eh:124px;--rise:92px}
.lt[data-size="large"] .lt-env{left:22px;top:calc(50% - 50px)}
.lt[data-size="large"] .lt-side{position:absolute;right:20px;top:18px;bottom:18px;width:118px;display:flex;flex-direction:column;align-items:flex-end;text-align:right}
.lt[data-size="large"] .lt-name{margin-top:12px;margin-bottom:3px}
.lt[data-size="large"] .lt-hint{margin-top:auto;opacity:.75}
.lt[data-size="large"].open .lt-hint{opacity:1;transition-delay:1.1s}
/* 4×1：小信封斜放在左，信纸从右侧抽出一条 */
.lt[data-size="medium"]{--ew:66px;--eh:42px}
.lt[data-size="medium"] .lt-env{left:18px;top:calc(50% - 21px);transform:rotate(-6deg);z-index:3}
.lt[data-size="medium"].open .lt-env{transform:none}
.lt[data-size="medium"] .lt-seal b{font-size:8px}
.lt-slip{position:absolute;left:52px;top:calc(50% - 18px);height:36px;width:min(230px,calc(100% - 70px));border-radius:4px;padding:0 12px 0 40px;box-sizing:border-box;display:flex;align-items:center;font-size:12px;color:var(--lt-ink);background-color:var(--lt-bg);box-shadow:0 4px 10px -4px rgb(60 40 20/35%);z-index:2;transform-origin:0 50%;
  transform:translateX(-40px) scaleX(.3);opacity:0;transition:transform .7s cubic-bezier(.34,1.45,.5,1) 0s,opacity .3s ease .3s}
.lt.open .lt-slip{transform:none;opacity:1;transition-delay:.5s,.45s}
.lt-slip span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:0;transition:opacity .3s ease 0s}
.lt.open .lt-slip span{opacity:1;transition-delay:1s}
.lt[data-size="medium"] .lt-label{position:absolute;left:100px;top:0;bottom:0;display:flex;flex-direction:column;justify-content:center;transition:opacity .25s}
.lt[data-size="medium"] .lt-label .lt-name{font-size:14px}
.lt[data-size="medium"] .lt-right{position:absolute;right:18px;top:0;bottom:0;display:flex;flex-direction:column;align-items:flex-end;justify-content:center;gap:4px;transition:opacity .25s}
.lt[data-size="medium"].open .lt-label,.lt[data-size="medium"].open .lt-right{opacity:0}
.lt[data-size="medium"] .lt-hint{position:absolute;right:18px;bottom:6px;opacity:0}
.lt[data-size="medium"].open .lt-hint{opacity:1;transition-delay:1.2s}
/* 没有新信：虚线空信封（.lt.lt-empty: 比 .lt 和桌面按钮的统一样式更具体） */
.lt.lt-empty{display:flex;align-items:center;gap:18px;padding:0 20px 0 22px;box-sizing:border-box}
.lt.lt-empty[data-size="large"]{padding:0 20px 0 22px}
.lt-dash{position:relative;flex-shrink:0;width:150px;height:96px;border-radius:8px;border:1.5px dashed rgba(78,103,128,.4);box-sizing:border-box}
.lt-dash svg{position:absolute;inset:0;width:100%;height:100%}
.lt-dash path{fill:none;stroke:rgba(78,103,128,.35);stroke-width:1.3;stroke-dasharray:4 4}
.lt.lt-empty .lt-side{position:static;width:auto;flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-end;text-align:right;align-self:stretch;padding:24px 0 22px}
.lt.lt-empty .lt-name{margin:0}
.lt.lt-empty .lt-cap{margin-top:3px}
.lt-go{margin-top:auto;height:36px;padding:0 14px;border-radius:18px;font-size:12.5px;line-height:36px;color:#63464F;background:rgba(240,204,214,.6);border:1px solid rgb(255 255 255/85%);white-space:nowrap}
.lt.lt-empty[data-size="square"]{flex-direction:column;justify-content:center;gap:0;padding:15px 16px}
.lt.lt-empty[data-size="square"] .lt-dash{width:110px;height:72px;margin-bottom:10px}
.lt.lt-empty[data-size="square"] .lt-side{flex:none;align-items:center;text-align:center;padding:0;align-self:auto}
.lt.lt-empty[data-size="square"] .lt-name{font-size:13px}
.lt.lt-empty[data-size="square"] .lt-cap{display:none}
.lt.lt-empty[data-size="square"] .lt-go{margin-top:6px;height:auto;line-height:1.4;padding:0;background:none;border:0;font-size:12px}
.lt.lt-empty[data-size="medium"]{gap:14px;padding:0 14px 0 18px}
.lt.lt-empty[data-size="medium"] .lt-dash{width:62px;height:40px;border-radius:5px}
.lt.lt-empty[data-size="medium"] .lt-dash svg{display:none}
.lt.lt-empty[data-size="medium"] .lt-side{display:grid;grid-template-columns:1fr auto;grid-template-rows:auto auto;align-items:center;column-gap:10px;text-align:left;padding:0;align-self:center}
.lt.lt-empty[data-size="medium"] .lt-name{grid-column:1;grid-row:1;font-size:14px}
.lt.lt-empty[data-size="medium"] .lt-cap{grid-column:1;grid-row:2;margin:0}
.lt.lt-empty[data-size="medium"] .lt-go{grid-column:2;grid-row:1 / span 2;margin:0;height:34px;line-height:34px;padding:0 12px;font-size:12px;border-radius:17px}
/* 第二次点：信纸飞出成居中弹窗；「收好」飞回组件，「回一封」飘走 */
.lt-veil{position:fixed;inset:0;z-index:950;display:flex;flex-direction:column;align-items:center;justify-content:center;background:rgb(40 60 90/18%);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);animation:ltFade .3s ease both}
.lt-veil.out{animation:ltVeilOut .42s ease .12s both;pointer-events:none}
@keyframes ltFade{from{opacity:0}to{opacity:1}}
@keyframes ltVeilOut{from{opacity:1}to{opacity:0}}
.lt-sheet{box-sizing:border-box;width:min(316px,calc(100vw - 48px));height:min(430px,calc(100dvh - 180px));border-radius:10px;padding:26px 26px 24px;display:flex;flex-direction:column;color:var(--lt-ink);background-color:var(--lt-bg);
  background-image:repeating-linear-gradient(0deg,rgba(120,100,80,.03) 0 1px,transparent 1px 3px),repeating-linear-gradient(180deg,transparent 0 31px,rgba(120,100,80,.10) 31px 32px);background-position:0 0,0 80px;
  box-shadow:0 2px 0 rgb(255 255 255/50%) inset,0 30px 60px -20px rgb(20 30 50/55%);animation:ltSheet .6s cubic-bezier(.2,.8,.3,1) both}
.lt-sheet[data-night="true"]{background-image:repeating-linear-gradient(0deg,rgba(120,100,80,.03) 0 1px,transparent 1px 3px),repeating-linear-gradient(180deg,transparent 0 31px,rgb(255 255 255/8%) 31px 32px)}
@keyframes ltSheet{0%{opacity:0;transform:translateY(40px) scale(.7) rotate(-4deg)}60%{opacity:1;transform:translateY(-6px) scale(1.02) rotate(.5deg)}100%{opacity:1;transform:none}}
.lt-veil.out.tuck .lt-sheet{animation:ltTuck .55s cubic-bezier(.5,0,.6,.4) both}
.lt-veil.out.reply .lt-sheet{animation:ltAway .5s cubic-bezier(.5,0,.7,.4) both}
@keyframes ltTuck{0%{opacity:1;transform:none}25%{transform:translateY(-8px) scale(1.02)}100%{opacity:0;transform:translate(var(--lt-tx,0px),var(--lt-ty,60px)) scale(.28) rotate(-6deg)}}
@keyframes ltAway{0%{opacity:1;transform:none}30%{transform:translateY(8px) scale(.98)}100%{opacity:0;transform:translateY(-120px) scale(.9) rotate(3deg)}}
.lt-sheet-top{display:flex;justify-content:space-between;align-items:baseline;font-size:12px;opacity:.75}
.lt-sheet-to{font-size:14px;margin-top:18px;opacity:.8}
.lt-sheet-body{flex:1;min-height:0;overflow-y:auto;scrollbar-width:none;font-size:15.5px;line-height:32px;margin-top:4px;white-space:pre-line}
.lt-sheet-body::-webkit-scrollbar{display:none}
.lt-sheet-sign{text-align:right;font-size:15px;margin-top:8px}
.lt-btns{display:flex;gap:12px;margin-top:22px}
.lt-veil.out .lt-btns{animation:ltBtnOut .2s ease both}
@keyframes ltBtnOut{to{opacity:0;transform:translateY(12px)}}
.lt-btn{height:48px;padding:0 24px;border-radius:24px;font-family:inherit;font-size:14px;color:#2F3D4B;cursor:pointer;transition:transform .45s cubic-bezier(.34,1.5,.5,1);
  background:linear-gradient(160deg,rgb(255 255 255/40%),rgb(255 255 255/18%) 55%,rgb(255 255 255/28%));-webkit-backdrop-filter:blur(26px) saturate(130%);backdrop-filter:blur(26px) saturate(130%);border:1px solid rgb(255 255 255/55%);box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/80%),inset -1px -1px 0 rgb(255 255 255/30%),0 30px 60px -24px rgb(30 48 72/50%)}
.lt-btn:active{transform:scale(.95,.93);transition:transform .1s ease-out}
.lt-btn.rose{color:#63464F;background:linear-gradient(160deg,rgba(240,204,214,.55),rgba(240,204,214,.75))}
html.desk-reduce-glass .lt-veil,html.desk-reduce-glass .lt-btn{-webkit-backdrop-filter:none!important;backdrop-filter:none!important}
html.desk-reduce-glass .lt-veil{background:rgb(40 60 90/45%)}
html.desk-reduce-glass .lt-btn:not(.rose){background:rgb(255 255 255/90%)}
@media (prefers-reduced-motion:reduce){.lt,.lt *,.lt-veil,.lt-veil *{animation:none!important;transition:none!important}}

/* ───────── 纪念日台历 (小组件第三批, 定稿 AnnivIns：A 极简 / B 手帐) ─────────
   颜色全部来自共用配色 --wp-*（默认奶油杏）；英文小字 Cormorant Garamond，手写 Caveat，数字一律正文衬线（Noto Serif SC）。
   点一下：这一页向上翻起，露出下面「next」那页；再点翻回。 */
.anv{--av-paper:var(--wp-paper,#FCF7EF);--av-paper2:var(--wp-paper2,#FAF7F2);--av-paper3:var(--wp-paper3,#EFE9E0);--av-ink:var(--wp-ink,#3B342C);--av-ink2:var(--wp-ink2,#85776A);--av-acc:var(--wp-acc,#B07E55);--av-line:var(--wp-line,rgba(150,120,90,.32));
  position:relative;display:block;width:100%;height:100%;border:0;background:none;padding:0;margin:0;font-family:inherit;color:var(--av-ink);text-align:left;cursor:pointer;perspective:520px;-webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.5,.5,1)}
.anv:active{transform:scale(.95,.93);transition:transform .1s ease-out}
.desk-widget-inner.w-glass:has(>.anv){padding:0}
.anv span{transition:background-color .4s,color .4s,border-color .4s}
.anv-en{font-family:'Cormorant Garamond',var(--font-display,serif)}
.anv-hand{font-family:'Caveat','Segoe Print','Bradley Hand',cursive}
.anv-num{font-family:'Noto Serif SC','Songti SC',serif;font-weight:400;font-size:46px;line-height:1;color:var(--av-ink)}
.anv-back,.anv-under,.anv-page{position:absolute;left:24px;right:24px;top:30px;border-radius:4px;box-sizing:border-box}
.anv-back{bottom:18px;background:var(--av-paper3);box-shadow:0 2px 0 var(--av-paper3),0 4px 0 var(--av-paper3),0 12px 20px -10px rgb(60 50 40/35%)}
.anv-under{bottom:22px;background:var(--av-paper2);padding:20px 11px 0;display:flex;flex-direction:column;gap:7px;color:var(--av-ink);overflow:hidden}
.anv-page{bottom:22px;z-index:4;background:var(--av-paper);box-shadow:0 1px 3px rgb(60 50 40/12%);display:flex;flex-direction:column;overflow:hidden;
  transform-origin:50% 0;transition:transform .65s cubic-bezier(.34,1.45,.5,1),opacity .3s ease 0s}
.anv.flip .anv-page{transform:rotateX(-165deg);opacity:0;transition:transform .65s cubic-bezier(.5,0,.4,1),opacity .3s ease .35s}
.anv-next{font-style:italic;font-size:13px;color:var(--av-ink2)}
.anv-row{display:flex;align-items:baseline;gap:3px;font-size:11px;min-width:0}
.anv-row>span:first-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.anv-row i{flex:1;min-width:4px;border-bottom:1px dotted var(--av-line);display:block}
.anv-row .anv-en{font-size:13px;flex-shrink:0}
.anv-head{display:flex;justify-content:space-between;gap:6px;padding:12px 12px 0;font-size:9px;letter-spacing:1.5px;color:var(--av-ink2);white-space:nowrap}
.anv-rule{display:block;margin:7px 12px 0;border-top:1px dashed var(--av-line)}
.anv-big{display:flex;flex-direction:column;align-items:center;margin-top:auto}
.anv-unit{font-style:italic;font-size:12px;color:var(--av-ink2);margin-top:1px}
.anv-sub{display:block;text-align:center;font-size:10.5px;color:var(--av-ink2);margin:7px 8px auto;font-weight:300;letter-spacing:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.anv-hole{position:absolute;top:24px;width:7px;height:12px;border-radius:4px;z-index:6;border:1.5px solid var(--av-ink);border-bottom:0;box-sizing:border-box}
.anv-hole.l{left:calc(24px + 32px)}
.anv-hole.r{right:calc(24px + 32px)}
/* B 手帐：点阵纸、和纸胶带、手写字、波浪线、圆章 */
.anv[data-style="journal"] .anv-back,.anv[data-style="journal"] .anv-under,.anv[data-style="journal"] .anv-page{left:22px;right:22px;border-radius:3px}
.anv[data-style="journal"] .anv-back{transform:rotate(1.5deg);box-shadow:0 2px 0 var(--av-paper3),0 12px 20px -10px rgb(60 50 40/35%)}
.anv[data-style="journal"] .anv-under{background-color:var(--av-paper2);background-image:radial-gradient(circle,rgba(120,100,80,.18) .8px,transparent 1px);background-size:9px 9px;padding:18px 11px 0;gap:3px}
.anv[data-style="journal"] .anv-page{background-color:var(--av-paper);background-image:radial-gradient(circle,rgba(120,100,80,.16) .8px,transparent 1px);background-size:9px 9px}
.anv[data-style="journal"] .anv-next{font-family:'Caveat',cursive;font-style:normal;font-size:16px;color:var(--av-acc)}
.anv[data-style="journal"] .anv-row{justify-content:space-between}
.anv[data-style="journal"] .anv-row .anv-hand{font-size:16px;flex-shrink:0}
.anv[data-style="journal"] .anv-head{align-items:baseline;padding:16px 12px 0;letter-spacing:0}
.anv[data-style="journal"] .anv-head .anv-hand{font-size:15px;color:var(--av-ink2)}
.anv-wk{font-size:9.5px;color:var(--av-ink2);letter-spacing:1px}
.anv[data-style="journal"] .anv-big{flex-direction:row;align-items:baseline;justify-content:center;gap:3px;margin-top:10px}
.anv[data-style="journal"] .anv-unit{font-family:'Caveat',cursive;font-style:normal;font-size:16px}
.anv[data-style="journal"] .anv-sub{font-weight:400;letter-spacing:0;margin:4px 8px 0}
.anv-wave{position:absolute;left:12px;bottom:8px;width:40px;height:20px}
.anv-wave path{fill:none;stroke:var(--av-acc);stroke-width:1.4;stroke-linecap:round;transition:stroke .4s}
.anv-stamp{position:absolute;right:8px;bottom:8px;width:30px;height:30px;border-radius:50%;border:1.3px solid var(--av-acc);color:var(--av-acc);font-size:10px;display:flex;align-items:center;justify-content:center;transform:rotate(-14deg);box-sizing:border-box}
.anv-tape{position:absolute;left:calc(50% - 35px);top:22px;width:70px;height:16px;z-index:6;transform:rotate(-3deg);clip-path:polygon(2% 0,98% 6%,100% 92%,96% 100%,4% 96%,0 10%);
  background:repeating-linear-gradient(90deg,color-mix(in srgb,var(--av-acc) 55%,transparent) 0 6px,rgba(var(--wp-tint,238,214,186),.6) 6px 12px)}
/* 还没有纪念日 */
.anv-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;gap:4px;text-align:center;padding:0 8px}
.anv-empty-num{font-family:'Noto Serif SC',serif;font-size:30px;line-height:1;color:var(--av-ink2);opacity:.6}
.anv-empty .anv-sub{margin:4px 0 0;white-space:normal}
.anv-go{font-size:10.5px;color:var(--av-acc)}
@media (prefers-reduced-motion:reduce){.anv,.anv *{transition:none!important}}

/* ───────── 他约你 (小组件第三批, 定稿 Invite / InviteSizes：①折页邀请卡 ②两张票 ③一张卡片 × 4×2 / 4×1 / 2×2) ─────────
   颜色全部来自共用配色 --wp-*（默认雾蓝）。答应：盖章「赴约」/「已收下」，撕票根；改天：「他会再约」。 */
.inv{--iv-paper:var(--wp-paper,#F7F9FC);--iv-ink:var(--wp-ink,#2F3D4B);--iv-ink2:var(--wp-ink2,#66788B);--iv-acc:var(--wp-acc,#5F7F9F);--iv-on:var(--wp-on,#fff);--iv-line:var(--wp-line,rgba(95,127,159,.32));
  --iv-rib:linear-gradient(90deg,var(--wp-rib,#A9BFD8),color-mix(in srgb,var(--wp-rib,#A9BFD8) 55%,#fff));--iv-sun:color-mix(in srgb,#D9A272 75%,var(--iv-acc));--iv-sea:color-mix(in srgb,var(--iv-acc) 70%,#9FB3C6);
  position:relative;width:100%;height:100%;color:var(--iv-ink);font-family:inherit;perspective:1000px}
.desk-widget-inner.w-glass:has(>.inv){padding:0}
.inv button,.inv [role="button"]{font-family:inherit;border:0;background:none;padding:0;margin:0;cursor:pointer;color:inherit;width:auto;-webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.5,.5,1)}
.desk-widget-inner.w-glass .inv button{width:auto;text-align:center}   /* the shared widget button reset stretches buttons to 100% */
.inv-foot>*{white-space:nowrap}
.inv button:active,.inv [role="button"]:active{transform:scale(.95,.93);transition:transform .1s ease-out}
.inv-en{font-family:'Cormorant Garamond',var(--font-display,serif)}
.inv-paper{background-color:var(--iv-paper);background-image:repeating-linear-gradient(0deg,rgba(120,100,80,.025) 0 1px,transparent 1px 3px);color:var(--iv-ink);transition:background-color .4s,color .4s}
.inv-mute{color:var(--iv-ink2)}
.inv-acc{color:var(--iv-acc)}
.inv-kick{font-size:11px;letter-spacing:2px;white-space:nowrap}
.inv-script{font-style:italic;font-size:30px;line-height:1.1}
.inv-t{font-size:19px;margin-top:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.inv-s{font-size:12.5px}
.inv-xs{font-size:11px}
.inv-q{font-size:12px;margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.inv-col{flex:1;min-width:0;display:flex;flex-direction:column}
.inv-col .inv-t{margin-top:0;font-size:14.5px}
.inv-top{display:flex;justify-content:space-between;align-items:baseline;gap:8px}
.inv-act{margin-top:auto;display:flex;justify-content:flex-end;gap:6px;align-items:center}
.inv-btn{height:40px;padding:0 14px!important;border-radius:20px;font-size:12.5px;color:var(--iv-ink2)!important;white-space:nowrap;flex-shrink:0}
.inv-fill,.inv .inv-btn.inv-fill{display:inline-flex;align-items:center;height:40px;padding:0 14px;border-radius:20px;font-size:12.5px;color:var(--iv-on)!important;background:var(--iv-acc)!important;box-shadow:0 6px 12px -6px rgb(40 40 60/45%);transition:background .4s;white-space:nowrap}
.inv-fill.sm{height:32px;padding:0 12px;border-radius:16px;font-size:12px}
.inv-link{font-size:12px;font-weight:500;color:var(--iv-acc);white-space:nowrap;padding:8px 4px}
.inv-note{font-size:11.5px;color:var(--iv-ink2);animation:invRise .4s ease both}
.inv-note.late{animation-delay:.5s}
@keyframes invRise{0%{opacity:0;transform:translateY(6px)}100%{opacity:1;transform:none}}
.inv-stamp{position:absolute;right:22px;top:12px;width:58px;height:58px;border-radius:50%;border:2px solid var(--iv-acc);box-shadow:inset 0 0 0 5px var(--iv-line);color:var(--iv-acc);opacity:.9;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;transform:rotate(-14deg);pointer-events:none}
.inv-stamp b{font-size:15px;font-weight:400}
.inv-stamp .inv-en{font-size:8px;letter-spacing:1px}
.inv-stamp.sm{width:40px;height:40px;right:10px;top:auto;bottom:8px;box-shadow:inset 0 0 0 4px var(--iv-line)}
.inv-stamp.sm b{font-size:11px}
.inv-stamp.go,.inv-box.go{animation:invStamp .55s cubic-bezier(.3,.7,.3,1) both}
@keyframes invStamp{0%{opacity:0;transform:scale(2.2) rotate(-28deg)}55%{opacity:1;transform:scale(.92) rotate(-12deg)}75%{transform:scale(1.05) rotate(-14deg)}100%{opacity:.9;transform:scale(1) rotate(-14deg)}}
/* ① 折页邀请卡 */
.inv[data-style="fold"] .inv-inside,.inv[data-style="fold"] .inv-cover,.inv[data-style="fold"] .inv-none{position:absolute;left:14px;right:14px;top:14px;bottom:14px;border-radius:14px;box-sizing:border-box;box-shadow:0 6px 14px -8px rgb(40 40 60/35%)}
.inv[data-style="fold"] .inv-inside{padding:14px 16px;display:flex;flex-direction:column}
.inv[data-style="fold"] .inv-cover{z-index:3;display:block;width:auto!important;text-align:left;transform-origin:0 50%;backface-visibility:hidden;-webkit-backface-visibility:hidden;box-shadow:0 8px 16px -8px rgb(40 40 60/40%);transition:transform .8s cubic-bezier(.34,1.45,.5,1),background-color .4s!important}
.inv[data-style="fold"] .inv-cover.open{transform:rotateY(-172deg)!important;pointer-events:none;transition:transform .8s cubic-bezier(.45,0,.3,1)!important}
.inv-rule{position:absolute;inset:7px;border:1px solid var(--iv-line);border-radius:9px;pointer-events:none}
.inv-rule.in{inset:10px;border-width:.5px;border-radius:7px;opacity:.7}
.inv-rib{position:absolute;right:62px;top:0;bottom:0;width:12px;background:var(--iv-rib)}
.inv-bow{position:absolute;right:48px;top:calc(50% - 15px);width:40px;height:30px}
.inv-bow .k{fill:var(--iv-acc);opacity:.55;stroke:var(--iv-acc);stroke-width:.8}
.inv-bow .t{stroke:var(--iv-acc);opacity:.55;fill:none;stroke-width:3;stroke-linecap:round}
.inv-cov-col{position:absolute;left:28px;top:calc(50% - 42px);display:flex;flex-direction:column}
.inv-cov-col .inv-kick{letter-spacing:4px}
.inv-cov-col .inv-script{margin-top:6px}
.inv-cov-col .inv-xs{margin-top:10px;letter-spacing:1px}
.inv-dash{position:absolute;inset:7px;border:1px dashed var(--iv-line);border-radius:9px;pointer-events:none}
.inv[data-style="fold"] .inv-none{padding:0 28px;display:flex;flex-direction:column;justify-content:center}
.inv[data-style="fold"] .inv-none .inv-kick{letter-spacing:4px}
.inv[data-style="fold"] .inv-none .inv-script{font-size:26px;margin-top:6px}
.inv[data-style="fold"] .inv-none .inv-t{font-size:12.5px;margin-top:8px}
.inv[data-style="fold"] .inv-none .inv-xs{margin-top:3px}
.inv-corner{position:absolute;right:20px;bottom:18px}
/* ① 4×1 */
.inv[data-style="fold"][data-size="medium"]{perspective:700px}
.inv[data-style="fold"][data-size="medium"] .inv-inside,.inv[data-style="fold"][data-size="medium"] .inv-cover,.inv[data-style="fold"][data-size="medium"] .inv-none{left:10px;right:10px;top:10px;bottom:10px}
.inv[data-style="fold"][data-size="medium"] .inv-inside{flex-direction:row;align-items:center;gap:8px;padding:0 8px 0 14px}
.inv[data-style="fold"][data-size="medium"] .inv-kick{font-size:10.5px}
.inv[data-style="fold"][data-size="medium"] .inv-act{margin:0}
.inv[data-style="fold"][data-size="medium"] .inv-btn,.inv[data-style="fold"][data-size="medium"] .inv-fill{height:32px;padding:0 12px!important;border-radius:16px;font-size:12px}
.inv[data-style="fold"][data-size="medium"] .inv-stamp.sm{position:static;transform:rotate(-14deg);margin-left:4px;flex-shrink:0}
.inv[data-style="fold"][data-size="medium"] .inv-rule{inset:5px;border-radius:10px}
.inv[data-style="fold"][data-size="medium"] .inv-rib{right:54px;width:10px}
.inv-cov-row{position:absolute;left:20px;top:0;bottom:0;display:flex;align-items:center;gap:10px}
.inv-cov-row .inv-script{font-size:22px}
.inv-cov-row .inv-kick{font-size:10px;letter-spacing:3px}
.inv[data-style="fold"][data-size="medium"] .inv-none{flex-direction:row;align-items:center;padding:0 10px 0 16px;gap:8px}
.inv[data-style="fold"][data-size="medium"] .inv-none .inv-t{margin:0;font-size:13px}
.inv[data-style="fold"][data-size="medium"] .inv-dash{inset:5px;border-radius:10px}
/* ① 2×2 */
.inv[data-style="fold"][data-size="square"]{perspective:700px}
.inv[data-style="fold"][data-size="square"] .inv-inside,.inv[data-style="fold"][data-size="square"] .inv-cover,.inv[data-style="fold"][data-size="square"] .inv-none{left:12px;right:12px;top:12px;bottom:12px;border-radius:16px}
.inv[data-style="fold"][data-size="square"] .inv-inside{padding:12px}
.inv[data-style="fold"][data-size="square"] .inv-kick{font-size:10px}
.inv[data-style="fold"][data-size="square"] .inv-t{font-size:15px;margin-top:4px}
.inv[data-style="fold"][data-size="square"] .inv-q{font-size:10.5px;white-space:normal;line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.inv[data-style="fold"][data-size="square"] .inv-act{gap:4px}
.inv[data-style="fold"][data-size="square"] .inv-btn,.inv[data-style="fold"][data-size="square"] .inv-fill{height:32px;padding:0 10px!important;border-radius:16px;font-size:12px}
.inv[data-style="fold"][data-size="square"] .inv-note{font-size:10.5px}
.inv[data-style="fold"][data-size="square"] .inv-rule{inset:6px;border-radius:11px}
.inv[data-style="fold"][data-size="square"] .inv-rib{left:0;right:0;top:auto;bottom:34px;width:auto;height:10px}
.inv[data-style="fold"][data-size="square"] .inv-cov-col{left:16px;top:20px}
.inv[data-style="fold"][data-size="square"] .inv-cov-col .inv-kick{font-size:9.5px;letter-spacing:3px}
.inv[data-style="fold"][data-size="square"] .inv-cov-col .inv-script{font-size:26px;margin-top:4px}
.inv-from{position:absolute;left:16px;bottom:12px;font-size:10px;letter-spacing:1px}
.inv[data-style="fold"][data-size="square"] .inv-none{padding:16px;justify-content:flex-start}
.inv[data-style="fold"][data-size="square"] .inv-none .inv-kick{font-size:9.5px;letter-spacing:3px}
.inv[data-style="fold"][data-size="square"] .inv-none .inv-script{font-size:22px;margin-top:4px}
.inv[data-style="fold"][data-size="square"] .inv-none .inv-t{font-size:11.5px;margin-top:6px;white-space:normal}
.inv[data-style="fold"][data-size="square"] .inv-dash{inset:6px;border-radius:11px}
.inv-bottom{margin-top:auto;align-self:flex-start}
/* ② 两张票：右边可以撕的票根；2×2 是竖票，票根在底部 */
.inv-tk{position:absolute;left:14px;right:14px;top:18px;bottom:18px;filter:drop-shadow(0 8px 12px rgb(40 40 60/28%))}
.inv-body{position:absolute;left:0;top:0;bottom:0;right:86px;border-radius:10px 0 0 10px;padding:12px 16px;box-sizing:border-box;display:flex;flex-direction:column;
  -webkit-mask:radial-gradient(circle 8px at 100% 0,transparent 98%,#000) top/100% 51% no-repeat,radial-gradient(circle 8px at 100% 100%,transparent 98%,#000) bottom/100% 51% no-repeat;mask:radial-gradient(circle 8px at 100% 0,transparent 98%,#000) top/100% 51% no-repeat,radial-gradient(circle 8px at 100% 100%,transparent 98%,#000) bottom/100% 51% no-repeat}
.inv[data-style="ticket"] .inv-kick{font-size:10px;letter-spacing:3px}
.inv[data-style="ticket"] .inv-t{font-size:19px;margin-top:4px}
.inv[data-style="ticket"] .inv-q{font-size:11.5px;margin-top:2px}
.inv-foot{margin-top:auto;display:flex;justify-content:space-between;align-items:center;gap:8px}
.inv-foot .inv-btn{height:36px;padding:0 8px!important;font-size:12px}
.inv-blank{display:block;margin-top:10px;border-bottom:1px dashed var(--iv-line);height:20px}
.inv[data-style="ticket"] .inv-body>.inv-s{margin-top:8px;font-size:11.5px}
.inv-perf{position:absolute;right:86px;top:10px;bottom:10px;border-left:1.5px dashed var(--iv-line)}
.inv-stub{position:absolute!important;right:0;top:0;bottom:0;width:86px!important;border-radius:0 10px 10px 0;display:flex!important;flex-direction:column;align-items:center;justify-content:center;transform-origin:0 100%;
  transition:transform .7s cubic-bezier(.34,1.45,.5,1),background-color .4s!important;cursor:default!important;
  -webkit-mask:radial-gradient(circle 8px at 0 0,transparent 98%,#000) top/100% 51% no-repeat,radial-gradient(circle 8px at 0 100%,transparent 98%,#000) bottom/100% 51% no-repeat;mask:radial-gradient(circle 8px at 0 0,transparent 98%,#000) top/100% 51% no-repeat,radial-gradient(circle 8px at 0 100%,transparent 98%,#000) bottom/100% 51% no-repeat}
.inv-stub[data-inv-yes]{cursor:pointer!important}
.inv-stub.torn{transform:translate(14px,10px) rotate(12deg)}
.inv-stub:active{transform:none}
.inv-stub.torn:active{transform:translate(14px,10px) rotate(12deg)}
.inv-d{font-size:26px;line-height:1;margin-top:2px}
.inv-stub .inv-s{font-size:13px}
.inv-bar{display:flex;gap:1.5px;height:16px;margin-top:8px;color:var(--iv-ink)}
.inv-bar i{display:block;background:currentColor}
.inv-bar.dim{opacity:.25}
.inv-hint{font-size:10px;margin-top:6px;white-space:nowrap}
.inv-box{position:absolute;right:18px;top:22px;padding:4px 10px;border:2px solid var(--iv-acc);border-radius:6px;color:var(--iv-acc);opacity:.9;font-size:15px;letter-spacing:2px;transform:rotate(-14deg);pointer-events:none}
/* ② 4×1 */
.inv[data-style="ticket"][data-size="medium"] .inv-tk{left:12px;right:12px;top:12px;bottom:12px}
.inv[data-style="ticket"][data-size="medium"] .inv-body{right:74px;border-radius:9px 0 0 9px;padding:0 10px 0 14px;flex-direction:row;align-items:center;gap:8px;
  -webkit-mask:radial-gradient(circle 7px at 100% 0,transparent 98%,#000) top/100% 51% no-repeat,radial-gradient(circle 7px at 100% 100%,transparent 98%,#000) bottom/100% 51% no-repeat;mask:radial-gradient(circle 7px at 100% 0,transparent 98%,#000) top/100% 51% no-repeat,radial-gradient(circle 7px at 100% 100%,transparent 98%,#000) bottom/100% 51% no-repeat}
.inv[data-style="ticket"][data-size="medium"] .inv-kick{font-size:9.5px;letter-spacing:2px}
.inv[data-style="ticket"][data-size="medium"] .inv-col .inv-t{font-size:14.5px}
.inv[data-style="ticket"][data-size="medium"] .inv-btn{height:32px;padding:0 6px!important;font-size:11.5px}
.inv[data-style="ticket"][data-size="medium"] .inv-perf{right:74px;top:7px;bottom:7px}
.inv[data-style="ticket"][data-size="medium"] .inv-stub{width:74px!important;border-radius:0 9px 9px 0;
  -webkit-mask:radial-gradient(circle 7px at 0 0,transparent 98%,#000) top/100% 51% no-repeat,radial-gradient(circle 7px at 0 100%,transparent 98%,#000) bottom/100% 51% no-repeat;mask:radial-gradient(circle 7px at 0 0,transparent 98%,#000) top/100% 51% no-repeat,radial-gradient(circle 7px at 0 100%,transparent 98%,#000) bottom/100% 51% no-repeat}
.inv[data-style="ticket"][data-size="medium"] .inv-d{font-size:17px;margin:0}
.inv[data-style="ticket"][data-size="medium"] .inv-stub .inv-s{font-size:11px}
.inv[data-style="ticket"][data-size="medium"] .inv-hint{margin-top:2px}
.inv[data-style="ticket"][data-size="medium"] .inv-box{position:static;font-size:12px;padding:2px 6px;letter-spacing:1px;flex-shrink:0}
.inv[data-style="ticket"][data-size="medium"] .inv-stub.torn{transform:translate(8px,6px) rotate(10deg)}
/* ② 2×2 竖票 */
.inv[data-style="ticket"][data-size="square"] .inv-tk{left:16px;right:16px;top:14px;bottom:14px}
.inv[data-style="ticket"][data-size="square"] .inv-body{right:0;bottom:44px;border-radius:9px 9px 0 0;padding:10px 12px;
  -webkit-mask:radial-gradient(circle 7px at 0 100%,transparent 98%,#000) left/51% 100% no-repeat,radial-gradient(circle 7px at 100% 100%,transparent 98%,#000) right/51% 100% no-repeat;mask:radial-gradient(circle 7px at 0 100%,transparent 98%,#000) left/51% 100% no-repeat,radial-gradient(circle 7px at 100% 100%,transparent 98%,#000) right/51% 100% no-repeat}
.inv[data-style="ticket"][data-size="square"] .inv-kick{font-size:9px;letter-spacing:2px}
.inv[data-style="ticket"][data-size="square"] .inv-t{font-size:15px}
.inv[data-style="ticket"][data-size="square"] .inv-xs{font-size:10.5px;margin-top:2px}
.inv[data-style="ticket"][data-size="square"] .inv-foot .inv-btn{height:26px;padding:0!important;font-size:11px}
.inv[data-style="ticket"][data-size="square"] .inv-body>.inv-s{font-size:12px;margin-top:6px}
.inv[data-style="ticket"][data-size="square"] .inv-perf{left:8px;right:8px;top:auto;bottom:44px;border-left:0;border-top:1.5px dashed var(--iv-line)}
.inv[data-style="ticket"][data-size="square"] .inv-stub{left:0;right:0;top:auto;width:auto!important;height:44px;border-radius:0 0 9px 9px;flex-direction:row;gap:8px;transform-origin:100% 0;
  -webkit-mask:radial-gradient(circle 7px at 0 0,transparent 98%,#000) left/51% 100% no-repeat,radial-gradient(circle 7px at 100% 0,transparent 98%,#000) right/51% 100% no-repeat;mask:radial-gradient(circle 7px at 0 0,transparent 98%,#000) left/51% 100% no-repeat,radial-gradient(circle 7px at 100% 0,transparent 98%,#000) right/51% 100% no-repeat}
.inv[data-style="ticket"][data-size="square"] .inv-d{font-size:15px;margin:0}
.inv[data-style="ticket"][data-size="square"] .inv-stub .inv-s{font-size:11px}
.inv[data-style="ticket"][data-size="square"] .inv-hint{margin:0}
.inv[data-style="ticket"][data-size="square"] .inv-stub.torn{transform:translate(6px,12px) rotate(-8deg)}
.inv[data-style="ticket"][data-size="square"] .inv-box{right:10px;top:auto;bottom:10px;font-size:12px;padding:2px 6px;letter-spacing:1px}
/* ③ 一张卡片：毛边小卡斜放，一笔画的日落；答应后摆正、盖章 */
.inv-cardp{position:absolute;left:30px;right:30px;top:12px;bottom:12px;border-radius:3px;padding:10px 16px 4px;box-sizing:border-box;display:flex;flex-direction:column;
  box-shadow:0 10px 16px -8px rgb(40 40 60/40%),0 0 0 1px rgba(140,120,100,.08);transform:rotate(-2deg);transition:transform .6s cubic-bezier(.34,1.45,.5,1),opacity .4s,background-color .4s}
.inv-cardp.straight{transform:none}
.inv-cardp.later{transform:rotate(-2deg) translateY(4px);opacity:.82}
.inv-sun{display:block;margin:0 auto;width:60px;height:22px;flex-shrink:0}
.inv-sun path{fill:none;stroke-linecap:round}
.inv-sun .s{stroke:var(--iv-sun);stroke-width:1.3}
.inv-sun .w{stroke:var(--iv-sea);stroke-width:1.2}
.inv-sun .w2{stroke:var(--iv-sea);stroke-width:1;opacity:.7}
.inv[data-style="card"] .inv-cardp>.inv-script{font-size:22px;text-align:center;margin-top:2px}
.inv[data-style="card"] .inv-cardp>.inv-s{text-align:center;margin-top:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.inv[data-style="card"] .inv-cardp>.inv-xs{text-align:center;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.inv[data-style="card"] .inv-act{justify-content:center;border-top:1px solid var(--iv-line);padding-top:2px;gap:0}
.inv[data-style="card"] .inv-act .inv-btn{flex:1;height:34px;font-size:12.5px;text-align:center}
.inv[data-style="card"] .inv-act .inv-btn.inv-acc{color:var(--iv-acc)!important;font-weight:500}
.inv[data-style="card"] .inv-act .inv-note{height:34px;line-height:34px}
.inv[data-style="card"] .inv-act .inv-link{padding:8px 16px}
.inv-sep{display:block;width:1px;height:14px;background:var(--iv-line)}
.inv[data-style="card"] .inv-stamp{right:14px;top:auto;bottom:30px}
/* ③ 4×1 */
.inv[data-style="card"][data-size="medium"] .inv-cardp{left:14px;right:14px;top:12px;bottom:12px;padding:0 10px 0 14px;flex-direction:row;align-items:center;gap:10px;transform:rotate(-1deg)}
.inv[data-style="card"][data-size="medium"] .inv-cardp.straight{transform:none}
.inv[data-style="card"][data-size="medium"] .inv-sun{width:40px;height:15px;margin:0}
.inv[data-style="card"][data-size="medium"] .inv-sun .w2{display:none}
.inv[data-style="card"][data-size="medium"] .inv-script{font-size:15px}
.inv[data-style="card"][data-size="medium"] .inv-col .inv-xs{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.inv[data-style="card"][data-size="medium"] .inv-btn{height:32px;padding:0 6px!important;font-size:12px}
.inv[data-style="card"][data-size="medium"] .inv-btn.inv-acc{color:var(--iv-acc)!important;font-weight:500}
.inv[data-style="card"][data-size="medium"] .inv-sep{height:12px}
.inv[data-style="card"][data-size="medium"] .inv-stamp.sm{position:static;transform:rotate(-14deg);flex-shrink:0}
/* ③ 2×2 */
.inv[data-style="card"][data-size="square"] .inv-cardp{left:18px;right:18px;top:14px;bottom:14px;padding:10px 10px 0}
.inv[data-style="card"][data-size="square"] .inv-sun{width:46px;height:17px}
.inv[data-style="card"][data-size="square"] .inv-sun .w2{display:none}
.inv[data-style="card"][data-size="square"] .inv-cardp>.inv-script{font-size:17px}
.inv[data-style="card"][data-size="square"] .inv-cardp>.inv-s{font-size:11px;margin-top:4px}
.inv[data-style="card"][data-size="square"] .inv-act .inv-btn{height:30px;font-size:11.5px}
.inv[data-style="card"][data-size="square"] .inv-act .inv-note{height:30px;line-height:30px;font-size:10.5px}
.inv[data-style="card"][data-size="square"] .inv-stamp.sm{right:8px;bottom:34px}
@media (prefers-reduced-motion:reduce){.inv,.inv *{animation:none!important;transition:none!important}}

/* 他约你：盖章 / 票根 / 按键的位置微调（.inv 前缀压过统一的按键样式） */
.inv .inv-link{padding:8px 4px}
.inv .inv-bottom{margin-top:auto;align-self:flex-start}
.inv .inv-corner{position:absolute;right:20px;bottom:18px}
.inv[data-style="fold"][data-size="large"] .inv-stamp{top:34px;right:18px}
.inv-stub.torn{transform:translate(8px,6px) rotate(10deg)}
.inv-stub.torn:active{transform:translate(8px,6px) rotate(10deg)}
.inv[data-style="ticket"][data-size="large"] .inv-box{top:auto;bottom:44px;right:18px}
.inv[data-style="ticket"][data-size="square"] .inv-box{top:10px;bottom:auto}
.inv[data-style="fold"][data-size="square"] .inv-stamp.sm{top:10px;bottom:auto;right:10px}
.inv[data-style="card"][data-size="square"] .inv-stamp.sm{top:6px;bottom:auto;right:6px}
.inv[data-style="fold"][data-size="square"] .inv-stamp.sm{top:auto;bottom:10px;right:auto;left:10px}
.inv[data-style="ticket"][data-size="square"] .inv-box{top:auto;bottom:8px;right:10px}
.inv[data-style="ticket"][data-size="square"][data-state="yes"] .inv-foot .inv-note{display:none}

/* ───────── 日子进度 (小组件第三批, 定稿 Progress：A 一串珠子 / B 一管玻璃水) ─────────
   颜色 --pg-rgb / --pg-c：每种「倒数什么」有自己的颜色；在编辑里选了配色就用配色的强调色。 */
.pg{position:relative;display:flex;flex-direction:column;width:100%;height:100%;box-sizing:border-box;padding:13px 18px 16px;border:0;background:none;margin:0;font-family:inherit;color:#2F3D4B;text-align:left;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.5,.5,1)}
.pg:active{transform:scale(.96,.94);transition:transform .1s ease-out}
.desk-widget-inner.w-glass:has(>.pg){padding:0}
.desk-widget-inner.w-glass .pg{padding:13px 18px 16px}
.pg-head{display:flex;justify-content:space-between;align-items:baseline;gap:8px;min-width:0}
.pg-title{display:flex;align-items:center;gap:6px;font-size:13.5px;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pg-ic{width:14px;height:14px;flex-shrink:0;fill:none;stroke:var(--pg-c);stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.pg-title .pg-ic{width:13px;height:13px}
.pg-num{display:block;overflow:hidden;white-space:nowrap;flex-shrink:0}
.pg-num b{font-weight:400;font-size:13px}
.pg-num i{font-style:normal;font-size:12px;color:#44546A;margin-left:3px}
.pg-num.roll b,.pg-num.roll i{display:inline-block;animation:pgRoll .5s cubic-bezier(.34,1.3,.5,1) both}
@keyframes pgRoll{0%{transform:translateY(70%);opacity:0}60%{transform:translateY(-10%);opacity:1}100%{transform:none;opacity:1}}
.pg-bar{position:relative;margin-top:auto;display:block}
.pg-range{display:block;margin-top:8px;font-size:11.5px;color:#44546A;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* A 珠子 */
.pg-beads{display:flex;align-items:center;justify-content:space-between;height:20px}
.pg-beads i{display:block;width:7px;height:7px;border-radius:50%;flex-shrink:0;background:rgb(255 255 255/75%);box-shadow:inset 0 1px 2px rgb(30 48 72/15%);transform:scale(.85);
  transition:background .3s ease calc(var(--i) * .025s),transform .4s cubic-bezier(.34,1.3,.5,1) calc(var(--i) * .025s),width .4s,height .4s}
.pg-beads i.on{background:rgba(var(--pg-rgb),var(--a));box-shadow:0 1px 2px rgb(30 48 72/20%);transform:scale(1)}
.pg-beads i.cur{width:10px;height:10px}
.pg.pre .pg-beads i.on{background:rgb(255 255 255/75%);box-shadow:inset 0 1px 2px rgb(30 48 72/15%);transform:scale(.85)}
.pg-rider{position:absolute;bottom:18px;left:calc(var(--pos) * 100% - 7px);width:14px;height:14px;transition:left .9s cubic-bezier(.34,1.3,.5,1);filter:drop-shadow(0 1px 1px rgb(30 48 72/25%))}
.pg.pre .pg-rider{left:-7px}
.pg-rider .pg-ic{width:14px;height:14px}
.pg-rider.hop{animation:pgHop .6s ease .1s both}
@keyframes pgHop{0%,100%{transform:translateY(0)}30%{transform:translateY(-6px) scale(1.1,.92)}55%{transform:translateY(1px) scale(.95,1.06)}75%{transform:translateY(-2px)}}
/* B 玻璃水 */
.pg-tube{position:relative;display:block;height:24px;border-radius:12px;background:rgb(255 255 255/30%);border:1px solid rgb(255 255 255/85%);box-shadow:inset 0 2px 4px rgb(30 48 72/15%),inset 0 -1px 0 rgb(255 255 255/60%);overflow:hidden}
.pg-water{position:absolute;left:0;top:0;bottom:0;width:var(--pg-w);background:linear-gradient(180deg,rgba(var(--pg-rgb),.55),rgba(var(--pg-rgb),.8));transform-origin:0 100%;transition:width 1.1s cubic-bezier(.34,1.3,.5,1),background .4s}
.pg.pre .pg-water{width:0}
.pg-water.slosh{animation:pgSlosh .9s ease both}
@keyframes pgSlosh{0%{transform:skewX(0)}25%{transform:skewX(-10deg)}50%{transform:skewX(7deg)}75%{transform:skewX(-3deg)}100%{transform:skewX(0)}}
.pg-wave{position:absolute;right:-8px;top:-4px;width:200%;height:10px;animation:pgWave 2.6s linear infinite}
.pg-wave path{fill:rgba(var(--pg-rgb),.55)}
@keyframes pgWave{from{transform:translateX(0)}to{transform:translateX(-40px)}}
.pg-bub{position:absolute;bottom:3px;width:4px;height:4px;border-radius:50%;background:rgb(255 255 255/70%);animation:pgBub 2.2s ease-in infinite}
.pg-bub.a{left:30%}
.pg-bub.b{left:62%;width:3px;height:3px;bottom:2px;animation-duration:2.8s;animation-delay:.9s}
@keyframes pgBub{0%{transform:translateY(6px);opacity:0}30%{opacity:.8}100%{transform:translateY(-14px);opacity:0}}
.pg-shine{position:absolute;left:8px;right:8px;top:3px;height:5px;border-radius:3px;background:linear-gradient(90deg,rgb(255 255 255/85%),rgb(255 255 255/20%));pointer-events:none}
/* 4×2：大数字 */
.pg[data-size="large"]{padding:16px 20px 16px}
.pg-big{margin-top:auto;margin-bottom:12px}
.pg-big b{font-size:34px;font-family:var(--font-display,serif);line-height:1.1}
.pg-big i{font-size:13px}
.pg[data-size="large"] .pg-bar{margin-top:0}
.pg[data-size="large"] .pg-tube{height:28px;border-radius:14px}
/* 2×2：标题 + 数字两行，12 颗珠子 */
.pg[data-size="square"]{padding:14px 14px 14px}
.pg[data-size="square"] .pg-head{flex-direction:column;align-items:flex-start;gap:6px}
.pg[data-size="square"] .pg-num b{font-size:24px;font-family:var(--font-display,serif)}
.pg[data-size="square"] .pg-range{font-size:10.5px}
/* 空状态 */
.pg-none{margin-top:auto;font-size:12.5px;color:#44546A}
.pg.pg-empty .pg-title{color:#44546A}
/* 编辑弹窗里的「倒数什么」 */
.ds-seg.w-edit-seg.wrap{flex-wrap:wrap}
.w-edit-pg{display:flex;flex-direction:column;gap:8px;margin-top:8px}
.w-edit-pg input{width:100%;box-sizing:border-box;height:38px;border-radius:12px;border:1px solid var(--border,rgb(0 0 0/10%));background:var(--surface,#fff);padding:0 10px;font-family:inherit;font-size:13px;color:var(--ink)}
@media (prefers-reduced-motion:reduce){.pg,.pg *{animation:none!important;transition:none!important}}
html.desk-reduce-glass .pg-wave,html.desk-reduce-glass .pg-bub{animation:none}

/* ───────── 他的朋友圈 (小组件第三批, 定稿 MomentsText) ─────────
   有图：图铺满 + 字压在图上。纯文字：字是主角，越短越大（--mo-fs / --mo-lines）；点一下带回弹长高，露出全文和最新两条评论。 */
.desk-widget-inner.w-glass:has(>.mo){padding:0}
.desk-widget-inner.w-glass:has(>.mo-text){transition:height .55s cubic-bezier(.34,1.45,.5,1),box-shadow .3s}
.desk-widget-inner.w-glass.mo-open{height:calc(100% + 66px - var(--desk-widget-slack,0px));box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/92%),0 26px 40px -18px rgb(30 48 72/50%)}
.mo{position:relative;display:flex;flex-direction:column;width:100%;height:100%;box-sizing:border-box;padding:15px 18px 14px;border:0;background:none;margin:0;font-family:inherit;color:#2F3D4B;text-align:left;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.45,.5,1)}
.desk-widget-inner.w-glass .mo{padding:15px 18px 14px}
.mo:active{transform:scale(.97,.95);transition:transform .1s ease-out}
.mo[data-size="square"],.desk-widget-inner.w-glass .mo[data-size="square"]{padding:14px 15px 13px}
.mo-qm{position:absolute;left:12px;top:-6px;font-family:'Cormorant Garamond',var(--font-display,serif);font-style:italic;font-size:96px;line-height:1;color:rgba(101,82,127,.13);pointer-events:none}
.mo[data-size="square"] .mo-qm{left:8px;top:-4px;font-size:72px}
.mo-top{position:relative;display:flex;align-items:center;gap:8px;min-width:0}
.mo-chip{width:22px;height:22px;border-radius:7px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:#65527F;background:rgba(222,208,238,.6);border:1px solid rgb(255 255 255/80%);box-shadow:inset 1px 1px 0 rgb(255 255 255/90%)}
.mo-chip svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.mo[data-size="square"] .mo-chip{width:20px;height:20px}
.mo-cap{font-size:12px;color:#44546A;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mo[data-size="square"] .mo-top .mo-cap{font-size:11px}
.mo-av{margin-left:auto;width:26px;height:26px;flex-shrink:0;border:1.5px solid rgb(255 255 255/90%)}
.mo-words{position:relative;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--mo-lines);overflow:hidden;margin-top:12px;font-size:var(--mo-fs);line-height:1.55;color:#2F3D4B;animation:moIn .35s ease both;transition:font-size .35s ease}
.mo-words.spaced{letter-spacing:2px;margin-top:18px}
.mo[data-size="square"] .mo-words{margin-top:10px}
.mo[data-size="square"] .mo-words.spaced{margin-top:16px}
.mo.open .mo-words{display:block;-webkit-line-clamp:unset;overflow:visible}
@keyframes moIn{0%{opacity:0;transform:translateY(6px)}100%{opacity:1;transform:none}}
.mo-coms{position:relative;display:block;margin-top:8px;padding-top:8px;border-top:1px solid rgba(78,103,128,.15);animation:moIn .4s ease .15s both;min-height:0;overflow:hidden}
.mo-com{display:block;font-size:12px;color:#44546A;line-height:1.7;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mo-com b{font-weight:500;color:#2F3D4B}
.mo[data-size="square"] .mo-com{font-size:11.5px}
.mo-go{display:inline-block;margin-top:2px;font-size:12px;color:#65527F;padding:4px 0}
.mo-foot{position:relative;margin-top:auto;display:flex;justify-content:space-between;align-items:center;gap:8px;padding-top:6px}
.mo-new{font-size:12px;color:#63464F;display:flex;align-items:center;gap:6px;white-space:nowrap}
.mo-new i{width:7px;height:7px;border-radius:50%;background:#C98FA0;display:block}
.mo[data-size="square"] .mo-new{font-size:11px}
.mo-none{position:relative;margin-top:14px;font-size:14px;color:#44546A}
/* 有图 */
.mo-photo,.desk-widget-inner.w-glass .mo-photo{padding:0;overflow:hidden;border-radius:inherit}
.mo-photo img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.mo-shade{position:absolute;inset:0;background:linear-gradient(180deg,rgb(0 0 0/0%) 45%,rgb(20 28 40/55%) 100%)}
.mo-over{position:absolute;left:14px;right:14px;bottom:12px;color:#fff}
.mo-otext{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;font-size:15px;line-height:1.4;text-shadow:0 1px 6px rgb(0 0 0/25%)}
.mo[data-size="large"] .mo-otext{font-size:17px}
.mo-ometa{display:block;font-size:11px;margin-top:4px;opacity:.95}
@media (prefers-reduced-motion:reduce){.mo,.mo *,.desk-widget-inner.w-glass:has(>.mo-text){animation:none!important;transition:none!important}}

/* ── 心愿瓶 / 许愿票根 (小组件第三批): the couple space's wish tickets (.cwt from couple.css), coloured by kind ── */
.ws,.wj-layer{--cwt-paper:#fff}
@media(prefers-color-scheme:dark){:root:not([data-theme="light"]) .ws,:root:not([data-theme="light"]) .wj-layer{--cwt-paper:var(--surface)}}
:root[data-theme="dark"] .ws,:root[data-theme="dark"] .wj-layer{--cwt-paper:var(--surface)}
.desk-widget-inner.w-glass:has(>.wj),.desk-widget-inner.w-glass:has(>.ws){padding:0}
/* 心愿瓶 */
.wj{position:relative;display:block;width:100%;height:100%;box-sizing:border-box;border:0;background:none;margin:0;padding:0;font-family:inherit;color:#2F3D4B;text-align:left;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.5,.5,1)}
.wj:active{transform:scale(.96,.94);transition:transform .1s ease-out}
.wj-cap{font-size:11px;color:#44546A;letter-spacing:.04em}
.wj-l,.wj-r{position:absolute;top:14px}.wj-l{left:16px}.wj-r{right:16px}
.wj[data-state="empty"] .wj-r,.wj[data-state="alldone"] .wj-r{color:#63464F}
.wj-jar{position:absolute;left:50%;bottom:12px;width:90px;height:112px;margin-left:-45px;transform-origin:50% 90%}
.wj[data-size="square"] .wj-jar{bottom:16px;scale:1.14;transform-origin:50% 100%}
.wj[data-size="large"] .wj-jar{scale:1.06;left:26px;margin-left:0;top:50%;bottom:auto;margin-top:-50px}
.wj-cork{position:absolute;left:24px;top:0;width:42px;height:14px;border-radius:4px 4px 2px 2px;background:linear-gradient(180deg,#C9A27E,#A9805C);box-shadow:inset 0 1px 0 rgb(255 255 255/35%)}
.wj-glass{position:absolute;left:4px;right:4px;top:12px;bottom:0;border-radius:18px 18px 22px 22px;overflow:hidden;background:rgb(255 255 255/28%);border:1.5px solid rgb(255 255 255/90%);
  box-shadow:inset 0 0 14px rgb(255 255 255/45%),inset -4px -6px 10px rgb(120 150 190/18%),0 8px 14px -8px rgb(30 48 72/40%)}
.wj-shine{position:absolute;left:14px;top:22px;width:6px;height:52px;border-radius:3px;background:linear-gradient(180deg,rgb(255 255 255/90%),rgb(255 255 255/10%));pointer-events:none}
.wj-slip,.wj-fly{position:absolute;width:22px;height:8px;border-radius:4px;background:color-mix(in srgb,var(--c) 78%,var(--d));box-shadow:inset 0 -2px 0 rgb(0 0 0/8%),0 1px 1px rgb(30 48 72/15%);transform:rotate(var(--r))}
.wj-slip.gone{opacity:0}
.wj-fly{left:34px;top:4px;z-index:2;opacity:0;--r:0deg}
.wj-fly.out{animation:wjPop .45s cubic-bezier(.3,.7,.4,1) both}
.wj-jar.shake{animation:wjShake .7s ease both}
.wj-jar.shake .wj-slip{animation:wjJiggle .7s ease both;animation-delay:calc(var(--k) * 30ms)}
@keyframes wjShake{15%{transform:rotate(-9deg)}30%{transform:rotate(8deg)}45%{transform:rotate(-6deg)}60%{transform:rotate(4deg)}75%{transform:rotate(-2deg)}}
@keyframes wjJiggle{30%{transform:translate(2px,-4px) rotate(calc(var(--r) + 12deg))}60%{transform:translate(-2px,-1px) rotate(calc(var(--r) - 8deg))}}
@keyframes wjPop{0%{transform:rotate(-20deg) scale(.6);opacity:1}55%{transform:translateY(-78px) rotate(10deg);opacity:1}100%{transform:translateY(-60px);opacity:0}}
.wj-side{position:absolute;left:140px;right:18px;top:18px;bottom:16px;display:flex;flex-direction:column}
.wj-big{font-size:17px;color:#2F3D4B;margin:6px 0 2px;font-family:var(--font-display,serif)}
.wj-go{margin-top:auto;font-size:12.5px;color:#63464F}
/* the unrolled ticket over the desktop */
.wj-layer{position:fixed;inset:0;z-index:950}
.wj-back{position:absolute;inset:0;width:100%;height:100%;border:0;margin:0;padding:0;background:none;cursor:default}
.wj-pop{position:absolute;transform-origin:var(--ox) var(--oy);animation:wjUnroll .6s cubic-bezier(.3,.8,.3,1) both}
.wj-pop.in{animation:none}
.wj-layer.out .wj-pop{animation:wjBack .48s ease both}
.wj-tk{filter:drop-shadow(0 14px 20px rgb(40 40 60/30%))}
.wj-tk .cwt{cursor:default}
.wj-tk.stamp-in .cwt-stamp,.ws-tk.stamp-in .cwt-stamp{animation:wjStamp .55s cubic-bezier(.3,.7,.3,1) both}
@keyframes wjUnroll{0%{opacity:0;transform:scaleX(.08) scaleY(.4)}45%{opacity:1;transform:scaleX(.08) scaleY(1)}80%{transform:scaleX(1.04)}100%{opacity:1;transform:none}}
@keyframes wjBack{40%{opacity:1;transform:scaleX(.08)}100%{opacity:0;transform:scaleX(.08) scale(.5)}}
@keyframes wjStamp{0%{opacity:0;transform:scale(2.2) rotate(-28deg)}55%{opacity:1;transform:scale(.92) rotate(-12deg)}75%{transform:scale(1.05) rotate(-14deg)}100%{opacity:1;transform:rotate(-14deg)}}
.wj-x{position:absolute;right:-8px;top:-12px;z-index:3;width:28px;height:28px;padding:0;margin:0;border:0;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#44546A;background:rgb(255 255 255/90%);box-shadow:0 3px 8px -3px rgb(30 48 72/40%);cursor:pointer}
.wj-x svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
.wj-btns{display:flex;justify-content:center;gap:10px;margin-top:14px}
.wj-btn,.ws-btn{height:38px;padding:0 18px;margin:0;border-radius:19px;font:inherit;font-size:12.5px;color:#44546A;cursor:pointer;background:rgb(255 255 255/78%);border:1px solid #fff;box-shadow:0 6px 14px -8px rgb(30 48 72/40%);
  -webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.5,.5,1)}
.wj-btn:active,.ws-btn:active,.ws-arr:active{transform:scale(.94);transition:transform .1s ease-out}
/* 实现了: half see-through glass in the ticket's own colour, a little raised */
.wj-btn.wj-done,.desk-widget-inner.w-glass .ws .ws-done{padding:0 20px;font-weight:500;color:var(--d);background:linear-gradient(160deg,color-mix(in srgb,var(--c) 70%,transparent),color-mix(in srgb,var(--c) 88%,var(--d) 6%));
  -webkit-backdrop-filter:blur(8px) saturate(150%);backdrop-filter:blur(8px) saturate(150%);border:1px solid rgb(255 255 255/85%);
  box-shadow:inset 1.5px 1.5px 0 rgb(255 255 255/95%),inset -1px -1px 0 rgb(255 255 255/35%),inset 0 0 10px rgb(255 255 255/30%),0 6px 14px -8px rgb(30 48 72/40%)}
/* 许愿票根 */
.ws{position:relative;display:block;width:100%;height:100%;box-sizing:border-box;padding:0;margin:0;border:0;background:none;font-family:inherit;color:#2F3D4B;text-align:left;cursor:pointer;-webkit-tap-highlight-color:transparent;touch-action:pan-y}
.ws-tk{position:absolute;z-index:2;left:12px;right:12px;top:50%;transform:translateY(-50%)}
.ws[data-size="large"] .ws-tk{top:30px;transform:none}
.ws-tk .cwt{cursor:pointer}
.ws-tk.go-next{animation:wsNext .5s cubic-bezier(.34,1.3,.5,1) both}
.ws-tk.go-prev{animation:wsPrev .5s cubic-bezier(.34,1.3,.5,1) both}
.ws-tk.nudge{animation:wsNudge .4s ease}
.ws[data-size="medium"] .ws-tk.go-next,.ws[data-size="medium"] .ws-tk.go-prev,.ws[data-size="medium"] .ws-tk.nudge{animation-name:wsNextM}
.ws[data-size="medium"] .ws-tk.go-prev{animation-name:wsPrevM}
@keyframes wsNext{0%{opacity:0;transform:translateX(40px) rotate(3deg)}60%{opacity:1;transform:translateX(-4px) rotate(-.5deg)}100%{opacity:1;transform:none}}
@keyframes wsPrev{0%{opacity:0;transform:translateX(-40px) rotate(-3deg)}60%{opacity:1;transform:translateX(4px)}100%{opacity:1;transform:none}}
@keyframes wsNextM{0%{opacity:0;transform:translate(40px,-50%) rotate(3deg)}60%{opacity:1;transform:translate(-4px,-50%) rotate(-.5deg)}100%{opacity:1;transform:translateY(-50%)}}
@keyframes wsPrevM{0%{opacity:0;transform:translate(-40px,-50%) rotate(-3deg)}60%{opacity:1;transform:translate(4px,-50%)}100%{opacity:1;transform:translateY(-50%)}}
@keyframes wsNudge{30%{transform:translateX(-6px)}60%{transform:translateX(4px)}}
/* 4×1: the same ticket, shorter */
.ws[data-size="medium"] .cwt-tk{height:62px;padding:5px;gap:8px;--seam:calc(100% - 71px)}
.ws[data-size="medium"] .cwt-main{padding:6px 10px 0 12px}
.ws[data-size="medium"] .cwt-big{margin-top:3px;font-size:14.5px}
.ws[data-size="medium"] .cwt-stub{width:62px;padding:4px}
.ws[data-size="medium"] .cwt-frame small{display:none}
.ws[data-size="medium"] .cwt-frame b{font-size:12px}
.ws[data-size="medium"] .cwt-stamp{width:44px;height:44px;margin-top:-22px;right:9px;font-size:10px}
.ws[data-size="medium"] .cwt-stamp small{font-size:8px}
/* 4×2: two more tickets peeking from under the top one */
.ws-under{position:absolute;top:30px;height:88px;border-radius:12px;background:color-mix(in srgb,var(--c) 85%,var(--d) 8%)}
.ws-under.u1{left:22px;right:22px;opacity:.9;transform:translateY(-5px) scale(.97)}
.ws-under.u2{left:32px;right:32px;opacity:.65;transform:translateY(-10px) scale(.94)}
.ws-bar{position:absolute;left:16px;right:16px;bottom:11px;display:flex;align-items:center;gap:6px}
.ws-pos{flex:1;text-align:center;font-size:12px;color:#44546A;font-variant-numeric:tabular-nums}
.desk-widget-inner.w-glass .ws .ws-arr{width:34px;height:34px;flex:none;padding:0;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#44546A;background:rgb(255 255 255/40%);border:1px solid rgb(255 255 255/80%);cursor:pointer;transition:transform .45s cubic-bezier(.34,1.5,.5,1)}
.ws-arr svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.desk-widget-inner.w-glass .ws .ws-btn{width:auto;height:34px;padding:0 15px;font-size:12px}
.desk-widget-inner.w-glass .ws .ws-btn:not(.ws-done){color:#6A7A8B;background:rgb(255 255 255/55%);border:1px solid rgb(255 255 255/85%);box-shadow:none}
/* empty: a dashed outline of a ticket */
.ws-empty,.desk-widget-inner.w-glass .ws.ws-empty{display:flex;align-items:center;justify-content:center;padding:12px}
.ws-ghost{flex:1;align-self:stretch;display:flex;flex-direction:column;justify-content:center;gap:4px;padding:0 18px;border:1.5px dashed rgb(99 70 79/30%);border-radius:12px}
.ws[data-size="medium"] .ws-ghost{flex-direction:row;align-items:center;justify-content:space-between}
.ws-cap{font-size:15px;color:#2F3D4B;font-family:var(--font-display,serif)}
.ws-sub{font-size:12px;color:#44546A}
.ws-go{font-size:12.5px;color:#63464F}
.ws[data-size="large"] .ws-go{margin-top:8px}
@media (prefers-reduced-motion:reduce){.wj,.wj *,.wj-pop,.wj-layer *,.ws,.ws *{animation:none!important;transition:none!important}}

/* ── 今天的小事 (小组件第三批): your circle in the chosen colour, his in a quiet ink; both ticked → struck through ── */
.desk-widget-inner.w-glass:has(>.td){padding:0;overflow:visible}
.td{--td-acc:var(--wp-acc,#5E9278);--td-his:#3A424B;--td-soft:color-mix(in srgb,var(--td-acc) 40%,transparent);position:relative;width:100%;height:100%;box-sizing:border-box;color:#2F3D4B;font-family:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}
.td-cap{font-size:11px;color:#44546A;letter-spacing:.03em}
.td-ring{display:block;width:100%;height:100%}
.td-ring-bg{fill:none;stroke:rgb(255 255 255/65%)}
.td-ring-fg{fill:none;stroke:var(--td-acc);stroke-linecap:round;transition:stroke-dashoffset .9s cubic-bezier(.34,1.5,.5,1)}
.td-ringbox{position:relative;display:block;width:92px;height:92px}
.td-num{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center}
.td-num b{font-weight:400;font-size:26px;line-height:1;color:#2F3D4B;font-family:var(--font-display,serif)}
.td-num small{font-size:13px;color:#44546A}
.td-num em{font-style:normal;font-size:10px;color:#44546A;margin-top:3px}
.td .pop{animation:tdPop .45s ease both}
@keyframes tdPop{0%{transform:scale(.8)}40%{transform:scale(1.18)}65%{transform:scale(.95)}100%{transform:scale(1)}}
/* 4×2 */
.td[data-size="large"] .td-left{position:absolute;left:16px;top:18px;bottom:14px;width:92px;display:flex;flex-direction:column;align-items:center}
.td-day{margin-top:auto}
.td[data-size="large"] .td-list{position:absolute;left:124px;right:14px;top:12px;bottom:12px;display:flex;flex-direction:column}
.td-head{display:flex;justify-content:flex-end;gap:12px;padding-right:0;margin-bottom:1px}
.td-head span{width:26px;text-align:center;font-size:10px;color:#44546A}
.td-row{display:flex;align-items:center;gap:12px;min-height:30px}
.td[data-size="square"] .td-row{gap:8px;min-height:27px}
.td-row.drop{animation:tdDrop .45s ease both}
@keyframes tdDrop{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1;transform:translateY(2px)}100%{opacity:1;transform:none}}
.td-t{position:relative;flex:1;min-width:0;font-size:13px;color:#2F3D4B;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.td-t i{position:absolute;left:0;top:52%;width:100%;height:1.2px;background:rgb(47 61 75/55%);transform:scaleX(0);transform-origin:0 50%;transition:transform .45s ease}
.td-t.done{color:#6A7A8B}.td-t.done i{transform:scaleX(1);transition-delay:.2s}
.desk-widget-inner.w-glass .td .td-me{position:relative;width:26px;height:26px;flex:none;margin:0;padding:0;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;
  border:1.5px solid color-mix(in srgb,var(--td-acc) 45%,transparent);background:rgb(255 255 255/45%);transition:background .25s,border-color .25s,transform .45s cubic-bezier(.34,1.5,.5,1)}
.desk-widget-inner.w-glass .td[data-size="square"] .td-me{width:22px;height:22px}
.desk-widget-inner.w-glass .td .td-me.on{background:var(--td-acc);border-color:var(--td-acc)}
.td-me:active{transform:scale(.9,.88)}
.td-me svg{width:14px;height:14px;fill:none;stroke:#fff;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round}
.td[data-size="square"] .td-me svg{width:12px;height:12px}
.td-me svg path{stroke-dasharray:24;stroke-dashoffset:24;transition:stroke-dashoffset .35s ease}
.td-me.on svg path{stroke-dashoffset:0;transition-delay:.08s}
.td-sparks{position:absolute;left:50%;top:50%;pointer-events:none}
.td-sparks b{position:absolute;width:4px;height:4px;margin:-2px;border-radius:50%;background:var(--td-acc);animation:tdSpark .5s ease-out both}
.td-sparks b:nth-child(even){background:#E3B7C4}
.td-sparks b:nth-child(1){--dx:-16px;--dy:-12px}.td-sparks b:nth-child(2){--dx:16px;--dy:-14px}.td-sparks b:nth-child(3){--dx:-14px;--dy:14px}
.td-sparks b:nth-child(4){--dx:15px;--dy:12px}.td-sparks b:nth-child(5){--dx:0;--dy:-19px}.td-sparks b:nth-child(6){--dx:0;--dy:18px}
@keyframes tdSpark{0%{opacity:1;transform:translate(0,0) scale(.4)}100%{opacity:0;transform:translate(var(--dx),var(--dy)) scale(1)}}
.td-his{width:26px;height:26px;flex:none;box-sizing:border-box;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:10px;color:#fff;border:1.5px solid rgb(58 66 75/25%);cursor:help}
.td-his.on{background:var(--td-his);border-color:var(--td-his)}
.td-hisdot{width:8px;height:8px;flex:none;border-radius:50%;background:rgb(58 66 75/20%)}
.td-hisdot.on{background:var(--td-his)}
.desk-widget-inner.w-glass .td .td-add{width:auto;margin:auto 0 0;align-self:flex-start;height:28px;padding:0 11px;border-radius:14px;font-size:11.5px;color:color-mix(in srgb,var(--td-acc) 60%,#2F3D4B);cursor:pointer;
  background:color-mix(in srgb,var(--td-acc) 22%,rgb(255 255 255/40%));border:1px solid rgb(255 255 255/80%)}
.desk-widget-inner.w-glass .td .td-add[disabled]{opacity:.6;cursor:default}
.td-none{display:flex;flex-direction:column;gap:4px;margin-top:6px;font-size:14px;color:#2F3D4B}
.td-none small{font-size:11.5px;color:#44546A}
.td-go,.td-more{font-size:12px;color:color-mix(in srgb,var(--td-acc) 60%,#2F3D4B)}
.td-more{margin-top:2px}
/* 2×2 */
.td[data-size="square"]{display:flex;flex-direction:column;padding:14px 14px 12px}
.td-top{display:flex;justify-content:space-between;align-items:baseline}
.td-frac{font-weight:400;font-size:20px;color:#2F3D4B;font-family:var(--font-display,serif)}
.td-bar{display:block;height:6px;margin:8px 0 6px;border-radius:3px;background:rgb(255 255 255/55%);overflow:hidden}
.td-bar i{display:block;height:100%;border-radius:3px;background:var(--td-acc);transition:width .8s cubic-bezier(.34,1.5,.5,1)}
.td[data-size="square"] .td-list{flex:1;display:flex;flex-direction:column;min-height:0}
.td[data-size="square"] .td-t{font-size:12.5px}
.td[data-size="square"] .td-add{margin-top:auto}
/* 4×1 */
.td[data-size="medium"]{display:flex;align-items:center;gap:12px;padding:0 16px}
.td-ringbox.s{width:48px;height:48px;flex:none}
.td-ringbox.s .td-frac{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:12px}
.td-mid{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.td-next{font-size:15px;color:#2F3D4B;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.desk-widget-inner.w-glass .td[data-size="medium"] .td-me{width:34px;height:34px}
.td-me.td-plus{font-size:18px;color:var(--td-acc)}
/* all done by both: hearts float up (may rise past the widget) */
.td-hearts{position:absolute;left:0;right:0;bottom:16px;height:0;pointer-events:none;z-index:5}
.td-hearts i{position:absolute;bottom:0;width:12px;height:11px;background:#E3A3B3;clip-path:path("M6 10.5C2.5 8 0 6 0 3.3A3 3 0 0 1 6 2a3 3 0 0 1 6 1.3C12 6 9.5 8 6 10.5z");animation:tdFloat 1.4s ease-out both}
.td-hearts i:nth-child(even){background:color-mix(in srgb,var(--td-acc) 65%,#fff)}
.td-hearts i:nth-child(1){left:12%;--rot:-36deg}.td-hearts i:nth-child(2){left:24%;--rot:-24deg;animation-delay:.08s}.td-hearts i:nth-child(3){left:36%;--rot:-12deg;animation-delay:.16s}
.td-hearts i:nth-child(4){left:48%;--rot:0deg;animation-delay:.24s}.td-hearts i:nth-child(5){left:60%;--rot:12deg;animation-delay:.32s}.td-hearts i:nth-child(6){left:72%;--rot:24deg;animation-delay:.4s}.td-hearts i:nth-child(7){left:84%;--rot:36deg;animation-delay:.48s}
@keyframes tdFloat{0%{opacity:0;transform:translateY(0) scale(.6)}20%{opacity:1}100%{opacity:0;transform:translateY(-120px) scale(1.1) rotate(var(--rot))}}
@media (prefers-reduced-motion:reduce){.td,.td *{animation:none!important;transition:none!important}}

/* ── 在路上 (小组件第三批): --ow-c / --ow-t follow the item (gift rose, 外卖 apricot, purchase lilac) unless a colour is picked ── */
.desk-widget-inner.w-glass:has(>.otw){padding:0}
.otw{--ow-c:#8A4A57;--ow-t:240,204,214;position:relative;display:flex;flex-direction:column;width:100%;height:100%;box-sizing:border-box;padding:15px 18px 14px;color:#2F3D4B;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:transform .45s cubic-bezier(.34,1.5,.5,1)}
.otw:active{transform:scale(.97,.95);transition:transform .1s ease-out}
.otw-cap{display:block;font-size:11px;color:#44546A}
.otw-chip{display:inline-flex;align-items:center;justify-content:center;flex:none;width:30px;height:30px;border-radius:10px;color:var(--ow-c);background:linear-gradient(160deg,rgba(var(--ow-t),.5),rgba(var(--ow-t),.62));border:1px solid rgb(255 255 255/85%);box-shadow:inset 1px 1px 0 rgb(255 255 255/90%)}
.otw-chip.big{width:38px;height:38px;border-radius:13px}
.otw-chip svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.otw-chip.big svg{width:17px;height:17px}
.otw-top{display:flex;align-items:flex-start;gap:10px}
.otw-what{flex:1;min-width:0}
.otw-name{display:block;font-size:15px;color:#2F3D4B;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.otw-name.s{font-size:12.5px;margin-top:10px}
.otw-name.m{font-size:13.5px;flex:1;min-width:0}
.otw-eta{display:flex;flex-direction:column;align-items:flex-end;gap:3px;flex:none}
.otw-roll{display:block;overflow:hidden;height:30px;text-align:right}
.otw-roll.s{height:40px;text-align:left;margin-top:4px}
.otw-n{display:block;font-size:24px;line-height:1.15;color:#2F3D4B;font-family:var(--font-display,serif)}
.otw-roll.s .otw-n{font-size:30px}
.otw-n.m{display:inline;font-size:13px;flex:none;margin-left:8px;font-family:inherit}
.otw-n small{font-size:12px;color:#44546A;margin-left:2px;font-family:inherit}
.otw-n.roll{animation:owRoll .5s cubic-bezier(.34,1.4,.5,1) both}
@keyframes owRoll{0%{transform:translateY(60%);opacity:0}60%{transform:translateY(-8%);opacity:1}100%{transform:none;opacity:1}}
.desk-widget-inner.w-glass .otw .otw-more{width:auto;font-size:10.5px;color:#44546A;white-space:nowrap;padding:1px 8px;border-radius:9px;background:rgb(255 255 255/45%);border:1px solid rgb(255 255 255/80%);cursor:pointer}
.otw-map{position:relative;display:block;height:46px;margin-top:10px}
.otw-route{position:absolute;inset:0;width:100%;height:100%;overflow:visible}
.otw-route path{fill:none;stroke-linecap:round}
.otw-route .bg,.otw-route.e path{stroke:rgb(78 103 128/25%);stroke-width:2;stroke-dasharray:3 5}
.otw-route .fg{stroke:var(--ow-c);opacity:.75;stroke-width:2.5;stroke-dasharray:100;transition:stroke-dashoffset .9s cubic-bezier(.34,1.4,.5,1)}
.otw-pin{position:absolute;width:20px;height:20px;border-radius:7px;display:flex;align-items:center;justify-content:center;color:#44546A;background:rgb(255 255 255/60%);border:1px solid rgb(255 255 255/85%)}
.otw-pin svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.otw-pin.shop{left:0;top:24px}.otw-pin.home{right:0;top:14px}
.otw-rider{position:absolute;width:24px;height:24px;margin-left:-12px;transition:left .9s cubic-bezier(.34,1.4,.5,1),top .9s cubic-bezier(.34,1.4,.5,1)}
.otw-chip.rider{position:relative;width:24px;height:24px;border-radius:50%;background:rgb(255 255 255/90%);box-shadow:0 3px 8px -3px rgb(30 48 72/45%);animation:owBob 1.6s ease-in-out infinite}
.otw-chip.rider svg{width:13px;height:13px}
.otw-ping{position:absolute;inset:0;border-radius:50%;background:rgba(var(--ow-t),.9);animation:owPing 1.6s ease-out infinite}
@keyframes owBob{50%{transform:translateY(-2px)}}
@keyframes owPing{0%{transform:scale(.6);opacity:.7}100%{transform:scale(2.2);opacity:0}}
.otw-steps{margin-top:auto;position:relative;display:flex;justify-content:space-between;align-items:center;padding:0 2px}
.otw-steps::before{content:"";position:absolute;left:10px;right:10px;top:50%;border-top:1px dashed rgb(78 103 128/25%)}
.otw-step{position:relative;display:flex;align-items:center;gap:5px;white-space:nowrap;font-size:11px;line-height:1;padding:4px 9px 4px 7px;border-radius:11px;color:#7A8899;background:rgb(255 255 255/35%);border:1px solid transparent}
.otw-step i{display:block;width:5px;height:5px;border-radius:50%;background:rgb(78 103 128/30%)}
.otw-step.past{color:#44546A}.otw-step.past i,.otw-step.on i{background:var(--ow-c)}
.otw-step.on{color:var(--ow-c);background:rgba(var(--ow-t),.6);border-color:rgb(255 255 255/90%);font-weight:500}
.otw-row{display:flex;justify-content:space-between;align-items:center}
.otw-tag{font-size:10.5px;padding:2px 8px;border-radius:10px;color:var(--ow-c);background:rgba(var(--ow-t),.55);border:1px solid rgb(255 255 255/85%)}
.otw-bar{position:relative;display:block;height:6px;margin-top:auto;border-radius:3px;background:rgb(255 255 255/65%)}
.otw-bar i{position:absolute;left:0;top:0;bottom:0;border-radius:3px;background:var(--ow-c);opacity:.7;transition:width .9s cubic-bezier(.34,1.4,.5,1)}
.otw-bar b{position:absolute;top:50%;width:12px;height:12px;margin:-6px 0 0 -6px;border-radius:50%;background:#fff;box-shadow:0 2px 5px rgb(30 48 72/35%);transition:left .9s cubic-bezier(.34,1.4,.5,1)}
.otw[data-size="medium"]{flex-direction:row;align-items:center;gap:12px;padding:0 18px 0 16px}
.otw-mid{flex:1;min-width:0;display:flex;flex-direction:column;gap:7px}
.otw-line{display:flex;align-items:baseline}
.otw[data-size="medium"] .otw-bar{height:5px;margin-top:0}
/* arrived: a gift box drops in; a tap flips the lid off with sparks */
.otw-box{position:absolute;right:22px;top:64px;width:40px;height:40px}
.otw[data-size="square"] .otw-box{right:16px;top:auto;bottom:16px;width:36px;height:36px}
.otw-box.drop{animation:owArrive .7s ease both}
@keyframes owArrive{0%{transform:scale(.6) translateY(-10px)}45%{transform:scale(1.2,.85)}65%{transform:scale(.92,1.1) translateY(-4px)}85%{transform:scale(1.04,.97)}100%{transform:none}}
.otw-lid{position:absolute;left:-3px;right:-3px;top:4px;height:10px;border-radius:3px;z-index:2;background:linear-gradient(180deg,rgba(var(--ow-t),1),rgba(var(--ow-t),.85));box-shadow:0 2px 3px rgb(30 48 72/20%)}
.otw-body{position:absolute;left:2px;right:2px;top:13px;bottom:0;border-radius:4px;overflow:hidden;background:linear-gradient(180deg,rgba(var(--ow-t),.8),rgba(var(--ow-t),1));box-shadow:0 6px 10px -6px rgb(30 48 72/50%)}
.otw-body b{position:absolute;left:50%;top:0;bottom:0;width:6px;margin-left:-3px;background:rgb(255 255 255/75%)}
.otw-lid::after{content:"";position:absolute;left:50%;top:0;bottom:0;width:6px;margin-left:-3px;background:rgb(255 255 255/75%)}
.otw-sparks{position:absolute;left:50%;top:40%}
.otw-sparks b{position:absolute;width:5px;height:5px;margin:-2.5px;border-radius:50%;opacity:0;background:#F2D7A0}
.otw-sparks b:nth-child(even){background:#E3A3B3}
.otw-sparks b:nth-child(1){--dx:-22px;--dy:-18px}.otw-sparks b:nth-child(2){--dx:22px;--dy:-20px}.otw-sparks b:nth-child(3){--dx:-26px;--dy:4px}.otw-sparks b:nth-child(4){--dx:26px;--dy:2px}.otw-sparks b:nth-child(5){--dx:0;--dy:-28px}
.otw-box.open .otw-lid{animation:owLid .6s ease both}
.otw-box.open .otw-sparks b{animation:owSpark .6s ease-out both}
@keyframes owLid{40%{transform:translateY(-14px) rotate(-18deg)}100%{transform:translate(-14px,-26px) rotate(-40deg);opacity:0}}
@keyframes owSpark{0%{opacity:1;transform:translate(0,0) scale(.4)}100%{opacity:0;transform:translate(var(--dx),var(--dy)) scale(1)}}
/* nothing on the way */
.otw-empty .otw-route.e{position:relative;display:block;height:30px;margin-top:22px}
.otw-none{font-size:14px;color:#2F3D4B;margin-top:10px}
.otw[data-size="square"].otw-empty .otw-none{margin-top:auto;font-size:13px}
.otw[data-size="medium"].otw-empty{justify-content:space-between}
.otw[data-size="medium"].otw-empty .otw-none{margin-top:0;font-size:13.5px}
.otw-btns{margin-top:auto;display:flex;gap:8px}
.desk-widget-inner.w-glass .otw .otw-btn{width:auto;height:34px;padding:0 14px;border-radius:17px;font-size:12px;color:#44546A;background:rgb(255 255 255/45%);border:1px solid rgb(255 255 255/85%);cursor:pointer}
.desk-widget-inner.w-glass .otw .otw-btn.rose{color:#63464F;background:rgb(240 204 214/60%)}
.desk-widget-inner.w-glass .otw .otw-link{width:auto;margin-top:4px;font-size:12px;color:#63464F;text-align:left;cursor:pointer}
.otw[data-size="medium"] .otw-link{margin-top:0}
@media (prefers-reduced-motion:reduce){.otw,.otw *{animation:none!important;transition:none!important}}

/* ── 他在想 (小组件第三批): words behind fogged glass; each fog cell is a soft blob that a finger wipes away ── */
.desk-widget-inner.w-glass:has(>.tg){padding:0}
.tg{--tg-fog:var(--wp-tint,200,215,232);position:relative;width:100%;height:100%;box-sizing:border-box;overflow:hidden;border-radius:inherit;color:#2F3D4B}
.tg-cap{font-size:11px;color:#44546A}
.tg-av{width:22px;height:22px;flex:none;box-sizing:border-box;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:10px;color:#fff;background:color-mix(in srgb,var(--wp-acc,#5F7F9F) 35%,#3A424B);border:1.5px solid rgb(255 255 255/90%)}
.tg-av.s{width:20px;height:20px;font-size:9px}
.tg-av.m{width:30px;height:30px;font-size:12px}
.tg-top{position:absolute;left:18px;right:18px;top:15px;z-index:3;display:flex;align-items:center;gap:8px}
.tg-top .tg-cap{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tg[data-size="square"] .tg-top{left:14px;right:14px;top:13px}
.tg-words{position:absolute;left:22px;right:22px;top:50px;bottom:34px;display:flex;align-items:center;align-items:safe center;font-size:15.5px;line-height:1.75;font-style:italic;color:#2F3D4B;overflow:hidden}
.tg[data-size="square"] .tg-words{left:16px;right:14px;top:40px;bottom:30px;font-size:13px;line-height:1.6}
.tg-in{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}
.tg[data-size="square"] .tg-in{-webkit-line-clamp:4}
.tg[data-size="medium"] .tg-in{display:inline}
.tg-words.none{font-style:normal;font-size:13.5px;color:#44546A;justify-content:center;text-align:center;z-index:2}
.tg-fog{position:absolute;left:10px;right:10px;top:44px;bottom:28px;z-index:1;display:grid;grid-template-columns:repeat(var(--cols),1fr);grid-template-rows:repeat(var(--rows),1fr);touch-action:none;cursor:grab}
.tg[data-size="square"] .tg-fog{left:8px;right:8px;top:36px;bottom:26px}
.tg-fog i{display:block;margin:-40%;border-radius:50%;pointer-events:none;transition:opacity .9s ease;background:radial-gradient(circle,color-mix(in srgb,rgb(var(--tg-fog)) 22%,rgb(240 245 250/97%)) 40%,rgb(238 244 250/0%) 72%)}
.tg-fog i.clear{opacity:0!important;transition:opacity .18s ease}
.tg-drop{position:absolute;z-index:2;pointer-events:none;width:3px;height:5px;border-radius:50%;background:radial-gradient(circle at 35% 30%,rgb(255 255 255/95%),rgb(200 215 232/50%));box-shadow:0 1px 1px rgb(30 48 72/15%);animation:tgDrip 5s ease-in infinite}
.tg-drop:nth-of-type(1){left:14%;top:30%}.tg-drop:nth-of-type(2){left:67%;top:59%;width:4px;height:6px;animation-duration:6s;animation-delay:1.3s}
.tg-drop:nth-of-type(3){left:50%;top:38%;height:7px;animation-duration:7s;animation-delay:2.6s}.tg-drop:nth-of-type(4){left:33%;top:47%;width:4px;animation-duration:8s;animation-delay:3.9s}.tg-drop:nth-of-type(5){left:86%;top:36%;height:6px;animation-duration:9s;animation-delay:5.2s}
@keyframes tgDrip{0%,70%{transform:none;opacity:1}100%{transform:translateY(40px);opacity:0}}
.desk-widget-inner.w-glass .tg .tg-peek{width:auto;flex:none;height:30px;padding:0 12px;border-radius:15px;font-size:11.5px;color:#44546A;background:rgb(255 255 255/45%);border:1px solid rgb(255 255 255/80%);cursor:pointer;position:relative;z-index:3}
.desk-widget-inner.w-glass .tg[data-size="square"] > .tg-peek{position:absolute;left:0;right:0;bottom:6px;width:100%;height:24px;padding:0;border:0;background:none;font-size:11px;text-align:center}
.desk-widget-inner.w-glass .tg[data-size="medium"] > .tg-peek{position:absolute;right:16px;top:50%;margin-top:-15px}
.tg-hint{position:absolute;left:0;right:0;bottom:10px;z-index:3;text-align:center;font-size:12px;color:#44546A;pointer-events:none;transition:opacity .4s;animation:tgBreathe 2.4s ease-in-out infinite}
.tg.wiped .tg-hint{opacity:0;animation:none}
@keyframes tgBreathe{50%{opacity:.55}}
/* 4×1 */
.tg[data-size="medium"] .tg-av{position:absolute;left:16px;top:50%;margin-top:-15px;z-index:3}
.tg-mid{position:absolute;left:58px;right:18px;top:0;bottom:0;display:flex;flex-direction:column;justify-content:center}
.tg[data-size="medium"] .tg-words{position:static;display:block;font-size:13.5px;line-height:1.5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tg[data-size="medium"] .tg-words.none{text-align:left}
.tg[data-size="medium"] .tg-fog{left:52px;right:10px;top:36px;bottom:10px}
@media (prefers-reduced-motion:reduce){.tg *{animation:none!important;transition:none!important}}
