@neurocode-ai/session-ui 1.18.8

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 (114) hide show
  1. package/package.json +71 -0
  2. package/src/components/apply-patch-file.test.ts +43 -0
  3. package/src/components/apply-patch-file.ts +78 -0
  4. package/src/components/basic-tool.css +358 -0
  5. package/src/components/basic-tool.stories.tsx +133 -0
  6. package/src/components/basic-tool.tsx +343 -0
  7. package/src/components/dock-prompt.stories.tsx +62 -0
  8. package/src/components/dock-prompt.tsx +23 -0
  9. package/src/components/file-media.tsx +291 -0
  10. package/src/components/file-search.tsx +72 -0
  11. package/src/components/file-ssr.tsx +197 -0
  12. package/src/components/file.css +46 -0
  13. package/src/components/file.tsx +1202 -0
  14. package/src/components/line-comment-annotations.tsx +637 -0
  15. package/src/components/line-comment-styles.ts +292 -0
  16. package/src/components/line-comment.stories.tsx +115 -0
  17. package/src/components/line-comment.tsx +439 -0
  18. package/src/components/markdown-cache.tsx +78 -0
  19. package/src/components/markdown-code-state.test.ts +32 -0
  20. package/src/components/markdown-code-state.ts +22 -0
  21. package/src/components/markdown-inline-code-kind.test.ts +46 -0
  22. package/src/components/markdown-inline-code-kind.ts +1915 -0
  23. package/src/components/markdown-preload.test.ts +18 -0
  24. package/src/components/markdown-shiki.worker.ts +104 -0
  25. package/src/components/markdown-stream.test.ts +194 -0
  26. package/src/components/markdown-stream.ts +110 -0
  27. package/src/components/markdown-worker-protocol.test.ts +81 -0
  28. package/src/components/markdown-worker-protocol.ts +48 -0
  29. package/src/components/markdown-worker-queue.test.ts +49 -0
  30. package/src/components/markdown-worker-queue.ts +64 -0
  31. package/src/components/markdown-worker-transport.test.ts +56 -0
  32. package/src/components/markdown-worker-transport.ts +41 -0
  33. package/src/components/markdown-worker.ts +122 -0
  34. package/src/components/markdown.css +377 -0
  35. package/src/components/markdown.stories.tsx +53 -0
  36. package/src/components/markdown.tsx +678 -0
  37. package/src/components/message-file.test.ts +63 -0
  38. package/src/components/message-file.ts +34 -0
  39. package/src/components/message-nav.css +127 -0
  40. package/src/components/message-nav.stories.tsx +7 -0
  41. package/src/components/message-nav.tsx +102 -0
  42. package/src/components/message-part-text.ts +3 -0
  43. package/src/components/message-part.css +1569 -0
  44. package/src/components/message-part.stories.tsx +7 -0
  45. package/src/components/message-part.test.ts +28 -0
  46. package/src/components/message-part.tsx +2662 -0
  47. package/src/components/session-diff.test.ts +135 -0
  48. package/src/components/session-diff.ts +145 -0
  49. package/src/components/session-retry.tsx +74 -0
  50. package/src/components/session-review.css +247 -0
  51. package/src/components/session-review.stories.tsx +7 -0
  52. package/src/components/session-review.tsx +657 -0
  53. package/src/components/session-turn.css +241 -0
  54. package/src/components/session-turn.stories.tsx +7 -0
  55. package/src/components/session-turn.tsx +543 -0
  56. package/src/components/shell-submessage-motion.stories.tsx +346 -0
  57. package/src/components/shell-submessage.css +23 -0
  58. package/src/components/timeline-playground.stories.tsx +2090 -0
  59. package/src/components/tool-count-label.css +57 -0
  60. package/src/components/tool-count-label.tsx +58 -0
  61. package/src/components/tool-count-summary.css +102 -0
  62. package/src/components/tool-count-summary.stories.tsx +238 -0
  63. package/src/components/tool-count-summary.tsx +52 -0
  64. package/src/components/tool-error-card.css +91 -0
  65. package/src/components/tool-error-card.stories.tsx +92 -0
  66. package/src/components/tool-error-card.tsx +157 -0
  67. package/src/components/tool-status-title.css +89 -0
  68. package/src/components/tool-status-title.tsx +133 -0
  69. package/src/context/data.tsx +64 -0
  70. package/src/context/index.ts +1 -0
  71. package/src/pierre/comment-hover.ts +83 -0
  72. package/src/pierre/commented-lines.ts +91 -0
  73. package/src/pierre/diff-selection.ts +71 -0
  74. package/src/pierre/file-find.ts +485 -0
  75. package/src/pierre/file-runtime.ts +114 -0
  76. package/src/pierre/file-selection.ts +85 -0
  77. package/src/pierre/index.ts +186 -0
  78. package/src/pierre/media.ts +110 -0
  79. package/src/pierre/selection-bridge.ts +132 -0
  80. package/src/pierre/virtualizer.ts +100 -0
  81. package/src/pierre/worker.ts +52 -0
  82. package/src/styles/index.css +14 -0
  83. package/src/v2/components/attachment-card-v2.css +70 -0
  84. package/src/v2/components/attachment-card-v2.tsx +33 -0
  85. package/src/v2/components/basic-tool-v2.css +163 -0
  86. package/src/v2/components/basic-tool-v2.stories.tsx +137 -0
  87. package/src/v2/components/basic-tool-v2.tsx +139 -0
  88. package/src/v2/components/comment-card-v2.tsx +64 -0
  89. package/src/v2/components/line-comment-annotations-v2.tsx +220 -0
  90. package/src/v2/components/prompt-input/attachments.ts +266 -0
  91. package/src/v2/components/prompt-input/index.tsx +706 -0
  92. package/src/v2/components/prompt-input/interaction.ts +482 -0
  93. package/src/v2/components/prompt-input/machine.test.ts +164 -0
  94. package/src/v2/components/prompt-input/machine.ts +261 -0
  95. package/src/v2/components/prompt-input/prompt-input.stories.tsx +221 -0
  96. package/src/v2/components/prompt-input/store.test.ts +116 -0
  97. package/src/v2/components/prompt-input/store.ts +152 -0
  98. package/src/v2/components/prompt-input/types.ts +106 -0
  99. package/src/v2/components/session-file-panel-v2.tsx +43 -0
  100. package/src/v2/components/session-progress-indicator-v2.css +875 -0
  101. package/src/v2/components/session-progress-indicator-v2.stories.tsx +66 -0
  102. package/src/v2/components/session-progress-indicator-v2.tsx +32 -0
  103. package/src/v2/components/session-review-empty-changes-v2.tsx +17 -0
  104. package/src/v2/components/session-review-empty-no-git-v2.tsx +28 -0
  105. package/src/v2/components/session-review-file-preview-v2-virtualize.test.ts +13 -0
  106. package/src/v2/components/session-review-file-preview-v2-virtualize.ts +5 -0
  107. package/src/v2/components/session-review-file-preview-v2.tsx +290 -0
  108. package/src/v2/components/session-review-v2.css +458 -0
  109. package/src/v2/components/session-review-v2.tsx +340 -0
  110. package/src/v2/components/tool-error-card-v2.css +200 -0
  111. package/src/v2/components/tool-error-card-v2.stories.tsx +91 -0
  112. package/src/v2/components/tool-error-card-v2.tsx +166 -0
  113. package/sst-env.d.ts +10 -0
  114. package/tsconfig.json +19 -0
@@ -0,0 +1,346 @@
1
+ // @ts-nocheck
2
+ import { createEffect, onCleanup } from "solid-js"
3
+ import { createStore } from "solid-js/store"
4
+ import { BasicTool } from "./basic-tool"
5
+ import { animate } from "motion"
6
+
7
+ export default {
8
+ title: "UI/Shell Submessage Motion",
9
+ id: "components-shell-submessage-motion",
10
+ tags: ["autodocs"],
11
+ parameters: {
12
+ docs: {
13
+ description: {
14
+ component: `### Overview
15
+ Interactive playground for animating the Shell tool subtitle ("submessage") in the timeline trigger row.
16
+
17
+ ### Production component path
18
+ - Trigger layout: \`packages/ui/src/components/basic-tool.tsx\`
19
+ - Bash tool subtitle source: \`packages/ui/src/components/message-part.tsx\` (tool: \`bash\`, \`trigger.subtitle\`)
20
+
21
+ ### What this playground tunes
22
+ - Width reveal (spring-driven pixel width via \`useSpring\`)
23
+ - Opacity fade
24
+ - Blur settle`,
25
+ },
26
+ },
27
+ },
28
+ }
29
+
30
+ const btn = (accent?: boolean) =>
31
+ ({
32
+ padding: "6px 14px",
33
+ "border-radius": "6px",
34
+ border: "1px solid var(--color-divider, #333)",
35
+ background: accent ? "var(--color-accent, #58f)" : "var(--color-fill-element, #222)",
36
+ color: "var(--color-text, #eee)",
37
+ cursor: "pointer",
38
+ "font-size": "13px",
39
+ }) as const
40
+
41
+ const sliderLabel = {
42
+ "font-size": "11px",
43
+ "font-family": "monospace",
44
+ color: "var(--color-text-weak, #666)",
45
+ "min-width": "84px",
46
+ "flex-shrink": "0",
47
+ "text-align": "right",
48
+ }
49
+
50
+ const sliderValue = {
51
+ "font-family": "monospace",
52
+ "font-size": "11px",
53
+ color: "var(--color-text-weak, #aaa)",
54
+ "min-width": "76px",
55
+ }
56
+
57
+ const shellCss = `
58
+ [data-component="shell-submessage-scene"] [data-component="tool-trigger"] [data-slot="basic-tool-tool-info-main"] {
59
+ align-items: baseline;
60
+ }
61
+
62
+ [data-component="shell-submessage"] {
63
+ min-width: 0;
64
+ max-width: 100%;
65
+ display: inline-flex;
66
+ align-items: baseline;
67
+ vertical-align: baseline;
68
+ }
69
+
70
+ [data-component="shell-submessage"] [data-slot="shell-submessage-width"] {
71
+ min-width: 0;
72
+ max-width: 100%;
73
+ display: inline-flex;
74
+ align-items: baseline;
75
+ overflow: hidden;
76
+ }
77
+
78
+ [data-component="shell-submessage"] [data-slot="shell-submessage-value"] {
79
+ display: inline-block;
80
+ vertical-align: baseline;
81
+ min-width: 0;
82
+ line-height: inherit;
83
+ white-space: nowrap;
84
+ opacity: 0;
85
+ filter: blur(var(--shell-sub-blur, 2px));
86
+ transition-property: opacity, filter;
87
+ transition-duration: var(--shell-sub-fade-ms, 320ms);
88
+ transition-timing-function: var(--shell-sub-fade-ease, cubic-bezier(0.22, 1, 0.36, 1));
89
+ }
90
+
91
+ [data-component="shell-submessage"][data-visible] [data-slot="shell-submessage-value"] {
92
+ opacity: 1;
93
+ filter: blur(0px);
94
+ }
95
+ `
96
+
97
+ const ease = {
98
+ smooth: "cubic-bezier(0.16, 1, 0.3, 1)",
99
+ snappy: "cubic-bezier(0.22, 1, 0.36, 1)",
100
+ standard: "cubic-bezier(0.2, 0.8, 0.2, 1)",
101
+ linear: "linear",
102
+ }
103
+
104
+ function SpringSubmessage(props: { text: string; visible: boolean; visualDuration: number; bounce: number }) {
105
+ let ref: HTMLSpanElement | undefined
106
+ let widthRef: HTMLSpanElement | undefined
107
+
108
+ createEffect(() => {
109
+ if (!widthRef) return
110
+ if (props.visible) {
111
+ requestAnimationFrame(() => {
112
+ ref?.setAttribute("data-visible", "")
113
+ animate(
114
+ widthRef!,
115
+ { width: "auto" },
116
+ { type: "spring", visualDuration: props.visualDuration, bounce: props.bounce },
117
+ )
118
+ })
119
+ } else {
120
+ ref?.removeAttribute("data-visible")
121
+ animate(
122
+ widthRef,
123
+ { width: "0px" },
124
+ { type: "spring", visualDuration: props.visualDuration, bounce: props.bounce },
125
+ )
126
+ }
127
+ })
128
+
129
+ return (
130
+ <span ref={ref} data-component="shell-submessage">
131
+ <span ref={widthRef} data-slot="shell-submessage-width" style={{ width: "0px" }}>
132
+ <span data-slot="basic-tool-tool-subtitle">
133
+ <span data-slot="shell-submessage-value">{props.text || "\u00A0"}</span>
134
+ </span>
135
+ </span>
136
+ </span>
137
+ )
138
+ }
139
+
140
+ export const Playground = {
141
+ render: () => {
142
+ const [state, setState] = createStore({
143
+ text: "Prints five topic blocks between timed commands",
144
+ show: true,
145
+ visualDuration: 0.35,
146
+ bounce: 0,
147
+ fadeMs: 320,
148
+ blur: 2,
149
+ fadeEase: "snappy",
150
+ auto: false,
151
+ })
152
+ const text = () => state.text
153
+ const show = () => state.show
154
+ const visualDuration = () => state.visualDuration
155
+ const bounce = () => state.bounce
156
+ const fadeMs = () => state.fadeMs
157
+ const blur = () => state.blur
158
+ const fadeEase = () => state.fadeEase
159
+ const auto = () => state.auto
160
+ let replayTimer
161
+ let autoTimer
162
+
163
+ const replay = () => {
164
+ setState("show", false)
165
+ if (replayTimer) clearTimeout(replayTimer)
166
+ replayTimer = setTimeout(() => {
167
+ setState("show", true)
168
+ }, 50)
169
+ }
170
+
171
+ const stopAuto = () => {
172
+ if (autoTimer) clearInterval(autoTimer)
173
+ autoTimer = undefined
174
+ setState("auto", false)
175
+ }
176
+
177
+ const toggleAuto = () => {
178
+ if (auto()) {
179
+ stopAuto()
180
+ return
181
+ }
182
+ setState("auto", true)
183
+ autoTimer = setInterval(replay, 2200)
184
+ }
185
+
186
+ onCleanup(() => {
187
+ if (replayTimer) clearTimeout(replayTimer)
188
+ if (autoTimer) clearInterval(autoTimer)
189
+ })
190
+
191
+ return (
192
+ <div
193
+ data-component="shell-submessage-scene"
194
+ style={{
195
+ display: "grid",
196
+ gap: "20px",
197
+ padding: "20px",
198
+ "max-width": "860px",
199
+ "--shell-sub-fade-ms": `${fadeMs()}ms`,
200
+ "--shell-sub-blur": `${blur()}px`,
201
+ "--shell-sub-fade-ease": ease[fadeEase()],
202
+ }}
203
+ >
204
+ <style>{shellCss}</style>
205
+
206
+ <BasicTool
207
+ icon="console"
208
+ defaultOpen
209
+ trigger={
210
+ <div data-slot="basic-tool-tool-info-structured">
211
+ <div data-slot="basic-tool-tool-info-main">
212
+ <span data-slot="basic-tool-tool-title">Shell</span>
213
+ <SpringSubmessage text={text()} visible={show()} visualDuration={visualDuration()} bounce={bounce()} />
214
+ </div>
215
+ </div>
216
+ }
217
+ >
218
+ <div
219
+ style={{
220
+ "border-radius": "8px",
221
+ border: "1px solid var(--color-divider, #333)",
222
+ background: "var(--color-fill-secondary, #161616)",
223
+ padding: "14px 16px",
224
+ "font-family": "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace",
225
+ "font-size": "18px",
226
+ color: "var(--color-text, #eee)",
227
+ "white-space": "pre-wrap",
228
+ }}
229
+ >
230
+ {"$ cat <<'TOPIC1'"}
231
+ </div>
232
+ </BasicTool>
233
+
234
+ <div style={{ display: "flex", gap: "8px", "flex-wrap": "wrap" }}>
235
+ <button onClick={replay} style={btn()}>
236
+ Replay entry
237
+ </button>
238
+ <button onClick={() => setState("show", (value) => !value)} style={btn(show())}>
239
+ {show() ? "Hide subtitle" : "Show subtitle"}
240
+ </button>
241
+ <button onClick={toggleAuto} style={btn(auto())}>
242
+ {auto() ? "Stop auto replay" : "Auto replay"}
243
+ </button>
244
+ </div>
245
+
246
+ <div
247
+ style={{
248
+ display: "grid",
249
+ gap: "10px",
250
+ "border-top": "1px solid var(--color-divider, #333)",
251
+ "padding-top": "14px",
252
+ }}
253
+ >
254
+ <div style={{ display: "flex", "align-items": "center", gap: "12px" }}>
255
+ <span style={sliderLabel}>subtitle</span>
256
+ <input
257
+ value={text()}
258
+ onInput={(e) => setState("text", e.currentTarget.value)}
259
+ style={{
260
+ width: "420px",
261
+ "max-width": "100%",
262
+ padding: "6px 8px",
263
+ "border-radius": "6px",
264
+ border: "1px solid var(--color-divider, #333)",
265
+ background: "var(--color-fill-element, #222)",
266
+ color: "var(--color-text, #eee)",
267
+ }}
268
+ />
269
+ </div>
270
+
271
+ <div style={{ display: "flex", "align-items": "center", gap: "12px" }}>
272
+ <span style={sliderLabel}>visualDuration</span>
273
+ <input
274
+ type="range"
275
+ min={0.05}
276
+ max={1.5}
277
+ step={0.01}
278
+ value={visualDuration()}
279
+ onInput={(e) => setState("visualDuration", Number(e.currentTarget.value))}
280
+ />
281
+ <span style={sliderValue}>{visualDuration().toFixed(2)}s</span>
282
+ </div>
283
+
284
+ <div style={{ display: "flex", "align-items": "center", gap: "12px" }}>
285
+ <span style={sliderLabel}>bounce</span>
286
+ <input
287
+ type="range"
288
+ min={0}
289
+ max={0.5}
290
+ step={0.01}
291
+ value={bounce()}
292
+ onInput={(e) => setState("bounce", Number(e.currentTarget.value))}
293
+ />
294
+ <span style={sliderValue}>{bounce().toFixed(2)}</span>
295
+ </div>
296
+
297
+ <div style={{ display: "flex", "align-items": "center", gap: "12px" }}>
298
+ <span style={sliderLabel}>fade ease</span>
299
+ <button
300
+ onClick={() =>
301
+ setState("fadeEase", (value) =>
302
+ value === "snappy"
303
+ ? "smooth"
304
+ : value === "smooth"
305
+ ? "standard"
306
+ : value === "standard"
307
+ ? "linear"
308
+ : "snappy",
309
+ )
310
+ }
311
+ style={btn()}
312
+ >
313
+ {fadeEase()}
314
+ </button>
315
+ </div>
316
+
317
+ <div style={{ display: "flex", "align-items": "center", gap: "12px" }}>
318
+ <span style={sliderLabel}>fade</span>
319
+ <input
320
+ type="range"
321
+ min={0}
322
+ max={1400}
323
+ step={10}
324
+ value={fadeMs()}
325
+ onInput={(e) => setState("fadeMs", Number(e.currentTarget.value))}
326
+ />
327
+ <span style={sliderValue}>{fadeMs()}ms</span>
328
+ </div>
329
+
330
+ <div style={{ display: "flex", "align-items": "center", gap: "12px" }}>
331
+ <span style={sliderLabel}>blur</span>
332
+ <input
333
+ type="range"
334
+ min={0}
335
+ max={14}
336
+ step={0.5}
337
+ value={blur()}
338
+ onInput={(e) => setState("blur", Number(e.currentTarget.value))}
339
+ />
340
+ <span style={sliderValue}>{blur()}px</span>
341
+ </div>
342
+ </div>
343
+ </div>
344
+ )
345
+ },
346
+ }
@@ -0,0 +1,23 @@
1
+ [data-component="shell-submessage"] {
2
+ min-width: 0;
3
+ max-width: 100%;
4
+ display: inline-flex;
5
+ align-items: baseline;
6
+ vertical-align: baseline;
7
+ }
8
+
9
+ [data-component="shell-submessage"] [data-slot="shell-submessage-width"] {
10
+ min-width: 0;
11
+ max-width: 100%;
12
+ display: inline-flex;
13
+ align-items: baseline;
14
+ overflow: hidden;
15
+ }
16
+
17
+ [data-component="shell-submessage"] [data-slot="shell-submessage-value"] {
18
+ display: inline-block;
19
+ vertical-align: baseline;
20
+ min-width: 0;
21
+ line-height: inherit;
22
+ white-space: nowrap;
23
+ }