@firstpick/pi-package-webui 0.3.6 → 0.3.7
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/bin/pi-webui.mjs +219 -0
- package/package.json +1 -1
- package/public/app.js +731 -6
- package/public/index.html +20 -2
- package/public/styles.css +343 -0
- package/tests/mobile-static.test.mjs +22 -0
package/public/index.html
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<link rel="manifest" href="/manifest.webmanifest" />
|
|
13
13
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
14
14
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
15
|
-
<link rel="stylesheet" href="/styles.css?v=
|
|
15
|
+
<link rel="stylesheet" href="/styles.css?v=43" />
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|
|
18
18
|
<button id="sidePanelExpandButton" class="side-panel-expand-button" type="button" aria-controls="sidePanel" aria-expanded="false" aria-label="Expand side panel" title="Expand side panel">
|
|
@@ -495,6 +495,24 @@
|
|
|
495
495
|
</form>
|
|
496
496
|
</dialog>
|
|
497
497
|
|
|
498
|
+
<dialog id="gitChangesDialog" class="extension-dialog git-changes-dialog">
|
|
499
|
+
<form method="dialog">
|
|
500
|
+
<div class="git-changes-header">
|
|
501
|
+
<div>
|
|
502
|
+
<span class="git-changes-kicker">Git diff</span>
|
|
503
|
+
<h2 id="gitChangesTitle">Uncommitted Changes</h2>
|
|
504
|
+
<p id="gitChangesSubtitle" class="muted">Current tab git diff</p>
|
|
505
|
+
</div>
|
|
506
|
+
<button id="gitChangesRefreshButton" type="button">Refresh</button>
|
|
507
|
+
</div>
|
|
508
|
+
<p id="gitChangesStatus" class="git-changes-status muted" role="status" aria-live="polite"></p>
|
|
509
|
+
<div id="gitChangesBody" class="git-changes-body"></div>
|
|
510
|
+
<menu>
|
|
511
|
+
<button id="gitChangesCloseButton" type="button">Close</button>
|
|
512
|
+
</menu>
|
|
513
|
+
</form>
|
|
514
|
+
</dialog>
|
|
515
|
+
|
|
498
516
|
<dialog id="pathPickerDialog" class="extension-dialog path-picker-dialog">
|
|
499
517
|
<form method="dialog">
|
|
500
518
|
<h2 id="pathPickerTitle">Choose working directory</h2>
|
|
@@ -598,6 +616,6 @@
|
|
|
598
616
|
</form>
|
|
599
617
|
</dialog>
|
|
600
618
|
|
|
601
|
-
<script type="module" src="/app.js?v=
|
|
619
|
+
<script type="module" src="/app.js?v=43"></script>
|
|
602
620
|
</body>
|
|
603
621
|
</html>
|
package/public/styles.css
CHANGED
|
@@ -1950,6 +1950,9 @@ button.footer-meta {
|
|
|
1950
1950
|
.footer-thinking.footer-meta-action {
|
|
1951
1951
|
border-color: rgba(203, 166, 247, 0.24);
|
|
1952
1952
|
}
|
|
1953
|
+
.footer-branch.footer-meta-action {
|
|
1954
|
+
border-color: rgba(245, 194, 231, 0.24);
|
|
1955
|
+
}
|
|
1953
1956
|
.footer-model-picker {
|
|
1954
1957
|
position: absolute;
|
|
1955
1958
|
left: var(--footer-model-picker-left, auto);
|
|
@@ -1996,6 +1999,22 @@ button.footer-meta {
|
|
|
1996
1999
|
.footer-model-picker-empty strong {
|
|
1997
2000
|
color: var(--ctp-yellow);
|
|
1998
2001
|
}
|
|
2002
|
+
.footer-model-picker-empty.error {
|
|
2003
|
+
border-color: rgba(243, 139, 168, 0.24);
|
|
2004
|
+
}
|
|
2005
|
+
.footer-model-picker-empty.error strong {
|
|
2006
|
+
color: var(--ctp-red);
|
|
2007
|
+
}
|
|
2008
|
+
.footer-branch-picker {
|
|
2009
|
+
width: min(28rem, calc(100vw - 2rem));
|
|
2010
|
+
border-color: rgba(245, 194, 231, 0.30);
|
|
2011
|
+
background:
|
|
2012
|
+
radial-gradient(circle at 8% 0%, rgba(245, 194, 231, 0.12), transparent 12rem),
|
|
2013
|
+
linear-gradient(145deg, rgba(var(--ctp-crust-rgb), 0.98), rgba(var(--ctp-base-rgb), 0.96));
|
|
2014
|
+
}
|
|
2015
|
+
.footer-branch-picker .footer-model-picker-title {
|
|
2016
|
+
color: var(--ctp-pink);
|
|
2017
|
+
}
|
|
1999
2018
|
.footer-model-option {
|
|
2000
2019
|
display: grid;
|
|
2001
2020
|
grid-template-columns: minmax(0, 1fr);
|
|
@@ -2009,6 +2028,21 @@ button.footer-meta {
|
|
|
2009
2028
|
border-color: rgba(166, 227, 161, 0.46);
|
|
2010
2029
|
box-shadow: inset 3px 0 0 var(--ctp-green), 0 0 1rem rgba(166, 227, 161, 0.14);
|
|
2011
2030
|
}
|
|
2031
|
+
.footer-branch-option.active {
|
|
2032
|
+
border-color: rgba(245, 194, 231, 0.36);
|
|
2033
|
+
box-shadow: inset 3px 0 0 var(--ctp-pink), 0 0 1rem rgba(245, 194, 231, 0.12);
|
|
2034
|
+
}
|
|
2035
|
+
.footer-branch-option:disabled {
|
|
2036
|
+
cursor: default;
|
|
2037
|
+
opacity: 0.78;
|
|
2038
|
+
}
|
|
2039
|
+
.footer-branch-create-option {
|
|
2040
|
+
border-color: rgba(166, 227, 161, 0.34);
|
|
2041
|
+
box-shadow: inset 3px 0 0 var(--ctp-green), 0 0 1rem rgba(166, 227, 161, 0.10);
|
|
2042
|
+
}
|
|
2043
|
+
.footer-branch-create-option .footer-model-option-main {
|
|
2044
|
+
color: var(--ctp-green);
|
|
2045
|
+
}
|
|
2012
2046
|
.footer-model-option-main,
|
|
2013
2047
|
.footer-model-option-name {
|
|
2014
2048
|
min-width: 0;
|
|
@@ -2066,6 +2100,284 @@ button.footer-meta {
|
|
|
2066
2100
|
.tone-green .footer-metric-icon { background: linear-gradient(135deg, var(--ctp-green), var(--ctp-teal)); }
|
|
2067
2101
|
.tone-teal .footer-metric-icon { background: linear-gradient(135deg, var(--ctp-teal), var(--ctp-sky)); }
|
|
2068
2102
|
|
|
2103
|
+
.extension-dialog.git-changes-dialog {
|
|
2104
|
+
--git-changes-dialog-size: min(96rem, calc(100vw - 1.5rem), calc(var(--visual-viewport-height, 100dvh) - 1.5rem));
|
|
2105
|
+
width: var(--git-changes-dialog-size);
|
|
2106
|
+
height: var(--git-changes-dialog-size);
|
|
2107
|
+
max-width: var(--git-changes-dialog-size);
|
|
2108
|
+
max-height: var(--git-changes-dialog-size);
|
|
2109
|
+
aspect-ratio: 1 / 1;
|
|
2110
|
+
overflow: hidden;
|
|
2111
|
+
}
|
|
2112
|
+
.git-changes-dialog form {
|
|
2113
|
+
display: grid;
|
|
2114
|
+
grid-template-rows: auto auto minmax(0, 1fr) auto;
|
|
2115
|
+
gap: 0.72rem;
|
|
2116
|
+
height: 100%;
|
|
2117
|
+
min-height: 0;
|
|
2118
|
+
max-height: none;
|
|
2119
|
+
}
|
|
2120
|
+
.git-changes-header {
|
|
2121
|
+
display: flex;
|
|
2122
|
+
align-items: flex-start;
|
|
2123
|
+
justify-content: space-between;
|
|
2124
|
+
gap: 1rem;
|
|
2125
|
+
}
|
|
2126
|
+
.git-changes-header > div:first-child {
|
|
2127
|
+
min-width: 0;
|
|
2128
|
+
}
|
|
2129
|
+
.git-changes-kicker {
|
|
2130
|
+
display: block;
|
|
2131
|
+
color: var(--ctp-yellow);
|
|
2132
|
+
font-size: 0.72rem;
|
|
2133
|
+
font-weight: 950;
|
|
2134
|
+
letter-spacing: 0.16em;
|
|
2135
|
+
text-transform: uppercase;
|
|
2136
|
+
text-shadow: 0 0 0.9rem rgba(249, 226, 175, 0.28);
|
|
2137
|
+
}
|
|
2138
|
+
.git-changes-dialog h2 {
|
|
2139
|
+
margin: 0.1rem 0 0;
|
|
2140
|
+
color: var(--ctp-text);
|
|
2141
|
+
}
|
|
2142
|
+
.git-changes-dialog p {
|
|
2143
|
+
margin: 0.22rem 0 0;
|
|
2144
|
+
}
|
|
2145
|
+
.git-changes-status.error,
|
|
2146
|
+
.git-changes-empty.error {
|
|
2147
|
+
color: var(--ctp-red);
|
|
2148
|
+
}
|
|
2149
|
+
.git-changes-empty.success {
|
|
2150
|
+
color: var(--ctp-green);
|
|
2151
|
+
}
|
|
2152
|
+
.git-changes-body {
|
|
2153
|
+
display: grid;
|
|
2154
|
+
gap: 0.82rem;
|
|
2155
|
+
min-height: min(32rem, 52dvh);
|
|
2156
|
+
overflow: auto;
|
|
2157
|
+
padding: 0.72rem;
|
|
2158
|
+
border: 1px solid rgba(180, 190, 254, 0.18);
|
|
2159
|
+
border-radius: 0.95rem;
|
|
2160
|
+
background:
|
|
2161
|
+
radial-gradient(circle at 12% 0%, rgba(249, 226, 175, 0.08), transparent 20rem),
|
|
2162
|
+
linear-gradient(145deg, rgba(var(--ctp-crust-rgb), 0.72), rgba(var(--ctp-base-rgb), 0.58));
|
|
2163
|
+
box-shadow: inset 0 1px 0 rgba(255,255,255,0.04);
|
|
2164
|
+
}
|
|
2165
|
+
.git-current-file-header {
|
|
2166
|
+
position: sticky;
|
|
2167
|
+
top: -0.72rem;
|
|
2168
|
+
z-index: 8;
|
|
2169
|
+
display: flex;
|
|
2170
|
+
align-items: center;
|
|
2171
|
+
gap: 0.58rem;
|
|
2172
|
+
min-width: 0;
|
|
2173
|
+
margin: 0 -0.72rem;
|
|
2174
|
+
padding: 0.48rem 0.72rem;
|
|
2175
|
+
border-top: 1px solid rgba(180, 190, 254, 0.12);
|
|
2176
|
+
border-bottom: 1px solid rgba(180, 190, 254, 0.18);
|
|
2177
|
+
background: rgba(var(--ctp-crust-rgb), 0.94);
|
|
2178
|
+
box-shadow: 0 0.55rem 1rem rgba(var(--ctp-crust-rgb), 0.36), inset 0 1px 0 rgba(255,255,255,0.04);
|
|
2179
|
+
backdrop-filter: blur(12px) saturate(140%);
|
|
2180
|
+
}
|
|
2181
|
+
.git-current-file-label {
|
|
2182
|
+
flex: 0 0 auto;
|
|
2183
|
+
color: rgba(var(--ctp-subtext-rgb), 0.68);
|
|
2184
|
+
font-size: 0.62rem;
|
|
2185
|
+
font-weight: 950;
|
|
2186
|
+
letter-spacing: 0.12em;
|
|
2187
|
+
text-transform: uppercase;
|
|
2188
|
+
}
|
|
2189
|
+
.git-current-file-name {
|
|
2190
|
+
min-width: 0;
|
|
2191
|
+
overflow: hidden;
|
|
2192
|
+
color: var(--ctp-yellow);
|
|
2193
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
2194
|
+
font-weight: 900;
|
|
2195
|
+
text-overflow: ellipsis;
|
|
2196
|
+
white-space: nowrap;
|
|
2197
|
+
}
|
|
2198
|
+
.git-changes-empty {
|
|
2199
|
+
display: grid;
|
|
2200
|
+
place-items: center;
|
|
2201
|
+
min-height: 10rem;
|
|
2202
|
+
padding: 1rem;
|
|
2203
|
+
color: rgba(var(--ctp-subtext-rgb), 0.76);
|
|
2204
|
+
font-weight: 800;
|
|
2205
|
+
text-align: center;
|
|
2206
|
+
}
|
|
2207
|
+
.git-changes-overview {
|
|
2208
|
+
display: grid;
|
|
2209
|
+
grid-template-columns: repeat(5, minmax(7rem, 1fr));
|
|
2210
|
+
gap: 0.5rem;
|
|
2211
|
+
}
|
|
2212
|
+
.git-changes-chip {
|
|
2213
|
+
min-width: 0;
|
|
2214
|
+
padding: 0.48rem 0.58rem;
|
|
2215
|
+
border: 1px solid rgba(180, 190, 254, 0.18);
|
|
2216
|
+
border-radius: 0.72rem;
|
|
2217
|
+
background: rgba(var(--ctp-crust-rgb), 0.42);
|
|
2218
|
+
}
|
|
2219
|
+
.git-changes-chip.wide {
|
|
2220
|
+
grid-column: span 2;
|
|
2221
|
+
}
|
|
2222
|
+
.git-changes-chip-label {
|
|
2223
|
+
display: block;
|
|
2224
|
+
color: rgba(var(--ctp-subtext-rgb), 0.64);
|
|
2225
|
+
font-size: 0.62rem;
|
|
2226
|
+
font-weight: 950;
|
|
2227
|
+
letter-spacing: 0.12em;
|
|
2228
|
+
text-transform: uppercase;
|
|
2229
|
+
}
|
|
2230
|
+
.git-changes-chip-value {
|
|
2231
|
+
display: block;
|
|
2232
|
+
min-width: 0;
|
|
2233
|
+
overflow: hidden;
|
|
2234
|
+
color: var(--ctp-text);
|
|
2235
|
+
font-weight: 850;
|
|
2236
|
+
text-overflow: ellipsis;
|
|
2237
|
+
white-space: nowrap;
|
|
2238
|
+
}
|
|
2239
|
+
.git-changes-chip.success .git-changes-chip-value { color: var(--ctp-green); }
|
|
2240
|
+
.git-changes-chip.warning .git-changes-chip-value { color: var(--ctp-yellow); }
|
|
2241
|
+
.git-changes-chip.danger .git-changes-chip-value { color: var(--ctp-red); }
|
|
2242
|
+
.git-changes-chip.muted .git-changes-chip-value { color: rgba(var(--ctp-subtext-rgb), 0.76); }
|
|
2243
|
+
.git-diff-section {
|
|
2244
|
+
display: grid;
|
|
2245
|
+
gap: 0.55rem;
|
|
2246
|
+
}
|
|
2247
|
+
.git-diff-section-heading,
|
|
2248
|
+
.git-diff-file-summary {
|
|
2249
|
+
display: flex;
|
|
2250
|
+
align-items: center;
|
|
2251
|
+
justify-content: space-between;
|
|
2252
|
+
gap: 0.75rem;
|
|
2253
|
+
min-width: 0;
|
|
2254
|
+
}
|
|
2255
|
+
.git-diff-section-heading {
|
|
2256
|
+
padding: 0.1rem 0.1rem 0;
|
|
2257
|
+
}
|
|
2258
|
+
.git-diff-section-title {
|
|
2259
|
+
color: var(--ctp-yellow);
|
|
2260
|
+
font-weight: 950;
|
|
2261
|
+
letter-spacing: 0.08em;
|
|
2262
|
+
text-transform: uppercase;
|
|
2263
|
+
}
|
|
2264
|
+
.git-diff-section-meta,
|
|
2265
|
+
.git-diff-file-stats {
|
|
2266
|
+
color: rgba(var(--ctp-subtext-rgb), 0.66);
|
|
2267
|
+
font-size: 0.72rem;
|
|
2268
|
+
font-weight: 760;
|
|
2269
|
+
white-space: nowrap;
|
|
2270
|
+
}
|
|
2271
|
+
.git-diff-file {
|
|
2272
|
+
overflow: hidden;
|
|
2273
|
+
margin: 0;
|
|
2274
|
+
padding: 0;
|
|
2275
|
+
border: 1px solid rgba(180, 190, 254, 0.16);
|
|
2276
|
+
border-radius: 0.78rem;
|
|
2277
|
+
background: rgba(var(--ctp-mantle-rgb), 0.62);
|
|
2278
|
+
}
|
|
2279
|
+
.git-diff-file-summary {
|
|
2280
|
+
cursor: pointer;
|
|
2281
|
+
padding: 0.52rem 0.66rem;
|
|
2282
|
+
color: inherit;
|
|
2283
|
+
border-bottom: 1px solid rgba(180, 190, 254, 0.14);
|
|
2284
|
+
background: rgba(var(--ctp-crust-rgb), 0.42);
|
|
2285
|
+
}
|
|
2286
|
+
.git-untracked-full-file {
|
|
2287
|
+
border-color: rgba(166, 227, 161, 0.22);
|
|
2288
|
+
}
|
|
2289
|
+
.git-untracked-full-file .git-diff-file-summary {
|
|
2290
|
+
background: linear-gradient(90deg, rgba(166, 227, 161, 0.11), rgba(var(--ctp-crust-rgb), 0.44));
|
|
2291
|
+
}
|
|
2292
|
+
.git-diff-file-name {
|
|
2293
|
+
min-width: 0;
|
|
2294
|
+
overflow: hidden;
|
|
2295
|
+
color: var(--ctp-text);
|
|
2296
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
2297
|
+
font-weight: 850;
|
|
2298
|
+
text-overflow: ellipsis;
|
|
2299
|
+
white-space: nowrap;
|
|
2300
|
+
}
|
|
2301
|
+
.git-diff-grid {
|
|
2302
|
+
display: grid;
|
|
2303
|
+
grid-template-columns: 3.8rem minmax(22rem, 1fr) 3.8rem minmax(22rem, 1fr);
|
|
2304
|
+
min-width: 56rem;
|
|
2305
|
+
overflow-x: auto;
|
|
2306
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
2307
|
+
font-size: 0.82rem;
|
|
2308
|
+
line-height: 1.45;
|
|
2309
|
+
}
|
|
2310
|
+
.git-diff-row {
|
|
2311
|
+
display: contents;
|
|
2312
|
+
}
|
|
2313
|
+
.git-diff-line-number,
|
|
2314
|
+
.git-diff-line {
|
|
2315
|
+
min-height: 1.45rem;
|
|
2316
|
+
padding: 0.08rem 0.46rem;
|
|
2317
|
+
border-top: 1px solid rgba(180, 190, 254, 0.055);
|
|
2318
|
+
}
|
|
2319
|
+
.git-diff-line-number {
|
|
2320
|
+
color: rgba(var(--ctp-subtext-rgb), 0.56);
|
|
2321
|
+
background: rgba(var(--ctp-crust-rgb), 0.44);
|
|
2322
|
+
font-variant-numeric: tabular-nums;
|
|
2323
|
+
text-align: right;
|
|
2324
|
+
user-select: none;
|
|
2325
|
+
}
|
|
2326
|
+
.git-diff-line-number.new {
|
|
2327
|
+
border-left: 1px solid rgba(180, 190, 254, 0.24);
|
|
2328
|
+
}
|
|
2329
|
+
.git-diff-line {
|
|
2330
|
+
overflow-wrap: anywhere;
|
|
2331
|
+
white-space: pre-wrap;
|
|
2332
|
+
}
|
|
2333
|
+
.git-diff-row.hunk .git-diff-line,
|
|
2334
|
+
.git-diff-row.hunk .git-diff-line-number,
|
|
2335
|
+
.git-diff-row.meta .git-diff-line,
|
|
2336
|
+
.git-diff-row.meta .git-diff-line-number {
|
|
2337
|
+
color: rgba(var(--ctp-subtext-rgb), 0.78);
|
|
2338
|
+
background: rgba(137, 180, 250, 0.08);
|
|
2339
|
+
}
|
|
2340
|
+
.git-diff-row.removed .git-diff-line.old,
|
|
2341
|
+
.git-diff-row.changed .git-diff-line.old {
|
|
2342
|
+
color: #ffd6dd;
|
|
2343
|
+
background: rgba(243, 139, 168, 0.18);
|
|
2344
|
+
}
|
|
2345
|
+
.git-diff-row.added .git-diff-line.new,
|
|
2346
|
+
.git-diff-row.changed .git-diff-line.new {
|
|
2347
|
+
color: #d8ffd0;
|
|
2348
|
+
background: rgba(166, 227, 161, 0.18);
|
|
2349
|
+
}
|
|
2350
|
+
.git-diff-row.removed .git-diff-line-number.old,
|
|
2351
|
+
.git-diff-row.changed .git-diff-line-number.old {
|
|
2352
|
+
color: var(--ctp-red);
|
|
2353
|
+
background: rgba(243, 139, 168, 0.12);
|
|
2354
|
+
}
|
|
2355
|
+
.git-diff-row.added .git-diff-line-number.new,
|
|
2356
|
+
.git-diff-row.changed .git-diff-line-number.new {
|
|
2357
|
+
color: var(--ctp-green);
|
|
2358
|
+
background: rgba(166, 227, 161, 0.12);
|
|
2359
|
+
}
|
|
2360
|
+
.git-diff-raw {
|
|
2361
|
+
margin: 0;
|
|
2362
|
+
padding: 0.72rem;
|
|
2363
|
+
overflow: auto;
|
|
2364
|
+
color: rgba(var(--ctp-subtext-rgb), 0.82);
|
|
2365
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
2366
|
+
white-space: pre-wrap;
|
|
2367
|
+
}
|
|
2368
|
+
.git-untracked-list {
|
|
2369
|
+
display: grid;
|
|
2370
|
+
gap: 0.35rem;
|
|
2371
|
+
}
|
|
2372
|
+
.git-untracked-file {
|
|
2373
|
+
padding: 0.45rem 0.58rem;
|
|
2374
|
+
border: 1px solid rgba(137, 180, 250, 0.18);
|
|
2375
|
+
border-radius: 0.62rem;
|
|
2376
|
+
background: rgba(var(--ctp-crust-rgb), 0.38);
|
|
2377
|
+
color: var(--ctp-sky);
|
|
2378
|
+
overflow-wrap: anywhere;
|
|
2379
|
+
}
|
|
2380
|
+
|
|
2069
2381
|
.git-workflow-panel[hidden] { display: none; }
|
|
2070
2382
|
.git-workflow-panel {
|
|
2071
2383
|
flex: 0 0 auto;
|
|
@@ -6101,6 +6413,37 @@ button.composer-skill-tag:focus-visible {
|
|
|
6101
6413
|
background: linear-gradient(180deg, transparent, rgba(var(--ctp-crust-rgb), 0.96) 35%);
|
|
6102
6414
|
}
|
|
6103
6415
|
.extension-dialog menu button { flex: 1 1 9rem; }
|
|
6416
|
+
.extension-dialog.git-changes-dialog {
|
|
6417
|
+
inset: 0;
|
|
6418
|
+
margin: auto;
|
|
6419
|
+
border-radius: 1rem;
|
|
6420
|
+
}
|
|
6421
|
+
.git-changes-dialog form {
|
|
6422
|
+
max-height: 100%;
|
|
6423
|
+
}
|
|
6424
|
+
.git-changes-header {
|
|
6425
|
+
flex-direction: column;
|
|
6426
|
+
gap: 0.62rem;
|
|
6427
|
+
}
|
|
6428
|
+
.git-changes-header button {
|
|
6429
|
+
width: 100%;
|
|
6430
|
+
}
|
|
6431
|
+
.git-changes-body {
|
|
6432
|
+
min-height: min(24rem, 54dvh);
|
|
6433
|
+
padding: 0.55rem;
|
|
6434
|
+
}
|
|
6435
|
+
.git-changes-overview {
|
|
6436
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
6437
|
+
}
|
|
6438
|
+
.git-changes-chip.wide {
|
|
6439
|
+
grid-column: 1 / -1;
|
|
6440
|
+
}
|
|
6441
|
+
.git-diff-section-heading,
|
|
6442
|
+
.git-diff-file-summary {
|
|
6443
|
+
align-items: flex-start;
|
|
6444
|
+
flex-direction: column;
|
|
6445
|
+
gap: 0.25rem;
|
|
6446
|
+
}
|
|
6104
6447
|
.composer-row button[data-tooltip]:not(.tooltip-open)::before,
|
|
6105
6448
|
.composer-row button[data-tooltip]:not(.tooltip-open)::after { display: none; }
|
|
6106
6449
|
.composer-row button[data-tooltip].tooltip-open::before,
|
|
@@ -312,6 +312,19 @@ assert.match(css, /\.footer-changes \.footer-meta-value \{[\s\S]*?color:\s*var\(
|
|
|
312
312
|
assert.match(css, /\.footer-git-extra \.footer-meta-value \{[\s\S]*?color:\s*var\(--ctp-sky\)[\s\S]*?font-weight:\s*900/, "git-footer extras value should be bright enough to read at footer size");
|
|
313
313
|
assert.match(css, /\.footer-meta-action \{[\s\S]*?position:\s*relative;[\s\S]*?border-color:\s*rgba\(148, 226, 213, 0\.26\)/, "clickable footer boxes should have a subtle always-visible highlight");
|
|
314
314
|
assert.doesNotMatch(css, /\.footer-meta-action::after/, "clickable footer boxes should not show a corner indicator dot");
|
|
315
|
+
assert.match(css, /\.extension-dialog\.git-changes-dialog \{[\s\S]*?--git-changes-dialog-size:[\s\S]*?width:\s*var\(--git-changes-dialog-size\)[\s\S]*?height:\s*var\(--git-changes-dialog-size\)[\s\S]*?aspect-ratio:\s*1 \/ 1/, "git changes modal should override the base dialog with a square wide diff layout");
|
|
316
|
+
assert.match(css, /\.git-current-file-header \{[\s\S]*?position:\s*sticky[\s\S]*?top:\s*-0\.72rem/, "git changes modal should keep a sticky current-file header inside the diff scroller");
|
|
317
|
+
assert.match(css, /\.git-diff-grid \{[\s\S]*?grid-template-columns:\s*3\.8rem minmax\(22rem, 1fr\) 3\.8rem minmax\(22rem, 1fr\)/, "git changes modal should render a side-by-side diff grid");
|
|
318
|
+
assert.match(html, /id="gitChangesDialog"[\s\S]*id="gitChangesRefreshButton"[\s\S]*id="gitChangesBody"/, "git changes modal should expose refresh controls and a diff body");
|
|
319
|
+
assert.match(app, /chip\.key === "changes"[\s\S]*?options\.onClick = openGitChangesDialog/, "footer CHANGES chip should open the git changes modal");
|
|
320
|
+
assert.match(app, /async function loadGitChangesDialog[\s\S]*api\("\/api\/git-changes"/, "git changes modal should load diff data from the server endpoint");
|
|
321
|
+
assert.match(app, /function gitUntrackedEntryToDiffFile\(entry\)[\s\S]*?renderRowLimit:\s*Number\.POSITIVE_INFINITY[\s\S]*?type: "added"/, "untracked files should render as complete added-file diffs without the row preview cap");
|
|
322
|
+
assert.match(app, /async function loadMissingGitUntrackedContent\(entry[\s\S]*?\/api\/git-changes\/untracked-file\?path=/, "untracked path-only payloads should fetch complete file contents instead of rendering as empty files");
|
|
323
|
+
assert.match(app, /function updateGitChangesCurrentFileHeader\(\)[\s\S]*?querySelectorAll\("\.git-diff-file\[data-git-diff-file\]"\)/, "git changes modal should derive the sticky current-file header from visible file cards");
|
|
324
|
+
assert.match(server, /async function readGitUntrackedEntry\(root, file\)[\s\S]*?content: binary \? "" : buffer\.toString\("utf8"\)/, "server should include complete text contents for untracked files");
|
|
325
|
+
assert.match(server, /url\.pathname === "\/api\/git-changes\/untracked-file" && req\.method === "GET"/, "server should expose a focused untracked-file content endpoint for stale path-only payload fallbacks");
|
|
326
|
+
assert.match(server, /async function readGitChanges\(cwd\)[\s\S]*?const diffArgs = \["diff", "--no-ext-diff"[\s\S]*?\["diff", "--cached"/, "server should collect both staged and unstaged git diffs for the changes modal");
|
|
327
|
+
assert.match(server, /url\.pathname === "\/api\/git-changes" && req\.method === "GET"/, "server should expose GET /api/git-changes for the changes modal");
|
|
315
328
|
assert.match(css, /@media \(max-width: 1050px\)[\s\S]*?\.footer-line-meta \{[\s\S]*?display:\s*flex;[\s\S]*?flex-wrap:\s*wrap;[\s\S]*?\.footer-line-meta \.footer-meta \{[\s\S]*?flex:\s*1 1 var\(--footer-chip-min-width\);[\s\S]*?width:\s*auto;[\s\S]*?\.footer-workspace,\n\s+\.footer-model,\n\s+\.footer-thinking \{ grid-column:\s*auto; \}/, "narrow git-footer metadata should wrap like the top metric row instead of forcing a two-column grid");
|
|
316
329
|
assert.match(css, /\.footer-line-tui \{[\s\S]*?white-space:\s*nowrap/, "default Web UI footer should use a minimal TUI-like line");
|
|
317
330
|
assert.match(css, /\.footer-tui-cwd[\s\S]*?max-width:\s*38%/, "TUI-like footer should keep cwd compact on desktop");
|
|
@@ -494,6 +507,15 @@ assert.match(app, /function isRedundantFooterTooltipTitle\(sourceTitle, chip, va
|
|
|
494
507
|
assert.match(app, /function gitFooterTooltipAlign\(chip\)[\s\S]*\["tokens", "cwd"\][\s\S]*return "start";[\s\S]*\["model", "thinking"\][\s\S]*return "end";/, "git footer tooltip alignment should keep edge boxes readable");
|
|
495
508
|
assert.match(app, /function renderGitFooterPayloadMetric\(chip\)[\s\S]*footerMetric\(chip\.icon[\s\S]*gitFooterPayloadTooltip\(chip\)[\s\S]*tooltipAlign: gitFooterTooltipAlign\(chip\)/, "git footer main payload chips should render as styled metrics with explanatory tooltips");
|
|
496
509
|
assert.match(app, /function renderGitFooterPayloadMeta\(chip, tab\)[\s\S]*options\.title = gitFooterPayloadTooltip\(chip, \{ action \}\)[\s\S]*options\.tooltipAlign = gitFooterTooltipAlign\(chip\)[\s\S]*footerMeta\(chip\.label, chip\.value, footerMetaClassForPayload\(chip\)/, "git footer meta payload chips should render as styled metadata with explanatory tooltips");
|
|
510
|
+
assert.match(app, /chip\.key === "git"[\s\S]*setFooterBranchPickerOpen\(!footerBranchPickerOpen\)[\s\S]*Click to switch to another local branch/, "git branch footer chip should open the branch picker");
|
|
511
|
+
assert.match(app, /function renderFooterBranchPicker\(\)[\s\S]*Git branches[\s\S]*applyFooterGitBranch\(branch\.name\)/, "git branch picker should render available branches and switch on selection");
|
|
512
|
+
assert.match(app, /Create new branch[\s\S]*createFooterGitBranch\(\)/, "git branch picker should offer branch creation when no other branches are available");
|
|
513
|
+
assert.match(app, /function promptFooterGitBranchName\(\)[\s\S]*window\.prompt\("New git branch name:"[\s\S]*function createFooterGitBranch\(\)[\s\S]*confirmFooterGitBranchAction\(branchName, \{ create: true, requireConfirm: true/, "new branch creation should prompt for a branch name and require confirmation before creating it");
|
|
514
|
+
assert.match(app, /function footerBranchAgentWarningLines[\s\S]*WARNING:[\s\S]*still running or waiting for input in this Git working tree/, "branch create/switch confirmation should warn when an agent is active in the current git working tree");
|
|
515
|
+
assert.match(app, /if \(footerBranchPickerOpen\) elements\.statusBar\.append\(renderFooterBranchPicker\(\)\)/, "footer should append the branch picker above the status bar when open");
|
|
516
|
+
assert.match(server, /url\.pathname === "\/api\/git-branches"[\s\S]*readGitBranches\(tab\.cwd\)/, "server should expose local git branch listing for the footer picker");
|
|
517
|
+
assert.match(server, /url\.pathname === "\/api\/git-branch"[\s\S]*switchGitBranch\(tab\.cwd, body\.branch, \{ create: body\.create === true \}\)/, "server should expose git branch switching and creation for the footer picker");
|
|
518
|
+
assert.match(server, /async function switchGitBranch[\s\S]*const args = create \? \["switch", "-c", targetBranch\] : \["switch", targetBranch\]/, "server branch creation should run git switch -c for new local branches");
|
|
497
519
|
assert.match(app, /let latestStats = null/, "default footer should retain session stats for token and context display");
|
|
498
520
|
assert.match(app, /async function refreshStats\(tabContext = activeTabContext\(\)\)[\s\S]*api\("\/api\/stats"/, "default footer should fetch session stats");
|
|
499
521
|
assert.match(app, /function renderMinimalFooter\(\)[\s\S]*stats: fallbackFooterStats\(\)/, "minimal default footer should include token, cost, and context stats");
|