pi-studio 0.9.63 → 0.10.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/BUFFER-DESIGN.md +197 -0
- package/CHANGELOG.md +23 -0
- package/PRERELEASE-CHECKLIST.md +100 -0
- package/README.md +33 -3
- package/ROADMAP.md +63 -6
- package/WORKFLOW.md +32 -2
- package/client/studio-client.js +6687 -942
- package/client/studio-editor-draft-helpers.js +162 -0
- package/client/studio-navigation-helpers.js +31 -5
- package/client/studio.css +448 -12
- package/index.ts +1178 -79
- package/package.json +5 -3
- package/shared/STUDIO_BUFFER_FOUNDATION.md +164 -0
- package/shared/studio-buffer-client.js +663 -0
- package/shared/studio-buffer-decisions.js +129 -0
- package/shared/studio-buffer-lineage.js +48 -0
- package/shared/studio-buffer-recovery-panel.js +132 -0
- package/shared/studio-buffer-recovery.js +181 -0
- package/shared/studio-buffer-server.js +700 -0
- package/shared/studio-buffer-store.js +227 -0
- package/shared/studio-buffer-switching.js +53 -0
- package/shared/studio-disk-revisions.js +15 -0
- package/shared/studio-document-entrypoints.js +38 -0
- package/shared/studio-document-escrow.js +147 -0
- package/shared/studio-document-file-claims.js +215 -0
- package/shared/studio-document-host-client.js +268 -0
- package/shared/studio-document-hosting.js +319 -0
- package/shared/studio-document-launch-client.js +153 -0
- package/shared/studio-document-open-client.js +96 -0
- package/shared/studio-document-open-storage.js +21 -0
- package/shared/studio-document-paths.js +29 -0
- package/shared/studio-editor-mode.js +48 -0
- package/shared/studio-linked-reader-ui.js +232 -0
- package/shared/studio-linked-reader.js +110 -0
- package/shared/studio-metadata-write-order.js +35 -0
- package/shared/studio-read-only-media.js +24 -0
- package/shared/studio-resource-grants.js +3 -0
- package/shared/studio-run-lifecycle.js +47 -0
- package/shared/studio-system-theme.js +9 -0
package/client/studio.css
CHANGED
|
@@ -681,6 +681,81 @@
|
|
|
681
681
|
min-height: 0;
|
|
682
682
|
}
|
|
683
683
|
|
|
684
|
+
/* Development-only two-buffer switcher; no layout change when it is absent. */
|
|
685
|
+
.studio-buffer-switcher {
|
|
686
|
+
display: flex;
|
|
687
|
+
flex-wrap: wrap;
|
|
688
|
+
align-items: center;
|
|
689
|
+
gap: 6px 10px;
|
|
690
|
+
flex: 0 0 auto;
|
|
691
|
+
min-width: 0;
|
|
692
|
+
padding-bottom: 8px;
|
|
693
|
+
border-bottom: 1px solid var(--panel-border);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
.studio-buffer-tabs {
|
|
697
|
+
display: flex;
|
|
698
|
+
flex: 1 1 220px;
|
|
699
|
+
min-width: 0;
|
|
700
|
+
gap: 4px;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
.studio-buffer-tabs button {
|
|
704
|
+
flex: 1 1 0;
|
|
705
|
+
min-width: 0;
|
|
706
|
+
overflow: hidden;
|
|
707
|
+
text-overflow: ellipsis;
|
|
708
|
+
white-space: nowrap;
|
|
709
|
+
text-align: left;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
/* Selection is a quiet fill; the shared :focus-visible rule marks keyboard focus. */
|
|
713
|
+
.studio-buffer-tabs button[aria-selected="true"] {
|
|
714
|
+
border-color: var(--control-border);
|
|
715
|
+
background: var(--accent-soft);
|
|
716
|
+
color: var(--text);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
@media (forced-colors: active) {
|
|
720
|
+
.studio-buffer-tabs button[aria-selected="true"] {
|
|
721
|
+
border-style: dashed;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
.studio-buffer-menu-anchor {
|
|
726
|
+
position: relative;
|
|
727
|
+
flex: 0 0 auto;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
/* Same disclosure treatment as the existing toolbar menus; help belongs
|
|
731
|
+
inside the popup, never in another permanent row above the editor. */
|
|
732
|
+
.studio-buffer-menu {
|
|
733
|
+
position: absolute;
|
|
734
|
+
right: 0;
|
|
735
|
+
top: calc(100% + 6px);
|
|
736
|
+
z-index: 80;
|
|
737
|
+
width: min(340px, calc(100vw - 32px));
|
|
738
|
+
max-height: min(440px, 65vh);
|
|
739
|
+
overflow-y: auto;
|
|
740
|
+
padding: 6px;
|
|
741
|
+
border: 1px solid var(--control-border);
|
|
742
|
+
border-radius: 8px;
|
|
743
|
+
background: var(--panel);
|
|
744
|
+
box-shadow: 0 12px 30px rgba(0, 0, 0, 0.24);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
.studio-buffer-menu[hidden] { display: none; }
|
|
748
|
+
.studio-buffer-menu-item + .studio-buffer-menu-item { border-top: 1px solid var(--panel-border); }
|
|
749
|
+
.studio-buffer-menu-item { padding: 4px; }
|
|
750
|
+
.studio-buffer-menu-item button { width: 100%; text-align: left; white-space: normal; }
|
|
751
|
+
.studio-buffer-menu-help {
|
|
752
|
+
padding: 4px 6px;
|
|
753
|
+
color: var(--muted);
|
|
754
|
+
font-size: 11px;
|
|
755
|
+
line-height: 1.4;
|
|
756
|
+
overflow-wrap: anywhere;
|
|
757
|
+
}
|
|
758
|
+
|
|
684
759
|
.source-body {
|
|
685
760
|
display: flex;
|
|
686
761
|
gap: 12px;
|
|
@@ -837,6 +912,7 @@
|
|
|
837
912
|
background: var(--studio-header-action-hover-bg, var(--panel-2));
|
|
838
913
|
}
|
|
839
914
|
|
|
915
|
+
#sendRunBtn[hidden],
|
|
840
916
|
#sendReplBtn[hidden],
|
|
841
917
|
#replSendModeSelect[hidden] {
|
|
842
918
|
display: none !important;
|
|
@@ -4278,6 +4354,16 @@
|
|
|
4278
4354
|
font-size: var(--studio-working-font-size);
|
|
4279
4355
|
}
|
|
4280
4356
|
|
|
4357
|
+
.trace-output.trace-output-code {
|
|
4358
|
+
white-space: pre;
|
|
4359
|
+
overflow-wrap: normal;
|
|
4360
|
+
tab-size: 4;
|
|
4361
|
+
}
|
|
4362
|
+
|
|
4363
|
+
.trace-section-fold { margin-top: 8px; }
|
|
4364
|
+
.trace-section-fold.is-error > summary { color: var(--error); }
|
|
4365
|
+
.trace-section-fold > summary:focus-visible { outline: 2px solid var(--studio-info-text, var(--text)); outline-offset: -2px; }
|
|
4366
|
+
|
|
4281
4367
|
.trace-section > .trace-output {
|
|
4282
4368
|
border: 1px solid var(--panel-border);
|
|
4283
4369
|
border-radius: 8px;
|
|
@@ -6478,14 +6564,16 @@
|
|
|
6478
6564
|
line-height: 1.2;
|
|
6479
6565
|
}
|
|
6480
6566
|
|
|
6481
|
-
body.studio-ui-refresh .studio-refresh-toolbar button:not(#sendRunBtn):not(#queueSteerBtn):not(#sendReplBtn):not(.request-stop-active),
|
|
6482
|
-
body.studio-ui-refresh .studio-refresh-toolbar
|
|
6567
|
+
body.studio-ui-refresh .studio-refresh-toolbar-actions > .studio-refresh-action-line > button:not(#sendRunBtn):not(#queueSteerBtn):not(#sendReplBtn):not(.request-stop-active),
|
|
6568
|
+
body.studio-ui-refresh .studio-refresh-toolbar-actions > .studio-refresh-action-line > .studio-refresh-tools > button,
|
|
6569
|
+
body.studio-ui-refresh .studio-refresh-toolbar-actions > .studio-refresh-action-line > select {
|
|
6483
6570
|
color: color-mix(in srgb, var(--text) 72%, var(--muted));
|
|
6484
6571
|
font-weight: 500;
|
|
6485
6572
|
}
|
|
6486
6573
|
|
|
6487
|
-
body.studio-ui-refresh .studio-refresh-toolbar button:not(#sendRunBtn):not(#queueSteerBtn):not(#sendReplBtn):not(.request-stop-active):hover,
|
|
6488
|
-
body.studio-ui-refresh .studio-refresh-toolbar
|
|
6574
|
+
body.studio-ui-refresh .studio-refresh-toolbar-actions > .studio-refresh-action-line > button:not(#sendRunBtn):not(#queueSteerBtn):not(#sendReplBtn):not(.request-stop-active):hover,
|
|
6575
|
+
body.studio-ui-refresh .studio-refresh-toolbar-actions > .studio-refresh-action-line > .studio-refresh-tools > button:hover,
|
|
6576
|
+
body.studio-ui-refresh .studio-refresh-toolbar-actions > .studio-refresh-action-line > select:not(:disabled):hover {
|
|
6489
6577
|
color: var(--text);
|
|
6490
6578
|
}
|
|
6491
6579
|
|
|
@@ -6529,6 +6617,10 @@
|
|
|
6529
6617
|
}
|
|
6530
6618
|
|
|
6531
6619
|
body.studio-ui-refresh .studio-refresh-menu {
|
|
6620
|
+
box-sizing: border-box;
|
|
6621
|
+
min-width: 0;
|
|
6622
|
+
overflow: auto;
|
|
6623
|
+
overflow-wrap: anywhere;
|
|
6532
6624
|
position: absolute;
|
|
6533
6625
|
top: calc(100% + 8px);
|
|
6534
6626
|
right: 0;
|
|
@@ -6542,7 +6634,7 @@
|
|
|
6542
6634
|
}
|
|
6543
6635
|
|
|
6544
6636
|
body.studio-ui-refresh .studio-refresh-review-anchor {
|
|
6545
|
-
position:
|
|
6637
|
+
position: relative;
|
|
6546
6638
|
}
|
|
6547
6639
|
|
|
6548
6640
|
body.studio-ui-refresh .studio-refresh-review-anchor .studio-refresh-menu {
|
|
@@ -6592,6 +6684,34 @@
|
|
|
6592
6684
|
letter-spacing: 0.06em;
|
|
6593
6685
|
}
|
|
6594
6686
|
|
|
6687
|
+
body.studio-ui-refresh details.studio-refresh-menu-section > summary {
|
|
6688
|
+
cursor: pointer;
|
|
6689
|
+
color: var(--text);
|
|
6690
|
+
font-size: 13px;
|
|
6691
|
+
font-weight: 500;
|
|
6692
|
+
text-transform: none;
|
|
6693
|
+
letter-spacing: normal;
|
|
6694
|
+
}
|
|
6695
|
+
|
|
6696
|
+
body.studio-ui-refresh details.studio-refresh-menu-section > summary:focus-visible {
|
|
6697
|
+
outline: none;
|
|
6698
|
+
text-decoration: underline;
|
|
6699
|
+
text-underline-offset: 3px;
|
|
6700
|
+
}
|
|
6701
|
+
|
|
6702
|
+
body:not([data-buffer-switching="1"]) .shortcuts-buffer-switching-only {
|
|
6703
|
+
display: none;
|
|
6704
|
+
}
|
|
6705
|
+
|
|
6706
|
+
body.studio-ui-refresh .studio-prompt-run-indicator {
|
|
6707
|
+
color: var(--muted);
|
|
6708
|
+
font-size: 12px;
|
|
6709
|
+
line-height: 20px;
|
|
6710
|
+
padding: 2px 0;
|
|
6711
|
+
background: transparent;
|
|
6712
|
+
border: 0;
|
|
6713
|
+
}
|
|
6714
|
+
|
|
6595
6715
|
body.studio-ui-refresh .studio-refresh-menu-item {
|
|
6596
6716
|
display: flex;
|
|
6597
6717
|
align-items: center;
|
|
@@ -6672,21 +6792,20 @@
|
|
|
6672
6792
|
}
|
|
6673
6793
|
|
|
6674
6794
|
body.studio-ui-refresh #sendRunBtn,
|
|
6675
|
-
body.studio-ui-refresh #queueSteerBtn,
|
|
6676
6795
|
body.studio-ui-refresh #sendReplBtn {
|
|
6677
6796
|
min-width: 8.6rem;
|
|
6678
6797
|
}
|
|
6679
6798
|
|
|
6799
|
+
/* Stop is the one filled action while running; steering stays plain. */
|
|
6680
6800
|
body.studio-ui-refresh #queueSteerBtn:not(:disabled) {
|
|
6681
|
-
background:
|
|
6682
|
-
border-color:
|
|
6683
|
-
color: var(--accent
|
|
6801
|
+
background: transparent;
|
|
6802
|
+
border-color: transparent;
|
|
6803
|
+
color: var(--accent);
|
|
6684
6804
|
font-weight: 600;
|
|
6685
6805
|
}
|
|
6686
6806
|
|
|
6687
6807
|
body.studio-ui-refresh #queueSteerBtn:not(:disabled):hover {
|
|
6688
|
-
background: var(--
|
|
6689
|
-
filter: brightness(0.95);
|
|
6808
|
+
background: var(--studio-header-action-hover-bg, var(--panel-2));
|
|
6690
6809
|
}
|
|
6691
6810
|
|
|
6692
6811
|
body.studio-ui-refresh .studio-refresh-review-btn.request-stop-active {
|
|
@@ -6708,6 +6827,37 @@
|
|
|
6708
6827
|
font-weight: 700;
|
|
6709
6828
|
}
|
|
6710
6829
|
|
|
6830
|
+
.studio-buffer-recovery-dialog {
|
|
6831
|
+
width: min(800px, calc(100vw - 32px));
|
|
6832
|
+
max-height: 90vh;
|
|
6833
|
+
overflow: auto;
|
|
6834
|
+
box-sizing: border-box;
|
|
6835
|
+
padding: 20px;
|
|
6836
|
+
border: 1px solid var(--panel-border);
|
|
6837
|
+
border-radius: 14px;
|
|
6838
|
+
background: var(--panel);
|
|
6839
|
+
color: var(--text);
|
|
6840
|
+
font: inherit;
|
|
6841
|
+
box-shadow: 0 24px 70px rgba(0, 0, 0, 0.48);
|
|
6842
|
+
}
|
|
6843
|
+
.studio-buffer-recovery-dialog::backdrop { background: rgba(0, 0, 0, 0.58); }
|
|
6844
|
+
.studio-buffer-recovery-dialog [hidden] { display: none !important; }
|
|
6845
|
+
.studio-buffer-recovery-dialog h2 { margin-top: 0; font-size: 18px; }
|
|
6846
|
+
.studio-buffer-recovery-dialog p { font-size: 13px; line-height: 1.5; overflow-wrap: anywhere; }
|
|
6847
|
+
.studio-buffer-recovery-dialog label { display: block; margin: 8px 0; }
|
|
6848
|
+
.studio-buffer-recovery-dialog select { max-width: 100%; }
|
|
6849
|
+
.studio-buffer-recovery-dialog textarea {
|
|
6850
|
+
width: 100%; height: 180px; max-height: 40vh; box-sizing: border-box; resize: vertical;
|
|
6851
|
+
border: 1px solid var(--control-border); border-radius: 8px; padding: 10px;
|
|
6852
|
+
background: var(--panel-2); color: var(--text); font: 12px var(--font-mono);
|
|
6853
|
+
}
|
|
6854
|
+
.studio-buffer-recovery-actions { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0; }
|
|
6855
|
+
.studio-buffer-recovery-note { color: var(--studio-info-text, var(--muted)); }
|
|
6856
|
+
.studio-buffer-recovery-dialog summary { cursor: pointer; font-size: 13px; }
|
|
6857
|
+
.studio-buffer-recovery-dialog [data-recovery-confirmation] { display: block; border: 1px solid var(--warn-border); border-radius: 8px; padding: 12px; margin-bottom: 14px; }
|
|
6858
|
+
.studio-buffer-recovery-dialog [data-recovery-confirmation] h3 { margin: 0; }
|
|
6859
|
+
.studio-buffer-recovery-dialog [data-recovery-confirmation] button { width: auto; margin-right: 8px; }
|
|
6860
|
+
|
|
6711
6861
|
.studio-decision-overlay {
|
|
6712
6862
|
position: fixed;
|
|
6713
6863
|
inset: 0;
|
|
@@ -7141,7 +7291,7 @@
|
|
|
7141
7291
|
opacity: 0.5;
|
|
7142
7292
|
}
|
|
7143
7293
|
|
|
7144
|
-
.side-question-actions .side-question-primary {
|
|
7294
|
+
.side-question-actions .side-question-primary:not(:disabled) {
|
|
7145
7295
|
border-color: var(--accent);
|
|
7146
7296
|
background: var(--accent);
|
|
7147
7297
|
color: var(--accent-contrast);
|
|
@@ -7374,3 +7524,289 @@
|
|
|
7374
7524
|
flex-wrap: wrap;
|
|
7375
7525
|
}
|
|
7376
7526
|
}
|
|
7527
|
+
|
|
7528
|
+
/* Honor existing handler eligibility after controls are regrouped. */
|
|
7529
|
+
body.studio-ui-refresh [hidden] { display: none !important; }
|
|
7530
|
+
/* Dogfood workspace: two logical rows, with normal wrapping in small panes. */
|
|
7531
|
+
.studio-run-status { color: var(--muted); font-size: 12px; min-width: 0; overflow-wrap: anywhere; }
|
|
7532
|
+
body.studio-ui-refresh #rightSectionHeader .studio-follow-button {
|
|
7533
|
+
color: var(--muted); border: 0; border-radius: 0; background: transparent;
|
|
7534
|
+
}
|
|
7535
|
+
body.studio-ui-refresh #rightSectionHeader .studio-follow-button.studio-refresh-chip:hover,
|
|
7536
|
+
body.studio-ui-refresh #rightSectionHeader .studio-follow-button.studio-refresh-chip.is-open { color: var(--muted); background: transparent; }
|
|
7537
|
+
body.studio-ui-refresh #rightSectionHeader .studio-follow-button:focus-visible {
|
|
7538
|
+
outline: none; text-decoration: underline; text-underline-offset: 3px;
|
|
7539
|
+
}
|
|
7540
|
+
.studio-operation-notices { padding: 4px 12px; font-size: 12px; color: var(--warn); }
|
|
7541
|
+
.studio-operation-notice { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; margin: 3px 0; overflow-wrap: anywhere; }
|
|
7542
|
+
.studio-operation-notice button { font-size: 12px; padding: 1px 4px; }
|
|
7543
|
+
body.studio-workspace-layout .studio-workspace-row-one { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 6px 12px; }
|
|
7544
|
+
body.studio-workspace-layout .studio-workspace-tabs-host { min-width: 0; }
|
|
7545
|
+
body.studio-workspace-layout .studio-buffer-tabs { gap: 16px; flex-wrap: wrap; }
|
|
7546
|
+
body.studio-workspace-layout #leftSectionHeader .studio-buffer-tabs > .studio-buffer-menu-anchor > button {
|
|
7547
|
+
border: 0; border-radius: 0; background: transparent; padding: 3px 0; font-size: 14px; font-weight: 500; line-height: 20px; text-align: left; white-space: nowrap;
|
|
7548
|
+
}
|
|
7549
|
+
body.studio-workspace-layout #leftSectionHeader .studio-buffer-tabs > .studio-buffer-menu-anchor > button[aria-selected="true"] {
|
|
7550
|
+
background: transparent; box-shadow: none; color: var(--text); font-weight: 700;
|
|
7551
|
+
}
|
|
7552
|
+
body.studio-workspace-layout #leftSectionHeader .studio-buffer-tabs > .studio-buffer-menu-anchor > button[aria-selected="false"] {
|
|
7553
|
+
color: var(--muted);
|
|
7554
|
+
}
|
|
7555
|
+
/* Natural widths with a small gap (Oliver, trial48): the unselected label may shift a little on switching. */
|
|
7556
|
+
body.studio-workspace-layout .studio-workspace-file-controls { min-width: 0; margin-left: auto; display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; }
|
|
7557
|
+
body.studio-workspace-layout .studio-workspace-filename { min-width: 0; max-width: min(180px, 35cqi); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 400; }
|
|
7558
|
+
body.studio-workspace-layout .studio-refresh-toolbar-main { display: block; }
|
|
7559
|
+
body.studio-workspace-layout .studio-refresh-toolbar-actions { gap: 0; min-width: 0; width: 100%; }
|
|
7560
|
+
body.studio-workspace-layout .studio-refresh-toolbar-actions > .studio-refresh-action-line { min-width: 0; width: 100%; }
|
|
7561
|
+
body.studio-workspace-layout .studio-refresh-toolbar-state:empty,
|
|
7562
|
+
body.studio-workspace-layout .studio-refresh-action-line:empty,
|
|
7563
|
+
body.studio-workspace-layout .response-options-row:empty,
|
|
7564
|
+
body.studio-workspace-layout .response-option-select-wrap:not(:has(select)) { display: none; }
|
|
7565
|
+
body.studio-workspace-layout .reference-meta .source-badge,
|
|
7566
|
+
body.studio-workspace-layout #historyIndexBadge { border: 0; border-radius: 0; background: transparent; }
|
|
7567
|
+
body.studio-workspace-layout .studio-refresh-action-line { flex-wrap: wrap; gap: 6px 10px; }
|
|
7568
|
+
body.studio-workspace-layout .studio-refresh-menu > button { display: block; width: 100%; text-align: left; white-space: normal; }
|
|
7569
|
+
body.studio-workspace-layout .response-result-row { flex-wrap: wrap; }
|
|
7570
|
+
body.studio-workspace-layout .side-question-intro h2,
|
|
7571
|
+
body.studio-workspace-layout .side-question-thread-header h2 { font-size: 1rem; font-weight: 500; }
|
|
7572
|
+
body.studio-workspace-layout .side-question-scope { color: var(--muted); font-size: 0.82rem; overflow-wrap: anywhere; margin: 12px 0 6px; }
|
|
7573
|
+
body.studio-workspace-layout .side-question-options { color: var(--muted); font-size: 0.85rem; }
|
|
7574
|
+
body.studio-workspace-layout .side-question-options > summary { cursor: pointer; width: fit-content; }
|
|
7575
|
+
body.studio-workspace-layout .side-question-message { border: 0; border-radius: 0; background: transparent; padding: 10px 0; }
|
|
7576
|
+
body.studio-workspace-layout .side-question-message-user { margin-left: 0; border-color: transparent; background: transparent; }
|
|
7577
|
+
body.studio-workspace-layout .side-question-message-label { font-weight: 500; }
|
|
7578
|
+
body.studio-workspace-layout .side-question-live { animation: none; color: var(--muted); }
|
|
7579
|
+
body.studio-workspace-layout .side-question-context-summary { background: transparent; border: 0; border-radius: 0; padding: 0; }
|
|
7580
|
+
body.studio-workspace-layout .side-question-activity { border: 0; border-radius: 0; background: transparent; padding: 0; }
|
|
7581
|
+
body.studio-workspace-layout .side-question-activity li > span { width: auto; }
|
|
7582
|
+
|
|
7583
|
+
/* The live pane keeps its dimensions and ownership beneath the reader. */
|
|
7584
|
+
#rightPane:has(.studio-reader-surface) { position: relative; }
|
|
7585
|
+
#rightPane[data-linked-reader-active="1"] > #critiqueView,
|
|
7586
|
+
#rightPane[data-linked-reader-active="1"] > .response-wrap,
|
|
7587
|
+
#rightPane[data-linked-reader-active="1"] > .reference-meta { visibility: hidden; }
|
|
7588
|
+
#rightPane[data-linked-reader-active="1"] > .studio-reader-toolbar { position: absolute; left: 0; right: 0; }
|
|
7589
|
+
.studio-reader-toolbar { position: relative; z-index: 4; flex: 0 0 auto; display: flex; flex-wrap: wrap; align-items: center; gap: 5px 10px; padding: 6px 11px; border-bottom: 1px solid var(--control-border); background: var(--panel); }
|
|
7590
|
+
.studio-reader-surface { position: absolute; z-index: 3; left: 0; right: 0; bottom: 0; display: flex; flex-direction: column; min-height: 0; background: var(--panel); }
|
|
7591
|
+
.studio-reader-toolbar[hidden], .studio-reader-surface[hidden] { display: none; }
|
|
7592
|
+
.studio-reader-content { flex: 1 1 auto; min-height: 0; }
|
|
7593
|
+
.studio-reader-toolbar button.studio-reader-action { min-width: 0; max-width: 100%; padding: 2px 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text); background: transparent; border: 0; border-radius: 0; font-size: 12px; line-height: 20px; }
|
|
7594
|
+
.studio-reader-toolbar button.studio-reader-action:hover:not(:disabled) { color: var(--accent); background: transparent; }
|
|
7595
|
+
.studio-reader-toolbar button.studio-reader-action:disabled { color: var(--muted); }
|
|
7596
|
+
.studio-reader-toolbar button.studio-reader-action:focus-visible { outline: none; text-decoration: underline; text-underline-offset: 3px; }
|
|
7597
|
+
.studio-reader-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 5px 10px; max-width: 100%; margin-left: auto; }
|
|
7598
|
+
.studio-reader-snapshot { max-width: 100%; color: var(--muted); font-size: 11px; }
|
|
7599
|
+
|
|
7600
|
+
/* Trial48 style sweep (finding 3): actions and state are plain text, a fill marks only an
|
|
7601
|
+
enabled primary action, and keyboard focus is an underline rather than a box. */
|
|
7602
|
+
body.studio-workspace-layout #scratchpadBtn.has-content,
|
|
7603
|
+
body.studio-workspace-layout #reviewNotesBtn.has-content,
|
|
7604
|
+
body.studio-workspace-layout #reviewNotesBtn.is-active,
|
|
7605
|
+
body.studio-workspace-layout #outlineBtn.is-active,
|
|
7606
|
+
body.studio-workspace-layout .source-badge,
|
|
7607
|
+
body.studio-workspace-layout .trace-summary-badge,
|
|
7608
|
+
body.studio-workspace-layout .trace-summary-status,
|
|
7609
|
+
body.studio-workspace-layout .trace-entry-status,
|
|
7610
|
+
body.studio-workspace-layout .trace-kind-badge,
|
|
7611
|
+
body.studio-workspace-layout .trace-filter-btn,
|
|
7612
|
+
body.studio-workspace-layout .trace-filter-btn.is-active,
|
|
7613
|
+
body.studio-workspace-layout .trace-action-btn,
|
|
7614
|
+
body.studio-workspace-layout .files-toolbar-actions button,
|
|
7615
|
+
body.studio-workspace-layout .files-actions button,
|
|
7616
|
+
body.studio-workspace-layout .repl-journal-actions button,
|
|
7617
|
+
body.studio-workspace-layout .repl-journal-chip,
|
|
7618
|
+
body.studio-workspace-layout .repl-start-btn,
|
|
7619
|
+
body.studio-workspace-layout .side-question-actions .side-question-primary:disabled {
|
|
7620
|
+
border-color: transparent;
|
|
7621
|
+
background: transparent;
|
|
7622
|
+
box-shadow: none;
|
|
7623
|
+
}
|
|
7624
|
+
body.studio-workspace-layout .source-badge,
|
|
7625
|
+
body.studio-workspace-layout .trace-summary-badge,
|
|
7626
|
+
body.studio-workspace-layout .trace-summary-status,
|
|
7627
|
+
body.studio-workspace-layout .trace-entry-status,
|
|
7628
|
+
body.studio-workspace-layout .trace-kind-badge,
|
|
7629
|
+
body.studio-workspace-layout .repl-journal-chip { border-radius: 0; padding-left: 0; padding-right: 0; }
|
|
7630
|
+
body.studio-workspace-layout .trace-summary-badge { color: var(--text); font-size: 13px; font-weight: 700; }
|
|
7631
|
+
body.studio-workspace-layout .trace-filter-btn.is-active { color: var(--accent); }
|
|
7632
|
+
body.studio-workspace-layout #scratchpadBtn.has-content:not(:disabled):hover,
|
|
7633
|
+
body.studio-workspace-layout #reviewNotesBtn.has-content:not(:disabled):hover,
|
|
7634
|
+
body.studio-workspace-layout #reviewNotesBtn.is-active:not(:disabled):hover,
|
|
7635
|
+
body.studio-workspace-layout #outlineBtn.is-active:not(:disabled):hover,
|
|
7636
|
+
body.studio-workspace-layout .trace-filter-btn:not(:disabled):hover,
|
|
7637
|
+
body.studio-workspace-layout .trace-action-btn:not(:disabled):hover,
|
|
7638
|
+
body.studio-workspace-layout .files-toolbar-actions button:not(:disabled):hover,
|
|
7639
|
+
body.studio-workspace-layout .files-actions button:not(:disabled):hover,
|
|
7640
|
+
body.studio-workspace-layout .repl-journal-actions button:not(:disabled):hover,
|
|
7641
|
+
body.studio-workspace-layout .repl-start-btn:not(:disabled):hover {
|
|
7642
|
+
border-color: transparent;
|
|
7643
|
+
background: var(--studio-header-action-hover-bg, var(--panel-2));
|
|
7644
|
+
}
|
|
7645
|
+
body.studio-workspace-layout .trace-filter-btn:focus-visible,
|
|
7646
|
+
body.studio-workspace-layout .trace-action-btn:focus-visible,
|
|
7647
|
+
body.studio-workspace-layout .files-toolbar-actions button:focus-visible,
|
|
7648
|
+
body.studio-workspace-layout .files-actions button:focus-visible,
|
|
7649
|
+
body.studio-workspace-layout .repl-journal-actions button:focus-visible,
|
|
7650
|
+
body.studio-workspace-layout .repl-start-btn:focus-visible,
|
|
7651
|
+
body.studio-workspace-layout .side-question-options > summary:focus-visible {
|
|
7652
|
+
outline: none;
|
|
7653
|
+
text-decoration: underline;
|
|
7654
|
+
text-underline-offset: 3px;
|
|
7655
|
+
}
|
|
7656
|
+
body.studio-workspace-layout .side-question-composer-label textarea:focus,
|
|
7657
|
+
body.studio-workspace-layout .side-question-composer-label textarea:focus-visible {
|
|
7658
|
+
outline: none;
|
|
7659
|
+
box-shadow: none;
|
|
7660
|
+
border-color: var(--control-border);
|
|
7661
|
+
}
|
|
7662
|
+
|
|
7663
|
+
/* Oliver, 10 Oct: teal means Run Prompt only. Send to REPL and Quick send's buttons are
|
|
7664
|
+
plain, and the Quick send box shows focus without a ring. */
|
|
7665
|
+
body.studio-workspace-layout #sendReplBtn,
|
|
7666
|
+
body.studio-workspace-layout .repl-quick-actions button {
|
|
7667
|
+
min-width: 0;
|
|
7668
|
+
border-color: transparent;
|
|
7669
|
+
background: transparent;
|
|
7670
|
+
box-shadow: none;
|
|
7671
|
+
color: var(--text);
|
|
7672
|
+
font-weight: 500;
|
|
7673
|
+
}
|
|
7674
|
+
body.studio-workspace-layout #sendReplBtn:disabled,
|
|
7675
|
+
body.studio-workspace-layout .repl-quick-actions button:disabled { color: var(--muted); }
|
|
7676
|
+
body.studio-workspace-layout #sendReplBtn:not(:disabled):hover,
|
|
7677
|
+
body.studio-workspace-layout .repl-quick-actions button:not(:disabled):hover {
|
|
7678
|
+
border-color: transparent;
|
|
7679
|
+
background: var(--studio-header-action-hover-bg, var(--panel-2));
|
|
7680
|
+
}
|
|
7681
|
+
body.studio-workspace-layout #sendReplBtn:focus-visible,
|
|
7682
|
+
body.studio-workspace-layout .repl-quick-actions button:focus-visible {
|
|
7683
|
+
outline: none;
|
|
7684
|
+
text-decoration: underline;
|
|
7685
|
+
text-underline-offset: 3px;
|
|
7686
|
+
}
|
|
7687
|
+
body.studio-workspace-layout .repl-quick-composer textarea:focus,
|
|
7688
|
+
body.studio-workspace-layout .repl-quick-composer textarea:focus-visible {
|
|
7689
|
+
outline: none;
|
|
7690
|
+
box-shadow: none;
|
|
7691
|
+
border-color: var(--control-border);
|
|
7692
|
+
}
|
|
7693
|
+
|
|
7694
|
+
/* Oliver, 10 Oct: the side thread's model and Thinking sit beside its Ask button. */
|
|
7695
|
+
body.studio-workspace-layout .side-question-actions { align-items: center; }
|
|
7696
|
+
body.studio-workspace-layout .side-question-run-settings { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px 12px; color: var(--muted); font-size: 0.82rem; }
|
|
7697
|
+
body.studio-workspace-layout .side-question-run-settings label { display: inline-flex; align-items: center; gap: 6px; }
|
|
7698
|
+
body.studio-workspace-layout .side-question-thread-header > div:empty { flex: 1 1 auto; }
|
|
7699
|
+
|
|
7700
|
+
/* Oliver, 10 Oct: slightly less space between toolbar items, so View fits on a laptop. */
|
|
7701
|
+
body.studio-workspace-layout .studio-refresh-toolbar-actions .studio-refresh-action-line { column-gap: 8px; }
|
|
7702
|
+
body.studio-workspace-layout .studio-refresh-toolbar-actions .studio-refresh-action-line button:not(#sendRunBtn):not(#queueSteerBtn):not(#sendReplBtn):not(.request-stop-active) { padding-left: 6px; padding-right: 6px; }
|
|
7703
|
+
|
|
7704
|
+
/* Row 2 mirrors row 1: tools sit on the right and wrap on the right (Oliver, 10 Oct). */
|
|
7705
|
+
body.studio-workspace-layout .studio-refresh-tools { margin-left: auto; display: inline-flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 6px 8px; min-width: 0; }
|
|
7706
|
+
|
|
7707
|
+
/* Files, new layout (Oliver, 10 Oct): one plain location line, plain rows, and row actions only
|
|
7708
|
+
on the row under the mouse or keyboard focus. They overlay the row's end, so names keep their width. */
|
|
7709
|
+
body.studio-workspace-layout .files-location-line { display: flex; align-items: center; gap: 6px; min-width: 0; padding-bottom: 6px; border-bottom: 1px solid var(--panel-border); }
|
|
7710
|
+
body.studio-workspace-layout .files-location-line .files-up { flex: 0 0 auto; min-height: 0; padding: 0 8px; border-color: transparent; background: transparent; font-size: 16px; line-height: 1.5; }
|
|
7711
|
+
body.studio-workspace-layout .files-location-line .files-up:not(:disabled):hover { background: var(--studio-header-action-hover-bg, var(--panel-2)); }
|
|
7712
|
+
body.studio-workspace-layout .files-location-line .files-path { flex: 1 1 auto; min-width: 0; color: var(--text); font-family: var(--font-ui); font-size: 13px; }
|
|
7713
|
+
body.studio-workspace-layout .files-location-tools { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 4px; }
|
|
7714
|
+
body.studio-workspace-layout .files-location-line :is(.files-sort-select, .files-location-select) { border-color: transparent; background: transparent; }
|
|
7715
|
+
body.studio-workspace-layout .files-panel-workspace .files-list { gap: 0; grid-template-columns: minmax(0, 1fr); }
|
|
7716
|
+
body.studio-workspace-layout .files-panel-workspace .files-row { position: relative; padding: 3px 6px; border-color: transparent; border-radius: 6px; background: transparent; }
|
|
7717
|
+
body.studio-workspace-layout .files-panel-workspace .files-row { min-width: 0; } /* long names shorten; rows never outgrow the pane */
|
|
7718
|
+
body.studio-workspace-layout .files-panel-workspace .files-row:is(:hover, :focus-within) { border-color: transparent; background: var(--studio-header-action-hover-bg, var(--panel-2)); }
|
|
7719
|
+
body.studio-workspace-layout .files-panel-workspace .files-row .files-actions { position: absolute; right: 6px; top: 50%; transform: translateY(-50%); padding-left: 10px;
|
|
7720
|
+
background: var(--studio-header-action-hover-bg, var(--panel-2)); visibility: hidden; }
|
|
7721
|
+
body.studio-workspace-layout .files-panel-workspace .files-row:is(:hover, :focus-within) .files-actions,
|
|
7722
|
+
body.studio-workspace-layout .files-panel-workspace .files-row:has(.files-more[open]) .files-actions { visibility: visible; }
|
|
7723
|
+
body.studio-workspace-layout .files-panel-workspace .files-row:has(.files-more[open]) { z-index: 5; }
|
|
7724
|
+
|
|
7725
|
+
/* Undo for Add to Prompt, beside its status message (Oliver, 11 Oct). */
|
|
7726
|
+
.studio-status-undo { margin-left: 8px; padding: 0 2px; min-height: 0; border: 0; background: transparent; color: inherit; font: inherit; cursor: pointer;
|
|
7727
|
+
text-decoration: underline; text-underline-offset: 2px; }
|
|
7728
|
+
.studio-status-undo[hidden] { display: none; }
|
|
7729
|
+
|
|
7730
|
+
/* Trial48 wording (finding 5): menus show labels only; status has no dot. */
|
|
7731
|
+
body.studio-workspace-layout .studio-buffer-menu-help { display: none; }
|
|
7732
|
+
body.studio-workspace-layout #syncBadge::before { display: none; }
|
|
7733
|
+
|
|
7734
|
+
/* Candidate50 trial: the panel toggles are plain in their default state too (light theme showed boxes). */
|
|
7735
|
+
body.studio-workspace-layout #reviewNotesBtn,
|
|
7736
|
+
body.studio-workspace-layout #outlineBtn,
|
|
7737
|
+
body.studio-workspace-layout #scratchpadBtn { border-color: transparent; background: transparent; box-shadow: none; }
|
|
7738
|
+
body.studio-workspace-layout #reviewNotesBtn:not(:disabled):hover,
|
|
7739
|
+
body.studio-workspace-layout #outlineBtn:not(:disabled):hover,
|
|
7740
|
+
body.studio-workspace-layout #scratchpadBtn:not(:disabled):hover { background: var(--studio-header-action-hover-bg, var(--panel-2)); }
|
|
7741
|
+
|
|
7742
|
+
/* Oliver, 8 Oct: the remaining bordered buttons are plain too (polish item 13). Annotate response
|
|
7743
|
+
keeps its fill only as the enabled primary; header buttons show keyboard focus as an underline. */
|
|
7744
|
+
body.studio-workspace-layout #responseActions button:not(#annotateResponseBtn),
|
|
7745
|
+
body.studio-workspace-layout #responseActions #annotateResponseBtn:disabled,
|
|
7746
|
+
body.studio-workspace-layout .studio-operation-notice button {
|
|
7747
|
+
border-color: transparent;
|
|
7748
|
+
background: transparent;
|
|
7749
|
+
box-shadow: none;
|
|
7750
|
+
}
|
|
7751
|
+
body.studio-workspace-layout #responseActions button:not(#annotateResponseBtn):not(:disabled):hover,
|
|
7752
|
+
body.studio-workspace-layout .studio-operation-notice button:not(:disabled):hover {
|
|
7753
|
+
background: var(--studio-header-action-hover-bg, var(--panel-2));
|
|
7754
|
+
}
|
|
7755
|
+
body.studio-workspace-layout #responseActions button:focus-visible,
|
|
7756
|
+
body.studio-workspace-layout .studio-operation-notice button:focus-visible,
|
|
7757
|
+
body.studio-workspace-layout #leftSectionHeader button:focus-visible,
|
|
7758
|
+
body.studio-workspace-layout #rightSectionHeader button:focus-visible {
|
|
7759
|
+
outline: none;
|
|
7760
|
+
text-decoration: underline;
|
|
7761
|
+
text-underline-offset: 3px;
|
|
7762
|
+
}
|
|
7763
|
+
|
|
7764
|
+
/* Batch B: Files rows keep the name visible; Edit / Use as Prompt; the rest under ⋯. */
|
|
7765
|
+
body.studio-workspace-layout .files-row { display: flex; align-items: center; gap: 8px; }
|
|
7766
|
+
body.studio-workspace-layout .files-row .files-open-btn { flex: 1 1 auto; min-width: 0; display: flex; align-items: baseline; gap: 8px; text-align: left; }
|
|
7767
|
+
body.studio-workspace-layout .files-row .files-name { min-width: 6em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 0 1 auto; }
|
|
7768
|
+
body.studio-workspace-layout .files-row .files-meta { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1 1 0; color: var(--muted); }
|
|
7769
|
+
body.studio-workspace-layout .files-row .files-actions { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 2px; }
|
|
7770
|
+
body.studio-workspace-layout .files-more { position: relative; }
|
|
7771
|
+
body.studio-workspace-layout .files-more > summary { list-style: none; cursor: pointer; padding: 2px 8px; border-radius: 6px; color: var(--muted); }
|
|
7772
|
+
body.studio-workspace-layout .files-more > summary::-webkit-details-marker { display: none; }
|
|
7773
|
+
body.studio-workspace-layout .files-more > summary:hover { background: var(--studio-header-action-hover-bg, var(--panel-2)); color: var(--text); }
|
|
7774
|
+
body.studio-workspace-layout .files-more > summary:focus-visible { outline: none; text-decoration: underline; text-underline-offset: 3px; }
|
|
7775
|
+
body.studio-workspace-layout .files-more-menu { position: absolute; right: 0; top: calc(100% + 4px); z-index: 6; min-width: 170px; display: flex; flex-direction: column;
|
|
7776
|
+
padding: 4px; background: var(--panel); border: 1px solid var(--panel-border); border-radius: 8px; box-shadow: var(--panel-shadow); }
|
|
7777
|
+
body.studio-workspace-layout .files-more-menu button { text-align: left; border-color: transparent; background: transparent; }
|
|
7778
|
+
body.studio-workspace-layout .files-more-menu button:hover { background: var(--studio-header-action-hover-bg, var(--panel-2)); }
|
|
7779
|
+
/* Picker mode: one obvious action per row — click the name. */
|
|
7780
|
+
body.studio-workspace-layout .files-picking .files-actions { display: none; }
|
|
7781
|
+
body.studio-workspace-layout .files-picking :is(.files-kind-pdf, .files-kind-image) .files-open-btn,
|
|
7782
|
+
body.studio-workspace-layout .files-picking-copy .files-kind-office .files-open-btn { opacity: 0.45; }
|
|
7783
|
+
body.studio-workspace-layout .files-pick-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; padding: 8px 10px; margin-bottom: 8px;
|
|
7784
|
+
border-bottom: 1px solid var(--panel-border); background: var(--panel-2); }
|
|
7785
|
+
/* The strip and its Cancel stay in view while the list scrolls (Oliver, 10 Oct). */
|
|
7786
|
+
body.studio-workspace-layout .files-pick-strip { position: sticky; top: 0; z-index: 3; }
|
|
7787
|
+
body.studio-workspace-layout .files-pick-what { font-weight: 600; }
|
|
7788
|
+
/* REPL More stacks plain items like the other menus (Oliver, 10 Oct). */
|
|
7789
|
+
body.studio-workspace-layout .repl-more-menu { flex-direction: column; flex-wrap: nowrap; align-items: stretch; gap: 2px; width: max-content; min-width: 180px; max-width: min(340px, 80vw); }
|
|
7790
|
+
body.studio-workspace-layout .repl-more-menu button { display: block; width: 100%; min-height: 0; padding: 5px 8px; text-align: left; border-color: transparent; background: transparent; box-shadow: none; }
|
|
7791
|
+
body.studio-workspace-layout .repl-more-menu button:not(:disabled):hover { border-color: transparent; background: var(--studio-header-action-hover-bg, var(--panel-2)); }
|
|
7792
|
+
body.studio-workspace-layout .repl-more-menu button:disabled { color: var(--muted); }
|
|
7793
|
+
body.studio-workspace-layout .repl-more-menu button:focus-visible { outline: none; text-decoration: underline; text-underline-offset: 3px; }
|
|
7794
|
+
body.studio-workspace-layout .repl-more-send-mode { display: flex; align-items: center; gap: 6px; padding: 3px 8px 6px; margin-bottom: 2px; border-bottom: 1px solid var(--panel-border); color: var(--muted); font-size: 12px; }
|
|
7795
|
+
body.studio-workspace-layout .files-pick-path { flex: 1 1 180px; min-width: 0; padding: 4px 8px; border: 1px solid var(--control-border); border-radius: 6px;
|
|
7796
|
+
background: var(--panel); color: var(--text); font: 12px var(--font-mono); outline: none; }
|
|
7797
|
+
body.studio-workspace-layout .files-pick-strip button { border-color: transparent; background: transparent; }
|
|
7798
|
+
|
|
7799
|
+
/* Unsaved text: the name slot reads *Untitled*, in italics (Oliver, 8 Oct). */
|
|
7800
|
+
.studio-workspace-filename.is-untitled { font-style: italic; }
|
|
7801
|
+
|
|
7802
|
+
/* A named file's own menu: its full path, then the file actions (Oliver, 9 Oct). */
|
|
7803
|
+
body.studio-workspace-layout .studio-file-menu-path { padding: 4px 8px 6px; color: var(--muted); font-size: 0.82rem; font-weight: 400; overflow-wrap: anywhere; user-select: text; }
|
|
7804
|
+
/* Small buffer menus (view, file name, Add to Prompt) list their actions vertically. */
|
|
7805
|
+
body.studio-workspace-layout .studio-buffer-menu > button { display: block; width: 100%; text-align: left; }
|
|
7806
|
+
|
|
7807
|
+
/* Oliver, 13 Oct: every File ▾ item lines up with the rest. */
|
|
7808
|
+
body.studio-workspace-layout .studio-refresh-menu-item > #copyDraftBtn,
|
|
7809
|
+
body.studio-workspace-layout .studio-refresh-menu-item > button.studio-buffer-menu-item,
|
|
7810
|
+
body.studio-workspace-layout .studio-refresh-menu > button.studio-buffer-menu-item { padding: 8px 10px; }
|
|
7811
|
+
/* A row whose only control is hidden takes no space. */
|
|
7812
|
+
body.studio-workspace-layout .studio-refresh-menu-item:has(> :only-child[hidden]) { display: none; }
|