CodeSnippet | CoUI

CodeSnippet

코드를 구문 강조와 함께 표시하는 코드 블록 컴포넌트

CodeSnippet#

코드를 구문 강조(syntax highlighting)와 함께 표시하는 컴포넌트입니다. 줄 번호 표시, 복사 버튼, 다양한 테마를 지원합니다.

Live Preview#

Web
void main() {
  print('Hello, CoUI!');
}
Flutter
Loading Flutter...
class CodeSnippetDefaultExample extends StatefulComponent {
  const CodeSnippetDefaultExample({super.key});

  @override
  State<CodeSnippetDefaultExample> createState() =>
      _CodeSnippetDefaultExampleState();
}

class _CodeSnippetDefaultExampleState
    extends State<CodeSnippetDefaultExample> {
  @override
  Component build(BuildContext context) {
    return CoCodeSnippet(
      code: "void main() {\n  print('Hello, CoUI!');\n}",
      mode: 'dart',
      showLineNumbers: true,
      showCopyButton: true,
    );
  }
}
class CodeSnippetDefaultExample extends StatefulWidget {
  const CodeSnippetDefaultExample({super.key});

  @override
  State<CodeSnippetDefaultExample> createState() =>
      _CodeSnippetDefaultExampleState();
}

class _CodeSnippetDefaultExampleState
    extends State<CodeSnippetDefaultExample> {
  @override
  Widget build(BuildContext context) {
    return CoCodeSnippet(
      code: "void main() {\n  print('Hello, CoUI!');\n}",
      mode: 'dart',
      showLineNumbers: true,
      showCopyButton: true,
    );
  }
}

사용 시기 (When to Use)#

이 컴포넌트를 사용하세요:

  • 문서, 튜토리얼, 도움말 페이지에서 코드 예시를 보여줄 때
  • API 응답이나 설정 파일 내용을 사용자에게 표시할 때
  • 코드 복사 기능이 필요한 개발자 도구나 대시보드를 구현할 때

대신 다른 컴포넌트를 사용하세요:

  • Kbd: 키보드 단축키나 단일 명령어를 인라인으로 표시할 때
  • Text: 단순 텍스트 정보를 표시할 때 (코드가 아닌 경우)

기본 사용법 (Basic Usage)#

// 기본 코드 블록
CoCodeSnippet(
  code: '''
void main() {
  print('Hello, CoUI!');
}''',
  mode: 'dart',
)

// 줄 번호와 복사 버튼 포함
CoCodeSnippet(
  code: '''
import 'package:flutter/material.dart';

class MyWidget extends StatelessWidget {
  const MyWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return const Text('Hello');
  }
}''',
  mode: 'dart',
  showLineNumbers: true,
  showCopyButton: true,
)
// 기본 코드 블록
CoCodeSnippet(
  code: '''
void main() {
  print('Hello, CoUI!');
}''',
  mode: 'dart',
)

// 줄 번호 표시
CoCodeSnippet(
  code: '''
import 'package:jaspr/jaspr.dart';

void main() {
  runApp(App());
}''',
  mode: 'dart',
  showLineNumbers: true,
)

Props / Parameters#

속성타입기본값설명
codeString필수표시할 코드 문자열
mode String 필수 구문 강조 언어 (dart, json, yaml, sql, js, ts)
showLineNumbers bool false 줄 번호 표시 여부
showCopyButton bool true 복사 버튼 표시 여부
actions List<Widget> / List<Component> [] 추가 액션 위젯
onCopy VoidCallback? / CoreVoidCallback? null 복사 후 추가 콜백
constraints BoxConstraints? null 최대 높이 등 크기 제약 (Flutter only)

동작 스펙 (Behavior)#

인터랙션#

  • 복사 버튼 클릭: 클립보드에 코드 복사 후 토스트 알림 표시 (Flutter) / Copy 버튼 클릭 이벤트 (Web)
  • 스크롤: 코드 영역 내에서 수직/수평 스크롤 가능
  • 호버 (복사 버튼): 버튼 강조 표시

토큰 기반 스타일링#

CoCodeSnippet은 coui_coreCoreCodeSnippetTokens를 사용하여 크로스 플랫폼 일관된 스타일링을 제공합니다.

토큰설명
CoreCodeSnippetTokens.padding CoreSpace.space16 콘텐츠 패딩
CoreCodeSnippetTokens.paddingRight CoreSpace.space48 우측 패딩 (액션 버튼 공간)
CoreCodeSnippetTokens.actionGap CoreSpace.space4 액션 버튼 간격
CoreCodeSnippetTokens.borderWidth CoreBorderWidth.thin 보더 두께
CoreCodeSnippetTokens.borderRadius CoreRadius.box 모서리 반경

사용 가이드라인 (Usage Guidelines)#

Do#

언어 명시로 구문 강조 최적화

CoCodeSnippet(
  code: 'SELECT * FROM users WHERE active = true;',
  mode: 'sql',
  showCopyButton: true,
)

언어를 명시하면 코드를 더 쉽게 읽을 수 있고, 사용자가 코드의 종류를 즉시 파악할 수 있습니다.


Don't#

지나치게 긴 코드를 제한 없이 표시 금지

// Flutter에서는 constraints로 제한
CoCodeSnippet(
  code: entireFileContent,
  mode: 'dart',
  constraints: BoxConstraints(maxHeight: 300),
)

긴 코드는 높이를 제한하여 스크롤 가능하게 해야 페이지 레이아웃이 유지됩니다.

접근성 (Accessibility)#

키보드 인터랙션#

동작
Tab복사 버튼으로 포커스 이동
Enter / Space복사 버튼 활성화

스크린 리더#

  • Flutter: Semantics(value: code) 적용
  • Web: <code> 태그 사용, 복사 버튼에 aria-label="Copy code" 적용

크로스 플랫폼 차이점 (Platform Differences)#

항목FlutterWeb
API CoCodeSnippet(code:, mode:) CoCodeSnippet(code:, mode:)
구문 강조 엔진 syntax_highlight 패키지 없음 (<pre><code> 렌더링)
클립보드 복사Clipboard.setData + 토스트onCopy 콜백
수평 스크롤SingleChildScrollViewCSS overflow-x: auto
크기 제약constraints 파라미터CSS 기반
  • Kbd: 인라인 키보드 단축키 표시에 사용
  • Text: 코드가 아닌 일반 텍스트 표시에 사용