@bigtablet/design-system 3.6.0 → 3.8.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 +53 -0
- package/README.md +12 -9
- package/dist/index.css +46 -45
- package/dist/index.d.ts +85 -10
- package/dist/index.js +450 -267
- package/dist/styles/colors/_index.scss +30 -0
- package/dist/styles/layout/_index.scss +17 -3
- package/dist/styles/motion/_index.scss +14 -1
- package/dist/vanilla/bigtablet.min.css +7 -1
- package/dist/vanilla/bigtablet.min.js +21 -21
- package/package.json +7 -6
package/LICENSE
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Bigtablet Inc. Open Source License
|
|
2
|
+
|
|
3
|
+
## Table of Contents / 목차
|
|
4
|
+
- [English Version](#english-version)
|
|
5
|
+
- [한국어 버전](#한국어-버전)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## English Version
|
|
10
|
+
|
|
11
|
+
This license is issued by **Bigtablet Inc.** (hereinafter referred to as the "Copyright Holder") and is intended to provide the source code to developers, researchers, and other users (hereinafter referred to as "Users").
|
|
12
|
+
Any use that contradicts the purposes stated below is strictly prohibited.
|
|
13
|
+
|
|
14
|
+
### Terms and Conditions
|
|
15
|
+
|
|
16
|
+
1. All copyrights for the source code and files opened within this GitHub organization belong to the Copyright Holder.
|
|
17
|
+
2. All open-source materials are, by default, permitted for **non-commercial use only**.
|
|
18
|
+
3. Any User who uses, modifies, processes, redistributes, or conducts research with part or all of the open source must clearly indicate the source by referencing the link to the original GitHub repository.
|
|
19
|
+
4. Commercial use of the open source without explicit or implicit permission from the Copyright Holder is strictly prohibited. For inquiries regarding commercial use, please contact the email address provided in the profile.
|
|
20
|
+
5. Users are obligated to report any issues, errors, or security vulnerabilities discovered or encountered while using the open source to the Copyright Holder, and are prohibited from exploiting or disclosing them to external parties.
|
|
21
|
+
6. If unauthorized commercial use is detected, the Copyright Holder reserves the right to take legal action.
|
|
22
|
+
7. By cloning, forking, or otherwise copying and using a repository containing this open source, the User is deemed to have fully understood and agreed to all the terms of this license.
|
|
23
|
+
8. This license shall take effect from **September 9, 2025**, and shall have legal force and effect from that date.
|
|
24
|
+
9. For any additional inquiries, please contact the email address listed in the profile.
|
|
25
|
+
|
|
26
|
+
### Disclaimer
|
|
27
|
+
|
|
28
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
|
|
29
|
+
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 한국어 버전
|
|
34
|
+
|
|
35
|
+
본 라이선스는 **Bigtablet Inc.**(이하 “저작권자”)에서 발행하였으며, 개발자, 연구자 등 (이하 “사용자”)에게 소스코드를 제공하기 위한 목적으로 공개합니다.
|
|
36
|
+
아래에 기재된 목적에 반하는 사용은 엄격히 금지됩니다.
|
|
37
|
+
|
|
38
|
+
### 조항
|
|
39
|
+
|
|
40
|
+
1. 본 GitHub 조직에 공개된 모든 소스코드와 파일에 대한 저작권은 저작권자에게 있습니다.
|
|
41
|
+
2. 모든 오픈소스는 원칙적으로 **비상업적 목적**으로만 이용할 수 있습니다.
|
|
42
|
+
3. 모든 사용자는 오픈소스의 일부 또는 전체를 사용, 수정, 가공, 재배포, 연구할 경우 반드시 해당 GitHub 저장소 링크를 통해 출처를 명시해야 합니다.
|
|
43
|
+
4. 저작권자의 명시적 또는 묵시적 허가 없이 오픈소스를 상업적 목적으로 이용하는 것을 금합니다. 상업적 이용 문의는 프로필에 기재된 이메일로 연락하시기 바랍니다.
|
|
44
|
+
5. 사용자는 오픈소스를 이용하는 중 발견되거나 발생한 문제, 오류, 보안 취약점을 저작권자에게 보고할 의무가 있으며 이를 악용하거나 외부로 공유하는 것을 금합니다.
|
|
45
|
+
6. 무단으로 상업적 이용이 적발될 경우 저작권자는 법적 조치를 취할 권리를 가집니다.
|
|
46
|
+
7. 오픈소스가 포함된 저장소를 clone, fork 또는 기타 방법으로 복제하여 이용하는 경우, 사용자는 본 라이선스의 모든 조항을 충분히 숙지하였으며 이에 동의한 것으로 간주됩니다.
|
|
47
|
+
8. 본 라이선스는 **2025년 9월 9일**부터 발효되며, 해당 시점부터 법적 효력을 가집니다.
|
|
48
|
+
9. 기타 문의 사항은 프로필에 기재된 이메일로 연락하시기 바랍니다.
|
|
49
|
+
|
|
50
|
+
### 면책 조항
|
|
51
|
+
|
|
52
|
+
이 소프트웨어는 **“있는 그대로(As-Is)”** 제공되며, 상품성, 특정 목적에의 적합성, 비침해를 포함하되 이에 국한되지 않는 어떠한 형태의 명시적 또는 묵시적 보증도 하지 않습니다.
|
|
53
|
+
저작권자 또는 기여자는 계약, 불법행위, 기타 어떠한 법적 근거에 의한 것이든 간에, 본 소프트웨어 또는 이를 사용하거나 다른 방식으로 이용함으로 인해 발생하는 모든 청구, 손해, 기타 법적 책임에 대해 책임을 지지 않습니다.
|
package/README.md
CHANGED
|
@@ -45,7 +45,7 @@ A complete React + TypeScript design system maintained by Bigtablet for internal
|
|
|
45
45
|
## What's inside
|
|
46
46
|
|
|
47
47
|
- **40+ components** across forms, display, feedback, navigation, overlay, and layout<br />
|
|
48
|
-
- **
|
|
48
|
+
- **13 token domains** - colors, typography, spacing, motion, radius, elevation, and more - exposed as SCSS variables and CSS custom properties (plus a SCSS-only `layout` domain)<br />
|
|
49
49
|
- **Light + dark mode** out of the box. `[data-theme="dark"]` or `prefers-color-scheme`, no theme provider required (but available via `ThemeProvider` for runtime toggling)<br />
|
|
50
50
|
- **Vanilla JS bundle** for non-React backends - Thymeleaf, JSP, PHP, Django<br />
|
|
51
51
|
- **Accessibility tested** with axe-core in CI · keyboard nav · ARIA throughout
|
|
@@ -58,7 +58,7 @@ A complete React + TypeScript design system maintained by Bigtablet for internal
|
|
|
58
58
|
pnpm add @bigtablet/design-system react@^19 react-dom@^19 lucide-react
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
Requires React 19 + lucide-react ≥ 0.552.
|
|
61
|
+
Requires React 19 + lucide-react ≥ 0.552. Next.js is an optional peer dependency at `>=15`.
|
|
62
62
|
|
|
63
63
|
<details>
|
|
64
64
|
<summary><b>One-line setup</b> - auto-detect package manager + framework</summary>
|
|
@@ -102,12 +102,13 @@ showAlert({ title: "Delete?", showCancel: true, onConfirm: ... });
|
|
|
102
102
|
## Components
|
|
103
103
|
|
|
104
104
|
<table>
|
|
105
|
-
<tr><td><b>Forms</b></td><td>Button · IconButton · TextField · Textarea · Checkbox · Radio · Toggle · Dropdown · DatePicker · FileInput ·
|
|
105
|
+
<tr><td><b>Forms</b></td><td>Button · IconButton · TextField · Textarea · Checkbox · Radio · RadioGroup · Toggle · Dropdown · DatePicker · FileInput · ImageCropper · OtpInput</td></tr>
|
|
106
106
|
<tr><td><b>Display</b></td><td>Card · MediaCard · Hero · Avatar · Badge · Chip · ListItem · Table · Divider · Icon · Accordion</td></tr>
|
|
107
107
|
<tr><td><b>Feedback</b></td><td>Alert · Toast · Spinner · TopLoading · LinearProgress · Skeleton · EmptyState · ErrorState</td></tr>
|
|
108
108
|
<tr><td><b>Navigation</b></td><td>Tabs · Sidebar · BottomNav · NavBar · Breadcrumb · Menu · Pagination</td></tr>
|
|
109
|
-
<tr><td><b>Overlay</b></td><td>Modal · Tooltip</td></tr>
|
|
109
|
+
<tr><td><b>Overlay</b></td><td>Modal · Drawer · Tooltip · Popover</td></tr>
|
|
110
110
|
<tr><td><b>Layout</b></td><td>Container · Section · Stack · Grid</td></tr>
|
|
111
|
+
<tr><td><b>System</b></td><td>ThemeProvider</td></tr>
|
|
111
112
|
</table>
|
|
112
113
|
|
|
113
114
|
→ Full API · [`docs/COMPONENTS.md`](./docs/COMPONENTS.md)
|
|
@@ -117,7 +118,7 @@ showAlert({ title: "Delete?", showCancel: true, onConfirm: ... });
|
|
|
117
118
|
## Design tokens
|
|
118
119
|
|
|
119
120
|
```scss
|
|
120
|
-
@use "
|
|
121
|
+
@use "@bigtablet/design-system/scss/token" as token;
|
|
121
122
|
|
|
122
123
|
.card {
|
|
123
124
|
background: token.$color_bg_solid;
|
|
@@ -129,16 +130,18 @@ showAlert({ title: "Delete?", showCancel: true, onConfirm: ... });
|
|
|
129
130
|
```
|
|
130
131
|
|
|
131
132
|
```css
|
|
133
|
+
/* from @bigtablet/design-system/style.css */
|
|
132
134
|
.card {
|
|
133
135
|
background: var(--bt-color-bg-solid);
|
|
134
136
|
color: var(--bt-color-text-heading);
|
|
135
|
-
|
|
136
|
-
border-radius: var(--bt-radius-md);
|
|
137
|
+
border: 1px solid var(--bt-color-border-default);
|
|
137
138
|
box-shadow: var(--bt-elevation-level1);
|
|
138
139
|
}
|
|
139
140
|
```
|
|
140
141
|
|
|
141
|
-
`
|
|
142
|
+
> The React entry's `style.css` only emits `--bt-color-*`, `--bt-elevation-*`, `--bt-focus-*`, `--bt-sidebar-*`, and `--bt-bottom-nav-*`. Spacing, radius, and typography are **SCSS-only** on this entry - use `scss/token` for them (`--bt-spacing-*` / `--bt-radius-*` exist only in the [Vanilla bundle](./docs/VANILLA.md)).
|
|
143
|
+
|
|
144
|
+
`colors` · `spacing` · `typography` · `radius` · `elevation` · `motion` · `z-index` · `breakpoints` · `border-width` · `opacity` · `skeleton` · `icon` · `a11y` · `layout`<sup>SCSS only</sup>
|
|
142
145
|
|
|
143
146
|
<br />
|
|
144
147
|
|
|
@@ -150,7 +153,7 @@ For server-rendered apps (Thymeleaf, JSP, PHP, Django):
|
|
|
150
153
|
<link rel="stylesheet" href="https://unpkg.com/@bigtablet/design-system/dist/vanilla/bigtablet.min.css">
|
|
151
154
|
<script src="https://unpkg.com/@bigtablet/design-system/dist/vanilla/bigtablet.min.js"></script>
|
|
152
155
|
|
|
153
|
-
<button class="bt-button bt-button--md bt-button--
|
|
156
|
+
<button class="bt-button bt-button--md bt-button--filled">Filled</button>
|
|
154
157
|
```
|
|
155
158
|
|
|
156
159
|
→ Full guide · [`docs/VANILLA.md`](./docs/VANILLA.md)
|
package/dist/index.css
CHANGED
|
@@ -743,6 +743,11 @@
|
|
|
743
743
|
align-items: center;
|
|
744
744
|
color: var(--bt-color-text-caption);
|
|
745
745
|
}
|
|
746
|
+
@media (prefers-reduced-motion: reduce) {
|
|
747
|
+
.breadcrumb_link {
|
|
748
|
+
transition: none;
|
|
749
|
+
}
|
|
750
|
+
}
|
|
746
751
|
|
|
747
752
|
/* src/ui/navigation/menu/style.scss */
|
|
748
753
|
@keyframes skeleton_loading {
|
|
@@ -1559,38 +1564,18 @@
|
|
|
1559
1564
|
display: inline-flex;
|
|
1560
1565
|
}
|
|
1561
1566
|
.popover_position {
|
|
1562
|
-
position: absolute;
|
|
1563
1567
|
z-index: 1000;
|
|
1564
1568
|
width: max-content;
|
|
1565
1569
|
}
|
|
1566
|
-
.popover_position.popover_placement_top {
|
|
1567
|
-
bottom: calc(100% + 8px);
|
|
1568
|
-
left: 50%;
|
|
1569
|
-
transform: translateX(-50%);
|
|
1570
|
-
}
|
|
1571
|
-
.popover_position.popover_placement_bottom {
|
|
1572
|
-
top: calc(100% + 8px);
|
|
1573
|
-
left: 50%;
|
|
1574
|
-
transform: translateX(-50%);
|
|
1575
|
-
}
|
|
1576
|
-
.popover_position.popover_placement_left {
|
|
1577
|
-
right: calc(100% + 8px);
|
|
1578
|
-
top: 50%;
|
|
1579
|
-
transform: translateY(-50%);
|
|
1580
|
-
}
|
|
1581
|
-
.popover_position.popover_placement_right {
|
|
1582
|
-
left: calc(100% + 8px);
|
|
1583
|
-
top: 50%;
|
|
1584
|
-
transform: translateY(-50%);
|
|
1585
|
-
}
|
|
1586
1570
|
.popover {
|
|
1587
1571
|
background: var(--bt-color-bg-solid);
|
|
1588
1572
|
border: 1px solid var(--bt-color-border-default);
|
|
1589
1573
|
border-radius: 12px;
|
|
1590
1574
|
box-shadow: var(--bt-elevation-level2);
|
|
1591
1575
|
padding: 16px;
|
|
1592
|
-
|
|
1593
|
-
|
|
1576
|
+
box-sizing: border-box;
|
|
1577
|
+
min-width: min(200px, 100%);
|
|
1578
|
+
max-width: min(320px, 100%);
|
|
1594
1579
|
color: var(--bt-color-text-body);
|
|
1595
1580
|
font-size: 14px;
|
|
1596
1581
|
font-weight: 400;
|
|
@@ -1632,31 +1617,10 @@
|
|
|
1632
1617
|
vertical-align: middle;
|
|
1633
1618
|
}
|
|
1634
1619
|
.tooltip_position {
|
|
1635
|
-
position: absolute;
|
|
1636
1620
|
z-index: 1000;
|
|
1637
1621
|
display: block;
|
|
1638
1622
|
width: max-content;
|
|
1639
1623
|
}
|
|
1640
|
-
.tooltip_position.tooltip_placement_top {
|
|
1641
|
-
bottom: calc(100% + 6px);
|
|
1642
|
-
left: 50%;
|
|
1643
|
-
transform: translateX(-50%);
|
|
1644
|
-
}
|
|
1645
|
-
.tooltip_position.tooltip_placement_bottom {
|
|
1646
|
-
top: calc(100% + 6px);
|
|
1647
|
-
left: 50%;
|
|
1648
|
-
transform: translateX(-50%);
|
|
1649
|
-
}
|
|
1650
|
-
.tooltip_position.tooltip_placement_left {
|
|
1651
|
-
right: calc(100% + 6px);
|
|
1652
|
-
top: 50%;
|
|
1653
|
-
transform: translateY(-50%);
|
|
1654
|
-
}
|
|
1655
|
-
.tooltip_position.tooltip_placement_right {
|
|
1656
|
-
left: calc(100% + 6px);
|
|
1657
|
-
top: 50%;
|
|
1658
|
-
transform: translateY(-50%);
|
|
1659
|
-
}
|
|
1660
1624
|
.tooltip {
|
|
1661
1625
|
display: block;
|
|
1662
1626
|
background: var(--bt-color-accent-strong);
|
|
@@ -2038,6 +2002,14 @@
|
|
|
2038
2002
|
width: 18px;
|
|
2039
2003
|
height: 18px;
|
|
2040
2004
|
}
|
|
2005
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2006
|
+
.chip,
|
|
2007
|
+
.chip::before,
|
|
2008
|
+
.chip_content::before,
|
|
2009
|
+
.chip_icon {
|
|
2010
|
+
transition: none;
|
|
2011
|
+
}
|
|
2012
|
+
}
|
|
2041
2013
|
|
|
2042
2014
|
/* src/ui/display/divider/style.scss */
|
|
2043
2015
|
@keyframes skeleton_loading {
|
|
@@ -2611,6 +2583,11 @@
|
|
|
2611
2583
|
opacity: 0.38;
|
|
2612
2584
|
pointer-events: none;
|
|
2613
2585
|
}
|
|
2586
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2587
|
+
.list_item_interactive .list_item_state_layer::before {
|
|
2588
|
+
transition: none;
|
|
2589
|
+
}
|
|
2590
|
+
}
|
|
2614
2591
|
|
|
2615
2592
|
/* src/ui/display/media-card/style.scss */
|
|
2616
2593
|
@keyframes skeleton_loading {
|
|
@@ -3588,7 +3565,7 @@
|
|
|
3588
3565
|
left: 0;
|
|
3589
3566
|
height: 3px;
|
|
3590
3567
|
border-radius: 0 0 0 12px;
|
|
3591
|
-
animation: toast_progress var(--toast-duration,
|
|
3568
|
+
animation: toast_progress var(--toast-duration, 3s) linear forwards;
|
|
3592
3569
|
}
|
|
3593
3570
|
.toast_progress_success {
|
|
3594
3571
|
background: var(--bt-color-status-success);
|
|
@@ -4423,6 +4400,11 @@
|
|
|
4423
4400
|
.otp_input_supporting_error {
|
|
4424
4401
|
color: var(--bt-color-status-error-on-surface);
|
|
4425
4402
|
}
|
|
4403
|
+
@media (prefers-reduced-motion: reduce) {
|
|
4404
|
+
.otp_input_box {
|
|
4405
|
+
transition: none;
|
|
4406
|
+
}
|
|
4407
|
+
}
|
|
4426
4408
|
|
|
4427
4409
|
/* src/ui/forms/radio-group/style.scss */
|
|
4428
4410
|
@keyframes skeleton_loading {
|
|
@@ -4936,6 +4918,14 @@
|
|
|
4936
4918
|
.text_field_disabled .text_field_helper {
|
|
4937
4919
|
opacity: 0.38;
|
|
4938
4920
|
}
|
|
4921
|
+
@media (prefers-reduced-motion: reduce) {
|
|
4922
|
+
.text_field_label,
|
|
4923
|
+
.text_field_container,
|
|
4924
|
+
.text_field_clear,
|
|
4925
|
+
.text_field_helper {
|
|
4926
|
+
transition: none;
|
|
4927
|
+
}
|
|
4928
|
+
}
|
|
4939
4929
|
|
|
4940
4930
|
/* src/ui/forms/toggle/style.scss */
|
|
4941
4931
|
@keyframes skeleton_loading {
|
|
@@ -5274,6 +5264,12 @@
|
|
|
5274
5264
|
letter-spacing: 0px;
|
|
5275
5265
|
color: var(--bt-color-text-caption);
|
|
5276
5266
|
}
|
|
5267
|
+
@media (prefers-reduced-motion: reduce) {
|
|
5268
|
+
.pagination_item,
|
|
5269
|
+
.pagination_page_button {
|
|
5270
|
+
transition: none;
|
|
5271
|
+
}
|
|
5272
|
+
}
|
|
5277
5273
|
|
|
5278
5274
|
/* src/ui/overlay/drawer/style.scss */
|
|
5279
5275
|
@keyframes skeleton_loading {
|
|
@@ -5500,6 +5496,11 @@
|
|
|
5500
5496
|
.modal_footer_start {
|
|
5501
5497
|
justify-content: flex-start;
|
|
5502
5498
|
}
|
|
5499
|
+
@media (prefers-reduced-motion: reduce) {
|
|
5500
|
+
.modal_close {
|
|
5501
|
+
transition: none;
|
|
5502
|
+
}
|
|
5503
|
+
}
|
|
5503
5504
|
|
|
5504
5505
|
/* src/ui/layout/container/style.scss */
|
|
5505
5506
|
@keyframes skeleton_loading {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React$1 from 'react';
|
|
2
|
-
import { Ref } from 'react';
|
|
2
|
+
import { HTMLAttributes, Ref } from 'react';
|
|
3
3
|
import * as _react_spring_web from '@react-spring/web';
|
|
4
4
|
import { LucideProps, LucideIcon } from 'lucide-react';
|
|
5
5
|
export { LucideIcon, LucideProps } from 'lucide-react';
|
|
@@ -368,7 +368,7 @@ interface MenuProps {
|
|
|
368
368
|
* @example
|
|
369
369
|
* ```tsx
|
|
370
370
|
* <Menu
|
|
371
|
-
* trigger={<IconButton icon={<MoreIcon />} />}
|
|
371
|
+
* trigger={<IconButton icon={<MoreIcon />} aria-label="더보기" />}
|
|
372
372
|
* items={[
|
|
373
373
|
* { key: "edit", label: "편집", onSelect: handleEdit },
|
|
374
374
|
* { key: "del", label: "삭제", onSelect: handleDel, destructive: true },
|
|
@@ -395,6 +395,15 @@ interface NavBarLocaleConfig {
|
|
|
395
395
|
onChange?: (next: string) => void;
|
|
396
396
|
/** 표시 라벨 - 기본은 옵션의 label, 미지정 시 short code 표시 */
|
|
397
397
|
hideLabel?: boolean;
|
|
398
|
+
/**
|
|
399
|
+
* locale 트리거 버튼의 접근성 이름 (기본값: 현재 옵션의 label, 없으면 `current` 대문자).
|
|
400
|
+
* `hideLabel` 이 true 면 버튼 안이 아이콘뿐이라 이 값이 유일한 접근성 이름이 된다.
|
|
401
|
+
*
|
|
402
|
+
* ⚠️ `hideLabel` 이 false(기본값)일 때는 이 값이 화면에 보이는 라벨을 덮어쓰므로,
|
|
403
|
+
* 보이는 라벨 텍스트를 **포함**하는 문자열이어야 한다. 그렇지 않으면 음성 제어 사용자가
|
|
404
|
+
* 보이는 대로 말해도 버튼이 잡히지 않는다 (WCAG 2.1 SC 2.5.3 Label in Name 위반).
|
|
405
|
+
*/
|
|
406
|
+
ariaLabel?: string;
|
|
398
407
|
}
|
|
399
408
|
interface NavBarProps extends React$1.HTMLAttributes<HTMLElement> {
|
|
400
409
|
/** 왼쪽 brand/로고 영역 */
|
|
@@ -560,7 +569,10 @@ interface PopoverProps {
|
|
|
560
569
|
trigger: React$1.ReactElement;
|
|
561
570
|
/** 팝오버 내부 콘텐츠 - 임의 ReactNode (폼/설명/액션 조합) */
|
|
562
571
|
content: React$1.ReactNode;
|
|
563
|
-
/**
|
|
572
|
+
/**
|
|
573
|
+
* 선호 위치 (기본값: "bottom"). 뷰포트를 벗어나면 반대편으로 flip 되고 교차축으로 shift 되므로
|
|
574
|
+
* 실제 위치는 계산 결과를 따른다(Radix `side` + `collisionPadding` 계약). body 로 포탈된다.
|
|
575
|
+
*/
|
|
564
576
|
placement?: PopoverPlacement;
|
|
565
577
|
/** 제어 모드 - 열림 상태 */
|
|
566
578
|
open?: boolean;
|
|
@@ -568,7 +580,7 @@ interface PopoverProps {
|
|
|
568
580
|
defaultOpen?: boolean;
|
|
569
581
|
/** 열림 상태 변경 콜백 */
|
|
570
582
|
onOpenChange?: (open: boolean) => void;
|
|
571
|
-
/**
|
|
583
|
+
/** 팝오버 접근성 레이블(기본값: "Dialog") - content 에 제목이 없을 때 권장 */
|
|
572
584
|
"aria-label"?: string;
|
|
573
585
|
/** dialog 의 접근성 라벨 요소 id */
|
|
574
586
|
"aria-labelledby"?: string;
|
|
@@ -603,7 +615,10 @@ type TooltipPlacement = "top" | "bottom" | "left" | "right";
|
|
|
603
615
|
interface TooltipProps {
|
|
604
616
|
/** 툴팁 콘텐츠 */
|
|
605
617
|
content: React$1.ReactNode;
|
|
606
|
-
/**
|
|
618
|
+
/**
|
|
619
|
+
* 선호 위치 (기본값: "top"). 뷰포트를 벗어나면 반대편으로 flip 되고 교차축으로 shift 되므로
|
|
620
|
+
* 실제 위치는 계산 결과를 따른다(Radix `side` + `collisionPadding` 계약). body 로 포탈된다.
|
|
621
|
+
*/
|
|
607
622
|
placement?: TooltipPlacement;
|
|
608
623
|
/** hover 후 지연 시간 ms (기본 200) */
|
|
609
624
|
delay?: number;
|
|
@@ -617,7 +632,7 @@ interface TooltipProps {
|
|
|
617
632
|
* @example
|
|
618
633
|
* ```tsx
|
|
619
634
|
* <Tooltip content="저장하기">
|
|
620
|
-
* <IconButton icon={<SaveIcon />} />
|
|
635
|
+
* <IconButton icon={<SaveIcon />} aria-label="저장" />
|
|
621
636
|
* </Tooltip>
|
|
622
637
|
* ```
|
|
623
638
|
*/
|
|
@@ -1488,6 +1503,7 @@ interface SpinnerProps {
|
|
|
1488
1503
|
*/
|
|
1489
1504
|
declare const Spinner: ({ size, ariaLabel }: SpinnerProps) => React$1.JSX.Element;
|
|
1490
1505
|
|
|
1506
|
+
type ToastVariant = "success" | "error" | "warning" | "info" | "default";
|
|
1491
1507
|
interface ToastProviderProps {
|
|
1492
1508
|
/** 앱 루트에서 감싸는 자식 요소 */
|
|
1493
1509
|
children: React$1.ReactNode;
|
|
@@ -1775,7 +1791,7 @@ interface ImageCropperHandle {
|
|
|
1775
1791
|
/** 배율·위치를 초기 상태(전체가 보이는 zoom=min, 중앙)로 되돌린다. */
|
|
1776
1792
|
reset: () => void;
|
|
1777
1793
|
}
|
|
1778
|
-
interface ImageCropperProps {
|
|
1794
|
+
interface ImageCropperProps extends Omit<HTMLAttributes<HTMLDivElement>, "onError" | "children" | "dangerouslySetInnerHTML"> {
|
|
1779
1795
|
/** 크롭/리셋을 호출할 imperative 핸들 (React 19 ref-as-prop). */
|
|
1780
1796
|
ref?: Ref<ImageCropperHandle>;
|
|
1781
1797
|
/** 크롭할 이미지. `File`/`Blob`(로컬) 또는 이미지 URL 문자열. */
|
|
@@ -1801,6 +1817,16 @@ interface ImageCropperProps {
|
|
|
1801
1817
|
className?: string;
|
|
1802
1818
|
/** 뷰포트 접근성 레이블. 기본 "이미지 위치와 배율 조정". */
|
|
1803
1819
|
label?: string;
|
|
1820
|
+
/** 뷰포트 아래 조작 안내 문구. 기본 "드래그(또는 방향키)로 위치, 휠·슬라이더로 배율을 맞추세요." */
|
|
1821
|
+
hint?: string;
|
|
1822
|
+
/** 축소 버튼 접근성 레이블. 기본 "축소". */
|
|
1823
|
+
zoomOutLabel?: string;
|
|
1824
|
+
/** 배율 슬라이더 접근성 레이블. 기본 "배율". */
|
|
1825
|
+
zoomLabel?: string;
|
|
1826
|
+
/** 확대 버튼 접근성 레이블. 기본 "확대". */
|
|
1827
|
+
zoomInLabel?: string;
|
|
1828
|
+
/** 이동 여유가 없을 때 스크린리더로 알리는 문구. 기본 "이미지가 뷰포트를 딱 채워 이동 여유가 없습니다." */
|
|
1829
|
+
noPanHint?: string;
|
|
1804
1830
|
}
|
|
1805
1831
|
/**
|
|
1806
1832
|
* 업로드 전에 이미지에서 보일 정사각 영역을 정하는 크로퍼. 뷰포트 안에서 **드래그(또는 방향키)**
|
|
@@ -1817,7 +1843,7 @@ interface ImageCropperProps {
|
|
|
1817
1843
|
* 원격 URL 을 넘기면 `canvas.drawImage` 가 서버의 CORS(`Access-Control-Allow-Origin`)에
|
|
1818
1844
|
* 의존한다 — 확실히 자르려면 로컬 `File`/`Blob` 을 권장한다.
|
|
1819
1845
|
*/
|
|
1820
|
-
declare function ImageCropper({ ref, src, outputSize, outputType, quality, circular, viewportSize, minZoom, maxZoom, onReady, onError, className, label, }: ImageCropperProps): React$1.JSX.Element;
|
|
1846
|
+
declare function ImageCropper({ ref, src, outputSize, outputType, quality, circular, viewportSize, minZoom, maxZoom, onReady, onError, className, label, hint, zoomOutLabel, zoomLabel, zoomInLabel, noPanHint, ...rest }: ImageCropperProps): React$1.JSX.Element;
|
|
1821
1847
|
|
|
1822
1848
|
interface OtpInputProps {
|
|
1823
1849
|
/** OTP 자릿수 (기본값: 6) */
|
|
@@ -1874,6 +1900,23 @@ declare const Radio: {
|
|
|
1874
1900
|
|
|
1875
1901
|
type RadioGroupSize = "sm" | "md" | "lg";
|
|
1876
1902
|
type RadioGroupOrientation = "vertical" | "horizontal";
|
|
1903
|
+
interface RadioGroupContextValue {
|
|
1904
|
+
/** 그룹 라디오들이 공유하는 name (브라우저 그룹핑) */
|
|
1905
|
+
name: string;
|
|
1906
|
+
/** 현재 선택된 value (없으면 미선택) */
|
|
1907
|
+
value: string | undefined;
|
|
1908
|
+
/** 라디오 선택 시 호출 */
|
|
1909
|
+
onChange: (value: string) => void;
|
|
1910
|
+
/** 그룹 사이즈 — 개별 Radio 의 size 미지정 시 적용 */
|
|
1911
|
+
size: RadioGroupSize;
|
|
1912
|
+
/** 그룹 전체 비활성화 */
|
|
1913
|
+
disabled: boolean;
|
|
1914
|
+
}
|
|
1915
|
+
/**
|
|
1916
|
+
* `Radio` 가 상위 `RadioGroup` 의 컨텍스트를 optional 하게 소비하기 위한 hook.
|
|
1917
|
+
* `RadioGroup` 밖에서 쓰이면 `null` 을 반환 — 이 경우 Radio 는 standalone 으로 동작.
|
|
1918
|
+
*/
|
|
1919
|
+
declare function useRadioGroupContext(): RadioGroupContextValue | null;
|
|
1877
1920
|
interface RadioGroupProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onChange"> {
|
|
1878
1921
|
/** 제어형: 선택된 value */
|
|
1879
1922
|
value?: string;
|
|
@@ -2126,7 +2169,8 @@ declare const Button: (props: ButtonProps) => React$1.JSX.Element;
|
|
|
2126
2169
|
|
|
2127
2170
|
type IconButtonVariant = "standard" | "filled" | "tonal" | "outlined";
|
|
2128
2171
|
type IconButtonSize = "sm" | "md";
|
|
2129
|
-
|
|
2172
|
+
/** 접근성 이름을 제외한 IconButton 공통 props */
|
|
2173
|
+
interface IconButtonBaseProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, "aria-label" | "aria-labelledby"> {
|
|
2130
2174
|
/** 아이콘 버튼 스타일 변형 (기본값: "standard") */
|
|
2131
2175
|
variant?: IconButtonVariant;
|
|
2132
2176
|
/** 아이콘 버튼 크기 (기본값: "md") */
|
|
@@ -2136,9 +2180,40 @@ interface IconButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement
|
|
|
2136
2180
|
/** 루트 button 요소 ref (React 19 ref-as-prop) */
|
|
2137
2181
|
ref?: React$1.Ref<HTMLButtonElement>;
|
|
2138
2182
|
}
|
|
2183
|
+
/** `aria-label` 로 접근성 이름을 직접 지정 */
|
|
2184
|
+
interface IconButtonWithAriaLabel extends IconButtonBaseProps {
|
|
2185
|
+
/** 아이콘 버튼의 접근성 이름 (필수) */
|
|
2186
|
+
"aria-label": string;
|
|
2187
|
+
/** 접근성 이름을 제공하는 요소 id (선택) */
|
|
2188
|
+
"aria-labelledby"?: string;
|
|
2189
|
+
}
|
|
2190
|
+
/** `aria-labelledby` 로 외부 요소를 참조해 접근성 이름을 지정 */
|
|
2191
|
+
interface IconButtonWithAriaLabelledBy extends IconButtonBaseProps {
|
|
2192
|
+
/** 아이콘 버튼의 접근성 이름 (선택) */
|
|
2193
|
+
"aria-label"?: string;
|
|
2194
|
+
/** 접근성 이름을 제공하는 요소 id (필수) */
|
|
2195
|
+
"aria-labelledby": string;
|
|
2196
|
+
}
|
|
2197
|
+
/**
|
|
2198
|
+
* IconButton props - 접근성 이름을 타입 레벨에서 강제하는 union.
|
|
2199
|
+
* `icon` 은 항상 `aria-hidden` 으로 감싸지므로 `aria-label` 또는 `aria-labelledby` 중
|
|
2200
|
+
* 최소 하나를 반드시 지정해야 한다 (WCAG 2.1 SC 4.1.2 Name, Role, Value).
|
|
2201
|
+
*
|
|
2202
|
+
* @remarks **Breaking change (타입 레벨)** - v3.7.0 이하에서는 두 속성 모두 optional 이었다.
|
|
2203
|
+
* 접근성 이름 없이 `<IconButton icon={<X />} />` 로 사용하던 코드는 이제 **타입 에러**가 난다.
|
|
2204
|
+
* 런타임 렌더링은 바뀌지 않았으므로 `aria-label`(또는 `aria-labelledby`)만 추가하면 된다.
|
|
2205
|
+
* ```tsx
|
|
2206
|
+
* // before (타입 에러 - 접근성 이름 없음)
|
|
2207
|
+
* <IconButton icon={<X />} />
|
|
2208
|
+
* // after
|
|
2209
|
+
* <IconButton icon={<X />} aria-label="닫기" />
|
|
2210
|
+
* ```
|
|
2211
|
+
*/
|
|
2212
|
+
type IconButtonProps = IconButtonWithAriaLabel | IconButtonWithAriaLabelledBy;
|
|
2139
2213
|
/**
|
|
2140
2214
|
* 아이콘만 표시하는 버튼을 렌더링한다.
|
|
2141
2215
|
* Figma DS 기준 4가지 variant(standard/filled/tonal/outlined)와 2가지 size(sm/md)를 지원한다.
|
|
2216
|
+
* 아이콘은 `aria-hidden` 이므로 `aria-label` 또는 `aria-labelledby` 가 타입 레벨에서 필수다.
|
|
2142
2217
|
* @param props 아이콘 버튼 속성
|
|
2143
2218
|
* @returns 렌더링된 아이콘 버튼 요소
|
|
2144
2219
|
*/
|
|
@@ -2434,4 +2509,4 @@ interface StackProps extends React$1.HTMLAttributes<HTMLDivElement> {
|
|
|
2434
2509
|
*/
|
|
2435
2510
|
declare const Stack: ({ direction, gap, align, justify, wrap, as: Tag, ref, className, children, style, ...props }: StackProps) => React$1.JSX.Element;
|
|
2436
2511
|
|
|
2437
|
-
export { Accordion, type AccordionItem, type AccordionProps, AlertProvider, Avatar, type AvatarProps, type AvatarShape, type AvatarSize, Badge, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeVariant, BottomNav, BottomNavItem, type BottomNavItemProps, type BottomNavProps, BottomNavSpacer, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Card, type CardFooterAlign, type CardProps, type CardVariant, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipSize, type ChipTone, type ChipType, Container, type ContainerProps, type ContainerSize, type CropImageSize, type CropOffset, type CropRect, DatePicker, type DatePickerProps, Divider, type DividerProps, Drawer, type DrawerPlacement, type DrawerProps, Dropdown, type DropdownOption, type DropdownProps, type DropdownSize, EmptyState, type EmptyStateProps, ErrorState, type ErrorStateProps, type ErrorStateVariant, FileInput, type FileInputProps, Grid, type GridCols, type GridGap, type GridProps, Hero, type HeroAction, type HeroAlign, type HeroHeight, type HeroOverlay, type HeroProps, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconProps, ImageCropper, type ImageCropperHandle, type ImageCropperProps, type ImeStrategy, LinearProgress, type LinearProgressProps, ListItem, type ListItemProps, MediaCard, type MediaCardImage, type MediaCardImagePosition, type MediaCardProps, type MediaCardShadow, Menu, type MenuItem, type MenuProps, Modal, type ModalProps, NavBar, type NavBarLayout, type NavBarLocaleConfig, type NavBarLocaleOption, type NavBarProps, type NavBarVariant, NavLink, type NavLinkProps, OtpInput, type OtpInputProps, Pagination, type PaginationProps, Popover, type PopoverPlacement, type PopoverProps, Radio, RadioGroup, type RadioGroupOrientation, type RadioGroupProps, type RadioGroupSize, type RadioProps, type ResolvedTheme, Section, type SectionBg, type SectionProps, type SectionSpacing, Sidebar, SidebarItem, type SidebarItemProps, type SidebarMode, type SidebarProps, SidebarSection, type SidebarSectionProps, Skeleton, type SkeletonProps, type SkeletonVariant, Spinner, type SpinnerProps, Stack, type StackAlign, type StackDirection, type StackGap, type StackJustify, type StackProps, type StackWrap, Tab, TabList, type TabListProps, TabPanel, type TabPanelProps, type TabProps, Table, type TableColumn, type TableProps, type TableSize, type TableSort, type TableSortDirection, Tabs, type TabsProps, type TabsSize, type TabsVariant, TextField, type TextFieldProps, type TextFieldSize, Textarea, type TextareaProps, type TextareaResize, type TextareaSize, type ThemeMode, ThemeProvider, type ThemeProviderProps, ToastProvider, Toggle, type ToggleProps, Tooltip, type TooltipPlacement, type TooltipProps, TopLoading, type TopLoadingProps, a11y, baseBorderWidth, baseColors, baseTypography, borderWidth, breakpoints, cn, colors, elevation, iconSize, motion, opacity, radius, skeleton, spacing, typography, useAlert, useFocusTrap, useReducedMotion, useSpringHover, useSpringPresence, useTheme, useToast, zIndex };
|
|
2512
|
+
export { Accordion, type AccordionItem, type AccordionProps, type AlertActionsAlign, type AlertOptions, AlertProvider, type AlertVariant, Avatar, type AvatarProps, type AvatarShape, type AvatarSize, Badge, type BadgeAppearance, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeVariant, BottomNav, BottomNavItem, type BottomNavItemProps, type BottomNavProps, BottomNavSpacer, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonAsAnchor, type ButtonAsButton, type ButtonProps, type ButtonSize, type ButtonVariant, Card, type CardFooterAlign, type CardProps, type CardVariant, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipSize, type ChipTone, type ChipType, Container, type ContainerProps, type ContainerSize, type CropImageSize, type CropOffset, type CropRect, DatePicker, type DatePickerProps, Divider, type DividerProps, Drawer, type DrawerPlacement, type DrawerProps, Dropdown, type DropdownMultipleProps, type DropdownOption, type DropdownProps, type DropdownSingleProps, type DropdownSize, EmptyState, type EmptyStateProps, ErrorState, type ErrorStateProps, type ErrorStateVariant, FileInput, type FileInputProps, type FileInputVariant, Grid, type GridCols, type GridGap, type GridProps, Hero, type HeroAction, type HeroAlign, type HeroHeight, type HeroOverlay, type HeroProps, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconProps, ImageCropper, type ImageCropperHandle, type ImageCropperProps, type ImeStrategy, LinearProgress, type LinearProgressProps, ListItem, type ListItemProps, MediaCard, type MediaCardImage, type MediaCardImagePosition, type MediaCardProps, type MediaCardShadow, Menu, type MenuItem, type MenuProps, Modal, type ModalFooterAlign, type ModalProps, NavBar, type NavBarLayout, type NavBarLocaleConfig, type NavBarLocaleOption, type NavBarProps, type NavBarVariant, NavLink, type NavLinkProps, OtpInput, type OtpInputProps, Pagination, type PaginationProps, Popover, type PopoverPlacement, type PopoverProps, Radio, RadioGroup, type RadioGroupContextValue, type RadioGroupOrientation, type RadioGroupProps, type RadioGroupSize, type RadioProps, type ResolvedTheme, Section, type SectionBg, type SectionProps, type SectionSpacing, Sidebar, SidebarItem, type SidebarItemProps, type SidebarMode, type SidebarProps, SidebarSection, type SidebarSectionProps, Skeleton, type SkeletonProps, type SkeletonVariant, Spinner, type SpinnerProps, Stack, type StackAlign, type StackDirection, type StackGap, type StackJustify, type StackProps, type StackWrap, Tab, TabList, type TabListProps, TabPanel, type TabPanelProps, type TabProps, Table, type TableColumn, type TableProps, type TableSize, type TableSort, type TableSortDirection, Tabs, type TabsProps, type TabsSize, type TabsVariant, TextField, type TextFieldProps, type TextFieldSize, Textarea, type TextareaProps, type TextareaResize, type TextareaSize, type ThemeMode, ThemeProvider, type ThemeProviderProps, ToastProvider, type ToastProviderProps, type ToastVariant, Toggle, type ToggleProps, Tooltip, type TooltipPlacement, type TooltipProps, TopLoading, type TopLoadingProps, a11y, baseBorderWidth, baseColors, baseTypography, borderWidth, breakpoints, cn, colors, elevation, iconSize, motion, opacity, radius, skeleton, spacing, typography, useAlert, useFocusTrap, useRadioGroupContext, useReducedMotion, useSpringHover, useSpringPresence, useTheme, useToast, zIndex };
|