viberoom 0.5.8 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/ui/app.css CHANGED
@@ -16,8 +16,8 @@
16
16
  .shell.resizing { user-select: none; cursor: col-resize; }
17
17
  .rail { grid-area: rail; position: relative; display: flex; flex-direction: column; align-items: stretch; padding: 8px 0 4px; min-height: 0; }
18
18
  .rail-head { display: flex; align-items: center; margin-bottom: 14px; padding: 0 14px; }
19
- .rail-logo { display: flex; align-items: center; gap: 10px; border: 0; background: none; padding: 0; margin: 0; color: var(--ink); font-weight: 800; font-size: 18px; white-space: nowrap; border-radius: 14px; }
20
- .rail-logo .mark { width: 44px; height: 44px; border-radius: 14px; flex: none; display: block; box-shadow: 0 8px 18px -6px rgba(91, 91, 240, 0.6); }
19
+ .rail-logo { display: flex; align-items: center; gap: 10px; border: 0; background: none; padding: 0; margin: 0; color: var(--ink); font-weight: 800; font-size: calc(18px * var(--fs-scale)); white-space: nowrap; border-radius: 14px; }
20
+ .rail-logo .mark { width: 44px; height: 44px; border-radius: 14px; flex: none; display: block; box-shadow: var(--rail-logo-shadow); }
21
21
  .rail-logo .word, .rail-item .label, .rail .conn-label { opacity: 0; width: 0; overflow: hidden; transition: opacity var(--t-base) var(--ease-out), width var(--t-base) var(--ease-out); white-space: nowrap; }
22
22
  .shell.rail-open .rail-logo .word, .shell.rail-open .rail-item .label, .shell.rail-open .rail .conn-label { opacity: 1; width: auto; }
23
23
  .rail-items { display: flex; flex-direction: column; gap: 10px; align-items: center; flex: 1 1 auto; min-height: 0; }
@@ -40,64 +40,72 @@
40
40
  @keyframes badge-pop { 0% { transform: scale(0.6); } 55% { transform: scale(1.3); } 100% { transform: scale(1); } }
41
41
  .shell.rail-open .rail-items { align-items: stretch; padding: 0 14px; }
42
42
  .shell:not(.rail-open) .rail-item, .shell:not(.rail-open) .rail-logo { gap: 0; }
43
- .rail-item.new:hover { background: #fff; color: var(--primary); box-shadow: var(--shadow-tile); }
43
+ .rail-item.new:hover { background: var(--rail-active-bg); color: var(--primary); box-shadow: var(--shadow-tile); }
44
44
  .rail-toggle { width: 44px; height: 24px; margin-top: 8px; border-radius: 8px; border: 0; background: transparent; color: var(--faint); display: grid; place-content: center; padding: 0; align-self: center; transition: background var(--t-fast), color var(--t-fast); }
45
45
  .rail-toggle .i { width: 16px; height: 16px; }
46
- .rail-toggle:hover { background: #fff; color: var(--primary); }
46
+ .rail-toggle:hover { background: var(--rail-active-bg); color: var(--primary); }
47
47
  .rail-foot { position: relative; margin-top: auto; display: flex; flex-direction: column; gap: 0; align-items: center; }
48
- .update-pop { position: absolute; left: 12px; bottom: calc(100% - 2px); z-index: 30; display: flex; gap: 6px; align-items: flex-start; width: 250px; padding: 10px 8px 10px 14px; background: #fff; border-radius: 18px 18px 18px 6px; box-shadow: 0 10px 28px -12px rgba(28, 27, 51, 0.45), var(--shadow-tile); font-size: 12.5px; font-weight: 600; color: var(--ink-2); animation: bubble-in 0.45s var(--ease-out); }
49
- .update-pop::after { content: ""; position: absolute; left: 14px; bottom: -6px; width: 12px; height: 12px; background: #fff; border-radius: 0 0 3px 0; transform: rotate(45deg); box-shadow: 3px 3px 4px -3px rgba(28, 27, 51, 0.25); }
48
+ .update-pop { position: absolute; left: 12px; bottom: calc(100% - 2px); z-index: 30; display: flex; gap: 6px; align-items: flex-start; width: 250px; padding: 10px 8px 10px 14px; background: var(--pop-bg); border-radius: 18px 18px 18px 6px; box-shadow: var(--pop-shadow), var(--shadow-tile); font-size: calc(12.5px * var(--fs-scale)); font-weight: 600; color: var(--ink-2); animation: bubble-in 0.45s var(--ease-out); }
49
+ .update-pop::after { content: ""; position: absolute; left: 14px; bottom: -6px; width: 12px; height: 12px; background: var(--pop-bg); border-radius: 0 0 3px 0; transform: rotate(45deg); box-shadow: var(--pop-arrow-shadow); }
50
50
  .update-pop .up-main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 8px; }
51
51
  .update-pop .up-text { line-height: 1.4; }
52
52
  .update-pop .up-text b { color: var(--ink); }
53
53
  .update-pop .up-go { align-self: flex-start; }
54
54
  .update-pop .up-side { flex: none; display: flex; flex-direction: column; gap: 2px; }
55
- .update-pop .icon-btn.sm { width: 26px; height: 26px; }
55
+ .update-pop [data-ui="icon-button"] { width: 26px; height: 26px; }
56
56
  .shell.rail-open .rail-foot { align-items: stretch; padding: 0 14px; }
57
- .rail-item { position: relative; display: flex; align-items: center; justify-content: center; gap: 10px; width: 44px; height: 44px; padding: 0; border: 0; background: transparent; border-radius: 14px; color: var(--muted); font-weight: 800; font-size: 13px; white-space: nowrap; transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast); }
57
+ .rail-item { position: relative; display: flex; align-items: center; justify-content: center; gap: 10px; width: 44px; height: 44px; padding: 0; border: 0; background: transparent; border-radius: 14px; color: var(--muted); font-weight: 800; font-size: calc(13px * var(--fs-scale)); white-space: nowrap; transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast); }
58
58
  .shell.rail-open .rail-item { width: auto; justify-content: flex-start; padding: 0 12px 0 0; }
59
59
  .rail-item .ico { width: 44px; height: 44px; display: grid; place-content: center; flex: none; }
60
60
  .rail-item .ico .i { width: 22px; height: 22px; }
61
61
  .rail-item:hover { color: var(--primary); }
62
- .rail-item.active { background: #fff; color: var(--primary); box-shadow: var(--shadow-tile); }
63
- .rail-item.me { background: #fff; box-shadow: var(--shadow-tile); }
62
+ .rail-item.active { background: var(--rail-active-bg); color: var(--primary); box-shadow: var(--shadow-tile); }
63
+ .rail-item.me { background: var(--rail-active-bg); box-shadow: var(--shadow-tile); }
64
64
  .rail-item.me .ico .avatar { display: block; }
65
65
  .rail-item.me .ico .av-tile { background: transparent !important; }
66
- .rail-count { position: absolute; top: -4px; right: -4px; background: var(--primary); color: #fff; border-radius: var(--r-pill); font-size: 10px; padding: 0 6px; font-weight: 800; line-height: 16px; box-shadow: 0 0 0 2px var(--bg); }
66
+ .rail-count { position: absolute; top: -4px; right: -4px; background: var(--primary); color: var(--tile-count-ink); border-radius: var(--r-pill); font-size: calc(10px * var(--fs-scale)); padding: 0 6px; font-weight: 800; line-height: calc(16px * var(--fs-scale)); box-shadow: 0 0 0 2px var(--bg); }
67
67
  .shell.rail-open .rail-count { position: static; margin-left: auto; box-shadow: none; }
68
68
  .rail-status { position: relative; height: 0; width: 44px; align-self: center; }
69
- .shell.rail-open .rail-status { width: auto; height: auto; display: flex; align-items: center; gap: 8px; padding: 8px 0 0 14px; color: var(--muted); font-size: 11px; font-weight: 700; }
69
+ .shell.rail-open .rail-status { width: auto; height: auto; display: flex; align-items: center; gap: 8px; padding: 8px 0 0 14px; color: var(--muted); font-size: calc(11px * var(--fs-scale)); font-weight: 700; }
70
70
  .rail .conn { position: absolute; right: -3px; top: -11px; width: 14px; height: 14px; border-radius: 50%; background: var(--faint); border: 3px solid var(--bg); transition: background var(--t-base); }
71
71
  .shell.rail-open .rail .conn { position: static; width: 9px; height: 9px; border: 0; }
72
72
  .rail .conn.ok { background: var(--green); }
73
73
  .side { grid-area: side; background: var(--panel); border-radius: var(--r-lg); box-shadow: var(--edge); display: flex; flex-direction: column; min-height: 0; min-width: 0; overflow: hidden; }
74
74
  .side-rooms, .side-room { display: flex; flex-direction: column; min-height: 0; flex: 1; animation: fade-in var(--t-base) var(--ease-out); }
75
75
  .side-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 20px 20px 8px; }
76
- .side-head h2 { font-size: 21px; letter-spacing: -0.01em; }
76
+ .side-head h2 { font-size: calc(21px * var(--fs-scale)); letter-spacing: -0.01em; }
77
77
  .side-head.room { align-items: flex-start; padding: 20px 14px 6px 20px; gap: 6px; }
78
78
  .side-head.room #back-to-rooms { margin: 2px 0 0 -8px; }
79
79
  .side-room-title { flex: 1; min-width: 0; }
80
- .side-room-title h2 { font-size: 21px; line-height: 1.1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
81
- .side-room-title .hint { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; font-weight: 600; color: var(--muted); margin-top: 5px; }
82
- .side-head.room .icon-btn { flex: none; margin-top: 2px; }
80
+ .side-room-title h2 { font-size: calc(21px * var(--fs-scale)); line-height: 1.1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
81
+ .side-room-title .hint { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: calc(12px * var(--fs-scale)); font-weight: 600; color: var(--muted); margin-top: 5px; }
82
+ .side-head.room [data-ui="icon-button"] { flex: none; margin-top: 2px; }
83
83
  .search { display: flex; align-items: center; gap: 8px; background: var(--softer); border: 0; border-radius: var(--r-pill); padding: 0 14px; height: 38px; margin: 4px 14px 10px; min-width: 0; cursor: text; transition: background var(--t-fast), box-shadow var(--t-fast); }
84
84
  .search:hover { background: var(--lav); }
85
85
  .search:focus-within { background: var(--lav); box-shadow: 0 0 0 2px var(--primary); }
86
- .search input { border: 0; background: transparent; outline: none; flex: 1; min-width: 0; font-size: 13px; font-weight: 700; height: 100%; }
86
+ .search input { border: 0; background: transparent; outline: none; flex: 1; min-width: 0; font-size: calc(13px * var(--fs-scale)); font-weight: 700; height: 100%; }
87
87
  .search input::placeholder { color: var(--placeholder); font-weight: 600; }
88
88
  .search input::-webkit-search-cancel-button { appearance: none; }
89
89
  .search-icon { color: var(--placeholder); }
90
90
  .search-icon .i { width: 16px; height: 16px; }
91
91
  .side-actions { padding: 8px 14px 6px; }
92
- .side-label { padding: 12px 20px 6px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--faint); font-weight: 800; }
92
+ .side-label { padding: 12px 20px 6px; font-size: calc(11px * var(--fs-scale)); text-transform: uppercase; letter-spacing: 0.1em; color: var(--faint); font-weight: 800; }
93
93
  .side-list { list-style: none; margin: 0; padding: 4px 14px 10px; overflow-y: auto; flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 6px; }
94
94
  .side-list li { display: flex; align-items: center; gap: 12px; padding: 8px 10px; border-radius: 14px; cursor: pointer; transition: background var(--t-fast); animation: slide-in-left var(--t-base) var(--ease-out); }
95
95
  .participants .avatar.has-life { cursor: pointer; }
96
96
  .participants li { position: relative; }
97
- .participants .p-gear { position: absolute; top: 4px; right: 6px; width: 24px; height: 24px; opacity: 0; transition: opacity var(--t-fast); }
98
- .participants .p-gear .i { width: 14px; height: 14px; }
99
- .participants li:hover .p-gear, .participants li.selected .p-gear { opacity: 1; }
100
- .participants .life-q { position: absolute; top: -5px; right: -5px; width: 15px; height: 15px; border-radius: 50%; background: #fff; color: var(--muted); font-size: 10px; font-weight: 800; display: grid; place-items: center; box-shadow: var(--shadow-tile); }
97
+ .participants [data-ui="row-button"] { position: absolute; right: 6px; opacity: 0; }
98
+ .participants [data-ui="row-button"][data-act="panel"] { top: 4px; }
99
+ .participants [data-ui="row-button"][data-act="last-reply"] { top: 32px; }
100
+ .participants .p-actions { position: absolute; top: 60px; right: 6px; }
101
+ .participants .p-actions [data-ui="row-button"] { position: static; }
102
+ .participants li:hover [data-ui="row-button"], .participants li.selected [data-ui="row-button"] { opacity: 1; }
103
+ .participants li.offline { min-height: 90px; align-items: flex-start; padding-top: 12px; }
104
+ .participants li.offline .p-body { padding-right: 24px; }
105
+ .shell.side-collapsed .participants [data-ui="row-button"][data-act="panel"] { right: auto; left: 0; }
106
+ .shell.side-collapsed .participants [data-ui="row-button"][data-act="last-reply"] { top: 4px; right: 0; }
107
+ .shell.side-collapsed .participants li.offline { min-height: 0; align-items: center; padding-top: 8px; }
108
+ .participants .life-q { position: absolute; top: -5px; right: -5px; width: 15px; height: 15px; border-radius: 50%; background: var(--tile-badge-bg); color: var(--muted); font-size: 10px; font-weight: 800; display: grid; place-items: center; box-shadow: var(--shadow-tile); }
101
109
  .participants .avatar .life { position: absolute; inset: -4px; width: calc(100% + 8px); height: calc(100% + 8px); pointer-events: none; overflow: visible; }
102
110
  .life path { fill: none; stroke-width: 3; }
103
111
  .life .life-track { stroke: var(--softer); }
@@ -106,18 +114,19 @@
106
114
  .life-ok .life-arc, .life-fresh .life-arc { stroke: var(--st-ready-dot); }
107
115
  .life-warm .life-arc { stroke: var(--st-thinking-dot); }
108
116
  .life-hot .life-arc { stroke: var(--st-error-dot); }
109
- .participants .avatar.life-attn .life-track { stroke: var(--attention); animation: pulse 1.2s ease-in-out infinite; }
110
- .lp-event { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 700; color: var(--muted); }
117
+ @keyframes life-breathe { 50% { stroke-opacity: 0.3; } }
118
+ .participants .avatar.life-attn .life-track { stroke: var(--attention); animation: life-breathe 1.2s ease-in-out infinite; }
119
+ .lp-event { display: flex; align-items: center; gap: 6px; font-size: calc(12px * var(--fs-scale)); font-weight: 700; color: var(--muted); }
111
120
  .lp-event.fresh { color: var(--attention-ink); }
112
121
  .lp-event .i { width: 14px; height: 14px; flex: none; }
113
- .life-pop { position: fixed; z-index: 60; display: flex; gap: 6px; align-items: flex-start; width: 330px; padding: 12px 8px 12px 14px; background: #fff; border-radius: 6px 18px 18px 18px; box-shadow: var(--shadow-pop); font-size: 13px; animation: bubble-in var(--t-base) var(--ease-out); }
114
- .life-pop::before { content: ""; position: absolute; left: -6px; top: 18px; width: 12px; height: 12px; background: #fff; border-radius: 0 0 0 3px; transform: rotate(45deg); }
122
+ .life-pop { position: fixed; z-index: 60; display: flex; gap: 6px; align-items: flex-start; width: calc(330px * var(--fs-scale)); max-width: 94vw; padding: 12px 8px 12px 14px; background: var(--pop-bg); border-radius: 6px 18px 18px 18px; box-shadow: var(--shadow-pop); font-size: calc(13px * var(--fs-scale)); animation: bubble-in var(--t-base) var(--ease-out); }
123
+ .life-pop::before { content: ""; position: absolute; left: -6px; top: 18px; width: 12px; height: 12px; background: var(--pop-bg); border-radius: 0 0 0 3px; transform: rotate(45deg); }
115
124
  .life-pop .lp-main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 10px; }
116
125
  .life-pop .lp-side { flex: none; display: flex; flex-direction: column; gap: 2px; }
117
- .life-pop .icon-btn.sm { width: 26px; height: 26px; }
126
+ .life-pop [data-ui="icon-button"] { width: 26px; height: 26px; }
118
127
  .lp-head { display: flex; align-items: center; gap: 10px; }
119
- .lp-head b { font-size: 14px; }
120
- .lp-sub { color: var(--muted); font-size: 12px; font-weight: 600; margin-top: 2px; }
128
+ .lp-head b { font-size: calc(14px * var(--fs-scale)); }
129
+ .lp-sub { color: var(--muted); font-size: calc(12px * var(--fs-scale)); font-weight: 600; margin-top: 2px; }
121
130
  .lp-sub b { color: var(--ink); }
122
131
  .life-bar { height: 6px; border-radius: 3px; background: var(--softer); overflow: hidden; }
123
132
  .life-bar i { display: block; height: 100%; border-radius: 3px; transition: width var(--t-base) var(--ease-out); }
@@ -125,128 +134,135 @@
125
134
  .life-bar.life-warm i { background: var(--st-thinking-dot); }
126
135
  .life-bar.life-hot i { background: var(--st-error-dot); }
127
136
  .life-bar.life-unknown { background: repeating-linear-gradient(90deg, var(--softer) 0 4px, transparent 4px 7px); }
128
- .lp-kv { font-size: 12.5px; }
137
+ .lp-kv { font-size: calc(12.5px * var(--fs-scale)); grid-template-columns: max-content minmax(0, 1fr); }
129
138
  .lp-kv .i { width: 12px; height: 12px; vertical-align: -2px; }
130
139
  .lp-kv .link-btn { border: 0; background: none; padding: 0; font: inherit; font-weight: 700; color: var(--primary); cursor: pointer; }
131
140
  .lp-kv .link-btn:disabled { color: var(--muted); cursor: default; }
141
+ .lp-kv .taking { color: var(--primary); font-weight: 700; }
142
+ .lp-kv .taking i { display: inline-block; width: 4px; height: 4px; margin-left: 3px; border-radius: 50%; background: var(--primary); opacity: 0.25; animation: think 1.4s ease-in-out infinite; }
143
+ .lp-kv .taking i:nth-child(2) { animation-delay: 0.2s; }
144
+ .lp-kv .taking i:nth-child(3) { animation-delay: 0.4s; }
145
+ .slow-table { width: 100%; border-collapse: collapse; font-size: calc(12px * var(--fs-scale)); margin-bottom: 8px; }
146
+ .slow-table td { padding: 2px 8px 2px 0; vertical-align: top; white-space: nowrap; }
147
+ .slow-table td:last-child { white-space: normal; }
132
148
  .lp-editor { display: flex; flex-direction: column; gap: 6px; }
133
- .lp-editor textarea { width: 100%; box-sizing: border-box; font: 600 12px/1.45 var(--font); }
134
- .lp-notes { margin: 0; padding: 8px 10px; background: var(--soft); border-radius: 10px; font: 600 12px/1.45 var(--font); white-space: pre-wrap; max-height: 140px; overflow: auto; color: var(--ink-2); }
149
+ .lp-editor textarea { width: 100%; box-sizing: border-box; font: 600 calc(12px * var(--fs-scale))/1.45 var(--font); }
150
+ .lp-notes { margin: 0; padding: 8px 10px; background: var(--soft); border-radius: 10px; font: 600 calc(12px * var(--fs-scale))/1.45 var(--font); white-space: pre-wrap; max-height: 140px; overflow: auto; color: var(--ink-2); }
135
151
  .lp-respawn { display: flex; flex-direction: column; gap: 6px; align-items: flex-start; }
136
- .lp-with { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 600; color: var(--muted); }
152
+ .lp-with { display: inline-flex; align-items: center; gap: 6px; font-size: calc(12.5px * var(--fs-scale)); font-weight: 600; color: var(--muted); }
137
153
  .lp-with input { width: 58px; padding: 4px 6px; margin: 0; }
138
154
  .side-list li:hover { background: var(--soft); }
139
155
  .side-list li.selected { background: var(--lav); }
140
156
  .side-list li.offline .avatar .av-tile { filter: grayscale(0.6); opacity: 0.8; }
141
157
  .side-list .p-body { flex: 1; min-width: 0; }
142
- .side-list .p-name { font-weight: 800; display: flex; align-items: center; gap: 6px; font-size: 14px; min-width: 0; }
158
+ .side-list .p-name { font-weight: 800; display: flex; align-items: center; gap: 6px; font-size: calc(14px * var(--fs-scale)); min-width: 0; }
143
159
  .side-list .p-name > span:first-child { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
144
- .side-list .p-sub { color: var(--muted); font-size: 12px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; }
145
- .side-list .p-warn { color: var(--rose-ink); font-size: 11px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
160
+ .side-list .p-sub { color: var(--muted); font-size: calc(12px * var(--fs-scale)); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; }
161
+ .side-list .p-warn { color: var(--rose-ink); font-size: calc(11px * var(--fs-scale)); font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
146
162
  .side-list .p-actions { display: flex; gap: 4px; align-items: center; }
147
- .side-list .p-right { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; font-size: 11px; font-weight: 700; color: var(--faint); flex: none; }
163
+ .side-list .p-right { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; font-size: calc(11px * var(--fs-scale)); font-weight: 700; color: var(--faint); flex: none; }
148
164
  .side-list li.me { background: transparent; }
149
165
  .side-list li.me.selected { background: var(--lav); }
150
- .side-list .p-preview { color: var(--muted); font-size: 12px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; }
166
+ .side-list .p-preview { color: var(--muted); font-size: calc(12px * var(--fs-scale)); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; }
151
167
  .side-foot { padding: 8px 14px 14px; display: flex; flex-direction: column; gap: 6px; }
152
- .side-foot .btn .i { width: 16px; height: 16px; }
153
- .side-foot .btn.wake { height: 42px; background: var(--lav); color: var(--primary); }
154
- .side-foot .btn.hush { height: 38px; background: transparent; color: var(--muted); font-weight: 700; }
155
- .side-foot .btn.hush:hover:not(:disabled) { background: var(--soft); color: var(--primary); }
156
- .side-foot .btn.hush.busy { background: var(--lav); color: var(--primary); }
157
- .side-foot .btn.hush.busy .hush-face { animation: pulse 0.9s ease-in-out infinite; }
158
- .side-foot .btn.hush.on { background: var(--warm); color: var(--warm-ink); cursor: default; }
159
- .side-foot .btn.hush.on:hover { background: var(--warm); color: var(--warm-ink); }
168
+ .side-foot [data-ui="button"] .i { width: 16px; height: 16px; }
169
+ .side-foot [data-ui="button"].wake { height: 42px; background: var(--lav); color: var(--primary); }
170
+ .side-foot [data-ui="button"].hush { height: 38px; background: transparent; color: var(--muted); font-weight: 700; }
171
+ .side-foot [data-ui="button"].hush:hover:not(:disabled) { background: var(--soft); color: var(--primary); }
172
+ .side-foot [data-ui="button"].hush.busy { background: var(--lav); color: var(--primary); }
173
+ .side-foot [data-ui="button"].hush.busy .hush-face { animation: pulse 0.9s ease-in-out infinite; }
174
+ .side-foot [data-ui="button"].hush.on { background: var(--warm); color: var(--warm-ink); cursor: default; }
175
+ .side-foot [data-ui="button"].hush.on:hover { background: var(--warm); color: var(--warm-ink); }
160
176
  .focused-pill { color: var(--primary); font-weight: 800; }
161
177
  .shell.side-collapsed.view-room { grid-template-columns: var(--rail-w) 72px minmax(0, 1fr) auto; }
162
178
  .shell.side-collapsed.view-room.rail-open { grid-template-columns: var(--rail-w-open) 72px minmax(0, 1fr) auto; }
163
179
  .shell.side-collapsed .side-room .side-room-title, .shell.side-collapsed .side-room #back-to-rooms, .shell.side-collapsed .side-room #room-settings-btn, .shell.side-collapsed .side-label, .shell.side-collapsed .participants .p-body, .shell.side-collapsed .participants .p-actions, .shell.side-collapsed .side-room .label { display: none; }
164
180
  .shell.side-collapsed .side-head.room { justify-content: center; padding: 12px 6px 4px; }
165
181
  .shell.side-collapsed .side-actions { padding: 4px 10px 6px; }
166
- .shell.side-collapsed .side-room .btn { padding: 0; width: 44px; height: 44px; margin: 0 auto; justify-content: center; gap: 0; }
182
+ .shell.side-collapsed .side-room [data-ui="button"] { padding: 0; width: 44px; height: 44px; margin: 0 auto; justify-content: center; gap: 0; }
167
183
  .shell.side-collapsed .participants { padding: 4px 8px; }
168
184
  .shell.side-collapsed .participants li { justify-content: center; padding: 6px 0; gap: 0; }
169
185
  .shell.side-collapsed .side-foot { padding: 8px 8px 12px; align-items: center; }
170
186
  .main { grid-area: main; background: var(--panel); border-radius: var(--r-lg); box-shadow: var(--edge); display: flex; flex-direction: column; min-height: 0; min-width: 0; position: relative; overflow: hidden; }
171
187
  .main-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 0 22px; min-height: 64px; }
172
- .main-head h1 { font-size: 18px; letter-spacing: -0.01em; }
188
+ .main-head h1 { font-size: calc(18px * var(--fs-scale)); letter-spacing: -0.01em; }
173
189
  .rooms-view, .chat, .page { display: flex; flex-direction: column; min-height: 0; flex: 1; animation: fade-in var(--t-base) var(--ease-out); }
174
190
  .rooms-grid { flex: 1; min-height: 0; overflow-y: auto; padding: 6px 22px 22px; display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); grid-auto-rows: minmax(150px, auto); gap: 12px; align-content: start; }
175
191
  .room-card { display: flex; flex-direction: column; gap: 8px; animation: pop var(--t-slow) var(--ease-out); }
176
192
  .room-card .rc-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
177
193
  .room-card .rc-head .rc-title { display: flex; align-items: center; gap: 12px; min-width: 0; }
178
- .room-card h3 { font-size: 16px; overflow-wrap: anywhere; }
179
- .room-card .rc-topic { color: var(--muted); font-size: 12.5px; font-weight: 600; line-height: 1.45; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
180
- .room-card .rc-foot { margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 11px; font-weight: 700; color: var(--faint); }
194
+ .room-card h3 { font-size: calc(16px * var(--fs-scale)); overflow-wrap: anywhere; }
195
+ .room-card .rc-topic { color: var(--muted); font-size: calc(12.5px * var(--fs-scale)); font-weight: 600; line-height: 1.45; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
196
+ .room-card .rc-foot { margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: calc(11px * var(--fs-scale)); font-weight: 700; color: var(--faint); }
181
197
  .room-card.current { box-shadow: 0 0 0 2px var(--primary); }
182
- .room-card .rc-dir { font-family: var(--mono); font-size: 10.5px; color: var(--faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
198
+ .room-card .rc-dir { font-family: var(--mono); font-size: calc(10.5px * var(--fs-scale)); color: var(--faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
183
199
  .home { flex: 1; min-height: 0; overflow-y: auto; padding: 18px 22px 28px; animation: fade-in var(--t-base) var(--ease-out); }
184
200
  .home-inner { max-width: 1120px; margin: 0 auto; display: flex; flex-direction: column; gap: 26px; }
185
- .hero { position: relative; overflow: hidden; display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(280px, 1fr); gap: 24px; align-items: center; padding: 34px 36px; border-radius: 24px; color: #fff; background: linear-gradient(120deg, #6a6af7 0%, #5b5bf0 45%, #8b5cf6 100%); box-shadow: 0 18px 40px -22px rgba(91, 91, 240, 0.9); }
186
- .hero::before, .hero::after { content: ""; position: absolute; border-radius: 50%; background: rgba(255, 255, 255, 0.10); pointer-events: none; }
201
+ .hero { position: relative; overflow: hidden; display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(280px, 1fr); gap: 24px; align-items: center; padding: 34px 36px; border-radius: 24px; color: var(--hero-ink); background: var(--hero-bg); box-shadow: var(--hero-shadow); }
202
+ .hero::before, .hero::after { content: ""; position: absolute; border-radius: 50%; background: var(--hero-blob-a); pointer-events: none; }
187
203
  .hero::before { width: 320px; height: 320px; right: -80px; top: -140px; }
188
- .hero::after { width: 220px; height: 220px; left: 40%; bottom: -150px; background: rgba(47, 201, 126, 0.18); }
204
+ .hero::after { width: 220px; height: 220px; left: 40%; bottom: -150px; background: var(--hero-blob-b); }
189
205
  .hero-text { position: relative; z-index: 1; min-width: 0; }
190
- .hero-eyebrow { font-size: 11px; font-weight: 800; letter-spacing: 0.16em; text-transform: uppercase; opacity: 0.8; margin-bottom: 10px; }
191
- .hero h1 { font-size: 32px; line-height: 1.1; letter-spacing: -0.02em; margin: 0 0 12px; }
192
- .hero p { font-size: 15px; font-weight: 600; line-height: 1.55; opacity: 0.92; margin: 0 0 20px; max-width: 520px; }
206
+ .hero-eyebrow { font-size: calc(11px * var(--fs-scale)); font-weight: 800; letter-spacing: 0.16em; text-transform: uppercase; opacity: 0.8; margin-bottom: 10px; }
207
+ .hero h1 { font-size: calc(32px * var(--fs-scale)); line-height: 1.1; letter-spacing: -0.02em; margin: 0 0 12px; }
208
+ .hero p { font-size: calc(15px * var(--fs-scale)); font-weight: 600; line-height: 1.55; opacity: 0.92; margin: 0 0 20px; max-width: 520px; }
193
209
  .hero-actions { display: flex; gap: 10px; flex-wrap: wrap; }
194
- .hero-cta { background: #fff; color: var(--primary); box-shadow: 0 10px 22px -10px rgba(28, 27, 51, 0.5); }
195
- .hero-cta:hover:not(:disabled) { background: #fff; color: var(--primary); transform: translateY(-1px); }
196
- .hero-ghost { height: 46px; padding: 0 18px; border-radius: 14px; background: rgba(255, 255, 255, 0.16); color: #fff; }
197
- .hero-ghost:hover:not(:disabled) { background: rgba(255, 255, 255, 0.26); color: #fff; }
210
+ .hero-cta { background: var(--hero-cta-bg); color: var(--primary); box-shadow: var(--hero-cta-shadow); }
211
+ .hero-cta:hover:not(:disabled) { background: var(--hero-cta-bg); color: var(--primary); transform: translateY(-1px); }
212
+ .hero-ghost { height: 46px; padding: 0 18px; border-radius: 14px; background: var(--hero-ghost-bg); color: var(--hero-ink); }
213
+ .hero-ghost:hover:not(:disabled) { background: var(--hero-ghost-hover-bg); color: var(--hero-ink); }
198
214
  .hero-art { position: relative; z-index: 1; min-height: 190px; display: flex; flex-direction: column; gap: 10px; justify-content: center; }
199
- .ha-bubble { display: inline-flex; align-items: center; gap: 10px; padding: 10px 14px 10px 10px; border-radius: 18px; font-size: 13px; font-weight: 700; width: fit-content; max-width: 100%; box-shadow: 0 10px 24px -14px rgba(28, 27, 51, 0.6); animation: pop var(--t-slow) var(--ease-out) both; }
200
- .ha-face { width: 30px; height: 30px; border-radius: 10px; display: grid; place-content: center; font-size: 17px; background: rgba(255, 255, 255, 0.55); flex: none; }
201
- .ha-a { background: #fff; color: var(--ink); align-self: flex-end; border-bottom-right-radius: 6px; }
202
- .ha-b { background: #d9f7e8; color: #14533f; border-bottom-left-radius: 6px; animation-delay: 0.12s; }
203
- .ha-c { background: #fff3cc; color: #5a4200; align-self: flex-end; border-bottom-right-radius: 6px; animation-delay: 0.24s; }
204
- .ha-spark { position: absolute; right: 6px; top: -6px; color: #ffd166; font-size: 26px; animation: pulse 2s ease-in-out infinite; }
215
+ .ha-bubble { display: inline-flex; align-items: center; gap: 10px; padding: 10px 14px 10px 10px; border-radius: 18px; font-size: calc(13px * var(--fs-scale)); font-weight: 700; width: fit-content; max-width: 100%; box-shadow: var(--hero-bubble-shadow); animation: pop var(--t-slow) var(--ease-out) both; }
216
+ .ha-face { width: 30px; height: 30px; border-radius: 10px; display: grid; place-content: center; font-size: 17px; background: var(--hero-face-bg); flex: none; }
217
+ .ha-a { background: var(--hero-bubble-1-bg); color: var(--ink); align-self: flex-end; border-bottom-right-radius: 6px; }
218
+ .ha-b { background: var(--hero-bubble-2-bg); color: var(--hero-bubble-2-ink); border-bottom-left-radius: 6px; animation-delay: 0.12s; }
219
+ .ha-c { background: var(--hero-bubble-3-bg); color: var(--hero-bubble-3-ink); align-self: flex-end; border-bottom-right-radius: 6px; animation-delay: 0.24s; }
220
+ .ha-spark { position: absolute; right: 6px; top: -6px; color: var(--hero-spark); font-size: calc(26px * var(--fs-scale)); animation: pulse 2s ease-in-out infinite; }
205
221
  .home-section { display: flex; flex-direction: column; gap: 12px; }
206
222
  .home-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
207
- .home-head h2 { font-size: 19px; letter-spacing: -0.01em; }
223
+ .home-head h2 { font-size: calc(19px * var(--fs-scale)); letter-spacing: -0.01em; }
208
224
  .home-head .linklike { display: inline-flex; align-items: center; gap: 4px; }
209
225
  .home-head .linklike .i { width: 14px; height: 14px; }
210
226
  .home-rooms { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 10px; }
211
227
  .home-room { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border: 0; border-radius: 16px; background: var(--soft); text-align: left; min-width: 0; box-shadow: var(--edge); transition: transform var(--t-fast) var(--ease-out), background var(--t-fast); }
212
228
  .home-room:not(.empty-room):hover { background: var(--lav); transform: translateY(-1px); }
213
229
  .home-room .hr-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
214
- .home-room .hr-name { font-weight: 800; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
215
- .home-room .hr-sub { color: var(--muted); font-size: 12px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
216
- .home-room .hr-time { color: var(--faint); font-size: 11px; font-weight: 700; flex: none; }
230
+ .home-room .hr-name { font-weight: 800; font-size: calc(14px * var(--fs-scale)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
231
+ .home-room .hr-sub { color: var(--muted); font-size: calc(12px * var(--fs-scale)); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
232
+ .home-room .hr-time { color: var(--faint); font-size: calc(11px * var(--fs-scale)); font-weight: 700; flex: none; }
217
233
  .home-room.empty-room { cursor: default; }
218
234
  .feature-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; }
219
235
  .feature { border-radius: 18px; padding: 18px 18px 16px; display: flex; flex-direction: column; gap: 8px; box-shadow: var(--edge); transition: transform var(--t-fast) var(--ease-out); }
220
236
  .feature:hover { transform: translateY(-2px); }
221
- .feature .f-emoji { width: 46px; height: 46px; border-radius: 14px; background: rgba(255, 255, 255, 0.8); display: grid; place-content: center; font-size: 24px; box-shadow: var(--shadow-tile); }
222
- .feature h3 { font-size: 15px; margin-top: 4px; }
223
- .feature p { margin: 0; font-size: 13px; font-weight: 600; line-height: 1.5; color: var(--ink-2); }
237
+ .feature .f-emoji { width: 46px; height: 46px; border-radius: 14px; background: var(--feature-emoji-bg); display: grid; place-content: center; font-size: 24px; box-shadow: var(--shadow-tile); }
238
+ .feature h3 { font-size: calc(15px * var(--fs-scale)); margin-top: 4px; }
239
+ .feature p { margin: 0; font-size: calc(13px * var(--fs-scale)); font-weight: 600; line-height: 1.5; color: var(--ink-2); }
224
240
  .feature.lav { background: var(--lav); }
225
241
  .feature.mint { background: var(--mint); }
226
242
  .feature.warm { background: var(--warm); }
227
- .feature.peach { background: #ffe4d6; }
243
+ .feature.peach { background: var(--feature-peach-bg); }
228
244
  .feature.rose { background: var(--rose); }
229
245
  .feature.sky { background: var(--sky); }
230
246
  .home-vendors { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 4px; }
231
247
  .home-vendor .vc-logo { width: 30px; height: 30px; border-radius: 10px; }
232
248
  .home-vendor .vc-logo img { width: 18px; height: 18px; }
233
249
  .steps { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px; }
234
- .step { display: flex; gap: 14px; align-items: flex-start; background: #fff; border-radius: 18px; padding: 16px 18px; box-shadow: var(--edge); }
235
- .step-n { width: 40px; height: 40px; border-radius: 13px; background: var(--grad-primary); color: #fff; font-weight: 800; font-size: 17px; display: grid; place-content: center; flex: none; box-shadow: var(--shadow-primary); }
236
- .step h3 { font-size: 15px; margin-bottom: 4px; }
237
- .step p { margin: 0; font-size: 13px; font-weight: 600; line-height: 1.5; color: var(--ink-2); }
250
+ .step { display: flex; gap: 14px; align-items: flex-start; background: var(--step-bg); border-radius: 18px; padding: 16px 18px; box-shadow: var(--edge); }
251
+ .step-n { width: 40px; height: 40px; border-radius: 13px; background: var(--grad-primary); color: var(--step-num-ink); font-weight: 800; font-size: 17px; display: grid; place-content: center; flex: none; box-shadow: var(--shadow-primary); }
252
+ .step h3 { font-size: calc(15px * var(--fs-scale)); margin-bottom: 4px; }
253
+ .step p { margin: 0; font-size: calc(13px * var(--fs-scale)); font-weight: 600; line-height: 1.5; color: var(--ink-2); }
238
254
  .tips { display: flex; flex-wrap: wrap; gap: 8px; }
239
- .tip { background: var(--soft); border-radius: var(--r-pill); padding: 7px 14px; font-size: 12.5px; font-weight: 600; color: var(--ink-2); box-shadow: var(--edge); }
255
+ .tip { background: var(--soft); border-radius: var(--r-pill); padding: 7px 14px; font-size: calc(12.5px * var(--fs-scale)); font-weight: 600; color: var(--ink-2); box-shadow: var(--edge); }
240
256
  .tip b { color: var(--primary); font-weight: 800; }
241
257
  @media (max-width: 1100px) { .hero { grid-template-columns: 1fr; } .hero-art { min-height: 0; } }
242
258
  .chat-title { min-width: 0; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
243
- .chat-sub { color: var(--muted); font-size: 12px; font-weight: 600; display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
244
- .chat-sub code { font-size: 11px; }
259
+ .chat-sub { color: var(--muted); font-size: calc(12px * var(--fs-scale)); font-weight: 600; display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
260
+ .chat-sub code { font-size: calc(11px * var(--fs-scale)); }
245
261
  .chat-sub .dir-chip { cursor: help; }
246
262
  .chat-actions { display: flex; align-items: center; gap: 8px; }
247
263
  .chat-actions .search { margin: 0; width: 250px; }
248
264
  .messages { position: relative; flex: 1; overflow-y: auto; padding: 12px 22px; display: flex; flex-direction: column; gap: 14px; background: var(--canvas-pattern) content-box, var(--grad-canvas); background-size: var(--canvas-pattern-size), auto; }
249
- .day { align-self: center; color: var(--faint); font-size: 11px; font-weight: 800; padding: 3px 12px; margin: 2px 0; }
265
+ .day { align-self: center; color: var(--faint); font-size: calc(11px * var(--fs-scale)); font-weight: 800; padding: 3px 12px; margin: 2px 0; }
250
266
  .msg { display: flex; flex-direction: column; gap: 4px; align-items: flex-start; max-width: 100%; animation: bubble-in var(--t-base) var(--ease-out); }
251
267
  .messages .msg { content-visibility: auto; contain-intrinsic-size: auto 120px; flex-shrink: 0; }
252
268
  .messages .msgs-page { display: flex; flex-direction: column; gap: 14px; flex-shrink: 0; content-visibility: auto; contain-intrinsic-size: auto 6000px; }
@@ -254,19 +270,22 @@
254
270
  .msg.mine { align-items: flex-end; padding-left: 40px; }
255
271
  .head-av { display: inline-flex; width: 32px; height: 32px; padding: 4px; box-sizing: content-box; flex: none; }
256
272
  .msg.agent .bubble, .msg.agent .shots { margin-left: 16px; }
273
+ .msg.agent .meta { margin-left: 16px; padding-left: 0; }
274
+ .msg.agent .meta .stats { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; max-width: 0; opacity: 0; overflow: hidden; margin-right: -4px; transition: max-width var(--t-base) var(--ease-out), margin var(--t-base) var(--ease-out), opacity var(--t-fast); }
275
+ .msg.agent:hover .meta .stats { max-width: 600px; opacity: 1; margin-right: 0; }
276
+ .msg.agent .meta .seen-by { margin-left: 0; }
257
277
  .msg.mine .bubble, .msg.mine .shots { margin-right: 16px; }
258
278
  .msg.mine .head { flex-direction: row-reverse; }
259
279
  .msg.system { justify-content: center; }
260
280
  .msg.hidden-by-search { display: none; }
261
281
  .messages.searching .msgs-page { content-visibility: visible; }
262
- .sys { color: var(--muted); font-size: 11px; font-weight: 700; padding: 2px 10px; max-width: 80%; text-align: center; }
263
- .sys.warn { color: var(--warm-ink); background: var(--warm); border-radius: var(--r-pill); padding: 6px 12px; font-weight: 800; }
282
+ .msg.system, .msg.hidden { padding-left: 4px; }
264
283
  .bubble-col { display: flex; flex-direction: column; gap: 6px; min-width: 0; width: 100%; max-width: min(1040px, 100%); }
265
284
  .msg.mine .bubble-col { align-items: flex-end; }
266
285
  .shell.side-collapsed .bubble-col { max-width: min(1480px, 100%); }
267
286
  .timeline { position: absolute; right: 6px; top: 78px; bottom: calc(var(--composer-h, 60px) + 36px); width: 18px; z-index: 4; }
268
287
  .tl-ticks { position: absolute; inset: 0; }
269
- .tl-view { position: absolute; left: 2px; right: 2px; border-radius: 6px; background: rgba(91, 91, 240, 0.07); pointer-events: none; transition: top 80ms linear, height 80ms linear; }
288
+ .tl-view { position: absolute; left: 2px; right: 2px; border-radius: 6px; background: var(--timeline-view-bg); pointer-events: none; transition: top 80ms linear, height 80ms linear; }
270
289
  .tl-tick { position: absolute; left: 3px; width: 12px; height: 5px; border-radius: 3px; background: var(--tick-mine); cursor: pointer; transition: background var(--t-fast), transform var(--t-fast); }
271
290
  .tl-tick:hover, .tl-tick.active { background: var(--primary); transform: scaleX(1.25); }
272
291
  .tl-tick.in-view { background: var(--tick-mine-view); }
@@ -276,9 +295,9 @@
276
295
  .tl-row .tl-pin { flex: none; margin-left: auto; align-self: center; color: var(--primary); }
277
296
  .tl-row .tl-pin .i { width: 14px; height: 14px; }
278
297
  .timeline.left { left: 6px; right: auto; }
279
- .timeline.left .tl-view { background: rgba(28, 27, 51, 0.05); }
280
- .timeline.left .tl-tick { background: color-mix(in srgb, var(--tick, var(--tick-fallback)) 35%, #fff); }
281
- .timeline.left .tl-tick.in-view { background: color-mix(in srgb, var(--tick, var(--tick-fallback)) 60%, #fff); }
298
+ .timeline.left .tl-view { background: var(--timeline-view-left-bg); }
299
+ .timeline.left .tl-tick { background: color-mix(in srgb, var(--tick, var(--tick-fallback)) 35%, var(--timeline-tick-blend)); }
300
+ .timeline.left .tl-tick.in-view { background: color-mix(in srgb, var(--tick, var(--tick-fallback)) 60%, var(--timeline-tick-blend)); }
282
301
  .timeline.left .tl-tick.pinned, .timeline.left .tl-tick:hover, .timeline.left .tl-tick.active { background: var(--tick, var(--tick-fallback)); }
283
302
  .timeline.left .tl-pop { left: 26px; right: auto; }
284
303
  .tl-pop::before { content: ""; position: absolute; top: -6px; bottom: -6px; right: -6px; width: 6px; }
@@ -290,31 +309,39 @@
290
309
  .wn-av[hidden] { display: none; }
291
310
  @keyframes wn-bob { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-7px); } }
292
311
  .timeline .tl-tick.pinned.i { width: 12px; height: 6px; left: 3px; border-radius: 3px; -webkit-mask: none; mask: none; background: var(--tick, var(--primary)); overflow: visible; }
293
- .timeline .tl-tick.pinned::after { content: ""; position: absolute; width: 16px; height: 16px; top: -11px; background: var(--tick, var(--primary)); -webkit-mask: var(--icon) center / contain no-repeat; mask: var(--icon) center / contain no-repeat; filter: drop-shadow(0 0 1px #fff) drop-shadow(0 0 1px #fff); pointer-events: none; }
312
+ .timeline .tl-tick.pinned::after { content: ""; position: absolute; width: 16px; height: 16px; top: -11px; background: var(--tick, var(--primary)); -webkit-mask: var(--icon) center / contain no-repeat; mask: var(--icon) center / contain no-repeat; filter: drop-shadow(0 0 1px var(--timeline-pin-halo)) drop-shadow(0 0 1px var(--timeline-pin-halo)); pointer-events: none; }
294
313
  .timeline.left .tl-tick.pinned::after { left: -7px; transform: rotate(-45deg); }
295
314
  .timeline:not(.left) .tl-tick.pinned::after { right: -7px; transform: rotate(45deg); }
296
315
  .timeline .tl-tick.pinned:hover, .timeline .tl-tick.pinned.active { transform: none; filter: brightness(0.85); }
297
- .pins-chip { cursor: pointer; border: 0; font: inherit; font-size: 12px; font-weight: 800; color: var(--primary); background: var(--lav); }
298
- .pins-chip:hover { background: var(--lav-2); }
299
316
  .pins-panel { position: absolute; right: 22px; top: 62px; width: 380px; max-height: 60%; overflow: auto; background: var(--card); border-radius: 14px; box-shadow: var(--shadow-pop); padding: 6px; z-index: 30; animation: rise var(--t-base) var(--ease-out); }
300
317
  .pin-row { align-items: center; }
301
318
  .pin-row .tl-text { flex: 1; order: 1; }
302
319
  .pin-row .pin-time { order: 2; }
303
320
  .pin-row .pin-x { order: 4; }
304
321
  .pin-row.mine .tl-av { order: 3; }
305
- .pin-time { color: var(--faint); font-size: 11px; font-weight: 600; white-space: nowrap; }
306
- .pin-x { border: 0; background: transparent; color: var(--muted); font-size: 16px; line-height: 1; padding: 0 4px; cursor: pointer; border-radius: 6px; }
322
+ .pin-time { color: var(--faint); font-size: calc(11px * var(--fs-scale)); font-weight: 600; white-space: nowrap; }
323
+ .pin-x { border: 0; background: transparent; color: var(--muted); font-size: calc(16px * var(--fs-scale)); line-height: 1; padding: 0 4px; cursor: pointer; border-radius: 6px; }
307
324
  .pin-x:hover { color: var(--danger); background: var(--soft); }
308
325
  .tl-pop { position: absolute; right: 26px; width: 340px; background: var(--card); border-radius: 14px; box-shadow: var(--shadow-pop); padding: 6px; z-index: 30; animation: rise var(--t-base) var(--ease-out); }
309
- .tl-row { padding: 6px 10px; border-radius: 9px; font-size: 12.5px; font-weight: 600; line-height: 1.4; color: var(--ink-2); display: flex; gap: 8px; align-items: flex-start; cursor: pointer; }
326
+ .tl-row { padding: 6px 10px; border-radius: 9px; font-size: calc(12.5px * var(--fs-scale)); font-weight: 600; line-height: 1.4; color: var(--ink-2); display: flex; gap: 8px; align-items: flex-start; cursor: pointer; }
310
327
  .tl-text { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; min-width: 0; }
311
328
  .tl-row.faded { color: var(--muted); opacity: 0.8; }
312
329
  .tl-row.far { opacity: 0.5; }
313
330
  .tl-row.current { background: var(--lav); color: var(--primary); font-weight: 800; }
314
331
  .tl-row:hover { background: var(--lav-2); }
315
332
  .msg.flash .bubble { animation: tl-flash 1.4s var(--ease-out); }
316
- @keyframes tl-flash { 0% { box-shadow: 0 0 0 0 rgba(91, 91, 240, 0.55); } 100% { box-shadow: 0 0 0 14px rgba(91, 91, 240, 0); } }
317
- .jump-latest { position: absolute; right: 30px; bottom: 96px; z-index: 5; display: inline-flex; align-items: center; gap: 6px; height: 34px; padding: 0 14px 0 10px; border: 0; border-radius: var(--r-pill); background: var(--card); color: var(--primary); font: inherit; font-size: 12px; font-weight: 800; box-shadow: var(--shadow-pop); cursor: pointer; animation: rise var(--t-base) var(--ease-out); }
333
+ @keyframes tl-flash { 0% { box-shadow: 0 0 0 0 var(--timeline-flash); } 100% { box-shadow: 0 0 0 14px var(--timeline-flash-out); } }
334
+ .jump-latest { position: absolute; right: 33px; bottom: calc(var(--composer-h, 60px) + 24px); z-index: 5; display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 26px; padding: 0; border: 0; border-radius: var(--r-pill); background: var(--card); color: var(--primary); box-shadow: var(--shadow-pop); cursor: pointer; animation: fade-in var(--t-base) var(--ease-out); }
335
+ .scroll-hint { position: absolute; left: 50%; transform: translateX(-50%); z-index: 6; display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 24px; padding: 0; border: 0; border-radius: var(--r-pill); background: var(--card); color: var(--primary); box-shadow: var(--shadow-pop); cursor: pointer; opacity: 0.94; }
336
+ .scroll-hint:hover { background: var(--soft); opacity: 1; }
337
+ .scroll-hint[hidden] { display: none; }
338
+ .scroll-hint.up { top: 12px; }
339
+ .scroll-hint.down { bottom: 12px; }
340
+ .scroll-hint, .jump-latest { animation: fade-in var(--t-base) var(--ease-out); }
341
+ .scroll-hint .i, .jump-latest .i { width: 18px; height: 18px; animation: sign-bob 1.15s cubic-bezier(0.37, 0, 0.63, 1) infinite; }
342
+ .scroll-hint.up .i { animation-name: sign-bob-up; }
343
+ @keyframes sign-bob { 0%, 100% { transform: translateY(-1.5px); } 50% { transform: translateY(2.5px); } }
344
+ @keyframes sign-bob-up { 0%, 100% { transform: translateY(1.5px); } 50% { transform: translateY(-2.5px); } }
318
345
  .jump-latest:hover { background: var(--soft); }
319
346
  .done-notes { position: absolute; left: 30px; bottom: 96px; z-index: 5; display: flex; flex-direction: column-reverse; gap: 6px; }
320
347
  .done-note { display: inline-flex; align-items: center; gap: 8px; max-width: 230px; padding: 6px 12px 6px 8px; border: 0; border-radius: 14px; background: var(--done); color: var(--done-ink); font: inherit; text-align: left; cursor: pointer; box-shadow: var(--shadow-pop); animation: rise var(--t-base) var(--ease-out); overflow: hidden; }
@@ -324,33 +351,29 @@
324
351
  .done-go:hover { background: var(--done-hover); }
325
352
  .done-go .avatar { flex: none; }
326
353
  .done-text { display: flex; flex-direction: column; min-width: 0; line-height: 1.25; }
327
- .done-text b { font-size: 12px; font-weight: 800; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
328
- .done-text small { font-size: 11px; font-weight: 600; opacity: 0.8; white-space: nowrap; }
329
- .done-x { border: 0; background: transparent; color: inherit; opacity: 0.6; font-size: 15px; line-height: 1; padding: 0 9px; cursor: pointer; }
354
+ .done-text b { font-size: calc(12px * var(--fs-scale)); font-weight: 800; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
355
+ .done-text small { font-size: calc(11px * var(--fs-scale)); font-weight: 600; opacity: 0.8; white-space: nowrap; }
356
+ .done-x { border: 0; background: transparent; color: inherit; opacity: 0.6; font-size: calc(15px * var(--fs-scale)); line-height: 1; padding: 0 9px; cursor: pointer; }
330
357
  .done-x:hover { opacity: 1; background: var(--done-hover); }
331
- .jump-latest .i { width: 16px; height: 16px; }
332
- .bubble { max-width: 100%; background: #fff; border-radius: 6px 18px 18px 18px; padding: 12px 16px; min-width: 0; font-size: 14.5px; font-weight: 600; line-height: 1.55; color: var(--ink-2); box-shadow: 0 2px 0 rgba(28, 27, 51, 0.06), 0 1px 3px rgba(28, 27, 51, 0.04); }
333
- .msg.mine .bubble { background: var(--grad-primary); color: #fff; border-radius: 18px 18px 6px 18px; box-shadow: 0 8px 18px -10px rgba(91, 91, 240, 0.7); padding: 11px 16px; }
334
- .msg.mine .bubble .text { color: #fff; }
358
+ .bubble { max-width: 100%; background: var(--bubble-bg); border-radius: 6px 18px 18px 18px; padding: 12px 16px; min-width: 0; font-size: calc(14.5px * var(--fs-scale)); font-weight: 600; line-height: 1.55; color: var(--bubble-ink); box-shadow: var(--bubble-shadow); }
359
+ .msg.mine .bubble { background: var(--bubble-mine-bg); color: var(--bubble-mine-ink); border-radius: 18px 6px 18px 18px; box-shadow: var(--bubble-mine-shadow); padding: 11px 16px; }
360
+ .msg.mine .bubble .text { color: var(--bubble-mine-ink); }
335
361
  .msg.mine.waiting .bubble { background: var(--attention-grad); box-shadow: var(--attention-shadow); }
336
- .bubble .waiting { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 10px; padding-top: 8px; border-top: 1px solid rgba(255, 255, 255, 0.35); font-size: 13px; font-weight: 600; color: rgba(255, 255, 255, 0.92); }
362
+ .bubble .waiting { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--bubble-mine-rule); font-size: calc(13px * var(--fs-scale)); font-weight: 600; color: var(--bubble-mine-waiting-ink); }
337
363
  .bubble .waiting .i { width: 14px; height: 14px; vertical-align: -2px; }
338
364
  .bubble .waiting-text { flex: 1; min-width: 160px; }
339
- .bubble .waiting-stop { border: 0; border-radius: 10px; padding: 6px 12px; background: rgba(255, 255, 255, 0.92); color: var(--attention-ink); font-weight: 800; font-size: 12.5px; cursor: pointer; }
340
- .bubble .waiting-stop:hover:not(:disabled) { background: #fff; }
341
- .bubble .waiting-stop:disabled { opacity: 0.7; cursor: default; }
342
- .msg.mine .mention { background: rgba(255, 255, 255, 0.22); color: #fff !important; padding: 1px 7px; border-radius: 6px; font-weight: 800; }
343
- .msg.mine .bubble code { background: rgba(255, 255, 255, 0.18); color: #fff; }
344
- .msg.mine .open-link { color: #fff; text-decoration-color: rgba(255, 255, 255, 0.5); }
365
+ .msg.mine .mention { background: var(--bubble-mine-chip-bg); color: var(--bubble-mine-ink) !important; padding: 1px 7px; border-radius: 6px; font-weight: 800; }
366
+ .msg.mine .bubble code { background: var(--bubble-mine-code-bg); color: var(--bubble-mine-ink); }
367
+ .msg.mine .open-link { color: var(--bubble-mine-ink); text-decoration-color: var(--bubble-mine-link-underline); }
345
368
  .bubble .head { display: flex; gap: 8px; align-items: baseline; margin-bottom: 2px; }
346
369
  .head { display: flex; gap: 8px; align-items: center; padding: 0 4px; }
347
- .head .name { font-weight: 800; font-size: 14px; }
348
- .head .time { color: var(--faint); font-size: 11px; font-weight: 600; cursor: default; white-space: nowrap; }
370
+ .head .name { font-weight: 800; font-size: calc(14px * var(--fs-scale)); }
371
+ .head .time { color: var(--faint); font-size: calc(11px * var(--fs-scale)); font-weight: 600; cursor: default; white-space: nowrap; }
349
372
  .msg.mine .head { justify-content: flex-end; }
350
373
  .msg.mine .head .name { display: none; }
351
374
  .bubble .text { word-break: break-word; line-height: 1.55; }
352
- .text > :first-child, .file-view > :first-child { margin-top: 0; }
353
- .text > :last-child, .file-view > :last-child { margin-bottom: 0; }
375
+ .text > .words > :first-child, .file-view > :first-child { margin-top: 0; }
376
+ .text > .words > :last-child, .file-view > :last-child { margin-bottom: 0; }
354
377
  .text p, .file-view p { margin: 0 0 8px; }
355
378
  .text ul, .text ol, .file-view ul, .file-view ol { margin: 4px 0 8px; padding-left: 22px; }
356
379
  .text li, .file-view li { margin: 2px 0; }
@@ -361,12 +384,12 @@
361
384
  .text blockquote, .file-view blockquote { margin: 6px 0 8px; padding: 2px 12px; border-left: 3px solid var(--lav); color: var(--muted); }
362
385
  .text hr, .file-view hr { border: 0; border-top: 1px solid var(--border); margin: 10px 0; }
363
386
  .text pre, .file-view pre { margin: 6px 0 8px; }
364
- .text table, .file-view table { border-collapse: collapse; margin: 6px 0 8px; font-size: 13px; max-width: 100%; display: block; overflow-x: auto; }
387
+ .text table, .file-view table { border-collapse: collapse; margin: 6px 0 8px; font-size: calc(13px * var(--fs-scale)); max-width: 100%; display: block; overflow-x: auto; }
365
388
  .text th, .text td, .file-view th, .file-view td { border: 1px solid var(--border); padding: 4px 10px; text-align: left; vertical-align: top; }
366
389
  .text th, .file-view th { background: var(--lav); font-weight: 800; }
367
- .msg.mine .bubble .text th { background: rgba(255, 255, 255, 0.18); }
368
- .msg.mine .bubble .text th, .msg.mine .bubble .text td { border-color: rgba(255, 255, 255, 0.35); }
369
- .msg.mine .bubble .text blockquote { border-color: rgba(255, 255, 255, 0.5); color: rgba(255, 255, 255, 0.85); }
390
+ .msg.mine .bubble .text th { background: var(--bubble-mine-th-bg); }
391
+ .msg.mine .bubble .text th, .msg.mine .bubble .text td { border-color: var(--bubble-mine-border); }
392
+ .msg.mine .bubble .text blockquote { border-color: var(--bubble-mine-quote-border); color: var(--bubble-mine-soft-ink); }
370
393
  .dir-row { display: flex; gap: 8px; align-items: stretch; }
371
394
  .dir-row input { flex: 1; min-width: 0; }
372
395
  .dir-row .browse-btn { flex: 0 0 auto; white-space: nowrap; }
@@ -374,16 +397,16 @@
374
397
  .folder-dialog[open] { display: flex; }
375
398
  .folder-dialog .file-head { flex: 0 0 auto; }
376
399
  .fp-bar { display: flex; gap: 8px; align-items: stretch; margin: 6px 0 8px; }
377
- .fp-bar input { flex: 1; min-width: 0; font-family: var(--mono); font-size: 12.5px; }
378
- .fp-bar .btn { white-space: nowrap; }
400
+ .fp-bar input { flex: 1; min-width: 0; font-family: var(--mono); font-size: calc(12.5px * var(--fs-scale)); }
401
+ .fp-bar [data-ui="button"] { white-space: nowrap; }
379
402
  .fp-recent { display: flex; flex-wrap: wrap; gap: 6px; min-height: 0; margin-bottom: 8px; }
380
403
  .fp-recent:empty { display: none; }
381
- .fp-recent .chip-btn { max-width: 260px; }
404
+ .fp-recent [data-ui="choice"] { max-width: 260px; }
382
405
  .fp-body { flex: 1; min-height: 0; overflow: auto; border: 2px solid var(--lav); border-radius: var(--r-sm); background: var(--soft); padding: 6px 4px; }
383
406
  .tree, .tree ul { list-style: none; margin: 0; padding: 0; }
384
407
  .tree ul { padding-left: 18px; }
385
408
  .tree li { margin: 0; }
386
- .tn { display: flex; align-items: center; gap: 4px; height: 30px; padding: 0 8px 0 2px; border-radius: 8px; cursor: pointer; font-size: 13.5px; font-weight: 700; color: var(--ink-2); white-space: nowrap; user-select: none; }
409
+ .tn { display: flex; align-items: center; gap: 4px; height: 30px; padding: 0 8px 0 2px; border-radius: 8px; cursor: pointer; font-size: calc(13.5px * var(--fs-scale)); font-weight: 700; color: var(--ink-2); white-space: nowrap; user-select: none; }
387
410
  .tn:hover { background: var(--lav); }
388
411
  .tn.selected { background: var(--lav-2); color: var(--primary); }
389
412
  .tn.hidden-dir { color: var(--muted); font-weight: 600; }
@@ -392,28 +415,30 @@
392
415
  .tn-tw:hover { background: var(--card); color: var(--primary); }
393
416
  .tn.open .tn-tw { transform: rotate(90deg); }
394
417
  .tn.leaf .tn-tw { visibility: hidden; }
395
- .tn-ico { flex: 0 0 auto; font-size: 15px; line-height: 1; }
418
+ .tn-ico { flex: 0 0 auto; font-size: calc(15px * var(--fs-scale)); line-height: 1; }
396
419
  .tn-name { overflow: hidden; text-overflow: ellipsis; }
397
- .tn-more { color: var(--faint); font-size: 12px; font-weight: 700; padding: 4px 26px; }
420
+ .tn-more { color: var(--faint); font-size: calc(12px * var(--fs-scale)); font-weight: 700; padding: 4px 26px; }
398
421
  .tn-new { display: flex; gap: 6px; align-items: center; padding: 2px 0 4px 26px; }
399
- .tn-new input { height: 28px; font-size: 13px; padding: 0 10px; }
400
- .fp-selected { flex: 1; min-width: 0; font-family: var(--mono); font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; align-self: center; }
401
- .file-dialog { width: 900px; flex-direction: column; }
422
+ .tn-new input { height: 28px; font-size: calc(13px * var(--fs-scale)); padding: 0 10px; }
423
+ .fp-selected { flex: 1; min-width: 0; font-family: var(--mono); font-size: calc(12px * var(--fs-scale)); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; align-self: center; }
424
+ .file-dialog { width: 900px; flex-direction: column; padding: 14px 14px 12px; }
425
+ .file-dialog .file-head h3 { margin-bottom: 2px; }
426
+ .file-dialog .actions { margin-top: 10px; }
402
427
  .file-dialog[open] { display: flex; }
403
428
  .file-dialog .file-head { flex: 0 0 auto; }
404
- .file-dialog .file-head .lead { margin-bottom: 10px; overflow-wrap: anywhere; font-family: var(--mono); font-size: 12px; }
429
+ .file-dialog .file-head .lead { margin-bottom: 10px; overflow-wrap: anywhere; font-family: var(--mono); font-size: calc(12px * var(--fs-scale)); }
405
430
  .file-dialog .actions { flex: 0 0 auto; margin-top: 14px; }
406
- .file-view { flex: 1 1 auto; min-height: 120px; max-height: 62vh; overflow: auto; padding: 14px 16px; border-radius: 14px; background: var(--bg); font-size: 14px; font-weight: 600; line-height: 1.55; color: var(--ink-2); }
431
+ .file-view { flex: 1 1 auto; min-height: 120px; max-height: 62vh; overflow: auto; padding: 14px 16px; border-radius: 14px; background: var(--bg); font-size: calc(14px * var(--fs-scale)); font-weight: 600; line-height: 1.55; color: var(--ink-2); }
407
432
  .file-view.csv { padding: 0; background: transparent; }
408
433
  .csv-wrap { overflow: auto; max-height: 58vh; border-radius: 14px; box-shadow: var(--edge); background: var(--card); }
409
- table.csv { border-collapse: separate; border-spacing: 0; font-size: 13px; min-width: 100%; }
434
+ table.csv { border-collapse: separate; border-spacing: 0; font-size: calc(13px * var(--fs-scale)); min-width: 100%; }
410
435
  table.csv th, table.csv td { padding: 6px 12px; border-bottom: 1px solid var(--border); text-align: left; white-space: nowrap; max-width: 420px; overflow: hidden; text-overflow: ellipsis; }
411
436
  table.csv th { position: sticky; top: 0; background: var(--lav); font-weight: 800; z-index: 1; }
412
- table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
413
- .csv-count { margin: 8px 2px 0; font-size: 12px; color: var(--muted); font-weight: 700; }
437
+ table.csv tbody tr:nth-child(even) td { background: var(--table-stripe); }
438
+ .csv-count { margin: 8px 2px 0; font-size: calc(12px * var(--fs-scale)); color: var(--muted); font-weight: 700; }
414
439
  .bubble .text.clamped { max-height: 9.2em; overflow: hidden; -webkit-mask-image: linear-gradient(180deg, #000 70%, transparent); mask-image: linear-gradient(180deg, #000 70%, transparent); }
415
- .bubble .more { background: none; border: 0; color: var(--primary); font-weight: 800; padding: 2px 0; font-size: 13px; }
416
- .msg.mine .bubble .more { color: #fff; }
440
+ .bubble [data-act="more"] { font-size: calc(13px * var(--fs-scale)); }
441
+ .msg.mine .bubble [data-act="more"] { color: var(--bubble-mine-ink); }
417
442
  .bubble .pending { display: inline-flex; align-items: center; gap: 4px; height: 1.55em; vertical-align: text-bottom; }
418
443
  .bubble .pending i { width: 5px; height: 5px; border-radius: 50%; background: var(--muted); opacity: 0.25; animation: think 1.4s ease-in-out infinite; }
419
444
  .bubble .pending i:nth-child(2) { animation-delay: 0.2s; }
@@ -422,91 +447,76 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
422
447
  .mention { font-weight: 800; }
423
448
  .working { display: inline-block; width: 19px; height: 15px; color: var(--faint); margin-left: 5px; vertical-align: -3px; overflow: visible; }
424
449
  .working .forearm { animation: type 0.14s ease-in-out infinite alternate; transform-box: view-box; transform-origin: 23px 27px; }
450
+ .working .forearm.far { animation: type-far 0.14s ease-in-out infinite alternate-reverse; transform-origin: 22px 25.6px; }
425
451
  .working .body { animation: bob 0.28s ease-in-out infinite alternate; }
426
452
  @keyframes type { from { transform: rotate(-16deg); } to { transform: rotate(4deg); } }
453
+ @keyframes type-far { from { transform: rotate(-45deg); } to { transform: rotate(18deg); } }
427
454
  @keyframes bob { from { transform: translateY(0); } to { transform: translateY(-0.8px); } }
428
- .thought { margin: 2px 0 6px; font-size: 12px; font-weight: 600; color: var(--muted); }
455
+ .thought { margin: 2px 0 6px; font-size: calc(12px * var(--fs-scale)); font-weight: 600; color: var(--muted); }
429
456
  .thought summary { cursor: pointer; }
430
457
  .thought-text { white-space: pre-wrap; padding: 4px 0 0 8px; border-left: 2px solid var(--lav-2); margin-top: 4px; }
431
- .agent-notices:empty, .tools:empty, .meta:empty, .perms:empty { display: none; }
432
- .agent-notice { font-size: 12px; font-weight: 700; color: var(--warm-ink); background: var(--warm); border-radius: 10px; padding: 5px 10px; margin: 2px 0 8px; display: flex; gap: 6px; align-items: flex-start; }
458
+ .agent-notices:empty, .tools:empty, .meta:empty, .perms:empty, .stop-note:empty { display: none; }
459
+ .agent-notices > [data-ui="reply-note"] { margin: 2px 0 8px; }
460
+ .bubble > .stop-note { margin: 8px 0 2px; }
433
461
  .tools { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 10px; }
434
- .tool { display: inline-flex; flex-direction: column; max-width: 100%; min-width: 0; }
435
- .tool.open { flex-basis: 100%; }
436
- .tool > .chip { font: inherit; font-size: 11px; font-weight: 800; cursor: pointer; text-align: left; }
437
- .tool > .chip-completed { --tool-bg: var(--mint); --tool-ink: var(--mint-ink); }
438
- .tool > .chip-failed { --tool-bg: var(--rose); --tool-ink: var(--rose-ink); }
439
- .tool > .chip-in_progress { --tool-bg: var(--warm); --tool-ink: var(--warm-ink); }
440
- .tool > .chip-pending { --tool-bg: var(--lav); --tool-ink: var(--primary); }
441
- .tool > .chip::after { content: "▾"; margin-left: auto; padding-left: 8px; opacity: 0.55; transition: transform var(--t-fast); }
442
- .tool.open > .chip { width: 100%; border-radius: 12px 12px 0 0; padding: 6px 12px; white-space: normal; }
443
- .tool.open > .chip::after { transform: rotate(180deg); }
444
- .tool.open { --tool-bg: var(--lav); --tool-ink: var(--primary); }
445
- .tool.open > .chip-completed ~ .tool-body, .tool.open > .chip-completed + .tool-body { --tool-bg: var(--mint); --tool-ink: var(--mint-ink); }
446
- .tool.open > .chip-failed + .tool-body { --tool-bg: var(--rose); --tool-ink: var(--rose-ink); }
447
- .tool.open > .chip-in_progress + .tool-body { --tool-bg: var(--warm); --tool-ink: var(--warm-ink); }
448
- .tool-body { margin: 0; padding: 8px 10px 10px; background: var(--card); border: 2px solid var(--tool-bg, var(--lav)); border-top: 0; border-radius: 0 0 12px 12px; font-size: 12px; max-height: 340px; overflow: auto; }
449
- .tool-body pre { background: var(--soft); color: var(--ink); padding: 6px 8px; border-radius: 8px; }
450
- .tool-sec b { color: var(--tool-ink, var(--muted)); }
451
- .tool-sec + .tool-sec { margin-top: 8px; }
452
- .tool-sec b { display: block; font-size: 10.5px; font-weight: 800; letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted); }
453
- .tool-sec.muted { color: var(--muted); font-style: italic; }
454
- .tool-body pre { margin: 3px 0 0; white-space: pre-wrap; word-break: break-word; font-size: 11.5px; line-height: 1.45; }
455
- .plan { margin: 4px 0 8px; font-size: 12px; font-weight: 600; background: #fff; border-radius: 10px; padding: 8px 10px; }
462
+ .plan { margin: 4px 0 8px; font-size: calc(12px * var(--fs-scale)); font-weight: 600; background: var(--bubble-inset-bg); border-radius: 10px; padding: 8px 10px; }
456
463
  .plan-entry.completed { text-decoration: line-through; color: var(--muted); }
457
464
  .plan-entry.in_progress { font-weight: 800; }
458
- .meta { color: var(--faint); font-size: 11px; font-weight: 700; padding: 0 4px; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
465
+ .meta { color: var(--faint); font-size: calc(11px * var(--fs-scale)); font-weight: 700; padding: 0 4px; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
466
+ .live-tail { display: inline-flex; align-items: center; gap: 8px; margin-left: 5px; vertical-align: -3px; white-space: nowrap; }
467
+ .live-tail .working { margin-left: 0; vertical-align: 0; }
468
+ .live-tail.no-figure .working { display: none; }
459
469
  .meta .i { width: 12px; height: 12px; }
460
470
  .msg.mine .meta { justify-content: flex-end; }
461
- .head .edited { font-size: 10.5px; color: var(--faint); font-style: italic; margin-left: 6px; cursor: help; }
462
- .head .edit-btn, .head .pin-btn { border: 0; background: none; color: var(--faint); cursor: pointer; padding: 0 4px; opacity: 0; transition: opacity var(--t-fast), color var(--t-fast); border-radius: 6px; line-height: 0; }
463
- .head .edit-btn .i, .head .pin-btn .i { width: 14px; height: 14px; }
464
- .msg:hover .head .edit-btn, .head .edit-btn:focus, .msg:hover .head .pin-btn, .head .pin-btn:focus { opacity: 1; }
465
- .head .edit-btn:hover { color: var(--primary); }
466
- .head .pin-btn:hover { color: var(--attention); }
467
- .msg.pinned .head .pin-btn { opacity: 1; color: var(--attention); }
471
+ .head .edited { font-size: calc(10.5px * var(--fs-scale)); color: var(--faint); font-style: italic; margin-left: 6px; cursor: help; }
472
+ .head [data-ui="icon-button"] { opacity: 0; width: 0; height: auto; padding: 0; margin-left: -8px; overflow: hidden; line-height: 0; transition: width var(--t-base) var(--ease-out), padding var(--t-base) var(--ease-out), margin var(--t-base) var(--ease-out), opacity var(--t-fast); }
473
+ .head [data-ui="icon-button"] .i { width: 18px; height: 18px; flex: none; }
474
+ .msg:hover .head [data-ui="icon-button"], .head [data-ui="icon-button"]:focus-visible, .msg.pinned .head [data-act="pin"] { opacity: 1; width: 28px; padding: 0 5px; margin-left: 0; }
475
+ .head [data-act="pin"]:hover { color: var(--attention); background: none; }
476
+ .msg.pinned .head [data-act="pin"] { color: var(--attention); }
468
477
  .edit-box { margin: 4px 0 6px; }
469
478
  .msg .bubble-col:has(> .bubble > .edit-box:not([hidden])) { width: 100%; }
470
479
  .msg .bubble:has(> .edit-box:not([hidden])) { width: min(760px, 100%); }
471
- .msg.mine .edit-box .btn.ghost { color: rgba(255, 255, 255, 0.85); }
472
- .msg.mine .edit-box .btn.ghost:hover:not(:disabled) { background: rgba(255, 255, 255, 0.18); color: #fff; }
473
- .msg.mine .edit-box .btn.primary { background: #fff; color: var(--primary); box-shadow: none; }
474
- .msg.mine .edit-box .btn.primary:hover:not(:disabled) { background: #fff; color: var(--primary); }
475
- .edit-area { width: 100%; box-sizing: border-box; padding: 10px 12px; border: 2px solid var(--primary); border-radius: 12px; background: #fff; color: var(--ink); font: inherit; font-weight: 600; resize: vertical; }
480
+ .msg.mine .edit-box [data-ui="button"][data-kind="ghost"] { color: var(--bubble-mine-soft-ink); }
481
+ .msg.mine .edit-box [data-ui="button"][data-kind="ghost"]:hover:not(:disabled) { background: var(--bubble-mine-ghost-hover-bg); color: var(--bubble-mine-ink); }
482
+ .msg.mine .edit-box [data-ui="button"][data-kind="primary"] { background: var(--bubble-mine-cta-bg); color: var(--bubble-mine-cta-ink); box-shadow: none; }
483
+ .msg.mine .edit-box [data-ui="button"][data-kind="primary"]:hover:not(:disabled) { background: var(--bubble-mine-cta-bg); color: var(--bubble-mine-cta-ink); }
484
+ .edit-area { width: 100%; box-sizing: border-box; padding: 10px 12px; border: 2px solid var(--input-focus-border); border-radius: 12px; background: var(--input-bg); color: var(--ink); font: inherit; font-weight: 600; resize: vertical; }
476
485
  .edit-box .row-btns { margin-top: 6px; }
477
- .skill-invoke { font-size: 11px; font-weight: 800; color: var(--primary); background: var(--lav); border-radius: var(--r-pill); padding: 2px 10px; display: inline-block; margin-bottom: 6px; }
478
- .msg.mine .skill-invoke { background: rgba(255, 255, 255, 0.22); color: #fff; }
479
- .perm { margin: 6px 0; background: var(--warm); border-radius: 12px; padding: 10px 12px; font-size: 13px; font-weight: 600; max-width: 720px; animation: pop var(--t-base) var(--ease-out); }
480
- .perm.resolved { opacity: 0.7; }
481
- .perm-title .kind { font-size: 11px; color: var(--muted); }
482
- .perm-input { margin: 6px 0; max-height: 160px; overflow: auto; font-size: 11px; }
483
- .perm-actions { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px; }
484
- .perm-btn { border: 0; background: #fff; border-radius: 10px; padding: 6px 12px; font-size: 12px; font-weight: 800; transition: transform var(--t-fast) var(--ease-out); }
485
- .perm-btn:hover { transform: translateY(-1px); }
486
- .perm-btn.kind-allow_once, .perm-btn.kind-allow_always { background: var(--mint); color: var(--mint-ink); }
487
- .perm-btn.kind-reject_once, .perm-btn.kind-reject_always { background: var(--rose); color: var(--rose-ink); }
488
- .perm-result { color: var(--muted); font-size: 12px; }
486
+ .skill-invoke { font-size: calc(11px * var(--fs-scale)); font-weight: 800; color: var(--primary); background: var(--lav); border-radius: var(--r-pill); padding: 2px 10px; display: inline-block; margin-bottom: 6px; }
487
+ .msg.mine .skill-invoke { background: var(--bubble-mine-chip-bg); color: var(--bubble-mine-ink); }
488
+ .messages [data-ui="ask-card"] { margin: 6px 0; max-width: 720px; animation: pop var(--t-base) var(--ease-out); }
489
+ .messages [data-ui="ask-card"][data-kind="proposal"] { max-width: 760px; }
490
+ .prop-why { font-weight: 500; margin: 4px 0 6px; }
491
+ .prop-diff { display: flex; flex-direction: column; gap: 4px; margin: 6px 0; font-size: calc(12px * var(--fs-scale)); font-weight: 500; }
492
+ .prop-row { background: var(--bubble-prop-row-bg); border-radius: 8px; padding: 6px 8px; }
493
+ .prop-row > b { font-weight: 800; margin-right: 6px; }
494
+ .prop-line { margin-top: 2px; white-space: pre-wrap; }
495
+ .prop-line.add { color: var(--mint-ink); }
496
+ .prop-line.del { color: var(--rose-ink); text-decoration: line-through; opacity: 0.8; }
497
+ .prop-from { color: var(--muted); }
498
+ .prop-to { font-weight: 800; }
499
+ .prop-warn { margin: 6px 0 0 16px; padding: 0; font-size: calc(12px * var(--fs-scale)); font-weight: 500; color: var(--warm-ink, inherit); }
500
+ .prop-own { display: flex; gap: 6px; align-items: center; font-size: calc(12px * var(--fs-scale)); font-weight: 600; margin-top: 6px; }
489
501
  .visibility-divider { display: flex; align-items: center; gap: 10px; margin: 4px 0; }
490
502
  .visibility-divider .vd-line { flex: 1; height: 8px; background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='8' viewBox='0 0 16 8'><path d='M0 4 Q4 0 8 4 T16 4' fill='none' stroke='%23f472b6' stroke-width='1.6'/></svg>") repeat-x center / 16px 8px; opacity: 0.7; }
491
- .visibility-divider .vd-label { color: var(--unseen-ink); background: var(--unseen-bg); border-radius: var(--r-pill); padding: 4px 12px; font-size: 11px; font-weight: 800; white-space: nowrap; max-width: 70%; overflow: hidden; text-overflow: ellipsis; }
503
+ .visibility-divider .vd-label { color: var(--unseen-ink); background: var(--unseen-bg); border-radius: var(--r-pill); padding: 4px 12px; font-size: calc(11px * var(--fs-scale)); font-weight: 800; white-space: nowrap; max-width: 70%; overflow: hidden; text-overflow: ellipsis; }
492
504
  .msg.hidden { justify-content: center; }
493
- .hidden-turn { max-width: 720px; width: 100%; background: var(--soft); border-radius: 12px; padding: 6px 12px; font-size: 12px; font-weight: 600; color: var(--muted); }
505
+ .hidden-turn { max-width: 720px; width: 100%; background: var(--soft); border-radius: 12px; padding: 6px 12px; font-size: calc(12px * var(--fs-scale)); font-weight: 600; color: var(--muted); }
494
506
  .hidden-turn summary { cursor: pointer; list-style: none; }
495
507
  .hidden-turn summary::-webkit-details-marker { display: none; }
496
508
  .hidden-turn[open] summary { color: var(--ink); }
497
509
  .hidden-body { padding: 6px 0 4px; }
498
- .hidden-label { text-transform: uppercase; letter-spacing: 0.08em; font-size: 10px; font-weight: 800; color: var(--faint); margin: 6px 0 2px; }
499
- .hidden-text { white-space: pre-wrap; background: #fff; border-radius: 10px; padding: 8px 10px; color: var(--ink-2); }
510
+ .hidden-label { text-transform: uppercase; letter-spacing: 0.08em; font-size: calc(10px * var(--fs-scale)); font-weight: 800; color: var(--faint); margin: 6px 0 2px; }
511
+ .hidden-text { white-space: pre-wrap; background: var(--bubble-inset-bg); border-radius: 10px; padding: 8px 10px; color: var(--ink-2); }
500
512
  .hidden-body ul { margin: 2px 0 0; padding-left: 18px; }
501
- .focus-pill { align-self: center; font-size: 11px; font-weight: 800; color: var(--warm-ink); background: var(--warm); padding: 5px 14px 5px 10px; border-radius: var(--r-pill); display: inline-flex; align-items: center; gap: 8px; max-width: 80%; text-align: left; }
502
- .focus-pill .hush-face { font-size: 18px; line-height: 1; }
503
- .side-foot .btn.hush .hush-face { font-size: 22px; line-height: 1; }
513
+ .side-foot [data-ui="button"].hush .hush-face { font-size: 22px; line-height: 1; }
504
514
  .meta .sep { color: var(--faint); margin: 0 4px; }
505
515
  .meta.seen { color: var(--primary); font-weight: 800; }
506
516
  .meta .ticks { letter-spacing: -0.15em; margin-right: 4px; }
507
517
  .side-list li.offline .p-name, .side-list li.offline .p-sub { color: var(--muted); }
508
- .side-list li.me .avatar .av-tile, .msg.mine .avatar .av-tile { box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--primary); }
509
- .msg.mine .avatar .av-tile { box-shadow: 0 0 0 2px #fff, 0 0 0 3.5px var(--primary); }
518
+ .side-list li.me .avatar .av-tile, .msg.mine .avatar .av-tile { box-shadow: 0 0 0 2px var(--tile-ring), 0 0 0 4px var(--primary); }
519
+ .msg.mine .avatar .av-tile { box-shadow: 0 0 0 2px var(--tile-ring), 0 0 0 3.5px var(--primary); }
510
520
  .composer { position: relative; display: flex; gap: 10px; padding: 8px 8px 8px 18px; margin: 10px 16px; background: var(--softer); border-radius: 20px; align-items: center; min-height: 60px; transition: box-shadow var(--t-fast); }
511
521
  .composer-grip { position: absolute; left: 24px; right: 24px; top: -6px; height: 12px; cursor: ns-resize; z-index: 3; touch-action: none; }
512
522
  .composer-grip::after { content: ""; position: absolute; left: 50%; top: 4px; width: 44px; height: 4px; margin-left: -22px; border-radius: 2px; background: var(--lav-2); opacity: 0; transition: opacity var(--t-fast), background var(--t-fast); }
@@ -521,26 +531,112 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
521
531
  .composer-box:has(.shots-tray:not([hidden])) textarea { flex: none; }
522
532
  .composer.drop-target { box-shadow: 0 0 0 2px var(--primary); }
523
533
  .shots-tray { display: flex; flex-wrap: wrap; gap: 6px; padding: 6px 0 2px; }
524
- .shot-chip { position: relative; display: block; width: 56px; height: 56px; border-radius: 10px; overflow: hidden; background: #fff; box-shadow: 0 1px 3px rgba(28, 27, 51, 0.16); }
534
+ .shot-chip { position: relative; display: block; width: 56px; height: 56px; border-radius: 10px; overflow: hidden; background: var(--attach-thumb-bg); box-shadow: var(--attach-thumb-shadow); }
525
535
  .shot-chip img { width: 100%; height: 100%; object-fit: cover; display: block; }
526
- .shot-drop { position: absolute; top: 2px; right: 2px; width: 18px; height: 18px; border: 0; border-radius: 50%; background: rgba(28, 27, 51, 0.72); color: #fff; font-size: 13px; line-height: 1; padding: 0; cursor: pointer; }
536
+ .shot-drop { position: absolute; top: 2px; right: 2px; width: 18px; height: 18px; border: 0; border-radius: 50%; background: var(--attach-overlay-bg); color: var(--attach-overlay-ink); font-size: calc(13px * var(--fs-scale)); line-height: 1; padding: 0; cursor: pointer; }
527
537
  .shot-drop:hover { background: var(--primary); }
528
- .shot-n { position: absolute; top: 3px; left: 3px; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 6px; background: rgba(28, 27, 51, 0.72); color: #fff; font-size: 11px; font-weight: 800; line-height: 18px; text-align: center; pointer-events: none; }
538
+ .shot-n { position: absolute; top: 3px; left: 3px; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 6px; background: var(--attach-overlay-bg); color: var(--attach-overlay-ink); font-size: 11px; font-weight: 800; line-height: calc(18px * var(--fs-scale)); text-align: center; pointer-events: none; }
529
539
  .bubble .shots { display: flex; flex-wrap: wrap; gap: 8px; }
530
540
  .bubble .shots:not([hidden]) { margin-top: 8px; }
531
- .bubble .shot { position: relative; display: block; width: 72px; height: 72px; padding: 0; border: 0; border-radius: 12px; overflow: hidden; line-height: 0; background: #fff; box-shadow: 0 1px 3px rgba(28, 27, 51, 0.16); cursor: zoom-in; transition: transform var(--t-fast) var(--ease-out); }
541
+ .bubble .shot { position: relative; display: block; width: 72px; height: 72px; padding: 0; border: 0; border-radius: 12px; overflow: hidden; line-height: 0; background: var(--attach-thumb-bg); box-shadow: var(--attach-thumb-shadow); cursor: zoom-in; transition: transform var(--t-fast) var(--ease-out); }
532
542
  .bubble .shot:hover { transform: translateY(-1px) scale(1.03); }
533
543
  .bubble .shot img { width: 100%; height: 100%; object-fit: cover; display: block; }
534
- .img-ref { display: inline-flex; align-items: center; gap: 3px; vertical-align: -3px; height: 20px; padding: 0 6px 0 4px; margin: 0 1px; border: 0; border-radius: 6px; background: rgba(28, 27, 51, 0.1); color: inherit; font: inherit; font-size: 11px; font-weight: 800; line-height: 20px; cursor: zoom-in; }
535
- .msg.mine .img-ref { background: rgba(255, 255, 255, 0.24); }
544
+ .img-ref { display: inline-flex; align-items: center; gap: 3px; vertical-align: -3px; height: 20px; padding: 0 6px 0 4px; margin: 0 1px; border: 0; border-radius: 6px; background: var(--attach-ref-bg); color: inherit; font: inherit; font-size: calc(11px * var(--fs-scale)); font-weight: 800; line-height: calc(20px * var(--fs-scale)); cursor: zoom-in; }
545
+ .msg.mine .img-ref { background: var(--attach-mine-ref-bg); }
536
546
  .img-ref svg { width: 14px; height: 14px; }
537
- .img-ref:hover { background: var(--primary); color: #fff; }
538
- .lightbox { position: fixed; inset: 0; z-index: 200; display: grid; place-content: center; padding: 24px; background: rgba(28, 27, 51, 0.72); cursor: zoom-out; animation: fade-in var(--t-base) var(--ease-out); }
539
- .lightbox img { max-width: calc(100vw - 48px); max-height: calc(100vh - 48px); border-radius: 12px; box-shadow: 0 24px 60px -20px rgba(0, 0, 0, 0.6); background: #fff; }
540
- .composer textarea { flex: 1; display: block; box-sizing: border-box; resize: none; padding: 8px 0; margin: 0; border: 0; border-radius: 0; background: transparent; height: 36px; min-height: 36px; line-height: 20px; font-size: 14px; font-weight: 600; outline: none; color: var(--ink); overflow-y: auto; }
547
+ .img-ref:hover { background: var(--primary); color: var(--btn-on-primary); }
548
+ .quote { display: block; margin: 8px 0; padding: 6px 10px; border-left: 3px solid var(--lav); border-radius: 0 8px 8px 0; background: var(--soft); cursor: pointer; transition: background var(--t-fast), border-color var(--t-fast); }
549
+ .quote:hover { background: var(--lav); border-color: var(--primary); }
550
+ .quote .q-head { display: flex; align-items: center; gap: 4px; font-size: calc(11px * var(--fs-scale)); font-weight: 800; color: var(--muted); margin-bottom: 2px; }
551
+ .quote .q-head .i { width: 13px; height: 13px; }
552
+ .quote .q-when { font-weight: 700; color: var(--faint); }
553
+ .quote .q-text { display: block; white-space: pre-wrap; font-size: calc(13.5px * var(--fs-scale)); font-weight: 600; color: var(--ink-2); }
554
+ .msg.mine .bubble .quote { background: var(--quote-mine-bg); border-color: var(--quote-mine-border); }
555
+ .msg.mine .bubble .quote:hover { background: var(--quote-mine-hover-bg); border-color: var(--quote-mine-hover-border); }
556
+ .msg.mine .bubble .quote .q-head, .msg.mine .bubble .quote .q-when { color: var(--quote-mine-head-ink); }
557
+ .msg.mine .bubble .quote .q-text { color: var(--quote-mine-text-ink); }
558
+ .quotes-tray { display: flex; flex-direction: column; gap: 4px; padding: 6px 0 2px; }
559
+ .quote-chip { display: flex; align-items: center; gap: 6px; padding: 4px 8px; border-radius: 10px; background: var(--soft); font-size: calc(12px * var(--fs-scale)); font-weight: 700; color: var(--ink-2); }
560
+ .quote-chip .qc-n { min-width: 16px; height: 16px; border-radius: 5px; background: var(--lav-2); color: var(--ink-2); font-size: 10px; line-height: calc(16px * var(--fs-scale)); text-align: center; flex: none; }
561
+ .quote-chip .qc-text { color: var(--muted); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
562
+ .quote-chip .qc-drop { margin-left: auto; border: 0; background: none; color: var(--faint); font-size: calc(14px * var(--fs-scale)); line-height: 1; padding: 0 2px; cursor: pointer; flex: none; }
563
+ .quote-chip .qc-drop:hover { color: var(--primary); }
564
+ .composer-box:has(.quotes-tray:not([hidden])) { flex-direction: column; align-items: stretch; }
565
+ .composer-box:has(.quotes-tray:not([hidden])) textarea { flex: none; }
566
+ .quote-pop { position: fixed; z-index: 150; display: inline-flex; align-items: center; gap: 4px; height: 28px; padding: 0 10px; border: 0; border-radius: 8px; background: var(--pop-dark-bg); color: var(--pop-dark-ink); font: 800 calc(12px * var(--fs-scale))/1 var(--font); cursor: pointer; box-shadow: var(--pop-dark-shadow); }
567
+ .quote-pop .i { width: 14px; height: 14px; }
568
+ .quote-pop:hover { background: var(--primary); }
569
+ .lightbox { position: fixed; inset: 0; z-index: 200; display: grid; place-content: center; padding: 24px; background: var(--scrim-bg); cursor: zoom-out; animation: fade-in var(--t-base) var(--ease-out); }
570
+ .lightbox img { max-width: calc(100vw - 48px); max-height: calc(100vh - 48px); border-radius: 12px; box-shadow: var(--scrim-shadow); background: var(--scrim-image-bg); }
571
+ .dialog {
572
+ resize: both;
573
+ min-width: 320px;
574
+ min-height: 220px;
575
+ background-image: linear-gradient(135deg, transparent 42%, var(--faint) 42%, var(--faint) 55%, transparent 55%, transparent 68%, var(--faint) 68%, var(--faint) 81%, transparent 81%);
576
+ background-repeat: no-repeat;
577
+ background-position: right 7px bottom 7px;
578
+ background-size: 11px 11px;
579
+ }
580
+ .dialog.closing { resize: none; }
581
+ .token.comment, .token.prolog, .token.cdata { color: var(--syntax-comment); font-style: italic; }
582
+ .token.punctuation, .token.operator { color: var(--syntax-punctuation); }
583
+ .token.keyword, .token.rule, .token.important, .token.atrule { color: var(--syntax-keyword); font-weight: 700; }
584
+ .token.string, .token.char, .token.attr-value, .token.regex { color: var(--syntax-string); }
585
+ .token.number, .token.boolean, .token.constant, .token.symbol { color: var(--syntax-number); }
586
+ .token.function, .token.class-name, .token.title { color: var(--syntax-function); }
587
+ .token.tag, .token.selector, .token.deleted { color: var(--syntax-tag); }
588
+ .token.attr-name, .token.property, .token.variable, .token.parameter { color: var(--syntax-attr); }
589
+ .token.inserted { color: var(--syntax-string); }
590
+ .token.namespace { opacity: 0.75; }
591
+ .code-view { display: flex; align-items: flex-start; gap: 0; background: var(--code-bg); border-radius: var(--r-sm); overflow: auto; }
592
+ .code-view .gutter { position: sticky; left: 0; z-index: 1; flex: none; align-self: stretch; display: flex; flex-direction: column; padding: 10px 8px 10px 10px; background: var(--code-gutter-bg); color: var(--code-gutter-ink); font: 500 var(--fs-code, calc(12px * var(--fs-scale))) / 1.55 var(--mono); text-align: right; user-select: none; }
593
+ .code-view .gutter span { display: block; }
594
+ .code-view .gutter span.line-mark { color: var(--code-line-mark-ink); font-weight: 800; background: var(--code-line-mark-bg); border-radius: 4px; }
595
+ .code-view .code-body { margin: 0; flex: 1 0 auto; min-width: 0; padding: 10px 12px; background: transparent; border-radius: 0; overflow: visible; white-space: pre; line-height: 1.55; }
596
+ .code-view::-webkit-scrollbar { width: 12px; height: 12px; }
597
+ .code-view::-webkit-scrollbar-track { background: var(--code-sb-track); margin: 0; }
598
+ .code-view::-webkit-scrollbar-thumb { background: var(--code-sb-thumb); border: 3px solid transparent; background-clip: padding-box; border-radius: 8px; }
599
+ .code-view::-webkit-scrollbar-thumb:hover { background: var(--code-sb-thumb-hover); background-clip: padding-box; }
600
+ .code-view::-webkit-scrollbar-corner { background: var(--code-sb-track); }
601
+ @supports not selector(::-webkit-scrollbar) { .code-view { scrollbar-width: auto; scrollbar-color: var(--code-sb-firefox) var(--code-sb-track); } }
602
+ .code-view code, .msg.mine .bubble .code-view code, .file-view .code-view code { background: transparent; padding: 0; border-radius: 0; color: var(--code-ink); }
603
+ .file-view.text { padding: 0; overflow: hidden; }
604
+ .file-view.text .code-view { border-radius: 12px; height: 100%; }
605
+ #file-dialog[open] { display: flex; flex-direction: column; }
606
+ #file-dialog .file-view { min-height: 0; }
607
+ .dialog.sized .file-view { max-height: none; }
608
+ .file-view.wrap .code-body { white-space: pre-wrap; word-break: break-word; }
609
+ .find-hit { background: var(--code-find-hit-bg); color: var(--code-find-hit-ink); border-radius: 3px; padding: 0 1px; }
610
+ .fv-tools { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 8px; }
611
+ .fv-tools .search { flex: 1 1 200px; min-width: 160px; margin: 0; height: 34px; }
612
+ #fv-tools label.search > input:not([type="checkbox"]) { flex: 1 1 auto; margin-top: 0; width: auto; height: 100%; padding: 0; border: 0; background: transparent; }
613
+ .fv-tools .fv-hits, .fv-tools .fv-count { color: var(--faint); font-size: var(--fs-xs); font-weight: 700; }
614
+ .fv-tools .fv-goto, .fv-tools .fv-wrap { display: flex; align-items: center; gap: 5px; color: var(--muted); font-size: var(--fs-xs); font-weight: 700; }
615
+ #fv-tools .fv-goto > input[type="number"] { flex: 0 0 76px; margin-top: 0; width: 76px; height: 30px; padding: 0 8px; }
616
+ .fv-tools .fv-wrap input { accent-color: var(--primary); }
617
+ .text [data-ui="file-card"] { margin: 8px 0 4px; }
618
+ .msg.mine [data-act="preview"] { background: var(--attach-mine-ref-bg); color: var(--bubble-mine-ink); }
619
+ .msg.mine [data-act="preview"][data-state="on"] { background: var(--attach-mine-chip-open-bg); color: var(--attach-mine-chip-open-ink); }
620
+ .diagram-view { position: fixed; inset: 0; z-index: 210; overflow: hidden; background: var(--scrim-bg); cursor: grab; animation: fade-in var(--t-base) var(--ease-out); touch-action: none; }
621
+ .diagram-view.dragging { cursor: grabbing; }
622
+ .dv-stage { position: absolute; top: 0; left: 0; transform-origin: 0 0; will-change: transform; }
623
+ .dv-stage svg { display: block; background: var(--card); border-radius: 14px; box-shadow: var(--scrim-shadow); padding: 12px; box-sizing: content-box; }
624
+ .dv-bar { position: absolute; left: 50%; bottom: 20px; transform: translateX(-50%); display: flex; align-items: center; gap: 6px; padding: 6px 8px; border-radius: 14px; background: var(--diagram-bar-bg); box-shadow: var(--diagram-bar-shadow); cursor: default; }
625
+ .dv-btn { width: 30px; height: 30px; border: 0; border-radius: 9px; background: transparent; color: var(--ink-3); display: grid; place-content: center; cursor: pointer; transition: background var(--t-fast), color var(--t-fast); }
626
+ .dv-btn .i { width: 17px; height: 17px; }
627
+ .dv-btn:hover { background: var(--soft); color: var(--primary); }
628
+ .dv-level { min-width: 58px; height: 30px; padding: 0 8px; border: 0; border-radius: 9px; background: var(--soft); color: var(--ink-2); font: 800 var(--fs-xs) / 30px var(--font); cursor: pointer; }
629
+ .dv-level:hover { color: var(--primary); }
630
+ .dv-hint { margin: 0 4px 0 8px; color: var(--faint); font-size: var(--fs-xs); font-weight: 700; }
631
+ .mermaid-block .mm-expand { display: none; border: 0; background: transparent; color: var(--faint); padding: 2px 4px; border-radius: 8px; cursor: pointer; line-height: 0; transition: background var(--t-fast), color var(--t-fast); }
632
+ .mermaid-block .mm-expand .i { width: 15px; height: 15px; transition: transform var(--t-fast) var(--ease-out); }
633
+ .mermaid-block.ok .mm-expand { display: inline-flex; }
634
+ .mermaid-block .mm-expand:hover { background: var(--soft); color: var(--primary); }
635
+ .mermaid-block .mm-expand:hover .i { transform: scale(1.12); }
636
+ .composer textarea { flex: 1; display: block; box-sizing: border-box; resize: none; padding: 8px 0; margin: 0; border: 0; border-radius: 0; background: transparent; height: 36px; min-height: 36px; line-height: calc(20px * var(--fs-scale)); font-size: calc(14px * var(--fs-scale)); font-weight: 600; outline: none; color: var(--ink); overflow-y: auto; }
541
637
  .composer textarea::placeholder { color: var(--placeholder); font-weight: 600; }
542
638
  @supports (field-sizing: content) { .composer textarea { field-sizing: content; height: auto; } }
543
- .send-btn { width: 44px; height: 44px; border-radius: 14px; border: 0; background: var(--grad-primary); color: #fff; display: grid; place-content: center; box-shadow: var(--shadow-primary); flex: none; transition: transform var(--t-fast) var(--ease-out), filter var(--t-fast); }
639
+ .send-btn { width: 44px; height: 44px; border-radius: 14px; border: 0; background: var(--grad-primary); color: var(--btn-on-primary); display: grid; place-content: center; box-shadow: var(--shadow-primary); flex: none; transition: transform var(--t-fast) var(--ease-out), filter var(--t-fast); }
544
640
  .send-btn .i { width: 18px; height: 18px; display: block; }
545
641
  .composer-clear { width: 28px; height: 28px; border-radius: 50%; border: 0; background: transparent; color: var(--placeholder); font-size: 20px; line-height: 1; cursor: pointer; flex: none; margin-right: 2px; transition: background var(--t-fast), color var(--t-fast); }
546
642
  .composer-clear:hover { background: var(--soft); color: var(--danger); }
@@ -550,7 +646,7 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
550
646
  .chat .emoji-menu { left: 24px; bottom: calc(var(--composer-h, 60px) + 18px); }
551
647
  .page-inner { flex: 1; overflow-y: auto; padding: 8px 22px 22px; }
552
648
  .page-inner > .page-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 16px; min-height: 48px; }
553
- .page-inner h1 { font-size: 20px; letter-spacing: -0.01em; }
649
+ .page-inner h1 { font-size: calc(20px * var(--fs-scale)); letter-spacing: -0.01em; }
554
650
  .page-cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 12px; align-items: start; }
555
651
  .details { grid-area: details; position: relative; width: var(--details-w); min-width: 0; min-height: 0; background: var(--panel); border-radius: var(--r-lg); box-shadow: var(--edge); animation: slide-in-right var(--t-slow) var(--ease-out); display: flex; flex-direction: column; overflow: hidden; }
556
652
  .details.closing { animation: fade-out var(--t-base) var(--ease-out) forwards; }
@@ -558,29 +654,32 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
558
654
  .details-inner .field input, .details-inner .field select, .details-inner .field textarea, .details-inner .section input, .details-inner .section select, .details-inner .section textarea { max-width: 100%; }
559
655
  .details-inner .section { background: transparent; padding: 0; margin-bottom: 8px; }
560
656
  .details-inner .section.danger { background: var(--rose); padding: 16px; }
657
+ .trouble { display: grid; gap: 4px; background: var(--warm); color: var(--warm-ink); border-radius: var(--r-sm); padding: 10px 12px; margin: 0 4px 10px; font-size: var(--fs-sm); font-weight: 600; line-height: 1.45; }
658
+ .trouble b { font-weight: 800; }
659
+ .trouble code { font-family: var(--mono); font-size: var(--fs-xs); }
561
660
  .details-inner .geek-body > .section { background: var(--soft); padding: 14px 16px 10px; margin-bottom: 10px; }
562
661
  .resizer { position: absolute; left: -14px; top: 0; bottom: 0; width: 20px; cursor: col-resize; z-index: 3; }
563
662
  .resizer::after { content: ""; position: absolute; left: 8.5px; top: 44%; height: 12%; width: 3px; border-radius: 3px; background: var(--lav-2); opacity: 0; transition: opacity var(--t-fast); }
564
663
  .resizer:hover::after, .shell.resizing .resizer::after { opacity: 1; }
565
664
  .panel-title { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 14px; }
566
- .panel-title h3 { font-size: 11px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--faint); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
665
+ .panel-title h3 { font-size: calc(11px * var(--fs-scale)); font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--faint); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
567
666
  .panel-title .hint { display: none; }
568
- .profile { text-align: center; padding: 22px 16px 18px; background: linear-gradient(160deg, var(--lav), #e4f7ee); border-radius: 18px; margin-bottom: 12px; }
667
+ .profile { text-align: center; padding: 22px 16px 18px; background: var(--profile-bg); border-radius: 18px; margin-bottom: 12px; }
569
668
  .profile .avatar { margin: 0 auto 10px; display: block; width: 84px; height: 84px; }
570
- .profile .avatar .av-tile { background: #fff !important; border-radius: 26px !important; box-shadow: var(--shadow-pop); }
571
- .profile h3 { font-size: 22px; overflow-wrap: anywhere; letter-spacing: -0.01em; }
572
- .profile .tagline { color: var(--muted); font-size: 13px; font-weight: 700; margin-top: 2px; }
669
+ .profile .avatar .av-tile { background: var(--profile-avatar-bg) !important; border-radius: 26px !important; box-shadow: var(--shadow-pop); }
670
+ .profile h3 { font-size: calc(22px * var(--fs-scale)); overflow-wrap: anywhere; letter-spacing: -0.01em; }
671
+ .profile .tagline { color: var(--muted); font-size: calc(13px * var(--fs-scale)); font-weight: 700; margin-top: 2px; }
573
672
  .profile .badges { display: flex; gap: 6px; justify-content: center; margin-top: 10px; flex-wrap: wrap; }
574
- .profile .badges .badge { background: #fff; }
575
- .profile .badges .badge.status-offline, .profile .badges .badge.muted { color: var(--muted); }
576
- .section label:not(.check-row):not(.switch):not(.toggle):not(.choice) { display: flex; flex-direction: column; gap: 6px; font-size: 12px; font-weight: 800; color: var(--ink-3); margin-bottom: 12px; min-width: 0; }
673
+ .profile .badges [data-ui="badge"] { background: var(--profile-badge-bg); }
674
+ .profile .badges [data-ui="badge"]:is([data-tone="asleep"], [data-tone="muted"]) { color: var(--muted); }
675
+ .section label:not(.check-row):not(.switch):not(.toggle):not(.choice) { display: flex; flex-direction: column; gap: 6px; font-size: calc(12px * var(--fs-scale)); font-weight: 800; color: var(--ink-3); margin-bottom: 12px; min-width: 0; }
577
676
  .section label.row { flex-direction: row; align-items: center; justify-content: space-between; gap: 10px; }
578
677
  .section label.row select { flex: 0 1 60%; }
579
- .section input:not([type="checkbox"]):not([type="radio"]), .section select, .section textarea { width: 100%; min-width: 0; height: 42px; padding: 0 14px; border: 2px solid var(--lav); border-radius: var(--r-sm); background: var(--soft); font-size: 14px; font-weight: 700; color: var(--ink); transition: border-color var(--t-fast), background var(--t-fast); }
678
+ .section input:not([type="checkbox"]):not([type="radio"]), .section select, .section textarea { width: 100%; min-width: 0; height: 42px; padding: 0 14px; border: 2px solid var(--lav); border-radius: var(--r-sm); background: var(--soft); font-size: calc(14px * var(--fs-scale)); font-weight: 700; color: var(--ink); transition: border-color var(--t-fast), background var(--t-fast); }
580
679
  .details-inner .section input:not([type="checkbox"]):not([type="radio"]), .details-inner .section select, .details-inner .section textarea { background: var(--soft); }
581
- .details-inner .geek-body .section input:not([type="checkbox"]):not([type="radio"]), .details-inner .geek-body .section select, .details-inner .geek-body .section textarea { background: #fff; }
680
+ .details-inner .geek-body .section input:not([type="checkbox"]):not([type="radio"]), .details-inner .geek-body .section select, .details-inner .geek-body .section textarea { background: var(--input-bg); }
582
681
  .section input:hover, .section select:hover, .section textarea:hover { border-color: var(--lav-2); }
583
- .section input:focus, .section select:focus, .section textarea:focus { outline: none; border-color: var(--primary); background: #fff; }
682
+ .section input:focus, .section select:focus, .section textarea:focus { outline: none; border-color: var(--input-focus-border); background: var(--input-bg); }
584
683
  .section select { appearance: none; -webkit-appearance: none; padding-right: 36px; background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1.5 6 6.5 11 1.5' fill='none' stroke='%238f8fb0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/></svg>"); background-repeat: no-repeat; background-position: right 14px center; background-size: 12px 8px; }
585
684
  .section select:disabled { opacity: 0.55; }
586
685
  .section textarea { resize: vertical; min-height: 76px; height: auto; padding: 10px 14px; line-height: 1.5; }
@@ -589,11 +688,15 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
589
688
  .three-inline { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 6px; }
590
689
  .three-inline label { margin-bottom: 4px; }
591
690
  .rc-num { width: 64px !important; height: 30px !important; padding: 0 8px !important; display: inline-block; }
592
- .rc-table { width: 100%; border-collapse: collapse; font-size: 13px; font-weight: 600; margin-bottom: 8px; }
691
+ .rc-table { width: 100%; border-collapse: collapse; font-size: calc(13px * var(--fs-scale)); font-weight: 600; margin-bottom: 8px; }
593
692
  .rc-table td { padding: 6px 4px; border-top: 2px solid var(--lav); vertical-align: middle; }
594
693
  .rc-table td:first-child { display: flex; align-items: center; gap: 8px; }
595
- .rc-table select { height: 32px !important; padding: 0 28px 0 10px !important; font-size: 12px !important; width: auto !important; }
596
- .rc-table .rc-note { color: var(--muted); font-size: 11px; }
694
+ .choice .rc-is-default { margin-left: 8px; padding: 1px 8px; border-radius: var(--r-pill); background: var(--soft); color: var(--muted); font-size: calc(11px * var(--fs-scale)); font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em; }
695
+ .choice .rc-default { margin-left: 8px; border: 0; background: none; padding: 0; font: inherit; font-size: calc(11.5px * var(--fs-scale)); font-weight: 800; color: var(--primary); cursor: pointer; }
696
+ .choice .rc-default:hover { text-decoration: underline; }
697
+ .choice .geek-tip { float: right; margin-left: 14px; }
698
+ .rc-table select { height: 32px !important; padding: 0 28px 0 10px !important; font-size: calc(12px * var(--fs-scale)) !important; width: auto !important; }
699
+ .rc-table .rc-note { color: var(--muted); font-size: calc(11px * var(--fs-scale)); }
597
700
  .skill-list { list-style: none; margin: 0 0 8px; padding: 0; display: flex; flex-direction: column; gap: 8px; }
598
701
  .skill-list li { display: flex; justify-content: space-between; gap: 10px; align-items: center; background: var(--soft); border-radius: var(--r-md); padding: 12px 14px; min-width: 0; }
599
702
  .skill-list li > div { min-width: 0; }
@@ -601,7 +704,7 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
601
704
  .skill-list .sk-head { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; margin-bottom: 2px; font-weight: 800; }
602
705
  .skill-list .sk-holders { display: flex; align-items: center; gap: 5px; margin-top: 4px; color: var(--primary); }
603
706
  .skill-list .sk-holders .i { width: 13px; height: 13px; }
604
- .sk-about { margin-top: 12px; max-width: 760px; line-height: 1.5; font-size: 12px; }
707
+ .sk-about { margin-top: 12px; max-width: 760px; line-height: 1.5; font-size: calc(12px * var(--fs-scale)); }
605
708
  .skill-editor { margin-top: 0; }
606
709
  .skill-actions { display: flex; gap: 6px; align-items: center; flex: none; }
607
710
  .dialog .two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 0 14px; }
@@ -611,19 +714,21 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
611
714
  .details { position: fixed; right: var(--gap); top: var(--gap); bottom: var(--gap); z-index: 20; width: min(var(--details-w), 92vw); }
612
715
  .chat-actions .search { width: 160px; }
613
716
  }
614
- .tpl-layout { display: grid; grid-template-columns: 200px 1fr; gap: 14px; margin: 6px 0 12px; }
615
- .tpl-list { display: flex; flex-direction: column; gap: 8px; }
616
- .tpl-list::before { content: "Templates"; font-size: 11px; font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase; color: var(--faint); padding: 0 4px; }
617
- .tpl-item { display: grid; grid-template-columns: 34px 1fr 18px; align-items: center; gap: 10px; text-align: left; border: 2px solid transparent; border-radius: 14px; padding: 10px 10px 10px 12px; background: var(--card); color: var(--ink); font: inherit; cursor: pointer; box-shadow: 0 1px 3px rgba(28, 27, 51, 0.06); transition: border-color var(--t-fast), transform var(--t-fast); }
717
+ #template-dialog[open] { display: flex; flex-direction: column; overflow: hidden; max-height: min(90vh, 860px); }
718
+ #template-dialog > form { display: flex; flex-direction: column; min-height: 0; flex: 1; }
719
+ .tpl-layout { display: grid; grid-template-columns: 200px 1fr; gap: 14px; margin: 6px 0 12px; flex: 1; min-height: 160px; }
720
+ .tpl-pane { position: relative; min-height: 0; min-width: 0; display: flex; }
721
+ .tpl-pane > * { flex: 1; min-width: 0; }
722
+ .tpl-list { display: flex; flex-direction: column; gap: 8px; overflow: auto; padding-right: 4px; }
723
+ .tpl-list::before { content: "Templates"; font-size: calc(11px * var(--fs-scale)); font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase; color: var(--faint); padding: 0 4px; }
724
+ .tpl-item { display: grid; grid-template-columns: 34px 1fr 18px; align-items: center; gap: 10px; text-align: left; border: 2px solid transparent; border-radius: 14px; padding: 10px 10px 10px 12px; background: var(--card); color: var(--ink); font: inherit; cursor: pointer; box-shadow: var(--tpl-shadow); transition: border-color var(--t-fast), transform var(--t-fast); }
618
725
  .tpl-item:hover { border-color: var(--lav-2); transform: translateY(-1px); }
619
726
  .tpl-item.on { border-color: var(--primary); background: var(--lav); }
620
727
  .tpl-emoji { font-size: 22px; line-height: 1; text-align: center; }
621
728
  .tpl-body { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
622
- .tpl-body b { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 14px; }
623
- .tpl-meta { color: var(--muted); font-size: 12px; font-weight: 600; }
729
+ .tpl-body b { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: calc(14px * var(--fs-scale)); }
730
+ .tpl-meta { color: var(--muted); font-size: calc(12px * var(--fs-scale)); font-weight: 600; }
624
731
  .tpl-item .avatar-stack { margin-top: 2px; }
625
- .tpl-rec { background: var(--warm); color: var(--warm-ink); font-size: 10px; padding: 1px 7px; }
626
- .tpl-mine { background: var(--lav); color: var(--primary); font-size: 10px; padding: 1px 7px; }
627
732
  .tpl-runs { display: flex; flex-wrap: wrap; gap: 6px; }
628
733
  .stp-preview { display: flex; flex-direction: column; gap: 10px; max-height: 48vh; overflow: auto; padding-right: 4px; margin: 4px 0 10px; }
629
734
  .stp-section { background: var(--soft); border-radius: 14px; padding: 10px 12px; }
@@ -640,44 +745,41 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
640
745
  .stp-vm-fields .field textarea { min-height: 54px; }
641
746
  .stp-vm-top { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
642
747
  .stp-vm-top b { flex: 1; }
643
- .stp-section h5 { margin: 0 0 6px; font-size: 11px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--faint); }
644
- .stp-section .kv { font-size: 12.5px; }
645
- .stp-section ul { margin: 0; padding-left: 18px; color: var(--ink-2); font-size: 13px; font-weight: 600; }
748
+ .stp-section h5 { margin: 0 0 6px; font-size: calc(11px * var(--fs-scale)); font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--faint); }
749
+ .stp-section .kv { font-size: calc(12.5px * var(--fs-scale)); }
750
+ .stp-section ul { margin: 0; padding-left: 18px; color: var(--ink-2); font-size: calc(13px * var(--fs-scale)); font-weight: 600; }
646
751
  .stp-vm { display: grid; grid-template-columns: 36px 1fr; gap: 10px; align-items: start; padding: 8px 0; border-top: 1px solid var(--lav-2); }
647
752
  .stp-vm:first-of-type { border-top: 0; padding-top: 2px; }
648
753
  .stp-vm-head { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; }
649
- .stp-vm-role { color: var(--muted); font-size: 12.5px; font-weight: 600; line-height: 1.45; margin-top: 3px; }
754
+ .stp-vm-role { color: var(--muted); font-size: calc(12.5px * var(--fs-scale)); font-weight: 600; line-height: 1.45; margin-top: 3px; }
650
755
  .stp-vm .chips { margin-top: 5px; }
651
- .tpl-check { display: grid; place-items: center; width: 18px; height: 18px; border-radius: 50%; background: var(--primary); color: #fff; opacity: 0; transition: opacity var(--t-fast); }
756
+ .tpl-check { display: grid; place-items: center; width: 18px; height: 18px; border-radius: 50%; background: var(--primary); color: var(--tpl-check-ink); opacity: 0; transition: opacity var(--t-fast); }
652
757
  .tpl-check .i { width: 12px; height: 12px; }
653
758
  .tpl-item.on .tpl-check { opacity: 1; }
654
- .tpl-detail { min-width: 0; display: flex; flex-direction: column; gap: 10px; max-height: 46vh; overflow: auto; padding-right: 4px; }
759
+ .tpl-detail { min-width: 0; display: flex; flex-direction: column; gap: 10px; overflow: auto; padding-right: 4px; }
655
760
  .tpl-desc { margin: 0; color: var(--ink-2); font-weight: 600; }
656
- .tpl-rules ul { margin: 4px 0 0; padding-left: 18px; color: var(--ink-2); font-size: 13px; font-weight: 600; }
761
+ .tpl-rules ul { margin: 4px 0 0; padding-left: 18px; color: var(--ink-2); font-size: calc(13px * var(--fs-scale)); font-weight: 600; }
657
762
  .tpl-vm { border-radius: 14px; background: var(--soft); padding: 10px 12px; display: flex; flex-direction: column; gap: 6px; }
658
763
  .tpl-vm-head { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; }
659
- .tpl-vm-role { color: var(--muted); font-size: 12.5px; font-weight: 600; line-height: 1.45; }
764
+ .tpl-vm-role { color: var(--muted); font-size: calc(12.5px * var(--fs-scale)); font-weight: 600; line-height: 1.45; }
660
765
  .mm-all { width: 24px; height: 24px; border-radius: 8px; background: var(--lav); color: var(--primary); display: grid; place-content: center; flex: none; }
661
766
  .mm-all .i { width: 14px; height: 14px; }
662
767
  .mention.all { color: var(--primary); }
663
768
  .side-list li.unstaffed .avatar .av-tile { filter: grayscale(0.8); opacity: 0.55; }
664
769
  .side-list li.unstaffed .p-name > span:first-child { color: var(--muted); }
665
- .badge.status-unstaffed { background: var(--warm); color: var(--warm-ink); cursor: pointer; }
770
+ .participants [data-ui="badge"][data-tone="attention"] { cursor: pointer; }
666
771
  .cast-banner { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 18px 22px 14px; background: var(--grad-canvas); border-bottom: 1px solid var(--lav); text-align: center; }
667
- .cast-lead { max-width: 720px; color: var(--ink-2); font-weight: 600; font-size: 14px; }
772
+ .cast-lead { max-width: 720px; color: var(--ink-2); font-weight: 600; font-size: calc(14px * var(--fs-scale)); }
668
773
  .cast-list { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; margin-top: 12px; }
669
774
  .cast-card { display: flex; flex-direction: column; align-items: center; gap: 6px; width: 200px; padding: 16px 12px; border: 2px dashed var(--lav-2); border-radius: 16px; background: var(--card); color: var(--ink); font: inherit; cursor: pointer; transition: border-color var(--t-fast), transform var(--t-fast); }
670
775
  .cast-card:hover { border-color: var(--primary); transform: translateY(-2px); }
671
776
  .cast-card .av-tile { filter: grayscale(0.8); opacity: 0.7; }
672
- .cast-card b { font-size: 15px; }
673
- .cast-card span { color: var(--muted); font-size: 12px; font-weight: 600; }
674
- .cast-card em { margin-top: 4px; font-style: normal; font-size: 12px; font-weight: 800; color: var(--primary); }
777
+ .cast-card b { font-size: calc(15px * var(--fs-scale)); }
778
+ .cast-card span { color: var(--muted); font-size: calc(12px * var(--fs-scale)); font-weight: 600; }
779
+ .cast-card em { margin-top: 4px; font-style: normal; font-size: calc(12px * var(--fs-scale)); font-weight: 800; color: var(--primary); }
675
780
  .composer.gated { opacity: 0.7; }
676
781
  .composer.gated textarea { cursor: not-allowed; }
677
782
  .check-list.locked { pointer-events: none; opacity: 0.6; }
678
- .msg.system.done { justify-content: center; }
679
- .done-row { display: inline-flex; align-items: center; gap: 8px; padding: 6px 14px 6px 8px; border: 0; border-radius: var(--r-pill); background: var(--done); color: var(--done-ink); font: inherit; font-size: 12px; font-weight: 800; cursor: pointer; box-shadow: var(--edge); }
680
- .done-row:hover { background: var(--done-hover); }
681
783
  .done-notes { flex-direction: column; }
682
784
  .done-note.new { background: var(--card); color: var(--ink-2); }
683
785
  .done-note.new:hover { background: var(--soft); }