split global.css

This commit is contained in:
2026-05-17 14:44:45 +02:00
parent ac99cc724a
commit 93fdb8d1fc
19 changed files with 3605 additions and 3397 deletions
@@ -0,0 +1,51 @@
import { useCallback, useEffect, useRef, useState } from 'react';
import type { EditorView } from '@codemirror/view';
interface Opts {
getView: () => EditorView | null;
}
/** Live markdown preview pane: visibility, mobile tab, debounced render. */
export function useLivePreview({ getView }: Opts) {
const [showPreview, setShowPreview] = useState(false);
const [mobileView, setMobileView] = useState<'edit' | 'preview'>('edit');
const previewRef = useRef<HTMLDivElement>(null);
const renderMarkdownRef = useRef<((src: string) => string) | null>(null);
const previewTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const updatePreviewRef = useRef<() => void>(() => {});
const updatePreview = useCallback(async () => {
const view = getView();
if (!showPreview || !view || !previewRef.current) return;
if (!renderMarkdownRef.current) {
const mod = await import('../../../../lib/markdown');
renderMarkdownRef.current = mod.renderMarkdown;
}
const content = view.state.doc.toString();
previewRef.current.innerHTML = renderMarkdownRef.current(content);
}, [showPreview, getView]);
useEffect(() => {
updatePreviewRef.current = updatePreview;
}, [updatePreview]);
useEffect(() => {
if (showPreview) updatePreview();
}, [showPreview, updatePreview]);
// Debounced refresh — called from the CodeMirror update listener.
const schedulePreview = useCallback(() => {
if (previewTimerRef.current) clearTimeout(previewTimerRef.current);
previewTimerRef.current = setTimeout(() => updatePreviewRef.current(), 300);
}, []);
return {
showPreview,
setShowPreview,
mobileView,
setMobileView,
previewRef,
updatePreview,
schedulePreview,
};
}