workspace.titlebar -> titlebar in Theme

This commit is contained in:
Nate Butler 2023-06-27 17:27:58 -04:00
parent 19ca6a8875
commit 8b2732c3aa
5 changed files with 266 additions and 285 deletions

View file

@ -113,7 +113,6 @@ impl View for CollabTitlebarItem {
.with_child( .with_child(
right_container.contained().with_background_color( right_container.contained().with_background_color(
theme theme
.workspace
.titlebar .titlebar
.container .container
.background_color .background_color
@ -200,11 +199,11 @@ impl CollabTitlebarItem {
.as_ref() .as_ref()
.and_then(RepositoryEntry::branch) .and_then(RepositoryEntry::branch)
.map(|branch| format!("/{branch}")); .map(|branch| format!("/{branch}"));
let text_style = theme.workspace.titlebar.title.clone(); let text_style = theme.titlebar.title.clone();
let item_spacing = theme.workspace.titlebar.item_spacing; let item_spacing = theme.titlebar.item_spacing;
let mut highlight = text_style.clone(); let mut highlight = text_style.clone();
highlight.color = theme.workspace.titlebar.highlight_color; highlight.color = theme.titlebar.highlight_color;
let style = LabelStyle { let style = LabelStyle {
text: text_style, text: text_style,
@ -325,7 +324,7 @@ impl CollabTitlebarItem {
theme: &Theme, theme: &Theme,
cx: &mut ViewContext<Self>, cx: &mut ViewContext<Self>,
) -> AnyElement<Self> { ) -> AnyElement<Self> {
let titlebar = &theme.workspace.titlebar; let titlebar = &theme.titlebar;
let badge = if self let badge = if self
.user_store .user_store
@ -410,7 +409,7 @@ impl CollabTitlebarItem {
} }
let active = room.read(cx).is_screen_sharing(); let active = room.read(cx).is_screen_sharing();
let titlebar = &theme.workspace.titlebar; let titlebar = &theme.titlebar;
MouseEventHandler::<ToggleScreenSharing, Self>::new(0, cx, |state, _| { MouseEventHandler::<ToggleScreenSharing, Self>::new(0, cx, |state, _| {
let style = titlebar let style = titlebar
.screen_share_button .screen_share_button
@ -459,7 +458,7 @@ impl CollabTitlebarItem {
tooltip = "Mute microphone\nRight click for options"; tooltip = "Mute microphone\nRight click for options";
} }
let titlebar = &theme.workspace.titlebar; let titlebar = &theme.titlebar;
MouseEventHandler::<ToggleMute, Self>::new(0, cx, |state, _| { MouseEventHandler::<ToggleMute, Self>::new(0, cx, |state, _| {
let style = titlebar let style = titlebar
.toggle_microphone_button .toggle_microphone_button
@ -512,7 +511,7 @@ impl CollabTitlebarItem {
tooltip = "Mute speakers\nRight click for options"; tooltip = "Mute speakers\nRight click for options";
} }
let titlebar = &theme.workspace.titlebar; let titlebar = &theme.titlebar;
MouseEventHandler::<ToggleDeafen, Self>::new(0, cx, |state, _| { MouseEventHandler::<ToggleDeafen, Self>::new(0, cx, |state, _| {
let style = titlebar let style = titlebar
.toggle_speakers_button .toggle_speakers_button
@ -547,7 +546,7 @@ impl CollabTitlebarItem {
let icon = "icons/radix/exit.svg"; let icon = "icons/radix/exit.svg";
let tooltip = "Leave call"; let tooltip = "Leave call";
let titlebar = &theme.workspace.titlebar; let titlebar = &theme.titlebar;
MouseEventHandler::<LeaveCall, Self>::new(0, cx, |state, _| { MouseEventHandler::<LeaveCall, Self>::new(0, cx, |state, _| {
let style = titlebar.leave_call_button.style_for(state); let style = titlebar.leave_call_button.style_for(state);
Svg::new(icon) Svg::new(icon)
@ -596,7 +595,7 @@ impl CollabTitlebarItem {
"Share project with call participants" "Share project with call participants"
}; };
let titlebar = &theme.workspace.titlebar; let titlebar = &theme.titlebar;
enum ShareUnshare {} enum ShareUnshare {}
Some( Some(
@ -627,7 +626,7 @@ impl CollabTitlebarItem {
) )
.aligned() .aligned()
.contained() .contained()
.with_margin_left(theme.workspace.titlebar.item_spacing) .with_margin_left(theme.titlebar.item_spacing)
.into_any(), .into_any(),
) )
} }
@ -640,9 +639,9 @@ impl CollabTitlebarItem {
) -> AnyElement<Self> { ) -> AnyElement<Self> {
let tooltip = theme.tooltip.clone(); let tooltip = theme.tooltip.clone();
let user_menu_button_style = if avatar.is_some() { let user_menu_button_style = if avatar.is_some() {
&theme.titlebar.user_menu_button_online &theme.titlebar.user_menu.user_menu_button_online
} else { } else {
&theme.titlebar.user_menu_button_offline &theme.titlebar.user_menu.user_menu_button_offline
}; };
let avatar_style = &user_menu_button_style.avatar; let avatar_style = &user_menu_button_style.avatar;
@ -703,7 +702,7 @@ impl CollabTitlebarItem {
} }
fn render_sign_in_button(&self, theme: &Theme, cx: &mut ViewContext<Self>) -> AnyElement<Self> { fn render_sign_in_button(&self, theme: &Theme, cx: &mut ViewContext<Self>) -> AnyElement<Self> {
let titlebar = &theme.workspace.titlebar; let titlebar = &theme.titlebar;
MouseEventHandler::<SignIn, Self>::new(0, cx, |state, _| { MouseEventHandler::<SignIn, Self>::new(0, cx, |state, _| {
let style = titlebar.sign_in_button.inactive_state().style_for(state); let style = titlebar.sign_in_button.inactive_state().style_for(state);
Label::new("Sign In", style.text.clone()) Label::new("Sign In", style.text.clone())
@ -771,7 +770,7 @@ impl CollabTitlebarItem {
theme, theme,
cx, cx,
)) ))
.with_margin_right(theme.workspace.titlebar.face_pile_spacing), .with_margin_right(theme.titlebar.face_pile_spacing),
) )
}) })
.collect() .collect()
@ -795,7 +794,7 @@ impl CollabTitlebarItem {
theme, theme,
cx, cx,
)) ))
.with_margin_right(theme.workspace.titlebar.item_spacing) .with_margin_right(theme.titlebar.item_spacing)
.into_any() .into_any()
} }
@ -827,11 +826,10 @@ impl CollabTitlebarItem {
}) })
.unwrap_or(false); .unwrap_or(false);
let leader_style = theme.workspace.titlebar.leader_avatar; let leader_style = theme.titlebar.leader_avatar;
let follower_style = theme.workspace.titlebar.follower_avatar; let follower_style = theme.titlebar.follower_avatar;
let mut background_color = theme let mut background_color = theme
.workspace
.titlebar .titlebar
.container .container
.background_color .background_color
@ -846,7 +844,7 @@ impl CollabTitlebarItem {
let mut content = Stack::new() let mut content = Stack::new()
.with_children(user.avatar.as_ref().map(|avatar| { .with_children(user.avatar.as_ref().map(|avatar| {
let face_pile = FacePile::new(theme.workspace.titlebar.follower_avatar_overlap) let face_pile = FacePile::new(theme.titlebar.follower_avatar_overlap)
.with_child(Self::render_face( .with_child(Self::render_face(
avatar.clone(), avatar.clone(),
Self::location_style(workspace, location, leader_style, cx), Self::location_style(workspace, location, leader_style, cx),
@ -891,7 +889,7 @@ impl CollabTitlebarItem {
let mut container = face_pile let mut container = face_pile
.contained() .contained()
.with_style(theme.workspace.titlebar.leader_selection); .with_style(theme.titlebar.leader_selection);
if let Some(replica_id) = replica_id { if let Some(replica_id) = replica_id {
if followed_by_self { if followed_by_self {
@ -908,8 +906,8 @@ impl CollabTitlebarItem {
Some( Some(
AvatarRibbon::new(color) AvatarRibbon::new(color)
.constrained() .constrained()
.with_width(theme.workspace.titlebar.avatar_ribbon.width) .with_width(theme.titlebar.avatar_ribbon.width)
.with_height(theme.workspace.titlebar.avatar_ribbon.height) .with_height(theme.titlebar.avatar_ribbon.height)
.aligned() .aligned()
.bottom(), .bottom(),
) )
@ -1029,22 +1027,22 @@ impl CollabTitlebarItem {
| client::Status::Reconnecting { .. } | client::Status::Reconnecting { .. }
| client::Status::ReconnectionError { .. } => Some( | client::Status::ReconnectionError { .. } => Some(
Svg::new("icons/cloud_slash_12.svg") Svg::new("icons/cloud_slash_12.svg")
.with_color(theme.workspace.titlebar.offline_icon.color) .with_color(theme.titlebar.offline_icon.color)
.constrained() .constrained()
.with_width(theme.workspace.titlebar.offline_icon.width) .with_width(theme.titlebar.offline_icon.width)
.aligned() .aligned()
.contained() .contained()
.with_style(theme.workspace.titlebar.offline_icon.container) .with_style(theme.titlebar.offline_icon.container)
.into_any(), .into_any(),
), ),
client::Status::UpgradeRequired => Some( client::Status::UpgradeRequired => Some(
MouseEventHandler::<ConnectionStatusButton, Self>::new(0, cx, |_, _| { MouseEventHandler::<ConnectionStatusButton, Self>::new(0, cx, |_, _| {
Label::new( Label::new(
"Please update Zed to collaborate", "Please update Zed to collaborate",
theme.workspace.titlebar.outdated_warning.text.clone(), theme.titlebar.outdated_warning.text.clone(),
) )
.contained() .contained()
.with_style(theme.workspace.titlebar.outdated_warning.container) .with_style(theme.titlebar.outdated_warning.container)
.aligned() .aligned()
}) })
.with_cursor_style(CursorStyle::PointingHand) .with_cursor_style(CursorStyle::PointingHand)

View file

@ -66,7 +66,7 @@ pub struct Theme {
pub feedback: FeedbackStyle, pub feedback: FeedbackStyle,
pub welcome: WelcomeStyle, pub welcome: WelcomeStyle,
pub color_scheme: ColorScheme, pub color_scheme: ColorScheme,
pub titlebar: UserMenu, pub titlebar: Titlebar,
} }
#[derive(Deserialize, Default, Clone, JsonSchema)] #[derive(Deserialize, Default, Clone, JsonSchema)]
@ -81,7 +81,6 @@ pub struct ThemeMeta {
pub struct Workspace { pub struct Workspace {
pub background: Color, pub background: Color,
pub blank_pane: BlankPaneStyle, pub blank_pane: BlankPaneStyle,
pub titlebar: Titlebar,
pub tab_bar: TabBar, pub tab_bar: TabBar,
pub pane_divider: Border, pub pane_divider: Border,
pub leader_border_opacity: f32, pub leader_border_opacity: f32,
@ -138,8 +137,8 @@ pub struct Titlebar {
pub toggle_microphone_button: Toggleable<Interactive<IconButton>>, pub toggle_microphone_button: Toggleable<Interactive<IconButton>>,
pub toggle_speakers_button: Toggleable<Interactive<IconButton>>, pub toggle_speakers_button: Toggleable<Interactive<IconButton>>,
pub leave_call_button: Interactive<IconButton>, pub leave_call_button: Interactive<IconButton>,
pub user_menu_button: Toggleable<Interactive<IconButton>>,
pub toggle_contacts_badge: ContainerStyle, pub toggle_contacts_badge: ContainerStyle,
pub user_menu: UserMenu,
} }
#[derive(Clone, Deserialize, Default, JsonSchema)] #[derive(Clone, Deserialize, Default, JsonSchema)]

View file

@ -2296,11 +2296,11 @@ impl Workspace {
// (https://github.com/zed-industries/zed/issues/1290) // (https://github.com/zed-industries/zed/issues/1290)
let is_fullscreen = cx.window_is_fullscreen(); let is_fullscreen = cx.window_is_fullscreen();
let container_theme = if is_fullscreen { let container_theme = if is_fullscreen {
let mut container_theme = theme.workspace.titlebar.container; let mut container_theme = theme.titlebar.container;
container_theme.padding.left = container_theme.padding.right; container_theme.padding.left = container_theme.padding.right;
container_theme container_theme
} else { } else {
theme.workspace.titlebar.container theme.titlebar.container
}; };
enum TitleBar {} enum TitleBar {}
@ -2320,7 +2320,7 @@ impl Workspace {
} }
}) })
.constrained() .constrained()
.with_height(theme.workspace.titlebar.height) .with_height(theme.titlebar.height)
.into_any_named("titlebar") .into_any_named("titlebar")
} }

View file

@ -1,6 +1,49 @@
import { ColorScheme } from "../common"; import { ColorScheme } from "../common";
import { icon_button, toggleable_icon_button } from "../component/icon_button"
import { toggleable_text_button } from "../component/text_button"
import { interactive, toggleable } from "../element" import { interactive, toggleable } from "../element"
import { background, foreground, text } from "./components"; import { withOpacity } from "../theme/color";
import { background, border, foreground, text } from "./components";
const ITEM_SPACING = 8
interface SpacingProps {
container_height: number;
spacing: number;
}
function build_spacing(
container_height: number,
element_height: number,
spacing: number
) {
return {
group: spacing * 2,
item: spacing / 2,
marginY: (container_height - element_height) / 2,
marginX: (container_height - element_height) / 2,
}
}
function mac_os_controls(theme: ColorScheme, { container_height, spacing }: SpacingProps) {
return {}
}
function project_info(theme: ColorScheme, { container_height, spacing }: SpacingProps) {
return {}
}
function collaboration_stacks(theme: ColorScheme, { container_height, spacing }: SpacingProps) {
return {}
}
function sharing_controls(theme: ColorScheme, { container_height, spacing }: SpacingProps) {
return {}
}
function call_controls(theme: ColorScheme, { container_height, spacing }: SpacingProps) {
return {}
}
const titlebarButton = (theme: ColorScheme) => toggleable({ const titlebarButton = (theme: ColorScheme) => toggleable({
base: interactive({ base: interactive({
@ -57,29 +100,210 @@ const titlebarButton = (theme: ColorScheme) => toggleable({
* When logged out only shows a chevron. * When logged out only shows a chevron.
*/ */
function userMenuButton(theme: ColorScheme, online: boolean) { function userMenuButton(theme: ColorScheme, online: boolean) {
const button = toggleable({
base: interactive({
base: {
cornerRadius: 6,
height: 19,
width: online ? 36 : 23,
padding: {
top: 2,
bottom: 2,
left: 6,
right: 6,
},
...text(theme.lowest, "sans", { size: "xs" }),
background: background(theme.lowest),
},
state: {
hovered: {
...text(theme.lowest, "sans", "hovered", {
size: "xs",
}),
background: background(theme.lowest, "hovered"),
},
clicked: {
...text(theme.lowest, "sans", "pressed", {
size: "xs",
}),
background: background(theme.lowest, "pressed"),
},
},
}),
state: {
active: {
default: {
...text(theme.lowest, "sans", "active", { size: "xs" }),
background: background(theme.middle),
},
hovered: {
...text(theme.lowest, "sans", "active", { size: "xs" }),
background: background(theme.middle, "hovered"),
},
clicked: {
...text(theme.lowest, "sans", "active", { size: "xs" }),
background: background(theme.middle, "pressed"),
},
},
}
});
return { return {
user_menu: titlebarButton(theme), user_menu: button,
avatar: { avatar: {
icon_width: 16, icon_width: 16,
icon_height: 16, icon_height: 16,
cornerRadius: 4, cornerRadius: 4,
outer_corner_radius: 0, outer_corner_radius: 0,
outer_width: 0, outer_width: 0,
outerWidth: 10, outerWidth: 16,
outerCornerRadius: 10 outerCornerRadius: 16
}, },
icon: { icon: {
margin: {
left: online ? 2 : 0,
},
width: 11, width: 11,
height: 11, height: 11,
color: online ? foreground(theme.lowest) : background(theme.lowest) color: foreground(theme.lowest)
} }
} }
} }
export function titlebar(theme: ColorScheme) { export function titlebar(theme: ColorScheme) {
return { const avatarWidth = 18
userMenuButtonOnline: userMenuButton(theme, true), const avatarOuterWidth = avatarWidth + 4
userMenuButtonOffline: userMenuButton(theme, false) const followerAvatarWidth = 14
const followerAvatarOuterWidth = followerAvatarWidth + 4
return {
ITEM_SPACING,
facePileSpacing: 2,
height: 33, // 32px + 1px border. It's important the content area of the titlebar is evenly sized to vertically center avatar images.
background: background(theme.lowest),
border: border(theme.lowest, { bottom: true }),
padding: {
left: 80,
right: ITEM_SPACING,
},
// Project
title: text(theme.lowest, "sans", "variant"),
highlight_color: text(theme.lowest, "sans", "active").color,
// Collaborators
leaderAvatar: {
width: avatarWidth,
outerWidth: avatarOuterWidth,
cornerRadius: avatarWidth / 2,
outerCornerRadius: avatarOuterWidth / 2,
},
followerAvatar: {
width: followerAvatarWidth,
outerWidth: followerAvatarOuterWidth,
cornerRadius: followerAvatarWidth / 2,
outerCornerRadius: followerAvatarOuterWidth / 2,
},
inactiveAvatarGrayscale: true,
followerAvatarOverlap: 8,
leaderSelection: {
margin: {
top: 4,
bottom: 4,
},
padding: {
left: 2,
right: 2,
top: 2,
bottom: 2,
},
cornerRadius: 6,
},
avatarRibbon: {
height: 3,
width: 11,
// TODO: Chore: Make avatarRibbon colors driven by the theme rather than being hard coded.
},
// Sign in buttom
sign_in_button: toggleable_text_button(theme, {}),
// Offline Indicator
offlineIcon: {
color: foreground(theme.lowest, "variant"),
width: 16,
margin: {
left: ITEM_SPACING,
},
padding: {
right: 4,
},
},
// Notice that the collaboration server is out of date
outdatedWarning: {
...text(theme.lowest, "sans", "warning", { size: "xs" }),
background: withOpacity(background(theme.lowest, "warning"), 0.3),
border: border(theme.lowest, "warning"),
margin: {
left: ITEM_SPACING,
},
padding: {
left: 8,
right: 8,
},
cornerRadius: 6,
},
leave_call_button: icon_button(theme, {
margin: {
left: ITEM_SPACING / 2,
right: ITEM_SPACING
},
}),
toggle_microphone_button: toggleable_icon_button(theme, {
margin: {
left: ITEM_SPACING,
right: ITEM_SPACING / 2
},
active_color: 'negative'
}),
toggle_speakers_button: toggleable_icon_button(theme, {
margin: {
left: ITEM_SPACING / 2,
right: ITEM_SPACING / 2
},
}),
screen_share_button: toggleable_icon_button(theme, {
margin: {
left: ITEM_SPACING / 2,
right: ITEM_SPACING
},
active_color: 'accent'
}),
toggle_contacts_button: toggleable_icon_button(theme, {
margin: {
left: ITEM_SPACING,
right: ITEM_SPACING / 2
},
}),
// Jewel that notifies you that there are new contact requests
toggleContactsBadge: {
cornerRadius: 3,
padding: 2,
margin: { top: 3, left: 3 },
border: border(theme.lowest),
background: foreground(theme.lowest, "accent"),
},
shareButton: toggleable_text_button(theme, {}),
user_menu: {
userMenuButtonOnline: userMenuButton(theme, true),
userMenuButtonOffline: userMenuButton(theme, false),
}
} }
} }

View file

@ -1,6 +1,5 @@
import { ColorScheme } from "../theme/colorScheme" import { ColorScheme } from "../theme/colorScheme"
import { withOpacity } from "../theme/color" import { withOpacity } from "../theme/color"
import { toggleable } from "../element"
import { import {
background, background,
border, border,
@ -12,94 +11,11 @@ import {
import statusBar from "./statusBar" import statusBar from "./statusBar"
import tabBar from "./tabBar" import tabBar from "./tabBar"
import { interactive } from "../element" import { interactive } from "../element"
import merge from "ts-deepmerge"
import { icon_button, toggleable_icon_button } from "../component/icon_button" import { titlebar } from "./titlebar"
import { text_button, toggleable_text_button } from "../component/text_button"
export default function workspace(colorScheme: ColorScheme) { export default function workspace(colorScheme: ColorScheme) {
const layer = colorScheme.lowest const layer = colorScheme.lowest
const isLight = colorScheme.isLight const isLight = colorScheme.isLight
const itemSpacing = 8
const titlebarButton = toggleable({
base: interactive({
base: {
cornerRadius: 6,
padding: {
top: 1,
bottom: 1,
left: 8,
right: 8,
},
...text(layer, "sans", "variant", { size: "xs" }),
background: background(layer, "variant"),
border: border(layer),
},
state: {
hovered: {
...text(layer, "sans", "variant", "hovered", {
size: "xs",
}),
background: background(layer, "variant", "hovered"),
border: border(layer, "variant", "hovered"),
},
clicked: {
...text(layer, "sans", "variant", "pressed", {
size: "xs",
}),
background: background(layer, "variant", "pressed"),
border: border(layer, "variant", "pressed"),
},
},
}),
state: {
active: {
default: {
...text(layer, "sans", "variant", "active", { size: "xs" }),
background: background(layer, "variant", "active"),
border: border(layer, "variant", "active"),
},
},
}
});
const signInButton = toggleable({
base: interactive({
base: {
cornerRadius: 6,
padding: {
top: 1,
bottom: 1,
left: 8,
right: 8,
},
...text(layer, "sans", "variant", { size: "xs" }),
background: background(layer, "variant"),
},
state: {
hovered: {
...text(layer, "sans", "variant", "hovered", { size: "xs" }),
background: background(layer, "variant", "hovered"),
//border: border(layer, "variant", "hovered"),
},
clicked: {
...text(layer, "sans", "variant", "pressed", { size: "xs" }),
background: background(layer, "variant", "pressed"),
//border: border(layer, "variant", "pressed"),
}
}
}),
state: {
active: {
default: {
...text(layer, "sans", "variant", "active", { size: "xs" }),
background: background(layer, "variant", "active"),
//border: border(layer, "variant", "active"),
}
},
}
});
const avatarWidth = 18
const avatarOuterWidth = avatarWidth + 4
const followerAvatarWidth = 14
const followerAvatarOuterWidth = followerAvatarWidth + 4
return { return {
background: background(colorScheme.lowest), background: background(colorScheme.lowest),
@ -209,163 +125,7 @@ export default function workspace(colorScheme: ColorScheme) {
width: 1, width: 1,
}, },
statusBar: statusBar(colorScheme), statusBar: statusBar(colorScheme),
titlebar: { titlebar: titlebar(colorScheme),
itemSpacing,
facePileSpacing: 2,
height: 33, // 32px + 1px border. It's important the content area of the titlebar is evenly sized to vertically center avatar images.
background: background(layer),
border: border(layer, { bottom: true }),
padding: {
left: 80,
right: itemSpacing,
},
// Project
title: text(layer, "sans", "variant"),
highlight_color: text(layer, "sans", "active").color,
// Collaborators
leaderAvatar: {
width: avatarWidth,
outerWidth: avatarOuterWidth,
cornerRadius: avatarWidth / 2,
outerCornerRadius: avatarOuterWidth / 2,
},
followerAvatar: {
width: followerAvatarWidth,
outerWidth: followerAvatarOuterWidth,
cornerRadius: followerAvatarWidth / 2,
outerCornerRadius: followerAvatarOuterWidth / 2,
},
inactiveAvatarGrayscale: true,
followerAvatarOverlap: 8,
leaderSelection: {
margin: {
top: 4,
bottom: 4,
},
padding: {
left: 2,
right: 2,
top: 2,
bottom: 2,
},
cornerRadius: 6,
},
avatarRibbon: {
height: 3,
width: 11,
// TODO: Chore: Make avatarRibbon colors driven by the theme rather than being hard coded.
},
// Sign in buttom
// FlatButton, Variant
sign_in_button: merge(titlebarButton, {
inactive: {
default: {
margin: {
left: itemSpacing,
},
},
},
signInButton,
}),
// Offline Indicator
offlineIcon: {
color: foreground(layer, "variant"),
width: 16,
margin: {
left: itemSpacing,
},
padding: {
right: 4,
},
},
// Notice that the collaboration server is out of date
outdatedWarning: {
...text(layer, "sans", "warning", { size: "xs" }),
background: withOpacity(background(layer, "warning"), 0.3),
border: border(layer, "warning"),
margin: {
left: itemSpacing,
},
padding: {
left: 8,
right: 8,
},
cornerRadius: 6,
},
leave_call_button: icon_button(colorScheme, {
margin: {
left: itemSpacing / 2,
right: itemSpacing
},
}),
toggle_microphone_button: toggleable_icon_button(colorScheme, {
margin: {
left: itemSpacing,
right: itemSpacing / 2
},
active_color: 'negative'
}),
toggle_speakers_button: toggleable_icon_button(colorScheme, {
margin: {
left: itemSpacing / 2,
right: itemSpacing / 2
},
}),
screen_share_button: toggleable_icon_button(colorScheme, {
margin: {
left: itemSpacing / 2,
right: itemSpacing
},
active_color: 'accent'
}),
toggle_contacts_button: toggleable_icon_button(colorScheme, {
margin: {
left: itemSpacing,
right: itemSpacing / 2
},
}),
user_menu_button:
merge(titlebarButton, {
inactive: {
default: {
buttonWidth: 20,
iconWidth: 12,
},
},
active: {
default: {
iconWidth: 12,
button_width: 20,
background: background(layer, "variant", "active"),
color: foreground(layer, "variant", "active"),
}
},
}),
// Jewel that notifies you that there are new contact requests
toggleContactsBadge: {
cornerRadius: 3,
padding: 2,
margin: { top: 3, left: 3 },
border: border(layer),
background: foreground(layer, "accent"),
},
shareButton: toggleable_text_button(colorScheme, {}),
},
toolbar: { toolbar: {
height: 34, height: 34,
background: background(colorScheme.highest), background: background(colorScheme.highest),