pi-studio 0.9.13 → 0.9.14

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/CHANGELOG.md CHANGED
@@ -4,6 +4,18 @@ All notable changes to `pi-studio` are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.14] — 2026-05-22
8
+
9
+ ### Added
10
+ - Added active-pane text-size shortcuts: Alt/Option+= to increase, Alt/Option+- to decrease, and Alt/Option+0 to reset editor or right-pane text size when not editing text.
11
+
12
+ ### Changed
13
+ - Blank and last-response Studio launches now default the working directory/resource context to the current Pi directory.
14
+ - Made the working-directory label use normal muted text styling instead of standing out like a primary control.
15
+
16
+ ### Fixed
17
+ - Fixed the keyboard-shortcuts overlay layout so shortcut groups are no longer clipped by the global pane section styles.
18
+
7
19
  ## [0.9.13] — 2026-05-22
8
20
 
9
21
  ### Added
@@ -2174,6 +2174,49 @@
2174
2174
  scheduleResponsePaneRepaintNudge();
2175
2175
  }
2176
2176
 
2177
+ function getActivePaneTextSizeConfig() {
2178
+ if (activePane === "right") {
2179
+ return {
2180
+ label: "Right pane text size",
2181
+ value: responseFontSize,
2182
+ defaultValue: DEFAULT_RESPONSE_FONT_SIZE,
2183
+ options: RESPONSE_FONT_SIZE_OPTIONS,
2184
+ setValue: setResponseFontSize,
2185
+ };
2186
+ }
2187
+ return {
2188
+ label: "Editor text size",
2189
+ value: editorFontSize,
2190
+ defaultValue: DEFAULT_EDITOR_FONT_SIZE,
2191
+ options: EDITOR_FONT_SIZE_OPTIONS,
2192
+ setValue: setEditorFontSize,
2193
+ };
2194
+ }
2195
+
2196
+ function getNextStudioFontSizeOption(currentValue, options, defaultValue, direction) {
2197
+ const normalized = normalizeStudioFontSize(currentValue, options, defaultValue);
2198
+ const currentIndex = Math.max(0, options.findIndex((option) => Math.abs(option - normalized) < 0.001));
2199
+ const nextIndex = Math.max(0, Math.min(options.length - 1, currentIndex + direction));
2200
+ return options[nextIndex];
2201
+ }
2202
+
2203
+ function adjustActivePaneTextSize(direction) {
2204
+ const config = getActivePaneTextSizeConfig();
2205
+ const nextSize = getNextStudioFontSizeOption(config.value, config.options, config.defaultValue, direction);
2206
+ if (Math.abs(nextSize - config.value) < 0.001) {
2207
+ setStatus(config.label + " already at " + formatStudioFontSizeLabel(nextSize) + ".", "warning");
2208
+ return;
2209
+ }
2210
+ config.setValue(nextSize);
2211
+ setStatus(config.label + ": " + formatStudioFontSizeLabel(nextSize) + ".");
2212
+ }
2213
+
2214
+ function resetActivePaneTextSize() {
2215
+ const config = getActivePaneTextSizeConfig();
2216
+ config.setValue(config.defaultValue);
2217
+ setStatus(config.label + " reset to " + formatStudioFontSizeLabel(config.defaultValue) + ".");
2218
+ }
2219
+
2177
2220
  function getStudioUiRefreshAnnotationHeaderEnabled() {
2178
2221
  try {
2179
2222
  return Boolean(stripAnnotationHeader(sourceTextEl.value).hadHeader);
@@ -3648,6 +3691,24 @@
3648
3691
  }
3649
3692
  }
3650
3693
 
3694
+ if (!isTextEntryShortcutTarget(event.target) && !event.metaKey && !event.ctrlKey && event.altKey) {
3695
+ if (code === "Equal" || code === "NumpadAdd" || key === "=" || key === "+") {
3696
+ event.preventDefault();
3697
+ adjustActivePaneTextSize(1);
3698
+ return;
3699
+ }
3700
+ if (code === "Minus" || code === "NumpadSubtract" || key === "-" || key === "_") {
3701
+ event.preventDefault();
3702
+ adjustActivePaneTextSize(-1);
3703
+ return;
3704
+ }
3705
+ if (code === "Digit0" || code === "Numpad0" || key === "0") {
3706
+ event.preventDefault();
3707
+ resetActivePaneTextSize();
3708
+ return;
3709
+ }
3710
+ }
3711
+
3651
3712
  const isPaneSwitchShortcut = key === "F6" && !event.metaKey && !event.ctrlKey && !event.altKey;
3652
3713
  if (isPaneSwitchShortcut) {
3653
3714
  event.preventDefault();
package/client/studio.css CHANGED
@@ -641,6 +641,7 @@
641
641
  overflow: hidden;
642
642
  text-overflow: ellipsis;
643
643
  white-space: nowrap;
644
+ font-weight: 400;
644
645
  }
645
646
  .resource-dir-label:hover {
646
647
  color: var(--fg);
@@ -3583,17 +3584,29 @@
3583
3584
 
3584
3585
  .shortcuts-body {
3585
3586
  display: grid;
3586
- gap: 12px;
3587
- padding: 14px 18px 16px;
3587
+ gap: 16px;
3588
+ padding: 16px 18px 18px;
3588
3589
  overflow-y: auto;
3589
3590
  overflow-x: hidden;
3590
3591
  min-height: 0;
3591
3592
  background: var(--panel);
3592
3593
  }
3593
3594
 
3595
+ .shortcuts-group {
3596
+ display: block;
3597
+ min-height: auto;
3598
+ border: 0;
3599
+ border-radius: 0;
3600
+ background: transparent;
3601
+ box-shadow: none;
3602
+ overflow: visible;
3603
+ }
3604
+
3594
3605
  .shortcuts-group h3 {
3595
- margin: 0 0 6px;
3606
+ margin: 0 0 8px;
3607
+ padding-top: 3px;
3596
3608
  font-size: 12px;
3609
+ line-height: 1.5;
3597
3610
  font-weight: 700;
3598
3611
  color: var(--studio-info-text, var(--muted));
3599
3612
  text-transform: uppercase;
@@ -4259,7 +4272,6 @@
4259
4272
  }
4260
4273
 
4261
4274
  body.studio-ui-refresh #resourceDirBtn,
4262
- body.studio-ui-refresh #resourceDirLabel,
4263
4275
  body.studio-ui-refresh #reviewNotesBtn,
4264
4276
  body.studio-ui-refresh #outlineBtn,
4265
4277
  body.studio-ui-refresh #scratchpadBtn,
@@ -4267,6 +4279,11 @@
4267
4279
  color: var(--text);
4268
4280
  }
4269
4281
 
4282
+ body.studio-ui-refresh #resourceDirLabel {
4283
+ color: var(--studio-info-text, var(--muted));
4284
+ font-weight: 400;
4285
+ }
4286
+
4270
4287
  body.studio-ui-refresh #resourceDirInputWrap.visible {
4271
4288
  display: inline-flex;
4272
4289
  }
package/index.ts CHANGED
@@ -9600,6 +9600,14 @@ ${cssVarsBlock}
9600
9600
  <div><dt>?</dt><dd>Show keyboard shortcuts when not editing text</dd></div>
9601
9601
  </dl>
9602
9602
  </section>
9603
+ <section class="shortcuts-group">
9604
+ <h3>View</h3>
9605
+ <dl>
9606
+ <div><dt>Alt/Option+=</dt><dd>Increase the active pane's text size when not editing text</dd></div>
9607
+ <div><dt>Alt/Option+-</dt><dd>Decrease the active pane's text size when not editing text</dd></div>
9608
+ <div><dt>Alt/Option+0</dt><dd>Reset the active pane's text size when not editing text</dd></div>
9609
+ </dl>
9610
+ </section>
9603
9611
  <section class="shortcuts-group">
9604
9612
  <h3>Editor</h3>
9605
9613
  <dl>
@@ -13298,6 +13306,7 @@ export default function (pi: ExtensionAPI) {
13298
13306
  label: "last model response",
13299
13307
  source: "last-response",
13300
13308
  draftId: createStudioDraftId(),
13309
+ resourceDir: ctx.cwd,
13301
13310
  };
13302
13311
  }
13303
13312
  return {
@@ -13305,6 +13314,7 @@ export default function (pi: ExtensionAPI) {
13305
13314
  label: "blank",
13306
13315
  source: "blank",
13307
13316
  draftId: createStudioDraftId(),
13317
+ resourceDir: ctx.cwd,
13308
13318
  };
13309
13319
  }
13310
13320
 
@@ -13314,6 +13324,7 @@ export default function (pi: ExtensionAPI) {
13314
13324
  label: "blank",
13315
13325
  source: "blank",
13316
13326
  draftId: createStudioDraftId(),
13327
+ resourceDir: ctx.cwd,
13317
13328
  };
13318
13329
  }
13319
13330
 
@@ -13325,6 +13336,7 @@ export default function (pi: ExtensionAPI) {
13325
13336
  label: "blank",
13326
13337
  source: "blank",
13327
13338
  draftId: createStudioDraftId(),
13339
+ resourceDir: ctx.cwd,
13328
13340
  };
13329
13341
  }
13330
13342
  return {
@@ -13332,6 +13344,7 @@ export default function (pi: ExtensionAPI) {
13332
13344
  label: "last model response",
13333
13345
  source: "last-response",
13334
13346
  draftId: createStudioDraftId(),
13347
+ resourceDir: ctx.cwd,
13335
13348
  };
13336
13349
  }
13337
13350
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-studio",
3
- "version": "0.9.13",
3
+ "version": "0.9.14",
4
4
  "description": "Two-pane browser workspace for pi with prompt/response editing, annotations, critiques, active quiz, prompt/response history, live previews, and tmux-backed REPL/literate REPL workflows",
5
5
  "type": "module",
6
6
  "license": "MIT",