diff options
| author | David Hill <[email protected]> | 2026-02-17 17:06:21 +0000 |
|---|---|---|
| committer | David Hill <[email protected]> | 2026-02-17 17:43:37 +0000 |
| commit | 2c17a980ffdc019d46b9e48a22bf719c009075e0 (patch) | |
| tree | 9bb151f2cd0be28daa582f4779ec7014776cab9c /packages/ui/src | |
| parent | b784c923a8eeab52412eaebb9a44ad05a1411165 (diff) | |
| download | opencode-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.tsx | 21 | ||||
| -rw-r--r-- | packages/ui/src/components/message-part.css | 117 |
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; |
