diff --git a/src/frontend/apps/impress/public/favicon.ico b/src/frontend/apps/impress/public/favicon.ico index d881a763..ce7bc2c5 100644 Binary files a/src/frontend/apps/impress/public/favicon.ico and b/src/frontend/apps/impress/public/favicon.ico differ diff --git a/src/frontend/apps/impress/src/components/DropdownMenu.tsx b/src/frontend/apps/impress/src/components/DropdownMenu.tsx index 82e80fc6..8c390c73 100644 --- a/src/frontend/apps/impress/src/components/DropdownMenu.tsx +++ b/src/frontend/apps/impress/src/components/DropdownMenu.tsx @@ -77,7 +77,7 @@ export const DropdownMenu = ({ {topMessage} )} - {options.map((option) => { + {options.map((option, index) => { if (option.show !== undefined && !option.show) { return; } @@ -104,6 +104,16 @@ export const DropdownMenu = ({ $gap={spacings['base']} $css={css` border: none; + ${index === 0 && + css` + border-top-left-radius: 4px; + border-top-right-radius: 4px; + `} + ${index === options.length - 1 && + css` + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + `} font-size: var(--c--theme--font--sizes--sm); color: var(--c--theme--colors--greyscale-1000); font-weight: 500; diff --git a/src/frontend/apps/impress/src/components/quick-search/QuickSearchStyle.tsx b/src/frontend/apps/impress/src/components/quick-search/QuickSearchStyle.tsx index 7738f2cb..27967b2f 100644 --- a/src/frontend/apps/impress/src/components/quick-search/QuickSearchStyle.tsx +++ b/src/frontend/apps/impress/src/components/quick-search/QuickSearchStyle.tsx @@ -71,8 +71,6 @@ export const QuickSearchStyle = createGlobalStyle` flex:1; overflow-y: auto; overscroll-behavior: contain; - transition: 100ms ease; - transition-property: height; } [cmdk-vercel-shortcuts] { diff --git a/src/frontend/apps/impress/src/cunningham/cunningham-style.css b/src/frontend/apps/impress/src/cunningham/cunningham-style.css index 4090f557..00d95617 100644 --- a/src/frontend/apps/impress/src/cunningham/cunningham-style.css +++ b/src/frontend/apps/impress/src/cunningham/cunningham-style.css @@ -545,8 +545,8 @@ input:-webkit-autofill:focus { color: var(--c--theme--colors--greyscale-600); } -.c__modal__footer { - margin-top: -1rem; +.c__modal__close .c__button { + padding: 0 !important; } .c__modal--full .c__modal__content { 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 08497bd2..8886562b 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 @@ -10,7 +10,7 @@ import * as Y from 'yjs'; import { Box, TextErrors } from '@/components'; import { useAuthStore } from '@/core/auth'; -import { Doc, Role, currentDocRole } from '@/features/docs/doc-management'; +import { Doc } from '@/features/docs/doc-management'; import { useUploadFile } from '../hook'; import { useHeadings } from '../hook/useHeadings'; @@ -167,23 +167,6 @@ export const BlockNoteEditor = ({ doc, provider }: BlockNoteEditorProps) => { ); useHeadings(editor); - /** - * With the collaboration it gets complicated to create the initial block - * better to let Blocknote manage, then we update the block with the content. - */ - useEffect(() => { - if (doc.content || currentDocRole(doc.abilities) !== Role.OWNER) { - return; - } - - setTimeout(() => { - editor.updateBlock(editor.document[0], { - type: 'heading', - content: '', - }); - }, 100); - }, [editor, doc.content, doc.abilities]); - useEffect(() => { setEditor(editor); 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 977fe3a8..f40e7248 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 @@ -42,7 +42,7 @@ export const DocHeader = ({ doc }: DocHeaderProps) => { {docIsPublic && ( { border: 1px solid var(--c--theme--colors--primary-300, #e3e3fd); `} > - - {t('Public document')} + + + {t('Public document')} + )} 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 5e7765d4..2144fa12 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 @@ -212,6 +212,7 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => { $theme="primary" $padding={{ all: 'xs' }} $css={css` + border-radius: 4px; &:hover { background-color: ${colors['greyscale-100']}; } diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalRemoveDoc.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalRemoveDoc.tsx index 53a21997..6dab1516 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalRemoveDoc.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalRemoveDoc.tsx @@ -46,7 +46,6 @@ export const ModalRemoveDoc = ({ onClose, doc }: ModalRemoveDocProps) => { onClose()} rightActions={ <> @@ -72,17 +71,14 @@ export const ModalRemoveDoc = ({ onClose, doc }: ModalRemoveDocProps) => { } - size={ModalSize.SMALL} + size={ModalSize.MEDIUM} title={ {t('Delete a doc')} } > - + {!isError && ( {t('Are you sure you want to delete the document "{{title}}"?', { diff --git a/src/frontend/apps/impress/src/features/docs/doc-table-content/components/Heading.tsx b/src/frontend/apps/impress/src/features/docs/doc-table-content/components/Heading.tsx index 4146db10..9a564f74 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-table-content/components/Heading.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-table-content/components/Heading.tsx @@ -65,7 +65,7 @@ export const Heading = ({ $width="100%" $padding={{ vertical: 'xtiny', left: leftPaddingMap[level] }} $variation={isActive ? '1000' : '700'} - $weight={isActive ? 'bold' : 'normal'} + $weight={isHighlight ? 'bold' : 'normal'} $css="overflow-wrap: break-word;" $hasTransition aria-selected={isHighlight} 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 a0a397c5..4ad01fa0 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 @@ -78,7 +78,12 @@ export const TableContent = () => { setIsHover(false); }; - if (!editor) { + if ( + !editor || + !headings || + headings.length === 0 || + (headings.length === 1 && !headings[0].contentText) + ) { return null; } diff --git a/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGrid.tsx b/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGrid.tsx index c51ca99b..a62c7e41 100644 --- a/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGrid.tsx +++ b/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGrid.tsx @@ -1,4 +1,4 @@ -import { Button, Loader } from '@openfun/cunningham-react'; +import { Button } from '@openfun/cunningham-react'; import { useTranslation } from 'react-i18next'; import { InView } from 'react-intersection-observer'; import { css } from 'styled-components'; @@ -36,7 +36,7 @@ export const DocsGrid = ({ }), }); const loading = isFetching || isLoading; - + const hasDocs = data?.pages.some((page) => page.results.length > 0); const loadMore = (inView: boolean) => { if (!inView || loading) { return; @@ -63,7 +63,7 @@ export const DocsGrid = ({ overflow-y: auto; `} > - + - - - - - {t('Name')} - - - {isDesktop && ( - - - {t('Updated at')} - - - )} - - - - - {/* Body */} - {data?.pages.map((currentPage) => { - return currentPage.results.map((doc) => ( - - )); - })} - - - {loading && ( - - + {!hasDocs && ( + + + {t('No documents found')} + )} + {hasDocs && ( + + + + + {t('Name')} + + + {isDesktop && ( + + + {t('Updated at')} + + + )} + + + + + {/* Body */} + {data?.pages.map((currentPage) => { + return currentPage.results.map((doc) => ( + + )); + })} + + )} + {hasNextPage && !loading && ( { font-weight: ${isActive ? 700 : undefined}; &:hover { background-color: ${colors['greyscale-100']}; - font-weight: 700; } `} > diff --git a/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelContent.tsx b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelContent.tsx index 2dd043b0..b621e1c5 100644 --- a/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelContent.tsx +++ b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelContent.tsx @@ -22,7 +22,7 @@ export const LeftPanelContent = () => { flex: 0 0 auto; `} > - + diff --git a/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelDocContent.tsx b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelDocContent.tsx index e2e615c1..d571b698 100644 --- a/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelDocContent.tsx +++ b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelDocContent.tsx @@ -1,10 +1,14 @@ +import { css } from 'styled-components'; + import { Box, SeparatedSection } from '@/components'; +import { useCunninghamTheme } from '@/cunningham'; import { useDocStore } from '@/features/docs'; import { SimpleDocItem } from '@/features/docs/docs-grid/components/SimpleDocItem'; export const LeftPanelDocContent = () => { const { currentDoc } = useDocStore(); - + const { spacingsTokens } = useCunninghamTheme(); + const spacing = spacingsTokens(); if (!currentDoc) { return null; } @@ -17,7 +21,15 @@ export const LeftPanelDocContent = () => { > - + + + diff --git a/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavoriteItem.tsx b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavoriteItem.tsx new file mode 100644 index 00000000..374e67c6 --- /dev/null +++ b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavoriteItem.tsx @@ -0,0 +1,52 @@ +import { useModal } from '@openfun/cunningham-react'; +import { css } from 'styled-components'; + +import { Box, StyledLink } from '@/components'; +import { useCunninghamTheme } from '@/cunningham'; +import { Doc, DocsGridActions, SimpleDocItem } from '@/features/docs'; +import { DocShareModal } from '@/features/docs/doc-share/component/DocShareModal'; +import { useResponsiveStore } from '@/stores'; + +type LeftPanelFavoriteItemProps = { + doc: Doc; +}; + +export const LeftPanelFavoriteItem = ({ doc }: LeftPanelFavoriteItemProps) => { + const shareModal = useModal(); + const { spacingsTokens } = useCunninghamTheme(); + const { isDesktop } = useResponsiveStore(); + const spacing = spacingsTokens(); + return ( + + + + +
+ +
+ {shareModal.isOpen && ( + + )} +
+ ); +}; diff --git a/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavorites.tsx b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavorites.tsx index 3de5297e..8ab80bd7 100644 --- a/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavorites.tsx +++ b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavorites.tsx @@ -1,16 +1,11 @@ import { useTranslation } from 'react-i18next'; -import { css } from 'styled-components'; -import { - Box, - InfiniteScroll, - SeparatedSection, - StyledLink, - Text, -} from '@/components'; +import { Box, InfiniteScroll, Text } from '@/components'; +import { HorizontalSeparator } from '@/components/separators/HorizontalSeparator'; import { useCunninghamTheme } from '@/cunningham'; import { useInfiniteDocs } from '@/features/docs'; -import { SimpleDocItem } from '@/features/docs/docs-grid/components/SimpleDocItem'; + +import { LeftPanelFavoriteItem } from './LeftPanelFavoriteItem'; export const LeftPanelFavorites = () => { const { t } = useTranslation(); @@ -23,17 +18,18 @@ export const LeftPanelFavorites = () => { is_favorite: true, }); - const invitations = docs.data?.pages.flatMap((page) => page.results) || []; + const favoriteDocs = docs.data?.pages.flatMap((page) => page.results) || []; - if (invitations.length === 0) { + if (favoriteDocs.length === 0) { return null; } return ( - + + { isLoading={docs.isFetchingNextPage} next={() => void docs.fetchNextPage()} > - {invitations.map((doc) => ( - - - - - + {favoriteDocs.map((doc) => ( + ))} - +
); };