summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src
diff options
context:
space:
mode:
authorDavid Hill <[email protected]>2026-02-17 17:06:21 +0000
committerDavid Hill <[email protected]>2026-02-17 17:43:37 +0000
commit2c17a980ffdc019d46b9e48a22bf719c009075e0 (patch)
tree9bb151f2cd0be28daa582f4779ec7014776cab9c /packages/ui/src
parentb784c923a8eeab52412eaebb9a44ad05a1411165 (diff)
downloadopencode-2c17a980ffdc019d46b9e48a22bf719c009075e0.tar.gz
opencode-2c17a980ffdc019d46b9e48a22bf719c009075e0.zip
refactor(ui): extract dock prompt shell
Diffstat (limited to 'packages/ui/src')
-rw-r--r--packages/ui/src/components/dock-prompt.tsx21
-rw-r--r--packages/ui/src/components/message-part.css117
2 files changed, 125 insertions, 13 deletions
diff --git a/packages/ui/src/components/dock-prompt.tsx b/packages/ui/src/components/dock-prompt.tsx
new file mode 100644
index 000000000..4def4862f
--- /dev/null
+++ b/packages/ui/src/components/dock-prompt.tsx
@@ -0,0 +1,21 @@
+import type { JSX } from "solid-js"
+
+export function DockPrompt(props: {
+ kind: "question" | "permission"
+ header: JSX.Element
+ children: JSX.Element
+ footer: JSX.Element
+ ref?: (el: HTMLDivElement) => void
+}) {
+ const slot = (name: string) => `${props.kind}-${name}`
+
+ return (
+ <div data-component="dock-prompt" data-kind={props.kind} ref={props.ref}>
+ <div data-slot={slot("body")}>
+ <div data-slot={slot("header")}>{props.header}</div>
+ <div data-slot={slot("content")}>{props.children}</div>
+ </div>
+ <div data-slot={slot("footer")}>{props.footer}</div>
+ </div>
+ )
+}
diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css
index d8a35c0f1..2cfa286d2 100644
--- a/packages/ui/src/components/message-part.css
+++ b/packages/ui/src/components/message-part.css
@@ -753,30 +753,121 @@
}
}
-[data-component="question-prompt"] {
+[data-component="dock-prompt"][data-kind="permission"] {
position: relative;
display: flex;
flex-direction: column;
gap: 0;
min-height: 0;
- max-height: var(--question-prompt-max-height, 100dvh);
+ max-height: 100dvh;
- &[data-permission="true"] {
- [data-slot="question-options"] {
- code {
- font-size: 14px;
- line-height: var(--line-height-large);
- }
+ [data-slot="permission-body"] {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ flex: 1;
+ min-height: 0;
+ padding: 8px 8px 0;
+ background-color: var(--surface-raised-stronger-non-alpha);
+ border-radius: 12px;
+ box-shadow: var(--shadow-xs-border);
+ overflow: clip;
+ position: relative;
+ z-index: 10;
+ }
+
+ [data-slot="permission-header"] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ padding: 0 10px;
+ }
+
+ [data-slot="permission-header-title"] {
+ font-family: var(--font-family-sans);
+ font-size: 14px;
+ font-weight: var(--font-weight-medium);
+ line-height: var(--line-height-large);
+ color: var(--text-strong);
+ min-width: 0;
+ }
+
+ [data-slot="permission-content"] {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ flex: 1;
+ min-height: 0;
+ }
+
+ [data-slot="permission-hint"] {
+ font-family: var(--font-family-sans);
+ font-size: 14px;
+ font-weight: var(--font-weight-regular);
+ line-height: var(--line-height-large);
+ color: var(--text-weak);
+ padding: 0 10px;
+ }
+
+ [data-slot="permission-patterns"] {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ margin-top: 8px;
+ margin-bottom: 16px;
+ padding: 1px 10px 8px;
+ flex: 1;
+ min-height: 0;
+ overflow-y: auto;
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+
+ &::-webkit-scrollbar {
+ display: none;
}
- [data-slot="question-footer-actions"] {
- [data-component="button"] {
- padding-left: 12px;
- padding-right: 12px;
- }
+ code {
+ font-size: 14px;
+ line-height: var(--line-height-large);
}
}
+ [data-slot="permission-footer"] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ flex-shrink: 0;
+ padding: 32px 8px 8px;
+ background-color: var(--background-base);
+ border: 1px solid var(--border-weak-base);
+ border-radius: 12px;
+ overflow: clip;
+ margin-top: -24px;
+ position: relative;
+ z-index: 0;
+ }
+
+ [data-slot="permission-footer-actions"] {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+
+ [data-component="button"] {
+ padding-left: 12px;
+ padding-right: 12px;
+ }
+ }
+}
+
+:is([data-component="question-prompt"], [data-component="dock-prompt"][data-kind="question"]) {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ min-height: 0;
+ max-height: var(--question-prompt-max-height, 100dvh);
+
[data-slot="question-body"] {
display: flex;
flex-direction: column;