UNPKG

@ckeditor/ckeditor5-real-time-collaboration

Version:

A set of CKEditor 5 features enabling real-time collaboration within the editor using CKEditor Cloud Services.

305 lines (256 loc) • 7.36 kB
/* * What you're currently looking at is the source code of a legally protected, proprietary software. * CKEditor 5 Collaboration is licensed under a commercial license and protected by copyright law. Where not otherwise indicated, * all CKEditor 5 Collaboration content is authored by CKSource engineers and consists of CKSource-owned intellectual property. * * Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options */ @import '@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css'; @import "@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"; @import "@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css"; @import "@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"; :root { --ck-color-presence-list-dropdown-background: hsl(0, 0%, 100%); --ck-color-presence-list-dropdown-arrow-border: hsl(0, 0%, 92%); --ck-presence-list-dropdown-list-max-width: 250px; --ck-presence-list-dropdown-list-min-width: 180px; --ck-presence-list-users-tooltip-max-width: 120px; --ck-presence-list-users-tooltip-min-width: 25px; } .ck.ck-presence-list { display: inline-flex; align-items: center; margin-right: var(--ck-spacing-standard); transition: margin-right 200ms ease-in-out; font-size: var(--ck-font-size-base); & * { box-sizing: border-box; } } .ck.ck-presence-list__list { display: flex; flex-direction: row; position: relative; /* Taking care about margin animation in collapsed mode. */ justify-content: flex-end; &::after { content: ""; position: absolute; bottom: -15px; left: 0; width: 100%; height: 15px; background: transparent; } } .ck.ck-presence-list__counter--hidden { display: none; } .ck.ck-presence-list__list-item { /** * Reset default CK5 button styles - `.ck-reset__all *`. * Reset default user agent button stylesheet too. */ font: inherit; color: inherit; border: 1px solid transparent; outline: none; background: none; padding: 0; position: relative; margin-left: var(--ck-spacing-medium); &:focus { @mixin ck-rounded-corners; @mixin ck-focus-ring; @mixin ck-box-shadow var(--ck-focus-outer-shadow); } & .ck-label { /* * Forces screen reader to read label despite the fact that it is hidden. * Placing `display: none` on the element will prevent screen reader from reading it. */ overflow: hidden; height: 0px; width: 0px; } &:first-child { margin-left: 0; } } .ck.ck-tooltip.ck-presence-list__list-item__tooltip { & > .ck-tooltip__text { display: inline-block; max-width: var(--ck-presence-list-users-tooltip-max-width); overflow: hidden; text-align: center; text-overflow: ellipsis; white-space: nowrap; } } .ck.ck-presence-list__marker { position: relative; display: block; width: 100%; height: 3px; margin-top: 5px; } /** * Add better UX behavior of button to the `clickable` elements. * We need to create stronger specificity than `.ck.ck-reset__all *`. */ .ck-presence-list__list button.ck-presence-list__list-item *, .ck-presence-list__balloon button.ck-presence-list__dropdown-list-item * { cursor: pointer; } .ck.ck-presence-list--collapsed { & .ck-presence-list__list { border: 1px solid transparent; padding-left: 1px; /* Because of moving avatars to the right with margin-left we need to set min-width of container. */ min-width: calc( var(--ck-user-avatar-size) * 2 ); & * { cursor: pointer; transition: all 400ms ease-in-out; } &:focus { @mixin ck-rounded-corners; @mixin ck-focus-ring; @mixin ck-box-shadow var(--ck-focus-outer-shadow); } } & .ck.ck-presence-list__list-item { /* Adding negative margin (35% of avatar) to create collapsed effect. */ margin-left: calc( var(--ck-user-avatar-size) * -0.35); /* Reset focus borders */ border: 0; padding: 0; &:first-child { margin-left: 0; } &:last-child { order: unset; } & .ck-user { --ck-presence-list-avatar-border-color: var(--ck-color-base-foreground); border: 2px solid var(--ck-presence-list-avatar-border-color); margin-left: 0; margin-right: 0; } &.ck-presence-list__users-counter { margin-left: 0; margin-right: 0; } } } .ck.ck-presence-list__balloon { /* Overwrite arrows background of balloon */ --ck-color-panel-border: var(--ck-color-presence-list-dropdown-arrow-border); --ck-color-panel-background: var(--ck-color-presence-list-dropdown-background); background-color: var(--ck-color-presence-list-dropdown-background); border: 0; opacity: 1; animation: 300ms fadeIn ease-in-out; @media (prefers-reduced-motion: reduce) { animation: none; } & ul { background-color: var(--ck-color-presence-list-dropdown-background); } & .ck.ck-presence-list__dropdown-list-wrapper { min-width: var(--ck-presence-list-dropdown-list-min-width); max-width: var(--ck-presence-list-dropdown-list-max-width); border-radius: var(--ck-border-radius); /* * Make it scrollable to prevent truncate of focus ring and shadow. * It's temporary fix, we should rethink max-height of dropdown */ &.ck-presence-list__dropdown-list-wrapper_scrollable { max-height: 80vh; overflow-y: auto; overflow-x: hidden; } } & .ck.ck-presence-list__dropdown-list-item { /** * Reset default CK5 button styles - `.ck-reset__all *`. * Reset default user agent button stylesheet too. */ font: inherit; color: inherit; outline: none; border: 0; background: none; display: flex; align-items: center; position: relative; padding: var(--ck-spacing-standard); &:focus { position: relative; z-index: 1; outline: var(--ck-focus-ring); outline-offset: -1px; @mixin ck-box-shadow var(--ck-focus-outer-shadow); } &:first-of-type { & .ck-presence-list__marker { border-top-left-radius: var(--ck-border-radius); } } &:last-of-type { & .ck-presence-list__marker { border-bottom-left-radius: var(--ck-border-radius); } } } & .ck.ck-presence-list__dropdown-list { & .ck-user__full-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--ck-color-base-text); margin-left: var(--ck-spacing-standard); } & .ck.ck-presence-list__marker { position: absolute; left: 0; margin: 0; height: 100%; width: 3px; } } } .ck.ck-presence-list__users-counter { --ck-presence-list-counter-border-color: var(--ck-user-avatar-background); --ck-presence-list-counter-background-color: var(--ck-user-avatar-color); border: 2px solid var(--ck-presence-list-counter-border-color); display: flex; justify-content: center; align-items: center; position: relative; border-radius: 50%; background-color: var(--ck-presence-list-counter-background-color); box-sizing: border-box; height: calc(var(--ck-user-avatar-size) - 4px); width: calc(var(--ck-user-avatar-size) - 4px); line-height: 100%; margin: 2px; margin-top: 4px; } .ck.ck-presence-list__users-counter__text { --ck-presence-list-counter-text-color: var(--ck-user-avatar-background); color: var(--ck-presence-list-counter-text-color); cursor: default; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }