@celesta/code
テーマと行の強調を備えた構文色付きコード。
@celesta/code はコンポジション内に構文色付きのソースコードを描きます。twinkleplop でトークン化し、各行を色の区間を持つ Celesta の Text 1 つで、行の強調を Rect で描くので、ほかのレイヤーと同じく拡縮・フェード・ぼかし・書き出しができます。任意のパッケージで、@celesta/react は依存しません。
最初のコードブロック
import { Assets, Composition, Font, Rect } from '@celesta/react';
import { Code, codeThemes } from '@celesta/code';
const source = `const message: string = 'Hello, Celesta.';
console.log(message);`;
const style = { fontFamily: 'IBM Plex Mono', fontSize: 40, lineHeight: 60 };
export default function Root() {
return (
<Composition width={1280} height={480} fps={30} durationInFrames={90}>
<Assets>
<Font src="./fonts/IBMPlexMono-Regular.ttf" />
</Assets>
<Rect width={1280} height={480} fill="#161418" />
<Code x={64} y={64} language="ts" style={style} theme={codeThemes.dark}>
{source}
</Code>
</Composition>
);
}
Code は唯一の子としてソースの文字列を取ります。インデントと末尾の改行も描画の一部なので、文字列内に残してください。
フォント
等幅フォントを使います。Code の既定は JetBrains Mono、24 px、行高は文字サイズの 1.5 倍です。上のように <Font src="…" /> で読み込むか、描画するマシンにインストールします。不足時はほかのテキストと同様にフォールバックします。
props
Code の props
| API | 用途 |
|---|---|
children |
ソースの文字列。 |
language |
tsx、ts、json、bash、または text(既定、色なし)。 |
style |
Celesta の TextStyle。fontFamily、fontSize、lineHeight などを指定します。左揃えで折り返さず、色はテーマが設定します。ほかの align はエラーです。 |
theme |
トークンの色、既定の文字色、行の強調色。既定は codeThemes.dark。 |
tabSize |
タブ幅を文字数で指定します。既定は 2。 |
highlightLines |
帯で強調する行番号。1 始まりです。 |
highlightWidth |
帯の幅をピクセルで指定します。既定はソースの幅。周囲のパネルの端まで伸ばせます。 |
visibleCharacters |
入力効果で表示するソース量。code:入力・カーソル・トークンを参照。 |
x, y, scale, rotation, anchorX/anchorY, opacity, blendMode, blur, shadow, glow |
通常のレイヤーの props はブロック全体に適用されます。 |
行の強調
highlightLines は指定した行の背後に、幅と行高いっぱいの帯を描きます。コードを入力中でも表示されます。
<Code x={64} y={64} language="ts" style={style} highlightLines={[2]} highlightWidth={1152}>
{source}
</Code>
フレームに応じてリストを変えると強調も動きます。各帯は軽量なので、拍やキューごとに行を変えられます。
テーマ
codeThemes.dark と codeThemes.light をそのまま使えます。テーマは背景を描かないので、デザインに合う Rect を背後に置きます。組み込みテーマを展開し、必要な値を上書きするとカスタマイズできます。
const theme = {
...codeThemes.dark,
highlightLine: '#a68bbf30',
tokens: { ...codeThemes.dark.tokens, keyword: '#e0b7ff' },
};
トークン名は twinkleplop の keyword、string、comment、number、function、type、tag_name、attr_name、punctuation、operator などです。JSON のキーは property、文字列値は string と string_escape です。テーマにない名前は foreground を使います。
入力効果・カーソル・トークンへ進みましょう。