summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-30 10:21:32 -0600
committerAdam <[email protected]>2025-12-30 10:21:37 -0600
commite53192889cb9f7c2554d0229df9f5b2c87786e43 (patch)
tree68d114ff80ff1a38447a851702ec20a065063b14
parent23bbfb3d1584d9dd98ccb5431d193894af91f138 (diff)
downloadopencode-e53192889cb9f7c2554d0229df9f5b2c87786e43.tar.gz
opencode-e53192889cb9f7c2554d0229df9f5b2c87786e43.zip
fix(app): better text selection
-rw-r--r--packages/app/src/components/prompt-input.tsx1
-rw-r--r--packages/app/src/components/terminal.tsx1
-rw-r--r--packages/app/src/pages/layout.tsx2
-rw-r--r--packages/app/src/pages/session.tsx6
-rw-r--r--packages/ui/src/components/message-part.css12
-rw-r--r--packages/ui/src/components/session-review.css4
-rw-r--r--packages/ui/src/components/session-turn.css5
7 files changed, 27 insertions, 4 deletions
diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx
index 91e463832..5f0b4bdc5 100644
--- a/packages/app/src/components/prompt-input.tsx
+++ b/packages/app/src/components/prompt-input.tsx
@@ -1321,6 +1321,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
onInput={handleInput}
onKeyDown={handleKeyDown}
classList={{
+ "select-text": true,
"w-full px-5 py-3 pr-12 text-14-regular text-text-strong focus:outline-none whitespace-pre-wrap": true,
"[&_[data-type=file]]:text-icon-info-active": true,
"font-mono!": store.mode === "shell",
diff --git a/packages/app/src/components/terminal.tsx b/packages/app/src/components/terminal.tsx
index 03251fe5f..b1bb36470 100644
--- a/packages/app/src/components/terminal.tsx
+++ b/packages/app/src/components/terminal.tsx
@@ -233,6 +233,7 @@ export const Terminal = (props: TerminalProps) => {
style={{ "background-color": terminalColors().background }}
classList={{
...(local.classList ?? {}),
+ "select-text": true,
"size-full px-6 py-3 font-mono": true,
[local.class ?? ""]: !!local.class,
}}
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index aea7be3aa..f9322201a 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -1015,7 +1015,7 @@ export default function Layout(props: ParentProps) {
}
return (
- <div class="relative flex-1 min-h-0 flex flex-col">
+ <div class="relative flex-1 min-h-0 flex flex-col select-none [&_input]:select-text [&_textarea]:select-text [&_[contenteditable]]:select-text">
<Header
navigateToProject={navigateToProject}
navigateToSession={navigateToSession}
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index 4d25f86ab..6b9ff9e08 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -858,7 +858,7 @@ export default function Page() {
</Tabs.List>
</div>
<Show when={diffs().length}>
- <Tabs.Content value="review" class="select-text flex flex-col h-full overflow-hidden contain-strict">
+ <Tabs.Content value="review" class="flex flex-col h-full overflow-hidden contain-strict">
<div class="relative pt-2 flex-1 min-h-0 overflow-hidden">
<SessionReview
classes={{
@@ -884,7 +884,7 @@ export default function Page() {
},
)
return (
- <Tabs.Content value={tab} class="select-text mt-3">
+ <Tabs.Content value={tab} class="mt-3">
<Switch>
<Match when={file()}>
{(f) => (
@@ -896,7 +896,7 @@ export default function Page() {
cacheKey: checksum(f().content?.content ?? ""),
}}
overflow="scroll"
- class="pb-40"
+ class="select-text pb-40"
/>
)}
</Match>
diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css
index 4338940cb..c34a76e6d 100644
--- a/packages/ui/src/components/message-part.css
+++ b/packages/ui/src/components/message-part.css
@@ -377,6 +377,18 @@
}
}
+[data-component="user-message"] [data-slot="user-message-text"],
+[data-component="text-part"],
+[data-component="reasoning-part"],
+[data-component="tool-error"],
+[data-component="tool-output"],
+[data-component="edit-content"],
+[data-component="write-content"],
+[data-component="todos"],
+[data-component="diagnostics"] {
+ user-select: text;
+}
+
[data-component="tool-part-wrapper"] {
width: 100%;
diff --git a/packages/ui/src/components/session-review.css b/packages/ui/src/components/session-review.css
index 35df4a80f..15a0447b2 100644
--- a/packages/ui/src/components/session-review.css
+++ b/packages/ui/src/components/session-review.css
@@ -65,6 +65,10 @@
}
}
+ [data-slot="accordion-content"] {
+ user-select: text;
+ }
+
[data-slot="session-review-trigger-content"] {
display: flex;
align-items: center;
diff --git a/packages/ui/src/components/session-turn.css b/packages/ui/src/components/session-turn.css
index 599116d28..a35219efa 100644
--- a/packages/ui/src/components/session-turn.css
+++ b/packages/ui/src/components/session-turn.css
@@ -116,6 +116,11 @@
color: var(--text-weak);
}
+ [data-slot="session-turn-markdown"],
+ [data-slot="session-turn-accordion"] [data-slot="accordion-content"] {
+ user-select: text;
+ }
+
[data-slot="session-turn-markdown"] {
&[data-diffs="true"] {
font-size: 15px;