@flowdrop/flowdrop 1.8.1 → 1.10.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.
Files changed (34) hide show
  1. package/dist/api/enhanced-client.js +5 -1
  2. package/dist/components/PipelineStatus.svelte +31 -8
  3. package/dist/components/PipelineStatus.svelte.d.ts +5 -0
  4. package/dist/components/WorkflowEditor.svelte +26 -0
  5. package/dist/components/chat/AIChatPanel.svelte +16 -5
  6. package/dist/components/playground/ChatPanel.svelte +31 -108
  7. package/dist/components/playground/ChatPanel.svelte.d.ts +3 -1
  8. package/dist/components/playground/ExecutionList.svelte +138 -0
  9. package/dist/components/playground/ExecutionList.svelte.d.ts +10 -0
  10. package/dist/components/playground/MessageBubble.svelte +281 -156
  11. package/dist/components/playground/PipelinePanel.svelte +382 -0
  12. package/dist/components/playground/PipelinePanel.svelte.d.ts +20 -0
  13. package/dist/components/playground/Playground.svelte +707 -174
  14. package/dist/components/playground/Playground.svelte.d.ts +6 -0
  15. package/dist/components/playground/PlaygroundStudio.svelte +404 -0
  16. package/dist/components/playground/PlaygroundStudio.svelte.d.ts +30 -0
  17. package/dist/editor/index.d.ts +1 -1
  18. package/dist/editor/index.js +1 -1
  19. package/dist/playground/index.d.ts +7 -3
  20. package/dist/playground/index.js +14 -5
  21. package/dist/playground/mount.d.ts +7 -0
  22. package/dist/playground/mount.js +78 -81
  23. package/dist/services/globalSave.d.ts +7 -0
  24. package/dist/services/globalSave.js +5 -1
  25. package/dist/services/nodeExecutionService.js +4 -2
  26. package/dist/services/playgroundService.d.ts +11 -4
  27. package/dist/services/playgroundService.js +22 -12
  28. package/dist/stores/pipelinePanelStore.svelte.d.ts +6 -0
  29. package/dist/stores/pipelinePanelStore.svelte.js +24 -0
  30. package/dist/stores/playgroundStore.svelte.d.ts +26 -21
  31. package/dist/stores/playgroundStore.svelte.js +134 -55
  32. package/dist/svelte-app.js +25 -2
  33. package/dist/types/playground.d.ts +15 -5
  34. package/package.json +1 -1
@@ -153,23 +153,50 @@
153
153
 
154
154
  {#if useCompactMode}
155
155
  <!-- Compact system message: minimal inline text without bubble -->
156
- <div class="system-notice" class:system-notice--last={isLast}>
157
- <Icon icon="mdi:information-outline" class="system-notice__icon" />
156
+ <div
157
+ class="system-notice"
158
+ class:system-notice--last={isLast}
159
+ class:system-notice--warning={message.metadata?.level === 'warning'}
160
+ class:system-notice--error={message.metadata?.level === 'error'}
161
+ class:system-notice--debug={message.metadata?.level === 'debug'}
162
+ >
163
+ <Icon icon={getLogLevelIcon()} class="system-notice__icon" />
164
+ {#if message.metadata?.source}
165
+ <span class="system-notice__source">{message.metadata.source}</span>
166
+ {/if}
158
167
  <span class="system-notice__text">{message.content}</span>
159
168
  {#if showTimestamp}
160
169
  <span class="system-notice__timestamp">{formatTimestamp(message.timestamp)}</span>
161
170
  {/if}
162
171
  </div>
172
+ {:else if message.role === 'log'}
173
+ <!-- Compact log row: terminal-style entry, visually distinct from chat bubbles -->
174
+ <div
175
+ class="log-row"
176
+ class:log-row--error={message.metadata?.level === 'error'}
177
+ class:log-row--warning={message.metadata?.level === 'warning'}
178
+ class:log-row--debug={message.metadata?.level === 'debug'}
179
+ >
180
+ <div class="log-row__level">
181
+ <Icon icon={getLogLevelIcon()} />
182
+ </div>
183
+ <div class="log-row__body">
184
+ {#if message.metadata?.source}
185
+ <span class="log-row__source">{message.metadata.source}</span>
186
+ {/if}
187
+ <span class="log-row__node">{message.metadata?.nodeLabel ?? message.nodeId ?? 'log'}</span>
188
+ <span class="log-row__text">{message.content}</span>
189
+ </div>
190
+ {#if showTimestamp}
191
+ <span class="log-row__timestamp">{formatTimestamp(message.timestamp)}</span>
192
+ {/if}
193
+ </div>
163
194
  {:else}
164
195
  <div
165
196
  class="message-bubble"
166
197
  class:message-bubble--user={message.role === 'user'}
167
198
  class:message-bubble--assistant={message.role === 'assistant'}
168
199
  class:message-bubble--system={message.role === 'system'}
169
- class:message-bubble--log={message.role === 'log'}
170
- class:message-bubble--log-error={message.role === 'log' && message.metadata?.level === 'error'}
171
- class:message-bubble--log-warning={message.role === 'log' &&
172
- message.metadata?.level === 'warning'}
173
200
  class:message-bubble--last={isLast}
174
201
  >
175
202
  <!-- Avatar / Icon -->
@@ -182,14 +209,6 @@
182
209
  <!-- Header -->
183
210
  <div class="message-bubble__header">
184
211
  <span class="message-bubble__role">{getRoleLabel(message.role, message.metadata)}</span>
185
- {#if message.role === 'log' && message.metadata?.level}
186
- <span
187
- class="message-bubble__log-level message-bubble__log-level--{message.metadata.level}"
188
- >
189
- <Icon icon={getLogLevelIcon()} />
190
- {message.metadata.level.toUpperCase()}
191
- </span>
192
- {/if}
193
212
  {#if showTimestamp}
194
213
  <span class="message-bubble__timestamp">{formatTimestamp(message.timestamp)}</span>
195
214
  {/if}
@@ -197,7 +216,7 @@
197
216
 
198
217
  <!-- Message Text -->
199
218
  <div class="message-bubble__text">
200
- {#if enableMarkdown && message.role !== 'log'}
219
+ {#if enableMarkdown}
201
220
  <!-- Markdown content - sanitized with DOMPurify to prevent XSS -->
202
221
  <!-- eslint-disable-next-line svelte/no-at-html-tags -->
203
222
  {@html renderedContent}
@@ -214,8 +233,8 @@
214
233
  class="message-bubble__node"
215
234
  title={m().playground.messageTooltips.nodeId({ id: message.nodeId })}
216
235
  >
217
- <Icon icon="mdi:graph" />
218
- {message.metadata?.nodeLabel ?? message.nodeId}
236
+ <Icon icon="mdi:vector-square" />
237
+ via {message.metadata?.nodeLabel ?? message.nodeId}
219
238
  </span>
220
239
  {/if}
221
240
  {#if message.metadata?.duration !== undefined}
@@ -234,19 +253,22 @@
234
253
  {/if}
235
254
 
236
255
  <style>
256
+ /* ============================================================
257
+ Bubble container — layout only, no background
258
+ ============================================================ */
237
259
  .message-bubble {
238
260
  display: flex;
239
- gap: var(--fd-space-md);
240
- padding: var(--fd-space-md) var(--fd-space-xl);
241
- margin-bottom: var(--fd-space-xs);
242
- border-radius: var(--fd-radius-xl);
243
- animation: fadeIn 0.2s ease-out;
261
+ gap: var(--fd-space-sm);
262
+ padding: 2px var(--fd-space-xl);
263
+ margin-bottom: 2px;
264
+ align-items: flex-end;
265
+ animation: fadeIn 0.18s ease-out;
244
266
  }
245
267
 
246
268
  @keyframes fadeIn {
247
269
  from {
248
270
  opacity: 0;
249
- transform: translateY(8px);
271
+ transform: translateY(6px);
250
272
  }
251
273
  to {
252
274
  opacity: 1;
@@ -254,75 +276,37 @@
254
276
  }
255
277
  }
256
278
 
257
- /* Role-specific styling - Neutral theme */
258
279
  .message-bubble--user {
259
- background-color: var(--fd-muted);
260
- border: 1px solid var(--fd-border);
261
- color: var(--fd-foreground);
262
- margin-left: var(--fd-space-4xl);
263
280
  flex-direction: row-reverse;
264
281
  }
265
282
 
266
- .message-bubble--assistant {
267
- background-color: var(--fd-card);
268
- border: 1px solid var(--fd-border);
269
- color: var(--fd-card-foreground);
270
- margin-right: var(--fd-space-4xl);
271
- }
272
-
273
- .message-bubble--system {
274
- background-color: var(--fd-muted);
275
- border: 1px solid var(--fd-border);
276
- color: var(--fd-muted-foreground);
277
- margin: 0 var(--fd-space-xl);
278
- font-size: var(--fd-text-sm);
279
- }
280
-
281
- .message-bubble--log {
282
- background-color: var(--fd-muted);
283
- border: 1px solid var(--fd-border);
284
- color: var(--fd-muted-foreground);
285
- margin: 0 var(--fd-space-xl);
286
- font-size: var(--fd-text-sm);
287
- font-family: var(--fd-font-mono);
288
- }
289
-
290
- .message-bubble--log-error {
291
- background-color: var(--fd-error-muted);
292
- border-color: var(--fd-error);
293
- color: var(--fd-error);
294
- }
295
-
296
- .message-bubble--log-warning {
297
- background-color: var(--fd-warning-muted);
298
- border-color: var(--fd-warning);
299
- color: var(--fd-warning);
300
- }
301
-
302
283
  .message-bubble--last {
303
284
  margin-bottom: var(--fd-space-xl);
304
285
  }
305
286
 
306
- /* Avatar */
287
+ /* ============================================================
288
+ Avatar — smaller, aligned to bubble bottom
289
+ ============================================================ */
307
290
  .message-bubble__avatar {
308
291
  flex-shrink: 0;
309
- width: var(--fd-space-4xl);
310
- height: var(--fd-space-4xl);
292
+ width: 1.875rem;
293
+ height: 1.875rem;
311
294
  display: flex;
312
295
  align-items: center;
313
296
  justify-content: center;
314
297
  border-radius: var(--fd-radius-full);
315
- font-size: var(--fd-text-lg);
298
+ font-size: 1rem;
316
299
  }
317
300
 
318
301
  .message-bubble--user .message-bubble__avatar {
319
- background-color: var(--fd-secondary);
320
- color: var(--fd-secondary-foreground);
302
+ background-color: var(--fd-primary);
303
+ color: var(--fd-primary-foreground);
321
304
  }
322
305
 
323
306
  .message-bubble--assistant .message-bubble__avatar {
324
307
  background-color: var(--fd-secondary);
325
308
  color: var(--fd-secondary-foreground);
309
+ border: 1px solid var(--fd-border);
326
310
  }
327
311
 
328
312
  .message-bubble--system .message-bubble__avatar {
@@ -330,21 +314,41 @@
330
314
  color: var(--fd-muted-foreground);
331
315
  }
332
316
 
333
- .message-bubble--log .message-bubble__avatar {
334
- background-color: var(--fd-secondary);
335
- color: var(--fd-muted-foreground);
336
- width: var(--fd-space-3xl);
337
- height: var(--fd-space-3xl);
338
- font-size: var(--fd-text-sm);
339
- }
340
-
341
- /* Content */
317
+ /* ============================================================
318
+ Content — the actual visible bubble
319
+ ============================================================ */
342
320
  .message-bubble__content {
343
- flex: 1;
344
321
  min-width: 0;
322
+ max-width: 78%;
323
+ padding: var(--fd-space-sm) var(--fd-space-md);
324
+ border-radius: var(--fd-radius-2xl);
345
325
  }
346
326
 
347
- /* Header */
327
+ .message-bubble--user .message-bubble__content {
328
+ background-color: var(--fd-primary);
329
+ color: var(--fd-primary-foreground);
330
+ border-bottom-right-radius: var(--fd-radius-sm);
331
+ }
332
+
333
+ .message-bubble--assistant .message-bubble__content {
334
+ background-color: var(--fd-card);
335
+ border: 1px solid var(--fd-border);
336
+ color: var(--fd-card-foreground);
337
+ box-shadow: 0 1px 3px 0 oklch(0% 0 0 / 0.06), 0 1px 2px -1px oklch(0% 0 0 / 0.04);
338
+ border-bottom-left-radius: var(--fd-radius-sm);
339
+ }
340
+
341
+ .message-bubble--system .message-bubble__content {
342
+ background-color: var(--fd-muted);
343
+ border: 1px solid var(--fd-border);
344
+ color: var(--fd-muted-foreground);
345
+ font-size: var(--fd-text-sm);
346
+ max-width: 88%;
347
+ }
348
+
349
+ /* ============================================================
350
+ Header — role label + timestamp
351
+ ============================================================ */
348
352
  .message-bubble__header {
349
353
  display: flex;
350
354
  align-items: center;
@@ -358,77 +362,47 @@
358
362
 
359
363
  .message-bubble__role {
360
364
  font-weight: 600;
361
- font-size: var(--fd-text-sm);
362
- color: var(--fd-foreground);
363
- }
364
-
365
- .message-bubble--user .message-bubble__role {
366
- color: var(--fd-foreground);
367
- }
368
-
369
- .message-bubble--assistant .message-bubble__role {
370
- color: var(--fd-foreground);
371
- }
372
-
373
- .message-bubble--log .message-bubble__role {
374
- font-weight: 500;
375
- }
376
-
377
- .message-bubble__log-level {
378
- display: flex;
379
- align-items: center;
380
- gap: var(--fd-space-3xs);
381
365
  font-size: var(--fd-text-xs);
382
- font-weight: 600;
383
- padding: 0.125rem var(--fd-space-3xs);
384
- border-radius: var(--fd-radius-sm);
385
366
  text-transform: uppercase;
386
367
  letter-spacing: 0.05em;
387
368
  }
388
369
 
389
- .message-bubble__log-level--info {
390
- background-color: var(--fd-info-muted);
391
- color: var(--fd-info);
392
- }
393
-
394
- .message-bubble__log-level--warning {
395
- background-color: var(--fd-warning-muted);
396
- color: var(--fd-warning);
370
+ .message-bubble--user .message-bubble__role {
371
+ color: var(--fd-primary-foreground);
372
+ opacity: 0.75;
397
373
  }
398
374
 
399
- .message-bubble__log-level--error {
400
- background-color: var(--fd-error-muted);
401
- color: var(--fd-error);
375
+ .message-bubble--assistant .message-bubble__role {
376
+ color: var(--fd-muted-foreground);
402
377
  }
403
378
 
404
- .message-bubble__log-level--debug {
405
- background-color: var(--fd-accent-muted);
406
- color: var(--fd-accent);
379
+ .message-bubble--system .message-bubble__role {
380
+ color: var(--fd-muted-foreground);
407
381
  }
408
382
 
409
383
  .message-bubble__timestamp {
410
- font-size: var(--fd-text-xs);
411
- color: var(--fd-muted-foreground);
384
+ font-size: 0.6875rem;
412
385
  font-family: var(--fd-font-mono);
386
+ opacity: 0.55;
413
387
  }
414
388
 
415
389
  .message-bubble--user .message-bubble__timestamp {
390
+ color: var(--fd-primary-foreground);
391
+ }
392
+
393
+ .message-bubble--assistant .message-bubble__timestamp {
416
394
  color: var(--fd-muted-foreground);
417
395
  }
418
396
 
419
- /* Message text */
397
+ /* ============================================================
398
+ Message text
399
+ ============================================================ */
420
400
  .message-bubble__text {
421
401
  line-height: var(--fd-leading-relaxed);
422
402
  word-break: break-word;
423
403
  }
424
404
 
425
- .message-bubble--log .message-bubble__text {
426
- font-size: var(--fd-text-sm);
427
- line-height: var(--fd-leading-tight);
428
- white-space: pre-wrap;
429
- }
430
-
431
- /* Markdown styling for message content */
405
+ /* Markdown — shared */
432
406
  .message-bubble__text :global(p) {
433
407
  margin: 0 0 var(--fd-space-md) 0;
434
408
  }
@@ -457,17 +431,9 @@
457
431
  margin-top: 0;
458
432
  }
459
433
 
460
- .message-bubble__text :global(h1) {
461
- font-size: var(--fd-text-xl);
462
- }
463
-
464
- .message-bubble__text :global(h2) {
465
- font-size: var(--fd-text-lg);
466
- }
467
-
468
- .message-bubble__text :global(h3) {
469
- font-size: var(--fd-text-base);
470
- }
434
+ .message-bubble__text :global(h1) { font-size: var(--fd-text-xl); }
435
+ .message-bubble__text :global(h2) { font-size: var(--fd-text-lg); }
436
+ .message-bubble__text :global(h3) { font-size: var(--fd-text-base); }
471
437
 
472
438
  .message-bubble__text :global(ul),
473
439
  .message-bubble__text :global(ol) {
@@ -548,26 +514,51 @@
548
514
  font-weight: 600;
549
515
  }
550
516
 
551
- .message-bubble__text :global(strong) {
552
- font-weight: 600;
517
+ .message-bubble__text :global(strong) { font-weight: 600; }
518
+ .message-bubble__text :global(em) { font-style: italic; }
519
+
520
+ /* Markdown overrides for primary-bg (user) bubbles */
521
+ .message-bubble--user .message-bubble__text :global(code) {
522
+ background-color: color-mix(in srgb, var(--fd-primary-foreground) 18%, transparent);
523
+ color: var(--fd-primary-foreground);
553
524
  }
554
525
 
555
- .message-bubble__text :global(em) {
556
- font-style: italic;
526
+ .message-bubble--user .message-bubble__text :global(pre) {
527
+ background-color: rgb(0 0 0 / 0.25);
528
+ color: var(--fd-primary-foreground);
557
529
  }
558
530
 
559
- /* Footer */
531
+ .message-bubble--user .message-bubble__text :global(a) {
532
+ color: var(--fd-primary-foreground);
533
+ text-decoration: underline;
534
+ opacity: 0.85;
535
+ }
536
+
537
+ .message-bubble--user .message-bubble__text :global(blockquote) {
538
+ border-left-color: color-mix(in srgb, var(--fd-primary-foreground) 40%, transparent);
539
+ color: var(--fd-primary-foreground);
540
+ opacity: 0.8;
541
+ }
542
+
543
+ /* ============================================================
544
+ Footer — node / duration metadata
545
+ ============================================================ */
560
546
  .message-bubble__footer {
561
547
  display: flex;
562
548
  align-items: center;
563
549
  gap: var(--fd-space-md);
564
550
  margin-top: var(--fd-space-xs);
551
+ padding-top: var(--fd-space-3xs);
552
+ border-top: 1px solid var(--fd-border);
565
553
  font-size: var(--fd-text-xs);
566
554
  color: var(--fd-muted-foreground);
567
555
  }
568
556
 
569
557
  .message-bubble--user .message-bubble__footer {
570
558
  justify-content: flex-end;
559
+ border-top-color: color-mix(in srgb, var(--fd-primary-foreground) 20%, transparent);
560
+ color: var(--fd-primary-foreground);
561
+ opacity: 0.75;
571
562
  }
572
563
 
573
564
  .message-bubble__node,
@@ -577,25 +568,128 @@
577
568
  gap: var(--fd-space-3xs);
578
569
  }
579
570
 
580
- /* Responsive */
571
+ /* ============================================================
572
+ Responsive
573
+ ============================================================ */
581
574
  @media (max-width: 640px) {
582
- .message-bubble--user,
583
- .message-bubble--assistant {
584
- margin-left: 0;
585
- margin-right: 0;
575
+ .message-bubble__content {
576
+ max-width: 88%;
586
577
  }
587
578
 
588
579
  .message-bubble__avatar {
589
- width: 1.75rem;
590
- height: 1.75rem;
591
- font-size: var(--fd-text-base);
580
+ width: 1.625rem;
581
+ height: 1.625rem;
582
+ font-size: var(--fd-text-sm);
592
583
  }
593
584
  }
594
585
 
595
586
  /* ========================================
596
- Compact System Notice Styles
597
- Minimal inline display for system messages
598
- ======================================== */
587
+ Log Row Styles
588
+ Compact terminal-style entry, distinct from chat bubbles
589
+ ======================================== */
590
+
591
+ .log-row {
592
+ display: flex;
593
+ align-items: center;
594
+ gap: var(--fd-space-sm);
595
+ padding: 0.1875rem var(--fd-space-xl);
596
+ border-left: 2px solid var(--fd-info);
597
+ margin: 1px 0;
598
+ font-family: var(--fd-font-mono);
599
+ font-size: var(--fd-text-xs);
600
+ color: var(--fd-muted-foreground);
601
+ line-height: var(--fd-leading-normal);
602
+ background-color: transparent;
603
+ }
604
+
605
+ .log-row:hover {
606
+ background-color: var(--fd-muted);
607
+ }
608
+
609
+ .log-row--error {
610
+ border-left-color: var(--fd-error);
611
+ color: var(--fd-error);
612
+ }
613
+
614
+ .log-row--warning {
615
+ border-left-color: var(--fd-warning);
616
+ color: var(--fd-warning);
617
+ }
618
+
619
+ .log-row--debug {
620
+ border-left-color: var(--fd-border-strong);
621
+ color: var(--fd-border-strong);
622
+ }
623
+
624
+ .log-row__level {
625
+ flex-shrink: 0;
626
+ display: flex;
627
+ align-items: center;
628
+ font-size: var(--fd-text-sm);
629
+ opacity: 0.7;
630
+ }
631
+
632
+ .log-row--error .log-row__level {
633
+ color: var(--fd-error);
634
+ opacity: 1;
635
+ }
636
+
637
+ .log-row--warning .log-row__level {
638
+ color: var(--fd-warning);
639
+ opacity: 1;
640
+ }
641
+
642
+ .log-row__body {
643
+ flex: 1;
644
+ min-width: 0;
645
+ display: flex;
646
+ align-items: baseline;
647
+ gap: var(--fd-space-sm);
648
+ overflow: hidden;
649
+ }
650
+
651
+ .log-row__source {
652
+ flex-shrink: 0;
653
+ font-size: 0.6rem;
654
+ text-transform: uppercase;
655
+ letter-spacing: 0.06em;
656
+ color: var(--fd-muted-foreground);
657
+ opacity: 0.6;
658
+ background-color: var(--fd-muted);
659
+ border: 1px solid var(--fd-border);
660
+ border-radius: var(--fd-radius-sm);
661
+ padding: 0 0.25rem;
662
+ line-height: 1.4;
663
+ }
664
+
665
+ .log-row__node {
666
+ flex-shrink: 0;
667
+ font-weight: 600;
668
+ color: var(--fd-foreground);
669
+ opacity: 0.5;
670
+ font-size: 0.65rem;
671
+ text-transform: uppercase;
672
+ letter-spacing: 0.04em;
673
+ }
674
+
675
+ .log-row__text {
676
+ flex: 1;
677
+ min-width: 0;
678
+ white-space: pre-wrap;
679
+ word-break: break-word;
680
+ }
681
+
682
+ .log-row__timestamp {
683
+ flex-shrink: 0;
684
+ font-size: 0.625rem;
685
+ color: var(--fd-border-strong);
686
+ opacity: 0.8;
687
+ }
688
+
689
+ /* ========================================
690
+ Compact System Notice Styles
691
+ Minimal inline display for system messages
692
+ ======================================== */
599
693
 
600
694
  .system-notice {
601
695
  display: flex;
@@ -620,11 +714,42 @@
620
714
  color: var(--fd-border-strong);
621
715
  }
622
716
 
623
- .system-notice__text {
717
+ .system-notice__source {
718
+ flex-shrink: 0;
719
+ font-size: 0.6rem;
720
+ text-transform: uppercase;
721
+ letter-spacing: 0.06em;
624
722
  color: var(--fd-muted-foreground);
723
+ background-color: var(--fd-muted);
724
+ border: 1px solid var(--fd-border);
725
+ border-radius: var(--fd-radius-sm);
726
+ padding: 0 0.25rem;
727
+ line-height: 1.4;
728
+ }
729
+
730
+ .system-notice__text {
625
731
  line-height: var(--fd-leading-tight);
626
732
  }
627
733
 
734
+ .system-notice--warning {
735
+ color: var(--fd-warning);
736
+ }
737
+ .system-notice--warning :global(.system-notice__icon) {
738
+ color: var(--fd-warning);
739
+ }
740
+
741
+ .system-notice--error {
742
+ color: var(--fd-error);
743
+ }
744
+ .system-notice--error :global(.system-notice__icon) {
745
+ color: var(--fd-error);
746
+ }
747
+
748
+ .system-notice--debug {
749
+ color: var(--fd-border-strong);
750
+ opacity: 0.6;
751
+ }
752
+
628
753
  .system-notice__timestamp {
629
754
  flex-shrink: 0;
630
755
  font-size: 0.625rem;