From 752f7f8514ee060245f8a2abd347027162f83edc Mon Sep 17 00:00:00 2001 From: "i.morev" Date: Thu, 25 Nov 2021 13:20:46 +1000 Subject: [PATCH] Updated view multilevel headings and menu --- src/common-elements/headers.ts | 31 ++++++++++++++++++-- src/components/ContentItems/ContentItems.tsx | 18 +++++++----- src/components/SideMenu/styled.elements.ts | 2 +- src/services/MarkdownRenderer.ts | 23 ++++++++------- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/common-elements/headers.ts b/src/common-elements/headers.ts index 88b1c377..0d6c4deb 100644 --- a/src/common-elements/headers.ts +++ b/src/common-elements/headers.ts @@ -4,9 +4,12 @@ const headerFontSize = { 1: '1.85714em', 2: '1.57143em', 3: '1.27em', + 4: '1.17em', + 5: '1.07em', + 6: '1em', }; -export const headerCommonMixin = level => css` +export const headerCommonMixin = (level) => css` font-family: ${({ theme }) => theme.typography.headings.fontFamily}; font-weight: ${({ theme }) => theme.typography.headings.fontWeight}; font-size: ${headerFontSize[level]}; @@ -27,13 +30,37 @@ export const H2 = styled.h2` ${extensionsHook('H2')}; `; -export const H3 = styled.h2` +export const H3 = styled.h3` ${headerCommonMixin(3)}; color: black; ${extensionsHook('H3')}; `; +export const H4 = styled.h4` + ${headerCommonMixin(4)}; + color: black; + + ${extensionsHook('H4')}; +`; + +export const H5 = styled.h5` + ${headerCommonMixin(5)}; + color: black; + + ${extensionsHook('H5')}; +`; + +export const H6 = styled.h6` + ${headerCommonMixin(6)}; + + ${extensionsHook('H6')}; +`; + +export const headings = () => { + return { H1, H2, H3, H4, H5, H6 }; +}; + export const RightPanelHeader = styled.h3` color: ${({ theme }) => theme.rightPanel.textColor}; diff --git a/src/components/ContentItems/ContentItems.tsx b/src/components/ContentItems/ContentItems.tsx index 2766887a..69781742 100644 --- a/src/components/ContentItems/ContentItems.tsx +++ b/src/components/ContentItems/ContentItems.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { ExternalDocumentation } from '../ExternalDocumentation/ExternalDocumentation'; import { AdvancedMarkdown } from '../Markdown/AdvancedMarkdown'; -import { H1, H2, MiddlePanel, Row, Section, ShareLink } from '../../common-elements'; +import { headings, MiddlePanel, Row, Section, ShareLink } from '../../common-elements'; import { ContentItemModel } from '../../services/MenuBuilder'; import { GroupModel, OperationModel } from '../../services/models'; import { Operation } from '../Operation/Operation'; @@ -17,7 +17,7 @@ export class ContentItems extends React.Component<{ if (items.length === 0) { return null; } - return items.map(item => { + return items.map((item) => { return ; }); } @@ -61,22 +61,24 @@ export class ContentItem extends React.Component { } } -const middlePanelWrap = component => {component}; +const middlePanelWrap = (component) => {component}; @observer export class SectionItem extends React.Component { render() { const { name, description, externalDocs, level } = this.props.item as GroupModel; - const Header = level === 2 ? H2 : H1; + const Header = headings()[`H${level}`]; return ( <> -
- - {name} -
+ {Header && ( +
+ + {name} +
+ )}
diff --git a/src/components/SideMenu/styled.elements.ts b/src/components/SideMenu/styled.elements.ts index e95c1d95..7976c93b 100644 --- a/src/components/SideMenu/styled.elements.ts +++ b/src/components/SideMenu/styled.elements.ts @@ -135,7 +135,7 @@ export const MenuItemLabel = styled.label.attrs((props: MenuItemLabelType) => ({ margin: 0; padding: 12.5px ${props => props.theme.spacing.unit * 4}px; ${({ depth, type, theme }) => - (type === 'section' && depth > 1 && 'padding-left: ' + theme.spacing.unit * 8 + 'px;') || ''} + (type === 'section' && depth > 1 && 'padding-left: ' + theme.spacing.unit * depth * 4 + 'px;') || ''} display: flex; justify-content: space-between; font-family: ${props => props.theme.typography.headings.fontFamily}; diff --git a/src/services/MarkdownRenderer.ts b/src/services/MarkdownRenderer.ts index 773a9ca7..d5dd36da 100644 --- a/src/services/MarkdownRenderer.ts +++ b/src/services/MarkdownRenderer.ts @@ -120,7 +120,8 @@ export class MarkdownRenderer { prevHeading.description = rawText .substring(prevPos, currentPos) .replace(prevRegexp, '') - .trim(); + .trim() + .replace(/#+$/gi, ''); prevHeading = heading; prevRegexp = regexp; @@ -130,13 +131,15 @@ export class MarkdownRenderer { } headingRule = (text: string, level: HeadingLevelType, raw: string, slugger: marked.Slugger) => { - const prevHeading = this.headingsMap[level - 1]; - this.headingsMap[level] = this.saveHeading( - text, - level, - prevHeading && prevHeading.items, - prevHeading && prevHeading.id, - ); + if (level <= 6) { + const prevHeading = this.headingsMap[level - 1]; + this.headingsMap[level] = this.saveHeading( + text, + level, + prevHeading && prevHeading.items, + prevHeading && prevHeading.id, + ); + } return this.originalHeadingRule(text, level, raw, slugger); }; @@ -144,9 +147,7 @@ export class MarkdownRenderer { renderMd(rawText: string, extractHeadings: boolean = false): string { const opts = extractHeadings ? { renderer: this.headingEnhanceRenderer } : undefined; - const res = marked(rawText.toString(), opts); - - return res; + return marked(rawText.toString(), opts); } extractHeadings(rawText: string): MarkdownHeading[] {