Skip to content

Commit 206ceb9

Browse files
committed
chore: update
1 parent d291c0b commit 206ceb9

4 files changed

Lines changed: 121 additions & 59 deletions

File tree

packages/rolldown/src/app/components/code/DiffEditor.vue

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,16 @@ import type * as Monaco from 'modern-monaco/editor-core'
33
import { isDark } from '@vitejs/devtools-ui/composables/dark'
44
import { Pane, Splitpanes } from 'splitpanes'
55
import { computed, nextTick, onBeforeUnmount, onMounted, useTemplateRef, watch } from 'vue'
6-
import { applyMonacoTheme, getMonaco, guessMonacoLanguage, setupMonacoScrollSync, syncMonacoEditorScrolls } from '~/composables/monaco'
6+
import {
7+
applyMonacoTheme,
8+
createReadOnlyMonacoEditor,
9+
getMonaco,
10+
getMonacoWordWrap,
11+
guessMonacoLanguage,
12+
setModelLanguageIfNeeded,
13+
setupMonacoScrollSync,
14+
syncMonacoEditorScrolls,
15+
} from '~/composables/monaco'
716
import { settings } from '~/state/settings'
817
import { calculateDiffWithWorker } from '~/worker/diff'
918
@@ -27,23 +36,6 @@ let toDecorations: Monaco.editor.IEditorDecorationsCollection | null = null
2736
let disposeScrollSync: (() => void) | null = null
2837
let diffVersion = 0
2938
30-
function createReadOnlyEditor(container: HTMLElement) {
31-
if (!monaco)
32-
throw new Error('Monaco is not initialized')
33-
34-
return monaco.editor.create(container, {
35-
automaticLayout: true,
36-
fontFamily: '\'Input Mono\', \'FiraCode\', monospace',
37-
fontSize: 13,
38-
lineNumbers: 'on',
39-
minimap: { enabled: false },
40-
readOnly: true,
41-
renderLineHighlight: 'none',
42-
scrollBeyondLastLine: false,
43-
wordWrap: settings.value.codeviewerLineWrap ? 'on' : 'off',
44-
})
45-
}
46-
4739
function setModelValue(model: Monaco.editor.ITextModel, value: string) {
4840
if (model.getValue() !== value)
4941
model.setValue(value)
@@ -133,8 +125,12 @@ onMounted(async () => {
133125
134126
monaco = await getMonaco()
135127
136-
fromEditor = createReadOnlyEditor(fromEl.value)
137-
toEditor = createReadOnlyEditor(toEl.value)
128+
fromEditor = createReadOnlyMonacoEditor(monaco, fromEl.value, {
129+
wordWrap: getMonacoWordWrap(settings.value.codeviewerLineWrap),
130+
})
131+
toEditor = createReadOnlyMonacoEditor(monaco, toEl.value, {
132+
wordWrap: getMonacoWordWrap(settings.value.codeviewerLineWrap),
133+
})
138134
139135
fromModel = monaco.editor.createModel(props.from, guessMonacoLanguage(props.from))
140136
toModel = monaco.editor.createModel(props.to, guessMonacoLanguage(props.to))
@@ -151,12 +147,14 @@ onMounted(async () => {
151147
152148
if (!props.oneColumn)
153149
syncMonacoEditorScrolls(toEditor, fromEditor)
150+
151+
await updateDiffDecorations(props.from, props.to, props.diff)
154152
})
155153
156154
watch(
157155
() => settings.value.codeviewerLineWrap,
158156
(enabled) => {
159-
const wordWrap = enabled ? 'on' : 'off'
157+
const wordWrap = getMonacoWordWrap(enabled)
160158
fromEditor?.updateOptions({ wordWrap })
161159
toEditor?.updateOptions({ wordWrap })
162160
},
@@ -187,33 +185,36 @@ watch(
187185
{ immediate: true },
188186
)
189187
190-
watch(
191-
() => [props.from, props.to, props.diff] as const,
192-
async ([from, to, diffEnabled]) => {
193-
if (!monaco || !fromModel || !toModel || !fromDecorations || !toDecorations)
194-
return
188+
async function updateDiffDecorations(from: string, to: string, diffEnabled: boolean) {
189+
if (!monaco || !fromModel || !toModel || !fromDecorations || !toDecorations)
190+
return
195191
196-
const currentVersion = ++diffVersion
192+
const currentVersion = ++diffVersion
197193
198-
setModelValue(fromModel, from)
199-
setModelValue(toModel, to)
194+
setModelValue(fromModel, from)
195+
setModelValue(toModel, to)
200196
201-
monaco.editor.setModelLanguage(fromModel, guessMonacoLanguage(from))
202-
monaco.editor.setModelLanguage(toModel, guessMonacoLanguage(to))
197+
setModelLanguageIfNeeded(monaco, fromModel, guessMonacoLanguage(from))
198+
setModelLanguageIfNeeded(monaco, toModel, guessMonacoLanguage(to))
203199
204-
fromDecorations.set([])
205-
toDecorations.set([])
200+
fromDecorations.set([])
201+
toDecorations.set([])
206202
207-
if (!diffEnabled || !from)
208-
return
203+
if (!diffEnabled || !from || from === to)
204+
return
209205
210-
const changes = await calculateDiffWithWorker(from, to)
211-
if (currentVersion !== diffVersion)
212-
return
206+
const changes = await calculateDiffWithWorker(from, to)
207+
if (currentVersion !== diffVersion)
208+
return
213209
214-
applyDiffDecorations(changes)
210+
applyDiffDecorations(changes)
211+
}
212+
213+
watch(
214+
() => [props.from, props.to, props.diff] as const,
215+
([from, to, diffEnabled]) => {
216+
updateDiffDecorations(from, to, diffEnabled)
215217
},
216-
{ immediate: true },
217218
)
218219
219220
const leftPanelSize = computed(() => {

packages/rolldown/src/app/components/code/Viewer.vue

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import type * as Monaco from 'modern-monaco/editor-core'
33
import { isDark } from '@vitejs/devtools-ui/composables/dark'
44
import { onBeforeUnmount, onMounted, useTemplateRef, watch } from 'vue'
5-
import { applyMonacoTheme, getMonaco } from '~/composables/monaco'
5+
import { applyMonacoTheme, createReadOnlyMonacoEditor, getMonaco, getMonacoWordWrap } from '~/composables/monaco'
66
import { settings } from '~/state/settings'
77
88
const props = defineProps<{
@@ -31,20 +31,12 @@ onMounted(async () => {
3131
monaco = await getMonaco()
3232
3333
model = monaco.editor.createModel(props.code, 'javascript')
34-
editor = monaco.editor.create(codeEl.value, {
35-
automaticLayout: true,
36-
fontFamily: '\'Input Mono\', \'FiraCode\', monospace',
37-
fontSize: 13,
38-
lineNumbers: 'on',
39-
minimap: { enabled: false },
40-
readOnly: true,
41-
renderLineHighlight: 'none',
42-
scrollBeyondLastLine: false,
34+
editor = createReadOnlyMonacoEditor(monaco, codeEl.value, {
4335
scrollbar: {
4436
vertical: 'hidden',
4537
verticalScrollbarSize: 0,
4638
},
47-
wordWrap: settings.value.codeviewerLineWrap ? 'on' : 'off',
39+
wordWrap: getMonacoWordWrap(settings.value.codeviewerLineWrap),
4840
})
4941
5042
editor.setModel(model)
@@ -69,7 +61,7 @@ watch(
6961
() => settings.value.codeviewerLineWrap,
7062
(enabled) => {
7163
editor?.updateOptions({
72-
wordWrap: enabled ? 'on' : 'off',
64+
wordWrap: getMonacoWordWrap(enabled),
7365
})
7466
},
7567
{ immediate: true },

packages/rolldown/src/app/composables/monaco.ts

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,54 @@ export function applyMonacoTheme(monaco: typeof Monaco) {
7272
monaco.editor.setTheme(getThemeId())
7373
}
7474

75+
export function getMonacoWordWrap(enabled: boolean): Monaco.editor.IStandaloneEditorConstructionOptions['wordWrap'] {
76+
return enabled ? 'on' : 'off'
77+
}
78+
79+
const readonlyEditorOptions: Monaco.editor.IStandaloneEditorConstructionOptions = {
80+
automaticLayout: true,
81+
fontFamily: '\'Input Mono\', \'FiraCode\', monospace',
82+
fontSize: 13,
83+
lineNumbers: 'on',
84+
minimap: { enabled: false },
85+
readOnly: true,
86+
renderLineHighlight: 'none',
87+
scrollBeyondLastLine: false,
88+
scrollbar: {
89+
alwaysConsumeMouseWheel: false,
90+
horizontal: 'auto',
91+
horizontalScrollbarSize: 6,
92+
useShadows: false,
93+
vertical: 'auto',
94+
verticalScrollbarSize: 6,
95+
},
96+
}
97+
98+
export function createReadOnlyMonacoEditor(
99+
monaco: typeof Monaco,
100+
container: HTMLElement,
101+
options: Monaco.editor.IStandaloneEditorConstructionOptions = {},
102+
) {
103+
const scrollbar = {
104+
...readonlyEditorOptions.scrollbar,
105+
...options.scrollbar,
106+
}
107+
return monaco.editor.create(container, {
108+
...readonlyEditorOptions,
109+
...options,
110+
scrollbar,
111+
})
112+
}
113+
114+
export function setModelLanguageIfNeeded(
115+
monaco: typeof Monaco,
116+
model: Monaco.editor.ITextModel,
117+
language: string,
118+
) {
119+
if (model.getLanguageId() !== language)
120+
monaco.editor.setModelLanguage(model, language)
121+
}
122+
75123
export function guessMonacoLanguage(code: string) {
76124
if (code.trimStart().startsWith('<'))
77125
return 'html'
@@ -134,7 +182,6 @@ export function setupMonacoScrollSync(
134182
if (activeEditor === 2)
135183
syncMonacoEditorScrolls(editor2, editor1)
136184
}),
137-
// Keep cursor context aligned even when scroll comes from keyboard/search.
138185
editor1.onDidChangeCursorPosition(() => syncMonacoEditorScrolls(editor1, editor2)),
139186
editor2.onDidChangeCursorPosition(() => syncMonacoEditorScrolls(editor2, editor1)),
140187
]

packages/rolldown/src/app/styles/global.css

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ html, body , #__nuxt{
44
padding: 0;
55
}
66

7+
:root {
8+
--app-scrollbar-size: 6px;
9+
--app-scrollbar-radius: 1px;
10+
--app-scrollbar-thumb: #8884;
11+
--app-scrollbar-thumb-hover: #8885;
12+
}
13+
714
.bg-dots {
815
background-image: url('/dot-grid-light.png');
916
background-size: 50px;
@@ -91,28 +98,43 @@ summary::-webkit-details-marker {
9198

9299
/* For Scrollbar */
93100
::-webkit-scrollbar {
94-
width: 6px;
101+
width: var(--app-scrollbar-size);
95102
}
96103

97104
::-webkit-scrollbar:horizontal {
98-
height: 6px;
105+
height: var(--app-scrollbar-size);
99106
}
100107

101108
::-webkit-scrollbar-corner {
102109
background: transparent;
103110
}
104111

105112
::-webkit-scrollbar-thumb {
106-
background-color: #8884;
113+
background-color: var(--app-scrollbar-thumb);
107114
transition: background 0.2s ease;
108-
border-radius: 1px;
115+
border-radius: var(--app-scrollbar-radius);
109116
}
110117

111118
::-webkit-scrollbar-thumb:hover {
112-
background-color: #8885;
119+
background-color: var(--app-scrollbar-thumb-hover);
113120
}
114121

115122
::-webkit-scrollbar-track {
116-
border-radius: 1px;
123+
border-radius: var(--app-scrollbar-radius);
117124
background: transparent;
118125
}
126+
127+
.monaco-scrollable-element > .scrollbar {
128+
background: transparent !important;
129+
}
130+
131+
.monaco-scrollable-element > .scrollbar > .slider {
132+
background-color: var(--app-scrollbar-thumb) !important;
133+
border-radius: var(--app-scrollbar-radius) !important;
134+
transition: background 0.2s ease;
135+
}
136+
137+
.monaco-scrollable-element > .scrollbar > .slider.active,
138+
.monaco-scrollable-element > .scrollbar > .slider:hover {
139+
background-color: var(--app-scrollbar-thumb-hover) !important;
140+
}

0 commit comments

Comments
 (0)