tldraw/packages/ui/ui.css

2080 lines
38 KiB
CSS
Raw Normal View History

/* @tldraw/ui */
.tl-container {
2023-04-25 11:01:25 +00:00
--layer-panels: 300;
--layer-menus: 400;
--layer-overlays: 500;
--layer-toasts: 650;
(1/2) Cursor Chat - Presence (#1487) This PR adds support for seeing **another user**'s chat messages. It's part 1 of two PRs relating to Cursor Chat. And it's needed for the much bigger part 2: https://github.com/tldraw/brivate/pull/1981 # Presence You can see another person's chat messages! ![2023-06-02 at 17 42 33 - Blush Capybara](https://github.com/tldraw/tldraw/assets/15892272/8f3efb5f-9c05-459c-aa7e-24842be75e58) If they have a name, it gets popped on top. ![2023-06-02 at 17 45 34 - Sapphire Meerkat](https://github.com/tldraw/tldraw/assets/15892272/749bd924-c1f5-419b-a028-1fafe1b61292) That's it! With this PR, there's no way of actually *typing* your chat messages. That comes with the [next one](https://github.com/tldraw/brivate/pull/1981)! # Admin ### To-do - [x] Store chat message - [x] Allow overflowing chat - [x] Presence for chat message - [x] Display chat message to others ### Change Type - [x] `minor` — New Feature ### Test Plan To test this, I recommend checking out both `lu/cursor-chat` branches, and opening two browser sessions in the same shared project. 1. In one session, type some cursor chat by pressing the Enter key while on the canvas (and typing). 2. On the other session, check that you can see the chat message appear. 3. Repeat this while being both named, and unnamed. I recommend just focusing on the visible presense in this PR. The [other PR](https://github.com/tldraw/brivate/pull/1981) is where we can focus about how we _input_ the cursor chat. ### Release Notes - [dev] Added support for cursor chat presence. --------- Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
2023-06-15 15:10:08 +00:00
--layer-cursor: 700;
2023-04-25 11:01:25 +00:00
}
/* --------------------- Layout --------------------- */
.tlui-layout {
position: relative;
display: grid;
grid-template-columns: 1fr;
grid-template-rows: minmax(0px, 1fr) auto;
grid-auto-rows: auto;
height: 100%;
max-height: 100%;
overflow: clip;
padding: var(--space-2);
pointer-events: none;
user-select: none;
z-index: var(--layer-panels);
-webkit-transform: translate3d(0, 0, 0);
--sab: env(safe-area-inset-bottom);
2023-04-25 11:01:25 +00:00
}
.tlui-layout__top {
grid-column: 1;
grid-row: 1;
display: flex;
Add support for project names (#1340) This PR adds some things that we need for the Project Name feature on tldraw.com. It should be reviewed alongside https://github.com/tldraw/tldraw-lite/pull/1814 ## Name Property This PR adds a `name` property to `TLDocument`. We use this to store a project's name. <img width="454" alt="Screenshot 2023-05-09 at 15 47 26" src="https://github.com/tldraw/tldraw/assets/15892272/f3be438e-aa0f-4dec-8f51-8dfd9f9d0ced"> ## Top Zone This PR adds a `topZone` area of the UI that we can add stuff to, similar to how `shareZone` works. It also adds an example to show where the `topZone` and `shareZone` are: <img width="1511" alt="Screenshot 2023-05-12 at 10 57 40" src="https://github.com/tldraw/tldraw/assets/15892272/f5e1cd33-017e-4aaf-bfee-4d85119e2974"> ## Breakpoints This PR change's the UI's breakpoints a little bit. It moves the action bar to the bottom a little bit earlier. (This gives us more space at the top for the project name). ![2023-05-12 at 11 08 26 - Fuchsia Bison](https://github.com/tldraw/tldraw/assets/15892272/34563cea-b1d1-47be-ac5e-5650ee0ba02d) ![2023-05-12 at 13 45 04 - Tan Mole](https://github.com/tldraw/tldraw/assets/15892272/ab190bd3-51d4-4a8b-88de-c72ab14bcba6) ## Input Blur This PR adds an `onBlur` parameter to `Input`. This was needed because 'clicking off' the input wasn't firing `onComplete` or `onCancel`. <img width="620" alt="Screenshot 2023-05-09 at 16 12 58" src="https://github.com/tldraw/tldraw/assets/15892272/3b28da74-0a74-4063-8053-e59e47027caf"> ## Create Project Name This PR adds an internal `createProjectName` property to `TldrawEditorConfig`. Similar to `derivePresenceState`, you can pass a custom function to it. It lets you control what gets used as the default project name. We use it to set different names in our local projects compared to shared projects. In the future, when we add more advanced project features, we could handle this better within the UI. <img width="454" alt="Screenshot 2023-05-09 at 15 47 26" src="https://github.com/tldraw/tldraw/assets/15892272/da9a4699-ac32-40d9-a97c-6c682acfac41"> ### Test Plan 1. Gradually reduce the width of the browser window. 2. Check that the actions menu jumps to the bottom before the style panel moves to the bottom. --- 1. In the examples app, open the `/zones` example. 2. Check that there's a 'top zone' at the top. - [ ] Unit Tests - [ ] Webdriver tests ### Release Note - [dev] Added a `topZone` area where you can put stuff. - [dev] Added a `name` property to `TLDocument` - and `app` methods for it. - [dev] Added an internal `createProjectName` config property for controlling the default project name. - [dev] Added an `onBlur` parameter to `Input`. - Moved the actions bar to the bottom on medium-sized screens. --------- Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
2023-06-01 18:46:26 +00:00
min-width: 0px;
2023-04-25 11:01:25 +00:00
}
.tlui-layout__top__left {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
width: 100%;
height: 100%;
Add support for project names (#1340) This PR adds some things that we need for the Project Name feature on tldraw.com. It should be reviewed alongside https://github.com/tldraw/tldraw-lite/pull/1814 ## Name Property This PR adds a `name` property to `TLDocument`. We use this to store a project's name. <img width="454" alt="Screenshot 2023-05-09 at 15 47 26" src="https://github.com/tldraw/tldraw/assets/15892272/f3be438e-aa0f-4dec-8f51-8dfd9f9d0ced"> ## Top Zone This PR adds a `topZone` area of the UI that we can add stuff to, similar to how `shareZone` works. It also adds an example to show where the `topZone` and `shareZone` are: <img width="1511" alt="Screenshot 2023-05-12 at 10 57 40" src="https://github.com/tldraw/tldraw/assets/15892272/f5e1cd33-017e-4aaf-bfee-4d85119e2974"> ## Breakpoints This PR change's the UI's breakpoints a little bit. It moves the action bar to the bottom a little bit earlier. (This gives us more space at the top for the project name). ![2023-05-12 at 11 08 26 - Fuchsia Bison](https://github.com/tldraw/tldraw/assets/15892272/34563cea-b1d1-47be-ac5e-5650ee0ba02d) ![2023-05-12 at 13 45 04 - Tan Mole](https://github.com/tldraw/tldraw/assets/15892272/ab190bd3-51d4-4a8b-88de-c72ab14bcba6) ## Input Blur This PR adds an `onBlur` parameter to `Input`. This was needed because 'clicking off' the input wasn't firing `onComplete` or `onCancel`. <img width="620" alt="Screenshot 2023-05-09 at 16 12 58" src="https://github.com/tldraw/tldraw/assets/15892272/3b28da74-0a74-4063-8053-e59e47027caf"> ## Create Project Name This PR adds an internal `createProjectName` property to `TldrawEditorConfig`. Similar to `derivePresenceState`, you can pass a custom function to it. It lets you control what gets used as the default project name. We use it to set different names in our local projects compared to shared projects. In the future, when we add more advanced project features, we could handle this better within the UI. <img width="454" alt="Screenshot 2023-05-09 at 15 47 26" src="https://github.com/tldraw/tldraw/assets/15892272/da9a4699-ac32-40d9-a97c-6c682acfac41"> ### Test Plan 1. Gradually reduce the width of the browser window. 2. Check that the actions menu jumps to the bottom before the style panel moves to the bottom. --- 1. In the examples app, open the `/zones` example. 2. Check that there's a 'top zone' at the top. - [ ] Unit Tests - [ ] Webdriver tests ### Release Note - [dev] Added a `topZone` area where you can put stuff. - [dev] Added a `name` property to `TLDocument` - and `app` methods for it. - [dev] Added an internal `createProjectName` config property for controlling the default project name. - [dev] Added an `onBlur` parameter to `Input`. - Moved the actions bar to the bottom on medium-sized screens. --------- Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
2023-06-01 18:46:26 +00:00
flex-shrink: 1;
}
.tlui-layout__top__center {
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
width: 100%;
height: 100%;
margin-left: var(--space-2);
flex-grow: 1;
min-width: 0px;
2023-04-25 11:01:25 +00:00
}
.tlui-layout__top__right {
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: flex-start;
width: 100%;
height: 100%;
Add support for project names (#1340) This PR adds some things that we need for the Project Name feature on tldraw.com. It should be reviewed alongside https://github.com/tldraw/tldraw-lite/pull/1814 ## Name Property This PR adds a `name` property to `TLDocument`. We use this to store a project's name. <img width="454" alt="Screenshot 2023-05-09 at 15 47 26" src="https://github.com/tldraw/tldraw/assets/15892272/f3be438e-aa0f-4dec-8f51-8dfd9f9d0ced"> ## Top Zone This PR adds a `topZone` area of the UI that we can add stuff to, similar to how `shareZone` works. It also adds an example to show where the `topZone` and `shareZone` are: <img width="1511" alt="Screenshot 2023-05-12 at 10 57 40" src="https://github.com/tldraw/tldraw/assets/15892272/f5e1cd33-017e-4aaf-bfee-4d85119e2974"> ## Breakpoints This PR change's the UI's breakpoints a little bit. It moves the action bar to the bottom a little bit earlier. (This gives us more space at the top for the project name). ![2023-05-12 at 11 08 26 - Fuchsia Bison](https://github.com/tldraw/tldraw/assets/15892272/34563cea-b1d1-47be-ac5e-5650ee0ba02d) ![2023-05-12 at 13 45 04 - Tan Mole](https://github.com/tldraw/tldraw/assets/15892272/ab190bd3-51d4-4a8b-88de-c72ab14bcba6) ## Input Blur This PR adds an `onBlur` parameter to `Input`. This was needed because 'clicking off' the input wasn't firing `onComplete` or `onCancel`. <img width="620" alt="Screenshot 2023-05-09 at 16 12 58" src="https://github.com/tldraw/tldraw/assets/15892272/3b28da74-0a74-4063-8053-e59e47027caf"> ## Create Project Name This PR adds an internal `createProjectName` property to `TldrawEditorConfig`. Similar to `derivePresenceState`, you can pass a custom function to it. It lets you control what gets used as the default project name. We use it to set different names in our local projects compared to shared projects. In the future, when we add more advanced project features, we could handle this better within the UI. <img width="454" alt="Screenshot 2023-05-09 at 15 47 26" src="https://github.com/tldraw/tldraw/assets/15892272/da9a4699-ac32-40d9-a97c-6c682acfac41"> ### Test Plan 1. Gradually reduce the width of the browser window. 2. Check that the actions menu jumps to the bottom before the style panel moves to the bottom. --- 1. In the examples app, open the `/zones` example. 2. Check that there's a 'top zone' at the top. - [ ] Unit Tests - [ ] Webdriver tests ### Release Note - [dev] Added a `topZone` area where you can put stuff. - [dev] Added a `name` property to `TLDocument` - and `app` methods for it. - [dev] Added an internal `createProjectName` config property for controlling the default project name. - [dev] Added an `onBlur` parameter to `Input`. - Moved the actions bar to the bottom on medium-sized screens. --------- Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
2023-06-01 18:46:26 +00:00
flex-shrink: 1;
min-width: 0px;
2023-04-25 11:01:25 +00:00
}
.scrollable,
.scrollable * {
pointer-events: all;
touch-action: auto;
overscroll-behavior: none;
}
/* ----------------- Helper Buttons ---------------- */
.tlui-helper-buttons {
position: relative;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
width: min-content;
gap: var(--space-3);
margin: var(--space-3) var(--space-2);
white-space: nowrap;
pointer-events: none;
z-index: var(--layer-panels);
}
.tlui-helper-buttons > .tlui-button {
pointer-events: all;
background-color: var(--color-low);
border-radius: var(--radius-3);
}
/* ---------------------- Icon ---------------------- */
.tlui-icon {
flex-shrink: 0;
width: 18px;
height: 18px;
background-color: currentColor;
}
.tlui-icon__small {
width: 15px;
height: 15px;
}
/* --------------------- Slider --------------------- */
.tlui-slider {
position: relative;
display: flex;
align-items: center;
user-select: none;
touch-action: none;
}
.tlui-slider__container {
width: 164px;
padding: 0px var(--space-4);
}
.tlui-slider__track {
position: relative;
flex-grow: 1;
height: 44px;
cursor: pointer;
}
.tlui-slider__track::after {
display: block;
position: absolute;
top: calc(50% - 2px);
content: '';
height: 3px;
width: 100%;
background-color: var(--color-muted-1);
border-radius: var(--radius-4);
}
.tlui-slider__range {
position: absolute;
top: calc(50% - 2px);
left: 0px;
height: 3px;
background-color: var(--color-selected);
border-radius: var(--radius-4);
}
.tlui-slider__thumb {
all: unset;
cursor: grab;
display: block;
width: 18px;
height: 18px;
position: relative;
top: -1px;
background-color: var(--color-panel);
border-radius: 999px;
box-shadow: inset 0px 0px 0px 2px var(--color-text-2);
}
.tlui-slider__thumb:active {
cursor: grabbing;
box-shadow: inset 0px 0px 0px 2px var(--color-text-2), var(--shadow-1);
}
.tlui-slider__thumb:focus-visible {
box-shadow: inset 0 0 0 2px var(--color-focus);
}
/* ----------------------- Kbd ---------------------- */
.tlui-kbd {
font-family: inherit;
font-size: 11px;
line-height: 11px;
display: grid;
justify-items: center;
grid-auto-flow: column;
grid-template-columns: auto;
grid-auto-columns: minmax(1em, auto);
gap: 1px;
align-self: bottom;
color: var(--color-text-2);
margin-left: var(--space-4);
}
.tlui-kbd > span {
width: 100%;
text-align: center;
display: inline;
margin: 0px;
padding: 2px;
border-radius: 2px;
}
.tlui-kbd:not(:last-child) {
margin-right: var(--space-2);
}
/* --------------------- Button --------------------- */
.tlui-button {
margin: 0px;
position: relative;
z-index: 1;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
font-family: inherit;
font-size: 12px;
font-weight: inherit;
color: var(--color-text-1);
padding: 0px 13px;
cursor: pointer;
border: none;
outline: none;
user-select: none;
white-space: nowrap;
overflow: hidden;
background: transparent;
text-shadow: 1px 1px 0px var(--color-panel);
}
.tlui-button::after {
content: '';
z-index: 1;
position: absolute;
right: 4px;
bottom: 4px;
display: block;
width: calc(100% - 8px);
height: calc(100% - 8px);
border-radius: var(--radius-3);
background-color: transparent;
pointer-events: none;
}
.tlui-button > span {
text-overflow: ellipsis;
overflow: hidden;
display: flex;
align-items: center;
}
.tlui-button > span:not(:only-child) {
flex-grow: 2;
}
.tlui-button > span > svg {
margin-left: var(--space-2);
}
.tlui-button:disabled {
cursor: default;
color: var(--color-text-3);
}
.tlui-button:not([data-state='selected'], :disabled):active::after {
background: var(--color-muted-2);
}
@media (hover: hover) {
.tlui-button:not([data-state='selected'], :disabled):hover::after {
background: var(--color-muted-2);
}
}
.tlui-icon-left {
margin-right: var(--space-4);
}
.tlui-button > * {
position: relative;
z-index: 100;
color: inherit;
}
.tlui-button > svg {
width: 18px;
height: 18px;
pointer-events: none;
}
.tlui-button:not(:disabled, :focus-visible, [data-state='open']):active {
z-index: 2;
color: var(--color-text-0);
}
.tlui-button:not(:hover, :disabled, [data-state='open']):focus-visible::after {
box-shadow: inset 0 0 0 2px var(--color-focus);
}
.tlui-button[data-state='selected']:not(:hover, :disabled):focus-visible::after {
box-shadow: inset 0 0 0 2px var(--color-focus);
}
@media (hover: hover) {
.tlui-button:not(:disabled, :focus-visible):hover {
z-index: 2;
color: var(--color-text-0);
}
/*
.tlui-button:not(:disabled, :focus-visible):hover::after {
box-shadow: inset 0 0 0 1px var(--color-muted-1);
} */
.tlui-button__primary:not(:disabled, :focus-visible):hover {
color: var(--color-primary);
}
.tlui-button__warning:not(:disabled, :focus-visible):hover {
color: var(--color-warn);
}
}
.tlui-button:disabled {
color: var(--color-text-3);
}
/* Selected */
.tlui-button[data-state='selected'] {
color: var(--color-selected-contrast);
}
.tlui-button[data-state='selected']:not(:disabled, :focus-visible):active {
color: var(--color-selected-contrast);
}
@media (hover: hover) {
.tlui-button[data-state='selected']:not(:disabled, :focus-visible):hover {
color: var(--color-selected-contrast);
}
}
.tlui-button[data-state='selected']:not(:disabled)::after {
background: var(--color-selected);
}
/* Hinted */
.tlui-button[data-state='hinted']::after {
background: var(--color-hint);
/* box-shadow: inset 0 0 0 1px var(--color-muted-1); */
}
.tlui-button[data-state='hinted']:not(:disabled, :focus-visible):active::after {
background: var(--color-hint);
/* box-shadow: inset 0 0 0 1px var(--color-text-3); */
}
@media (hover: hover) {
.tlui-button[data-state='hinted']:not(:disabled, :focus-visible):hover::after {
background: var(--color-hint);
/* box-shadow: inset 0 0 0 1px var(--color-text-3); */
}
}
/* Focus Mode Button */
.tlui-focus-button {
z-index: var(--layer-panels);
pointer-events: all;
}
/* Squished */
.tlui-button.squished {
height: 36px;
width: 44px;
}
.tlui-button.squished {
height: 36px;
width: 44px;
}
.tlui-button__primary {
color: var(--color-primary);
}
.tlui-button__warning {
color: var(--color-warn);
}
.tlui-button__danger {
color: var(--color-warn);
}
/* --------------------- Popover -------------------- */
.tlui-popover {
position: relative;
display: flex;
align-content: stretch;
}
.tlui-popover__content {
position: relative;
max-height: 75vh;
margin: 0px;
border: none;
border-radius: var(--radius-4);
background-color: var(--color-panel);
box-shadow: var(--shadow-3);
z-index: var(--layer-menus);
overflow: hidden;
overflow-y: auto;
touch-action: auto;
overscroll-behavior: none;
scrollbar-width: none;
-ms-overflow-style: none;
}
/* -------------------------------------------------- */
/* Zones */
/* -------------------------------------------------- */
/* ------------------- Status Bar ------------------- */
.tlui-debug-panel {
margin-top: var(--space-2);
background-color: var(--color-low);
width: 100%;
display: grid;
align-items: center;
grid-template-columns: 1fr auto auto;
justify-content: space-between;
padding-left: var(--space-4);
border-radius: var(--radius-1);
font-size: 12px;
color: var(--color-text-1);
z-index: var(--layer-panels);
pointer-events: all;
}
.tlui-debug-panel__current-state {
white-space: nowrap;
}
/* -------------------- Menu Zone ------------------- */
.tlui-menu-zone {
position: relative;
z-index: var(--layer-panels);
width: fit-content;
}
.tlui-menu-zone::before {
content: '';
display: block;
position: absolute;
top: 0px;
left: 0px;
inset: -4px;
border: 4px solid var(--color-background);
border-radius: var(--radius-1) var(--radius-1) var(--radius-5) var(--radius-1);
background-color: var(--color-low);
}
.tlui-menu-zone *[data-state='open']::after {
background: linear-gradient(180deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%);
}
.tlui-menu-zone__controls {
position: relative;
display: flex;
align-items: center;
grid-row: 1;
grid-column: 1;
width: fit-content;
border-radius: var(--radius-1) var(--radius-1) var(--radius-4) var(--radius-1);
display: flex;
flex-direction: row;
z-index: var(--layer-panels);
pointer-events: all;
}
.tlui-menu-zone__divider {
width: 1px;
height: 18px;
background-color: var(--color-muted-1);
}
.tlui-menu-zone__controls > * {
margin: 0px -2px;
}
.tlui-menu-zone__controls > *:first-child {
margin-left: 0px;
}
.tlui-menu-zone__controls > *:last-child {
margin-right: 0px;
}
.tlui-menu-zone__controls > .tlui-menu-zone__divider {
margin: 0px;
}
.tlui-menu-zone__controls .tlui-icon {
width: 15px;
height: 15px;
}
/* ------------------- Style Panel ------------------ */
.tlui-style-panel__wrapper {
box-shadow: var(--shadow-2);
border-radius: var(--radius-4);
pointer-events: all;
background-color: var(--color-panel);
height: fit-content;
max-height: 100%;
margin: var(--space-3) var(--space-2);
overflow: hidden;
touch-action: auto;
overscroll-behavior: none;
overflow-y: auto;
color: var(--color-text);
}
.tlui-style-panel {
position: relative;
z-index: var(--layer-panels);
pointer-events: all;
}
.tlui-style-panel::-webkit-scrollbar {
display: none;
}
.tlui-style-panel .tlui-button.select {
width: 100%;
}
.tlui-style-panel__section {
display: flex;
position: relative;
flex-direction: column;
}
.tlui-style-panel__section:nth-of-type(n + 2):not(:last-child) {
border-bottom: 1px solid var(--color-divider);
}
.tlui-style-panel__section:empty {
display: none;
}
.tlui-style-panel__section__common:not(:only-child) {
margin-bottom: 7px;
border-bottom: 1px solid var(--color-divider);
}
.tlui-style-panel__row {
display: flex;
}
.tlui-style-panel__row > *:nth-child(2) {
margin-left: -4px;
}
.tlui-style-panel__double-select-picker {
display: grid;
grid-template-columns: 1fr auto auto;
align-items: center;
padding-left: var(--space-4);
font-size: 12px;
width: 164px;
}
.tlui-style-panel__double-select-picker > .tlui-button {
min-width: 44px;
margin-left: -4px;
}
.tlui-style-panel__double-select-picker-label {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.tlui-style-panel__section *[data-state='open']::after {
background: var(--color-muted-0);
}
/* ---------------------- Input --------------------- */
.tlui-input {
background: none;
margin: 0px;
position: relative;
z-index: 1;
height: 44px;
max-height: 44px;
display: flex;
align-items: center;
justify-content: center;
font-family: inherit;
font-size: 12px;
font-weight: inherit;
color: var(--color-text-1);
padding: 13px;
padding-left: 0px;
border: none;
outline: none;
text-overflow: ellipsis;
width: 100%;
user-select: all;
-webkit-user-select: auto !important;
}
.tlui-input__wrapper {
width: 100%;
height: 44px;
display: flex;
align-items: center;
gap: var(--space-4);
color: var(--color-text);
}
.tlui-input__wrapper > .tlui-icon {
flex-shrink: 0;
}
/* If mobile use 16px as font size */
/* On iOS, font size under 16px in an input will make the page zoom into the input 🤦‍♂️ */
/* https://css-tricks.com/16px-or-larger-text-prevents-ios-form-zoom/ */
@media (max-width: 600px) {
@supports (-webkit-touch-callout: none) {
/* CSS specific to iOS devices */
.tlui-input {
font-size: 16px;
}
}
}
/* ---------------- Prompt ---------------- */
.tlui-prompt__overlay {
background: var(--color-overlay);
position: fixed;
top: 0px;
left: 0px;
right: 0px;
bottom: 0px;
display: grid;
place-items: center;
overflow-y: auto;
z-index: var(--layer-overlays);
}
.tlui-prompt__content {
cursor: default;
background-color: var(--color-panel);
box-shadow: var(--shadow-3);
border-radius: var(--radius-4);
padding: var(--space-5);
font-size: 12px;
overflow-y: auto;
min-width: 300px;
max-width: 80vw;
max-height: 80vh;
}
.tlui-prompt__actions {
border: none;
padding: 0px;
margin: 0px;
display: flex;
justify-content: flex-end;
margin-right: calc(-1 * var(--space-3));
margin-bottom: calc(-1 * var(--space-3));
}
.tlui-prompt__title {
margin: 0px;
font-size: 12px;
}
.tlui-prompt__error {
color: #d10b0b;
display: flex;
gap: var(--space-2);
align-items: center;
}
/* ---------------- Dialog ---------------- */
.tlui-dialog__overlay {
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
z-index: var(--layer-overlays);
background-color: var(--color-overlay);
pointer-events: all;
animation: fadeIn 0.12s ease-out;
display: grid;
place-items: center;
overflow-y: auto;
}
.tlui-dialog__content {
display: flex;
flex-direction: column;
position: relative;
cursor: default;
background-color: var(--color-panel);
box-shadow: var(--shadow-3);
border-radius: var(--radius-4);
font-size: 12px;
overflow: hidden;
min-width: 300px;
max-width: 80vw;
max-height: 80vh;
}
.tlui-dialog__header {
position: relative;
display: flex;
align-items: center;
flex: 0;
z-index: 999;
padding-left: var(--space-4);
color: var(--color-text);
height: 44px;
}
.tlui-dialog__header__title {
flex: 1;
font-weight: inherit;
font-size: 12px;
margin: 0px;
color: var(--color-text-1);
font-weight: 500;
}
.tlui-dialog__header__close {
justify-self: flex-end;
}
.tlui-dialog__body {
padding: var(--space-4) var(--space-6);
flex: 0 1;
overflow-y: auto;
overflow-x: hidden;
color: var(--color-text-1);
user-select: all;
-webkit-user-select: text;
}
.tlui-dialog__footer {
position: relative;
z-index: 999;
}
.tlui-dialog__footer__actions {
display: flex;
align-items: center;
justify-content: flex-end;
}
.tlui-dialog__footer__actions > .tlui-button:nth-last-child(n + 2) {
margin-right: -4px;
}
.tlui-dialog__scrim {
display: block;
content: '';
bottom: 0px;
width: 100%;
height: 40px;
position: absolute;
background: linear-gradient(transparent, var(--color-panel));
border-bottom-left-radius: var(--radius-4);
border-bottom-right-radius: var(--radius-4);
pointer-events: none;
}
/* ---------------- Shortcuts ---------------- */
.tlui-shortcuts-dialog__header {
border-bottom: 1px solid var(--color-divider);
}
.tlui-shortcuts-dialog__body {
position: relative;
columns: 1;
column-gap: var(--space-9);
pointer-events: all;
touch-action: auto;
}
@media (min-width: 475px) {
.tlui-shortcuts-dialog__body {
columns: 2;
column-gap: var(--space-9);
}
}
@media (min-width: 960px) {
.tlui-shortcuts-dialog__body {
columns: 3;
column-gap: var(--space-9);
}
}
.tlui-shortcuts-dialog__group {
break-inside: avoid-column;
padding-bottom: var(--space-6);
}
.tlui-shortcuts-dialog__group__title {
font-size: inherit;
font-weight: 500;
margin: 0px;
color: var(--color-text-2);
letter-spacing: 0.5px;
text-transform: uppercase;
font-size: 9px;
height: 32px;
display: flex;
align-items: center;
}
.tlui-shortcuts-dialog__group__content {
display: flex;
flex-direction: column;
color: var(--color-text-1);
}
.tlui-shortcuts-dialog__key-pair {
display: flex;
gap: var(--space-4);
align-items: center;
justify-content: space-between;
height: 32px;
}
.tlui-shortcuts-dialog__key-pair__key {
flex: 1;
font-size: 12px;
}
/* --------------------- Toolbar -------------------- */
/* Wide container */
.tlui-toolbar {
grid-column: 1 / span 3;
grid-row: 1;
display: flex;
align-items: center;
justify-content: center;
flex-grow: 2;
padding-bottom: calc(var(--space-2) + var(--sab));
}
/* Centered Content */
.tlui-toolbar__inner {
position: relative;
width: fit-content;
display: flex;
gap: var(--space-3);
align-items: flex-end;
}
.tlui-toolbar__left {
width: fit-content;
}
/* Row of controls + lock button */
.tlui-toolbar__extras {
position: relative;
width: 100%;
height: 44px;
pointer-events: none;
}
.tlui-toolbar__extras__hidden {
display: none;
}
.tlui-toolbar__extras__controls {
display: flex;
flex-direction: row;
background-color: var(--color-low);
border-top-left-radius: var(--radius-3);
border-top-right-radius: var(--radius-3);
position: relative;
bottom: -4px;
margin-left: 8px;
margin-right: 0px;
pointer-events: all;
width: fit-content;
}
.tlui-toolbar__extras__controls::before {
content: '';
display: block;
position: absolute;
z-index: -1;
top: 0px;
left: 0px;
inset: -4px;
border: 4px solid var(--color-background);
border-radius: var(--radius-4);
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
background-color: var(--color-background);
}
.tlui-toolbar__extras__controls > .tlui-button,
.tlui-toolbar__extras__controls > .tlui-popover > .tlui-button {
height: 40px;
width: 40px;
}
.tlui-toolbar__extras__controls .tlui-button::after {
border-radius: var(--radius-2);
}
.tlui-toolbar__lock-button {
position: absolute;
top: 0px;
right: 0px;
pointer-events: all;
height: 40px;
width: 48px;
right: -4px;
}
.tlui-toolbar__lock-button::after {
border-radius: 100%;
top: 4px;
left: 8px;
height: 32px;
width: 32px;
}
.tlui-toolbar__lock-button__mobile {
right: -8px;
}
.tlui-toolbar__tools {
display: flex;
flex-direction: row;
background-color: var(--color-low);
border-radius: var(--radius-4);
z-index: var(--layer-panels);
pointer-events: all;
position: relative;
align-items: center;
background: var(--color-panel);
box-shadow: var(--shadow-2);
}
.tlui-toolbar__tools__button {
height: 48px;
width: 48px;
}
.tlui-toolbar__tools__button:nth-of-type(n + 2) {
margin-left: -2px;
}
.tlui-toolbar__tools__button:nth-last-of-type(n + 2) {
margin-right: -2px;
}
.tlui-toolbar__tools__button {
height: 48px;
width: 48px;
}
.tlui-layout__mobile .tlui-toolbar__tools__button {
height: 48px;
width: 44px;
}
.tlui-layout__mobile .tlui-toolbar__tools__button > .tlui-icon {
height: 16px;
width: 16px;
}
.tlui-toolbar__overflow {
width: 40px;
}
.tlui-layout__mobile .tlui-toolbar__overflow {
width: 32px;
padding: 0px;
}
.tlui-toolbar *[data-state='open']::after {
background: linear-gradient(0deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%);
}
.tlui-toolbar__styles__button {
width: 44px;
height: 44px;
}
.tlui-layout__mobile .tlui-toolbar__styles__button {
height: 48px;
}
.tlui-toolbar__divider {
display: block;
background: var(--color-divider);
height: 18px;
width: 1px;
}
/* -------------------- Help Zone ------------------- */
.tlui-help-menu {
pointer-events: all;
position: absolute;
bottom: var(--space-2);
right: var(--space-2);
}
.tlui-help-menu__button {
position: relative;
background-color: var(--color-low);
border-radius: var(--radius-4);
background-color: var(--color-low);
border-radius: 100%;
height: 40px;
width: 40px;
overflow: visible;
z-index: var(--layer-panels);
display: flex;
align-items: center;
justify-content: center;
pointer-events: all;
}
.tlui-help-menu__button::before {
display: block;
content: '';
position: absolute;
top: -4px;
left: -4px;
height: 40px;
width: 40px;
border-radius: 100%;
border: 4px solid var(--color-background);
z-index: -1;
}
.tlui-help-menu__button::after {
border-radius: 100%;
}
/* ------------------ Context Menu ------------------ */
.tlui-context-menu__move-to-page__name {
max-width: calc(min(300px, 35vw));
overflow: hidden;
text-overflow: ellipsis;
}
.tlui-context-menu__move-to-page__name[data-disabled] {
color: var(--color-text-3);
pointer-events: none;
}
/* ---------------------- Menu ---------------------- */
.tlui-menu {
z-index: var(--layer-menus);
height: fit-content;
width: fit-content;
max-height: 80vh;
border-radius: var(--radius-4);
pointer-events: all;
touch-action: auto;
overflow-y: auto;
overscroll-behavior: none;
background-color: var(--color-panel);
box-shadow: var(--shadow-3);
}
.tlui-menu::-webkit-scrollbar {
display: none;
}
.tlui-menu__arrow {
position: relative;
top: -1px;
fill: var(--color-panel);
stroke: var(--color-panel-contrast);
stroke-width: 1px;
}
.tlui-menu__group[data-size='large'] {
min-width: initial;
}
.tlui-menu__group[data-size='medium'] {
min-width: 144px;
}
.tlui-menu__group[data-size='small'] {
min-width: 96px;
}
.tlui-menu__group[data-size='tiny'] {
min-width: 0px;
}
.tlui-menu__group + .tlui-menu__group {
border-top: 1px solid var(--color-divider);
}
.tlui-menu__submenu__trigger[data-state='open']:not(:hover)::after {
border-radius: var(--radius-1);
background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%);
}
.tlui-menu__submenu__trigger[data-direction='left'][data-state='open']:not(:hover)::after {
border-radius: var(--radius-1);
background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%);
}
.tlui-menu__button {
width: 100%;
justify-content: space-between;
}
.tlui-menu__button__wide {
max-width: initial;
}
.tlui-menu__button:nth-child(n + 2) {
margin-top: -8px;
}
.tlui-menu__button:nth-last-child(n + 2) {
margin-bottom: -8px;
}
.tlui-menu__button > span:only-child {
text-align: left;
flex-grow: 2;
}
.tlui-menu__checkbox-item {
padding-left: 28px;
}
.tlui-menu__checkbox-item__check {
position: absolute;
left: 0px;
width: 24px;
padding-left: 10px;
display: inline-flex;
align-items: center;
justify-content: center;
}
/* ------------------- Button Grid ------------------ */
.tlui-button-grid__button {
width: 44px;
height: 44px;
}
.tlui-button-grid__four {
display: grid;
grid-template-columns: 40px 40px 40px 44px;
}
.tlui-button-grid__four > .tlui-button-grid__button:nth-child(n + 5) {
margin-top: -2px;
}
.tlui-button-grid__four > .tlui-button-grid__button:nth-last-child(n + 5) {
margin-bottom: -2px;
}
.tlui-button-grid__three {
display: grid;
grid-template-columns: 40px 40px 44px;
}
.tlui-button-grid__three > .tlui-button-grid__button:nth-child(n + 4) {
margin-top: -2px;
}
.tlui-button-grid__three > .tlui-button-grid__button:nth-last-child(n + 4) {
margin-bottom: -2px;
}
.tlui-button-grid__two {
display: grid;
grid-template-columns: 40px 44px;
}
.tlui-button-grid__two > .tlui-button-grid__button:nth-child(n + 3) {
margin-top: -2px;
}
.tlui-button-grid__two > .tlui-button-grid__button:nth-last-child(n + 3) {
margin-bottom: -2px;
}
/*
.tlui-button-grid__button:not(:nth-child(4n - 3)) {
margin-left: -2px;
}
.tlui-button-grid__button:not(:nth-child(4n)) {
margin-right: -2px;
}*/
/*
.tlui-button-grid__button:nth-last-child(1) {
margin-right: 0px;
} */
/* ------------------ Actions Menu ------------------ */
.tlui-actions-menu {
max-height: calc(100vh - 150px);
}
/* --------------------- Toasts --------------------- */
.tlui-toast__viewport {
position: absolute;
inset: 0px;
margin: 0px;
display: flex;
align-items: flex-end;
justify-content: flex-end;
flex-direction: column;
gap: var(--space-3);
pointer-events: none;
padding: 0px var(--space-3) 64px 0px;
z-index: var(--layer-toasts);
}
.tlui-toast__viewport > * {
pointer-events: all;
}
.tlui-toast__icon {
padding-top: var(--space-4);
padding-left: var(--space-4);
}
.tlui-toast__container {
min-width: 200px;
max-width: 280px;
display: flex;
flex-direction: row;
gap: var(--space-3);
background-color: var(--color-panel);
box-shadow: var(--shadow-2);
border-radius: var(--radius-4);
font-size: 12px;
}
.tlui-toast__main {
flex-grow: 2;
}
.tlui-toast__main:nth-child(1) > .tlui-toast__content {
padding-left: var(--space-4);
}
.tlui-toast__content {
padding-left: 0px;
padding-top: var(--space-4);
padding-bottom: var(--space-5);
display: flex;
flex-direction: column;
gap: var(--space-3);
}
.tlui-toast__content:not(:only-child) {
padding-bottom: var(--space-2);
}
.tlui-toast__title {
font-weight: 600;
color: var(--color-text);
}
.tlui-toast__description {
color: var(--color-text-1);
padding: var(--space-3);
margin: 0px;
padding: 0px;
}
.tlui-toast__actions {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
.tlui-toast__close {
align-self: flex-end;
}
@media (prefers-reduced-motion: no-preference) {
.tlui-toast__container[data-state='open'] {
animation: slide-in 200ms cubic-bezier(0.785, 0.135, 0.15, 0.86);
}
.tlui-toast__container[data-state='closed'] {
animation: hide 100ms ease-in;
}
.tlui-toast__container[data-swipe='move'] {
transform: translateX(var(--radix-toast-swipe-move-x));
}
.tlui-toast__container[data-swipe='cancel'] {
transform: translateX(0);
transition: transform 200ms ease-out;
}
.tlui-toast__container[data-swipe='end'] {
animation: swipe-out 100ms ease-out;
}
}
/* --------------------- Mobile --------------------- */
@media (max-width: 640px) {
.tlui-menu__group .tlui-button {
height: 40px;
}
.tlui-menu__group .tlui-button > .tlui-kbd {
display: none;
}
.tlui-menu__group .tlui-button > .tlui-icon-left {
display: none;
}
}
/* --------------------- Bottom --------------------- */
.tlui-layout__bottom {
grid-row: 2;
}
.tlui-layout__bottom__main {
width: 100%;
position: relative;
display: flex;
align-items: flex-end;
justify-content: center;
}
/* ------------------ Da Share Zone ----------------- */
.tlui-share-zone {
height: 44px;
width: auto;
display: flex;
flex-direction: row;
gap: var(--space-3);
justify-content: flex-end;
z-index: var(--layer-panels);
align-items: center;
}
.tlui-share-zone__connection-status {
width: 8px;
height: 100%;
position: relative;
display: flex;
align-items: center;
}
.tlui-share-zone__connection-status::after {
content: '';
width: 8px;
height: 8px;
background-color: currentColor;
border-radius: 100%;
}
.tlui-share-zone__button {
font-size: 14px;
background: var(--color-selected);
color: var(--color-selected-contrast);
border-radius: var(--radius-1);
border-bottom-left-radius: var(--radius-4);
pointer-events: all;
}
.tlui-layout__mobile .tlui-share-zone__button {
border-radius: var(--radius-1);
border-bottom-left-radius: var(--radius-4);
}
.tlui-share-zone__button:active {
color: var(--color-selected-contrast);
}
@media (hover: hover) {
.tlui-share-zone__button:hover {
color: var(--color-selected-contrast);
}
.tlui-share-zone__button:not(:disabled, :focus-visible):hover {
color: var(--color-selected-contrast);
}
}
.tlui-share-zone__popover {
font-size: 12px;
font-weight: inherit;
width: 200px;
max-width: 100%;
max-height: 100%;
position: relative;
}
.tlui-share-zone__qr-code {
width: 200px;
height: 200px;
cursor: pointer;
background: none;
background-color: var(--color-muted-2);
background-size: cover;
border: none;
}
.tlui-share-zone__spinner {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.tlui-share-zone__details {
font-size: 11px;
font-weight: 400;
2023-04-25 11:01:25 +00:00
padding: var(--space-4);
color: var(--color-text-1);
2023-04-25 11:01:25 +00:00
line-height: 1.5;
margin: 0px;
}
.tlui-share-zone__button {
text-shadow: none;
}
.tlui-share-zone__status {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
padding: 4px;
position: relative;
left: -4px;
}
.tlui-share-zone__status > div {
width: 8px;
height: 8px;
border-radius: 100%;
}
/* ------------------- People Menu ------------------- */
.tlui-people-menu__button {
display: flex;
border-radius: 100%;
pointer-events: all;
overflow: visible;
width: 40px;
height: 40px;
background-color: var(--color-low);
}
.tlui-people-menu__button::before {
display: block;
content: '';
position: absolute;
height: 40px;
width: 40px;
border-radius: 100%;
border: 4px solid var(--color-background);
z-index: -1;
pointer-events: none;
2023-04-25 11:01:25 +00:00
}
.tlui-people-menu__button:not([data-state='selected'], :disabled):active::after {
border-radius: 100%;
}
@media (hover: hover) {
.tlui-people-menu__button:not([data-state='selected'], :disabled):hover::after {
border-radius: 100%;
}
}
.tlui-people-menu__wrapper {
position: relative;
display: flex;
flex-direction: column;
width: 220px;
height: fit-content;
max-height: 50vh;
}
.tlui-people-menu__section {
position: relative;
touch-action: auto;
flex-direction: column;
max-height: 100%;
min-height: 44px;
overflow-x: hidden;
overflow-y: auto;
touch-action: auto;
}
.tlui-people-menu__section:not(:last-child) {
border-bottom: 1px solid var(--color-divider);
}
.tlui-people-menu__user {
display: flex;
justify-content: flex-start;
align-items: center;
}
.tlui-people-menu__user__color-picker {
z-index: var(--layer-overlays);
}
.tlui-people-menu__user__color {
flex-shrink: 0;
}
.tlui-people-menu__user__name {
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 12px;
color: var(--color-text-1);
max-width: 100%;
flex-grow: 1;
flex-shrink: 100;
}
.tlui-people-menu__user__label {
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 12px;
color: var(--color-text-3);
flex-grow: 100;
flex-shrink: 0;
margin-left: 4px;
}
.tlui-people-menu__user__input {
flex-grow: 2;
height: 100%;
padding: 0px;
margin: 0px;
}
.tlui-people-menu__user__edit {
min-width: 44px;
}
.tlui-people-menu__user > .tlui-input__wrapper {
width: auto;
display: flex;
align-items: auto;
flex-grow: 2;
gap: 8px;
padding: 0px;
}
.tlui-people-menu__item {
display: flex;
justify-content: flex-start;
gap: 13px;
width: 100%;
margin: -4px 0px;
}
.tlui-people-menu__item > .tlui-menu__button__wide {
width: auto;
display: flex;
align-items: auto;
justify-content: flex-start;
flex-grow: 2;
gap: 13px;
margin-right: -13px;
}
.tlui-people-menu__item:nth-of-type(1) {
margin-top: 0px;
}
.tlui-people-menu__item:nth-last-of-type(1) {
margin-bottom: 0px;
}
.tlui-people-menu__item__follow {
min-width: 44px;
}
.tlui-people-menu__item__follow[data-active='true'] .tlui-icon {
opacity: 1;
}
.tlui-people-menu__item__follow:focus-visible .tlui-icon {
opacity: 1;
}
@media (hover: hover) {
.tlui-people-menu__item__follow .tlui-icon {
opacity: 0;
}
2023-04-25 11:01:25 +00:00
.tlui-people-menu__item__follow:hover .tlui-icon {
opacity: 1;
}
}
Add support for project names (#1340) This PR adds some things that we need for the Project Name feature on tldraw.com. It should be reviewed alongside https://github.com/tldraw/tldraw-lite/pull/1814 ## Name Property This PR adds a `name` property to `TLDocument`. We use this to store a project's name. <img width="454" alt="Screenshot 2023-05-09 at 15 47 26" src="https://github.com/tldraw/tldraw/assets/15892272/f3be438e-aa0f-4dec-8f51-8dfd9f9d0ced"> ## Top Zone This PR adds a `topZone` area of the UI that we can add stuff to, similar to how `shareZone` works. It also adds an example to show where the `topZone` and `shareZone` are: <img width="1511" alt="Screenshot 2023-05-12 at 10 57 40" src="https://github.com/tldraw/tldraw/assets/15892272/f5e1cd33-017e-4aaf-bfee-4d85119e2974"> ## Breakpoints This PR change's the UI's breakpoints a little bit. It moves the action bar to the bottom a little bit earlier. (This gives us more space at the top for the project name). ![2023-05-12 at 11 08 26 - Fuchsia Bison](https://github.com/tldraw/tldraw/assets/15892272/34563cea-b1d1-47be-ac5e-5650ee0ba02d) ![2023-05-12 at 13 45 04 - Tan Mole](https://github.com/tldraw/tldraw/assets/15892272/ab190bd3-51d4-4a8b-88de-c72ab14bcba6) ## Input Blur This PR adds an `onBlur` parameter to `Input`. This was needed because 'clicking off' the input wasn't firing `onComplete` or `onCancel`. <img width="620" alt="Screenshot 2023-05-09 at 16 12 58" src="https://github.com/tldraw/tldraw/assets/15892272/3b28da74-0a74-4063-8053-e59e47027caf"> ## Create Project Name This PR adds an internal `createProjectName` property to `TldrawEditorConfig`. Similar to `derivePresenceState`, you can pass a custom function to it. It lets you control what gets used as the default project name. We use it to set different names in our local projects compared to shared projects. In the future, when we add more advanced project features, we could handle this better within the UI. <img width="454" alt="Screenshot 2023-05-09 at 15 47 26" src="https://github.com/tldraw/tldraw/assets/15892272/da9a4699-ac32-40d9-a97c-6c682acfac41"> ### Test Plan 1. Gradually reduce the width of the browser window. 2. Check that the actions menu jumps to the bottom before the style panel moves to the bottom. --- 1. In the examples app, open the `/zones` example. 2. Check that there's a 'top zone' at the top. - [ ] Unit Tests - [ ] Webdriver tests ### Release Note - [dev] Added a `topZone` area where you can put stuff. - [dev] Added a `name` property to `TLDocument` - and `app` methods for it. - [dev] Added an internal `createProjectName` config property for controlling the default project name. - [dev] Added an `onBlur` parameter to `Input`. - Moved the actions bar to the bottom on medium-sized screens. --------- Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
2023-06-01 18:46:26 +00:00
/* ------------------ Project Menu ------------------ */
.tlui-project-menu__wrapper {
display: flex;
width: 100%;
align-items: center;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
min-width: 0px;
}
.tlui-project-menu__button {
display: flex;
gap: var(--space-4);
pointer-events: all;
}
.tlui-project-menu__button__name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
min-width: 0px;
}
.tlui-project-menu__input {
min-width: 0px;
text-align: center;
pointer-events: all;
/* Position slightly to the right so that it doesn't jump around */
/* 40px is the width of the icon */
margin-left: 40px;
}
.tlui-rename-project-dialog__input {
background-color: var(--color-muted-2);
flex-grow: 2;
border-radius: var(--radius-2);
padding: 0px var(--space-4);
}
2023-04-25 11:01:25 +00:00
/* ------------------- Navigation ------------------- */
.tlui-navigation-zone {
display: flex;
width: min-content;
flex-direction: column;
background-color: var(--color-low);
z-index: var(--layer-panels);
pointer-events: all;
position: absolute;
left: 0px;
bottom: 0px;
}
.tlui-navigation-zone::before {
content: '';
display: block;
position: absolute;
z-index: -1;
inset: -4px;
border: 4px solid var(--color-background);
border-radius: var(--radius-1);
border-top-right-radius: var(--radius-5);
background-color: var(--color-low);
}
.tlui-navigation-zone__controls {
display: flex;
flex-direction: row;
width: min-content;
background-color: none;
overflow: hidden;
}
.tlui-navigation-zone__controls > .tlui-button {
margin-left: -2px;
margin-right: -2px;
}
.tlui-navigation-zone__controls > .tlui-button:nth-of-type(1) {
margin-left: 0px;
}
.tlui-navigation-zone__controls > .tlui-button:nth-last-of-type(1) {
margin-right: 0px;
}
.tlui-navigation-zone__toggle .tlui-icon {
opacity: 0.24;
transition: opacity 0.2s ease-in-out;
}
.tlui-navigation-zone__toggle:active .tlui-icon {
opacity: 1;
transition: opacity 0.12s ease-in-out;
}
@media (hover: hover) {
.tlui-navigation-zone__toggle:hover .tlui-icon {
opacity: 1;
transition: opacity 0.12s ease-in-out;
}
}
.tlui-minimap {
width: 100%;
height: 96px;
min-height: 96px;
overflow: hidden;
padding: var(--space-3);
padding-top: 0px;
}
.tlui-minimap__canvas {
position: relative;
width: 100%;
height: 100%;
}
.tlui-zoom-menu__button__pct {
width: 60px;
text-align: center;
}
/* ----------------------- ... ---------------------- */
@keyframes hide {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@keyframes slide-in {
from {
transform: translateX(calc(100% + var(--space-3)));
}
to {
transform: translateX(0px);
}
}
@keyframes swipe-out {
from {
transform: translateX(var(--radix-toast-swipe-end-x));
}
to {
transform: translateX(calc(100% + var(--space-3)));
}
}
/* ------------------- Page Select ------------------ */
.tlui-page-menu__wrapper {
position: relative;
display: flex;
flex-direction: column;
width: 220px;
height: fit-content;
max-height: 50vh;
}
.tlui-page-menu__trigger {
width: 128px;
}
.tlui-page-menu__trigger > span {
flex-grow: 2;
margin-right: var(--space-4);
}
.tlui-page-menu__header {
display: flex;
flex-direction: row;
align-items: center;
width: 100%;
padding-left: var(--space-4);
min-height: 44px;
border-bottom: 1px solid var(--color-divider);
}
.tlui-page-menu__header > .tlui-button:nth-of-type(1) {
margin-right: -4px;
}
.tlui-page-menu__header__title {
color: var(--color-text);
font-size: 12px;
font-weight: 500;
flex-grow: 2;
}
.tlui-page-menu__name {
flex-grow: 2;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tlui-page-menu__list {
position: relative;
touch-action: auto;
flex-direction: column;
max-height: 100%;
overflow-x: hidden;
overflow-y: auto;
touch-action: auto;
}
.tlui-page-menu__item {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
}
.tlui-page-menu__item:nth-of-type(n + 2) {
margin-top: -4px;
}
.tlui-page-menu__item__button {
flex-grow: 2;
}
.tlui-page-menu__item__button > span {
display: block;
flex-grow: 2;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tlui-page-menu__item__button__checkbox {
padding-left: 36px;
}
.tlui-page-menu__item__button__check {
position: absolute;
left: 0px;
width: 24px;
padding-left: 10px;
display: inline-flex;
align-items: center;
justify-content: center;
color: var(--color-text);
}
.tlui-page_menu__item__sortable {
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: fit-content;
display: flex;
flex-direction: row;
align-items: center;
overflow: hidden;
z-index: 1;
}
.tlui-page_menu__item__sortable__title {
flex: 1;
}
.tlui-page_menu__item__sortable__title > .tlui-input__wrapper {
height: 100%;
}
.tlui-page_menu__item__sortable__button {
flex: 0;
}
.tlui-page_menu__item__sortable:focus-within {
z-index: 10;
}
.tlui-page_menu__item__sortable__handle {
touch-action: none;
width: 32px;
height: 40px;
2023-04-25 11:01:25 +00:00
cursor: grab;
color: var(--color-text-3);
flex-shrink: 0;
margin-right: -9px;
}
.tlui-page_menu__item__sortable__handle:active {
cursor: grabbing;
}
.tlui-page-menu__item__input {
margin-left: 13px;
height: 100%;
}
/* The more menu has complex CSS here: */
/* If the user can hover, then visible but opacity zero until hover */
/* If the user cannot hover, then not displayed unless editing, and then opacity 1 */
.tlui-page_menu__item__submenu {
pointer-events: all;
flex: 0;
cursor: pointer;
margin: 0px;
display: none;
}
.tlui-page_menu__item__submenu[data-isediting='true'] {
display: block;
}
@media (hover: hover) {
.tlui-page_menu__item__submenu {
opacity: 0;
display: block;
}
.tlui-page_menu__item__submenu:hover,
.tlui-page-menu__item:focus-within > .tlui-page_menu__item__submenu,
.tlui-page_menu__item__sortable:focus-within > .tlui-page_menu__item__submenu {
opacity: 1;
}
}
/* --------------------- Dialogs -------------------- */
/* Edit Link Dialog */
.tlui-edit-link-dialog {
display: flex;
flex-direction: column;
gap: var(--space-4);
color: var(--color-text);
}
.tlui-edit-link-dialog__input {
background-color: var(--color-muted-2);
flex-grow: 2;
border-radius: var(--radius-2);
padding: 0px var(--space-4);
}
/* Embed Dialog */
.tlui-embed__spacer {
flex-grow: 2;
min-height: 0px;
margin-left: calc(-1 * var(--space-4));
margin-top: calc(-1 * var(--space-4));
pointer-events: none;
}
2023-04-25 11:01:25 +00:00
.tlui-embed-dialog__list {
display: flex;
flex-direction: column;
padding-bottom: var(--space-5);
}
.tlui-embed-dialog__item {
position: relative;
border: none;
background: none;
font-family: inherit;
display: flex;
text-align: left;
gap: var(--space-3);
cursor: pointer;
padding: 0;
align-items: center;
color: var(--color-text);
font-size: var(--font-size-1);
height: 44px;
}
@media (hover: hover) {
.tlui-embed-dialog__item:hover::after {
display: block;
content: '';
position: absolute;
inset: 0px;
background-color: var(--color-muted-2);
border-radius: var(--radius-4);
}
}
.tlui-embed-dialog__item__image {
padding: var(--space-3);
}
.tlui-embed-dialog__item__image__img {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
}
.tlui-embed-dialog__enter {
display: flex;
flex-direction: column;
gap: var(--space-4);
color: var(--color-text-1);
}
.tlui-embed-dialog__input {
background-color: var(--color-muted-2);
flex-grow: 2;
border-radius: var(--radius-2);
padding: 0px var(--space-4);
}
.tlui-embed-dialog__warning {
color: var(--color-warn);
}
.tlui-embed-dialog__instruction__link {
display: flex;
gap: var(--space-1);
margin-top: var(--space-4);
}
.tlui-embed-dialog__enter a {
color: var(--color-text-1);
}