Shadow DOM
独自の Web コンポーネントやマイクロフロントエンドなどの shadow root 内で、エディターを動かせます。ページのスタイルシートは shadow root に届かないため、そのままではスタイルが付きません。このプラグインは、エディターを含む shadow root にエディター自身のスタイルシートをコピーし、後からプラグインが追加するものも継続してコピーします。

有効にする
この機能は shadowdom.js プラグインで提供されます(plugins/all_plugins.js にも含まれます)。通常どおりページにエディターのスタイルシートを読み込み、shadow root 内の要素にエディターを作成すれば、残りはプラグインが処理します。ボタンはありません。
<link rel="stylesheet" href="/richtexteditor/rte_theme_default.css">
<script src="/richtexteditor/rte.js"></script>
<script src="/richtexteditor/plugins/all_plugins.js"></script>
<note-editor id="host"></note-editor>
<script>
class NoteEditor extends HTMLElement {
connectedCallback() {
const root = this.attachShadow({ mode: "open" });
root.innerHTML = '<div class="box"><p>Text inside a <b>shadow root</b>.</p></div>';
this.editor = new RichTextEditor(root.querySelector(".box"), { toolbar: "basic", height: "220px" });
}
}
customElements.define("note-editor", NoteEditor);
</script>
rte-webcomponent.js の既成の <rich-text-editor> 要素も、同じプラグインを使います。shadow 属性を付けると、専用の shadow root 内にエディターをマウントします。
<script src="/richtexteditor/rte-webcomponent.js"></script>
<rich-text-editor shadow toolbar="basic" height="220px"><p>Hello</p></rich-text-editor>
shadowdom.js が読み込まれていない場合、この要素はコンソールに警告を出し、スタイルなしで描画する代わりに light DOM にとどまります。
オプション
| オプション | 既定値 | 動作 |
|---|---|---|
shadowStyleAdoption | true | エディターのスタイルシートを shadow root にコピーします。false でコピーを無効にします。 |
shadowStyleSources | null | 独自のスキン上書き用に shadow root に追加するスタイルシート URL です。文字列または配列で指定します。 |
コピーするもの
rte.jsの読み込み元フォルダーから配信する<link rel="stylesheet">要素、またはエディターのファイル名(rte_theme、rte_mobile、richtexteditor_content、richtexteditor_preview、aitoolkit)を持つものです。同じ URL の新しい<link>要素として作成するため、ブラウザーのキャッシュから取得できます。- id が
rte-または__rteで始まる<style>要素(プラグインのスタイル)と、id がなく CSS にエディターのセレクターを含む<style>要素です。後者は、Vite などのバンドラーがインポートしたテーマを挿入する方法です。 - ページが
document.adoptedStyleSheetsで採用したスタイルシートです。
それ以外のページのスタイルはコピーせず、コンポーネントのカプセル化を保ちます。各コピーには data-rte-adopted="1" が付きます。上記のテストでは、テーマ、AI Toolkit のスタイルシート、プラグインの <style> 要素の合計 9 個がコピーされ、ツールバーの高さは 41 ピクセルでした。shadowStyleAdoption: false では、スタイルのないボタンが縦に並び、高さは 7,561 ピクセルになりました。
ページの <head> を監視するため、起動後にプラグインのパネルを初めて開いたときに追加されるスタイルもコピーします。ダイアログとメニューはエディターの要素内に作成するため、shadow root 内でコピーしたスタイルを使用します。
API
editor.isInShadowDom()— shadow root 内にある場合はtrueを返します。editor.getShadowRoot()— その shadow root、またはnullを返します。editor.getAdoptedStyleCount()— コピーしたスタイルシート数を返します(上記では 9)。editor.adoptEditorStyles(target)— エディターのスタイルシートを別のルートにコピーします。プレビューを表示する別の shadow root などに使えます。引数なしではエディター自身の shadow root を使います。
注意点
- 編集領域は iframe なので、文書自体の CSS は通常どおりそこに読み込みます(
contentCssUrl)。このプラグインの対象はツールバー、メニュー、ダイアログだけです。 - shadow root の外では何もせず、監視も作成しません。
- ページのスタイルシート内にある独自の外観の上書きは shadow root に届きません。
shadowStyleSourcesに列挙するか、自分で shadow root 内に配置してください。 - 保存する HTML には影響しません。
getHTMLCode()は<p>Text inside a <b>shadow root</b>.</p>を返しました。