Updated view multilevel headings and menu

This commit is contained in:
i.morev 2021-11-25 13:20:46 +10:00
parent 42fa0ed8ea
commit 752f7f8514
4 changed files with 52 additions and 22 deletions

View File

@ -4,9 +4,12 @@ const headerFontSize = {
1: '1.85714em', 1: '1.85714em',
2: '1.57143em', 2: '1.57143em',
3: '1.27em', 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-family: ${({ theme }) => theme.typography.headings.fontFamily};
font-weight: ${({ theme }) => theme.typography.headings.fontWeight}; font-weight: ${({ theme }) => theme.typography.headings.fontWeight};
font-size: ${headerFontSize[level]}; font-size: ${headerFontSize[level]};
@ -27,13 +30,37 @@ export const H2 = styled.h2`
${extensionsHook('H2')}; ${extensionsHook('H2')};
`; `;
export const H3 = styled.h2` export const H3 = styled.h3`
${headerCommonMixin(3)}; ${headerCommonMixin(3)};
color: black; color: black;
${extensionsHook('H3')}; ${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` export const RightPanelHeader = styled.h3`
color: ${({ theme }) => theme.rightPanel.textColor}; color: ${({ theme }) => theme.rightPanel.textColor};

View File

@ -3,7 +3,7 @@ import * as React from 'react';
import { ExternalDocumentation } from '../ExternalDocumentation/ExternalDocumentation'; import { ExternalDocumentation } from '../ExternalDocumentation/ExternalDocumentation';
import { AdvancedMarkdown } from '../Markdown/AdvancedMarkdown'; 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 { ContentItemModel } from '../../services/MenuBuilder';
import { GroupModel, OperationModel } from '../../services/models'; import { GroupModel, OperationModel } from '../../services/models';
import { Operation } from '../Operation/Operation'; import { Operation } from '../Operation/Operation';
@ -17,7 +17,7 @@ export class ContentItems extends React.Component<{
if (items.length === 0) { if (items.length === 0) {
return null; return null;
} }
return items.map(item => { return items.map((item) => {
return <ContentItem key={item.id} item={item} />; return <ContentItem key={item.id} item={item} />;
}); });
} }
@ -61,22 +61,24 @@ export class ContentItem extends React.Component<ContentItemProps> {
} }
} }
const middlePanelWrap = component => <MiddlePanel compact={true}>{component}</MiddlePanel>; const middlePanelWrap = (component) => <MiddlePanel compact={true}>{component}</MiddlePanel>;
@observer @observer
export class SectionItem extends React.Component<ContentItemProps> { export class SectionItem extends React.Component<ContentItemProps> {
render() { render() {
const { name, description, externalDocs, level } = this.props.item as GroupModel; const { name, description, externalDocs, level } = this.props.item as GroupModel;
const Header = level === 2 ? H2 : H1; const Header = headings()[`H${level}`];
return ( return (
<> <>
<Row> <Row>
<MiddlePanel compact={false}> <MiddlePanel compact={false}>
{Header && (
<Header> <Header>
<ShareLink to={this.props.item.id} /> <ShareLink to={this.props.item.id} />
{name} {name}
</Header> </Header>
)}
</MiddlePanel> </MiddlePanel>
</Row> </Row>
<AdvancedMarkdown source={description || ''} htmlWrap={middlePanelWrap} /> <AdvancedMarkdown source={description || ''} htmlWrap={middlePanelWrap} />

View File

@ -135,7 +135,7 @@ export const MenuItemLabel = styled.label.attrs((props: MenuItemLabelType) => ({
margin: 0; margin: 0;
padding: 12.5px ${props => props.theme.spacing.unit * 4}px; padding: 12.5px ${props => props.theme.spacing.unit * 4}px;
${({ depth, type, theme }) => ${({ 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; display: flex;
justify-content: space-between; justify-content: space-between;
font-family: ${props => props.theme.typography.headings.fontFamily}; font-family: ${props => props.theme.typography.headings.fontFamily};

View File

@ -120,7 +120,8 @@ export class MarkdownRenderer {
prevHeading.description = rawText prevHeading.description = rawText
.substring(prevPos, currentPos) .substring(prevPos, currentPos)
.replace(prevRegexp, '') .replace(prevRegexp, '')
.trim(); .trim()
.replace(/#+$/gi, '');
prevHeading = heading; prevHeading = heading;
prevRegexp = regexp; prevRegexp = regexp;
@ -130,6 +131,7 @@ export class MarkdownRenderer {
} }
headingRule = (text: string, level: HeadingLevelType, raw: string, slugger: marked.Slugger) => { headingRule = (text: string, level: HeadingLevelType, raw: string, slugger: marked.Slugger) => {
if (level <= 6) {
const prevHeading = this.headingsMap[level - 1]; const prevHeading = this.headingsMap[level - 1];
this.headingsMap[level] = this.saveHeading( this.headingsMap[level] = this.saveHeading(
text, text,
@ -137,6 +139,7 @@ export class MarkdownRenderer {
prevHeading && prevHeading.items, prevHeading && prevHeading.items,
prevHeading && prevHeading.id, prevHeading && prevHeading.id,
); );
}
return this.originalHeadingRule(text, level, raw, slugger); return this.originalHeadingRule(text, level, raw, slugger);
}; };
@ -144,9 +147,7 @@ export class MarkdownRenderer {
renderMd(rawText: string, extractHeadings: boolean = false): string { renderMd(rawText: string, extractHeadings: boolean = false): string {
const opts = extractHeadings ? { renderer: this.headingEnhanceRenderer } : undefined; const opts = extractHeadings ? { renderer: this.headingEnhanceRenderer } : undefined;
const res = marked(rawText.toString(), opts); return marked(rawText.toString(), opts);
return res;
} }
extractHeadings(rawText: string): MarkdownHeading[] { extractHeadings(rawText: string): MarkdownHeading[] {