motile-ui 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +216 -0
- package/dist/components/Accordion/Accordion.d.ts +36 -0
- package/dist/components/Accordion/index.d.ts +2 -0
- package/dist/components/Badge/Badge.d.ts +25 -0
- package/dist/components/Badge/index.d.ts +2 -0
- package/dist/components/Button/Button.d.ts +47 -0
- package/dist/components/Button/index.d.ts +2 -0
- package/dist/components/Checkbox/Checkbox.d.ts +31 -0
- package/dist/components/Checkbox/index.d.ts +2 -0
- package/dist/components/Dock/Dock.d.ts +63 -0
- package/dist/components/Dock/index.d.ts +2 -0
- package/dist/components/Drawer/Drawer.d.ts +97 -0
- package/dist/components/Drawer/index.d.ts +2 -0
- package/dist/components/Input/Input.d.ts +53 -0
- package/dist/components/Input/index.d.ts +2 -0
- package/dist/components/Modal/Modal.d.ts +150 -0
- package/dist/components/Modal/index.d.ts +2 -0
- package/dist/components/Popover/Popover.d.ts +38 -0
- package/dist/components/Popover/index.d.ts +2 -0
- package/dist/components/Sheet/Sheet.d.ts +76 -0
- package/dist/components/Sheet/index.d.ts +2 -0
- package/dist/components/Skeleton/Skeleton.d.ts +22 -0
- package/dist/components/Skeleton/index.d.ts +2 -0
- package/dist/components/SpeedDial/SpeedDial.d.ts +89 -0
- package/dist/components/SpeedDial/index.d.ts +2 -0
- package/dist/components/Switch/Switch.d.ts +16 -0
- package/dist/components/Switch/index.d.ts +2 -0
- package/dist/components/Textarea/Textarea.d.ts +57 -0
- package/dist/components/Textarea/index.d.ts +2 -0
- package/dist/components/Toast/Toast.d.ts +25 -0
- package/dist/components/Toast/index.d.ts +4 -0
- package/dist/components/Toast/useToast.d.ts +28 -0
- package/dist/components/Tooltip/Tooltip.d.ts +66 -0
- package/dist/components/Tooltip/index.d.ts +2 -0
- package/dist/hooks/useClickOutside.d.ts +74 -0
- package/dist/hooks/useEscapeKey.d.ts +29 -0
- package/dist/hooks/useHistoryClose.d.ts +50 -0
- package/dist/hooks/useScrollLock.d.ts +19 -0
- package/dist/index.d.ts +37 -0
- package/dist/motile-ui.es.js +2356 -0
- package/dist/motile-ui.umd.js +2 -0
- package/dist/utils/Slot.d.ts +4 -0
- package/package.json +81 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Innopers
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="https://github.com/Innopers.png" alt="Motile UI Logo" width="200"/>
|
|
3
|
+
|
|
4
|
+
# Motile UI
|
|
5
|
+
|
|
6
|
+
**웹뷰 애플리케이션을 위한 모던 React 컴포넌트 라이브러리**
|
|
7
|
+
|
|
8
|
+
[](https://www.npmjs.com/package/motile-ui)
|
|
9
|
+
[](https://www.npmjs.com/package/motile-ui)
|
|
10
|
+
[](https://github.com/Innopers/motile-ui/blob/main/LICENSE)
|
|
11
|
+
[](https://www.typescriptlang.org/)
|
|
12
|
+
|
|
13
|
+
<br/>
|
|
14
|
+
|
|
15
|
+
**[🇰🇷 한국어](#-한국어) | [🇺🇸 English](#-english)**
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
<br/>
|
|
22
|
+
<br/>
|
|
23
|
+
|
|
24
|
+
# 🇰🇷 한국어
|
|
25
|
+
|
|
26
|
+
## 📚 목차
|
|
27
|
+
|
|
28
|
+
- [주요 기능](#-주요-기능)
|
|
29
|
+
- [설치](#-설치)
|
|
30
|
+
- [빠른 시작](#-빠른-시작)
|
|
31
|
+
- [컴포넌트](#-컴포넌트)
|
|
32
|
+
- [라이선스](#-라이선스)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## ✨ 주요 기능
|
|
37
|
+
|
|
38
|
+
- 🎨 **17개의 고품질 컴포넌트** - 웹뷰 애플리케이션을 위해 세심하게 제작
|
|
39
|
+
- 💪 **TypeScript 우선** - 포괄적인 타입 정의 완벽 지원
|
|
40
|
+
- 🎭 **커스터마이징 가능** - CSS 변수로 쉬운 테마 설정
|
|
41
|
+
- 📱 **모바일 최적화** - 터치 친화적 인터랙션과 반응형 디자인
|
|
42
|
+
- ♿ **접근성** - WCAG 2.1 AA 준수 컴포넌트
|
|
43
|
+
- 🎯 **트리쉐이킹 지원** - 필요한 것만 import
|
|
44
|
+
- 📖 **풍부한 문서** - Storybook을 통한 라이브 예제 제공
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 📦 설치
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# npm
|
|
52
|
+
npm install motile-ui
|
|
53
|
+
|
|
54
|
+
# yarn
|
|
55
|
+
yarn add motile-ui
|
|
56
|
+
|
|
57
|
+
# pnpm
|
|
58
|
+
pnpm add motile-ui
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 🚀 빠른 시작
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
import { Button, Input, Modal } from 'motile-ui'
|
|
67
|
+
|
|
68
|
+
function App() {
|
|
69
|
+
return (
|
|
70
|
+
<div>
|
|
71
|
+
<Button variant="primary" size="large">
|
|
72
|
+
클릭하세요
|
|
73
|
+
</Button>
|
|
74
|
+
|
|
75
|
+
<Input
|
|
76
|
+
label="이메일"
|
|
77
|
+
placeholder="이메일을 입력하세요"
|
|
78
|
+
type="email"
|
|
79
|
+
/>
|
|
80
|
+
|
|
81
|
+
<Modal open={true} onClose={() => {}}>
|
|
82
|
+
<h2>안녕하세요 Motile UI!</h2>
|
|
83
|
+
</Modal>
|
|
84
|
+
</div>
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 🎨 컴포넌트
|
|
92
|
+
|
|
93
|
+
- **Button** - 다양한 variant와 size를 지원하는 버튼
|
|
94
|
+
- **Input** - 라벨과 검증 기능이 있는 텍스트 입력 필드
|
|
95
|
+
- **Textarea** - 여러 줄 텍스트 입력 필드
|
|
96
|
+
- **Checkbox** - 체크박스 입력
|
|
97
|
+
- **Switch** - 토글 스위치
|
|
98
|
+
- **Select** - 드롭다운 선택 메뉴
|
|
99
|
+
- **Badge** - 상태 표시 배지
|
|
100
|
+
- **Toast** - 알림 메시지
|
|
101
|
+
- **Skeleton** - 로딩 상태 플레이스홀더
|
|
102
|
+
- **SpeedDial** - 플로팅 액션 버튼
|
|
103
|
+
- **Modal** - 모달 다이얼로그
|
|
104
|
+
- **Drawer** - 사이드 패널
|
|
105
|
+
- **Sheet** - 하단 시트
|
|
106
|
+
- **Popover** - 팝오버 메뉴
|
|
107
|
+
- **Tooltip** - 툴팁
|
|
108
|
+
- **Accordion** - 접을 수 있는 패널
|
|
109
|
+
- **Dock** - 하단 네비게이션 바
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 📄 라이선스
|
|
114
|
+
|
|
115
|
+
MIT © [Innopers](https://github.com/Innopers)
|
|
116
|
+
|
|
117
|
+
<br/>
|
|
118
|
+
<br/>
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
<br/>
|
|
123
|
+
<br/>
|
|
124
|
+
|
|
125
|
+
# 🇺🇸 English
|
|
126
|
+
|
|
127
|
+
## 📚 Table of Contents
|
|
128
|
+
|
|
129
|
+
- [Features](#-features)
|
|
130
|
+
- [Installation](#-installation)
|
|
131
|
+
- [Quick Start](#-quick-start)
|
|
132
|
+
- [Components](#-components)
|
|
133
|
+
- [License](#-license)
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## ✨ Features
|
|
138
|
+
|
|
139
|
+
- 🎨 **17 High-Quality Components** - Carefully crafted for webview applications
|
|
140
|
+
- 💪 **TypeScript First** - Full TypeScript support with comprehensive type definitions
|
|
141
|
+
- 🎭 **Customizable** - Easy theming with CSS variables
|
|
142
|
+
- 📱 **Mobile Optimized** - Touch-friendly interactions and responsive design
|
|
143
|
+
- ♿ **Accessible** - WCAG 2.1 AA compliant components
|
|
144
|
+
- 🎯 **Tree-shakeable** - Import only what you need
|
|
145
|
+
- 📖 **Well Documented** - Comprehensive docs with live examples via Storybook
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 📦 Installation
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# npm
|
|
153
|
+
npm install motile-ui
|
|
154
|
+
|
|
155
|
+
# yarn
|
|
156
|
+
yarn add motile-ui
|
|
157
|
+
|
|
158
|
+
# pnpm
|
|
159
|
+
pnpm add motile-ui
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 🚀 Quick Start
|
|
165
|
+
|
|
166
|
+
```tsx
|
|
167
|
+
import { Button, Input, Modal } from 'motile-ui'
|
|
168
|
+
|
|
169
|
+
function App() {
|
|
170
|
+
return (
|
|
171
|
+
<div>
|
|
172
|
+
<Button variant="primary" size="large">
|
|
173
|
+
Click me
|
|
174
|
+
</Button>
|
|
175
|
+
|
|
176
|
+
<Input
|
|
177
|
+
label="Email"
|
|
178
|
+
placeholder="Enter your email"
|
|
179
|
+
type="email"
|
|
180
|
+
/>
|
|
181
|
+
|
|
182
|
+
<Modal open={true} onClose={() => {}}>
|
|
183
|
+
<h2>Hello Motile UI!</h2>
|
|
184
|
+
</Modal>
|
|
185
|
+
</div>
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 🎨 Components
|
|
193
|
+
|
|
194
|
+
- **Button** - Button with various variants and sizes
|
|
195
|
+
- **Input** - Text input field with label and validation
|
|
196
|
+
- **Textarea** - Multi-line text input field
|
|
197
|
+
- **Checkbox** - Checkbox input
|
|
198
|
+
- **Switch** - Toggle switch
|
|
199
|
+
- **Select** - Dropdown select menu
|
|
200
|
+
- **Badge** - Status badge indicator
|
|
201
|
+
- **Toast** - Notification message
|
|
202
|
+
- **Skeleton** - Loading state placeholder
|
|
203
|
+
- **SpeedDial** - Floating action button
|
|
204
|
+
- **Modal** - Modal dialog
|
|
205
|
+
- **Drawer** - Side panel
|
|
206
|
+
- **Sheet** - Bottom sheet
|
|
207
|
+
- **Popover** - Popover menu
|
|
208
|
+
- **Tooltip** - Tooltip
|
|
209
|
+
- **Accordion** - Collapsible panel
|
|
210
|
+
- **Dock** - Bottom navigation bar
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 📄 License
|
|
215
|
+
|
|
216
|
+
MIT © [Innopers](https://github.com/Innopers)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type AccordionVariant = "default" | "outlined";
|
|
3
|
+
export interface AccordionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
|
|
4
|
+
variant?: AccordionVariant;
|
|
5
|
+
defaultExpanded?: boolean;
|
|
6
|
+
expanded?: boolean;
|
|
7
|
+
onChange?: (expanded: boolean) => void;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
/**
|
|
11
|
+
* children을 wrapper 없이 직접 렌더링
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
14
|
+
asChild?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface AccordionHeaderProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
17
|
+
children: React.ReactNode;
|
|
18
|
+
/**
|
|
19
|
+
* children을 wrapper 없이 직접 렌더링
|
|
20
|
+
* true일 경우, children이 직접 button 역할을 함
|
|
21
|
+
* @default false
|
|
22
|
+
*/
|
|
23
|
+
asChild?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface AccordionContentProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
26
|
+
children: React.ReactNode;
|
|
27
|
+
/**
|
|
28
|
+
* children을 wrapper 없이 직접 렌더링
|
|
29
|
+
* @default false
|
|
30
|
+
*/
|
|
31
|
+
asChild?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare const Accordion: React.ForwardRefExoticComponent<AccordionProps & React.RefAttributes<HTMLDivElement>> & {
|
|
34
|
+
Header: React.ForwardRefExoticComponent<AccordionHeaderProps & React.RefAttributes<HTMLButtonElement>>;
|
|
35
|
+
Content: React.ForwardRefExoticComponent<AccordionContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
36
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
type BadgeVariant = "primary" | "secondary" | "outlined" | "dot" | "shimmer";
|
|
3
|
+
type BadgeSize = "large" | "medium" | "small";
|
|
4
|
+
export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
5
|
+
/**
|
|
6
|
+
* Badge 스타일 variant
|
|
7
|
+
*/
|
|
8
|
+
variant?: BadgeVariant;
|
|
9
|
+
/**
|
|
10
|
+
* Badge 크기
|
|
11
|
+
* @default 'medium'
|
|
12
|
+
*/
|
|
13
|
+
size?: BadgeSize;
|
|
14
|
+
/**
|
|
15
|
+
* Badge 배경 색상 (우선순위 1)
|
|
16
|
+
* @example '#10b981'
|
|
17
|
+
*/
|
|
18
|
+
color?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Badge 내용
|
|
21
|
+
*/
|
|
22
|
+
children?: React.ReactNode;
|
|
23
|
+
}
|
|
24
|
+
export declare const Badge: React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLSpanElement>>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
type ButtonVariant = "primary" | "secondary" | "default";
|
|
3
|
+
type ButtonSize = "large" | "medium" | "small";
|
|
4
|
+
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
5
|
+
/**
|
|
6
|
+
* 버튼 스타일 variant
|
|
7
|
+
* @default 'primary'
|
|
8
|
+
*/
|
|
9
|
+
variant?: ButtonVariant;
|
|
10
|
+
/**
|
|
11
|
+
* 버튼 크기
|
|
12
|
+
* @default 'large'
|
|
13
|
+
*/
|
|
14
|
+
size?: ButtonSize;
|
|
15
|
+
/**
|
|
16
|
+
* 전체 너비 사용 여부
|
|
17
|
+
* @default size === "large" ? true : false
|
|
18
|
+
*/
|
|
19
|
+
fullWidth?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 버튼 배경 색상 (우선순위 1)
|
|
22
|
+
* @example '#10b981'
|
|
23
|
+
*/
|
|
24
|
+
color?: string;
|
|
25
|
+
/**
|
|
26
|
+
* 터치 디바이스에서도 hover 효과 활성화 여부
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
hoverOnTouch?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* 로딩 상태 (로딩 중일 때 버튼 비활성화)
|
|
32
|
+
* @default false
|
|
33
|
+
*/
|
|
34
|
+
isLoading?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* children을 wrapper 없이 직접 렌더링
|
|
37
|
+
* true일 경우, children이 직접 button 역할을 함
|
|
38
|
+
* @default false
|
|
39
|
+
*/
|
|
40
|
+
asChild?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* 버튼 내용
|
|
43
|
+
*/
|
|
44
|
+
children: React.ReactNode;
|
|
45
|
+
}
|
|
46
|
+
export declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
type CheckboxVariant = "default" | "rounded" | "square";
|
|
3
|
+
type CheckboxSize = "large" | "medium" | "small";
|
|
4
|
+
export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type" | "size"> {
|
|
5
|
+
/**
|
|
6
|
+
* 체크박스 스타일 variant
|
|
7
|
+
* @default 'default'
|
|
8
|
+
*/
|
|
9
|
+
variant?: CheckboxVariant;
|
|
10
|
+
/**
|
|
11
|
+
* 체크박스 크기
|
|
12
|
+
* @default 'medium'
|
|
13
|
+
*/
|
|
14
|
+
size?: CheckboxSize;
|
|
15
|
+
/**
|
|
16
|
+
* 체크박스 옆 라벨
|
|
17
|
+
*/
|
|
18
|
+
label?: string;
|
|
19
|
+
/**
|
|
20
|
+
* 체크박스 색상
|
|
21
|
+
* @example '#10b981'
|
|
22
|
+
*/
|
|
23
|
+
color?: string;
|
|
24
|
+
/**
|
|
25
|
+
* 체크 아이콘을 항상 표시 (회색 배경 → 색상 배경)
|
|
26
|
+
* @default false
|
|
27
|
+
*/
|
|
28
|
+
filled?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Dock Position
|
|
4
|
+
*/
|
|
5
|
+
export type DockPosition = "top" | "bottom" | "left" | "right";
|
|
6
|
+
/**
|
|
7
|
+
* Dock Root Props
|
|
8
|
+
*/
|
|
9
|
+
export interface DockRootProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
10
|
+
/**
|
|
11
|
+
* 자식 요소
|
|
12
|
+
*/
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* Dock 위치
|
|
16
|
+
* @default "bottom"
|
|
17
|
+
*/
|
|
18
|
+
position?: DockPosition;
|
|
19
|
+
/**
|
|
20
|
+
* z-index 값
|
|
21
|
+
* @default 1000
|
|
22
|
+
*/
|
|
23
|
+
zIndex?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Glow effect 기본 색상 (모든 Item에 적용)
|
|
26
|
+
* 우선순위: Item.color > Root.color > --motile-ui-dock > --motile-theme > #3b82f6
|
|
27
|
+
* @example '#3b82f6'
|
|
28
|
+
*/
|
|
29
|
+
color?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Dock Item Props
|
|
33
|
+
*/
|
|
34
|
+
export interface DockItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
35
|
+
/**
|
|
36
|
+
* 아이콘 (ReactNode)
|
|
37
|
+
*/
|
|
38
|
+
icon?: React.ReactNode;
|
|
39
|
+
/**
|
|
40
|
+
* 라벨 (툴팁)
|
|
41
|
+
*/
|
|
42
|
+
label?: string;
|
|
43
|
+
/**
|
|
44
|
+
* 커스텀 자식 요소 사용
|
|
45
|
+
*/
|
|
46
|
+
asChild?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Glow effect 개별 색상 (Root.color를 override)
|
|
49
|
+
* 우선순위: Item.color > Root.color > --motile-ui-dock > --motile-theme > #3b82f6
|
|
50
|
+
* @example '#3b82f6'
|
|
51
|
+
*/
|
|
52
|
+
color?: string;
|
|
53
|
+
}
|
|
54
|
+
export declare const DockRoot: React.ForwardRefExoticComponent<DockRootProps & React.RefAttributes<HTMLDivElement>>;
|
|
55
|
+
export declare const DockItem: React.ForwardRefExoticComponent<DockItemProps & React.RefAttributes<HTMLButtonElement>>;
|
|
56
|
+
export interface DockSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
57
|
+
}
|
|
58
|
+
export declare const DockSeparator: React.ForwardRefExoticComponent<DockSeparatorProps & React.RefAttributes<HTMLDivElement>>;
|
|
59
|
+
export declare const Dock: {
|
|
60
|
+
Root: React.ForwardRefExoticComponent<DockRootProps & React.RefAttributes<HTMLDivElement>>;
|
|
61
|
+
Item: React.ForwardRefExoticComponent<DockItemProps & React.RefAttributes<HTMLButtonElement>>;
|
|
62
|
+
Separator: React.ForwardRefExoticComponent<DockSeparatorProps & React.RefAttributes<HTMLDivElement>>;
|
|
63
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 백드롭 인터랙션으로 닫기 옵션
|
|
4
|
+
*/
|
|
5
|
+
export type CloseOnBackdropOptions = boolean | {
|
|
6
|
+
escapeKey?: boolean;
|
|
7
|
+
clickOutside?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export interface DrawerRootProps {
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* Drawer 열림/닫힘 상태 (controlled)
|
|
13
|
+
*/
|
|
14
|
+
open?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Drawer 기본 열림 상태 (uncontrolled)
|
|
17
|
+
* @default false
|
|
18
|
+
*/
|
|
19
|
+
defaultOpen?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 상태 변경 시 호출되는 콜백
|
|
22
|
+
*/
|
|
23
|
+
onOpenChange?: (open: boolean) => void;
|
|
24
|
+
/**
|
|
25
|
+
* 백드롭 인터랙션으로 닫기 허용
|
|
26
|
+
* @default true
|
|
27
|
+
*/
|
|
28
|
+
closeOnBackdrop?: CloseOnBackdropOptions;
|
|
29
|
+
/**
|
|
30
|
+
* 드래그로 닫기 허용
|
|
31
|
+
* @default true
|
|
32
|
+
*/
|
|
33
|
+
closeOnDrag?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Drawer 최대 높이
|
|
36
|
+
* @default '70dvh'
|
|
37
|
+
*/
|
|
38
|
+
maxHeight?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Drawer 너비 (데스크톱)
|
|
41
|
+
* @default '480px'
|
|
42
|
+
*/
|
|
43
|
+
width?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Drawer 최대 컨테이너 너비 (데스크톱 전용)
|
|
46
|
+
*/
|
|
47
|
+
maxWidth?: string;
|
|
48
|
+
/**
|
|
49
|
+
* z-index 값
|
|
50
|
+
* @default 9999
|
|
51
|
+
*/
|
|
52
|
+
zIndex?: number;
|
|
53
|
+
}
|
|
54
|
+
export declare const DrawerRoot: React.FC<DrawerRootProps>;
|
|
55
|
+
export interface DrawerTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
56
|
+
children: React.ReactElement;
|
|
57
|
+
asChild?: boolean;
|
|
58
|
+
}
|
|
59
|
+
export declare const DrawerTrigger: React.ForwardRefExoticComponent<DrawerTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
60
|
+
export interface DrawerPortalProps {
|
|
61
|
+
children: React.ReactNode;
|
|
62
|
+
container?: HTMLElement;
|
|
63
|
+
}
|
|
64
|
+
export declare const DrawerPortal: React.FC<DrawerPortalProps>;
|
|
65
|
+
export interface DrawerOverlayProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
66
|
+
}
|
|
67
|
+
export declare const DrawerOverlay: React.ForwardRefExoticComponent<DrawerOverlayProps & React.RefAttributes<HTMLDivElement>>;
|
|
68
|
+
export interface DrawerContentProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
69
|
+
}
|
|
70
|
+
export declare const DrawerContent: React.ForwardRefExoticComponent<DrawerContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
71
|
+
export interface DrawerHandleProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
72
|
+
}
|
|
73
|
+
export declare const DrawerHandle: React.ForwardRefExoticComponent<DrawerHandleProps & React.RefAttributes<HTMLDivElement>>;
|
|
74
|
+
export interface DrawerTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
|
|
75
|
+
children: React.ReactNode;
|
|
76
|
+
asChild?: boolean;
|
|
77
|
+
}
|
|
78
|
+
export declare const DrawerTitle: React.ForwardRefExoticComponent<DrawerTitleProps & React.RefAttributes<HTMLHeadingElement>>;
|
|
79
|
+
export interface DrawerBodyProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
80
|
+
}
|
|
81
|
+
export declare const DrawerBody: React.ForwardRefExoticComponent<DrawerBodyProps & React.RefAttributes<HTMLDivElement>>;
|
|
82
|
+
export interface DrawerCloseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
83
|
+
children: React.ReactElement;
|
|
84
|
+
asChild?: boolean;
|
|
85
|
+
}
|
|
86
|
+
export declare const DrawerClose: React.ForwardRefExoticComponent<DrawerCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
87
|
+
export declare const Drawer: {
|
|
88
|
+
Root: React.FC<DrawerRootProps>;
|
|
89
|
+
Trigger: React.ForwardRefExoticComponent<DrawerTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
90
|
+
Portal: React.FC<DrawerPortalProps>;
|
|
91
|
+
Overlay: React.ForwardRefExoticComponent<DrawerOverlayProps & React.RefAttributes<HTMLDivElement>>;
|
|
92
|
+
Content: React.ForwardRefExoticComponent<DrawerContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
93
|
+
Handle: React.ForwardRefExoticComponent<DrawerHandleProps & React.RefAttributes<HTMLDivElement>>;
|
|
94
|
+
Title: React.ForwardRefExoticComponent<DrawerTitleProps & React.RefAttributes<HTMLHeadingElement>>;
|
|
95
|
+
Body: React.ForwardRefExoticComponent<DrawerBodyProps & React.RefAttributes<HTMLDivElement>>;
|
|
96
|
+
Close: React.ForwardRefExoticComponent<DrawerCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
97
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
|
|
3
|
+
/**
|
|
4
|
+
* 자동 포커스 여부
|
|
5
|
+
* @default false
|
|
6
|
+
*/
|
|
7
|
+
autoFocus?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* 자동 텍스트 선택 여부 (autoFocus와 함께 사용)
|
|
10
|
+
* @default false
|
|
11
|
+
*/
|
|
12
|
+
autoSelect?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Input 스타일 variant
|
|
15
|
+
* @default 'default'
|
|
16
|
+
*/
|
|
17
|
+
variant?: "default" | "underline";
|
|
18
|
+
/**
|
|
19
|
+
* 에러 상태
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
isError?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* 에러 메시지 (isError가 명시되지 않으면 에러 상태로 표시)
|
|
25
|
+
*/
|
|
26
|
+
errorMessage?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Clear 버튼 클릭 핸들러
|
|
29
|
+
*/
|
|
30
|
+
onClear?: () => void;
|
|
31
|
+
/**
|
|
32
|
+
* 왼쪽 아이콘
|
|
33
|
+
*/
|
|
34
|
+
leftIcon?: React.ReactNode;
|
|
35
|
+
/**
|
|
36
|
+
* 오른쪽 아이콘
|
|
37
|
+
*/
|
|
38
|
+
rightIcon?: React.ReactNode;
|
|
39
|
+
/**
|
|
40
|
+
* Input 테두리/포커스 색상 (우선순위 1)
|
|
41
|
+
* @example '#10b981'
|
|
42
|
+
*/
|
|
43
|
+
color?: string;
|
|
44
|
+
/**
|
|
45
|
+
* 최대 글자수 (설정 시 자동으로 글자수 카운터 표시)
|
|
46
|
+
*/
|
|
47
|
+
maxLength?: number;
|
|
48
|
+
/**
|
|
49
|
+
* Floating label (focus 전에는 placeholder 위치, focus/값 있을 때 위로 이동)
|
|
50
|
+
*/
|
|
51
|
+
label?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
|