statusBar.ts

  1import { ColorScheme } from "../theme/colorScheme"
  2import { background, border, foreground, text } from "./components"
  3import { interactive } from "./interactive"
  4import { toggleable } from "./toggle"
  5export default function statusBar(colorScheme: ColorScheme) {
  6  let layer = colorScheme.lowest
  7
  8  const statusContainer = {
  9    cornerRadius: 6,
 10    padding: { top: 3, bottom: 3, left: 6, right: 6 },
 11  }
 12
 13  const diagnosticStatusContainer = {
 14    cornerRadius: 6,
 15    padding: { top: 1, bottom: 1, left: 6, right: 6 },
 16  }
 17
 18  return {
 19    height: 30,
 20    itemSpacing: 8,
 21    padding: {
 22      top: 1,
 23      bottom: 1,
 24      left: 6,
 25      right: 6,
 26    },
 27    border: border(layer, { top: true, overlay: true }),
 28    cursorPosition: text(layer, "sans", "variant"),
 29    activeLanguage: interactive({
 30      base: {
 31        padding: { left: 6, right: 6 },
 32        ...text(layer, "sans", "variant")
 33      },
 34      state: {
 35        hovered: {
 36          ...text(layer, "sans", "on"),
 37        }
 38      }
 39    },
 40    ),
 41    autoUpdateProgressMessage: text(layer, "sans", "variant"),
 42    autoUpdateDoneMessage: text(layer, "sans", "variant"),
 43    lspStatus: interactive({
 44      base: {
 45        ...diagnosticStatusContainer,
 46        iconSpacing: 4,
 47        iconWidth: 14,
 48        height: 18,
 49        message: text(layer, "sans"),
 50        iconColor: foreground(layer)
 51      },
 52      state: {
 53        hovered: {
 54          message: text(layer, "sans"),
 55          iconColor: foreground(layer),
 56          background: background(layer, "hovered"),
 57        }
 58      }
 59    }),
 60    diagnosticMessage: interactive({
 61      base: {
 62        ...text(layer, "sans")
 63      },
 64      state: { hovered: text(layer, "sans", "hovered") }
 65    },
 66    ),
 67    diagnosticSummary:
 68      interactive({
 69        base: {
 70          height: 20,
 71          iconWidth: 16,
 72          iconSpacing: 2,
 73          summarySpacing: 6,
 74          text: text(layer, "sans", { size: "sm" }),
 75          iconColorOk: foreground(layer, "variant"),
 76          iconColorWarning: foreground(layer, "warning"),
 77          iconColorError: foreground(layer, "negative"),
 78          containerOk: {
 79            cornerRadius: 6,
 80            padding: { top: 3, bottom: 3, left: 7, right: 7 },
 81          },
 82          containerWarning: {
 83            ...diagnosticStatusContainer,
 84            background: background(layer, "warning"),
 85            border: border(layer, "warning"),
 86          },
 87          containerError: {
 88            ...diagnosticStatusContainer,
 89            background: background(layer, "negative"),
 90            border: border(layer, "negative"),
 91          }
 92        }, state: {
 93          hovered: {
 94            iconColorOk: foreground(layer, "on"),
 95            containerOk: {
 96              background: background(layer, "on", "hovered"),
 97            },
 98            containerWarning: {
 99              background: background(layer, "warning", "hovered"),
100              border: border(layer, "warning", "hovered"),
101            },
102            containerError: {
103              background: background(layer, "negative", "hovered"),
104              border: border(layer, "negative", "hovered"),
105            }
106          }
107        }
108      }
109      ),
110    panelButtons: {
111      groupLeft: {},
112      groupBottom: {},
113      groupRight: {},
114      button: toggleable(interactive({
115        base: {
116          ...statusContainer,
117          iconSize: 16,
118          iconColor: foreground(layer, "variant"),
119          label: {
120            margin: { left: 6 },
121            ...text(layer, "sans", { size: "sm" }),
122          },
123        }, state: {
124          hovered: {
125            iconColor: foreground(layer, "hovered"),
126            background: background(layer, "variant"),
127          }
128        }
129      }),
130        {
131          default: {
132            iconColor: foreground(layer, "active"),
133            background: background(layer, "active"),
134          }
135        }),
136      badge: {
137        cornerRadius: 3,
138        padding: 2,
139        margin: { bottom: -1, right: -1 },
140        border: border(layer),
141        background: background(layer, "accent"),
142      },
143    },
144  }
145}