@thewrong/ui 0.3.0 → 0.4.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.
Files changed (65) hide show
  1. package/README.md +2 -2
  2. package/dist/components/button/Button.cjs +1 -1
  3. package/dist/components/button/Button.d.ts +3 -0
  4. package/dist/components/button/Button.esm.js +17 -5
  5. package/dist/components/button/types.d.ts +3 -1
  6. package/dist/components/button/utils.cjs +1 -1
  7. package/dist/components/button/utils.d.ts +2 -2
  8. package/dist/components/button/utils.esm.js +6 -2
  9. package/dist/components/progress/Progress.cjs +1 -1
  10. package/dist/components/progress/Progress.d.ts +3 -4
  11. package/dist/components/progress/Progress.esm.js +5 -5
  12. package/dist/components/progress/types.d.ts +2 -2
  13. package/dist/components/select/MultiSelect.cjs +1 -1
  14. package/dist/components/select/MultiSelect.esm.js +140 -138
  15. package/dist/components/select/Select.cjs +1 -1
  16. package/dist/components/select/Select.esm.js +190 -182
  17. package/dist/components/select/types.d.ts +7 -0
  18. package/dist/components/slider/Slider.cjs +1 -0
  19. package/dist/components/slider/Slider.d.ts +6 -0
  20. package/dist/components/slider/Slider.esm.js +36 -0
  21. package/dist/components/slider/index.d.ts +2 -0
  22. package/dist/components/slider/types.d.ts +15 -0
  23. package/dist/components/slider/utils.cjs +1 -0
  24. package/dist/components/slider/utils.d.ts +3 -0
  25. package/dist/components/slider/utils.esm.js +15 -0
  26. package/dist/components/table/accordion-table.cjs +1 -1
  27. package/dist/components/table/accordion-table.esm.js +194 -180
  28. package/dist/components/table/components/SortHeader.cjs +1 -0
  29. package/dist/components/table/components/SortHeader.d.ts +10 -0
  30. package/dist/components/table/components/SortHeader.esm.js +27 -0
  31. package/dist/components/table/components/SortableHeaderCell.cjs +1 -1
  32. package/dist/components/table/components/SortableHeaderCell.d.ts +10 -2
  33. package/dist/components/table/components/SortableHeaderCell.esm.js +54 -26
  34. package/dist/components/table/hooks/sort-state.cjs +1 -0
  35. package/dist/components/table/hooks/sort-state.d.ts +5 -0
  36. package/dist/components/table/hooks/sort-state.esm.js +21 -0
  37. package/dist/components/table/hooks/useTableSort.cjs +1 -1
  38. package/dist/components/table/hooks/useTableSort.d.ts +6 -3
  39. package/dist/components/table/hooks/useTableSort.esm.js +18 -19
  40. package/dist/components/table/paginated-table.d.ts +2 -0
  41. package/dist/components/table/table.cjs +1 -1
  42. package/dist/components/table/table.d.ts +2 -0
  43. package/dist/components/table/table.esm.js +119 -104
  44. package/dist/components/table/types.d.ts +11 -4
  45. package/dist/components/tabs/Tabs.cjs +1 -0
  46. package/dist/components/tabs/Tabs.d.ts +8 -0
  47. package/dist/components/tabs/Tabs.esm.js +53 -0
  48. package/dist/components/tabs/index.d.ts +2 -0
  49. package/dist/components/tabs/navigation.cjs +1 -0
  50. package/dist/components/tabs/navigation.d.ts +2 -0
  51. package/dist/components/tabs/navigation.esm.js +18 -0
  52. package/dist/components/tabs/types.d.ts +20 -0
  53. package/dist/index.cjs +1 -1
  54. package/dist/index.d.ts +2 -0
  55. package/dist/index.esm.js +3 -1
  56. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-down.cjs +1 -0
  57. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-down.esm.js +10 -0
  58. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-up-down.cjs +1 -0
  59. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-up-down.esm.js +21 -0
  60. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-up.cjs +1 -0
  61. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-up.esm.js +10 -0
  62. package/dist/tokens.css +78 -5
  63. package/dist/ui.css +1 -1
  64. package/llms.txt +9 -6
  65. package/package.json +1 -1
package/llms.txt CHANGED
@@ -51,14 +51,14 @@ import { useIsMobile } from "@thewrong/ui/hooks";
51
51
  ## 컴포넌트 (전부 `@thewrong/ui`에서 named export)
52
52
 
53
53
  ### 폼
54
- - `Button` — variant×appearance×size. `as="a"`+`href`로 링크. `clickThrottleMs`로 더블클릭 방지(비가역 액션). `display="block"`으로 풀폭.
54
+ - `Button` — variant×appearance×size. `appearance="link"`는 부모의 글자 크기·줄높이·글꼴을 상속하고 size와 display를 무시한다. 기본 `<button>`은 문장 속에서 한 덩어리로 배치되어 줄 끝에 걸치면 통째로 넘어가므로 짧게 쓰거나, 이동 링크에는 `as="a"`+`href`를 사용한다. `clickThrottleMs`로 더블클릭 방지(비가역 액션). 다른 모양은 `display="block"`으로 풀폭.
55
55
  - `Input`, `PasswordInput`, `DecimalInput` — size 토큰 4단계. `prefix`/`suffix`/`clearable` 지원. `format`은 `InputFormat` 객체를 받으며, `inputFormats.phoneNumber`/`inputFormats.businessNumber`/`inputFormats.price` 프리셋을 넘긴다(`format={inputFormats.price}`).
56
56
  - `DecimalInput`은 소수 초안과 범위를 관리하며 onChange에 문자열을 전달한다. 범위에 도달 가능한 접두사는 임시로 유지하고 blur 시 마지막 유효 값으로 복원한다. 빈 값 전달은 `emitEmpty`.
57
57
  - `SegmentedCodeInput` — 단일 입력으로 OTP·PIN 슬롯을 표시하며 숫자만 허용한다. OTP는 `masked={false}`.
58
58
  - `CopyableText` — clipboard 복사 및 토스트. 보안 컨텍스트와 `ToastProvider`가 필요하다.
59
59
  - `Textarea` — `showCount`+`maxLength`로 글자 수. resize는 기본 고정.
60
- - `Select` — 단일 선택. `searchable`로 필터(클라이언트). 서버 검색 시 호출부가 selected snapshot 보존. `open`과 `onOpenChange`로 패널을 제어할 수 있다. searchable에서 `openOnFocus`는 포커스로 패널을 열고, `validateSearchQuery`가 false를 반환한 입력은 검색어에 반영하지 않는다.
61
- - `MultiSelect` — 다중 선택. 값은 `string[]`. 트리거 폭 넘으면 'N개 선택'으로 자동 폴백.
60
+ - `Select` — 단일 선택. `searchable`로 필터(클라이언트). `aria-label` 또는 `aria-labelledby`로 트리거 이름을 지정한다. 둘 다 지정하면 `aria-labelledby`가 우선하며, 명시 이름이 없을 때 시각 `label`을 사용한다. 보이는 라벨이 있으면 접근성 이름에 그 텍스트를 포함한다(WCAG 2.5.3). 서버 검색 시 호출부가 selected snapshot 보존. `open`과 `onOpenChange`로 패널을 제어할 수 있다. searchable에서 `openOnFocus`는 포커스로 패널을 열고, `validateSearchQuery`가 false를 반환한 입력은 검색어에 반영하지 않는다.
61
+ - `MultiSelect` — 다중 선택. 값은 `string[]`. `aria-label` 또는 `aria-labelledby`로 트리거 이름을 지정한다. 보이는 라벨이 있으면 접근성 이름에 그 텍스트를 포함한다(WCAG 2.5.3). 트리거 폭 넘으면 'N개 선택'으로 자동 폴백.
62
62
  - `Switch`, `Checkbox`, `Badge`.
63
63
  - `Radio.Group`, `Radio.Item` — 네이티브 라디오 행. 같은 name과 fieldset/legend를 사용한다.
64
64
  - `SegmentedControl` — controlled 라디오 선택지. 그룹에 aria-label 또는 aria-labelledby를 전달한다.
@@ -81,8 +81,9 @@ import { useIsMobile } from "@thewrong/ui/hooks";
81
81
  - 피커는 모바일 Modal·Drawer 안에서 기본적으로 popover를 사용한다. `disableMobileSheet={false}`를 명시하면 자체 시트를 유지한다.
82
82
 
83
83
  ### 데이터
84
- - `PaginatedTable` — 페이지네이션+페이지 사이즈 셀렉터 내장. 대부분의 목록 페이지 기본형.
85
- - `Table` — 페이지네이션 없이 전부 표시. `totalElements`로 '총 N건' 표기.
84
+ - `PaginatedTable` — 페이지네이션+페이지 사이즈 셀렉터 내장. 대부분의 목록 페이지 기본형. 클라이언트 정렬은 전달된 현재 페이지 데이터만 정렬한다. 서버 페이지네이션이면 `serverSideSorting`을 사용하고 정렬 변경 시 페이지 초기화는 호출부에서 처리한다.
85
+ - `Table` — 페이지네이션 없이 전부 표시. `totalElements`로 '총 N건' 표기. 정렬은 `enableSorting`(또는 `serverSideSorting`)과 컬럼의 `sortable`을 함께 켠다. 클라이언트 정렬은 전달된 현재 페이지 데이터만 정렬하므로 서버 페이지네이션이면 `serverSideSorting`을 사용하고 정렬 변경 시 페이지 초기화는 호출부에서 처리한다. 헤더 정렬 버튼은 Space 또는 Enter로 정렬을 변경하고, 컬럼 이동이 가능하면 Shift+Space로 이동을 시작해 화살표로 이동하고 Space 또는 Enter로 놓는다. 기본 이름은 헤더 텍스트이며 정렬된 열에 `aria-sort`를 전달한다. `formatSortLabel(column, current, next)`로 버튼 이름을 지정할 때 보이는 헤더 텍스트를 포함한다(WCAG 2.5.3). `sortCycle="tri"`(기본)는 오름차순 → 내림차순 → 해제, `"toggle"`은 두 방향만 순환한다. 서버 정렬에서 해제하면 `onSortChange(null)`이 호출된다.
86
+ 키보드 컬럼 드래그 중 Escape는 드래그 취소와 함께 상위 Modal·Drawer도 닫는다(기존 동작).
86
87
  - `AccordionTable` — 행 펼침(single/multiple, 비동기 fetch 가능).
87
88
  - `MiniTable`, `Pagination`, `TableCheckbox`(indeterminate), `SearchBox`(선언적 필드 배열: text/select/multiSelect/dateRange).
88
89
 
@@ -90,7 +91,9 @@ import { useIsMobile } from "@thewrong/ui/hooks";
90
91
  - `TablePageLayout`, `TableCard`, `Toolbar`, `PageTitle`.
91
92
  - `AnimatedHeight`(높이 트랜지션), `Collapsible`, `LoadingSpinner`.
92
93
  - `Stepper`, `StepperContent`, `useStepper` — 단계 표시와 상태·콘텐츠 전환. 단계 검증은 호출부에서 처리한다.
93
- - `Progress` — 0~100 결정형 진행률. `Skeleton` — 크기를 className으로 지정하는 장식용 로딩 블록.
94
+ - `Tabs` — items 배열로 가로 탭과 패널을 구성. value/defaultValue 및 onValueChange, activation="auto"/"manual"을 지원한다. value가 활성 항목에 없으면 첫 활성 탭을 표시하지만 onValueChange는 호출하지 않으므로 부모에서 값을 맞춘다. 선택된 패널만 마운트하므로 탭 전환 시 이전 패널의 상태가 소멸한다.
95
+ - `Slider` — 단일 range 입력. min/max/step, value/defaultValue, onValueChange, formatValue를 지원한다. 범위 밖 controlled 값은 화면에서만 범위 내로 보정하며 그 자체로 콜백을 호출하지 않는다.
96
+ - `Progress` — 0~100 결정형 진행률, value 생략 시 불확정 진행률. `Skeleton` — 크기를 className으로 지정하는 장식용 로딩 블록.
94
97
  - `TypingDots` — 상위 글자 크기·색을 따르는 로딩 표시. `TypewriterText` — 글자/단어 단위 텍스트 표시.
95
98
  - `ErrorBoundary` — 렌더 오류 폴백과 재시도. 청크 자동 복구에는 영속 저장·보고·reload를 담은 `chunkReloadPort`가 필요하다.
96
99
  - `cn`(clsx+tailwind-merge), `Portal`, `overlayStack`, `formatYearMonth`, `ColumnPresetStorage`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thewrong/ui",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "@thewronghand의 개인 프로젝트용 React UI 컴포넌트 라이브러리",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",