daily-focus 1.1.1-dev.2 → 1.2.0-dev.10
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/README.md +34 -20
- package/SETUP.md +103 -21
- package/dist/{audit-W3O6CLOF.js → audit-7ZCLKF46.js} +10 -4
- package/dist/{chunk-Q5OKXJXT.js → chunk-64XB7UDN.js} +1 -1
- package/dist/{chunk-OPASVYLR.js → chunk-J7ZYVUG6.js} +5 -6
- package/dist/chunk-ODJGQCM3.js +1003 -0
- package/dist/{chunk-UM2EPNWR.js → chunk-RZNQJ6UG.js} +123 -282
- package/dist/chunk-Z4SFMMRQ.js +107 -0
- package/dist/cli.js +9 -8
- package/dist/{demo-OQLT3QWP.js → demo-BYLLMKSQ.js} +135 -32
- package/dist/{init-DEVCAQZZ.js → init-EMZDG2I7.js} +1 -9
- package/dist/{seed-SMKNFYTC.js → seed-JU4LQ33D.js} +3 -3
- package/dist/{server-5O3LQVEY.js → server-WQYUOKB3.js} +459 -385
- package/dist/{service-6ZFOHPWN.js → service-PUJ3YDH5.js} +1 -1
- package/package.json +2 -2
- package/prompts/README.md +2 -3
- package/prompts/assistant.md +14 -3
- package/prompts/morning-brief-personal.md +1 -25
- package/prompts/morning-brief-work.md +8 -33
- package/public/app.js +506 -431
- package/public/style.css +198 -181
- package/dist/chunk-GFCWPYEI.js +0 -456
package/public/style.css
CHANGED
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
|
|
87
87
|
/*
|
|
88
88
|
* The UA stylesheet's `[hidden] { display: none }` loses to any class that sets
|
|
89
|
-
* display, so `.
|
|
89
|
+
* display, so `.toast` rendered as an empty box
|
|
90
90
|
* while "hidden". Assert it once here rather than remembering per component.
|
|
91
91
|
*/
|
|
92
92
|
[hidden] {
|
|
@@ -161,6 +161,12 @@ a {
|
|
|
161
161
|
gap: 8px;
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
+
.page-header__zone {
|
|
165
|
+
margin: 3px 0 0;
|
|
166
|
+
color: var(--ink-2);
|
|
167
|
+
font-size: 12px;
|
|
168
|
+
}
|
|
169
|
+
|
|
164
170
|
.freshness {
|
|
165
171
|
color: var(--ink-3);
|
|
166
172
|
font-size: 13px;
|
|
@@ -345,91 +351,6 @@ body[data-view='tickets'] #brief-refresh {
|
|
|
345
351
|
}
|
|
346
352
|
}
|
|
347
353
|
|
|
348
|
-
/* ---------- focus timer ---------- */
|
|
349
|
-
|
|
350
|
-
.timer {
|
|
351
|
-
display: flex;
|
|
352
|
-
align-items: center;
|
|
353
|
-
gap: 12px;
|
|
354
|
-
max-width: 1280px;
|
|
355
|
-
margin: 0 auto 14px;
|
|
356
|
-
padding: 10px 14px;
|
|
357
|
-
background: var(--surface);
|
|
358
|
-
border: 1px solid var(--border);
|
|
359
|
-
border-left: 3px solid var(--accent);
|
|
360
|
-
border-radius: var(--radius);
|
|
361
|
-
box-shadow: var(--shadow);
|
|
362
|
-
font-size: 13.5px;
|
|
363
|
-
color: var(--ink-2);
|
|
364
|
-
}
|
|
365
|
-
/* Past the target the timer stops being encouraging and starts being a fact. */
|
|
366
|
-
.timer[data-state='overrun'] {
|
|
367
|
-
border-left-color: var(--serious);
|
|
368
|
-
}
|
|
369
|
-
.timer[data-state='idle'] {
|
|
370
|
-
border-left-color: var(--hairline);
|
|
371
|
-
color: var(--ink-3);
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
.timer__clock {
|
|
375
|
-
font-size: 20px;
|
|
376
|
-
font-weight: 600;
|
|
377
|
-
font-variant-numeric: tabular-nums;
|
|
378
|
-
color: var(--ink-1);
|
|
379
|
-
min-width: 62px;
|
|
380
|
-
}
|
|
381
|
-
.timer[data-state='overrun'] .timer__clock {
|
|
382
|
-
color: var(--serious);
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
.timer__title {
|
|
386
|
-
flex: 1;
|
|
387
|
-
min-width: 0;
|
|
388
|
-
color: var(--ink-1);
|
|
389
|
-
overflow-wrap: anywhere;
|
|
390
|
-
}
|
|
391
|
-
.timer__note {
|
|
392
|
-
color: var(--ink-3);
|
|
393
|
-
}
|
|
394
|
-
.timer__note--warn {
|
|
395
|
-
color: var(--critical);
|
|
396
|
-
}
|
|
397
|
-
.timer__tally {
|
|
398
|
-
color: var(--ink-3);
|
|
399
|
-
white-space: nowrap;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
/*
|
|
403
|
-
* The bar after the timer stopped itself. Marked like the overrun state rather
|
|
404
|
-
* than the idle one: something happened that's worth a glance, even though the
|
|
405
|
-
* thing that happened was the dashboard being careful.
|
|
406
|
-
*/
|
|
407
|
-
.timer[data-state='stopped'] {
|
|
408
|
-
border-left-color: var(--serious);
|
|
409
|
-
}
|
|
410
|
-
.timer__away {
|
|
411
|
-
display: flex;
|
|
412
|
-
flex: 1;
|
|
413
|
-
align-items: center;
|
|
414
|
-
gap: 12px;
|
|
415
|
-
min-width: 0;
|
|
416
|
-
}
|
|
417
|
-
.timer__away-body {
|
|
418
|
-
display: flex;
|
|
419
|
-
flex-direction: column;
|
|
420
|
-
flex: 1;
|
|
421
|
-
min-width: 0;
|
|
422
|
-
}
|
|
423
|
-
.timer__away-text {
|
|
424
|
-
color: var(--ink-1);
|
|
425
|
-
overflow-wrap: anywhere;
|
|
426
|
-
}
|
|
427
|
-
.timer__away-detail {
|
|
428
|
-
color: var(--ink-3);
|
|
429
|
-
font-size: 12.5px;
|
|
430
|
-
overflow-wrap: anywhere;
|
|
431
|
-
}
|
|
432
|
-
|
|
433
354
|
/* ---------- banners ---------- */
|
|
434
355
|
|
|
435
356
|
.banners {
|
|
@@ -686,47 +607,6 @@ body[data-view='tickets'] #brief-refresh {
|
|
|
686
607
|
}
|
|
687
608
|
}
|
|
688
609
|
|
|
689
|
-
/* ---------- focus mode ---------- */
|
|
690
|
-
|
|
691
|
-
/*
|
|
692
|
-
* Fourteen open rows are fourteen invitations to switch task. Focus mode answers
|
|
693
|
-
* the only question that matters mid-work — "what am I doing right now" — by
|
|
694
|
-
* leaving the objective, one item, and the clock, and taking away the menu.
|
|
695
|
-
*/
|
|
696
|
-
.focus-bar {
|
|
697
|
-
display: flex;
|
|
698
|
-
align-items: center;
|
|
699
|
-
justify-content: space-between;
|
|
700
|
-
gap: 12px;
|
|
701
|
-
margin: 0 0 16px;
|
|
702
|
-
padding: 9px 14px;
|
|
703
|
-
background: var(--surface);
|
|
704
|
-
border: 1px solid var(--border);
|
|
705
|
-
border-left: 3px solid var(--accent);
|
|
706
|
-
border-radius: var(--radius);
|
|
707
|
-
font-size: 13px;
|
|
708
|
-
color: var(--ink-2);
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
/* Scoped to the Today view: the board is a different question, and stays whole. */
|
|
712
|
-
body[data-focus-mode='true'][data-view='today'] .stats,
|
|
713
|
-
body[data-focus-mode='true'][data-view='today'] .headline,
|
|
714
|
-
body[data-focus-mode='true'][data-view='today'] #today .drawer,
|
|
715
|
-
body[data-focus-mode='true'][data-view='today'] #today .section__header,
|
|
716
|
-
/* every section except the first, and every item in it except the first */
|
|
717
|
-
body[data-focus-mode='true'][data-view='today'] #today .section:not(:first-of-type),
|
|
718
|
-
body[data-focus-mode='true'][data-view='today'] #today .section:first-of-type .item:not(:first-child) {
|
|
719
|
-
display: none;
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
body[data-focus-mode='true'][data-view='today'] #today .item {
|
|
723
|
-
padding: 18px 20px;
|
|
724
|
-
}
|
|
725
|
-
body[data-focus-mode='true'][data-view='today'] #today .item__title {
|
|
726
|
-
font-size: 19px;
|
|
727
|
-
line-height: 1.35;
|
|
728
|
-
}
|
|
729
|
-
|
|
730
610
|
/* ---------- standing objective ---------- */
|
|
731
611
|
|
|
732
612
|
/*
|
|
@@ -904,9 +784,9 @@ body[data-focus-mode='true'][data-view='today'] #today .item__title {
|
|
|
904
784
|
scroll-margin: 90px;
|
|
905
785
|
}
|
|
906
786
|
/*
|
|
907
|
-
*
|
|
908
|
-
*
|
|
909
|
-
*
|
|
787
|
+
* Two states used to share one look: selected and priority were both "accent
|
|
788
|
+
* border", so the ranked rows were indistinguishable from a keyboard cursor.
|
|
789
|
+
* Selected is the quieter of the two.
|
|
910
790
|
*/
|
|
911
791
|
.item[data-selected='true'] {
|
|
912
792
|
border-color: var(--ink-3);
|
|
@@ -915,33 +795,6 @@ body[data-focus-mode='true'][data-view='today'] #today .item__title {
|
|
|
915
795
|
.item[data-priority='true'] {
|
|
916
796
|
border-left: 3px solid var(--accent);
|
|
917
797
|
}
|
|
918
|
-
|
|
919
|
-
/* The one you committed to. Four reinforcing cues, because missing it is the
|
|
920
|
-
* whole failure mode: a thick bar, a wash, a ring, and a live clock on the row. */
|
|
921
|
-
.item[data-running='true'],
|
|
922
|
-
.item[data-running='true'][data-selected='true'] {
|
|
923
|
-
border-color: var(--accent);
|
|
924
|
-
border-left: 5px solid var(--accent);
|
|
925
|
-
background: var(--accent-wash);
|
|
926
|
-
box-shadow: 0 0 0 2px var(--accent);
|
|
927
|
-
}
|
|
928
|
-
.item[data-running='true'][data-overrun='true'],
|
|
929
|
-
.item[data-running='true'][data-overrun='true'][data-selected='true'] {
|
|
930
|
-
border-color: var(--serious);
|
|
931
|
-
border-left-color: var(--serious);
|
|
932
|
-
box-shadow: 0 0 0 2px var(--serious);
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
/* While a session runs, everything else recedes — the competing rows are the
|
|
936
|
-
* distraction the timer exists to resist. Hover brings one back so the list is
|
|
937
|
-
* still usable without stopping the clock. */
|
|
938
|
-
body[data-session-active='true'] #today .item:not([data-running='true']) {
|
|
939
|
-
opacity: 0.45;
|
|
940
|
-
}
|
|
941
|
-
body[data-session-active='true'] #today .item:not([data-running='true']):hover,
|
|
942
|
-
body[data-session-active='true'] #today .item:not([data-running='true']):focus-within {
|
|
943
|
-
opacity: 1;
|
|
944
|
-
}
|
|
945
798
|
.item[data-status='done'] .item__title,
|
|
946
799
|
.item[data-status='dismissed'] .item__title {
|
|
947
800
|
color: var(--ink-3);
|
|
@@ -1015,6 +868,47 @@ body[data-session-active='true'] #today .item:not([data-running='true']):focus-w
|
|
|
1015
868
|
color: var(--ink-2);
|
|
1016
869
|
overflow-wrap: anywhere;
|
|
1017
870
|
}
|
|
871
|
+
/*
|
|
872
|
+
* The assistant's answer, asked ahead, in a line: the verdict on the row, so
|
|
873
|
+
* the card says what to do about the pull request before it is opened.
|
|
874
|
+
*/
|
|
875
|
+
.item__ahead {
|
|
876
|
+
display: -webkit-box;
|
|
877
|
+
margin: 6px 0 0;
|
|
878
|
+
padding: 4px 8px;
|
|
879
|
+
border-radius: var(--radius-sm);
|
|
880
|
+
background: var(--accent-wash);
|
|
881
|
+
font-size: 12.5px;
|
|
882
|
+
color: var(--ink-1);
|
|
883
|
+
overflow: hidden;
|
|
884
|
+
overflow-wrap: anywhere;
|
|
885
|
+
-webkit-box-orient: vertical;
|
|
886
|
+
-webkit-line-clamp: 2;
|
|
887
|
+
}
|
|
888
|
+
.item__ahead--quiet {
|
|
889
|
+
background: none;
|
|
890
|
+
padding: 0;
|
|
891
|
+
color: var(--ink-3);
|
|
892
|
+
}
|
|
893
|
+
.item__ahead-mark {
|
|
894
|
+
margin-right: 6px;
|
|
895
|
+
color: var(--accent);
|
|
896
|
+
font-weight: 600;
|
|
897
|
+
}
|
|
898
|
+
.item__ahead[data-status='running'] .item__ahead-mark {
|
|
899
|
+
animation: ahead-pulse 1.4s ease-in-out infinite;
|
|
900
|
+
}
|
|
901
|
+
@keyframes ahead-pulse {
|
|
902
|
+
50% {
|
|
903
|
+
opacity: 0.3;
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
@media (prefers-reduced-motion: reduce) {
|
|
907
|
+
.item__ahead[data-status='running'] .item__ahead-mark {
|
|
908
|
+
animation: none;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
|
|
1018
912
|
.item__detail code {
|
|
1019
913
|
padding: 1px 4px;
|
|
1020
914
|
background: var(--surface-sunken);
|
|
@@ -1052,17 +946,6 @@ body[data-session-active='true'] #today .item:not([data-running='true']):focus-w
|
|
|
1052
946
|
font-weight: 600;
|
|
1053
947
|
font-variant-numeric: tabular-nums;
|
|
1054
948
|
}
|
|
1055
|
-
.pill--running {
|
|
1056
|
-
border-color: transparent;
|
|
1057
|
-
background: var(--accent);
|
|
1058
|
-
color: #fff;
|
|
1059
|
-
font-weight: 600;
|
|
1060
|
-
font-variant-numeric: tabular-nums;
|
|
1061
|
-
}
|
|
1062
|
-
.item[data-overrun='true'] .pill--running {
|
|
1063
|
-
background: var(--serious);
|
|
1064
|
-
color: #1a1a19;
|
|
1065
|
-
}
|
|
1066
949
|
.pill--objective {
|
|
1067
950
|
border-color: var(--accent);
|
|
1068
951
|
color: var(--accent);
|
|
@@ -1557,7 +1440,7 @@ kbd {
|
|
|
1557
1440
|
}
|
|
1558
1441
|
|
|
1559
1442
|
/*
|
|
1560
|
-
* Which view is showing.
|
|
1443
|
+
* Which view is showing.
|
|
1561
1444
|
*
|
|
1562
1445
|
* One rule per panel per view rather than `:not()`, because a view name nobody
|
|
1563
1446
|
* has written a rule for should show nothing rather than everything at once.
|
|
@@ -1623,6 +1506,7 @@ body[data-view='settings'] .layout {
|
|
|
1623
1506
|
}
|
|
1624
1507
|
|
|
1625
1508
|
.item--pull[data-status='snoozed'] .item__title,
|
|
1509
|
+
.item--pull[data-nudged='true'] .item__title,
|
|
1626
1510
|
.item--ticket[data-status='snoozed'] .item__title {
|
|
1627
1511
|
color: var(--ink-3);
|
|
1628
1512
|
}
|
|
@@ -1704,12 +1588,17 @@ body[data-view='settings'] .layout {
|
|
|
1704
1588
|
padding-right: 104px;
|
|
1705
1589
|
font-size: 13.5px;
|
|
1706
1590
|
}
|
|
1707
|
-
/* The exceptions, the notes and the note form all span both columns. */
|
|
1591
|
+
/* The exceptions, GitHub's evidence, the notes and the note form all span both columns. */
|
|
1708
1592
|
#tickets .item__meta--extra,
|
|
1593
|
+
#tickets .item__reason,
|
|
1709
1594
|
#tickets .item__notes,
|
|
1710
1595
|
#tickets .note-form {
|
|
1711
1596
|
grid-column: 1 / -1;
|
|
1712
1597
|
}
|
|
1598
|
+
/* The grid's gap already spaces it from the line above. */
|
|
1599
|
+
#tickets .item__reason {
|
|
1600
|
+
margin-top: 0;
|
|
1601
|
+
}
|
|
1713
1602
|
|
|
1714
1603
|
/*
|
|
1715
1604
|
* The switch between the ticket tab's two views: what is out of sync, and what
|
|
@@ -1887,9 +1776,9 @@ a.button {
|
|
|
1887
1776
|
/*
|
|
1888
1777
|
* ---------- the assistant ----------
|
|
1889
1778
|
*
|
|
1890
|
-
* A section of the item panel, so the transcript scrolls with the panel's body
|
|
1891
|
-
*
|
|
1892
|
-
* scroll region; now the panel is the box.
|
|
1779
|
+
* A section of the item panel, so the transcript scrolls with the panel's body;
|
|
1780
|
+
* the field is pinned in the panel's foot. It used to be a box under the card
|
|
1781
|
+
* with its own scroll region; now the panel is the box.
|
|
1893
1782
|
*/
|
|
1894
1783
|
|
|
1895
1784
|
.assistant__turns {
|
|
@@ -1908,6 +1797,9 @@ a.button {
|
|
|
1908
1797
|
color: var(--ink-1);
|
|
1909
1798
|
font-weight: 600;
|
|
1910
1799
|
}
|
|
1800
|
+
.assistant__auto {
|
|
1801
|
+
color: var(--accent);
|
|
1802
|
+
}
|
|
1911
1803
|
|
|
1912
1804
|
.assistant__reply {
|
|
1913
1805
|
margin-top: 5px;
|
|
@@ -1953,8 +1845,29 @@ a.button {
|
|
|
1953
1845
|
border: 0;
|
|
1954
1846
|
border-top: 1px solid var(--hairline);
|
|
1955
1847
|
}
|
|
1956
|
-
|
|
1957
|
-
|
|
1848
|
+
/* A fenced block in an answer is usually meant for pasting elsewhere, so it carries a Copy. */
|
|
1849
|
+
.code-block {
|
|
1850
|
+
position: relative;
|
|
1851
|
+
}
|
|
1852
|
+
.code-block pre {
|
|
1853
|
+
padding-right: 52px;
|
|
1854
|
+
}
|
|
1855
|
+
.code-block__copy {
|
|
1856
|
+
position: absolute;
|
|
1857
|
+
top: 5px;
|
|
1858
|
+
right: 5px;
|
|
1859
|
+
padding: 1px 6px;
|
|
1860
|
+
border: 1px solid var(--border);
|
|
1861
|
+
border-radius: var(--radius-sm);
|
|
1862
|
+
background: var(--surface);
|
|
1863
|
+
color: var(--ink-3);
|
|
1864
|
+
font: inherit;
|
|
1865
|
+
font-size: 11px;
|
|
1866
|
+
cursor: pointer;
|
|
1867
|
+
}
|
|
1868
|
+
.code-block__copy:hover {
|
|
1869
|
+
color: var(--ink-1);
|
|
1870
|
+
border-color: var(--ink-3);
|
|
1958
1871
|
}
|
|
1959
1872
|
|
|
1960
1873
|
.assistant__status {
|
|
@@ -1965,16 +1878,25 @@ a.button {
|
|
|
1965
1878
|
.assistant__status--bad {
|
|
1966
1879
|
color: var(--critical);
|
|
1967
1880
|
}
|
|
1968
|
-
.
|
|
1881
|
+
.assistant__clock {
|
|
1882
|
+
font-variant-numeric: tabular-nums;
|
|
1883
|
+
}
|
|
1884
|
+
|
|
1885
|
+
/* A spinner, for the turn while it works and for each call it is waiting on. */
|
|
1886
|
+
.assistant__status--working::after,
|
|
1887
|
+
.assistant__step[data-state='running']::before {
|
|
1969
1888
|
content: '';
|
|
1970
1889
|
display: inline-block;
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1890
|
+
box-sizing: border-box;
|
|
1891
|
+
width: 9px;
|
|
1892
|
+
height: 9px;
|
|
1974
1893
|
border-radius: 50%;
|
|
1975
1894
|
border: 1.5px solid var(--accent);
|
|
1976
1895
|
border-top-color: transparent;
|
|
1977
1896
|
animation: assistant-spin 0.9s linear infinite;
|
|
1897
|
+
}
|
|
1898
|
+
.assistant__status--working::after {
|
|
1899
|
+
margin-left: 6px;
|
|
1978
1900
|
vertical-align: -1px;
|
|
1979
1901
|
}
|
|
1980
1902
|
@keyframes assistant-spin {
|
|
@@ -1983,16 +1905,105 @@ a.button {
|
|
|
1983
1905
|
}
|
|
1984
1906
|
}
|
|
1985
1907
|
@media (prefers-reduced-motion: reduce) {
|
|
1986
|
-
.
|
|
1908
|
+
.assistant__status--working::after,
|
|
1909
|
+
.assistant__step[data-state='running']::before {
|
|
1987
1910
|
animation: none;
|
|
1988
1911
|
}
|
|
1989
1912
|
}
|
|
1990
1913
|
|
|
1914
|
+
/*
|
|
1915
|
+
* The work: each call as one muted line under the request, the newest at the
|
|
1916
|
+
* foot. Folded once the turn is over, under a line that says what it took.
|
|
1917
|
+
*/
|
|
1918
|
+
.assistant__work {
|
|
1919
|
+
margin-top: 4px;
|
|
1920
|
+
}
|
|
1921
|
+
.assistant__work > summary {
|
|
1922
|
+
font-size: 12px;
|
|
1923
|
+
color: var(--ink-3);
|
|
1924
|
+
cursor: pointer;
|
|
1925
|
+
}
|
|
1926
|
+
.assistant__work > summary:hover {
|
|
1927
|
+
color: var(--ink-2);
|
|
1928
|
+
}
|
|
1929
|
+
.assistant__took {
|
|
1930
|
+
margin: 4px 0 0;
|
|
1931
|
+
font-size: 12px;
|
|
1932
|
+
color: var(--ink-3);
|
|
1933
|
+
}
|
|
1934
|
+
.assistant__steps {
|
|
1935
|
+
margin: 5px 0 0;
|
|
1936
|
+
padding: 0 0 0 10px;
|
|
1937
|
+
border-left: 2px solid var(--hairline);
|
|
1938
|
+
list-style: none;
|
|
1939
|
+
font-size: 12px;
|
|
1940
|
+
line-height: 1.45;
|
|
1941
|
+
color: var(--ink-2);
|
|
1942
|
+
}
|
|
1943
|
+
.assistant__step {
|
|
1944
|
+
display: flex;
|
|
1945
|
+
align-items: baseline;
|
|
1946
|
+
gap: 6px;
|
|
1947
|
+
min-width: 0;
|
|
1948
|
+
}
|
|
1949
|
+
.assistant__step + .assistant__step {
|
|
1950
|
+
margin-top: 3px;
|
|
1951
|
+
}
|
|
1952
|
+
.assistant__step::before {
|
|
1953
|
+
flex: none;
|
|
1954
|
+
width: 9px;
|
|
1955
|
+
font-size: 11px;
|
|
1956
|
+
text-align: center;
|
|
1957
|
+
}
|
|
1958
|
+
.assistant__step[data-state='done']::before {
|
|
1959
|
+
content: '✓';
|
|
1960
|
+
color: var(--good-ink);
|
|
1961
|
+
}
|
|
1962
|
+
.assistant__step[data-state='failed']::before {
|
|
1963
|
+
content: '✕';
|
|
1964
|
+
color: var(--critical);
|
|
1965
|
+
}
|
|
1966
|
+
.assistant__step[data-state='running']::before {
|
|
1967
|
+
align-self: center;
|
|
1968
|
+
}
|
|
1969
|
+
.assistant__step-text {
|
|
1970
|
+
flex: none;
|
|
1971
|
+
max-width: 60%;
|
|
1972
|
+
overflow: hidden;
|
|
1973
|
+
text-overflow: ellipsis;
|
|
1974
|
+
white-space: nowrap;
|
|
1975
|
+
}
|
|
1976
|
+
.assistant__step-detail {
|
|
1977
|
+
min-width: 0;
|
|
1978
|
+
overflow: hidden;
|
|
1979
|
+
text-overflow: ellipsis;
|
|
1980
|
+
white-space: nowrap;
|
|
1981
|
+
font-size: 11.5px;
|
|
1982
|
+
color: var(--ink-3);
|
|
1983
|
+
}
|
|
1984
|
+
/* What it said on the way: its own words, set apart from the calls by having no mark. */
|
|
1985
|
+
.assistant__step--message {
|
|
1986
|
+
display: block;
|
|
1987
|
+
padding-left: 15px;
|
|
1988
|
+
font-style: italic;
|
|
1989
|
+
color: var(--ink-3);
|
|
1990
|
+
white-space: pre-line;
|
|
1991
|
+
overflow-wrap: anywhere;
|
|
1992
|
+
}
|
|
1993
|
+
|
|
1994
|
+
/* What can be done with a finished answer, without leaving the panel. */
|
|
1995
|
+
.assistant__after {
|
|
1996
|
+
display: flex;
|
|
1997
|
+
flex-wrap: wrap;
|
|
1998
|
+
gap: 6px;
|
|
1999
|
+
margin-top: 6px;
|
|
2000
|
+
}
|
|
2001
|
+
|
|
1991
2002
|
.assistant__quick {
|
|
1992
2003
|
display: flex;
|
|
1993
2004
|
flex-wrap: wrap;
|
|
1994
2005
|
gap: 6px;
|
|
1995
|
-
margin-bottom:
|
|
2006
|
+
margin-bottom: 10px;
|
|
1996
2007
|
}
|
|
1997
2008
|
|
|
1998
2009
|
.assistant__form {
|
|
@@ -2111,6 +2122,12 @@ body[data-flyout='open'] .layout__side {
|
|
|
2111
2122
|
overflow-y: auto;
|
|
2112
2123
|
padding: 16px 16px 20px;
|
|
2113
2124
|
}
|
|
2125
|
+
/* The assistant's field and its canned asks, pinned under the body that scrolls. */
|
|
2126
|
+
.flyout__footer {
|
|
2127
|
+
flex: none;
|
|
2128
|
+
padding: 12px 16px 14px;
|
|
2129
|
+
border-top: 1px solid var(--hairline);
|
|
2130
|
+
}
|
|
2114
2131
|
.flyout__detail {
|
|
2115
2132
|
margin: 0 0 22px;
|
|
2116
2133
|
font-size: 13px;
|