diff --git a/components/dashboard/src/components/ContextMenu.tsx b/components/dashboard/src/components/ContextMenu.tsx index edc0a6c4d4c4d3..f85ebf476e930d 100644 --- a/components/dashboard/src/components/ContextMenu.tsx +++ b/components/dashboard/src/components/ContextMenu.tsx @@ -70,7 +70,7 @@ function ContextMenu(props: ContextMenuProps) { {props.menuEntries.map((e, index) => { const clickable = e.href || e.onClick || e.link; const entry =
-
{e.title}
{e.active ?
: null} +
{e.title}
{e.active ?
: null}
const key = `entry-${menuId}-${index}-${e.title}`; if (e.link) { diff --git a/components/dashboard/src/components/DropDown.tsx b/components/dashboard/src/components/DropDown.tsx index 3ba0125647166a..f6c5ab2932fa45 100644 --- a/components/dashboard/src/components/DropDown.tsx +++ b/components/dashboard/src/components/DropDown.tsx @@ -4,12 +4,13 @@ * See License-AGPL.txt in the project root for license information. */ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import ContextMenu from './ContextMenu'; export interface DropDownProps { prefix?: string; contextMenuWidth?: string; + activeEntry?: string, entries: { title: string, onClick: ()=>void @@ -21,7 +22,10 @@ function Arrow(props: {up: boolean}) { } function DropDown(props: DropDownProps) { - const [current, setCurrent] = useState(props.entries[0].title); + const [current, setCurrent] = useState(props.activeEntry || props.entries[0].title); + useEffect(() => { + setCurrent(props.activeEntry || props.entries[0].title); + }, [props.activeEntry, props.entries]); const enhancedEntries = props.entries.map(e => { return { ...e, @@ -32,7 +36,7 @@ function DropDown(props: DropDownProps) { } } }) - const font = "text-gray-400 text-sm leading-1 group hover:text-gray-600" + const font = "text-gray-400 text-sm leading-1 group hover:text-gray-600 transition ease-in-out" return ( {props.prefix}{current} diff --git a/components/dashboard/src/components/Menu.tsx b/components/dashboard/src/components/Menu.tsx index 263774c2365f31..eee77a3d5ff358 100644 --- a/components/dashboard/src/components/Menu.tsx +++ b/components/dashboard/src/components/Menu.tsx @@ -18,12 +18,12 @@ interface Entry { function MenuItem(entry: Entry) { const location = useLocation(); - let classes = "flex block text-sm font-medium px-3 px-0 py-1.5 rounded-md"; + let classes = "flex block text-sm font-medium px-3 px-0 py-1.5 rounded-md transition ease-in-out"; if (location.pathname.toLowerCase() === entry.link.toLowerCase() || entry.matches && entry.matches.test(location.pathname.toLowerCase())) { classes += " bg-gray-200"; } else { - classes += " text-gray-600 hover:bg-gray-100 "; + classes += " text-gray-600 hover:bg-gray-100 transition ease-in-out"; } return
  • {entry.link.startsWith('https://') diff --git a/components/dashboard/src/components/SelectableCard.tsx b/components/dashboard/src/components/SelectableCard.tsx index 959a9c9608bbb8..9ba5a0e58e04e7 100644 --- a/components/dashboard/src/components/SelectableCard.tsx +++ b/components/dashboard/src/components/SelectableCard.tsx @@ -13,7 +13,7 @@ export interface SelectableCardProps { } function SelectableCard(props: SelectableCardProps) { - return
    + return

    {props.title}

    diff --git a/components/dashboard/src/index.css b/components/dashboard/src/index.css index 2d1e333527ed40..26949b20afb791 100644 --- a/components/dashboard/src/index.css +++ b/components/dashboard/src/index.css @@ -21,7 +21,7 @@ @apply text-2xl text-gray-800 leading-9 font-semibold; } h4 { - @apply pb-2 text-sm font-medium text-gray-600; + @apply pb-2 text-sm font-semibold text-gray-600; } p { @apply text-sm text-gray-400; @@ -35,7 +35,7 @@ @layer components { button { - @apply cursor-pointer px-4 py-2 my-auto bg-green-600 hover:bg-green-700 text-gray-100 text-sm font-medium rounded-md focus:outline-none focus:ring; + @apply cursor-pointer px-4 py-2 my-auto bg-green-600 hover:bg-green-700 text-gray-100 text-sm font-medium rounded-md focus:outline-none focus:ring transition ease-in-out; } button.secondary { @apply bg-gray-100 hover:bg-gray-200 text-gray-500 hover:text-gray-600; @@ -51,7 +51,7 @@ } input[type=text], input[type=password], select { - @apply text-xs block w-56 text-sm text-gray-600 rounded-md border border-gray-300 focus:border-gray-400 focus:bg-white focus:ring-0; + @apply block w-56 text-gray-600 rounded-md border border-gray-300 focus:border-gray-400 focus:bg-white focus:ring-0; } input[type=text]::placeholder, input[type=password]::placeholder { diff --git a/components/dashboard/src/settings/Account.tsx b/components/dashboard/src/settings/Account.tsx index fea66bc49117c1..1320a3d55ce5d7 100644 --- a/components/dashboard/src/settings/Account.tsx +++ b/components/dashboard/src/settings/Account.tsx @@ -45,7 +45,7 @@ export default function Account() {

    Profile

    -

    The following information will be used to set up git configuration. You can override git author name and email per project by using the default environment variables GIT_AUTHOR_NAME and GIT_COMMITTER_EMAIL.

    +

    The following information will be used to set up git configuration. You can override git author name and email per project by using the default environment variables GIT_AUTHOR_NAME and GIT_COMMITTER_EMAIL.

    diff --git a/components/dashboard/src/settings/EnvironmentVariables.tsx b/components/dashboard/src/settings/EnvironmentVariables.tsx index 52febb13552882..d9c2cd3f6e9368 100644 --- a/components/dashboard/src/settings/EnvironmentVariables.tsx +++ b/components/dashboard/src/settings/EnvironmentVariables.tsx @@ -50,12 +50,12 @@ function AddEnvVarModal(p: EnvVarModalProps) { }; return -

    {isNew ? 'New' : 'Edit'} Variable

    -
    - {error ?
    +

    {isNew ? 'New' : 'Edit'} Variable

    +
    + {error ?
    {error}
    : null} -
    +

    Name

    { update({name: v.target.value}) }} />
    @@ -68,8 +68,8 @@ function AddEnvVarModal(p: EnvVarModalProps) { { update({repositoryPattern: v.target.value}) }} />
    -
    -

    You can pass a variable for a specific project or use wildcard characters (*/*) to make it available in more projects.

    +
    +

    You can pass a variable for a specific project or use wildcard character (*/*) to make it available in more projects.

    @@ -147,18 +147,27 @@ export default function EnvVars() { envVar={currentEnvVar} validate={validate} onClose={() => setAddEnvVarModalVisible(false)} /> : null} +
    +
    +

    Environment Variables

    +

    Variables are used to store information like passwords.

    +
    + {envVars.length !== 0 + ? +
    + +
    + : null} +
    {envVars.length === 0 ?

    No Environment Variables

    In addition to user-specific environment variables you can also pass variables through a workspace creation URL. Learn more
    - +
    :
    -
    - -
    Name
    @@ -168,11 +177,11 @@ export default function EnvVars() {
    {envVars.map(ev => { - return
    + return
    {ev.name}
    {ev.repositoryPattern}
    -
    +
    )} -

    Git Providers

    -

    Manage permissions for git providers.

    +

    Git Providers

    +

    Manage permissions for git providers.

    {authProviders && authProviders.map(ap => ( -
    +
      @@ -276,7 +276,7 @@ function GitProviders() { {getPermissions(ap.authProviderId)?.join(", ") || "–"} Permissions
    -
    +
    Actions @@ -355,21 +355,31 @@ function GitIntegrations() { )} -

    Git Integrations

    -

    Manage git integrations for GitLab or GitHub self-hosted instances.

    +
    +
    +

    Git Integrations

    +

    Manage git integrations for GitLab or GitHub self-hosted instances.

    +
    + {providers.length !== 0 + ? +
    + +
    + : null} +
    {providers && providers.length === 0 && (

    No Git Integrations

    In addition to the default Git Providers you can authorize
    with a self hosted instace of a provider.
    - +
    )}
    {providers && providers.map(ap => ( -
    +
    @@ -382,7 +392,7 @@ function GitIntegrations() {
    {ap.host}
    -
    +
    Actions @@ -392,11 +402,6 @@ function GitIntegrations() {
    ))}
    - {providers && providers.length > 0 && ( -
    - -
    - )}
    ); } @@ -584,7 +589,7 @@ function GitIntegrationModal(props: ({
    copyRedirectUrl()}> - +
    {getRedirectUrlDescription(type, host)} diff --git a/components/dashboard/src/settings/SettingsPage.tsx b/components/dashboard/src/settings/SettingsPage.tsx index b16ffcef78280c..6f546c73c520ba 100644 --- a/components/dashboard/src/settings/SettingsPage.tsx +++ b/components/dashboard/src/settings/SettingsPage.tsx @@ -37,7 +37,7 @@ export function SettingsPage(p: Props) { })}
    -
    +
    {p.children}
    diff --git a/components/dashboard/src/tailwind.output.css b/components/dashboard/src/tailwind.output.css index 0b2ec6827a87c2..2d1a816fae4e0a 100644 --- a/components/dashboard/src/tailwind.output.css +++ b/components/dashboard/src/tailwind.output.css @@ -788,7 +788,7 @@ h3 { } h4 { - font-weight: 500; + font-weight: 600; font-size: 0.875rem; line-height: 1.25rem; padding-bottom: 0.5rem; @@ -897,6 +897,10 @@ button:focus { button { --tw-text-opacity: 1; color: rgba(245, 245, 244, var(--tw-text-opacity)); + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } button.secondary { @@ -979,10 +983,6 @@ input[type=text], input[type=password], select { border-radius: 0.375rem; border-width: 1px; display: block; - font-size: 0.75rem; - line-height: 1rem; - font-size: 0.875rem; - line-height: 1.25rem; } input[type=text]:focus, input[type=password]:focus, select:focus { diff --git a/components/dashboard/src/workspaces/StartWorkspaceModal.tsx b/components/dashboard/src/workspaces/StartWorkspaceModal.tsx index ec7d74a94062ef..4789df633d4dfc 100644 --- a/components/dashboard/src/workspaces/StartWorkspaceModal.tsx +++ b/components/dashboard/src/workspaces/StartWorkspaceModal.tsx @@ -61,14 +61,14 @@ export function StartWorkspaceModal(p: StartWorkspaceModalProps) {
    {list.length > 0 ? list : (selection === 'Recent' ? -
    +

    No Recent Projects

    Projects you use frequently will show up here.

    Prefix a git repository URL with gitpod.io/# or start with an example.

    :
    -

    No Example Projects

    +

    No Example Projects

    Sorry there seem to be no example projects, that work with your current git provider.

    ) } diff --git a/components/dashboard/src/workspaces/WorkspaceEntry.tsx b/components/dashboard/src/workspaces/WorkspaceEntry.tsx index 2a997a1cd9f140..b42555d23fd44f 100644 --- a/components/dashboard/src/workspaces/WorkspaceEntry.tsx +++ b/components/dashboard/src/workspaces/WorkspaceEntry.tsx @@ -117,7 +117,7 @@ export function WorkspaceEntry({ desc, model }: { desc: WorkspaceInfo, model: Wo
    -
    {ws.description}
    +
    {ws.description}
    {ws.contextURL}
    @@ -125,7 +125,7 @@ export function WorkspaceEntry({ desc, model }: { desc: WorkspaceInfo, model: Wo
    0 ? showChanges : undefined}>
    -
    {currentBranch}
    +
    {currentBranch}
    { numberOfChanges > 0 ?
    {changesLabel}
    @@ -139,7 +139,7 @@ export function WorkspaceEntry({ desc, model }: { desc: WorkspaceInfo, model: Wo
    {moment(WorkspaceInfo.lastActiveISODate(desc)).fromNow()}
    -
    +
    Actions diff --git a/components/dashboard/src/workspaces/Workspaces.tsx b/components/dashboard/src/workspaces/Workspaces.tsx index 0f79a0e0350017..a435455c83c33b 100644 --- a/components/dashboard/src/workspaces/Workspaces.tsx +++ b/components/dashboard/src/workspaces/Workspaces.tsx @@ -75,7 +75,7 @@ export class Workspaces extends React.Component
    - :
    -
    +
    -

    No Active Workspaces

    -
    Prefix any git repository URL with gitpod.io/# or start a new workspace for a recently used project. Learn more
    - +

    No Active Workspaces

    +
    Prefix any git repository URL with gitpod.io/# or create a new workspace for a recently used project. Learn more
    + + + {wsModel.getAllFetchedWorkspaces().size > 0 ? :null} +