Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/nimeshnayaju/solid-codemirror
CodeMirror 6 component for SolidJS
https://github.com/nimeshnayaju/solid-codemirror
codemirror codemirror6 editor solid solid-codemirror solidjs
Last synced: about 1 month ago
JSON representation
CodeMirror 6 component for SolidJS
- Host: GitHub
- URL: https://github.com/nimeshnayaju/solid-codemirror
- Owner: nimeshnayaju
- License: mit
- Created: 2022-06-28T01:11:43.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2022-09-20T08:52:00.000Z (about 2 years ago)
- Last Synced: 2024-04-25T16:02:47.655Z (8 months ago)
- Topics: codemirror, codemirror6, editor, solid, solid-codemirror, solidjs
- Language: TypeScript
- Homepage: https://solid-codemirror.vercel.app/
- Size: 192 KB
- Stars: 19
- Watchers: 2
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
- awesome-solid-js - Solid CodeMirror - CodeMirror 6 component for SolidJS (📦 Components & Libraries / Frameworks & Component Libraries)
README
# solid-codemirror
A set of libraries to integrate CodeMirror to any SolidJS app. This repository contains two packages:
- [@solid-codemirror/core](https://github.com/nimeshnayaju/solid-codemirror/tree/main/packages/core)
- [@solid-codemirror/codemirror](https://github.com/nimeshnayaju/solid-codemirror/tree/main/packages/codemirror)
## Demo
https://solid-codemirror.vercel.app/
## Installation
```bash
yarn add @solid-codemirror/codemirror
# or
npm i @solid-codemirror/codemirror
```> **Note** The [@codemirror/state](https://github.com/codemirror/state) and [@codemirror/view](https://github.com/codemirror/state) libraries are flagged as peer dependencies and are recommeneded to be installed alongside this package.
## Known issue with `Vite`
> **Warning** You may encounter the following error if you're using Vite as your bundling tool:
>
> ```bash
> Error: Unrecognized extension value in extension set ([object Object]). This sometimes happens because multipleinstances of @codemirror/state are loaded, breaking instanceof checks.
> ```
>
> This error can be fixed by adding the following configuration option to your `vite.config.{js,ts}` file.
>
> ```typescript
> export default defineConfig({
> // Your configuration
> optimizeDeps: {
> // Add both @codemirror/state and @codemirror/view to included deps for optimization
> include: ["@codemirror/state", "@codemirror/view"],
> },
> });
> ```## Basic Usage
```tsx
import { CodeMirror } from "@solid-codemirror/codemirror";export default function App() {
return ;
}
```## Configure Line Numbers / Read Only / Line Wrapping
```tsx
import { CodeMirror } from "@solid-codemirror/codemirror";export default function App() {
return ;
}
```## Configure theme
```tsx
import { CodeMirror } from "@solid-codemirror/codemirror";
import { oneDark } from "@codemirror/theme-one-dark";export default function App() {
return ;
}
```## Configure Extensions
```tsx
import { CodeMirror } from "@solid-codemirror/codemirror";
import { basicSetup } from "codemirror";
import { python } from "@codemirror/lang-python";
import { oneDark } from "@codemirror/theme-one-dark";export default function App() {
return ;
}
```## Register callbacks on editor value change or editor mount
```tsx
import { CodeMirror } from "@solid-codemirror/codemirror";
import type { EditorView } from "@codemirror/view";export default function App() {
const onValueChange = (value: string) => {
console.log(value);
};const onEditorMount = (view: EditorView) => {
console.log(view);
};return (
);
}
```## Controlling the `CodeMirror` component
You can control the `CodeMirror` component through the following props. **All props are optional.**
| Prop | Type | Description |
| ----------------- | ------------------------------ | ------------------------------------------------------------------------------ |
| `value` | `string` | The initial value of the editor |
| `onValueChange` | `(value: string) => void` | Called whenever the editor code value changes |
| `onEditorMount` | `(editor: EditorView) => void` | Called when the editor first mounts, receiving the current EditorView instance |
| `showLineNumbers` | `boolean` | Whether to display line numbers |
| `wrapLine` | `boolean` | Whether to wrap lines |
| `readOnly` | `boolean` | Whether to set the editor to read-only |
| `theme` | `Extension` | The CodeMirror theme extension to use |
| `extensions` | `Extension[]` | An array of CodeMirror extensions to use |For more information on the usage of the `CodeMirror` component, check out [@solid-codemirror/codemirror](https://github.com/nimeshnayaju/solid-codemirror/tree/main/packages/codemirror).
\
Â
\
Â# Advanced usage
### Want more control over your `CodeMirror` component? Create your custom component using the `createCodeMirror` function.
## Installation
```bash
yarn add @solid-codemirror/core @codemirror/state @codemirror/view
# or
npm i @solid-codemirror/core @codemirror/state @codemirror/view
```## `createCodeMirror`
Attaches a `CodeMirror` view to the specified `ref` object and returns a object with a `createExtension` method to add extension compartments to the codemirror state instance.
## Basic Usage
```tsx
import { CodeMirrorProps, createCodeMirror } from "@solid-codemirror/core";export default function CodeMirror(props: CodeMirrorProps) {
let ref: HTMLDivElement | undefined;createCodeMirror(props, () => ref);
return
;
}
```## Add Extension
```tsx
import { CodeMirrorProps, createCodeMirror } from "@solid-codemirror/core";
import { lineNumbers } from "@codemirror/view";export default function App(props: CodeMirrorProps) {
let ref: HTMLDivElement | undefined;const { createExtension } = createCodeMirror(props, () => ref);
createExtension(lineNumbers());
return
;
}
```## Reconfigure Extension
```tsx
import { CodeMirrorProps, createCodeMirror } from "@solid-codemirror/core";
import { lineNumbers } from "@codemirror/view";export default function App(props: CodeMirrorProps) {
let ref: HTMLDivElement | undefined;const { createExtension } = createCodeMirror(props, () => ref);
const reconfigureLineNumbers = createExtension(lineNumbers());
return (
{/* Buttons to show/hide line numbers */}
reconfigureLineNumbers([])}>
Hide line numbers
reconfigureLineNumbers(lineNumbers())}>
Show line numbers
);
}
```> **Note** Extensions in `@codemirror/core` are wrapped inside an editor [Comparment](https://codemirror.net/docs/ref/#state.Compartment). Compartments enable [dynamic reconfiguration](https://codemirror.net/examples/config/) (partially reconfigure a tree of extensions) of the editor.
> **Note** The `@solid-codemirror/codemirror` package is based on `@codemirror/core`. You can view the [source code](https://github.com/nimeshnayaju/solid-codemirror/tree/main/packages/codemirror) of the library here.
For more information on the usage of the `createCodeMirror` function, check out [@solid-codemirror/core](https://github.com/nimeshnayaju/solid-codemirror/tree/main/packages/core).
## License
This project is licensed under MIT.
## Author
- [@nayajunimesh](https://twitter.com/nayajunimesh)