-
Notifications
You must be signed in to change notification settings - Fork 28
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Stackflow cleanup #502
base: wip
Are you sure you want to change the base?
Conversation
|
동기
Stackflow를 사용하는 기존 프로젝트는 Basic UI Plugin을 확장하는 방식으로 작성되었습니다.
하지만, Basic UI를 확장하기 어려운 지점들이 있었고, 다음과 같은 문제를 관찰했습니다.
<AppScreen>
으로 묶어서 제공하고 있습니다.<div style={{ height: "100%", overflow: "auto" }}>
와 같은 스크롤 컨테이너를 매번 추가해서 사용하는 패턴이 관찰됩니다.목표
접근
기존 Basic UI에서 제시하는 주요 기능은 다음과 같습니다.
이 기능들을 그대로 제공하면서,
설계해야 합니다.
Primitive와 스타일 분리
<GlobalInteraction>
컴포넌트로 추상화되며, Stackflow plugin 형태로 wrapStack에 전달됩니다.<AppScreen>
컴포넌트로 추상화되며, 필요하다면<Modal>
과 같은 다른 컴포넌트도 추가될 수 있습니다.스타일시트 - 전환 상태
Primitive에서 제공하는 Data Attribute를 활용해 전환 효과를 구현할 수 있습니다.
스타일시트 - 애니매이션 선언
애니메이션을 선언을 추상화하는
createPresence
함수를 제공합니다.을 전달하면, push/idle/pop/interaction 4가지 상태에 대한 애니메이션을 생성합니다.
스타일시트 - 선언
위 selector와 애니매이션 선언을 조합해 transition style 테마를 자유롭게 추가할 수 있습니다.
이때, OS별 theme 선언과 transitionStyle 선언을 엄격하게 분리합니다. 두 선언이 섞이면 가독성이 저하되며, 동작을 예측하기 어려워집니다.
컴포넌트 - Composable API
기존
<AppScreen>
컴포넌트는dim
,layer
,edge
,appBar
요소를 하나의 컴포넌트로 묶어 제공합니다. 이를 각각의 컴포넌트로 분리해서 직접 조합할 수 있도록 합니다.각 컴포넌트는
asChild
패턴을 지원합니다. HTML tag를 바꿔야 하거나, 다른 컴포넌트와 합성해야 하는 경우 유용합니다.예를 들어:
AS-IS:
TO-BE:
API에는 호불호가 있을 수 있습니다. 이는 하나의 예시일 뿐이며, 제공되는 요소별 컴포넌트를 조합해 기존과 동일한 방식으로도 사용할 수 있습니다.
컴포넌트 - Pull To Refresh
웹뷰에서 자주 사용되는 패턴인 Pull To Refresh 컴포넌트를 함께 제공합니다. Pull To Refresh는 Stackflow 의존성은 없으나, 제시된 Composable API와 함께 사용하기 좋습니다.
예를 들어:
PTR이 자주 사용되는 프로젝트라면 위와 같이 PTR을 사전에 조합한 AppScreen을 활용하는 것을 고려할 수 있습니다.
코드
Primitive
stackflow/primitive/ 디렉토리는 Stackflow UI를 구성하기 위한 headless 컴포넌트를 제공합니다.
Styling
qvism-preset/stackflow 디렉토리는 Primitive 위에 SEED Design의 스타일을 적용하는 스타일시트 및 애니매이션 유틸리티를 제공합니다.
Components
stackflow/components 디렉토리는 위 두 패키지를 조합해 Stackflow 위에서 동작하는 SEED Design 컴포넌트를 제공합니다.
Stackflow 개선 가능성