@import url("https://fonts.googleapis.com/css2?family=Inter:wght@500;700&display=swap");/* Base Panel Layout */ .panel-root { position: absolute; left: 0; background: var(--color-panel); border-right: 1px solid var(--color-divider); display: flex; flex-direction: column; box-shadow: var(--shadow-1); } .panel-handle { position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 24px; height: 48px; background: var(--color-panel); border: 1px solid var(--color-divider); border-left: none; border-radius: 0 4px 4px 0; display: flex; align-items: center; justify-content: center; cursor: pointer; font-size: 20px; color: var(--color-text); z-index: var(--layer-panels); box-shadow: var(--shadow-1); } .panel-handle:hover { background: var(--color-hover); } .panel-header { padding: 8px; border-bottom: 1px solid var(--color-divider); display: flex; align-items: center; gap: 8px; } .panel-header-actions { display: flex; align-items: center; gap: 4px; margin-left: auto; } .panel-type-select { flex: 1; min-width: 0; padding: 4px 8px; border-radius: 4px; background: var(--color-background); border: 1px solid var(--color-divider); color: var(--color-text); font: inherit; } .panel-content { flex: 1; height: 100%; overflow-y: auto; padding: 8px; -ms-overflow-style: none; scrollbar-width: none; } .panel-content::-webkit-scrollbar { display: none; } .pin-button { color: var(--color-text-2); } .pin-button:hover { color: var(--color-text); } .pin-button.pinned { color: var(--color-primary); } /* Common Panel Styles */ .panel-container { padding: 8px; display: flex; flex-direction: column; gap: 8px; height: 100%; overflow-y: auto; -ms-overflow-style: none; /* Hide scrollbar for IE and Edge */ scrollbar-width: none; /* Hide scrollbar for Firefox */ } /* Hide scrollbar for Chrome, Safari and Opera */ .panel-container::-webkit-scrollbar { display: none; } /* Input Styles */ .panel-input { padding: 8px; border-radius: 4px; border: 1px solid var(--color-muted-1); font-size: 14px; background-color: var(--color-background); color: var(--color-text); width: 100%; transition: border-color 0.2s ease; } .panel-input:focus { outline: none; border-color: var(--color-selected); } .panel-input::-moz-placeholder { color: var(--color-text-2); } .panel-input::placeholder { color: var(--color-text-2); } /* Button Styles */ .shape-button { padding: 8px 12px; width: 100%; text-align: left; background-color: var(--color-panel); border: 1px solid var(--color-divider); border-radius: 4px; color: var(--color-text); cursor: pointer; font-size: 12px; transition: background-color 0.2s ease; } .shape-button:hover { background-color: var(--color-hover); } /* Section Styles */ .panel-section { display: flex; flex-direction: column; gap: 8px; } .panel-section-title { font-size: 14px; color: var(--color-text); margin-bottom: 4px; } .panel-divider { border-top: 1px solid var(--color-divider); margin: 8px 0; } /* Dropdown/Flyout Menu */ .panel-dropdown { position: absolute; left: 100%; top: 0; background-color: var(--color-panel); border: 1px solid var(--color-divider); border-radius: 4px; padding: 4px; z-index: 1000; max-height: 400px; overflow-y: auto; width: 200px; } /* Slides Panel Specific */ .slides-panel-tools { flex-shrink: 0; /* Prevent tools from shrinking */ display: flex; justify-content: flex-start; padding: 0 0 8px 0; border-bottom: 1px solid var(--color-divider); } .slideshow-container { border: 1px solid var(--color-divider); border-radius: 4px; overflow: visible; margin-bottom: 16px; display: flex; flex-direction: column; flex-shrink: 0; /* Prevent container from shrinking */ } .slideshow-header { background: var(--color-muted); padding: 8px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--color-divider); } .slideshow-title { display: flex; flex-direction: column; gap: 4px; } .slideshow-title h3 { margin: 0; font-size: 14px; font-weight: 500; } .slide-count { font-size: 12px; color: var(--color-text-2); } .slides-list { display: flex; flex-direction: column; flex: 1; } .slide-item { display: flex; align-items: center; gap: 8px; padding: 8px; cursor: pointer; border-bottom: 1px solid var(--color-divider); transition: background-color 0.2s; min-height: 36px; } .slide-item:last-child { border-bottom: none; } .slide-number { min-width: 20px; font-size: 12px; color: var(--color-text-2); } .slide-title { flex: 1; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .slide-item:hover { background-color: var(--color-hover); } .slide-item.selected { background-color: var(--color-selected); color: var(--color-selected-contrast); } /* Empty State */ .panel-empty-state { text-align: center; color: var(--color-text-2); padding: 16px; } /* THIS CSS FILE IS GENERATED! DO NOT EDIT. OR EDIT. I'M A COMMENT NOT A COP */ /* This file is created by the copy-css-files.mjs script in packages/tldraw. */ /* It combines @tldraw/editor's editor.css and tldraw's ui.css */ /* @tldraw/editor */ .tl-container { font-size: 12px; /* Spacing */ --space-1: 2px; --space-2: 4px; --space-3: 8px; --space-4: 12px; --space-5: 16px; --space-6: 20px; --space-7: 28px; --space-8: 32px; --space-9: 64px; --space-10: 72px; /* Radius */ --radius-0: 2px; --radius-1: 4px; --radius-2: 6px; --radius-3: 9px; --radius-4: 11px; /* Canvas z-index */ --layer-canvas-hidden: -999999; --layer-canvas-background: 100; --layer-canvas-grid: 150; --layer-watermark: 200; --layer-canvas-shapes: 300; --layer-canvas-overlays: 500; --layer-canvas-blocker: 10000; /* Canvas overlays z-index */ --layer-overlays-collaborator-scribble: 10; --layer-overlays-collaborator-brush: 20; --layer-overlays-collaborator-shape-indicator: 30; --layer-overlays-user-scribble: 40; --layer-overlays-user-brush: 50; --layer-overlays-user-indicator-selected: 60; --layer-overlays-user-indicator-hovered: 70; --layer-overlays-user-handles: 80; --layer-overlays-user-snapline: 90; --layer-overlays-selection-fg: 100; --layer-overlays-user-indicator-hint: 110; --layer-overlays-collaborator-cursor-hint: 120; --layer-overlays-collaborator-cursor: 130; /* Text editor z-index */ --layer-text-container: 1; --layer-text-content: 3; --layer-text-editor: 4; /* Error fallback z-index */ --layer-error-overlay: 1; --layer-error-canvas: 2; --layer-error-canvas-after: 3; --layer-error-content: 4; /* Misc */ --tl-zoom: 1; /* Cursor SVGs */ --tl-cursor-none: none; --tl-cursor-default: url("data:image/svg+xml,") 12 8, default; --tl-cursor-pointer: url("data:image/svg+xml,") 14 10, pointer; --tl-cursor-cross: url("data:image/svg+xml,") 16 16, crosshair; --tl-cursor-move: url("data:image/svg+xml,") 16 16, move; --tl-cursor-grab: url("data:image/svg+xml,") 16 16, grab; --tl-cursor-grabbing: url("data:image/svg+xml,") 16 16, grabbing; --tl-cursor-text: url("data:image/svg+xml,") 4 10, text; --tl-cursor-zoom-in: url("data:image/svg+xml,") 16 16, zoom-in; --tl-cursor-zoom-out: url("data:image/svg+xml,") 16 16, zoom-out; /* These cursor values get programmatically overridden */ /* They're just here to help your editor autocomplete */ --tl-cursor: var(--tl-cursor-default); --tl-cursor-resize-edge: ew-resize; --tl-cursor-resize-corner: nesw-resize; --tl-cursor-ew-resize: ew-resize; --tl-cursor-ns-resize: ns-resize; --tl-cursor-nesw-resize: nesw-resize; --tl-cursor-nwse-resize: nwse-resize; --tl-cursor-rotate: pointer; --tl-cursor-nwse-rotate: pointer; --tl-cursor-nesw-rotate: pointer; --tl-cursor-senw-rotate: pointer; --tl-cursor-swne-rotate: pointer; --tl-scale: calc(1 / var(--tl-zoom)); /* fonts */ --tl-font-draw: 'tldraw_draw', sans-serif; --tl-font-sans: 'tldraw_sans', sans-serif; --tl-font-serif: 'tldraw_serif', serif; --tl-font-mono: 'tldraw_mono', monospace; /* text outline */ --a: calc(min(0.5, 1 / var(--tl-zoom)) * 2px); --b: calc(min(0.5, 1 / var(--tl-zoom)) * -2px); --tl-text-outline-reference: 0 var(--b) 0 var(--color-background), 0 var(--a) 0 var(--color-background), var(--b) var(--b) 0 var(--color-background), var(--a) var(--b) 0 var(--color-background), var(--a) var(--a) 0 var(--color-background), var(--b) var(--a) 0 var(--color-background); --tl-text-outline: var(--tl-text-outline-reference); /* own properties */ position: relative; inset: 0px; height: 100%; width: 100%; overflow: clip; color: var(--color-text); } .tl-theme__light { --color-accent: hsl(0, 76%, 60%); --color-background: hsl(210, 20%, 98%); --color-brush-fill: hsl(0, 0%, 56%, 10.2%); --color-brush-stroke: hsl(0, 0%, 56%, 25.1%); --color-grid: hsl(0, 0%, 43%); --color-low: hsl(204, 16%, 94%); --color-low-border: hsl(204, 16%, 92%); --color-culled: hsl(204, 14%, 93%); --color-muted-none: hsl(0, 0%, 0%, 0%); --color-muted-0: hsl(0, 0%, 0%, 2%); --color-muted-1: hsl(0, 0%, 0%, 10%); --color-muted-2: hsl(0, 0%, 0%, 4.3%); --color-hint: hsl(0, 0%, 0%, 5.5%); --color-overlay: hsl(0, 0%, 0%, 20%); --color-divider: hsl(0, 0%, 91%); --color-panel-contrast: hsl(0, 0%, 100%); --color-panel-overlay: hsl(0, 0%, 100%, 82%); --color-panel: hsl(0, 0%, 99%); --color-focus: hsl(214, 100%, 29%); --color-selected: hsl(214, 84%, 56%); --color-selected-contrast: hsl(0, 0%, 100%); --color-selection-fill: hsl(210, 100%, 56%, 24%); --color-selection-stroke: hsl(214, 84%, 56%); --color-text-0: hsl(0, 0%, 11%); --color-text-1: hsl(0, 0%, 18%); --color-text-3: hsl(220, 2%, 65%); --color-text-shadow: hsl(0, 0%, 100%); --color-primary: hsl(214, 84%, 56%); --color-success: hsl(123, 46%, 34%); --color-info: hsl(201, 98%, 41%); --color-warning: hsl(27, 98%, 47%); --color-error: hsl(0, 65%, 51%); --color-warn: hsl(0, 90%, 43%); --color-text: hsl(0, 0%, 0%); --color-laser: hsl(0, 100%, 50%); /* Shadows */ --shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 25%), 0px 1px 3px hsl(0, 0%, 0%, 9%); --shadow-2: 0px 0px 2px hsl(0, 0%, 0%, 16%), 0px 2px 3px hsl(0, 0%, 0%, 24%), 0px 2px 6px hsl(0, 0%, 0%, 0.1), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-3: 0px 1px 2px hsl(0, 0%, 0%, 28%), 0px 2px 6px hsl(0, 0%, 0%, 14%), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-4: 0px 0px 3px hsl(0, 0%, 0%, 19%), 0px 5px 4px hsl(0, 0%, 0%, 16%), 0px 2px 16px hsl(0, 0%, 0%, 6%), inset 0px 0px 0px 1px var(--color-panel-contrast); } .tl-theme__dark { --color-accent: hsl(0, 76%, 60%); --color-background: hsl(240, 5%, 6.5%); --color-brush-fill: hsl(0, 0%, 71%, 5.1%); --color-brush-stroke: hsl(0, 0%, 71%, 25.1%); --color-grid: hsl(0, 0%, 40%); --color-low: hsl(260, 4.5%, 10.5%); --color-low-border: hsl(207, 10%, 10%); --color-culled: hsl(210, 11%, 19%); --color-muted-none: hsl(0, 0%, 100%, 0%); --color-muted-0: hsl(0, 0%, 100%, 2%); --color-muted-1: hsl(0, 0%, 100%, 10%); --color-muted-2: hsl(0, 0%, 100%, 5%); --color-hint: hsl(0, 0%, 100%, 7%); --color-overlay: hsl(0, 0%, 0%, 50%); --color-divider: hsl(240, 9%, 22%); --color-panel-contrast: hsl(245, 12%, 23%); --color-panel: hsl(235, 6.8%, 13.5%); --color-panel-overlay: hsl(210, 10%, 24%, 82%); --color-focus: hsl(217, 76%, 80%); --color-selected: hsl(217, 89%, 61%); --color-selected-contrast: hsl(0, 0%, 100%); --color-selection-fill: hsl(209, 100%, 57%, 20%); --color-selection-stroke: hsl(214, 84%, 56%); --color-text-0: hsl(0, 9%, 94%); --color-text-1: hsl(0, 0%, 85%); --color-text-3: hsl(210, 6%, 45%); --color-text-shadow: hsl(210, 13%, 18%); --color-primary: hsl(214, 84%, 56%); --color-success: hsl(123, 38%, 57%); --color-info: hsl(199, 92%, 56%); --color-warning: hsl(36, 100%, 57%); --color-error: hsl(4, 90%, 58%); --color-warn: hsl(0, 81%, 66%); --color-text: hsl(210, 17%, 98%); --color-laser: hsl(0, 100%, 50%); /* Shadows */ --shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 16.1%), 0px 1px 3px hsl(0, 0%, 0%, 22%), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-2: 0px 1px 3px hsl(0, 0%, 0%, 66.6%), 0px 2px 6px hsl(0, 0%, 0%, 33%), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-3: 0px 1px 3px hsl(0, 0%, 0%, 50%), 0px 2px 12px hsl(0, 0%, 0%, 50%), inset 0px 0px 0px 1px var(--color-panel-contrast); } .tl-counter-scaled { transform: scale(var(--tl-scale)); transform-origin: top left; width: calc(100% * var(--tl-zoom)); height: calc(100% * var(--tl-zoom)); } .tl-container, .tl-container * { -webkit-touch-callout: none; -webkit-tap-highlight-color: transparent; scrollbar-highlight-color: transparent; -webkit-user-select: none; -moz-user-select: none; user-select: none; box-sizing: border-box; outline: none; } .tl-container a { -webkit-touch-callout: initial; } .tl-container__focused { outline: 1px solid var(--color-low); } input, *[contenteditable], *[contenteditable] * { -webkit-user-select: text; } /* -------------------------------------------------- */ /* Canvas */ /* -------------------------------------------------- */ .tl-canvas { position: absolute; inset: 0px; height: 100%; width: 100%; color: var(--color-text); cursor: var(--tl-cursor); overflow: clip; content-visibility: auto; touch-action: none; contain: strict; } .tl-shapes { position: relative; z-index: var(--layer-canvas-shapes); } .tl-overlays { position: absolute; top: 0px; left: 0px; height: 100%; width: 100%; contain: strict; pointer-events: none; z-index: var(--layer-canvas-overlays); } .tl-overlays__item { position: absolute; top: 0px; left: 0px; overflow: visible; pointer-events: none; transform-origin: top left; } .tl-svg-context { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; pointer-events: none; } /* ------------------- Background ------------------- */ .tl-background__wrapper { z-index: var(--layer-canvas-background); position: absolute; inset: 0px; height: 100%; width: 100%; } .tl-background { background-color: var(--color-background); width: 100%; height: 100%; } /* --------------------- Grid Layer --------------------- */ .tl-grid { position: absolute; inset: 0px; width: 100%; height: 100%; touch-action: none; pointer-events: none; z-index: var(--layer-canvas-grid); contain: strict; } .tl-grid-dot { fill: var(--color-grid); } /* --------------------- Layers --------------------- */ .tl-html-layer { position: absolute; top: 0px; left: 0px; width: 1px; height: 1px; contain: layout style size; } /* ---------------------- Brush --------------------- */ .tl-brush { stroke-width: calc(var(--tl-scale) * 1px); contain: size layout; } .tl-brush__default { stroke: var(--color-brush-stroke); fill: var(--color-brush-fill); } /* -------------------- Scribble -------------------- */ .tl-scribble { stroke-linejoin: round; stroke-linecap: round; pointer-events: none; contain: size layout; } /* ---------------------- Shape --------------------- */ .tl-shape { position: absolute; pointer-events: none; overflow: visible; transform-origin: top left; contain: size layout; } /* ---------------- Shape Containers ---------------- */ .tl-svg-container { position: absolute; inset: 0px; height: 100%; width: 100%; pointer-events: none; stroke-linecap: round; stroke-linejoin: round; transform-origin: top left; overflow: visible; } .tl-html-container { position: absolute; inset: 0px; height: 100%; width: 100%; pointer-events: none; stroke-linecap: round; stroke-linejoin: round; /* content-visibility: auto; */ transform-origin: top left; color: inherit; } /* --------------- Overlay Stack --------------- */ /* back of the stack, behind user's stuff */ .tl-collaborator__scribble { z-index: var(--layer-overlays-collaborator-scribble); } .tl-collaborator__brush { z-index: var(--layer-overlays-collaborator-brush); } .tl-collaborator__shape-indicator { z-index: var(--layer-overlays-collaborator-shape-indicator); } .tl-user-scribble { z-index: var(--layer-overlays-user-scribble); } .tl-user-brush { z-index: var(--layer-overlays-user-brush); } .tl-user-indicator__selected { z-index: var(--layer-overlays-user-indicator-selected); } .tl-user-indicator__hovered { z-index: var(--layer-overlays-user-indicator-hovered); } .tl-user-handles { z-index: var(--layer-overlays-user-handles); } .tl-user-snapline { z-index: var(--layer-overlays-user-snapline); } .tl-selection__fg { pointer-events: none; z-index: var(--layer-overlays-selection-fg); } .tl-user-indicator__hint { z-index: var(--layer-overlays-user-indicator-hint); stroke-width: calc(2.5px * var(--tl-scale)); } /* behind collaborator cursor */ .tl-collaborator__cursor-hint { z-index: var(--layer-overlays-collaborator-cursor-hint); } .tl-collaborator__cursor { z-index: var(--layer-overlays-collaborator-cursor); } .tl-cursor { overflow: visible; } /* -------------------- Indicator ------------------- */ .tl-shape-indicator { transform-origin: top left; fill: none; stroke-width: calc(1.5px * var(--tl-scale)); contain: size layout; } /* ------------------ SelectionBox ------------------ */ .tl-selection__bg { position: absolute; top: 0px; left: 0px; transform-origin: top left; background-color: transparent; pointer-events: all; } .tl-selection__fg__outline { fill: none; pointer-events: none; stroke: var(--color-selection-stroke); stroke-width: calc(1.5px * var(--tl-scale)); } .tl-corner-handle { pointer-events: none; stroke: var(--color-selection-stroke); fill: var(--color-background); stroke-width: calc(1.5px * var(--tl-scale)); } .tl-text-handle { pointer-events: none; fill: var(--color-selection-stroke); } .tl-corner-crop-handle { pointer-events: none; fill: none; stroke: var(--color-selection-stroke); } .tl-corner-crop-edge-handle { pointer-events: none; fill: none; stroke: var(--color-selection-stroke); } .tl-mobile-rotate__bg { pointer-events: all; cursor: var(--tl-cursor-grab); } .tl-mobile-rotate__fg { pointer-events: none; stroke: var(--color-selection-stroke); fill: var(--color-background); stroke-width: calc(1.5px * var(--tl-scale)); } .tl-transparent { fill: transparent; stroke: transparent; } /* --------------------- Handles -------------------- */ .tl-handle { pointer-events: all; } .tl-handle__bg { fill: transparent; stroke: transparent; pointer-events: all; } .tl-handle__fg { fill: var(--color-selected-contrast); stroke: var(--color-selection-stroke); stroke-width: calc(1.5px * var(--tl-scale)); pointer-events: none; } .tl-handle__create { opacity: 0; } .tl-handle__clone > .tl-handle__fg { fill: var(--color-selection-stroke); stroke: none; } .tl-handle__bg:active { fill: none; } @media (pointer: coarse) { .tl-handle__bg:active { fill: var(--color-selection-fill); } .tl-handle__create { opacity: 1; } } /* ------------------ Bounds Detail ----------------- */ .tl-image, .tl-video { -o-object-fit: cover; object-fit: cover; background-size: cover; width: 100%; height: 100%; } .tl-video.tl-video-is-fullscreen { -o-object-fit: contain; object-fit: contain; background-size: contain; } .tl-video-container, .tl-image-container, .tl-embed-container { width: 100%; height: 100%; pointer-events: all; /* background-color: var(--color-background); */ display: flex; justify-content: center; align-items: center; } .tl-image-container { position: relative; overflow: hidden; } .tl-image { position: absolute; inset: 0; } .tl-image__tg { --scale: calc(min(2, var(--tl-scale))); position: absolute; top: calc(var(--scale) * 8px); right: calc(var(--scale) * 8px); font-size: 10px; transform-origin: top right; background-color: var(--color-background); padding: 2px 4px; border-radius: var(--radius-1); } /* --------------------- Nametag -------------------- */ .tl-collaborator-cursor { position: absolute; } .tl-nametag { top: 16px; left: 13px; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; max-width: 120px; padding: 3px 6px; white-space: nowrap; position: absolute; overflow: hidden; text-overflow: ellipsis; font-size: 12px; font-family: var(--font-body); border-radius: var(--radius-2); color: var(--color-selected-contrast); } .tl-nametag-title { top: -2px; left: 13px; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; padding: 0px 6px; max-width: 120px; white-space: nowrap; position: absolute; overflow: hidden; text-overflow: ellipsis; font-size: 12px; font-family: var(--font-body); text-shadow: var(--tl-text-outline); color: var(--color-selected-contrast); } .tl-nametag-chat { top: 16px; left: 13px; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; color: var(--color-selected-contrast); white-space: nowrap; position: absolute; padding: 3px 6px; font-size: 12px; font-family: var(--font-body); opacity: 1; border-radius: var(--radius-2); } .tl-cursor-chat { position: absolute; color: var(--color-selected-contrast); white-space: nowrap; padding: 3px 6px; font-size: 12px; font-family: var(--font-body); pointer-events: none; z-index: var(--layer-cursor); margin-top: 16px; margin-left: 13px; opacity: 1; border: none; -webkit-user-select: text; -moz-user-select: text; user-select: text; border-radius: var(--radius-2); } .tl-cursor-chat .tl-cursor-chat__bubble { padding-right: 12px; } .tl-cursor-chat::-moz-selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } .tl-cursor-chat::selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } .tl-cursor-chat-fade { /* Setting to zero causes it to immediately disappear */ /* Setting to near-zero causes it to fade out gradually */ opacity: 0.0001; transition: opacity 5s ease-in-out; } .tl-cursor-chat::-moz-placeholder { color: var(--color-selected-contrast); opacity: 0.7; } .tl-cursor-chat::placeholder { color: var(--color-selected-contrast); opacity: 0.7; } /* -------------------------------------------------- */ /* Spinner */ /* -------------------------------------------------- */ @keyframes spinner { to { transform: rotate(360deg); } } /* ------------------- Text Shape ------------------- */ .tl-text-shape-label { position: relative; font-weight: normal; min-width: 1px; padding: 0px; margin: 0px; border: none; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; font-variant: normal; font-style: normal; pointer-events: all; white-space: pre-wrap; overflow-wrap: break-word; text-shadow: var(--tl-text-outline); } .tl-text-wrapper[data-font='draw'] { font-family: var(--tl-font-draw); } .tl-text-wrapper[data-font='sans'] { font-family: var(--tl-font-sans); } .tl-text-wrapper[data-font='serif'] { font-family: var(--tl-font-serif); } .tl-text-wrapper[data-font='mono'] { font-family: var(--tl-font-mono); } .tl-text-wrapper[data-align='start'], .tl-text-wrapper[data-align='start-legacy'] { text-align: left; } .tl-text-wrapper[data-align='middle'], .tl-text-wrapper[data-align='middle-legacy'] { text-align: center; } .tl-text-wrapper[data-align='end'], .tl-text-wrapper[data-align='end-legacy'] { text-align: right; } .tl-text-wrapper[data-isediting='true'] .tl-text-content { opacity: 0; } .tl-text { /* remove overflow from textarea on windows */ margin: 0px; padding: 0px; -webkit-appearance: auto; -moz-appearance: auto; appearance: auto; background: none; -o-border-image: none; border-image: none; border: 0px; caret-color: var(--color-text); color: inherit; -moz-column-count: initial !important; column-count: initial !important; display: inline-block; font-family: inherit; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: inherit; font-stretch: 100%; font-style: inherit; font-variant: inherit; font-variation-settings: normal; font-weight: inherit; letter-spacing: inherit; line-height: inherit; outline: none; overflow-wrap: break-word; text-align: inherit; text-indent: 0px; text-rendering: auto; text-shadow: inherit; text-transform: none; white-space: pre-wrap; line-break: normal; word-spacing: 0px; word-wrap: break-word; writing-mode: horizontal-tb !important; } .tl-text-measure { position: absolute; z-index: var(--layer-canvas-hidden); top: 0px; left: 0px; opacity: 0; width: -moz-max-content; width: max-content; box-sizing: border-box; pointer-events: none; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; resize: none; border: none; -moz-user-select: none; user-select: none; contain: style paint; -webkit-user-select: none; } .tl-text-input, .tl-text-content { position: absolute; inset: 0px; height: 100%; width: 100%; min-width: 1px; min-height: 1px; overflow: visible; outline: none; } .tl-text-content__wrapper { position: relative; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; display: flex; align-items: center; justify-content: center; pointer-events: none; min-height: auto; } .tl-text-content { pointer-events: none; } .tl-text-input { resize: none; -moz-user-select: all; user-select: all; -webkit-user-select: text; overflow: hidden; cursor: var(--tl-cursor-text); } .tl-text-wrapper[data-isediting='false'] .tl-text-input, .tl-arrow-label[data-isediting='false'] .tl-text-input { opacity: 0; cursor: var(--tl-cursor-default); } .tl-text-input::-moz-selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } .tl-text-input::selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } /* ------------------- Snap Lines ------------------- */ .tl-snap-indicator { stroke: var(--color-accent); stroke-width: calc(1px * var(--tl-scale)); fill: none; } .tl-snap-point { stroke: var(--color-accent); stroke-width: calc(1px * var(--tl-scale)); fill: none; } /* -------------------- Groups ------------------ */ .tl-group { stroke: var(--color-text); stroke-width: calc(1px * var(--tl-scale)); opacity: 0.5; } /* ------------------- Bookmark Shape ------------------- */ .tl-bookmark__container { width: 100%; height: 100%; position: relative; border: 1px solid var(--color-panel-contrast); background-color: var(--color-panel); border-radius: var(--radius-2); display: flex; flex-direction: column; overflow: hidden; } .tl-bookmark__container--safariExport { border: 1px solid var(--color-divider); } .tl-bookmark__image_container { flex: 1 1 100%; overflow: hidden; border-top-left-radius: var(--radius-1); border-top-right-radius: var(--radius-1); width: 100%; height: 100%; display: flex; justify-content: flex-end; align-items: flex-start; } .tl-bookmark__image_container > .tl-hyperlink-button::after { background-color: var(--color-panel); } .tl-bookmark__placeholder { width: 100%; height: 100%; background-color: var(--color-muted-2); border-bottom: 1px solid var(--color-muted-2); } .tl-bookmark__image { width: 100%; height: 100%; -o-object-fit: cover; object-fit: cover; -o-object-position: center; object-position: center; border-bottom: 1px solid var(--color-muted-2); } .tl-bookmark__copy_container { background-color: var(--color-muted); padding: var(--space-4); pointer-events: all; display: flex; flex-direction: column; justify-content: space-between; flex: 1; } .tl-bookmark__heading, .tl-bookmark__description, .tl-bookmark__link { margin: 0px; width: 100%; font-family: inherit; } .tl-bookmark__heading { font-size: 16px; line-height: 1.5; font-weight: bold; padding-bottom: var(--space-2); overflow: hidden; max-height: calc((16px * 1.5) * 2); -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; text-overflow: ellipsis; display: -webkit-box; } .tl-bookmark__description { font-size: 12px; line-height: 1.5; overflow: hidden; max-height: calc((12px * 1.5) * 3); -webkit-box-orient: vertical; -webkit-line-clamp: 3; line-clamp: 3; text-overflow: ellipsis; display: -webkit-box; color: var(--color-text-2); margin: var(--space-2) 0px; } .tl-bookmark__heading + .tl-bookmark__link, .tl-bookmark__description + .tl-bookmark__link { margin-top: var(--space-3); } .tl-bookmark__link { font-size: 12px; pointer-events: all; display: flex; color: var(--color-text-2); align-items: center; cursor: var(--tl-cursor-pointer); width: -moz-fit-content; width: fit-content; max-width: 100%; } .tl-bookmark__link > span { flex-shrink: 0px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .tl-bookmark__link > .tl-hyperlink__icon { margin-right: 8px; flex-shrink: 0; } .tl-bookmark__link > .tl-bookmark__favicon { margin-right: 8px; width: 16px; height: 16px; flex-shrink: 0; } /* ---------------- Hyperlink Button ---------------- */ .tl-hyperlink-button { background: none; margin: 0px; position: absolute; top: 0px; right: 0px; height: 44px; width: 44px; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 400; color: var(--color-text-1); padding: 13px; cursor: var(--tl-cursor-pointer); border: none; outline: none; pointer-events: all; z-index: 1; } .tl-hyperlink-button::after { content: ''; z-index: -1; position: absolute; right: 6px; bottom: 6px; display: block; width: calc(100% - 12px); height: calc(100% - 12px); border-radius: var(--radius-1); background-color: var(--color-background); pointer-events: none; } .tl-hyperlink-button:focus-visible { color: var(--color-selected); } .tl-hyperlink__icon { width: 16px; height: 16px; background-color: currentColor; pointer-events: none; } .tl-hyperlink-button__hidden { display: none; } /* ---------------- Geo shape ---------------- */ .tl-text-label { display: flex; justify-content: center; align-items: center; color: var(--color-text); text-shadow: var(--tl-text-outline); line-height: inherit; position: absolute; inset: 0px; height: 100%; width: 100%; } .tl-text-label[data-hastext='false'][data-isediting='false'] > .tl-text-label__inner { width: 40px; height: 40px; } .tl-text-label[data-hastext='true'][data-isediting='false'] .tl-text-content { pointer-events: all; } .tl-text-wrapper .tl-text-content { pointer-events: all; z-index: var(--layer-text-content); } .tl-text-label__inner > .tl-text-content { position: relative; top: 0px; left: 0px; padding: inherit; height: -moz-fit-content; height: fit-content; width: -moz-fit-content; width: fit-content; border-radius: var(--radius-1); max-width: 100%; } .tl-text-label__inner > .tl-text-input { position: absolute; inset: 0px; height: 100%; width: 100%; padding: inherit; } .tl-text-wrapper[data-isselected='true'] .tl-text-input { z-index: var(--layer-text-editor); pointer-events: all; } /* This part of the rule helps preserve the occlusion rules for the shapes so we * don't click on shapes that are behind other shapes. * One extra nuance is we don't use this behavior for: * - arrows which have weird geometry and just gets in the way. * - draw/line shapes, because it feels restrictive to have them be 'in the way' of clicking on a textfield * - shapes that are not filled */ .tl-canvas:is([data-iseditinganything='true'], [data-isselectinganything='true']) .tl-shape:not( [data-shape-type='arrow'], [data-shape-type='draw'], [data-shape-type='line'], [data-shape-type='highlight'], [data-shape-is-filled='false'] ) { pointer-events: all; } .tl-text-label[data-textwrap='true'] > .tl-text-label__inner { max-width: 100%; } .tl-text-label[data-isediting='true'] { background-color: transparent; min-height: auto; } .tl-text-label[data-isediting='true'] p { opacity: 0; } .tl-arrow-hint { stroke: var(--color-text-1); fill: none; stroke-linecap: round; overflow: visible; } /* ------------------- Arrow Shape ------------------ */ .tl-arrow-label { position: absolute; top: -1px; left: -1px; width: 2px; height: 2px; padding: 0px; display: flex; justify-content: center; align-items: center; text-align: center; color: var(--color-text); text-shadow: var(--tl-text-outline); } .tl-arrow-label[data-isediting='true'] p { opacity: 0; } .tl-arrow-label[data-isediting='true'] > .tl-arrow-label__inner { background-color: var(--color-background); } .tl-arrow-label__inner { border-radius: var(--radius-1); box-sizing: content-box; position: relative; height: -moz-max-content; height: max-content; width: -moz-max-content; width: max-content; pointer-events: none; display: flex; justify-content: center; align-items: center; } .tl-arrow-label .tl-arrow { position: relative; height: -moz-max-content; height: max-content; padding: inherit; overflow: visible; } .tl-arrow-label textarea { padding: inherit; /* Don't allow textarea to be zero width */ min-width: 4px; } /* -------------------- NoteShape ------------------- */ .tl-note__container { position: relative; width: 100%; height: 100%; pointer-events: all; opacity: 1; z-index: var(--layer-text-container); border-radius: 1px; } .tl-note__container > .tl-text-label { text-shadow: none; color: currentColor; } /* --------------------- Loading -------------------- */ .tl-loading { background-color: var(--color-background); color: var(--color-text-1); height: 100%; width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: var(--space-2); font-size: 14px; font-weight: 500; opacity: 0; animation: fade-in 0.2s ease-in-out forwards; animation-delay: 0.2s; } @keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; } } /* -------------------- FrameShape ------------------- */ .tl-frame__body { stroke-width: calc(1px * var(--tl-scale)); } .tl-frame__creating { stroke: var(--color-selected); fill: none; } .tl-frame-heading { display: flex; align-items: center; position: absolute; transform-origin: 0% 100%; overflow: hidden; max-width: 100%; min-width: 32px; height: auto; font-size: 12px; padding-bottom: 4px; pointer-events: all; } .tl-frame-heading-hit-area { pointer-events: all; /* scale from bottom left corner so we can pin it to the top left corner of the frame */ transform-origin: 0% 100%; display: flex; height: 100%; width: 100%; align-items: center; border-radius: var(--radius-1); background-color: var(--color-background); } .tl-frame-label { pointer-events: all; overflow: hidden; text-overflow: ellipsis; padding: var(--space-3) var(--space-3); position: relative; font-size: inherit; white-space: pre; border: 1px solid transparent; } .tl-frame-label__editing { color: transparent; white-space: pre; width: auto; overflow: visible; background-color: var(--color-panel); border-radius: var(--radius-1); border-color: var(--color-selected); } .tl-frame-name-input { position: absolute; border: none; background: none; outline: none; padding: var(--space-3) var(--space-3); inset: 0px; height: 100%; font-size: inherit; font-family: inherit; font-weight: inherit; width: 100%; color: var(--color-text-1); border-radius: var(--radius-1); -moz-user-select: all; user-select: all; -webkit-user-select: text; white-space: pre; cursor: var(--tl-cursor-text); } /* 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) { .tl-frame-heading { font-size: 16px; } } /* ------------------ iFrames Detail ----------------- */ .tl-embed { border: none; border-radius: var(--radius-2); } /* -------------- Shape Error Boundary -------------- */ .tl-shape-error-boundary { width: 100%; height: 100%; background-color: var(--color-muted-1); border-width: calc(1px * var(--tl-scale)); border-color: var(--color-muted-1); border-style: solid; border-radius: calc(var(--radius-1) * var(--tl-scale)); display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: left; position: relative; pointer-events: all; overflow: hidden; padding: var(--space-2); } .tl-shape-error-boundary::before { transform: scale(var(--tl-scale)); content: 'Error'; font-size: 12px; font-family: inherit; color: var(--color-text-0); } /* ----------------- Error Boundary ----------------- */ .tl-error-boundary { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; padding: var(--space-4); background-color: var(--color-background); color: var(--color-text-1); position: absolute; } .tl-error-boundary__overlay { position: absolute; inset: 0px; height: 100%; width: 100%; z-index: var(--layer-error-overlay); background-color: var(--color-overlay); } .tl-error-boundary__content * { -moz-user-select: all; user-select: all; -webkit-user-select: text; pointer-events: all; } .tl-error-boundary__canvas { pointer-events: none; position: absolute; inset: 0px; height: 100%; width: 100%; z-index: var(--layer-error-canvas); } /* some browsers seem to have some weird interactions between stacking contexts and pointer-events. this ::after pseudo element covers the canvas and prevents it from receiving any pointer events or affecting the cursor. */ .tl-error-boundary__canvas::after { content: ' '; display: block; position: absolute; inset: 0px; height: 100%; width: 100%; z-index: var(--layer-error-canvas-after); pointer-events: all; } .tl-error-boundary__content { width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; max-width: 100%; width: 400px; max-height: 100%; background-color: var(--color-panel); padding: 16px; border-radius: 16px; box-shadow: var(--shadow-2); font-size: 14px; font-weight: 400; display: flex; flex-direction: column; overflow: auto; z-index: var(--layer-error-content); gap: 12px; } .tl-error-boundary__content__expanded { width: 600px; } .tl-error-boundary__content h2 { font-size: 16px; margin: 0px; font-weight: 500; } .tl-error-boundary__content h4 { border: 1px solid var(--color-low-border); margin: -6px 0 0 0; padding: var(--space-5); border-radius: var(--radius-2); font-weight: normal; } .tl-error-boundary__content p { line-height: 1.5; margin: 0px; } .tl-error-boundary__content pre { background-color: var(--color-muted-2); margin-top: 0; padding: var(--space-5); border-radius: var(--radius-2); overflow: auto; font-size: 12px; max-height: 320px; } .tl-error-boundary__content button { background: none; border: none; font-family: inherit; font-size: 14px; font-weight: 500; padding: var(--space-4); border-radius: var(--radius-3); cursor: var(--tl-cursor-pointer); color: inherit; background-color: transparent; } .tl-error-boundary__content a { color: var(--color-selected); font-weight: 500; text-decoration: none; } .tl-error-boundary__content__error { position: relative; margin: -6px 0 0 0; } .tl-error-boundary__content__error button { position: absolute; top: var(--space-2); right: var(--space-2); font-size: 12px; padding: var(--space-2) var(--space-3); background-color: var(--color-panel); border-radius: var(--radius-1); } .tl-error-boundary__content__actions { display: flex; justify-content: space-between; gap: var(--space-4); margin: 0px; margin-left: -4px; } .tl-error-boundary__content__actions__group { display: flex; gap: var(--space-4); } .tl-error-boundary__content .tl-error-boundary__reset { color: var(--color-warn); } .tl-error-boundary__content .tl-error-boundary__refresh { background-color: var(--color-primary); color: var(--color-selected-contrast); } /* --------------------- Coarse --------------------- */ .tl-hidden { opacity: 0; pointer-events: none; } .debug__ui-logger { position: absolute; top: 62px; left: 16px; color: #555; font-size: 12px; font-family: monospace; } /* ---------------- Hit test blocker ---------------- */ .tl-hit-test-blocker { position: absolute; z-index: var(--layer-canvas-blocker); inset: 0px; width: 100%; height: 100%; pointer-events: all; } .tl-hit-test-blocker__hidden { display: none; } @media (hover: hover) { .tl-handle__create:hover { opacity: 1; } .tl-handle__bg:hover { cursor: var(--tl-cursor-grab); fill: var(--color-selection-fill); } .tl-bookmark__link:hover { color: var(--color-selected); } .tl-hyperlink-button:hover { color: var(--color-selected); } .tl-error-boundary__content button:hover { background-color: var(--color-low); } .tl-error-boundary__content a:hover { color: var(--color-text-1); } .tl-error-boundary__content .tl-error-boundary__refresh:hover { background-color: var(--color-primary); opacity: 0.9; } /* These three rules help preserve clicking into specific points in text areas *while* * already in edit mode when jumping from shape to shape. */ .tl-canvas[data-iseditinganything='true'] .tl-text-wrapper:hover .tl-text-input { z-index: var(--layer-text-editor); pointer-events: all; } } /* @tldraw/ui */ .tl-container { --layer-above: 1; --layer-focused-input: 10; --layer-menu-click-capture: 250; --layer-panels: 300; --layer-menus: 400; --layer-toasts: 650; --layer-cursor: 700; --layer-header-footer: 999; --layer-following-indicator: 1000; } /* -------------------------------------------------- */ /* UI Refresh */ /* -------------------------------------------------- */ /* Button */ .tlui-button { position: relative; height: 40px; min-width: 40px; padding: 0px 12px; display: flex; align-items: center; justify-content: center; background-color: transparent; border: transparent; color: currentColor; cursor: pointer; pointer-events: all; font-weight: inherit; font-family: inherit; line-height: inherit; text-rendering: optimizeLegibility; font-size: 12px; gap: 0px; color: var(--color-text-1); } .tlui-button:disabled { color: var(--color-text-3); text-shadow: none; cursor: default; } .tlui-button:disabled .tlui-kbd { color: var(--color-text-3); } .tlui-button > * { position: relative; z-index: var(--layer-above); } .tlui-button__label { font-size: 12px; flex-grow: 2; text-align: left; } .tlui-button:focus-visible:not(:hover) { /* todo: fix the indicator errors in radix dropdown menus before restoring */ /* outline: 1px solid var(--color-selected); */ outline: none; outline-offset: -4px; border-radius: var(--radius-3); } .tlui-button::after { display: block; content: ''; position: absolute; inset: 4px; background-color: transparent; border-radius: var(--radius-2); } .tlui-button[aria-expanded='true']::after { background-color: var(--color-muted-0); opacity: 1; } .tlui-button__icon + .tlui-button__label { margin-left: var(--space-2); } @media (hover: hover) { .tlui-button:not(.tlui-menu__submenu__trigger)::after, .tlui-button.tlui-menu__submenu__trigger[data-highlighted]::after { background-color: var(--color-muted-2); opacity: 0; } .tlui-button:not(:disabled):hover::after { opacity: 1; } } .tlui-button[data-state='hinted']::after { background-color: var(--color-hint); opacity: 1; } .tlui-button[data-state='hinted']:not(:disabled, :focus-visible):active:after { background: var(--color-hint); opacity: 1; } /* Low button */ .tlui-button__low { border-radius: var(--radius-3); background-color: var(--color-low); } @media (hover: hover) { .tlui-button__low::after { background-color: var(--color-muted-2); } } /* Primary / danger buttons */ .tlui-button__primary { color: var(--color-primary); } .tlui-button__danger { color: var(--color-warn); text-shadow: none; } @media (hover: hover) { .tlui-button__primary:not(:disabled, :focus-visible):hover { color: var(--color-primary); } .tlui-button__danger:not(:disabled, :focus-visible):hover { color: var(--color-warn); text-shadow: none; } } /* Panel button */ .tlui-button__panel { position: relative; } /* Menu button */ .tlui-button__menu { height: 40px; min-height: 40px; width: 100%; gap: 8px; margin: -4px 0px; } .tlui-button__menu:nth-child(1) { margin-top: 0px; } .tlui-button__menu:nth-last-child(1) { margin-bottom: 0px; } @media (hover: hover) { .tlui-button__menu::after { inset: 4px; border-radius: var(--radius-2); } } /* Menu checkbox button */ .tlui-button__checkbox { padding-left: 8px; } .tlui-button__checkbox__indicator { width: 15px; height: 15px; } /* Tool lock button */ .tlui-toolbar__lock-button { position: absolute; top: 4px; right: 0px; pointer-events: all; height: 40px; width: 40px; min-width: 0px; border-radius: var(--radius-2); } .tlui-toolbar__lock-button::after { top: 4px; left: 8px; inset: 4px; } /* Tool button */ .tlui-button__tool { position: relative; height: 48px; width: 48px; margin-left: -2px; margin-right: -2px; } .tlui-button__tool:focus-visible:not(:hover) { border-radius: 12px; } .tlui-button__tool:nth-of-type(1) { margin-left: 0px; } .tlui-button__tool:nth-last-of-type(1) { margin-right: 0px; } @media (hover: hover) { .tlui-button__tool::after { inset: 4px; border-radius: 8px; } .tlui-button__tool[aria-checked='true']:not(:disabled, :focus-visible):hover { color: var(--color-selected-contrast); } } .tlui-button__tool[aria-checked='true'] { color: var(--color-selected-contrast); } .tlui-button__tool[aria-checked='true']:not(:disabled, :focus-visible):active { color: var(--color-selected-contrast); } .tlui-button__tool[aria-checked='true']:not(:disabled)::after { background: var(--color-selected); opacity: 1; } .tlui-layout__mobile .tlui-button__tool { height: 48px; width: 43px; } .tlui-layout__mobile .tlui-button__tool > .tlui-icon { height: 16px; width: 16px; } /* Help */ .tlui-button__help { height: 32px; width: 32px; padding: 0px; min-width: 32px; border-radius: 100%; background-color: var(--color-low); border: 1px solid var(--color-low-border); } @media (hover: hover) { .tlui-button__help::after { background-color: var(--color-muted-2); border-radius: 100%; inset: 4px; } } /* Button Row */ .tlui-buttons__horizontal { display: flex; flex-direction: row; } .tlui-buttons__horizontal > * { margin-left: -2px; margin-right: -2px; } .tlui-buttons__horizontal > *:nth-child(1) { margin-left: 0px; } .tlui-buttons__horizontal > *:nth-last-child(1) { margin-right: 0px; } /* Button Grid */ .tlui-buttons__grid { display: grid; grid-template-columns: repeat(4, auto); grid-auto-flow: row; overflow: hidden; } .tlui-buttons__grid > .tlui-button { margin: -2px; } .tlui-buttons__grid > .tlui-button:nth-of-type(4n) { margin-right: 0px; } .tlui-buttons__grid > .tlui-button:nth-of-type(4n - 3) { margin-left: 0px; } .tlui-buttons__grid > .tlui-button:nth-of-type(-n + 4) { margin-top: 0px; } .tlui-buttons__grid > .tlui-button:nth-last-of-type(-n + 4) { margin-bottom: 0px; } /* Zoom button */ .tlui-zoom-menu__button__pct { width: 60px; min-width: 60px; text-align: center; } /* --------------------- 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; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; contain: strict; z-index: var(--layer-panels); -webkit-transform: translate3d(0, 0, 0); --sab: env(safe-area-inset-bottom); font-weight: 500; line-height: 1.6; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-smooth: antialiased; text-rendering: optimizeLegibility; } .tlui-layout__top { grid-column: 1; grid-row: 1; display: flex; min-width: 0px; justify-content: space-between; } .tlui-layout__top__left { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; width: 100%; height: 100%; flex: 0 1 0; } .tlui-layout__top__right { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-start; height: 100%; flex: 0 0 auto; min-width: 0px; } .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: -moz-min-content; width: min-content; gap: var(--space-3); margin: var(--space-2) var(--space-3); white-space: nowrap; pointer-events: none; z-index: var(--layer-panels); } /* ---------------------- Icon ---------------------- */ .tlui-icon { flex-shrink: 0; width: 18px; height: 18px; background-color: currentColor; } .tlui-icon__placeholder { flex-shrink: 0; width: 18px; height: 18px; background-color: transparent; } .tlui-icon__small { width: 15px; height: 15px; } /* --------------------- Slider --------------------- */ .tlui-slider { position: relative; display: flex; align-items: center; -webkit-user-select: none; -moz-user-select: none; user-select: none; touch-action: none; } .tlui-slider__container { width: 100%; 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: 14px; } .tlui-slider__range { position: absolute; top: calc(50% - 2px); left: 0px; height: 3px; background-color: var(--color-selected); border-radius: 14px; } .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-1); } .tlui-slider__thumb:active { cursor: grabbing; box-shadow: inset 0px 0px 0px 2px var(--color-text-1), 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); align-self: bottom; color: var(--color-text-1); margin-left: var(--space-4); } .tlui-kbd > span { width: 100%; text-align: center; display: inline; margin: 0px; padding: 2px; border-radius: 2px; } .tlui-kbd > span:last-child { padding-right: 0; } .tlui-kbd:not(:last-child) { margin-right: var(--space-2); } /* Focus Mode Button */ .tlui-focus-button { z-index: var(--layer-panels); pointer-events: all; } /* --------------------- 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-3); 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 { background-color: var(--color-low); width: 100%; display: grid; align-items: center; grid-template-columns: 1fr auto auto auto; justify-content: space-between; padding-left: var(--space-4); border-top: 1px solid var(--color-background); font-size: 12px; color: var(--color-text-1); z-index: var(--layer-panels); pointer-events: all; } .tlui-debug-panel__current-state { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .tlui-debug-panel__fps { margin-right: 8px; } .tlui-debug-panel__fps__slow { font-weight: bold; color: var(--color-warn); } /* -------------------- Menu Zone ------------------- */ .tlui-menu-zone { position: relative; z-index: var(--layer-panels); width: -moz-fit-content; width: fit-content; border-right: 2px solid var(--color-background); border-bottom: 2px solid var(--color-background); border-bottom-right-radius: var(--radius-4); 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%); } /* ------------------- Style Panel ------------------ */ .tlui-style-panel__wrapper { box-shadow: var(--shadow-2); border-radius: var(--radius-3); pointer-events: all; background-color: var(--color-panel); height: -moz-fit-content; height: fit-content; max-height: 100%; margin: 8px; margin-top: 4px; touch-action: auto; overscroll-behavior: none; overflow-y: auto; overflow-x: hidden; color: var(--color-text); } /* if the style panel is the only child (ie no share menu), increase the margin */ .tlui-style-panel__wrapper:only-child { margin-top: 8px; } .tlui-style-panel { position: relative; z-index: var(--layer-panels); pointer-events: all; width: 148px; max-width: 148px; } .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; } /* Only really used for the alignment picker */ .tlui-style-panel__row__extra-button { margin-left: -2px; } .tlui-style-panel__double-select-picker { display: flex; grid-template-columns: 1fr auto; align-items: center; padding-left: var(--space-4); color: var(--color-text-1); font-size: 12px; } .tlui-style-panel__double-select-picker-label { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; flex-grow: 2; max-width: 100%; } .tlui-style-panel__section *[data-state='open']::after { background: var(--color-muted-0); } /* ---------------------- Input --------------------- */ .tlui-input { background: none; margin: 0px; position: relative; z-index: var(--layer-above); height: 40px; max-height: 40px; display: flex; align-items: center; justify-content: center; font-family: inherit; font-size: 12px; font-weight: inherit; color: var(--color-text-1); padding: var(--space-4); padding-left: 0px; border: none; outline: none; text-overflow: ellipsis; width: 100%; -webkit-user-select: all; -moz-user-select: all; user-select: all; text-rendering: optimizeLegibility; -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; } } } /* ---------------- Dialog ---------------- */ .tlui-dialog__overlay { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; z-index: var(--layer-canvas-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-3); font-size: 12px; overflow: hidden; min-width: 300px; max-width: 80%; max-height: 80%; } .tlui-dialog__header { position: relative; display: flex; align-items: center; flex: 0; z-index: var(--layer-header-footer); 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); } .tlui-dialog__header__close { justify-self: flex-end; } .tlui-dialog__body { padding: var(--space-4) var(--space-4); flex: 0 1; overflow-y: auto; overflow-x: hidden; color: var(--color-text-1); -moz-user-select: all; user-select: all; -webkit-user-select: text; } .tlui-dialog__body a { color: var(--color-selected); } .tlui-dialog__body ul, .tlui-dialog__body ol { padding-left: 16px; display: flex; flex-direction: column; gap: var(--space-4); } .tlui-dialog__footer { position: relative; z-index: var(--layer-header-footer); } .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; } /* --------------------- 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-3) + var(--sab)); } /* Centered Content */ .tlui-toolbar__inner { position: relative; width: -moz-fit-content; width: fit-content; display: flex; gap: var(--space-3); align-items: flex-end; } .tlui-toolbar__left { width: -moz-fit-content; width: fit-content; } /* Row of controls + lock button */ .tlui-toolbar__extras { position: relative; z-index: var(--layer-above); width: 100%; pointer-events: none; top: 6px; height: 48px; } .tlui-toolbar__extras:empty { display: none; } .tlui-toolbar__extras__controls { display: flex; position: relative; flex-direction: row; z-index: var(--layer-above); background-color: var(--color-low); border-top-left-radius: var(--radius-4); border-top-right-radius: var(--radius-4); border: 2px solid var(--color-background); margin-left: 8px; margin-right: 0px; pointer-events: all; width: -moz-fit-content; width: fit-content; } .tlui-toolbar__tools { display: flex; flex-direction: row; align-items: center; background-color: var(--color-low); border-radius: var(--radius-4); z-index: var(--layer-panels); pointer-events: all; position: relative; background: var(--color-panel); box-shadow: var(--shadow-2); } .tlui-toolbar__tools__list { display: flex; flex-direction: row; align-items: center; } .tlui-toolbar__overflow { width: 40px; } .tlui-layout__mobile .tlui-toolbar__overflow { width: 32px; padding: 0px; } .tlui-layout__mobile .tlui-toolbar *[data-state='open']::after { background: linear-gradient(0deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%); } /* -------------------- Help Zone ------------------- */ .tlui-help-menu { pointer-events: all; position: absolute; bottom: var(--space-2); right: var(--space-2); z-index: var(--layer-panels); border: 2px solid var(--color-background); 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:empty { display: none; } .tlui-menu { z-index: var(--layer-menus); height: -moz-fit-content; height: fit-content; width: -moz-fit-content; width: fit-content; max-height: 80vh; border-radius: var(--radius-3); 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 { width: 100%; } .tlui-menu__group:empty { display: none; } .tlui-menu__group { border-bottom: 1px solid var(--color-divider); } .tlui-menu__group:nth-last-of-type(1) { border-bottom: none; } .tlui-menu__submenu__trigger[data-state='open']:not(:hover)::after { border-radius: 0px; 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: 0px; background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%); } /* Menu Sizes */ .tlui-menu[data-size='large'] > .tlui-menu__group { min-width: initial; } .tlui-menu[data-size='medium'] > .tlui-menu__group { min-width: 144px; } .tlui-menu[data-size='small'] > .tlui-menu__group { min-width: 96px; } .tlui-menu[data-size='tiny'] > .tlui-menu__group { min-width: 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: 11px; padding-left: var(--space-4); color: var(--color-text-1); } .tlui-toast__container { min-width: 200px; display: flex; flex-direction: row; background-color: var(--color-panel); box-shadow: var(--shadow-2); border-radius: var(--radius-3); font-size: 12px; } .tlui-toast__container[data-severity='success'] .tlui-icon { color: var(--color-success); } .tlui-toast__container[data-severity='info'] .tlui-icon { color: var(--color-info); } .tlui-toast__container[data-severity='warning'] .tlui-icon { color: var(--color-warning); } .tlui-toast__container[data-severity='error'] .tlui-icon { color: var(--color-error); } .tlui-toast__main { flex-grow: 2; max-width: 280px; } .tlui-toast__content { padding: var(--space-4); display: flex; line-height: 1.4; flex-direction: column; gap: var(--space-3); } .tlui-toast__main[data-actions='true'] .tlui-toast__content { padding-bottom: var(--space-2); } .tlui-toast__title { font-weight: bold; color: var(--color-text-1); /* this makes the default toast look better */ line-height: 16px; } .tlui-toast__description { color: var(--color-text-1); padding: var(--space-3); margin: 0px; padding: 0px; } .tlui-toast__icon + .tlui-toast__main > .tlui-toast__actions { padding-left: 0px; } .tlui-toast__actions { display: flex; flex-direction: row; justify-content: flex-start; margin-left: 0; } .tlui-toast__close { align-self: flex-end; flex-shrink: 0; } @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; } } /* --------------------- Bottom --------------------- */ .tlui-layout__bottom { grid-row: 2; } .tlui-layout__bottom__main { width: 100%; position: relative; display: flex; align-items: flex-end; justify-content: center; } /* ------------------- Navigation ------------------- */ .tlui-navigation-panel { display: flex; width: -moz-min-content; width: min-content; flex-direction: column; z-index: var(--layer-panels); pointer-events: all; position: absolute; left: 0px; bottom: 0px; } .tlui-navigation-panel::before { content: ''; display: block; position: absolute; z-index: -1; inset: -2px -2px 0px 0px; border-radius: 0; border-top: 2px solid var(--color-background); border-right: 2px solid var(--color-background); border-top-right-radius: var(--radius-4); background-color: var(--color-low); } .tlui-navigation-panel__toggle .tlui-icon { opacity: 0.24; } .tlui-navigation-panel__toggle:active .tlui-icon { opacity: 1; } @media (hover: hover) { .tlui-navigation-panel__toggle:hover .tlui-icon { opacity: 1; } } .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%; } /* ----------------------- ... ---------------------- */ @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: 260px; height: -moz-fit-content; height: fit-content; max-height: 50vh; } .tlui-page-menu__trigger { width: 128px; } .tlui-page-menu__header { display: flex; flex-direction: row; align-items: center; width: 100%; height: 40px; padding-left: var(--space-4); 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; 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; flex-direction: column; max-height: 100%; overflow-x: hidden; overflow-y: auto; touch-action: auto; } .tlui-page-menu__item { position: relative; display: flex; flex-direction: row; align-items: center; justify-content: space-between; gap: 0px; } @media (hover: hover) { .tlui-page-menu__item::after { display: block; content: ''; background-color: var(--color-muted-2); position: absolute; inset: 4px; border-radius: 6px; pointer-events: none; opacity: 0; } .tlui-page-menu__item:hover::after { opacity: 1; } .tlui-page-menu__item:hover > .tlui-page_menu__item__submenu > .tlui-button { opacity: 1; } } /* Since we're adding an after hover effect to the page menu item, we want to hide the hovers on the individual buttons in the page menu item */ .tlui-page-menu__item__button::after, .tlui-page_menu__item__submenu > .tlui-button::after { display: none; } .tlui-page-menu__item:nth-of-type(n + 2) { margin-top: -4px; } .tlui-page-menu__item__button { width: 100%; } .tlui-page-menu__item__button:not(:only-child) { flex-grow: 2; margin-right: -2px; } .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: 35px; } .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: -moz-fit-content; height: fit-content; display: flex; flex-direction: row; align-items: center; overflow: hidden; z-index: var(--layer-above); } .tlui-page_menu__item__sortable__title { flex: 1; } .tlui-page_menu__item__sortable__title > .tlui-input__wrapper { height: 100%; } .tlui-page_menu__item__sortable:focus-within { z-index: var(--layer-focused-input); } .tlui-page_menu__item__sortable__handle { touch-action: none; width: 32px; min-width: 0px; height: 40px; 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: 12px; 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; margin-left: -2px; } .tlui-page_menu__item__submenu[data-isediting='true'] { display: block; opacity: 1; } .tlui-page_menu__item__submenu > .tlui-button { opacity: 0; } @media (any-pointer: coarse) { .tlui-page_menu__item__submenu > .tlui-button { opacity: 1; } } .tlui-button__icon { padding: 0px; } .tlui-page-menu__item__button .tlui-button__icon { margin-right: 4px; } @media (hover: hover) { .tlui-page_menu__item__submenu { display: block; } .tlui-page_menu__item__submenu[data-isediting='true'] > .tlui-button { opacity: 0; } .tlui-page_menu__item__submenu > .tlui-button[data-state='open'], .tlui-page_menu__item__submenu:hover > .tlui-button, .tlui-page_menu__item__sortable:focus-within > .tlui-page_menu__item__submenu > .tlui-button { 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; } .tlui-embed-dialog__list { display: flex; flex-direction: column; padding-bottom: var(--space-5); } .tlui-embed-dialog__item__image { 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); text-shadow: none; } .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); } .tlui-following-indicator { display: block; position: absolute; inset: 0px; border-width: 2px; border-style: solid; z-index: var(--layer-following-indicator); pointer-events: none; } /* ---------------- Offline Indicator --------------- */ .tlui-offline-indicator { display: flex; flex-direction: row; gap: var(--space-3); color: var(--color-text); background-color: var(--color-low); border: 3px solid var(--color-background); padding: 0px var(--space-5); height: 42px; align-items: center; justify-content: center; border-radius: 99px; opacity: 0; animation: fade-in; animation-duration: 0.12s; animation-delay: 2s; animation-fill-mode: forwards; } /* --------------- Keyboard shortcuts --------------- */ .tlui-shortcuts-dialog__header { border-bottom: 1px solid var(--color-divider); } .tlui-shortcuts-dialog__body { position: relative; -moz-columns: 3; columns: 3; -moz-column-gap: var(--space-9); column-gap: var(--space-9); pointer-events: all; touch-action: auto; /* Terrible fix to allow firefox users to scroll the dialog */ overflow-x: auto; } .tlui-shortcuts-dialog__body__tablet { -moz-columns: 2; columns: 2; } .tlui-shortcuts-dialog__body__mobile { -moz-columns: 1; columns: 1; } .tlui-shortcuts-dialog__group { -moz-column-break-inside: avoid; break-inside: avoid-column; padding-bottom: var(--space-6); } .tlui-shortcuts-dialog__group__title { font-size: inherit; font-weight: inherit; margin: 0px; color: var(--color-text-3); 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; } /* ------------------- Da share zone ------------------ */ .tlui-share-zone { padding: 0px 0px 0px 0px; display: flex; flex-direction: row; justify-content: flex-end; z-index: var(--layer-panels); align-items: center; padding-top: 2px; padding-right: 4px; } /* ------------------- People Menu ------------------- */ .tlui-people-menu__avatars-button { display: flex; align-items: center; justify-content: flex-end; background: none; border: none; cursor: pointer; pointer-events: all; border-radius: var(--radius-1); padding-right: 1px; height: 100%; } .tlui-people-menu__avatars { display: flex; flex-direction: row; } .tlui-people-menu__avatar { height: 24px; width: 24px; border: 2px solid var(--color-background); background-color: var(--color-low); border-radius: 100%; display: flex; align-items: center; justify-content: center; position: relative; font-size: 10px; font-weight: bold; color: var(--color-selected-contrast); z-index: 2; } .tlui-people-menu__avatar:nth-of-type(n + 2) { margin-left: -12px; } .tlui-people-menu__avatars-button[data-state='open'] { opacity: 1; } @media (hover: hover) { .tlui-people-menu__avatars-button:hover .tlui-people-menu__avatar { border-color: var(--color-low); } } .tlui-people-menu__more { min-width: 0px; font-size: 11px; font-weight: 600; color: var(--color-text-1); font-family: inherit; padding: 0px 4px; letter-spacing: 1.5; } .tlui-people-menu__more::after { border-radius: var(--radius-2); inset: 0px; } .tlui-people-menu__wrapper { position: relative; display: flex; flex-direction: column; width: 220px; height: -moz-fit-content; height: fit-content; max-height: 50vh; } .tlui-people-menu__section { position: relative; flex-direction: column; max-height: 100%; overflow-x: hidden; overflow-y: auto; touch-action: auto; } .tlui-people-menu__section:first-child, .tlui-people-menu__section:last-child { flex-shrink: 0; } .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 { 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 > .tlui-input__wrapper { width: auto; display: flex; align-items: auto; flex-grow: 2; gap: 8px; height: 100%; padding: 0px; } .tlui-people-menu__item { display: flex; justify-content: flex-start; width: 100%; } .tlui-people-menu__item__button { padding: 0 11px; } .tlui-people-menu__item > .tlui-button__menu { width: auto; display: flex; align-items: auto; justify-content: flex-start; flex-grow: 2; gap: 11px; } .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; } .tlui-people-menu__item__follow:hover .tlui-icon { opacity: 1; } } .tlui-menu-click-capture { position: fixed; inset: 0; z-index: var(--layer-menu-click-capture); } /* THIS CSS FILE IS GENERATED! DO NOT EDIT. OR EDIT. I'M A COMMENT NOT A COP */ /* This file is created by the copy-css-files.mjs script in packages/tldraw. */ /* It combines @tldraw/editor's editor.css and tldraw's ui.css */ /* @tldraw/editor */ .tl-container { font-size: 12px; /* Spacing */ --space-1: 2px; --space-2: 4px; --space-3: 8px; --space-4: 12px; --space-5: 16px; --space-6: 20px; --space-7: 28px; --space-8: 32px; --space-9: 64px; --space-10: 72px; /* Radius */ --radius-0: 2px; --radius-1: 4px; --radius-2: 6px; --radius-3: 9px; --radius-4: 11px; /* Canvas z-index */ --layer-canvas-hidden: -999999; --layer-canvas-background: 100; --layer-canvas-grid: 150; --layer-watermark: 200; --layer-canvas-shapes: 300; --layer-canvas-overlays: 500; --layer-canvas-blocker: 10000; /* Canvas overlays z-index */ --layer-overlays-collaborator-scribble: 10; --layer-overlays-collaborator-brush: 20; --layer-overlays-collaborator-shape-indicator: 30; --layer-overlays-user-scribble: 40; --layer-overlays-user-brush: 50; --layer-overlays-user-indicator-selected: 60; --layer-overlays-user-indicator-hovered: 70; --layer-overlays-user-handles: 80; --layer-overlays-user-snapline: 90; --layer-overlays-selection-fg: 100; --layer-overlays-user-indicator-hint: 110; --layer-overlays-collaborator-cursor-hint: 120; --layer-overlays-collaborator-cursor: 130; /* Text editor z-index */ --layer-text-container: 1; --layer-text-content: 3; --layer-text-editor: 4; /* Error fallback z-index */ --layer-error-overlay: 1; --layer-error-canvas: 2; --layer-error-canvas-after: 3; --layer-error-content: 4; /* Misc */ --tl-zoom: 1; /* Cursor SVGs */ --tl-cursor-none: none; --tl-cursor-default: url("data:image/svg+xml,") 12 8, default; --tl-cursor-pointer: url("data:image/svg+xml,") 14 10, pointer; --tl-cursor-cross: url("data:image/svg+xml,") 16 16, crosshair; --tl-cursor-move: url("data:image/svg+xml,") 16 16, move; --tl-cursor-grab: url("data:image/svg+xml,") 16 16, grab; --tl-cursor-grabbing: url("data:image/svg+xml,") 16 16, grabbing; --tl-cursor-text: url("data:image/svg+xml,") 4 10, text; --tl-cursor-zoom-in: url("data:image/svg+xml,") 16 16, zoom-in; --tl-cursor-zoom-out: url("data:image/svg+xml,") 16 16, zoom-out; /* These cursor values get programmatically overridden */ /* They're just here to help your editor autocomplete */ --tl-cursor: var(--tl-cursor-default); --tl-cursor-resize-edge: ew-resize; --tl-cursor-resize-corner: nesw-resize; --tl-cursor-ew-resize: ew-resize; --tl-cursor-ns-resize: ns-resize; --tl-cursor-nesw-resize: nesw-resize; --tl-cursor-nwse-resize: nwse-resize; --tl-cursor-rotate: pointer; --tl-cursor-nwse-rotate: pointer; --tl-cursor-nesw-rotate: pointer; --tl-cursor-senw-rotate: pointer; --tl-cursor-swne-rotate: pointer; --tl-scale: calc(1 / var(--tl-zoom)); /* fonts */ --tl-font-draw: 'tldraw_draw', sans-serif; --tl-font-sans: 'tldraw_sans', sans-serif; --tl-font-serif: 'tldraw_serif', serif; --tl-font-mono: 'tldraw_mono', monospace; /* text outline */ --a: calc(min(0.5, 1 / var(--tl-zoom)) * 2px); --b: calc(min(0.5, 1 / var(--tl-zoom)) * -2px); --tl-text-outline-reference: 0 var(--b) 0 var(--color-background), 0 var(--a) 0 var(--color-background), var(--b) var(--b) 0 var(--color-background), var(--a) var(--b) 0 var(--color-background), var(--a) var(--a) 0 var(--color-background), var(--b) var(--a) 0 var(--color-background); --tl-text-outline: var(--tl-text-outline-reference); /* own properties */ position: relative; inset: 0px; height: 100%; width: 100%; overflow: clip; color: var(--color-text); } .tl-theme__light { --color-accent: hsl(0, 76%, 60%); --color-background: hsl(210, 20%, 98%); --color-brush-fill: hsl(0, 0%, 56%, 10.2%); --color-brush-stroke: hsl(0, 0%, 56%, 25.1%); --color-grid: hsl(0, 0%, 43%); --color-low: hsl(204, 16%, 94%); --color-low-border: hsl(204, 16%, 92%); --color-culled: hsl(204, 14%, 93%); --color-muted-none: hsl(0, 0%, 0%, 0%); --color-muted-0: hsl(0, 0%, 0%, 2%); --color-muted-1: hsl(0, 0%, 0%, 10%); --color-muted-2: hsl(0, 0%, 0%, 4.3%); --color-hint: hsl(0, 0%, 0%, 5.5%); --color-overlay: hsl(0, 0%, 0%, 20%); --color-divider: hsl(0, 0%, 91%); --color-panel-contrast: hsl(0, 0%, 100%); --color-panel-overlay: hsl(0, 0%, 100%, 82%); --color-panel: hsl(0, 0%, 99%); --color-focus: hsl(214, 100%, 29%); --color-selected: hsl(214, 84%, 56%); --color-selected-contrast: hsl(0, 0%, 100%); --color-selection-fill: hsl(210, 100%, 56%, 24%); --color-selection-stroke: hsl(214, 84%, 56%); --color-text-0: hsl(0, 0%, 11%); --color-text-1: hsl(0, 0%, 18%); --color-text-3: hsl(220, 2%, 65%); --color-text-shadow: hsl(0, 0%, 100%); --color-primary: hsl(214, 84%, 56%); --color-success: hsl(123, 46%, 34%); --color-info: hsl(201, 98%, 41%); --color-warning: hsl(27, 98%, 47%); --color-error: hsl(0, 65%, 51%); --color-warn: hsl(0, 90%, 43%); --color-text: hsl(0, 0%, 0%); --color-laser: hsl(0, 100%, 50%); /* Shadows */ --shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 25%), 0px 1px 3px hsl(0, 0%, 0%, 9%); --shadow-2: 0px 0px 2px hsl(0, 0%, 0%, 16%), 0px 2px 3px hsl(0, 0%, 0%, 24%), 0px 2px 6px hsl(0, 0%, 0%, 0.1), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-3: 0px 1px 2px hsl(0, 0%, 0%, 28%), 0px 2px 6px hsl(0, 0%, 0%, 14%), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-4: 0px 0px 3px hsl(0, 0%, 0%, 19%), 0px 5px 4px hsl(0, 0%, 0%, 16%), 0px 2px 16px hsl(0, 0%, 0%, 6%), inset 0px 0px 0px 1px var(--color-panel-contrast); } .tl-theme__dark { --color-accent: hsl(0, 76%, 60%); --color-background: hsl(240, 5%, 6.5%); --color-brush-fill: hsl(0, 0%, 71%, 5.1%); --color-brush-stroke: hsl(0, 0%, 71%, 25.1%); --color-grid: hsl(0, 0%, 40%); --color-low: hsl(260, 4.5%, 10.5%); --color-low-border: hsl(207, 10%, 10%); --color-culled: hsl(210, 11%, 19%); --color-muted-none: hsl(0, 0%, 100%, 0%); --color-muted-0: hsl(0, 0%, 100%, 2%); --color-muted-1: hsl(0, 0%, 100%, 10%); --color-muted-2: hsl(0, 0%, 100%, 5%); --color-hint: hsl(0, 0%, 100%, 7%); --color-overlay: hsl(0, 0%, 0%, 50%); --color-divider: hsl(240, 9%, 22%); --color-panel-contrast: hsl(245, 12%, 23%); --color-panel: hsl(235, 6.8%, 13.5%); --color-panel-overlay: hsl(210, 10%, 24%, 82%); --color-focus: hsl(217, 76%, 80%); --color-selected: hsl(217, 89%, 61%); --color-selected-contrast: hsl(0, 0%, 100%); --color-selection-fill: hsl(209, 100%, 57%, 20%); --color-selection-stroke: hsl(214, 84%, 56%); --color-text-0: hsl(0, 9%, 94%); --color-text-1: hsl(0, 0%, 85%); --color-text-3: hsl(210, 6%, 45%); --color-text-shadow: hsl(210, 13%, 18%); --color-primary: hsl(214, 84%, 56%); --color-success: hsl(123, 38%, 57%); --color-info: hsl(199, 92%, 56%); --color-warning: hsl(36, 100%, 57%); --color-error: hsl(4, 90%, 58%); --color-warn: hsl(0, 81%, 66%); --color-text: hsl(210, 17%, 98%); --color-laser: hsl(0, 100%, 50%); /* Shadows */ --shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 16.1%), 0px 1px 3px hsl(0, 0%, 0%, 22%), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-2: 0px 1px 3px hsl(0, 0%, 0%, 66.6%), 0px 2px 6px hsl(0, 0%, 0%, 33%), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-3: 0px 1px 3px hsl(0, 0%, 0%, 50%), 0px 2px 12px hsl(0, 0%, 0%, 50%), inset 0px 0px 0px 1px var(--color-panel-contrast); } .tl-counter-scaled { transform: scale(var(--tl-scale)); transform-origin: top left; width: calc(100% * var(--tl-zoom)); height: calc(100% * var(--tl-zoom)); } .tl-container, .tl-container * { -webkit-touch-callout: none; -webkit-tap-highlight-color: transparent; scrollbar-highlight-color: transparent; -webkit-user-select: none; -moz-user-select: none; user-select: none; box-sizing: border-box; outline: none; } .tl-container a { -webkit-touch-callout: initial; } .tl-container__focused { outline: 1px solid var(--color-low); } input, *[contenteditable], *[contenteditable] * { -webkit-user-select: text; } /* -------------------------------------------------- */ /* Canvas */ /* -------------------------------------------------- */ .tl-canvas { position: absolute; inset: 0px; height: 100%; width: 100%; color: var(--color-text); cursor: var(--tl-cursor); overflow: clip; content-visibility: auto; touch-action: none; contain: strict; } .tl-shapes { position: relative; z-index: var(--layer-canvas-shapes); } .tl-overlays { position: absolute; top: 0px; left: 0px; height: 100%; width: 100%; contain: strict; pointer-events: none; z-index: var(--layer-canvas-overlays); } .tl-overlays__item { position: absolute; top: 0px; left: 0px; overflow: visible; pointer-events: none; transform-origin: top left; } .tl-svg-context { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; pointer-events: none; } /* ------------------- Background ------------------- */ .tl-background__wrapper { z-index: var(--layer-canvas-background); position: absolute; inset: 0px; height: 100%; width: 100%; } .tl-background { background-color: var(--color-background); width: 100%; height: 100%; } /* --------------------- Grid Layer --------------------- */ .tl-grid { position: absolute; inset: 0px; width: 100%; height: 100%; touch-action: none; pointer-events: none; z-index: var(--layer-canvas-grid); contain: strict; } .tl-grid-dot { fill: var(--color-grid); } /* --------------------- Layers --------------------- */ .tl-html-layer { position: absolute; top: 0px; left: 0px; width: 1px; height: 1px; contain: layout style size; } /* ---------------------- Brush --------------------- */ .tl-brush { stroke-width: calc(var(--tl-scale) * 1px); contain: size layout; } .tl-brush__default { stroke: var(--color-brush-stroke); fill: var(--color-brush-fill); } /* -------------------- Scribble -------------------- */ .tl-scribble { stroke-linejoin: round; stroke-linecap: round; pointer-events: none; contain: size layout; } /* ---------------------- Shape --------------------- */ .tl-shape { position: absolute; pointer-events: none; overflow: visible; transform-origin: top left; contain: size layout; } /* ---------------- Shape Containers ---------------- */ .tl-svg-container { position: absolute; inset: 0px; height: 100%; width: 100%; pointer-events: none; stroke-linecap: round; stroke-linejoin: round; transform-origin: top left; overflow: visible; } .tl-html-container { position: absolute; inset: 0px; height: 100%; width: 100%; pointer-events: none; stroke-linecap: round; stroke-linejoin: round; /* content-visibility: auto; */ transform-origin: top left; color: inherit; } /* --------------- Overlay Stack --------------- */ /* back of the stack, behind user's stuff */ .tl-collaborator__scribble { z-index: var(--layer-overlays-collaborator-scribble); } .tl-collaborator__brush { z-index: var(--layer-overlays-collaborator-brush); } .tl-collaborator__shape-indicator { z-index: var(--layer-overlays-collaborator-shape-indicator); } .tl-user-scribble { z-index: var(--layer-overlays-user-scribble); } .tl-user-brush { z-index: var(--layer-overlays-user-brush); } .tl-user-indicator__selected { z-index: var(--layer-overlays-user-indicator-selected); } .tl-user-indicator__hovered { z-index: var(--layer-overlays-user-indicator-hovered); } .tl-user-handles { z-index: var(--layer-overlays-user-handles); } .tl-user-snapline { z-index: var(--layer-overlays-user-snapline); } .tl-selection__fg { pointer-events: none; z-index: var(--layer-overlays-selection-fg); } .tl-user-indicator__hint { z-index: var(--layer-overlays-user-indicator-hint); stroke-width: calc(2.5px * var(--tl-scale)); } /* behind collaborator cursor */ .tl-collaborator__cursor-hint { z-index: var(--layer-overlays-collaborator-cursor-hint); } .tl-collaborator__cursor { z-index: var(--layer-overlays-collaborator-cursor); } .tl-cursor { overflow: visible; } /* -------------------- Indicator ------------------- */ .tl-shape-indicator { transform-origin: top left; fill: none; stroke-width: calc(1.5px * var(--tl-scale)); contain: size layout; } /* ------------------ SelectionBox ------------------ */ .tl-selection__bg { position: absolute; top: 0px; left: 0px; transform-origin: top left; background-color: transparent; pointer-events: all; } .tl-selection__fg__outline { fill: none; pointer-events: none; stroke: var(--color-selection-stroke); stroke-width: calc(1.5px * var(--tl-scale)); } .tl-corner-handle { pointer-events: none; stroke: var(--color-selection-stroke); fill: var(--color-background); stroke-width: calc(1.5px * var(--tl-scale)); } .tl-text-handle { pointer-events: none; fill: var(--color-selection-stroke); } .tl-corner-crop-handle { pointer-events: none; fill: none; stroke: var(--color-selection-stroke); } .tl-corner-crop-edge-handle { pointer-events: none; fill: none; stroke: var(--color-selection-stroke); } .tl-mobile-rotate__bg { pointer-events: all; cursor: var(--tl-cursor-grab); } .tl-mobile-rotate__fg { pointer-events: none; stroke: var(--color-selection-stroke); fill: var(--color-background); stroke-width: calc(1.5px * var(--tl-scale)); } .tl-transparent { fill: transparent; stroke: transparent; } /* --------------------- Handles -------------------- */ .tl-handle { pointer-events: all; } .tl-handle__bg { fill: transparent; stroke: transparent; pointer-events: all; } .tl-handle__fg { fill: var(--color-selected-contrast); stroke: var(--color-selection-stroke); stroke-width: calc(1.5px * var(--tl-scale)); pointer-events: none; } .tl-handle__create { opacity: 0; } .tl-handle__clone > .tl-handle__fg { fill: var(--color-selection-stroke); stroke: none; } .tl-handle__bg:active { fill: none; } @media (pointer: coarse) { .tl-handle__bg:active { fill: var(--color-selection-fill); } .tl-handle__create { opacity: 1; } } /* ------------------ Bounds Detail ----------------- */ .tl-image, .tl-video { -o-object-fit: cover; object-fit: cover; background-size: cover; width: 100%; height: 100%; } .tl-video.tl-video-is-fullscreen { -o-object-fit: contain; object-fit: contain; background-size: contain; } .tl-video-container, .tl-image-container, .tl-embed-container { width: 100%; height: 100%; pointer-events: all; /* background-color: var(--color-background); */ display: flex; justify-content: center; align-items: center; } .tl-image-container { position: relative; overflow: hidden; } .tl-image { position: absolute; inset: 0; } .tl-image__tg { --scale: calc(min(2, var(--tl-scale))); position: absolute; top: calc(var(--scale) * 8px); right: calc(var(--scale) * 8px); font-size: 10px; transform-origin: top right; background-color: var(--color-background); padding: 2px 4px; border-radius: var(--radius-1); } /* --------------------- Nametag -------------------- */ .tl-collaborator-cursor { position: absolute; } .tl-nametag { top: 16px; left: 13px; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; max-width: 120px; padding: 3px 6px; white-space: nowrap; position: absolute; overflow: hidden; text-overflow: ellipsis; font-size: 12px; font-family: var(--font-body); border-radius: var(--radius-2); color: var(--color-selected-contrast); } .tl-nametag-title { top: -2px; left: 13px; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; padding: 0px 6px; max-width: 120px; white-space: nowrap; position: absolute; overflow: hidden; text-overflow: ellipsis; font-size: 12px; font-family: var(--font-body); text-shadow: var(--tl-text-outline); color: var(--color-selected-contrast); } .tl-nametag-chat { top: 16px; left: 13px; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; color: var(--color-selected-contrast); white-space: nowrap; position: absolute; padding: 3px 6px; font-size: 12px; font-family: var(--font-body); opacity: 1; border-radius: var(--radius-2); } .tl-cursor-chat { position: absolute; color: var(--color-selected-contrast); white-space: nowrap; padding: 3px 6px; font-size: 12px; font-family: var(--font-body); pointer-events: none; z-index: var(--layer-cursor); margin-top: 16px; margin-left: 13px; opacity: 1; border: none; -webkit-user-select: text; -moz-user-select: text; user-select: text; border-radius: var(--radius-2); } .tl-cursor-chat .tl-cursor-chat__bubble { padding-right: 12px; } .tl-cursor-chat::-moz-selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } .tl-cursor-chat::selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } .tl-cursor-chat-fade { /* Setting to zero causes it to immediately disappear */ /* Setting to near-zero causes it to fade out gradually */ opacity: 0.0001; transition: opacity 5s ease-in-out; } .tl-cursor-chat::-moz-placeholder { color: var(--color-selected-contrast); opacity: 0.7; } .tl-cursor-chat::placeholder { color: var(--color-selected-contrast); opacity: 0.7; } /* -------------------------------------------------- */ /* Spinner */ /* -------------------------------------------------- */ @keyframes spinner { to { transform: rotate(360deg); } } /* ------------------- Text Shape ------------------- */ .tl-text-shape-label { position: relative; font-weight: normal; min-width: 1px; padding: 0px; margin: 0px; border: none; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; font-variant: normal; font-style: normal; pointer-events: all; white-space: pre-wrap; overflow-wrap: break-word; text-shadow: var(--tl-text-outline); } .tl-text-wrapper[data-font='draw'] { font-family: var(--tl-font-draw); } .tl-text-wrapper[data-font='sans'] { font-family: var(--tl-font-sans); } .tl-text-wrapper[data-font='serif'] { font-family: var(--tl-font-serif); } .tl-text-wrapper[data-font='mono'] { font-family: var(--tl-font-mono); } .tl-text-wrapper[data-align='start'], .tl-text-wrapper[data-align='start-legacy'] { text-align: left; } .tl-text-wrapper[data-align='middle'], .tl-text-wrapper[data-align='middle-legacy'] { text-align: center; } .tl-text-wrapper[data-align='end'], .tl-text-wrapper[data-align='end-legacy'] { text-align: right; } .tl-text-wrapper[data-isediting='true'] .tl-text-content { opacity: 0; } .tl-text { /* remove overflow from textarea on windows */ margin: 0px; padding: 0px; -webkit-appearance: auto; -moz-appearance: auto; appearance: auto; background: none; -o-border-image: none; border-image: none; border: 0px; caret-color: var(--color-text); color: inherit; -moz-column-count: initial !important; column-count: initial !important; display: inline-block; font-family: inherit; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: inherit; font-stretch: 100%; font-style: inherit; font-variant: inherit; font-variation-settings: normal; font-weight: inherit; letter-spacing: inherit; line-height: inherit; outline: none; overflow-wrap: break-word; text-align: inherit; text-indent: 0px; text-rendering: auto; text-shadow: inherit; text-transform: none; white-space: pre-wrap; line-break: normal; word-spacing: 0px; word-wrap: break-word; writing-mode: horizontal-tb !important; } .tl-text-measure { position: absolute; z-index: var(--layer-canvas-hidden); top: 0px; left: 0px; opacity: 0; width: -moz-max-content; width: max-content; box-sizing: border-box; pointer-events: none; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; resize: none; border: none; -moz-user-select: none; user-select: none; contain: style paint; -webkit-user-select: none; } .tl-text-input, .tl-text-content { position: absolute; inset: 0px; height: 100%; width: 100%; min-width: 1px; min-height: 1px; overflow: visible; outline: none; } .tl-text-content__wrapper { position: relative; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; display: flex; align-items: center; justify-content: center; pointer-events: none; min-height: auto; } .tl-text-content { pointer-events: none; } .tl-text-input { resize: none; -moz-user-select: all; user-select: all; -webkit-user-select: text; overflow: hidden; cursor: var(--tl-cursor-text); } .tl-text-wrapper[data-isediting='false'] .tl-text-input, .tl-arrow-label[data-isediting='false'] .tl-text-input { opacity: 0; cursor: var(--tl-cursor-default); } .tl-text-input::-moz-selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } .tl-text-input::selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } /* ------------------- Snap Lines ------------------- */ .tl-snap-indicator { stroke: var(--color-accent); stroke-width: calc(1px * var(--tl-scale)); fill: none; } .tl-snap-point { stroke: var(--color-accent); stroke-width: calc(1px * var(--tl-scale)); fill: none; } /* -------------------- Groups ------------------ */ .tl-group { stroke: var(--color-text); stroke-width: calc(1px * var(--tl-scale)); opacity: 0.5; } /* ------------------- Bookmark Shape ------------------- */ .tl-bookmark__container { width: 100%; height: 100%; position: relative; border: 1px solid var(--color-panel-contrast); background-color: var(--color-panel); border-radius: var(--radius-2); display: flex; flex-direction: column; overflow: hidden; } .tl-bookmark__container--safariExport { border: 1px solid var(--color-divider); } .tl-bookmark__image_container { flex: 1 1 100%; overflow: hidden; border-top-left-radius: var(--radius-1); border-top-right-radius: var(--radius-1); width: 100%; height: 100%; display: flex; justify-content: flex-end; align-items: flex-start; } .tl-bookmark__image_container > .tl-hyperlink-button::after { background-color: var(--color-panel); } .tl-bookmark__placeholder { width: 100%; height: 100%; background-color: var(--color-muted-2); border-bottom: 1px solid var(--color-muted-2); } .tl-bookmark__image { width: 100%; height: 100%; -o-object-fit: cover; object-fit: cover; -o-object-position: center; object-position: center; border-bottom: 1px solid var(--color-muted-2); } .tl-bookmark__copy_container { background-color: var(--color-muted); padding: var(--space-4); pointer-events: all; display: flex; flex-direction: column; justify-content: space-between; flex: 1; } .tl-bookmark__heading, .tl-bookmark__description, .tl-bookmark__link { margin: 0px; width: 100%; font-family: inherit; } .tl-bookmark__heading { font-size: 16px; line-height: 1.5; font-weight: bold; padding-bottom: var(--space-2); overflow: hidden; max-height: calc((16px * 1.5) * 2); -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; text-overflow: ellipsis; display: -webkit-box; } .tl-bookmark__description { font-size: 12px; line-height: 1.5; overflow: hidden; max-height: calc((12px * 1.5) * 3); -webkit-box-orient: vertical; -webkit-line-clamp: 3; line-clamp: 3; text-overflow: ellipsis; display: -webkit-box; color: var(--color-text-2); margin: var(--space-2) 0px; } .tl-bookmark__heading + .tl-bookmark__link, .tl-bookmark__description + .tl-bookmark__link { margin-top: var(--space-3); } .tl-bookmark__link { font-size: 12px; pointer-events: all; display: flex; color: var(--color-text-2); align-items: center; cursor: var(--tl-cursor-pointer); width: -moz-fit-content; width: fit-content; max-width: 100%; } .tl-bookmark__link > span { flex-shrink: 0px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .tl-bookmark__link > .tl-hyperlink__icon { margin-right: 8px; flex-shrink: 0; } .tl-bookmark__link > .tl-bookmark__favicon { margin-right: 8px; width: 16px; height: 16px; flex-shrink: 0; } /* ---------------- Hyperlink Button ---------------- */ .tl-hyperlink-button { background: none; margin: 0px; position: absolute; top: 0px; right: 0px; height: 44px; width: 44px; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 400; color: var(--color-text-1); padding: 13px; cursor: var(--tl-cursor-pointer); border: none; outline: none; pointer-events: all; z-index: 1; } .tl-hyperlink-button::after { content: ''; z-index: -1; position: absolute; right: 6px; bottom: 6px; display: block; width: calc(100% - 12px); height: calc(100% - 12px); border-radius: var(--radius-1); background-color: var(--color-background); pointer-events: none; } .tl-hyperlink-button:focus-visible { color: var(--color-selected); } .tl-hyperlink__icon { width: 16px; height: 16px; background-color: currentColor; pointer-events: none; } .tl-hyperlink-button__hidden { display: none; } /* ---------------- Geo shape ---------------- */ .tl-text-label { display: flex; justify-content: center; align-items: center; color: var(--color-text); text-shadow: var(--tl-text-outline); line-height: inherit; position: absolute; inset: 0px; height: 100%; width: 100%; } .tl-text-label[data-hastext='false'][data-isediting='false'] > .tl-text-label__inner { width: 40px; height: 40px; } .tl-text-label[data-hastext='true'][data-isediting='false'] .tl-text-content { pointer-events: all; } .tl-text-wrapper .tl-text-content { pointer-events: all; z-index: var(--layer-text-content); } .tl-text-label__inner > .tl-text-content { position: relative; top: 0px; left: 0px; padding: inherit; height: -moz-fit-content; height: fit-content; width: -moz-fit-content; width: fit-content; border-radius: var(--radius-1); max-width: 100%; } .tl-text-label__inner > .tl-text-input { position: absolute; inset: 0px; height: 100%; width: 100%; padding: inherit; } .tl-text-wrapper[data-isselected='true'] .tl-text-input { z-index: var(--layer-text-editor); pointer-events: all; } /* This part of the rule helps preserve the occlusion rules for the shapes so we * don't click on shapes that are behind other shapes. * One extra nuance is we don't use this behavior for: * - arrows which have weird geometry and just gets in the way. * - draw/line shapes, because it feels restrictive to have them be 'in the way' of clicking on a textfield * - shapes that are not filled */ .tl-canvas:is([data-iseditinganything='true'], [data-isselectinganything='true']) .tl-shape:not( [data-shape-type='arrow'], [data-shape-type='draw'], [data-shape-type='line'], [data-shape-type='highlight'], [data-shape-is-filled='false'] ) { pointer-events: all; } .tl-text-label[data-textwrap='true'] > .tl-text-label__inner { max-width: 100%; } .tl-text-label[data-isediting='true'] { background-color: transparent; min-height: auto; } .tl-text-label[data-isediting='true'] p { opacity: 0; } .tl-arrow-hint { stroke: var(--color-text-1); fill: none; stroke-linecap: round; overflow: visible; } /* ------------------- Arrow Shape ------------------ */ .tl-arrow-label { position: absolute; top: -1px; left: -1px; width: 2px; height: 2px; padding: 0px; display: flex; justify-content: center; align-items: center; text-align: center; color: var(--color-text); text-shadow: var(--tl-text-outline); } .tl-arrow-label[data-isediting='true'] p { opacity: 0; } .tl-arrow-label[data-isediting='true'] > .tl-arrow-label__inner { background-color: var(--color-background); } .tl-arrow-label__inner { border-radius: var(--radius-1); box-sizing: content-box; position: relative; height: -moz-max-content; height: max-content; width: -moz-max-content; width: max-content; pointer-events: none; display: flex; justify-content: center; align-items: center; } .tl-arrow-label .tl-arrow { position: relative; height: -moz-max-content; height: max-content; padding: inherit; overflow: visible; } .tl-arrow-label textarea { padding: inherit; /* Don't allow textarea to be zero width */ min-width: 4px; } /* -------------------- NoteShape ------------------- */ .tl-note__container { position: relative; width: 100%; height: 100%; pointer-events: all; opacity: 1; z-index: var(--layer-text-container); border-radius: 1px; } .tl-note__container > .tl-text-label { text-shadow: none; color: currentColor; } /* --------------------- Loading -------------------- */ .tl-loading { background-color: var(--color-background); color: var(--color-text-1); height: 100%; width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: var(--space-2); font-size: 14px; font-weight: 500; opacity: 0; animation: fade-in 0.2s ease-in-out forwards; animation-delay: 0.2s; } @keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; } } /* -------------------- FrameShape ------------------- */ .tl-frame__body { stroke-width: calc(1px * var(--tl-scale)); } .tl-frame__creating { stroke: var(--color-selected); fill: none; } .tl-frame-heading { display: flex; align-items: center; position: absolute; transform-origin: 0% 100%; overflow: hidden; max-width: 100%; min-width: 32px; height: auto; font-size: 12px; padding-bottom: 4px; pointer-events: all; } .tl-frame-heading-hit-area { pointer-events: all; /* scale from bottom left corner so we can pin it to the top left corner of the frame */ transform-origin: 0% 100%; display: flex; height: 100%; width: 100%; align-items: center; border-radius: var(--radius-1); background-color: var(--color-background); } .tl-frame-label { pointer-events: all; overflow: hidden; text-overflow: ellipsis; padding: var(--space-3) var(--space-3); position: relative; font-size: inherit; white-space: pre; border: 1px solid transparent; } .tl-frame-label__editing { color: transparent; white-space: pre; width: auto; overflow: visible; background-color: var(--color-panel); border-radius: var(--radius-1); border-color: var(--color-selected); } .tl-frame-name-input { position: absolute; border: none; background: none; outline: none; padding: var(--space-3) var(--space-3); inset: 0px; height: 100%; font-size: inherit; font-family: inherit; font-weight: inherit; width: 100%; color: var(--color-text-1); border-radius: var(--radius-1); -moz-user-select: all; user-select: all; -webkit-user-select: text; white-space: pre; cursor: var(--tl-cursor-text); } /* 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) { .tl-frame-heading { font-size: 16px; } } /* ------------------ iFrames Detail ----------------- */ .tl-embed { border: none; border-radius: var(--radius-2); } /* -------------- Shape Error Boundary -------------- */ .tl-shape-error-boundary { width: 100%; height: 100%; background-color: var(--color-muted-1); border-width: calc(1px * var(--tl-scale)); border-color: var(--color-muted-1); border-style: solid; border-radius: calc(var(--radius-1) * var(--tl-scale)); display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: left; position: relative; pointer-events: all; overflow: hidden; padding: var(--space-2); } .tl-shape-error-boundary::before { transform: scale(var(--tl-scale)); content: 'Error'; font-size: 12px; font-family: inherit; color: var(--color-text-0); } /* ----------------- Error Boundary ----------------- */ .tl-error-boundary { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; padding: var(--space-4); background-color: var(--color-background); color: var(--color-text-1); position: absolute; } .tl-error-boundary__overlay { position: absolute; inset: 0px; height: 100%; width: 100%; z-index: var(--layer-error-overlay); background-color: var(--color-overlay); } .tl-error-boundary__content * { -moz-user-select: all; user-select: all; -webkit-user-select: text; pointer-events: all; } .tl-error-boundary__canvas { pointer-events: none; position: absolute; inset: 0px; height: 100%; width: 100%; z-index: var(--layer-error-canvas); } /* some browsers seem to have some weird interactions between stacking contexts and pointer-events. this ::after pseudo element covers the canvas and prevents it from receiving any pointer events or affecting the cursor. */ .tl-error-boundary__canvas::after { content: ' '; display: block; position: absolute; inset: 0px; height: 100%; width: 100%; z-index: var(--layer-error-canvas-after); pointer-events: all; } .tl-error-boundary__content { width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; max-width: 100%; width: 400px; max-height: 100%; background-color: var(--color-panel); padding: 16px; border-radius: 16px; box-shadow: var(--shadow-2); font-size: 14px; font-weight: 400; display: flex; flex-direction: column; overflow: auto; z-index: var(--layer-error-content); gap: 12px; } .tl-error-boundary__content__expanded { width: 600px; } .tl-error-boundary__content h2 { font-size: 16px; margin: 0px; font-weight: 500; } .tl-error-boundary__content h4 { border: 1px solid var(--color-low-border); margin: -6px 0 0 0; padding: var(--space-5); border-radius: var(--radius-2); font-weight: normal; } .tl-error-boundary__content p { line-height: 1.5; margin: 0px; } .tl-error-boundary__content pre { background-color: var(--color-muted-2); margin-top: 0; padding: var(--space-5); border-radius: var(--radius-2); overflow: auto; font-size: 12px; max-height: 320px; } .tl-error-boundary__content button { background: none; border: none; font-family: inherit; font-size: 14px; font-weight: 500; padding: var(--space-4); border-radius: var(--radius-3); cursor: var(--tl-cursor-pointer); color: inherit; background-color: transparent; } .tl-error-boundary__content a { color: var(--color-selected); font-weight: 500; text-decoration: none; } .tl-error-boundary__content__error { position: relative; margin: -6px 0 0 0; } .tl-error-boundary__content__error button { position: absolute; top: var(--space-2); right: var(--space-2); font-size: 12px; padding: var(--space-2) var(--space-3); background-color: var(--color-panel); border-radius: var(--radius-1); } .tl-error-boundary__content__actions { display: flex; justify-content: space-between; gap: var(--space-4); margin: 0px; margin-left: -4px; } .tl-error-boundary__content__actions__group { display: flex; gap: var(--space-4); } .tl-error-boundary__content .tl-error-boundary__reset { color: var(--color-warn); } .tl-error-boundary__content .tl-error-boundary__refresh { background-color: var(--color-primary); color: var(--color-selected-contrast); } /* --------------------- Coarse --------------------- */ .tl-hidden { opacity: 0; pointer-events: none; } .debug__ui-logger { position: absolute; top: 62px; left: 16px; color: #555; font-size: 12px; font-family: monospace; } /* ---------------- Hit test blocker ---------------- */ .tl-hit-test-blocker { position: absolute; z-index: var(--layer-canvas-blocker); inset: 0px; width: 100%; height: 100%; pointer-events: all; } .tl-hit-test-blocker__hidden { display: none; } @media (hover: hover) { .tl-handle__create:hover { opacity: 1; } .tl-handle__bg:hover { cursor: var(--tl-cursor-grab); fill: var(--color-selection-fill); } .tl-bookmark__link:hover { color: var(--color-selected); } .tl-hyperlink-button:hover { color: var(--color-selected); } .tl-error-boundary__content button:hover { background-color: var(--color-low); } .tl-error-boundary__content a:hover { color: var(--color-text-1); } .tl-error-boundary__content .tl-error-boundary__refresh:hover { background-color: var(--color-primary); opacity: 0.9; } /* These three rules help preserve clicking into specific points in text areas *while* * already in edit mode when jumping from shape to shape. */ .tl-canvas[data-iseditinganything='true'] .tl-text-wrapper:hover .tl-text-input { z-index: var(--layer-text-editor); pointer-events: all; } } /* @tldraw/ui */ .tl-container { --layer-above: 1; --layer-focused-input: 10; --layer-menu-click-capture: 250; --layer-panels: 300; --layer-menus: 400; --layer-toasts: 650; --layer-cursor: 700; --layer-header-footer: 999; --layer-following-indicator: 1000; } /* -------------------------------------------------- */ /* UI Refresh */ /* -------------------------------------------------- */ /* Button */ .tlui-button { position: relative; height: 40px; min-width: 40px; padding: 0px 12px; display: flex; align-items: center; justify-content: center; background-color: transparent; border: transparent; color: currentColor; cursor: pointer; pointer-events: all; font-weight: inherit; font-family: inherit; line-height: inherit; text-rendering: optimizeLegibility; font-size: 12px; gap: 0px; color: var(--color-text-1); } .tlui-button:disabled { color: var(--color-text-3); text-shadow: none; cursor: default; } .tlui-button:disabled .tlui-kbd { color: var(--color-text-3); } .tlui-button > * { position: relative; z-index: var(--layer-above); } .tlui-button__label { font-size: 12px; flex-grow: 2; text-align: left; } .tlui-button:focus-visible:not(:hover) { /* todo: fix the indicator errors in radix dropdown menus before restoring */ /* outline: 1px solid var(--color-selected); */ outline: none; outline-offset: -4px; border-radius: var(--radius-3); } .tlui-button::after { display: block; content: ''; position: absolute; inset: 4px; background-color: transparent; border-radius: var(--radius-2); } .tlui-button[aria-expanded='true']::after { background-color: var(--color-muted-0); opacity: 1; } .tlui-button__icon + .tlui-button__label { margin-left: var(--space-2); } @media (hover: hover) { .tlui-button:not(.tlui-menu__submenu__trigger)::after, .tlui-button.tlui-menu__submenu__trigger[data-highlighted]::after { background-color: var(--color-muted-2); opacity: 0; } .tlui-button:not(:disabled):hover::after { opacity: 1; } } .tlui-button[data-state='hinted']::after { background-color: var(--color-hint); opacity: 1; } .tlui-button[data-state='hinted']:not(:disabled, :focus-visible):active:after { background: var(--color-hint); opacity: 1; } /* Low button */ .tlui-button__low { border-radius: var(--radius-3); background-color: var(--color-low); } @media (hover: hover) { .tlui-button__low::after { background-color: var(--color-muted-2); } } /* Primary / danger buttons */ .tlui-button__primary { color: var(--color-primary); } .tlui-button__danger { color: var(--color-warn); text-shadow: none; } @media (hover: hover) { .tlui-button__primary:not(:disabled, :focus-visible):hover { color: var(--color-primary); } .tlui-button__danger:not(:disabled, :focus-visible):hover { color: var(--color-warn); text-shadow: none; } } /* Panel button */ .tlui-button__panel { position: relative; } /* Menu button */ .tlui-button__menu { height: 40px; min-height: 40px; width: 100%; gap: 8px; margin: -4px 0px; } .tlui-button__menu:nth-child(1) { margin-top: 0px; } .tlui-button__menu:nth-last-child(1) { margin-bottom: 0px; } @media (hover: hover) { .tlui-button__menu::after { inset: 4px; border-radius: var(--radius-2); } } /* Menu checkbox button */ .tlui-button__checkbox { padding-left: 8px; } .tlui-button__checkbox__indicator { width: 15px; height: 15px; } /* Tool lock button */ .tlui-toolbar__lock-button { position: absolute; top: 4px; right: 0px; pointer-events: all; height: 40px; width: 40px; min-width: 0px; border-radius: var(--radius-2); } .tlui-toolbar__lock-button::after { top: 4px; left: 8px; inset: 4px; } /* Tool button */ .tlui-button__tool { position: relative; height: 48px; width: 48px; margin-left: -2px; margin-right: -2px; } .tlui-button__tool:focus-visible:not(:hover) { border-radius: 12px; } .tlui-button__tool:nth-of-type(1) { margin-left: 0px; } .tlui-button__tool:nth-last-of-type(1) { margin-right: 0px; } @media (hover: hover) { .tlui-button__tool::after { inset: 4px; border-radius: 8px; } .tlui-button__tool[aria-checked='true']:not(:disabled, :focus-visible):hover { color: var(--color-selected-contrast); } } .tlui-button__tool[aria-checked='true'] { color: var(--color-selected-contrast); } .tlui-button__tool[aria-checked='true']:not(:disabled, :focus-visible):active { color: var(--color-selected-contrast); } .tlui-button__tool[aria-checked='true']:not(:disabled)::after { background: var(--color-selected); opacity: 1; } .tlui-layout__mobile .tlui-button__tool { height: 48px; width: 43px; } .tlui-layout__mobile .tlui-button__tool > .tlui-icon { height: 16px; width: 16px; } /* Help */ .tlui-button__help { height: 32px; width: 32px; padding: 0px; min-width: 32px; border-radius: 100%; background-color: var(--color-low); border: 1px solid var(--color-low-border); } @media (hover: hover) { .tlui-button__help::after { background-color: var(--color-muted-2); border-radius: 100%; inset: 4px; } } /* Button Row */ .tlui-buttons__horizontal { display: flex; flex-direction: row; } .tlui-buttons__horizontal > * { margin-left: -2px; margin-right: -2px; } .tlui-buttons__horizontal > *:nth-child(1) { margin-left: 0px; } .tlui-buttons__horizontal > *:nth-last-child(1) { margin-right: 0px; } /* Button Grid */ .tlui-buttons__grid { display: grid; grid-template-columns: repeat(4, auto); grid-auto-flow: row; overflow: hidden; } .tlui-buttons__grid > .tlui-button { margin: -2px; } .tlui-buttons__grid > .tlui-button:nth-of-type(4n) { margin-right: 0px; } .tlui-buttons__grid > .tlui-button:nth-of-type(4n - 3) { margin-left: 0px; } .tlui-buttons__grid > .tlui-button:nth-of-type(-n + 4) { margin-top: 0px; } .tlui-buttons__grid > .tlui-button:nth-last-of-type(-n + 4) { margin-bottom: 0px; } /* Zoom button */ .tlui-zoom-menu__button__pct { width: 60px; min-width: 60px; text-align: center; } /* --------------------- 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; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; contain: strict; z-index: var(--layer-panels); -webkit-transform: translate3d(0, 0, 0); --sab: env(safe-area-inset-bottom); font-weight: 500; line-height: 1.6; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-smooth: antialiased; text-rendering: optimizeLegibility; } .tlui-layout__top { grid-column: 1; grid-row: 1; display: flex; min-width: 0px; justify-content: space-between; } .tlui-layout__top__left { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; width: 100%; height: 100%; flex: 0 1 0; } .tlui-layout__top__right { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-start; height: 100%; flex: 0 0 auto; min-width: 0px; } .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: -moz-min-content; width: min-content; gap: var(--space-3); margin: var(--space-2) var(--space-3); white-space: nowrap; pointer-events: none; z-index: var(--layer-panels); } /* ---------------------- Icon ---------------------- */ .tlui-icon { flex-shrink: 0; width: 18px; height: 18px; background-color: currentColor; } .tlui-icon__placeholder { flex-shrink: 0; width: 18px; height: 18px; background-color: transparent; } .tlui-icon__small { width: 15px; height: 15px; } /* --------------------- Slider --------------------- */ .tlui-slider { position: relative; display: flex; align-items: center; -webkit-user-select: none; -moz-user-select: none; user-select: none; touch-action: none; } .tlui-slider__container { width: 100%; 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: 14px; } .tlui-slider__range { position: absolute; top: calc(50% - 2px); left: 0px; height: 3px; background-color: var(--color-selected); border-radius: 14px; } .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-1); } .tlui-slider__thumb:active { cursor: grabbing; box-shadow: inset 0px 0px 0px 2px var(--color-text-1), 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); align-self: bottom; color: var(--color-text-1); margin-left: var(--space-4); } .tlui-kbd > span { width: 100%; text-align: center; display: inline; margin: 0px; padding: 2px; border-radius: 2px; } .tlui-kbd > span:last-child { padding-right: 0; } .tlui-kbd:not(:last-child) { margin-right: var(--space-2); } /* Focus Mode Button */ .tlui-focus-button { z-index: var(--layer-panels); pointer-events: all; } /* --------------------- 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-3); 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 { background-color: var(--color-low); width: 100%; display: grid; align-items: center; grid-template-columns: 1fr auto auto auto; justify-content: space-between; padding-left: var(--space-4); border-top: 1px solid var(--color-background); font-size: 12px; color: var(--color-text-1); z-index: var(--layer-panels); pointer-events: all; } .tlui-debug-panel__current-state { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .tlui-debug-panel__fps { margin-right: 8px; } .tlui-debug-panel__fps__slow { font-weight: bold; color: var(--color-warn); } /* -------------------- Menu Zone ------------------- */ .tlui-menu-zone { position: relative; z-index: var(--layer-panels); width: -moz-fit-content; width: fit-content; border-right: 2px solid var(--color-background); border-bottom: 2px solid var(--color-background); border-bottom-right-radius: var(--radius-4); 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%); } /* ------------------- Style Panel ------------------ */ .tlui-style-panel__wrapper { box-shadow: var(--shadow-2); border-radius: var(--radius-3); pointer-events: all; background-color: var(--color-panel); height: -moz-fit-content; height: fit-content; max-height: 100%; margin: 8px; margin-top: 4px; touch-action: auto; overscroll-behavior: none; overflow-y: auto; overflow-x: hidden; color: var(--color-text); } /* if the style panel is the only child (ie no share menu), increase the margin */ .tlui-style-panel__wrapper:only-child { margin-top: 8px; } .tlui-style-panel { position: relative; z-index: var(--layer-panels); pointer-events: all; width: 148px; max-width: 148px; } .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; } /* Only really used for the alignment picker */ .tlui-style-panel__row__extra-button { margin-left: -2px; } .tlui-style-panel__double-select-picker { display: flex; grid-template-columns: 1fr auto; align-items: center; padding-left: var(--space-4); color: var(--color-text-1); font-size: 12px; } .tlui-style-panel__double-select-picker-label { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; flex-grow: 2; max-width: 100%; } .tlui-style-panel__section *[data-state='open']::after { background: var(--color-muted-0); } /* ---------------------- Input --------------------- */ .tlui-input { background: none; margin: 0px; position: relative; z-index: var(--layer-above); height: 40px; max-height: 40px; display: flex; align-items: center; justify-content: center; font-family: inherit; font-size: 12px; font-weight: inherit; color: var(--color-text-1); padding: var(--space-4); padding-left: 0px; border: none; outline: none; text-overflow: ellipsis; width: 100%; -webkit-user-select: all; -moz-user-select: all; user-select: all; text-rendering: optimizeLegibility; -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; } } } /* ---------------- Dialog ---------------- */ .tlui-dialog__overlay { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; z-index: var(--layer-canvas-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-3); font-size: 12px; overflow: hidden; min-width: 300px; max-width: 80%; max-height: 80%; } .tlui-dialog__header { position: relative; display: flex; align-items: center; flex: 0; z-index: var(--layer-header-footer); 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); } .tlui-dialog__header__close { justify-self: flex-end; } .tlui-dialog__body { padding: var(--space-4) var(--space-4); flex: 0 1; overflow-y: auto; overflow-x: hidden; color: var(--color-text-1); -moz-user-select: all; user-select: all; -webkit-user-select: text; } .tlui-dialog__body a { color: var(--color-selected); } .tlui-dialog__body ul, .tlui-dialog__body ol { padding-left: 16px; display: flex; flex-direction: column; gap: var(--space-4); } .tlui-dialog__footer { position: relative; z-index: var(--layer-header-footer); } .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; } /* --------------------- 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-3) + var(--sab)); } /* Centered Content */ .tlui-toolbar__inner { position: relative; width: -moz-fit-content; width: fit-content; display: flex; gap: var(--space-3); align-items: flex-end; } .tlui-toolbar__left { width: -moz-fit-content; width: fit-content; } /* Row of controls + lock button */ .tlui-toolbar__extras { position: relative; z-index: var(--layer-above); width: 100%; pointer-events: none; top: 6px; height: 48px; } .tlui-toolbar__extras:empty { display: none; } .tlui-toolbar__extras__controls { display: flex; position: relative; flex-direction: row; z-index: var(--layer-above); background-color: var(--color-low); border-top-left-radius: var(--radius-4); border-top-right-radius: var(--radius-4); border: 2px solid var(--color-background); margin-left: 8px; margin-right: 0px; pointer-events: all; width: -moz-fit-content; width: fit-content; } .tlui-toolbar__tools { display: flex; flex-direction: row; align-items: center; background-color: var(--color-low); border-radius: var(--radius-4); z-index: var(--layer-panels); pointer-events: all; position: relative; background: var(--color-panel); box-shadow: var(--shadow-2); } .tlui-toolbar__tools__list { display: flex; flex-direction: row; align-items: center; } .tlui-toolbar__overflow { width: 40px; } .tlui-layout__mobile .tlui-toolbar__overflow { width: 32px; padding: 0px; } .tlui-layout__mobile .tlui-toolbar *[data-state='open']::after { background: linear-gradient(0deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%); } /* -------------------- Help Zone ------------------- */ .tlui-help-menu { pointer-events: all; position: absolute; bottom: var(--space-2); right: var(--space-2); z-index: var(--layer-panels); border: 2px solid var(--color-background); 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:empty { display: none; } .tlui-menu { z-index: var(--layer-menus); height: -moz-fit-content; height: fit-content; width: -moz-fit-content; width: fit-content; max-height: 80vh; border-radius: var(--radius-3); 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 { width: 100%; } .tlui-menu__group:empty { display: none; } .tlui-menu__group { border-bottom: 1px solid var(--color-divider); } .tlui-menu__group:nth-last-of-type(1) { border-bottom: none; } .tlui-menu__submenu__trigger[data-state='open']:not(:hover)::after { border-radius: 0px; 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: 0px; background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%); } /* Menu Sizes */ .tlui-menu[data-size='large'] > .tlui-menu__group { min-width: initial; } .tlui-menu[data-size='medium'] > .tlui-menu__group { min-width: 144px; } .tlui-menu[data-size='small'] > .tlui-menu__group { min-width: 96px; } .tlui-menu[data-size='tiny'] > .tlui-menu__group { min-width: 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: 11px; padding-left: var(--space-4); color: var(--color-text-1); } .tlui-toast__container { min-width: 200px; display: flex; flex-direction: row; background-color: var(--color-panel); box-shadow: var(--shadow-2); border-radius: var(--radius-3); font-size: 12px; } .tlui-toast__container[data-severity='success'] .tlui-icon { color: var(--color-success); } .tlui-toast__container[data-severity='info'] .tlui-icon { color: var(--color-info); } .tlui-toast__container[data-severity='warning'] .tlui-icon { color: var(--color-warning); } .tlui-toast__container[data-severity='error'] .tlui-icon { color: var(--color-error); } .tlui-toast__main { flex-grow: 2; max-width: 280px; } .tlui-toast__content { padding: var(--space-4); display: flex; line-height: 1.4; flex-direction: column; gap: var(--space-3); } .tlui-toast__main[data-actions='true'] .tlui-toast__content { padding-bottom: var(--space-2); } .tlui-toast__title { font-weight: bold; color: var(--color-text-1); /* this makes the default toast look better */ line-height: 16px; } .tlui-toast__description { color: var(--color-text-1); padding: var(--space-3); margin: 0px; padding: 0px; } .tlui-toast__icon + .tlui-toast__main > .tlui-toast__actions { padding-left: 0px; } .tlui-toast__actions { display: flex; flex-direction: row; justify-content: flex-start; margin-left: 0; } .tlui-toast__close { align-self: flex-end; flex-shrink: 0; } @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; } } /* --------------------- Bottom --------------------- */ .tlui-layout__bottom { grid-row: 2; } .tlui-layout__bottom__main { width: 100%; position: relative; display: flex; align-items: flex-end; justify-content: center; } /* ------------------- Navigation ------------------- */ .tlui-navigation-panel { display: flex; width: -moz-min-content; width: min-content; flex-direction: column; z-index: var(--layer-panels); pointer-events: all; position: absolute; left: 0px; bottom: 0px; } .tlui-navigation-panel::before { content: ''; display: block; position: absolute; z-index: -1; inset: -2px -2px 0px 0px; border-radius: 0; border-top: 2px solid var(--color-background); border-right: 2px solid var(--color-background); border-top-right-radius: var(--radius-4); background-color: var(--color-low); } .tlui-navigation-panel__toggle .tlui-icon { opacity: 0.24; } .tlui-navigation-panel__toggle:active .tlui-icon { opacity: 1; } @media (hover: hover) { .tlui-navigation-panel__toggle:hover .tlui-icon { opacity: 1; } } .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%; } /* ----------------------- ... ---------------------- */ @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: 260px; height: -moz-fit-content; height: fit-content; max-height: 50vh; } .tlui-page-menu__trigger { width: 128px; } .tlui-page-menu__header { display: flex; flex-direction: row; align-items: center; width: 100%; height: 40px; padding-left: var(--space-4); 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; 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; flex-direction: column; max-height: 100%; overflow-x: hidden; overflow-y: auto; touch-action: auto; } .tlui-page-menu__item { position: relative; display: flex; flex-direction: row; align-items: center; justify-content: space-between; gap: 0px; } @media (hover: hover) { .tlui-page-menu__item::after { display: block; content: ''; background-color: var(--color-muted-2); position: absolute; inset: 4px; border-radius: 6px; pointer-events: none; opacity: 0; } .tlui-page-menu__item:hover::after { opacity: 1; } .tlui-page-menu__item:hover > .tlui-page_menu__item__submenu > .tlui-button { opacity: 1; } } /* Since we're adding an after hover effect to the page menu item, we want to hide the hovers on the individual buttons in the page menu item */ .tlui-page-menu__item__button::after, .tlui-page_menu__item__submenu > .tlui-button::after { display: none; } .tlui-page-menu__item:nth-of-type(n + 2) { margin-top: -4px; } .tlui-page-menu__item__button { width: 100%; } .tlui-page-menu__item__button:not(:only-child) { flex-grow: 2; margin-right: -2px; } .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: 35px; } .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: -moz-fit-content; height: fit-content; display: flex; flex-direction: row; align-items: center; overflow: hidden; z-index: var(--layer-above); } .tlui-page_menu__item__sortable__title { flex: 1; } .tlui-page_menu__item__sortable__title > .tlui-input__wrapper { height: 100%; } .tlui-page_menu__item__sortable:focus-within { z-index: var(--layer-focused-input); } .tlui-page_menu__item__sortable__handle { touch-action: none; width: 32px; min-width: 0px; height: 40px; 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: 12px; 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; margin-left: -2px; } .tlui-page_menu__item__submenu[data-isediting='true'] { display: block; opacity: 1; } .tlui-page_menu__item__submenu > .tlui-button { opacity: 0; } @media (any-pointer: coarse) { .tlui-page_menu__item__submenu > .tlui-button { opacity: 1; } } .tlui-button__icon { padding: 0px; } .tlui-page-menu__item__button .tlui-button__icon { margin-right: 4px; } @media (hover: hover) { .tlui-page_menu__item__submenu { display: block; } .tlui-page_menu__item__submenu[data-isediting='true'] > .tlui-button { opacity: 0; } .tlui-page_menu__item__submenu > .tlui-button[data-state='open'], .tlui-page_menu__item__submenu:hover > .tlui-button, .tlui-page_menu__item__sortable:focus-within > .tlui-page_menu__item__submenu > .tlui-button { 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; } .tlui-embed-dialog__list { display: flex; flex-direction: column; padding-bottom: var(--space-5); } .tlui-embed-dialog__item__image { 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); text-shadow: none; } .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); } .tlui-following-indicator { display: block; position: absolute; inset: 0px; border-width: 2px; border-style: solid; z-index: var(--layer-following-indicator); pointer-events: none; } /* ---------------- Offline Indicator --------------- */ .tlui-offline-indicator { display: flex; flex-direction: row; gap: var(--space-3); color: var(--color-text); background-color: var(--color-low); border: 3px solid var(--color-background); padding: 0px var(--space-5); height: 42px; align-items: center; justify-content: center; border-radius: 99px; opacity: 0; animation: fade-in; animation-duration: 0.12s; animation-delay: 2s; animation-fill-mode: forwards; } /* --------------- Keyboard shortcuts --------------- */ .tlui-shortcuts-dialog__header { border-bottom: 1px solid var(--color-divider); } .tlui-shortcuts-dialog__body { position: relative; -moz-columns: 3; columns: 3; -moz-column-gap: var(--space-9); column-gap: var(--space-9); pointer-events: all; touch-action: auto; /* Terrible fix to allow firefox users to scroll the dialog */ overflow-x: auto; } .tlui-shortcuts-dialog__body__tablet { -moz-columns: 2; columns: 2; } .tlui-shortcuts-dialog__body__mobile { -moz-columns: 1; columns: 1; } .tlui-shortcuts-dialog__group { -moz-column-break-inside: avoid; break-inside: avoid-column; padding-bottom: var(--space-6); } .tlui-shortcuts-dialog__group__title { font-size: inherit; font-weight: inherit; margin: 0px; color: var(--color-text-3); 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; } /* ------------------- Da share zone ------------------ */ .tlui-share-zone { padding: 0px 0px 0px 0px; display: flex; flex-direction: row; justify-content: flex-end; z-index: var(--layer-panels); align-items: center; padding-top: 2px; padding-right: 4px; } /* ------------------- People Menu ------------------- */ .tlui-people-menu__avatars-button { display: flex; align-items: center; justify-content: flex-end; background: none; border: none; cursor: pointer; pointer-events: all; border-radius: var(--radius-1); padding-right: 1px; height: 100%; } .tlui-people-menu__avatars { display: flex; flex-direction: row; } .tlui-people-menu__avatar { height: 24px; width: 24px; border: 2px solid var(--color-background); background-color: var(--color-low); border-radius: 100%; display: flex; align-items: center; justify-content: center; position: relative; font-size: 10px; font-weight: bold; color: var(--color-selected-contrast); z-index: 2; } .tlui-people-menu__avatar:nth-of-type(n + 2) { margin-left: -12px; } .tlui-people-menu__avatars-button[data-state='open'] { opacity: 1; } @media (hover: hover) { .tlui-people-menu__avatars-button:hover .tlui-people-menu__avatar { border-color: var(--color-low); } } .tlui-people-menu__more { min-width: 0px; font-size: 11px; font-weight: 600; color: var(--color-text-1); font-family: inherit; padding: 0px 4px; letter-spacing: 1.5; } .tlui-people-menu__more::after { border-radius: var(--radius-2); inset: 0px; } .tlui-people-menu__wrapper { position: relative; display: flex; flex-direction: column; width: 220px; height: -moz-fit-content; height: fit-content; max-height: 50vh; } .tlui-people-menu__section { position: relative; flex-direction: column; max-height: 100%; overflow-x: hidden; overflow-y: auto; touch-action: auto; } .tlui-people-menu__section:first-child, .tlui-people-menu__section:last-child { flex-shrink: 0; } .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 { 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 > .tlui-input__wrapper { width: auto; display: flex; align-items: auto; flex-grow: 2; gap: 8px; height: 100%; padding: 0px; } .tlui-people-menu__item { display: flex; justify-content: flex-start; width: 100%; } .tlui-people-menu__item__button { padding: 0 11px; } .tlui-people-menu__item > .tlui-button__menu { width: auto; display: flex; align-items: auto; justify-content: flex-start; flex-grow: 2; gap: 11px; } .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; } .tlui-people-menu__item__follow:hover .tlui-icon { opacity: 1; } } .tlui-menu-click-capture { position: fixed; inset: 0; z-index: var(--layer-menu-click-capture); } .CCExamMarker { position: absolute; inset: 0; display: flex; flex-direction: column; } .CCExamMarker .CCPdfPicker { position: absolute; inset: 1rem; display: flex; align-items: center; justify-content: center; text-align: center; flex-direction: column; gap: 1rem; } .CCExamMarker .CCPdfBgRenderer { position: absolute; pointer-events: none; } .CCExamMarker .CCPdfBgRenderer img { position: absolute; } .CCExamMarker .PageOverlayScreen-screen { pointer-events: none; z-index: -1; fill: var(--color-background); fill-opacity: 0.8; stroke: none; } .CCExamMarker .PageOverlayScreen-outline { position: absolute; pointer-events: none; z-index: -1; box-shadow: var(--shadow-2); } .CCExamMarker .CCExportPdfButton { font: inherit; background: var(--color-primary); border: none; color: var(--color-selected-contrast); font-size: 1rem; padding: 0.5rem 1rem; border-radius: 6px; margin: 6px; margin-bottom: 0; pointer-events: all; z-index: var(--layer-panels); border: 2px solid var(--color-background); cursor: pointer; } .CCExamMarker .CCExportPdfButton:hover { filter: brightness(1.1); } /* THIS CSS FILE IS GENERATED! DO NOT EDIT. OR EDIT. I'M A COMMENT NOT A COP */ /* This file is created by the copy-css-files.mjs script in packages/tldraw. */ /* It combines @tldraw/editor's editor.css and tldraw's ui.css */ /* @tldraw/editor */ .tl-container { font-size: 12px; /* Spacing */ --space-1: 2px; --space-2: 4px; --space-3: 8px; --space-4: 12px; --space-5: 16px; --space-6: 20px; --space-7: 28px; --space-8: 32px; --space-9: 64px; --space-10: 72px; /* Radius */ --radius-0: 2px; --radius-1: 4px; --radius-2: 6px; --radius-3: 9px; --radius-4: 11px; /* Canvas z-index */ --layer-canvas-hidden: -999999; --layer-canvas-background: 100; --layer-canvas-grid: 150; --layer-watermark: 200; --layer-canvas-shapes: 300; --layer-canvas-overlays: 500; --layer-canvas-blocker: 10000; /* Canvas overlays z-index */ --layer-overlays-collaborator-scribble: 10; --layer-overlays-collaborator-brush: 20; --layer-overlays-collaborator-shape-indicator: 30; --layer-overlays-user-scribble: 40; --layer-overlays-user-brush: 50; --layer-overlays-user-indicator-selected: 60; --layer-overlays-user-indicator-hovered: 70; --layer-overlays-user-handles: 80; --layer-overlays-user-snapline: 90; --layer-overlays-selection-fg: 100; --layer-overlays-user-indicator-hint: 110; --layer-overlays-collaborator-cursor-hint: 120; --layer-overlays-collaborator-cursor: 130; /* Text editor z-index */ --layer-text-container: 1; --layer-text-content: 3; --layer-text-editor: 4; /* Error fallback z-index */ --layer-error-overlay: 1; --layer-error-canvas: 2; --layer-error-canvas-after: 3; --layer-error-content: 4; /* Misc */ --tl-zoom: 1; /* Cursor SVGs */ --tl-cursor-none: none; --tl-cursor-default: url("data:image/svg+xml,") 12 8, default; --tl-cursor-pointer: url("data:image/svg+xml,") 14 10, pointer; --tl-cursor-cross: url("data:image/svg+xml,") 16 16, crosshair; --tl-cursor-move: url("data:image/svg+xml,") 16 16, move; --tl-cursor-grab: url("data:image/svg+xml,") 16 16, grab; --tl-cursor-grabbing: url("data:image/svg+xml,") 16 16, grabbing; --tl-cursor-text: url("data:image/svg+xml,") 4 10, text; --tl-cursor-zoom-in: url("data:image/svg+xml,") 16 16, zoom-in; --tl-cursor-zoom-out: url("data:image/svg+xml,") 16 16, zoom-out; /* These cursor values get programmatically overridden */ /* They're just here to help your editor autocomplete */ --tl-cursor: var(--tl-cursor-default); --tl-cursor-resize-edge: ew-resize; --tl-cursor-resize-corner: nesw-resize; --tl-cursor-ew-resize: ew-resize; --tl-cursor-ns-resize: ns-resize; --tl-cursor-nesw-resize: nesw-resize; --tl-cursor-nwse-resize: nwse-resize; --tl-cursor-rotate: pointer; --tl-cursor-nwse-rotate: pointer; --tl-cursor-nesw-rotate: pointer; --tl-cursor-senw-rotate: pointer; --tl-cursor-swne-rotate: pointer; --tl-scale: calc(1 / var(--tl-zoom)); /* fonts */ --tl-font-draw: 'tldraw_draw', sans-serif; --tl-font-sans: 'tldraw_sans', sans-serif; --tl-font-serif: 'tldraw_serif', serif; --tl-font-mono: 'tldraw_mono', monospace; /* text outline */ --a: calc(min(0.5, 1 / var(--tl-zoom)) * 2px); --b: calc(min(0.5, 1 / var(--tl-zoom)) * -2px); --tl-text-outline-reference: 0 var(--b) 0 var(--color-background), 0 var(--a) 0 var(--color-background), var(--b) var(--b) 0 var(--color-background), var(--a) var(--b) 0 var(--color-background), var(--a) var(--a) 0 var(--color-background), var(--b) var(--a) 0 var(--color-background); --tl-text-outline: var(--tl-text-outline-reference); /* own properties */ position: relative; inset: 0px; height: 100%; width: 100%; overflow: clip; color: var(--color-text); } .tl-theme__light { --color-accent: hsl(0, 76%, 60%); --color-background: hsl(210, 20%, 98%); --color-brush-fill: hsl(0, 0%, 56%, 10.2%); --color-brush-stroke: hsl(0, 0%, 56%, 25.1%); --color-grid: hsl(0, 0%, 43%); --color-low: hsl(204, 16%, 94%); --color-low-border: hsl(204, 16%, 92%); --color-culled: hsl(204, 14%, 93%); --color-muted-none: hsl(0, 0%, 0%, 0%); --color-muted-0: hsl(0, 0%, 0%, 2%); --color-muted-1: hsl(0, 0%, 0%, 10%); --color-muted-2: hsl(0, 0%, 0%, 4.3%); --color-hint: hsl(0, 0%, 0%, 5.5%); --color-overlay: hsl(0, 0%, 0%, 20%); --color-divider: hsl(0, 0%, 91%); --color-panel-contrast: hsl(0, 0%, 100%); --color-panel-overlay: hsl(0, 0%, 100%, 82%); --color-panel: hsl(0, 0%, 99%); --color-focus: hsl(214, 100%, 29%); --color-selected: hsl(214, 84%, 56%); --color-selected-contrast: hsl(0, 0%, 100%); --color-selection-fill: hsl(210, 100%, 56%, 24%); --color-selection-stroke: hsl(214, 84%, 56%); --color-text-0: hsl(0, 0%, 11%); --color-text-1: hsl(0, 0%, 18%); --color-text-3: hsl(220, 2%, 65%); --color-text-shadow: hsl(0, 0%, 100%); --color-primary: hsl(214, 84%, 56%); --color-success: hsl(123, 46%, 34%); --color-info: hsl(201, 98%, 41%); --color-warning: hsl(27, 98%, 47%); --color-error: hsl(0, 65%, 51%); --color-warn: hsl(0, 90%, 43%); --color-text: hsl(0, 0%, 0%); --color-laser: hsl(0, 100%, 50%); /* Shadows */ --shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 25%), 0px 1px 3px hsl(0, 0%, 0%, 9%); --shadow-2: 0px 0px 2px hsl(0, 0%, 0%, 16%), 0px 2px 3px hsl(0, 0%, 0%, 24%), 0px 2px 6px hsl(0, 0%, 0%, 0.1), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-3: 0px 1px 2px hsl(0, 0%, 0%, 28%), 0px 2px 6px hsl(0, 0%, 0%, 14%), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-4: 0px 0px 3px hsl(0, 0%, 0%, 19%), 0px 5px 4px hsl(0, 0%, 0%, 16%), 0px 2px 16px hsl(0, 0%, 0%, 6%), inset 0px 0px 0px 1px var(--color-panel-contrast); } .tl-theme__dark { --color-accent: hsl(0, 76%, 60%); --color-background: hsl(240, 5%, 6.5%); --color-brush-fill: hsl(0, 0%, 71%, 5.1%); --color-brush-stroke: hsl(0, 0%, 71%, 25.1%); --color-grid: hsl(0, 0%, 40%); --color-low: hsl(260, 4.5%, 10.5%); --color-low-border: hsl(207, 10%, 10%); --color-culled: hsl(210, 11%, 19%); --color-muted-none: hsl(0, 0%, 100%, 0%); --color-muted-0: hsl(0, 0%, 100%, 2%); --color-muted-1: hsl(0, 0%, 100%, 10%); --color-muted-2: hsl(0, 0%, 100%, 5%); --color-hint: hsl(0, 0%, 100%, 7%); --color-overlay: hsl(0, 0%, 0%, 50%); --color-divider: hsl(240, 9%, 22%); --color-panel-contrast: hsl(245, 12%, 23%); --color-panel: hsl(235, 6.8%, 13.5%); --color-panel-overlay: hsl(210, 10%, 24%, 82%); --color-focus: hsl(217, 76%, 80%); --color-selected: hsl(217, 89%, 61%); --color-selected-contrast: hsl(0, 0%, 100%); --color-selection-fill: hsl(209, 100%, 57%, 20%); --color-selection-stroke: hsl(214, 84%, 56%); --color-text-0: hsl(0, 9%, 94%); --color-text-1: hsl(0, 0%, 85%); --color-text-3: hsl(210, 6%, 45%); --color-text-shadow: hsl(210, 13%, 18%); --color-primary: hsl(214, 84%, 56%); --color-success: hsl(123, 38%, 57%); --color-info: hsl(199, 92%, 56%); --color-warning: hsl(36, 100%, 57%); --color-error: hsl(4, 90%, 58%); --color-warn: hsl(0, 81%, 66%); --color-text: hsl(210, 17%, 98%); --color-laser: hsl(0, 100%, 50%); /* Shadows */ --shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 16.1%), 0px 1px 3px hsl(0, 0%, 0%, 22%), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-2: 0px 1px 3px hsl(0, 0%, 0%, 66.6%), 0px 2px 6px hsl(0, 0%, 0%, 33%), inset 0px 0px 0px 1px var(--color-panel-contrast); --shadow-3: 0px 1px 3px hsl(0, 0%, 0%, 50%), 0px 2px 12px hsl(0, 0%, 0%, 50%), inset 0px 0px 0px 1px var(--color-panel-contrast); } .tl-counter-scaled { transform: scale(var(--tl-scale)); transform-origin: top left; width: calc(100% * var(--tl-zoom)); height: calc(100% * var(--tl-zoom)); } .tl-container, .tl-container * { -webkit-touch-callout: none; -webkit-tap-highlight-color: transparent; scrollbar-highlight-color: transparent; -webkit-user-select: none; -moz-user-select: none; user-select: none; box-sizing: border-box; outline: none; } .tl-container a { -webkit-touch-callout: initial; } .tl-container__focused { outline: 1px solid var(--color-low); } input, *[contenteditable], *[contenteditable] * { -webkit-user-select: text; } /* -------------------------------------------------- */ /* Canvas */ /* -------------------------------------------------- */ .tl-canvas { position: absolute; inset: 0px; height: 100%; width: 100%; color: var(--color-text); cursor: var(--tl-cursor); overflow: clip; content-visibility: auto; touch-action: none; contain: strict; } .tl-shapes { position: relative; z-index: var(--layer-canvas-shapes); } .tl-overlays { position: absolute; top: 0px; left: 0px; height: 100%; width: 100%; contain: strict; pointer-events: none; z-index: var(--layer-canvas-overlays); } .tl-overlays__item { position: absolute; top: 0px; left: 0px; overflow: visible; pointer-events: none; transform-origin: top left; } .tl-svg-context { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; pointer-events: none; } /* ------------------- Background ------------------- */ .tl-background__wrapper { z-index: var(--layer-canvas-background); position: absolute; inset: 0px; height: 100%; width: 100%; } .tl-background { background-color: var(--color-background); width: 100%; height: 100%; } /* --------------------- Grid Layer --------------------- */ .tl-grid { position: absolute; inset: 0px; width: 100%; height: 100%; touch-action: none; pointer-events: none; z-index: var(--layer-canvas-grid); contain: strict; } .tl-grid-dot { fill: var(--color-grid); } /* --------------------- Layers --------------------- */ .tl-html-layer { position: absolute; top: 0px; left: 0px; width: 1px; height: 1px; contain: layout style size; } /* ---------------------- Brush --------------------- */ .tl-brush { stroke-width: calc(var(--tl-scale) * 1px); contain: size layout; } .tl-brush__default { stroke: var(--color-brush-stroke); fill: var(--color-brush-fill); } /* -------------------- Scribble -------------------- */ .tl-scribble { stroke-linejoin: round; stroke-linecap: round; pointer-events: none; contain: size layout; } /* ---------------------- Shape --------------------- */ .tl-shape { position: absolute; pointer-events: none; overflow: visible; transform-origin: top left; contain: size layout; } /* ---------------- Shape Containers ---------------- */ .tl-svg-container { position: absolute; inset: 0px; height: 100%; width: 100%; pointer-events: none; stroke-linecap: round; stroke-linejoin: round; transform-origin: top left; overflow: visible; } .tl-html-container { position: absolute; inset: 0px; height: 100%; width: 100%; pointer-events: none; stroke-linecap: round; stroke-linejoin: round; /* content-visibility: auto; */ transform-origin: top left; color: inherit; } /* --------------- Overlay Stack --------------- */ /* back of the stack, behind user's stuff */ .tl-collaborator__scribble { z-index: var(--layer-overlays-collaborator-scribble); } .tl-collaborator__brush { z-index: var(--layer-overlays-collaborator-brush); } .tl-collaborator__shape-indicator { z-index: var(--layer-overlays-collaborator-shape-indicator); } .tl-user-scribble { z-index: var(--layer-overlays-user-scribble); } .tl-user-brush { z-index: var(--layer-overlays-user-brush); } .tl-user-indicator__selected { z-index: var(--layer-overlays-user-indicator-selected); } .tl-user-indicator__hovered { z-index: var(--layer-overlays-user-indicator-hovered); } .tl-user-handles { z-index: var(--layer-overlays-user-handles); } .tl-user-snapline { z-index: var(--layer-overlays-user-snapline); } .tl-selection__fg { pointer-events: none; z-index: var(--layer-overlays-selection-fg); } .tl-user-indicator__hint { z-index: var(--layer-overlays-user-indicator-hint); stroke-width: calc(2.5px * var(--tl-scale)); } /* behind collaborator cursor */ .tl-collaborator__cursor-hint { z-index: var(--layer-overlays-collaborator-cursor-hint); } .tl-collaborator__cursor { z-index: var(--layer-overlays-collaborator-cursor); } .tl-cursor { overflow: visible; } /* -------------------- Indicator ------------------- */ .tl-shape-indicator { transform-origin: top left; fill: none; stroke-width: calc(1.5px * var(--tl-scale)); contain: size layout; } /* ------------------ SelectionBox ------------------ */ .tl-selection__bg { position: absolute; top: 0px; left: 0px; transform-origin: top left; background-color: transparent; pointer-events: all; } .tl-selection__fg__outline { fill: none; pointer-events: none; stroke: var(--color-selection-stroke); stroke-width: calc(1.5px * var(--tl-scale)); } .tl-corner-handle { pointer-events: none; stroke: var(--color-selection-stroke); fill: var(--color-background); stroke-width: calc(1.5px * var(--tl-scale)); } .tl-text-handle { pointer-events: none; fill: var(--color-selection-stroke); } .tl-corner-crop-handle { pointer-events: none; fill: none; stroke: var(--color-selection-stroke); } .tl-corner-crop-edge-handle { pointer-events: none; fill: none; stroke: var(--color-selection-stroke); } .tl-mobile-rotate__bg { pointer-events: all; cursor: var(--tl-cursor-grab); } .tl-mobile-rotate__fg { pointer-events: none; stroke: var(--color-selection-stroke); fill: var(--color-background); stroke-width: calc(1.5px * var(--tl-scale)); } .tl-transparent { fill: transparent; stroke: transparent; } /* --------------------- Handles -------------------- */ .tl-handle { pointer-events: all; } .tl-handle__bg { fill: transparent; stroke: transparent; pointer-events: all; } .tl-handle__fg { fill: var(--color-selected-contrast); stroke: var(--color-selection-stroke); stroke-width: calc(1.5px * var(--tl-scale)); pointer-events: none; } .tl-handle__create { opacity: 0; } .tl-handle__clone > .tl-handle__fg { fill: var(--color-selection-stroke); stroke: none; } .tl-handle__bg:active { fill: none; } @media (pointer: coarse) { .tl-handle__bg:active { fill: var(--color-selection-fill); } .tl-handle__create { opacity: 1; } } /* ------------------ Bounds Detail ----------------- */ .tl-image, .tl-video { -o-object-fit: cover; object-fit: cover; background-size: cover; width: 100%; height: 100%; } .tl-video.tl-video-is-fullscreen { -o-object-fit: contain; object-fit: contain; background-size: contain; } .tl-video-container, .tl-image-container, .tl-embed-container { width: 100%; height: 100%; pointer-events: all; /* background-color: var(--color-background); */ display: flex; justify-content: center; align-items: center; } .tl-image-container { position: relative; overflow: hidden; } .tl-image { position: absolute; inset: 0; } .tl-image__tg { --scale: calc(min(2, var(--tl-scale))); position: absolute; top: calc(var(--scale) * 8px); right: calc(var(--scale) * 8px); font-size: 10px; transform-origin: top right; background-color: var(--color-background); padding: 2px 4px; border-radius: var(--radius-1); } /* --------------------- Nametag -------------------- */ .tl-collaborator-cursor { position: absolute; } .tl-nametag { top: 16px; left: 13px; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; max-width: 120px; padding: 3px 6px; white-space: nowrap; position: absolute; overflow: hidden; text-overflow: ellipsis; font-size: 12px; font-family: var(--font-body); border-radius: var(--radius-2); color: var(--color-selected-contrast); } .tl-nametag-title { top: -2px; left: 13px; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; padding: 0px 6px; max-width: 120px; white-space: nowrap; position: absolute; overflow: hidden; text-overflow: ellipsis; font-size: 12px; font-family: var(--font-body); text-shadow: var(--tl-text-outline); color: var(--color-selected-contrast); } .tl-nametag-chat { top: 16px; left: 13px; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; color: var(--color-selected-contrast); white-space: nowrap; position: absolute; padding: 3px 6px; font-size: 12px; font-family: var(--font-body); opacity: 1; border-radius: var(--radius-2); } .tl-cursor-chat { position: absolute; color: var(--color-selected-contrast); white-space: nowrap; padding: 3px 6px; font-size: 12px; font-family: var(--font-body); pointer-events: none; z-index: var(--layer-cursor); margin-top: 16px; margin-left: 13px; opacity: 1; border: none; -webkit-user-select: text; -moz-user-select: text; user-select: text; border-radius: var(--radius-2); } .tl-cursor-chat .tl-cursor-chat__bubble { padding-right: 12px; } .tl-cursor-chat::-moz-selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } .tl-cursor-chat::selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } .tl-cursor-chat-fade { /* Setting to zero causes it to immediately disappear */ /* Setting to near-zero causes it to fade out gradually */ opacity: 0.0001; transition: opacity 5s ease-in-out; } .tl-cursor-chat::-moz-placeholder { color: var(--color-selected-contrast); opacity: 0.7; } .tl-cursor-chat::placeholder { color: var(--color-selected-contrast); opacity: 0.7; } /* -------------------------------------------------- */ /* Spinner */ /* -------------------------------------------------- */ @keyframes spinner { to { transform: rotate(360deg); } } /* ------------------- Text Shape ------------------- */ .tl-text-shape-label { position: relative; font-weight: normal; min-width: 1px; padding: 0px; margin: 0px; border: none; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; font-variant: normal; font-style: normal; pointer-events: all; white-space: pre-wrap; overflow-wrap: break-word; text-shadow: var(--tl-text-outline); } .tl-text-wrapper[data-font='draw'] { font-family: var(--tl-font-draw); } .tl-text-wrapper[data-font='sans'] { font-family: var(--tl-font-sans); } .tl-text-wrapper[data-font='serif'] { font-family: var(--tl-font-serif); } .tl-text-wrapper[data-font='mono'] { font-family: var(--tl-font-mono); } .tl-text-wrapper[data-align='start'], .tl-text-wrapper[data-align='start-legacy'] { text-align: left; } .tl-text-wrapper[data-align='middle'], .tl-text-wrapper[data-align='middle-legacy'] { text-align: center; } .tl-text-wrapper[data-align='end'], .tl-text-wrapper[data-align='end-legacy'] { text-align: right; } .tl-text-wrapper[data-isediting='true'] .tl-text-content { opacity: 0; } .tl-text { /* remove overflow from textarea on windows */ margin: 0px; padding: 0px; -webkit-appearance: auto; -moz-appearance: auto; appearance: auto; background: none; -o-border-image: none; border-image: none; border: 0px; caret-color: var(--color-text); color: inherit; -moz-column-count: initial !important; column-count: initial !important; display: inline-block; font-family: inherit; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: inherit; font-stretch: 100%; font-style: inherit; font-variant: inherit; font-variation-settings: normal; font-weight: inherit; letter-spacing: inherit; line-height: inherit; outline: none; overflow-wrap: break-word; text-align: inherit; text-indent: 0px; text-rendering: auto; text-shadow: inherit; text-transform: none; white-space: pre-wrap; line-break: normal; word-spacing: 0px; word-wrap: break-word; writing-mode: horizontal-tb !important; } .tl-text-measure { position: absolute; z-index: var(--layer-canvas-hidden); top: 0px; left: 0px; opacity: 0; width: -moz-max-content; width: max-content; box-sizing: border-box; pointer-events: none; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; resize: none; border: none; -moz-user-select: none; user-select: none; contain: style paint; -webkit-user-select: none; } .tl-text-input, .tl-text-content { position: absolute; inset: 0px; height: 100%; width: 100%; min-width: 1px; min-height: 1px; overflow: visible; outline: none; } .tl-text-content__wrapper { position: relative; width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; display: flex; align-items: center; justify-content: center; pointer-events: none; min-height: auto; } .tl-text-content { pointer-events: none; } .tl-text-input { resize: none; -moz-user-select: all; user-select: all; -webkit-user-select: text; overflow: hidden; cursor: var(--tl-cursor-text); } .tl-text-wrapper[data-isediting='false'] .tl-text-input, .tl-arrow-label[data-isediting='false'] .tl-text-input { opacity: 0; cursor: var(--tl-cursor-default); } .tl-text-input::-moz-selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } .tl-text-input::selection { background: var(--color-selected); color: var(--color-selected-contrast); text-shadow: none; } /* ------------------- Snap Lines ------------------- */ .tl-snap-indicator { stroke: var(--color-accent); stroke-width: calc(1px * var(--tl-scale)); fill: none; } .tl-snap-point { stroke: var(--color-accent); stroke-width: calc(1px * var(--tl-scale)); fill: none; } /* -------------------- Groups ------------------ */ .tl-group { stroke: var(--color-text); stroke-width: calc(1px * var(--tl-scale)); opacity: 0.5; } /* ------------------- Bookmark Shape ------------------- */ .tl-bookmark__container { width: 100%; height: 100%; position: relative; border: 1px solid var(--color-panel-contrast); background-color: var(--color-panel); border-radius: var(--radius-2); display: flex; flex-direction: column; overflow: hidden; } .tl-bookmark__container--safariExport { border: 1px solid var(--color-divider); } .tl-bookmark__image_container { flex: 1 1 100%; overflow: hidden; border-top-left-radius: var(--radius-1); border-top-right-radius: var(--radius-1); width: 100%; height: 100%; display: flex; justify-content: flex-end; align-items: flex-start; } .tl-bookmark__image_container > .tl-hyperlink-button::after { background-color: var(--color-panel); } .tl-bookmark__placeholder { width: 100%; height: 100%; background-color: var(--color-muted-2); border-bottom: 1px solid var(--color-muted-2); } .tl-bookmark__image { width: 100%; height: 100%; -o-object-fit: cover; object-fit: cover; -o-object-position: center; object-position: center; border-bottom: 1px solid var(--color-muted-2); } .tl-bookmark__copy_container { background-color: var(--color-muted); padding: var(--space-4); pointer-events: all; display: flex; flex-direction: column; justify-content: space-between; flex: 1; } .tl-bookmark__heading, .tl-bookmark__description, .tl-bookmark__link { margin: 0px; width: 100%; font-family: inherit; } .tl-bookmark__heading { font-size: 16px; line-height: 1.5; font-weight: bold; padding-bottom: var(--space-2); overflow: hidden; max-height: calc((16px * 1.5) * 2); -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; text-overflow: ellipsis; display: -webkit-box; } .tl-bookmark__description { font-size: 12px; line-height: 1.5; overflow: hidden; max-height: calc((12px * 1.5) * 3); -webkit-box-orient: vertical; -webkit-line-clamp: 3; line-clamp: 3; text-overflow: ellipsis; display: -webkit-box; color: var(--color-text-2); margin: var(--space-2) 0px; } .tl-bookmark__heading + .tl-bookmark__link, .tl-bookmark__description + .tl-bookmark__link { margin-top: var(--space-3); } .tl-bookmark__link { font-size: 12px; pointer-events: all; display: flex; color: var(--color-text-2); align-items: center; cursor: var(--tl-cursor-pointer); width: -moz-fit-content; width: fit-content; max-width: 100%; } .tl-bookmark__link > span { flex-shrink: 0px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .tl-bookmark__link > .tl-hyperlink__icon { margin-right: 8px; flex-shrink: 0; } .tl-bookmark__link > .tl-bookmark__favicon { margin-right: 8px; width: 16px; height: 16px; flex-shrink: 0; } /* ---------------- Hyperlink Button ---------------- */ .tl-hyperlink-button { background: none; margin: 0px; position: absolute; top: 0px; right: 0px; height: 44px; width: 44px; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 400; color: var(--color-text-1); padding: 13px; cursor: var(--tl-cursor-pointer); border: none; outline: none; pointer-events: all; z-index: 1; } .tl-hyperlink-button::after { content: ''; z-index: -1; position: absolute; right: 6px; bottom: 6px; display: block; width: calc(100% - 12px); height: calc(100% - 12px); border-radius: var(--radius-1); background-color: var(--color-background); pointer-events: none; } .tl-hyperlink-button:focus-visible { color: var(--color-selected); } .tl-hyperlink__icon { width: 16px; height: 16px; background-color: currentColor; pointer-events: none; } .tl-hyperlink-button__hidden { display: none; } /* ---------------- Geo shape ---------------- */ .tl-text-label { display: flex; justify-content: center; align-items: center; color: var(--color-text); text-shadow: var(--tl-text-outline); line-height: inherit; position: absolute; inset: 0px; height: 100%; width: 100%; } .tl-text-label[data-hastext='false'][data-isediting='false'] > .tl-text-label__inner { width: 40px; height: 40px; } .tl-text-label[data-hastext='true'][data-isediting='false'] .tl-text-content { pointer-events: all; } .tl-text-wrapper .tl-text-content { pointer-events: all; z-index: var(--layer-text-content); } .tl-text-label__inner > .tl-text-content { position: relative; top: 0px; left: 0px; padding: inherit; height: -moz-fit-content; height: fit-content; width: -moz-fit-content; width: fit-content; border-radius: var(--radius-1); max-width: 100%; } .tl-text-label__inner > .tl-text-input { position: absolute; inset: 0px; height: 100%; width: 100%; padding: inherit; } .tl-text-wrapper[data-isselected='true'] .tl-text-input { z-index: var(--layer-text-editor); pointer-events: all; } /* This part of the rule helps preserve the occlusion rules for the shapes so we * don't click on shapes that are behind other shapes. * One extra nuance is we don't use this behavior for: * - arrows which have weird geometry and just gets in the way. * - draw/line shapes, because it feels restrictive to have them be 'in the way' of clicking on a textfield * - shapes that are not filled */ .tl-canvas:is([data-iseditinganything='true'], [data-isselectinganything='true']) .tl-shape:not( [data-shape-type='arrow'], [data-shape-type='draw'], [data-shape-type='line'], [data-shape-type='highlight'], [data-shape-is-filled='false'] ) { pointer-events: all; } .tl-text-label[data-textwrap='true'] > .tl-text-label__inner { max-width: 100%; } .tl-text-label[data-isediting='true'] { background-color: transparent; min-height: auto; } .tl-text-label[data-isediting='true'] p { opacity: 0; } .tl-arrow-hint { stroke: var(--color-text-1); fill: none; stroke-linecap: round; overflow: visible; } /* ------------------- Arrow Shape ------------------ */ .tl-arrow-label { position: absolute; top: -1px; left: -1px; width: 2px; height: 2px; padding: 0px; display: flex; justify-content: center; align-items: center; text-align: center; color: var(--color-text); text-shadow: var(--tl-text-outline); } .tl-arrow-label[data-isediting='true'] p { opacity: 0; } .tl-arrow-label[data-isediting='true'] > .tl-arrow-label__inner { background-color: var(--color-background); } .tl-arrow-label__inner { border-radius: var(--radius-1); box-sizing: content-box; position: relative; height: -moz-max-content; height: max-content; width: -moz-max-content; width: max-content; pointer-events: none; display: flex; justify-content: center; align-items: center; } .tl-arrow-label .tl-arrow { position: relative; height: -moz-max-content; height: max-content; padding: inherit; overflow: visible; } .tl-arrow-label textarea { padding: inherit; /* Don't allow textarea to be zero width */ min-width: 4px; } /* -------------------- NoteShape ------------------- */ .tl-note__container { position: relative; width: 100%; height: 100%; pointer-events: all; opacity: 1; z-index: var(--layer-text-container); border-radius: 1px; } .tl-note__container > .tl-text-label { text-shadow: none; color: currentColor; } /* --------------------- Loading -------------------- */ .tl-loading { background-color: var(--color-background); color: var(--color-text-1); height: 100%; width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: var(--space-2); font-size: 14px; font-weight: 500; opacity: 0; animation: fade-in 0.2s ease-in-out forwards; animation-delay: 0.2s; } @keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; } } /* -------------------- FrameShape ------------------- */ .tl-frame__body { stroke-width: calc(1px * var(--tl-scale)); } .tl-frame__creating { stroke: var(--color-selected); fill: none; } .tl-frame-heading { display: flex; align-items: center; position: absolute; transform-origin: 0% 100%; overflow: hidden; max-width: 100%; min-width: 32px; height: auto; font-size: 12px; padding-bottom: 4px; pointer-events: all; } .tl-frame-heading-hit-area { pointer-events: all; /* scale from bottom left corner so we can pin it to the top left corner of the frame */ transform-origin: 0% 100%; display: flex; height: 100%; width: 100%; align-items: center; border-radius: var(--radius-1); background-color: var(--color-background); } .tl-frame-label { pointer-events: all; overflow: hidden; text-overflow: ellipsis; padding: var(--space-3) var(--space-3); position: relative; font-size: inherit; white-space: pre; border: 1px solid transparent; } .tl-frame-label__editing { color: transparent; white-space: pre; width: auto; overflow: visible; background-color: var(--color-panel); border-radius: var(--radius-1); border-color: var(--color-selected); } .tl-frame-name-input { position: absolute; border: none; background: none; outline: none; padding: var(--space-3) var(--space-3); inset: 0px; height: 100%; font-size: inherit; font-family: inherit; font-weight: inherit; width: 100%; color: var(--color-text-1); border-radius: var(--radius-1); -moz-user-select: all; user-select: all; -webkit-user-select: text; white-space: pre; cursor: var(--tl-cursor-text); } /* 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) { .tl-frame-heading { font-size: 16px; } } /* ------------------ iFrames Detail ----------------- */ .tl-embed { border: none; border-radius: var(--radius-2); } /* -------------- Shape Error Boundary -------------- */ .tl-shape-error-boundary { width: 100%; height: 100%; background-color: var(--color-muted-1); border-width: calc(1px * var(--tl-scale)); border-color: var(--color-muted-1); border-style: solid; border-radius: calc(var(--radius-1) * var(--tl-scale)); display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: left; position: relative; pointer-events: all; overflow: hidden; padding: var(--space-2); } .tl-shape-error-boundary::before { transform: scale(var(--tl-scale)); content: 'Error'; font-size: 12px; font-family: inherit; color: var(--color-text-0); } /* ----------------- Error Boundary ----------------- */ .tl-error-boundary { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; padding: var(--space-4); background-color: var(--color-background); color: var(--color-text-1); position: absolute; } .tl-error-boundary__overlay { position: absolute; inset: 0px; height: 100%; width: 100%; z-index: var(--layer-error-overlay); background-color: var(--color-overlay); } .tl-error-boundary__content * { -moz-user-select: all; user-select: all; -webkit-user-select: text; pointer-events: all; } .tl-error-boundary__canvas { pointer-events: none; position: absolute; inset: 0px; height: 100%; width: 100%; z-index: var(--layer-error-canvas); } /* some browsers seem to have some weird interactions between stacking contexts and pointer-events. this ::after pseudo element covers the canvas and prevents it from receiving any pointer events or affecting the cursor. */ .tl-error-boundary__canvas::after { content: ' '; display: block; position: absolute; inset: 0px; height: 100%; width: 100%; z-index: var(--layer-error-canvas-after); pointer-events: all; } .tl-error-boundary__content { width: -moz-fit-content; width: fit-content; height: -moz-fit-content; height: fit-content; max-width: 100%; width: 400px; max-height: 100%; background-color: var(--color-panel); padding: 16px; border-radius: 16px; box-shadow: var(--shadow-2); font-size: 14px; font-weight: 400; display: flex; flex-direction: column; overflow: auto; z-index: var(--layer-error-content); gap: 12px; } .tl-error-boundary__content__expanded { width: 600px; } .tl-error-boundary__content h2 { font-size: 16px; margin: 0px; font-weight: 500; } .tl-error-boundary__content h4 { border: 1px solid var(--color-low-border); margin: -6px 0 0 0; padding: var(--space-5); border-radius: var(--radius-2); font-weight: normal; } .tl-error-boundary__content p { line-height: 1.5; margin: 0px; } .tl-error-boundary__content pre { background-color: var(--color-muted-2); margin-top: 0; padding: var(--space-5); border-radius: var(--radius-2); overflow: auto; font-size: 12px; max-height: 320px; } .tl-error-boundary__content button { background: none; border: none; font-family: inherit; font-size: 14px; font-weight: 500; padding: var(--space-4); border-radius: var(--radius-3); cursor: var(--tl-cursor-pointer); color: inherit; background-color: transparent; } .tl-error-boundary__content a { color: var(--color-selected); font-weight: 500; text-decoration: none; } .tl-error-boundary__content__error { position: relative; margin: -6px 0 0 0; } .tl-error-boundary__content__error button { position: absolute; top: var(--space-2); right: var(--space-2); font-size: 12px; padding: var(--space-2) var(--space-3); background-color: var(--color-panel); border-radius: var(--radius-1); } .tl-error-boundary__content__actions { display: flex; justify-content: space-between; gap: var(--space-4); margin: 0px; margin-left: -4px; } .tl-error-boundary__content__actions__group { display: flex; gap: var(--space-4); } .tl-error-boundary__content .tl-error-boundary__reset { color: var(--color-warn); } .tl-error-boundary__content .tl-error-boundary__refresh { background-color: var(--color-primary); color: var(--color-selected-contrast); } /* --------------------- Coarse --------------------- */ .tl-hidden { opacity: 0; pointer-events: none; } .debug__ui-logger { position: absolute; top: 62px; left: 16px; color: #555; font-size: 12px; font-family: monospace; } /* ---------------- Hit test blocker ---------------- */ .tl-hit-test-blocker { position: absolute; z-index: var(--layer-canvas-blocker); inset: 0px; width: 100%; height: 100%; pointer-events: all; } .tl-hit-test-blocker__hidden { display: none; } @media (hover: hover) { .tl-handle__create:hover { opacity: 1; } .tl-handle__bg:hover { cursor: var(--tl-cursor-grab); fill: var(--color-selection-fill); } .tl-bookmark__link:hover { color: var(--color-selected); } .tl-hyperlink-button:hover { color: var(--color-selected); } .tl-error-boundary__content button:hover { background-color: var(--color-low); } .tl-error-boundary__content a:hover { color: var(--color-text-1); } .tl-error-boundary__content .tl-error-boundary__refresh:hover { background-color: var(--color-primary); opacity: 0.9; } /* These three rules help preserve clicking into specific points in text areas *while* * already in edit mode when jumping from shape to shape. */ .tl-canvas[data-iseditinganything='true'] .tl-text-wrapper:hover .tl-text-input { z-index: var(--layer-text-editor); pointer-events: all; } } /* @tldraw/ui */ .tl-container { --layer-above: 1; --layer-focused-input: 10; --layer-menu-click-capture: 250; --layer-panels: 300; --layer-menus: 400; --layer-toasts: 650; --layer-cursor: 700; --layer-header-footer: 999; --layer-following-indicator: 1000; } /* -------------------------------------------------- */ /* UI Refresh */ /* -------------------------------------------------- */ /* Button */ .tlui-button { position: relative; height: 40px; min-width: 40px; padding: 0px 12px; display: flex; align-items: center; justify-content: center; background-color: transparent; border: transparent; color: currentColor; cursor: pointer; pointer-events: all; font-weight: inherit; font-family: inherit; line-height: inherit; text-rendering: optimizeLegibility; font-size: 12px; gap: 0px; color: var(--color-text-1); } .tlui-button:disabled { color: var(--color-text-3); text-shadow: none; cursor: default; } .tlui-button:disabled .tlui-kbd { color: var(--color-text-3); } .tlui-button > * { position: relative; z-index: var(--layer-above); } .tlui-button__label { font-size: 12px; flex-grow: 2; text-align: left; } .tlui-button:focus-visible:not(:hover) { /* todo: fix the indicator errors in radix dropdown menus before restoring */ /* outline: 1px solid var(--color-selected); */ outline: none; outline-offset: -4px; border-radius: var(--radius-3); } .tlui-button::after { display: block; content: ''; position: absolute; inset: 4px; background-color: transparent; border-radius: var(--radius-2); } .tlui-button[aria-expanded='true']::after { background-color: var(--color-muted-0); opacity: 1; } .tlui-button__icon + .tlui-button__label { margin-left: var(--space-2); } @media (hover: hover) { .tlui-button:not(.tlui-menu__submenu__trigger)::after, .tlui-button.tlui-menu__submenu__trigger[data-highlighted]::after { background-color: var(--color-muted-2); opacity: 0; } .tlui-button:not(:disabled):hover::after { opacity: 1; } } .tlui-button[data-state='hinted']::after { background-color: var(--color-hint); opacity: 1; } .tlui-button[data-state='hinted']:not(:disabled, :focus-visible):active:after { background: var(--color-hint); opacity: 1; } /* Low button */ .tlui-button__low { border-radius: var(--radius-3); background-color: var(--color-low); } @media (hover: hover) { .tlui-button__low::after { background-color: var(--color-muted-2); } } /* Primary / danger buttons */ .tlui-button__primary { color: var(--color-primary); } .tlui-button__danger { color: var(--color-warn); text-shadow: none; } @media (hover: hover) { .tlui-button__primary:not(:disabled, :focus-visible):hover { color: var(--color-primary); } .tlui-button__danger:not(:disabled, :focus-visible):hover { color: var(--color-warn); text-shadow: none; } } /* Panel button */ .tlui-button__panel { position: relative; } /* Menu button */ .tlui-button__menu { height: 40px; min-height: 40px; width: 100%; gap: 8px; margin: -4px 0px; } .tlui-button__menu:nth-child(1) { margin-top: 0px; } .tlui-button__menu:nth-last-child(1) { margin-bottom: 0px; } @media (hover: hover) { .tlui-button__menu::after { inset: 4px; border-radius: var(--radius-2); } } /* Menu checkbox button */ .tlui-button__checkbox { padding-left: 8px; } .tlui-button__checkbox__indicator { width: 15px; height: 15px; } /* Tool lock button */ .tlui-toolbar__lock-button { position: absolute; top: 4px; right: 0px; pointer-events: all; height: 40px; width: 40px; min-width: 0px; border-radius: var(--radius-2); } .tlui-toolbar__lock-button::after { top: 4px; left: 8px; inset: 4px; } /* Tool button */ .tlui-button__tool { position: relative; height: 48px; width: 48px; margin-left: -2px; margin-right: -2px; } .tlui-button__tool:focus-visible:not(:hover) { border-radius: 12px; } .tlui-button__tool:nth-of-type(1) { margin-left: 0px; } .tlui-button__tool:nth-last-of-type(1) { margin-right: 0px; } @media (hover: hover) { .tlui-button__tool::after { inset: 4px; border-radius: 8px; } .tlui-button__tool[aria-checked='true']:not(:disabled, :focus-visible):hover { color: var(--color-selected-contrast); } } .tlui-button__tool[aria-checked='true'] { color: var(--color-selected-contrast); } .tlui-button__tool[aria-checked='true']:not(:disabled, :focus-visible):active { color: var(--color-selected-contrast); } .tlui-button__tool[aria-checked='true']:not(:disabled)::after { background: var(--color-selected); opacity: 1; } .tlui-layout__mobile .tlui-button__tool { height: 48px; width: 43px; } .tlui-layout__mobile .tlui-button__tool > .tlui-icon { height: 16px; width: 16px; } /* Help */ .tlui-button__help { height: 32px; width: 32px; padding: 0px; min-width: 32px; border-radius: 100%; background-color: var(--color-low); border: 1px solid var(--color-low-border); } @media (hover: hover) { .tlui-button__help::after { background-color: var(--color-muted-2); border-radius: 100%; inset: 4px; } } /* Button Row */ .tlui-buttons__horizontal { display: flex; flex-direction: row; } .tlui-buttons__horizontal > * { margin-left: -2px; margin-right: -2px; } .tlui-buttons__horizontal > *:nth-child(1) { margin-left: 0px; } .tlui-buttons__horizontal > *:nth-last-child(1) { margin-right: 0px; } /* Button Grid */ .tlui-buttons__grid { display: grid; grid-template-columns: repeat(4, auto); grid-auto-flow: row; overflow: hidden; } .tlui-buttons__grid > .tlui-button { margin: -2px; } .tlui-buttons__grid > .tlui-button:nth-of-type(4n) { margin-right: 0px; } .tlui-buttons__grid > .tlui-button:nth-of-type(4n - 3) { margin-left: 0px; } .tlui-buttons__grid > .tlui-button:nth-of-type(-n + 4) { margin-top: 0px; } .tlui-buttons__grid > .tlui-button:nth-last-of-type(-n + 4) { margin-bottom: 0px; } /* Zoom button */ .tlui-zoom-menu__button__pct { width: 60px; min-width: 60px; text-align: center; } /* --------------------- 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; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; contain: strict; z-index: var(--layer-panels); -webkit-transform: translate3d(0, 0, 0); --sab: env(safe-area-inset-bottom); font-weight: 500; line-height: 1.6; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-smooth: antialiased; text-rendering: optimizeLegibility; } .tlui-layout__top { grid-column: 1; grid-row: 1; display: flex; min-width: 0px; justify-content: space-between; } .tlui-layout__top__left { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; width: 100%; height: 100%; flex: 0 1 0; } .tlui-layout__top__right { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-start; height: 100%; flex: 0 0 auto; min-width: 0px; } .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: -moz-min-content; width: min-content; gap: var(--space-3); margin: var(--space-2) var(--space-3); white-space: nowrap; pointer-events: none; z-index: var(--layer-panels); } /* ---------------------- Icon ---------------------- */ .tlui-icon { flex-shrink: 0; width: 18px; height: 18px; background-color: currentColor; } .tlui-icon__placeholder { flex-shrink: 0; width: 18px; height: 18px; background-color: transparent; } .tlui-icon__small { width: 15px; height: 15px; } /* --------------------- Slider --------------------- */ .tlui-slider { position: relative; display: flex; align-items: center; -webkit-user-select: none; -moz-user-select: none; user-select: none; touch-action: none; } .tlui-slider__container { width: 100%; 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: 14px; } .tlui-slider__range { position: absolute; top: calc(50% - 2px); left: 0px; height: 3px; background-color: var(--color-selected); border-radius: 14px; } .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-1); } .tlui-slider__thumb:active { cursor: grabbing; box-shadow: inset 0px 0px 0px 2px var(--color-text-1), 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); align-self: bottom; color: var(--color-text-1); margin-left: var(--space-4); } .tlui-kbd > span { width: 100%; text-align: center; display: inline; margin: 0px; padding: 2px; border-radius: 2px; } .tlui-kbd > span:last-child { padding-right: 0; } .tlui-kbd:not(:last-child) { margin-right: var(--space-2); } /* Focus Mode Button */ .tlui-focus-button { z-index: var(--layer-panels); pointer-events: all; } /* --------------------- 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-3); 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 { background-color: var(--color-low); width: 100%; display: grid; align-items: center; grid-template-columns: 1fr auto auto auto; justify-content: space-between; padding-left: var(--space-4); border-top: 1px solid var(--color-background); font-size: 12px; color: var(--color-text-1); z-index: var(--layer-panels); pointer-events: all; } .tlui-debug-panel__current-state { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .tlui-debug-panel__fps { margin-right: 8px; } .tlui-debug-panel__fps__slow { font-weight: bold; color: var(--color-warn); } /* -------------------- Menu Zone ------------------- */ .tlui-menu-zone { position: relative; z-index: var(--layer-panels); width: -moz-fit-content; width: fit-content; border-right: 2px solid var(--color-background); border-bottom: 2px solid var(--color-background); border-bottom-right-radius: var(--radius-4); 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%); } /* ------------------- Style Panel ------------------ */ .tlui-style-panel__wrapper { box-shadow: var(--shadow-2); border-radius: var(--radius-3); pointer-events: all; background-color: var(--color-panel); height: -moz-fit-content; height: fit-content; max-height: 100%; margin: 8px; margin-top: 4px; touch-action: auto; overscroll-behavior: none; overflow-y: auto; overflow-x: hidden; color: var(--color-text); } /* if the style panel is the only child (ie no share menu), increase the margin */ .tlui-style-panel__wrapper:only-child { margin-top: 8px; } .tlui-style-panel { position: relative; z-index: var(--layer-panels); pointer-events: all; width: 148px; max-width: 148px; } .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; } /* Only really used for the alignment picker */ .tlui-style-panel__row__extra-button { margin-left: -2px; } .tlui-style-panel__double-select-picker { display: flex; grid-template-columns: 1fr auto; align-items: center; padding-left: var(--space-4); color: var(--color-text-1); font-size: 12px; } .tlui-style-panel__double-select-picker-label { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; flex-grow: 2; max-width: 100%; } .tlui-style-panel__section *[data-state='open']::after { background: var(--color-muted-0); } /* ---------------------- Input --------------------- */ .tlui-input { background: none; margin: 0px; position: relative; z-index: var(--layer-above); height: 40px; max-height: 40px; display: flex; align-items: center; justify-content: center; font-family: inherit; font-size: 12px; font-weight: inherit; color: var(--color-text-1); padding: var(--space-4); padding-left: 0px; border: none; outline: none; text-overflow: ellipsis; width: 100%; -webkit-user-select: all; -moz-user-select: all; user-select: all; text-rendering: optimizeLegibility; -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; } } } /* ---------------- Dialog ---------------- */ .tlui-dialog__overlay { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; z-index: var(--layer-canvas-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-3); font-size: 12px; overflow: hidden; min-width: 300px; max-width: 80%; max-height: 80%; } .tlui-dialog__header { position: relative; display: flex; align-items: center; flex: 0; z-index: var(--layer-header-footer); 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); } .tlui-dialog__header__close { justify-self: flex-end; } .tlui-dialog__body { padding: var(--space-4) var(--space-4); flex: 0 1; overflow-y: auto; overflow-x: hidden; color: var(--color-text-1); -moz-user-select: all; user-select: all; -webkit-user-select: text; } .tlui-dialog__body a { color: var(--color-selected); } .tlui-dialog__body ul, .tlui-dialog__body ol { padding-left: 16px; display: flex; flex-direction: column; gap: var(--space-4); } .tlui-dialog__footer { position: relative; z-index: var(--layer-header-footer); } .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; } /* --------------------- 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-3) + var(--sab)); } /* Centered Content */ .tlui-toolbar__inner { position: relative; width: -moz-fit-content; width: fit-content; display: flex; gap: var(--space-3); align-items: flex-end; } .tlui-toolbar__left { width: -moz-fit-content; width: fit-content; } /* Row of controls + lock button */ .tlui-toolbar__extras { position: relative; z-index: var(--layer-above); width: 100%; pointer-events: none; top: 6px; height: 48px; } .tlui-toolbar__extras:empty { display: none; } .tlui-toolbar__extras__controls { display: flex; position: relative; flex-direction: row; z-index: var(--layer-above); background-color: var(--color-low); border-top-left-radius: var(--radius-4); border-top-right-radius: var(--radius-4); border: 2px solid var(--color-background); margin-left: 8px; margin-right: 0px; pointer-events: all; width: -moz-fit-content; width: fit-content; } .tlui-toolbar__tools { display: flex; flex-direction: row; align-items: center; background-color: var(--color-low); border-radius: var(--radius-4); z-index: var(--layer-panels); pointer-events: all; position: relative; background: var(--color-panel); box-shadow: var(--shadow-2); } .tlui-toolbar__tools__list { display: flex; flex-direction: row; align-items: center; } .tlui-toolbar__overflow { width: 40px; } .tlui-layout__mobile .tlui-toolbar__overflow { width: 32px; padding: 0px; } .tlui-layout__mobile .tlui-toolbar *[data-state='open']::after { background: linear-gradient(0deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%); } /* -------------------- Help Zone ------------------- */ .tlui-help-menu { pointer-events: all; position: absolute; bottom: var(--space-2); right: var(--space-2); z-index: var(--layer-panels); border: 2px solid var(--color-background); 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:empty { display: none; } .tlui-menu { z-index: var(--layer-menus); height: -moz-fit-content; height: fit-content; width: -moz-fit-content; width: fit-content; max-height: 80vh; border-radius: var(--radius-3); 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 { width: 100%; } .tlui-menu__group:empty { display: none; } .tlui-menu__group { border-bottom: 1px solid var(--color-divider); } .tlui-menu__group:nth-last-of-type(1) { border-bottom: none; } .tlui-menu__submenu__trigger[data-state='open']:not(:hover)::after { border-radius: 0px; 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: 0px; background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--color-muted-2) 100%); } /* Menu Sizes */ .tlui-menu[data-size='large'] > .tlui-menu__group { min-width: initial; } .tlui-menu[data-size='medium'] > .tlui-menu__group { min-width: 144px; } .tlui-menu[data-size='small'] > .tlui-menu__group { min-width: 96px; } .tlui-menu[data-size='tiny'] > .tlui-menu__group { min-width: 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: 11px; padding-left: var(--space-4); color: var(--color-text-1); } .tlui-toast__container { min-width: 200px; display: flex; flex-direction: row; background-color: var(--color-panel); box-shadow: var(--shadow-2); border-radius: var(--radius-3); font-size: 12px; } .tlui-toast__container[data-severity='success'] .tlui-icon { color: var(--color-success); } .tlui-toast__container[data-severity='info'] .tlui-icon { color: var(--color-info); } .tlui-toast__container[data-severity='warning'] .tlui-icon { color: var(--color-warning); } .tlui-toast__container[data-severity='error'] .tlui-icon { color: var(--color-error); } .tlui-toast__main { flex-grow: 2; max-width: 280px; } .tlui-toast__content { padding: var(--space-4); display: flex; line-height: 1.4; flex-direction: column; gap: var(--space-3); } .tlui-toast__main[data-actions='true'] .tlui-toast__content { padding-bottom: var(--space-2); } .tlui-toast__title { font-weight: bold; color: var(--color-text-1); /* this makes the default toast look better */ line-height: 16px; } .tlui-toast__description { color: var(--color-text-1); padding: var(--space-3); margin: 0px; padding: 0px; } .tlui-toast__icon + .tlui-toast__main > .tlui-toast__actions { padding-left: 0px; } .tlui-toast__actions { display: flex; flex-direction: row; justify-content: flex-start; margin-left: 0; } .tlui-toast__close { align-self: flex-end; flex-shrink: 0; } @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; } } /* --------------------- Bottom --------------------- */ .tlui-layout__bottom { grid-row: 2; } .tlui-layout__bottom__main { width: 100%; position: relative; display: flex; align-items: flex-end; justify-content: center; } /* ------------------- Navigation ------------------- */ .tlui-navigation-panel { display: flex; width: -moz-min-content; width: min-content; flex-direction: column; z-index: var(--layer-panels); pointer-events: all; position: absolute; left: 0px; bottom: 0px; } .tlui-navigation-panel::before { content: ''; display: block; position: absolute; z-index: -1; inset: -2px -2px 0px 0px; border-radius: 0; border-top: 2px solid var(--color-background); border-right: 2px solid var(--color-background); border-top-right-radius: var(--radius-4); background-color: var(--color-low); } .tlui-navigation-panel__toggle .tlui-icon { opacity: 0.24; } .tlui-navigation-panel__toggle:active .tlui-icon { opacity: 1; } @media (hover: hover) { .tlui-navigation-panel__toggle:hover .tlui-icon { opacity: 1; } } .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%; } /* ----------------------- ... ---------------------- */ @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: 260px; height: -moz-fit-content; height: fit-content; max-height: 50vh; } .tlui-page-menu__trigger { width: 128px; } .tlui-page-menu__header { display: flex; flex-direction: row; align-items: center; width: 100%; height: 40px; padding-left: var(--space-4); 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; 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; flex-direction: column; max-height: 100%; overflow-x: hidden; overflow-y: auto; touch-action: auto; } .tlui-page-menu__item { position: relative; display: flex; flex-direction: row; align-items: center; justify-content: space-between; gap: 0px; } @media (hover: hover) { .tlui-page-menu__item::after { display: block; content: ''; background-color: var(--color-muted-2); position: absolute; inset: 4px; border-radius: 6px; pointer-events: none; opacity: 0; } .tlui-page-menu__item:hover::after { opacity: 1; } .tlui-page-menu__item:hover > .tlui-page_menu__item__submenu > .tlui-button { opacity: 1; } } /* Since we're adding an after hover effect to the page menu item, we want to hide the hovers on the individual buttons in the page menu item */ .tlui-page-menu__item__button::after, .tlui-page_menu__item__submenu > .tlui-button::after { display: none; } .tlui-page-menu__item:nth-of-type(n + 2) { margin-top: -4px; } .tlui-page-menu__item__button { width: 100%; } .tlui-page-menu__item__button:not(:only-child) { flex-grow: 2; margin-right: -2px; } .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: 35px; } .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: -moz-fit-content; height: fit-content; display: flex; flex-direction: row; align-items: center; overflow: hidden; z-index: var(--layer-above); } .tlui-page_menu__item__sortable__title { flex: 1; } .tlui-page_menu__item__sortable__title > .tlui-input__wrapper { height: 100%; } .tlui-page_menu__item__sortable:focus-within { z-index: var(--layer-focused-input); } .tlui-page_menu__item__sortable__handle { touch-action: none; width: 32px; min-width: 0px; height: 40px; 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: 12px; 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; margin-left: -2px; } .tlui-page_menu__item__submenu[data-isediting='true'] { display: block; opacity: 1; } .tlui-page_menu__item__submenu > .tlui-button { opacity: 0; } @media (any-pointer: coarse) { .tlui-page_menu__item__submenu > .tlui-button { opacity: 1; } } .tlui-button__icon { padding: 0px; } .tlui-page-menu__item__button .tlui-button__icon { margin-right: 4px; } @media (hover: hover) { .tlui-page_menu__item__submenu { display: block; } .tlui-page_menu__item__submenu[data-isediting='true'] > .tlui-button { opacity: 0; } .tlui-page_menu__item__submenu > .tlui-button[data-state='open'], .tlui-page_menu__item__submenu:hover > .tlui-button, .tlui-page_menu__item__sortable:focus-within > .tlui-page_menu__item__submenu > .tlui-button { 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; } .tlui-embed-dialog__list { display: flex; flex-direction: column; padding-bottom: var(--space-5); } .tlui-embed-dialog__item__image { 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); text-shadow: none; } .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); } .tlui-following-indicator { display: block; position: absolute; inset: 0px; border-width: 2px; border-style: solid; z-index: var(--layer-following-indicator); pointer-events: none; } /* ---------------- Offline Indicator --------------- */ .tlui-offline-indicator { display: flex; flex-direction: row; gap: var(--space-3); color: var(--color-text); background-color: var(--color-low); border: 3px solid var(--color-background); padding: 0px var(--space-5); height: 42px; align-items: center; justify-content: center; border-radius: 99px; opacity: 0; animation: fade-in; animation-duration: 0.12s; animation-delay: 2s; animation-fill-mode: forwards; } /* --------------- Keyboard shortcuts --------------- */ .tlui-shortcuts-dialog__header { border-bottom: 1px solid var(--color-divider); } .tlui-shortcuts-dialog__body { position: relative; -moz-columns: 3; columns: 3; -moz-column-gap: var(--space-9); column-gap: var(--space-9); pointer-events: all; touch-action: auto; /* Terrible fix to allow firefox users to scroll the dialog */ overflow-x: auto; } .tlui-shortcuts-dialog__body__tablet { -moz-columns: 2; columns: 2; } .tlui-shortcuts-dialog__body__mobile { -moz-columns: 1; columns: 1; } .tlui-shortcuts-dialog__group { -moz-column-break-inside: avoid; break-inside: avoid-column; padding-bottom: var(--space-6); } .tlui-shortcuts-dialog__group__title { font-size: inherit; font-weight: inherit; margin: 0px; color: var(--color-text-3); 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; } /* ------------------- Da share zone ------------------ */ .tlui-share-zone { padding: 0px 0px 0px 0px; display: flex; flex-direction: row; justify-content: flex-end; z-index: var(--layer-panels); align-items: center; padding-top: 2px; padding-right: 4px; } /* ------------------- People Menu ------------------- */ .tlui-people-menu__avatars-button { display: flex; align-items: center; justify-content: flex-end; background: none; border: none; cursor: pointer; pointer-events: all; border-radius: var(--radius-1); padding-right: 1px; height: 100%; } .tlui-people-menu__avatars { display: flex; flex-direction: row; } .tlui-people-menu__avatar { height: 24px; width: 24px; border: 2px solid var(--color-background); background-color: var(--color-low); border-radius: 100%; display: flex; align-items: center; justify-content: center; position: relative; font-size: 10px; font-weight: bold; color: var(--color-selected-contrast); z-index: 2; } .tlui-people-menu__avatar:nth-of-type(n + 2) { margin-left: -12px; } .tlui-people-menu__avatars-button[data-state='open'] { opacity: 1; } @media (hover: hover) { .tlui-people-menu__avatars-button:hover .tlui-people-menu__avatar { border-color: var(--color-low); } } .tlui-people-menu__more { min-width: 0px; font-size: 11px; font-weight: 600; color: var(--color-text-1); font-family: inherit; padding: 0px 4px; letter-spacing: 1.5; } .tlui-people-menu__more::after { border-radius: var(--radius-2); inset: 0px; } .tlui-people-menu__wrapper { position: relative; display: flex; flex-direction: column; width: 220px; height: -moz-fit-content; height: fit-content; max-height: 50vh; } .tlui-people-menu__section { position: relative; flex-direction: column; max-height: 100%; overflow-x: hidden; overflow-y: auto; touch-action: auto; } .tlui-people-menu__section:first-child, .tlui-people-menu__section:last-child { flex-shrink: 0; } .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 { 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 > .tlui-input__wrapper { width: auto; display: flex; align-items: auto; flex-grow: 2; gap: 8px; height: 100%; padding: 0px; } .tlui-people-menu__item { display: flex; justify-content: flex-start; width: 100%; } .tlui-people-menu__item__button { padding: 0 11px; } .tlui-people-menu__item > .tlui-button__menu { width: auto; display: flex; align-items: auto; justify-content: flex-start; flex-grow: 2; gap: 11px; } .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; } .tlui-people-menu__item__follow:hover .tlui-icon { opacity: 1; } } .tlui-menu-click-capture { position: fixed; inset: 0; z-index: var(--layer-menu-click-capture); } /* this gets exported as style.css and can be used for the default theming */ /* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */ .react-flow { direction: ltr; --xy-edge-stroke-default: #b1b1b7; --xy-edge-stroke-width-default: 1; --xy-edge-stroke-selected-default: #555; --xy-connectionline-stroke-default: #b1b1b7; --xy-connectionline-stroke-width-default: 1; --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5); --xy-minimap-background-color-default: #fff; --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6); --xy-minimap-mask-stroke-color-default: transparent; --xy-minimap-mask-stroke-width-default: 1; --xy-minimap-node-background-color-default: #e2e2e2; --xy-minimap-node-stroke-color-default: transparent; --xy-minimap-node-stroke-width-default: 2; --xy-background-color-default: transparent; --xy-background-pattern-dots-color-default: #91919a; --xy-background-pattern-lines-color-default: #eee; --xy-background-pattern-cross-color-default: #e2e2e2; background-color: var(--xy-background-color, var(--xy-background-color-default)); --xy-node-color-default: inherit; --xy-node-border-default: 1px solid #1a192b; --xy-node-background-color-default: #fff; --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25); --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08); --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b; --xy-node-border-radius-default: 3px; --xy-handle-background-color-default: #1a192b; --xy-handle-border-color-default: #fff; --xy-selection-background-color-default: rgba(0, 89, 220, 0.08); --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8); --xy-controls-button-background-color-default: #fefefe; --xy-controls-button-background-color-hover-default: #f4f4f4; --xy-controls-button-color-default: inherit; --xy-controls-button-color-hover-default: inherit; --xy-controls-button-border-color-default: #eee; --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08); --xy-edge-label-background-color-default: #ffffff; --xy-edge-label-color-default: inherit; --xy-resize-background-color-default: #3367d9; } .react-flow.dark { --xy-edge-stroke-default: #3e3e3e; --xy-edge-stroke-width-default: 1; --xy-edge-stroke-selected-default: #727272; --xy-connectionline-stroke-default: #b1b1b7; --xy-connectionline-stroke-width-default: 1; --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25); --xy-minimap-background-color-default: #141414; --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6); --xy-minimap-mask-stroke-color-default: transparent; --xy-minimap-mask-stroke-width-default: 1; --xy-minimap-node-background-color-default: #2b2b2b; --xy-minimap-node-stroke-color-default: transparent; --xy-minimap-node-stroke-width-default: 2; --xy-background-color-default: #141414; --xy-background-pattern-dots-color-default: #777; --xy-background-pattern-lines-color-default: #777; --xy-background-pattern-cross-color-default: #777; --xy-node-color-default: #f8f8f8; --xy-node-border-default: 1px solid #3c3c3c; --xy-node-background-color-default: #1e1e1e; --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25); --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08); --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999; --xy-handle-background-color-default: #bebebe; --xy-handle-border-color-default: #1e1e1e; --xy-selection-background-color-default: rgba(200, 200, 220, 0.08); --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8); --xy-controls-button-background-color-default: #2b2b2b; --xy-controls-button-background-color-hover-default: #3e3e3e; --xy-controls-button-color-default: #f8f8f8; --xy-controls-button-color-hover-default: #fff; --xy-controls-button-border-color-default: #5b5b5b; --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08); --xy-edge-label-background-color-default: #141414; --xy-edge-label-color-default: #f8f8f8; } .react-flow__background { background-color: var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default))); pointer-events: none; z-index: -1; } .react-flow__container { position: absolute; width: 100%; height: 100%; top: 0; left: 0; } .react-flow__pane { z-index: 1; } .react-flow__pane.draggable { cursor: grab; } .react-flow__pane.dragging { cursor: grabbing; } .react-flow__pane.selection { cursor: pointer; } .react-flow__viewport { transform-origin: 0 0; z-index: 2; pointer-events: none; } .react-flow__renderer { z-index: 4; } .react-flow__selection { z-index: 6; } .react-flow__nodesselection-rect:focus, .react-flow__nodesselection-rect:focus-visible { outline: none; } .react-flow__edge-path { stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default)); stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default)); fill: none; } .react-flow__connection-path { stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default)); stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default)); fill: none; } .react-flow .react-flow__edges { position: absolute; } .react-flow .react-flow__edges svg { overflow: visible; position: absolute; pointer-events: none; } .react-flow__edge { pointer-events: visibleStroke; } .react-flow__edge.selectable { cursor: pointer; } .react-flow__edge.animated path { stroke-dasharray: 5; animation: dashdraw 0.5s linear infinite; } .react-flow__edge.animated path.react-flow__edge-interaction { stroke-dasharray: none; animation: none; } .react-flow__edge.inactive { pointer-events: none; } .react-flow__edge.selected, .react-flow__edge:focus, .react-flow__edge:focus-visible { outline: none; } .react-flow__edge.selected .react-flow__edge-path, .react-flow__edge.selectable:focus .react-flow__edge-path, .react-flow__edge.selectable:focus-visible .react-flow__edge-path { stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default)); } .react-flow__edge-textwrapper { pointer-events: all; } .react-flow__edge .react-flow__edge-text { pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } /* Arrowhead marker styles - use CSS custom properties as default */ .react-flow__arrowhead polyline { stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default)); } .react-flow__arrowhead polyline.arrowclosed { fill: var(--xy-edge-stroke, var(--xy-edge-stroke-default)); } .react-flow__connection { pointer-events: none; } .react-flow__connection .animated { stroke-dasharray: 5; animation: dashdraw 0.5s linear infinite; } svg.react-flow__connectionline { z-index: 1001; overflow: visible; position: absolute; } .react-flow__nodes { pointer-events: none; transform-origin: 0 0; } .react-flow__node { position: absolute; -webkit-user-select: none; -moz-user-select: none; user-select: none; pointer-events: all; transform-origin: 0 0; box-sizing: border-box; cursor: default; } .react-flow__node.selectable { cursor: pointer; } .react-flow__node.draggable { cursor: grab; pointer-events: all; } .react-flow__node.draggable.dragging { cursor: grabbing; } .react-flow__nodesselection { z-index: 3; transform-origin: left top; pointer-events: none; } .react-flow__nodesselection-rect { position: absolute; pointer-events: all; cursor: grab; } .react-flow__handle { position: absolute; pointer-events: none; min-width: 5px; min-height: 5px; width: 6px; height: 6px; background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default)); border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default)); border-radius: 100%; } .react-flow__handle.connectingfrom { pointer-events: all; } .react-flow__handle.connectionindicator { pointer-events: all; cursor: crosshair; } .react-flow__handle-bottom { top: auto; left: 50%; bottom: 0; transform: translate(-50%, 50%); } .react-flow__handle-top { top: 0; left: 50%; transform: translate(-50%, -50%); } .react-flow__handle-left { top: 50%; left: 0; transform: translate(-50%, -50%); } .react-flow__handle-right { top: 50%; right: 0; transform: translate(50%, -50%); } .react-flow__edgeupdater { cursor: move; pointer-events: all; } .react-flow__pane.selection .react-flow__panel { pointer-events: none; } .react-flow__panel { position: absolute; z-index: 5; margin: 15px; } .react-flow__panel.top { top: 0; } .react-flow__panel.bottom { bottom: 0; } .react-flow__panel.top.center, .react-flow__panel.bottom.center { left: 50%; transform: translateX(-15px) translateX(-50%); } .react-flow__panel.left { left: 0; } .react-flow__panel.right { right: 0; } .react-flow__panel.left.center, .react-flow__panel.right.center { top: 50%; transform: translateY(-15px) translateY(-50%); } .react-flow__attribution { font-size: 10px; background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default)); padding: 2px 3px; margin: 0; } .react-flow__attribution a { text-decoration: none; color: #999; } @keyframes dashdraw { from { stroke-dashoffset: 10; } } .react-flow__edgelabel-renderer { position: absolute; width: 100%; height: 100%; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; left: 0; top: 0; } .react-flow__viewport-portal { position: absolute; width: 100%; height: 100%; left: 0; top: 0; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .react-flow__minimap { background: var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) ); } .react-flow__minimap-svg { display: block; } .react-flow__minimap-mask { fill: var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) ); stroke: var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) ); stroke-width: var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) ); } .react-flow__minimap-node { fill: var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) ); stroke: var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) ); stroke-width: var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) ); } .react-flow__background-pattern.dots { fill: var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) ); } .react-flow__background-pattern.lines { stroke: var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) ); } .react-flow__background-pattern.cross { stroke: var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) ); } .react-flow__controls { display: flex; flex-direction: column; box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default)); } .react-flow__controls.horizontal { flex-direction: row; } .react-flow__controls-button { display: flex; justify-content: center; align-items: center; height: 26px; width: 26px; padding: 4px; border: none; background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default)); border-bottom: 1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) ); color: var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) ); cursor: pointer; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .react-flow__controls-button svg { width: 100%; max-width: 12px; max-height: 12px; fill: currentColor; } .react-flow__edge.updating .react-flow__edge-path { stroke: #777; } .react-flow__edge-text { font-size: 10px; } .react-flow__node.selectable:focus, .react-flow__node.selectable:focus-visible { outline: none; } .react-flow__node-input, .react-flow__node-default, .react-flow__node-output, .react-flow__node-group { padding: 10px; border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default)); width: 150px; font-size: 12px; color: var(--xy-node-color, var(--xy-node-color-default)); text-align: center; border: var(--xy-node-border, var(--xy-node-border-default)); background-color: var(--xy-node-background-color, var(--xy-node-background-color-default)); } .react-flow__node-input.selectable:hover, .react-flow__node-default.selectable:hover, .react-flow__node-output.selectable:hover, .react-flow__node-group.selectable:hover { box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default)); } .react-flow__node-input.selectable.selected, .react-flow__node-input.selectable:focus, .react-flow__node-input.selectable:focus-visible, .react-flow__node-default.selectable.selected, .react-flow__node-default.selectable:focus, .react-flow__node-default.selectable:focus-visible, .react-flow__node-output.selectable.selected, .react-flow__node-output.selectable:focus, .react-flow__node-output.selectable:focus-visible, .react-flow__node-group.selectable.selected, .react-flow__node-group.selectable:focus, .react-flow__node-group.selectable:focus-visible { box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default)); } .react-flow__node-group { background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default)); } .react-flow__nodesselection-rect, .react-flow__selection { background: var(--xy-selection-background-color, var(--xy-selection-background-color-default)); border: var(--xy-selection-border, var(--xy-selection-border-default)); } .react-flow__nodesselection-rect:focus, .react-flow__nodesselection-rect:focus-visible, .react-flow__selection:focus, .react-flow__selection:focus-visible { outline: none; } .react-flow__controls-button:hover { background: var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) ); color: var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) ); } .react-flow__controls-button:disabled { pointer-events: none; } .react-flow__controls-button:disabled svg { fill-opacity: 0.4; } .react-flow__controls-button:last-child { border-bottom: none; } .react-flow__controls.horizontal .react-flow__controls-button { border-bottom: none; border-right: 1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) ); } .react-flow__controls.horizontal .react-flow__controls-button:last-child { border-right: none; } .react-flow__resize-control { position: absolute; } .react-flow__resize-control.left, .react-flow__resize-control.right { cursor: ew-resize; } .react-flow__resize-control.top, .react-flow__resize-control.bottom { cursor: ns-resize; } .react-flow__resize-control.top.left, .react-flow__resize-control.bottom.right { cursor: nwse-resize; } .react-flow__resize-control.bottom.left, .react-flow__resize-control.top.right { cursor: nesw-resize; } /* handle styles */ .react-flow__resize-control.handle { width: 5px; height: 5px; border: 1px solid #fff; border-radius: 1px; background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default)); translate: -50% -50%; } .react-flow__resize-control.handle.left { left: 0; top: 50%; } .react-flow__resize-control.handle.right { left: 100%; top: 50%; } .react-flow__resize-control.handle.top { left: 50%; top: 0; } .react-flow__resize-control.handle.bottom { left: 50%; top: 100%; } .react-flow__resize-control.handle.top.left { left: 0; } .react-flow__resize-control.handle.bottom.left { left: 0; } .react-flow__resize-control.handle.top.right { left: 100%; } .react-flow__resize-control.handle.bottom.right { left: 100%; } /* line styles */ .react-flow__resize-control.line { border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default)); border-width: 0; border-style: solid; } .react-flow__resize-control.line.left, .react-flow__resize-control.line.right { width: 1px; transform: translate(-50%, 0); top: 0; height: 100%; } .react-flow__resize-control.line.left { left: 0; border-left-width: 1px; } .react-flow__resize-control.line.right { left: 100%; border-right-width: 1px; } .react-flow__resize-control.line.top, .react-flow__resize-control.line.bottom { height: 1px; transform: translate(0, -50%); left: 0; width: 100%; } .react-flow__resize-control.line.top { top: 0; border-top-width: 1px; } .react-flow__resize-control.line.bottom { border-bottom-width: 1px; top: 100%; } .react-flow__edge-textbg { fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default)); } .react-flow__edge-text { fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default)); } /* src/index.css */ *, ::before, ::after { --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; } ::backdrop { --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; } /* ! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com */ /* 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) */ *, ::before, ::after { box-sizing: border-box; /* 1 */ border-width: 0; /* 2 */ border-style: solid; /* 2 */ border-color: #e5e7eb; /* 2 */ } ::before, ::after { --tw-content: ''; } /* 1. Use a consistent sensible line-height in all browsers. 2. Prevent adjustments of font size after orientation changes in iOS. 3. Use a more readable tab size. 4. Use the user's configured `sans` font-family by default. 5. Use the user's configured `sans` font-feature-settings by default. 6. Use the user's configured `sans` font-variation-settings by default. 7. Disable tap highlights on iOS */ html, :host { line-height: 1.5; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ -moz-tab-size: 4; /* 3 */ -o-tab-size: 4; tab-size: 4; /* 3 */ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ font-feature-settings: normal; /* 5 */ font-variation-settings: normal; /* 6 */ -webkit-tap-highlight-color: transparent; /* 7 */ } /* 1. Remove the margin in all browsers. 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. */ body { margin: 0; /* 1 */ line-height: inherit; /* 2 */ } /* 1. Add the correct height in Firefox. 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 3. Ensure horizontal rules are visible by default. */ hr { height: 0; /* 1 */ color: inherit; /* 2 */ border-top-width: 1px; /* 3 */ } /* Add the correct text decoration in Chrome, Edge, and Safari. */ abbr:where([title]) { -webkit-text-decoration: underline dotted; text-decoration: underline dotted; } /* Remove the default font size and weight for headings. */ h1, h2, h3, h4, h5, h6 { font-size: inherit; font-weight: inherit; } /* Reset links to optimize for opt-in styling instead of opt-out. */ a { color: inherit; text-decoration: inherit; } /* Add the correct font weight in Edge and Safari. */ b, strong { font-weight: bolder; } /* 1. Use the user's configured `mono` font-family by default. 2. Use the user's configured `mono` font-feature-settings by default. 3. Use the user's configured `mono` font-variation-settings by default. 4. Correct the odd `em` font sizing in all browsers. */ code, kbd, samp, pre { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ font-feature-settings: normal; /* 2 */ font-variation-settings: normal; /* 3 */ font-size: 1em; /* 4 */ } /* Add the correct font size in all browsers. */ small { font-size: 80%; } /* Prevent `sub` and `sup` elements from affecting the line height in all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sub { bottom: -0.25em; } sup { top: -0.5em; } /* 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 3. Remove gaps between table borders by default. */ table { text-indent: 0; /* 1 */ border-color: inherit; /* 2 */ border-collapse: collapse; /* 3 */ } /* 1. Change the font styles in all browsers. 2. Remove the margin in Firefox and Safari. 3. Remove default padding in all browsers. */ button, input, optgroup, select, textarea { font-family: inherit; /* 1 */ font-feature-settings: inherit; /* 1 */ font-variation-settings: inherit; /* 1 */ font-size: 100%; /* 1 */ font-weight: inherit; /* 1 */ line-height: inherit; /* 1 */ letter-spacing: inherit; /* 1 */ color: inherit; /* 1 */ margin: 0; /* 2 */ padding: 0; /* 3 */ } /* Remove the inheritance of text transform in Edge and Firefox. */ button, select { text-transform: none; } /* 1. Correct the inability to style clickable types in iOS and Safari. 2. Remove default button styles. */ button, input:where([type='button']), input:where([type='reset']), input:where([type='submit']) { -webkit-appearance: button; /* 1 */ background-color: transparent; /* 2 */ background-image: none; /* 2 */ } /* Use the modern Firefox focus style for all focusable elements. */ :-moz-focusring { outline: auto; } /* Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) */ :-moz-ui-invalid { box-shadow: none; } /* Add the correct vertical alignment in Chrome and Firefox. */ progress { vertical-align: baseline; } /* Correct the cursor style of increment and decrement buttons in Safari. */ ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { height: auto; } /* 1. Correct the odd appearance in Chrome and Safari. 2. Correct the outline style in Safari. */ [type='search'] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ } /* Remove the inner padding in Chrome and Safari on macOS. */ ::-webkit-search-decoration { -webkit-appearance: none; } /* 1. Correct the inability to style clickable types in iOS and Safari. 2. Change font properties to `inherit` in Safari. */ ::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ } /* Add the correct display in Chrome and Safari. */ summary { display: list-item; } /* Removes the default spacing and border for appropriate elements. */ blockquote, dl, dd, h1, h2, h3, h4, h5, h6, hr, figure, p, pre { margin: 0; } fieldset { margin: 0; padding: 0; } legend { padding: 0; } ol, ul, menu { list-style: none; margin: 0; padding: 0; } /* Reset default styling for dialogs. */ dialog { padding: 0; } /* Prevent resizing textareas horizontally by default. */ textarea { resize: vertical; } /* 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 2. Set the default placeholder color to the user's configured gray 400 color. */ input::-moz-placeholder, textarea::-moz-placeholder { opacity: 1; /* 1 */ color: #9ca3af; /* 2 */ } input::placeholder, textarea::placeholder { opacity: 1; /* 1 */ color: #9ca3af; /* 2 */ } /* Set the default cursor for buttons. */ button, [role="button"] { cursor: pointer; } /* Make sure disabled buttons don't get the pointer cursor. */ :disabled { cursor: default; } /* 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) This can trigger a poorly considered lint error in some tools but is included by design. */ img, svg, video, canvas, audio, iframe, embed, object { display: block; /* 1 */ vertical-align: middle; /* 2 */ } /* Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) */ img, video { max-width: 100%; height: auto; } /* Make elements with the HTML hidden attribute stay hidden by default */ [hidden]:where(:not([hidden="until-found"])) { display: none; } .container { width: 100%; } @media (min-width: 640px) { .container { max-width: 640px; } } @media (min-width: 768px) { .container { max-width: 768px; } } @media (min-width: 1024px) { .container { max-width: 1024px; } } @media (min-width: 1280px) { .container { max-width: 1280px; } } @media (min-width: 1536px) { .container { max-width: 1536px; } } .visible { visibility: visible; } .collapse { visibility: collapse; } .static { position: static; } .fixed { position: fixed; } .absolute { position: absolute; } .relative { position: relative; } .mt-2 { margin-top: 0.5rem; } .block { display: block; } .flex { display: flex; } .grid { display: grid; } .hidden { display: none; } .min-h-screen { min-height: 100vh; } .w-full { width: 100%; } .max-w-md { max-width: 28rem; } .shrink { flex-shrink: 1; } .grow { flex-grow: 1; } .transform { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .resize { resize: both; } .items-center { align-items: center; } .justify-center { justify-content: center; } .space-y-8 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(2rem * var(--tw-space-y-reverse)); } .rounded-lg { border-radius: 0.5rem; } .border { border-width: 1px; } .bg-gray-50 { --tw-bg-opacity: 1; background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); } .bg-white { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); } .p-6 { padding: 1.5rem; } .text-center { text-align: center; } .text-3xl { font-size: 1.875rem; line-height: 2.25rem; } .text-sm { font-size: 0.875rem; line-height: 1.25rem; } .font-bold { font-weight: 700; } .uppercase { text-transform: uppercase; } .lowercase { text-transform: lowercase; } .italic { font-style: italic; } .text-gray-600 { --tw-text-opacity: 1; color: rgb(75 85 99 / var(--tw-text-opacity, 1)); } .text-gray-900 { --tw-text-opacity: 1; color: rgb(17 24 39 / var(--tw-text-opacity, 1)); } .shadow-lg { --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .\!filter { filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important; } .filter { filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .transition { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } .ease-in-out { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } /* Base styles */ html, body { padding: 0; margin: 0; overscroll-behavior: none; touch-action: none; min-height: 100vh; /* mobile viewport bug fix */ min-height: -webkit-fill-available; height: 100%; } /* Container styles */ .login-container { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; } /* Typography styles */ @media (max-width: 600px) { .MuiTypography-h2 { font-size: 2rem !important; line-height: 2.5rem !important; margin-bottom: 16px !important; padding: 0 16px !important; word-break: break-word !important; } .MuiTypography-h5 { font-size: 1.25rem !important; line-height: 1.75rem !important; margin-bottom: 16px !important; padding: 0 16px !important; } } /* Form and input styles */ @media (max-width: 600px) { .MuiContainer-root { padding: 20px !important; } .MuiGrid-container { gap: 16px !important; padding: 0 16px !important; justify-content: center !important; } .MuiGrid-item { width: 100% !important; max-width: 100% !important; flex-basis: 100% !important; padding: 0 !important; } .MuiTextField-root { width: 100% !important; margin: 0 !important; } .MuiButton-root { width: 100% !important; margin: 0 !important; } .login-form { gap: 8px; } } /* Add styles for wider screens */ @media (min-width: 601px) { .MuiTextField-root { width: 100% !important; margin: 0 !important; } .MuiButton-root { width: 100% !important; margin: 0 !important; } } /* Add this after your existing styles */ .login-form { display: flex; flex-direction: column; gap: 16px; width: 100%; max-width: 400px; margin: 0 auto; } .login-buttons-container { display: flex; flex-direction: column; gap: 16px; width: 100%; margin-top: 16px; } @media (max-width: 600px) { .login-buttons-container { gap: 8px; } } .login-form-container { width: 100%; max-width: 400px; display: flex; flex-direction: column; gap: 16px; } .login-form-container .MuiTextField-root, .login-form-container .MuiButton-root { width: 100%; } /* Adjust spacing for mobile */ @media (max-width: 600px) { .login-form-container { gap: 8px; } } .login-section { width: 100%; display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; } .login-section-header { text-align: center; color: #666; font-size: 1rem; font-weight: 500; margin-top: 8px; } .login-role-header { font-weight: 600 !important; color: #1976d2 !important; margin-bottom: 24px !important; padding-bottom: 8px !important; border-bottom: 2px solid #1976d2 !important; width: -moz-fit-content !important; width: fit-content !important; } @media (max-width: 600px) { .login-role-header { font-size: 1.75rem !important; margin-bottom: 16px !important; } } /* Calendar styles */ .fc-timegrid-slot { height: 2em !important; } .fc-timegrid-event { min-height: 2.5em !important; } .fc-timegrid-slot-label { vertical-align: middle; } .fc-event { cursor: pointer; overflow: visible !important; } .fc-event:hover { filter: brightness(90%); } .fc-event-title { font-weight: bold; } .custom-event-content > div { transition: all 0.3s ease; overflow: hidden; max-height: 1.5em; } .custom-event-content > div[style*="display: none"] { max-height: 0; opacity: 0; } /* Custom button styling */ .fc-filterClassesButton-button { background-color: #4CAF50; border: none; color: white; padding: 10px 20px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; border-radius: 4px; } /* Modal styling */ .class-filter-modal { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: white; padding: 30px; border-radius: 12px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); z-index: 9999; max-width: 90%; width: 400px; padding-bottom: 50px; } .class-filter-modal h2 { margin-top: 0; margin-bottom: 20px; font-size: 24px; text-align: center; } .class-filter-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); z-index: 9998; } .class-filter-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; margin-bottom: 20px; } .class-filter-button { display: flex; align-items: center; padding: 10px; border-radius: 8px; font-size: 14px; cursor: pointer; transition: all 0.3s ease; } .class-filter-button:hover { opacity: 0.8; } .class-filter-button .checkbox { width: 20px; height: 20px; border-radius: 4px; border: 2px solid currentColor; display: flex; align-items: center; justify-content: center; margin-right: 10px; /* Add this to ensure the checkbox is visible */ background-color: rgba(255, 255, 255, 0.5); } .class-filter-button .checkbox svg { font-size: 12px; } .class-filter-button span { flex-grow: 1; text-align: left; } .close-button { background-color: #2C3E50; border: 1px solid #2C3E50; color: #fff; padding: 6px 12px; text-align: center; text-decoration: none; display: inline-block; font-size: 14px; margin: 4px 2px; cursor: pointer; border-radius: 4px; transition: background-color 0.3s ease, color 0.3s ease; } .close-button:hover { background-color: #34495E; border-color: #34495E; } .close-button-container { text-align: center; margin-top: 20px; } .event-details-modal { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: white; padding: 30px; border-radius: 12px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); z-index: 9999; max-width: 90%; width: 400px; } .event-details-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); z-index: 9998; } .open-tldraw-button { background-color: #4CAF50; border: none; color: white; padding: 10px 20px; text-align: center; text-decoration: none; display: inline-flex; align-items: center; font-size: 16px; margin: 4px 2px; cursor: pointer; border-radius: 4px; transition: background-color 0.3s ease; } .open-tldraw-button:hover { background-color: #45a049; } .open-tldraw-button svg { margin-left: 8px; } .event-dropdown { position: absolute; z-index: 1100; /* Higher value to ensure it appears above events */ right: -5px; top: 25px; background-color: white; border: 1px solid #ccc; border-radius: 4px; box-shadow: 0 2px 10px rgba(0,0,0,0.2); min-width: 180px; max-width: 250px; min-height: 185px; /* Ensure a minimum height */ max-height: 200px; padding: 5px; overflow-y: scroll; /* Always show scrollbar */ display: flex; flex-direction: column; } .event-dropdown div { padding: 8px 12px; cursor: pointer; white-space: nowrap; font-size: 12px; color: #000; flex-shrink: 0; } .event-dropdown div:not(:last-child) { border-bottom: 1px solid #eee; /* Add separators between items */ } .event-dropdown div:hover { background-color: #f0f0f0; } /* Styling for webkit browsers */ .event-dropdown::-webkit-scrollbar { width: 8px; } .event-dropdown::-webkit-scrollbar-track { background: #f1f1f1; } .event-dropdown::-webkit-scrollbar-thumb { background: #888; border-radius: 4px; } .event-dropdown::-webkit-scrollbar-thumb:hover { background: #555; } /* Styling for Firefox */ .event-dropdown { scrollbar-width: thin; scrollbar-color: #888 #f1f1f1; } /* Ensure the dropdown is on top of other elements */ .fc-event-main { overflow: visible !important; } /* Style for the ellipsis icon */ .custom-event-content .fa-ellipsis-v { opacity: 0.7; transition: opacity 0.3s ease; font-size: 16px; } .custom-event-content .fa-ellipsis-v:hover { opacity: 1; } /* Add this new style to ensure the event content doesn't overflow */ .fc-event-main-frame { overflow: visible !important; } /* View Toggle Modal styles */ .view-toggle-modal { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: white; padding: 30px; border-radius: 12px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); z-index: 9999; max-width: 90%; width: 300px; } .view-toggle-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); z-index: 9998; } .view-toggle-modal h2 { margin-top: 0; margin-bottom: 20px; font-size: 24px; text-align: center; } .view-toggle-list { display: flex; flex-direction: column; gap: 10px; } .view-toggle-button { background-color: #4CAF50; border: none; color: white; padding: 10px 20px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; border-radius: 4px; transition: background-color 0.3s ease; } .view-toggle-button:hover { background-color: #45a049; }