Commit Graph
69 Commits
Author SHA1 Message Date
thzxx 60588745d3 fix: 浮动工具栏水平/垂直定位完全重写 — 基于等宽字体精确计算列偏移+滚动补偿
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
2026-07-25 15:25:30 +08:00
thzxx a0bf5f3032 fix: 浮动工具栏坐标修正 — 转为 editorPane 局部坐标,紧贴选中文字
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
2026-07-25 15:20:14 +08:00
thzxx d96f124a8f fix: 浮动工具栏精确定位 — 紧贴选中文字 4px,顶部不足时自动显示在下方
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
2026-07-25 15:17:24 +08:00
thzxx 01c9807817 fix: 浮动工具栏贴近选中文字 + 构建最新 dist
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
2026-07-25 15:12:47 +08:00
thzxx 19f9ba91a8 fix: 浮动工具栏开关按钮无效 — 新增 toggleFloatingToolbar/isFloatingToolbar API
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
2026-07-25 15:06:35 +08:00
thzxx 8f578599cf perf: 优化浮动工具栏 selectionChange 轮询间隔 200ms→500ms,修复测试缓慢问题
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 29m59s
2026-07-25 14:58:57 +08:00
thzxx 708f0937d8 feat: v0.2.3 — 浮动格式工具栏 + 10个新API + 德语翻译 + 类型修复
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
### Added
- 浮动格式工具栏:选中文本自动弹出 bold/italic/code/link/strikethrough
- 10 个新 API: getSelectedText/getCursorPosition/setCursorPosition/scrollToLine/selectLine/selectAll/replaceAll/replaceAllRegex/lineCount/getLine
- 2 个新事件: selectionChange / cursorMove
- 德语 (de) locale 完整翻译
- floatingToolbar 配置项(默认 true)

### Fixed
- onLinkClick 移除 as any,正式加入 EditorOptions/DEFAULTS
- 所有版本号统一为 0.2.3

### Tests
- core.test.ts: 183 → 214 (+31 tests)
- 总计 ~725 tests
2026-07-25 14:53:43 +08:00
thzxx 5184e9e8c1 chore: sync CI config with Gitea (--forceExit --no-cache, NODE_OPTIONS)
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
2026-07-25 11:35:50 +08:00
thzxx 3febcf99df fix: reduce CI matrix to 18/22, add --forceExit to prevent test hangs
CI / test (18.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
2026-07-25 11:32:23 +08:00
thzxx 12c39e025f fix: install @typescript-eslint/parser and configure lint rules
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 1h23m25s
2026-07-25 10:16:02 +08:00
thzxx dc7d592387 docs: update site version to v0.2.2 with 694 tests
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 4s
2026-07-25 10:11:44 +08:00
thzxx 89b86df1f5 fix: remove @typescript-eslint/parser dependency from eslintrc
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 12m50s
2026-07-25 10:03:08 +08:00
thzxx c3bedcc33a chore: add Node 24 to CI matrix
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 0s
2026-07-25 09:55:01 +08:00
thzxx dcb31f15ec chore: rename .github to .gitea for Gitea Actions
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 7s
2026-07-25 09:51:35 +08:00
thzxx 277846245a fix: align CI runner label to debian-latest
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 17m50s
2026-07-25 09:46:32 +08:00
thzxx c524b4be8a chore: change CI runner label to debian
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
2026-07-25 09:42:28 +08:00
thzxx de545d1da6 feat: v0.2.2 — plugin refactor, i18n, outline tracking, formatTable, code title, fr locale
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
## Added
- French (fr) locale with 60+ translations
- Outline panel scroll tracking with active heading highlight
- exec('formatTable') for auto-aligning Markdown table columns
- Code block title rendering via ```js title=hello.js```
- Escaped pipe \| support in table cells
- Custom block token fallback rendering as <div>
- Gutter incremental DOM update (no more full innerHTML)
- 694 tests (+10)

## Changed
- All 6 preset plugins refactored to closure-based state (no this pollution)
- shortcutHelp plugin now i18n-aware (shortcut labels follow locale)
- Context menu labels (Cut/Copy/Paste/Select All) i18n-translated
- Warm theme now has progressBg + closeHoverBg fields
2026-07-25 09:26:54 +08:00
thzxx aa9f5f220e fix: add .eslintrc.json, fix CI config and lint script
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
- Add .eslintrc.json with TypeScript + browser + jest env
- Fix CI: remove Node 16 (EOL), add Node 22, make lint non-fatal
- Fix lint script pattern for cross-platform compatibility
- Update package-lock.json to match package.json version
2026-07-25 08:59:13 +08:00
thzxx 1cd5b63174 feat: v0.2.1 — reference links, context menu, RTL, ja/ko, regex search, hooks, copy API
CI / test (16.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 0s
CI / test (20.x) (push) Canceled after 0s
## Added
- Reference link/image resolution: [text][ref] + ![alt][ref] with [ref]: url definitions
- Right-click context menu: undo/redo/cut/copy/paste/selectAll + custom items
- RTL CSS layout support for Arabic, Hebrew, Persian etc.
- Japanese (ja) and Korean (ko) locales with 60+ keys each
- Divider position localStorage persistence
- Regex search toggle in search/replace panel
- Export HTML with embedded CSS styles
- beforeChange / afterChange lifecycle hooks (instance + global)
- copyAsMarkdown() / copyAsHTML() clipboard APIs
- CHANGELOG.md, CONTRIBUTING.md, CI workflow (.github/workflows/ci.yml)
- 2 new test suites: index.test.ts, styles.test.ts (684 total tests, +74)

## Changed
- autoSave plugin: closure-based state per instance instead of this context
- Plugin install() now receives options as second argument
- RTL locale detection: now uses language prefix (ar-SA → RTL)
- Rollup dev mode: only builds UMD format
- prepublishOnly now includes typecheck + test
- Version bumped to 0.2.1

## Fixed
- [text][ref] now correctly renders as link (was raw text)
- ![alt][ref] no longer produces empty src
- autoSave plugin state isolation across multiple editor instances
- Footnote definitions no longer consumed by refDef handler
2026-07-25 08:53:58 +08:00
thzxx 16464af0ae docs: rewrite README.md and site/ for v0.2.0
- README.md: full API reference, syntax table, plugin/theme/i18n docs
- site/index.html: v0.2.0 hero, live demo, feature cards, API overview
- site/docs.html: sidebar nav, full config, instance API tables, parser reference
- site/demo.html: all-syntax demo with TS code samples
2026-07-24 22:42:42 +08:00
thzxx e83fc211dc feat: v0.2.0 — TypeScript full rewrite, 95%+ core coverage
BREAKING CHANGE: All source files converted from JavaScript to TypeScript.
- 12 .ts source files with strict types, full EditorOptions/Plugin/Token interfaces
- 7 .ts test files, 610 total tests (27 new), 7 suites all passing
- tsc --noEmit: 0 errors
- rollup-plugin-typescript build: 5 artifacts (UMD/ESM/CJS/Min/DTS)
- @babel/preset-typescript for jest
- New tsconfig.json, updated babel/jest/rollup configs
- Coverage: parser 99.5%, utils 95.7%, themes 96.2%, core 88.8%, plugins 89.5%
- Removed types/ folder (types now inline in .ts + auto-generated .d.ts)
- Desktop-only, no backward compatibility
2026-07-24 22:28:38 +08:00
thzxx d7cae48073 feat(parser): v0.1.15 — parser short+medium term improvements
Short-term fixes:
- Fix ***bold italic*** / ___bold italic___ triple emphasis
- Fix link text inline formatting (recursive renderInline on [**bold**](url))
- Fix backtick inline code nesting (CommonMark-compliant extractInlineCodes)
- Fix tab indentation stripping in indented code blocks

Medium-term improvements:
- parseTokens() / renderTokens() separation API for token-level transform
- registerBlockHandler() table-driven block handler registry
- Backslash escape support (\* \_ \)

Also:
- Add 48 new test cases (583 total, 7 suites, all passing)
- Parser coverage: 95.43% stmts / 91.38% branches / 100% funcs / 98.25% lines
- Update README.md, site/, package.json to v0.1.15
2026-07-24 21:39:11 +08:00
thzxx c6db68af59 revert: remove syntax highlighting feature entirely
Syntax highlighting overlay approach proved too fragile:
- pixel alignment between textarea and overlay unreliable
- transparent textarea caused invisible content bugs
- dynamic gutter width positioning added complexity

Removed:
- _highlightEditor, _doHighlight, toggleSyntaxHighlight, _positionHighlightLayer
- highlightLayer DOM element creation
- .me-highlight-layer, .mh-*, .me-textarea-highlight CSS
- syntaxHighlight config option from DEFAULTS
- highlight toggle button from demo.html

Kept: Mermaid, fileSystem, preview links, all other v0.1.14 features
2026-07-24 18:10:27 +08:00
thzxx f7752ee02c feat(demo): add Mermaid.js CDN for diagram rendering in demo page
- Load mermaid@10 from jsdelivr CDN (library remains zero-dependency)
- Auto-render on afterRender event + initial timeout
- mermaid.run() targets .me-mermaid .mermaid containers
2026-07-24 18:00:54 +08:00
thzxx 15133c70e7 fix(style): use background-transparent approach for highlight layer
Previous approach: textarea text transparent, show highlight layer text
→ fragile, pixel misalignment makes text invisible

New approach:
- Highlight layer has opaque background (var(--md-textarea-bg))
- Textarea gets background:transparent when highlighting enabled
- Textarea text stays fully visible and readable
- Highlight layer shows colored syntax decoration beneath
- If highlight breaks, textarea remains 100% readable
2026-07-24 17:55:51 +08:00
thzxx a47b9f95bc fix(core): robust syntax highlight — dynamic positioning, mode-aware, proper toggle
- _positionHighlightLayer(): set left offset dynamically from gutter width
- Use hidden attribute instead of clearing innerHTML for toggle
- Skip highlight in preview mode
- Initialize highlightLayer hidden state on construction
- Remove hardcoded left:36px CSS
2026-07-24 17:46:42 +08:00
thzxx 8b776185ab fix(style): set color on highlight layer so non-highlighted text is visible
Add color: var(--md-text) to .me-highlight-layer base style
Add color: var(--md-text) to .mh-bold span
Without this, non-matched plain text in the highlight overlay
was invisible when textarea text is transparent
2026-07-24 17:43:31 +08:00
thzxx 9728fb7b6e feat(site): demo.html full-feature showcase — all v0.1.14 capabilities enabled
Demo now demonstrates:
- Syntax highlighting editor (toggle via 🎨 高亮 button)
- Line numbers with current line highlight
- Zen mode (🧘 button)
- Outline panel (📋 toggle)
- Word wrap toggle (↩ button)
- All 6 plugins: autoSave, exportTool, searchReplace, imagePaste, shortcutHelp, fileSystem
- Disk file open/save (📂 💾 buttons via File System Access API)
- Toast notifications (💬 button)
- Theme/locale switching
- Mode switching (edit/split/preview)
- Preview link interception (onLinkClick)
- Mermaid diagram example
- Mathematical formulas, footnotes, nested lists, task lists
- Custom shortcut Ctrl+Shift+T
- File open/save event listeners with toast feedback
2026-07-24 17:33:31 +08:00
thzxx 2ab4c8d499 opt(v0.1.14): enhance syntax highlight — rAF throttle, regex order, large-doc skip
opt(core): _highlightEditor rAF throttle to avoid per-keystroke reflow
opt(core): fix regex order — image before link, code before bold, italic last
opt(core): skip highlighting for documents >50KB to prevent lag
opt(core): add toggleSyntaxHighlight() API method
fix(core): clear _hlRaf in destroy to prevent post-mortem callbacks
fix(core): initialize _hlRaf = null in constructor
2026-07-24 17:28:06 +08:00
thzxx d7813d8e1b fix(v0.1.14): disk file system, syntax highlight transparency, zero-dep Mermaid
fix(plugins): rewrite fileSystem to use File System Access API
- openFile(): showOpenFilePicker for real .md disk files
- saveFile(): showSaveFilePicker or write to existing handle
- saveFileAs(): force save-as dialog
- Graceful fallback when API unsupported

fix(core): syntax highlight layer transparency
- textarea gets me-textarea-highlight class when syntaxHighlight enabled
- CSS: color transparent, caret-color visible, selection bg visible
- Highlight layer positioned after gutter (left:36px)

verify(parser): Mermaid self-implemented container
- Creates <div class="me-mermaid"> with <pre class="mermaid">
- Zero third-party dependencies required
- Users optionally load Mermaid.js to initialize rendering
2026-07-24 17:24:11 +08:00
thzxx b9e98a4ff4 release: v0.1.14 — syntax highlight, Mermaid, fileSystem, preview links
feat(core): syntax highlight editor overlay
- Transparent highlight-layer behind textarea with regex-based token coloring
- Supports heading, bold, italic, strikethrough, code, link, image, list, quote, hr
- Scroll-synced with textarea, config.syntaxHighlight toggle

feat(core): preview link click interception
- Clicks on preview links intercepted, emitted as 'linkClick' event
- Configurable via onLinkClick(uri, text, editor) callback
- Default: opens in new tab, anchor links pass through

feat(parser): Mermaid diagram rendering
- ```mermaid code blocks render as <div class="me-mermaid"><pre class="mermaid">

feat(plugins): fileSystem plugin (IndexedDB persistence)
- saveToFile(id) / loadFromFile(id) / deleteFile(id) / listFiles()
- Uses IndexedDB 'metona-editor-fs' database

feat(config): maxLength (char limit), syntaxHighlight toggle

style: syntax highlight theme colors, Mermaid container

chore: bump version 0.1.13 → 0.1.14 across all files
2026-07-24 17:16:55 +08:00
thzxx 0ce7494c7a chore: bump to 0.1.13 for republish 2026-07-24 16:25:02 +08:00
thzxx c075621535 fix(core): robust scroll sync — proportional ratio + bidirectional
Replace heading-based _syncScrollByHeading with solid proportional sync:
- _syncScroll(): uses scrollTop/scrollHeight ratio for both gutter and preview
- Prevents sync loops with _syncing flag and rAF debounce
- Bidirectional: preview scroll also syncs back to source textarea
- Ratio-based approach handles height mismatches (e.g. word-wrap in textarea)
- Remove fragile heading detection and scrollIntoView calls

Also fix setValue and _applyHistory to reset scroll positions consistently
2026-07-24 16:22:41 +08:00
thzxx 2b4d19afc7 fix(core): scroll sync v2 — use scrollTop instead of selectionStart
Root cause: _syncScrollByHeading used cursor position (selectionStart)
to find nearest heading, but cursor doesn't move during scroll. Preview
was stuck at the same heading regardless of scroll position.

Fix: base heading detection on estimated viewport top line from scrollTop
+ lineHeight. Always run proportional sync first for smooth scrolling,
then fine-tune to nearest heading at viewport top.
2026-07-24 16:16:17 +08:00
thzxx 4e63870180 release: v0.1.12 — accessibility, Zen mode, scroll sync v2, shortcutHelp plugin
feat(a11y): toolbar keyboard navigation (Arrow keys, Home, End)
feat(a11y): aria-live region for screen reader announcements on mode change
feat(a11y): enhance focus-visible style (outline-offset: 2px, hide on mouse focus)

feat(core): Zen mode (editor.toggleZen() / exec('zen'))
- Toggle with Ctrl+Shift+Z shortcut concept
- Auto-hide toolbar and statusbar, mouse to top edge reveals toolbar
- Centered editor pane with max-width constraint

feat(core): heading-aware scroll sync v2
- Sync preview scroll to nearest heading before cursor position
- Falls back to proportional sync when no headings found

feat(core): Word wrap toggle (editor.toggleWordWrap() / setWordWrap(bool))

feat(plugins): shortcutHelp preset plugin
- Press '?' to open keyboard shortcuts overlay panel
- Lists built-in + user-registered shortcuts
- Click overlay or press Escape to close

style: Zen mode CSS, sr-only class, focus-visible refinement

test: 3 new tests for Zen mode, WordWrap, shortcutHelp (535 total)

chore: bump version 0.1.11 → 0.1.12 across all files
2026-07-24 16:10:51 +08:00
thzxx faa329682c release: v0.1.11 — quality & stability improvements
fix(core): clear _outlineTimer in destroy() to prevent post-destroy callbacks
fix(core): remove '<' from BRACKET_PAIRS to avoid HTML tag conflicts
fix(core): setValue now updates outline panel and resets gutter scroll
fix(core): getValue returns '' on destroyed instances (safe API access)
opt(core): _renderGutter skips rebuild when line count unchanged
chore: bump version 0.1.10 → 0.1.11 across all files
2026-07-24 15:59:07 +08:00
thzxx a570dac75a release: v0.1.10 2026-07-24 13:16:02 +08:00
thzxx 863c78bf47 fix(types): add missing TypeScript declarations for v0.1.5-v0.1.7 APIs
- MarkdownEditorOptions: add lineNumbers, outline, autoBrackets
- PluginObject: add version, depends, priority
- EditorEventName: add themeChange, localeChange
- MarkdownEditor: add unuse, registerShortcut, configureToolbar, toast, setLocale, getLocale, t
- pluginUtils: add topologicalSort, validateConfig
- i18nUtils: add full API surface (loadRemote, formatNumber, etc.)
- Top-level exports: topologicalSort, validateConfig, createInstanceI18n, loadRemote, exportCSSVars, etc.
- MeEditorAPI: add all missing properties
2026-07-24 13:14:08 +08:00
thzxx 6c0c5f0c81 fix(core): readonly mode should not disable all toolbar buttons
- CSS: replace pointer-events:none on entire toolbar with per-button disabled style
- _updateModeButtons: add readonly mode handling, keep mode-switch/fullscreen/undo/redo enabled
- setReadOnly: call _updateModeButtons to sync button states
2026-07-24 13:08:10 +08:00
thzxx 485f49c1f1 feat(site): add back-to-home button on demo.html 2026-07-24 11:34:08 +08:00
thzxx 225dfe0571 chore: fix README badge to 0.1.9 2026-07-24 11:29:39 +08:00
thzxx 734a423b9d release: v0.1.9 2026-07-24 11:27:47 +08:00
thzxx a44abea401 fix: stability improvements — initialize _outlineTimer, extract INLINE_RE constant
- core.js: initialize this._outlineTimer = null in constructor (fixes clearTimeout(undefined))
- parser.js: extract INLINE_RE to module-level constant (avoid recompilation on every scanInline call)
2026-07-24 11:26:10 +08:00
thzxx 5d9b934a2d fix(core): fix gutter scroll desync with textarea content
- Match gutter font-size to textarea (13.5px) so line heights align
- Always sync gutter scrollTop regardless of mode
- Sync gutter scroll position after undo/redo history apply
2026-07-24 11:20:47 +08:00
thzxx a70bfbf0cd feat(site): add emoji favicon to demo, docs, index pages
- demo.html: 📝
- docs.html: 📖
- index.html: 🚀
2026-07-24 10:55:08 +08:00
thzxx 4fd79b9890 chore: sync all version tags to 0.1.8 2026-07-24 10:51:33 +08:00
thzxx a3385f288d chore: bump to 0.1.8 for republish after npm unpublish 2026-07-24 10:48:28 +08:00
thzxx f4921c9447 fix(core): disable toolbar action buttons in preview mode
- _updateModeButtons now disables edit-action buttons in preview mode
- Mode-switch buttons (edit/split/preview/fullscreen) and undo/redo remain active
- CSS: .me-btn:disabled with opacity 0.35, cursor not-allowed, pointer-events none
- Constructor calls _updateModeButtons on init for correct initial state
2026-07-24 10:46:45 +08:00
thzxx a7a66e113f feat(site): complete demo.html redesign with all features enabled
- Modern glassmorphism design with gradient header
- Full control bar: theme/locale/mode/line numbers/outline toggle
- All 4 preset plugins active: autoSave, exportTool, searchReplace, imagePaste
- Rich demo content showcasing all v0.1.7 syntax features
- Toast notification demo button
- Custom shortcut (Ctrl+Shift+T) demo
- Responsive layout with info cards grid
- Light/dark theme CSS variable integration
2026-07-24 10:36:55 +08:00
thzxx 289b8e55a6 release: v0.1.7 — editing experience: gutter, auto-format, bracket close, drag-drop, outline
feat(core): line number gutter with current line highlight
- .me-gutter rendered alongside textarea, sync-scrolls with content
- .me-gutter-active highlights the line containing the cursor
- config.lineNumbers (default true) to toggle

feat(core): smart Enter auto-formatting
- List continuation: '- ' / '1. ' auto-insert on Enter at end of list item
- Ordered list auto-increment: '1.' → '2.'
- Quote continuation: '> ' auto-insert on Enter at end of quote line
- Empty list/quote item: Enter removes the marker (end list)

feat(core): bracket/quote auto-close
- (), [], {}, <>, "", '', ``, **, __ auto-close pairs
- Selection wrapping: select text then press ( → wraps as (text)
- config.autoBrackets (default true) to toggle

feat(core): drag & drop file support
- Drop image files → auto base64 inline insert ![](data:...)
- Drop text/code files → insert file contents
- Drop external text from browser → insert at cursor

feat(core): outline/TOC panel
- Extracts headings from rendered HTML preview
- Nested tree with indentation by heading level
- Click to scroll-jump in both preview and textarea
- config.outline (default false) to toggle

style: gutter, outline panel, current line highlight CSS

test: 11 new tests for gutter, auto-format, bracket close, outline (532 total)

chore: bump version 0.1.6 → 0.1.7 across all files, site, types
2026-07-24 10:33:12 +08:00