import { interactive, toggleable } from "../element" import { background, foreground } from "../style_tree/components" import { useTheme, Theme, Layer } from "../theme" import { Button } from "./button" export type Margin = { top: number bottom: number left: number right: number } interface IconButtonOptions { layer?: | Theme["lowest"] | Theme["middle"] | Theme["highest"] color?: keyof Theme["lowest"] margin?: Partial variant?: Button.Variant size?: Button.Size } type ToggleableIconButtonOptions = IconButtonOptions & { active_color?: keyof Theme["lowest"] active_layer?: Layer } export function icon_button({ color, margin, layer, variant, size }: IconButtonOptions = { variant: Button.variant.Default, size: Button.size.Medium, }) { const theme = useTheme() if (!color) color = "base" const background_color = variant === Button.variant.Ghost ? null : background(layer ?? theme.lowest, color) const m = { top: margin?.top ?? 0, bottom: margin?.bottom ?? 0, left: margin?.left ?? 0, right: margin?.right ?? 0, } const padding = { top: size === Button.size.Small ? 0 : 2, bottom: size === Button.size.Small ? 0 : 2, left: size === Button.size.Small ? 0 : 4, right: size === Button.size.Small ? 0 : 4, } return interactive({ base: { corner_radius: 6, padding: padding, margin: m, icon_width: 14, icon_height: 14, button_width: 20, button_height: 16, }, state: { default: { background: background_color, color: foreground(layer ?? theme.lowest, color), }, hovered: { background: background(layer ?? theme.lowest, color, "hovered"), color: foreground(layer ?? theme.lowest, color, "hovered"), }, clicked: { background: background(layer ?? theme.lowest, color, "pressed"), color: foreground(layer ?? theme.lowest, color, "pressed"), }, }, }) } export function toggleable_icon_button( theme: Theme, { color, active_color, margin, variant, size, active_layer }: ToggleableIconButtonOptions ) { if (!color) color = "base" return toggleable({ state: { inactive: icon_button({ color, margin, variant, size }), active: icon_button({ color: active_color ? active_color : color, margin, layer: active_layer, size }), }, }) }