@firstpick/pi-package-webui 0.1.9 → 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,72 +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="codex-usage">
247
+ <section class="side-panel-section collapsed" data-side-panel-section="codex-usage">
244
248
  <h2>
245
- <button id="sidePanelSectionToggleCodexUsage" class="side-panel-section-toggle" type="button" aria-expanded="true" aria-controls="sidePanelSectionCodexUsage" aria-label="Collapse Codex Usage section" title="Collapse Codex Usage section" data-side-panel-section-toggle="codex-usage">
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">
246
250
  <span class="side-panel-section-label">Codex Usage</span>
247
251
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
248
252
  </button>
249
253
  </h2>
250
- <div id="sidePanelSectionCodexUsage" class="side-panel-section-content">
254
+ <div id="sidePanelSectionCodexUsage" class="side-panel-section-content" hidden>
251
255
  <div class="codex-usage-actions">
252
256
  <button id="refreshCodexUsageButton" type="button">Refresh usage</button>
253
257
  </div>
254
258
  <div id="codexUsageBox" class="codex-usage-box muted">Checking Codex usage…</div>
255
259
  </div>
256
260
  </section>
257
- <section class="side-panel-section" data-side-panel-section="session">
261
+ <section class="side-panel-section collapsed" data-side-panel-section="session">
258
262
  <h2>
259
- <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">
260
264
  <span class="side-panel-section-label">Session</span>
261
265
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
262
266
  </button>
263
267
  </h2>
264
- <div id="sidePanelSectionSession" class="side-panel-section-content">
268
+ <div id="sidePanelSectionSession" class="side-panel-section-content" hidden>
265
269
  <dl id="stateDetails" class="details"></dl>
266
270
  </div>
267
271
  </section>
268
- <section class="side-panel-section" data-side-panel-section="queue">
272
+ <section class="side-panel-section collapsed" data-side-panel-section="queue">
269
273
  <h2>
270
- <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">
271
275
  <span class="side-panel-section-label">Queue</span>
272
276
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
273
277
  </button>
274
278
  </h2>
275
- <div id="sidePanelSectionQueue" class="side-panel-section-content">
279
+ <div id="sidePanelSectionQueue" class="side-panel-section-content" hidden>
276
280
  <div id="queueBox" class="queue-box muted">No queued messages.</div>
277
281
  </div>
278
282
  </section>
279
- <section class="side-panel-section" data-side-panel-section="commands">
283
+ <section class="side-panel-section collapsed" data-side-panel-section="commands">
280
284
  <h2>
281
- <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">
282
286
  <span class="side-panel-section-label">Commands</span>
283
287
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
284
288
  </button>
285
289
  </h2>
286
- <div id="sidePanelSectionCommands" class="side-panel-section-content">
290
+ <div id="sidePanelSectionCommands" class="side-panel-section-content" hidden>
287
291
  <div id="commandsBox" class="commands-box muted">Loading…</div>
288
292
  </div>
289
293
  </section>
290
- <section class="side-panel-section" data-side-panel-section="events">
294
+ <section class="side-panel-section collapsed" data-side-panel-section="events">
291
295
  <h2>
292
- <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">
293
297
  <span class="side-panel-section-label">Events</span>
294
298
  <span class="side-panel-section-chevron" aria-hidden="true">›</span>
295
299
  </button>
296
300
  </h2>
297
- <div id="sidePanelSectionEvents" class="side-panel-section-content">
301
+ <div id="sidePanelSectionEvents" class="side-panel-section-content" hidden>
298
302
  <div id="eventLog" class="event-log"></div>
299
303
  </div>
300
304
  </section>
package/public/styles.css CHANGED
@@ -1685,19 +1685,26 @@ button.footer-meta {
1685
1685
  display: grid;
1686
1686
  gap: 0.62rem;
1687
1687
  padding: 0.72rem;
1688
+ overflow: hidden;
1688
1689
  white-space: normal;
1689
- 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);
1690
1692
  background:
1691
- radial-gradient(circle at 4% 0%, rgba(245, 194, 231, 0.16), transparent 16rem),
1692
- radial-gradient(circle at 96% 12%, rgba(148, 226, 213, 0.12), transparent 18rem),
1693
- 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);
1694
1700
  }
1695
1701
  .release-aur-widget {
1696
- 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);
1697
1704
  background:
1698
- radial-gradient(circle at 4% 0%, rgba(250, 179, 135, 0.14), transparent 16rem),
1699
- radial-gradient(circle at 96% 12%, rgba(166, 227, 161, 0.12), transparent 18rem),
1700
- 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));
1701
1708
  }
1702
1709
  .release-aur-widget .release-npm-kicker { color: var(--ctp-peach); }
1703
1710
  .release-npm-header {
@@ -1741,9 +1748,9 @@ button.footer-meta {
1741
1748
  padding: 0.16rem 0.5rem;
1742
1749
  overflow: hidden;
1743
1750
  color: var(--ctp-yellow);
1744
- border: 1px solid rgba(249, 226, 175, 0.22);
1751
+ border: 1px solid rgba(249, 226, 175, 0.32);
1745
1752
  border-radius: 999px;
1746
- background: rgba(var(--ctp-crust-rgb), 0.48);
1753
+ background: rgba(var(--ctp-crust-rgb), 0.72);
1747
1754
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
1748
1755
  font-size: 0.72rem;
1749
1756
  font-weight: 800;
@@ -1758,61 +1765,150 @@ button.footer-meta {
1758
1765
  font-size: 0.76rem;
1759
1766
  font-weight: 850;
1760
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
+ }
1761
1809
  .release-npm-terminal {
1762
1810
  max-height: min(34rem, 42vh);
1763
1811
  min-height: 5.25rem;
1764
1812
  overflow: auto;
1765
- padding: 0.7rem;
1766
- 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);
1767
1815
  border-radius: 0.78rem;
1816
+ color: rgba(var(--ctp-text-rgb), 0.96);
1768
1817
  background:
1769
- linear-gradient(180deg, rgba(var(--ctp-crust-rgb), 0.82), rgba(var(--ctp-mantle-rgb), 0.62)),
1770
- radial-gradient(circle at 0 0, rgba(148, 226, 213, 0.07), transparent 15rem);
1771
- 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);
1772
1823
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
1773
1824
  font-size: 0.78rem;
1774
- line-height: 1.42;
1825
+ line-height: 1.5;
1775
1826
  overscroll-behavior: contain;
1776
1827
  }
1777
1828
  .release-npm-line {
1778
- min-width: max-content;
1779
- min-height: 1.42em;
1780
- 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);
1781
1837
  white-space: pre;
1782
1838
  }
1783
- .release-npm-line.command { color: var(--ctp-sky); }
1784
- .release-npm-line.target { color: var(--ctp-pink); font-weight: 850; }
1785
- .release-npm-line.pass { color: var(--ctp-green); }
1786
- .release-npm-line.fail { color: var(--ctp-red); }
1787
- .release-npm-line.warn { color: var(--ctp-yellow); }
1788
- .release-npm-line.info { color: rgba(var(--ctp-subtext-rgb), 0.80); }
1789
- .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); }
1790
1847
  .release-npm-controls {
1791
- color: rgba(var(--ctp-subtext-rgb), 0.72);
1848
+ color: rgba(var(--ctp-subtext-rgb), 0.78);
1792
1849
  font-size: 0.75rem;
1793
1850
  line-height: 1.35;
1794
1851
  }
1795
1852
  .release-npm-log-widget .release-npm-terminal {
1796
1853
  max-height: min(42rem, 52vh);
1797
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
+ }
1798
1862
  .todo-widget {
1799
1863
  display: grid;
1800
- gap: 0.52rem;
1801
- padding: 0.68rem 0.76rem;
1864
+ gap: 0;
1865
+ margin: 0.16rem 0;
1866
+ padding: 0.42rem 0.5rem;
1802
1867
  white-space: normal;
1803
- border-color: rgba(137, 180, 250, 0.32);
1868
+ border-color: rgba(137, 180, 250, 0.28);
1804
1869
  background:
1805
- radial-gradient(circle at 4% 0%, rgba(137, 180, 250, 0.18), transparent 12rem),
1806
- 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));
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;
1807
1884
  }
1885
+ .todo-widget-summary::-webkit-details-marker { display: none; }
1808
1886
  .todo-widget-header {
1809
1887
  display: flex;
1810
1888
  align-items: center;
1811
- gap: 0.48rem;
1889
+ gap: 0.34rem;
1812
1890
  min-width: 0;
1813
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
+ }
1814
1908
  .todo-widget-title {
1909
+ min-width: 0;
1815
1910
  color: var(--ctp-blue);
1911
+ font-size: 0.72rem;
1816
1912
  font-weight: 950;
1817
1913
  letter-spacing: 0.08em;
1818
1914
  text-transform: uppercase;
@@ -1821,58 +1917,68 @@ button.footer-meta {
1821
1917
  .todo-widget-meta {
1822
1918
  display: inline-flex;
1823
1919
  align-items: center;
1824
- min-height: 1.35rem;
1825
- padding: 0.12rem 0.42rem;
1826
- 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);
1827
1923
  border-radius: 999px;
1828
- background: rgba(var(--ctp-crust-rgb), 0.48);
1829
- font-size: 0.72rem;
1924
+ background: rgba(var(--ctp-crust-rgb), 0.44);
1925
+ font-size: 0.66rem;
1830
1926
  font-weight: 850;
1927
+ line-height: 1;
1831
1928
  }
1832
1929
  .todo-widget-count { color: var(--ctp-green); }
1833
1930
  .todo-widget-meta { color: var(--ctp-yellow); }
1834
1931
  .todo-widget-progress {
1835
- height: 0.38rem;
1932
+ height: 0.26rem;
1836
1933
  overflow: hidden;
1837
1934
  border-radius: 999px;
1838
- background: rgba(var(--ctp-surface-rgb), 0.78);
1839
- 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);
1840
1937
  }
1841
1938
  .todo-widget-progress-fill {
1842
1939
  display: block;
1843
1940
  height: 100%;
1844
1941
  border-radius: inherit;
1845
1942
  background: linear-gradient(90deg, var(--ctp-blue), var(--ctp-teal), var(--ctp-green));
1846
- 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;
1847
1952
  }
1848
1953
  .todo-widget-list {
1849
1954
  display: grid;
1850
- gap: 0.34rem;
1955
+ gap: 0.24rem;
1851
1956
  margin: 0;
1852
1957
  padding: 0;
1853
1958
  list-style: none;
1854
1959
  }
1855
1960
  .todo-widget-item {
1856
1961
  display: grid;
1857
- grid-template-columns: 1.35rem minmax(0, 1fr);
1962
+ grid-template-columns: 1.05rem minmax(0, 1fr);
1858
1963
  align-items: start;
1859
- gap: 0.48rem;
1964
+ gap: 0.34rem;
1860
1965
  min-width: 0;
1861
- color: rgba(var(--ctp-text-rgb), 0.92);
1966
+ color: rgba(var(--ctp-text-rgb), 0.90);
1967
+ font-size: 0.78rem;
1862
1968
  }
1863
1969
  .todo-widget-marker {
1864
1970
  display: inline-grid;
1865
1971
  place-items: center;
1866
- width: 1.12rem;
1867
- height: 1.12rem;
1868
- margin-top: 0.06rem;
1869
- border: 1px solid rgba(180, 190, 254, 0.32);
1870
- 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;
1871
1977
  color: #11111b;
1872
- font-size: 0.74rem;
1978
+ font-size: 0.62rem;
1873
1979
  font-weight: 950;
1874
1980
  line-height: 1;
1875
- background: rgba(var(--ctp-surface-rgb), 0.88);
1981
+ background: rgba(var(--ctp-surface-rgb), 0.86);
1876
1982
  }
1877
1983
  .todo-widget-item.done .todo-widget-marker {
1878
1984
  border-color: transparent;
@@ -1890,11 +1996,11 @@ button.footer-meta {
1890
1996
  .todo-widget-text {
1891
1997
  min-width: 0;
1892
1998
  overflow-wrap: anywhere;
1893
- line-height: 1.35;
1999
+ line-height: 1.28;
1894
2000
  }
1895
2001
  .todo-widget-footer {
1896
2002
  color: rgba(var(--ctp-subtext-rgb), 0.64);
1897
- font-size: 0.72rem;
2003
+ font-size: 0.68rem;
1898
2004
  }
1899
2005
  .chat {
1900
2006
  position: relative;
@@ -2000,11 +2106,12 @@ button.footer-meta {
2000
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);
2001
2107
  }
2002
2108
  .message.action-enter {
2003
- 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;
2004
2110
  }
2005
2111
  @keyframes action-card-slide-in {
2006
- from { opacity: 0; transform: translateY(0.42rem); }
2007
- 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); }
2008
2115
  }
2009
2116
  .message::before {
2010
2117
  content: "";
@@ -2036,11 +2143,6 @@ button.footer-meta {
2036
2143
  color: var(--ctp-mauve);
2037
2144
  text-shadow: 0 0 0.8rem rgba(203, 166, 247, 0.22);
2038
2145
  }
2039
- .message.thinking.streaming.complete .message-role::after {
2040
- content: " done";
2041
- color: var(--ctp-green);
2042
- text-shadow: 0 0 0.7rem var(--glow-teal);
2043
- }
2044
2146
  .message.extension,
2045
2147
  .message.native,
2046
2148
  .message.notice {
@@ -2534,10 +2636,6 @@ summary { cursor: pointer; color: var(--warning); }
2534
2636
  letter-spacing: 0.14em;
2535
2637
  text-shadow: 0 0 0.7rem var(--glow-teal);
2536
2638
  }
2537
- .thinking-block.streaming-thinking.complete > summary::after {
2538
- content: " done";
2539
- color: var(--ctp-green);
2540
- }
2541
2639
  .thinking-text {
2542
2640
  color: rgba(var(--ctp-text-rgb), 0.82);
2543
2641
  margin-top: 0.55rem;
@@ -3547,33 +3645,62 @@ summary { cursor: pointer; color: var(--warning); }
3547
3645
  }
3548
3646
  .release-npm-meta,
3549
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; }
3550
3654
  .release-npm-terminal {
3551
3655
  max-height: min(28dvh, 16rem);
3552
3656
  min-height: 4rem;
3553
- padding: 0.52rem;
3657
+ padding: 0.52rem 0.42rem;
3554
3658
  font-size: 0.72rem;
3555
3659
  }
3660
+ .release-npm-line {
3661
+ margin: 0 -0.12rem;
3662
+ padding: 0 0.32rem;
3663
+ }
3556
3664
  .release-npm-pill { max-width: 100%; }
3557
3665
  .todo-widget {
3558
- gap: 0.38rem;
3559
- margin: 0.2rem 0;
3560
- padding: 0.52rem 0.58rem;
3561
- 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;
3674
+ }
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;
3562
3681
  }
3563
- .todo-widget-header { gap: 0.34rem; }
3564
- .todo-widget-title { font-size: 0.7rem; }
3682
+ .todo-widget-title { font-size: 0.66rem; }
3565
3683
  .todo-widget-count,
3566
- .todo-widget-meta { font-size: 0.66rem; }
3567
- .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; }
3568
3695
  .todo-widget-item {
3569
- grid-template-columns: 1.12rem minmax(0, 1fr);
3570
- gap: 0.36rem;
3571
- font-size: 0.78rem;
3696
+ grid-template-columns: 0.98rem minmax(0, 1fr);
3697
+ gap: 0.28rem;
3698
+ font-size: 0.74rem;
3572
3699
  }
3573
3700
  .todo-widget-marker {
3574
- width: 0.96rem;
3575
- height: 0.96rem;
3576
- font-size: 0.66rem;
3701
+ width: 0.82rem;
3702
+ height: 0.82rem;
3703
+ font-size: 0.58rem;
3577
3704
  }
3578
3705
  .chat {
3579
3706
  padding: 0.62rem 0.58rem;