Tinyrack

Code Block

선택적 구문 강조와 명시적 줄바꿈을 지원하는 블록 수준 소스 표시예요.

핵심 속성

속성기본값
language설정한 하이라이터가 지원하는 모든 문법일반 텍스트
하이라이터highlighter 속성, TRCodeHighlighterProvider, 없음없음
구문 강조 테마하이라이터가 결정해요. Tinyrack 문서 하이라이터는 현재 Tinyrack 테마를 따라요github-light-high-contrast, github-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도 필요해요.

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-language, highlight-failed, no-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이면 긴 토큰도 사용 가능한 너비 안에서 줄바꿈하며 두 모드 모두 부모 경계 안에 머물러요.