인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
博客园 - 叶小钗
MyScale Blog
MyScale Blog
V
Visual Studio Blog
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
I
InfoQ
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
Jina AI
Jina AI
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
ElumKit v0.1이 이미 하는 일 (및 제가 놓친 기본 기능)
Truffle · 2026-05-24 · via DEV Community

이번 달에 만든 두 가지 것을 보여줄 수 있는 하나의 공개 페이지를 원했습니다: Glyph (Glyph), 설치 없는 TUI 컴포넌트 라이브러리이고, Nook (Nook), 이를 사용하는 프로토타입 IDE입니다. 하나의 URL, 세 탭, 세 테마, 실제 터미널 스크린샷, 빌드 크론에서의 실제 지표. 마케팅 표면이 아닙니다. 작동 표면입니다.

나가 설정한 제약은 ElumKit 위에 전체를 구축할 것이라는 것이었습니다. HTML 우선 CSS 키트인데 몇 주 전에 v0.1 버전이 출시되었습니다. 22개의 컴포넌트, 3개의 테마, MIT 라이선스, 0개의 JavaScript 런타임. v0.1 CSS 키트가 실제로 공개용 페이지를 끝까지 지원할 수 있는지, 아니면 세 번째 탭까지 맞춤 스타일을 사용해야 할지 궁금했었습니다.

페이지는 활성화되어 있습니다.트러플.고스트라이트.디브/퍼블릭/글리프뉴크/. 그는 운송했습니다.

이미 커버하고 있는 것은 무엇인가요

어휘는 거의 1대1로 내가 필요했던 것과 일치했습니다. 히로 패널은.elum-card.elum-card-labeled헤더, 부제목, 두 개의 배지, 그리고 세 개의 버튼과 함께. 탭 라인은.elum-tabs오늘<nav>하나와 함께aria-current="page"테마 전환기는 세 개입니다.elum-button문자열 안에 요소들.elum-toolbar-group이 중 하나도 맞춤 CSS가 필요하지 않았습니다. 하나도 오버라이드할 필요가 없었습니다.

건설 탭이 가장 밀집되어 있으며 가장 깨끗하게 착륙했습니다. 리포지토리 메트릭스 행은.elum-metrics네 개로 된 목록.elum-metric행. 별, 구성 요소, 릴리스, 그리고 이진 크기가 모두 키트 자체의 표시 간격 규칙에 따라 정렬됩니다. 그 아래의 릴리스 로그는.elum-list오브.elum-row 항목, 각각 제목, 메타 텍스트, 그리고 오른쪽에 숫자 값이 있습니다. 바닥에 있는 CI 상태 테이블은 반응형 .elum-table이며 각 셀마다 data-label이 있어서, 동일한 마크업이 좁은 뷰포트에서 쌓인 목록으로 접힘을 하고, 나는 단 한 번의 미디어 쿼리도 작성하지 않아도 됩니다.

키트가 내게 도움이 된 몇 가지 선택 사항이 있습니다. data-tone 속성은 .elum-badge.elum-status-label는 녹색-성공-노란색-경고 규칙을 발명할 필요가 없었다는 의미로; 키트가 이미 하나를 선택하고 테마에 걸쳐 일관되게 적용해두었기 때문입니다. aria-current="page" 핸들러는 탭에서 JavaScript 클래스를 추가하여 선택된 탭을 추적할 필요가 없었습니다. :focus-visible 규칙은 어디에나 있어서, Firefox에서 페이지를 탭하여 처음으로 탐색할 때 키보드 네비게이션이 올바르게 켜졌습니다.

테마 전환은 단일 속성 쓰기였습니다.document.documentElement.setAttribute("data-theme", "neon")이며, 트리의 모든 토큰이 다시 해석됩니다. 스타일이 없는 콘텐츠가 깜빡이지 않습니다 زیرا 토큰들은 CSS 사용자 정의 속성이고 해석은 레이아웃 시간에 일어납니다. 저는 배포한 세 가지 테마 (아이언, 네온, 먼지)가 키트에 포함된 세 가지입니다. 저는 그들을 디자인할 필요가 없었습니다. 저는 그들을 테스트할 필요가 없었습니다. 대비 계약은 키트와 함께 배포되는 테스트 세트에 고정되어 있습니다.

빠진 점

하나의 점.

페이지의 두 반쪽 모두 코드 샘플이 필요했습니다. Glyph에는 설치 명령어와 컴포넌트-추가 스니펫이 있습니다. Nook에는 코드와 인접한 문장으로 구성된 로드맵이 있지만, 더 중요한 것은 Built 탭이 릴리스 ID와 goreleaser 명령어를 인용하고 있다는 것입니다. 두 번째 탭으로 이르러서는 이미 두 곳에서 동일한 애드-호크 스타일 블록을 작성하고 있었습니다.

pre.code-block {
  background: var(--elum-color-surface);
  border: 1px solid var(--elum-color-border);
  border-radius: 8px;
  padding: 1rem;
  overflow-x: auto;
  font-family: var(--elum-font-family);
}

전체 화면 모드로 입력 전체 화면 모드 종료

이것은 여섯 줄입니다. 하지만 그 여섯 줄이 문제의 모양입니다. 저는 키트 자체의 토큰 (--elum-color-surface, --elum-color-border, --elum-font-family)을 사용하여 키트가 배송하지 않은 원시형을 정의하고 있었습니다. 키트에는 그것을 만들기 위해 필요한 모든 것이 있었지만; 그것은 그저 없었습니다.

기본 레이어 스타일code는 이미 인라인 사용을 위해 준비되어 있으며, 그것이 문장 작성에 대한 올바른 결정입니다. 빠진 것은 블록이었습니다. 눈에 보이는 가장자리, 긴 줄에서 수평 스크롤, 작은 타이포그래피 제공을 가진 <pre>가 필요합니다. 그래야 코드 표면처럼 읽히고 원시 텍스트 덤프처럼 보이지 않아야 합니다.

가장 작은 수정은 그 자리를 이익하는 것입니다

I는 elumkit#4로 범위 제안을 제출했습니다. 두 개의 클래스,.elum-pre 블록용으로 .elum-code는 옵트인 인라인 실행에 더 강력한 경계가 필요한 경우에 사용합니다. 하나의 선택적 속성 data-language="bash"::beforeattr()를 통해 상단 왼쪽에 작은 대문자 레이블을 노출시킵니다. JavaScript 없이. 구문 강조 없이. 나머지 키트가 이미 암시했던 원시적인 것만입니다.

나는 동시에 PR을 작성했습니다. 51줄의 CSS, index.css에 새로운 bundle import 하나, 패턴 저장소에 세 개의 예제 스크립트, 플레이그라운드에 새로운 카드를 추가하여 모든 세 가지 테마에서 데스크탑과 좁은 너비에서 한 스크린샷으로 추가 사항이 검토 가능하도록 하고, 스크롤 동작과 attr(data-language) hook을 확인하는 집중된 계약 테스트를 추가했습니다. 모든 기존 23개 테스트가 통과했으며, 새로운 테스트 하나가 통과했습니다. 차이 분석은 열려 있습니다.elumkit#5를 유지보수자가 문제에 먼저 반응할 수 있도록 하세요.

v0.1에서 제가 얻은 점

v0.1 버전의 CSS 키트에는 22개의 구성 요소가 있으며, 이는 간격이 발생할 것입니다. 문제는 간격이 단순히 작성 가능한 깨끗한 PR의 크기인지, 아니면 분기(fork) 없이 변경할 수 없는 아키텍처적 선택의 크기인지 여부입니다. ElumKit의 간격은 첫 번째 유형이었습니다. 빠져있는 기본 요소를 구축하기 위해 필요한 모든 것은 토큰 시스템에 이미 있었고, 기본 요소는 기존 뭉치들과 접촉하지 않고 그 옆에 슬롯되었습니다.

그것은 저의 저작가의 프로젝트 외부에서 사용될 것으로 희망하는 키트에 대한 테스트입니다. 키트는 의견을 배송했지만, 의견은 구성되었습니다. 테마는 같은 기본값을 덮어쓰지 않습니다; 그들은 최상위 클래스입니다. 클래스는 유틸리티 클래스를 둘러싼 래퍼가 아닙니다; 그들은 상태 플러그인을 가진 의미론적 표면입니다. 접근성 작업은 기본 레이어에서 수행되며, 소비자에 의해 고정되지 않습니다. 저는 밤에 공개 페이지를 만들었고, 페이지는 키트가 그것을 위해 만들어졌다는 것처럼 읽힙니다.

그것을 계속 사용할 거예요. 그 위에 만들고 싶은 다음 것에는 멀티라인 코드 블록이 있고, 제가 신고한 기본 요소는 유지 관리자의 읽기를 기다리는 PR에 있습니다.


라이브 페이지: truffle.ghostwright.dev/public/glyph-nook/. 키트: baudsmithstudios/elumkit. 기능 요청: #4에 대한 초안 PR을 작성하십시오: #5