개요
BakeryVideKit 컴포넌트는 vide 기반 UI 레이어를 일관된 패턴으로 구성하기 위해 제공됩니다.
여기서는 새 컴포넌트를 작성할 때 유지해야 하는 기본 구조, 문서 주 석, 상태 관리 규칙을 설명합니다.
기존 코드와 동일한 흐름을 따라야 하며, 아래 항목을 지키지 않으면 Moonwave 문서화나 런타임 동작이 깨질 수 있습니다.
공통 구조
-
모듈 최상단에는
--[=[ @class … ]=]형태의 문서 주석을 두고,@tag vide를 반드시 선언합니다.
예시:--[=[
@class Button
@tag vide
버튼 인터랙션을 처리하는 vide 컴포넌트입니다.
]=] -
vide런타임 관련 의존성은 항상 상단에 정리합니다:vide(런타임),TableUtil,Maid,DynamicTween등. -
local vide = require("@vide")로 불러온 직후, 실제 사용할 API 만local create = vide.create,local action = vide.action,local source = vide.source,local effect = vide.effect처럼 지역 별칭으로 정의합니다. JSX 흉내를 위한local e = ...같은 헬퍼는 절대 만들지 않습니다. -
Context, 다른 컴포넌트, 유틸리티는 블록을 나눠 require 하고,
code-style.md의 순서를 따릅니다.
Props 정의
- 모든 컴포넌트는
export type ComponentProps = { … } & BaseProps형태로 외부에 프로퍼티 타입을 노출합니다. - 상위 컴포넌트의 Props 를 확장할 경우
Frame.FrameProps와 같이 명시적으로 병합합니다. - 외부에서 전달받아야 하는 이벤트(
OnClick,OnEnter등)는 콜백 시그니처를 정확히 기록합니다. - 내부에서만 사용하는 필드는 컴포넌트 본문에서
frameProps.SomeField = nil로 제거해 실제 인스턴스로 전달되지 않도록 합니다.
vide 패턴
- 컴포넌트는
local function Component(props: ComponentProps)처럼 일반 함수로 정의하고, 마지막에return create("Frame")(frameProps)혹은 BakeryVideKit 래퍼를 호출해 반환합니다.vide.component는 사용하지 않습니다. table.clone(props)로 원본을 복사해 수정 가능한 사본을 만든 뒤 가공합니다.TableUtil.merge를 사용해 기본값, 테마 기반 속성, 사용자 지정 속성을 병합합니다.- Context 접근은
local theme = ThemeContext()처럼 BakeryVideKit 하위 Context 모듈을 통해 이루어집니다. - Layout 전용 자식은
internalChildren딕셔너리를 만들어ListLayout,Padding등 UIComponent 모듈을 배치합니다. props.children은 항상 별도 변수로 분리한 뒤 숫자 인덱스 위치에table.insert하여 반환용 props 에 병합합니다.vide.fragment, JSX 스타일 헬퍼,e(...)패턴은 허용하지 않습니다.create호출에서 클래스가 문자열 리터럴이고 props 가 테이블 리터럴이라면 항상create "Frame" { ... }처럼 괄호를 생략합니다. 클래스나 props 가 변수/표현식일 때만create(class)(props)처럼 괄호를 사용합니다.
상태와 효과
- 시각 효과나 입력 상태는
vide.source,vide.effect,vide.action,vide.cleanup조합으로 구현합니다. 필요한 경우 지역 헬퍼 함수를 만들어도, 내부에서는 이 API 만 사용해야 합니다. - Tween 이나 비동기 동작을 사용할 때는
Maid를 통해 정리하거나,vide.effect의 정리 함수를 활용합니다. - Tooltip 처럼 지연 표시가 필요한 경우
task.delay호출 전에 guard 플래그(tooltipHovered)를 두어 취소 가능하게 작성합니다.
반환 패턴
- 최종 반환은
return create("Frame")(frameProps)또는return Frame(frameProps)처럼create기반 호출로 통일합니다. JSX 대용 헬퍼나e(Component)패턴은 사용하지 않습니다. - UI 컴포넌트 모듈을 사용할 때는 BakeryVideKit 가 노출하는 래퍼(
Components.Frame,Components.TextLabel,Components.UIComponent.Padding등)를 우선 사용하며, 해당 래퍼 내부에서 이미create호출을 처리합니다. - 내부 children 구성은
internalChildren.SomeChild = create("UIListLayout")({ ... })혹은 숫자 인덱스frameProps[#frameProps + 1] = create("TextLabel")({ ... })방식으로 작성합니다.
파일 및 배포 주의사항
- 새로운 컴포넌트를 추가하면
Components/init.lua내에 require · export type 을 반드시 등록합니다. - Storybook 용
.story.lua파일을 추가할 경우, 컴포넌트 폴더 내부에서Button.story.lua처럼 별도 파일로 둡니다. - Moonwave 문서화가 정상적으로 작동하려면 모든 BakeryVideKit 모듈에 문서 주석과
@tag vide가 포함되어 있어야 합니다. - 변경 후에는
lune run CheckSyntax와lune run BuildDocs를 순서대로 실행해 문법·문서 검사를 통과해야 합니다.