diff --git a/@types/index.d.ts b/@types/index.d.ts index 0409535c..3c55bb69 100644 --- a/@types/index.d.ts +++ b/@types/index.d.ts @@ -150,6 +150,8 @@ declare namespace Electron { on(channel: "loadCreatorTheme", listener: (event: IpcRendererEvent, theme: Themes.Theme) => void): this; on(channel: "sync-themes-start", listener: (event: IpcRendererEvent) => void): this; on(channel: "sync-themes-end", listener: (event: IpcRendererEvent) => void): this; + on(channel: "did-maximized", listener: (event: IpcRendererEvent) => void): this; + on(channel: "did-restored", listener: (event: IpcRendererEvent) => void): this; send(channel: string, ...args: any[]): void; send(channel: "setTitle", data: { id: number; title: string }): this; @@ -183,6 +185,8 @@ declare namespace Electron { send(channel: "saveCreatorTheme", theme: Themes.Theme): this; send(channel: "sync-themes"): this; send(channel: "set-clipboard-data", data: WebApi.SetClipboardData): this; + send(channel: "did-maximized"): this; + send(channed: "did-restored"): this; invoke(channel: "writeNewExtensionToDisk", data: WebApi.WriteNewExtensionToDiskArgs): Promise; invoke(channel: "getAllLocalFileExtensionIds"): Promise; diff --git a/src/assets/fonts/Inter.ttf b/src/assets/fonts/Inter.ttf new file mode 100644 index 00000000..721147d8 Binary files /dev/null and b/src/assets/fonts/Inter.ttf differ diff --git a/src/constants/_app.ts b/src/constants/_app.ts index 802cd1e7..fc9e39c0 100644 --- a/src/constants/_app.ts +++ b/src/constants/_app.ts @@ -245,7 +245,7 @@ export const DEFAULT_PALETTE: Themes.Palette = { "bg-tab": "#222222", "bg-tab-hover": "#2c2c2c", "bg-tab-active": "#2c2c2c", - "fg-tab": "#7A7A7A", + "fg-tab": "#ffffff", "fg-tab-hover": "#ffffff", "fg-tab-active": "#ffffff", "bg-header": "#222222", diff --git a/src/main/window/WindowManager.ts b/src/main/window/WindowManager.ts index 3cd57fac..37749710 100755 --- a/src/main/window/WindowManager.ts +++ b/src/main/window/WindowManager.ts @@ -207,11 +207,13 @@ class WindowManager { E.ipcMain.on("window-minimize", () => { this.mainWindow.minimize(); }); - E.ipcMain.on("window-maximize", () => { + E.ipcMain.on("window-maximize", (event: E.IpcMainEvent) => { if (this.mainWindow.isMaximized()) { this.mainWindow.restore(); + event.reply("did-restored"); } else { this.mainWindow.maximize(); + event.reply("did-maximized"); } }); E.ipcMain.on("closeTab", (event, id) => { diff --git a/src/renderer/components/Tabs/index.tsx b/src/renderer/components/Tabs/index.tsx index fd3dd78a..c3176c9e 100755 --- a/src/renderer/components/Tabs/index.tsx +++ b/src/renderer/components/Tabs/index.tsx @@ -139,7 +139,7 @@ class Tabs extends React.Component { }; private mouseDownHandler = (e: React.MouseEvent) => { - (e.target as HTMLDivElement).style.cursor = "grabbing"; + (e.target as HTMLDivElement).style.cursor = "move"; this.isMoving = true; this.pos.x = e.pageX; @@ -149,7 +149,7 @@ class Tabs extends React.Component { window.addEventListener("mouseup", this.mouseUpHandler); }; private mouseUpHandler = (e: MouseEvent) => { - (e.target as HTMLDivElement).style.cursor = "grab"; + (e.target as HTMLDivElement).style.cursor = "default"; this.isMoving = false; window.removeEventListener("mousemove", this.mouseMoveHandler); diff --git a/src/renderer/components/Tabs/style.scss b/src/renderer/components/Tabs/style.scss index 646a4de3..415f4369 100755 --- a/src/renderer/components/Tabs/style.scss +++ b/src/renderer/components/Tabs/style.scss @@ -15,12 +15,16 @@ background-color: var(--bg-tab); color: var(--fg-tab); fill: var(--fg-tab); - + &:hover { background-color: var(--bg-tab-hover); color: var(--fg-tab-hover); fill: var(--fg-tab-hover); - cursor: pointer; + cursor: default; + } + + &:hover .tab__close{ + opacity: 0.4; } &__text { @@ -30,17 +34,25 @@ text-overflow: clip; font-size: var(--fontControlSize); margin-right: 6px; + opacity: 0.4; + } + + &:hover .tab__text { + opacity: 1; } &__close { - height: 16px; + height: 14px; color: var(--fg-tab); fill: var(--fg-tab); + opacity: 0; + display: inline-flex; &:hover { color: var(--fg-tab-hover); fill: var(--fg-tab-hover); - cursor: pointer; + cursor: default; + opacity: 1 !important; } } @@ -48,5 +60,35 @@ background-color: var(--bg-tab-active); color: var(--fg-tab-active); fill: var(--fg-tab-active); + opacity: 1; + + .tab__text { + opacity: 1; + } + + .tab__close { + opacity: 0.16; + } + + + } + + &_main_active { + background-color: var(--bg-panel); + + .icon { + color: var(--bg-panel); + filter: invert(1) + } + + &:hover { + cursor: default; + background-color: var(--bg-panel); + + .icon { + color: var(--bg-panel); + filter: invert(1) + } + } } } diff --git a/src/renderer/components/Tabs/tabs.tsx b/src/renderer/components/Tabs/tabs.tsx index 63ea4183..d62e80b3 100755 --- a/src/renderer/components/Tabs/tabs.tsx +++ b/src/renderer/components/Tabs/tabs.tsx @@ -24,8 +24,8 @@ const Tabs: React.FunctionComponent = props => { diff --git a/src/renderer/components/TopPanel/index.tsx b/src/renderer/components/TopPanel/index.tsx index 81036c2f..0a5167de 100755 --- a/src/renderer/components/TopPanel/index.tsx +++ b/src/renderer/components/TopPanel/index.tsx @@ -13,17 +13,33 @@ interface TopPanelProps { views?: Views; } +interface TopPanelStates { + isMaximized: boolean; +} + @inject("tabs") @inject("settings") @inject("views") @observer class TopPanel extends React.Component { props: TopPanelProps; + state: TopPanelStates; constructor(props: TopPanelProps) { super(props); this.props = props; + this.state = { isMaximized: false }; + } + + componentDidMount(): void { + E.ipcRenderer.on("did-maximized", () => { + this.setState({ isMaximized: true }); + }); + + E.ipcRenderer.on("did-restored", () => { + this.setState({ isMaximized: false }); + }); } private onMainTab = (e: React.MouseEvent & Event): void => { @@ -75,6 +91,7 @@ class TopPanel extends React.Component { onMainTab={this.onMainTab} openMenu={this.onOpenMenu} newTab={this.newTab} + isMaximized={this.state.isMaximized} /> ); } diff --git a/src/renderer/components/TopPanel/style.scss b/src/renderer/components/TopPanel/style.scss index 8a82a4c8..33000854 100755 --- a/src/renderer/components/TopPanel/style.scss +++ b/src/renderer/components/TopPanel/style.scss @@ -14,4 +14,8 @@ align-items: center; } } + + &:hover .tab__close { + opacity: 0.16; + } } diff --git a/src/renderer/components/TopPanel/toppanel.tsx b/src/renderer/components/TopPanel/toppanel.tsx index 9a5323b2..9bc4d727 100755 --- a/src/renderer/components/TopPanel/toppanel.tsx +++ b/src/renderer/components/TopPanel/toppanel.tsx @@ -7,6 +7,7 @@ interface TopPanelProps { current: number; scalePanel: number; visibleNewProjectBtn: boolean; + isMaximized: boolean; newTab(): void; onMainTab(e: React.MouseEvent): void; @@ -21,12 +22,15 @@ const TopPanel: React.FunctionComponent = props => { return (
- {props.visibleNewProjectBtn ? ( ) : ( "" @@ -35,16 +39,16 @@ const TopPanel: React.FunctionComponent = props => {
diff --git a/src/renderer/components/style.scss b/src/renderer/components/style.scss index 8fabbf9f..ccb77317 100644 --- a/src/renderer/components/style.scss +++ b/src/renderer/components/style.scss @@ -1,3 +1,10 @@ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 500; + src: url('../../assets/fonts/Inter.ttf') +} + html, body, #app, diff --git a/src/renderer/elements/Button/index.scss b/src/renderer/elements/Button/index.scss index 6e58cfe4..a848a4c1 100644 --- a/src/renderer/elements/Button/index.scss +++ b/src/renderer/elements/Button/index.scss @@ -72,12 +72,14 @@ &_title { padding: 12px; color: var(--fg-header); + opacity: .4; background-color: var(--bg-header-control); &:hover { - background-color: var(--bg-header-control-hover); - color: var(--bg-header-hover); - cursor: pointer; + opacity: 1; + // background-color: var(--bg-header-control-hover); + // color: var(--bg-header-hover); + cursor: default; } } &_control { @@ -88,14 +90,14 @@ &:hover { background-color: var(--bg-header-control-hover); color: var(--bg-header-control-hover); - cursor: pointer; + cursor: default; } } &_close { color: var(--fg-header-control); &:hover { background: var(--bg-window-close); - cursor: pointer; + cursor: default; } } diff --git a/src/renderer/elements/Icon/icons/Close.tsx b/src/renderer/elements/Icon/icons/Close.tsx index f5ba0d80..23358980 100644 --- a/src/renderer/elements/Icon/icons/Close.tsx +++ b/src/renderer/elements/Icon/icons/Close.tsx @@ -9,7 +9,13 @@ export const Close: React.FunctionComponent = props => { return ( - + + + ); }; diff --git a/src/renderer/elements/Icon/icons/CloseTab.tsx b/src/renderer/elements/Icon/icons/CloseTab.tsx new file mode 100644 index 00000000..a43326ac --- /dev/null +++ b/src/renderer/elements/Icon/icons/CloseTab.tsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const CloseTab: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#2C2C2C"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Figma.tsx b/src/renderer/elements/Icon/icons/Figma.tsx new file mode 100644 index 00000000..ed796444 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Figma.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Figma: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Maximize.tsx b/src/renderer/elements/Icon/icons/Maximize.tsx index c904641b..d75dfa3b 100644 --- a/src/renderer/elements/Icon/icons/Maximize.tsx +++ b/src/renderer/elements/Icon/icons/Maximize.tsx @@ -8,12 +8,10 @@ export const Maximize: React.FunctionComponent = props => { const color = props.color ? props.color : "#7a7a7a"; return ( - - - - - - + + + + ); }; diff --git a/src/renderer/elements/Icon/icons/Minimize.tsx b/src/renderer/elements/Icon/icons/Minimize.tsx index aae3c488..05c07d38 100644 --- a/src/renderer/elements/Icon/icons/Minimize.tsx +++ b/src/renderer/elements/Icon/icons/Minimize.tsx @@ -8,7 +8,10 @@ export const Minimize: React.FunctionComponent = props => { return ( - + + + + ); }; diff --git a/src/renderer/elements/Icon/icons/Restore.tsx b/src/renderer/elements/Icon/icons/Restore.tsx new file mode 100644 index 00000000..787f4130 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Restore.tsx @@ -0,0 +1,18 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Restore: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#7a7a7a"; + + return ( + + + + + + + ); +}; diff --git a/src/renderer/elements/Icon/index.tsx b/src/renderer/elements/Icon/index.tsx index a06c6b4c..def74bf5 100644 --- a/src/renderer/elements/Icon/index.tsx +++ b/src/renderer/elements/Icon/index.tsx @@ -18,7 +18,9 @@ import { Burger } from "./icons/Burger"; import { Delete } from "./icons/Delete"; import { MenuCorner } from "./icons/MenuCorner"; import { Sync } from "./icons/Sync"; - +import { Figma } from "./icons/Figma"; +import { Restore } from "./icons/Restore"; +import { CloseTab } from "./icons/CloseTab"; import "../../animations.scss"; import "./index.scss"; @@ -40,7 +42,10 @@ type Icons = | "Delete" | "Sync" | "MenuCorner" - | "Settings"; + | "Settings" + | "Figma" + | "Restore" + | "CloseTab"; export interface IconProps { color?: string; @@ -73,6 +78,9 @@ export class Icon extends React.Component { Settings, Sync, MenuCorner, + Figma, + Restore, + CloseTab, }; constructor(props: ContainerProps) {