4P by GN⁺ | ★ favorite | 댓글 1개
  • matcha.css는 HTML 요소를 기본 브라우저 스타일시트처럼 바로 꾸며, 빠른 프로토타이핑·정적 HTML·Markdown 생성 문서에서 수동 CSS 작업을 줄여줌
  • 빌드 단계, 의존성, JavaScript, 설정 없이 <link rel="stylesheet"> 한 줄로 적용하며, 기본 gzip 크기는 약 8.81kB
  • 문서 구조와 시맨틱 요소를 활용해 <menu> 서브메뉴, 필수 입력 * 표시, 입력 검증 상태별 테두리 색상 같은 동작을 CSS만으로 처리함
  • Default, Lite, Utility classes, Istanbul coverage 프리셋과 custom builder를 제공하며, 세부 스타일 디렉터리도 직접 불러올 수 있음
  • MIT 라이선스 오픈소스이며, 유틸리티 클래스와 레이아웃 기능은 편리하지만 문서에 클래스를 추가하므로 시맨틱 기반 사용과는 거리가 생길 수 있음

HTML 문서를 바로 꾸미는 드롭인 CSS

  • matcha.css는 순수 CSS로 HTML 요소를 스타일링하는 드롭인 라이브러리임
  • 사용자가 문서를 직접 패치하지 않아도 기본 브라우저 스타일시트와 비슷하게 HTML 요소를 보기 좋게 만드는 데 초점을 둠
  • 빠른 프로토타이핑, 정적 HTML 페이지, Markdown에서 생성된 문서, CSS 세부사항을 깊게 다루지 않고 HTML 요소 전체 범위를 활용하려는 개발자에게 적합함
  • 이 페이지 자체도 matcha.css로 스타일링됨

한 줄로 도입하고 쉽게 되돌릴 수 있음

  • 빌드 단계, 의존성, JavaScript, 설정, 문서 리팩터링 없이 사용할 수 있음
  • gzip 기준 기본 빌드 크기는 ~8.81kB
  • 문서의 <head>에 다음 한 줄을 추가하면 적용됨
<link rel="stylesheet" href="https://matcha.mizu.sh/matcha.css">;
  • 제거할 때도 해당 <link rel="stylesheet">를 빼면 되며, 문서 리팩터링이나 정리가 필요 없도록 설계됨
  • 에셋은 Vercel에서 호스팅되며, npm 패키지를 배포하는 CDN 서비스인 JSdelivr에서도 사용할 수 있음
  • 모든 공개 버전은 /v/ 디렉터리에서 제공되며, 기본적으로 main 브랜치가 서빙됨

시맨틱 구조를 활용한 스타일링

  • matcha.css는 문서 구조와 요소 계층을 기준으로 스타일을 조정함
  • 자동 동작 예시

    • <menu> 요소를 중첩하면 암시적 서브메뉴를 만듦
    • <label><input required>와 함께 쓰이면 필수 필드 표시 *를 자동으로 붙임
    • [data-color-scheme="light"]는 라이트 모드를 강제하고, [data-color-scheme="dark"]는 다크 모드를 강제함
    • [data-color-scheme]은 특정 요소에 적용해 선택적으로 색상 스킴을 강제할 수 있음
    • :root는 CSS 변수를 설정하고, @media (prefers-color-scheme)는 사용자 환경설정에 따라 모드를 설정함
    • !important 규칙을 쓰지 않아 필요한 경우 스타일을 덮어쓰기 쉬움

빌드와 배포 선택지

  • 기본 빌드 외에 목적별 프리셋 빌드를 제공함
    • Default ~8.81kB: @istanbul-coverage를 제외한 모든 시맨틱 스타일링과 추가 기능
    • Lite ~5.59kB: 모든 시맨틱 스타일링, @break-words, @discrete-scrollbars
    • Utility classes ~3.43kB: @root, @utilities
    • Istanbul coverage ~1.94kB: @root, @syntax-highlighting, @istanbul-coverage
  • 필요한 기능만 선택하려면 custom builder를 사용할 수 있음
  • 더 복잡한 커스터마이징은 fork 후 직접 패치하는 방식도 가능함
  • github.com/lowlighter/matcha/styles의 각 하위 디렉터리는 웹사이트에서 직접 서빙됨
    • 예를 들어 @syntax-highlighting만 쓰려면 해당 mod.css를 직접 포함할 수 있음
    • 자체 CSS 변수를 제공하지 않는다면 @root 패키지가 필요할 가능성이 큼
    • 모든 mod.css 파일은 편의를 위해 부모 디렉터리 별칭으로도 제공됨

스타일링되는 HTML 요소 범위

  • 문서 구조

    • section, article, header, footer, aside, nav, menu, hgroup, 제목 요소 등을 스타일링함
    • <article>은 부모 컨테이너가 display: flex인 경우와 자연스럽게 통합되도록 설계됨
    • <nav> 안의 <ol>은 breadcrumb처럼 표시되고, <ul>은 내비게이션 목록처럼 표시됨
  • 텍스트와 인라인 요소

    • <blockquote>, <pre>, <code>, <abbr>, <q>, <cite>, <dfn>, <em>, <strong>, <small>, <ruby>, <sup>, <sub>, <mark>, <ins>, <del>, <kbd>, <samp>, <output> 등에 스타일을 제공함
    • 브라우저 기본 툴팁은 스타일링할 수 없으므로, CSS 툴팁에는 [title] 대신 [data-title] 속성을 쓰도록 함
  • 폼 요소

    • <form>, <button>, <label>, <fieldset>, <input>, <select>, <textarea>, <progress>, <meter>를 스타일링함
    • 입력 요소는 브라우저가 수행하는 검증 외의 별도 검증을 하지 않음
    • :user-valid--success 테두리, :user-invalid--danger 테두리를 적용함
    • <label><input></label> 패턴을 쓰면 required 여부를 자동 감지할 수 있지만, <label for><input> 패턴에서는 불가능함
  • 표와 미디어

    • <table>은 border collapse를 적용하며, 부모에 폭이 있으면 자동 overflow를 사용함
    • .table-responsive 컨테이너로 감쌀 수 있음
    • <img>, <video>, <iframe>에는 둥근 모서리 스타일을 적용함
  • <details><dialog>

    • <details><dialog>도 기본 스타일링 대상임
    • <dialog>::backdropdialog.showModal() 사용 시 표시됨
    • 제출 시 브라우저가 JavaScript 없이 dialog를 닫도록 <form method="dialog"> 사용을 권장함

레이아웃 기능의 편의성과 비용

  • matcha.css는 문서 레이아웃 옵션도 제공함
  • .layout-simple 클래스를 요소에 추가하면 단순 레이아웃을 활성화함
  • 요구 구조에는 .layout-simple, header:first-of-type, main:only-of-type, aside, nav, footer:last-of-type 등이 포함됨
  • 미디어 조건에 따라 구조가 달라짐
    • 기본 화면에서는 headermain 중심으로 구성됨
    • min-width: 960px에서는 asidemain 구성이 됨
    • min-width: 1280px에서는 두 개의 asidemain 구성을 사용함
  • 작은 화면에서 aside:nth-of-type(1)은 숨겨지며, data-expand로 다시 보이게 하거나 data-expandable로 접을 수 있게 만들 수 있음
  • 레이아웃 사용은 문서 리팩터링이 필요할 수 있으며, 나중에 matcha.css 사용을 중단할 때 다시 리팩터링이 필요할 수 있음

유틸리티 클래스는 보조 기능에 가까움

  • matcha.css는 편의를 위해 일부 유틸리티 클래스도 제공함
  • 색상 관련 클래스는 다음과 같음
    • .default, .muted, .accent, .active, .variant, .success, .attention, .severe, .danger
    • bd-*는 테두리 색상, bg-*는 배경색, fg-*는 전경 스타일을 바꿈
  • .flash는 주의를 끄는 블록을 만들며, 색상 클래스와 조합할 수 있음
  • 텍스트, 크기, 위치, display, flex, overflow, cursor, selection, pointer-events, sizing, resize, shadow, SVG fill/stroke 관련 유틸리티를 제공함
  • 여백과 패딩은 0, .125, .25, .5, .75, 1, 1.25, 1.5, 1.75, 2, 3, 4 값을 기반으로 하는 번호형 클래스를 사용함
  • 유틸리티 클래스는 문서에 클래스를 추가해야 하므로 나중에 matcha.css에서 빠져나오기 어렵게 만들 수 있음
  • 제공 유틸리티가 부족하거나 제한적이라면 유틸리티 우선 CSS 프레임워크 사용 또는 전환을 고려해야 함
  • matcha.css는 완전한 CSS 프레임워크가 되는 것을 목표로 하지 않음

코드 표시, 편집기 모양, Shadow DOM

  • matcha.css는 @media (prefers-color-scheme)를 따르는 문법 강조 클래스를 제공함
  • 코드 편집기 형태를 만들기 위한 클래스도 포함함
    • 요구 구조는 .editor, > textarea, > div.highlight
    • 이 추가 스타일은 실제 문법 강조를 수행하지 않고, 코드 편집기 모양만 스타일링함
    • 실제 강조에는 highlight.js 같은 문법 강조 라이브러리가 필요함
  • matcha.css는 :host 의사 클래스를 사용해 CSS 변수도 정의하므로 Shadow DOM과 호환됨
  • Shadow DOM 안에서는 matcha.css를 다시 import하고 별도 custom styles를 적용해도 문서 나머지와 충돌하지 않도록 격리할 수 있음

브라우저 지원과 라이선스

  • matcha.css는 모든 현대 브라우저와 호환되도록 만들어졌다고 밝힘
  • 지원 표에는 Chrome 92%, Edge 96%, Safari 94%, Firefox 95%, Opera 95%, Android Chrome 96%, iOS Safari 93%, Samsung Internet 96% 등이 포함됨
  • 오픈소스로 공개되어 있으며 MIT License를 사용함
  • 저장소는 github.com/lowlighter/matcha에 있음

댓글과 토론

Hacker News 의견들
  • 문서 레이아웃의 단일 진실 공급원을 HTML로 되살린다는 개념이 좋고, 복잡한 디자인이 필요 없는 문서에는 생산적일 수 있어 보임
    다만 기본 디자인 선택, 특히 색상과 마감은 아쉽다. 전문 디자이너는 아니지만 직접 만든 소프트웨어에 사용자가 불만을 제기한 경험이 충분히 있어서, 색채 이론·정보 밀도·그라데이션 같은 배경을 가진 좋은 디자이너가 만든 것과 비교해 뭔가 어색한 느낌은 감지할 수 있음
    작성자가 보고 있다면 BulmaTailwind 같은 다른 FOSS 프로젝트의 미감을 활용하거나 전문 디자이너와 협업하는 것도 고려해봤는지 궁금함. jgthms도 가끔 이 사이트에 있는 걸로 알고 있음

    • 건설적인 피드백은 고맙고, 사실 직접 Show HN을 올리기 전에 HN에 올라와서 좀 당황했음
      프론트엔드 개발자도 디자이너도 아니라서 색채 이론, 접근성, 다른 사람에게는 당연해 보일 수 있는 요소에 대한 지식 부족이 드러날 수 있음. 그래서 수공예적인 느낌도 나는 것 같음
      언급한 부분은 앞으로 더 찾아볼 예정임. 전문 디자이너와의 협업은 조언을 받는 데는 열려 있지만, 사이드 프로젝트라 따로 고용할 계획은 없음. 현재로서는 전문가가 주요 대상은 아니고, 취미 사용자에게 더 끌릴 것 같다고 봄
    • 나도 뭔가 어색하다는 느낌은 받지만, 디자이너가 만든 것에서도 그런 적이 있었음. 그래도 꽤 괜찮아 보여서 어느 정도 디자인 감각이 있는 사람이나 신입 디자이너가 만든 것처럼 느껴짐
      오래 볼수록 전체적으로는 더 좋아 보이는데, 동시에 살짝 어색한 느낌도 강해지는 게 꽤 신기함
      수정: 아마 찻잔 색이 조금 어색하게 느껴지는 것 같음. 로고 전체는 마음에 들지만, 찻잔 색을 위쪽 배경색에 더 가깝게 바꾸면 어떨까 싶음
    • 동의함. 어색하게 느껴지는 예로는 버튼의 호버 스타일이 있음
      어두운 배경에 검은 글자는 미적으로도, 접근성 측면에서도 잘 맞지 않음. 기본 설정이 더 다듬어지면 금상첨화일 것임
    • 사이트에 직접 커스텀 빌드를 만들 수 있는 섹션이 있어서 기본 스타일 선택을 어느 정도 제어할 수 있음
      다만 기업의 디자인 룩에 맞추려는 디자이너라면 여백 같은 부분에 몇 시간씩 쓸 수 있고, 이 도구는 그런 사람들을 위한 건 아닌 듯함
  • 이런 작은 라이브러리가 좋음. 지금은 pico.css를 쓰고 있는데 이것도 확인해볼 예정임. 브라우저의 표준 DOM 요소가 원래 이렇게 보여야 한다고 생각함
    하지만 실제로는 그렇지 않으니 이런 라이브러리가 존재함. 다른 사용자의 댓글을 보고 이 라이브러리에서 “classless”가 무슨 뜻인지 찾아보다가 비슷한 라이브러리 목록을 찾았음
    https://github.com/dbohdan/classless-css

    • “브라우저의 표준 DOM 요소가 원래 이렇게 보여야 한다”는 데 동의하지만, 직접 스타일을 만들려는 사람들에게는 악몽이 될 수도 있음. 지금의 기본 스타일도 이런 면에서 이미 조금 성가심
      오래전부터 크롬 스타일콘텐츠 스타일을 전환하는 방식이 있으면 좋겠다고 생각했음. 내비게이션 바나 임베드된 시각화·상호작용 요소는 최소 기본 스타일만 받는 크롬 모드로 두고, 글 본문은 사용자가 선호하는 스타일을 적용받는 식이면 좋겠음
    • 이런 것들을 바로 테스트해볼 수 있는 사이트도 있음. 내가 아는 곳은 https://www.cssbed.com/
    • pico.css를 정말 좋아함. 빠르고 쉽게 배울 수 있으면서도 꽤 기능이 충분한 절충점
      Flask + HTMX + AlpineJS + PicoCSS 조합이 현재 내 “All Python and HTML SPA”임
  • 흥미로워 보이지만, 링크 밑줄을 없애고 호버 전에는 색상에만 의존하는 건 접근성 측면에서 크게 안 좋음

    • 색각 이상이 있는 사람은 링크에 밑줄을 긋거나 강조하는 CSS 확장을 추가할 수 있음
      시각장애인은 화면 읽기 프로그램이나 점자 디스플레이를 쓰므로 밑줄이 필요하지 않음. 그럼 또 누가 밑줄이 필요한가?
  • 유망해 보임. 나는 Simple.css를 써왔음: https://simplecss.org/
    대충 보니 matcha.css가 조금 더 발전된 듯해서 한번 써볼 생각임

  • 이런 클래스 없는 CSS 프레임워크를 생성하는 도구가 필요할지도 모르겠음. 그러면 각자 색상 팔레트, 패딩, 글꼴 크기 등을 세밀하게 조정할 수 있음

  • 30년 동안 우리는 표준 컨트롤로 비례 스크롤바를 써왔음. 현재 창이 문서의 어느 정도를 보여주는지 알 수 있었고, 스크롤바를 클릭해서 문서 크기에 비례한 위치로 쉽게 이동할 수 있었음
    스크롤바 위아래의 화살표 버튼도 쓸 수 있었고, 탭으로 이동한 뒤 키보드로 조작할 수도 있었음. 시각이나 운동 능력에 제약이 있으면 운영체제 설정으로 대비를 높이거나 더 크게 만들 수 있었음
    그런데 2024년의 웹에서는 사람들이 스크롤바를 일상적으로 망가뜨려 사용자 경험 악몽으로 만들고 있음. CSS가 원래 잘 작동하던 운영체제 제공 표준 컨트롤을 완전히 망칠 수 있게 하면서 브라우저 UI/UX가 저질화된 건 부끄러운 일임
    제발 이걸 쓰지 않았으면 함

    • 강하게 반대함
      운영체제가 제공하는 표준 컨트롤도 시간이 지나며 더 나빠졌음. 예를 들면 Apple의 사라지는 스크롤바와 둥근 체크박스가 있음
      그것들은 쉽게 바꿀 수 없지만, CSS를 쓰면 최소한 그런 표준 컨트롤을 개선할 수 있음
  • 다른 웹사이트에서 어떻게 보일지 확인할 수 있는 미리보기 기능이 마음에 듦. CSS 페이지에 정말 직관적이고 잘 맞음

  • Swyx의 Spark Joy 저장소는 빠질 수 없음:
    https://github.com/swyxio/spark-joy?tab=readme-ov-file#drop-...

  • 왜 아직도 새 CSS 프레임워크가 계속 만들어지는 걸까? 왜 이런 건 이미 해결된 문제가 아닌 걸까?

    • 이건 CSS 프레임워크가 아니라, CSS나 스타일링을 신경 쓰고 싶지 않지만 그럴듯해 보이는 사이트를 만들고 싶을 때 가져다 쓰는 스타일시트
    • CSS의 많은 부분은 예술과 미감에 관한 것임. CSS 작업은 절대 “끝나지” 않을 것임
      예술가들이 웹이라는 매체에서 자신을 표현하고 싶어 하는 한, 새로운 스타일시트와 “프레임워크”는 계속 나올 것임