daily-focus 1.1.1-dev.3 → 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/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 `.timer`, `.focus-bar` and `.toast` all rendered as empty boxes
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
- * Three states used to share one look: selected, priority and running were all
914
- * "accent border", so the one that matters most was indistinguishable from a
915
- * keyboard cursor. They're now ranked — selected is quietest, running loudest.
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);
@@ -1021,6 +868,47 @@ body[data-session-active='true'] #today .item:not([data-running='true']):focus-w
1021
868
  color: var(--ink-2);
1022
869
  overflow-wrap: anywhere;
1023
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
+
1024
912
  .item__detail code {
1025
913
  padding: 1px 4px;
1026
914
  background: var(--surface-sunken);
@@ -1058,17 +946,6 @@ body[data-session-active='true'] #today .item:not([data-running='true']):focus-w
1058
946
  font-weight: 600;
1059
947
  font-variant-numeric: tabular-nums;
1060
948
  }
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
949
  .pill--objective {
1073
950
  border-color: var(--accent);
1074
951
  color: var(--accent);
@@ -1563,7 +1440,7 @@ kbd {
1563
1440
  }
1564
1441
 
1565
1442
  /*
1566
- * Which view is showing. Focus mode is scoped to Today (see the rules above).
1443
+ * Which view is showing.
1567
1444
  *
1568
1445
  * One rule per panel per view rather than `:not()`, because a view name nobody
1569
1446
  * has written a rule for should show nothing rather than everything at once.
@@ -1629,6 +1506,7 @@ body[data-view='settings'] .layout {
1629
1506
  }
1630
1507
 
1631
1508
  .item--pull[data-status='snoozed'] .item__title,
1509
+ .item--pull[data-nudged='true'] .item__title,
1632
1510
  .item--ticket[data-status='snoozed'] .item__title {
1633
1511
  color: var(--ink-3);
1634
1512
  }
@@ -1710,12 +1588,17 @@ body[data-view='settings'] .layout {
1710
1588
  padding-right: 104px;
1711
1589
  font-size: 13.5px;
1712
1590
  }
1713
- /* 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. */
1714
1592
  #tickets .item__meta--extra,
1593
+ #tickets .item__reason,
1715
1594
  #tickets .item__notes,
1716
1595
  #tickets .note-form {
1717
1596
  grid-column: 1 / -1;
1718
1597
  }
1598
+ /* The grid's gap already spaces it from the line above. */
1599
+ #tickets .item__reason {
1600
+ margin-top: 0;
1601
+ }
1719
1602
 
1720
1603
  /*
1721
1604
  * The switch between the ticket tab's two views: what is out of sync, and what
@@ -1893,9 +1776,9 @@ a.button {
1893
1776
  /*
1894
1777
  * ---------- the assistant ----------
1895
1778
  *
1896
- * A section of the item panel, so the transcript scrolls with the panel's body
1897
- * and the field sits at its foot. It used to be a box under the card with its own
1898
- * 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.
1899
1782
  */
1900
1783
 
1901
1784
  .assistant__turns {
@@ -1914,6 +1797,9 @@ a.button {
1914
1797
  color: var(--ink-1);
1915
1798
  font-weight: 600;
1916
1799
  }
1800
+ .assistant__auto {
1801
+ color: var(--accent);
1802
+ }
1917
1803
 
1918
1804
  .assistant__reply {
1919
1805
  margin-top: 5px;
@@ -1959,8 +1845,29 @@ a.button {
1959
1845
  border: 0;
1960
1846
  border-top: 1px solid var(--hairline);
1961
1847
  }
1962
- .assistant__turn[data-status='running'] .assistant__reply {
1963
- border-left-style: dashed;
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);
1964
1871
  }
1965
1872
 
1966
1873
  .assistant__status {
@@ -1971,16 +1878,25 @@ a.button {
1971
1878
  .assistant__status--bad {
1972
1879
  color: var(--critical);
1973
1880
  }
1974
- .assistant[data-running='true'] .assistant__status:not(.assistant__status--bad)::after {
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 {
1975
1888
  content: '';
1976
1889
  display: inline-block;
1977
- width: 8px;
1978
- height: 8px;
1979
- margin-left: 6px;
1890
+ box-sizing: border-box;
1891
+ width: 9px;
1892
+ height: 9px;
1980
1893
  border-radius: 50%;
1981
1894
  border: 1.5px solid var(--accent);
1982
1895
  border-top-color: transparent;
1983
1896
  animation: assistant-spin 0.9s linear infinite;
1897
+ }
1898
+ .assistant__status--working::after {
1899
+ margin-left: 6px;
1984
1900
  vertical-align: -1px;
1985
1901
  }
1986
1902
  @keyframes assistant-spin {
@@ -1989,16 +1905,105 @@ a.button {
1989
1905
  }
1990
1906
  }
1991
1907
  @media (prefers-reduced-motion: reduce) {
1992
- .assistant[data-running='true'] .assistant__status::after {
1908
+ .assistant__status--working::after,
1909
+ .assistant__step[data-state='running']::before {
1993
1910
  animation: none;
1994
1911
  }
1995
1912
  }
1996
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
+
1997
2002
  .assistant__quick {
1998
2003
  display: flex;
1999
2004
  flex-wrap: wrap;
2000
2005
  gap: 6px;
2001
- margin-bottom: 14px;
2006
+ margin-bottom: 10px;
2002
2007
  }
2003
2008
 
2004
2009
  .assistant__form {
@@ -2117,6 +2122,12 @@ body[data-flyout='open'] .layout__side {
2117
2122
  overflow-y: auto;
2118
2123
  padding: 16px 16px 20px;
2119
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
+ }
2120
2131
  .flyout__detail {
2121
2132
  margin: 0 0 22px;
2122
2133
  font-size: 13px;