ハイライトドロップダウンの構造改善とTailwind CSS互換性の向上
LexxyのツールバーとドロップダウンUIがTailwind CSSとの互換性を高め、より柔軟なスタイリングを可能にしました。
背景
Lexxyエディタには、テキストの色と背景色を変更するハイライト機能がありますが、従来の実装ではボタングループごとに個別の<div>要素を配置し、data-button-group属性で管理していました。この設計は、Tailwind CSSのようなユーティリティファーストのCSSフレームワークとの統合時に問題を引き起こしていました(#600、#485)。
#669では、ハイライトドロップダウンの構造を簡素化し、Tailwind CSSとの互換性を向上させる一連の変更が実装されました。
技術的な変更
ハイライトドロップダウンの構造変更
変更前:
<lexxy-highlight-dropdown class="lexxy-editor__toolbar-dropdown-content">
<div data-button-group="color"></div>
<div data-button-group="background-color"></div>
<button data-command="removeHighlight" class="lexxy-editor__toolbar-dropdown-reset">Remove all coloring</button>
</lexxy-highlight-dropdown>
変更後:
<lexxy-highlight-dropdown class="lexxy-editor__toolbar-dropdown-content">
<div class="lexxy-highlight-colors"></div>
<button data-command="removeHighlight" class="lexxy-editor__toolbar-button lexxy-editor__toolbar-dropdown-reset">Remove all coloring</button>
</lexxy-highlight-dropdown>
従来はcolorとbackground-colorごとに別々の<div>を用意していましたが、単一の.lexxy-highlight-colorsコンテナに統合されました。これにより、HTML構造が簡素化され、スタイリングの柔軟性が向上しています。
JavaScript側の実装変更
#setUpButtons() {
const colorGroups = this.editorElement.config.get("highlight.buttons")
this.#populateButtonGroup("color", colorGroups.color)
this.#populateButtonGroup("background-color", colorGroups["background-color"])
const maxNumberOfColors = Math.max(colorGroups.color.length, colorGroups["background-color"].length)
this.style.setProperty("--max-colors", maxNumberOfColors)
}
#populateButtonGroup(attribute, values) {
values.forEach((value, index) => {
this.#buttonContainer.appendChild(this.#createButton(attribute, value, index))
})
}
ボタングループをDOM要素から取得する代わりに、設定から直接カラー情報を取得するようになりました。また、--max-colors CSS変数を動的に設定することで、レスポンシブなレイアウト調整が可能になっています。
CSS統一化とTailwind互換性
リンクとリストのスタイリングが改善され、Tailwind CSSのリセットと競合しないよう調整されました。
a {
color: var(--lexxy-color-link);
text-decoration: underline;
}
ol, ul {
margin-inline-start: calc(var(--lexxy-content-margin) * 1.5);
padding: 0;
}
ul {
list-style-type: disc;
}
ol {
list-style-type: decimal;
}
リンクにtext-decoration: underlineを明示的に追加し、リストには適切なlist-style-typeとマージンを設定することで、Tailwind CSSがこれらのスタイルをリセットしても正しく表示されるようになりました。
ツールバーボタンのスタイル統一
ドロップダウン内のボタンに.lexxy-editor__toolbar-buttonクラスが追加され、ツールバー全体で一貫したスタイリングが適用されるようになりました。
#createButton(attribute, value, index) {
const button = document.createElement("button")
button.dataset.style = attribute
button.style.setProperty(attribute, value)
button.dataset.value = value
button.classList.add("lexxy-editor__toolbar-button", "lexxy-highlight-button")
button.name = attribute + "-" + index
return button
}
CSS変数の追加
ツールバーボタンのサイズとスペーシングを制御する新しいCSS変数が追加されました。
--lexxy-toolbar-button-size: 2lh;
--lexxy-toolbar-spacing: 0.5ch;
これにより、プロジェクト全体でツールバーの外観を一元管理できるようになりました。
設計判断
単一コンテナへの統合
PRでは、複数のdata-button-group要素を単一の.lexxy-highlight-colorsコンテナに統合する設計が採用されました。これにより、以下の利点が得られます:
-
DOM構造の簡素化: 不要な
<div>要素を削減し、HTML構造を平坦化 - CSS Grid/Flexboxとの相性向上: 単一コンテナ内でのレイアウト制御が容易に
-
動的レイアウト調整:
--max-colors変数により、色数に応じたレスポンシブ対応が可能
Tailwind互換性の優先
リストやリンクのスタイルを明示的に指定することで、Tailwind CSSのリセットの影響を受けないよう設計されています。これは「フレームワークに依存しないコンポーネント設計」の好例と言えます。Lexxy自体はフレームワーク非依存ですが、主要なCSSフレームワークとの共存を考慮した実装になっています。