mirror of
https://github.com/hcengineering/platform.git
synced 2024-11-30 02:37:46 +03:00
Update LoginApp UI for mobile (#2298)
Signed-off-by: Alexander Platov <sas_lord@mail.ru>
This commit is contained in:
parent
a2ca2e70df
commit
507b155441
@ -241,6 +241,7 @@
|
|||||||
--popup-divider: #eff1f4;
|
--popup-divider: #eff1f4;
|
||||||
--popup-shadow: rgb(0 0 0 / 20%) 0px 4px 24px; // Dark
|
--popup-shadow: rgb(0 0 0 / 20%) 0px 4px 24px; // Dark
|
||||||
--popup-panel-shadow: rgb(0 0 0 / 10%) 0px 4px 18px;
|
--popup-panel-shadow: rgb(0 0 0 / 10%) 0px 4px 18px;
|
||||||
|
--popup-aside-shadow: rgb(0 0 0 / 25%) 0px 8px 16px;
|
||||||
--card-shadow: rgb(0 0 0 / 50%) 0px 16px 70px;
|
--card-shadow: rgb(0 0 0 / 50%) 0px 16px 70px;
|
||||||
--card-overlay-color: rgba(144, 149, 157, .4);
|
--card-overlay-color: rgba(144, 149, 157, .4);
|
||||||
--avatar-bg-color: #e0e0e0; // HZ
|
--avatar-bg-color: #e0e0e0; // HZ
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
export let fade: FadeOptions = defaultSP
|
export let fade: FadeOptions = defaultSP
|
||||||
export let invertScroll: boolean = false
|
export let invertScroll: boolean = false
|
||||||
export let horizontal: boolean = false
|
export let horizontal: boolean = false
|
||||||
export let contentDirection: 'vertical' | 'horizontal' = 'vertical'
|
export let contentDirection: 'vertical' | 'vertical-reverse' | 'horizontal' = 'vertical'
|
||||||
|
|
||||||
let mask: 'top' | 'bottom' | 'both' | 'none' = 'none'
|
let mask: 'top' | 'bottom' | 'both' | 'none' = 'none'
|
||||||
let maskH: 'left' | 'right' | 'both' | 'none' = 'none'
|
let maskH: 'left' | 'right' | 'both' | 'none' = 'none'
|
||||||
@ -245,7 +245,12 @@
|
|||||||
bind:this={divBox}
|
bind:this={divBox}
|
||||||
class="box"
|
class="box"
|
||||||
style:padding
|
style:padding
|
||||||
style:flex-direction={contentDirection === 'vertical' ? 'column' : 'row'}
|
style:flex-direction={contentDirection === 'vertical'
|
||||||
|
? 'column'
|
||||||
|
: contentDirection === 'vertical-reverse'
|
||||||
|
? 'column-reverse'
|
||||||
|
: 'row'}
|
||||||
|
style:height={contentDirection === 'vertical-reverse' ? 'max-content' : '100%'}
|
||||||
use:resizeObserver={(element) => {
|
use:resizeObserver={(element) => {
|
||||||
boxHeight = element.clientHeight
|
boxHeight = element.clientHeight
|
||||||
boxWidth = element.clientWidth
|
boxWidth = element.clientWidth
|
||||||
@ -368,7 +373,6 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
height: 100%;
|
|
||||||
}
|
}
|
||||||
.scroller-container.bottomStart {
|
.scroller-container.bottomStart {
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
|
@ -1,16 +1,19 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { getContext } from 'svelte'
|
import { getContext } from 'svelte'
|
||||||
import Mute from './icons/Mute.svelte'
|
import Mute from './icons/Mute.svelte'
|
||||||
|
import { deviceOptionsStore as deviceInfo } from '../../'
|
||||||
|
|
||||||
const { currentTheme, setTheme } = getContext('theme')
|
const { currentTheme, setTheme } = getContext('theme')
|
||||||
|
|
||||||
const themes = ['theme-light', 'theme-dark']
|
const themes = ['theme-light', 'theme-dark']
|
||||||
|
|
||||||
let current = themes.indexOf(currentTheme)
|
let current = themes.indexOf(currentTheme)
|
||||||
|
$deviceInfo.theme = currentTheme
|
||||||
|
|
||||||
function changeTheme () {
|
function changeTheme () {
|
||||||
current++
|
current++
|
||||||
setTheme(themes[current % themes.length])
|
setTheme(themes[current % themes.length])
|
||||||
|
$deviceInfo.theme = themes[current % themes.length]
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -229,4 +229,5 @@ export interface DeviceOptions {
|
|||||||
docHeight: number
|
docHeight: number
|
||||||
isPortrait: boolean
|
isPortrait: boolean
|
||||||
isMobile: boolean
|
isMobile: boolean
|
||||||
|
theme?: any
|
||||||
}
|
}
|
||||||
|
3
plugins/login-resources/img/logo-dark.svg
Normal file
3
plugins/login-resources/img/logo-dark.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="63" height="79" viewBox="0 0 63 79" fill="#fff" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M34.8089 0.679932H0.378906V78.9999H15.2289V51.6099H34.8089C52.8489 51.6099 62.5289 41.2699 62.5289 26.1999C62.5289 11.0199 52.8489 0.679932 34.8089 0.679932ZM34.1489 38.8499H15.2289V13.4399H34.1489C42.8389 13.4399 47.5689 18.0599 47.5689 26.1999C47.5689 34.3399 42.8389 38.8499 34.1489 38.8499Z" fill="black"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 423 B |
Before Width: | Height: | Size: 423 B After Width: | Height: | Size: 423 B |
@ -14,7 +14,7 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
-->
|
-->
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { StylishEdit, Label, Button } from '@hcengineering/ui'
|
import { StylishEdit, Label, Button, deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
|
||||||
import StatusControl from './StatusControl.svelte'
|
import StatusControl from './StatusControl.svelte'
|
||||||
import { OK, Status, Severity } from '@hcengineering/platform'
|
import { OK, Status, Severity } from '@hcengineering/platform'
|
||||||
import type { IntlString } from '@hcengineering/platform'
|
import type { IntlString } from '@hcengineering/platform'
|
||||||
@ -101,7 +101,7 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<form class="container">
|
<form class="container" style:padding={$deviceInfo.docWidth <= 480 ? '1.25rem' : '5rem'}>
|
||||||
<div class="grow-separator" />
|
<div class="grow-separator" />
|
||||||
<div class="title"><Label label={caption} /></div>
|
<div class="title"><Label label={caption} /></div>
|
||||||
<div class="status">
|
<div class="status">
|
||||||
@ -109,7 +109,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form">
|
<div class="form">
|
||||||
{#each fields as field (field.name)}
|
{#each fields as field (field.name)}
|
||||||
<div class={field.short ? 'form-col' : 'form-row'}>
|
<div class={field.short && !($deviceInfo.docWidth <= 600) ? 'form-col' : 'form-row'}>
|
||||||
<StylishEdit
|
<StylishEdit
|
||||||
label={field.i18n}
|
label={field.i18n}
|
||||||
name={field.id}
|
name={field.id}
|
||||||
@ -168,9 +168,10 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
flex-grow: 1;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
height: 100%;
|
// height: 100%;
|
||||||
padding: 5rem;
|
// padding: 5rem;
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
86
plugins/login-resources/src/components/Intro.svelte
Normal file
86
plugins/login-resources/src/components/Intro.svelte
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
<!--
|
||||||
|
// Copyright © 2020, 2021 Anticrm Platform Contributors.
|
||||||
|
// Copyright © 2021, 2022 Hardcore Engineering Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License. You may
|
||||||
|
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
-->
|
||||||
|
<script lang="ts">
|
||||||
|
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
|
||||||
|
|
||||||
|
export let size: 'small' | 'medium' = 'medium'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="intro">
|
||||||
|
<div class="content">
|
||||||
|
<div class="logo {$deviceInfo.theme === 'theme-light' ? 'dark' : 'light'}" />
|
||||||
|
</div>
|
||||||
|
<div class="slogan">
|
||||||
|
<p>A unique place to manage all of your work</p>
|
||||||
|
<p>Welcome to the Platform</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.intro {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex-grow: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
min-width: 20rem;
|
||||||
|
min-height: 26rem;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
flex-grow: 1;
|
||||||
|
.logo {
|
||||||
|
position: relative;
|
||||||
|
&::after {
|
||||||
|
position: absolute;
|
||||||
|
content: '';
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
width: 63px;
|
||||||
|
height: 79px;
|
||||||
|
}
|
||||||
|
&.light::after {
|
||||||
|
background: center url('../../img/logo-light.svg');
|
||||||
|
}
|
||||||
|
&.dark::after {
|
||||||
|
background: center url('../../img/logo-dark.svg');
|
||||||
|
}
|
||||||
|
&::before {
|
||||||
|
position: absolute;
|
||||||
|
content: '';
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
width: 16rem;
|
||||||
|
height: 16rem;
|
||||||
|
border: 1.8px solid var(--caption-color);
|
||||||
|
border-radius: 50%;
|
||||||
|
opacity: 0.08;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.slogan {
|
||||||
|
margin-bottom: 60px;
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--theme-caption-color);
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -14,13 +14,14 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
-->
|
-->
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { location, Popup, ticker } from '@hcengineering/ui'
|
import { location, Popup, ticker, Scroller, deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
|
||||||
|
|
||||||
import LoginForm from './LoginForm.svelte'
|
import LoginForm from './LoginForm.svelte'
|
||||||
import SignupForm from './SignupForm.svelte'
|
import SignupForm from './SignupForm.svelte'
|
||||||
import CreateWorkspaceForm from './CreateWorkspaceForm.svelte'
|
import CreateWorkspaceForm from './CreateWorkspaceForm.svelte'
|
||||||
import SelectWorkspace from './SelectWorkspace.svelte'
|
import SelectWorkspace from './SelectWorkspace.svelte'
|
||||||
import Join from './Join.svelte'
|
import Join from './Join.svelte'
|
||||||
|
import Intro from './Intro.svelte'
|
||||||
import { onDestroy } from 'svelte'
|
import { onDestroy } from 'svelte'
|
||||||
import login from '../plugin'
|
import login from '../plugin'
|
||||||
import { getMetadata } from '@hcengineering/platform'
|
import { getMetadata } from '@hcengineering/platform'
|
||||||
@ -43,8 +44,12 @@
|
|||||||
)
|
)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="container">
|
<Scroller padding={'1.25rem'} contentDirection={$deviceInfo.docWidth <= 768 ? 'vertical-reverse' : 'horizontal'}>
|
||||||
<div class="panel">
|
<div
|
||||||
|
class="panel"
|
||||||
|
class:landscape={$deviceInfo.docWidth > 768}
|
||||||
|
style:border-radius={$deviceInfo.docWidth <= 480 ? '.75rem' : '1.25rem'}
|
||||||
|
>
|
||||||
{#if page === 'login'}
|
{#if page === 'login'}
|
||||||
<LoginForm {navigateUrl} />
|
<LoginForm {navigateUrl} />
|
||||||
{:else if page === 'signup'}
|
{:else if page === 'signup'}
|
||||||
@ -57,79 +62,50 @@
|
|||||||
<Join />
|
<Join />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="intro">
|
<Intro />
|
||||||
<div class="content">
|
</Scroller>
|
||||||
<div class="logo" />
|
|
||||||
</div>
|
|
||||||
<div class="slogan">
|
|
||||||
<p>A unique place to manage all of your work</p>
|
|
||||||
<p>Welcome to the Platform</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<Popup />
|
<Popup />
|
||||||
</div>
|
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.container {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
height: 100%;
|
|
||||||
padding: 0px 1.25rem 1.25rem 1.25rem;
|
|
||||||
|
|
||||||
.panel {
|
.panel {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
min-height: 100%;
|
||||||
|
height: max-content;
|
||||||
|
background: var(--popup-bg-color);
|
||||||
|
box-shadow: var(--popup-aside-shadow);
|
||||||
|
|
||||||
|
$circle-size: calc(1vh + 1vw);
|
||||||
|
$r1: 23;
|
||||||
|
$r2: 17;
|
||||||
|
&::before,
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
border-radius: 50%;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
&::before {
|
||||||
|
top: calc(-1 * $circle-size * $r1 / 2 + $circle-size * 4);
|
||||||
|
left: calc(-1 * $circle-size * $r1 / 2);
|
||||||
|
width: calc($circle-size * $r1);
|
||||||
|
height: calc($circle-size * $r1);
|
||||||
|
border: 1px solid var(--content-color);
|
||||||
|
opacity: 0.05;
|
||||||
|
}
|
||||||
|
&::after {
|
||||||
|
top: calc(-1 * $circle-size * $r2 / 2 + $circle-size * 4);
|
||||||
|
left: calc(-1 * $circle-size * $r2 / 2);
|
||||||
|
width: calc($circle-size * $r2);
|
||||||
|
height: calc($circle-size * $r2);
|
||||||
|
background: var(--dark-color);
|
||||||
|
border: 1px solid var(--caption-color);
|
||||||
|
opacity: 0.05;
|
||||||
|
}
|
||||||
|
&.landscape {
|
||||||
margin-right: 1.25rem;
|
margin-right: 1.25rem;
|
||||||
width: 41.75rem;
|
width: 41.75rem;
|
||||||
height: 100%;
|
|
||||||
border-radius: 1.25rem;
|
|
||||||
background-color: var(--theme-menu-selection);
|
|
||||||
}
|
|
||||||
|
|
||||||
.intro {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex-grow: 1;
|
|
||||||
overflow: hidden;
|
|
||||||
min-width: 20rem;
|
|
||||||
|
|
||||||
.content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
flex-grow: 1;
|
|
||||||
.logo {
|
|
||||||
position: relative;
|
|
||||||
&:after {
|
|
||||||
position: absolute;
|
|
||||||
content: '';
|
|
||||||
background: center url('../../img/logo.svg');
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
width: 63px;
|
|
||||||
height: 79px;
|
|
||||||
}
|
|
||||||
&:before {
|
|
||||||
position: absolute;
|
|
||||||
content: '';
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
width: 16rem;
|
|
||||||
height: 16rem;
|
|
||||||
border: 1.8px solid var(--theme-caption-color);
|
|
||||||
border-radius: 50%;
|
|
||||||
opacity: 0.08;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.slogan {
|
|
||||||
margin-bottom: 60px;
|
|
||||||
p {
|
|
||||||
margin: 0;
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 0.8rem;
|
|
||||||
text-align: center;
|
|
||||||
color: var(--theme-caption-color);
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
Loading…
Reference in New Issue
Block a user