diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteEditor.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteEditor.tsx index 979b94ad..08497bd2 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteEditor.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteEditor.tsx @@ -24,6 +24,49 @@ const cssEditor = (readonly: boolean) => ` &, & > .bn-container, & .ProseMirror { height:100%; + .bn-side-menu[data-block-type=heading][data-level="1"] { + height: 50px; + } + .bn-side-menu[data-block-type=heading][data-level="2"] { + height: 43px; + } + .bn-side-menu[data-block-type=heading][data-level="3"] { + height: 35px; + } + h1 { + font-size: 1.875rem; + } + h2 { + font-size: 1.5rem; + } + h3 { + font-size: 1.25rem; + } + a { + color: var(--c--theme--colors--greyscale-500); + cursor: pointer; + } + .bn-block-group + .bn-block-group + .bn-block-outer:not([data-prev-depth-changed]):before { + border-left: none; + } + } + + .bn-editor { + + color: var(--c--theme--colors--greyscale-700); + } + .bn-block-outer:not(:first-child) { + &:has(h1) { + padding-top: 32px; + } + &:has(h2) { + padding-top: 24px; + } + &:has(h3) { + padding-top: 16px; + } }; & .bn-inline-content code { diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx index 172c166e..6beabd79 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx @@ -50,7 +50,7 @@ export const DocEditor = ({ doc, versionId }: DocEditorProps) => { )} - + {isVersion ? ( ) : ( diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocHeader.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocHeader.tsx index 80fbe27d..977fe3a8 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocHeader.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocHeader.tsx @@ -35,7 +35,7 @@ export const DocHeader = ({ doc }: DocHeaderProps) => { <> @@ -72,10 +72,10 @@ export const DocHeader = ({ doc }: DocHeaderProps) => { {isDesktop && ( <> - + {transRole(currentDocRole(doc.abilities))} ยท  - + {t('Last update: {{update}}', { update: DateTime.fromISO(doc.updated_at).toRelative(), })} @@ -92,7 +92,7 @@ export const DocHeader = ({ doc }: DocHeaderProps) => { - + ); diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx index 99d0810c..68c2682c 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx @@ -43,6 +43,7 @@ export const DocTitleText = ({ title }: DocTitleTextProps) => { as="h2" $margin={{ all: 'none', left: 'none' }} $size={isMobile ? 'h4' : 'h2'} + $variation="1000" > {title} @@ -113,7 +114,7 @@ const DocTitleInput = ({ doc }: DocTitleProps) => { onBlurCapture={(event) => handleTitleSubmit(event.target.textContent || '') } - $color={colorsTokens()['greyscale-text']} + $color={colorsTokens()['greyscale-1000']} $margin={{ left: '-2px', right: '10px' }} $css={css` &[contenteditable='true']:empty:not(:focus):before { diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx index bc31cd60..5e7765d4 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx @@ -4,7 +4,8 @@ import { useModal, useToastProvider, } from '@openfun/cunningham-react'; -import { useState } from 'react'; +import { useQueryClient } from '@tanstack/react-query'; +import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { css } from 'styled-components'; @@ -17,12 +18,12 @@ import { } from '@/components'; import { useAuthStore } from '@/core'; import { useCunninghamTheme } from '@/cunningham'; -import { - useEditorStore, - usePanelEditorStore, -} from '@/features/docs/doc-editor/'; +import { useEditorStore } from '@/features/docs/doc-editor/'; import { Doc, ModalRemoveDoc } from '@/features/docs/doc-management'; -import { ModalSelectVersion } from '@/features/docs/doc-versioning'; +import { + KEY_LIST_DOC_VERSIONS, + ModalSelectVersion, +} from '@/features/docs/doc-versioning'; import { useResponsiveStore } from '@/stores'; import { DocShareModal } from '../../doc-share/component/DocShareModal'; @@ -35,6 +36,8 @@ interface DocToolBoxProps { export const DocToolBox = ({ doc }: DocToolBoxProps) => { const { t } = useTranslation(); + const hasAccesses = doc.nb_accesses > 1; + const queryClient = useQueryClient(); const { spacingsTokens, colorsTokens } = useCunninghamTheme(); const spacings = spacingsTokens(); @@ -44,7 +47,6 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => { const [isModalPDFOpen, setIsModalPDFOpen] = useState(false); const selectHistoryModal = useModal(); const modalShare = useModal(); - const { setIsPanelOpen, setIsPanelTableContentOpen } = usePanelEditorStore(); const { isSmallMobile, isDesktop } = useResponsiveStore(); const { authenticated } = useAuthStore(); @@ -80,14 +82,7 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => { }, show: isDesktop, }, - { - label: t('Table of contents'), - icon: 'summarize', - callback: () => { - setIsPanelOpen(true); - setIsPanelTableContentOpen(true); - }, - }, + { label: t('Copy as {{format}}', { format: 'Markdown' }), icon: 'content_copy', @@ -135,6 +130,16 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => { } }; + useEffect(() => { + if (selectHistoryModal.isOpen) { + return; + } + + void queryClient.resetQueries({ + queryKey: [KEY_LIST_DOC_VERSIONS], + }); + }, [selectHistoryModal.isOpen, queryClient]); + return ( { $gap="0.5rem 1.5rem" $wrap={isSmallMobile ? 'wrap' : 'nowrap'} > - + {authenticated && !isSmallMobile && ( - + <> + {!hasAccesses && ( + + )} + {hasAccesses && ( + + + + )} + )} {!isSmallMobile && ( - } onClose={() => onClose()} rightActions={ - + <> + + + } - size={ModalSize.MEDIUM} + size={ModalSize.SMALL} title={ - - - delete_forever - - - {t('Deleting the document "{{title}}"', { title: doc.title })} - - + + {t('Delete a doc')} + } > { aria-label={t('Content modal to delete document')} > {!isError && ( - - - {t('Are you sure you want to delete the document "{{title}}"?', { - title: doc.title, - })} - - + + {t('Are you sure you want to delete the document "{{title}}"?', { + title: doc.title, + })} + )} {isError && } diff --git a/src/frontend/apps/impress/src/features/docs/doc-table-content/components/TableContent.tsx b/src/frontend/apps/impress/src/features/docs/doc-table-content/components/TableContent.tsx index f271aa6d..a0a397c5 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-table-content/components/TableContent.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-table-content/components/TableContent.tsx @@ -2,7 +2,8 @@ import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { css } from 'styled-components'; -import { Box, Icon, Text } from '@/components'; +import { Box, BoxButton, Icon, Text } from '@/components'; +import { useCunninghamTheme } from '@/cunningham'; import { useEditorStore, useHeadingStore } from '@/features/docs/doc-editor'; import { MAIN_LAYOUT_ID } from '@/layouts/conf'; @@ -11,6 +12,8 @@ import { Heading } from './Heading'; export const TableContent = () => { const { headings } = useHeadingStore(); const { editor } = useEditorStore(); + const { spacingsTokens } = useCunninghamTheme(); + const spacing = spacingsTokens(); const [headingIdHighlight, setHeadingIdHighlight] = useState(); @@ -58,33 +61,33 @@ export const TableContent = () => { }; }, [headings, setHeadingIdHighlight]); + const onOpen = () => { + setIsHover(true); + setTimeout(() => { + const element = document.getElementById(`heading-${headingIdHighlight}`); + + element?.scrollIntoView({ + behavior: 'instant', + inline: 'center', + block: 'center', + }); + }, 0); // 300ms is the transition time of the box + }; + + const onClose = () => { + setIsHover(false); + }; + if (!editor) { return null; } return ( { - setIsHover(true); - setTimeout(() => { - const element = document.getElementById( - `heading-${headingIdHighlight}`, - ); - - element?.scrollIntoView({ - behavior: 'smooth', - inline: 'center', - block: 'center', - }); - }, 250); // 300ms is the transition time of the box - }} - onMouseLeave={() => { - setIsHover(false); - }} id="summaryContainer" - $effect="show" - $width="40px" - $height="40px" + $width={!isHover ? '40px' : '200px'} + $height={!isHover ? '40px' : 'auto'} + $maxHeight="calc(50vh - 60px)" $zIndex={1000} $align="center" $padding="xs" @@ -94,51 +97,69 @@ export const TableContent = () => { overflow: hidden; border-radius: var(--c--theme--spacings--3xs); background: var(--c--theme--colors--greyscale-000); - - &:hover { - overflow-y: auto; + ${isHover && + css` display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; gap: var(--c--theme--spacings--2xs); - width: 200px; - height: auto; - max-height: calc(100vh - 60px - 15vh); - } + `} `} > {!isHover && ( - + - + )} {isHover && ( - + - + {t('Summary')} - + + + + + + {headings?.map( + (heading) => + heading.contentText && ( + + ), + )} - {headings?.map( - (heading) => - heading.contentText && ( - - ), - )} )} diff --git a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalSelectVersion.tsx b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalSelectVersion.tsx index 7cc79f05..05a920be 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalSelectVersion.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalSelectVersion.tsx @@ -52,7 +52,8 @@ export const ModalSelectVersion = ({ aria-label="version history modal" className="noPadding" $direction="row" - $height="calc(100vh - 50px);" + $height="100%" + $maxHeight="calc(100vh - 2em - 12px)" $overflow="hidden" > - + {selectedVersionId && ( )} @@ -81,7 +86,7 @@ export const ModalSelectVersion = ({ $direction="column" $justify="space-between" $width="250px" - $height="calc(100vh - 2em - 30px);" + $height="calc(100vh - 2em - 12px)" $css={css` overflow-y: hidden; border-left: 1px solid var(--c--theme--colors--greyscale-200); @@ -105,7 +110,7 @@ export const ModalSelectVersion = ({ `} $padding="sm" > - + {t('History')}