This commit is contained in:
2025-11-25 00:42:32 +01:00
parent 81dd7b80d4
commit 4d30e47ee8
6 changed files with 31 additions and 5 deletions
+2 -1
View File
@@ -55,7 +55,8 @@ const DocumentsRouteContent: React.FC = () => {
}, []); }, []);
const renderSurface = () => { const renderSurface = () => {
const layoutClass = `documents-main${sidebarHidden ? ' documents-main--sidebar-hidden' : ''}`; const detailMode = surface?.detailMode ?? null;
const layoutClass = `documents-main${sidebarHidden ? ' documents-main--sidebar-hidden' : ''}${detailMode === 'overlay' ? ' documents-main--overlay-detail' : ''}`;
const sidebarNode = !sidebarHidden && sidebarProps ? <Sidebar {...sidebarProps} /> : null; const sidebarNode = !sidebarHidden && sidebarProps ? <Sidebar {...sidebarProps} /> : null;
const surfaceDetail = surface && (surface as { detail?: ReactNode }).detail ? (surface as { detail?: ReactNode }).detail : null; const surfaceDetail = surface && (surface as { detail?: ReactNode }).detail ? (surface as { detail?: ReactNode }).detail : null;
const surfaceBody = surface ? surface.content : null; const surfaceBody = surface ? surface.content : null;
+7 -2
View File
@@ -27,7 +27,7 @@ export type DetailPanelProps = (ComponentProps<typeof DocumentViewerPanel> & {
) => Promise<void>; ) => Promise<void>;
}) | null; }) | null;
export type WorkspaceSurface = { content: ReactNode; detail?: ReactNode | null } | null; export type WorkspaceSurface = { content: ReactNode; detail?: ReactNode | null; detailMode?: 'overlay' | 'inline' | null } | null;
export interface UseWorkspaceSurfaceArgs { export interface UseWorkspaceSurfaceArgs {
sidebarHidden?: boolean; sidebarHidden?: boolean;
@@ -100,7 +100,10 @@ export const useWorkspaceSurface = ({
} }
const sidebarToggle = renderSidebarToggle ? renderSidebarToggle() : null; const sidebarToggle = renderSidebarToggle ? renderSidebarToggle() : null;
const viewMode = documentsTableProps.viewMode;
const sidebarMode = viewMode === 'desk' ? 'overlay' : 'inline';
const detailMode: 'overlay' | 'inline' | null = detailPanelOpen && detailPanelProps ? sidebarMode : null;
const detail = detailPanelOpen && detailPanelProps const detail = detailPanelOpen && detailPanelProps
? (() => { ? (() => {
const { const {
@@ -114,6 +117,7 @@ export const useWorkspaceSurface = ({
const viewer = ( const viewer = (
<DocumentViewerPanel <DocumentViewerPanel
variant="sidebar" variant="sidebar"
sidebarMode={sidebarMode}
onCollapsePanel={onClose} onCollapsePanel={onClose}
onMaximizePanel={onOpenPreview} onMaximizePanel={onOpenPreview}
tagOptions={tagOptions} tagOptions={tagOptions}
@@ -141,6 +145,7 @@ export const useWorkspaceSurface = ({
/> />
), ),
detail, detail,
detailMode,
}; };
}, [ }, [
documentsTableProps, documentsTableProps,
@@ -205,7 +210,7 @@ export const useWorkspaceSurface = ({
) )
: viewer; : viewer;
return { content, detail: null }; return { content, detail: null, detailMode: null };
}, [ }, [
showPreviewWorkspace, showPreviewWorkspace,
previewWorkspaceDocument, previewWorkspaceDocument,
+6 -1
View File
@@ -58,6 +58,8 @@ interface AssetLike {
[key: string]: unknown; [key: string]: unknown;
} }
type SidebarMode = 'overlay' | 'inline';
interface DocumentViewerPanelProps extends DocumentSummarySectionProps { interface DocumentViewerPanelProps extends DocumentSummarySectionProps {
document: DocumentLike | null; document: DocumentLike | null;
ensureAssetUrl?: (docId: DocumentId, asset: AssetLike, options?: { force?: boolean }) => Promise<unknown>; ensureAssetUrl?: (docId: DocumentId, asset: AssetLike, options?: { force?: boolean }) => Promise<unknown>;
@@ -70,6 +72,7 @@ interface DocumentViewerPanelProps extends DocumentSummarySectionProps {
variant?: 'viewer' | 'sidebar'; variant?: 'viewer' | 'sidebar';
onCollapsePanel?: () => void; onCollapsePanel?: () => void;
onMaximizePanel?: (args: { documentIds: Array<string> }) => void; onMaximizePanel?: (args: { documentIds: Array<string> }) => void;
sidebarMode?: SidebarMode;
} }
@@ -138,6 +141,7 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
variant = 'viewer', variant = 'viewer',
onCollapsePanel, onCollapsePanel,
onMaximizePanel, onMaximizePanel,
sidebarMode = 'overlay',
}) => { }) => {
const navigate = useNavigate(); const navigate = useNavigate();
const isSidebarVariant = variant === 'sidebar'; const isSidebarVariant = variant === 'sidebar';
@@ -507,10 +511,11 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
); );
if (isSidebarVariant) { if (isSidebarVariant) {
const sidebarClass = `detail-panel panel${sidebarMode === 'inline' ? ' detail-panel--inline' : ''}${isPanelResizing ? ' detail-panel--resizing' : ''}`;
return ( return (
<> <>
<aside <aside
className={`detail-panel panel${isPanelResizing ? ' detail-panel--resizing' : ''}`} className={sidebarClass}
ref={panelRef} ref={panelRef}
style={detailPanelStyle} style={detailPanelStyle}
> >
@@ -16,6 +16,16 @@
overflow: visible; overflow: visible;
} }
.detail-panel.detail-panel--inline {
position: relative;
right: auto;
top: auto;
height: auto;
min-height: 100%;
z-index: auto;
flex: 0 0 var(--detail-panel-width);
}
.detail-panel--resizing { .detail-panel--resizing {
cursor: col-resize; cursor: col-resize;
user-select: none; user-select: none;
@@ -104,6 +104,11 @@
overflow: visible; overflow: visible;
} }
.documents-main--overlay-detail .panel-floating-region {
width: calc(100% - var(--detail-panel-width) - 2rem);
margin-right: var(--detail-panel-width);
}
.panel-floating__buttons { .panel-floating__buttons {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
+1 -1
View File
@@ -57,7 +57,7 @@
color: var(--muted-subtle); color: var(--muted-subtle);
} }
.main-content .panel-header { .documents-main--overlay-detail .main-content .panel-header {
margin-right: var(--detail-panel-width); margin-right: var(--detail-panel-width);
} }