App Component
The App
component is the root component of the application. It sets up the main layout and state management for the editor.
Structure
The component is divided into three main sections:
- Toolbar: A
Toolbar
component that provides controls for the editor, such as toggling the minimap and word wrap, and saving the documentation. - Editor: An
Editor
component where the user can write Markdown. - Preview: A
Preview
component that displays the rendered HTML of the Markdown from the editor.
State Management
The App
component manages the following state:
markdown
: The current Markdown content of the editor.minimapEnabled
: A boolean to control the visibility of the minimap in the editor.wordWrapEnabled
: A boolean to control word wrapping in the editor.
These state variables are passed down as props to the Toolbar
, Editor
, and Preview
components.
Code Breakdown
import { useState } from 'react';
import Editor from './components/Editor';
import Preview from './components/Preview';
import Toolbar from './components/Toolbar';
import { Toaster } from 'sonner';
// Initial markdown content for demonstration
const initialMarkdown = `# Welcome to the Markdown Editor
...`;
function App() {
const [markdown, setMarkdown] = useState(initialMarkdown);
const [minimapEnabled, setMinimapEnabled] = useState(true);
const [wordWrapEnabled, setWordWrapEnabled] = useState(true);
return (
<div className="flex h-screen flex-col bg-white dark:bg-zinc-950 text-zinc-900 dark:text-zinc-50">
<Toolbar
minimapEnabled={minimapEnabled}
setMinimapEnabled={setMinimapEnabled}
wordWrapEnabled={wordWrapEnabled}
setWordWrapEnabled={setWordWrapEnabled}
markdown={markdown}
setMarkdown={setMarkdown}
/>
<div className="flex flex-1 overflow-hidden">
<div className="w-1/2 border-r border-zinc-200 dark:border-zinc-800">
<Editor
value={markdown}
onChange={setMarkdown}
minimapEnabled={minimapEnabled}
wordWrapEnabled={wordWrapEnabled}
/>
</div>
<div className="w-1/2 overflow-auto bg-white dark:bg-zinc-950">
<Preview markdown={markdown} />
</div>
</div>
<Toaster position="bottom-right" />
</div>
);
}
export default App;
initialMarkdown
A string constant that provides the initial Markdown content when the application loads. This is useful for demonstrating the editor's features to new users.
useState
The useState
hook from React is used to manage the state of the application.
markdown
: Stores the Markdown text. It is initialized withinitialMarkdown
.minimapEnabled
: A boolean state to show or hide the editor's minimap. Default istrue
.wordWrapEnabled
: A boolean state to enable or disable word wrapping in the editor. Default istrue
.
Layout
The main layout is a flex container that fills the entire screen (h-screen
). The Toolbar
is at the top, and the editor and preview panes are arranged horizontally below it. The Toaster
component from the sonner
library is used to display notifications.