このページの内容
Lit コンポーネントは通常、シャドウルート内にレンダリングします。ドキュメントのスタイルはその中の要素に届かないため、生成した CSS を各コンポーネントのシャドウツリー内へ配信します。
#インストール
#Master CSS を追加する
Vite でビルドする既存の Lit プロジェクトのルートでインストーラーを実行します。Lit の既定は Vite の静的モードです。ソースに完全なクラス名を記述してください。ブラウザーで初めて現れる名前からクラスを生成する必要がある場合は、ランタイムモードを明示的に指定します。
npm create @master/css@2.0.0 -- --framework lit --yes#CSS のソースエントリーを保持する
インストーラーは
src/index.cssを作成し、Vite インテグレーションを登録します。定義はこのソースファイルに置いてください:@import '@master/css';以下のコンポーネントは、Vite の
?inlineインポートで処理済み CSS をテキストとして取得します。通常のドキュメントレベルのスタイルシートインポートでは、シャドウルートの内部にスタイルを付けられません。現在のインライン CSS 配信では、Vite の
baseを相対パスにしてください。ルート相対のアセット URL は、本番のコンポーネント読み込み時にInvalid base URLを起こす場合があります。以下を既存の Vite 設定に統合し、ほかのプラグインを保持して、Master CSS を一度だけ登録します:import { defineConfig } from 'vite'import masterCSS from '@master/css-vite'export default defineConfig({ base: './', plugins: [masterCSS()]})#シャドウルートにスタイルを含める
生成したスタイルシートをテキストとしてインポートし、Lit の
unsafeCSSで取り込みます。CSS は自分のビルド入力から取得し、信頼できないユーザーのテキストをunsafeCSSに渡さないでください。インストーラーはこのスタイルシートの追加時に、標準コンポーネントの既存のスタイルを保持します。import { LitElement, html, unsafeCSS } from 'lit'import { customElement } from 'lit/decorators.js'import masterCSSStyles from './index.css?inline'@customElement('my-element')export class MyElement extends LitElement { static styles = [unsafeCSS(masterCSSStyles)] render() { return html`<p id="master-check" class="w-fit m(0) p-md b-solid b(1) b-line-divider r-md text-sm font-regular bg-surface-raised fg-text-strong">Hello Lit</p>` }}#Master CSS を使い始める
アプリのエントリーからコンポーネントモジュールをインポートしたままにし、登録済みの要素をページに置きます:
import './my-element'<my-element></my-element>既存の
index.htmlはsrc/main.tsをモジュールとして読み込む必要があります。npm run devを実行すると、Lit が要素のシャドウルート内に段落を作成します。
シャドウルート内のスタイルを確認する
#シャドウツリーのスタイルシートを確認する
Lit テンプレートの p-md を p-lg に変えます。パディングが 1rem から 1.5rem に増えるはずです。元に戻してから、本番ビルドを確認します:
npm run buildnpm run previewブラウザーの開発者ツールで <my-element> 内の段落を調べます。1rem のパディング、浮き上がった面、角丸が適用されているはずです。ドキュメントレベルの要素だけにスタイルが付く場合は、コンポーネントの ?inline インポートと static styles を確認してください。
静的モードに Master CSS のブラウザーランタイムは不要です。ただし、このクライアントレンダリングのコンポーネントを作成するために、Lit には引き続き JavaScript が必要です。
シャドウルート内で新しいクラスを生成する
ブラウザーで初めて現れるクラス名には、ランタイムモードでインストーラーを実行します:
npm create @master/css@2.0.0 -- --framework lit --mode runtime --yesインストーラーは標準の src/my-element.ts コンポーネントにランタイムデコレーターを追加し、Vite に masterCSS({ mode: 'runtime' }) を設定します。上記の相対 base を保持してください。ほかのコンポーネントにも同じ設定が必要です。ルールの生成前にレイヤー順序を確立するため、CSS テキストをランタイムのスタイルシートより先に読み込みます:
/// <reference types="@master/css/client" />import { LitElement, html } from 'lit'import { customElement } from 'lit/decorators.js'import { withMasterCSSRuntime } from '@master/css-runtime'import program from 'virtual:master-css-program'import emittedGlobals from 'virtual:master-css-emitted-globals'import masterCSSStyles from './index.css?inline'@customElement('my-element')@withMasterCSSRuntime({ program, emittedGlobals })export class MyElement extends LitElement { protected createRenderRoot() { const root = super.createRenderRoot() const styles = document.createElement('style') styles.textContent = masterCSSStyles root.append(styles) return root } render() { return html`<p id="master-check" class="w-fit m(0) p-md b-solid b(1) b-line-divider r-md text-sm font-regular bg-surface-raised fg-text-strong">Hello Lit</p>` }}この例はランタイムの起動前に、ベーススタイルシートを <style> 要素として挿入します。Lit の static styles は adopted stylesheets を使います。CSSOM のスタイルシート順序では通常の <style> 要素より後に置かれるため、そこにレイヤー順序の宣言を書くと、ベースレイヤーがランタイムのユーティリティより後になる場合があります。
デコレーターを付けた各コンポーネントは、自身のシャドウルート用にランタイムを起動し、ドキュメントから切り離されると破棄します。ドキュメントレベルのランタイムでは、そのルート内のクラスを監視できません。
コンポーネントの表示後、ブラウザーのコンソールで次を実行します。再ビルドせずに段落に下線が付くはずです:
document.querySelector('my-element').shadowRoot .querySelector('#master-check').classList.add('underline')
