Merge pull request #20172 from overleaf/rd-ide-fileoutline

[web] Migrate the file outline styling from LESS to SCSS

GitOrigin-RevId: 5e485b13a7358e5dcab2c75ee7d36a07e1401e26
This commit is contained in:
Rebeka Dekany 2024-09-03 13:30:25 +02:00 committed by Copybot
parent de8acd2ed8
commit 39b6b8baed
10 changed files with 330 additions and 17 deletions

View file

@ -1,6 +1,6 @@
import { memo, type Dispatch, type SetStateAction } from 'react'
import Icon from '@/shared/components/icon'
import { useTranslation } from 'react-i18next'
import MaterialIcon from '@/shared/components/material-icon'
export const OutlineItemToggleButton = memo<{
expanded: boolean
@ -14,8 +14,8 @@ export const OutlineItemToggleButton = memo<{
onClick={() => setExpanded(value => !value)}
aria-label={expanded ? t('collapse') : t('expand')}
>
<Icon
type={expanded ? 'angle-down' : 'angle-right'}
<MaterialIcon
type={expanded ? 'keyboard_arrow_down' : 'keyboard_arrow_right'}
className="outline-caret-icon"
/>
</button>

View file

@ -1,5 +1,5 @@
import Icon from '@/shared/components/icon'
import Tooltip from '@/shared/components/tooltip'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import MaterialIcon from '@/shared/components/material-icon'
import React, { memo } from 'react'
import { useTranslation } from 'react-i18next'
@ -19,24 +19,24 @@ export const OutlineToggleButton = memo<{
onClick={toggleExpanded}
aria-label={expanded ? t('hide_outline') : t('show_outline')}
>
<Icon
type={isOpen ? 'angle-down' : 'angle-right'}
<MaterialIcon
type={isOpen ? 'keyboard_arrow_down' : 'keyboard_arrow_right'}
className="outline-caret-icon"
/>
<h4 className="outline-header-name">{t('file_outline')}</h4>
{isPartial && (
<Tooltip
<OLTooltip
id="partial-outline"
description={t('partial_outline_warning')}
overlayProps={{ placement: 'top' }}
>
<span role="status">
<Icon
type="exclamation-triangle"
aria-label={t('partial_outline_warning')}
<span role="status" style={{ display: 'flex' }}>
<MaterialIcon
type="warning"
accessibilityLabel={t('partial_outline_warning')}
/>
</span>
</Tooltip>
</OLTooltip>
)}
</button>
)

View file

@ -27,6 +27,7 @@
}
.ide-react-main {
//migrated to SCSS
height: 100%;
display: flex;
flex-direction: column;
@ -39,6 +40,7 @@
}
.ide-react-body {
//migrated to SCSS
flex-grow: 1;
background-color: @pdf-bg;
overflow-y: hidden;
@ -118,6 +120,7 @@
}
.ide-react-editor-sidebar {
//migrated to SCSS
height: 100%;
background-color: @file-tree-bg;
color: var(--neutral-20);
@ -130,6 +133,7 @@
}
.ide-react-file-tree-panel {
//migrated to SCSS
display: flex;
flex-direction: column;

View file

@ -64,3 +64,25 @@
@mixin modal-sm {
max-width: 480px;
}
// Toolbar
@mixin toolbar-sm-height {
height: 32px;
}
@mixin toolbar-alt-bg() {
background-color: var(--bg-dark-secondary);
}
// Filetree
@mixin file-tree-item-color {
color: var(--content-primary-dark);
}
@mixin file-tree-item-hover-bg {
background-color: var(--bg-dark-secondary);
}
@mixin file-tree-bg {
background-color: var(--bg-dark-tertiary);
}

View file

@ -1,4 +1,8 @@
@import 'account-settings';
@import 'project-list';
@import 'sidebar-v2-dash-pane';
@import 'editor';
@import 'editor/ide';
@import 'editor/loading-screen';
@import 'editor/outline';
@import 'editor/file-tree';
@import 'editor/toolbar';

View file

@ -0,0 +1,9 @@
.ide-react-file-tree-panel {
display: flex;
flex-direction: column;
// Prevent the file tree expanding beyond the boundary of the panel
.file-tree {
width: 100%;
}
}

View file

@ -0,0 +1,53 @@
#ide-root {
height: 100vh; /* for backwards compatibility */
height: 100dvh; /* needed for mobile devices */
.global-alerts {
position: absolute;
top: 0;
left: 0;
right: 0;
display: flex;
flex-direction: column;
align-items: center;
}
.chat {
position: relative;
height: 100%;
}
.review-panel-wrapper {
&.rp-state-overview {
position: sticky;
top: 0;
height: 100%;
}
}
}
.ide-react-editor-sidebar {
@include file-tree-bg;
height: 100%;
color: var(--content-secondary-dark);
}
.ide-react-body {
flex-grow: 1;
background-color: var(--bg-light-secondary);
overflow-y: hidden;
z-index: 0;
}
.ide-react-main {
height: 100%;
display: flex;
flex-direction: column;
.toolbar.toolbar-header {
position: static;
flex-grow: 0;
color: var(--neutral-20);
}
}

View file

@ -23,8 +23,8 @@
width: 100%;
padding-top: 115.44%;
height: 0;
background: url(../../../../public/img/ol-brand/overleaf-o-grey.svg) no-repeat
bottom / 100%;
background: url(../../../../../public/img/ol-brand/overleaf-o-grey.svg)
no-repeat bottom / 100%;
&::after {
content: '';
@ -33,7 +33,7 @@
right: 0;
bottom: 0;
left: 0;
background: url(../../../../public/img/ol-brand/overleaf-o.svg) no-repeat
background: url(../../../../../public/img/ol-brand/overleaf-o.svg) no-repeat
bottom / 100%;
transition: height 0.5s;
}

View file

@ -0,0 +1,213 @@
.outline-container {
width: 100%;
height: 100%;
background-color: var(--bg-dark-tertiary);
}
.outline-pane {
@include body-sm;
display: flex;
flex-flow: column;
height: 100%;
color: var(--content-primary-dark);
}
.outline-pane-disabled {
opacity: 0.5;
}
.documentation-btn-container {
@include toolbar-sm-height;
@include toolbar-alt-bg;
display: flex;
align-items: center;
box-shadow: inset 0 1px 0 rgb(255 255 255 / 10%);
& *,
& :hover {
color: var(--content-primary-dark);
text-decoration: none;
}
&:hover {
background-color: var(--bg-dark-primary);
}
}
.documentation-close {
padding: 0;
}
.outline-header {
@include toolbar-sm-height;
@include toolbar-alt-bg;
display: flex;
flex-shrink: 0;
border-bottom: 1px solid var(--border-disabled-dark);
border-top: 1px solid var(--border-disabled-dark);
}
.outline-header-expand-collapse-btn {
@include file-tree-item-color;
display: flex;
align-items: center;
background-color: transparent;
border: 0;
padding: 0 var(--spacing-03) 0 0;
font-size: inherit;
vertical-align: inherit;
flex: 1 0 100%;
text-align: left;
white-space: nowrap;
box-shadow: inset 0 1px 0 rgb(255 255 255 / 10%);
&:hover,
&:focus {
outline: 0;
}
&:hover {
background-color: var(--bg-dark-primary);
}
&:hover[disabled] {
background-color: transparent;
}
}
.outline-header-name {
@include body-sm;
@include file-tree-item-color;
display: inline-block;
font-weight: 700;
margin: 0;
flex-grow: 1;
flex-shrink: 1;
overflow: hidden;
text-overflow: ellipsis;
}
.outline-body {
@include file-tree-bg;
overflow-y: auto;
padding-right: var(--spacing-03);
}
.outline-body-no-elements {
@include file-tree-item-color;
text-align: center;
padding: var(--spacing-08) var(--spacing-08) var(--spacing-11)
var(--spacing-08);
margin-right: calc(var(--spacing-03) * -1);
}
.outline-body-link {
@include file-tree-item-color;
display: block;
text-decoration: underline;
&:hover,
&:focus {
@include file-tree-item-color;
text-decoration: underline;
}
}
.outline-item-list {
position: relative;
list-style: none;
padding-left: var(--spacing-08);
&::before {
content: '';
background-color: var(--neutral-60);
top: var(--spacing-03);
bottom: var(--spacing-03);
width: 1px;
left: var(--spacing-10);
position: absolute;
}
&.outline-item-list-root {
padding-left: 0;
&::before {
left: var(--spacing-05);
}
}
}
.outline-item-no-children {
padding-left: var(--spacing-07);
}
.outline-item-row {
display: flex;
overflow: hidden;
white-space: nowrap;
}
.outline-item-expand-collapse-btn {
@include file-tree-bg;
display: inline;
border: 0;
padding: 0;
font-size: inherit;
vertical-align: inherit;
position: relative;
z-index: 1;
color: var(--content-disabled);
margin-right: calc(var(--spacing-03) * -1);
border-radius: var(--border-radius-base);
&:hover,
&:focus {
outline: 0;
}
&:hover {
@include file-tree-item-hover-bg;
}
}
.outline-item-link {
@include file-tree-item-color;
@include text-truncate;
display: inline;
background-color: transparent;
border: 0;
position: relative;
z-index: 1;
padding: 0 var(--spacing-03);
line-height: var(--spacing-08);
border-radius: var(--border-radius-base);
text-align: left;
&:hover,
&:focus {
@include file-tree-item-hover-bg;
outline: 0;
}
}
.outline-item-link-highlight {
background-color: tint($bg-dark-tertiary, 15%);
}
.outline-caret-icon {
width: var(--spacing-08);
font-size: 17px;
text-align: center;
}

View file

@ -0,0 +1,8 @@
$toolbar-height: 40px;
.toolbar {
display: flex;
align-items: center;
height: $toolbar-height;
border-bottom: 1px solid var(--border-divider-dark);
}