@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 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
- [![Build Status](https://github.com/nks-hub/texy-ts-editor/actions/workflows/build.yml/badge.svg)](https://github.com/nks-hub/texy-ts-editor/actions)
4
- [![npm version](https://img.shields.io/npm/v/@nks-hub/texy-editor.svg)](https://www.npmjs.com/package/@nks-hub/texy-editor)
5
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
-
7
- > 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).
8
-
9
- ---
10
-
11
- ## Why Texy Editor?
12
-
13
- [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.
14
-
15
- This project is a **modern rewrite from scratch** zero jQuery, pure TypeScript, with a client-side parser and extensible plugin system:
16
-
17
- - **TypeScript-first** — Fully typed API, exported types for all options
18
- - **Zero dependencies** — No jQuery, no external libraries
19
- - **Client-side parser** — Live preview without server round-trips
20
- - **Plugin system** — Extend with custom syntax (YouTube, smileys, BBCode, etc.)
21
- - **Themeable** — Light/dark themes via CSS custom properties
22
- - **Dual output** — ESM + CJS builds, tree-shakeable
23
-
24
- ---
25
-
26
- ## Live Demo
27
-
28
- Try the interactive playground: **[nks-hub.github.io/texy-ts-editor](https://nks-hub.github.io/texy-ts-editor/)**
29
-
30
- ---
31
-
32
- ## Quick Start
33
-
34
- ### Installation
35
-
36
- ```bash
37
- npm install @nks-hub/texy-editor
38
- ```
39
-
40
- ### Attach to a Textarea
41
-
42
- ```typescript
43
- import { TexyEditor } from '@nks-hub/texy-editor';
44
- import '@nks-hub/texy-editor/css';
45
-
46
- const editor = new TexyEditor('#my-textarea', {
47
- language: 'en',
48
- theme: 'light',
49
- livePreview: true,
50
- });
51
- ```
52
-
53
- ### Standalone Parser (No UI)
54
-
55
- ```typescript
56
- import { TexyParser } from '@nks-hub/texy-editor';
57
-
58
- const parser = new TexyParser();
59
- const html = parser.parse('**bold** and *italic*');
60
- // <p><strong>bold</strong> and <em>italic</em></p>
61
- ```
62
-
63
- ---
64
-
65
- ## Features
66
-
67
- | Feature | Description |
68
- |---------|-------------|
69
- | **Full Texy Syntax** | Bold, italic, headings, lists, tables, code blocks, images, links, blockquotes, modifiers |
70
- | **Typography** | Smart dashes, ellipsis, arrows, symbols, Czech non-breaking spaces |
71
- | **Live Preview** | Client-side rendering with configurable debounce |
72
- | **Toolbar** | Configurable button groups, custom buttons, keyboard shortcuts |
73
- | **Keyboard Shortcuts** | Ctrl+B, Ctrl+I, Tab indent, F11 fullscreen, customizable |
74
- | **Undo/Redo** | Built-in history with configurable max steps |
75
- | **i18n** | English and Czech built-in, extensible to any language |
76
- | **Themes** | Light and dark presets, CSS custom properties for full control |
77
- | **Plugin System** | Preprocess, inline, and postprocess hooks with placeholder protection |
78
- | **Split View** | Side-by-side editor + preview mode |
79
- | **Fullscreen** | Distraction-free editing mode |
80
-
81
- ---
82
-
83
- ## Supported Texy Syntax
84
-
85
- ### Inline
86
-
87
- | Syntax | Output |
88
- |--------|--------|
89
- | `**bold**` | **bold** |
90
- | `*italic*` | *italic* |
91
- | `` `code` `` | `code` |
92
- | `--deleted--` | ~~deleted~~ |
93
- | `++inserted++` | <u>inserted</u> |
94
- | `^^super^^` | superscript |
95
- | `__sub__` | subscript |
96
- | `>>quoted<<` | quoted |
97
- | `"text":https://url` | link |
98
- | `[* image.jpg *]` | image |
99
- | `word((title))` | abbreviation |
100
- | `''noTexy zone''` | raw text |
101
-
102
- ### Block
103
-
104
- | Syntax | Output |
105
- |--------|--------|
106
- | Underline heading (`===`) | `<h1>`–`<h4>` |
107
- | Surrounded heading (`=== text ===`) | `<h1>`–`<h4>` |
108
- | `- item` | unordered list |
109
- | `1) item` | ordered list |
110
- | `> quote` | blockquote |
111
- | `/--code lang` ... `\--` | code block |
112
- | `/--html` ... `\--` | raw HTML |
113
- | `/--div .class` ... `\--` | div with modifier |
114
- | `\| cell \| cell \|` | table |
115
- | `---` or `***` | horizontal rule |
116
-
117
- ---
118
-
119
- ## Plugins
120
-
121
- Extend the parser with built-in or custom plugins.
122
-
123
- ### Built-in Plugins
124
-
125
- ```typescript
126
- import {
127
- TexyParser,
128
- youtubePlugin,
129
- smileyPlugin,
130
- bbcodePlugin,
131
- imageEmbedPlugin,
132
- linkRedirectPlugin,
133
- } from '@nks-hub/texy-editor';
134
-
135
- const parser = new TexyParser({
136
- plugins: [
137
- youtubePlugin({ width: 560, height: 315 }),
138
- smileyPlugin({ baseUrl: 'https://example.com/smileys' }),
139
- bbcodePlugin(),
140
- imageEmbedPlugin({ maxWidth: '400px' }),
141
- linkRedirectPlugin({
142
- redirectUrl: 'https://example.com/redirect',
143
- excludeDomains: ['example.com'],
144
- }),
145
- ],
146
- });
147
- ```
148
-
149
- | Plugin | Syntax | Description |
150
- |--------|--------|-------------|
151
- | `youtubePlugin` | `[* youtube:ID *]` | YouTube video embeds |
152
- | `smileyPlugin` | `*123*` | Numeric smiley/emoticon images |
153
- | `bbcodePlugin` | `[b]`, `[i]`, `[u]`, `[s]`, `[url=]`, `[color=]` | BBCode tag support |
154
- | `imageEmbedPlugin` | `"[* img *]":URL` | Linked image embeds |
155
- | `linkRedirectPlugin` | (postprocess) | Rewrite external links through redirect service |
156
-
157
- ### Custom Plugin
158
-
159
- ```typescript
160
- import type { TexyParserPlugin } from '@nks-hub/texy-editor';
161
-
162
- const mentionPlugin: TexyParserPlugin = {
163
- name: 'mentions',
164
- processInline(text, placeholder) {
165
- return text.replace(/@([a-zA-Z0-9_]+)/g, (_m, user) =>
166
- placeholder(`<a href="/profile/${user}">@${user}</a>`)
167
- );
168
- },
169
- };
170
-
171
- const parser = new TexyParser({ plugins: [mentionPlugin] });
172
- ```
173
-
174
- **Plugin hooks:**
175
-
176
- | Hook | Stage | Use case |
177
- |------|-------|----------|
178
- | `preprocess(text)` | Before parsing | Convert custom syntax to Texy or placeholders |
179
- | `processInline(text, ph)` | During inline pass | Generate HTML with placeholder protection |
180
- | `postprocess(html)` | After parsing | Transform final HTML output |
181
-
182
- ---
183
-
184
- ## Editor Options
185
-
186
- ```typescript
187
- const editor = new TexyEditor('#textarea', {
188
- language: 'en', // 'en' | 'cs' | custom
189
- theme: 'light', // 'light' | 'dark' | custom class
190
- livePreview: true, // Client-side preview
191
- livePreviewDelay: 300, // Debounce ms
192
- splitView: true, // Side-by-side mode
193
- fullscreen: true, // Enable F11 fullscreen
194
- autoResize: true, // Auto-grow textarea
195
- maxUndoSteps: 50, // Undo history limit
196
- previewPath: '/api/preview', // Server-side preview URL
197
- toolbar: ['bold', 'italic', null, 'link', 'image'],
198
- shortcuts: { bold: 'Ctrl+B' },
199
- plugins: [],
200
- cssVars: { '--texy-accent': '#0066cc' },
201
- });
202
- ```
203
-
204
- ---
205
-
206
- ## Build Outputs
207
-
208
- | File | Format | Size | Use Case |
209
- |------|--------|------|----------|
210
- | `dist/texy-editor.js` | ESM | ~66 KB | Modern bundlers (Vite, webpack, Rollup) |
211
- | `dist/texy-editor.cjs` | CJS | ~47 KB | Node.js / `require()` |
212
- | `dist/texy-editor.css` | CSS | ~10 KB | Base stylesheet with theme support |
213
- | `dist/types/` | `.d.ts` | | TypeScript type declarations |
214
-
215
- ---
216
-
217
- ## Development
218
-
219
- ```bash
220
- # Install dependencies
221
- npm install
222
-
223
- # Dev server with playground
224
- npm run dev
225
-
226
- # Run tests (229 tests)
227
- npm test
228
-
229
- # Type checking
230
- npm run typecheck
231
-
232
- # Production build
233
- npm run build
234
-
235
- # Watch mode
236
- npm run test:watch
237
- ```
238
-
239
- ---
240
-
241
- ## Requirements
242
-
243
- - **Node.js**: 18+ recommended
244
- - **TypeScript**: 5.0+ (for TypeScript projects)
245
- - **Browsers**: Modern browsers with ES6 support
246
-
247
- ---
248
-
249
- ## License
250
-
251
- MIT License — see [LICENSE](LICENSE) file for details.
252
-
253
- ---
254
-
255
- ## Links
256
-
257
- - [Texy Markup Language](https://texy.info) The original Texy PHP library by David Grudl
258
- - [Texyla](https://github.com/janmarek/Texyla) The original jQuery-based Texy editor (archived)
259
- - [Nette Framework](https://nette.org) PHP framework commonly used with Texy
260
- - [GitHub Repository](https://github.com/nks-hub/texy-ts-editor)
261
- - [npm Package](https://www.npmjs.com/package/@nks-hub/texy-editor)
262
- - [Issue Tracker](https://github.com/nks-hub/texy-ts-editor/issues)
263
-
264
- ---
265
-
266
- **Built for Texy** A modern successor to Texyla, built from scratch in TypeScript.
1
+ # @nks-hub/texy-editor
2
+
3
+ [![Build Status](https://github.com/nks-hub/texy-ts-editor/actions/workflows/build.yml/badge.svg)](https://github.com/nks-hub/texy-ts-editor/actions)
4
+ [![npm version](https://img.shields.io/npm/v/@nks-hub/texy-editor.svg)](https://www.npmjs.com/package/@nks-hub/texy-editor)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.7+-3178c6.svg)](https://www.typescriptlang.org/)
7
+ [![Tests](https://img.shields.io/badge/tests-229%20passed-brightgreen.svg)](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>