diff --git a/packages/insomnia-app/app/common/strings.ts b/packages/insomnia-app/app/common/strings.ts index b13fc619b6..f8ff7df572 100644 --- a/packages/insomnia-app/app/common/strings.ts +++ b/packages/insomnia-app/app/common/strings.ts @@ -6,7 +6,6 @@ export interface StringInfo { type StringId = | 'collection' | 'document' - | 'home' | 'project' | 'workspace' | 'defaultProject' @@ -23,10 +22,6 @@ export const strings: Record = { singular: 'Document', plural: 'Documents', }, - home: { - singular: 'Dashboard', - plural: 'Dashboards', - }, project: { singular: 'Project', plural: 'Projects', diff --git a/packages/insomnia-app/app/ui/components/app-header.tsx b/packages/insomnia-app/app/ui/components/app-header.tsx new file mode 100644 index 0000000000..899d278a34 --- /dev/null +++ b/packages/insomnia-app/app/ui/components/app-header.tsx @@ -0,0 +1,54 @@ +import { Breadcrumb, BreadcrumbProps, Header as _Header } from 'insomnia-components'; +import React, { FC, Fragment, ReactNode } from 'react'; +import styled from 'styled-components'; + +import coreLogo from '../images/insomnia-core-logo.png'; +import { SettingsButton } from './buttons/settings-button'; +import { AccountDropdownButton } from './dropdowns/account-dropdown'; + +const Header = styled(_Header)({ + whiteSpace: 'nowrap', +}); + +const RightWrapper = styled.div({ + transformOrigin: 'right', + transform: 'scale(0.85)', + display: 'flex', + justifySelf: 'flex-end', + alignItems: 'center', + '& .tooltip': { + display: 'flex', + alignItems: 'center', + }, +}); + +export interface AppHeaderProps { + breadcrumbProps: BreadcrumbProps; + gridCenter?: ReactNode; + gridRight?: ReactNode; +} + +export const AppHeader: FC = ({ + breadcrumbProps, + gridCenter, + gridRight, +}) => { + return ( +
+ Insomnia + + + )} + gridCenter={gridCenter} + gridRight={( + + {gridRight} + + + + )} + /> + ); +}; diff --git a/packages/insomnia-app/app/ui/components/buttons/settings-button.tsx b/packages/insomnia-app/app/ui/components/buttons/settings-button.tsx index bd69590ff1..619a658411 100644 --- a/packages/insomnia-app/app/ui/components/buttons/settings-button.tsx +++ b/packages/insomnia-app/app/ui/components/buttons/settings-button.tsx @@ -1,36 +1,35 @@ import { CircleButton, SvgIcon, Tooltip } from 'insomnia-components'; import React, { FunctionComponent } from 'react'; -import { connect } from 'react-redux'; +import { useSelector } from 'react-redux'; +import styled from 'styled-components'; import { hotKeyRefs } from '../../../common/hotkeys'; -import type { Settings } from '../../../models/settings'; import { selectSettings } from '../../redux/selectors'; import { Hotkey } from '../hotkey'; import { showSettingsModal } from '../modals/settings-modal'; -interface Props { - className?: string; - settings: Settings; -} +const Wrapper = styled.div({ + marginLeft: 'var(--padding-md)', +}); -const SettingsButton: FunctionComponent = ({ className, settings }) => ( - - Preferences ( - ) - - } - > - - - - -); - -export default connect((state, props) => ({ - // @ts-expect-error -- TSCONVERSION - settings: selectSettings(state, props), -}))(SettingsButton); +export const SettingsButton: FunctionComponent = () => { + const { hotKeyRegistry } = useSelector(selectSettings); + return ( + + + Preferences ( + ) + + } + > + + + + + + ); +}; diff --git a/packages/insomnia-app/app/ui/components/dropdowns/account-dropdown.tsx b/packages/insomnia-app/app/ui/components/dropdowns/account-dropdown.tsx index b16ffce89c..d910635692 100644 --- a/packages/insomnia-app/app/ui/components/dropdowns/account-dropdown.tsx +++ b/packages/insomnia-app/app/ui/components/dropdowns/account-dropdown.tsx @@ -1,3 +1,4 @@ +import classNames from 'classnames'; import { CircleButton, SvgIcon, Tooltip } from 'insomnia-components'; import React, { Fragment, FunctionComponent } from 'react'; import { useSelector } from 'react-redux'; @@ -12,24 +13,30 @@ import { Link } from '../base/link'; import { PromptButton } from '../base/prompt-button'; import { showLoginModal } from '../modals/login-modal'; -interface Props { - className?: string; +const Wrapper = styled.div({ + display: 'flex', + marginLeft: 'var(--padding-md)', +}); + +interface StyledIconProps { + faIcon: string; } -const StyledIconContainer = styled.div` - display: flex; - align-items: center; - padding-left: var(--padding-xs); - padding-right: var(--padding-md); - i { - width: unset !important; - } -`; +const StyledIcon = styled.i.attrs(props => ({ + className: classNames('fa', props.faIcon), +}))({ + marginleft: 'var(--padding-md)', + display: 'flex', + alignItems: 'center', + paddingLeft: 'var(--padding-xs)', + paddingRight: 'var(--padding-md)', + width: 'unset !important', +}); -export const AccountDropdown: FunctionComponent = ({ className }) => { +export const AccountDropdownButton: FunctionComponent = () => { const { disablePaidFeatureAds } = useSelector(selectSettings); return ( -
+ @@ -45,18 +52,12 @@ export const AccountDropdown: FunctionComponent = ({ className }) => { buttonClass={PromptButton} onClick={session.logout} > - - - - Logout + Logout ) : ( - - - - Log In + Log In {!disablePaidFeatureAds && ( = ({ className }) => { href="https://insomnia.rest/pricing" button > - - - {' '} - Upgrade to Plus + {' '}Upgrade to Plus )} )} -
+ ); }; diff --git a/packages/insomnia-app/app/ui/components/dropdowns/sync-dropdown.tsx b/packages/insomnia-app/app/ui/components/dropdowns/sync-dropdown.tsx index 119397f875..b1ecc8a980 100644 --- a/packages/insomnia-app/app/ui/components/dropdowns/sync-dropdown.tsx +++ b/packages/insomnia-app/app/ui/components/dropdowns/sync-dropdown.tsx @@ -437,7 +437,7 @@ class UnconnectedSyncDropdown extends PureComponent { {' '} {initializing ? 'Initializing...' : currentBranch} -
+
= ({ () => handleActivityChange({ workspaceId: activeWorkspace?._id, nextActivity: ACTIVITY_HOME }), [activeWorkspace, handleActivityChange], ); + const activeProjectName = useSelector(selectActiveProjectName); if (!activeWorkspace || !activeWorkspaceName || !activeApiSpec || !activity) { return null; @@ -42,6 +41,7 @@ export const WorkspacePageHeader: FunctionComponent = ({ const workspace = ( = ({ ); const crumbs = [ - { id: 'home', node: strings.home.singular, onClick: homeCallback }, - { id: 'workspace', node: {workspace} }, + { id: 'project', node: activeProjectName, onClick: homeCallback }, + { id: 'workspace', node: workspace }, ]; return ( -
- Insomnia - - - } + = ({ /> ) } - gridRight={ - <> - {gridRight} - - - - } + gridRight={gridRight} /> ); }; diff --git a/packages/insomnia-app/app/ui/components/wrapper-home.tsx b/packages/insomnia-app/app/ui/components/wrapper-home.tsx index 03ea07eb8e..3d3d13cfef 100644 --- a/packages/insomnia-app/app/ui/components/wrapper-home.tsx +++ b/packages/insomnia-app/app/ui/components/wrapper-home.tsx @@ -2,15 +2,13 @@ import 'swagger-ui-react/swagger-ui.css'; import { autoBindMethodsForReact } from 'class-autobind-decorator'; import { - Breadcrumb, Button, CardContainer, Dropdown, DropdownDivider, DropdownItem, - Header, } from 'insomnia-components'; -import React, { Fragment, PureComponent } from 'react'; +import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { unreachableCase } from 'ts-assert-unreachable'; @@ -31,15 +29,13 @@ import { isDesign, Workspace, WorkspaceScopeKeys } from '../../models/workspace' import { WorkspaceMeta } from '../../models/workspace-meta'; import { MemClient } from '../../sync/git/mem-client'; import { initializeLocalBackendProjectAndMarkForSync } from '../../sync/vcs/initialize-backend-project'; -import coreLogo from '../images/insomnia-core-logo.png'; import { cloneGitRepository } from '../redux/modules/git'; import { setDashboardSortOrder } from '../redux/modules/global'; import { ForceToWorkspace } from '../redux/modules/helpers'; import { importClipBoard, importFile, importUri } from '../redux/modules/import'; import { activateWorkspace, createWorkspace } from '../redux/modules/workspace'; import { selectDashboardSortOrder } from '../redux/selectors'; -import SettingsButton from './buttons/settings-button'; -import { AccountDropdown } from './dropdowns/account-dropdown'; +import { AppHeader } from './app-header'; import { DashboardSortDropdown } from './dropdowns/dashboard-sort-dropdown'; import { ProjectDropdown } from './dropdowns/project-dropdown'; import { RemoteWorkspacesDropdown } from './dropdowns/remote-workspaces-dropdown'; @@ -352,30 +348,16 @@ class WrapperHome extends PureComponent { ( -
- Insomnia - , - }, - ]} - /> - {isLoading ? ( - - ) : null} - - } - gridRight={ - <> - - - - } + , + }, + ], + isLoading, + }} /> )} renderPageBody={() => ( diff --git a/packages/insomnia-app/app/ui/css/components/dropdown.less b/packages/insomnia-app/app/ui/css/components/dropdown.less index 53abd61d28..4eee85f3b8 100644 --- a/packages/insomnia-app/app/ui/css/components/dropdown.less +++ b/packages/insomnia-app/app/ui/css/components/dropdown.less @@ -7,6 +7,10 @@ &:focus { outline: none; } + + & button { + cursor: pointer; + } } .dropdown__backdrop { diff --git a/packages/insomnia-components/src/breadcrumb.tsx b/packages/insomnia-components/src/breadcrumb.tsx index ddc99b5de5..51a40e03ce 100644 --- a/packages/insomnia-components/src/breadcrumb.tsx +++ b/packages/insomnia-components/src/breadcrumb.tsx @@ -1,7 +1,7 @@ -import React, { FC, ReactNode } from 'react'; +import React, { FC, Fragment, ReactNode } from 'react'; import styled from 'styled-components'; -interface CrumbProps { +export interface CrumbProps { id: string; node: ReactNode; onClick?: React.MouseEventHandler; @@ -10,11 +10,11 @@ interface CrumbProps { export interface BreadcrumbProps { crumbs: CrumbProps[]; className?: string; + isLoading?: boolean; } const StyledBreadcrumb = styled.ul` - font-size: var(--font-size-lg); - font-weight: 600; + font-size: var(--font-size-md); color: var(--color-font); grid-area: breadcrumbs; display: flex; @@ -24,7 +24,7 @@ const StyledBreadcrumb = styled.ul` a, a::before, li > ::before { - color: var(--color-font); + color: var(--color-font) !important; } li { @@ -32,11 +32,20 @@ const StyledBreadcrumb = styled.ul` flex-direction: row; a { + font-weight: 400 !important; cursor: pointer; + opacity: 0.5; + &:hover { + color: var(--color-font); + opacity: 1; + text-decoration: none; + } } &::before { margin: 0 var(--padding-xs); + font-weight: 300; + opacity: 0.5; content: '/'; } @@ -50,8 +59,13 @@ const Crumb: FC = ({ id, node, onClick }) =>
  • {onClick ? {node} : node}
  • ; -export const Breadcrumb: FC = ({ crumbs, className }) => ( - - {crumbs.map(Crumb)} - +export const Breadcrumb: FC = ({ crumbs, className, isLoading }) => ( + + + {crumbs.map(Crumb)} + + {isLoading ? ( + + ) : null} + ); diff --git a/packages/insomnia-components/src/header.tsx b/packages/insomnia-components/src/header.tsx index a9b7fc8160..cc70fd5c12 100644 --- a/packages/insomnia-components/src/header.tsx +++ b/packages/insomnia-components/src/header.tsx @@ -1,3 +1,4 @@ +import classNames from 'classnames'; import React, { FC, memo, ReactNode } from 'react'; import styled from 'styled-components'; @@ -10,7 +11,7 @@ export interface HeaderProps { const StyledHeader = styled.div` border-bottom: 1px solid var(--hl-md); - padding: var(--padding-md); + padding: var(--padding-xxs) var(--padding-sm); display: grid; grid-template-columns: 2fr 1.5fr 2fr; grid-template-rows: 1fr; @@ -37,7 +38,7 @@ const StyledHeader = styled.div` `; export const Header: FC = memo(({ className, gridLeft, gridCenter, gridRight }) => ( - +
    {gridLeft}
    {gridCenter}
    {gridRight}
    diff --git a/packages/insomnia-components/src/index.ts b/packages/insomnia-components/src/index.ts index edac6f06df..488a211828 100644 --- a/packages/insomnia-components/src/index.ts +++ b/packages/insomnia-components/src/index.ts @@ -3,7 +3,7 @@ export * from './dropdown'; export * from './sidebar'; export * from './list-group'; -export { Breadcrumb, BreadcrumbProps } from './breadcrumb'; +export { Breadcrumb, BreadcrumbProps, CrumbProps } from './breadcrumb'; export { CardContainer } from './card-container'; export { Card, CardProps } from './card'; export { Header, HeaderProps } from './header'; diff --git a/packages/insomnia-components/src/multi-switch.tsx b/packages/insomnia-components/src/multi-switch.tsx index a880d3a892..84d3704566 100644 --- a/packages/insomnia-components/src/multi-switch.tsx +++ b/packages/insomnia-components/src/multi-switch.tsx @@ -5,12 +5,15 @@ import type { RadioButtonGroupProps } from './radio-button-group'; import { RadioButtonGroup } from './radio-button-group'; const ThemedButtonGroup = styled(RadioButtonGroup)` - font-weight: bold; + font-weight: 500; background: var(--hl-xs); color: var(--color-font); border: 0; border-radius: 100px; align-content: space-evenly; + padding: var(--padding-xxs); + transform: scale(0.9); + transformOrigin: 'center'; label { padding: 0; @@ -18,17 +21,16 @@ const ThemedButtonGroup = styled(RadioButtonGroup)` span { text-transform: uppercase; - padding: var(--padding-xxs) var(--padding-md); + padding: var(--padding-xs) var(--padding-xxs); color: var(--hl); background: transparent; - font-size: var(--font-size-sm); + font-size: var(--font-size-xs); margin: 0 auto; min-width: 4rem; } input:checked + span { color: var(--color-font); - text-shadow: 0 1px rgba(255, 255, 255, 0.25); background: var(--color-bg); } `;