@firstpick/pi-package-webui 0.1.8 → 0.2.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.
package/public/index.html CHANGED
@@ -162,14 +162,14 @@
162
162
  </button>
163
163
  </div>
164
164
  <div class="side-panel-body">
165
- <section class="side-panel-section" data-side-panel-section="controls">
165
+ <section class="side-panel-section collapsed" data-side-panel-section="controls">
166
166
  <h2>
167
- <button id="sidePanelSectionToggleControls" class="side-panel-section-toggle" type="button" aria-expanded="true" aria-controls="sidePanelSectionControls" aria-label="Collapse Controls section" title="Collapse Controls section" data-side-panel-section-toggle="controls">
167
+ <button id="sidePanelSectionToggleControls" class="side-panel-section-toggle" type="button" aria-expanded="false" aria-controls="sidePanelSectionControls" aria-label="Expand Controls section" title="Expand Controls section" data-side-panel-section-toggle="controls">
168
168
  <span class="side-panel-section-label">Controls</span>
169
169
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
170
170
  </button>
171
171
  </h2>
172
- <div id="sidePanelSectionControls" class="side-panel-section-content">
172
+ <div id="sidePanelSectionControls" class="side-panel-section-content" hidden>
173
173
  <div class="side-panel-controls">
174
174
  <div class="control-field">
175
175
  <label for="modelSelect">Model</label>
@@ -216,6 +216,10 @@
216
216
  <div id="networkStatus" class="network-status closed">Local only</div>
217
217
  <button id="openNetworkButton" type="button">Open to network</button>
218
218
  </div>
219
+ <div class="control-field server-control-field">
220
+ <label>Server</label>
221
+ <button id="stopServerButton" class="danger" type="button" title="Stop the Pi Web UI server and disconnect all browser clients" aria-label="Stop the Pi Web UI server">Stop Server</button>
222
+ </div>
219
223
  <div class="control-field notification-control-field">
220
224
  <span class="control-label">Notifications</span>
221
225
  <label class="toggle-control" for="agentDoneNotificationsToggle">
@@ -229,58 +233,72 @@
229
233
  </div>
230
234
  </div>
231
235
  </section>
232
- <section class="side-panel-section" data-side-panel-section="optional-features">
236
+ <section class="side-panel-section collapsed" data-side-panel-section="optional-features">
233
237
  <h2>
234
- <button id="sidePanelSectionToggleOptionalFeatures" class="side-panel-section-toggle" type="button" aria-expanded="true" aria-controls="sidePanelSectionOptionalFeatures" aria-label="Collapse Optional features section" title="Collapse Optional features section" data-side-panel-section-toggle="optional-features">
238
+ <button id="sidePanelSectionToggleOptionalFeatures" class="side-panel-section-toggle" type="button" aria-expanded="false" aria-controls="sidePanelSectionOptionalFeatures" aria-label="Expand Optional features section" title="Expand Optional features section" data-side-panel-section-toggle="optional-features">
235
239
  <span class="side-panel-section-label">Optional features</span>
236
240
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
237
241
  </button>
238
242
  </h2>
239
- <div id="sidePanelSectionOptionalFeatures" class="side-panel-section-content">
243
+ <div id="sidePanelSectionOptionalFeatures" class="side-panel-section-content" hidden>
240
244
  <div id="optionalFeaturesBox" class="optional-features-box muted">Checking optional features…</div>
241
245
  </div>
242
246
  </section>
243
- <section class="side-panel-section" data-side-panel-section="session">
247
+ <section class="side-panel-section collapsed" data-side-panel-section="codex-usage">
248
+ <h2>
249
+ <button id="sidePanelSectionToggleCodexUsage" class="side-panel-section-toggle" type="button" aria-expanded="false" aria-controls="sidePanelSectionCodexUsage" aria-label="Expand Codex Usage section" title="Expand Codex Usage section" data-side-panel-section-toggle="codex-usage">
250
+ <span class="side-panel-section-label">Codex Usage</span>
251
+ <span class="side-panel-section-chevron" aria-hidden="true">›</span>
252
+ </button>
253
+ </h2>
254
+ <div id="sidePanelSectionCodexUsage" class="side-panel-section-content" hidden>
255
+ <div class="codex-usage-actions">
256
+ <button id="refreshCodexUsageButton" type="button">Refresh usage</button>
257
+ </div>
258
+ <div id="codexUsageBox" class="codex-usage-box muted">Checking Codex usage…</div>
259
+ </div>
260
+ </section>
261
+ <section class="side-panel-section collapsed" data-side-panel-section="session">
244
262
  <h2>
245
- <button id="sidePanelSectionToggleSession" class="side-panel-section-toggle" type="button" aria-expanded="true" aria-controls="sidePanelSectionSession" aria-label="Collapse Session section" title="Collapse Session section" data-side-panel-section-toggle="session">
263
+ <button id="sidePanelSectionToggleSession" class="side-panel-section-toggle" type="button" aria-expanded="false" aria-controls="sidePanelSectionSession" aria-label="Expand Session section" title="Expand Session section" data-side-panel-section-toggle="session">
246
264
  <span class="side-panel-section-label">Session</span>
247
265
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
248
266
  </button>
249
267
  </h2>
250
- <div id="sidePanelSectionSession" class="side-panel-section-content">
268
+ <div id="sidePanelSectionSession" class="side-panel-section-content" hidden>
251
269
  <dl id="stateDetails" class="details"></dl>
252
270
  </div>
253
271
  </section>
254
- <section class="side-panel-section" data-side-panel-section="queue">
272
+ <section class="side-panel-section collapsed" data-side-panel-section="queue">
255
273
  <h2>
256
- <button id="sidePanelSectionToggleQueue" class="side-panel-section-toggle" type="button" aria-expanded="true" aria-controls="sidePanelSectionQueue" aria-label="Collapse Queue section" title="Collapse Queue section" data-side-panel-section-toggle="queue">
274
+ <button id="sidePanelSectionToggleQueue" class="side-panel-section-toggle" type="button" aria-expanded="false" aria-controls="sidePanelSectionQueue" aria-label="Expand Queue section" title="Expand Queue section" data-side-panel-section-toggle="queue">
257
275
  <span class="side-panel-section-label">Queue</span>
258
276
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
259
277
  </button>
260
278
  </h2>
261
- <div id="sidePanelSectionQueue" class="side-panel-section-content">
279
+ <div id="sidePanelSectionQueue" class="side-panel-section-content" hidden>
262
280
  <div id="queueBox" class="queue-box muted">No queued messages.</div>
263
281
  </div>
264
282
  </section>
265
- <section class="side-panel-section" data-side-panel-section="commands">
283
+ <section class="side-panel-section collapsed" data-side-panel-section="commands">
266
284
  <h2>
267
- <button id="sidePanelSectionToggleCommands" class="side-panel-section-toggle" type="button" aria-expanded="true" aria-controls="sidePanelSectionCommands" aria-label="Collapse Commands section" title="Collapse Commands section" data-side-panel-section-toggle="commands">
285
+ <button id="sidePanelSectionToggleCommands" class="side-panel-section-toggle" type="button" aria-expanded="false" aria-controls="sidePanelSectionCommands" aria-label="Expand Commands section" title="Expand Commands section" data-side-panel-section-toggle="commands">
268
286
  <span class="side-panel-section-label">Commands</span>
269
287
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
270
288
  </button>
271
289
  </h2>
272
- <div id="sidePanelSectionCommands" class="side-panel-section-content">
290
+ <div id="sidePanelSectionCommands" class="side-panel-section-content" hidden>
273
291
  <div id="commandsBox" class="commands-box muted">Loading…</div>
274
292
  </div>
275
293
  </section>
276
- <section class="side-panel-section" data-side-panel-section="events">
294
+ <section class="side-panel-section collapsed" data-side-panel-section="events">
277
295
  <h2>
278
- <button id="sidePanelSectionToggleEvents" class="side-panel-section-toggle" type="button" aria-expanded="true" aria-controls="sidePanelSectionEvents" aria-label="Collapse Events section" title="Collapse Events section" data-side-panel-section-toggle="events">
296
+ <button id="sidePanelSectionToggleEvents" class="side-panel-section-toggle" type="button" aria-expanded="false" aria-controls="sidePanelSectionEvents" aria-label="Expand Events section" title="Expand Events section" data-side-panel-section-toggle="events">
279
297
  <span class="side-panel-section-label">Events</span>
280
298
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
281
299
  </button>
282
300
  </h2>
283
- <div id="sidePanelSectionEvents" class="side-panel-section-content">
301
+ <div id="sidePanelSectionEvents" class="side-panel-section-content" hidden>
284
302
  <div id="eventLog" class="event-log"></div>
285
303
  </div>
286
304
  </section>
package/public/styles.css CHANGED
@@ -808,6 +808,83 @@ body.side-panel-collapsed .terminal-tabs-shell {
808
808
  background: rgba(var(--ctp-crust-rgb), 0.46);
809
809
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.035), 0 0 1rem rgba(148, 226, 213, 0.05);
810
810
  }
811
+ .codex-usage-actions {
812
+ display: flex;
813
+ justify-content: flex-end;
814
+ margin-bottom: 0.48rem;
815
+ }
816
+ .codex-usage-actions button {
817
+ min-height: 34px;
818
+ padding: 0.32rem 0.58rem;
819
+ font-size: 0.72rem;
820
+ }
821
+ .codex-usage-box {
822
+ display: grid;
823
+ gap: 0.58rem;
824
+ padding: 0.72rem;
825
+ border: 1px solid rgba(180, 190, 254, 0.16);
826
+ border-radius: 0.85rem;
827
+ background: rgba(var(--ctp-crust-rgb), 0.50);
828
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.035), 0 0 1rem rgba(203, 166, 247, 0.05);
829
+ }
830
+ .codex-usage-summary {
831
+ display: flex;
832
+ flex-wrap: wrap;
833
+ justify-content: space-between;
834
+ gap: 0.35rem 0.55rem;
835
+ align-items: baseline;
836
+ }
837
+ .codex-usage-plan {
838
+ color: rgba(var(--ctp-text-rgb), 0.94);
839
+ font-weight: 900;
840
+ }
841
+ .codex-usage-fetched,
842
+ .codex-usage-detail,
843
+ .codex-usage-reset {
844
+ color: rgba(var(--ctp-subtext-rgb), 0.70);
845
+ font-size: 0.72rem;
846
+ line-height: 1.35;
847
+ }
848
+ .codex-usage-unavailable,
849
+ .codex-usage-warning {
850
+ color: var(--ctp-yellow);
851
+ font-weight: 800;
852
+ }
853
+ .codex-usage-bucket {
854
+ display: grid;
855
+ gap: 0.32rem;
856
+ }
857
+ .codex-usage-row {
858
+ display: flex;
859
+ justify-content: space-between;
860
+ gap: 0.6rem;
861
+ align-items: center;
862
+ }
863
+ .codex-usage-label {
864
+ min-width: 0;
865
+ color: rgba(var(--ctp-text-rgb), 0.86);
866
+ font-size: 0.78rem;
867
+ font-weight: 800;
868
+ overflow-wrap: anywhere;
869
+ }
870
+ .codex-usage-percent {
871
+ color: var(--ctp-teal);
872
+ font-size: 0.82rem;
873
+ }
874
+ .codex-usage-meter {
875
+ overflow: hidden;
876
+ height: 0.5rem;
877
+ border: 1px solid rgba(180, 190, 254, 0.14);
878
+ border-radius: 999px;
879
+ background: rgba(var(--ctp-surface-rgb), 0.26);
880
+ }
881
+ .codex-usage-meter-fill {
882
+ display: block;
883
+ height: 100%;
884
+ border-radius: inherit;
885
+ background: linear-gradient(90deg, var(--ctp-green), var(--ctp-yellow), var(--ctp-peach));
886
+ box-shadow: 0 0 0.85rem rgba(148, 226, 213, 0.20);
887
+ }
811
888
  .optional-feature-row {
812
889
  display: grid;
813
890
  grid-template-columns: minmax(0, 1fr) auto;
@@ -1608,19 +1685,26 @@ button.footer-meta {
1608
1685
  display: grid;
1609
1686
  gap: 0.62rem;
1610
1687
  padding: 0.72rem;
1688
+ overflow: hidden;
1611
1689
  white-space: normal;
1612
- border-color: rgba(245, 194, 231, 0.34);
1690
+ border-color: rgba(245, 194, 231, 0.62);
1691
+ border-left: 0.28rem solid rgba(245, 194, 231, 0.88);
1613
1692
  background:
1614
- radial-gradient(circle at 4% 0%, rgba(245, 194, 231, 0.16), transparent 16rem),
1615
- radial-gradient(circle at 96% 12%, rgba(148, 226, 213, 0.12), transparent 18rem),
1616
- linear-gradient(145deg, rgba(var(--ctp-crust-rgb), 0.92), rgba(var(--ctp-base-rgb), 0.78));
1693
+ radial-gradient(circle at 4% 0%, rgba(245, 194, 231, 0.22), transparent 16rem),
1694
+ radial-gradient(circle at 96% 12%, rgba(148, 226, 213, 0.14), transparent 18rem),
1695
+ linear-gradient(145deg, rgba(var(--ctp-crust-rgb), 0.98), rgba(var(--ctp-mantle-rgb), 0.92));
1696
+ box-shadow:
1697
+ 0 0 0 1px rgba(var(--ctp-crust-rgb), 0.94),
1698
+ 0 1rem 2.2rem rgba(0, 0, 0, 0.36),
1699
+ inset 0 0 1.2rem rgba(245, 194, 231, 0.07);
1617
1700
  }
1618
1701
  .release-aur-widget {
1619
- border-color: rgba(250, 179, 135, 0.34);
1702
+ border-color: rgba(250, 179, 135, 0.62);
1703
+ border-left-color: rgba(250, 179, 135, 0.88);
1620
1704
  background:
1621
- radial-gradient(circle at 4% 0%, rgba(250, 179, 135, 0.14), transparent 16rem),
1622
- radial-gradient(circle at 96% 12%, rgba(166, 227, 161, 0.12), transparent 18rem),
1623
- linear-gradient(145deg, rgba(var(--ctp-crust-rgb), 0.92), rgba(var(--ctp-base-rgb), 0.78));
1705
+ radial-gradient(circle at 4% 0%, rgba(250, 179, 135, 0.20), transparent 16rem),
1706
+ radial-gradient(circle at 96% 12%, rgba(166, 227, 161, 0.14), transparent 18rem),
1707
+ linear-gradient(145deg, rgba(var(--ctp-crust-rgb), 0.98), rgba(var(--ctp-mantle-rgb), 0.92));
1624
1708
  }
1625
1709
  .release-aur-widget .release-npm-kicker { color: var(--ctp-peach); }
1626
1710
  .release-npm-header {
@@ -1664,9 +1748,9 @@ button.footer-meta {
1664
1748
  padding: 0.16rem 0.5rem;
1665
1749
  overflow: hidden;
1666
1750
  color: var(--ctp-yellow);
1667
- border: 1px solid rgba(249, 226, 175, 0.22);
1751
+ border: 1px solid rgba(249, 226, 175, 0.32);
1668
1752
  border-radius: 999px;
1669
- background: rgba(var(--ctp-crust-rgb), 0.48);
1753
+ background: rgba(var(--ctp-crust-rgb), 0.72);
1670
1754
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
1671
1755
  font-size: 0.72rem;
1672
1756
  font-weight: 800;
@@ -1681,61 +1765,150 @@ button.footer-meta {
1681
1765
  font-size: 0.76rem;
1682
1766
  font-weight: 850;
1683
1767
  }
1768
+ .release-npm-stream-header {
1769
+ display: flex;
1770
+ align-items: center;
1771
+ gap: 0.46rem;
1772
+ min-width: 0;
1773
+ padding: 0.36rem 0.52rem;
1774
+ border: 1px solid rgba(137, 180, 250, 0.26);
1775
+ border-radius: 0.62rem;
1776
+ color: rgba(var(--ctp-text-rgb), 0.92);
1777
+ background: rgba(var(--ctp-crust-rgb), 0.76);
1778
+ box-shadow: inset 0 0 0 1px rgba(var(--ctp-text-rgb), 0.04);
1779
+ font-size: 0.72rem;
1780
+ font-weight: 900;
1781
+ letter-spacing: 0.09em;
1782
+ text-transform: uppercase;
1783
+ }
1784
+ .release-npm-stream-dot {
1785
+ flex: 0 0 auto;
1786
+ width: 0.55rem;
1787
+ height: 0.55rem;
1788
+ border-radius: 999px;
1789
+ background: var(--ctp-green);
1790
+ box-shadow: 0 0 0.72rem rgba(166, 227, 161, 0.62);
1791
+ }
1792
+ .release-npm-stream-dot.live { animation: release-npm-live-pulse 1.35s ease-in-out infinite; }
1793
+ .release-npm-stream-title {
1794
+ min-width: 0;
1795
+ overflow: hidden;
1796
+ text-overflow: ellipsis;
1797
+ white-space: nowrap;
1798
+ }
1799
+ .release-npm-stream-count {
1800
+ margin-left: auto;
1801
+ color: rgba(var(--ctp-subtext-rgb), 0.84);
1802
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
1803
+ font-size: 0.68rem;
1804
+ font-weight: 850;
1805
+ letter-spacing: 0;
1806
+ text-transform: none;
1807
+ white-space: nowrap;
1808
+ }
1684
1809
  .release-npm-terminal {
1685
1810
  max-height: min(34rem, 42vh);
1686
1811
  min-height: 5.25rem;
1687
1812
  overflow: auto;
1688
- padding: 0.7rem;
1689
- border: 1px solid rgba(180, 190, 254, 0.16);
1813
+ padding: 0.78rem 0.62rem;
1814
+ border: 1px solid rgba(137, 180, 250, 0.42);
1690
1815
  border-radius: 0.78rem;
1816
+ color: rgba(var(--ctp-text-rgb), 0.96);
1691
1817
  background:
1692
- linear-gradient(180deg, rgba(var(--ctp-crust-rgb), 0.82), rgba(var(--ctp-mantle-rgb), 0.62)),
1693
- radial-gradient(circle at 0 0, rgba(148, 226, 213, 0.07), transparent 15rem);
1694
- box-shadow: inset 0 0 1.5rem rgba(var(--ctp-crust-rgb), 0.36);
1818
+ linear-gradient(180deg, rgba(3, 4, 10, 0.98), rgba(var(--ctp-crust-rgb), 0.96)),
1819
+ radial-gradient(circle at 0 0, rgba(148, 226, 213, 0.10), transparent 15rem);
1820
+ box-shadow:
1821
+ inset 0 0 0 1px rgba(var(--ctp-text-rgb), 0.05),
1822
+ inset 0 0 1.7rem rgba(0, 0, 0, 0.42);
1695
1823
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
1696
1824
  font-size: 0.78rem;
1697
- line-height: 1.42;
1825
+ line-height: 1.5;
1698
1826
  overscroll-behavior: contain;
1699
1827
  }
1700
1828
  .release-npm-line {
1701
- min-width: max-content;
1702
- min-height: 1.42em;
1703
- color: rgba(var(--ctp-text-rgb), 0.88);
1829
+ display: block;
1830
+ width: max-content;
1831
+ min-width: 100%;
1832
+ min-height: 1.5em;
1833
+ margin: 0 -0.18rem;
1834
+ padding: 0 0.42rem;
1835
+ border-left: 2px solid rgba(var(--ctp-overlay-rgb), 0.24);
1836
+ color: rgba(var(--ctp-text-rgb), 0.94);
1704
1837
  white-space: pre;
1705
1838
  }
1706
- .release-npm-line.command { color: var(--ctp-sky); }
1707
- .release-npm-line.target { color: var(--ctp-pink); font-weight: 850; }
1708
- .release-npm-line.pass { color: var(--ctp-green); }
1709
- .release-npm-line.fail { color: var(--ctp-red); }
1710
- .release-npm-line.warn { color: var(--ctp-yellow); }
1711
- .release-npm-line.info { color: rgba(var(--ctp-subtext-rgb), 0.80); }
1712
- .release-npm-line.event { color: var(--ctp-mauve); }
1839
+ .release-npm-line:nth-child(odd) { background: rgba(var(--ctp-text-rgb), 0.025); }
1840
+ .release-npm-line.command { color: var(--ctp-sky); border-left-color: rgba(137, 220, 235, 0.68); }
1841
+ .release-npm-line.target { color: var(--ctp-pink); border-left-color: rgba(245, 194, 231, 0.72); font-weight: 850; }
1842
+ .release-npm-line.pass { color: var(--ctp-green); border-left-color: rgba(166, 227, 161, 0.72); }
1843
+ .release-npm-line.fail { color: var(--ctp-red); border-left-color: rgba(243, 139, 168, 0.78); }
1844
+ .release-npm-line.warn { color: var(--ctp-yellow); border-left-color: rgba(249, 226, 175, 0.74); }
1845
+ .release-npm-line.info { color: rgba(var(--ctp-subtext-rgb), 0.88); border-left-color: rgba(186, 194, 222, 0.44); }
1846
+ .release-npm-line.event { color: var(--ctp-mauve); border-left-color: rgba(203, 166, 247, 0.72); }
1713
1847
  .release-npm-controls {
1714
- color: rgba(var(--ctp-subtext-rgb), 0.72);
1848
+ color: rgba(var(--ctp-subtext-rgb), 0.78);
1715
1849
  font-size: 0.75rem;
1716
1850
  line-height: 1.35;
1717
1851
  }
1718
1852
  .release-npm-log-widget .release-npm-terminal {
1719
1853
  max-height: min(42rem, 52vh);
1720
1854
  }
1855
+ @keyframes release-npm-live-pulse {
1856
+ 0%, 100% { opacity: 0.58; transform: scale(0.82); }
1857
+ 50% { opacity: 1; transform: scale(1.08); }
1858
+ }
1859
+ @media (prefers-reduced-motion: reduce) {
1860
+ .release-npm-stream-dot.live { animation: none; }
1861
+ }
1721
1862
  .todo-widget {
1722
1863
  display: grid;
1723
- gap: 0.52rem;
1724
- padding: 0.68rem 0.76rem;
1864
+ gap: 0;
1865
+ margin: 0.16rem 0;
1866
+ padding: 0.42rem 0.5rem;
1725
1867
  white-space: normal;
1726
- border-color: rgba(137, 180, 250, 0.32);
1868
+ border-color: rgba(137, 180, 250, 0.28);
1727
1869
  background:
1728
- radial-gradient(circle at 4% 0%, rgba(137, 180, 250, 0.18), transparent 12rem),
1729
- linear-gradient(145deg, rgba(var(--ctp-crust-rgb), 0.88), rgba(var(--ctp-base-rgb), 0.74));
1870
+ radial-gradient(circle at 4% 0%, rgba(137, 180, 250, 0.14), transparent 10rem),
1871
+ linear-gradient(145deg, rgba(var(--ctp-crust-rgb), 0.86), rgba(var(--ctp-base-rgb), 0.68));
1730
1872
  }
1873
+ .todo-widget[open] {
1874
+ gap: 0.36rem;
1875
+ padding-bottom: 0.5rem;
1876
+ }
1877
+ .todo-widget-summary {
1878
+ display: grid;
1879
+ gap: 0.32rem;
1880
+ min-width: 0;
1881
+ color: rgba(var(--ctp-text-rgb), 0.84);
1882
+ cursor: pointer;
1883
+ list-style: none;
1884
+ }
1885
+ .todo-widget-summary::-webkit-details-marker { display: none; }
1731
1886
  .todo-widget-header {
1732
1887
  display: flex;
1733
1888
  align-items: center;
1734
- gap: 0.48rem;
1889
+ gap: 0.34rem;
1735
1890
  min-width: 0;
1736
1891
  }
1892
+ .todo-widget-toggle {
1893
+ display: inline-grid;
1894
+ place-items: center;
1895
+ width: 1rem;
1896
+ height: 1rem;
1897
+ flex: 0 0 auto;
1898
+ color: rgba(var(--ctp-subtext-rgb), 0.78);
1899
+ font-size: 0.98rem;
1900
+ font-weight: 950;
1901
+ line-height: 1;
1902
+ transition: transform 0.16s ease, color 0.16s ease;
1903
+ }
1904
+ .todo-widget[open] .todo-widget-toggle {
1905
+ color: var(--ctp-blue);
1906
+ transform: rotate(90deg);
1907
+ }
1737
1908
  .todo-widget-title {
1909
+ min-width: 0;
1738
1910
  color: var(--ctp-blue);
1911
+ font-size: 0.72rem;
1739
1912
  font-weight: 950;
1740
1913
  letter-spacing: 0.08em;
1741
1914
  text-transform: uppercase;
@@ -1744,58 +1917,68 @@ button.footer-meta {
1744
1917
  .todo-widget-meta {
1745
1918
  display: inline-flex;
1746
1919
  align-items: center;
1747
- min-height: 1.35rem;
1748
- padding: 0.12rem 0.42rem;
1749
- border: 1px solid rgba(137, 180, 250, 0.24);
1920
+ min-height: 1.08rem;
1921
+ padding: 0.06rem 0.34rem;
1922
+ border: 1px solid rgba(137, 180, 250, 0.22);
1750
1923
  border-radius: 999px;
1751
- background: rgba(var(--ctp-crust-rgb), 0.48);
1752
- font-size: 0.72rem;
1924
+ background: rgba(var(--ctp-crust-rgb), 0.44);
1925
+ font-size: 0.66rem;
1753
1926
  font-weight: 850;
1927
+ line-height: 1;
1754
1928
  }
1755
1929
  .todo-widget-count { color: var(--ctp-green); }
1756
1930
  .todo-widget-meta { color: var(--ctp-yellow); }
1757
1931
  .todo-widget-progress {
1758
- height: 0.38rem;
1932
+ height: 0.26rem;
1759
1933
  overflow: hidden;
1760
1934
  border-radius: 999px;
1761
- background: rgba(var(--ctp-surface-rgb), 0.78);
1762
- box-shadow: inset 0 0 0 1px rgba(180, 190, 254, 0.10);
1935
+ background: rgba(var(--ctp-surface-rgb), 0.70);
1936
+ box-shadow: inset 0 0 0 1px rgba(180, 190, 254, 0.08);
1763
1937
  }
1764
1938
  .todo-widget-progress-fill {
1765
1939
  display: block;
1766
1940
  height: 100%;
1767
1941
  border-radius: inherit;
1768
1942
  background: linear-gradient(90deg, var(--ctp-blue), var(--ctp-teal), var(--ctp-green));
1769
- box-shadow: 0 0 0.85rem rgba(148, 226, 213, 0.42);
1943
+ box-shadow: 0 0 0.65rem rgba(148, 226, 213, 0.34);
1944
+ }
1945
+ .todo-widget-body {
1946
+ display: grid;
1947
+ gap: 0.3rem;
1948
+ max-height: min(13rem, 28vh);
1949
+ overflow: auto;
1950
+ padding-right: 0.12rem;
1951
+ overscroll-behavior: contain;
1770
1952
  }
1771
1953
  .todo-widget-list {
1772
1954
  display: grid;
1773
- gap: 0.34rem;
1955
+ gap: 0.24rem;
1774
1956
  margin: 0;
1775
1957
  padding: 0;
1776
1958
  list-style: none;
1777
1959
  }
1778
1960
  .todo-widget-item {
1779
1961
  display: grid;
1780
- grid-template-columns: 1.35rem minmax(0, 1fr);
1962
+ grid-template-columns: 1.05rem minmax(0, 1fr);
1781
1963
  align-items: start;
1782
- gap: 0.48rem;
1964
+ gap: 0.34rem;
1783
1965
  min-width: 0;
1784
- color: rgba(var(--ctp-text-rgb), 0.92);
1966
+ color: rgba(var(--ctp-text-rgb), 0.90);
1967
+ font-size: 0.78rem;
1785
1968
  }
1786
1969
  .todo-widget-marker {
1787
1970
  display: inline-grid;
1788
1971
  place-items: center;
1789
- width: 1.12rem;
1790
- height: 1.12rem;
1791
- margin-top: 0.06rem;
1792
- border: 1px solid rgba(180, 190, 254, 0.32);
1793
- border-radius: 0.34rem;
1972
+ width: 0.92rem;
1973
+ height: 0.92rem;
1974
+ margin-top: 0.08rem;
1975
+ border: 1px solid rgba(180, 190, 254, 0.30);
1976
+ border-radius: 0.3rem;
1794
1977
  color: #11111b;
1795
- font-size: 0.74rem;
1978
+ font-size: 0.62rem;
1796
1979
  font-weight: 950;
1797
1980
  line-height: 1;
1798
- background: rgba(var(--ctp-surface-rgb), 0.88);
1981
+ background: rgba(var(--ctp-surface-rgb), 0.86);
1799
1982
  }
1800
1983
  .todo-widget-item.done .todo-widget-marker {
1801
1984
  border-color: transparent;
@@ -1813,11 +1996,11 @@ button.footer-meta {
1813
1996
  .todo-widget-text {
1814
1997
  min-width: 0;
1815
1998
  overflow-wrap: anywhere;
1816
- line-height: 1.35;
1999
+ line-height: 1.28;
1817
2000
  }
1818
2001
  .todo-widget-footer {
1819
2002
  color: rgba(var(--ctp-subtext-rgb), 0.64);
1820
- font-size: 0.72rem;
2003
+ font-size: 0.68rem;
1821
2004
  }
1822
2005
  .chat {
1823
2006
  position: relative;
@@ -1923,11 +2106,12 @@ button.footer-meta {
1923
2106
  box-shadow: 0 0.8rem 1.8rem rgba(var(--ctp-crust-rgb), 0.34), inset 0 1px 0 rgba(255,255,255,0.045);
1924
2107
  }
1925
2108
  .message.action-enter {
1926
- animation: action-card-slide-in 180ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
2109
+ animation: action-card-slide-in 340ms cubic-bezier(0.16, 1, 0.3, 1) both;
1927
2110
  }
1928
2111
  @keyframes action-card-slide-in {
1929
- from { opacity: 0; transform: translateY(0.42rem); }
1930
- to { opacity: 1; transform: translateY(0); }
2112
+ 0% { opacity: 0; transform: translate3d(0, 1.45rem, 0) scale(0.985); }
2113
+ 60% { opacity: 1; }
2114
+ 100% { opacity: 1; transform: translate3d(0, 0, 0) scale(1); }
1931
2115
  }
1932
2116
  .message::before {
1933
2117
  content: "";
@@ -1959,11 +2143,6 @@ button.footer-meta {
1959
2143
  color: var(--ctp-mauve);
1960
2144
  text-shadow: 0 0 0.8rem rgba(203, 166, 247, 0.22);
1961
2145
  }
1962
- .message.thinking.streaming.complete .message-role::after {
1963
- content: " done";
1964
- color: var(--ctp-green);
1965
- text-shadow: 0 0 0.7rem var(--glow-teal);
1966
- }
1967
2146
  .message.extension,
1968
2147
  .message.native,
1969
2148
  .message.notice {
@@ -2457,10 +2636,6 @@ summary { cursor: pointer; color: var(--warning); }
2457
2636
  letter-spacing: 0.14em;
2458
2637
  text-shadow: 0 0 0.7rem var(--glow-teal);
2459
2638
  }
2460
- .thinking-block.streaming-thinking.complete > summary::after {
2461
- content: " done";
2462
- color: var(--ctp-green);
2463
- }
2464
2639
  .thinking-text {
2465
2640
  color: rgba(var(--ctp-text-rgb), 0.82);
2466
2641
  margin-top: 0.55rem;
@@ -3470,33 +3645,62 @@ summary { cursor: pointer; color: var(--warning); }
3470
3645
  }
3471
3646
  .release-npm-meta,
3472
3647
  .release-npm-actions { justify-content: flex-start; }
3648
+ .release-npm-stream-header {
3649
+ padding: 0.3rem 0.42rem;
3650
+ font-size: 0.66rem;
3651
+ letter-spacing: 0.07em;
3652
+ }
3653
+ .release-npm-stream-count { font-size: 0.62rem; }
3473
3654
  .release-npm-terminal {
3474
3655
  max-height: min(28dvh, 16rem);
3475
3656
  min-height: 4rem;
3476
- padding: 0.52rem;
3657
+ padding: 0.52rem 0.42rem;
3477
3658
  font-size: 0.72rem;
3478
3659
  }
3660
+ .release-npm-line {
3661
+ margin: 0 -0.12rem;
3662
+ padding: 0 0.32rem;
3663
+ }
3479
3664
  .release-npm-pill { max-width: 100%; }
3480
3665
  .todo-widget {
3481
- gap: 0.38rem;
3482
- margin: 0.2rem 0;
3483
- padding: 0.52rem 0.58rem;
3484
- border-radius: 0.72rem;
3666
+ gap: 0;
3667
+ margin: 0.12rem 0;
3668
+ padding: 0.36rem 0.42rem;
3669
+ border-radius: 0.66rem;
3670
+ }
3671
+ .todo-widget[open] {
3672
+ gap: 0.28rem;
3673
+ padding-bottom: 0.42rem;
3485
3674
  }
3486
- .todo-widget-header { gap: 0.34rem; }
3487
- .todo-widget-title { font-size: 0.7rem; }
3675
+ .todo-widget-summary { gap: 0.24rem; }
3676
+ .todo-widget-header { gap: 0.26rem; }
3677
+ .todo-widget-toggle {
3678
+ width: 0.9rem;
3679
+ height: 0.9rem;
3680
+ font-size: 0.88rem;
3681
+ }
3682
+ .todo-widget-title { font-size: 0.66rem; }
3488
3683
  .todo-widget-count,
3489
- .todo-widget-meta { font-size: 0.66rem; }
3490
- .todo-widget-list { gap: 0.26rem; }
3684
+ .todo-widget-meta {
3685
+ min-height: 0.98rem;
3686
+ padding: 0.04rem 0.28rem;
3687
+ font-size: 0.6rem;
3688
+ }
3689
+ .todo-widget-progress { height: 0.22rem; }
3690
+ .todo-widget-body {
3691
+ gap: 0.24rem;
3692
+ max-height: min(9rem, 20dvh);
3693
+ }
3694
+ .todo-widget-list { gap: 0.2rem; }
3491
3695
  .todo-widget-item {
3492
- grid-template-columns: 1.12rem minmax(0, 1fr);
3493
- gap: 0.36rem;
3494
- font-size: 0.78rem;
3696
+ grid-template-columns: 0.98rem minmax(0, 1fr);
3697
+ gap: 0.28rem;
3698
+ font-size: 0.74rem;
3495
3699
  }
3496
3700
  .todo-widget-marker {
3497
- width: 0.96rem;
3498
- height: 0.96rem;
3499
- font-size: 0.66rem;
3701
+ width: 0.82rem;
3702
+ height: 0.82rem;
3703
+ font-size: 0.58rem;
3500
3704
  }
3501
3705
  .chat {
3502
3706
  padding: 0.62rem 0.58rem;