diff --git a/package-lock.json b/package-lock.json index c672cf1..58c31b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@diplodoc/babel-preset": "^1.0.2", - "@diplodoc/components": "^3.9.1", + "@diplodoc/components": "^4.0.0", "@diplodoc/eslint-config": "^2.0.0", "@diplodoc/openapi-extension": "^2.1.0", "@diplodoc/prettier-config": "^2.0.0", @@ -1913,13 +1913,13 @@ } }, "node_modules/@diplodoc/components": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@diplodoc/components/-/components-3.9.1.tgz", - "integrity": "sha512-7SkWsL/Govd/CX3y6G0CCycSV312YUybVdx6M6rNexOiJrvBO7mc7PHIxnWR3kUk9hhtHVPQhKgEN1yQW+s8gA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@diplodoc/components/-/components-4.1.0.tgz", + "integrity": "sha512-zBxlxotgmgpxngd3H2g+WZqFOkuxcqAQy7SguZ+83tRlBLYPcjXr6e+CwT3MqAQOAzikdBT0BiTvO85YnhcP8A==", "dev": true, "dependencies": { "@gravity-ui/icons": "^2.5.0", - "@gravity-ui/uikit": "^5.24.0", + "@gravity-ui/uikit": "6.0.0", "@popperjs/core": "^2.11.2", "bem-cn-lite": "4.1.0", "i18next": "^19.9.2", @@ -1942,27 +1942,26 @@ } }, "node_modules/@diplodoc/components/node_modules/@gravity-ui/uikit": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-5.31.1.tgz", - "integrity": "sha512-XwYjYy73UOFY/R/aju0joOwFxJc16+wiYEC8cBFVPuRyTHZCWtGMgugosQAkzO1mwOnUfP4YuSAukBCTs5nCXQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-6.0.0.tgz", + "integrity": "sha512-16xgkTI646tZoAT5pnw7Ge2Q4e9c8DWYZw0w11X8A9hyuYaNjd0isUxpD4Beywi4ELKeFv3t2IXCn/RTU7/qVw==", "dev": true, "dependencies": { "@bem-react/classname": "^1.6.0", - "@gravity-ui/i18n": "^1.1.0", - "@gravity-ui/icons": "^2.5.0", + "@gravity-ui/i18n": "^1.2.0", + "@gravity-ui/icons": "^2.8.1", "@popperjs/core": "^2.11.8", "blueimp-md5": "^2.19.0", - "focus-trap": "^7.5.2", + "focus-trap": "^7.5.4", "lodash": "^4.17.21", "react-beautiful-dnd": "^13.1.1", "react-copy-to-clipboard": "^5.1.0", "react-popper": "^2.3.0", "react-transition-group": "^4.4.5", - "react-virtualized-auto-sizer": "^1.0.20", - "react-window": "^1.8.9", + "react-virtualized-auto-sizer": "^1.0.21", + "react-window": "^1.8.10", "tabbable": "^6.2.0", - "tslib": "^2.6.1", - "utility-types": "^3.10.0" + "tslib": "^2.6.2" }, "peerDependencies": { "react": "^16.0.0 || ^17.0.0 || ^18.0.0", diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index c8e2597..ea97575 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -6,18 +6,22 @@ import { NavigationItemModel, PageConstructor, PageConstructorProvider, + PageContent, } from '@gravity-ui/page-constructor'; import {ThemeProvider} from '@gravity-ui/uikit'; import { - DocLeadingPage, + DocContentPageData, DocLeadingPageData, - DocPage, DocPageData, + DocumentType, Lang, Router, Theme, getLangPath, + getPageByType, + getPageType, } from '@diplodoc/components'; + import {HeaderControls} from '../HeaderControls'; import {getDirection, updateRootClassName} from '../../utils'; import {Layout} from '../Layout'; @@ -32,14 +36,20 @@ import {LatexRuntime} from '@diplodoc/latex-extension/react'; import {Runtime as OpenapiSandbox} from '@diplodoc/openapi-extension/runtime'; import './App.scss'; +import {ConstructorPage} from '../ConstructorPage'; export interface AppProps { lang: Lang; langs: Lang[]; router: Router; + type: DocumentType; +} + +export interface PageContentData extends DocContentPageData { + data: PageContent & {fullScreen?: boolean}; } -export type DocInnerProps = { +export type DocInnerProps = { data: Data; } & AppProps; @@ -67,9 +77,9 @@ function Runtime(props: RuntimeProps) { ); } -function Page(props: DocInnerProps) { +export function Page(props: DocInnerProps) { const {data, ...pageProps} = props; - const Page = data.leading ? DocLeadingPage : DocPage; + const Page = getPageByType(props?.type); return ( @@ -117,6 +127,8 @@ export function App(props: DocInnerProps): ReactElement { const {theme, textSize, wideFormat, fullScreen, showMiniToc, onChangeFullScreen} = settings; const fullHeader = !fullScreen && Boolean(navigation); const headerHeight = fullHeader ? 64 : 0; + const type = getPageType(data); + const pageProps = { headerHeight, data, @@ -129,8 +141,14 @@ export function App(props: DocInnerProps): ReactElement { textSize, fullScreen, onChangeFullScreen, + type, }; const direction = getDirection(lang); + const fullScreenPC = + type === DocumentType.PageConstructor && + 'data' in data && + 'fullScreen' in data.data && + data.data.fullScreen; useEffect(() => { updateRootClassName({ @@ -145,13 +163,40 @@ export function App(props: DocInnerProps): ReactElement { ...settings, onChangeLang, } -console.log("here", router); if (!navigation) { return (
- + + {type === DocumentType.PageConstructor && ( + + ( + + ), + }, + }} + content={ + fullScreenPC + ? (data.data as PageContent) + : { + blocks: [ + { + type: 'page', + }, + ], + } + } + /> + + )} +
@@ -175,20 +220,29 @@ console.log("here", router); }, blocks: { page: () => ( - + + {type === DocumentType.PageConstructor && + 'data' in data && ( + + )} + ), }, }} - content={{ - blocks: [ - { - type: 'page', - }, - ], - }} + content={ + fullScreenPC + ? (data.data as PageContent) + : { + blocks: [ + { + type: 'page', + }, + ], + } + } navigation={ fullHeader ? { diff --git a/src/components/ConstructorPage/index.tsx b/src/components/ConstructorPage/index.tsx new file mode 100644 index 0000000..c60f1c0 --- /dev/null +++ b/src/components/ConstructorPage/index.tsx @@ -0,0 +1,44 @@ +import React from 'react'; + +import block from 'bem-cn-lite'; +import { + BackgroundMedia, + Col, + ConstructorBlocks, + Grid, + Row, + Theme, + getThemedValue, +} from '@gravity-ui/page-constructor'; +import {PageContentData} from '../App/App'; + +export type WithChildren = T & {children?: React.ReactNode}; + +const bPC = block('pc-page-constructor'); +const bPCRow = block('pc-constructor-row'); + +export const ConstructorRow = ({children}: WithChildren<{}>) => + children ? ( + + {children} + + ) : null; + +export function ConstructorPage({data: {data}, theme}: {data: PageContentData; theme: Theme}) { + const themedBackground = getThemedValue(data?.background, theme); + + return ( +
+
+ {data?.blocks && themedBackground && ( + + )} + + + + + +
+
+ ); +} diff --git a/src/constants.ts b/src/constants.ts index 29dac98..8332e86 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -19,3 +19,25 @@ export enum TextDirection { RTL = 'rtl', LTR = 'ltr', } + +export const LINK_KEYS_LEADING_CONFIG = ['href']; +export const LINK_KEYS_PAGE_CONSTRUCTOR_CONFIG = [ + 'src', + 'url', + 'href', + 'icon', + 'image', + 'desktop', + 'mobile', + 'tablet', + 'previewImg', + 'image', + 'avatar', + 'logo', + 'light', + 'dark', +]; + +export const LINK_KEYS = [ + ...new Set([...LINK_KEYS_LEADING_CONFIG, ...LINK_KEYS_PAGE_CONSTRUCTOR_CONFIG]), +]; diff --git a/src/index.server.tsx b/src/index.server.tsx index cf87514..009ffbf 100644 --- a/src/index.server.tsx +++ b/src/index.server.tsx @@ -2,7 +2,9 @@ import React from 'react'; import {renderToString} from 'react-dom/server'; import {App, DocInnerProps, DocLeadingPageData, DocPageData} from './components/App/App'; +import {LINK_KEYS} from './constants'; export type {DocInnerProps, DocPageData, DocLeadingPageData}; +export {LINK_KEYS}; export const render = (props: DocInnerProps) => renderToString(); diff --git a/src/styles/overrides.scss b/src/styles/overrides.scss index 282d142..d4063a0 100644 --- a/src/styles/overrides.scss +++ b/src/styles/overrides.scss @@ -8,6 +8,20 @@ margin-top: var(--pc-first-block-indent, 96px); } +.pc-Grid { + .container-fluid { + padding-right: 0px; + padding-left: 0px; + } +} + +.pc-Grid .pc-Grid { + .container-fluid .pc-header-block__container-fluid { + padding-right: 40px; + padding-left: 40px; + } +} + .pc-block-base { padding: 0 !important; } diff --git a/tsconfig.json b/tsconfig.json index 094f1f3..646eb8d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "target": "es2020", "moduleResolution": "node", + "resolveJsonModule": true, "lib": ["DOM"], "declaration": true, "outDir": "build",