daily-focus 1.2.0-dev.7 → 1.2.0-dev.9
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 +7 -12
- package/SETUP.md +3 -5
- package/dist/{audit-7YAJYHZF.js → audit-DNTFZOHH.js} +3 -3
- package/dist/{chunk-4DCBCR4D.js → chunk-6SMUSPZG.js} +2 -2
- package/dist/{chunk-JQGYCWRX.js → chunk-GQ3NCWRT.js} +7 -175
- package/dist/{chunk-SX5FPS3A.js → chunk-KL6RU4XT.js} +141 -15
- package/dist/{chunk-RNE27FQY.js → chunk-KZNY45XW.js} +0 -5
- package/dist/{chunk-UY6HQLGE.js → chunk-P3E2B2SD.js} +1 -1
- package/dist/cli.js +6 -6
- package/dist/{demo-5I4BNHW2.js → demo-TIIXODJG.js} +38 -25
- package/dist/{init-57WHZZNG.js → init-XDMAXU2S.js} +1 -9
- package/dist/{seed-BLFBCHIA.js → seed-TWT7EDXJ.js} +3 -3
- package/dist/{server-UI6WYRTL.js → server-WT4CQ3VX.js} +88 -218
- package/dist/{service-NAAAV67B.js → service-ZUHI3VKH.js} +1 -1
- package/package.json +1 -1
- package/prompts/README.md +2 -3
- package/prompts/assistant.md +7 -2
- package/prompts/morning-brief-personal.md +0 -25
- package/prompts/morning-brief-work.md +0 -28
- package/public/app.js +361 -427
- package/public/style.css +141 -180
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] {
|
|
@@ -351,91 +351,6 @@ body[data-view='tickets'] #brief-refresh {
|
|
|
351
351
|
}
|
|
352
352
|
}
|
|
353
353
|
|
|
354
|
-
/* ---------- focus timer ---------- */
|
|
355
|
-
|
|
356
|
-
.timer {
|
|
357
|
-
display: flex;
|
|
358
|
-
align-items: center;
|
|
359
|
-
gap: 12px;
|
|
360
|
-
max-width: 1280px;
|
|
361
|
-
margin: 0 auto 14px;
|
|
362
|
-
padding: 10px 14px;
|
|
363
|
-
background: var(--surface);
|
|
364
|
-
border: 1px solid var(--border);
|
|
365
|
-
border-left: 3px solid var(--accent);
|
|
366
|
-
border-radius: var(--radius);
|
|
367
|
-
box-shadow: var(--shadow);
|
|
368
|
-
font-size: 13.5px;
|
|
369
|
-
color: var(--ink-2);
|
|
370
|
-
}
|
|
371
|
-
/* Past the target the timer stops being encouraging and starts being a fact. */
|
|
372
|
-
.timer[data-state='overrun'] {
|
|
373
|
-
border-left-color: var(--serious);
|
|
374
|
-
}
|
|
375
|
-
.timer[data-state='idle'] {
|
|
376
|
-
border-left-color: var(--hairline);
|
|
377
|
-
color: var(--ink-3);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
.timer__clock {
|
|
381
|
-
font-size: 20px;
|
|
382
|
-
font-weight: 600;
|
|
383
|
-
font-variant-numeric: tabular-nums;
|
|
384
|
-
color: var(--ink-1);
|
|
385
|
-
min-width: 62px;
|
|
386
|
-
}
|
|
387
|
-
.timer[data-state='overrun'] .timer__clock {
|
|
388
|
-
color: var(--serious);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
.timer__title {
|
|
392
|
-
flex: 1;
|
|
393
|
-
min-width: 0;
|
|
394
|
-
color: var(--ink-1);
|
|
395
|
-
overflow-wrap: anywhere;
|
|
396
|
-
}
|
|
397
|
-
.timer__note {
|
|
398
|
-
color: var(--ink-3);
|
|
399
|
-
}
|
|
400
|
-
.timer__note--warn {
|
|
401
|
-
color: var(--critical);
|
|
402
|
-
}
|
|
403
|
-
.timer__tally {
|
|
404
|
-
color: var(--ink-3);
|
|
405
|
-
white-space: nowrap;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
/*
|
|
409
|
-
* The bar after the timer stopped itself. Marked like the overrun state rather
|
|
410
|
-
* than the idle one: something happened that's worth a glance, even though the
|
|
411
|
-
* thing that happened was the dashboard being careful.
|
|
412
|
-
*/
|
|
413
|
-
.timer[data-state='stopped'] {
|
|
414
|
-
border-left-color: var(--serious);
|
|
415
|
-
}
|
|
416
|
-
.timer__away {
|
|
417
|
-
display: flex;
|
|
418
|
-
flex: 1;
|
|
419
|
-
align-items: center;
|
|
420
|
-
gap: 12px;
|
|
421
|
-
min-width: 0;
|
|
422
|
-
}
|
|
423
|
-
.timer__away-body {
|
|
424
|
-
display: flex;
|
|
425
|
-
flex-direction: column;
|
|
426
|
-
flex: 1;
|
|
427
|
-
min-width: 0;
|
|
428
|
-
}
|
|
429
|
-
.timer__away-text {
|
|
430
|
-
color: var(--ink-1);
|
|
431
|
-
overflow-wrap: anywhere;
|
|
432
|
-
}
|
|
433
|
-
.timer__away-detail {
|
|
434
|
-
color: var(--ink-3);
|
|
435
|
-
font-size: 12.5px;
|
|
436
|
-
overflow-wrap: anywhere;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
354
|
/* ---------- banners ---------- */
|
|
440
355
|
|
|
441
356
|
.banners {
|
|
@@ -692,47 +607,6 @@ body[data-view='tickets'] #brief-refresh {
|
|
|
692
607
|
}
|
|
693
608
|
}
|
|
694
609
|
|
|
695
|
-
/* ---------- focus mode ---------- */
|
|
696
|
-
|
|
697
|
-
/*
|
|
698
|
-
* Fourteen open rows are fourteen invitations to switch task. Focus mode answers
|
|
699
|
-
* the only question that matters mid-work — "what am I doing right now" — by
|
|
700
|
-
* leaving the objective, one item, and the clock, and taking away the menu.
|
|
701
|
-
*/
|
|
702
|
-
.focus-bar {
|
|
703
|
-
display: flex;
|
|
704
|
-
align-items: center;
|
|
705
|
-
justify-content: space-between;
|
|
706
|
-
gap: 12px;
|
|
707
|
-
margin: 0 0 16px;
|
|
708
|
-
padding: 9px 14px;
|
|
709
|
-
background: var(--surface);
|
|
710
|
-
border: 1px solid var(--border);
|
|
711
|
-
border-left: 3px solid var(--accent);
|
|
712
|
-
border-radius: var(--radius);
|
|
713
|
-
font-size: 13px;
|
|
714
|
-
color: var(--ink-2);
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
/* Scoped to the Today view: the board is a different question, and stays whole. */
|
|
718
|
-
body[data-focus-mode='true'][data-view='today'] .stats,
|
|
719
|
-
body[data-focus-mode='true'][data-view='today'] .headline,
|
|
720
|
-
body[data-focus-mode='true'][data-view='today'] #today .drawer,
|
|
721
|
-
body[data-focus-mode='true'][data-view='today'] #today .section__header,
|
|
722
|
-
/* every section except the first, and every item in it except the first */
|
|
723
|
-
body[data-focus-mode='true'][data-view='today'] #today .section:not(:first-of-type),
|
|
724
|
-
body[data-focus-mode='true'][data-view='today'] #today .section:first-of-type .item:not(:first-child) {
|
|
725
|
-
display: none;
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
body[data-focus-mode='true'][data-view='today'] #today .item {
|
|
729
|
-
padding: 18px 20px;
|
|
730
|
-
}
|
|
731
|
-
body[data-focus-mode='true'][data-view='today'] #today .item__title {
|
|
732
|
-
font-size: 19px;
|
|
733
|
-
line-height: 1.35;
|
|
734
|
-
}
|
|
735
|
-
|
|
736
610
|
/* ---------- standing objective ---------- */
|
|
737
611
|
|
|
738
612
|
/*
|
|
@@ -910,9 +784,9 @@ body[data-focus-mode='true'][data-view='today'] #today .item__title {
|
|
|
910
784
|
scroll-margin: 90px;
|
|
911
785
|
}
|
|
912
786
|
/*
|
|
913
|
-
*
|
|
914
|
-
*
|
|
915
|
-
*
|
|
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.
|
|
916
790
|
*/
|
|
917
791
|
.item[data-selected='true'] {
|
|
918
792
|
border-color: var(--ink-3);
|
|
@@ -921,33 +795,6 @@ body[data-focus-mode='true'][data-view='today'] #today .item__title {
|
|
|
921
795
|
.item[data-priority='true'] {
|
|
922
796
|
border-left: 3px solid var(--accent);
|
|
923
797
|
}
|
|
924
|
-
|
|
925
|
-
/* The one you committed to. Four reinforcing cues, because missing it is the
|
|
926
|
-
* whole failure mode: a thick bar, a wash, a ring, and a live clock on the row. */
|
|
927
|
-
.item[data-running='true'],
|
|
928
|
-
.item[data-running='true'][data-selected='true'] {
|
|
929
|
-
border-color: var(--accent);
|
|
930
|
-
border-left: 5px solid var(--accent);
|
|
931
|
-
background: var(--accent-wash);
|
|
932
|
-
box-shadow: 0 0 0 2px var(--accent);
|
|
933
|
-
}
|
|
934
|
-
.item[data-running='true'][data-overrun='true'],
|
|
935
|
-
.item[data-running='true'][data-overrun='true'][data-selected='true'] {
|
|
936
|
-
border-color: var(--serious);
|
|
937
|
-
border-left-color: var(--serious);
|
|
938
|
-
box-shadow: 0 0 0 2px var(--serious);
|
|
939
|
-
}
|
|
940
|
-
|
|
941
|
-
/* While a session runs, everything else recedes — the competing rows are the
|
|
942
|
-
* distraction the timer exists to resist. Hover brings one back so the list is
|
|
943
|
-
* still usable without stopping the clock. */
|
|
944
|
-
body[data-session-active='true'] #today .item:not([data-running='true']) {
|
|
945
|
-
opacity: 0.45;
|
|
946
|
-
}
|
|
947
|
-
body[data-session-active='true'] #today .item:not([data-running='true']):hover,
|
|
948
|
-
body[data-session-active='true'] #today .item:not([data-running='true']):focus-within {
|
|
949
|
-
opacity: 1;
|
|
950
|
-
}
|
|
951
798
|
.item[data-status='done'] .item__title,
|
|
952
799
|
.item[data-status='dismissed'] .item__title {
|
|
953
800
|
color: var(--ink-3);
|
|
@@ -1058,17 +905,6 @@ body[data-session-active='true'] #today .item:not([data-running='true']):focus-w
|
|
|
1058
905
|
font-weight: 600;
|
|
1059
906
|
font-variant-numeric: tabular-nums;
|
|
1060
907
|
}
|
|
1061
|
-
.pill--running {
|
|
1062
|
-
border-color: transparent;
|
|
1063
|
-
background: var(--accent);
|
|
1064
|
-
color: #fff;
|
|
1065
|
-
font-weight: 600;
|
|
1066
|
-
font-variant-numeric: tabular-nums;
|
|
1067
|
-
}
|
|
1068
|
-
.item[data-overrun='true'] .pill--running {
|
|
1069
|
-
background: var(--serious);
|
|
1070
|
-
color: #1a1a19;
|
|
1071
|
-
}
|
|
1072
908
|
.pill--objective {
|
|
1073
909
|
border-color: var(--accent);
|
|
1074
910
|
color: var(--accent);
|
|
@@ -1563,7 +1399,7 @@ kbd {
|
|
|
1563
1399
|
}
|
|
1564
1400
|
|
|
1565
1401
|
/*
|
|
1566
|
-
* Which view is showing.
|
|
1402
|
+
* Which view is showing.
|
|
1567
1403
|
*
|
|
1568
1404
|
* One rule per panel per view rather than `:not()`, because a view name nobody
|
|
1569
1405
|
* has written a rule for should show nothing rather than everything at once.
|
|
@@ -1899,9 +1735,9 @@ a.button {
|
|
|
1899
1735
|
/*
|
|
1900
1736
|
* ---------- the assistant ----------
|
|
1901
1737
|
*
|
|
1902
|
-
* A section of the item panel, so the transcript scrolls with the panel's body
|
|
1903
|
-
*
|
|
1904
|
-
* scroll region; now the panel is the box.
|
|
1738
|
+
* A section of the item panel, so the transcript scrolls with the panel's body;
|
|
1739
|
+
* the field is pinned in the panel's foot. It used to be a box under the card
|
|
1740
|
+
* with its own scroll region; now the panel is the box.
|
|
1905
1741
|
*/
|
|
1906
1742
|
|
|
1907
1743
|
.assistant__turns {
|
|
@@ -1965,8 +1801,29 @@ a.button {
|
|
|
1965
1801
|
border: 0;
|
|
1966
1802
|
border-top: 1px solid var(--hairline);
|
|
1967
1803
|
}
|
|
1968
|
-
|
|
1969
|
-
|
|
1804
|
+
/* A fenced block in an answer is usually meant for pasting elsewhere, so it carries a Copy. */
|
|
1805
|
+
.code-block {
|
|
1806
|
+
position: relative;
|
|
1807
|
+
}
|
|
1808
|
+
.code-block pre {
|
|
1809
|
+
padding-right: 52px;
|
|
1810
|
+
}
|
|
1811
|
+
.code-block__copy {
|
|
1812
|
+
position: absolute;
|
|
1813
|
+
top: 5px;
|
|
1814
|
+
right: 5px;
|
|
1815
|
+
padding: 1px 6px;
|
|
1816
|
+
border: 1px solid var(--border);
|
|
1817
|
+
border-radius: var(--radius-sm);
|
|
1818
|
+
background: var(--surface);
|
|
1819
|
+
color: var(--ink-3);
|
|
1820
|
+
font: inherit;
|
|
1821
|
+
font-size: 11px;
|
|
1822
|
+
cursor: pointer;
|
|
1823
|
+
}
|
|
1824
|
+
.code-block__copy:hover {
|
|
1825
|
+
color: var(--ink-1);
|
|
1826
|
+
border-color: var(--ink-3);
|
|
1970
1827
|
}
|
|
1971
1828
|
|
|
1972
1829
|
.assistant__status {
|
|
@@ -1977,16 +1834,25 @@ a.button {
|
|
|
1977
1834
|
.assistant__status--bad {
|
|
1978
1835
|
color: var(--critical);
|
|
1979
1836
|
}
|
|
1980
|
-
.
|
|
1837
|
+
.assistant__clock {
|
|
1838
|
+
font-variant-numeric: tabular-nums;
|
|
1839
|
+
}
|
|
1840
|
+
|
|
1841
|
+
/* A spinner, for the turn while it works and for each call it is waiting on. */
|
|
1842
|
+
.assistant__status--working::after,
|
|
1843
|
+
.assistant__step[data-state='running']::before {
|
|
1981
1844
|
content: '';
|
|
1982
1845
|
display: inline-block;
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1846
|
+
box-sizing: border-box;
|
|
1847
|
+
width: 9px;
|
|
1848
|
+
height: 9px;
|
|
1986
1849
|
border-radius: 50%;
|
|
1987
1850
|
border: 1.5px solid var(--accent);
|
|
1988
1851
|
border-top-color: transparent;
|
|
1989
1852
|
animation: assistant-spin 0.9s linear infinite;
|
|
1853
|
+
}
|
|
1854
|
+
.assistant__status--working::after {
|
|
1855
|
+
margin-left: 6px;
|
|
1990
1856
|
vertical-align: -1px;
|
|
1991
1857
|
}
|
|
1992
1858
|
@keyframes assistant-spin {
|
|
@@ -1995,16 +1861,105 @@ a.button {
|
|
|
1995
1861
|
}
|
|
1996
1862
|
}
|
|
1997
1863
|
@media (prefers-reduced-motion: reduce) {
|
|
1998
|
-
.
|
|
1864
|
+
.assistant__status--working::after,
|
|
1865
|
+
.assistant__step[data-state='running']::before {
|
|
1999
1866
|
animation: none;
|
|
2000
1867
|
}
|
|
2001
1868
|
}
|
|
2002
1869
|
|
|
1870
|
+
/*
|
|
1871
|
+
* The work: each call as one muted line under the request, the newest at the
|
|
1872
|
+
* foot. Folded once the turn is over, under a line that says what it took.
|
|
1873
|
+
*/
|
|
1874
|
+
.assistant__work {
|
|
1875
|
+
margin-top: 4px;
|
|
1876
|
+
}
|
|
1877
|
+
.assistant__work > summary {
|
|
1878
|
+
font-size: 12px;
|
|
1879
|
+
color: var(--ink-3);
|
|
1880
|
+
cursor: pointer;
|
|
1881
|
+
}
|
|
1882
|
+
.assistant__work > summary:hover {
|
|
1883
|
+
color: var(--ink-2);
|
|
1884
|
+
}
|
|
1885
|
+
.assistant__took {
|
|
1886
|
+
margin: 4px 0 0;
|
|
1887
|
+
font-size: 12px;
|
|
1888
|
+
color: var(--ink-3);
|
|
1889
|
+
}
|
|
1890
|
+
.assistant__steps {
|
|
1891
|
+
margin: 5px 0 0;
|
|
1892
|
+
padding: 0 0 0 10px;
|
|
1893
|
+
border-left: 2px solid var(--hairline);
|
|
1894
|
+
list-style: none;
|
|
1895
|
+
font-size: 12px;
|
|
1896
|
+
line-height: 1.45;
|
|
1897
|
+
color: var(--ink-2);
|
|
1898
|
+
}
|
|
1899
|
+
.assistant__step {
|
|
1900
|
+
display: flex;
|
|
1901
|
+
align-items: baseline;
|
|
1902
|
+
gap: 6px;
|
|
1903
|
+
min-width: 0;
|
|
1904
|
+
}
|
|
1905
|
+
.assistant__step + .assistant__step {
|
|
1906
|
+
margin-top: 3px;
|
|
1907
|
+
}
|
|
1908
|
+
.assistant__step::before {
|
|
1909
|
+
flex: none;
|
|
1910
|
+
width: 9px;
|
|
1911
|
+
font-size: 11px;
|
|
1912
|
+
text-align: center;
|
|
1913
|
+
}
|
|
1914
|
+
.assistant__step[data-state='done']::before {
|
|
1915
|
+
content: '✓';
|
|
1916
|
+
color: var(--good-ink);
|
|
1917
|
+
}
|
|
1918
|
+
.assistant__step[data-state='failed']::before {
|
|
1919
|
+
content: '✕';
|
|
1920
|
+
color: var(--critical);
|
|
1921
|
+
}
|
|
1922
|
+
.assistant__step[data-state='running']::before {
|
|
1923
|
+
align-self: center;
|
|
1924
|
+
}
|
|
1925
|
+
.assistant__step-text {
|
|
1926
|
+
flex: none;
|
|
1927
|
+
max-width: 60%;
|
|
1928
|
+
overflow: hidden;
|
|
1929
|
+
text-overflow: ellipsis;
|
|
1930
|
+
white-space: nowrap;
|
|
1931
|
+
}
|
|
1932
|
+
.assistant__step-detail {
|
|
1933
|
+
min-width: 0;
|
|
1934
|
+
overflow: hidden;
|
|
1935
|
+
text-overflow: ellipsis;
|
|
1936
|
+
white-space: nowrap;
|
|
1937
|
+
font-size: 11.5px;
|
|
1938
|
+
color: var(--ink-3);
|
|
1939
|
+
}
|
|
1940
|
+
/* What it said on the way: its own words, set apart from the calls by having no mark. */
|
|
1941
|
+
.assistant__step--message {
|
|
1942
|
+
display: block;
|
|
1943
|
+
padding-left: 15px;
|
|
1944
|
+
font-style: italic;
|
|
1945
|
+
color: var(--ink-3);
|
|
1946
|
+
white-space: pre-line;
|
|
1947
|
+
overflow-wrap: anywhere;
|
|
1948
|
+
}
|
|
1949
|
+
|
|
1950
|
+
/* What can be done with a finished answer, without leaving the panel. */
|
|
1951
|
+
.assistant__after {
|
|
1952
|
+
display: flex;
|
|
1953
|
+
flex-wrap: wrap;
|
|
1954
|
+
gap: 6px;
|
|
1955
|
+
margin-top: 6px;
|
|
1956
|
+
}
|
|
1957
|
+
|
|
2003
1958
|
.assistant__quick {
|
|
2004
1959
|
display: flex;
|
|
2005
1960
|
flex-wrap: wrap;
|
|
2006
1961
|
gap: 6px;
|
|
2007
|
-
margin-bottom:
|
|
1962
|
+
margin-bottom: 10px;
|
|
2008
1963
|
}
|
|
2009
1964
|
|
|
2010
1965
|
.assistant__form {
|
|
@@ -2123,6 +2078,12 @@ body[data-flyout='open'] .layout__side {
|
|
|
2123
2078
|
overflow-y: auto;
|
|
2124
2079
|
padding: 16px 16px 20px;
|
|
2125
2080
|
}
|
|
2081
|
+
/* The assistant's field and its canned asks, pinned under the body that scrolls. */
|
|
2082
|
+
.flyout__footer {
|
|
2083
|
+
flex: none;
|
|
2084
|
+
padding: 12px 16px 14px;
|
|
2085
|
+
border-top: 1px solid var(--hairline);
|
|
2086
|
+
}
|
|
2126
2087
|
.flyout__detail {
|
|
2127
2088
|
margin: 0 0 22px;
|
|
2128
2089
|
font-size: 13px;
|