Explorar el Código

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

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

GitOrigin-RevId: 5e485b13a7358e5dcab2c75ee7d36a07e1401e26
Rebeka Dekany hace 2 años
padre
commit
39b6b8baed

+ 3 - 3
services/web/frontend/js/features/outline/components/outline-item-toggle-button.tsx

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

+ 10 - 10
services/web/frontend/js/features/outline/components/outline-toggle-button.tsx

@@ -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 React, { memo } from 'react'
 import { useTranslation } from 'react-i18next'
 import { useTranslation } from 'react-i18next'
 
 
@@ -19,24 +19,24 @@ export const OutlineToggleButton = memo<{
       onClick={toggleExpanded}
       onClick={toggleExpanded}
       aria-label={expanded ? t('hide_outline') : t('show_outline')}
       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"
         className="outline-caret-icon"
       />
       />
       <h4 className="outline-header-name">{t('file_outline')}</h4>
       <h4 className="outline-header-name">{t('file_outline')}</h4>
       {isPartial && (
       {isPartial && (
-        <Tooltip
+        <OLTooltip
           id="partial-outline"
           id="partial-outline"
           description={t('partial_outline_warning')}
           description={t('partial_outline_warning')}
           overlayProps={{ placement: 'top' }}
           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>
           </span>
-        </Tooltip>
+        </OLTooltip>
       )}
       )}
     </button>
     </button>
   )
   )

+ 4 - 0
services/web/frontend/stylesheets/app/editor/ide-react.less

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

+ 22 - 0
services/web/frontend/stylesheets/bootstrap-5/abstracts/mixins.scss

@@ -64,3 +64,25 @@
 @mixin modal-sm {
 @mixin modal-sm {
   max-width: 480px;
   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);
+}

+ 5 - 1
services/web/frontend/stylesheets/bootstrap-5/pages/all.scss

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

+ 9 - 0
services/web/frontend/stylesheets/bootstrap-5/pages/editor/file-tree.scss

@@ -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%;
+  }
+}

+ 53 - 0
services/web/frontend/stylesheets/bootstrap-5/pages/editor/ide.scss

@@ -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);
+  }
+}

+ 3 - 3
services/web/frontend/stylesheets/bootstrap-5/pages/editor.scss → services/web/frontend/stylesheets/bootstrap-5/pages/editor/loading-screen.scss

@@ -23,8 +23,8 @@
   width: 100%;
   width: 100%;
   padding-top: 115.44%;
   padding-top: 115.44%;
   height: 0;
   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 {
   &::after {
     content: '';
     content: '';
@@ -33,7 +33,7 @@
     right: 0;
     right: 0;
     bottom: 0;
     bottom: 0;
     left: 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%;
       bottom / 100%;
     transition: height 0.5s;
     transition: height 0.5s;
   }
   }

+ 213 - 0
services/web/frontend/stylesheets/bootstrap-5/pages/editor/outline.scss

@@ -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;
+}

+ 8 - 0
services/web/frontend/stylesheets/bootstrap-5/pages/editor/toolbar.scss

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