@keith9681/dsh-sidebar 0.15.2

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.
Files changed (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +0 -0
  3. package/README_EN.md +0 -0
  4. package/cordis.patch.yml +49 -0
  5. package/lib/client-editor.js +34651 -0
  6. package/lib/client-mermaid.js +200629 -0
  7. package/lib/client-registry.js +13388 -0
  8. package/lib/client-terminal.js +8904 -0
  9. package/lib/client.js +13388 -0
  10. package/lib/index.js +3959 -0
  11. package/lib/invariant.js +22 -0
  12. package/lib/types/agent-pty.d.ts +226 -0
  13. package/lib/types/browser-probe.d.ts +15 -0
  14. package/lib/types/bundle-route.d.ts +12 -0
  15. package/lib/types/client/BrowserView.d.ts +22 -0
  16. package/lib/types/client/DiffTab.d.ts +6 -0
  17. package/lib/types/client/DiffView.d.ts +51 -0
  18. package/lib/types/client/EditorHost.d.ts +12 -0
  19. package/lib/types/client/FileTree.d.ts +36 -0
  20. package/lib/types/client/GitView.d.ts +8 -0
  21. package/lib/types/client/OrphanedTab.d.ts +11 -0
  22. package/lib/types/client/PdfView.d.ts +6 -0
  23. package/lib/types/client/RenderBoundary.d.ts +32 -0
  24. package/lib/types/client/SandboxStatusBar.d.ts +10 -0
  25. package/lib/types/client/SideCardSection.d.ts +74 -0
  26. package/lib/types/client/SideChatView.d.ts +16 -0
  27. package/lib/types/client/Sidebar.d.ts +6 -0
  28. package/lib/types/client/SubagentView.d.ts +16 -0
  29. package/lib/types/client/TabBar.d.ts +43 -0
  30. package/lib/types/client/TerminalView.d.ts +24 -0
  31. package/lib/types/client/TextEditor.d.ts +10 -0
  32. package/lib/types/client/TreePanel.d.ts +23 -0
  33. package/lib/types/client/UploadOverlay.d.ts +20 -0
  34. package/lib/types/client/add-plugin-modal.d.ts +15 -0
  35. package/lib/types/client/api.d.ts +268 -0
  36. package/lib/types/client/binary-download.d.ts +12 -0
  37. package/lib/types/client/breakpoints.d.ts +12 -0
  38. package/lib/types/client/browser.d.ts +50 -0
  39. package/lib/types/client/builtins/index.d.ts +18 -0
  40. package/lib/types/client/builtins/tabs.d.ts +11 -0
  41. package/lib/types/client/builtins/viewers.d.ts +3 -0
  42. package/lib/types/client/chunk-loader.d.ts +124 -0
  43. package/lib/types/client/chunks/editor.d.ts +9 -0
  44. package/lib/types/client/chunks/mermaid.d.ts +10 -0
  45. package/lib/types/client/chunks/terminal.d.ts +9 -0
  46. package/lib/types/client/cm-themes.d.ts +24 -0
  47. package/lib/types/client/conversation-draft.d.ts +14 -0
  48. package/lib/types/client/desktop-env.d.ts +35 -0
  49. package/lib/types/client/editable-state.d.ts +27 -0
  50. package/lib/types/client/editor-load.d.ts +66 -0
  51. package/lib/types/client/frame-batcher.d.ts +24 -0
  52. package/lib/types/client/icons.d.ts +57 -0
  53. package/lib/types/client/image-types.d.ts +3 -0
  54. package/lib/types/client/ime-guard.d.ts +36 -0
  55. package/lib/types/client/index.d.ts +19 -0
  56. package/lib/types/client/intercept.d.ts +33 -0
  57. package/lib/types/client/lang.d.ts +12 -0
  58. package/lib/types/client/lazy-chunk.d.ts +25 -0
  59. package/lib/types/client/link-intercept.d.ts +42 -0
  60. package/lib/types/client/locales.d.ts +366 -0
  61. package/lib/types/client/mermaid-blocks.d.ts +41 -0
  62. package/lib/types/client/mermaid-sanitize.d.ts +2 -0
  63. package/lib/types/client/mermaid.d.ts +12 -0
  64. package/lib/types/client/open-when-sized.d.ts +20 -0
  65. package/lib/types/client/open-with-settings.d.ts +4 -0
  66. package/lib/types/client/open-with.d.ts +87 -0
  67. package/lib/types/client/openpath-intercept.d.ts +41 -0
  68. package/lib/types/client/paths.d.ts +35 -0
  69. package/lib/types/client/pdf-types.d.ts +2 -0
  70. package/lib/types/client/plugin-settings.d.ts +8 -0
  71. package/lib/types/client/plugins-shared.d.ts +27 -0
  72. package/lib/types/client/plugins-tabs.d.ts +3 -0
  73. package/lib/types/client/plugins-viewers.d.ts +3 -0
  74. package/lib/types/client/prefs.d.ts +41 -0
  75. package/lib/types/client/produced-files.d.ts +23 -0
  76. package/lib/types/client/selection-payload.d.ts +27 -0
  77. package/lib/types/client/service.d.ts +440 -0
  78. package/lib/types/client/settings-nav-icon.d.ts +19 -0
  79. package/lib/types/client/shell-presets.d.ts +48 -0
  80. package/lib/types/client/sidechat-transcript.d.ts +103 -0
  81. package/lib/types/client/split-pane.d.ts +30 -0
  82. package/lib/types/client/state.d.ts +359 -0
  83. package/lib/types/client/subagent-detect.d.ts +54 -0
  84. package/lib/types/client/subagent-jobs.d.ts +63 -0
  85. package/lib/types/client/tab-content-memo.d.ts +33 -0
  86. package/lib/types/client/terminal-font.d.ts +20 -0
  87. package/lib/types/client/theme.d.ts +45 -0
  88. package/lib/types/client/titlebar-strip.d.ts +23 -0
  89. package/lib/types/client/upload.d.ts +69 -0
  90. package/lib/types/client/wco.d.ts +47 -0
  91. package/lib/types/config.d.ts +64 -0
  92. package/lib/types/context-types.d.ts +603 -0
  93. package/lib/types/fs-operations.d.ts +28 -0
  94. package/lib/types/fs-search.d.ts +24 -0
  95. package/lib/types/fs-tree.d.ts +51 -0
  96. package/lib/types/git.d.ts +82 -0
  97. package/lib/types/html-route.d.ts +59 -0
  98. package/lib/types/index.d.ts +47 -0
  99. package/lib/types/invariant.d.ts +15 -0
  100. package/lib/types/jobs-routes.d.ts +45 -0
  101. package/lib/types/open-external.d.ts +24 -0
  102. package/lib/types/prefs-shared.d.ts +225 -0
  103. package/lib/types/pty-deps.d.ts +78 -0
  104. package/lib/types/pty-manager.d.ts +168 -0
  105. package/lib/types/sidechat-core.d.ts +172 -0
  106. package/lib/types/sidechat-routes.d.ts +30 -0
  107. package/lib/types/subagent-activity.d.ts +44 -0
  108. package/lib/types/subagent-live-route.d.ts +44 -0
  109. package/lib/types/tools.d.ts +31 -0
  110. package/lib/types/trust-fence.d.ts +24 -0
  111. package/lib/types/wire.d.ts +38 -0
  112. package/package.json +173 -0
  113. package/scripts/install.ps1 +289 -0
  114. package/scripts/install.sh +287 -0
  115. package/src/agent-pty.ts +527 -0
  116. package/src/browser-probe.ts +26 -0
  117. package/src/bundle-route.ts +129 -0
  118. package/src/client/BrowserView.tsx +253 -0
  119. package/src/client/DiffTab.tsx +110 -0
  120. package/src/client/DiffView.tsx +305 -0
  121. package/src/client/EditorHost.tsx +525 -0
  122. package/src/client/FileTree.tsx +653 -0
  123. package/src/client/GitView.tsx +558 -0
  124. package/src/client/OrphanedTab.tsx +27 -0
  125. package/src/client/PdfView.tsx +110 -0
  126. package/src/client/RenderBoundary.tsx +49 -0
  127. package/src/client/SandboxStatusBar.tsx +60 -0
  128. package/src/client/SideCardSection.module.css +960 -0
  129. package/src/client/SideCardSection.tsx +1152 -0
  130. package/src/client/SideChatView.module.css +437 -0
  131. package/src/client/SideChatView.tsx +644 -0
  132. package/src/client/Sidebar.tsx +1148 -0
  133. package/src/client/SubagentView.module.css +547 -0
  134. package/src/client/SubagentView.tsx +883 -0
  135. package/src/client/TabBar.tsx +305 -0
  136. package/src/client/TerminalView.tsx +383 -0
  137. package/src/client/TextEditor.tsx +500 -0
  138. package/src/client/TreePanel.tsx +273 -0
  139. package/src/client/UploadOverlay.tsx +62 -0
  140. package/src/client/add-plugin-modal.tsx +199 -0
  141. package/src/client/api.ts +335 -0
  142. package/src/client/binary-download.tsx +23 -0
  143. package/src/client/breakpoints.ts +51 -0
  144. package/src/client/browser.ts +119 -0
  145. package/src/client/builtins/index.ts +37 -0
  146. package/src/client/builtins/tabs.tsx +331 -0
  147. package/src/client/builtins/viewers.tsx +125 -0
  148. package/src/client/chunk-loader.ts +351 -0
  149. package/src/client/chunks/editor.tsx +9 -0
  150. package/src/client/chunks/mermaid.tsx +10 -0
  151. package/src/client/chunks/terminal.tsx +9 -0
  152. package/src/client/cm-themes.ts +129 -0
  153. package/src/client/conversation-draft.ts +29 -0
  154. package/src/client/css-modules.d.ts +5 -0
  155. package/src/client/desktop-env.ts +72 -0
  156. package/src/client/editable-state.ts +70 -0
  157. package/src/client/editor-load.ts +92 -0
  158. package/src/client/frame-batcher.ts +56 -0
  159. package/src/client/icons.tsx +161 -0
  160. package/src/client/image-types.ts +8 -0
  161. package/src/client/ime-guard.ts +47 -0
  162. package/src/client/index.tsx +369 -0
  163. package/src/client/intercept.tsx +110 -0
  164. package/src/client/lang.ts +103 -0
  165. package/src/client/layout.css +94 -0
  166. package/src/client/lazy-chunk.tsx +89 -0
  167. package/src/client/link-intercept.ts +73 -0
  168. package/src/client/locales.ts +734 -0
  169. package/src/client/mermaid-blocks.ts +110 -0
  170. package/src/client/mermaid-sanitize.ts +93 -0
  171. package/src/client/mermaid.tsx +401 -0
  172. package/src/client/open-when-sized.ts +43 -0
  173. package/src/client/open-with-settings.tsx +135 -0
  174. package/src/client/open-with.ts +221 -0
  175. package/src/client/openpath-intercept.ts +62 -0
  176. package/src/client/paths.ts +47 -0
  177. package/src/client/pdf-types.ts +4 -0
  178. package/src/client/plugin-settings.ts +43 -0
  179. package/src/client/plugins-shared.ts +29 -0
  180. package/src/client/plugins-tabs.ts +87 -0
  181. package/src/client/plugins-viewers.ts +30 -0
  182. package/src/client/prefs.ts +207 -0
  183. package/src/client/produced-files.ts +91 -0
  184. package/src/client/selection-payload.ts +86 -0
  185. package/src/client/service.ts +838 -0
  186. package/src/client/settings-nav-icon.ts +45 -0
  187. package/src/client/shell-presets.ts +83 -0
  188. package/src/client/sidebar.module.css +2577 -0
  189. package/src/client/sidechat-transcript.ts +321 -0
  190. package/src/client/split-pane.tsx +322 -0
  191. package/src/client/state.ts +1175 -0
  192. package/src/client/subagent-detect.ts +137 -0
  193. package/src/client/subagent-jobs.ts +161 -0
  194. package/src/client/tab-content-memo.ts +46 -0
  195. package/src/client/terminal-font.ts +28 -0
  196. package/src/client/theme.ts +110 -0
  197. package/src/client/titlebar-strip.ts +37 -0
  198. package/src/client/upload.ts +187 -0
  199. package/src/client/wco.ts +120 -0
  200. package/src/config.ts +155 -0
  201. package/src/context-types.ts +610 -0
  202. package/src/fs-operations.ts +99 -0
  203. package/src/fs-search.ts +86 -0
  204. package/src/fs-tree.ts +158 -0
  205. package/src/git.ts +244 -0
  206. package/src/html-route.ts +106 -0
  207. package/src/index.ts +1132 -0
  208. package/src/invariant.ts +32 -0
  209. package/src/jobs-routes.ts +257 -0
  210. package/src/open-external.ts +90 -0
  211. package/src/prefs-shared.ts +268 -0
  212. package/src/pty-deps.ts +240 -0
  213. package/src/pty-manager.ts +376 -0
  214. package/src/sidechat-core.ts +468 -0
  215. package/src/sidechat-routes.ts +344 -0
  216. package/src/subagent-activity.ts +91 -0
  217. package/src/subagent-live-route.ts +93 -0
  218. package/src/tools.ts +479 -0
  219. package/src/trust-fence.ts +77 -0
  220. package/src/wire.ts +100 -0
@@ -0,0 +1,437 @@
1
+ /* Side Chat tab: ONE side conversation per tab (Codex-style). Visual
2
+ * language mirrors the main conversation pane: right-aligned user bubbles
3
+ * on --dsw-specific-bubble, full-width assistant markdown, a capsule
4
+ * composer card on --dsw-specific-input-major with a circular accent
5
+ * send/stop button. Tool calls, thinking and context injections share one
6
+ * collapsible-line chrome (no cards); shimmer is reserved for generating
7
+ * states (running status line, streaming rows, the creating hero). Motion
8
+ * is crossfade-only (≤200ms entrances, no springs); reduced-motion disables
9
+ * every loop. All values consume DSW tokens (fallbacks point at older alias
10
+ * tokens for rc-era hosts). */
11
+ .sidechat {
12
+ flex: 1;
13
+ min-height: 0;
14
+ display: flex;
15
+ flex-direction: column;
16
+ }
17
+
18
+ /* ── thread header (status dot · agent badge · threads menu · save) ─── */
19
+ .sidechatDetailHeader {
20
+ flex: none;
21
+ display: flex;
22
+ align-items: center;
23
+ gap: 4px;
24
+ min-height: 36px;
25
+ padding: 4px 8px 4px 12px;
26
+ border-bottom: 1px solid var(--dsw-alias-hairline);
27
+ }
28
+
29
+ .sidechatHeaderDot {
30
+ flex: none;
31
+ }
32
+
33
+ .sidechatHeaderSpacer {
34
+ flex: 1;
35
+ min-width: 0;
36
+ }
37
+
38
+ .sidechatAgentBadge {
39
+ flex: none;
40
+ max-width: 55%;
41
+ padding: 1px 8px;
42
+ border: 1px solid var(--dsw-alias-hairline);
43
+ border-radius: 999px;
44
+ font: var(--dsw-font-xxs-12);
45
+ color: var(--dsw-alias-label-tertiary);
46
+ overflow: hidden;
47
+ text-overflow: ellipsis;
48
+ white-space: nowrap;
49
+ }
50
+
51
+ .sidechatIconBtn {
52
+ flex: none;
53
+ display: inline-flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ width: 26px;
57
+ height: 26px;
58
+ padding: 0;
59
+ border: none;
60
+ border-radius: 6px;
61
+ background: transparent;
62
+ color: var(--dsw-alias-label-secondary);
63
+ cursor: pointer;
64
+ transition: background-color 100ms ease-out, color 100ms ease-out;
65
+ }
66
+
67
+ .sidechatIconBtn:hover:not(:disabled) {
68
+ background: var(--dsw-alias-interactive-bg-hover);
69
+ color: var(--dsw-alias-label-primary);
70
+ }
71
+
72
+ .sidechatIconBtn:disabled {
73
+ opacity: 0.4;
74
+ cursor: default;
75
+ }
76
+
77
+ /* ── hero (unbound tab: the one brand moment) ───────────────────────── */
78
+ .sidechatHero {
79
+ flex: 1;
80
+ min-height: 0;
81
+ display: flex;
82
+ flex-direction: column;
83
+ align-items: center;
84
+ justify-content: center;
85
+ gap: 8px;
86
+ padding: 24px 20px;
87
+ color: var(--dsw-alias-label-tertiary);
88
+ text-align: center;
89
+ animation: sidechatFadeIn 200ms ease-out;
90
+ }
91
+
92
+ .sidechatHeroTitle {
93
+ font: var(--dsw-font-s-14);
94
+ font-weight: 500;
95
+ color: var(--dsw-alias-label-primary);
96
+ }
97
+
98
+ .sidechatHeroDesc {
99
+ max-width: 300px;
100
+ font: var(--dsw-font-xxs-12);
101
+ color: var(--dsw-alias-label-tertiary);
102
+ line-height: 1.6;
103
+ }
104
+
105
+ .sidechatPrimaryBtn {
106
+ flex: none;
107
+ margin-top: 4px;
108
+ padding: 6px 14px;
109
+ border: none;
110
+ border-radius: 999px;
111
+ background: var(--dsw-alias-button-info-fill, var(--dsw-alias-accent));
112
+ color: var(--dsw-alias-button-info-label, var(--dsw-alias-accent-ink, #fff));
113
+ font: var(--dsw-font-s-13);
114
+ cursor: pointer;
115
+ transition: opacity 100ms ease-out;
116
+ }
117
+
118
+ .sidechatPrimaryBtn:hover:not(:disabled) {
119
+ opacity: 0.88;
120
+ }
121
+
122
+ .sidechatPrimaryBtn:disabled {
123
+ opacity: 0.4;
124
+ cursor: default;
125
+ }
126
+
127
+ .sidechatHint {
128
+ flex: none;
129
+ padding: 4px 12px;
130
+ font: var(--dsw-font-xxs-12);
131
+ color: var(--dsw-alias-label-tertiary);
132
+ }
133
+
134
+ .sidechatError {
135
+ flex: none;
136
+ padding: 4px 12px;
137
+ font: var(--dsw-font-xxs-12);
138
+ color: var(--dsw-alias-danger);
139
+ }
140
+
141
+ /* ── transcript ─────────────────────────────────────────────────────── */
142
+ .sidechatScroll {
143
+ flex: 1;
144
+ min-height: 0;
145
+ overflow-y: auto;
146
+ padding: 10px 12px;
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: 10px;
150
+ }
151
+
152
+ /* Rows crossfade in on append (keys are stable, so only NEW rows play). */
153
+ .sidechatScroll > * {
154
+ animation: sidechatRowIn 180ms ease-out;
155
+ }
156
+
157
+ /* User message: right-aligned bubble, same surface as the main pane. */
158
+ .sidechatUser {
159
+ align-self: flex-end;
160
+ max-width: 88%;
161
+ padding: 8px 14px;
162
+ border-radius: 18px;
163
+ background: var(--dsw-specific-bubble, var(--dsw-alias-bg-base));
164
+ font: var(--dsw-font-s-14);
165
+ color: var(--dsw-alias-label-primary);
166
+ overflow-wrap: anywhere;
167
+ }
168
+
169
+ /* Assistant message: full-width narration, no bubble — the main pane way. */
170
+ .sidechatAssistant {
171
+ align-self: stretch;
172
+ font: var(--dsw-font-s-14);
173
+ color: var(--dsw-alias-label-primary);
174
+ overflow-wrap: anywhere;
175
+ }
176
+
177
+ /* ── collapsible context rows (tool / thinking / injection, Codex-style) ──
178
+ * One quiet line — chevron + label + one-line summary — that expands into
179
+ * an indented body hung on a hairline thread. No cards, no fills: hierarchy
180
+ * rides ink weight alone. Streaming rows shimmer the label (shimmer =
181
+ * generating); failed rows go danger; reduced-motion stills every loop. */
182
+ .sidechatRow {
183
+ align-self: stretch;
184
+ }
185
+
186
+ .sidechatRowLine {
187
+ display: flex;
188
+ align-items: center;
189
+ gap: 6px;
190
+ padding: 1px 0;
191
+ font: var(--dsw-font-xxs-12);
192
+ color: var(--dsw-alias-label-tertiary);
193
+ }
194
+
195
+ .sidechatRowSummary {
196
+ cursor: pointer;
197
+ list-style: none;
198
+ user-select: none;
199
+ }
200
+
201
+ .sidechatRowSummary::-webkit-details-marker {
202
+ display: none;
203
+ }
204
+
205
+ .sidechatRowSummary:hover {
206
+ color: var(--dsw-alias-label-secondary);
207
+ }
208
+
209
+ .sidechatRowStatic {
210
+ cursor: default;
211
+ }
212
+
213
+ .sidechatRowChevron {
214
+ flex: none;
215
+ display: inline-flex;
216
+ align-items: center;
217
+ transition: transform 100ms ease-out;
218
+ }
219
+
220
+ .sidechatRow[open] .sidechatRowChevron {
221
+ transform: rotate(90deg);
222
+ }
223
+
224
+ .sidechatRowLabel {
225
+ flex: none;
226
+ max-width: 60%;
227
+ overflow: hidden;
228
+ text-overflow: ellipsis;
229
+ white-space: nowrap;
230
+ color: var(--dsw-alias-label-secondary);
231
+ }
232
+
233
+ .sidechatRowMono {
234
+ font-family: var(--dsw-font-mono);
235
+ }
236
+
237
+ .sidechatRowMeta {
238
+ flex: 1;
239
+ min-width: 0;
240
+ overflow: hidden;
241
+ text-overflow: ellipsis;
242
+ white-space: nowrap;
243
+ font-family: var(--dsw-font-mono);
244
+ color: var(--dsw-alias-label-tertiary);
245
+ }
246
+
247
+ .sidechatRowFailed .sidechatRowLabel,
248
+ .sidechatRowFailed .sidechatRowMeta {
249
+ color: var(--dsw-alias-danger);
250
+ }
251
+
252
+ .sidechatRowBody {
253
+ margin: 2px 0 4px 7px;
254
+ padding: 2px 0 2px 10px;
255
+ border-left: 1px solid var(--dsw-alias-hairline);
256
+ }
257
+
258
+ .sidechatRowProse {
259
+ font: var(--dsw-font-xxs-12);
260
+ color: var(--dsw-alias-label-tertiary);
261
+ white-space: pre-wrap;
262
+ overflow-wrap: anywhere;
263
+ max-height: 240px;
264
+ overflow-y: auto;
265
+ }
266
+
267
+ .sidechatRowCode {
268
+ margin: 0;
269
+ padding: 4px 0;
270
+ font: var(--dsw-font-xxs-12);
271
+ font-family: var(--dsw-font-mono);
272
+ color: var(--dsw-alias-label-secondary);
273
+ white-space: pre-wrap;
274
+ overflow-wrap: anywhere;
275
+ max-height: 220px;
276
+ overflow-y: auto;
277
+ }
278
+
279
+ .sidechatRowCode + .sidechatRowCode {
280
+ border-top: 1px solid var(--dsw-alias-hairline);
281
+ }
282
+
283
+ /* Shimmer sweep text: generating (streaming row labels, creating hero). */
284
+ .sidechatShimmerText {
285
+ background-image: linear-gradient(
286
+ 90deg,
287
+ var(--dsw-alias-label-tertiary) 0%,
288
+ var(--dsw-alias-label-primary) 50%,
289
+ var(--dsw-alias-label-tertiary) 100%
290
+ );
291
+ background-size: 200% 100%;
292
+ -webkit-background-clip: text;
293
+ background-clip: text;
294
+ color: transparent;
295
+ animation: sidechatSweep 2.6s linear infinite;
296
+ }
297
+
298
+ /* ── running status line (above the composer, main-pane style) ──────── */
299
+ .sidechatStatus {
300
+ flex: none;
301
+ display: flex;
302
+ align-items: center;
303
+ gap: 8px;
304
+ padding: 2px 14px 6px;
305
+ animation: sidechatFadeIn 160ms ease-out;
306
+ }
307
+
308
+ .sidechatStatusText {
309
+ font: var(--dsw-font-xxs-12);
310
+ background-image: linear-gradient(
311
+ 90deg,
312
+ var(--dsw-alias-label-tertiary) 0%,
313
+ var(--dsw-alias-label-primary) 50%,
314
+ var(--dsw-alias-label-tertiary) 100%
315
+ );
316
+ background-size: 200% 100%;
317
+ -webkit-background-clip: text;
318
+ background-clip: text;
319
+ color: transparent;
320
+ animation: sidechatSweep 2.6s linear infinite;
321
+ }
322
+
323
+ /* ── composer (capsule card, InputBar-aligned) ──────────────────────── */
324
+ .sidechatComposer {
325
+ flex: none;
326
+ display: flex;
327
+ flex-direction: column;
328
+ gap: 4px;
329
+ margin: 0 8px 8px;
330
+ padding: 8px 8px 6px 14px;
331
+ border: 1px solid var(--dsw-alias-border-l2-darkmode-thin, var(--dsw-alias-hairline));
332
+ border-radius: 16px;
333
+ background: var(--dsw-specific-input-major, var(--dsw-alias-bg-base));
334
+ box-shadow: var(--dsw-shadow-lv2, none);
335
+ }
336
+
337
+ .sidechatComposerInput {
338
+ width: 100%;
339
+ box-sizing: border-box;
340
+ padding: 2px 0;
341
+ border: none;
342
+ background: transparent;
343
+ color: var(--dsw-alias-label-primary);
344
+ font: var(--dsw-font-s-14);
345
+ line-height: 22px;
346
+ outline: none;
347
+ resize: none;
348
+ max-height: 132px;
349
+ }
350
+
351
+ .sidechatComposerInput::placeholder {
352
+ color: var(--dsw-alias-label-tertiary);
353
+ }
354
+
355
+ .sidechatComposerBar {
356
+ flex: none;
357
+ display: flex;
358
+ align-items: center;
359
+ gap: 8px;
360
+ min-height: 28px;
361
+ }
362
+
363
+ .sidechatComposerMeta {
364
+ flex: 1;
365
+ min-width: 0;
366
+ font: var(--dsw-font-xxs-12);
367
+ color: var(--dsw-alias-label-tertiary);
368
+ overflow: hidden;
369
+ text-overflow: ellipsis;
370
+ white-space: nowrap;
371
+ }
372
+
373
+ .sidechatSendBtn {
374
+ flex: none;
375
+ display: inline-flex;
376
+ align-items: center;
377
+ justify-content: center;
378
+ width: 28px;
379
+ height: 28px;
380
+ padding: 0;
381
+ border: none;
382
+ border-radius: 50%;
383
+ background: var(--dsw-alias-button-info-fill, var(--dsw-alias-accent));
384
+ color: var(--dsw-alias-button-info-label, var(--dsw-alias-accent-ink, #fff));
385
+ cursor: pointer;
386
+ /* send ⇄ stop swap: keyed remount plays this, hover only fades. */
387
+ animation: sidechatBtnIn 120ms ease-out;
388
+ transition: opacity 100ms ease-out;
389
+ }
390
+
391
+ .sidechatSendBtn:hover:not(:disabled) {
392
+ opacity: 0.88;
393
+ }
394
+
395
+ .sidechatSendBtn:disabled {
396
+ opacity: 0.35;
397
+ cursor: default;
398
+ }
399
+
400
+ /* ── motion vocabulary (crossfade only, ≤200ms; loops reduced-motion off) */
401
+ @keyframes sidechatRowIn {
402
+ from { opacity: 0; transform: translateY(4px); }
403
+ to { opacity: 1; transform: translateY(0); }
404
+ }
405
+
406
+ @keyframes sidechatFadeIn {
407
+ from { opacity: 0; }
408
+ to { opacity: 1; }
409
+ }
410
+
411
+ @keyframes sidechatBtnIn {
412
+ from { opacity: 0; transform: scale(0.85); }
413
+ to { opacity: 1; transform: scale(1); }
414
+ }
415
+
416
+ @keyframes sidechatSweep {
417
+ from { background-position: 200% 0; }
418
+ to { background-position: -200% 0; }
419
+ }
420
+
421
+ @media (prefers-reduced-motion: reduce) {
422
+ .sidechatScroll > *,
423
+ .sidechatHero,
424
+ .sidechatStatus,
425
+ .sidechatSendBtn {
426
+ animation: none;
427
+ }
428
+ .sidechatStatusText,
429
+ .sidechatShimmerText {
430
+ animation: none;
431
+ background-image: none;
432
+ color: var(--dsw-alias-label-tertiary);
433
+ }
434
+ .sidechatRowChevron {
435
+ transition: none;
436
+ }
437
+ }