Jaspers Hub

jaspers / research

pluginOfficialReviewed★ 0↓ 28

Jaspers Research: Research rooms where configurable analysts research companies in parallel over SEC filings data, answering with checked citations.

7.7 KB
1/* The research room's own CSS. A plugin view is an iframe of its own, so there is no Tailwind here:
2 the house style by hand. Colours are the app's theme variables, so the view follows its light and
3 dark, each with its light value as the fallback for an app from before the theme. The two of the
4 room's own, links and the marker of a quote not found, get their dark values at the end. Square
5 everything, one grey line, muted secondary text. */
6
7.rs-root {
8 display: flex;
9 flex-direction: column;
10 height: 100%;
11 width: 100%;
12 background: var(--jaspers-background, #fff);
13 color: var(--jaspers-foreground, #171717);
14 font: 13px/1.45 var(--jaspers-font-sans, system-ui, -apple-system, sans-serif);
15}
16
17.rs-bar {
18 flex: 0 0 auto;
19 display: flex;
20 align-items: center;
21 gap: 8px;
22 min-height: 32px;
23 padding: 6px 10px;
24 border-bottom: 1px solid var(--jaspers-border, #e5e5e5);
25}
26
27.rs-title {
28 font-weight: 600;
29}
30
31.rs-muted {
32 color: var(--jaspers-muted-foreground, #737373);
33}
34
35.rs-list {
36 flex: 1 1 auto;
37 margin: 0;
38 padding: 0;
39 list-style: none;
40 overflow-y: auto;
41}
42
43.rs-analyst {
44 display: flex;
45 gap: 10px;
46 padding: 8px 10px;
47 border-bottom: 1px solid var(--jaspers-border, #e5e5e5);
48}
49
50.rs-swatch {
51 flex: 0 0 auto;
52 width: 12px;
53 height: 12px;
54 margin-top: 4px;
55}
56
57.rs-body {
58 flex: 1 1 auto;
59 min-width: 0;
60}
61
62.rs-line {
63 display: flex;
64 align-items: baseline;
65 gap: 8px;
66}
67
68.rs-name {
69 font-weight: 500;
70}
71
72.rs-description {
73 margin-top: 2px;
74 display: -webkit-box;
75 -webkit-line-clamp: 2;
76 -webkit-box-orient: vertical;
77 overflow: hidden;
78}
79
80.rs-error {
81 margin-top: 2px;
82 color: var(--jaspers-destructive, #b91c1c);
83}
84
85/* Rooms and the thread. */
86
87.rs-scroll {
88 flex: 1 1 auto;
89 min-height: 0;
90 overflow-y: auto;
91}
92
93.rs-pad {
94 margin: 0;
95 padding: 8px 10px;
96}
97
98.rs-section {
99 padding: 10px 10px 4px;
100 font-weight: 600;
101 border-bottom: 1px solid var(--jaspers-border, #e5e5e5);
102}
103
104.rs-row {
105 display: flex;
106 align-items: flex-start;
107 gap: 10px;
108 padding: 8px 10px;
109 border-bottom: 1px solid var(--jaspers-border, #e5e5e5);
110}
111
112.rs-clamp {
113 display: -webkit-box;
114 -webkit-line-clamp: 2;
115 -webkit-box-orient: vertical;
116 overflow: hidden;
117}
118
119.rs-bar {
120 flex-wrap: wrap;
121}
122
123.rs-btn {
124 border: 1px solid var(--jaspers-border, #e5e5e5);
125 background: var(--jaspers-background, #fff);
126 color: var(--jaspers-foreground, #171717);
127 padding: 2px 8px;
128 cursor: pointer;
129}
130
131.rs-btn:hover {
132 border-color: var(--jaspers-muted-foreground, #a3a3a3);
133}
134
135.rs-link {
136 border: 0;
137 background: none;
138 padding: 0;
139 color: var(--jaspers-muted-foreground, #737373);
140 cursor: pointer;
141 text-decoration: underline;
142}
143
144.rs-tag {
145 border: 1px solid var(--jaspers-border, #e5e5e5);
146 padding: 0 6px;
147 color: var(--jaspers-muted-foreground, #525252);
148}
149
150.rs-roster {
151 display: flex;
152 flex-wrap: wrap;
153 gap: 6px;
154 margin-left: auto;
155}
156
157.rs-chip {
158 display: inline-flex;
159 align-items: center;
160 gap: 5px;
161 border: 1px solid var(--jaspers-border, #e5e5e5);
162 padding: 1px 2px 1px 6px;
163}
164
165.rs-chip .rs-swatch {
166 width: 8px;
167 height: 8px;
168 margin: 0;
169}
170
171.rs-x {
172 border: 0;
173 background: none;
174 color: var(--jaspers-muted-foreground, #a3a3a3);
175 cursor: pointer;
176 padding: 0 4px;
177}
178
179.rs-x:hover {
180 color: var(--jaspers-foreground, #171717);
181}
182
183.rs-thread {
184 padding-bottom: 12px;
185}
186
187.rs-msg {
188 padding: 10px 12px;
189 border-bottom: 1px solid var(--jaspers-border, #e5e5e5);
190}
191
192.rs-you {
193 background: var(--jaspers-muted, #fafafa);
194}
195
196.rs-meta {
197 display: flex;
198 align-items: center;
199 gap: 8px;
200 margin-bottom: 4px;
201}
202
203.rs-meta .rs-swatch {
204 margin: 0;
205}
206
207.rs-plain {
208 white-space: pre-wrap;
209}
210
211/* An answer's copy icon, under its text and above its sources. The negative margin lines the glyph up with the text. */
212.rs-copy {
213 display: flex;
214 align-items: center;
215 justify-content: center;
216 width: 24px;
217 height: 24px;
218 margin: 6px 0 -4px -5px;
219 padding: 0;
220 border: 0;
221 background: none;
222 color: var(--jaspers-muted-foreground, #737373);
223 cursor: pointer;
224}
225
226.rs-copy:hover {
227 background: var(--jaspers-muted, #f5f5f5);
228 color: var(--jaspers-foreground, #171717);
229}
230
231.rs-steps {
232 display: flex;
233 flex-direction: column;
234 gap: 2px;
235 margin: 6px 0;
236}
237
238.rs-step {
239 border: 1px solid var(--jaspers-border, #e5e5e5);
240 padding: 2px 6px;
241 font-size: 12px;
242}
243
244.rs-step summary {
245 cursor: pointer;
246 white-space: nowrap;
247 overflow: hidden;
248 text-overflow: ellipsis;
249}
250
251.rs-step pre {
252 margin: 4px 0 2px;
253 white-space: pre-wrap;
254 word-break: break-all;
255 color: var(--jaspers-muted-foreground, #525252);
256}
257
258.rs-step-error summary code {
259 color: var(--jaspers-destructive, #b91c1c);
260}
261
262.rs-files {
263 display: flex;
264 flex-wrap: wrap;
265 gap: 6px;
266 margin-top: 6px;
267}
268
269.rs-file {
270 border: 1px solid var(--jaspers-border, #e5e5e5);
271 background: var(--jaspers-background, #fff);
272 padding: 2px 8px;
273 cursor: pointer;
274}
275
276/* Markdown. */
277
278.rs-md p {
279 margin: 0 0 8px;
280}
281
282.rs-md ul,
283.rs-md ol {
284 margin: 0 0 8px;
285 padding-left: 20px;
286}
287
288.rs-md code {
289 font: 12px var(--jaspers-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
290 background: var(--jaspers-muted, #f5f5f5);
291 padding: 0 3px;
292}
293
294.rs-md pre {
295 margin: 0 0 8px;
296 padding: 8px;
297 background: var(--jaspers-muted, #f5f5f5);
298 overflow-x: auto;
299}
300
301.rs-md pre code {
302 padding: 0;
303}
304
305.rs-md blockquote {
306 margin: 0 0 8px;
307 padding-left: 10px;
308 border-left: 2px solid var(--jaspers-border, #e5e5e5);
309 color: var(--jaspers-muted-foreground, #525252);
310}
311
312.rs-md hr {
313 border: 0;
314 border-top: 1px solid var(--jaspers-border, #e5e5e5);
315 margin: 10px 0;
316}
317
318.rs-md a {
319 color: #1d4ed8;
320}
321
322.rs-h {
323 font-weight: 600;
324 margin: 10px 0 6px;
325}
326
327.rs-h1 {
328 font-size: 17px;
329}
330
331.rs-h2 {
332 font-size: 15px;
333}
334
335.rs-h3,
336.rs-h4 {
337 font-size: 13px;
338}
339
340.rs-table {
341 overflow-x: auto;
342 margin: 0 0 8px;
343}
344
345.rs-table table {
346 border-collapse: collapse;
347 font-size: 12px;
348}
349
350.rs-table th,
351.rs-table td {
352 border: 1px solid var(--jaspers-border, #e5e5e5);
353 padding: 3px 6px;
354 vertical-align: top;
355}
356
357.rs-table th {
358 background: var(--jaspers-muted, #fafafa);
359 font-weight: 600;
360}
361
362/* Citations: the marker after a sourced sentence, and the sources under the answer. */
363
364.rs-cite {
365 font: 600 10.5px/1 var(--jaspers-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
366 margin-left: 2px;
367 vertical-align: super;
368 color: var(--jaspers-muted-foreground, #737373);
369}
370
371.rs-cite a {
372 color: #1d4ed8;
373 text-decoration: none;
374 padding: 0 1px;
375}
376
377.rs-cite a:hover {
378 text-decoration: underline;
379}
380
381.rs-cite-bad a {
382 color: #b45309;
383}
384
385.rs-sources {
386 margin-top: 10px;
387 padding-top: 6px;
388 border-top: 1px solid var(--jaspers-border, #e5e5e5);
389 font-size: 12px;
390}
391
392.rs-sources-head {
393 font-weight: 600;
394 cursor: pointer;
395}
396
397.rs-sources[open] .rs-sources-head {
398 margin-bottom: 4px;
399}
400
401.rs-sources-head .rs-muted {
402 font-weight: 400;
403}
404
405.rs-source {
406 display: grid;
407 grid-template-columns: 28px 1fr;
408 gap: 4px;
409 padding: 2px 0;
410}
411
412.rs-source .rs-cite {
413 vertical-align: baseline;
414 margin: 0;
415}
416
417.rs-source-body {
418 display: flex;
419 flex-wrap: wrap;
420 gap: 2px 8px;
421 min-width: 0;
422}
423
424.rs-source-title {
425 color: var(--jaspers-foreground, #171717);
426}
427
428.rs-source-quote {
429 color: var(--jaspers-muted-foreground, #525252);
430 font-style: italic;
431}
432
433.rs-source-state {
434 color: var(--jaspers-muted-foreground, #737373);
435}
436
437.rs-source-state.ok {
438 color: var(--jaspers-positive, #15803d);
439}
440
441.rs-source-state.bad {
442 color: var(--jaspers-negative, #b91c1c);
443}
444
445/* In the dark, the room's own colours, which the theme has no variable for: a lighter blue for links,
446 and the app's warning amber for the marker of a quote not found, which comes last since that marker
447 is a link too. */
448
449@media (prefers-color-scheme: dark) {
450 .rs-md a,
451 .rs-cite a {
452 color: #60a5fa;
453 }
454
455 .rs-cite-bad a {
456 color: #fbbf24;
457 }
458}