diff options
| author | kj_sh604 | 2026-03-15 16:19:35 -0400 |
|---|---|---|
| committer | kj_sh604 | 2026-03-15 16:19:35 -0400 |
| commit | 6ec259a0e71174651bae95d4628138bf6fd68742 (patch) | |
| tree | 5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/css | |
| parent | 16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff) | |
refactor: packages/
Diffstat (limited to 'packages/excalidraw/css')
| -rw-r--r-- | packages/excalidraw/css/app.scss | 39 | ||||
| -rw-r--r-- | packages/excalidraw/css/styles.scss | 767 | ||||
| -rw-r--r-- | packages/excalidraw/css/theme.scss | 268 | ||||
| -rw-r--r-- | packages/excalidraw/css/variables.module.scss | 190 |
4 files changed, 1264 insertions, 0 deletions
diff --git a/packages/excalidraw/css/app.scss b/packages/excalidraw/css/app.scss new file mode 100644 index 0000000..62e5d46 --- /dev/null +++ b/packages/excalidraw/css/app.scss @@ -0,0 +1,39 @@ +@import "open-color/open-color.scss"; + +.visually-hidden { + position: absolute !important; + height: 1px; + width: 1px; + overflow: hidden; + clip: rect(1px, 1px, 1px, 1px); + white-space: nowrap; /* added line */ + user-select: none; +} + +.LoadingMessage { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 999; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + pointer-events: none; + + .Spinner { + font-size: 2.8em; + } + + .LoadingMessage-text { + margin-top: 1em; + font-size: 0.8em; + } +} + +.LoadingMessage--dark { + background-color: #121212; + color: #ced4da; +} diff --git a/packages/excalidraw/css/styles.scss b/packages/excalidraw/css/styles.scss new file mode 100644 index 0000000..6f1d9cd --- /dev/null +++ b/packages/excalidraw/css/styles.scss @@ -0,0 +1,767 @@ +@import "./variables.module.scss"; +@import "./theme"; + +:root { + --zIndex-canvas: 1; + --zIndex-interactiveCanvas: 2; + --zIndex-svgLayer: 3; + --zIndex-wysiwyg: 3; + --zIndex-canvasButtons: 3; + --zIndex-layerUI: 4; + --zIndex-eyeDropperBackdrop: 5; + --zIndex-eyeDropperPreview: 6; + --zIndex-hyperlinkContainer: 7; + + --zIndex-modal: 1000; + --zIndex-popup: 1001; + --zIndex-toast: 999999; + + --sab: env(safe-area-inset-bottom); + --sal: env(safe-area-inset-left); + --sar: env(safe-area-inset-right); + --sat: env(safe-area-inset-top); +} + +body.excalidraw-cursor-resize, +body.excalidraw-cursor-resize a:hover, +body.excalidraw-cursor-resize * { + cursor: ew-resize; +} + +.excalidraw { + --ui-font: Assistant, system-ui, BlinkMacSystemFont, -apple-system, Segoe UI, + Roboto, Helvetica, Arial, sans-serif; + font-family: var(--ui-font); + + position: relative; + overflow: hidden; + color: var(--text-primary-color); + display: flex; + top: 0; + bottom: 0; + left: 0; + right: 0; + height: 100%; + width: 100%; + + button { + cursor: pointer; + user-select: none; + } + + &:focus { + outline: none; + } + + // serves 2 purposes: + // 1. prevent selecting text outside the component when double-clicking or + // dragging inside it (e.g. on canvas) + // 2. prevent selecting UI, both from the inside, and from outside the + // component (e.g. if you select text in a sidebar) + user-select: none; + + .excalidraw-link, + a { + font-weight: 500; + text-decoration: none; + color: var(--link-color); + user-select: none; + cursor: pointer; + + &:hover { + text-decoration: underline; + } + &:active { + text-decoration: none; + } + } + + canvas { + touch-action: none; + + // following props improve blurriness at certain devicePixelRatios. + // AFAIK it doesn't affect export (in fact, export seems sharp either way). + + image-rendering: pixelated; // chromium + // NOTE: must be declared *after* the above + image-rendering: -moz-crisp-edges; // FF + + z-index: var(--zIndex-canvas); + + &.interactive { + z-index: var(--zIndex-interactiveCanvas); + } + + // Remove the main canvas from document flow to avoid resizeObserver + // feedback loop (see https://github.com/excalidraw/excalidraw/pull/3379) + } + + &__canvas-wrapper, + &__canvas.static { + pointer-events: none; + } + + &__canvas { + position: absolute; + } + + &__embeddable { + width: 100%; + height: 100%; + border: 0; + } + + &__embeddable-container { + position: absolute; + z-index: 2; + transform-origin: top left; + pointer-events: none; + } + + &.theme--dark { + // The percentage is inspired by + // https://material.io/design/color/dark-theme.html#properties, which + // recommends surface color of #121212, 93% yields #111111 for #FFF + + canvas { + filter: var(--theme-filter); + } + } + + .FixedSideContainer { + padding-top: var(--sat, 0); + padding-right: var(--sar, 0); + padding-bottom: var(--sab, 0); + padding-left: var(--sal, 0); + } + + .panelRow { + display: flex; + justify-content: space-between; + } + + .panelColumn { + display: flex; + flex-direction: column; + row-gap: 0.75rem; + + h3, + legend, + .control-label { + margin: 0; + margin-bottom: 0.25rem; + font-size: 0.75rem; + color: var(--text-primary-color); + font-weight: 400; + display: block; + } + + .control-label input { + display: block; + width: 100%; + } + + legend { + padding: 0; + } + + .iconSelectList { + flex-wrap: wrap; + position: relative; + } + + .buttonList { + flex-wrap: wrap; + display: flex; + column-gap: 0.5rem; + row-gap: 0.5rem; + + label { + font-size: 0.75rem; + } + + input[type="radio"], + input[type="button"] { + opacity: 0; + position: absolute; + pointer-events: none; + } + + .iconRow { + margin-top: 8px; + } + } + + fieldset { + margin: 0; + padding: 0; + border: none; + } + } + + .divider { + width: 1px; + background-color: $oc-gray-2; + margin: 1px; + } + + .welcome-screen-menu-item:focus-visible, + .dropdown-menu-item:focus-visible, + button:focus-visible, + .buttonList label:focus-within, + input:focus-visible { + outline: transparent; + box-shadow: 0 0 0 1px var(--color-brand-hover); + } + + .buttonList { + .ToolIcon__icon { + all: unset !important; + display: flex !important; + } + + button { + background-color: transparent; + } + + label, + button, + .zIndexButton { + @include outlineButtonIconStyles; + } + } + + .App-top-bar { + z-index: var(--zIndex-layerUI); + display: flex; + flex-direction: column; + align-items: center; + } + + .App-bottom-bar { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + --bar-padding: calc(4 * var(--space-factor)); + padding-top: #{"max(var(--bar-padding), var(--sat,0))"}; + padding-right: var(--sar, 0); + padding-bottom: var(--sab, 0); + padding-left: var(--sal, 0); + z-index: 4; + display: flex; + align-items: flex-end; + pointer-events: none; + + > .Island { + width: 100%; + max-width: 100%; + min-width: 100%; + box-sizing: border-box; + max-height: 100%; + display: flex; + flex-direction: column; + pointer-events: var(--ui-pointerEvents); + + .panelColumn { + padding: 8px 8px 0 8px; + } + } + } + + .App-toolbar { + width: 100%; + + .eraser { + &.ToolIcon:hover { + --icon-fill-color: #fff; + --keybinding-color: #fff; + } + &.active { + background-color: var(--color-primary); + } + } + } + + .App-toolbar-content { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px; + + .dropdown-menu--mobile { + bottom: 55px; + top: auto; + } + } + + .App-mobile-menu { + width: 100%; + overflow-x: visible; + overflow-y: auto; + box-sizing: border-box; + margin-bottom: var(--bar-padding); + } + + .App-menu { + display: grid; + color: var(--icon-fill-color); + } + + .shapes-section { + display: flex; + justify-content: center; + pointer-events: none !important; + + & > * { + pointer-events: var(--ui-pointerEvents); + } + } + + .App-menu_top { + grid-template-columns: 1fr 2fr 1fr; + grid-gap: 2rem; + align-items: flex-start; + cursor: default; + pointer-events: none !important; + + & > * { + pointer-events: var(--ui-pointerEvents); + } + + @media (min-width: 1536px) { + grid-template-columns: 1fr 1fr 1fr; + grid-gap: 3rem; + } + } + + .App-menu_top > *:first-child { + justify-self: flex-start; + } + + .App-menu_top > *:last-child { + justify-self: flex-end; + } + + .App-menu_bottom { + position: absolute; + bottom: 1rem; + display: flex; + justify-content: space-between; + align-items: flex-start; + cursor: default; + pointer-events: none !important; + box-sizing: border-box; + padding: 0 1rem; + + &--transition-left { + section { + width: 185px; + } + } + + section { + display: flex; + } + } + + .App-menu_bottom > *:first-child { + justify-self: flex-start; + } + + .App-menu_bottom > *:last-child { + justify-self: flex-end; + } + + .App-menu_left { + grid-template-rows: 1fr auto 1fr; + height: 100%; + } + + .App-menu_right { + grid-template-rows: 1fr; + height: 100%; + } + + .App-menu__left { + overflow-y: auto; + padding: 0.75rem; + width: 12.5rem; + box-sizing: border-box; + position: absolute; + } + + .dropdown-select { + height: 1.5rem; + padding: 0; + padding-inline-start: 0.5rem; + padding-inline-end: 1.5rem; + color: var(--icon-fill-color); + background-color: var(--button-gray-1); + border-radius: var(--space-factor); + border: 1px solid var(--button-gray-2); + font-size: 0.8rem; + font-family: inherit; + outline: none; + appearance: none; + background-image: var(--dropdown-icon); + background-repeat: no-repeat; + background-position: right 0.7rem top 50%, 0 0; + + :root[dir="rtl"] & { + background-position: left 0.7rem top 50%, 0 0; + } + + background-size: 0.65em auto, 100%; + + &:focus { + box-shadow: 0 0 0 2px var(--focus-highlight-color); + } + + &:hover { + background-color: var(--button-gray-2); + } + + &:active { + background-color: var(--button-gray-2); + } + + &__language { + height: 2rem; + background-color: var(--island-bg-color); + border-color: var(--default-border-color) !important; + cursor: pointer; + + &:hover { + background-color: var(--island-bg-color); + } + } + } + + .scroll-back-to-content { + border-radius: var(--border-radius-lg); + background-color: var(--island-bg-color); + color: var(--icon-fill-color); + + border: 1px solid var(--default-border-color); + padding: 10px 20px; + position: absolute; + left: 50%; + bottom: 30px; + transform: translateX(-50%); + pointer-events: var(--ui-pointerEvents); + font-family: inherit; + + &:hover { + background-color: var(--button-hover-bg); + } + + &:active { + border: 1px solid var(--button-active-border); + } + } + + .help-icon { + @include outlineButtonStyles; + @include filledButtonOnCanvas; + + width: var(--lg-button-size); + height: var(--lg-button-size); + + svg { + width: var(--lg-icon-size); + height: var(--lg-icon-size); + } + } + + .reset-zoom-button { + font-family: var(--ui-font); + } + + .finalize-button { + display: grid; + grid-auto-flow: column; + gap: 0.4em; + margin-top: auto; + margin-bottom: auto; + margin-inline-start: 0.6em; + } + + .undo-redo-buttons, + .eraser-buttons { + display: grid; + grid-auto-flow: column; + margin-top: auto; + margin-bottom: auto; + margin-inline-start: 0.6em; + } + + @include isMobile { + aside { + display: none; + } + .scroll-back-to-content { + bottom: calc(80px + var(--sab, 0)); + z-index: -1; + } + } + + .rtl-mirror { + :root[dir="rtl"] & { + transform: scaleX(-1); + } + } + + .zen-mode-visibility { + visibility: visible; + opacity: 1; + height: auto; + width: auto; + transition: opacity 0.5s; + + &.zen-mode-visibility--hidden { + visibility: hidden; + opacity: 0; + height: 0; + width: 0; + transition: opacity 0.5s; + } + } + + .disable-pointerEvents { + pointer-events: none !important; + } + + &.excalidraw--view-mode { + .App-menu { + display: flex; + justify-content: space-between; + } + } + + input.is-redacted { + // we don't use type=password because browsers (chrome?) prompt + // you to save it which is annoying + -webkit-text-security: disc; + } + + input[type="text"], + textarea:not(.excalidraw-wysiwyg) { + color: var(--text-primary-color); + border: 1.5px solid var(--input-border-color); + padding: 0.75rem; + white-space: nowrap; + border-radius: var(--space-factor); + background-color: var(--input-bg-color); + + &:not(:focus) { + &:hover { + border-color: var(--color-brand-hover); + } + } + + &:focus { + outline: none; + border-color: var(--color-brand-hover); + } + } + + @media print { + .App-bottom-bar, + .FixedSideContainer, + .layer-ui__wrapper { + display: none; + } + } + + // use custom, minimalistic scrollbar + // (doesn't work in Firefox) + ::-webkit-scrollbar { + width: 4px; + height: 3px; + } + + select::-webkit-scrollbar { + width: 10px; + } + + ::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb); + border-radius: 10px; + } + ::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar-thumb-hover); + } + ::-webkit-scrollbar-thumb:active { + background: var(--scrollbar-thumb); + } + + .mobile-misc-tools-container { + position: absolute; + top: calc(5rem - var(--editor-container-padding)); + right: calc(var(--editor-container-padding) * -1); + display: flex; + flex-direction: column; + border: 1px solid var(--sidebar-border-color); + border-top-left-radius: var(--border-radius-lg); + border-bottom-left-radius: var(--border-radius-lg); + border-right: 0; + overflow: hidden; + + background-color: var(--island-bg-color); + + .ToolIcon__icon { + width: 2rem; + height: 2rem; + border-radius: 0; + } + + .default-sidebar-trigger { + border: 0; + } + } + + .App-toolbar--mobile { + overflow: visible; + max-width: 98vw; + + .ToolIcon__keybinding { + display: none; + } + } + .UserList-Wrapper { + margin: 0; + padding: 0; + border: none; + text-align: left; + + legend { + display: block; + font-size: 0.75rem; + font-weight: 400; + margin: 0 0 0.25rem; + padding: 0; + } + } + + .main-menu-trigger { + @include filledButtonOnCanvas; + } + + .App-mobile-menu, + .App-menu__left { + --button-border: transparent; + --button-bg: var(--color-surface-mid); + } + + @at-root .excalidraw.theme--dark#{&} { + .App-mobile-menu, + .App-menu__left { + --button-hover-bg: #363541; + --button-bg: var(--color-surface-high); + } + } + + .App-menu__left { + .buttonList { + padding: 0.25rem 0; + } + } + + .excalidraw__paragraph { + margin: 1rem 0; + } + + .Modal__content { + .excalidraw__paragraph:first-child { + margin-top: 0; + } + .excalidraw__paragraph + .excalidraw__paragraph { + margin-top: 0rem; + } + } +} + +.ErrorSplash.excalidraw { + min-height: 100vh; + padding: 20px 0; + overflow: auto; + display: flex; + align-items: center; + justify-content: center; + user-select: text; + + .ErrorSplash-messageContainer { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + padding: 40px; + background-color: $oc-red-1; + border: 3px solid $oc-red-9; + } + + .ErrorSplash-paragraph { + margin: 15px 0; + max-width: 600px; + + &.align-center { + text-align: center; + } + } + + .bigger, + .bigger button { + font-size: 1.1em; + } + + .smaller, + .smaller button { + font-size: 0.9em; + } + + .ErrorSplash-details { + display: flex; + flex-direction: column; + align-items: flex-start; + + textarea { + width: 100%; + margin: 10px 0; + font-family: "Cascadia"; + font-size: 0.8em; + } + } +} + +.excalidraw__embeddable-container { + .excalidraw__embeddable-container__inner { + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--embeddable-radius); + } + + .excalidraw__embeddable__outer { + width: 100%; + height: 100%; + & > * { + border-radius: var(--embeddable-radius); + } + } + + .excalidraw__embeddable-hint { + position: absolute; + z-index: 1; + background: rgba(0, 0, 0, 0.5); + padding: 1rem 1.6rem; + border-radius: 12px; + color: #fff; + font-weight: 700; + letter-spacing: 0.6px; + font-family: "Assistant"; + } +} diff --git a/packages/excalidraw/css/theme.scss b/packages/excalidraw/css/theme.scss new file mode 100644 index 0000000..fd6a8da --- /dev/null +++ b/packages/excalidraw/css/theme.scss @@ -0,0 +1,268 @@ +@import "open-color/open-color.scss"; +@import "./variables.module.scss"; + +.excalidraw { + --theme-filter: none; + --button-destructive-bg-color: #{$oc-red-1}; + --button-destructive-color: #{$oc-red-9}; + --button-gray-1: #{$oc-gray-2}; + --button-gray-2: #{$oc-gray-4}; + --button-gray-3: #{$oc-gray-5}; + --button-special-active-bg-color: #{$oc-green-0}; + --dialog-border-color: var(--color-gray-20); + --dropdown-icon: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="292.4" height="292.4" viewBox="0 0 292 292"><path d="M287 197L159 69c-4-3-8-5-13-5s-9 2-13 5L5 197c-3 4-5 8-5 13s2 9 5 13c4 4 8 5 13 5h256c5 0 9-1 13-5s5-8 5-13-1-9-5-13z"/></svg>'); + --focus-highlight-color: #{$oc-blue-2}; + --icon-fill-color: var(--color-on-surface); + --icon-green-fill-color: #{$oc-green-9}; + --default-bg-color: #{$oc-white}; + --input-bg-color: #{$oc-white}; + --input-border-color: #{$oc-gray-4}; + --input-hover-bg-color: #{$oc-gray-1}; + --input-label-color: #{$oc-gray-7}; + --island-bg-color: #ffffff; + --keybinding-color: var(--color-gray-40); + --link-color: #{$oc-blue-7}; + --overlay-bg-color: #{transparentize($oc-white, 0.12)}; + --popup-bg-color: var(--island-bg-color); + --popup-secondary-bg-color: #{$oc-gray-1}; + --popup-text-color: #{$oc-black}; + --popup-text-inverted-color: #{$oc-white}; + --select-highlight-color: #{$oc-blue-5}; + --shadow-island: 0px 0px 0.9310142993927002px 0px rgba(0, 0, 0, 0.17), + 0px 0px 3.1270833015441895px 0px rgba(0, 0, 0, 0.08), + 0px 7px 14px 0px rgba(0, 0, 0, 0.05); + + --button-hover-bg: var(--color-surface-high); + --button-active-bg: var(--color-surface-high); + --button-active-border: var(--color-brand-active); + --default-border-color: var(--color-surface-high); + + --default-button-size: 2rem; + --default-icon-size: 1rem; + --lg-button-size: 2.25rem; + --lg-icon-size: 1rem; + --editor-container-padding: 1rem; + + @media screen and (min-device-width: 1921px) { + --lg-button-size: 2.5rem; + --lg-icon-size: 1.25rem; + --default-button-size: 2.25rem; + --default-icon-size: 1.25rem; + } + + --scrollbar-thumb: var(--button-gray-2); + --scrollbar-thumb-hover: var(--button-gray-3); + + --color-slider-track: hsl(240, 100%, 90%); + --color-slider-thumb: var(--color-gray-80); + + --modal-shadow: 0px 100px 80px rgba(0, 0, 0, 0.07), + 0px 41.7776px 33.4221px rgba(0, 0, 0, 0.0503198), + 0px 22.3363px 17.869px rgba(0, 0, 0, 0.0417275), + 0px 12.5216px 10.0172px rgba(0, 0, 0, 0.035), + 0px 6.6501px 5.32008px rgba(0, 0, 0, 0.0282725), + 0px 2.76726px 2.21381px rgba(0, 0, 0, 0.0196802); + --avatar-border-color: var(--color-gray-20); + --sidebar-shadow: 0px 100px 80px rgba(0, 0, 0, 0.07), + 0px 41.7776px 33.4221px rgba(0, 0, 0, 0.0503198), + 0px 22.3363px 17.869px rgba(0, 0, 0, 0.0417275), + 0px 12.5216px 10.0172px rgba(0, 0, 0, 0.035), + 0px 6.6501px 5.32008px rgba(0, 0, 0, 0.0282725), + 0px 2.76726px 2.21381px rgba(0, 0, 0, 0.0196802); + --sidebar-border-color: var(--color-surface-high); + --sidebar-bg-color: var(--island-bg-color); + --library-dropdown-shadow: 0px 15px 6px rgba(0, 0, 0, 0.01), + 0px 8px 5px rgba(0, 0, 0, 0.05), 0px 4px 4px rgba(0, 0, 0, 0.09), + 0px 1px 2px rgba(0, 0, 0, 0.1), 0px 0px 0px rgba(0, 0, 0, 0.1); + + --space-factor: 0.25rem; + --text-primary-color: var(--color-on-surface); + + --color-selection: #6965db; + + --color-icon-white: #{$oc-white}; + + --color-primary: #6965db; + --color-primary-darker: #5b57d1; + --color-primary-darkest: #4a47b1; + --color-primary-light: #e3e2fe; + --color-primary-light-darker: #d7d5ff; + --color-primary-hover: #5753d0; + + --color-gray-10: #f5f5f5; + --color-gray-20: #ebebeb; + --color-gray-30: #d6d6d6; + --color-gray-40: #b8b8b8; + --color-gray-50: #999999; + --color-gray-60: #7a7a7a; + --color-gray-70: #5c5c5c; + --color-gray-80: #3d3d3d; + --color-gray-85: #242424; + --color-gray-90: #1e1e1e; + --color-gray-100: #121212; + + --color-disabled: var(--color-gray-40); + + --color-warning: #fceeca; + --color-warning-dark: #f5c354; + --color-warning-darker: #f3ab2c; + --color-warning-darkest: #ec8b14; + --color-text-warning: var(--text-primary-color); + + --color-danger: #db6965; + --color-danger-dark: #db6965; + --color-danger-darker: #d65550; + --color-danger-darkest: #d1413c; + --color-danger-text: black; + + --color-danger-background: #fff0f0; + --color-danger-icon-background: #ffdad6; + --color-danger-color: #700000; + --color-danger-icon-color: #700000; + + --color-warning-background: var(--color-warning); + --color-warning-icon-background: var(--color-warning-dark); + --color-warning-color: var(--text-primary-color); + --color-warning-icon-color: var(--text-primary-color); + + --color-muted: var(--color-gray-30); + --color-muted-darker: var(--color-gray-60); + --color-muted-darkest: var(--color-gray-100); + --color-muted-background: var(--color-gray-80); + --color-muted-background-darker: var(--color-gray-100); + + --color-promo: var(--color-primary); + + --color-success: #cafccc; + --color-success-darker: #bafabc; + --color-success-darkest: #a5eba8; + --color-success-text: #268029; + --color-success-contrast: #65bb6a; + --color-success-contrast-hover: #6bcf70; + --color-success-contrast-active: #6edf74; + + --color-logo-icon: var(--color-primary); + --color-logo-text: #190064; + + --border-radius-md: 0.375rem; + --border-radius-lg: 0.5rem; + + --color-surface-high: #f1f0ff; + --color-surface-mid: #f2f2f7; + --color-surface-low: #ececf4; + --color-surface-lowest: #ffffff; + --color-on-surface: #1b1b1f; + --color-brand-hover: #5753d0; + --color-on-primary-container: #030064; + --color-surface-primary-container: #e0dfff; + --color-brand-active: #4440bf; + --color-border-outline: #767680; + --color-border-outline-variant: #c5c5d0; + --color-surface-primary-container: #e0dfff; + + --color-badge: #0b6513; + --background-color-badge: #d3ffd2; + + &.theme--dark { + &.theme--dark-background-none { + background: none; + } + } + + &.theme--dark { + --theme-filter: invert(93%) hue-rotate(180deg); + --button-destructive-bg-color: #5a0000; + --button-destructive-color: #{$oc-red-3}; + + --button-gray-1: #363636; + --button-gray-2: #272727; + --button-gray-3: #222; + --button-special-active-bg-color: #204624; + --dialog-border-color: var(--color-gray-80); + --dropdown-icon: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="292.4" height="292.4" viewBox="0 0 292 292"><path fill="%23ced4da" d="M287 197L159 69c-4-3-8-5-13-5s-9 2-13 5L5 197c-3 4-5 8-5 13s2 9 5 13c4 4 8 5 13 5h256c5 0 9-1 13-5s5-8 5-13-1-9-5-13z"/></svg>'); + --focus-highlight-color: #{$oc-blue-6}; + --icon-green-fill-color: #{$oc-green-4}; + --default-bg-color: #121212; + --input-bg-color: #121212; + --input-border-color: #2e2e2e; + --input-hover-bg-color: #181818; + --input-label-color: #{$oc-gray-2}; + --island-bg-color: #232329; + --keybinding-color: var(--color-gray-60); + --link-color: #{$oc-blue-4}; + --overlay-bg-color: #{transparentize($oc-gray-8, 0.88)}; + --popup-secondary-bg-color: #222; + --popup-text-color: #{$oc-gray-4}; + --popup-text-inverted-color: #2c2c2c; + --select-highlight-color: #{$oc-blue-4}; + --shadow-island: 0px 0px 0.9310142993927002px 0px rgba(0, 0, 0, 0.17), + 0px 0px 3.1270833015441895px 0px rgba(0, 0, 0, 0.08), + 0px 7px 14px 0px rgba(0, 0, 0, 0.05); + + --modal-shadow: 0px 100px 80px rgba(0, 0, 0, 0.07), + 0px 41.7776px 33.4221px rgba(0, 0, 0, 0.0503198), + 0px 22.3363px 17.869px rgba(0, 0, 0, 0.0417275), + 0px 12.5216px 10.0172px rgba(0, 0, 0, 0.035), + 0px 6.6501px 5.32008px rgba(0, 0, 0, 0.0282725), + 0px 2.76726px 2.21381px rgba(0, 0, 0, 0.0196802); + --avatar-border-color: var(--color-gray-85); + + --scrollbar-thumb: #{$oc-gray-8}; + --scrollbar-thumb-hover: #{$oc-gray-7}; + + --color-slider-track: hsl(244, 23%, 39%); + + // will be inverted to a lighter color. + --color-selection: #3530c4; + + --color-icon-white: var(--color-gray-90); + + --color-primary: #a8a5ff; + --color-primary-darker: #b2aeff; + --color-primary-darkest: #beb9ff; + --color-primary-light: #4f4d6f; + --color-primary-light-darker: #43415e; + --color-primary-hover: #bbb8ff; + + --color-disabled: var(--color-gray-70); + + --color-text-warning: var(--color-gray-80); + + --color-danger: #ffa8a5; + --color-danger-dark: #672120; + --color-danger-darker: #8f2625; + --color-danger-darkest: #ac2b29; + --color-danger-text: #fbcbcc; + + --color-danger-background: #fbcbcc; + --color-danger-icon-background: #672120; + --color-danger-color: #261919; + --color-danger-icon-color: #fbcbcc; + + --color-warning-background: var(--color-warning); + --color-warning-icon-background: var(--color-warning-dark); + --color-warning-color: var(--color-gray-80); + --color-warning-icon-color: var(--color-gray-80); + + --color-muted: var(--color-gray-80); + --color-muted-darker: var(--color-gray-60); + --color-muted-darkest: var(--color-gray-20); + --color-muted-background: var(--color-gray-40); + --color-muted-background-darker: var(--color-gray-20); + + --color-logo-text: #e2dfff; + + --color-surface-high: hsl(245, 10%, 21%); + --color-surface-low: hsl(240, 8%, 15%); + --color-surface-mid: hsl(240 6% 10%); + --color-surface-lowest: hsl(0, 0%, 7%); + --color-on-surface: #e3e3e8; + --color-brand-hover: #bbb8ff; + --color-on-primary-container: #e0dfff; + --color-surface-primary-container: #403e6a; + --color-brand-active: #d0ccff; + --color-border-outline: #8e8d9c; + --color-border-outline-variant: #46464f; + --color-surface-primary-container: #403e6a; + } +} diff --git a/packages/excalidraw/css/variables.module.scss b/packages/excalidraw/css/variables.module.scss new file mode 100644 index 0000000..c360c0d --- /dev/null +++ b/packages/excalidraw/css/variables.module.scss @@ -0,0 +1,190 @@ +@import "open-color/open-color.scss"; + +@mixin isMobile() { + @at-root .excalidraw--mobile#{&} { + @content; + } +} + +@mixin toolbarButtonColorStates { + &.fillable { + .ToolIcon_type_radio, + .ToolIcon_type_checkbox { + &:checked + .ToolIcon__icon { + --icon-fill-color: var(--color-on-primary-container); + + svg { + fill: var(--icon-fill-color); + } + } + } + } + + .ToolIcon_type_radio, + .ToolIcon_type_checkbox { + &:checked + .ToolIcon__icon { + background: var(--color-surface-primary-container); + --keybinding-color: var(--color-on-primary-container); + + svg { + color: var(--color-on-primary-container); + } + } + } + + .ToolIcon__keybinding { + bottom: 4px; + right: 4px; + } + + .ToolIcon__icon { + &:hover { + background: var(--button-hover-bg); + } + + &:active { + background: var(--button-hover-bg); + border: 1px solid var(--button-active-border); + + svg { + color: var(--color-on-primary-container); + } + } + + &[aria-disabled="true"] { + background: initial; + border: none; + + svg { + color: var(--color-disabled); + } + } + } +} + +@mixin outlineButtonStyles { + display: flex; + justify-content: center; + align-items: center; + padding: 0.625rem; + width: var(--button-width, var(--default-button-size)); + height: var(--button-height, var(--default-button-size)); + box-sizing: border-box; + border-width: 1px; + border-style: solid; + border-color: var(--button-border, var(--default-border-color)); + border-radius: var(--border-radius-lg); + cursor: pointer; + background-color: var(--button-bg, var(--island-bg-color)); + color: var(--button-color, var(--color-on-surface)); + font-family: var(--ui-font); + + svg { + width: var(--button-width, var(--lg-icon-size)); + height: var(--button-height, var(--lg-icon-size)); + } + + &:hover { + background-color: var(--button-hover-bg, var(--island-bg-color)); + border-color: var( + --button-hover-border, + var(--button-border, var(--default-border-color)) + ); + color: var( + --button-hover-color, + var(--button-color, var(--text-primary-color, inherit)) + ); + } + + &:active { + background-color: var(--button-active-bg, var(--island-bg-color)); + border-color: var(--button-active-border, var(--color-primary-darkest)); + } + + &.active { + background-color: var( + --button-selected-bg, + var(--color-surface-primary-container) + ); + border-color: var( + --button-selected-border, + var(--color-surface-primary-container) + ); + + &:hover { + background-color: var( + --button-selected-hover-bg, + var(--color-surface-primary-container) + ); + } + + svg { + color: var(--button-color, var(--color-on-primary-container)); + } + } +} + +@mixin outlineButtonIconStyles { + @include outlineButtonStyles; + padding: 0; + + svg { + width: var(--default-icon-size); + height: var(--default-icon-size); + } +} + +@mixin avatarStyles { + width: var(--avatar-size, 1.5rem); + height: var(--avatar-size, 1.5rem); + position: relative; + border-radius: 100%; + outline-offset: 2px; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + font-size: 0.75rem; + font-weight: 700; + line-height: 1; + color: var(--color-gray-90); + flex: 0 0 auto; + + &:active { + transform: scale(0.94); + } + + &-img { + width: 100%; + height: 100%; + border-radius: 100%; + } + + &::before { + content: ""; + position: absolute; + top: -3px; + right: -3px; + bottom: -3px; + left: -3px; + border-radius: 100%; + } + + &.is-followed::before { + border-color: var(--color-primary-hover); + box-shadow: 0 0 0 1px var(--color-primary-hover); + } + &.is-current-user { + cursor: auto; + } +} + +@mixin filledButtonOnCanvas { + border: none; + box-shadow: 0 0 0 1px var(--color-surface-lowest); + background-color: var(--color-surface-low); + + &:active { + box-shadow: 0 0 0 1px var(--color-brand-active); + } +} |
