icon_button.ts

 1import { ColorScheme } from "../common";
 2import { interactive, toggleable } from "../element";
 3import { background, foreground } from "../styleTree/components";
 4import { Margin } from "../types/zed";
 5
 6interface IconButtonOptions {
 7    layer?: ColorScheme['lowest'] | ColorScheme['middle'] | ColorScheme['highest'];
 8    color?: keyof ColorScheme['lowest'];
 9    margin?: Partial<Margin>;
10}
11
12type ToggleableIconButtonOptions = IconButtonOptions & { active_color?: keyof ColorScheme['lowest'] };
13
14export function icon_button(theme: ColorScheme, { color, margin, layer }: IconButtonOptions) {
15    if (!color)
16        color = "base";
17
18    const m = {
19        top: margin?.top ?? 0,
20        bottom: margin?.bottom ?? 0,
21        left: margin?.left ?? 0,
22        right: margin?.right ?? 0,
23    }
24
25    return interactive({
26        base: {
27            corner_radius: 6,
28            padding: {
29                top: 2,
30                bottom: 2,
31                left: 4,
32                right: 4,
33            },
34            margin: m,
35            icon_width: 15,
36            icon_height: 15,
37            button_width: 23,
38            button_height: 19,
39        },
40        state: {
41            default: {
42                background: background(layer ?? theme.lowest, color),
43                color: foreground(layer ?? theme.lowest, color),
44            },
45            hovered: {
46                background: background(layer ?? theme.lowest, color, "hovered"),
47                color: foreground(layer ?? theme.lowest, color, "hovered"),
48
49            },
50            clicked: {
51                background: background(layer ?? theme.lowest, color, "pressed"),
52                color: foreground(layer ?? theme.lowest, color, "pressed"),
53
54            },
55        },
56    });
57}
58
59export function toggleable_icon_button(theme: ColorScheme, { color, active_color, margin }: ToggleableIconButtonOptions) {
60    if (!color)
61        color = "base";
62
63    return toggleable({
64        state: {
65            inactive: icon_button(theme, { color, margin }),
66            active: icon_button(theme, { color: active_color ? active_color : color, margin, layer: theme.middle }),
67        }
68    })
69}