From d6ce06173162bb9a3f65639a8e85cb7dcbe4b301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Wed, 4 Mar 2026 19:36:27 -0300 Subject: [PATCH] refactor: vscode / kilo-ui style --- packages/kilo-ui/src/components/button.css | 107 ++++++++++++++---- packages/kilo-ui/src/components/select.css | 54 +++++---- packages/kilo-ui/src/components/switch.css | 72 ++++++++++++ packages/kilo-ui/src/components/tabs.css | 65 ++++++++--- .../kilo-ui/src/components/text-field.css | 51 +++++++-- packages/kilo-vscode/src/KiloProvider.ts | 2 +- .../src/components/chat/PromptInput.tsx | 2 +- .../components/settings/AgentBehaviourTab.tsx | 41 ++++--- .../components/settings/AutoApproveTab.tsx | 3 +- .../src/components/settings/ContextTab.tsx | 4 +- .../src/components/settings/ProvidersTab.tsx | 24 +--- .../src/components/settings/Settings.tsx | 28 ++--- .../src/components/settings/SettingsRow.tsx | 18 +-- .../src/components/shared/ModelSelector.tsx | 2 +- .../kilo-vscode/webview-ui/src/i18n/en.ts | 4 +- .../webview-ui/src/styles/chat.css | 34 ++++++ 16 files changed, 373 insertions(+), 138 deletions(-) diff --git a/packages/kilo-ui/src/components/button.css b/packages/kilo-ui/src/components/button.css index 2aa86b2078c..2ddd442620f 100644 --- a/packages/kilo-ui/src/components/button.css +++ b/packages/kilo-ui/src/components/button.css @@ -1,26 +1,26 @@ -/* Kilo Button overrides – sized to match @vscode/webview-ui-toolkit */ +/* Kilo Button overrides – styled to match Figma design */ [data-component="button"] { font-family: var(--vscode-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif); font-size: 13px; - line-height: normal; + line-height: 16px; border-radius: 2px; cursor: pointer; + border-color: transparent; + box-shadow: none; - &:active:not([data-disabled]) { - opacity: 0.8; + &:focus-visible { + outline: 1px solid var(--border-focus); + outline-offset: 1px; } - &[data-variant="primary"] { - background-color: var(--surface-interactive-base); - color: var(--text-on-interactive-base, white); - border-color: transparent; - box-shadow: none; - font-weight: 500; + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } - &:hover:not([data-disabled]) { - background-color: var(--surface-interactive-hover); - } + &:active:not(:disabled) { + opacity: 0.8; } /* Full-width variant for "Start New Task" style buttons */ @@ -28,35 +28,96 @@ width: 100%; } - &[data-variant="secondary"] { + &[data-variant="primary"] { + background-color: var(--surface-brand-base); + color: #ffffff; + border-color: transparent; box-shadow: none; - border: 1px solid var(--border-weak-base); + font-weight: 400; + + [data-slot="icon-svg"] { + color: #ffffff; + } + + &:hover:not(:disabled) { + background-color: var(--surface-brand-hover); + } + + &:disabled { + background-color: var(--surface-brand-base); + opacity: 0.5; + } + } + + &[data-variant="secondary"] { + background-color: var(--button-secondary-base); + color: var(--text-strong); + border-color: transparent; + box-shadow: none; + font-weight: 400; + + &:hover:not(:disabled) { + background-color: var(--button-secondary-hover); + } + + &:disabled { + background-color: var(--button-secondary-base); + opacity: 0.5; + } + + [data-slot="icon-svg"] { + color: var(--icon-base); + } } &[data-variant="ghost"] { background: transparent; + border-color: transparent; box-shadow: none; + font-weight: 400; &:hover:not(:disabled) { - background-color: rgba(255, 255, 255, 0.03); + background-color: var(--surface-base-hover); + } + + &:disabled { + opacity: 0.5; } } &[data-size="normal"] { - height: 26px; - padding: 4px 11px; + height: 32px; + padding: 6px 16px; + gap: 6px; font-size: 13px; + line-height: 16px; + + &[data-icon] { + padding: 6px 16px 6px 12px; + } } &[data-size="large"] { - height: 30px; - padding: 6px 11px; + height: 32px; + padding: 6px 16px; + gap: 6px; font-size: 13px; + line-height: 16px; + + &[data-icon] { + padding: 6px 16px 6px 12px; + } } &[data-size="small"] { - height: 22px; - padding: 2px 8px; - font-size: 11px; + height: 24px; + padding: 4px 12px; + gap: 4px; + font-size: 13px; + line-height: 16px; + + &[data-icon] { + padding: 4px 12px 4px 8px; + } } } diff --git a/packages/kilo-ui/src/components/select.css b/packages/kilo-ui/src/components/select.css index 006ebc262ca..b2d95724272 100644 --- a/packages/kilo-ui/src/components/select.css +++ b/packages/kilo-ui/src/components/select.css @@ -1,51 +1,59 @@ -/* Kilo Select overrides – styled to match legacy SelectDropdown look */ +/* Kilo Select overrides – styled to match Figma design */ /* Select trigger (renders as a Button, override the button sizing) */ [data-component="select"] [data-slot="select-select-trigger"] { - height: auto !important; - min-height: 22px; - border-radius: 3px; - font-size: 12px; - line-height: normal; - padding: 1px 6px !important; + height: 32px; + min-height: 32px; + border-radius: 2px; + font-size: 13px; + line-height: 16px; + padding: 6px 12px !important; cursor: pointer; - background: transparent; - border: 1px solid rgba(255, 255, 255, 0.08); + background: var(--background-weak); + border: 1px solid var(--border-base); box-shadow: none; - opacity: 0.9; - gap: 6px; + gap: 8px; white-space: nowrap; - transition: all 150ms; - color: var(--text-base, var(--vscode-foreground)); + transition: border-color 150ms; + color: var(--icon-weak-base); + justify-content: space-between; &:hover:not(:disabled) { - opacity: 1; - background: rgba(255, 255, 255, 0.03); - border-color: rgba(255, 255, 255, 0.15); + background: var(--background-weak); + border-color: var(--border-hover); } &:focus-visible { outline: none; + border-color: var(--border-hover); box-shadow: 0 0 0 1px var(--border-focus); } &[data-expanded] { - background: rgba(255, 255, 255, 0.03); - border-color: rgba(255, 255, 255, 0.15); + background: var(--background-weak); + border-color: var(--border-hover); + } + + &:disabled { + cursor: not-allowed; + opacity: 0.5; } [data-slot="select-select-trigger-value"] { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - font-size: 12px; + font-size: 13px; + line-height: 16px; + color: var(--text-base); } [data-slot="select-select-trigger-icon"] { - width: 12px; - height: 12px; - opacity: 0.8; + width: 10px; + height: 20px; flex-shrink: 0; + color: var(--icon-weak-base); + background-color: transparent; } } @@ -82,7 +90,7 @@ box-sizing: border-box; border-radius: 0; padding: 6px 12px; - font-size: 12px; + font-size: 13px; line-height: 16px; cursor: pointer; gap: 8px; diff --git a/packages/kilo-ui/src/components/switch.css b/packages/kilo-ui/src/components/switch.css index 3317a530b91..dcb270f9277 100644 --- a/packages/kilo-ui/src/components/switch.css +++ b/packages/kilo-ui/src/components/switch.css @@ -4,4 +4,76 @@ [data-slot="switch-label"] { font-size: 13px; } + + [data-slot="switch-control"] { + display: flex; + flex-direction: row; + align-items: center; + box-sizing: border-box; + width: 36px; + height: 20px; + padding: 2px; + border-radius: 9999px; + border: none; + background: var(--border-base); + transition: background-color 150ms; + } + + [data-slot="switch-thumb"] { + width: 16px; + height: 16px; + box-sizing: border-box; + border-radius: 9999px; + border: none; + background: #ffffff; + box-shadow: + 0px 10px 15px -3px rgba(0, 0, 0, 0.1), + 0px 4px 6px -2px rgba(0, 0, 0, 0.05); + transform: translateX(0); + transition: transform 150ms; + } + + &:hover:not([data-disabled], [data-readonly]) [data-slot="switch-control"] { + border: none; + background-color: var(--border-hover); + } + + &:not([data-readonly]) [data-slot="switch-input"]:focus-visible ~ [data-slot="switch-control"] { + border: none; + box-shadow: none; + outline: 2px solid var(--border-focus); + outline-offset: 2px; + } + + &[data-checked] [data-slot="switch-control"] { + box-sizing: border-box; + border: none; + background-color: var(--border-focus); + } + + &[data-checked] [data-slot="switch-thumb"] { + border: none; + transform: translateX(16px); + background: #ffffff; + } + + &[data-checked]:hover:not([data-disabled], [data-readonly]) [data-slot="switch-control"] { + border: none; + background-color: var(--border-focus); + } + + &[data-disabled] [data-slot="switch-control"] { + border: none; + background-color: var(--border-base); + opacity: 0.5; + } + + &[data-disabled] [data-slot="switch-thumb"] { + background: #ffffff; + } + + &[data-invalid] [data-slot="switch-control"] { + border: none; + box-shadow: 0 0 0 1px var(--border-error); + } } diff --git a/packages/kilo-ui/src/components/tabs.css b/packages/kilo-ui/src/components/tabs.css index 15835b78760..6b29a0a4633 100644 --- a/packages/kilo-ui/src/components/tabs.css +++ b/packages/kilo-ui/src/components/tabs.css @@ -4,6 +4,25 @@ font-size: 13px; line-height: normal; + [data-slot="tabs-list"] { + padding: 8px; + } + + [data-slot="tabs-trigger-wrapper"] { + padding: 8px; + border-radius: 2px; + + &:has([data-selected]) { + background-color: var(--input-base); + } + } + + [data-slot="tabs-trigger"] { + font-size: 12px; + line-height: normal; + padding: 0px; + } + /* Pill variant: closest to legacy tab style */ &[data-variant="pill"] [data-slot="tabs-list"] { background: var(--input-base); @@ -17,23 +36,39 @@ font-size: 13px; } - /* Default/alt variant adjustments */ - [data-slot="tabs-trigger"] { - height: 48px; - padding: 4px 0; - font-size: 13px; - line-height: normal; - } + &[data-variant="settings"] { + container-type: inline-size; - /* Settings variant: content area padding and header styling */ - &[data-variant="settings"] [data-slot="tabs-content"] { - padding: 16px 20px; + [data-slot="tabs-list"] { + width: 180px; + min-width: 180px; + } - > h3 { - font-size: 18px; - font-weight: 600; - margin: 0 0 16px 0; - color: var(--vscode-foreground, var(--text-strong)); + @container (max-width: 500px) { + [data-slot="tabs-list"] { + width: auto; + min-width: auto; + } + [data-slot="tabs-trigger"] .label { + display: none; + } + } + + [data-slot="tabs-content"] { + background-color: var(--background-base); + padding: 8px 16px; + + > h3 { + font-size: 16px; + font-weight: 400; + margin: 16px 0; + color: var(--vscode-foreground, var(--text-strong)); + } + + [data-component="card"] { + padding: 0; + border: none; + } } } } diff --git a/packages/kilo-ui/src/components/text-field.css b/packages/kilo-ui/src/components/text-field.css index 31f64c0ea89..7919d4fc3ca 100644 --- a/packages/kilo-ui/src/components/text-field.css +++ b/packages/kilo-ui/src/components/text-field.css @@ -1,26 +1,63 @@ -/* Kilo Input / TextField overrides – sized to match @vscode/webview-ui-toolkit */ +/* Kilo Input / TextField overrides – styled to match Figma design */ [data-component="input"] { + &[data-variant="normal"] [data-slot="input-label"] { + font-size: 12px; + line-height: 14px; + font-weight: var(--font-weight-regular); + color: var(--text-base); + } + &[data-variant="normal"] [data-slot="input-wrapper"] { border-radius: 2px; + border: 1px solid var(--border-base); + background: var(--background-weak); + padding-right: 0; + transition: border-color 150ms; + + &:hover:not(:has([data-readonly])):not(:has(:disabled)) { + border-color: var(--border-hover); + } &:focus-within:not(:has([data-readonly])) { - border-color: var(--border-focus); + border-color: var(--border-hover); + box-shadow: 0 0 0 1px var(--border-focus); + } + + &:has([data-invalid]) { + background: var(--background-weak); + border: 1px solid var(--border-critical-base); box-shadow: none; } + + &:has(:disabled) { + opacity: 0.5; + } } &[data-variant="normal"] [data-slot="input-input"] { - height: 26px; - padding: 0 9px; + height: 32px; + padding: 6px 12px; font-size: 13px; - line-height: normal; + line-height: 16px; font-family: var(--vscode-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif); + color: var(--text-base); + + &::placeholder { + color: var(--icon-weak-base); + } } &[data-variant="normal"] textarea[data-slot="input-input"] { height: auto; - min-height: 26px; - padding: 9px; + min-height: 32px; + padding: 6px 12px; + } + + &[data-variant="normal"] [data-slot="input-error"] { + font-size: 12px; + line-height: 14px; + font-weight: var(--font-weight-regular); + color: var(--text-on-critical-base); } } diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index 13aed289b66..3656e92f186 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -2016,7 +2016,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper iconsBaseUri: webview.asWebviewUri(vscode.Uri.joinPath(this.extensionUri, "assets", "icons")), title: "Kilo Code", port: this.connectionService.getServerInfo()?.port, - extraStyles: `.container { height: 100%; display: flex; flex-direction: column; height: 100vh; }`, + extraStyles: `.container { height: 100%; display: flex; flex-direction: column; height: 100vh; border-right: 1px solid var(--border-weak-base); }`, }) } diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/PromptInput.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/PromptInput.tsx index e69c9d0bbd2..0bffbc552ce 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/PromptInput.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/PromptInput.tsx @@ -430,7 +430,7 @@ export const PromptInput: Component = () => { fallback={ @@ -412,7 +417,7 @@ const AgentBehaviourTab: Component = () => { }} /> - @@ -455,7 +460,7 @@ const AgentBehaviourTab: Component = () => {
{language.t("settings.agentBehaviour.instructionFiles")}
{ }} />
- diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/AutoApproveTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/AutoApproveTab.tsx index ff162fa09c7..79b08ed6554 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/AutoApproveTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/AutoApproveTab.tsx @@ -102,13 +102,14 @@ const AutoApproveTab: Component = () => { style={{ "font-family": "var(--vscode-editor-font-family, monospace)", "font-size": "12px", + "text-transform": "capitalize", }} > {tool}
{
0 || newPattern() ? "1px solid var(--border-weak-base)" : "none", @@ -98,7 +98,7 @@ const ContextTab: Component = () => { }} />
-
diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx index 69dbfc93a2d..a953352c5d2 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx @@ -104,7 +104,7 @@ const ProvidersTab: Component = () => {
{ label={(o) => o.label} onSelect={(o) => setNewDisabled(o)} variant="secondary" - size="small" triggerVariant="settings" placeholder="Select provider…" />