https://github.com/basecamp/lexxy
Lexicalエディタの contenteditable ルート内に配置されたキャプション用 `<textarea>` からのイベントバブリングにより、Ctrl+A/C/X がLexicalのコマンドに横取りされていた問題を修正。`stopPropagation()` をすべての `keydown` イベントとクリップボードイベント(copy/cut/paste)に適用することで、標準的なテキスト編集操作を正しく動作させています。
iA Writer などの外部エディタからテキストを貼り付けると単一改行が失われる問題を修正。`marked()` に `breaks: true` を渡す1行の変更で、CommonMark のデフォルト動作(単一 `\n` をスペース扱い)を上書きし、`<br>` タグへ変換するようになりました。段落区切り(`\n\n`)の動作は従来通り維持されます。
GitHub Pages上のLexxyデモページに、Service WorkerでActive StorageのDirect Uploadエンドポイントをモックすることで、サーバーなしにファイルアップロードの完全なライフサイクルを実現しました。あわせて`:`トリガーの絵文字ピッカーも追加され、`attachments="false"`制限と「not supported」の注記が削除されています。
`foreman` と `bin/dev` スクリプトを導入し、ローカル開発時に必要なRailsサーバーと JSウォッチャーを1コマンドで起動できるようになりました。`bin/dev` はstale PIDのクリーンアップも担い、前回のサーバープロセスが残留している場合でも安全に再起動できます。
サンドボックスの@メンションにアバター画像(user-1.jpg〜user-5.jpg)を追加し、メンション付き画像のスタイルリグレッションを早期検出できる体制を整備。合わせて `.person--avatar` のサイズ基準をフォント行高(`1lh`)に統一し、`&:not(img)` セレクタで画像とイニシャル表示の共存を実現。`lexxy-editor.css` のメンションチップ削除ボタンも円形(`border-radius: 50%`)に統一された。
アップロード中のノードにキャプションが設定されている場合、ファイル名の代わりにそのキャプションを優先表示するよう変更されました。`this.caption || this.file.name || ""` というフォールバックチェーンを1行追加するだけで、拡張機能が事前にキャプションを知っている場合のちらつきを抑制できます。
`@rails/activestorage` を devDependencies へ移動したことで発生していたRollupビルドの失敗を修正しました。`output.file` 指定時にチャンク分割が試みられエラーになる問題を、`rollup.config.mjs` に `external` 設定を追加することで解消しています。
LexxyのテストスイートにTrixエディタとの双方向クロスエディタ互換性テストが追加されました。`to_trix_html`を使った正確なコンテンツシリアライズとJavaScript経由のTrix内部API操作を組み合わせ、リッチテキスト・添付ファイル・ギャラリーの6シナリオでエディタ間のAction Text互換性を検証するハーネスが整備されています。
LexxyのブラウザテストをCapybara/SeleniumからPlaywrightへ移行し、ViteをテストホストとしてRails依存を排除しました。テスト実行時間が約20秒超から約6秒に短縮され、Chromium・Firefox・WebKitの3ブラウザでの並列実行が可能になりました。Action TextやActive Storage統合など真にRailsを必要とするテストのみCapybaraシステムテストとして残す関心分離の設計が採用されています。
Lexxyエディタのプロンプト(インライン補完メニュー)について、コードブロック内での誤発火を防ぐガード処理の追加、画面右端でのクリッピング対応、`ul`セレクタの過剰適用によるマージンのずれ修正、削除ボタンの位置ずれ修正という4つの改善がまとめて行われました。
Lexxyのアップロード処理に複数の改善が加わった。アップロード完了時にノードを置換しても選択状態が維持されるようになり、画像を包んでいた不要なコンテナDIVが除去された。CSSも `display: table` から `display: block` へ移行し、DOM・スタイルの両面でシンプルな構造に整理されている。
テーブルセル内で@メンションなどのプロンプトを使用中に矢印キーがテーブルナビゲーションに奪われるバグを修正しました。プロンプトのキーハンドラー優先度を `COMMAND_PRIORITY_HIGH` から `COMMAND_PRIORITY_CRITICAL` に引き上げることで、Lexicalのテーブルプラグインより先にイベントを処理できるようになります。プロンプトが表示中のみ最高優先度を占有し、閉じると同時にハンドラーが解除されるため、通常の編集操作への影響はありません。
lexxy のファイルアップロードに `lexxy:upload-start`・`lexxy:upload-progress`・`lexxy:upload-end` の3つのカスタムイベントが追加されました。これまで開発者が `progress` 要素のDOMクエリで代替していたアップロード状態の検知が、公式イベントAPIで実現できるようになります。イベントは `figure` 要素からバブルアップする設計で、個別ファイルの追跡と一括監視の両方のユースケースに対応しています。
`lexxy_rich_textarea_tag`が`form`属性をHTMLオプションから削除してしまうバグを1行の削除で修正しました。これにより、`<input form="myform">`と同様にフォームの外部からLexxyエディタを関連付ける標準的なHTMLの使い方が可能になります。
LexxyにTrix互換のイメージギャラリー機能が実装されました。新たに追加された `ImageGalleryNode`(ElementNode継承)は `static transform()` で自己整合性を保ち、単一画像ギャラリーの自動unwrapや隣接ギャラリーの統合を実現します。`AttachmentsExtension` への責務集約と `Uploader` のファクトリパターン導入により、添付機能の有無による条件分岐がエディタのコアから分離されています。
Lexxyエディタにマークダウンをペーストした際、HTML挿入前に `lexxy:insert-markdown` カスタムイベントが発火するようになりました。`event.detail.document` に変換後のDOMが公開されており、イベントハンドラから同期的に操作することで画像の除去やブロックスペーシングの追加など、ペースト内容をアプリケーション側で自由に制御できます。設定APIへの依存を排除し、Web標準のイベントモデルに乗ったシンプルな拡張ポイントの追加です。
Lexxyエディタに、添付ファイルや水平線などのノードをマウスで削除できるコントロールが追加されました。新しいカスタム要素「lexxy-node-delete-button」が各ノードのDOM構造に組み込まれ、ノード選択時にデリートボタンが表示されます。
Lexxyのリンク生成ロジックが改善され、複数の単語にまたがる選択範囲へURLを貼り付けた際に単一のLinkNodeが生成されるようになりました。既存リンクをクリアしてから新規リンクを適用する方式に変更され、同じURLを持つ隣接リンクが複数生成される問題が解決されています。
エディタが既にフォーカスされている場合に不要なクリック操作を回避する修正。`document.activeElement`でフォーカス状態を確認し、テーブルセルなどでの選択範囲の意図しない移動を防止します。
LexxyエディタのツールバーアイコンをBasecampスタイルに統一し、関連アクションのグループ化とCSS強化により操作性と保守性を向上。アイコン定義を外部モジュール化し、将来の変更を容易に。