크로스 플랫폼 및 모바일 UI · 새 리소스

gluestack UI 디자인 시스템.

gluestack의 실제 핵심 Button 및 Input 생성자, 명시적인 v5 시맨틱 색상, 완전한 React Native Web 소스를 사용해 야외 활동 장비 체크리스트를 만드세요. 유효성 검사, 키보드 동작, 안정적인 항목 식별, 로컬에서 계산되는 짐 꾸리기 진행률을 확인하세요.

OpenDesign 가이드8개 챕터참조 항목 33개독자적 적용 가이드
01

gluestack UI 디자인 시스템 인터페이스 미리보기

항목을 하나 추가하고, 포장 완료로 표시한 다음 계산된 진행 상황을 확인하세요.

현장용 키트 챙기기전체 예시 열기
React Native Web 0.21.3을 통해 실제 @gluestack-ui/core 5.0.15 동작을 사용합니다. 현장용 키트 레이아웃, 아트워크 및 상태 모델은 독자적인 OpenDesign 작업입니다. 이 직접 생성기 기반 브라우저 예제는 명시적 스타일을 사용합니다. CLI에서 생성한 NativeWind/Uniwind 컴포넌트 집합이 아니며 iOS나 Android에서 테스트되지 않았습니다. · 구현 레퍼런스
02

gluestack UI 디자인 시스템 디자인 참조

이 참조는 문서화된 v5 라이트 색상과 설치된 core 생성기 API를 구분합니다. 직접 생성기를 사용해도 CLI 테마가 자동 적용되지 않습니다. 미리보기에서는 목록의 색상을 독자적인 스타일에 명시적으로 연결하고, 더 뚜렷한 사용자 지정 포커스 윤곽선을 사용합니다. 형태와 아트워크는 애플리케이션에서 결정합니다.

문서화된 v5 라이트 색상 역할

출처
이름 / 규칙값 / 구성용도
background#ffffff 페이지 캔버스.
foreground#0a0a0a 일반적인 읽기용 텍스트.
card#ffffff 카드 표면.
popover#ffffff 오버레이 표면입니다. 이 예제에서는 팝오버를 사용하지 않습니다.
popover-foreground#0a0a0a 오버레이 표면에 사용하는 텍스트입니다.
muted#f5f5f5 원본 아트워크 패널을 포함한 보조 표면입니다.
muted-foreground#737373 보조 설명과 상태 세부 정보입니다.
destructive#e7000b 잘못된 입력을 표시합니다. 오류는 텍스트로도 나타납니다.
border#e5e5e5 카드 테두리와 목록 구분선입니다.
input#e5e5e5 기본 상태의 필드 테두리입니다.
ring#d4d4d4 문서에 명시된 기본 링 색상입니다. 이 예제에서는 더 진한 원본 #737373 포커스 아웃라인을 사용합니다.
primary#171717 주요 동작 표면과 진행률 채우기입니다.
primary-foreground#fafafa 어두운 동작 표면에 사용하는 텍스트입니다.
secondary#f5f5f5 강조도가 낮은 동작 표면입니다.
secondary-foreground#171717 보조 표면에 사용하는 텍스트입니다.
accent#f7f7f7 추가 강조 표면 역할입니다.
accent-foreground#343434 강조 역할에 사용하는 텍스트입니다.

핵심 Button 팩토리와 상태

출처
이름 / 규칙값 / 구성용도
createButton{ Root, Text, Group, Spinner, Icon }실제 호스트 컴포넌트를 전달하세요. 생성기는 동작을 추가할 뿐, 완전한 테마를 제공하지 않습니다.
Button.TextText host버튼 텍스트를 해당 상태 컨텍스트 안에 유지합니다.
Button.GroupGroup host버튼 그룹을 위한 생성된 하위 컴포넌트입니다. 이 레이아웃에서는 사용하지 않습니다.
Button.SpinnerSpinner host생성된 로딩 표시 요소입니다. 즉시 처리되는 로컬 동작에는 표시하지 마세요.
Button.IconIcon host생성된 아이콘 하위 컴포넌트입니다. 미리 보기에서는 명시적인 텍스트 동작을 사용합니다.
Button isDisabledboolean겉모습뿐 아니라 실제 누르기 동작을 비활성화합니다.
Button data-focus-visibletrue / false원본 CSS는 키보드 포커스가 있을 때 눈에 보이는 아웃라인을 적용합니다.
Button data-activetrue / false스타일링에 사용할 눌림 상호작용 상태를 노출합니다.

핵심 Input 컨텍스트와 호스트 props

출처
이름 / 규칙값 / 구성용도
createInput{ Root, Icon, Slot, Input }필드 컨텍스트와 관련 슬롯을 생성합니다.
Input.InputTextInput host생성기가 반환하는 텍스트 입력 컴포넌트입니다.
isInvalidInput root boolean잘못된 컨텍스트와 aria-invalid를 필드에 전달합니다.
isRequiredInput root boolean필수 상태를 전달합니다. 애플리케이션은 별도로 trim 검증을 수행해야 합니다.
value / onChangeTextControlled TextInput props초안 텍스트를 React 상태로 유지합니다.
onSubmitEditingTextInput callback이 브라우저 예제에서는 Enter 키를 누르면 항목을 추가합니다.
maxLength60 in the original study이 애플리케이션에서 선택한 TextInput 제한값입니다. gluestack의 기본값은 아닙니다.
aria-labelItem name in the original study눈에 보이는 레이블과 함께 입력 이름을 지정합니다.
03

gluestack UI 디자인 시스템 완벽 가이드

실제 인터페이스를 위해 이 시스템을 선택하고 적용하고 검토하는 실용 가이드.

DESIGN-gluestack-ui.md

완전한 안내와 구현 시작점, 소스 링크.

가이드 다운로드

gluestack UI 디자인 시스템 버전, 생성기 및 생성된 컴포넌트

실제 구현 경로를 선택하세요

gluestack은 여러 계층으로 구성됩니다. 기본 설치 흐름은 스타일이 적용된 컴포넌트를 애플리케이션에 생성합니다. 반면 이 예제에서는 설치된 코어 패키지에서 createButton과 createInput을 가져오고 React Native Web 호스트를 전달합니다. 이 차이는 중요합니다. core만 설치한다고 해서 생성된 버튼 변형이나 완전한 테마가 제공되는 것은 아닙니다.

이 OpenDesign 가이드에서

실행 예제는 core 5.0.15와 utils 5.0.6을 고정해 사용합니다. React Native Web 어댑터는 실제 컴포넌트이고, 셸과 상태는 독자적으로 구성했습니다. 완전한 Expo 또는 Next.js 애플리케이션을 만들려면 설치 문서를 참고하고, 이 특정 브라우저 예제를 재현하려면 여기에 있는 전체 파일을 사용하세요.

gluestack UI 디자인 시스템의 시맨틱 색상과 명시적 스타일링

장식을 정하기 전에 역할을 조합하세요

페이지는 흰색 캔버스에 어두운 주요 동작, 차분한 보조 영역, 뚜렷한 테두리 역할을 사용합니다. 이 값은 문서에 명시된 v5 라이트 팔레트에서 가져온 뒤 React Native 스타일과 일반 CSS을 통해 명시적으로 지정합니다. 런타임 provider가 이 값을 암묵적으로 적용하지 않습니다.

잘못된 필드는 파괴적 색상의 아웃라인, 읽기 쉬운 설명, 포커스 복귀를 함께 사용합니다. 원본 포커스 아웃라인은 문서에 명시된 기본 링보다 더 어둡습니다. 따라서 스타일시트에서는 이 선택을 라이브러리 토큰인 것처럼 제시하지 않고 별도로 표시합니다.

마이그레이션은 신중하게 진행하세요

숫자로 된 팔레트 이름을 사용하는 이전 예제를 v5 시맨틱 용어와 무작정 혼용하지 마세요. 토큰 이름을 바꾸기 전에 설치된 생성 구성과 업그레이드 가이드를 확인하세요. 생성기를 직접 살펴보는 예제로 동작을 확인할 수는 있지만, 애플리케이션 전체의 마이그레이션이 완료되었음을 증명하지는 않습니다.

gluestack UI 디자인 시스템의 Button 구성과 키보드 동작

생성기에 모든 호스트를 전달하세요

createButton은 Pressable, Text, View, ActivityIndicator와 아이콘 호스트를 받습니다. 그리고 Button과 Text, Group, Spinner, Icon 하위 컴포넌트를 반환합니다. 완전한 예제에서는 누를 수 있는 루트에 일반 문자열을 넣는 대신 Button.Text를 사용합니다.

포장은 동기식 상태 전환이므로 로딩 스피너나 저장 지연을 임의로 만들어 넣지 않습니다. 각 동작의 접근성 레이블에는 항목 이름이 포함됩니다. 눈에 보이는 동작 문구는 Pack item과 Unpack 사이에서 바뀌어 다음 동작을 명확히 보여 줍니다.

렌더링된 동작을 확인하세요

  1. Tab 키로 Pack item 동작에 포커스를 옮긴 뒤 Space 키를 누릅니다.
  2. 포장 상태를 나타내는 텍스트와 진행률 값이 모두 바뀌는지 확인합니다.
  3. Unpack을 사용한 뒤 같은 항목이 목록에 남아 있는지 확인합니다.
  4. 마우스 오버만으로 키보드 지원을 판단하지 말고 포커스 아웃라인을 확인하세요.

gluestack UI 디자인 시스템의 Input 컨텍스트와 완전한 검증

저장할 값을 검증하세요

value와 onChangeText를 사용해 입력을 제어합니다. 항목을 추가할 때는 먼저 초안에서 앞뒤 공백을 제거하고, 결과가 비어 있으면 거부한 다음, 대소문자를 구분하지 않고 이름을 비교합니다. 값이 거부되면 사용자가 수정할 수 있도록 필드에 그대로 남겨 둡니다.

루트에는 isInvalid와 isRequired를 전달하고, 실제 필드에는 레이블, 설명 참조, 포커스 복원용 ref를 전달합니다. 검증은 애플리케이션의 책임입니다. core input을 필수로 표시해도 중복 이름 규칙이 자동으로 적용되지는 않습니다.

눈에 보이는 필드 상태를 모두 처리하세요

  • 초기 상태: 필드가 비어 있고 글자 수 안내가 표시됩니다.
  • 오류 상태: 설명이 알림으로 나타나고 필드에 포커스가 이동합니다.
  • 편집 상태: 사용자가 초안을 수정하면 이전 오류 텍스트가 지워집니다.
  • 입력 승인: 포장을 풀지 않은 새 행이 추가되고 필드가 비워지며 상태 메시지에 추가된 항목이 표시됩니다.

gluestack UI 디자인 시스템의 안정적인 식별자와 파생 진행률

항목을 저장하고 요약을 계산하세요

각 항목에는 안정적인 숫자 id, 이름, 포장 여부를 나타내는 플래그가 있습니다. 새 id는 ref에서 가져오며, 표시 이름을 React key로 사용하지 않습니다. 전환할 때는 id를 기준으로 매핑하므로 서로 관련 없는 두 UI 업데이트가 실수로 다른 행을 변경할 수 없습니다.

진행률의 분자는 포장된 항목의 플래그를 기준으로 계산하고, 분모는 현재 목록을 기준으로 계산합니다. 포장하지 않은 항목을 추가하면 이미 포장된 항목은 그대로 유지되면서 백분율이 낮아질 수 있습니다. 이는 체크리스트가 커진 데 따른 올바른 결과이지 애니메이션 오류가 아닙니다.

초기화를 명시적인 로컬 동작으로 만드세요

초기화하면 샘플 항목 세 개가 복원되고, 작성 중인 내용과 오류가 지워지며, 다음 ID가 초기화되고 결과가 안내됩니다. 페이지를 다시 불러와도 샘플 상태로 시작합니다. 이 미리보기에는 서버, 계정 동기화 또는 영구 저장소가 없습니다.

gluestack UI 디자인 시스템 반응형 레이아웃과 오리지널 아트워크

호스트 동작과 페이지 레이아웃을 구분하세요

데스크톱 레이아웃에서는 체크리스트와 입력 패널을 나란히 배치합니다. 너비가 700픽셀이 되면 한 열로 바뀝니다. 필요한 경우 행이 줄바꿈되고 긴 항목 이름도 사용 가능한 공간 안에서 줄바꿈됩니다. 고정 너비의 작업 버튼이 문서 전체를 옆으로 밀어내지 않도록 하세요.

노트와 연필은 gluestack 브랜드 에셋을 복사한 것이 아니라 새로 제작한 CSS 도형입니다. 카드의 14픽셀 둥근 모서리, 패널 간격 24픽셀, 제목 크기 체계도 이 예제를 위해 정한 것입니다. 참고 표에서는 이를 문서에 정의된 색상 역할과 구분합니다.

gluestack UI 디자인 시스템 브라우저 접근성과 플랫폼 범위

실제로 다루는 환경을 테스트하세요

미리보기는 React Native Web을 렌더링하며 브라우저에서 확인했습니다. 이로써 네이티브 iOS 또는 Android에서의 동작이 검증된 것은 아닙니다. Expo 애플리케이션에서는 터치 대상, 스크린 리더 알림, 키보드 회피 동작, 플랫폼 탐색을 별도로 확인해야 합니다.

진행률 요소에는 이름, 최솟값, 최댓값, 현재 값이 포함됩니다. 라이브 상태 알림은 독자가 체크리스트에서 벗어나지 않고도 완료된 작업을 확인할 수 있게 합니다. 제출이 거부되면 양식은 작성 중인 내용을 유지하고 입력 필드로 포커스를 돌려보냅니다. 이러한 동작은 네이티브 코어 동작을 바탕으로 애플리케이션에서 구현해야 합니다.

gluestack UI 디자인 시스템 전체 빌드 및 의존성 범위

이 예제를 그대로 재현하기

Component Examples의 파일 네 개를 모두 한 디렉터리에 저장하고 아래에 표시된 고정 버전 패키지를 설치하세요. 코어 내부에서 모듈 이름으로 react-native를 가져오므로 빌드 설정에서 react-native를 react-native-web으로 별칭 처리합니다. 소스에서는 브라우저 호스트를 직접 가져오며 Expo 런타임은 불러오지 않습니다.

웹 전용 하위 구성요소를 설치할 때는 레거시 피어 의존성 해석을 사용합니다. 이는 완전한 네이티브 애플리케이션을 위한 권장 방식이 아닙니다. 전체 라이브러리는 네이티브, SVG, 안전 영역 통합을 위한 피어 의존성을 지정하지만, 이 두 크리에이터로 구성된 번들에서는 사용하지 않습니다. 구성요소를 확장할 때는 필요한 피어 의존성을 추가하세요.

한 번에 한 계층씩 변경하세요

  1. 파일을 변경하지 않고 빌드한 다음 항목 추가, 중복 거부, 포장, 초기화를 확인하세요.
  2. 크리에이터 연결은 유지하면서 기존 레이아웃이나 애플리케이션 콘텐츠를 변경하세요.
  3. 생성형 NativeWind 구성요소를 도입하려면 스타일링과 프로바이더 설정을 별도의 통합 단계로 교체하세요.
  4. 변경 후 키보드 동작과 실제 대상 플랫폼을 다시 확인하세요.

gluestack UI 디자인 시스템 구성요소 예제

app.jsx — 코어 구성요소 전체 예제

실제 크리에이터 연결과 전체 체크리스트 상태 모델입니다.

jsx
import React,{useState,useRef} from 'react';
import{createRoot}from'react-dom/client';
import{Pressable,Text,View,TextInput,ActivityIndicator}from'react-native-web';
import{createButton}from'@gluestack-ui/core/button/creator';
import{createInput}from'@gluestack-ui/core/input/creator';
const Button=createButton({Root:Pressable,Text,Group:View,Spinner:ActivityIndicator,Icon:View});
const Input=createInput({Root:View,Input:TextInput,Slot:Pressable,Icon:View});
const seed=[{id:1,name:'Sketchbook',packed:true},{id:2,name:'Pencil roll',packed:false},{id:3,name:'Water bottle',packed:false}];
function App(){const[items,setItems]=useState(seed),[name,setName]=useState(''),[error,setError]=useState(''),[message,setMessage]=useState('Pack each item when it is ready.');const next=useRef(4),field=useRef(null);const count=items.filter(x=>x.packed).length;
function add(){const v=name.trim();if(!v||items.some(x=>x.name.toLowerCase()===v.toLowerCase())){setError(!v?'Enter the name of an item.':'That item is already in the kit.');field.current.focus();return}setItems([...items,{id:next.current++,name:v,packed:false}]);setName('');setError('');setMessage(v+' added to this local kit.')}
return <main><header><p className="eyebrow">GLUESTACK UI / CORE COMPONENT STUDY</p><h1>A small kit.<br/>A clearer start.</h1><p className="intro">Prepare a drawing kit with actual gluestack core Button and Input creators. Your checklist stays in this browser session.</p></header><div className="layout"><section className="panel"><div className="sectionhead"><h2>Your field kit</h2><span className="badge">{count} of {items.length} packed</span></div><div className="meter" role="progressbar" aria-label="Packed items" aria-valuemin={0} aria-valuemax={items.length} aria-valuenow={count}><i style={{width:100*count/items.length+'%'}}/></div><ul>{items.map(item=><li key={item.id}><div><strong>{item.name}</strong><span>{item.packed?'Packed and ready':'Still to pack'}</span></div><Button onPress={()=>{setItems(items.map(x=>x.id===item.id?{...x,packed:!x.packed}:x));setMessage(item.name+(item.packed?' marked to pack.':' marked packed.'))}} style={item.packed?styles.secondary:styles.primary} aria-label={(item.packed?'Unpack ':'Pack ')+item.name}><Button.Text style={{color:item.packed?'#171717':'#fafafa',fontSize:14,fontWeight:600}}>{item.packed?'Unpack':'Pack item'}</Button.Text></Button></li>)}</ul><p className="status" role="status">{message}</p></section><aside className="panel"><div className="drawing" aria-hidden="true"><span className="book">FIELD<br/>NOTES</span><i className="pencil"/></div><h2>Add one useful thing</h2><label htmlFor="kit-name">Item name</label><Input isInvalid={!!error} isRequired style={styles.input}><Input.Input id="kit-name" aria-label="Item name" aria-describedby={error?'kit-error':'kit-hint'} ref={field} value={name} onChangeText={v=>{setName(v);setError('')}} onSubmitEditing={add} maxLength={60} style={styles.field}/></Input><p id="kit-hint" className="hint">Use a short, unique name. Maximum 60 characters.</p>{error&&<p id="kit-error" className="error" role="alert">{error}</p>}<Button onPress={add} style={styles.primary}><Button.Text style={styles.primaryText}>Add to kit</Button.Text></Button><Button onPress={()=>{setItems(seed);setName('');setError('');setMessage('Example kit restored.');next.current=4}} style={styles.reset}><Button.Text style={{color:'#737373',fontSize:14}}>Reset example kit</Button.Text></Button></aside></div><p className="scope">Native @gluestack-ui/core 5.0.15 behavior rendered through React Native Web. Original OpenDesign layout and artwork; explicitly styled with documented v5 light color roles. This is a web-only study, not an Expo build or the CLI-generated NativeWind component set.</p></main>}
const styles={primary:{backgroundColor:'#171717',paddingVertical:12,paddingHorizontal:16,borderRadius:8,alignItems:'center',justifyContent:'center'},secondary:{backgroundColor:'#f5f5f5',paddingVertical:12,paddingHorizontal:16,borderRadius:8,alignItems:'center',justifyContent:'center'},primaryText:{color:'#fafafa',fontSize:14,fontWeight:600},input:{borderWidth:1,borderColor:'#e5e5e5',borderRadius:8,marginTop:8},field:{padding:12,fontSize:16,color:'#0a0a0a',outlineStyle:'none'},reset:{paddingVertical:16,alignItems:'center'}};
createRoot(document.getElementById('app')).render(<App/>);

코드 참조

style.css — 오리지널 레이아웃과 명시적인 라이트 색상 역할

완전한 반응형 셸, 아트워크, 상태 윤곽선, 브라우저 포커스 스타일을 포함합니다.

CSS
*{box-sizing:border-box}body{margin:0;background:#fff;color:#0a0a0a;font-family:Arial,sans-serif}main{max-width:1100px;margin:auto;padding:40px}.eyebrow{font-size:12px;letter-spacing:.12em;font-weight:700}.intro{max-width:62ch;color:#737373;line-height:1.6}h1{font-size:52px;line-height:1.03;letter-spacing:-.045em;margin:24px 0}h2{font-size:22px;margin:0 0 20px}.layout{display:grid;grid-template-columns:1.35fr 1fr;gap:24px;margin-top:32px}.panel{border:1px solid #e5e5e5;border-radius:14px;padding:24px;min-width:0}.sectionhead{display:flex;gap:12px;justify-content:space-between;align-items:baseline;flex-wrap:wrap}.badge{font-size:12px;background:#f5f5f5;padding:6px 10px;border-radius:20px}.meter{height:6px;border-radius:8px;background:#f5f5f5;margin:6px 0 24px;overflow:hidden}.meter i{display:block;height:100%;background:#171717}ul{list-style:none;padding:0;margin:0}li{display:flex;gap:16px;align-items:center;justify-content:space-between;padding:20px 0;border-bottom:1px solid #e5e5e5}li>div:first-child{min-width:0;flex:1}li strong{display:block;font-size:16px;overflow-wrap:anywhere}li span{display:block;font-size:13px;color:#737373;margin-top:8px}.status{font-size:14px;line-height:1.6;margin-top:24px}.hint,.scope{font-size:12px;line-height:1.6;color:#737373}.scope{margin-top:28px}.error{font-size:14px;color:#e7000b;line-height:1.5}label{font-size:14px}.drawing{height:130px;background:#f5f5f5;border-radius:8px;display:flex;align-items:center;justify-content:center;gap:24px;margin-bottom:24px}.book{display:block;background:#171717;color:#fafafa;border-left:5px solid #737373;width:80px;height:96px;padding:22px 12px;font-size:12px;line-height:1.6;transform:rotate(-8deg)}.pencil{height:90px;width:8px;background:#a3a3a3;transform:rotate(14deg)}[data-focus-visible=true]{outline:3px solid #737373;outline-offset:3px}[data-invalid=true]{border-color:#e7000b!important}input:focus-visible{outline:2px solid #737373!important;outline-offset:3px}@media(max-width:700px){main{padding:20px}h1{font-size:40px}.layout{grid-template-columns:1fr}.panel{padding:20px}li{gap:12px;flex-wrap:wrap}li>div:first-child{flex-basis:120px}}

코드 참조

build.mjs — 웹 번들러 전체 설정

app.jsx에서 호스트를 React Native Web으로 가져오더라도 네이티브 가져오기 별칭은 필요합니다.

자바스크립트
import { build } from 'esbuild';
await build({entryPoints:['app.jsx'],bundle:true,minify:true,outfile:'app.js',alias:{'react-native':'react-native-web'},resolveExtensions:['.web.js','.js','.jsx','.ts','.tsx','.json'],loader:{'.js':'jsx'},define:{'process.env.NODE_ENV':'"production"'}});

코드 참조

index.html — 브라우저 진입점 전체 파일

이 파일을 style.css 및 생성된 app.js와 같은 위치에 두세요.

html
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>gluestack field kit</title><link rel="stylesheet" href="style.css"></head><body><div id="app"></div><script src="app.js"></script></body></html>

코드 참조

04

gluestack UI 디자인 시스템 에이전트 설정

구현 시작점

먼저 파일 네 개를 모두 저장하세요. 이 설정은 예제에 포함된 브라우저 하위 구성요소만 대상으로 하며 NativeWind, Uniwind, Expo 또는 생성형 구성요소 레지스트리를 초기화하지 않습니다.

sh
npm init -y
npm install [email protected] [email protected] [email protected] @gluestack-ui/[email protected] @gluestack-ui/[email protected] [email protected] --legacy-peer-deps
node build.mjs
python3 -m http.server 8000
# Open http://localhost:8000/

프로젝트를 위한 프롬프트

에이전트 프롬프트
createButton/createInput 및 React Native Web 호스트를 사용해 gluestack core 5.0.15 브라우저 예제를 완성하세요. 안정적인 ID, 제어되는 작성 중 텍스트, 공백 제거 및 중복 유효성 검사, 포커스 복원, 계산된 포장 개수, 로컬 초기화, 명시적인 v5 라이트 색상 역할 매핑을 유지하세요. 오리지널 레이아웃 선택 사항은 라이브러리 기본값과 구분하세요. 네이티브 모바일 테스트나 백엔드 영구 저장 기능이 있다고 주장하지 마세요.
05

gluestack UI 디자인 시스템 출처와 범위

React Native Web 0.21.3을 통한 실제 @gluestack-ui/core 5.0.15 동작입니다. 필드 키트의 레이아웃, 아트워크, 상태 모델은 OpenDesign에서 새로 제작했습니다. 이 브라우저 예제는 크리에이터를 직접 사용하고 스타일을 명시적으로 지정합니다. CLI에서 생성한 NativeWind/Uniwind 구성요소 세트가 아니며 iOS 또는 Android에서 테스트되지 않았습니다.