diff --git a/packages/theme/styles/_lumia-colors.scss b/packages/theme/styles/_lumia-colors.scss index 02e61812a8..7c91ba5ee7 100644 --- a/packages/theme/styles/_lumia-colors.scss +++ b/packages/theme/styles/_lumia-colors.scss @@ -25,6 +25,10 @@ --button-negative-hover-BackgroundColor: #e34748; --button-negative-active-BackgroundColor: #c42a32; + --selector-active-BackgroundColor: #3364e2; + --selector-IconColor: #ffffff; + --selector-disabled-IconColor: #8b97ad; + --tag-on-accent-PorpoiseText: #FFFFFF; --tag-accent-SunshineBackground: #FFBD2E; } @@ -105,6 +109,14 @@ --input-error-BorderColor: #fb6863; --input-search-IconColor: #ffffff; + /** Checkboxes **/ + --selector-BackgroundColor: #a5bdff0d; + --selector-BorderColor: #d9dee6; + --selector-off-BackgroundColor: #556178; + --selector-hover-overlay-BackgroundColor: #a5bdff1a; + --selector-disabled-BackgroundColor: #a5bdff1a; + --selector-disabled-BorderColor: #a5bdff0d; + --love-active-call-color-1: #5190EC; --love-active-call-color-2: #F47758; --love-active-call-transform: scaleY(0.25) scaleX(0.4); @@ -187,6 +199,14 @@ --input-error-BorderColor: #e34748; --input-search-IconColor: #0f121a; + /** Checkboxes **/ + --selector-BackgroundColor: #1530720d; + --selector-BorderColor: #0f121a; + --selector-off-BackgroundColor: #cbd2dd; + --selector-hover-overlay-BackgroundColor: #1530721a; + --selector-disabled-BackgroundColor: #1530721a; + --selector-disabled-BorderColor: #1530720d; + --love-active-call-color-1: #205DC2; --love-active-call-color-2: #e34748; --love-active-call-filter: blur(10px); diff --git a/packages/ui/src/components/ModernToggle.svelte b/packages/ui/src/components/ModernToggle.svelte new file mode 100644 index 0000000000..91cd05b24e --- /dev/null +++ b/packages/ui/src/components/ModernToggle.svelte @@ -0,0 +1,153 @@ +<script lang="ts"> + // + // © 2023 Hardcore Engineering, Inc. All Rights Reserved. + // Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0). + // + import type { Asset, IntlString } from '@hcengineering/platform' + import Label from './Label.svelte' + + export let title: string | undefined = undefined + export let label: IntlString | undefined = undefined + export let labelParams: Record<string, any> = {} + export let size: 'small' | 'large' = 'large' + export let checked: boolean = false + export let disabled: boolean = false + export let background: boolean = false +</script> + +<label + class="toggle-container {size}" + class:background + class:disabled + class:woLabel={label === undefined && title === undefined} +> + <input type="checkbox" class="toggle" bind:checked {disabled} on:change /> + <div class="toggle-element {size}" class:disabled /> + {#if label || title} + <div class="toggle-label"> + {#if label}<Label {label} params={labelParams} />{/if} + {#if title}{title}{/if} + </div> + {/if} +</label> + +<style lang="scss"> + .toggle-element { + position: relative; + flex-shrink: 0; + background-color: var(--selector-off-BackgroundColor); + + &::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: var(--spacing-1); + height: var(--spacing-1); + background-color: var(--selector-IconColor); + border-radius: 50%; + transform: translateY(-50%); + transition: left 0.2s; + } + &.small { + width: var(--spacing-4); + height: var(--spacing-2); + border-radius: var(--medium-BorderRadius); + + &::after { + left: var(--spacing-0_5); + width: var(--spacing-1); + height: var(--spacing-1); + } + } + &.large { + width: var(--spacing-6); + height: var(--spacing-3); + border-radius: var(--large-BorderRadius); + + &::after { + left: var(--spacing-0_75); + width: var(--spacing-1_75); + height: var(--spacing-1_75); + } + } + } + .toggle-label { + color: var(--global-primary-TextColor); + user-select: none; + } + .toggle { + overflow: hidden; + position: absolute; + margin: -1px; + padding: 0; + width: 1px; + height: 1px; + border: 0; + clip: rect(0 0 0 0); + + &:checked + .toggle-element { + background-color: var(--selector-active-BackgroundColor); + + &.small::after { + left: var(--spacing-2_5); + } + &.large::after { + left: var(--spacing-3_5); + } + } + &:disabled + .toggle-element { + box-shadow: none; + background-color: var(--selector-disabled-BackgroundColor); + + &::after { + background-color: var(--selector-disabled-IconColor); + } + & + .toggle-label { + color: var(--global-disabled-TextColor); + } + } + &:focus + .toggle-element { + outline: 2px solid var(--global-focus-BorderColor); + outline-offset: 2px; + } + } + .toggle-container { + display: inline-flex; + align-items: center; + gap: var(--spacing-2); + min-width: var(--spacing-2); + min-height: var(--spacing-2); + + &.background { + border-radius: 3rem; + + &.woLabel { + padding: var(--spacing-1); + } + &.small:not(.woLabel) { + padding: var(--spacing-1) var(--spacing-2) var(--spacing-1) var(--spacing-1); + } + &.large:not(.woLabel) { + padding: var(--spacing-1) var(--spacing-3) var(--spacing-1) var(--spacing-1); + } + } + &.disabled.background { + box-shadow: 0 0 0 1px var(--selector-disabled-BorderColor); + } + &:not(.disabled) { + cursor: pointer; + + &.background { + background-color: var(--selector-BackgroundColor); + } + &:active .toggle-element { + outline: 2px solid var(--global-focus-BorderColor); + outline-offset: 2px; + } + &:hover .toggle-element { + box-shadow: 0 0 0 4px var(--selector-hover-overlay-BackgroundColor); + } + } + } +</style> diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index 9d8ce03449..aa1cefbb6f 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -62,6 +62,7 @@ export { default as Toggle } from './components/Toggle.svelte' export { default as RadioButton } from './components/RadioButton.svelte' export { default as RadioGroup } from './components/RadioGroup.svelte' export { default as Dialog } from './components/Dialog.svelte' +export { default as ModernToggle } from './components/ModernToggle.svelte' export { default as ToggleWithLabel } from './components/ToggleWithLabel.svelte' export { default as MiniToggle } from './components/MiniToggle.svelte' export { default as TooltipInstance } from './components/TooltipInstance.svelte'