Prepare UI for mobile (#2277)

Signed-off-by: Alexander Platov <sas_lord@mail.ru>
This commit is contained in:
Alexander Platov 2022-10-04 18:49:11 +03:00 committed by GitHub
parent 9290942a56
commit ec0795e687
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
107 changed files with 882 additions and 692 deletions

View File

@ -20,6 +20,7 @@
import notification from '@hcengineering/notification' import notification from '@hcengineering/notification'
import type { Asset } from '@hcengineering/platform' import type { Asset } from '@hcengineering/platform'
import { AnySvelteComponent, Component, Panel, Icon, Scroller } from '@hcengineering/ui' import { AnySvelteComponent, Component, Panel, Icon, Scroller } from '@hcengineering/ui'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
export let title: string | undefined = undefined export let title: string | undefined = undefined
export let subtitle: string | undefined = undefined export let subtitle: string | undefined = undefined
@ -35,13 +36,16 @@
</script> </script>
<Panel bind:isAside isHeader={$$slots.header || isHeader} bind:panelWidth bind:innerWidth on:close> <Panel bind:isAside isHeader={$$slots.header || isHeader} bind:panelWidth bind:innerWidth on:close>
<svelte:fragment slot="title"> <svelte:fragment slot="navigator">
<div class="popupPanel-title__content-container antiTitle">
{#if $$slots.navigator} {#if $$slots.navigator}
<div class="buttons-group xsmall-gap mr-4"> <div class="buttons-group xsmall-gap mx-2">
<slot name="navigator" /> <slot name="navigator" />
</div> </div>
{/if} {/if}
</svelte:fragment>
<svelte:fragment slot="title">
<div class="popupPanel-title__content-container antiTitle">
{#if $$slots.title} {#if $$slots.title}
<slot name="title" /> <slot name="title" />
{:else} {:else}
@ -102,6 +106,12 @@
{#if withoutActivity} {#if withoutActivity}
<slot /> <slot />
{:else if $deviceInfo.isMobile}
<div class="popupPanel-body__mobile-content clear-mins">
<Component is={activity.component.Activity} props={{ object, integrate: true }}>
<slot />
</Component>
</div>
{:else} {:else}
<Scroller> <Scroller>
<div class="popupPanel-body__main-content py-8 clear-mins"> <div class="popupPanel-body__main-content py-8 clear-mins">

View File

@ -18,6 +18,7 @@
import { Button, IconClose, Label, MiniToggle } from '@hcengineering/ui' import { Button, IconClose, Label, MiniToggle } from '@hcengineering/ui'
import { createEventDispatcher } from 'svelte' import { createEventDispatcher } from 'svelte'
import presentation from '..' import presentation from '..'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
export let label: IntlString export let label: IntlString
export let labelProps: any | undefined = undefined export let labelProps: any | undefined = undefined
@ -31,7 +32,7 @@
let okProcessing = false let okProcessing = false
</script> </script>
<form id={label} class="antiCard dialog" on:submit|preventDefault={() => {}}> <form id={label} class="antiCard {$deviceInfo.isMobile ? 'mobile' : 'dialog'}" on:submit|preventDefault={() => {}}>
<div class="antiCard-header"> <div class="antiCard-header">
<div class="antiCard-header__title-wrap"> <div class="antiCard-header__title-wrap">
{#if $$slots.header} {#if $$slots.header}

View File

@ -40,5 +40,5 @@
dispatch('close') dispatch('close')
}} }}
> >
<EditBox placeholder={linkPlaceholder} bind:value={link} maxWidth={'37.75rem'} focus /> <EditBox placeholder={linkPlaceholder} bind:value={link} focus />
</Card> </Card>

View File

@ -214,6 +214,7 @@ input.search {
.justify-stretch { justify-content: stretch; } .justify-stretch { justify-content: stretch; }
.items-baseline { align-items: baseline; } .items-baseline { align-items: baseline; }
.items-center { align-items: center; } .items-center { align-items: center; }
.self-end { align-self: end; }
.flex-gap-3 { gap: .75rem; } .flex-gap-3 { gap: .75rem; }
.flex-gap-2 { gap: .5rem; } .flex-gap-2 { gap: .5rem; }
@ -422,6 +423,7 @@ input.search {
.pb-4 { padding-bottom: 1rem; } .pb-4 { padding-bottom: 1rem; }
.pb-6 { padding-bottom: 1.5rem; } .pb-6 { padding-bottom: 1.5rem; }
.pb-16 { padding-bottom: 4rem; } .pb-16 { padding-bottom: 4rem; }
.px-1 { padding: 0 .25rem; }
.px-2 { padding: 0 .5rem; } .px-2 { padding: 0 .5rem; }
.px-3 { padding: 0 .75rem; } .px-3 { padding: 0 .75rem; }
.px-4 { padding: 0 1rem; } .px-4 { padding: 0 1rem; }

View File

@ -20,13 +20,21 @@
.antiPanel-application { .antiPanel-application {
flex-shrink: 0; flex-shrink: 0;
display: flex; display: flex;
flex-direction: column;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
background-color: var(--board-bg-color);
&.vertical {
flex-direction: column;
min-width: var(--app-panel-width); min-width: var(--app-panel-width);
width: var(--app-panel-width); width: var(--app-panel-width);
height: 100%; height: 100%;
background-color: var(--board-bg-color); }
&.horizonatl {
min-height: var(--app-panel-width);
height: var(--app-panel-width);
width: 100%;
}
} }
.antiPanel-navigator, .antiPanel-navigator,
.antiPanel-component { .antiPanel-component {
@ -49,11 +57,18 @@
@media (max-width: 1024px) { @media (max-width: 1024px) {
.antiPanel-navigator { .antiPanel-navigator {
position: fixed; position: fixed;
top: var(--status-bar-height);
left: var(--app-panel-width);
background-color: var(--body-accent); background-color: var(--body-accent);
filter: drop-shadow(2px 0 1px rgba(0, 0, 0, .2)); filter: drop-shadow(2px 0 1px rgba(0, 0, 0, .2));
z-index: 450; z-index: 450;
&.portrait {
top: var(--status-bar-height);
left: 0;
}
&.landscape {
top: var(--status-bar-height);
left: var(--app-panel-width);
}
} }
} }
.antiPanel-component:not(.aside) { .antiPanel-component:not(.aside) {

View File

@ -20,24 +20,28 @@
height: 100%; height: 100%;
.ac-header { .ac-header {
padding: 0 1.5rem 0 2.25rem; padding: 0.5rem 1.5rem 0.5rem 2.25rem;
height: 3.5rem; // height: 3.5rem;
min-height: 3.5rem; // min-height: 3.5rem;
&.short { &.short {
display: flex; display: flex;
align-items: center; align-items: center;
flex-wrap: nowrap; flex-wrap: nowrap;
} }
&.full { &.full,
&-full {
display: grid; display: grid;
grid-template-columns: auto; grid-template-columns: auto;
grid-auto-flow: column; grid-auto-flow: column;
grid-auto-columns: min-content; grid-auto-columns: max-content;
gap: .75rem; gap: .75rem;
align-items: center; align-items: center;
}
&.withSettings { padding-right: .75rem; } &.withSettings { padding-right: .75rem; }
&.mini {
display: flex;
flex-direction: column;
} }
&.mirror { &.mirror {
justify-content: space-between; justify-content: space-between;
@ -51,6 +55,10 @@
&.divide { &.divide {
border-bottom: 1px solid var(--divider-color); border-bottom: 1px solid var(--divider-color);
} }
.secondRow {
align-self: flex-end;
margin-top: .5rem;
}
} }
.ac-header__wrap-description, .ac-header__wrap-description,

View File

@ -136,7 +136,14 @@
height: max-content; height: max-content;
max-width: 60rem; max-width: 60rem;
max-height: calc(100vh - 2rem); max-height: calc(100vh - 2rem);
}
&.mobile {
width: 90vw;
max-width: 90vw;
max-height: 90vh;
}
&.dialog,
&.mobile {
.antiCard-header { .antiCard-header {
padding: .75rem .75rem .375rem; padding: .75rem .75rem .375rem;

View File

@ -66,18 +66,25 @@
.popupPanel-title { .popupPanel-title {
display: flex; display: flex;
flex-shrink: 0;
justify-content: stretch; justify-content: stretch;
align-items: center; align-items: center;
flex-shrink: 0;
&.row {
padding: .5rem .75rem; padding: .5rem .75rem;
width: 100%; width: 100%;
height: 3rem;
max-height: 3rem; &-top { margin: .5rem .75rem .125rem; }
&-bottom { margin: .5rem .75rem .5rem 1.25rem; }
}
&__bordered {
min-width: 0;
min-height: 3rem;
background-color: var(--board-card-bg-color); background-color: var(--board-card-bg-color);
border: 1px solid var(--divider-color); border: 1px solid var(--divider-color);
border-bottom: none; border-bottom: none;
border-radius: .5rem .5rem 0 0; border-radius: .5rem .5rem 0 0;
}
&__content { &__content {
flex-grow: 1; flex-grow: 1;
margin: 0 .75rem; margin: 0 .75rem;
@ -96,7 +103,6 @@
.popupPanel-body { .popupPanel-body {
position: relative; position: relative;
display: flex; display: flex;
justify-content: stretch;
min-width: 0; min-width: 0;
min-height: 0; min-height: 0;
width: 100%; width: 100%;
@ -105,7 +111,13 @@
border: 1px solid var(--divider-color); border: 1px solid var(--divider-color);
border-radius: 0 0 .5rem .5rem; border-radius: 0 0 .5rem .5rem;
&__main, &__aside { &.main {
justify-content: stretch;
}
&.mobile {
justify-content: center;
}
&__main, &__mobile, &__aside {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
min-width: 0; min-width: 0;
@ -119,14 +131,33 @@
border: none; border: none;
border-radius: 0; border-radius: 0;
&-header { &-content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
flex-shrink: 0;
margin-left: auto;
margin-right: auto;
width: calc(100% - 7.5rem);
max-width: 860px;
}
}
.popupPanel-body__header {
display: flex;
flex-direction: column;
&.main {
margin: 0 auto; margin: 0 auto;
padding: .75rem 1.25rem; padding: .75rem 1.25rem;
width: calc(100% - 5rem); width: calc(100% - 5rem);
min-width: 0;
max-width: 900px; max-width: 900px;
}
&.mobile {
flex-shrink: 0;
padding: .5rem .75rem .75rem;
width: 100%;
min-width: 700px;
}
&.bottom-divider { border-bottom: 1px solid var(--divider-color); } &.bottom-divider { border-bottom: 1px solid var(--divider-color); }
&.top-divider { border-top: 1px solid var(--divider-color); } &.top-divider { border-top: 1px solid var(--divider-color); }
@ -140,15 +171,9 @@
} }
.header-row + .header-row { margin-top: .625rem; } .header-row + .header-row { margin-top: .625rem; }
} }
&-content { .popupPanel-body__mobile-content {
display: flex; padding: 0 .75rem 1rem;
flex-direction: column; min-width: 700px;
flex-shrink: 0;
margin-left: auto;
margin-right: auto;
width: calc(100% - 7.5rem);
max-width: 860px;
}
} }
&__aside { &__aside {

View File

@ -21,6 +21,7 @@
import type { AnySvelteComponent, EditStyle } from '../types' import type { AnySvelteComponent, EditStyle } from '../types'
import Icon from './Icon.svelte' import Icon from './Icon.svelte'
import Label from './Label.svelte' import Label from './Label.svelte'
import { resizeObserver } from '../resize'
export let label: IntlString | undefined = undefined export let label: IntlString | undefined = undefined
export let icon: Asset | AnySvelteComponent | undefined = undefined export let icon: Asset | AnySvelteComponent | undefined = undefined
@ -39,8 +40,11 @@
let input: HTMLInputElement let input: HTMLInputElement
let style: string let style: string
let phTraslate: string = '' let phTraslate: string = ''
let parentWidth: number | undefined
$: style = maxWidth ? `max-width: ${maxWidth};` : '' $: style = `max-width: ${
maxWidth || (parentWidth ? (icon ? `calc(${parentWidth}px - 1.25rem)` : `${parentWidth}px`) : 'max-content')
};`
$: translate(placeholder, placeholderParam ?? {}).then((res) => { $: translate(placeholder, placeholderParam ?? {}).then((res) => {
phTraslate = res phTraslate = res
}) })
@ -105,6 +109,9 @@
on:click={() => { on:click={() => {
input.focus() input.focus()
}} }}
use:resizeObserver={(element) => {
parentWidth = element.parentElement?.getBoundingClientRect().width
}}
> >
<!-- {focusIndex} --> <!-- {focusIndex} -->
<div class="hidden-text {kind}" bind:this={text} /> <div class="hidden-text {kind}" bind:this={text} />

View File

@ -54,7 +54,7 @@
} }
} }
afterUpdate(() => dispatch('changeContent', true)) afterUpdate(() => dispatch('changeContent'))
</script> </script>
{#if count} {#if count}

View File

@ -67,7 +67,7 @@
} }
afterUpdate(() => { afterUpdate(() => {
dispatch('changeContent', true) dispatch('changeContent')
}) })
onMount(() => { onMount(() => {
if (btns[0]) { if (btns[0]) {
@ -113,7 +113,7 @@
<div <div
class="antiPopup" class="antiPopup"
use:resizeObserver={() => { use:resizeObserver={() => {
dispatch('changeContent', true) dispatch('changeContent')
}} }}
on:keydown={keyDown} on:keydown={keyDown}
> >

View File

@ -20,6 +20,8 @@
import IconDetails from './icons/Details.svelte' import IconDetails from './icons/Details.svelte'
import IconScale from './icons/Scale.svelte' import IconScale from './icons/Scale.svelte'
import IconScaleFull from './icons/ScaleFull.svelte' import IconScaleFull from './icons/ScaleFull.svelte'
import Scroller from './Scroller.svelte'
import { deviceOptionsStore as deviceInfo } from '../../'
export let innerWidth: number = 0 export let innerWidth: number = 0
export let panelWidth: number = 0 export let panelWidth: number = 0
@ -31,8 +33,9 @@
let asideFloat: boolean = false let asideFloat: boolean = false
let asideShown: boolean = false let asideShown: boolean = false
let docWidth: number
let fullSize: boolean = false let fullSize: boolean = false
let twoRows: boolean = false
$: twoRows = $deviceInfo.docWidth <= 480
const checkPanel = (): void => { const checkPanel = (): void => {
if (panelWidth <= 900 && !asideFloat) asideFloat = true if (panelWidth <= 900 && !asideFloat) asideFloat = true
@ -53,7 +56,8 @@
checkPanel() checkPanel()
}} }}
> >
<div class="popupPanel-title"> <div class="popupPanel-title__bordered {twoRows ? 'flex-col flex-no-shrink' : 'flex-row-center'}">
<div class="popupPanel-title {twoRows ? 'row-top' : 'row'}">
<Button <Button
icon={IconClose} icon={IconClose}
kind={'transparent'} kind={'transparent'}
@ -62,7 +66,10 @@
dispatch('close') dispatch('close')
}} }}
/> />
<div class="popupPanel-title__content"><slot name="title" /></div> {#if $$slots.navigator}<slot name="navigator" />{/if}
<div class="popupPanel-title__content">
{#if !twoRows}<slot name="title" />{/if}
</div>
<div class="buttons-group xsmall-gap"> <div class="buttons-group xsmall-gap">
<slot name="utils" /> <slot name="utils" />
{#if isFullSize || (asideFloat && $$slots.aside && isAside)}<div class="buttons-divider" />{/if} {#if isFullSize || (asideFloat && $$slots.aside && isAside)}<div class="buttons-divider" />{/if}
@ -79,11 +86,10 @@
{/if} {/if}
{#if isFullSize} {#if isFullSize}
<Button <Button
icon={fullSize || docWidth <= 900 ? IconScale : IconScaleFull} icon={fullSize ? IconScale : IconScaleFull}
kind={'transparent'} kind={'transparent'}
size={'medium'} size={'medium'}
selected={fullSize} selected={fullSize}
disabled={docWidth <= 900}
on:click={() => { on:click={() => {
fullSize = !fullSize fullSize = !fullSize
dispatch('fullsize') dispatch('fullsize')
@ -92,7 +98,28 @@
{/if} {/if}
</div> </div>
</div> </div>
<div class="popupPanel-body" class:asideShown> {#if twoRows}
<div class="popupPanel-title row-bottom"><slot name="title" /></div>
{/if}
</div>
<div class="popupPanel-body {$deviceInfo.isMobile ? 'mobile' : 'main'}" class:asideShown>
{#if $deviceInfo.isMobile}
<Scroller horizontal padding={'.5rem .75rem'}>
<div
class="popupPanel-body__mobile"
use:resizeObserver={(element) => {
innerWidth = element.clientWidth
}}
>
{#if $$slots.header && isHeader}
<div class="popupPanel-body__header mobile bottom-divider">
<slot name="header" />
</div>
{/if}
<slot />
</div>
</Scroller>
{:else}
<div <div
class="popupPanel-body__main" class="popupPanel-body__main"
use:resizeObserver={(element) => { use:resizeObserver={(element) => {
@ -100,12 +127,13 @@
}} }}
> >
{#if $$slots.header && isHeader} {#if $$slots.header && isHeader}
<div class="popupPanel-body__main-header bottom-divider"> <div class="popupPanel-body__header main bottom-divider">
<slot name="header" /> <slot name="header" />
</div> </div>
{/if} {/if}
<slot /> <slot />
</div> </div>
{/if}
{#if $$slots.aside && isAside} {#if $$slots.aside && isAside}
<div class="popupPanel-body__aside" class:float={asideFloat} class:shown={asideShown}> <div class="popupPanel-body__aside" class:float={asideFloat} class:shown={asideShown}>
<slot name="aside" /> <slot name="aside" />

View File

@ -17,6 +17,7 @@
import { afterUpdate, onMount } from 'svelte' import { afterUpdate, onMount } from 'svelte'
import { fitPopupElement } from '../popups' import { fitPopupElement } from '../popups'
import type { AnyComponent, AnySvelteComponent, PopupAlignment, PopupOptions } from '../types' import type { AnyComponent, AnySvelteComponent, PopupAlignment, PopupOptions } from '../types'
import { deviceOptionsStore as deviceInfo } from '..'
export let is: AnyComponent | AnySvelteComponent export let is: AnyComponent | AnySvelteComponent
export let props: object export let props: object
@ -30,7 +31,6 @@
let modalHTML: HTMLElement let modalHTML: HTMLElement
let componentInstance: any let componentInstance: any
let docWidth: number
let docSize: boolean = false let docSize: boolean = false
let fullSize: boolean = false let fullSize: boolean = false
@ -88,13 +88,13 @@
} }
onMount(() => fitPopup()) onMount(() => fitPopup())
$: if (docWidth <= 900 && !docSize) docSize = true $: if ($deviceInfo.docWidth <= 900 && !docSize) docSize = true
$: if (docWidth > 900 && docSize) docSize = false $: if ($deviceInfo.docWidth > 900 && docSize) docSize = false
afterUpdate(() => fitPopup()) afterUpdate(() => fitPopup())
</script> </script>
<svelte:window on:resize={fitPopup} on:keydown={handleKeydown} bind:innerWidth={docWidth} /> <svelte:window on:resize={fitPopup} on:keydown={handleKeydown} />
<div <div
class="popup" class="popup"
@ -145,7 +145,7 @@
position: fixed; position: fixed;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; // justify-content: center;
max-height: calc(100vh - 32px); max-height: calc(100vh - 32px);
background-color: transparent; background-color: transparent;

View File

@ -18,6 +18,7 @@
import { themeStore as themeOptions } from '@hcengineering/theme' import { themeStore as themeOptions } from '@hcengineering/theme'
import type { FadeOptions } from '../types' import type { FadeOptions } from '../types'
import { defaultSP } from '../types' import { defaultSP } from '../types'
import { closeTooltip, tooltipstore } from '../tooltips'
export let padding: string | undefined = undefined export let padding: string | undefined = undefined
export let autoscroll: boolean = false export let autoscroll: boolean = false
@ -25,6 +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'
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'
@ -235,11 +237,15 @@
class="scroll relative verticalFade" class="scroll relative verticalFade"
class:overflowXauto={horizontal} class:overflowXauto={horizontal}
class:overflowXhidden={!horizontal} class:overflowXhidden={!horizontal}
on:scroll={() => {
if ($tooltipstore.label !== undefined) closeTooltip()
}}
> >
<div <div
bind:this={divBox} bind:this={divBox}
class="box" class="box"
style:padding style:padding
style:flex-direction={contentDirection === 'vertical' ? 'column' : 'row'}
use:resizeObserver={(element) => { use:resizeObserver={(element) => {
boxHeight = element.clientHeight boxHeight = element.clientHeight
boxWidth = element.clientWidth boxWidth = element.clientWidth
@ -295,14 +301,26 @@
min-width: 0; min-width: 0;
min-height: 0; min-height: 0;
&.normal .track, &.normal {
&.normal .bar { .track,
.bar {
right: 2px; right: 2px;
} }
&.invert .track, .track-horizontal,
&.invert .bar { .bar-horizontal {
bottom: 2px;
}
}
&.invert {
.track,
.bar {
left: 2px; left: 2px;
} }
.track-horizontal,
.bar-horizontal {
top: 2px;
}
}
} }
.horizontalBox { .horizontalBox {
min-width: 0; min-width: 0;

View File

@ -86,7 +86,7 @@
$: huge = size === 'medium' || size === 'large' $: huge = size === 'medium' || size === 'large'
afterUpdate(() => dispatch('changeContent', true)) afterUpdate(() => dispatch('changeContent'))
</script> </script>
<FocusHandler {manager} /> <FocusHandler {manager} />
@ -96,7 +96,7 @@
class:full-width={width === 'full'} class:full-width={width === 'full'}
class:max-width-40={width === 'large'} class:max-width-40={width === 'large'}
use:resizeObserver={() => { use:resizeObserver={() => {
dispatch('changeContent', true) dispatch('changeContent')
}} }}
on:keydown={onKeydown} on:keydown={onKeydown}
> >
@ -119,7 +119,7 @@
bind:this={list} bind:this={list}
count={filteredObjects.length} count={filteredObjects.length}
bind:selection bind:selection
on:changeContent={() => dispatch('changeContent', true)} on:changeContent={() => dispatch('changeContent')}
> >
<svelte:fragment slot="item" let:item={itemId}> <svelte:fragment slot="item" let:item={itemId}>
{@const item = filteredObjects[itemId]} {@const item = filteredObjects[itemId]}

View File

@ -17,6 +17,7 @@
import FontSizeSelector from './FontSizeSelector.svelte' import FontSizeSelector from './FontSizeSelector.svelte'
import LangSelector from './LangSelector.svelte' import LangSelector from './LangSelector.svelte'
import uiPlugin from '../../plugin' import uiPlugin from '../../plugin'
import { deviceOptionsStore as deviceInfo } from '../../'
let application: AnyComponent | undefined let application: AnyComponent | undefined
@ -52,13 +53,34 @@
addEventListener(PlatformEvent, async (_event, _status) => { addEventListener(PlatformEvent, async (_event, _status) => {
status = _status status = _status
}) })
let docWidth: number = window.innerWidth
let docHeight: number = window.innerHeight
let maxLenght: number
$: maxLenght = docWidth >= docHeight ? docWidth : docHeight
let isPortrait: boolean
$: isPortrait = docWidth <= docHeight
let isMobile: boolean
let alwaysMobile: boolean = false
$: isMobile =
alwaysMobile ?? /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
$: $deviceInfo.docWidth = docWidth
$: $deviceInfo.docHeight = docHeight
$: $deviceInfo.isPortrait = isPortrait
$: $deviceInfo.isMobile = isMobile
</script> </script>
<svelte:window bind:innerWidth={docWidth} bind:innerHeight={docHeight} />
<Theme> <Theme>
<div id="ui-root"> <div id="ui-root">
<div class="status-bar"> <div class="status-bar">
<div class="flex-row-center h-full content-color"> <div class="flex-row-center h-full content-color">
<div class="status-info"> <div
class="status-info"
style:margin-left={(isPortrait && docWidth <= 480) || (!isPortrait && docHeight <= 480) ? '1.5rem' : '0'}
>
<StatusComponent {status} /> <StatusComponent {status} />
</div> </div>
<div class="flex-row-reverse"> <div class="flex-row-reverse">
@ -74,7 +96,12 @@
<div class="flex-center widget cursor-pointer mr-3"> <div class="flex-center widget cursor-pointer mr-3">
<FontSizeSelector /> <FontSizeSelector />
</div> </div>
<div class="flex-center widget mr-3"> <div
class="flex-center widget mr-3"
class:on={isMobile}
class:always={alwaysMobile}
on:click={() => (alwaysMobile = !alwaysMobile)}
>
<WiFi size={'small'} /> <WiFi size={'small'} />
</div> </div>
</div> </div>
@ -106,7 +133,7 @@
.status-bar { .status-bar {
min-height: var(--status-bar-height); min-height: var(--status-bar-height);
height: var(--status-bar-height); height: var(--status-bar-height);
min-width: 600px; // min-width: 600px;
font-size: 12px; font-size: 12px;
line-height: 150%; line-height: 150%;
background-color: var(--divider-color); background-color: var(--divider-color);
@ -116,7 +143,7 @@
text-align: center; text-align: center;
} }
.clock { .clock {
margin: 0 40px 0 24px; margin: 0 1rem 0 24px;
font-weight: 500; font-weight: 500;
user-select: none; user-select: none;
} }
@ -124,14 +151,22 @@
width: 16px; width: 16px;
height: 16px; height: 16px;
font-size: 14px; font-size: 14px;
color: var(--theme-content-color); color: var(--content-color);
&.on {
color: var(--caption-color);
&.always {
color: var(--won-color);
}
}
} }
} }
.app { .app {
height: calc(100vh - var(--status-bar-height)); height: calc(100vh - var(--status-bar-height));
min-width: 600px; // min-width: 600px;
min-height: 480px; // min-height: 480px;
.error { .error {
margin-top: 45vh; margin-top: 45vh;

View File

@ -15,9 +15,10 @@
import { addLocation, addStringsLoader } from '@hcengineering/platform' import { addLocation, addStringsLoader } from '@hcengineering/platform'
import { SvelteComponent } from 'svelte' import { SvelteComponent } from 'svelte'
import { readable } from 'svelte/store' import { readable, writable } from 'svelte/store'
import Root from './components/internal/Root.svelte' import Root from './components/internal/Root.svelte'
import { uiId, uis } from './plugin' import { uiId, uis } from './plugin'
import type { DeviceOptions } from './types'
export type { export type {
AnyComponent, AnyComponent,
@ -33,7 +34,8 @@ export type {
ButtonKind, ButtonKind,
ButtonSize, ButtonSize,
IconSize, IconSize,
TabItem TabItem,
DeviceOptions
} from './types' } from './types'
// export { applicationShortcutKey } from './utils' // export { applicationShortcutKey } from './utils'
export { getCurrentLocation, locationToUrl, navigate, location } from './location' export { getCurrentLocation, locationToUrl, navigate, location } from './location'
@ -174,4 +176,11 @@ addStringsLoader(uiId, async (lang: string) => {
addLocation(uiId, async () => ({ default: async () => ({}) })) addLocation(uiId, async () => ({ default: async () => ({}) }))
export const deviceOptionsStore = writable<DeviceOptions>({
docWidth: 0,
docHeight: 0,
isPortrait: false,
isMobile: false
})
export default uis export default uis

View File

@ -253,6 +253,12 @@ export function fitPopupElement (
} else if (element === 'account') { } else if (element === 'account') {
newProps.bottom = '2.75rem' newProps.bottom = '2.75rem'
newProps.left = '5rem' newProps.left = '5rem'
} else if (element === 'account-portrait') {
newProps.bottom = 'calc(var(--app-panel-width) + .75rem)'
newProps.right = '.5rem'
} else if (element === 'account-mobile') {
newProps.bottom = '.5rem'
newProps.left = 'calc(var(--app-panel-width) + .5rem)'
} else if (element === 'full' && contentPanel === undefined) { } else if (element === 'full' && contentPanel === undefined) {
newProps.top = '0' newProps.top = '0'
newProps.bottom = '0' newProps.bottom = '0'

View File

@ -125,7 +125,16 @@ export interface PopupPositionElement {
kind?: 'submenu' kind?: 'submenu'
} }
export type PopupPosAlignment = 'right' | 'top' | 'float' | 'account' | 'full' | 'content' | 'middle' export type PopupPosAlignment =
| 'right'
| 'top'
| 'float'
| 'account'
| 'account-portrait'
| 'account-mobile'
| 'full'
| 'content'
| 'middle'
export function isPopupPosAlignment (x: any): x is PopupPosAlignment { export function isPopupPosAlignment (x: any): x is PopupPosAlignment {
return ( return (
@ -214,3 +223,10 @@ export interface FadeOptions {
export const defaultSP: FadeOptions = { multipler: { top: 0, bottom: 0 } } export const defaultSP: FadeOptions = { multipler: { top: 0, bottom: 0 } }
export const tableSP: FadeOptions = { offset: { top: true }, multipler: { top: 2.5, bottom: 0 } } export const tableSP: FadeOptions = { offset: { top: true }, multipler: { top: 2.5, bottom: 0 } }
export const issueSP: FadeOptions = { offset: { top: true }, multipler: { top: 3, bottom: 0 } } export const issueSP: FadeOptions = { offset: { top: true }, multipler: { top: 3, bottom: 0 } }
export interface DeviceOptions {
docWidth: number
docHeight: number
isPortrait: boolean
isMobile: boolean
}

View File

@ -60,7 +60,6 @@
icon={IconFolder} icon={IconFolder}
bind:value={name} bind:value={name}
placeholder={board.string.Board} placeholder={board.string.Board}
maxWidth={'16rem'}
focus focus
/> />
<!-- <ToggleWithLabel label={board.string.MakePrivate} description={board.string.MakePrivateDescription} /> --> <!-- <ToggleWithLabel label={board.string.MakePrivate} description={board.string.MakePrivateDescription} /> -->

View File

@ -93,7 +93,6 @@
bind:value={title} bind:value={title}
icon={board.icon.Card} icon={board.icon.Card}
placeholder={board.string.CardPlaceholder} placeholder={board.string.CardPlaceholder}
maxWidth={'16rem'}
focus focus
/> />
</Grid> </Grid>

View File

@ -139,15 +139,8 @@
}} }}
/> />
</svelte:fragment> </svelte:fragment>
<div class="flex-row-stretch"> <EditBox bind:value={object.title} kind={'large-style'} focus on:change={() => change('title', object?.title)} />
<div class="fs-title text-xl"> <div class="background-bg-accent border-bg-accent border-radius-3 p-4 mt-4 w-full">
<EditBox bind:value={object.title} maxWidth="39rem" focus on:change={() => change('title', object?.title)} />
</div>
</div>
<div class="flex-row-stretch">
<div class="flex-grow mr-4">
<div class="flex-row-stretch">
<div class="background-bg-accent border-bg-accent border-radius-3 p-2 mt-2 w-full">
<StyledTextBox <StyledTextBox
alwaysEdit={true} alwaysEdit={true}
showButtons={false} showButtons={false}
@ -156,7 +149,6 @@
on:value={(evt) => change('description', evt.detail)} on:value={(evt) => change('description', evt.detail)}
/> />
</div> </div>
</div>
<div class="mt-6"> <div class="mt-6">
<Attachments objectId={_id} {_class} space={object.space} attachments={object.attachments ?? 0} /> <Attachments objectId={_id} {_class} space={object.space} attachments={object.attachments ?? 0} />
</div> </div>
@ -169,8 +161,6 @@
<CardChecklist value={checklist} /> <CardChecklist value={checklist} />
{/each} {/each}
</div> </div>
</div>
</div>
<svelte:fragment slot="custom-attributes" let:direction> <svelte:fragment slot="custom-attributes" let:direction>
{#if direction === 'column'} {#if direction === 'column'}
<DocAttributeBar {object} {mixins} {ignoreKeys} {allowedCollections} /> <DocAttributeBar {object} {mixins} {ignoreKeys} {allowedCollections} />

View File

@ -109,7 +109,6 @@
<div class="fs-title text-lg"> <div class="fs-title text-lg">
<EditBox <EditBox
bind:value={object.title} bind:value={object.title}
maxWidth="39rem"
focus focus
on:change={() => updateCard(client, object, 'title', object?.title)} on:change={() => updateCard(client, object, 'title', object?.title)}
/> />
@ -158,7 +157,6 @@
<div class="fs-title text-lg"> <div class="fs-title text-lg">
<EditBox <EditBox
bind:value={object.title} bind:value={object.title}
maxWidth="39rem"
focus focus
on:change={() => updateCard(client, object, 'title', object?.title)} on:change={() => updateCard(client, object, 'title', object?.title)}
/> />

View File

@ -118,7 +118,7 @@
<div class="flex-col flex-gap-1"> <div class="flex-col flex-gap-1">
<Label label={board.string.Title} /> <Label label={board.string.Title} />
<div class="p-2 mt-1 mb-1 border-bg-accent border-radius-1"> <div class="p-2 mt-1 mb-1 border-bg-accent border-radius-1">
<EditBox bind:value={name} maxWidth="100%" focus={true} /> <EditBox bind:value={name} focus={true} />
</div> </div>
</div> </div>

View File

@ -67,7 +67,7 @@
dispatch('close') dispatch('close')
}} }}
> >
<EditBox bind:value={title} placeholder={calendar.string.Title} maxWidth={'37.5rem'} kind={'large-style'} focus /> <EditBox bind:value={title} placeholder={calendar.string.Title} kind={'large-style'} focus />
<svelte:fragment slot="pool"> <svelte:fragment slot="pool">
<DateRangePresenter bind:value withTime editable labelNull={ui.string.SelectDate} /> <DateRangePresenter bind:value withTime editable labelNull={ui.string.SelectDate} />
<DateRangePresenter bind:value={dueDate} labelNull={calendar.string.DueTo} withTime editable /> <DateRangePresenter bind:value={dueDate} labelNull={calendar.string.DueTo} withTime editable />

View File

@ -70,7 +70,7 @@
dispatch('close') dispatch('close')
}} }}
> >
<EditBox bind:value={title} placeholder={calendar.string.Title} maxWidth={'37.5rem'} kind={'large-style'} focus /> <EditBox bind:value={title} placeholder={calendar.string.Title} kind={'large-style'} focus />
<svelte:fragment slot="pool"> <svelte:fragment slot="pool">
<!-- <TimeShiftPicker title={calendar.string.Date} bind:value direction="after" /> --> <!-- <TimeShiftPicker title={calendar.string.Date} bind:value direction="after" /> -->
<DateRangePresenter bind:value withTime={true} editable={true} labelNull={ui.string.SelectDate} /> <DateRangePresenter bind:value withTime={true} editable={true} labelNull={ui.string.SelectDate} />

View File

@ -32,6 +32,7 @@
import view, { Viewlet, ViewletPreference } from '@hcengineering/view' import view, { Viewlet, ViewletPreference } from '@hcengineering/view'
import { FilterButton, ViewletSettingButton } from '@hcengineering/view-resources' import { FilterButton, ViewletSettingButton } from '@hcengineering/view-resources'
import calendar from '../plugin' import calendar from '../plugin'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
export let _class: Ref<Class<Event>> = calendar.class.Event export let _class: Ref<Class<Event>> = calendar.class.Event
export let space: Ref<Space> | undefined = undefined export let space: Ref<Space> | undefined = undefined
@ -98,10 +99,14 @@
tooltip: views.$lookup?.descriptor?.label tooltip: views.$lookup?.descriptor?.label
} }
}) })
let twoRows: boolean
$: twoRows = $deviceInfo.docWidth <= 680
</script> </script>
<div class="ac-header full withSettings"> <div class="ac-header withSettings" class:full={!twoRows} class:mini={twoRows}>
<div class="ac-header__wrap-title"> <div class:ac-header-full={!twoRows} class:flex-between={twoRows}>
<div class="ac-header__wrap-title mr-3">
<div class="ac-header__icon"><Icon icon={viewIcon} size={'small'} /></div> <div class="ac-header__icon"><Icon icon={viewIcon} size={'small'} /></div>
<span class="ac-header__title"><Label label={viewLabel} /></span> <span class="ac-header__title"><Label label={viewLabel} /></span>
<div class="ml-4"><FilterButton {_class} /></div> <div class="ml-4"><FilterButton {_class} /></div>
@ -113,6 +118,8 @@
updateResultQuery(search) updateResultQuery(search)
}} }}
/> />
</div>
<div class="ac-header-full" class:secondRow={twoRows}>
<Button icon={IconAdd} label={createLabel} kind={'primary'} size={'small'} on:click={showCreateDialog} /> <Button icon={IconAdd} label={createLabel} kind={'primary'} size={'small'} on:click={showCreateDialog} />
{#if viewlets.length > 1} {#if viewlets.length > 1}
@ -129,6 +136,7 @@
{/if} {/if}
<ViewletSettingButton viewlet={selectedViewlet} /> <ViewletSettingButton viewlet={selectedViewlet} />
</div> </div>
</div>
{#if selectedViewlet?.$lookup?.descriptor?.component} {#if selectedViewlet?.$lookup?.descriptor?.component}
{#if loading} {#if loading}

View File

@ -65,7 +65,6 @@
icon={IconFolder} icon={IconFolder}
bind:value={name} bind:value={name}
placeholder={chunter.string.ChannelNamePlaceholder} placeholder={chunter.string.ChannelNamePlaceholder}
maxWidth={'16rem'}
focus focus
/> />
</Card> </Card>

View File

@ -62,7 +62,6 @@
icon={IconFolder} icon={IconFolder}
bind:value={name} bind:value={name}
placeholder={chunter.string.ChannelNamePlaceholder} placeholder={chunter.string.ChannelNamePlaceholder}
maxWidth={'16rem'}
focus focus
/> />
<ToggleWithLabel <ToggleWithLabel

View File

@ -59,7 +59,6 @@
label={chunter.string.Topic} label={chunter.string.Topic}
bind:value={channel.topic} bind:value={channel.topic}
placeholder={chunter.string.Topic} placeholder={chunter.string.Topic}
maxWidth="39rem"
focus focus
on:change={onTopicChange} on:change={onTopicChange}
/> />
@ -67,7 +66,6 @@
label={chunter.string.ChannelDescription} label={chunter.string.ChannelDescription}
bind:value={channel.description} bind:value={channel.description}
placeholder={chunter.string.ChannelDescription} placeholder={chunter.string.ChannelDescription}
maxWidth="39rem"
focus focus
on:change={onDescriptionChange} on:change={onDescriptionChange}
/> />

View File

@ -21,6 +21,7 @@
import { ActionContext, FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources' import { ActionContext, FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources'
import contact from '../plugin' import contact from '../plugin'
import CreateContact from './CreateContact.svelte' import CreateContact from './CreateContact.svelte'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
let search = '' let search = ''
let resultQuery: DocumentQuery<Doc> = {} let resultQuery: DocumentQuery<Doc> = {}
@ -61,6 +62,9 @@
function showCreateDialog (ev: Event) { function showCreateDialog (ev: Event) {
showPopup(CreateContact, { space: contact.space.Contacts, targetElement: ev.target }, ev.target as HTMLElement) showPopup(CreateContact, { space: contact.space.Contacts, targetElement: ev.target }, ev.target as HTMLElement)
} }
let twoRows: boolean
$: twoRows = $deviceInfo.docWidth <= 680
</script> </script>
<ActionContext <ActionContext
@ -69,8 +73,9 @@
}} }}
/> />
<div class="antiPanel-component"> <div class="antiPanel-component">
<div class="ac-header full withSettings"> <div class="ac-header withSettings" class:full={!twoRows} class:mini={twoRows}>
<div class="ac-header__wrap-title"> <div class:ac-header-full={!twoRows} class:flex-between={twoRows}>
<div class="ac-header__wrap-title mr-3">
<div class="ac-header__icon"><Icon icon={contact.icon.Person} size={'small'} /></div> <div class="ac-header__icon"><Icon icon={contact.icon.Person} size={'small'} /></div>
<span class="ac-header__title"><Label label={contact.string.Contacts} /></span> <span class="ac-header__title"><Label label={contact.string.Contacts} /></span>
<div class="ml-4"><FilterButton _class={contact.class.Contact} /></div> <div class="ml-4"><FilterButton _class={contact.class.Contact} /></div>
@ -82,6 +87,8 @@
updateResultQuery(search) updateResultQuery(search)
}} }}
/> />
</div>
<div class="ac-header-full" class:secondRow={twoRows}>
<Button <Button
icon={IconAdd} icon={IconAdd}
label={contact.string.ContactCreateLabel} label={contact.string.ContactCreateLabel}
@ -91,6 +98,7 @@
/> />
<ViewletSettingButton {viewlet} /> <ViewletSettingButton {viewlet} />
</div> </div>
</div>
{#if viewlet} {#if viewlet}
{#if loading} {#if loading}

View File

@ -31,8 +31,8 @@
}) })
afterUpdate(() => { afterUpdate(() => {
dispatch('changeContent', true) dispatch('changeContent')
}) })
</script> </script>
<Menu {actions} on:changeContent={() => dispatch('changeContent', true)} /> <Menu {actions} on:changeContent={() => dispatch('changeContent')} />

View File

@ -119,7 +119,6 @@
placeholder={contact.string.PersonFirstNamePlaceholder} placeholder={contact.string.PersonFirstNamePlaceholder}
bind:value={firstName} bind:value={firstName}
kind={'large-style'} kind={'large-style'}
maxWidth={'32rem'}
focus focus
focusIndex={1} focusIndex={1}
/> />
@ -127,17 +126,10 @@
placeholder={contact.string.PersonLastNamePlaceholder} placeholder={contact.string.PersonLastNamePlaceholder}
bind:value={lastName} bind:value={lastName}
kind={'large-style'} kind={'large-style'}
maxWidth={'32rem'}
focusIndex={2} focusIndex={2}
/> />
<div class="mt-1"> <div class="mt-1">
<EditBox <EditBox placeholder={contact.string.Email} bind:value={email} kind={'small-style'} focusIndex={3} />
placeholder={contact.string.Email}
bind:value={email}
kind={'small-style'}
maxWidth={'32rem'}
focusIndex={3}
/>
</div> </div>
</div> </div>
<div class="ml-4"> <div class="ml-4">

View File

@ -84,7 +84,6 @@
<EditBox <EditBox
placeholder={contact.string.OrganizationNamePlaceholder} placeholder={contact.string.OrganizationNamePlaceholder}
bind:value={object.name} bind:value={object.name}
maxWidth={'37.5rem'}
kind={'large-style'} kind={'large-style'}
focus focus
focusIndex={1} focusIndex={1}

View File

@ -56,7 +56,6 @@
icon={IconFolder} icon={IconFolder}
bind:value={name} bind:value={name}
placeholder={contact.string.OrganizationsNamePlaceholder} placeholder={contact.string.OrganizationsNamePlaceholder}
maxWidth={'16rem'}
focus focus
/> />
<ToggleWithLabel label={contact.string.MakePrivate} description={contact.string.MakePrivateDescription} /> <ToggleWithLabel label={contact.string.MakePrivate} description={contact.string.MakePrivateDescription} />

View File

@ -109,7 +109,6 @@
placeholder={contact.string.PersonFirstNamePlaceholder} placeholder={contact.string.PersonFirstNamePlaceholder}
bind:value={firstName} bind:value={firstName}
kind={'large-style'} kind={'large-style'}
maxWidth={'32rem'}
focus focus
focusIndex={1} focusIndex={1}
/> />
@ -117,7 +116,6 @@
placeholder={contact.string.PersonLastNamePlaceholder} placeholder={contact.string.PersonLastNamePlaceholder}
bind:value={lastName} bind:value={lastName}
kind={'large-style'} kind={'large-style'}
maxWidth={'32rem'}
focusIndex={2} focusIndex={2}
/> />
<div class="mt-1"> <div class="mt-1">
@ -125,7 +123,6 @@
placeholder={contact.string.PersonLocationPlaceholder} placeholder={contact.string.PersonLocationPlaceholder}
bind:value={object.city} bind:value={object.city}
kind={'small-style'} kind={'small-style'}
maxWidth={'32rem'}
focusIndex={3} focusIndex={3}
/> />
</div> </div>

View File

@ -56,7 +56,6 @@
icon={IconFolder} icon={IconFolder}
bind:value={name} bind:value={name}
placeholder={contact.string.PersonsNamePlaceholder} placeholder={contact.string.PersonsNamePlaceholder}
maxWidth={'16rem'}
focus focus
/> />
<ToggleWithLabel label={contact.string.MakePrivate} description={contact.string.MakePrivateDescription} /> <ToggleWithLabel label={contact.string.MakePrivate} description={contact.string.MakePrivateDescription} />

View File

@ -64,7 +64,6 @@
<div class="name"> <div class="name">
<EditBox <EditBox
placeholder={contact.string.PersonFirstNamePlaceholder} placeholder={contact.string.PersonFirstNamePlaceholder}
maxWidth="20rem"
bind:value={object.name} bind:value={object.name}
on:change={nameChange} on:change={nameChange}
focus focus

View File

@ -118,7 +118,6 @@
{#if editable} {#if editable}
<EditBox <EditBox
placeholder={contact.string.PersonFirstNamePlaceholder} placeholder={contact.string.PersonFirstNamePlaceholder}
maxWidth="20rem"
bind:value={firstName} bind:value={firstName}
on:change={firstNameChange} on:change={firstNameChange}
focusIndex={1} focusIndex={1}
@ -131,7 +130,6 @@
{#if editable} {#if editable}
<EditBox <EditBox
placeholder={contact.string.PersonLastNamePlaceholder} placeholder={contact.string.PersonLastNamePlaceholder}
maxWidth="20rem"
bind:value={lastName} bind:value={lastName}
on:change={lastNameChange} on:change={lastNameChange}
focusIndex={2} focusIndex={2}

View File

@ -43,7 +43,7 @@
}} }}
> >
<Grid column={1} rowGap={1}> <Grid column={1} rowGap={1}>
<EditBox bind:value={statusName} maxWidth={'16rem'} /> <EditBox bind:value={statusName} />
<div><Label label={contact.string.StatusDueDate} /></div> <div><Label label={contact.string.StatusDueDate} /></div>
<EmployeeStatusDueDatePresenter {statusDueDate} on:change={handleDueDateChanged} /> <EmployeeStatusDueDatePresenter {statusDueDate} on:change={handleDueDateChanged} />

View File

@ -59,12 +59,7 @@
<div class="popup-block"> <div class="popup-block">
<span><Label label={contact.string.SocialLinks} /></span> <span><Label label={contact.string.SocialLinks} /></span>
{#each providers as provider, i} {#each providers as provider, i}
<EditBox <EditBox label={provider.label} placeholder={provider.placeholder} bind:value={newValues[i].value} />
label={provider.label}
placeholder={provider.placeholder}
bind:value={newValues[i].value}
maxWidth={'14.5rem'}
/>
{/each} {/each}
</div> </div>
</ScrollBox> </ScrollBox>

View File

@ -181,20 +181,10 @@
on:drop|preventDefault|stopPropagation={fileDrop} on:drop|preventDefault|stopPropagation={fileDrop}
> >
<div class="mb-2"> <div class="mb-2">
<EditBox <EditBox label={plugin.string.Subject} bind:value={obj.subject} placeholder={plugin.string.SubjectPlaceholder} />
label={plugin.string.Subject}
bind:value={obj.subject}
placeholder={plugin.string.SubjectPlaceholder}
maxWidth={'min-content'}
/>
</div> </div>
<div> <div>
<EditBox <EditBox label={plugin.string.Copy} bind:value={copy} placeholder={plugin.string.CopyPlaceholder} />
label={plugin.string.Copy}
bind:value={copy}
placeholder={plugin.string.CopyPlaceholder}
maxWidth={'min-content'}
/>
</div> </div>
{#if attachments.length} {#if attachments.length}
<div class="flex-row-center list mt-2 scroll-divider-color"> <div class="flex-row-center list mt-2 scroll-divider-color">

View File

@ -61,15 +61,16 @@
<div class="mr-3"> <div class="mr-3">
<Button focusIndex={1} icon={hr.icon.Department} size={'medium'} kind={'link-bordered'} disabled /> <Button focusIndex={1} icon={hr.icon.Department} size={'medium'} kind={'link-bordered'} disabled />
</div> </div>
<div class="clear-mins flex-grow">
<EditBox <EditBox
focusIndex={2} focusIndex={2}
bind:value={name} bind:value={name}
placeholder={hr.string.DepartmentPlaceholder} placeholder={hr.string.DepartmentPlaceholder}
maxWidth={'37.5rem'}
kind={'large-style'} kind={'large-style'}
focus focus
/> />
</div> </div>
</div>
<svelte:fragment slot="header"> <svelte:fragment slot="header">
<SpaceSelector _class={hr.class.Department} label={hr.string.ParentDepartmentLabel} bind:space /> <SpaceSelector _class={hr.class.Department} label={hr.string.ParentDepartmentLabel} bind:space />
</svelte:fragment> </svelte:fragment>

View File

@ -101,13 +101,7 @@
</div> </div>
<div class="flex-grow flex-col"> <div class="flex-grow flex-col">
<div class="name"> <div class="name">
<EditBox <EditBox placeholder={core.string.Name} bind:value={object.name} on:change={nameChange} focusIndex={1} />
placeholder={core.string.Name}
maxWidth="20rem"
bind:value={object.name}
on:change={nameChange}
focusIndex={1}
/>
</div> </div>
<div class="separator" /> <div class="separator" />
<div class="flex-row-center"> <div class="flex-row-center">

View File

@ -21,6 +21,7 @@
import hr from '../plugin' import hr from '../plugin'
import CreateDepartment from './CreateDepartment.svelte' import CreateDepartment from './CreateDepartment.svelte'
import DepartmentCard from './DepartmentCard.svelte' import DepartmentCard from './DepartmentCard.svelte'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
let search = '' let search = ''
let resultQuery: DocumentQuery<Department> = {} let resultQuery: DocumentQuery<Department> = {}
@ -63,10 +64,14 @@
spaceMembers.query(hr.mixin.Staff, {}, (res) => { spaceMembers.query(hr.mixin.Staff, {}, (res) => {
allEmployees = res allEmployees = res
}) })
let twoRows: boolean
$: twoRows = $deviceInfo.docWidth <= 680
</script> </script>
<div class="ac-header full divide"> <div class="ac-header withSettings divide" class:full={!twoRows} class:mini={twoRows}>
<div class="ac-header__wrap-title"> <div class:ac-header-full={!twoRows} class:flex-between={twoRows}>
<div class="ac-header__wrap-title mr-3">
<div class="ac-header__icon"><Icon icon={hr.icon.Structure} size={'small'} /></div> <div class="ac-header__icon"><Icon icon={hr.icon.Structure} size={'small'} /></div>
<span class="ac-header__title"><Label label={hr.string.Structure} /></span> <span class="ac-header__title"><Label label={hr.string.Structure} /></span>
</div> </div>
@ -77,6 +82,8 @@
updateResultQuery(search) updateResultQuery(search)
}} }}
/> />
</div>
<div class="ac-header-full" class:secondRow={twoRows}>
<Button <Button
label={hr.string.CreateDepartmentLabel} label={hr.string.CreateDepartmentLabel}
icon={IconAdd} icon={IconAdd}
@ -85,6 +92,7 @@
on:click={showCreateDialog} on:click={showCreateDialog}
/> />
</div> </div>
</div>
<Scroller> <Scroller>
{#if head} {#if head}

View File

@ -20,6 +20,7 @@
import inventory from '../plugin' import inventory from '../plugin'
import CreateCategory from './CreateCategory.svelte' import CreateCategory from './CreateCategory.svelte'
import HierarchyView from './HierarchyView.svelte' import HierarchyView from './HierarchyView.svelte'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
let search = '' let search = ''
let resultQuery: DocumentQuery<Category> = {} let resultQuery: DocumentQuery<Category> = {}
@ -31,10 +32,14 @@
function showCreateDialog (ev: MouseEvent) { function showCreateDialog (ev: MouseEvent) {
showPopup(CreateCategory, { space: inventory.space.Category }, eventToHTMLElement(ev)) showPopup(CreateCategory, { space: inventory.space.Category }, eventToHTMLElement(ev))
} }
let twoRows: boolean
$: twoRows = $deviceInfo.docWidth <= 680
</script> </script>
<div class="ac-header full"> <div class="ac-header withSettings" class:full={!twoRows} class:mini={twoRows}>
<div class="ac-header__wrap-title"> <div class:ac-header-full={!twoRows} class:flex-between={twoRows}>
<div class="ac-header__wrap-title mr-3">
<div class="ac-header__icon"><Icon icon={inventory.icon.Categories} size={'small'} /></div> <div class="ac-header__icon"><Icon icon={inventory.icon.Categories} size={'small'} /></div>
<span class="ac-header__title"><Label label={inventory.string.Categories} /></span> <span class="ac-header__title"><Label label={inventory.string.Categories} /></span>
</div> </div>
@ -45,6 +50,8 @@
updateResultQuery(search) updateResultQuery(search)
}} }}
/> />
</div>
<div class="ac-header-full" class:secondRow={twoRows}>
<Button <Button
label={inventory.string.CategoryCreateLabel} label={inventory.string.CategoryCreateLabel}
icon={IconAdd} icon={IconAdd}
@ -53,6 +60,7 @@
on:click={showCreateDialog} on:click={showCreateDialog}
/> />
</div> </div>
</div>
<Scroller> <Scroller>
<HierarchyView _class={inventory.class.Category} config={['', 'modifiedOn']} options={{}} query={resultQuery} /> <HierarchyView _class={inventory.class.Category} config={['', 'modifiedOn']} options={{}} query={resultQuery} />

View File

@ -70,7 +70,6 @@
icon={inventory.icon.Categories} icon={inventory.icon.Categories}
bind:value={name} bind:value={name}
placeholder={inventory.string.Category} placeholder={inventory.string.Category}
maxWidth={'16rem'}
focus focus
/> />
</Grid> </Grid>

View File

@ -82,7 +82,6 @@
icon={inventory.icon.Products} icon={inventory.icon.Products}
bind:value={doc.name} bind:value={doc.name}
placeholder={inventory.string.Product} placeholder={inventory.string.Product}
maxWidth={'16rem'}
focus focus
/> />
<DropdownLabels <DropdownLabels

View File

@ -65,13 +65,7 @@
}} }}
> >
<Grid column={1} rowGap={1.75}> <Grid column={1} rowGap={1.75}>
<EditBox <EditBox label={inventory.string.Variant} bind:value={doc.name} placeholder={inventory.string.Variant} focus />
label={inventory.string.Variant} <EditBox label={inventory.string.SKU} bind:value={doc.sku} placeholder={inventory.string.SKU} />
bind:value={doc.name}
placeholder={inventory.string.Variant}
maxWidth={'16rem'}
focus
/>
<EditBox label={inventory.string.SKU} bind:value={doc.sku} placeholder={inventory.string.SKU} maxWidth={'16rem'} />
</Grid> </Grid>
</Card> </Card>

View File

@ -196,7 +196,6 @@
placeholder={contact.string.PersonFirstNamePlaceholder} placeholder={contact.string.PersonFirstNamePlaceholder}
bind:value={firstName} bind:value={firstName}
kind={'large-style'} kind={'large-style'}
maxWidth={'32rem'}
focus focus
focusIndex={1} focusIndex={1}
/> />
@ -204,7 +203,6 @@
placeholder={contact.string.PersonLastNamePlaceholder} placeholder={contact.string.PersonLastNamePlaceholder}
bind:value={lastName} bind:value={lastName}
kind={'large-style'} kind={'large-style'}
maxWidth={'32rem'}
focusIndex={2} focusIndex={2}
/> />
<div class="mt-1"> <div class="mt-1">
@ -212,7 +210,6 @@
placeholder={contact.string.PersonLocationPlaceholder} placeholder={contact.string.PersonLocationPlaceholder}
bind:value={object.city} bind:value={object.city}
kind={'small-style'} kind={'small-style'}
maxWidth={'32rem'}
focusIndex={3} focusIndex={3}
/> />
</div> </div>
@ -220,7 +217,6 @@
placeholder={lead.string.IssueDescriptionPlaceholder} placeholder={lead.string.IssueDescriptionPlaceholder}
bind:value={object.description} bind:value={object.description}
kind={'small-style'} kind={'small-style'}
maxWidth={'32rem'}
focusIndex={4} focusIndex={4}
/> />
</div> </div>
@ -242,7 +238,6 @@
<EditBox <EditBox
placeholder={contact.string.OrganizationNamePlaceholder} placeholder={contact.string.OrganizationNamePlaceholder}
bind:value={object.name} bind:value={object.name}
maxWidth={'37.5rem'}
kind={'large-style'} kind={'large-style'}
focus focus
focusIndex={1} focusIndex={1}

View File

@ -67,7 +67,6 @@
icon={IconFolder} icon={IconFolder}
bind:value={name} bind:value={name}
placeholder={lead.string.FunnelName} placeholder={lead.string.FunnelName}
maxWidth={'16rem'}
focus focus
/> />
<ToggleWithLabel label={lead.string.MakePrivate} description={lead.string.MakePrivateDescription} /> <ToggleWithLabel label={lead.string.MakePrivate} description={lead.string.MakePrivateDescription} />

View File

@ -142,7 +142,6 @@
bind:value={title} bind:value={title}
icon={lead.icon.Lead} icon={lead.icon.Lead}
placeholder={lead.string.LeadPlaceholder} placeholder={lead.string.LeadPlaceholder}
maxWidth={'16rem'}
focus focus
/> />
<svelte:fragment slot="pool"> <svelte:fragment slot="pool">

View File

@ -85,7 +85,6 @@
<EditBox <EditBox
bind:value={object.name} bind:value={object.name}
placeholder={lead.string.FunnelPlaceholder} placeholder={lead.string.FunnelPlaceholder}
maxWidth={'39rem'}
kind={'large-style'} kind={'large-style'}
focus focus
focusable focusable
@ -96,7 +95,6 @@
<EditBox <EditBox
bind:value={object.description} bind:value={object.description}
placeholder={lead.string.Description} placeholder={lead.string.Description}
maxWidth={'39rem'}
focusable focusable
on:blur={() => { on:blur={() => {
if (rawDesc !== object.description) onChange('description', object.description) if (rawDesc !== object.description) onChange('description', object.description)

View File

@ -48,7 +48,6 @@
bind:value={rawTitle} bind:value={rawTitle}
placeholder={lead.string.LeadPlaceholder} placeholder={lead.string.LeadPlaceholder}
kind={'large-style'} kind={'large-style'}
maxWidth={'20rem'}
focusable focusable
on:blur={() => { on:blur={() => {
if (rawTitle !== object.title) change('title', rawTitle) if (rawTitle !== object.title) change('title', rawTitle)

View File

@ -38,6 +38,7 @@
import CandidateCard from './CandidateCard.svelte' import CandidateCard from './CandidateCard.svelte'
import VacancyCard from './VacancyCard.svelte' import VacancyCard from './VacancyCard.svelte'
import VacancyOrgPresenter from './VacancyOrgPresenter.svelte' import VacancyOrgPresenter from './VacancyOrgPresenter.svelte'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
export let space: Ref<SpaceWithStates> export let space: Ref<SpaceWithStates>
export let candidate: Ref<Candidate> export let candidate: Ref<Candidate>
@ -246,6 +247,8 @@
} else { } else {
candidateQuery.unsubscribe() candidateQuery.unsubscribe()
} }
let verticalContent: boolean = false
$: verticalContent = $deviceInfo.isMobile && $deviceInfo.isPortrait
</script> </script>
<FocusHandler {manager} /> <FocusHandler {manager} />
@ -265,7 +268,7 @@
</div> </div>
</svelte:fragment> </svelte:fragment>
<StatusControl slot="error" {status} /> <StatusControl slot="error" {status} />
<div class="candidate-vacancy"> <div class:candidate-vacancy={!verticalContent} class:flex-col={verticalContent}>
<div class="flex flex-stretch"> <div class="flex flex-stretch">
<UserBox <UserBox
id={'vacancy.talant.selector'} id={'vacancy.talant.selector'}
@ -288,7 +291,7 @@
</UserBox> </UserBox>
</div> </div>
<div class="flex-center"> <div class="flex-center" class:rotate={verticalContent}>
<ExpandRightDouble /> <ExpandRightDouble />
</div> </div>
<div class="flex-grow"> <div class="flex-grow">
@ -359,6 +362,9 @@
grid-template-columns: 3fr 1fr 3fr; grid-template-columns: 3fr 1fr 3fr;
grid-template-rows: 1fr; grid-template-rows: 1fr;
} }
.rotate {
transform: rotate(90deg);
}
.color { .color {
margin-right: 0.375rem; margin-right: 0.375rem;
width: 0.875rem; width: 0.875rem;

View File

@ -435,7 +435,6 @@
placeholder={recruit.string.PersonFirstNamePlaceholder} placeholder={recruit.string.PersonFirstNamePlaceholder}
bind:value={firstName} bind:value={firstName}
kind={'large-style'} kind={'large-style'}
maxWidth={'32rem'}
focus focus
focusIndex={1} focusIndex={1}
/> />
@ -443,25 +442,12 @@
placeholder={recruit.string.PersonLastNamePlaceholder} placeholder={recruit.string.PersonLastNamePlaceholder}
bind:value={lastName} bind:value={lastName}
kind={'large-style'} kind={'large-style'}
maxWidth={'32rem'}
focusIndex={2} focusIndex={2}
/> />
<div class="mt-1"> <div class="mt-1">
<EditBox <EditBox placeholder={recruit.string.Title} bind:value={object.title} kind={'small-style'} focusIndex={3} />
placeholder={recruit.string.Title}
bind:value={object.title}
kind={'small-style'}
maxWidth={'32rem'}
focusIndex={3}
/>
</div> </div>
<EditBox <EditBox placeholder={recruit.string.Location} bind:value={object.city} kind={'small-style'} focusIndex={4} />
placeholder={recruit.string.Location}
bind:value={object.city}
kind={'small-style'}
maxWidth={'32rem'}
focusIndex={4}
/>
</div> </div>
<div class="ml-4"> <div class="ml-4">
<EditableAvatar <EditableAvatar

View File

@ -73,15 +73,16 @@
<div class="mr-3"> <div class="mr-3">
<Button focusIndex={1} icon={Vacancy} size={'medium'} kind={'link-bordered'} disabled /> <Button focusIndex={1} icon={Vacancy} size={'medium'} kind={'link-bordered'} disabled />
</div> </div>
<div class="clear-mins flex-grow">
<EditBox <EditBox
focusIndex={2} focusIndex={2}
bind:value={name} bind:value={name}
placeholder={recruit.string.VacancyPlaceholder} placeholder={recruit.string.VacancyPlaceholder}
maxWidth={'37.5rem'}
kind={'large-style'} kind={'large-style'}
focus focus
/> />
</div> </div>
</div>
<svelte:fragment slot="pool"> <svelte:fragment slot="pool">
<UserBox <UserBox
focusIndex={3} focusIndex={3}

View File

@ -16,6 +16,7 @@
<script lang="ts"> <script lang="ts">
import { createEventDispatcher, onMount } from 'svelte' import { createEventDispatcher, onMount } from 'svelte'
import { createQuery } from '@hcengineering/presentation' import { createQuery } from '@hcengineering/presentation'
import { Scroller } from '@hcengineering/ui'
import type { Candidate, Applicant, Vacancy } from '@hcengineering/recruit' import type { Candidate, Applicant, Vacancy } from '@hcengineering/recruit'
import CandidateCard from './CandidateCard.svelte' import CandidateCard from './CandidateCard.svelte'
import VacancyCard from './VacancyCard.svelte' import VacancyCard from './VacancyCard.svelte'
@ -51,6 +52,7 @@
</script> </script>
{#if object !== undefined && candidate !== undefined} {#if object !== undefined && candidate !== undefined}
<Scroller horizontal>
<div class="flex-between"> <div class="flex-between">
<div class="card"><CandidateCard {candidate} on:click /></div> <div class="card"><CandidateCard {candidate} on:click /></div>
<div class="arrows"><ExpandRightDouble /></div> <div class="arrows"><ExpandRightDouble /></div>
@ -59,6 +61,7 @@
<div class="mt-6"> <div class="mt-6">
<Reviews objectId={candidate._id} reviews={candidate.reviews ?? 0} label={recruit.string.TalentReviews} /> <Reviews objectId={candidate._id} reviews={candidate.reviews ?? 0} label={recruit.string.TalentReviews} />
</div> </div>
</Scroller>
{/if} {/if}
<style lang="scss"> <style lang="scss">

View File

@ -94,7 +94,6 @@
<EditBox <EditBox
bind:value={object.name} bind:value={object.name}
placeholder={recruit.string.VacancyPlaceholder} placeholder={recruit.string.VacancyPlaceholder}
maxWidth={'39rem'}
kind={'large-style'} kind={'large-style'}
focus focus
focusable focusable
@ -114,7 +113,6 @@
<EditBox <EditBox
bind:value={object.description} bind:value={object.description}
placeholder={recruit.string.VacancyDescription} placeholder={recruit.string.VacancyDescription}
maxWidth={'39rem'}
focusable focusable
on:blur={() => { on:blur={() => {
if (rawDesc !== object.description) onChange('description', object.description) if (rawDesc !== object.description) onChange('description', object.description)

View File

@ -21,6 +21,7 @@
import { FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources' import { FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources'
import recruit from '../plugin' import recruit from '../plugin'
import CreateVacancy from './CreateVacancy.svelte' import CreateVacancy from './CreateVacancy.svelte'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
let search: string = '' let search: string = ''
let resultQuery: DocumentQuery<Doc> = {} let resultQuery: DocumentQuery<Doc> = {}
@ -129,10 +130,14 @@
} }
return result return result
} }
let twoRows: boolean
$: twoRows = $deviceInfo.docWidth <= 680
</script> </script>
<div class="ac-header full"> <div class="ac-header withSettings" class:full={!twoRows} class:mini={twoRows}>
<div class="ac-header__wrap-title"> <div class:ac-header-full={!twoRows} class:flex-between={twoRows}>
<div class="ac-header__wrap-title mr-3">
<div class="ac-header__icon"><Icon icon={recruit.icon.Vacancy} size={'small'} /></div> <div class="ac-header__icon"><Icon icon={recruit.icon.Vacancy} size={'small'} /></div>
<span class="ac-header__title"><Label label={recruit.string.Vacancies} /></span> <span class="ac-header__title"><Label label={recruit.string.Vacancies} /></span>
<div class="ml-4"><FilterButton _class={recruit.class.Vacancy} /></div> <div class="ml-4"><FilterButton _class={recruit.class.Vacancy} /></div>
@ -143,6 +148,8 @@
search = e.detail search = e.detail
}} }}
/> />
</div>
<div class="ac-header-full" class:secondRow={twoRows}>
<Button <Button
icon={IconAdd} icon={IconAdd}
label={recruit.string.VacancyCreateLabel} label={recruit.string.VacancyCreateLabel}
@ -152,6 +159,8 @@
/> />
<ViewletSettingButton viewlet={descr} /> <ViewletSettingButton viewlet={descr} />
</div> </div>
</div>
{#if descr} {#if descr}
{#if loading} {#if loading}
<Loading /> <Loading />

View File

@ -94,7 +94,6 @@
label={recruit.string.OpinionValue} label={recruit.string.OpinionValue}
placeholder={recruit.string.OpinionValuePlaceholder} placeholder={recruit.string.OpinionValuePlaceholder}
focus focus
maxWidth={'10rem'}
/> />
<div class="mt-1 mb-1"> <div class="mt-1 mb-1">
<Label label={recruit.string.Description} />: <Label label={recruit.string.Description} />:

View File

@ -148,8 +148,8 @@
}} }}
> >
<StatusControl slot="error" {status} /> <StatusControl slot="error" {status} />
<EditBox placeholder={recruit.string.Title} bind:value={title} maxWidth={'37.5rem'} kind={'large-style'} focus /> <EditBox placeholder={recruit.string.Title} bind:value={title} kind={'large-style'} focus />
<EditBox placeholder={recruit.string.Location} bind:value={location} maxWidth={'37.5rem'} kind={'small-style'} /> <EditBox placeholder={recruit.string.Location} bind:value={location} kind={'small-style'} />
<StyledTextBox <StyledTextBox
emphasized emphasized
showButtons={false} showButtons={false}

View File

@ -73,7 +73,6 @@
bind:value bind:value
icon={recruit.icon.Application} icon={recruit.icon.Application}
placeholder={recruit.string.OpinionValue} placeholder={recruit.string.OpinionValue}
maxWidth="39rem"
focus focus
/> />
<div class="mt-1 mb-1"> <div class="mt-1 mb-1">

View File

@ -61,7 +61,6 @@
<EditBox <EditBox
bind:value={rawTitle} bind:value={rawTitle}
kind={'large-style'} kind={'large-style'}
maxWidth={'20rem'}
focusable focusable
on:blur={() => { on:blur={() => {
if (rawTitle !== object.title) client.update(object, { title: rawTitle }) if (rawTitle !== object.title) client.update(object, { title: rawTitle })
@ -99,7 +98,6 @@
bind:value={object.verdict} bind:value={object.verdict}
placeholder={recruit.string.Verdict} placeholder={recruit.string.Verdict}
kind={'large-style'} kind={'large-style'}
maxWidth={'39rem'}
focusable focusable
on:change={() => client.update(object, { verdict: object.verdict })} on:change={() => client.update(object, { verdict: object.verdict })}
/> />

View File

@ -100,7 +100,7 @@
dispatch('close') dispatch('close')
}} }}
> >
<div class="mb-2"><EditBox bind:value={name} placeholder={core.string.Name} maxWidth="13rem" /></div> <div class="mb-2"><EditBox bind:value={name} placeholder={core.string.Name} /></div>
<div class="flex-col mb-2"> <div class="flex-col mb-2">
<div class="flex-row-center flex-grow"> <div class="flex-row-center flex-grow">
<Label label={setting.string.Type} /> <Label label={setting.string.Type} />

View File

@ -61,5 +61,5 @@
</div> </div>
</svelte:fragment> </svelte:fragment>
<div class="mb-2"><EditBox focus bind:value={name} placeholder={core.string.Name} maxWidth="13rem" /></div> <div class="mb-2"><EditBox focus bind:value={name} placeholder={core.string.Name} /></div>
</Card> </Card>

View File

@ -95,7 +95,7 @@
dispatch('close') dispatch('close')
}} }}
> >
<div class="mb-2"><EditBox bind:value={name} placeholder={core.string.Name} maxWidth="13rem" /></div> <div class="mb-2"><EditBox bind:value={name} placeholder={core.string.Name} /></div>
<div class="flex-col mb-2"> <div class="flex-col mb-2">
<div class="flex-row-center flex-grow"> <div class="flex-row-center flex-grow">
<Label label={setting.string.Type} /> <Label label={setting.string.Type} />

View File

@ -74,7 +74,7 @@
}} }}
> >
<div class="mb-2"> <div class="mb-2">
<EditBox bind:value={name} placeholder={setting.string.NewClassName} maxWidth="23rem" /> <EditBox bind:value={name} placeholder={setting.string.NewClassName} />
</div> </div>
<Label label={setting.string.OldNames} /> <Label label={setting.string.OldNames} />
<div class="flex-col"> <div class="flex-col">

View File

@ -182,10 +182,10 @@
> >
<div on:keydown={onKeydown}> <div on:keydown={onKeydown}>
<div class="mb-2"> <div class="mb-2">
<EditBox bind:value={name} placeholder={core.string.Name} maxWidth="13rem" /> <EditBox bind:value={name} placeholder={core.string.Name} />
</div> </div>
<div class="flex-between mb-4"> <div class="flex-between mb-4">
<EditBox placeholder={presentation.string.Search} kind="large-style" bind:value={newValue} maxWidth="13rem" /> <EditBox placeholder={presentation.string.Search} kind="large-style" bind:value={newValue} />
<div class="flex gap-2"> <div class="flex gap-2">
<ActionIcon icon={IconAdd} label={presentation.string.Add} action={add} size={'small'} /> <ActionIcon icon={IconAdd} label={presentation.string.Add} action={add} size={'small'} />
<ActionIcon <ActionIcon

View File

@ -73,7 +73,7 @@
selected = value selected = value
}} }}
> >
<EditBox maxWidth="15rem" bind:value={value.name} on:change={() => update(value)} /> <EditBox bind:value={value.name} on:change={() => update(value)} />
<div <div
class="hover-trans" class="hover-trans"
on:click|stopPropagation={(ev) => { on:click|stopPropagation={(ev) => {

View File

@ -125,7 +125,6 @@
on:keydown={handleKeydown} on:keydown={handleKeydown}
kind="large-style" kind="large-style"
bind:value={newValue} bind:value={newValue}
maxWidth="18rem"
/> />
<div class="flex gap-2"> <div class="flex gap-2">
<ActionIcon icon={IconAdd} label={setting.string.Add} action={add} size={'small'} /> <ActionIcon icon={IconAdd} label={setting.string.Add} action={add} size={'small'} />

View File

@ -71,7 +71,6 @@
format="password" format="password"
placeholder={setting.string.EnterCurrentPassword} placeholder={setting.string.EnterCurrentPassword}
label={setting.string.CurrentPassword} label={setting.string.CurrentPassword}
maxWidth="20rem"
bind:value={oldPassword} bind:value={oldPassword}
/> />
</div> </div>
@ -80,7 +79,6 @@
format="password" format="password"
placeholder={setting.string.EnterNewPassword} placeholder={setting.string.EnterNewPassword}
label={setting.string.NewPassword} label={setting.string.NewPassword}
maxWidth="20rem"
bind:value={password} bind:value={password}
/> />
</div> </div>
@ -89,7 +87,6 @@
format="password" format="password"
placeholder={setting.string.RepeatNewPassword} placeholder={setting.string.RepeatNewPassword}
label={setting.string.NewPassword} label={setting.string.NewPassword}
maxWidth="20rem"
bind:value={password2} bind:value={password2}
/> />
</div> </div>

View File

@ -99,35 +99,30 @@
</div> </div>
<div class="ac-body p-10"> <div class="ac-body p-10">
{#if employee} {#if employee}
<div class="flex flex-grow"> <div class="flex flex-grow w-full">
<div class="mr-8"> <div class="mr-8">
<EditableAvatar avatar={employee.avatar} size={'x-large'} on:done={onAvatarDone} on:remove={removeAvatar} /> <EditableAvatar avatar={employee.avatar} size={'x-large'} on:done={onAvatarDone} on:remove={removeAvatar} />
</div> </div>
<div class="flex-grow flex-col"> <div class="flex-grow flex-col">
<div class="flex-col">
<div class="name">
<EditBox <EditBox
placeholder={contactRes.string.PersonFirstNamePlaceholder} placeholder={contactRes.string.PersonFirstNamePlaceholder}
maxWidth="20rem"
bind:value={firstName} bind:value={firstName}
kind={'large-style'}
focus focus
focusIndex={1} focusIndex={1}
on:change={() => { on:change={() => {
changeName(firstName, lastName) changeName(firstName, lastName)
}} }}
/> />
</div>
<div class="name">
<EditBox <EditBox
placeholder={contactRes.string.PersonLastNamePlaceholder} placeholder={contactRes.string.PersonLastNamePlaceholder}
maxWidth="20rem"
bind:value={lastName} bind:value={lastName}
kind={'large-style'}
focusIndex={2} focusIndex={2}
on:change={() => { on:change={() => {
changeName(firstName, lastName) changeName(firstName, lastName)
}} }}
/> />
</div>
<div class="location"> <div class="location">
<AttributeEditor <AttributeEditor
maxWidth="20rem" maxWidth="20rem"
@ -137,7 +132,6 @@
key="city" key="city"
/> />
</div> </div>
</div>
<div class="separator" /> <div class="separator" />
<ChannelsEditor attachedTo={employee._id} attachedClass={employee._class} focusIndex={10} allowOpen={false} /> <ChannelsEditor attachedTo={employee._id} attachedClass={employee._class} focusIndex={10} allowOpen={false} />
</div> </div>

View File

@ -117,22 +117,16 @@
</svelte:fragment> </svelte:fragment>
</Button> </Button>
</div> </div>
<div class="flex-col mt-0-5"> <div class="flex-col mt-0-5 w-full">
<EditBox <EditBox
bind:value={title} bind:value={title}
placeholder={tags.string.TagName} placeholder={tags.string.TagName}
placeholderParam={{ word: keyTitle }} placeholderParam={{ word: keyTitle }}
maxWidth={'35rem'}
kind={'large-style'} kind={'large-style'}
focus focus
/> />
<div class="mt-2"> <div class="mt-2">
<EditBox <EditBox bind:value={description} placeholder={tags.string.TagDescriptionPlaceholder} kind={'small-style'} />
bind:value={description}
placeholder={tags.string.TagDescriptionPlaceholder}
maxWidth={'35rem'}
kind={'small-style'}
/>
</div> </div>
</div> </div>
</div> </div>

View File

@ -113,16 +113,11 @@
}) })
}} }}
/> />
<EditBox <EditBox placeholder={tags.string.TagName} placeholderParam={{ word: keyTitle }} bind:value={data.title} />
placeholder={tags.string.TagName}
placeholderParam={{ word: keyTitle }}
maxWidth="15rem"
bind:value={data.title}
/>
</div> </div>
<div class="fs-title mt-4"> <div class="fs-title mt-4">
<EditBox placeholder={tags.string.TagDescriptionPlaceholder} maxWidth="15rem" bind:value={data.description} /> <EditBox placeholder={tags.string.TagDescriptionPlaceholder} bind:value={data.description} />
</div> </div>
<div class="text-sm mt-4"> <div class="text-sm mt-4">

View File

@ -22,6 +22,7 @@
import tags from '../plugin' import tags from '../plugin'
import CategoryBar from './CategoryBar.svelte' import CategoryBar from './CategoryBar.svelte'
import CreateTagElement from './CreateTagElement.svelte' import CreateTagElement from './CreateTagElement.svelte'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
export let title: IntlString = tags.string.Tags export let title: IntlString = tags.string.Tags
export let icon: Asset | AnySvelteComponent = tags.icon.Tags export let icon: Asset | AnySvelteComponent = tags.icon.Tags
@ -84,10 +85,14 @@
const countSorting = (a: Doc, b: Doc) => const countSorting = (a: Doc, b: Doc) =>
(tagElements?.get(b._id as Ref<TagElement>)?.count ?? 0) - (tagElements?.get(b._id as Ref<TagElement>)?.count ?? 0) -
(tagElements?.get(a._id as Ref<TagElement>)?.count ?? 0) ?? 0 (tagElements?.get(a._id as Ref<TagElement>)?.count ?? 0) ?? 0
let twoRows: boolean
$: twoRows = $deviceInfo.docWidth <= 680
</script> </script>
<div class="ac-header full"> <div class="ac-header withSettings" class:full={!twoRows} class:mini={twoRows}>
<div class="ac-header__wrap-title"> <div class:ac-header-full={!twoRows} class:flex-between={twoRows}>
<div class="ac-header__wrap-title mr-3">
<div class="ac-header__icon"><Icon {icon} size={'small'} /></div> <div class="ac-header__icon"><Icon {icon} size={'small'} /></div>
<span class="ac-header__title"><Label label={title} /></span> <span class="ac-header__title"><Label label={title} /></span>
</div> </div>
@ -98,8 +103,11 @@
updateResultQuery(search, category) updateResultQuery(search, category)
}} }}
/> />
</div>
<div class="ac-header-full" class:secondRow={twoRows}>
<Button icon={IconAdd} label={сreateItemLabel} kind={'primary'} size={'small'} on:click={showCreateDialog} /> <Button icon={IconAdd} label={сreateItemLabel} kind={'primary'} size={'small'} on:click={showCreateDialog} />
</div> </div>
</div>
<CategoryBar <CategoryBar
{targetClass} {targetClass}

View File

@ -67,7 +67,6 @@
icon={IconFolder} icon={IconFolder}
bind:value={name} bind:value={name}
placeholder={plugin.string.ProjectNamePlaceholder} placeholder={plugin.string.ProjectNamePlaceholder}
maxWidth={'16rem'}
focus focus
/> />
<ToggleWithLabel label={plugin.string.MakePrivate} description={plugin.string.MakePrivateDescription} /> <ToggleWithLabel label={plugin.string.MakePrivate} description={plugin.string.MakePrivateDescription} />

View File

@ -52,7 +52,6 @@
bind:value={object.name} bind:value={object.name}
icon={task.icon.Task} icon={task.icon.Task}
placeholder={plugin.string.TaskNamePlaceholder} placeholder={plugin.string.TaskNamePlaceholder}
maxWidth="39rem"
focus focus
on:change={() => change('name', object.name)} on:change={() => change('name', object.name)}
/> />

View File

@ -80,7 +80,6 @@
bind:value={name} bind:value={name}
icon={task.icon.Task} icon={task.icon.Task}
placeholder={plugin.string.TodoDescriptionPlaceholder} placeholder={plugin.string.TodoDescriptionPlaceholder}
maxWidth={'16rem'}
focus focus
/> />
<DatePicker title={plugin.string.TodoDueDate} bind:value={dueTo} /> <DatePicker title={plugin.string.TodoDueDate} bind:value={dueTo} />

View File

@ -77,7 +77,6 @@
bind:value={name} bind:value={name}
icon={task.icon.Task} icon={task.icon.Task}
placeholder={plugin.string.TodoDescriptionPlaceholder} placeholder={plugin.string.TodoDescriptionPlaceholder}
maxWidth={'16rem'}
focus focus
/> />
<DatePicker title={plugin.string.TodoDueDate} bind:value={dueTo} /> <DatePicker title={plugin.string.TodoDueDate} bind:value={dueTo} />

View File

@ -140,7 +140,6 @@
<p><Label label={telegram.string.PasswordDescr} /></p> <p><Label label={telegram.string.PasswordDescr} /></p>
<EditBox <EditBox
label={telegram.string.Password} label={telegram.string.Password}
maxWidth="10rem"
format="password" format="password"
placeholder={telegram.string.Password} placeholder={telegram.string.Password}
bind:value={password} bind:value={password}
@ -150,12 +149,7 @@
<PinPad length={5} bind:value={code} bind:error /> <PinPad length={5} bind:value={code} bind:error />
{:else} {:else}
<p><Label label={telegram.string.PhoneDescr} /></p> <p><Label label={telegram.string.PhoneDescr} /></p>
<EditBox <EditBox label={telegram.string.Phone} placeholder={telegram.string.PhonePlaceholder} bind:value={phone} />
label={telegram.string.Phone}
maxWidth="10rem"
placeholder={telegram.string.PhonePlaceholder}
bind:value={phone}
/>
{/if} {/if}
<div class="footer"> <div class="footer">
<Button {label} kind={'primary'} {disabled} on:click={click} /> <Button {label} kind={'primary'} {disabled} on:click={click} />

View File

@ -153,7 +153,6 @@
<p><Label label={telegram.string.PasswordDescr} /></p> <p><Label label={telegram.string.PasswordDescr} /></p>
<EditBox <EditBox
label={telegram.string.Password} label={telegram.string.Password}
maxWidth="10rem"
format="password" format="password"
placeholder={telegram.string.Password} placeholder={telegram.string.Password}
bind:value={password} bind:value={password}
@ -164,12 +163,7 @@
{:else} {:else}
<p><Label label={telegram.string.PhoneDescr} /></p> <p><Label label={telegram.string.PhoneDescr} /></p>
{#await getCurrent() then value} {#await getCurrent() then value}
<EditBox <EditBox label={telegram.string.Phone} placeholder={telegram.string.PhonePlaceholder} bind:value={phone} />
label={telegram.string.Phone}
maxWidth="10rem"
placeholder={telegram.string.PhonePlaceholder}
bind:value={phone}
/>
{/await} {/await}
{/if} {/if}
<div class="footer"> <div class="footer">

View File

@ -115,11 +115,7 @@
</span> </span>
<div class="text-lg caption-color"> <div class="text-lg caption-color">
{#if mode !== Mode.View} {#if mode !== Mode.View}
<EditBox <EditBox bind:value={newTemplate.title} placeholder={templatesPlugin.string.TemplatePlaceholder} />
bind:value={newTemplate.title}
maxWidth={'12rem'}
placeholder={templatesPlugin.string.TemplatePlaceholder}
/>
{:else} {:else}
{newTemplate.title} {newTemplate.title}
{/if} {/if}

View File

@ -319,13 +319,7 @@
{#if parentIssue} {#if parentIssue}
<ParentIssue issue={parentIssue} on:close={clearParentIssue} /> <ParentIssue issue={parentIssue} on:close={clearParentIssue} />
{/if} {/if}
<EditBox <EditBox bind:value={object.title} placeholder={tracker.string.IssueTitlePlaceholder} kind={'large-style'} focus />
bind:value={object.title}
placeholder={tracker.string.IssueTitlePlaceholder}
maxWidth={'37.5rem'}
kind={'large-style'}
focus
/>
<AttachmentStyledBox <AttachmentStyledBox
bind:this={descriptionBox} bind:this={descriptionBox}
{objectId} {objectId}

View File

@ -123,9 +123,9 @@
...(hasRelation ? removeRelationAction : []) ...(hasRelation ? removeRelationAction : [])
] ]
afterUpdate(() => dispatch('changeContent', true)) afterUpdate(() => dispatch('changeContent'))
</script> </script>
{#if actions} {#if actions}
<Menu {actions} on:changeContent={() => dispatch('changeContent', true)} /> <Menu {actions} on:changeContent={() => dispatch('changeContent')} />
{/if} {/if}

View File

@ -4,6 +4,7 @@
import { FilterButton, setActiveViewletId } from '@hcengineering/view-resources' import { FilterButton, setActiveViewletId } from '@hcengineering/view-resources'
import tracker from '../../plugin' import tracker from '../../plugin'
import { WithLookup } from '@hcengineering/core' import { WithLookup } from '@hcengineering/core'
import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
export let viewlet: WithLookup<Viewlet> | undefined export let viewlet: WithLookup<Viewlet> | undefined
export let viewlets: WithLookup<Viewlet>[] = [] export let viewlets: WithLookup<Viewlet>[] = []
@ -18,10 +19,14 @@
tooltip: views.$lookup?.descriptor?.label tooltip: views.$lookup?.descriptor?.label
} }
}) })
let twoRows: boolean
$: twoRows = $deviceInfo.docWidth <= 680
</script> </script>
<div class="ac-header full"> <div class="ac-header withSettings" class:full={!twoRows} class:mini={twoRows}>
<div class="ac-header__wrap-title"> <div class:ac-header-full={!twoRows} class:flex-between={twoRows}>
<div class="ac-header__wrap-title mr-3">
{#if showLabelSelector} {#if showLabelSelector}
<slot name="label_selector" /> <slot name="label_selector" />
{:else} {:else}
@ -31,6 +36,8 @@
<div class="ml-4"><FilterButton _class={tracker.class.Issue} /></div> <div class="ml-4"><FilterButton _class={tracker.class.Issue} /></div>
</div> </div>
<SearchEdit bind:value={search} on:change={() => {}} /> <SearchEdit bind:value={search} on:change={() => {}} />
</div>
<div class="ac-header-full" class:secondRow={twoRows}>
{#if viewlets.length > 1} {#if viewlets.length > 1}
<TabList <TabList
items={viewslist} items={viewslist}
@ -49,3 +56,4 @@
{/if} {/if}
<slot name="extra" /> <slot name="extra" />
</div> </div>
</div>

View File

@ -173,7 +173,6 @@
<EditBox <EditBox
bind:value={newIssue.title} bind:value={newIssue.title}
bind:focusInput={focusIssueTitle} bind:focusInput={focusIssueTitle}
maxWidth="33rem"
placeholder={tracker.string.IssueTitlePlaceholder} placeholder={tracker.string.IssueTitlePlaceholder}
focus focus
/> />

View File

@ -221,12 +221,7 @@
{/if} {/if}
</div> </div>
{/if} {/if}
<EditBox <EditBox bind:value={title} placeholder={tracker.string.IssueTitlePlaceholder} kind="large-style" />
bind:value={title}
maxWidth="53.75rem"
placeholder={tracker.string.IssueTitlePlaceholder}
kind="large-style"
/>
<div class="flex-between mt-6"> <div class="flex-between mt-6">
{#key description} {#key description}
<div class="flex-grow"> <div class="flex-grow">

View File

@ -181,7 +181,6 @@
<EditBox <EditBox
bind:value={newIssue.title} bind:value={newIssue.title}
bind:focusInput={focusIssueTitle} bind:focusInput={focusIssueTitle}
maxWidth="33rem"
placeholder={tracker.string.IssueTitlePlaceholder} placeholder={tracker.string.IssueTitlePlaceholder}
focus focus
/> />

View File

@ -40,7 +40,6 @@
export let value: string | number | undefined export let value: string | number | undefined
export let format: 'text' | 'password' | 'number' export let format: 'text' | 'password' | 'number'
export let kind: EditStyle = 'search-style' export let kind: EditStyle = 'search-style'
export let maxWidth: string = '10rem'
export let object: Issue export let object: Issue
let _value = value let _value = value
@ -76,7 +75,6 @@
bind:value={_value} bind:value={_value}
{format} {format}
{kind} {kind}
{maxWidth}
placeholder={tracker.string.Estimation} placeholder={tracker.string.Estimation}
focus focus
on:keypress={_onkeypress} on:keypress={_onkeypress}

View File

@ -28,7 +28,6 @@
export let value: TimeSpendReport | undefined export let value: TimeSpendReport | undefined
export let placeholder: IntlString = tracker.string.TimeSpendReportValue export let placeholder: IntlString = tracker.string.TimeSpendReportValue
export let maxWidth: string = '10rem'
export function canClose (): boolean { export function canClose (): boolean {
return true return true
@ -79,7 +78,7 @@
okLabel={value === undefined ? presentation.string.Create : presentation.string.Save} okLabel={value === undefined ? presentation.string.Create : presentation.string.Save}
> >
<div class="flex-row-center gap-2"> <div class="flex-row-center gap-2">
<EditBox focus bind:value={data.value} {placeholder} format={'number'} kind={'editbox'} {maxWidth} /> <EditBox focus bind:value={data.value} {placeholder} format={'number'} kind={'editbox'} />
<UserBox <UserBox
_class={contact.class.Employee} _class={contact.class.Employee}
label={contact.string.Employee} label={contact.string.Employee}
@ -88,10 +87,5 @@
/> />
<DatePresenter kind={'link'} bind:value={data.date} editable /> <DatePresenter kind={'link'} bind:value={data.date} editable />
</div> </div>
<EditBox <EditBox bind:value={data.description} placeholder={tracker.string.TimeSpendReportDescription} kind={'editbox'} />
bind:value={data.description}
placeholder={tracker.string.TimeSpendReportDescription}
kind={'editbox'}
{maxWidth}
/>
</Card> </Card>

View File

@ -46,7 +46,7 @@
<svelte:fragment slot="aside"> <svelte:fragment slot="aside">
<div class="flex-row p-4 w-60 left-divider"> <div class="flex-row p-4 w-60 left-divider">
<div class="fs-title text-xl"> <div class="fs-title text-xl">
<EditBox bind:value={project.label} maxWidth="39rem" on:change={() => change('label', project.label)} /> <EditBox bind:value={project.label} on:change={() => change('label', project.label)} />
</div> </div>
<div class="mt-2"> <div class="mt-2">
<StyledTextBox <StyledTextBox

View File

@ -64,19 +64,12 @@
<SpaceSelector _class={tracker.class.Team} label={tracker.string.Team} bind:space /> <SpaceSelector _class={tracker.class.Team} label={tracker.string.Team} bind:space />
</svelte:fragment> </svelte:fragment>
<div class="label"> <div class="label">
<EditBox <EditBox bind:value={object.label} placeholder={tracker.string.ProjectNamePlaceholder} kind="large-style" focus />
bind:value={object.label}
placeholder={tracker.string.ProjectNamePlaceholder}
maxWidth="37.5rem"
kind="large-style"
focus
/>
</div> </div>
<div class="description"> <div class="description">
<EditBox <EditBox
bind:value={object.description} bind:value={object.description}
placeholder={tracker.string.ProjectDescriptionPlaceholder} placeholder={tracker.string.ProjectDescriptionPlaceholder}
maxWidth="37.5rem"
kind="editbox" kind="editbox"
/> />
</div> </div>

View File

@ -77,7 +77,7 @@
<svelte:fragment slot="aside"> <svelte:fragment slot="aside">
<div class="flex-grow p-4 w-60 left-divider"> <div class="flex-grow p-4 w-60 left-divider">
<div class="fs-title text-xl"> <div class="fs-title text-xl">
<EditBox bind:value={sprint.label} maxWidth="39rem" on:change={() => change('label', sprint.label)} /> <EditBox bind:value={sprint.label} on:change={() => change('label', sprint.label)} />
</div> </div>
<div class="mt-2"> <div class="mt-2">
<StyledTextBox <StyledTextBox

View File

@ -61,19 +61,12 @@
<SpaceSelector _class={tracker.class.Team} label={tracker.string.Team} bind:space /> <SpaceSelector _class={tracker.class.Team} label={tracker.string.Team} bind:space />
</svelte:fragment> </svelte:fragment>
<div class="label"> <div class="label">
<EditBox <EditBox bind:value={object.label} placeholder={tracker.string.ProjectNamePlaceholder} kind="large-style" focus />
bind:value={object.label}
placeholder={tracker.string.ProjectNamePlaceholder}
maxWidth="37.5rem"
kind="large-style"
focus
/>
</div> </div>
<div class="description"> <div class="description">
<EditBox <EditBox
bind:value={object.description} bind:value={object.description}
placeholder={tracker.string.ProjectDescriptionPlaceholder} placeholder={tracker.string.ProjectDescriptionPlaceholder}
maxWidth="37.5rem"
kind="editbox" kind="editbox"
/> />
</div> </div>

View File

@ -23,7 +23,6 @@
export let format: 'text' | 'password' | 'number' export let format: 'text' | 'password' | 'number'
export let placeholder: IntlString export let placeholder: IntlString
export let kind: EditStyle = 'search-style' export let kind: EditStyle = 'search-style'
export let maxWidth: string = '10rem'
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()
@ -34,6 +33,6 @@
<div class="selectPopup"> <div class="selectPopup">
<div class="header no-border"> <div class="header no-border">
<EditBox bind:value {placeholder} {format} {kind} {maxWidth} focus on:keypress={_onkeypress} /> <EditBox bind:value {placeholder} {format} {kind} focus on:keypress={_onkeypress} />
</div> </div>
</div> </div>

View File

@ -337,7 +337,7 @@
{#each fieldEditors as collection} {#each fieldEditors as collection}
{#if collection.editor} {#if collection.editor}
<div class="mt-6"> <div class="mt-6 clear-mins">
<Component <Component
is={collection.editor} is={collection.editor}
props={{ props={{

View File

@ -61,5 +61,5 @@
</script> </script>
{#if loaded} {#if loaded}
<Menu {actions} on:close on:changeContent={() => dispatch('changeContent', true)} /> <Menu {actions} on:close on:changeContent={() => dispatch('changeContent')} />
{/if} {/if}

View File

@ -22,7 +22,6 @@
export let placeholder: IntlString export let placeholder: IntlString
export let value: number export let value: number
export let focus: boolean export let focus: boolean
export let maxWidth: string = '10rem'
export let onChange: (value: number) => void export let onChange: (value: number) => void
export let kind: 'no-border' | 'link' = 'no-border' export let kind: 'no-border' | 'link' = 'no-border'
export let readonly = false export let readonly = false
@ -62,7 +61,7 @@
<span class="dark-color"><Label label={placeholder} /></span> <span class="dark-color"><Label label={placeholder} /></span>
{/if} {/if}
{:else} {:else}
<EditBox {placeholder} {maxWidth} bind:value format={'number'} {focus} on:change={_onchange} /> <EditBox {placeholder} bind:value format={'number'} {focus} on:change={_onchange} />
{/if} {/if}
<style lang="scss"> <style lang="scss">

View File

@ -22,7 +22,6 @@
export let placeholder: IntlString export let placeholder: IntlString
export let value: string export let value: string
export let focus: boolean export let focus: boolean
export let maxWidth: string = '10rem'
export let onChange: (value: string) => void export let onChange: (value: string) => void
export let kind: 'no-border' | 'link' = 'no-border' export let kind: 'no-border' | 'link' = 'no-border'
export let readonly = false export let readonly = false
@ -62,7 +61,7 @@
<span class="dark-color"><Label label={placeholder} /></span> <span class="dark-color"><Label label={placeholder} /></span>
{/if} {/if}
{:else} {:else}
<EditBox {placeholder} {maxWidth} bind:value {focus} on:change={_onchange} /> <EditBox {placeholder} bind:value {focus} on:change={_onchange} />
{/if} {/if}
<style lang="scss"> <style lang="scss">

Some files were not shown because too many files have changed in this diff Show More