Add line numbers feature to text editor
This commit is contained in:
29
src/App.tsx
29
src/App.tsx
@@ -88,11 +88,16 @@ export default function App() {
|
|||||||
}
|
}
|
||||||
return 16;
|
return 16;
|
||||||
});
|
});
|
||||||
|
const [showLineNumbers, setShowLineNumbers] = useState(() => {
|
||||||
|
return localStorage.getItem("textdb.lineNumbers") === "true";
|
||||||
|
});
|
||||||
const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {
|
const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {
|
||||||
return localStorage.getItem("textdb.sidebarCollapsed") === "true";
|
return localStorage.getItem("textdb.sidebarCollapsed") === "true";
|
||||||
});
|
});
|
||||||
|
|
||||||
const bodyRef = useRef(body);
|
const bodyRef = useRef(body);
|
||||||
|
const textareaRef = useRef<HTMLTextAreaElement | null>(null);
|
||||||
|
const lineNumbersRef = useRef<HTMLDivElement | null>(null);
|
||||||
const historySnapshotRef = useRef<HistorySnapshot | null>(null);
|
const historySnapshotRef = useRef<HistorySnapshot | null>(null);
|
||||||
const recentOpenRef = useRef(new Map<string, number>());
|
const recentOpenRef = useRef(new Map<string, number>());
|
||||||
|
|
||||||
@@ -816,13 +821,26 @@ export default function App() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="editor__textarea-wrap">
|
||||||
|
{showLineNumbers ? (
|
||||||
|
<div className="line-numbers" ref={lineNumbersRef}>
|
||||||
|
{lineNumbers.map((line) => (
|
||||||
|
<div key={line} className="line-numbers__line">
|
||||||
|
{line}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
<textarea
|
<textarea
|
||||||
|
ref={textareaRef}
|
||||||
className="editor__textarea"
|
className="editor__textarea"
|
||||||
value={body}
|
value={body}
|
||||||
onChange={(event) => setBody(event.target.value)}
|
onChange={(event) => setBody(event.target.value)}
|
||||||
|
onScroll={handleTextareaScroll}
|
||||||
placeholder="Write your text here…"
|
placeholder="Write your text here…"
|
||||||
readOnly={isViewingHistory}
|
readOnly={isViewingHistory}
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="editor__footer">
|
<div className="editor__footer">
|
||||||
{hasText ? (
|
{hasText ? (
|
||||||
@@ -975,6 +993,17 @@ export default function App() {
|
|||||||
<option value="light">Bright</option>
|
<option value="light">Bright</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="settings-panel__section settings-panel__section--row">
|
||||||
|
<label className="settings-panel__label" htmlFor="line-numbers-toggle">
|
||||||
|
Line numbers
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="line-numbers-toggle"
|
||||||
|
type="checkbox"
|
||||||
|
checked={showLineNumbers}
|
||||||
|
onChange={(event) => setShowLineNumbers(event.target.checked)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div className="settings-panel__section">
|
<div className="settings-panel__section">
|
||||||
<label className="settings-panel__label" htmlFor="text-size">
|
<label className="settings-panel__label" htmlFor="text-size">
|
||||||
Text size
|
Text size
|
||||||
|
|||||||
Reference in New Issue
Block a user