WIP for keith

Nate Butler created

Change summary

crates/theme/src/theme.rs          | 21 ++++++-
styles/src/styleTree/tabBar.ts     | 85 ++++++++++++++++++++++++++++++++
styles/src/styleTree/workspace.ts  | 64 -----------------------
styles/src/themes/common/base16.ts |  4 
4 files changed, 105 insertions(+), 69 deletions(-)

Detailed changes

crates/theme/src/theme.rs 🔗

@@ -38,11 +38,7 @@ pub struct Theme {
 pub struct Workspace {
     pub background: Color,
     pub titlebar: Titlebar,
-    pub active_pane_active_tab: Tab,
-    pub active_pane_inactive_tab: Tab,
-    pub inactive_pane_active_tab: Tab,
-    pub inactive_pane_inactive_tab: Tab,
-    pub pane_button: Interactive<IconButton>,
+    pub tab_bar: TabBar,
     pub pane_divider: Border,
     pub leader_border_opacity: f32,
     pub leader_border_width: f32,
@@ -72,6 +68,21 @@ pub struct Titlebar {
     pub outdated_warning: ContainedText,
 }
 
+#[derive(Clone, Deserialize, Default)]
+pub struct TabBar {
+    #[serde(flatten)]
+    pub container: ContainerStyle,
+    pub pane_button: Interactive<IconButton>,
+    pub active_pane: TabStyles,
+    pub inactive_pane: TabStyles,
+}
+
+#[derive(Clone, Deserialize, Default)]
+pub struct TabStyles {
+    active_tab: Tab,
+    inactive_tab: Tab,
+}
+
 #[derive(Clone, Deserialize, Default)]
 pub struct AvatarRibbon {
     #[serde(flatten)]

styles/src/styleTree/tabBar.ts 🔗

@@ -0,0 +1,85 @@
+import Theme from "../themes/common/theme";
+import { iconColor, text, border, backgroundColor } from "./components";
+
+export default function tabBar(theme: Theme) {
+  const height = 32;
+
+  const tab = {
+    height,
+    background: backgroundColor(theme, 300),
+    border: border(theme, "primary", {
+      left: true,
+      bottom: true,
+      overlay: true,
+    }),
+    iconClose: iconColor(theme, "muted"),
+    iconCloseActive: iconColor(theme, "active"),
+    iconConflict: iconColor(theme, "warning"),
+    iconDirty: iconColor(theme, "info"),
+    iconWidth: 8,
+    spacing: 8,
+    text: text(theme, "sans", "secondary", { size: "sm" }),
+    padding: {
+      left: 8,
+      right: 8,
+    },
+    description: {
+      margin: { left: 6, top: 1 },
+      ...text(theme, "sans", "muted", { size: "2xs" })
+    }
+  };
+
+  const activePaneActiveTab = {
+    ...tab,
+    background: backgroundColor(theme, 500),
+    text: text(theme, "sans", "active", { size: "sm" }),
+    border: {
+      ...tab.border,
+    },
+  };
+
+  const inactivePaneInactiveTab = {
+    ...tab,
+    background: backgroundColor(theme, 300),
+    text: text(theme, "sans", "muted", { size: "sm" }),
+  };
+
+  const inactivePaneActiveTab = {
+    ...tab,
+    background: backgroundColor(theme, 500),
+    text: text(theme, "sans", "secondary", { size: "sm" }),
+    border: {
+      ...tab.border,
+    },
+  }
+
+  return {
+    height,
+    background: backgroundColor(theme, 300),
+    border: border(theme, "primary", {
+      left: true,
+      bottom: true,
+      overlay: true,
+    }),
+    activePane: {
+      activeTab: activePaneActiveTab,
+      inactiveTab: tab,
+    },
+    inactivePane: {
+      activeTab: inactivePaneActiveTab,
+      inactiveTab: inactivePaneInactiveTab,
+    },
+    paneButton: {
+      color: iconColor(theme, "secondary"),
+      border: {
+        ...activePaneActiveTab.border,
+      },
+      iconWidth: 12,
+      buttonWidth: activePaneActiveTab.height,
+      hover: {
+        color: iconColor(theme, "active"),
+        background: backgroundColor(theme, 300),
+      },
+    },
+  }
+}

styles/src/styleTree/workspace.ts 🔗

@@ -8,58 +8,13 @@ import {
   text,
 } from "./components";
 import statusBar from "./statusBar";
+import tabBar from "./tabBar";
 
 export function workspaceBackground(theme: Theme) {
   return backgroundColor(theme, 300);
 }
 
 export default function workspace(theme: Theme) {
-  const activePaneInactiveTab = {
-    height: 32,
-    background: workspaceBackground(theme),
-    iconClose: iconColor(theme, "muted"),
-    iconCloseActive: iconColor(theme, "active"),
-    iconConflict: iconColor(theme, "warning"),
-    iconDirty: iconColor(theme, "info"),
-    iconWidth: 8,
-    spacing: 8,
-    text: text(theme, "sans", "secondary", { size: "sm" }),
-    border: border(theme, "primary", {
-      left: true,
-      bottom: true,
-      overlay: true,
-    }),
-    padding: {
-      left: 8,
-      right: 8,
-    },
-    description: {
-      margin: { left: 6, top: 1 },
-      ...text(theme, "sans", "muted", { size: "2xs" })
-    }
-  };
-
-  const activePaneActiveTab = {
-    ...activePaneInactiveTab,
-    background: backgroundColor(theme, 500),
-    text: text(theme, "sans", "active", { size: "sm" }),
-    border: {
-      ...activePaneInactiveTab.border,
-      bottom: false,
-    },
-  };
-
-  const inactivePaneInactiveTab = {
-    ...activePaneInactiveTab,
-    background: backgroundColor(theme, 100),
-    text: text(theme, "sans", "placeholder", { size: "sm" }),
-  };
-
-  const inactivePaneActiveTab = {
-    ...activePaneInactiveTab,
-    text: text(theme, "sans", "placeholder", { size: "sm" }),
-  }
-
   const titlebarPadding = 6;
 
   return {
@@ -74,22 +29,7 @@ export default function workspace(theme: Theme) {
     },
     leaderBorderOpacity: 0.7,
     leaderBorderWidth: 2.0,
-    activePaneActiveTab,
-    activePaneInactiveTab,
-    inactivePaneActiveTab,
-    inactivePaneInactiveTab,
-    paneButton: {
-      color: iconColor(theme, "secondary"),
-      border: {
-        ...activePaneActiveTab.border,
-      },
-      iconWidth: 12,
-      buttonWidth: activePaneActiveTab.height,
-      hover: {
-        color: iconColor(theme, "active"),
-        background: backgroundColor(theme, 300),
-      },
-    },
+    tabBar: tabBar(theme),
     modal: {
       margin: {
         bottom: 52,

styles/src/themes/common/base16.ts 🔗

@@ -115,8 +115,8 @@ export function createTheme(
   const textColor = {
     primary: sample(ramps.neutral, 6),
     secondary: sample(ramps.neutral, 5),
-    muted: sample(ramps.neutral, 5),
-    placeholder: sample(ramps.neutral, 4),
+    muted: sample(ramps.neutral, 4),
+    placeholder: sample(ramps.neutral, 3),
     active: sample(ramps.neutral, 7),
     feature: sample(ramps.blue, 0.5),
     ok: sample(ramps.green, 0.5),