icon_button.ts

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