@nks-hub/texy-editor 0.1.3 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +276 -266
- package/dist/texy-editor.cjs +37 -37
- package/dist/texy-editor.cjs.map +1 -1
- package/dist/texy-editor.css +1 -1
- package/dist/texy-editor.js +499 -412
- package/dist/texy-editor.js.map +1 -1
- package/dist/types/core/DialogManager.d.ts +1 -1
- package/dist/types/core/TexyEditor.d.ts +1 -0
- package/dist/types/core/TexyFormatter.d.ts +6 -1
- package/dist/types/parser/TexyParser.d.ts +1 -0
- package/dist/types/types.d.ts +7 -0
- package/package.json +64 -64
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 NKS Hub
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 NKS Hub
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,266 +1,276 @@
|
|
|
1
|
-
# @nks-hub/texy-editor
|
|
2
|
-
|
|
3
|
-
[](https://github.com/nks-hub/texy-ts-editor/actions)
|
|
4
|
-
[](https://www.npmjs.com/package/@nks-hub/texy-editor)
|
|
5
|
-
[](LICENSE)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
21
|
-
- **
|
|
22
|
-
- **
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
|
70
|
-
|
|
71
|
-
| **
|
|
72
|
-
| **
|
|
73
|
-
| **
|
|
74
|
-
| **
|
|
75
|
-
| **
|
|
76
|
-
| **
|
|
77
|
-
| **
|
|
78
|
-
| **
|
|
79
|
-
| **
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
|
90
|
-
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
|
|
|
96
|
-
|
|
|
97
|
-
| `
|
|
98
|
-
|
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
|
107
|
-
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
| `/--
|
|
114
|
-
|
|
|
115
|
-
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
|
152
|
-
|
|
153
|
-
| `
|
|
154
|
-
| `
|
|
155
|
-
| `
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
)
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
|
179
|
-
|
|
180
|
-
| `
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
|
211
|
-
|
|
212
|
-
| `dist/texy-editor.
|
|
213
|
-
| `dist/
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
- **
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
1
|
+
# @nks-hub/texy-editor
|
|
2
|
+
|
|
3
|
+
[](https://github.com/nks-hub/texy-ts-editor/actions)
|
|
4
|
+
[](https://www.npmjs.com/package/@nks-hub/texy-editor)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
[](https://github.com/nks-hub/texy-ts-editor/actions)
|
|
8
|
+
|
|
9
|
+
> Modern TypeScript Texy markup editor with configurable toolbar, client-side parser, live preview, theming, and plugin system. Zero jQuery dependency. Spiritual successor to [Texyla](https://github.com/janmarek/Texyla).
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Why Texy Editor?
|
|
14
|
+
|
|
15
|
+
[Texy](https://texy.info) is a powerful markup language created by [David Grudl](https://davidgrudl.com/) that goes beyond Markdown with underline headings, advanced image syntax, modifiers, typography rules, and more. The original [Texyla editor](https://github.com/janmarek/Texyla) by Jan Marek provided a jQuery-based frontend for Texy, but hasn't been actively maintained for years.
|
|
16
|
+
|
|
17
|
+
This project is a **modern rewrite from scratch** — zero jQuery, pure TypeScript, with a client-side parser and extensible plugin system:
|
|
18
|
+
|
|
19
|
+
- **TypeScript-first** — Fully typed API, exported types for all options
|
|
20
|
+
- **Zero dependencies** — No jQuery, no external libraries
|
|
21
|
+
- **Client-side parser** — Live preview without server round-trips
|
|
22
|
+
- **Plugin system** — Extend with custom syntax (YouTube, smileys, BBCode, etc.)
|
|
23
|
+
- **Themeable** — Light/dark themes via CSS custom properties
|
|
24
|
+
- **Dual output** — ESM + CJS builds, tree-shakeable
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Live Demo
|
|
29
|
+
|
|
30
|
+
Try the interactive playground: **[nks-hub.github.io/texy-ts-editor](https://nks-hub.github.io/texy-ts-editor/)**
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Quick Start
|
|
35
|
+
|
|
36
|
+
### Installation
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install @nks-hub/texy-editor
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Attach to a Textarea
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
import { TexyEditor } from '@nks-hub/texy-editor';
|
|
46
|
+
import '@nks-hub/texy-editor/css';
|
|
47
|
+
|
|
48
|
+
const editor = new TexyEditor('#my-textarea', {
|
|
49
|
+
language: 'en',
|
|
50
|
+
theme: 'light',
|
|
51
|
+
livePreview: true,
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Standalone Parser (No UI)
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import { TexyParser } from '@nks-hub/texy-editor';
|
|
59
|
+
|
|
60
|
+
const parser = new TexyParser();
|
|
61
|
+
const html = parser.parse('**bold** and *italic*');
|
|
62
|
+
// <p><strong>bold</strong> and <em>italic</em></p>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Features
|
|
68
|
+
|
|
69
|
+
| Feature | Description |
|
|
70
|
+
|---------|-------------|
|
|
71
|
+
| **Full Texy Syntax** | Bold, italic, headings, lists, tables, code blocks, images, links, blockquotes, modifiers |
|
|
72
|
+
| **Typography** | Smart dashes, ellipsis, arrows, symbols, Czech non-breaking spaces |
|
|
73
|
+
| **Live Preview** | Client-side rendering with configurable debounce |
|
|
74
|
+
| **Toolbar** | Configurable button groups, custom buttons, keyboard shortcuts |
|
|
75
|
+
| **Keyboard Shortcuts** | Ctrl+B, Ctrl+I, Tab indent, F11 fullscreen, customizable |
|
|
76
|
+
| **Undo/Redo** | Built-in history with configurable max steps |
|
|
77
|
+
| **i18n** | English and Czech built-in, extensible to any language |
|
|
78
|
+
| **Themes** | Light and dark presets, CSS custom properties for full control |
|
|
79
|
+
| **Plugin System** | Preprocess, inline, and postprocess hooks with placeholder protection |
|
|
80
|
+
| **Split View** | Side-by-side editor + preview mode |
|
|
81
|
+
| **Fullscreen** | Distraction-free editing mode |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Supported Texy Syntax
|
|
86
|
+
|
|
87
|
+
### Inline
|
|
88
|
+
|
|
89
|
+
| Syntax | Output |
|
|
90
|
+
|--------|--------|
|
|
91
|
+
| `**bold**` | **bold** |
|
|
92
|
+
| `*italic*` | *italic* |
|
|
93
|
+
| `` `code` `` | `code` |
|
|
94
|
+
| `--deleted--` | ~~deleted~~ |
|
|
95
|
+
| `++inserted++` | <u>inserted</u> |
|
|
96
|
+
| `^^super^^` | superscript |
|
|
97
|
+
| `__sub__` | subscript |
|
|
98
|
+
| `>>quoted<<` | quoted |
|
|
99
|
+
| `"text":https://url` | link |
|
|
100
|
+
| `[* image.jpg *]` | image |
|
|
101
|
+
| `word((title))` | abbreviation |
|
|
102
|
+
| `''noTexy zone''` | raw text |
|
|
103
|
+
|
|
104
|
+
### Block
|
|
105
|
+
|
|
106
|
+
| Syntax | Output |
|
|
107
|
+
|--------|--------|
|
|
108
|
+
| Underline heading (`===`) | `<h1>`–`<h4>` |
|
|
109
|
+
| Surrounded heading (`=== text ===`) | `<h1>`–`<h4>` |
|
|
110
|
+
| `- item` | unordered list |
|
|
111
|
+
| `1) item` | ordered list |
|
|
112
|
+
| `> quote` | blockquote |
|
|
113
|
+
| `/--code lang` ... `\--` | code block |
|
|
114
|
+
| `/--html` ... `\--` | raw HTML |
|
|
115
|
+
| `/--div .class` ... `\--` | div with modifier |
|
|
116
|
+
| `\| cell \| cell \|` | table |
|
|
117
|
+
| `---` or `***` | horizontal rule |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Plugins
|
|
122
|
+
|
|
123
|
+
Extend the parser with built-in or custom plugins.
|
|
124
|
+
|
|
125
|
+
### Built-in Plugins
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
import {
|
|
129
|
+
TexyParser,
|
|
130
|
+
youtubePlugin,
|
|
131
|
+
smileyPlugin,
|
|
132
|
+
bbcodePlugin,
|
|
133
|
+
imageEmbedPlugin,
|
|
134
|
+
linkRedirectPlugin,
|
|
135
|
+
} from '@nks-hub/texy-editor';
|
|
136
|
+
|
|
137
|
+
const parser = new TexyParser({
|
|
138
|
+
plugins: [
|
|
139
|
+
youtubePlugin({ width: 560, height: 315 }),
|
|
140
|
+
smileyPlugin({ baseUrl: 'https://example.com/smileys' }),
|
|
141
|
+
bbcodePlugin(),
|
|
142
|
+
imageEmbedPlugin({ maxWidth: '400px' }),
|
|
143
|
+
linkRedirectPlugin({
|
|
144
|
+
redirectUrl: 'https://example.com/redirect',
|
|
145
|
+
excludeDomains: ['example.com'],
|
|
146
|
+
}),
|
|
147
|
+
],
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
| Plugin | Syntax | Description |
|
|
152
|
+
|--------|--------|-------------|
|
|
153
|
+
| `youtubePlugin` | `[* youtube:ID *]` | YouTube video embeds |
|
|
154
|
+
| `smileyPlugin` | `*123*` | Numeric smiley/emoticon images |
|
|
155
|
+
| `bbcodePlugin` | `[b]`, `[i]`, `[u]`, `[s]`, `[url=]`, `[color=]` | BBCode tag support |
|
|
156
|
+
| `imageEmbedPlugin` | `"[* img *]":URL` | Linked image embeds |
|
|
157
|
+
| `linkRedirectPlugin` | — (postprocess) | Rewrite external links through redirect service |
|
|
158
|
+
|
|
159
|
+
### Custom Plugin
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import type { TexyParserPlugin } from '@nks-hub/texy-editor';
|
|
163
|
+
|
|
164
|
+
const mentionPlugin: TexyParserPlugin = {
|
|
165
|
+
name: 'mentions',
|
|
166
|
+
processInline(text, placeholder) {
|
|
167
|
+
return text.replace(/@([a-zA-Z0-9_]+)/g, (_m, user) =>
|
|
168
|
+
placeholder(`<a href="/profile/${user}">@${user}</a>`)
|
|
169
|
+
);
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const parser = new TexyParser({ plugins: [mentionPlugin] });
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Plugin hooks:**
|
|
177
|
+
|
|
178
|
+
| Hook | Stage | Use case |
|
|
179
|
+
|------|-------|----------|
|
|
180
|
+
| `preprocess(text)` | Before parsing | Convert custom syntax to Texy or placeholders |
|
|
181
|
+
| `processInline(text, ph)` | During inline pass | Generate HTML with placeholder protection |
|
|
182
|
+
| `postprocess(html)` | After parsing | Transform final HTML output |
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Editor Options
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
const editor = new TexyEditor('#textarea', {
|
|
190
|
+
language: 'en', // 'en' | 'cs' | custom
|
|
191
|
+
theme: 'light', // 'light' | 'dark' | custom class
|
|
192
|
+
livePreview: true, // Client-side preview
|
|
193
|
+
livePreviewDelay: 300, // Debounce ms
|
|
194
|
+
splitView: true, // Side-by-side mode
|
|
195
|
+
fullscreen: true, // Enable F11 fullscreen
|
|
196
|
+
autoResize: true, // Auto-grow textarea
|
|
197
|
+
maxUndoSteps: 50, // Undo history limit
|
|
198
|
+
previewPath: '/api/preview', // Server-side preview URL
|
|
199
|
+
toolbar: ['bold', 'italic', null, 'link', 'image'],
|
|
200
|
+
shortcuts: { bold: 'Ctrl+B' },
|
|
201
|
+
plugins: [],
|
|
202
|
+
cssVars: { '--texy-accent': '#0066cc' },
|
|
203
|
+
});
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Build Outputs
|
|
209
|
+
|
|
210
|
+
| File | Format | Size | Use Case |
|
|
211
|
+
|------|--------|------|----------|
|
|
212
|
+
| `dist/texy-editor.js` | ESM | ~66 KB | Modern bundlers (Vite, webpack, Rollup) |
|
|
213
|
+
| `dist/texy-editor.cjs` | CJS | ~47 KB | Node.js / `require()` |
|
|
214
|
+
| `dist/texy-editor.css` | CSS | ~10 KB | Base stylesheet with theme support |
|
|
215
|
+
| `dist/types/` | `.d.ts` | — | TypeScript type declarations |
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Development
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# Install dependencies
|
|
223
|
+
npm install
|
|
224
|
+
|
|
225
|
+
# Dev server with playground
|
|
226
|
+
npm run dev
|
|
227
|
+
|
|
228
|
+
# Run tests (229 tests)
|
|
229
|
+
npm test
|
|
230
|
+
|
|
231
|
+
# Type checking
|
|
232
|
+
npm run typecheck
|
|
233
|
+
|
|
234
|
+
# Production build
|
|
235
|
+
npm run build
|
|
236
|
+
|
|
237
|
+
# Watch mode
|
|
238
|
+
npm run test:watch
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Requirements
|
|
244
|
+
|
|
245
|
+
- **Node.js**: 18+ recommended
|
|
246
|
+
- **TypeScript**: 5.0+ (for TypeScript projects)
|
|
247
|
+
- **Browsers**: Modern browsers with ES6 support
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Contributing
|
|
252
|
+
|
|
253
|
+
Contributions are welcome! For major changes, please open an issue first.
|
|
254
|
+
|
|
255
|
+
1. Fork the repository
|
|
256
|
+
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
|
|
257
|
+
3. Commit your changes (`git commit -m 'feat: description'`)
|
|
258
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
259
|
+
5. Open a Pull Request
|
|
260
|
+
|
|
261
|
+
## Support
|
|
262
|
+
|
|
263
|
+
- 📧 **Email:** dev@nks-hub.cz
|
|
264
|
+
- 🐛 **Bug reports:** [GitHub Issues](https://github.com/nks-hub/texy-ts-editor/issues)
|
|
265
|
+
- 📖 **Texy syntax:** [texy.nette.org](https://texy.nette.org/cs/syntax)
|
|
266
|
+
- 🎮 **Live demo:** [nks-hub.github.io/texy-ts-editor](https://nks-hub.github.io/texy-ts-editor/)
|
|
267
|
+
|
|
268
|
+
## License
|
|
269
|
+
|
|
270
|
+
MIT License — see [LICENSE](LICENSE) for details.
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
<p align="center">
|
|
275
|
+
Made with ❤️ by <a href="https://github.com/nks-hub">NKS Hub</a>
|
|
276
|
+
</p>
|