317 lines
10 KiB
TypeScript
317 lines
10 KiB
TypeScript
import { with_opacity } from "../theme/color"
|
|
import { Layer, StyleSets } from "../theme/create_theme"
|
|
import {
|
|
background,
|
|
border,
|
|
border_color,
|
|
foreground,
|
|
text,
|
|
} from "./components"
|
|
import hover_popover from "./hover_popover"
|
|
|
|
import { build_syntax } from "../theme/syntax"
|
|
import { interactive, toggleable } from "../element"
|
|
import { useTheme } from "../theme"
|
|
|
|
export default function editor(): any {
|
|
const theme = useTheme()
|
|
|
|
const { is_light } = theme
|
|
|
|
const layer = theme.highest
|
|
|
|
const autocomplete_item = {
|
|
corner_radius: 6,
|
|
padding: {
|
|
bottom: 2,
|
|
left: 6,
|
|
right: 6,
|
|
top: 2,
|
|
},
|
|
}
|
|
|
|
function diagnostic(layer: Layer, style_set: StyleSets) {
|
|
return {
|
|
text_scale_factor: 0.857,
|
|
header: {
|
|
border: border(layer, {
|
|
top: true,
|
|
}),
|
|
},
|
|
message: {
|
|
text: text(layer, "sans", style_set, "default", { size: "sm" }),
|
|
highlight_text: text(layer, "sans", style_set, "default", {
|
|
size: "sm",
|
|
weight: "bold",
|
|
}),
|
|
},
|
|
}
|
|
}
|
|
|
|
const syntax = build_syntax()
|
|
|
|
return {
|
|
text_color: syntax.primary.color,
|
|
background: background(layer),
|
|
active_line_background: with_opacity(background(layer, "on"), 0.75),
|
|
highlighted_line_background: background(layer, "on"),
|
|
// Inline autocomplete suggestions, Co-pilot suggestions, etc.
|
|
hint: syntax.hint,
|
|
suggestion: syntax.predictive,
|
|
code_actions: {
|
|
indicator: toggleable({
|
|
base: interactive({
|
|
base: {
|
|
color: foreground(layer, "variant"),
|
|
},
|
|
state: {
|
|
hovered: {
|
|
color: foreground(layer, "variant", "hovered"),
|
|
},
|
|
clicked: {
|
|
color: foreground(layer, "variant", "pressed"),
|
|
},
|
|
},
|
|
}),
|
|
state: {
|
|
active: {
|
|
default: {
|
|
color: foreground(layer, "accent"),
|
|
},
|
|
hovered: {
|
|
color: foreground(layer, "accent", "hovered"),
|
|
},
|
|
clicked: {
|
|
color: foreground(layer, "accent", "pressed"),
|
|
},
|
|
},
|
|
},
|
|
}),
|
|
|
|
vertical_scale: 0.55,
|
|
},
|
|
folds: {
|
|
icon_margin_scale: 2.5,
|
|
folded_icon: "icons/chevron_right_8.svg",
|
|
foldable_icon: "icons/chevron_down_8.svg",
|
|
indicator: toggleable({
|
|
base: interactive({
|
|
base: {
|
|
color: foreground(layer, "variant"),
|
|
},
|
|
state: {
|
|
hovered: {
|
|
color: foreground(layer, "on"),
|
|
},
|
|
clicked: {
|
|
color: foreground(layer, "base"),
|
|
},
|
|
},
|
|
}),
|
|
state: {
|
|
active: {
|
|
default: {
|
|
color: foreground(layer, "default"),
|
|
},
|
|
hovered: {
|
|
color: foreground(layer, "on"),
|
|
},
|
|
},
|
|
},
|
|
}),
|
|
ellipses: {
|
|
text_color: theme.ramps.neutral(0.71).hex(),
|
|
corner_radius_factor: 0.15,
|
|
background: {
|
|
// Copied from hover_popover highlight
|
|
default: {
|
|
color: theme.ramps.neutral(0.5).alpha(0.0).hex(),
|
|
},
|
|
|
|
hovered: {
|
|
color: theme.ramps.neutral(0.5).alpha(0.5).hex(),
|
|
},
|
|
|
|
clicked: {
|
|
color: theme.ramps.neutral(0.5).alpha(0.7).hex(),
|
|
},
|
|
},
|
|
},
|
|
fold_background: foreground(layer, "variant"),
|
|
},
|
|
diff: {
|
|
deleted: is_light
|
|
? theme.ramps.red(0.5).hex()
|
|
: theme.ramps.red(0.4).hex(),
|
|
modified: is_light
|
|
? theme.ramps.yellow(0.5).hex()
|
|
: theme.ramps.yellow(0.5).hex(),
|
|
inserted: is_light
|
|
? theme.ramps.green(0.4).hex()
|
|
: theme.ramps.green(0.5).hex(),
|
|
removed_width_em: 0.275,
|
|
width_em: 0.15,
|
|
corner_radius: 0.05,
|
|
},
|
|
/** Highlights matching occurrences of what is under the cursor
|
|
* as well as matched brackets
|
|
*/
|
|
document_highlight_read_background: with_opacity(
|
|
foreground(layer, "accent"),
|
|
0.1
|
|
),
|
|
document_highlight_write_background: theme.ramps
|
|
.neutral(0.5)
|
|
.alpha(0.4)
|
|
.hex(), // TODO: This was blend * 2
|
|
error_color: background(layer, "negative"),
|
|
gutter_background: background(layer),
|
|
gutter_padding_factor: 3.5,
|
|
line_number: with_opacity(foreground(layer), 0.35),
|
|
line_number_active: foreground(layer),
|
|
rename_fade: 0.6,
|
|
unnecessary_code_fade: 0.5,
|
|
selection: theme.players[0],
|
|
whitespace: theme.ramps.neutral(0.5).hex(),
|
|
guest_selections: [
|
|
theme.players[1],
|
|
theme.players[2],
|
|
theme.players[3],
|
|
theme.players[4],
|
|
theme.players[5],
|
|
theme.players[6],
|
|
theme.players[7],
|
|
],
|
|
autocomplete: {
|
|
background: background(theme.middle),
|
|
corner_radius: 8,
|
|
padding: 4,
|
|
margin: {
|
|
left: -14,
|
|
},
|
|
border: border(theme.middle),
|
|
shadow: theme.popover_shadow,
|
|
match_highlight: foreground(theme.middle, "accent"),
|
|
item: autocomplete_item,
|
|
hovered_item: {
|
|
...autocomplete_item,
|
|
match_highlight: foreground(theme.middle, "accent", "hovered"),
|
|
background: background(theme.middle, "hovered"),
|
|
},
|
|
selected_item: {
|
|
...autocomplete_item,
|
|
match_highlight: foreground(theme.middle, "accent", "active"),
|
|
background: background(theme.middle, "active"),
|
|
},
|
|
},
|
|
diagnostic_header: {
|
|
background: background(theme.middle),
|
|
icon_width_factor: 1.5,
|
|
text_scale_factor: 0.857,
|
|
border: border(theme.middle, {
|
|
bottom: true,
|
|
top: true,
|
|
}),
|
|
code: {
|
|
...text(theme.middle, "mono", { size: "sm" }),
|
|
margin: {
|
|
left: 10,
|
|
},
|
|
},
|
|
source: {
|
|
text: text(theme.middle, "sans", {
|
|
size: "sm",
|
|
weight: "bold",
|
|
}),
|
|
},
|
|
message: {
|
|
highlight_text: text(theme.middle, "sans", {
|
|
size: "sm",
|
|
weight: "bold",
|
|
}),
|
|
text: text(theme.middle, "sans", { size: "sm" }),
|
|
},
|
|
},
|
|
diagnostic_path_header: {
|
|
background: background(theme.middle),
|
|
text_scale_factor: 0.857,
|
|
filename: text(theme.middle, "mono", { size: "sm" }),
|
|
path: {
|
|
...text(theme.middle, "mono", { size: "sm" }),
|
|
margin: {
|
|
left: 12,
|
|
},
|
|
},
|
|
},
|
|
error_diagnostic: diagnostic(theme.middle, "negative"),
|
|
warning_diagnostic: diagnostic(theme.middle, "warning"),
|
|
information_diagnostic: diagnostic(theme.middle, "accent"),
|
|
hint_diagnostic: diagnostic(theme.middle, "warning"),
|
|
invalid_error_diagnostic: diagnostic(theme.middle, "base"),
|
|
invalid_hint_diagnostic: diagnostic(theme.middle, "base"),
|
|
invalid_information_diagnostic: diagnostic(theme.middle, "base"),
|
|
invalid_warning_diagnostic: diagnostic(theme.middle, "base"),
|
|
hover_popover: hover_popover(),
|
|
link_definition: {
|
|
color: syntax.link_uri.color,
|
|
underline: syntax.link_uri.underline,
|
|
},
|
|
jump_icon: interactive({
|
|
base: {
|
|
color: foreground(layer, "on"),
|
|
icon_width: 20,
|
|
button_width: 20,
|
|
corner_radius: 6,
|
|
padding: {
|
|
top: 6,
|
|
bottom: 6,
|
|
left: 6,
|
|
right: 6,
|
|
},
|
|
},
|
|
state: {
|
|
hovered: {
|
|
background: background(layer, "on", "hovered"),
|
|
},
|
|
},
|
|
}),
|
|
|
|
scrollbar: {
|
|
width: 12,
|
|
min_height_factor: 1.0,
|
|
track: {
|
|
border: border(layer, "variant", { left: true }),
|
|
},
|
|
thumb: {
|
|
background: with_opacity(background(layer, "inverted"), 0.3),
|
|
border: {
|
|
width: 1,
|
|
color: border_color(layer, "variant"),
|
|
top: false,
|
|
right: true,
|
|
left: true,
|
|
bottom: false,
|
|
},
|
|
},
|
|
git: {
|
|
deleted: is_light
|
|
? with_opacity(theme.ramps.red(0.5).hex(), 0.8)
|
|
: with_opacity(theme.ramps.red(0.4).hex(), 0.8),
|
|
modified: is_light
|
|
? with_opacity(theme.ramps.yellow(0.5).hex(), 0.8)
|
|
: with_opacity(theme.ramps.yellow(0.4).hex(), 0.8),
|
|
inserted: is_light
|
|
? with_opacity(theme.ramps.green(0.5).hex(), 0.8)
|
|
: with_opacity(theme.ramps.green(0.4).hex(), 0.8),
|
|
},
|
|
selections: foreground(layer, "accent")
|
|
},
|
|
composition_mark: {
|
|
underline: {
|
|
thickness: 1.0,
|
|
color: border_color(layer),
|
|
},
|
|
},
|
|
syntax,
|
|
}
|
|
}
|