TSK-1459: update Panel layout (#3163)

Signed-off-by: Alexander Platov <sas_lord@mail.ru>
This commit is contained in:
Alexander Platov 2023-05-11 10:18:33 +03:00 committed by GitHub
parent 148cbd4898
commit 2e6181acf1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
47 changed files with 278 additions and 280 deletions

View File

@ -157,23 +157,28 @@
</svelte:fragment> </svelte:fragment>
<svelte:fragment slot="aside"> <svelte:fragment slot="aside">
<Scroller padding={'.75rem 1.5rem'}> {#if $$slots['aside-tabs']}
{#if $$slots.actions} <div class="popupPanel-body__aside-tabsheader">
<div class="flex-row-center pb-3 bottom-divider"> <slot name="aside-tabs" />
{#if $$slots['actions-label']} </div>
<span class="fs-bold w-24 mr-6"><slot name="actions-label" /></span> {/if}
{/if} {#if $$slots.actions}
<div class="buttons-group xsmall-gap flex flex-grow"> <div class="popupPanel-body__aside-header">
<slot name="actions" /> {#if $$slots['actions-label']}
</div> <span class="fs-bold w-27 mr-6"><slot name="actions-label" /></span>
{/if}
<div class="buttons-group xsmall-gap flex flex-grow">
<slot name="actions" />
</div> </div>
{/if} </div>
{/if}
<Scroller>
{#if $$slots['custom-attributes'] && isCustomAttr} {#if $$slots['custom-attributes'] && isCustomAttr}
<slot name="custom-attributes" direction="column" /> <slot name="custom-attributes" direction="column" />
{:else if $$slots.attributes}<slot name="attributes" direction="column" />{/if} {:else if $$slots.attributes}<slot name="attributes" direction="column" />{/if}
{#if $$slots.aside}<slot name="aside" />{/if} {#if $$slots.aside}<slot name="aside" />{/if}
<div class="h-2 min-h-2 max-h-2" />
</Scroller> </Scroller>
<div class="h-2 min-h-2 max-h-2" />
</svelte:fragment> </svelte:fragment>
{#if $deviceInfo.isMobile} {#if $deviceInfo.isMobile}

View File

@ -66,7 +66,7 @@
{#if editor} {#if editor}
{#if showHeader} {#if showHeader}
<span <span
class="overflow-label" class="label"
use:tooltip={{ use:tooltip={{
component: Label, component: Label,
props: { label: attribute.label } props: { label: attribute.label }

View File

@ -32,21 +32,8 @@
export let justify: 'left' | 'center' = 'left' export let justify: 'left' | 'center' = 'left'
</script> </script>
<div class="attributes-bar-container vertical"> <div class="popupPanel-body__aside-grid">
{#each keys as key (typeof key === 'string' ? key : key.key)} {#each keys as key (typeof key === 'string' ? key : key.key)}
<AttributeBarEditor {key} {_class} {object} {showHeader} {readonly} {draft} on:update /> <AttributeBarEditor {key} {_class} {object} {showHeader} {readonly} {draft} on:update />
{/each} {/each}
</div> </div>
<style lang="scss">
.attributes-bar-container {
display: grid;
grid-template-columns: 1fr 1.5fr;
grid-auto-flow: row;
justify-content: start;
align-items: center;
gap: 1rem;
width: 100%;
height: min-content;
}
</style>

View File

@ -153,7 +153,7 @@ export class LiveQuery {
private oldOptions: FindOptions<Doc> | undefined private oldOptions: FindOptions<Doc> | undefined
private oldCallback: ((result: FindResult<any>) => void) | undefined private oldCallback: ((result: FindResult<any>) => void) | undefined
private reqId = 0 private reqId = 0
unsubscribe = () => {} unsubscribe: () => void = () => {}
clientRecreated = false clientRecreated = false
constructor (noDestroy: boolean = false) { constructor (noDestroy: boolean = false) {

View File

@ -115,8 +115,8 @@ p:last-child { margin-block-end: 0; }
hyphens: auto; hyphens: auto;
line-height: 150%; line-height: 150%;
&.contrast { color: var(--theme-accent-color); } &.contrast { color: var(--theme-caption-color); }
&:not(.contrast) { color: var(--content-color); } &:not(.contrast) { color: var(--theme-content-color); }
a { a {
word-break: break-all; word-break: break-all;
@ -127,11 +127,11 @@ p:last-child { margin-block-end: 0; }
a.noUnderline { a.noUnderline {
&:hover { &:hover {
color: var(--caption-color); color: var(--theme-caption-color);
text-decoration: none; text-decoration: none;
} }
&:active { &:active {
color: var(--accent-color); color: var(--theme-caption-color);
text-decoration: none; text-decoration: none;
} }
} }
@ -159,7 +159,7 @@ a.noUnderline {
input.search { input.search {
margin: 0; margin: 0;
color: var(--accent-color); color: var(--theme-caption-color);
border: none; border: none;
caret-color: var(--theme-caret-color); caret-color: var(--theme-caret-color);
@ -281,7 +281,6 @@ input.search {
} }
.label { .label {
min-width: 0; min-width: 0;
font-weight: 500;
text-align: left; text-align: left;
color: var(--theme-content-color); color: var(--theme-content-color);
@ -337,16 +336,6 @@ input.search {
.avatar-container:not(.no-img) { transform: translateY(.375rem); } .avatar-container:not(.no-img) { transform: translateY(.375rem); }
.avatar-container.no-img { transform: translateY(.15rem); } .avatar-container.no-img { transform: translateY(.15rem); }
} }
// Presenters on the card
.card-container .flex-presenter,
.card-container .inline-presenter {
.icon { display: none; }
.label {
font-size: .75rem;
color: var(--dark-color);
}
&:hover .label { color: var(--content-color); }
}
.buttons-group { .buttons-group {
display: grid; display: grid;
@ -527,6 +516,7 @@ input.search {
.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; }
.px-6 { padding: 0 1.5rem; }
.px-10 { padding: 0 2.5rem; } .px-10 { padding: 0 2.5rem; }
.py-1 { padding: 0.25rem 0; } .py-1 { padding: 0.25rem 0; }
.py-4 { padding: 1rem 0; } .py-4 { padding: 1rem 0; }
@ -622,6 +612,7 @@ input.search {
.w-16 { width: 4rem; } .w-16 { width: 4rem; }
.w-22 { width: 5.5rem; } .w-22 { width: 5.5rem; }
.w-24 { width: 6rem; } .w-24 { width: 6rem; }
.w-27 { width: 6.75rem; }
.w-32 { width: 8rem; } .w-32 { width: 8rem; }
.w-60 { width: 15rem; } .w-60 { width: 15rem; }
.w-85 { width: 21.25rem; } .w-85 { width: 21.25rem; }
@ -706,19 +697,19 @@ input.search {
} }
.hover-trans { .hover-trans {
color: var(--dark-color); color: var(--theme-dark-color);
cursor: pointer; cursor: pointer;
&:hover { color: var(--caption-color); } &:hover { color: var(--theme-caption-color); }
&:active { color: var(--accent-color); } &:active { color: var(--theme-caption-color); }
} }
/* Link */ /* Link */
a.no-line { a.no-line {
text-decoration: none; text-decoration: none;
color: var(--accent-color); color: var(--theme-caption-color);
&:hover { color: var(--caption-color); } &:hover { color: var(--theme-caption-color); }
&:active { color: var(--accent-color); } &:active { color: var(--theme-caption-color); }
&:visited { color: var(--accent-color); } &:visited { color: var(--theme-caption-color); }
} }
.cursor-pointer { cursor: pointer; } .cursor-pointer { cursor: pointer; }
.cursor-default { cursor: default; } .cursor-default { cursor: default; }
@ -733,14 +724,14 @@ a.no-line {
.fs-title { .fs-title {
font-weight: 500; font-weight: 500;
font-size: 1rem; font-size: 1rem;
color: var(--caption-color); color: var(--theme-caption-color);
user-select: none; user-select: none;
} }
.trans-title { .trans-title {
text-transform: uppercase; text-transform: uppercase;
font-weight: 600; font-weight: 600;
font-size: .75rem; font-size: .75rem;
color: var(--dark-color); color: var(--theme-dark-color);
user-select: none; user-select: none;
} }
.text-xs { font-size: .625rem; } .text-xs { font-size: .625rem; }

View File

@ -737,6 +737,15 @@
& > * { margin-left: .375rem; } & > * { margin-left: .375rem; }
} }
} }
// Labels on the ListView
.list-container .listitems-container,
.list-container .listitems-container:hover,
.list-container .button,
.list-container .button:hover {
background-color: var(--theme-list-button-color) !important;
.icon { color: var(--theme-halfcontent-color) !important; }
.label { color: var(--theme-halfcontent-color) !important; }
}
/* Kanban - global style */ /* Kanban - global style */
.kanban-container .card-container .card-labels > * { margin: .25rem .25rem 0 0; } .kanban-container .card-container .card-labels > * { margin: .25rem .25rem 0 0; }

View File

@ -66,6 +66,7 @@
scrollbar-color: var(--body-accent) var(--board-bg-color); scrollbar-color: var(--body-accent) var(--board-bg-color);
scrollbar-width: none; scrollbar-width: none;
--body-font-size: .875rem; --body-font-size: .875rem;
--panel-aside-width: 25rem; // 20rem;
--font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto; --font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto;
--timing-shadow: cubic-bezier(0,.65,.35,1); --timing-shadow: cubic-bezier(0,.65,.35,1);
--timing-main: cubic-bezier(0.25, 0.46, 0.45, 0.94); --timing-main: cubic-bezier(0.25, 0.46, 0.45, 0.94);

View File

@ -165,12 +165,24 @@
.popupPanel-body__header { .popupPanel-body__header {
display: flex; display: flex;
flex-direction: column; align-items: center;
height: 100%;
min-height: 0;
&-wrapper {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
min-width: 0;
min-height: 3.5rem;
border-bottom: 1px solid var(--theme-divider-color);
}
&.main { &.main {
margin: 0 auto;
padding: .75rem 1.25rem; padding: .75rem 1.25rem;
width: calc(100% - 5rem); width: calc(100% - 5rem);
height: 100%;
min-width: 0;
max-width: 900px; max-width: 900px;
&.max { &.max {
@ -203,38 +215,26 @@
} }
&__aside { &__aside {
position: relative;
width: 25%; width: 25%;
min-width: 320px; min-width: var(--panel-aside-width);
border-left: 1px solid var(--theme-divider-color);
&::before {
position: absolute;
content: '';
top: 1rem;
bottom: 1rem;
left: 0;
width: 0;
border-left: 1px solid var(--theme-divider-color);
}
&.float { &.float {
position: absolute; position: absolute;
flex-shrink: 0; flex-shrink: 0;
top: 0; top: 0;
left: 100%; left: 100%;
width: 320px; width: var(--panel-aside-width);
min-width: 0; min-width: 0;
max-width: 320px; max-width: var(--panel-aside-width);
height: 100%; height: 100%;
background-color: var(--theme-panel-color); background-color: var(--theme-panel-color);
border-left: 1px solid var(--theme-divider-color);
border-bottom-right-radius: .45rem; border-bottom-right-radius: .45rem;
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
transition: box-shadow 150ms ease 0s, transform 150ms cubic-bezier(0.175, 0.885, 0.32, 1.275); transition: box-shadow 150ms ease 0s, transform 150ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
transform: translateX(0); transform: translateX(0);
visibility: hidden; visibility: hidden;
&::before { content: none; }
&.shown { &.shown {
box-shadow: var(--popup-aside-shadow); box-shadow: var(--popup-aside-shadow);
transform: translateX(-100%); transform: translateX(-100%);
@ -252,6 +252,46 @@
} }
} }
} }
&-header,
&-tabsheader {
display: flex;
align-items: center;
flex-shrink: 0;
padding: .75rem 2rem;
height: 3.5rem;
min-height: 3.5rem;
border-bottom: 1px solid var(--theme-divider-color);
}
&-tabsheader {
padding: 0 2rem;
}
&-grid {
display: grid;
grid-template-columns: 1fr 1.5fr;
grid-auto-flow: row;
justify-content: start;
align-items: center;
row-gap: .25rem;
column-gap: 1rem;
margin: .5rem 2rem;
width: calc(100% - 4rem);
height: min-content;
.divider {
grid-column: 1 / 3;
margin: .75rem -2rem;
height: 1px;
background-color: var(--theme-divider-color);
}
.label,
.labelTop { color: var(--theme-dark-color); }
.labelTop {
align-self: start;
margin-top: 0.385rem;
}
}
} }
// &.asideShown .popupPanel-body__main { // &.asideShown .popupPanel-body__main {

View File

@ -50,6 +50,7 @@
export let iconSize: IconSize = size === 'inline' ? 'inline' : 'small' export let iconSize: IconSize = size === 'inline' ? 'inline' : 'small'
export let iconRightSize: IconSize = 'x-small' export let iconRightSize: IconSize = 'x-small'
export let short: boolean = false export let short: boolean = false
export let accent: boolean = false
// $: iconSize = size === 'inline' ? 'inline' : 'small' // $: iconSize = size === 'inline' ? 'inline' : 'small'
$: iconOnly = $: iconOnly =
@ -97,6 +98,7 @@
bind:this={input} bind:this={input}
class="button {kind} {size} jf-{justify} sh-{shape ?? 'no-shape'} bs-{borderStyle}" class="button {kind} {size} jf-{justify} sh-{shape ?? 'no-shape'} bs-{borderStyle}"
class:only-icon={iconOnly} class:only-icon={iconOnly}
class:accent
class:highlight class:highlight
class:selected class:selected
class:notSelected class:notSelected
@ -178,7 +180,6 @@
align-items: center; align-items: center;
flex-shrink: 0; flex-shrink: 0;
padding: 0 0.625rem; padding: 0 0.625rem;
font-weight: 500;
min-width: 1.375rem; min-width: 1.375rem;
white-space: nowrap; white-space: nowrap;
color: var(--theme-caption-color); color: var(--theme-caption-color);
@ -187,6 +188,9 @@
transition-property: border, background-color, color, box-shadow; transition-property: border, background-color, color, box-shadow;
transition-duration: 0.15s; transition-duration: 0.15s;
&.accent {
font-weight: 500;
}
.btn-icon { .btn-icon {
color: var(--theme-content-color); color: var(--theme-content-color);
transition: color 0.15s; transition: color 0.15s;
@ -391,8 +395,8 @@
&.list { &.list {
padding: 0 0.625em; padding: 0 0.625em;
min-height: 1.75rem; min-height: 1.75rem;
color: var(--theme-halfcontent-color); color: var(--theme-content-color);
background-color: var(--theme-list-button-color); background-color: var(--theme-button-enabled);
border: 1px solid var(--theme-button-border); border: 1px solid var(--theme-button-border);
border-radius: 1.5rem; border-radius: 1.5rem;
// transition-property: border, color, background-color; // transition-property: border, color, background-color;
@ -402,8 +406,8 @@
color: var(--theme-dark-color); color: var(--theme-dark-color);
} }
&:hover { &:hover {
color: var(--theme-halfcontent-color); color: var(--theme-caption-color);
background-color: var(--theme-list-button-color); background-color: var(--theme-button-hovered);
border-color: var(--theme-button-border); border-color: var(--theme-button-border);
} }
&:focus { &:focus {
@ -412,6 +416,7 @@
} }
&.primary { &.primary {
padding: 0 0.75rem; padding: 0 0.75rem;
font-weight: 500;
color: var(--primary-button-color); color: var(--primary-button-color);
background-color: var(--primary-button-enabled); background-color: var(--primary-button-enabled);
border-color: var(--primary-button-border); border-color: var(--primary-button-border);

View File

@ -182,8 +182,10 @@
}} }}
> >
{#if $$slots.header && isHeader} {#if $$slots.header && isHeader}
<div class="popupPanel-body__header main bottom-divider" class:max={useMaxWidth}> <div class="popupPanel-body__header-wrapper">
<slot name="header" /> <div class="popupPanel-body__header main" class:max={useMaxWidth}>
<slot name="header" />
</div>
</div> </div>
{/if} {/if}
<slot /> <slot />

View File

@ -195,6 +195,7 @@
&.plain, &.plain,
&.separated { &.separated {
margin-bottom: -1px; margin-bottom: -1px;
height: 100%;
} }
.plain { .plain {
display: inline-flex; display: inline-flex;

View File

@ -36,6 +36,7 @@
export let shouldShowLabel: boolean = true export let shouldShowLabel: boolean = true
export let size: ButtonSize | 'x-small' = 'small' export let size: ButtonSize | 'x-small' = 'small'
export let kind: ButtonKind = 'link' export let kind: ButtonKind = 'link'
export let width: string | undefined = undefined
export let label = ui.string.DueDate export let label = ui.string.DueDate
export let detail = ui.string.NeedsToBeCompletedByThisDate export let detail = ui.string.NeedsToBeCompletedByThisDate
@ -67,6 +68,7 @@
class:editable class:editable
class:dateTimeButtonNoLabel={!shouldShowLabel} class:dateTimeButtonNoLabel={!shouldShowLabel}
class:text-xs={size === 'x-small'} class:text-xs={size === 'x-small'}
style:width
on:click={(e) => { on:click={(e) => {
if (editable && !opened) { if (editable && !opened) {
e.stopPropagation() e.stopPropagation()
@ -248,6 +250,7 @@
&.list { &.list {
padding: 0 0.625em 0 0.5rem; padding: 0 0.625em 0 0.5rem;
min-height: 1.75rem; min-height: 1.75rem;
color: var(--theme-halfcontent-color);
background-color: var(--theme-list-button-color); background-color: var(--theme-list-button-color);
border: 1px solid var(--theme-divider-color); border: 1px solid var(--theme-divider-color);
border-radius: 3rem; border-radius: 3rem;
@ -255,10 +258,14 @@
transition-duration: 0.15s; transition-duration: 0.15s;
&:hover { &:hover {
color: var(--theme-caption-color); color: var(--theme-halfcontent-color);
background-color: var(--theme-list-button-color); background-color: var(--theme-list-button-hover);
border-color: var(--theme-divider-color); border-color: var(--theme-divider-color);
} }
.btn-icon,
&:hover .btn-icon {
color: var(--theme-halfcontent-color) !important;
}
&.medium { &.medium {
height: 1.75rem; height: 1.75rem;
} }

View File

@ -563,7 +563,6 @@
&.secondary { &.secondary {
padding: 0 0.625rem; padding: 0 0.625rem;
font-weight: 500;
color: var(--theme-caption-color); color: var(--theme-caption-color);
background-color: var(--theme-button-enabled); background-color: var(--theme-button-enabled);
border-color: var(--theme-button-border); border-color: var(--theme-button-border);

View File

@ -27,6 +27,7 @@
export let editable: boolean = true export let editable: boolean = true
export let shouldIgnoreOverdue: boolean = false export let shouldIgnoreOverdue: boolean = false
export let size: ButtonSize = 'medium' export let size: ButtonSize = 'medium'
export let width: string | undefined = undefined
const today = new Date(new Date(Date.now()).setHours(0, 0, 0, 0)) const today = new Date(new Date(Date.now()).setHours(0, 0, 0, 0))
$: isOverdue = value !== null && value < today.getTime() $: isOverdue = value !== null && value < today.getTime()
@ -77,6 +78,7 @@
{#if shouldRender} {#if shouldRender}
<div <div
class="clear-mins" class="clear-mins"
style:width
use:tooltip={formattedDate use:tooltip={formattedDate
? { ? {
direction: 'top', direction: 'top',
@ -91,6 +93,6 @@
} }
: undefined} : undefined}
> >
<DatePresenter {value} {editable} icon={iconModifier} {kind} {size} on:change={handleDueDateChanged} /> <DatePresenter {value} {editable} icon={iconModifier} {kind} {size} {width} on:change={handleDueDateChanged} />
</div> </div>
{/if} {/if}

View File

@ -10,7 +10,7 @@
{#if value} {#if value}
<ColorPresenter value={value.color} {isHovered} {size} on:click> <ColorPresenter value={value.color} {isHovered} {size} on:click>
{#if size !== 'tiny'} {#if size !== 'tiny'}
<div class="flex-center h-full w-full fs-title text-sm pr-1 pl-1">{value.title}</div> <div class="flex-center h-full w-full text-sm pr-1 pl-1">{value.title}</div>
{/if} {/if}
</ColorPresenter> </ColorPresenter>
{/if} {/if}

View File

@ -21,6 +21,7 @@
Button, Button,
ButtonKind, ButtonKind,
ButtonSize, ButtonSize,
IconSize,
getEventPositionElement, getEventPositionElement,
getFocusManager, getFocusManager,
Icon, Icon,
@ -56,6 +57,7 @@
export let readonly = false export let readonly = false
export let kind: ButtonKind = 'no-border' export let kind: ButtonKind = 'no-border'
export let size: ButtonSize = 'small' export let size: ButtonSize = 'small'
export let avatarSize: IconSize = kind === 'secondary' ? 'small' : 'card'
export let justify: 'left' | 'center' = 'center' export let justify: 'left' | 'center' = 'center'
export let width: string | undefined = undefined export let width: string | undefined = undefined
export let focusIndex = -1 export let focusIndex = -1
@ -145,7 +147,7 @@
> >
{#if selected} {#if selected}
{#if hideIcon || selected} {#if hideIcon || selected}
<UserInfo value={selected} size={kind === 'link' ? 'x-small' : 'tiny'} {icon} on:accent-color /> <UserInfo value={selected} size={avatarSize} {icon} on:accent-color />
{:else} {:else}
{getName(selected)} {getName(selected)}
{/if} {/if}
@ -153,7 +155,7 @@
<div class="flex-presenter not-selected"> <div class="flex-presenter not-selected">
{#if icon} {#if icon}
<div class="icon" class:small-gap={size === 'inline' || size === 'small'}> <div class="icon" class:small-gap={size === 'inline' || size === 'small'}>
<Icon {icon} size={kind === 'link' || kind === 'secondary' ? 'small' : size} /> <Icon {icon} size={avatarSize} />
</div> </div>
{/if} {/if}
<div class="label no-underline"> <div class="label no-underline">

View File

@ -45,9 +45,8 @@
<style lang="scss"> <style lang="scss">
.user { .user {
color: var(--accent-color); color: var(--theme-caption-color);
margin-left: 0.5rem; margin-left: 0.5rem;
font-weight: 500;
text-align: left; text-align: left;
} }
</style> </style>

View File

@ -17,7 +17,7 @@
import contact, { Employee } from '@hcengineering/contact' import contact, { Employee } from '@hcengineering/contact'
import type { Class, DocumentQuery, FindOptions, Ref } from '@hcengineering/core' import type { Class, DocumentQuery, FindOptions, Ref } from '@hcengineering/core'
import type { IntlString } from '@hcengineering/platform' import type { IntlString } from '@hcengineering/platform'
import { ButtonKind, ButtonSize, LabelAndProps } from '@hcengineering/ui' import { ButtonKind, ButtonSize, IconSize, LabelAndProps } from '@hcengineering/ui'
import presentation from '@hcengineering/presentation' import presentation from '@hcengineering/presentation'
import IconPerson from './icons/Person.svelte' import IconPerson from './icons/Person.svelte'
import UserBox from './UserBox.svelte' import UserBox from './UserBox.svelte'
@ -34,6 +34,7 @@
export let titleDeselect: IntlString | undefined = undefined export let titleDeselect: IntlString | undefined = undefined
export let kind: ButtonKind = 'no-border' export let kind: ButtonKind = 'no-border'
export let size: ButtonSize = 'small' export let size: ButtonSize = 'small'
export let avatarSize: IconSize = 'card'
export let justify: 'left' | 'center' = 'center' export let justify: 'left' | 'center' = 'center'
export let width: string | undefined = undefined export let width: string | undefined = undefined
export let focusIndex = -1 export let focusIndex = -1
@ -54,6 +55,7 @@
{titleDeselect} {titleDeselect}
{kind} {kind}
{size} {size}
{avatarSize}
{justify} {justify}
{width} {width}
{focusIndex} {focusIndex}

View File

@ -106,11 +106,10 @@
align-items: baseline; align-items: baseline;
} }
.eContentPresenterIcon { .eContentPresenterIcon {
color: var(--dark-color); color: var(--theme-dark-color);
} }
.eContentPresenterLabel { .eContentPresenterLabel {
min-width: 0; min-width: 0;
font-weight: 500;
text-align: left; text-align: left;
color: var(--theme-caption-color); color: var(--theme-caption-color);
@ -139,10 +138,9 @@
.status { .status {
margin-left: 0.25rem; margin-left: 0.25rem;
padding: 0.125rem 0.25rem; padding: 0.125rem 0.25rem;
font-weight: 500;
font-size: 0.75rem; font-size: 0.75rem;
color: var(--content-color); color: var(--theme-content-color);
background-color: var(--noborder-bg-color); background-color: var(--theme-button-enabled);
border-radius: 0.25rem; border-radius: 0.25rem;
} }
</style> </style>

View File

@ -24,6 +24,7 @@
Button, Button,
ButtonKind, ButtonKind,
ButtonSize, ButtonSize,
IconSize,
getEventPositionElement, getEventPositionElement,
getFocusManager, getFocusManager,
Icon, Icon,
@ -54,6 +55,7 @@
export let readonly = false export let readonly = false
export let kind: ButtonKind = 'no-border' export let kind: ButtonKind = 'no-border'
export let size: ButtonSize = 'small' export let size: ButtonSize = 'small'
export let avatarSize: IconSize = kind === 'link' ? 'x-small' : 'tiny'
export let justify: 'left' | 'center' = 'center' export let justify: 'left' | 'center' = 'center'
export let width: string | undefined = undefined export let width: string | undefined = undefined
export let focusIndex = -1 export let focusIndex = -1
@ -151,7 +153,7 @@
> >
{#if selected} {#if selected}
{#if hideIcon || selected} {#if hideIcon || selected}
<UserInfo value={selected} size={kind === 'link' ? 'x-small' : 'tiny'} {icon} /> <UserInfo value={selected} size={avatarSize} {icon} />
{:else} {:else}
{getName(selected)} {getName(selected)}
{/if} {/if}
@ -159,7 +161,7 @@
<div class="flex-presenter not-selected"> <div class="flex-presenter not-selected">
{#if icon} {#if icon}
<div class="icon" class:small-gap={size === 'inline' || size === 'small'}> <div class="icon" class:small-gap={size === 'inline' || size === 'small'}>
<Icon {icon} size={'small'} /> <Icon {icon} size={avatarSize} />
</div> </div>
{/if} {/if}
<div class="label no-underline"> <div class="label no-underline">

View File

@ -525,8 +525,8 @@
{readonly} {readonly}
/> />
<div class="tab-content"> <div class="doc-divider" />
<div class="divider" /> <div class="popupPanel-body__aside-grid">
<span class="label labelTop"> <span class="label labelTop">
<Label label={document.string.Labels} /> <Label label={document.string.Labels} />
</span> </span>
@ -552,28 +552,12 @@
line-height: 150%; line-height: 150%;
// overflow: auto; // overflow: auto;
} }
.doc-divider {
.tab-content { flex-shrink: 0;
display: grid; margin: 0 0 0.5rem;
grid-template-columns: 1fr 1.5fr; height: 1px;
grid-auto-flow: row; background-color: var(--theme-divider-color);
justify-content: start;
align-items: center;
gap: 1rem;
margin-top: 1rem;
width: 100%;
height: min-content;
.divider {
grid-column: 1 / 3;
height: 1px;
background-color: var(--divider-color);
}
.labelTop {
align-self: start;
}
} }
.emphasized { .emphasized {
padding: 1rem; padding: 1rem;
background-color: var(--body-color); background-color: var(--body-color);

View File

@ -16,7 +16,7 @@
import { Doc, Ref } from '@hcengineering/core' import { Doc, Ref } from '@hcengineering/core'
import { getEmbeddedLabel } from '@hcengineering/platform' import { getEmbeddedLabel } from '@hcengineering/platform'
import presentation from '@hcengineering/presentation' import presentation from '@hcengineering/presentation'
import { Button, Icon, IconAdd, Label, showPopup } from '@hcengineering/ui' import { Button, Icon, IconAdd, Label, showPopup, Scroller } from '@hcengineering/ui'
import view, { BuildModelKey } from '@hcengineering/view' import view, { BuildModelKey } from '@hcengineering/view'
import { Table } from '@hcengineering/view-resources' import { Table } from '@hcengineering/view-resources'
import recruit from '../plugin' import recruit from '../plugin'
@ -57,12 +57,14 @@
<Button id="appls.add" icon={IconAdd} kind={'transparent'} shape={'circle'} on:click={createApp} /> <Button id="appls.add" icon={IconAdd} kind={'transparent'} shape={'circle'} on:click={createApp} />
</div> </div>
{#if (vacancies ?? 0) > 0} {#if (vacancies ?? 0) > 0}
<Table <Scroller horizontal>
_class={recruit.class.Vacancy} <Table
{config} _class={recruit.class.Vacancy}
query={{ company: objectId }} {config}
loadingProps={{ length: vacancies ?? 0 }} query={{ company: objectId }}
/> loadingProps={{ length: vacancies ?? 0 }}
/>
</Scroller>
{:else} {:else}
<div class="antiSection-empty solid flex-col-center mt-3"> <div class="antiSection-empty solid flex-col-center mt-3">
<div class="caption-color"> <div class="caption-color">

View File

@ -90,7 +90,6 @@
min-width: 0; min-width: 0;
min-height: 1.5rem; min-height: 1.5rem;
text-transform: uppercase; text-transform: uppercase;
font-weight: 500;
font-size: 0.75rem; font-size: 0.75rem;
color: var(--theme-content-color); color: var(--theme-content-color);
border-radius: 0.25rem; border-radius: 0.25rem;
@ -102,7 +101,6 @@
.tag-item-inline { .tag-item-inline {
position: relative; position: relative;
padding-left: 0.75rem; padding-left: 0.75rem;
font-weight: 500;
color: var(--theme-content-color); color: var(--theme-content-color);
&::before { &::before {

View File

@ -42,18 +42,18 @@
}} }}
> >
<div class="color" style:background-color={getPlatformColor(value.color ?? 0)} /> <div class="color" style:background-color={getPlatformColor(value.color ?? 0)} />
<span class="overflow-label ml-1 text-sm caption-color max-w-40">{value.title}</span> <span class="label overflow-label ml-1 text-sm caption-color max-w-40">{value.title}</span>
</button> </button>
{:else if kind === 'list'} {:else if kind === 'list'}
<div <div
class="list-container" class="listitems-container"
style:padding-right={isEditable ? '0' : '0.5rem'} style:padding-right={isEditable ? '0' : '0.5rem'}
use:resizeObserver={(element) => { use:resizeObserver={(element) => {
realWidth = element.clientWidth realWidth = element.clientWidth
}} }}
> >
<div class="color" style:background-color={getPlatformColor(value.color ?? 0)} /> <div class="color" style:background-color={getPlatformColor(value.color ?? 0)} />
<span class="overflow-label ml-1-5 caption-color max-w-40"> <span class="label overflow-label ml-1-5 max-w-40">
{value.title} {value.title}
</span> </span>
{#if isEditable} {#if isEditable}
@ -66,7 +66,7 @@
{/if} {/if}
<style lang="scss"> <style lang="scss">
.list-container { .listitems-container {
overflow: hidden; overflow: hidden;
display: flex; display: flex;
align-items: center; align-items: center;
@ -75,21 +75,28 @@
height: 1.75rem; height: 1.75rem;
min-width: 0; min-width: 0;
min-height: 0; min-height: 0;
background-color: var(--theme-list-button-color); background-color: var(--theme-button-enabled);
border: 1px solid var(--theme-button-border); border: 1px solid var(--theme-button-border);
border-radius: 1.5rem; border-radius: 1.5rem;
user-select: none;
&:hover {
background-color: var(--theme-button-hovered);
}
.label {
color: var(--theme-caption-color);
}
.btn-close { .btn-close {
flex-shrink: 0; flex-shrink: 0;
margin-left: 0.125rem; margin-left: 0.125rem;
padding: 0 0.25rem 0 0.125rem; padding: 0 0.25rem 0 0.125rem;
height: 1.75rem; height: 1.75rem;
color: var(--content-color); color: var(--theme-content-color);
border-left: 1px solid transparent; border-left: 1px solid transparent;
&:hover { &:hover {
color: var(--caption-color); color: var(--theme-caption-color);
border-left-color: var(--divider-color); border-left-color: var(--theme-divider-color);
} }
} }
} }
@ -102,7 +109,6 @@
padding: 0 0.375rem; padding: 0 0.375rem;
height: 1.5rem; height: 1.5rem;
min-width: 1.5rem; min-width: 1.5rem;
font-weight: 500;
font-size: 0.75rem; font-size: 0.75rem;
line-height: 0.75rem; line-height: 0.75rem;
white-space: nowrap; white-space: nowrap;

View File

@ -60,32 +60,32 @@
<style lang="scss"> <style lang="scss">
.step-container { .step-container {
margin: 0.125rem 0.125rem 0 0; margin: 0.375rem 0.375rem 0 0;
} }
.tag-button { .tag-button {
overflow: hidden; overflow: hidden;
display: flex; display: flex;
align-items: center; align-items: center;
flex-shrink: 0; flex-shrink: 0;
padding: 0 0.5rem; padding: 0 0.625rem 0 0.5rem;
height: 1.5rem; height: 2rem;
min-width: 0; min-width: 0;
min-height: 0; min-height: 0;
color: var(--content-color); color: var(--theme-content-color);
border: 1px solid transparent; border: 1px solid transparent;
border-radius: 0.75rem; border-radius: 1rem;
.icon { .icon {
flex-shrink: 0; flex-shrink: 0;
width: 0.625rem; width: 1rem;
height: 0.625rem; height: 1rem;
} }
.label { .label {
margin-left: 0.125rem; margin-left: 0.25rem;
} }
&:hover { &:hover {
color: var(--caption-color); color: var(--theme-caption-color);
border-color: var(--divider-color); border-color: var(--theme-divider-color);
} }
} }
</style> </style>

View File

@ -42,8 +42,8 @@
padding: 0.25rem 0.75rem; padding: 0.25rem 0.75rem;
width: fit-content; width: fit-content;
font-weight: 500; font-weight: 500;
color: var(--caption-color); color: var(--theme-caption-color);
background-color: var(--divider-color); background-color: var(--theme-button-enabled);
border-radius: 1.25rem; border-radius: 1.25rem;
user-select: text; user-select: text;
} }

View File

@ -127,7 +127,7 @@
on:click={handleComponentEditorOpened} on:click={handleComponentEditorOpened}
> >
<svelte:fragment slot="content"> <svelte:fragment slot="content">
<span class="label {enlargedText ? 'ml-1 text-base fs-bold' : 'text-md'} overflow-label pointer-events-none"> <span class="label {enlargedText ? 'ml-1 text-base' : 'text-md'} overflow-label pointer-events-none">
<Label label={getEmbeddedLabel(componentText)} /> <Label label={getEmbeddedLabel(componentText)} />
</span> </span>
</svelte:fragment> </svelte:fragment>

View File

@ -18,14 +18,15 @@
import { AttachedData, Ref } from '@hcengineering/core' import { AttachedData, Ref } from '@hcengineering/core'
import { getClient } from '@hcengineering/presentation' import { getClient } from '@hcengineering/presentation'
import { Issue, IssueDraft, IssueTemplateData } from '@hcengineering/tracker' import { Issue, IssueDraft, IssueTemplateData } from '@hcengineering/tracker'
import { ButtonKind, ButtonSize, TooltipAlignment } from '@hcengineering/ui' import { ButtonKind, ButtonSize, IconSize, TooltipAlignment } from '@hcengineering/ui'
import { createEventDispatcher } from 'svelte' import { createEventDispatcher } from 'svelte'
import tracker from '../../plugin' import tracker from '../../plugin'
import { getPreviousAssignees } from '../../utils' import { getPreviousAssignees } from '../../utils'
export let value: Issue | AttachedData<Issue> | IssueTemplateData | IssueDraft export let value: Issue | AttachedData<Issue> | IssueTemplateData | IssueDraft
export let size: ButtonSize = 'large'
export let kind: ButtonKind = 'link' export let kind: ButtonKind = 'link'
export let size: ButtonSize = 'large'
export let avatarSize: IconSize = 'card'
export let tooltipAlignment: TooltipAlignment | undefined = undefined export let tooltipAlignment: TooltipAlignment | undefined = undefined
export let width: string = '100%' export let width: string = '100%'
export let focusIndex: number | undefined = undefined export let focusIndex: number | undefined = undefined
@ -97,6 +98,7 @@
titleDeselect={tracker.string.Unassigned} titleDeselect={tracker.string.Unassigned}
{size} {size}
{kind} {kind}
{avatarSize}
{width} {width}
showNavigate={false} showNavigate={false}
justify={'left'} justify={'left'}

View File

@ -18,6 +18,7 @@
import { DueDatePresenter } from '@hcengineering/ui' import { DueDatePresenter } from '@hcengineering/ui'
export let value: Issue export let value: Issue
export let width: string | undefined = undefined
const client = getClient() const client = getClient()
@ -39,5 +40,5 @@
</script> </script>
{#if value} {#if value}
<DueDatePresenter kind={'link'} value={value.dueDate} editable onChange={(e) => handleDueDateChanged(e)} /> <DueDatePresenter kind={'link'} value={value.dueDate} {width} editable onChange={(e) => handleDueDateChanged(e)} />
{/if} {/if}

View File

@ -87,7 +87,7 @@
</script> </script>
<div class="flex-row mt-4 mb-4"> <div class="flex-row mt-4 mb-4">
<Label label={tracker.string.StatusHistory} />: <span class="content-dark-color"><Label label={tracker.string.StatusHistory} />:</span>
<table class="ml-2"> <table class="ml-2">
{#each displaySt as st} {#each displaySt as st}
<tr> <tr>
@ -95,7 +95,7 @@
<StatusPresenter value={st.status} /> <StatusPresenter value={st.status} />
</td> </td>
<td> <td>
<div class="ml-2 mr-2"> <div class="ml-8 mr-2">
<Duration value={st.duration} /> <Duration value={st.duration} />
</div> </div>
</td> </td>

View File

@ -89,9 +89,7 @@
{#if issuePriorities[value.priority]?.icon}<Icon icon={issuePriorities[value.priority]?.icon} {size} />{/if} {#if issuePriorities[value.priority]?.icon}<Icon icon={issuePriorities[value.priority]?.icon} {size} />{/if}
</div> </div>
{#if shouldShowLabel} {#if shouldShowLabel}
<span <span class="{kind === 'list' ? 'ml-2 text-md' : 'ml-3 text-base'} overflow-label disabled content-color">
class="{kind === 'list' ? 'ml-2 text-md' : 'ml-3 text-base'} overflow-label disabled fs-bold content-color"
>
<Label label={issuePriorities[value.priority]?.label} /> <Label label={issuePriorities[value.priority]?.label} />
</span> </span>
{/if} {/if}

View File

@ -120,9 +120,7 @@
{#if selectedStatus}<IssueStatusIcon value={selectedStatus} size={kind === 'list' ? 'small' : 'medium'} />{/if} {#if selectedStatus}<IssueStatusIcon value={selectedStatus} size={kind === 'list' ? 'small' : 'medium'} />{/if}
</div> </div>
{#if selectedStatusLabel} {#if selectedStatusLabel}
<span <span class="{kind === 'list' ? 'ml-1 text-md' : 'ml-2 text-base'} overflow-label disabled content-color">
class="{kind === 'list' ? 'ml-1 text-md' : 'ml-2 text-base'} overflow-label disabled fs-bold content-color"
>
{selectedStatusLabel} {selectedStatusLabel}
</span> </span>
{/if} {/if}

View File

@ -93,7 +93,7 @@
$: account = $employeeAccountByIdStore.get(issue.createdBy as Ref<EmployeeAccount>) $: account = $employeeAccountByIdStore.get(issue.createdBy as Ref<EmployeeAccount>)
</script> </script>
<div class="content"> <div class="popupPanel-body__aside-grid">
{#if issue.template?.template} {#if issue.template?.template}
<span class="label"> <span class="label">
<Label label={tracker.string.IssueTemplate} /> <Label label={tracker.string.IssueTemplate} />
@ -118,7 +118,7 @@
<Label label={tracker.string.Status} /> <Label label={tracker.string.Status} />
</span> </span>
<StatusEditor value={issue} shouldShowLabel /> <StatusEditor value={issue} size={'medium'} shouldShowLabel />
{#if issue.blockedBy?.length} {#if issue.blockedBy?.length}
<span class="labelTop"> <span class="labelTop">
@ -142,7 +142,7 @@
<span class="label"> <span class="label">
<Label label={tracker.string.Priority} /> <Label label={tracker.string.Priority} />
</span> </span>
<PriorityEditor value={issue} shouldShowLabel /> <PriorityEditor value={issue} size={'medium'} shouldShowLabel />
<span class="label"> <span class="label">
<Label label={core.string.CreatedBy} /> <Label label={core.string.CreatedBy} />
@ -151,7 +151,8 @@
value={employee?._id} value={employee?._id}
label={core.string.CreatedBy} label={core.string.CreatedBy}
kind={'link'} kind={'link'}
size={'large'} size={'medium'}
avatarSize={'card'}
width={'100%'} width={'100%'}
showNavigate={false} showNavigate={false}
readonly readonly
@ -160,7 +161,7 @@
<span class="label"> <span class="label">
<Label label={tracker.string.Assignee} /> <Label label={tracker.string.Assignee} />
</span> </span>
<AssigneeEditor value={issue} /> <AssigneeEditor value={issue} size={'medium'} avatarSize={'card'} />
<span class="labelTop"> <span class="labelTop">
<Label label={tracker.string.Labels} /> <Label label={tracker.string.Labels} />
@ -172,12 +173,12 @@
<span class="label"> <span class="label">
<Label label={tracker.string.Component} /> <Label label={tracker.string.Component} />
</span> </span>
<ComponentEditor value={issue} /> <ComponentEditor value={issue} size={'medium'} />
<span class="label"> <span class="label">
<Label label={tracker.string.Sprint} /> <Label label={tracker.string.Sprint} />
</span> </span>
<SprintEditor value={issue} /> <SprintEditor value={issue} size={'medium'} />
{#if issue.dueDate !== null} {#if issue.dueDate !== null}
<div class="divider" /> <div class="divider" />
@ -185,13 +186,13 @@
<span class="label"> <span class="label">
<Label label={tracker.string.DueDate} /> <Label label={tracker.string.DueDate} />
</span> </span>
<DueDateEditor value={issue} /> <DueDateEditor value={issue} width={'100%'} />
{/if} {/if}
{#if keys.length > 0} {#if keys.length > 0}
<div class="divider" /> <div class="divider" />
{#each keys as key (typeof key === 'string' ? key : key.key)} {#each keys as key (typeof key === 'string' ? key : key.key)}
<AttributeBarEditor {key} _class={issue._class} object={issue} showHeader={true} size={'large'} /> <AttributeBarEditor {key} _class={issue._class} object={issue} showHeader={true} size={'medium'} />
{/each} {/each}
{/if} {/if}
@ -203,32 +204,8 @@
_class={mixin._id} _class={mixin._id}
object={hierarchy.as(issue, mixin._id)} object={hierarchy.as(issue, mixin._id)}
showHeader={true} showHeader={true}
size={'large'} size={'medium'}
/> />
{/each} {/each}
{/each} {/each}
</div> </div>
<style lang="scss">
.content {
display: grid;
grid-template-columns: 1fr 1.5fr;
grid-auto-flow: row;
justify-content: start;
align-items: center;
gap: 1rem;
margin-top: 1rem;
width: 100%;
height: min-content;
}
.divider {
grid-column: 1 / 3;
height: 1px;
background-color: var(--divider-color);
}
.labelTop {
align-self: start;
margin-top: 0.385rem;
}
</style>

View File

@ -267,13 +267,12 @@
/> />
<Button <Button
kind={'transparent'} kind={'transparent'}
shape={'round'}
selected={showAllMixins} selected={showAllMixins}
on:click={() => { on:click={() => {
showAllMixins = !showAllMixins showAllMixins = !showAllMixins
}} }}
> >
<svelte:fragment slot="content"> <svelte:fragment slot="icon">
<IconMixin size={'small'} /> <IconMixin size={'small'} />
</svelte:fragment> </svelte:fragment>
</Button> </Button>
@ -285,7 +284,9 @@
{/if} {/if}
<div class="divider" /> <div class="divider" />
<IssueStatusActivity {issue} /> <div class="issue-stats">
<IssueStatusActivity {issue} />
</div>
</svelte:fragment> </svelte:fragment>
</Panel> </Panel>
{/if} {/if}
@ -293,10 +294,14 @@
<style lang="scss"> <style lang="scss">
.divider { .divider {
flex-shrink: 0; flex-shrink: 0;
margin-top: 1rem; margin: 0.5rem 0;
margin-bottom: 1rem;
grid-column: 1 / 3;
height: 1px; height: 1px;
background-color: var(--divider-color); background-color: var(--theme-divider-color);
}
.issue-stats {
flex-shrink: 0;
margin: 0 2rem;
min-width: 0;
min-height: 0;
} }
</style> </style>

View File

@ -27,6 +27,7 @@
export let object: Issue export let object: Issue
export let value: number export let value: number
export let kind: 'no-border' | 'link' = 'no-border' export let kind: 'no-border' | 'link' = 'no-border'
export let size: 'small' | 'medium' | 'large' = 'large'
export let currentProject: Project | undefined export let currentProject: Project | undefined
const spaceQuery = createQuery() const spaceQuery = createQuery()
@ -66,7 +67,7 @@
{#if kind === 'link'} {#if kind === 'link'}
<!-- svelte-ignore a11y-click-events-have-key-events --> <!-- svelte-ignore a11y-click-events-have-key-events -->
<div id="ReportedTimeEditor" class="link-container flex-between" on:click={showReports}> <div id="ReportedTimeEditor" class="link-container {size} flex-between" on:click={showReports}>
{#if value !== undefined} {#if value !== undefined}
<span class="overflow-label"> <span class="overflow-label">
<TimePresenter {value} /> <TimePresenter {value} />
@ -98,12 +99,20 @@
align-items: center; align-items: center;
padding: 0 0.875rem; padding: 0 0.875rem;
width: 100%; width: 100%;
height: 2.25rem;
color: var(--theme-caption-color); color: var(--theme-caption-color);
border: 1px solid transparent; border: 1px solid transparent;
border-radius: 0.25rem; border-radius: 0.25rem;
cursor: pointer; cursor: pointer;
&.small {
height: 1.5rem;
}
&.medium {
height: 2rem;
}
&.large {
height: 2.25rem;
}
.add-action { .add-action {
visibility: hidden; visibility: hidden;
} }

View File

@ -34,9 +34,8 @@
.scrumLabel { .scrumLabel {
display: block; display: block;
min-width: 0; min-width: 0;
font-weight: 500;
text-align: left; text-align: left;
color: var(--caption-color); color: var(--theme-caption-color);
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;

View File

@ -33,9 +33,8 @@
.scrumRecordLabel { .scrumRecordLabel {
display: block; display: block;
min-width: 0; min-width: 0;
font-weight: 500;
text-align: left; text-align: left;
color: var(--caption-color); color: var(--theme-caption-color);
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;

View File

@ -149,7 +149,7 @@
on:click={handleSprintEditorOpened} on:click={handleSprintEditorOpened}
> >
<svelte:fragment slot="content"> <svelte:fragment slot="content">
<span class="label {enlargedText ? 'text-base' : 'text-md'} fs-bold overflow-label pointer-events-none"> <span class="label {enlargedText ? 'text-base' : 'text-md'} overflow-label pointer-events-none">
<Label label={getEmbeddedLabel(sprintText)} /> <Label label={getEmbeddedLabel(sprintText)} />
</span> </span>
</svelte:fragment> </svelte:fragment>

View File

@ -176,27 +176,26 @@
<style lang="scss"> <style lang="scss">
.row { .row {
position: relative; position: relative;
border-bottom: 1px solid var(--divider-color); border-bottom: 1px solid var(--theme-divider-color);
.text { .text {
font-weight: 500; font-weight: 500;
color: var(--caption-color); color: var(--theme-caption-color);
} }
.issuePresenter { .issuePresenter {
flex-shrink: 0; flex-shrink: 0;
min-width: 0; min-width: 0;
min-height: 0; min-height: 0;
font-weight: 500; color: var(--theme-content-color);
color: var(--content-color);
cursor: pointer; cursor: pointer;
&:hover { &:hover {
color: var(--caption-color); color: var(--theme-caption-color);
text-decoration: underline; text-decoration: underline;
} }
&:active { &:active {
color: var(--accent-color); color: var(--theme-caption-color);
} }
} }
@ -232,7 +231,7 @@
&.is-dragging::before { &.is-dragging::before {
position: absolute; position: absolute;
content: ''; content: '';
background-color: var(--divider-color); background-color: var(--theme-divider-color);
inset: 0; inset: 0;
z-index: -1; z-index: -1;
} }

View File

@ -292,9 +292,6 @@
{#if template && currentProject} {#if template && currentProject}
<TemplateControlPanel issue={template} /> <TemplateControlPanel issue={template} />
{/if} {/if}
<div class="divider" />
<!-- <IssueStatusActivity issue={template} /> -->
</svelte:fragment> </svelte:fragment>
</Panel> </Panel>
{/if} {/if}
@ -318,13 +315,6 @@
color: var(--dark-color); color: var(--dark-color);
} }
} }
.divider {
margin-top: 1rem;
margin-bottom: 1rem;
grid-column: 1 / 3;
height: 1px;
background-color: var(--divider-color);
}
.tool { .tool {
align-self: start; align-self: start;

View File

@ -171,27 +171,26 @@
<style lang="scss"> <style lang="scss">
.row { .row {
position: relative; position: relative;
border-bottom: 1px solid var(--divider-color); border-bottom: 1px solid var(--theme-divider-color);
.text { .text {
font-weight: 500; font-weight: 500;
color: var(--caption-color); color: var(--theme-caption-color);
} }
.issuePresenter { .issuePresenter {
flex-shrink: 0; flex-shrink: 0;
min-width: 0; min-width: 0;
min-height: 0; min-height: 0;
font-weight: 500; color: var(--theme-content-color);
color: var(--content-color);
cursor: pointer; cursor: pointer;
&:hover { &:hover {
color: var(--caption-color); color: var(--theme-caption-color);
text-decoration: underline; text-decoration: underline;
} }
&:active { &:active {
color: var(--accent-color); color: var(--theme-caption-color);
} }
} }
@ -227,7 +226,7 @@
&.is-dragging::before { &.is-dragging::before {
position: absolute; position: absolute;
content: ''; content: '';
background-color: var(--divider-color); background-color: var(--theme-divider-color);
inset: 0; inset: 0;
z-index: -1; z-index: -1;
} }

View File

@ -59,26 +59,25 @@
flex-shrink: 0; flex-shrink: 0;
max-width: 15rem; max-width: 15rem;
font-size: 0.8125rem; font-size: 0.8125rem;
color: var(--content-color); color: var(--theme-content-color);
&:not(.noPointer) { &:not(.noPointer) {
cursor: pointer; cursor: pointer;
} }
&.noUnderline { &.noUnderline {
font-weight: 500; color: var(--theme-caption-color);
color: var(--caption-color);
} }
&:not(.noUnderline) { &:not(.noUnderline) {
&:hover { &:hover {
color: var(--caption-color); color: var(--theme-caption-color);
text-decoration: underline; text-decoration: underline;
} }
} }
&:active { &:active {
color: var(--accent-color); color: var(--theme-caption-color);
} }
} }
</style> </style>

View File

@ -64,16 +64,16 @@
} }
</script> </script>
<div class="content"> <div class="popupPanel-body__aside-grid">
<span class="label"> <span class="label">
<Label label={tracker.string.Priority} /> <Label label={tracker.string.Priority} />
</span> </span>
<PriorityEditor value={issue} shouldShowLabel /> <PriorityEditor value={issue} size={'medium'} shouldShowLabel />
<span class="label"> <span class="label">
<Label label={tracker.string.Assignee} /> <Label label={tracker.string.Assignee} />
</span> </span>
<AssigneeEditor value={issue} /> <AssigneeEditor value={issue} size={'medium'} />
<span class="labelTop"> <span class="labelTop">
<Label label={tracker.string.Labels} /> <Label label={tracker.string.Labels} />
@ -82,7 +82,10 @@
<Component <Component
is={tags.component.TagsDropdownEditor} is={tags.component.TagsDropdownEditor}
props={{ props={{
kind: 'no-border', kind: 'link',
size: 'medium',
width: '100%',
justify: 'left',
items: labelRefs, items: labelRefs,
key, key,
targetClass: tracker.class.Issue, targetClass: tracker.class.Issue,
@ -99,43 +102,19 @@
<span class="label"> <span class="label">
<Label label={tracker.string.Component} /> <Label label={tracker.string.Component} />
</span> </span>
<ComponentEditor value={issue} /> <ComponentEditor value={issue} size={'medium'} />
{#if issue.sprint} {#if issue.sprint}
<span class="label"> <span class="label">
<Label label={tracker.string.Sprint} /> <Label label={tracker.string.Sprint} />
</span> </span>
<SprintEditor value={issue} /> <SprintEditor value={issue} size={'medium'} />
{/if} {/if}
{#if keys.length > 0} {#if keys.length > 0}
<div class="divider" /> <div class="divider" />
{#each keys as key (typeof key === 'string' ? key : key.key)} {#each keys as key (typeof key === 'string' ? key : key.key)}
<AttributeBarEditor {key} _class={issue._class} object={issue} showHeader={true} /> <AttributeBarEditor {key} _class={issue._class} object={issue} size={'medium'} showHeader={true} />
{/each} {/each}
{/if} {/if}
</div> </div>
<style lang="scss">
.content {
display: grid;
grid-template-columns: 1fr 1.5fr;
grid-auto-flow: row;
justify-content: start;
align-items: center;
gap: 1rem;
margin-top: 1rem;
width: 100%;
height: min-content;
}
.divider {
grid-column: 1 / 3;
height: 1px;
background-color: var(--divider-color);
}
.labelTop {
align-self: start;
margin-top: 0.385rem;
}
</style>

View File

@ -35,8 +35,7 @@
width: 1.6rem; width: 1.6rem;
white-space: nowrap; white-space: nowrap;
text-transform: capitalize; text-transform: capitalize;
font-weight: 500; color: var(--theme-caption-color);
color: var(--caption-color);
} }
} }
</style> </style>

View File

@ -76,7 +76,7 @@
<Button <Button
icon={setting.icon.Setting} icon={setting.icon.Setting}
kind={'link'} kind={'link'}
size={'large'} size={'medium'}
showTooltip={{ label: setting.string.ClassSetting }} showTooltip={{ label: setting.string.ClassSetting }}
on:click={(ev) => { on:click={(ev) => {
ev.stopPropagation() ev.stopPropagation()
@ -104,17 +104,19 @@
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin: 0.25rem -0.5rem 0.75rem; padding: 0 0.75rem;
padding: 0 0 0 0.5rem;
font-weight: 600; font-weight: 600;
color: var(--theme-dark-color); color: var(--theme-dark-color);
border: 1px solid var(--theme-divider-color); border-top: 1px solid var(--theme-divider-color);
border-radius: 0.25rem; border-bottom: 1px solid var(--theme-divider-color);
cursor: pointer; cursor: pointer;
transition-property: color, background-color, border-color; transition-property: color, background-color, border-color;
transition-duration: 0.15s; transition-duration: 0.15s;
transition-timing-function: var(--timing-main); transition-timing-function: var(--timing-main);
&:first-child {
border-top-color: transparent;
}
.icon-arrow { .icon-arrow {
margin-left: 0.5rem; margin-left: 0.5rem;
width: 0.325rem; width: 0.325rem;

View File

@ -300,8 +300,8 @@
</div> </div>
</svelte:fragment> </svelte:fragment>
<svelte:fragment slot="attributes" let:direction={dir}> <svelte:fragment slot="aside-tabs">
<div class="flex flex-reverse flex-no-shrink clear-mins"> <div class="flex-row-center flex-reverse flex-grow">
<Button <Button
kind={'transparent'} kind={'transparent'}
shape={'round'} shape={'round'}
@ -310,11 +310,13 @@
showAllMixins = !showAllMixins showAllMixins = !showAllMixins
}} }}
> >
<svelte:fragment slot="content"> <svelte:fragment slot="icon">
<IconMixin size={'small'} /> <IconMixin size={'small'} />
</svelte:fragment> </svelte:fragment>
</Button> </Button>
</div> </div>
</svelte:fragment>
<svelte:fragment slot="attributes" let:direction={dir}>
{#if !headerLoading} {#if !headerLoading}
{#if headerEditor !== undefined} {#if headerEditor !== undefined}
<Component <Component
@ -338,7 +340,7 @@
<svelte:fragment slot="subheader"> <svelte:fragment slot="subheader">
{#if mainEditor && mainEditor.pinned} {#if mainEditor && mainEditor.pinned}
<div class="flex-col flex-grow step-tb-6"> <div class="flex-col flex-grow my-4 step-tb-6">
<Component is={mainEditor.editor} props={{ object }} on:open={handleOpen} /> <Component is={mainEditor.editor} props={{ object }} on:open={handleOpen} />
</div> </div>
{/if} {/if}

View File

@ -82,11 +82,10 @@
border-radius: 8px; border-radius: 8px;
font-weight: 500;
font-size: 10px; font-size: 10px;
text-transform: uppercase; text-transform: uppercase;
color: #ffffff; color: var(--theme-caption-color);
display: flex; display: flex;
align-items: center; align-items: center;