Tinyrack

Code Block

任意のシンタックスハイライトと明示的な折り返しに対応するブロックレベルのソース表示です。

主なプロパティ

プロパティ既定値
language設定したハイライターが対応するすべての文法プレーンテキスト
ハイライターhighlighter プロパティ、TRCodeHighlighterProvider、なしなし
シンタックステーマハイライターが決定します。Tinyrack のドキュメント用ハイライターは現在の Tinyrack テーマに従いますgithub-light-high-contrastgithub-dark-high-contrast
wraptrue, falsefalse

インストール

pnpm add @tinyrack/ui

長い行はコード領域を横にスクロールして確認できます。

スタイル

@import '@tinyrack/ui/components/code-block.css';

長い行はコード領域を横にスクロールして確認できます。

インポート

import { TRCodeBlock } from '@tinyrack/ui/components/code-block';

長い行はコード領域を横にスクロールして確認できます。

プレイグラウンド

使用方法

ハイライト付きの例では trShikiWebHighlighter を使います。コピーする前に Shiki を追加してください。

pnpm add shiki

その他の言語 パーマリンク

ソースに合う言語識別子を指定してください。ハイライターが対応していない識別子は、失敗せずプレーンテキストとして表示されます。

結果が見えるコピーアクション パーマリンク

コピーはアプリケーション側の操作なので、クリップボードの状態を TRCodeBlock 内に隠さず、TRButton とライブ結果を組み合わせて実装します。

コピー操作を組み合わせる例では、次のアプリケーション側のインポートも必要です。

import { useState } from 'react';
import { TRButton } from '@tinyrack/ui/components/button';
import '@tinyrack/ui/components/button.css';

API

TRCodeBlock は文法を一切同梱しません。highlighter プロパティか TRCodeHighlighterProvider でハイライターを注入すると、指定できる language の値もその選択に従います。設定方法は シンタックスハイライト を参照してください。

ハイライトはハイドレーション後に実行されます。元のソースは SSR でも安全で、ハイライターが応答する前にも表示されます。codelanguage を変更すると古い処理をキャンセルし、以前の非同期結果が現在のソースを置き換えないようにします。

プロパティ既定値説明
codestring必須意味のある <pre><code> 内に表示するソースです。
languagestringundefinedハイライターに渡す文法識別子です。省略時はプレーンテキストです。
highlighterTRCodeHighlighterプロバイダーの値このブロックに限りコンテキストのハイライターを上書きします。
onHighlightFailure(failure: TRCodeHighlightFailure) => voidプロバイダーの値unsupported-languagehighlight-failedno-highlighter の結果を受け取ります。
wrapbooleanfalse水平スクロールの代わりに長い行を折り返します。
refRef<HTMLPreElement>ネイティブの pre 要素を参照します。
className, styleネイティブの pre プロパティ利用側のクラス、インラインスタイル、コンポーネントトークンの上書きを適用します。

ブロックは状態を data-highlight で示します。language がなければ plain、ハイライターの実行中は pending、成功時は highlighted、ハイライターに該当する文法がなければ unsupported、ハイライターを設定していなければ no-highlighter、ハイライターが例外を投げた場合は error です。成功以外のすべての結果で SSR のフォールバックが維持されるため、空のブロックではなく読める形のプレーンテキストが残ります。onHighlightFailure を渡さない場合、コンソールに届くのは error のみで、言語ごとに一度だけです。ハイライター未設定と未対応の言語は、プレーンテキストが正しい表示となる設定上の状態なので通知せず、data-highlight だけで示します。

その他のネイティブ pre 属性とイベントも渡されます。周囲の文脈でソースを識別できない場合は aria-label を追加してください。ハイライトはアクセシブルな原文を変えません。

スタイル

トークン用途
--tr-code-block-backgroundハイライトされたブロックを含むサーフェス
--tr-code-block-border境界線の色
--tr-code-block-border-width境界線の太さ
--tr-code-block-colorフォールバック時のソース色
--tr-code-block-font-family等幅フォント
--tr-code-block-font-sizeソースの文字サイズ
--tr-code-block-line-heightソースの行の高さ
--tr-code-block-padding-xインライン方向の余白
--tr-code-block-padding-yブロック方向の余白
--tr-code-block-radius角丸

wrap={false} では長い行を横方向にスクロールして表示します。wrap では長いトークンも利用可能な幅で折り返し、どちらのモードも親要素の境界内に収まります。