Component Contract
Define product component semantics, states, events, asynchronous ownership, and verification before visual treatment.
이 자료로 구현하기
원문 주소와 버전이 포함된 요청문입니다. 복사한 뒤 만들 화면과 요구사항을 채워 에이전트에게 전달하세요.
FROM PRINCIPLE TO PRACTICE
이 원리로 만든 예제 171
예제를 열어 직접 조작하고, 관찰한 동작을 이 문서의 원리와 비교해 보세요.
Globe
- 지구본 회전 입력의 범위
Globe는 COBE 렌더러의 phi를 자동 증가시키고 누른 x좌표와 이동량을 spring에 더해 회전합니다. 현재 캔버스에는 드래그 대체 버튼·키보드 조작·위치 설명이 없습니다. 단순 장식인지 지리 정보를 탐색하는 도구인지 먼저 정해야 합니다.
- 지구본 회전 입력의 범위
Animated Shiny Text
- 반짝이는 배지의 실제 행동
반짝임은 span의 배경 클리핑이며 기본 글자색은 남아 있습니다. 대표 데모는 커서와 화살표가 반응해도 div 배지에 링크나 활성화 핸들러가 없습니다. 이 표현을 탐색 CTA로 사용할 때는 별도의 실제 링크가 필요합니다.
- 반짝이는 배지의 실제 행동
Avatar Circles
- 겹친 아바타의 링크 정체성
여섯 아바타는 각 프로필을 새 탭으로 열며 대체텍스트는 이름 대신 순번입니다. 마지막 +99는 빈 href 링크입니다. 음수 간격과 rtl:space-x-reverse로 겹침 방향은 바꾸지만 목적지의 의미까지 정해 주지는 않습니다.
- 겹친 아바타의 링크 정체성
연결된 예제 168개 더 보기
Bento Grid
- 카드 행동이 보이는 조건
BentoCard는 작은 화면에서 CTA를 항상 배치하고 lg에서는 아래 CTA를 opacity 0으로 두었다 hover 때 드러냅니다. 데모의 네 카드는 움직이는 배경 또는 달력을 포함하고 href는 #입니다. 배경 시연과 실제 링크 접근성은 별개입니다.
- 카드 행동이 보이는 조건
Code Comparison
- 비동기 구문 강조의 최신 입력
CodeComparison은 테마와 코드가 바뀔 때 Shiki를 불러 두 문자열을 HTML로 변환합니다. effect에는 요청 정체성이나 정리 가드가 없으며 실패하면 코드 문자열을 pre HTML에 직접 넣습니다. 데모 코드는 표시용 문자열이고 실행되는 미들웨어가 아닙니다.
- 비동기 구문 강조의 최신 입력
Dock
- 확대 반응과 탐색 링크의 분업
DockIcon은 포인터와 중심의 거리를 spring 크기로 바꾸는 div이고 링크 의미는 데모의 Link와 aria-label이 제공합니다. pageX와 getBoundingClientRect의 x를 섞으므로 문서 가로 스크롤 조건도 확인해야 합니다. 데모 목적지는 모두 #입니다.
- 확대 반응과 탐색 링크의 분업
Dotted Map
- 지도 점과 마커 설명의 분리
DottedMap은 svg-dotted-map의 점 좌표를 그리며 홀수 행을 반 간격 옮깁니다. 대표 데모는 서울·NYC 두 마커에 국기 이미지와 label을 얹고 pulse는 기본 false입니다. 국기·좌표만으로 위치의 접근 가능한 설명이 완성되지는 않습니다.
- 지도 점과 마커 설명의 분리
Glare Hover
- 빛의 통과와 가격 카드 행동
GlareHover는 before 배경 위치만 hover 때 이동합니다. playOnce는 이탈 때 전환을 끄는 CSS 선택이며 영구 재생 이력을 저장하지 않습니다. 대표 데모는 340px 가격 카드와 버튼을 children으로 둡니다.
- 빛의 통과와 가격 카드 행동
Interactive Grid Pattern
- hover 칠하기와 선택 상태의 구분
InteractiveGridPattern은 24×24 rect 중 hoveredSquare 하나만 칠하고 이탈 시 null로 돌립니다. 클릭으로 저장되는 선택, 키보드 탐색, 출력 이벤트가 없습니다. 이름의 interactive는 현재 포인터 장식 반응을 뜻합니다.
- hover 칠하기와 선택 상태의 구분
Interactive Hover Button
- 두 시각 라벨과 하나의 버튼 이름
InteractiveHoverButton은 children을 두 번 렌더링하고 hover 때 하나를 이동·투명 처리합니다. 두 텍스트 모두 DOM에 남으며 aria-hidden은 없습니다. 데모는 핸들러 없는 버튼이고 type 기본값도 구현에서 지정하지 않습니다.
- 두 시각 라벨과 하나의 버튼 이름
Lens
- 확대 복제본의 읽기·입력 책임
Lens는 원본 children 위에 같은 children을 확대 복제하고 원형 mask로 잘라 보여 줍니다. 바깥 영역은 초점을 받지만 키보드는 Escape만 처리합니다. 대표 데모는 이미지만 복제하며 카드 버튼은 Lens 밖에 있습니다.
- 확대 복제본의 읽기·입력 책임
Pixel Image
- 조각 이미지의 단일 설명
PixelImage는 같은 img를 rows×cols번 복제해 각각 polygon으로 자릅니다. 대표 데모는 4×6으로 24개의 순번 alt를 만듭니다. grayscale 전환은 이미지 로드 완료가 아니라 colorRevealDelay 타이머로 결정됩니다.
- 조각 이미지의 단일 설명
Striped Pattern
- SVG 크기 입력과 타일 간격
StripedPattern은 SVGProps의 width·height를 Number로 바꿔 pattern 간격으로 사용합니다. 기본값 10은 유효하지만 100% 같은 SVG 크기 문자열은 숫자가 되지 않습니다. 배경 자체는 aria-hidden·pointer-events-none입니다.
- SVG 크기 입력과 타일 간격
fluted glass
- FlutedGlass의 이미지가 준비되지 않은 상태
원본 최소 예제는 이미지 없이 시작하고 래퍼는 image의 기본값을 빈 문자열로 둡니다. 굴절 비교에는 같은 유효한 이미지가 필요합니다. 공통 processUniforms는 빈 문자열을 투명 픽셀로 바꾸고 외부 URL에는 anonymous CORS를 설정합니다. 이미지 오류는 Promise 거절과 콘솔 기록으로 끝나므로 읽을 수 있는 실패 안내와 재시도는 소비자 계약에 남아 있습니다.
- FlutedGlass의 이미지가 준비되지 않은 상태
halftone cmyk
- HalftoneCmyk의 이미지가 준비되지 않은 상태
네 채널의 망점은 원본 이미지에서 샘플링합니다. 최소 예제에는 image가 없으므로 빈 배경을 망점 변환이 끝난 이미지로 볼 수 없습니다. 공통 processUniforms는 빈 문자열을 투명 픽셀로 바꾸고 외부 URL에는 anonymous CORS를 설정합니다. 이미지 오류는 Promise 거절과 콘솔 기록으로 끝나므로 읽을 수 있는 실패 안내와 재시도는 소비자 계약에 남아 있습니다.
- HalftoneCmyk의 이미지가 준비되지 않은 상태
image dithering
- 확대해도 별도로 유지하는 디더링 격자
이미지의 fit·scale·rotation보다 먼저 화면 픽셀 좌표를 size 단위로 양자화합니다. 원본 이미지의 확대와 셀 확대를 구분하고, 세로·가로 이미지 및 브라우저 확대에서도 같은 입력이 뜻하는 것을 확인해야 합니다.
- 확대해도 별도로 유지하는 디더링 격자
paper texture
- 종이만 그리는 경로와 이미지를 거르는 경로
PaperTexture는 image 없이도 종이 표면을 만듭니다. image가 있을 때 blending은 종이와 이미지의 혼합, distortion은 이미지의 휘어짐, clip은 이미지 영역에 맞춘 자르기를 맡습니다. 이 차이를 안내하지 않으면 입력이 없는 상태의 비활성 효과를 고장으로 오해하기 쉽습니다.
- 종이만 그리는 경로와 이미지를 거르는 경로
A little order. A lot of motion.
- 01 / Text & particle timing · renderTypography
A local timeline assigns independent character offsets, cyclic colors and directions, seeded repeat-refresh particles, and a smoothed playback rate. Line and character clipping can be compared without a text-animation library. This binding describes the authored study and does not verify the original project.
- 01 / Text & particle timing · renderTypography
Building a Fully-Featured 3D World in the Browser with Blender and Three.js
- 카메라 이동과 모달 입력의 경계
Experience는 wheel·터치·마우스 입력을 targetScrollProgress에 모으고 준비 전에는 등록하지 않습니다. wheel과 touchstart는 모달 상태를 검사하며 effect 정리에서 리스너를 제거합니다.
- 카메라 이동과 모달 입력의 경계
Building a Scroll-Driven 3D Cube Gallery in Webflow with GSAP
- 여섯 항목의 DOM 순서로 정하는 큐브 면
HTML의 여섯 nth-child 규칙은 항목마다 transform-origin과 90도 단위 회전을 정합니다. 앞·뒤 면의 깊이는 ±0.5×100cqw로 계산하므로 지정한 컨테이너 폭과 면 크기의 대응이 필요합니다.
- 여섯 항목의 DOM 순서로 정하는 큐브 면
Building a Scroll-Reactive 3D Gallery with Three.js, Velocity, and Mood-Based Backgrounds
- 문서 대신 카메라가 소비하는 스크롤 입력
Scroll은 전역 wheel과 touchmove의 기본 동작을 막고 갤러리 깊이에서 카메라의 앞뒤 경계를 정합니다. 이 값은 문서의 scrollY가 아니라 별도 입력 상태입니다.
- 문서 대신 카메라가 소비하는 스크롤 입력
Building a Scroll-Revealed WebGL Gallery with GSAP, Three.js, Astro and Barba.js
- DOM 이미지와 WebGL 표면의 공동 수명
Media는 이미지의 화면 경계로 mesh 크기와 위치를 만들고 scroll delta로 y를 보정합니다. destroy는 mesh·트리거·클릭 핸들러·geometry·material을 정리하지만 texture 해제는 이 메서드에 없습니다.
- DOM 이미지와 WebGL 표면의 공동 수명
Glass, with no glass.
- 04 / SDF bevels & recycled cards · panBy
A rounded-rectangle signed distance drives a bevel height field and finite-difference normals in a native WebGL shader. Three refracted samples of an original procedural texture create dispersion. A bounded pool reprojects over a spherical field, and selectable HTML labels use the same projected card data. GPU cloth and the publisher’s full camera-matrix implementation are outside this study. This binding describes the authored study and does not verify the original project.
- 04 / SDF bevels & recycled cards · panBy
Building an Infinite Parallax Grid with GSAP and Seamless Tiling
- 타일 재배치와 입력 대안의 분리
InfiniteGrid는 각 항목이 화면 경계를 넘으면 extraX·extraY를 타일 크기만큼 바꿉니다. 드래그·wheel과 포인터 시차가 같은 화면에 결합됩니다.
- 타일 재배치와 입력 대안의 분리
Building an Interactive Image Grid with Three.js
- 열 수 재계산과 실제 카드 집합의 차이
Grid는 처음에 COLUMNS×ROWS개의 Card를 만듭니다. resize는 행·열 수와 공통 스케일을 바꾸지만 이 메서드에서 카드 집합을 다시 만들지는 않습니다.
- 열 수 재계산과 실제 카드 집합의 차이
Same orchard. Fewer calls.
- 21 / Instancing & measured rendering work · scheduleOrchard
A deterministic array of original column transforms feeds either separate Three.js Mesh objects or one InstancedMesh. A single render reports renderer.info draw calls and triangles, while the drawing buffer reports actual pixel dimensions. Object count, DPR and scheduling are separate controls; no frame-rate or universal speedup claim is made. This binding describes the authored study and does not verify the original project.
- 21 / Instancing & measured rendering work · scheduleOrchard
A field made of functions.
- 06 / Parametric GPU tubes · renderStrands
A native WebGL vertex shader derives curve positions, finite-difference tangents, a cross-section frame and normals from immutable progress/angle attributes. The animated reveal changes radius rather than transparency. A stable reference-axis fallback prevents zero-length cross products for this bounded curve family; it does not promise a globally continuous frame for arbitrary curves. This binding describes the authored study and does not verify the original project.
- 06 / Parametric GPU tubes · renderStrands
Elastic Grid Scroll: Creating Lag-Based Layout Animations with GSAP ScrollSmoother
- 열별 지연을 만들기 위한 DOM 재구성
groupItemsByColumn은 원래 인덱스의 나머지로 열을 만들고 buildGrid가 열별 wrapper 안으로 항목을 옮깁니다. 시각 효과와 함께 DOM 읽기 순서도 달라질 수 있습니다.
- 열별 지연을 만들기 위한 DOM 재구성
Exploring Procedural Geometry with Three.js and WebGPU
- 캔버스 상대 좌표로 표면을 고르기
SurfacePainter의 pick은 캔버스 사각형을 기준으로 포인터를 정규화해 raycaster에 전달합니다. 붓 미리보기는 표면 위치에 법선 방향 오프셋을 더해 표시합니다.
- 캔버스 상대 좌표로 표면을 고르기
One state. Two surfaces.
- 22 / Semantic content & pixel treatment · showCoverFailure
One application state owns caption, accent and effect. Both a semantic HTML card and an independently drawn Canvas2D cover consume the same snapshot. Pixelated mode paints that cover into a smaller detached canvas, then enlarges it with image smoothing disabled. Inputs and resize events redraw the current state without replacing native controls. This is manual drawing of known content, not automatic HTML rasterization. This binding describes the authored study and does not verify the original project.
- 22 / Semantic content & pixel treatment · showCoverFailure
A frame becomes a page.
- 08 / Design tree & responsive constraints · renderDesignTree
A local design-tree fixture is rendered into a section, header, article and native action. Prepared and fixed-frame modes expose the effects of logical sizing, min/max bounds and shared spacing variables without connecting to Figma or WordPress. This binding describes the authored study and does not verify the original project.
- 08 / Design tree & responsive constraints · renderDesignTree
Name the thing it does.
- 09 / Semantic preparation inspector · renderSemanticTree
An independent preparation inspector maps stable node identities to native HTML elements and named layout constraints. Node selection, role editing and a shared spacing variable update the rendered fixture and its generated markup together. It studies semantic preparation, not a provider import. This binding describes the authored study and does not verify the original project.
- 09 / Semantic preparation inspector · renderSemanticTree
From Flat to Spatial: Creating a 3D Product Grid with React Three Fiber
- 드래그 한계와 확대 상태에 따른 놓기 위치
Rig는 최대 이동 거리로 클릭과 드래그를 구분하고 경계 밖 이동에 저항을 줍니다. onUp은 확대가 풀린 상태에서는 중심으로, 확대 상태에서는 범위 안으로 target을 되돌립니다.
- 드래그 한계와 확대 상태에 따른 놓기 위치
Good things have roots.
- 10 / Clipping, states & responsive callouts · renderPlant
A native range and pointer position share a clipping value for an original SVG pot cross-section. Stable feature selection drives reusable callouts. The care button has idle, hover/focus and expanded states, while its semantic expansion state commits immediately. This binding describes the authored study and does not verify the original project.
- 10 / Clipping, states & responsive callouts · renderPlant
Garden Anomaly: A Tiny WebGPU and TSL Experiment
- 충돌 제약 후 실제 이동으로 속도 재계산
step은 중력·감쇠로 위치를 예측한 뒤 세 차례 입자 간 겹침과 유리벽 제약을 적용합니다. 그 결과와 이전 위치의 차이로 속도를 다시 계산한 후 충돌 재분산과 휴식 후 상승 힘을 더합니다.
- 충돌 제약 후 실제 이동으로 속도 재계산
Grid Item Reveal Animation on Hover
- 이벤트 대상에서 상세 ID를 찾는 전제
toggleWork는 event.target의 href로 상세를 찾고 data-bg의 배경을 연결합니다. 각 링크 대상에 진입·이탈 타임라인을 저장해 취소합니다.
- 이벤트 대상에서 상세 ID를 찾는 전제
Twelve views, one orbit.
- 11 / Perspective ring composition · selectOrbitCard
Twelve CSS 3D card transforms share one orbit parent. Each card uses a fixed index-derived 30-degree angle plus a depth translation; radius, tilt, parent rotation and scene scale remain separately editable. Keyboard-operable card selection and angle controls replace any need for a custom cursor. This binding describes the authored study and does not verify the original project.
- 11 / Perspective ring composition · selectOrbitCard
An event is a beginning.
- 13 / Interaction & timeline composer · renderPreset
A consumer-owned event adapter launches one preset evaluator. Duration, delay and order define track offsets; the scrubber can inspect the same timeline without firing its trigger. This binding describes the authored study and does not verify the original project.
- 13 / Interaction & timeline composer · renderPreset
When drops become one.
- 14 / Smooth distance fields · updateTrail
An independently authored native WebGL ray marcher evaluates a smooth union of sphere signed-distance fields. A bounded pointer trail supplies sphere centers; finite-difference surface normals support shaded, normal and distance views. No original custom-licensed implementation is redistributed. This binding describes the authored study and does not verify the original project.
- 14 / Smooth distance fields · updateTrail
How to Make The Fluffiest Grass With Three.js
- 0과 false를 건너뛰는 재질 입력 병합
GrassMaterial의 mergeUniforms는 value가 truthy일 때만 기존 uniform을 갱신합니다. 생성자에 0이나 false를 넘기는 경로는 값을 명시해도 무시될 수 있습니다.
- 0과 false를 건너뛰는 재질 입력 병합
Interactive 3D with Three.js BatchedMesh and WebGPURenderer
- 한 블록의 아래·위 조각을 두 인덱스로 유지
initBlocks는 블록마다 아래·위 instance를 연속 추가하고 색을 i×2와 i×2+1에 설정합니다. 갱신도 같은 인덱스로 아래 높이를 늘리고 위 조각을 해당 높이에 배치합니다.
- 한 블록의 아래·위 조각을 두 인덱스로 유지
Interactive Video Projection Mapping with Three.js
- 마스크 비율과 정사각 격자 반복의 치수 전제
createMask는 원본 비율에 따라 gridWidth·gridHeight를 정합니다. createGrid의 반복과 UV 분할은 둘 다 gridSize를 사용하면서 픽셀 읽기는 gridWidth·gridHeight를 사용합니다.
- 마스크 비율과 정사각 격자 반복의 치수 전제
Interactive WebGL Backgrounds: A Quick Guide to Bayer Dithering
- 최근 열 번의 클릭을 순환하는 파동 입력
pointerdown은 canvas 경계를 빼고 CSS 크기에서 backing 크기로 좌표를 환산하며 y를 뒤집습니다. 위치·시간을 열 칸 배열에 저장하고 clickIx를 나머지 연산으로 순환시킵니다.
- 최근 열 번의 클릭을 순환하는 파동 입력
Made With Gsap: Building a Fun Gravity-Based Mouse Trail
- 포인터 누적 거리로 한 장씩 만드는 낙하 꼬리
applyMove는 처음 입력을 기준점으로만 저장하고 이후 x·y 이동의 절댓값 합을 누적합니다. 초기 화면 폭의 1/6 또는 1/8을 넘으면 한 장을 만들고 누적값을 0으로 지웁니다. createMedia는 아래 200px 구간의 생성을 건너뜁니다.
- 포인터 누적 거리로 한 장씩 만드는 낙하 꼬리
One model. Every measure.
- 17 / Data-bound quantity calculator · renderBarCalculator
A local data model owns grams per bar, quantity and demonstration units per gram. Total mass and total price are derived by multiplication; original SVG bar dimensions, count and labels update together. No market-data, financial-quote or provider API is involved. This binding describes the authored study and does not verify the original project.
- 17 / Data-bound quantity calculator · renderBarCalculator
Recreating Palmer’s Draggable Product Grid with GSAP
- 격자 드래그와 wheel의 공통 경계
setupDraggable은 x·y 이동에 여유 경계를 두고 addEvents의 wheel 경로도 같은 bounds로 새 위치를 제한합니다. wheel 입력이 있다는 사실만으로 클릭·탭이나 키보드 대안이 완성되지는 않습니다.
- 격자 드래그와 wheel의 공통 경계
Rotating Twisted 3D Typography with Three.js and Shaders
- 글꼴 로드 뒤 geometry와 변형 경계 교체
Sketch.updateGeometry는 선택한 font를 읽은 후 TextGeometry를 새로 만들고 중심·boundingBox를 계산합니다. uMin·uMax를 바꾸고 textmesh.geometry를 대체하지만 이 경로에서 이전 geometry를 dispose하지 않습니다.
- 글꼴 로드 뒤 geometry와 변형 경계 교체
Sticky Grid Scroll: Building a Scroll-Driven Animated Grid
- 세 열이라는 코드 전제와 실제 배치
StickyGridScroll.groupItemsByColumn은 numColumns를 3으로 고정하고 인덱스 나머지로 항목을 분류합니다. 설명과 버튼은 초기 opacity=0·pointerEvents=none으로 설정합니다.
- 세 열이라는 코드 전제와 실제 배치
The Never Ending Story: Building a Seamless Infinite Scroll Experience with GSAP & Lenis
- 반복 스크롤 소유자와 애니메이션 좌표 연결
setupLenis는 wrapper를 infinite scroller로 만들고 ScrollTrigger.scrollerProxy의 읽기·쓰기를 Lenis에 연결합니다. Snap은 같은 section들을 정렬 대상으로 등록하고 GSAP ticker의 초를 밀리초로 바꿔 raf에 전달합니다.
- 반복 스크롤 소유자와 애니메이션 좌표 연결
Animate Scroll Position
- 이동 목표를 지정하는 세 입력
공식 문서에는 scrollTo:400, scrollTo:"#someID", 그리고 y와 offsetY:50을 갖는 세 대안이 있습니다. 동반 예제는 이를 각각의 버튼에 연결하고 새 명령 앞에서 이전 window 트윈을 정리합니다. 버튼·목표 요소·위치 표시기는 새로 만든 표면이며 원본 CodePen 구조는 확보하지 못했습니다.
- 이동 목표를 지정하는 세 입력
convertToPath()
- 반환 경로와 연결된 DOM은 다를 수 있음
여섯 기본 SVG 도형은 새로 그렸습니다. convertToPath에 swap을 전달한 뒤 반환된 path의 tagName·isConnected·d 길이를 표시합니다. swap:false이면 기존 기본 도형은 남고 반환 경로는 분리되므로 모핑 버튼을 막습니다. 초기화는 기본 도형을 다시 만들고 참조를 다시 읽어 제거된 노드를 재사용하지 않습니다.
- 반환 경로와 연결된 DOM은 다를 수 있음
easeReverse - UI interactions
- 드롭다운 외형과 실제 입력 계약
Options는 button이지만 메뉴 항목은 div이고 expanded 상태, 메뉴 역할, 키보드 항목 이동은 없습니다. 물음표도 div에 mouseenter·mouseleave만 연결됩니다. 이 예제는 easing 비교이며 완성된 접근성 메뉴나 툴팁의 구현으로 분류하지 않습니다.
- 드롭다운 외형과 실제 입력 계약
Edit a path in the browser
- 정렬된 이동과 드래그 편집의 경계
문서는 path·align을 같은 #path로 지정하고 alignOrigin:[0.5,0.5]인 트윈을 MotionPathHelper.create에 전달합니다. 동반 예제는 새 SVG와 다시 재생 버튼을 제공합니다. 경로 제어점은 라이브러리가 만들며 독립적인 키보드 좌표 편집기를 추가한 예제는 아닙니다.
- 정렬된 이동과 드래그 편집의 경계
FLIP gallery modal
- 같은 시각 요소의 배치와 대화상자 수명
독립 예제는 열기 전에 Flip.getState로 실제 요소를 측정한 뒤 같은 노드를 native dialog로 옮깁니다. 닫기는 열린 상태 측정→dialog.close→부모·형제 순서 복원→Flip.from 순서이며 완료 뒤 원래 버튼에 초점을 돌립니다. 등장 중 닫기는 한 번 대기하고 경쟁하는 열기는 무시합니다. 두 모달 ID는 공식 카탈로그의 동일한 Pen XWOeLEb를 가리켜 이 독립 구현을 공유하며, 원본의 모달 방식이나 초점 처리를 복구한 것은 아닙니다.
- 같은 시각 요소의 배치와 대화상자 수명
Make elements draggable
- 세 드래그 모드와 대체 입력
flair--1은 x만 움직이고 container 경계를 사용합니다. flair--3b는 rotation과 inertia, flair--4b는 두 축의 이동과 inertia를 사용합니다. 원본은 세 물리적 조작만 비교하며 같은 값을 정하는 버튼이나 키보드 입력을 제공하지 않습니다.
- 세 드래그 모드와 대체 입력
Observe events
- 한 입력에서 분리한 세 표시 채널
Observer는 wheel·touch·scroll·pointer를 받아 가장 큰 축 속도를 clamp·mapRange로 ±800도에 매핑합니다. 방향 화살표는 rotate에서 0.2초 이동 중 새 방향을 버리고, 누름·해제는 화살표 배율을 따로 바꿉니다. preventDefault:true이며 키보드 방향 조작은 제공하지 않습니다.
- 한 입력에서 분리한 세 표시 채널
Simple Animation
- 현재 값과 명시한 시작·도착 값
세 트랙의 기본 x는 80입니다. 새 효과를 만들기 전 rest가 모두 80으로 복원하고 to는 160으로, from은 지정한 0에서 현재 80으로, fromTo는 명시한 0에서 160으로 향합니다. 초기 렌더링과 트윈 생성 시점을 구분하며 매번 중간값을 새 도착값으로 삼지 않습니다.
- 현재 값과 명시한 시작·도착 값
Simple Grid FLIP Modal
- 같은 시각 요소의 배치와 대화상자 수명
독립 예제는 열기 전에 Flip.getState로 실제 요소를 측정한 뒤 같은 노드를 native dialog로 옮깁니다. 닫기는 열린 상태 측정→dialog.close→부모·형제 순서 복원→Flip.from 순서이며 완료 뒤 원래 버튼에 초점을 돌립니다. 등장 중 닫기는 한 번 대기하고 경쟁하는 열기는 무시합니다. 두 모달 ID는 공식 카탈로그의 동일한 Pen XWOeLEb를 가리켜 이 독립 구현을 공유하며, 원본의 모달 방식이나 초점 처리를 복구한 것은 아닙니다.
- 같은 시각 요소의 배치와 대화상자 수명
지구본 경로와 압축 제목
- 지구본 경로와 압축 제목의 구현 계약
경로 버튼의 선택값을 지구본 각도와 텍스트 기록에 함께 연결합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 지구본 경로와 압축 제목의 구현 계약
노선 지도와 입력 오버레이
- 노선 지도와 입력 오버레이의 구현 계약
네이티브 select가 노선 강조와 현재 노선 설명을 함께 바꾸며 가상 지도 위에서도 입력 표면을 보존합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 노선 지도와 입력 오버레이의 구현 계약
인물 그림과 대형 에디토리얼 이름
- 인물 그림과 대형 에디토리얼 이름의 구현 계약
새로 그린 인물 위에서 큰 이름과 작은 설명의 읽기 계층을 구분하고 수평 구획이 제목에 가려지지 않게 합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 인물 그림과 대형 에디토리얼 이름의 구현 계약
꽃잎 이미지 마스크와 혼합 서체
- 꽃잎 이미지 마스크와 혼합 서체의 구현 계약
제목의 정체·이탤릭 대비와 꽃잎 마스크를 구분하고 추가 설명은 네이티브 disclosure로 열고 닫습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 꽃잎 이미지 마스크와 혼합 서체의 구현 계약
원근 카드 뒤의 대화 입력
- 원근 카드 뒤의 대화 입력의 구현 계약
입력 표면의 초점·확인 결과와 뒤쪽 카드의 원근 장식을 분리하고 실제 네트워크 요청 없이 입력 상태만 확인합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 원근 카드 뒤의 대화 입력의 구현 계약
눈금과 손그림 표시의 포트폴리오
- 눈금과 손그림 표시의 포트폴리오의 구현 계약
측정 눈금과 손그림 밑줄은 장식으로 숨기고 이름과 설명은 실제 텍스트로 유지해 표현 계층을 비교합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 눈금과 손그림 표시의 포트폴리오의 구현 계약
픽셀 번호의 순서형 목록
- 픽셀 번호의 순서형 목록의 구현 계약
실제 순서는 ol이 소유하고 픽셀 번호는 장식으로 둡니다. 항목별 설명은 독립된 disclosure 상태를 가집니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 픽셀 번호의 순서형 목록의 구현 계약
기하 글자 포스터와 하단 탐색
- 기하 글자 포스터와 하단 탐색의 구현 계약
기하 도형은 읽기 순서에서 제외하고 실제 제목을 별도로 제공합니다. 하단 탐색은 버튼의 선택과 설명을 함께 바꿉니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 기하 글자 포스터와 하단 탐색의 구현 계약
채소 캐릭터와 말풍선 설명
- 채소 캐릭터와 말풍선 설명의 구현 계약
새로 그린 캐릭터와 말풍선을 대형 글자 위에 겹치되 말풍선의 의미를 일반 설명에도 제공합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 채소 캐릭터와 말풍선 설명의 구현 계약
번호형 프로젝트 화면 묶음
- 번호형 프로젝트 화면 묶음의 구현 계약
프로젝트 묶음과 개별 자체 그림의 구획을 분리하고 선택된 보기에서 같은 항목의 경계를 강조합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 번호형 프로젝트 화면 묶음의 구현 계약
타원형 이미지 군집과 보기
- 타원형 이미지 군집과 보기의 구현 계약
각 그림의 식별과 순서를 유지한 채 타원 군집과 열린 배열 사이의 보기 상태를 바꿉니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 타원형 이미지 군집과 보기의 구현 계약
언어와 밝기의 독립 설정
- 언어와 밝기의 독립 설정의 구현 계약
언어 상태와 시각 밝기를 별도로 보관하고 각 버튼의 선택 표시가 다른 선호를 초기화하지 않게 합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 언어와 밝기의 독립 설정의 구현 계약
일러스트 포스터의 버튼 팬·줌
- 일러스트 포스터의 버튼 팬·줌의 구현 계약
가상 풍경을 버튼과 키보드 활성화로 같은 제한된 좌표·확대값에 이동시키며 처음 위치로 복구할 수 있게 합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 일러스트 포스터의 버튼 팬·줌의 구현 계약
노란 선으로 강조하는 인물 소개
- 노란 선으로 강조하는 인물 소개의 구현 계약
노란 선의 장식과 노란 CTA의 조작 역할을 분리하고 제목을 실제 텍스트로 유지합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 노란 선으로 강조하는 인물 소개의 구현 계약
브라운관 장치의 시작 인터페이스
- 브라운관 장치의 시작 인터페이스의 구현 계약
장치 그림과 실제 시작 버튼을 구분하고 입력 후 나타나는 문구를 버튼 활성화의 결과로 표시합니다. AI 응답을 흉내내지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 브라운관 장치의 시작 인터페이스의 구현 계약
실내 장면의 두 단계 탐색
- 실내 장면의 두 단계 탐색의 구현 계약
보조 섹션 선택과 예약 정보 공개를 별도 상태로 유지하고 예약을 실행하지 않는 안내임을 결과에 명시합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 실내 장면의 두 단계 탐색의 구현 계약
꽃 표식의 호형 단계 선택
- 꽃 표식의 호형 단계 선택의 구현 계약
호 위 꽃 표식의 버튼 선택과 중앙 설명이 같은 단계값을 읽으며 숫자로 현재 단계를 추가 표시합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 꽃 표식의 호형 단계 선택의 구현 계약
분산 세리프 제목과 곡선 경계
- 분산 세리프 제목과 곡선 경계의 구현 계약
문장 조각의 DOM 순서를 유지하며 시각 위치를 분산하고 두 안내 버튼이 서로 다른 설명을 선택하도록 합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 분산 세리프 제목과 곡선 경계의 구현 계약
둥근 캠페인 미디어와 모서리 카드
- 둥근 캠페인 미디어와 모서리 카드의 구현 계약
큰 제목과 모서리 카드가 맞물리되 카드의 설명은 독립된 읽기 영역으로 유지하고 좁은 화면에서는 전체 폭으로 전환합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 둥근 캠페인 미디어와 모서리 카드의 구현 계약
패널 경계를 넘는 공업 형상
- 패널 경계를 넘는 공업 형상의 구현 계약
경계를 넘는 새 공업 도형과 실제 설명을 분리하고 추가 구성 설명은 패널 안에서 공개해 겹침 책임을 명확히 합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 패널 경계를 넘는 공업 형상의 구현 계약
공책 질감과 기울어진 수료증
- 공책 질감과 기울어진 수료증의 구현 계약
실제 인증이나 구매 없이 새 수료증 이미지를 만들고 공책 선·강조·추가 메모가 읽기 순서를 바꾸지 않게 합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 공책 질감과 기울어진 수료증의 구현 계약
어두운 통계 미리보기의 이중 행동
- 어두운 통계 미리보기의 이중 행동의 구현 계약
실제 서비스 효능이나 보안 수치 없이 가상 통계의 표시 범위를 두 버튼으로 바꾸고 차트의 표본 경계를 명시합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 어두운 통계 미리보기의 이중 행동의 구현 계약
과일 형상 주변의 손그림 주석
- 과일 형상 주변의 손그림 주석의 구현 계약
자체 과일 형상의 각도를 range 한 값으로 제어하고 손그림 주석은 별도 텍스트로 유지해 센서 의존을 만들지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 과일 형상 주변의 손그림 주석의 구현 계약
흩어진 작업 창과 이탤릭 이름
- 흩어진 작업 창과 이탤릭 이름의 구현 계약
서로 다른 크기의 자체 작업 창을 이름 주변에 배치하고 네 소개 상태를 명시적 버튼으로 선택합니다. 썸네일은 장식이고 조작 가능하다고 표현하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 흩어진 작업 창과 이탤릭 이름의 구현 계약
엇갈린 작업 열과 압축 직무 제목
- 엇갈린 작업 열과 압축 직무 제목의 구현 계약
자체 작업 미리보기를 서로 다른 높이의 열로 배치하고 압축 제목·필기체 보조 문장·현재 보기 표시를 독립적으로 유지합니다. 배경 열의 원본 이동 방식은 주장하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 엇갈린 작업 열과 압축 직무 제목의 구현 계약
두 서체 제목과 번호 있는 작업 행
- 두 서체 제목과 번호 있는 작업 행의 구현 계약
산세리프와 이탤릭 제목 옆에 자체 추상 기둥을 놓고 각 프로젝트 행을 이름이 있는 disclosure로 구현합니다. 낮은 대비 반복 글자는 장식이며 파괴·물리 동작을 포함하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 두 서체 제목과 번호 있는 작업 행의 구현 계약
업무 그림 위 곡선과 가상 진행 표시
- 업무 그림 위 곡선과 가상 진행 표시의 구현 계약
자체 업무 그림의 곡선 장식과 반투명 수치 카드를 분리합니다. 완료 항목 수가 원형 표시·텍스트·progressbar 값에 함께 반영되며 모든 수치는 가상 데이터입니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 업무 그림 위 곡선과 가상 진행 표시의 구현 계약
가상 관측 지구와 필터·목록
- 가상 관측 지구와 필터·목록의 구현 계약
가상 지구 도면·범주 필터·모든 점의 일반 목록을 제공합니다. 회전과 확대에는 네이티브 버튼이 있고 선택 수치와 지점 설명은 그림 밖에서 읽을 수 있습니다. 거래·점유·광고 기능은 포함하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 가상 관측 지구와 필터·목록의 구현 계약
실내 그림 모서리에 놓인 저널 카드
- 실내 그림 모서리에 놓인 저널 카드의 구현 계약
크림색 저널 제목과 자체 실내 그림의 모서리에 새 기사 카드를 놓습니다. 좁은 화면에서는 카드가 자연스러운 문서 흐름으로 이어지며 원문 기사나 이미지는 사용하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 실내 그림 모서리에 놓인 저널 카드의 구현 계약
실험 목록의 이미지·설명·사양 행
- 실험 목록의 이미지·설명·사양 행의 구현 계약
이미지·실행·제작 설명·이름과 값의 사양을 서로 다른 의미로 유지합니다. 밝기 조절은 새로 만든 로컬 실험이며 원본 링크의 동작을 재현한 것은 아닙니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 실험 목록의 이미지·설명·사양 행의 구현 계약
드롭캡과 콜라주를 둔 긴 챕터
- 드롭캡과 콜라주를 둔 긴 챕터의 구현 계약
큰 배경 글자는 장식으로 제외하고 실제 인용형 제목과 본문을 논리적 순서로 읽게 합니다. 전기 원문과 음악 자료를 사용하지 않은 가상 전시입니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 드롭캡과 콜라주를 둔 긴 챕터의 구현 계약
거리 장면 위 한 줄 프로젝트 메타데이터
- 거리 장면 위 한 줄 프로젝트 메타데이터의 구현 계약
제목 다음에 장소·종류·형식·연도를 이름과 값으로 배치합니다. 공개 프레임의 관계만 사용했으며 유료 템플릿 소스·사진·구매 제어를 가져오지 않았습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 거리 장면 위 한 줄 프로젝트 메타데이터의 구현 계약
넓은 숙소 그림과 한 행동의 알약·원 제어
- 넓은 숙소 그림과 한 행동의 알약·원 제어의 구현 계약
맞붙은 알약과 원은 각각 하나의 버튼·summary 안에 있어 포커스와 행동이 중복되지 않습니다. 방문 계획은 입력 확인만 수행하고 실제 예약을 만들지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 넓은 숙소 그림과 한 행동의 알약·원 제어의 구현 계약
밝은 카드 부채와 프로젝트 선택
- 밝은 카드 부채와 프로젝트 선택의 구현 계약
카드의 시각적 회전과 읽기 순서를 분리합니다. 다섯 버튼은 DOM 순서로 탐색되며 선택 이름과 설명을 별도로 제공하고 드래그를 요구하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 밝은 카드 부채와 프로젝트 선택의 구현 계약
Radial Glow Background · Gold
- 배경 레이어와 콘텐츠의 경계
min-h-screen인 relative 부모가 배경의 범위를 정하고 absolute inset-0 z-0 자식이 그 영역을 덮습니다. 콘텐츠는 주석 자리뿐이며 pointer-events-none은 없습니다. 버튼이나 제목을 추가할 때 읽기 구조와 레이어·포인터 관계를 제품에서 정해야 합니다.
- 배경 레이어와 콘텐츠의 경계
Radial Glow Background · Blue
- 색상 배경은 완성된 화면이 아니다
원본은 bg-[#0f172a] 부모와 그라데이션 자식뿐입니다. min-h-screen은 임베드된 문서의 뷰포트를 기준으로 최소 높이를 만들고, 테마 변경용 변수나 상태는 없습니다. 이 갤러리에서도 배경 자체의 색은 호스트 테마와 무관하게 원본을 유지합니다.
- 색상 배경은 완성된 화면이 아니다
Spinner · Kibo
- 변형마다 다른 상태 의미
default가 사용하는 ShadcnSpinner에는 role=status와 aria-label=Loading이 있습니다. 다른 변형은 Lucide 아이콘 또는 title이 있는 SVG로 구성되어 같은 의미가 자동으로 보장되지는 않습니다. 실제 제품에서는 어느 영역이 대기 문구와 상태 알림을 소유하는지 정해야 합니다.
- 변형마다 다른 상태 의미
Icon Accordion · Myna UI
- 목록 데이터와 실제 계정 작업의 구분
accordionData에는 안내 4개와 각 단계 4개가 들어 있습니다. content 배열은 li로 렌더링되며 계정 생성·초대·설정 변경 콜백은 없습니다. 아이콘은 제목 옆의 보조 표현입니다.
- 순서로 만든 항목 ID의 범위
원본은 고정 배열의 index로 key와 item 값을 만듭니다. 현재의 단일·접기 가능 루트에는 맞지만 데이터를 재정렬하는 소비자는 열린 항목이 같은 의미를 유지하는지 따로 정해야 합니다. wrapper에는 max-w-7xl과 max-w-[400px]가 동시에 남아 있습니다.
- 목록 데이터와 실제 계정 작업의 구분
Form Section Accordion · Myna UI
- 플레이스홀더와 완료 표식의 한계
여덟 필드는 placeholder로만 이름을 보여 주고 label·id 연결을 제공하지 않습니다. FormSection 타입의 isComplete는 조건부 체크 표시를 허용하지만 원본 sections는 값을 넣지 않으며 검사 로직도 없습니다.
- 플레이스홀더와 완료 표식의 한계
Minimal Alerts · Myna UI
- 아이콘 없이 남는 제목과 설명
이 변형은 SVG 없이 AlertTitle과 AlertDescription만 사용합니다. primitive는 제목을 h5, 설명을 div, 바깥을 role="alert"인 div로 렌더링합니다. 화면에 넣을 때 제목 수준과 두 알림의 발표 맥락을 소비자가 검토해야 합니다.
- 아이콘 없이 남는 제목과 설명
Destructive Alert Dialog · Myna UI
- 계속 버튼은 삭제 요청이 아니다
Continue는 destructive 스타일의 AlertDialogAction입니다. 원본에는 onClick, 계정 ID, 요청, 완료 상태가 없습니다. primitive의 Action에 닫힘을 위임할 뿐 계정 삭제를 구현하지 않습니다.
- 계속 버튼은 삭제 요청이 아니다
Icon Alert Dialog · Myna UI
- 휴지통 그림과 계정 삭제의 책임
Trash2를 감싼 요소는 aria-hidden="true"이고 제목과 설명이 삭제 의도를 전달합니다. Continue에는 destructive 클래스만 연결되어 있어 계정 삭제 요청이나 완료 피드백은 없습니다.
- 휴지통 그림과 계정 삭제의 책임
Reverse Avatar Group · Myna UI
- 역방향 배치와 원래 문서 순서
세 Avatar의 DOM 순서는 그대로이고 flex-row-reverse와 space-x-reverse로 보이는 방향을 뒤집습니다. 배열을 재정렬하거나 사용자 순위를 계산하는 코드는 없습니다. 각 Avatar는 버튼이나 링크도 아닙니다.
- 이미지 실패와 대체 정보
원본은 CDN 이미지 3개만 렌더링하며 alt와 AvatarFallback을 제공하지 않습니다. primitive가 Fallback을 export하더라도 데모가 사용하지 않으면 대체 이름이나 이니셜이 자동으로 생기지 않습니다. 로컬 이미지 연결은 호스트 어댑터의 별도 책임입니다.
- 역방향 배치와 원래 문서 순서
Avatar Group · Myna UI
- 사진의 이름은 소스에 없다
세 AvatarImage에 대체 텍스트가 없고 AvatarFallback도 렌더링하지 않습니다. primitive는 전달된 props를 Image로 넘기지만 이름을 만들어 주지 않습니다. 따라서 원본에서 누가 누구인지 알 수 있는 계약은 제공되지 않습니다.
- 사진의 이름은 소스에 없다
Icon Banner · Origin UI
- 닫기만 실제 상태를 바꾸는 배너
닫기는 BannerWithIcon의 isVisible을 false로 바꾸고 함수가 null을 반환하게 합니다. Try now에는 핸들러가 없습니다. 두 버튼 모두 기본 Button 경로를 쓰며, 닫기 이후의 초점 이동이나 표시 상태 저장 코드는 없습니다.
- 닫기만 실제 상태를 바꾸는 배너
Link Buttons Banner · Origin UI
- 링크 모양도 이 예제에서는 버튼
Download는 기본 변형이고 Learn more는 variant="link"인 Button입니다. 둘 다 asChild를 쓰지 않으므로 작성자 프리미티브의 button 경로를 사용합니다. 다운로드 처리, 탐색 목적지, onClick은 두 CTA 모두에 없습니다.
- 링크 모양도 이 예제에서는 버튼
Upgrade Banner · Origin UI
- 업그레이드 문구와 탐색 계약
원본 Upgrade는 href="#" 앵커이며 회원권 상태나 결제 처리가 없습니다. 작성자 예제용 호스트는 라이브 DOM에서 href와 target을 제거하고 앵커 클릭의 기본 동작을 막습니다. 원본 코드의 링크 표현은 보존되지만 미리보기에서 실제 업그레이드를 수행하지 않습니다.
- 업그레이드 문구와 탐색 계약
Centered Button Banner · Origin UI
- 둥근 CTA와 닫기의 서로 다른 결과
rounded-full은 Learn more의 모양만 바꾸며 해당 버튼에는 핸들러가 없습니다. Close banner는 setIsVisible(false)를 호출합니다. Banner의 isClosable을 사용한 예제가 아니라 데모가 직접 닫기 버튼을 배치한 구성입니다.
- 둥근 CTA와 닫기의 서로 다른 결과
Two Buttons Banner · Origin UI
- 기본·외곽선 버튼의 실행 범위
Download는 기본 Button, Learn more는 outline 변형입니다. 둘 다 onClick·asChild·목적지가 없으며, 기본 button 요소에 작성자 변형 스타일만 적용됩니다. 외곽선이 있는 두 번째 버튼을 링크나 별도 기능이 완성된 행동으로 해석하지 않습니다.
- 기본·외곽선 버튼의 실행 범위
Link Banner · Origin UI
- 정적 링크 표현의 입력 범위
Learn more는 href="#"이고 화살표만 호버 때 이동합니다. 표시 상태나 닫기 이벤트는 없으며 Banner에 isClosable도 전달하지 않습니다. 호스트는 앵커 목적지를 제거하므로 현재 미리보기에서 후속 페이지로 이동하는 기능은 없습니다.
- 정적 링크 표현의 입력 범위
Countdown Banner · Origin UI
- 숨김과 타이머 정리의 다른 시점
효과는 즉시 남은 시간을 계산하고 1초 interval에서 종료 시각과 현재 시각의 차이를 다시 구합니다. 차이가 0 이하이면 만료시키고, 닫기 또는 만료 시 렌더링만 null로 바꿉니다. clearInterval은 효과 정리 함수에 있으므로 표시가 사라져도 컴포넌트가 마운트된 동안 interval은 남습니다.
- 숨김과 타이머 정리의 다른 시점
Closable Banner · Origin UI
- 콘텐츠와 프리미티브 닫기 영역의 조합
본문과 Learn more는 데모의 flex-col·md:flex-row 자식에 들어갑니다. 프리미티브는 기본 row 구조에서 별도 행동 영역에 닫기를 추가합니다. Learn more는 href="#"이고 호스트에서 목적지가 제거되며, 닫기는 실제 상태 변경을 수행합니다.
- 콘텐츠와 프리미티브 닫기 영역의 조합
Human Review Panel · Extend UI
- Form과 JSON이 같은 검토 값을 읽기
초기 activeTab은 form이며 두 탭 내용에는 keepMounted를 전달합니다. Form에서 바뀐 expected를 JSON의 split diff가 actualValues와 비교합니다. 숫자 입력을 비우면 null, 다른 숫자는 Number로 변환하고 boolean은 True·False 버튼으로 바꿉니다. 타입 변환은 완전한 스키마 검증이나 저장 승인이 아닙니다.
- Form과 JSON이 같은 검토 값을 읽기
Arrow Breadcrumb · Myna UI
- 현재 위치와 이동 가능한 조상
Dashboard와 Reports는 각각 /와 /reports 링크이고 Export는 BreadcrumbPage입니다. primitive는 Export를 aria-current="page"와 aria-disabled="true"인 span으로 만듭니다. 표시된 경로가 미리보기 안에 목적지 페이지를 구현하는 것은 아닙니다.
- 현재 위치와 이동 가능한 조상
Supabase Style Button · Serafim
- 반복 입력 차단과 타이머 수명
disabled={isLoading}은 작성자 Button을 통해 네이티브 button에 전달되어 대기 중 사용자 재활성화를 막습니다. handleClick 내부에는 별도 실행 중 가드가 없고 timeout 핸들도 저장하지 않습니다. 컴포넌트 제거 시 timeout을 명시적으로 취소하는 코드도 없습니다.
- 반복 입력 차단과 타이머 수명
Button Groups · Myna UI
- 묶인 버튼과 페이지 상태
첫 묶음은 Prev·Next, 둘째는 Prev·Now·Next입니다. onClick, 현재 값, disabled 경계가 없어서 페이지나 날짜를 바꾸지 않습니다. Button은 asChild가 없을 때 button 요소를 렌더링합니다.
- 묶인 버튼과 페이지 상태
Split Button · Myna UI
- 두 버튼 각각의 접근 가능한 이름
Send Now에는 텍스트가 있지만 오른쪽 버튼은 아이콘만 있고 aria-label이나 숨긴 문구가 없습니다. imported Button도 이름이나 type의 기본값을 추가하지 않습니다. 소비자가 form 안에 옮기면 타입과 두 명령의 이름을 명시해야 합니다.
- 두 버튼 각각의 접근 가능한 이름
Simple Command List · Myna UI
- 단축키 문구와 실행 핸들러
CommandItem에 onSelect가 없고 CommandShortcut은 span만 렌더링합니다. 따라서 New File·Undo·Refresh의 문구와 ⌘ 키 표시는 파일 생성·실행 취소·새로고침 코드를 추가하지 않습니다.
- 단축키 문구와 실행 핸들러
Dense Command List · Myna UI
- 북마크 검색 UI와 실제 북마크 상태
검색은 cmdk의 CommandInput이 담당하지만 Delete Bookmark, Logout, Theme Settings에는 onSelect가 없습니다. 고정 문구와 shortcut span만 있어 북마크 삭제나 로그인·테마 상태를 바꾸지 않습니다.
- 북마크 검색 UI와 실제 북마크 상태
Profile Context Menu · Myna UI
- 프로필 명령 12개의 실행 범위
View Profile부터 Logout까지 12개 항목은 아이콘과 문구만 있고 href·onSelect가 없습니다. PJ는 AvatarFallback 텍스트라 외부 사진이 필요하지 않습니다. 메뉴의 닫힘을 프로필 변경이나 로그아웃으로 해석하지 않습니다.
- 프로필 명령 12개의 실행 범위
CPU Architecture · Gamma UI
- 여러 SVG를 함께 넣을 때의 식별자 계약
마스크·그라데이션·필터·마커는 cpu-mask-1 같은 고정 ID와 url(#...) 참조를 사용합니다. 인스턴스별 접두사는 없고 svg에는 title·desc·접근 가능한 이름을 직접 선언하지 않습니다. 이 그림을 장식으로 둘지 설명이 필요한 CPU 구조로 둘지는 소비 제품이 정해야 합니다.
- 여러 SVG를 함께 넣을 때의 식별자 계약
Content Dialog · Myna UI
- 세션 만료 안내와 로그인 버튼
Please login again은 고정 제목이고 원본에는 세션 검사나 로그인 처리·form이 없습니다. Login은 type="submit"인 일반 Button이고 Cancel만 DialogClose로 감싸 닫힙니다.
- 세션 만료 안내와 로그인 버튼
Add Task Dialog · Myna UI
- 담당자 선택과 작업 생성은 별개
Task Name 입력과 Adam·Ruth·Taylor 세 SelectItem이 있습니다. value·onValueChange를 바깥 상태와 연결하지 않고 Add에는 onClick·form이 없습니다. 선택 표시를 바꾸는 primitive 동작이 있어도 새 작업을 생성하지 않습니다.
- 담당자 선택과 작업 생성은 별개
Login Dialog · Myna UI
- 폼 밖의 submit 버튼
email·password는 required인 form 안의 입력이지만 Login 버튼은 form 뒤 DialogFooter에 있습니다. form 속성으로 연결하지도 않으며 onSubmit이 없습니다. 버튼의 type="submit"만으로 이 폼의 검사나 인증 요청이 수행되지는 않습니다.
- 로그인 필드의 이름과 임시 값
email과 password는 Label의 htmlFor와 연결되고 autocomplete은 username·current-password입니다. value·onChange나 초안 저장은 없습니다. Cancel과 기본 Close가 표면을 닫은 뒤 값이 유지되는지는 재마운트와 브라우저 자동완성을 나누어 확인해야 합니다.
- 폼 밖의 submit 버튼
Content Drawer · Myna UI
- 안내 문단과 인증 실행의 경계
Please login again은 고정 제목이고 설명은 DrawerDescription 대신 p입니다. Login에는 form이나 요청 핸들러가 없습니다. wrapper의 shouldScaleBackground 기본값은 true지만 배경 구성과 실제 효과는 호스트 조건에 달려 있습니다.
- 안내 문단과 인증 실행의 경계
Login Drawer · Myna UI
- 서랍의 폼과 분리된 로그인 버튼
required인 이메일·비밀번호는 form 안에 있고 Login은 그 뒤 DrawerFooter에 있습니다. form 속성·onSubmit·인증 호출이 없어 버튼 클릭이 해당 폼의 제출이나 검사에 연결되지 않습니다.
- 서랍의 폼과 분리된 로그인 버튼
Help Dropdown · Myna UI
- 물음표 트리거의 이름
트리거는 asChild로 원형 Button을 사용하며 자식은 Question 아이콘뿐입니다. aria-label, title, 숨긴 문구가 없고 Button primitive도 이름을 추가하지 않습니다. 메뉴 역할이 존재해도 트리거 이름의 빈틈은 별도입니다.
- 물음표 트리거의 이름
Profile Dropdown · Myna UI
- 권한 체크는 권한 변경 API가 아니다
Admin에는 checked가 고정되고 Member에는 checked·onCheckedChange가 없으며 Customer는 disabled입니다. 세 항목 모두 권한 상태나 서버 API와 연결되지 않습니다. primitive는 받은 checked를 전달하므로 표시만 보고 쓰기 가능성을 추론하지 않습니다.
- 권한 체크는 권한 변경 API가 아니다
Folder Dropdown · Myna UI
- 폴더 이름과 다섯 고정 명령
Folder Name은 고정 문구이고 폴더 ID나 파일 목록이 없습니다. New Folder·Share·Move Folder·Download·Remove는 모두 콜백 없는 메뉴 항목입니다. 닫힘이나 강조 표시는 파일 작업의 성공이 아닙니다.
- 폴더 이름과 다섯 고정 명령
Tag Input Form · Ved UI
- 빈 태그 목록과 중복의 허용 범위
초기 태그는 Plumbus Care, Interdimensional Cable, Gazorpazorpfield 세 개입니다. 스키마의 min(1)은 문자열에만 적용되며 배열의 최소 길이나 중복 금지는 없습니다. 제출은 태그 배열을 콘솔에 기록하고 태그 수를 toast에 표시하며 저장 요청은 없습니다.
- 태그별 삭제 대상과 초점
태그는 useFieldArray의 field.id를 키로 쓰고 삭제는 현재 index를 remove에 넘깁니다. 삭제 버튼은 type=button으로 제출과 분리하지만, 모든 버튼의 숨김 이름은 같은 Remove tag입니다. 삭제 뒤 초점을 옮기는 코드는 없으므로 반복 삭제의 대상 식별과 초점 회복은 별도 검증 대상입니다.
- 빈 태그 목록과 중복의 허용 범위
Calendar Form · Ved UI
- 달력에서 막는 날짜와 폼 검사의 차이
달력의 disabled는 현재 시각 이후와 1900-01-01 이전 날짜를 막습니다. FormSchema는 dob가 Date인지만 선언하고 같은 상하한 검사를 추가하지 않습니다. UI를 거치지 않는 폼 값 갱신까지 생년월일 범위가 보호된다고 볼 수 없습니다.
- 달력에서 막는 날짜와 폼 검사의 차이
Input Form · Ved UI
- 레이블·오류와 입력의 연결
작성자 FormLabel은 FormItem의 useId를 바탕으로 입력을 가리킵니다. FormControl은 오류 상태에 따라 aria-invalid와 메시지 ID를 넘깁니다. FormInput은 FormDescription을 렌더링하지 않는데 기본 aria-describedby에는 설명 ID가 포함되므로 실제 관계를 점검할 필요가 있습니다.
- 레이블·오류와 입력의 연결
MultiSelect Form · Ved UI
- 선택 제거가 제출에 섞이지 않는지 확인
선택 배지의 제거 버튼은 aria-label=Remove를 사용하고 onClick과 Enter 키 처리에서 handleUnselect를 호출합니다. 해당 버튼에는 type이 없으며, 같은 파일의 Clear all 버튼에는 type=button이 있습니다. 각 제거가 한 번의 선택 변경만 내보내는지와 폼 제출에 섞이는지는 원본 상태로 확인할 필요가 있습니다.
- 선택 제거가 제출에 섞이지 않는지 확인
Dual Range Form · Ved UI
- 같은 끝값은 유효한 범위가 아니다
슬라이더는 min=0, max=100, step=1이며 폼은 숫자 두 개, 첫 값 < 둘째 값, 0~100 경계를 검사합니다. 값 변경 때 shouldValidate=true로 검사하고 FormMessage를 렌더링합니다. 두 핸들 사이의 최소 간격을 지정하는 prop은 이 예제에 없습니다.
- 두 핸들의 입력 경로와 이름
작성자 Slider는 값 배열 길이만큼 Radix Thumb을 만듭니다. 각 Thumb에는 하한·상한을 구별하는 이름을 직접 지정하지 않고, 폼은 전체 범위에 FormLabel과 output을 제공합니다. 별도 숫자 입력이나 증감 버튼은 없으므로 트랙 클릭과 키보드로 같은 목표 범위에 도달하는지 확인해야 합니다.
- 같은 끝값은 유효한 범위가 아니다
Grouped Input · Serafim
- 입력 예제에 아직 없는 폼 계약
입력에는 id="name"과 placeholder만 있고 연결된 label·aria-label은 없습니다. value·onChange도 지정하지 않은 네이티브 입력이며, 바깥은 form이 아닌 div입니다. Submit 버튼에는 제출 처리나 검증 코드가 없어 입력 값을 저장하는 기능은 없습니다.
- 입력 예제에 아직 없는 폼 계약
Inverted Cursor · Gamma UI
- 숨긴 기본 커서와 장식 레이어의 입력 범위
Cursor의 바깥 레이어는 absolute inset-0 cursor-none이고, 안쪽 원만 pointer-events-none과 aria-hidden=true입니다. 입력은 mousemove·mouseenter·mouseleave만 구독합니다. baseline은 h-96 영역 안에 Move your mouse 제목을 두며 키보드·터치·모션 감소에 따른 별도 커서 경로는 이 컴포넌트에 없습니다.
- 숨긴 기본 커서와 장식 레이어의 입력 범위
Location Map · Gamma UI
- 좌표를 여는 입력과 확장 크기
카드의 motion.div는 onClick으로 isExpanded를 토글하고 좌표 문단은 펼쳤을 때만 렌더링합니다. 크기는 240×140에서 360×280으로 바뀝니다. 트리거 버튼·키보드 처리·aria-expanded가 없고 Click to expand 안내는 hover 중 접힌 상태에서만 보이도록 되어 있습니다.
- 좌표를 여는 입력과 확장 크기
Logo Timeline · Gamma UI
- 행 번호와 실제 지원하는 입력
원본 데모는 13개 로고를 일곱 행에 전달합니다. LogoTimeline은 row를 Map으로 묶고 숫자로 정렬한 뒤 존재하는 행 수만큼 균등 행을 만듭니다. 번호가 빠져도 빈 행을 예약하지 않습니다. 데모의 iconSize=18은 prop으로 전달되지만 컴포넌트 본문에서 아이콘에 적용하지 않고 logo.icon을 그대로 렌더링합니다.
- 제목과 로고 전체를 장식으로 숨긴 구조
LogoTimeline은 제목과 모든 로고를 감싸는 motion.div에 aria-hidden=true를 둡니다. 로고 아이콘만 숨기는 구조가 아니며 Built with the best tools 제목과 각 label도 같은 하위 트리에 있습니다. 장식으로 소비한다면 맞는 범위인지, 도구 목록이 의미 있는 정보라면 별도 읽기 경로가 필요한지 결정해야 합니다.
- 행 번호와 실제 지원하는 입력
Icon Menubar · Myna UI
- 탐색 문구와 실제 페이지
Overview·Create Collection·Shared Collections 등 9개 항목에는 href·onSelect가 없습니다. 메뉴바 자체는 h-9의 flex 행이고 트리거는 별도 반응형 줄바꿈을 지정하지 않으므로 긴 이름·좁은 부모도 검토할 대상입니다.
- 탐색 문구와 실제 페이지
Basic Pagination · Myna UI
- 링크·현재 위치·생략 기호
Pagination은 이름이 pagination인 nav이고 PaginationLink는 aria-current를 전달하는 a입니다. Ellipsis는 aria-hidden인 span이며 더보기 버튼이 아닙니다. Previous·Next에는 각각 접근 가능한 이름이 있습니다.
- 링크·현재 위치·생략 기호
Boxed Pagination · Myna UI
- 박스 형태와 페이지 상태는 독립
현재 숫자는 2로 고정되고 표시 페이지는 1·2·3·8·9·10입니다. isActive를 해석하는 primitive는 aria-current와 버튼 스타일만 바꿉니다. 모든 # 링크에는 조회나 페이지 변경 처리가 없습니다.
- 박스 형태와 페이지 상태는 독립
Text Popover · Myna UI
- 트리거 위치와 포털 콘텐츠
demo의 w-80이 primitive의 w-72와 cn으로 합쳐지고 기본 align은 center, sideOffset은 4입니다. 내용은 Portal에 렌더링합니다. 화면 가장자리·작은 프레임에서 실제 충돌 회피 결과를 확인해야 합니다.
- 트리거 위치와 포털 콘텐츠
User Popover · Myna UI
- 트리거와 카드의 같은 고정 프로필
트리거와 카드 모두 PJ를 AvatarFallback으로 표시하고 Praveen Juge라는 고정 이름을 사용합니다. 카드 이메일·소개도 고정 문자열입니다. 사진 로드나 사용자 조회 state는 없습니다.
- 트리거와 카드의 같은 고정 프로필
Add Book Popover · Myna UI
- 저장 처리 없는 네이티브 폼 제출
Add Book 버튼은 form 내부에 있지만 onSubmit·action·method를 선언하지 않습니다. title·author는 id만 있고 name·required도 없습니다. 호스트가 기본 제출을 막지 않으면 브라우저의 기본 폼 동작 대상이며 책을 저장할 코드가 아닙니다.
- 저장 처리 없는 네이티브 폼 제출
Progressive Blur Slider · Motion Primitives
- 원본 소스와 교체된 한 이미지의 구분
원래 배열은 Figma·Next.js·Supabase·Vercel 네 이미지입니다. 앞의 세 SVG는 확보한 바이트를 사용하고, 공개 서버가 403을 반환한 Vercel 한 자리에는 자체 제작 로딩 일러스트를 사용합니다. 번들에만 새 이미지와 대체 텍스트를 적용하며 다운로드 원본 배열과 컴포넌트는 수정하지 않았습니다.
- 원본 소스와 교체된 한 이미지의 구분
Tag Table With Sort Menu · 21st/shadcn
- 정렬 메뉴와 클릭 전용 열 제목
Sort by 메뉴는 이름·북마크 수·설명과 오름·내림의 두 RadioGroup을 실제 setSort에 연결합니다. Related Tags 정렬은 TableHead onClick에만 있고 메뉴에는 없습니다. TableHead는 th이며 button·tabIndex·aria-sort가 추가되지 않아 헤더의 포인터 정렬을 키보드 지원으로 볼 수 없습니다.
- 정렬 메뉴와 클릭 전용 열 제목
Bookmark Table With Search · 21st/shadcn
- 정렬 헤더·URL 문구·행 버튼의 실제 의미
헤더는 onClick만 있는 th라 버튼·tabIndex·aria-sort를 제공하지 않습니다. URL 셀의 표시 문구는 bookmark.url이지만 href="#"·target="_blank"입니다. Pencil·Trash2도 핸들러 없는 아이콘 버튼이므로 실제 편집·삭제나 링크 목적지 이동을 제공하지 않습니다.
- 정렬 헤더·URL 문구·행 버튼의 실제 의미
Table Column Visibility · 21st/shadcn
- 열을 모두 숨겼을 때 남는 것
handleColumnToggle에는 마지막 열을 남기는 제약이 없습니다. 모두 끄면 헤더·행의 셀은 0개이며 별도 안내는 없습니다. 사용자 링크는 #이고 Pencil·Trash2는 작업 핸들러가 없어 데이터 편집·삭제는 수행하지 않습니다.
- 열을 모두 숨겼을 때 남는 것
Account Tabs With Card · Myna UI
- 고정 계정 내용과 미연결 화살표
개요 2개·저장 항목 3개·그룹 3개·댓글 2개·백업 명령 2개는 원본 고정 문구입니다. 화살표 Button은 onClick이나 명시적 이름이 없으므로 이동·백업·복원을 실행하지 않습니다. TabsList는 한 줄 inline-flex이며 긴 다섯 이름을 축약하거나 스크롤할 자체 규칙은 없습니다.
- 고정 계정 내용과 미연결 화살표
Bookmark Toggle · Origin UI
- 툴팁 트리거와 실제 포커스 대상
TooltipTrigger asChild의 직접 자식은 Toggle이 아니라 div입니다. Toggle은 그 안에 있고 tooltip은 Portal로 렌더링됩니다. 따라서 포인터로 툴팁이 보인다는 사실만으로 키보드 초점과 설명 관계가 올바르다고 볼 수 없습니다. 버튼의 고정 이름과 pressed 의미는 툴팁과 따로 확인해야 합니다.
- 툴팁 트리거와 실제 포커스 대상
Basic Accordion · Smooth UI
- 접힌 본문은 유지하되 입력 대상에서 제외
공식 예제는 allowMultiple=true와 defaultExpandedIds=[1]로 시작합니다. 컴포넌트는 본문을 계속 마운트한 채 높이와 불투명도를 바꾸고, 접힌 본문에는 inert를 설정합니다. 버튼의 aria-expanded·aria-controls와 본문의 aria-labelledby도 같은 item.id를 사용합니다. ID에는 인스턴스별 접두어가 없어 여러 아코디언을 한 문서에 놓는 소비자는 중복을 검토해야 합니다.
- 접힌 본문은 유지하되 입력 대상에서 제외
Ellipsis Pattern Card · Indie UI
- 패턴 카드와 고정 예문을 조합하는 계약
공식 문서의 CardWithEllipsis 안에 CardBody를 놓은 구성을 연결했습니다. 카드에는 children을 넣을 수 있지만 CardBody의 입력은 className뿐이고 제목·설명은 cardContent의 고정 Lorem ipsum입니다. 과거 21st의 다른 Body API나 문구를 새로 만든 것이 아닙니다. SVG는 동일 작성자의 MIT 파일을 사용하고 로컬 CSS URL만 data URL로 바꿉니다.
- 패턴 카드와 고정 예문을 조합하는 계약
Grid Ellipsis Card · Indie UI
- 패턴 카드와 고정 예문을 조합하는 계약
공식 문서의 CardWithGridEllipsis 안에 CardBody를 놓은 구성을 연결했습니다. 카드에는 children을 넣을 수 있지만 CardBody의 입력은 className뿐이고 제목·설명은 cardContent의 고정 Lorem ipsum입니다. 과거 21st의 다른 Body API나 문구를 새로 만든 것이 아닙니다. SVG는 동일 작성자의 MIT 파일을 사용하고 로컬 CSS URL만 data URL로 바꿉니다.
- 패턴 카드와 고정 예문을 조합하는 계약
Grid Pattern Card · Indie UI
- 패턴 카드와 고정 예문을 조합하는 계약
공식 문서의 CardWithGrid 안에 CardBody를 놓은 구성을 연결했습니다. 카드에는 children을 넣을 수 있지만 CardBody의 입력은 className뿐이고 제목·설명은 cardContent의 고정 Lorem ipsum입니다. 과거 21st의 다른 Body API나 문구를 새로 만든 것이 아닙니다. SVG는 동일 작성자의 MIT 파일을 사용하고 로컬 CSS URL만 data URL로 바꿉니다.
- 패턴 카드와 고정 예문을 조합하는 계약
Lines Pattern Card · Indie UI
- 패턴 카드와 고정 예문을 조합하는 계약
공식 문서의 CardWithLines 안에 CardBody를 놓은 구성을 연결했습니다. 카드에는 children을 넣을 수 있지만 CardBody의 입력은 className뿐이고 제목·설명은 cardContent의 고정 Lorem ipsum입니다. 과거 21st의 다른 Body API나 문구를 새로 만든 것이 아닙니다. SVG는 동일 작성자의 MIT 파일을 사용하고 로컬 CSS URL만 data URL로 바꿉니다.
- 패턴 카드와 고정 예문을 조합하는 계약
정보 알림 · Origin UI
- 장식 아이콘 뒤의 본문 읽기
16px InfoIcon은 aria-hidden=true이며 문단 안에서 inline-flex로 텍스트 앞에 놓입니다. 아이콘 뒤에는 별도 제목 없이 p 한 개가 있고 role이나 aria-live는 선언하지 않습니다. 동적으로 삽입했을 때의 알림 전달은 이 정적 구조만으로 검증되지 않습니다.
- 장식 아이콘 뒤의 본문 읽기
닫기 버튼이 있는 경고 · Origin UI
- 닫기 이름과 실제 닫기 동작
comp-279의 경고 옆에는 Close notification 이름을 가진 ghost Button이 있습니다. XIcon은 숨기고 hover 때 투명도만 바꾸며 버튼에 onClick은 없습니다. 작성자 Button도 props를 button에 전달할 뿐 알림 제거 상태를 소유하지 않습니다.
- 닫기 이름과 실제 닫기 동작
방송 일정 알림 · Origin UI
- 알림 신청과 닫기는 연결되지 않은 버튼
Notify me는 size=sm Button이고 Close notification은 ghost Button입니다. 둘 다 처리기를 전달하지 않으며 컴포넌트에는 신청 여부나 닫힘 상태가 없습니다. Button 래퍼도 기본 type을 지정하지 않으므로 다른 폼 안에 넣을 때는 제출 동작과의 관계까지 확인해야 합니다.
- 알림 신청과 닫기는 연결되지 않은 버튼
오류 알림 · Origin UI
- 빨간 아이콘과 오류 전달은 별개
CircleAlert는 16px이며 aria-hidden=true입니다. 메시지는 일반 p이고 role=alert나 aria-live는 없습니다. 오류 문구가 처음부터 있는 정적 페이지와 작업 뒤 새로 추가되는 메시지는 알림 전달 조건이 같다고 가정할 수 없습니다.
- 빨간 아이콘과 오류 전달은 별개
쿠키 선택 안내 · Origin UI
- 설명·선택·닫기의 읽기 순서
개인정보 제목과 설명은 두 p이며 Accept·Decline은 그 아래 행에 있습니다. 바깥 flex 행의 마지막에는 Close notification 버튼이 있습니다. 닫기에도 처리기가 없고 모달 동작이나 배경 비활성화도 선언하지 않습니다. 쿠키 이모지는 제목 텍스트에 포함되고 XIcon만 aria-hidden입니다.
- 설명·선택·닫기의 읽기 순서
링크가 있는 경고 · Origin UI
- Link의 실제 목적지는 #
comp-275은 정보 누락 문구 오른쪽에 Link라는 a 요소를 둡니다. href는 #이며 별도 클릭 처리나 오류 해결 페이지는 없습니다. 원본의 링크 존재와 실제 해결 경로의 제공은 분리해서 설명해야 합니다.
- Link의 실제 목적지는 #
메시지 전송 안내 · Origin UI
- 두 본문 버튼과 닫기의 서로 다른 요소
View와 Undo는 type=button을 명시한 일반 button이며 가운데 점으로 구분합니다. 둘 다 onClick이 없습니다. Close banner는 작성자 Button 래퍼를 사용하고 type이나 제거 처리기를 전달하지 않습니다. 세 컨트롤의 이름이 달라도 메시지 조회·되돌리기·닫기를 구현한 것은 아닙니다.
- 두 본문 버튼과 닫기의 서로 다른 요소
강조된 경고 알림 · Origin UI
- 본문까지 경고색을 쓰는 변형
comp-268은 바깥 요소에 border-amber-500/50과 text-amber-600을 적용합니다. 아이콘만 주황색인 링크·닫기 변형과 달리 본문도 같은 색을 상속하고 TriangleAlert에는 opacity-60을 둡니다. 아이콘은 숨기지만 정보 누락 문구는 텍스트로 남습니다.
- 본문까지 경고색을 쓰는 변형
변경 취소 안내 · Origin UI
- Undo와 배너 닫기를 구분하는 계약
Undo와 Close banner는 서로 다른 Button이며 닫기 XIcon은 aria-hidden입니다. 둘 다 원본에 처리기가 없고 Button 래퍼에는 알림의 수명이나 제거 뒤 초점 정책이 없습니다. 한 행의 gap-12와 고정 크기 닫기 버튼도 소비 부모에서 확인해야 합니다.
- Undo와 배너 닫기를 구분하는 계약
비밀번호 요구사항 알림 · Origin UI
- 두 항목 목록과 실제 오류 관계
제목은 굵은 p이고 요구사항은 ul 아래 두 li입니다. 빨간 CircleAlertIcon은 aria-hidden이며 오류 필드를 가리키는 ID 관계는 없습니다. 작성자 원본은 두 번째 항목을 Inlcude로 적었고 원래 21st의 Include와 다릅니다. manifest의 차이를 유지하며 텍스트를 고쳐 원본처럼 보이게 하지 않습니다.
- 두 항목 목록과 실제 오류 관계
작업 요청 알림 · Origin UI
- 제목·설명·닫기가 있는 일반 문서 카드
제목과 설명은 p이며 경고 아이콘과 본문 묶음을 flex로 나눕니다. Learn more 아래 동작 상태나 role=alert는 없고 Close notification도 제거 콜백 없이 렌더링합니다. max-w-[400px] 카드이며 고정 위치는 주석의 제안에만 있습니다.
- 제목·설명·닫기가 있는 일반 문서 카드
Unchecked Group · Fluid Functionalism
- 비어 있는 선택과 남아 있는 다섯 항목
어댑터는 한국어 항목 5개를 모두 렌더링하고 checked의 초기값만 빈 Set으로 둡니다. 각 행의 checked는 checked.has(index)에서 결정하므로 선택 배경이 없어도 체크 가능한 행은 남습니다. 목록 전체를 선택하는 별도 컨트롤이나 제출·저장 동작은 없습니다.
- 행이 소유하는 체크박스 의미와 키보드
바깥 행은 tabIndex=0, role=checkbox, aria-checked, 레이블 이름을 가지며 Enter·Space로 토글합니다. 안쪽 Radix 체크박스는 tabIndex=-1과 aria-hidden으로 분리하고 클릭 전파를 막습니다. 그룹의 화살표 탐색은 바깥 행만 조회해 끝에서 순환하며 Home·End도 처리합니다. 모든 행이 Tab 대상이므로 하나만 Tab에 남기는 방식은 아닙니다.
- 비어 있는 선택과 남아 있는 다섯 항목
Gather · A plan in three steps
- Gather · A plan in three steps · renderVisitErrors
A single retained draft survives step navigation. The current step drives heading, progress, active fields and actions; validation blocks advance and routes focus to the first invalid field. This binding describes the authored study; it is not verification of the original.
- Gather · A plan in three steps · renderVisitErrors
Spotlight card스포트라이트 카드
- 포인터 장식과 카드의 의미 분리
카드는 초점을 받을 수 있지만 클릭 동작은 없습니다. 포인터는 예제 전체 좌표를 카드의 빛 위치에 전달하며, 카드 문구는 포인터를 움직이지 않아도 표시됩니다.
- 포인터 장식과 카드의 의미 분리
Magnetic button자석 버튼
- 움직이는 버튼의 고정된 명령
버튼은 예제의 포인터 좌표에 따라 작은 범위 안에서 이동합니다. 실제 작업은 클릭 시 상태 문구를 표시하는 것이며 드래그 값이나 외부 요청을 커밋하지 않습니다.
- 움직이는 버튼의 고정된 명령
Sliding tabs선택을 따라가는 탭
- 선택 버튼과 내용의 동기화
이 예제는 눌림 상태를 가진 세 버튼 그룹으로 화면 내용을 바꿉니다. 탭 목록 역할이나 방향키 이동은 없으며, 선택 강조도 이동하는 별도 표시가 아닌 버튼 배경 변화입니다.
- 선택 버튼과 내용의 동기화
Studio cover작업실의 첫인상
- 소개 버튼의 이름과 실제 결과
큰 문구와 회전 장식 옆의 화살표 버튼은 소개 문구를 상태 영역에 표시합니다. 버튼 이름도 소개 문구를 보여 준다고 명시해 실제 결과와 일치시킵니다.
- 소개 버튼의 이름과 실제 결과
Toggle switch켜고 끄는 스위치
- 스위치의 상태 표와 소유자
이 예제의 상태는 켜짐/꺼짐 둘뿐이고 소유자는 버튼 속성입니다. 두 스위치는 서로 독립적이며 하나의 전환이 다른 스위치에 영향을 주지 않습니다.
- 스위치의 상태 표와 소유자
Primary role: product component implementation handoff.
Repository Boundary
This contract describes consumer-owned behavior. It does not create a shared component library, new Layout primitive, or default visual values. Existing profile records have their own closed schema; this planning template cannot substitute for their evidence records.
Reusable Method
Start with semantic HTML or the platform's native control. Name the public inputs, emitted events, internal state, and owner of persisted data. Then describe each transition and its observable outcome. Use the Worked Examples to check common failure paths.
For reusable ownership and transition mechanisms, use the State Management catalog. The submitted snapshot pattern provides an executable model of the save contract below.
Contract Template
| Field | Required answer |
|---|---|
| Task | The user action and the outcome the component supports |
| Semantics | Element/control, accessible name, description, value, relationships |
| Inputs | Data and callbacks, required/optional values, identity and revision |
| Outputs | Events, payload meaning, when they are emitted, who commits the result |
| State | Initial, active, selected, disabled, pending, empty, error, completed as applicable |
| State ownership | Controlled inputs versus internal temporary state; reconciliation rule |
| Input and focus | Keyboard, pointer, touch, focus entry/return and unavailable actions; for any drag operation, the separate single-pointer and keyboard alternatives |
| Async ownership | Request identity, duplicate action policy, stale result handling, cancellation |
| Content | Empty, long, localized, unbroken and unavailable data |
| Spatial composition | Layout source, parent constraints, scroll owner and overflow behavior |
| Presentation | Product-owned values, density, visual hierarchy and optional motion brief |
| Lifecycle | Creation, navigation, rerender, removal, event/listener cleanup |
| Evidence | Expected behavior, actual result, runtime, source revision and artifacts |
| Handoff | consumer_reference record or not_applicable with a reason |
Worked Contract: Save Action
Task: persist the current editable document. The form owns the draft; the save operation owns a submitted snapshot; the server owns the persisted result. A success for snapshot A must not mark newer draft B as saved.
| Current state | Event | Next state | Required effect |
|---|---|---|---|
| Clean | Edit | Dirty | Keep entered values; mark unsaved changes |
| Dirty | Submit valid draft A | Saving A | Capture A and a request identity; acknowledge pending |
| Saving A | Submit again | Saving A | Apply the declared duplicate policy; this example ignores the duplicate |
| Saving A | Edit to B | Saving A with dirty B | Preserve B and distinguish it from submitted A |
| Saving A | Matching success | Clean if draft still A; otherwise dirty B | Record persisted A without discarding B |
| Saving A | Matching failure | Dirty current draft with error | Keep values and offer retry |
| Any | Stale response | Unchanged | Ignore responses outside the active operation |
| Any | Unmount/navigation | Disposed | Stop UI updates; cancellation does not imply the server rolled back |
Implementation sketch, independent of framework:
on submit:
if a request is active: return
validate the current draft
copy the draft into submittedSnapshot
create requestIdentity
start persistence(requestIdentity, submittedSnapshot)
on result(identity, result):
if disposed or identity is not active: return
clear the active request
if successful: set persistedSnapshot to submittedSnapshot
else: expose a recoverable error
derive dirty state by comparing current draft with persistedSnapshotA real application also defines revision conflicts, server normalization, and retry semantics. The sketch is not a distributed consistency protocol. Its handoff is consumer_reference: not_applicable because this fictional example selects no consumer profile or conformance record.
Drag Operations Need Two Alternatives
When a component commits a value through dragging (reorder, slider thumb, resize handle, board column move), answer the Input and focus field once per input path:
| Path | Required answer |
|---|---|
| Drag | What previews, what release commits, what cancellation restores |
| Single pointer without dragging | Which click or tap controls reach the same committed value, and where they are visible without hover |
| Keyboard | Which keys reach the same committed value, and where focus rests afterwards |
WCAG 2.2 Success Criterion 2.5.7 (Level AA) is the named source for the second row. Its Understanding document evaluates it independently from keyboard operation, so a keyboard handler does not answer it and pointer-only buttons do not answer the keyboard row. The criterion excepts dragging that is essential and functionality the user agent determines without author modification; a custom slider, sortable list, or pan surface owns all three rows. A swipe or flick is not an acceptable second row because it is still a path-based gesture. All paths emit the same output event with the same payload meaning, so validation, duplicate policy, and stale-result handling are not bypassed by the alternative. The motion and cancellation side is in Drag And Settle.
This contract names what to declare. It does not establish conformance; that requires the consuming product's rendered behavior under the accessibility evidence gate. Target Size (Minimum) is a different criterion for the size of those pointer controls and is measured in CSS pixels, not platform dp or pt.
Opinionated Guidance
Use state names that expose meaningful differences. Two booleans can accidentally permit “saved and failed”; a state transition table helps reveal impossible combinations. Do not merge input validity, request state, and persisted revision into one visual status.
Platform-Specific Guidance
For web forms, preserve native label and form relationships. Validate custom semantics against the applicable accessibility evidence gate. Framework scheduling, request abort behavior, and server idempotency require separate implementation evidence.
Unsupported Absolutes
A state table does not prove accessibility, successful persistence, race freedom, or device coverage. Cancelling a client request does not prove its remote side effects stopped.
Verification Contract
Resolve responses out of order, edit during saving, fail then retry, activate repeatedly, and remove the component before completion. Inspect both persisted and displayed values. Include keyboard-only operation, long content, and constrained parents. For a drag operation, complete the task by drag, by click or tap without movement, and by keyboard, then compare the committed value, emitted event, and focus position. Record actual outcomes; the table above is an unexecuted reference contract. Review when a public input, event, or state meaning changes.
Source, License, And Attribution
Locally authored contract and pseudocode; no framework or upstream implementation is copied. WCAG 2.2 (W3C Recommendation, 12 December 2024) and the informative Understanding pages for Success Criteria 2.5.7 (updated 10 August 2026) and 2.5.8 were rechecked on 2026-09-19 for the statements attributed to them; the three-path table is local synthesis and has not been executed against a product. Shared quality gates own evidence admissibility.
IA Navigation
Parent: Design Engineering. Next: Design Engineering Worked Examples.


