문서/자료
<style> 블록과 마크업을 복사해 쓰는 구조입니다. 이 글은 저장소가 어떻게 생겼는지, 어디까지 믿고 가져다 쓸 수 있는지, 그리고 이 단순한 구조에서 무엇을 배울 수 있는지를 파일 근거로 정리합니다. (분석 커밋 adbd2ad 기준)galaxy는 Uiverse.io 플랫폼에서 승인된 UI 요소를 자동으로 올려 두는 미러 저장소입니다. README는 “3000개 넘는 고유 UI 요소”라고 소개하는데, 분석 커밋에서 실제로 센 .html 파일은 3,802개입니다.
README는 직접 기여(PR)를 받지 않는다고 밝힙니다. 요소는 Uiverse.io에 제출하고 승인되면 이 저장소로 자동 업로드되는 흐름입니다. 커밋 메시지도 전부 Launching a new button to space! 🚀 - https://uiverse.io/… 형태의 봇식 문구입니다(버튼 1,231건, 카드 726건, 로더 718건 등).
옷감 가게의 스와치 북은 천을 사는 곳이 아니라, 마음에 드는 천을 골라 번호를 적어 가는 곳입니다. galaxy의 파일 하나가 천 한 조각이고, 파일 이름이 곧 번호표입니다.
패키지로 설치해 쓰는 Material UI나 Bootstrap과 달리, 여기서는 필요한 조각만 잘라 내 내 프로젝트에 붙입니다. 그래서 의존성은 없지만, 조각마다 품질과 방식이 제각각입니다.
Buttons 폴더의 첫 파일(Shoh2008_hungry-treefrog-88.html)은 마크업 3줄과 <style> 블록이 전부입니다.
<button>
Button
</button>
<style>
/* From Uiverse.io by Shoh2008 - Tags: button, jelly */
button {
padding: 15px 30px; border: none; border-radius: 10px;
transition: 0.5s; background: #1e1e1e; color: greenyellow;
}
button:hover { animation: a 0.5s 1 linear; } /* 젤리처럼 늘었다 줄어드는 효과 */
@keyframes a { 0% { transform: scale(0.7, 1.3); } 25% { ... } 100% { transform: scale(1, 1); } }
</style>
두 가지에 주목하세요. 첫째, 제작자와 태그가 CSS 주석(/* From Uiverse.io by … - Tags: … */)으로 남아 있어 출처를 파일 안에서 확인할 수 있습니다. 둘째, 선택자가 그냥 button이라 이 조각을 다른 페이지에 붙이면 페이지의 모든 버튼에 스타일이 번집니다. 이 점은 4장에서 다시 봅니다.
galaxy는 코드 라이브러리가 아니라 ‘파일명 규칙 하나로 정리된 3천여 개의 독립 견본’이라는 점이 이 저장소를 이해하는 출발점입니다.
호버 애니메이션·로더·토글 스위치를 직접 짜기 전에 비슷한 것을 먼저 찾아보는 용도에 맞습니다. 반대로 접근성이나 일관된 디자인 시스템이 필요한 제품 UI의 기반으로는 맞지 않습니다.
TrendShift에서 이 저장소는 분석 시점 #22로 올라 있었습니다. 트렌딩 이유를 저장소 안 근거로만 설명하면 다음과 같습니다. (순위 자체의 원인은 저장소에서 확인할 수 없어 추정입니다.)
| 요인 | 근거 |
|---|---|
| 규모 | 11개 폴더에 HTML 3,802개. 작성자(파일명 앞부분 기준) 927명 |
| 라이선스 | 루트 LICENSE는 MIT, 저작권자 표기 “Uiverse.io” (2023) |
| 즉시성 | JS 없이 HTML+CSS만 있어 열어서 바로 복사 가능. <script>가 든 파일은 0개 |
| 꾸준한 갱신(과거) | 3,977 커밋, 2023-10-01~2024-09-02. 2023-10 한 달에 2,839 커밋이 몰려 있어 대량 이관 뒤 월 60~150건씩 추가된 모양 |
비슷한 쓰임의 대안과 견주면 성격이 분명해집니다.
| 대안 | 형태 | galaxy와 차이 |
|---|---|---|
| Bootstrap·MUI | 설치형 컴포넌트 라이브러리 | 일관성·접근성 보장, 대신 조각 단위 취사선택이 어렵다 |
| shadcn/ui | CLI로 소스를 복사 | 복사 방식은 같지만 하나의 디자인 시스템 안에서 맞춰져 있다 |
| CodePen 컬렉션 | 개별 펜 모음 | galaxy는 그것을 파일 한 개씩 평평하게 내려받아 둔 보관본에 가깝다 |
분석 커밋의 마지막 날짜가 2024-09-02이고 2024-09 커밋은 4건뿐입니다. 이후 새 요소가 이 미러에 올라오는지는 확인하지 못했습니다. 최신 요소를 보려면 Uiverse.io 본 사이트를 보는 편이 안전합니다.
저장소에는 package.json, 빌드 설정, 테스트가 없습니다. 루트에 있는 것은 11개 폴더와 README.md, LICENSE뿐입니다(파일 확장자 집계: .html 3,802, .md 1, 확장자 없는 LICENSE 1). 그래서 ‘스택’은 파일 안에서 읽어야 합니다.
| 계층 | 실제로 쓰인 것 | 근거(전수 집계) |
|---|---|---|
| 백엔드 | 없음 | 서버 코드·스크립트 파일 없음 |
| 스타일: 일반 CSS | HTML 아래 <style> 블록 | 3,369개 파일(헤더가 CSS 주석 형태) |
| 스타일: Tailwind | 클래스만 쓰는 마크업, <style> 없음 | 433개 파일(헤더가 HTML 주석 형태, 3,369+433=3,802) |
| 애니메이션 | @keyframes | 1,356개 파일 |
| 아이콘·그래픽 | 인라인 <svg> | 1,228개 파일 |
| 입력 요소 | 실제 <input> 사용(체크박스·토글 등) | 974개 파일 |
| 최신 CSS | :has() 40개, @property 3개, CSS 변수 var(--…) 553개 파일 | 패턴 포함 파일 수 |
| 접근성 배려 | prefers-reduced-motion | 7개 파일뿐 |
class="flex p-4 rounded-lg"처럼 짧은 유틸리티 클래스 이름을 마크업에 직접 붙이는 방식입니다. 이 방식의 조각은 Tailwind가 이미 설치된 프로젝트에서만 제대로 보입니다.외부 의존은 거의 없습니다. 이미지 src가 https://uiverse.io를 가리키는 것이 29건, 그 밖에 자리표시 이미지(via.placeholder.com)와 피그마 CDN 배경 이미지가 각 1건 있습니다. 즉, 대부분의 조각은 외부 호출 없이 자체 완결됩니다.
저장소 내부에는 업로드 자동화 코드가 없습니다(워크플로 파일이나 스크립트가 없고 .git만 있음). 그래서 데이터가 흐르는 모습은 README와 커밋 메시지, 파일명 규칙에서 역으로 추론한 것입니다.
한 파일은 ‘마크업 → <style>’ 순서이고 헤더 주석에 From Uiverse.io by 제작자 - Tags: 태그, 태그가 들어갑니다. 일부는 Website:·Name: 필드도 갖습니다(예: Forms의 Shamaun-Nabi_sour-fireant-94.html). 이 규칙 덕분에 태그는 간단한 문자열 처리만으로 집계됩니다.
이 집계에서 가장 흔한 태그는 button(1,112), loader(685), card(577), simple(364), animation(346), hover(247) 순이었습니다.
Cards의 Tailwind 조각은 클래스가 요소에 붙어 있어 충돌 위험이 낮지만, 일반 CSS 조각 중에는 button, .container처럼 범용 이름을 그대로 쓰는 것이 있습니다. Patterns의 첫 파일은 .container가 전부입니다.
<!-- 붙이기 전에 이름을 바꿔 충돌을 막는 예 -->
<div class="container"></div>
<style>
.container { ... repeating-linear-gradient ... } /* 이미 .container가 있는 페이지라면 깨진다 */
</style>
<!-- → .galaxy-pattern-stripes 처럼 접두어를 붙여 두 곳 모두 바꿔 준다 -->
이름표 없이 ‘김 대리’라고만 적힌 서류를 한 사무실에 여러 장 모으면 누구 것인지 헷갈리듯, 범용 클래스 이름은 합쳐 쓰는 순간 서로 덮어씁니다.
3,802개가 모두 같은 규칙으로 만들어진 것이 아니라 제작자 927명이 각자 쓴 코드의 모음이므로, 가져온 뒤의 검수 책임은 전적으로 사용자에게 있습니다.
폴더 합계는 3,802로 파일 총수와 일치합니다. 폴더명 표기가 섞여 있다는 점(loaders만 소문자)도 자동 생성 저장소의 흔적입니다. 폴더별 수치는 커밋 로그의 메시지 분포(button 1,231 / card 726 / loader 718 / switch 260 / input 226 / form 180 / checkbox 171 / pattern 103)와도 같은 값이 나옵니다.
가장 작은 예는 Tooltips의 Tailwind 조각(ahmedyasserdev_wise-newt-71.html)입니다. group/group-hover:block으로 마우스를 올릴 때만 말풍선을 보이게 합니다. 주의할 점으로 이 파일은 dark: 변형 클래스까지 쓰므로, 프로젝트의 다크모드 설정 방식에 따라 다르게 보일 수 있습니다.
반대로 Toggle-switches의 3bdel3ziz-T_honest-deer-30.html은 달·해 SVG, CSS 변수, :has(.circle:checked)로 JS 없이 토글 상태를 표현합니다. 파일 안의 Font Awesome 라이선스 문구가 SVG 안에 텍스트로 섞여 들어가 있는 점도 눈여겨볼 만합니다(복사하면 같이 따라옵니다).
| 기술 | 어디서 보나 | 배울 것 |
|---|---|---|
| CSS 애니메이션 | loaders/, Buttons/ | @keyframes, animation-delay로 순차 효과 만들기. 1,356개 파일이 같은 문법의 다른 사용례 |
| JS 없는 상호작용 | Toggle-switches/, Checkboxes/ | input:checked + 형제 선택자 + :has()로 상태 표현 |
| CSS 변수 | Toggle-switches 예제 등 | --transition, --color-dark처럼 한곳에서 바꾸는 값 설계 |
| Tailwind | 433개 HTML 주석 헤더 파일 | 같은 모양을 CSS로 쓴 조각과 Tailwind로 쓴 조각을 나란히 비교 |
| SVG 인라인 | 1,228개 파일 | viewBox, fill, 경로 애니메이션 |
| 접근성 감각 | 7개 파일만 prefers-reduced-motion | 대부분의 조각이 빠뜨린 것이 무엇인지 찾는 연습 |
Toggle-switches의 260개 중 몇 개를 열어 <input type="checkbox">를 숨기고 label로 모양을 그리는 방식, appearance: none으로 입력 자체를 꾸미는 방식을 구분해 보세요. 키보드로 포커스가 가는지, 스크린리더가 상태를 읽는지가 방식마다 달라집니다.
이 저장소에서 가장 값진 학습은 ‘예쁜 결과물’이 아니라, 3,802개의 서로 다른 구현을 비교하며 접근성·충돌·성능 문제를 직접 찾아내는 눈입니다.
예를 들어 Toggle-switches의 honest-deer-30 파일에는 positon: relative;(position의 오타)가 있고, SVG 안에 라이선스 안내 문구가 텍스트로 섞여 있습니다. 승인 과정에서 문법 오류까지 걸러지지는 않는다는 증거이므로 가져온 코드는 한 번 읽고 정리해 쓰세요.
| 작업 | 필요한 것 |
|---|---|
| 파일 열어서 보기 | 아무 최신 브라우저(HTML 파일 더블클릭). :has() 같은 새 CSS는 구형 브라우저에서 동작하지 않을 수 있음 |
| 전체 받기 | Git. 3,977 커밋 이력이 있어 얕은 클론(--depth 1)이 빠름 |
| Tailwind 조각 보기 | Tailwind CSS가 설정된 프로젝트(433개 파일 대상) |
| GPU·서버 | 불필요 |
파일 크기는 중앙값이 약 1.5KB로 가볍습니다. 가장 큰 파일은 약 185KB(Cards의 Smit-Prajapati_stupid-bullfrog-39.html)에 달해, 전체를 한 페이지에 모아 미리보기를 만들면 무거워질 수 있습니다.
Buttons에서 마음에 드는 파일 하나를 골라 새 HTML에 붙이고, 이미 있는 <button>이 같이 변하는지 확인합니다. 그다음 클래스 이름을 붙여 선택자를 좁힙니다.
<!-- before -->
button { padding: 15px 30px; ... }
/* after: 범위를 좁힌다 */
.jelly-btn { padding: 15px 30px; ... }
<button class="jelly-btn">Button</button>
모든 파일에는 From Uiverse.io by 헤더가 있습니다(3,802/3,802). 이를 정규식으로 읽어 작성자별·태그별 개수 표를 만드는 짧은 파이썬 스크립트를 작성해 보세요. 이 글의 수치(작성자 927명, 태그 상위 목록)를 직접 재현해 보면 됩니다.
import glob, re, collections
tags = collections.Counter()
for f in glob.glob("*/*.html"):
m = re.search(r"Tags: ([^*]*?)(?:\*/|-->)", open(f, errors="ignore").read())
if m:
tags.update(t.strip().lower() for t in m.group(1).split(","))
print(tags.most_common(10))
loaders에서 5개를 골라 서로 안 겹치도록 클래스 접두어를 붙이고 한 페이지에 나란히 둡니다. 각각 prefers-reduced-motion에서 애니메이션을 멈추는 규칙을 직접 추가해 보세요(7개 파일만 이 배려를 갖고 있습니다).
폴더 하나(예: Tooltips, 62개)를 읽어 각 파일을 <iframe srcdoc>에 넣는 정적 갤러리를 만듭니다. 3,802개 전체를 한 번에 그리면 느려지므로 폴더별 페이지 분할과 지연 로딩을 고민해 보세요. Tailwind 조각(HTML 주석 헤더)은 갤러리 쪽에 Tailwind를 포함해야 보입니다.
| 주차 | 주제 | 할 일 |
|---|---|---|
| 1주 | CSS 기본기 | Buttons·Cards 30개 읽기, 선택자 범위와 상속 정리 |
| 2주 | 애니메이션 | loaders 20개 분해: @keyframes, 타이밍 함수, 지연 시간 패턴 |
| 3주 | Tailwind 비교 | CSS 조각 하나를 Tailwind로 다시 쓰고 반대로도 해 보기 |
| 4주 | 컴포넌트화·접근성 | 마음에 든 조각 3개를 접두어·CSS 변수·키보드 조작을 갖춘 컴포넌트로 정리 |
| 용어 | 뜻 |
|---|---|
| Uiverse.io | UI 조각을 올리고 미리보는 커뮤니티 사이트. 이 저장소의 원본 |
| 미러(mirror) 저장소 | 다른 곳의 콘텐츠를 자동으로 복사해 둔 저장소 |
@keyframes | 시간에 따른 스타일 변화를 정의하는 CSS 문법 |
:has() | “이 요소가 특정 자손을 가졌을 때” 스타일을 주는 선택자. 체크 상태 표현에 자주 쓰임 |
| 선택자 충돌 | 서로 다른 코드가 같은 클래스/태그 이름으로 스타일을 덮어쓰는 문제 |
| Tailwind 유틸리티 클래스 | px-4, rounded-lg 같은 짧은 스타일 클래스 |
prefers-reduced-motion | 사용자가 “움직임을 줄여 달라”고 설정했는지 알려 주는 미디어 쿼리 |
| MIT 라이선스 | 복사·수정·재배포를 폭넓게 허용하고 저작권 고지를 요구하는 라이선스 |
adbd2ad): README.md, LICENSE, Buttons/Shoh2008_hungry-treefrog-88.html, Cards/05akalan57_thin-sloth-31.html, Toggle-switches/3bdel3ziz-T_honest-deer-30.html, Forms/Shamaun-Nabi_sour-fireant-94.html, Tooltips/ahmedyasserdev_wise-newt-71.htmlREADME는 모든 요소가 MIT라고 밝히면서, 의무는 아니지만 원작자와 Uiverse.io에 크레딧을 달아 달라고 요청합니다. 파일 안의 From Uiverse.io by … 주석을 지우지 않고 가져가는 것이 가장 쉬운 방법입니다. 다만 927명이 각자 올린 코드를 한 MIT 표기로 묶어 둔 구조이므로, 상업 제품에 대량 도입한다면 원본 사이트의 약관도 확인하세요.