mirror of
https://github.com/Redocly/redoc.git
synced 2025-08-07 13:44:54 +03:00
Updated view multilevel headings and menu
This commit is contained in:
parent
42fa0ed8ea
commit
752f7f8514
|
@ -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};
|
||||||
|
|
||||||
|
|
|
@ -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} />
|
||||||
|
|
|
@ -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};
|
||||||
|
|
|
@ -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[] {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user