summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/ui
diff options
context:
space:
mode:
authorFilip <[email protected]>2025-09-24 18:05:15 +0200
committerGitHub <[email protected]>2025-09-24 11:05:15 -0500
commitd3b6545e7c6069c9db031634b7890e6b8eb4de2a (patch)
tree5457b28378cf453e2c138337fc1abee3b3423ed2 /packages/app/src/ui
parent3f911b22b011af74426699dac079b33badf862b1 (diff)
downloadopencode-d3b6545e7c6069c9db031634b7890e6b8eb4de2a.tar.gz
opencode-d3b6545e7c6069c9db031634b7890e6b8eb4de2a.zip
feat(app): added command palette (#2630)
Co-authored-by: Adam <[email protected]>
Diffstat (limited to 'packages/app/src/ui')
-rw-r--r--packages/app/src/ui/button.tsx67
-rw-r--r--packages/app/src/ui/link.tsx8
-rw-r--r--packages/app/src/ui/tooltip.tsx2
3 files changed, 31 insertions, 46 deletions
diff --git a/packages/app/src/ui/button.tsx b/packages/app/src/ui/button.tsx
index e496d41bb..21d89fbee 100644
--- a/packages/app/src/ui/button.tsx
+++ b/packages/app/src/ui/button.tsx
@@ -1,49 +1,36 @@
-import { Button as KobalteButton } from "@kobalte/core/button"
-import { splitProps } from "solid-js"
-import type { ComponentProps } from "solid-js"
+import { Button as Kobalte } from "@kobalte/core/button"
+import { type ComponentProps, splitProps } from "solid-js"
-export interface ButtonProps extends ComponentProps<typeof KobalteButton> {
- variant?: "primary" | "secondary" | "outline" | "ghost"
+export interface ButtonProps {
+ variant?: "primary" | "secondary" | "ghost"
size?: "sm" | "md" | "lg"
}
-export const buttonStyles = {
- base: "inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 cursor-pointer",
- variants: {
- primary: "bg-primary text-background hover:bg-secondary focus-visible:ring-primary data-[disabled]:opacity-50",
- secondary:
- "bg-background-panel text-text hover:bg-background-element focus-visible:ring-secondary data-[disabled]:opacity-50",
- outline:
- "border border-border bg-transparent text-text hover:bg-background-panel focus-visible:ring-border-active data-[disabled]:border-border-subtle data-[disabled]:text-text-muted",
- ghost: "text-text hover:bg-background-panel focus-visible:ring-border-active data-[disabled]:text-text-muted",
- },
- sizes: {
- sm: "h-8 px-3 text-sm",
- md: "h-10 px-4 text-sm",
- lg: "h-12 px-6 text-base",
- },
-}
-
-export function getButtonClasses(
- variant: keyof typeof buttonStyles.variants = "primary",
- size: keyof typeof buttonStyles.sizes = "md",
- className?: string,
-) {
- return `${buttonStyles.base} ${buttonStyles.variants[variant]} ${buttonStyles.sizes[size]}${className ? ` ${className}` : ""}`
-}
-
-export function Button(props: ButtonProps) {
- const [local, others] = splitProps(props, ["variant", "size", "class", "classList"])
+export function Button(props: ComponentProps<"button"> & ButtonProps) {
+ const [split, rest] = splitProps(props, ["variant", "size", "class", "classList"])
return (
- <KobalteButton
+ <Kobalte
+ {...rest}
+ data-size={split.size || "sm"}
+ data-variant={split.variant || "secondary"}
+ class="inline-flex items-center justify-center rounded-md cursor-pointer font-medium transition-colors
+ min-w-0 whitespace-nowrap truncate
+ data-[size=sm]:h-6 data-[size=sm]:pl-2 data-[size=sm]:text-xs
+ data-[size=md]:h-8 data-[size=md]:pl-3 data-[size=md]:text-sm
+ data-[size=lg]:h-10 data-[size=lg]:pl-4 data-[size=lg]:text-base
+ data-[variant=primary]:bg-primary data-[variant=primary]:text-background
+ data-[variant=primary]:hover:bg-secondary data-[variant=primary]:focus-visible:ring-primary
+ data-[variant=secondary]:bg-background-element data-[variant=secondary]:text-text
+ data-[variant=secondary]:hover:bg-background-element data-[variant=secondary]:focus-visible:ring-secondary
+ data-[variant=ghost]:text-text data-[variant=ghost]:hover:bg-background-panel data-[variant=ghost]:focus-visible:ring-border-active
+ focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-transparent
+ disabled:pointer-events-none disabled:opacity-50"
classList={{
- ...(local.classList ?? {}),
- [buttonStyles.base]: true,
- [buttonStyles.variants[local.variant || "primary"]]: true,
- [buttonStyles.sizes[local.size || "md"]]: true,
- [local.class ?? ""]: !!local.class,
+ ...(split.classList ?? {}),
+ [split.class ?? ""]: !!split.class,
}}
- {...others}
- />
+ >
+ {props.children}
+ </Kobalte>
)
}
diff --git a/packages/app/src/ui/link.tsx b/packages/app/src/ui/link.tsx
index a75a059ec..461206d58 100644
--- a/packages/app/src/ui/link.tsx
+++ b/packages/app/src/ui/link.tsx
@@ -1,15 +1,13 @@
import { A } from "@solidjs/router"
import { splitProps } from "solid-js"
import type { ComponentProps } from "solid-js"
-import { getButtonClasses } from "./button"
export interface LinkProps extends ComponentProps<typeof A> {
- variant?: "primary" | "secondary" | "outline" | "ghost"
+ variant?: "primary" | "secondary" | "ghost"
size?: "sm" | "md" | "lg"
}
export function Link(props: LinkProps) {
- const [local, others] = splitProps(props, ["variant", "size", "class"])
- const classes = local.variant ? getButtonClasses(local.variant, local.size, local.class) : local.class
- return <A class={classes} {...others} />
+ const [, others] = splitProps(props, ["variant", "size", "class"])
+ return <A {...others} />
}
diff --git a/packages/app/src/ui/tooltip.tsx b/packages/app/src/ui/tooltip.tsx
index f5884ca80..db826b77a 100644
--- a/packages/app/src/ui/tooltip.tsx
+++ b/packages/app/src/ui/tooltip.tsx
@@ -34,7 +34,7 @@ export function Tooltip(props: TooltipProps) {
<KobalteTooltip.Portal>
<KobalteTooltip.Content
classList={{
- "z-50 max-w-[320px] rounded-md bg-background-element px-2 py-1": true,
+ "z-[1000] max-w-[320px] rounded-md bg-background-element px-2 py-1": true,
"text-xs font-medium text-text shadow-md pointer-events-none!": true,
"transition-all duration-150 ease-out": true,
"transform-gpu transform-origin-[var(--kb-tooltip-content-transform-origin)]": true,