From b660984fce5f96a2d575fbb5cf37f32dd3dbebf1 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Mon, 23 May 2022 04:30:38 -0500 Subject: [PATCH] make simulated window controls perfect --- packages/config/interface.tsconfig.json | 2 +- .../interface/src/assets/svg/macos_close.svg | 6 +- .../src/assets/svg/macos_fullscreen.svg | 6 +- .../src/assets/svg/macos_minimize.svg | 4 +- .../interface/src/components/file/Sidebar.tsx | 15 ++-- .../src/components/os/TrafficLights.tsx | 85 +++++++++++-------- 6 files changed, 68 insertions(+), 50 deletions(-) diff --git a/packages/config/interface.tsconfig.json b/packages/config/interface.tsconfig.json index 37c826e69..cd42eb1a2 100644 --- a/packages/config/interface.tsconfig.json +++ b/packages/config/interface.tsconfig.json @@ -1,6 +1,6 @@ { "extends": "./base.tsconfig.json", "compilerOptions": { - "types": ["vite-plugin-svgr/client"] + "types": ["vite-plugin-svgr/client", "vite/client"] } } diff --git a/packages/interface/src/assets/svg/macos_close.svg b/packages/interface/src/assets/svg/macos_close.svg index 7584361f9..6fdcc7dca 100644 --- a/packages/interface/src/assets/svg/macos_close.svg +++ b/packages/interface/src/assets/svg/macos_close.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/packages/interface/src/assets/svg/macos_fullscreen.svg b/packages/interface/src/assets/svg/macos_fullscreen.svg index d19577145..39127d892 100644 --- a/packages/interface/src/assets/svg/macos_fullscreen.svg +++ b/packages/interface/src/assets/svg/macos_fullscreen.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/packages/interface/src/assets/svg/macos_minimize.svg b/packages/interface/src/assets/svg/macos_minimize.svg index 5f57c3321..f48195514 100644 --- a/packages/interface/src/assets/svg/macos_minimize.svg +++ b/packages/interface/src/assets/svg/macos_minimize.svg @@ -1,3 +1,3 @@ - - + + diff --git a/packages/interface/src/components/file/Sidebar.tsx b/packages/interface/src/components/file/Sidebar.tsx index 68e9bb990..7e1a4288a 100644 --- a/packages/interface/src/components/file/Sidebar.tsx +++ b/packages/interface/src/components/file/Sidebar.tsx @@ -1,10 +1,11 @@ import { LockClosedIcon } from '@heroicons/react/outline'; -import { CogIcon, EyeOffIcon, PlusIcon, ServerIcon } from '@heroicons/react/solid'; +import { CogIcon, EyeOffIcon, PlusIcon } from '@heroicons/react/solid'; import { useBridgeCommand, useBridgeQuery } from '@sd/client'; import { Button, Dropdown } from '@sd/ui'; import clsx from 'clsx'; -import { CirclesFour, Code, EjectSimple, MonitorPlay, Planet } from 'phosphor-react'; -import React, { useContext, useEffect, useState } from 'react'; +import { CirclesFour, Code, Planet } from 'phosphor-react'; +import React, { useContext } from 'react'; +import { useParams } from 'react-router'; import { NavLink, NavLinkProps } from 'react-router-dom'; import { AppPropsContext } from '../../App'; @@ -49,7 +50,7 @@ export const MacWindowControlsSpace: React.FC<{ const { children } = props; return ( -
+
{children}
); @@ -72,6 +73,7 @@ export function MacWindowControls() { export const Sidebar: React.FC = (props) => { const experimental = useStore((state) => state.experimental); + const params = useParams(); const appPropsContext = useContext(AppPropsContext); const { data: locations } = useBridgeQuery('SysGetLocations'); @@ -89,7 +91,10 @@ export const Sidebar: React.FC = (props) => { return (
- {appPropsContext?.platform === 'browser' ? : null} + {appPropsContext?.platform === 'browser' && + window.location.search.includes('showControls') ? ( + + ) : null} {appPropsContext?.platform === 'macOS' ? : null} void; } -export const TrafficLights: React.FC = (props) => { +export const MacTrafficLights: React.FC = (props) => { const [focused] = useFocusState(); return (
- - - + + +
); }; -interface LightProps { - mode: 'close' | 'minimize' | 'fullscreen'; - focused: boolean; - action?: () => void; +interface TrafficLightProps { + type: 'close' | 'minimize' | 'fullscreen'; + colorful: boolean; + onClick?: React.HTMLAttributes['onClick']; } -const Light: React.FC = (props) => { +const TrafficLight: React.FC = (props) => { + const { onClick = () => undefined, colorful = false, type } = props; + const iconPath = React.useRef(closeIconPath); + + useEffect(() => { + switch (type) { + case 'close': + iconPath.current = closeIconPath; + break; + case 'minimize': + iconPath.current = minimizeIconPath; + break; + case 'fullscreen': + iconPath.current = fullscreenIconPath; + break; + } + }, [type]); + return (
- {(() => { - switch (props.mode) { - case 'close': - return ( - - ); - case 'minimize': - return ( - - ); - case 'fullscreen': - return ( - - ); + onClick={onClick} + className={clsx( + 'rounded-full box-border w-[12px] h-[12px] border-[0.5px] border-transparent bg-[#CDCED0] dark:bg-[#2B2C2F] flex justify-center items-center', + { + 'border-red-900 !bg-[#EC6A5E] active:hover:!bg-red-700 dark:active:hover:!bg-red-400': + type === 'close' && colorful, + 'border-yellow-900 !bg-[#F4BE4F] active:hover:!bg-yellow-600 dark:active:hover:!bg-yellow-200': + type === 'minimize' && colorful, + 'border-green-900 !bg-[#61C253] active:hover:!bg-green-700 dark:active:hover:!bg-green-300': + type === 'fullscreen' && colorful } - })()} + )} + > + {colorful && ( + + )}
); };