diff --git a/src/renderer/src/components/CodeViewer.tsx b/src/renderer/src/components/CodeViewer.tsx index 4c4e5c3ce9..c73063e73d 100644 --- a/src/renderer/src/components/CodeViewer.tsx +++ b/src/renderer/src/components/CodeViewer.tsx @@ -108,6 +108,7 @@ const CodeViewer = ({ children, language, expanded, unwrapped, onHeightChange, c ref={scrollerRef} className="shiki-scroller" $wrap={!unwrapped} + $expanded={expanded} $lineHeight={estimateSize()} style={ { @@ -132,7 +133,7 @@ const CodeViewer = ({ children, language, expanded, unwrapped, onHeightChange, c width: '100%', transform: `translateY(${virtualItems[0]?.start ?? 0}px)` }}> - {virtualizer.getVirtualItems().map((virtualItem) => ( + {virtualItems.map((virtualItem) => (
` display: block; overflow-x: auto; position: relative; border-radius: inherit; - padding: 0.5em 1em; + /* padding right 下沉到 line-content 中 */ + padding: 0.5em 0 0.5em 1em; .line { display: flex; align-items: flex-start; width: 100%; line-height: ${(props) => props.$lineHeight}px; - contain: content; + /* contain 优化 wrap 时滚动性能,will-change 优化 unwrap 时滚动性能 */ + contain: ${(props) => (props.$wrap ? 'content' : 'none')}; + will-change: ${(props) => (!props.$wrap && !props.$expanded ? 'transform' : 'auto')}; .line-number { width: var(--gutter-width, 1.2ch); @@ -250,6 +255,7 @@ const ScrollContainer = styled.div<{ .line-content { flex: 1; + padding-right: 1em; * { white-space: ${(props) => (props.$wrap ? 'pre-wrap' : 'pre')}; overflow-wrap: ${(props) => (props.$wrap ? 'break-word' : 'normal')};