@loword/loword-design-system 0.0.1

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 (246) hide show
  1. package/README.md +20 -0
  2. package/dist/components/Avatar/Avatar.d.ts +11 -0
  3. package/dist/components/Avatar/Avatar.d.ts.map +1 -0
  4. package/dist/components/Avatar/Avatar.js +24 -0
  5. package/dist/components/Avatar/AvatarBase.d.ts +32 -0
  6. package/dist/components/Avatar/AvatarBase.d.ts.map +1 -0
  7. package/dist/components/Avatar/AvatarBase.js +49 -0
  8. package/dist/components/Badge/Badge.d.ts +25 -0
  9. package/dist/components/Badge/Badge.d.ts.map +1 -0
  10. package/dist/components/Badge/Badge.js +36 -0
  11. package/dist/components/Badge/BadgeBase.d.ts +10 -0
  12. package/dist/components/Badge/BadgeBase.d.ts.map +1 -0
  13. package/dist/components/Badge/BadgeBase.js +9 -0
  14. package/dist/components/Button/Button.d.ts +26 -0
  15. package/dist/components/Button/Button.d.ts.map +1 -0
  16. package/dist/components/Button/Button.js +102 -0
  17. package/dist/components/Button/ButtonBase.d.ts +5 -0
  18. package/dist/components/Button/ButtonBase.d.ts.map +1 -0
  19. package/dist/components/Button/ButtonBase.js +10 -0
  20. package/dist/components/Button/ButtonSpinner.d.ts +9 -0
  21. package/dist/components/Button/ButtonSpinner.d.ts.map +1 -0
  22. package/dist/components/Button/ButtonSpinner.js +14 -0
  23. package/dist/components/Calendar/Calendar.d.ts +16 -0
  24. package/dist/components/Calendar/Calendar.d.ts.map +1 -0
  25. package/dist/components/Calendar/Calendar.js +75 -0
  26. package/dist/components/Carousel/Carousel.d.ts +50 -0
  27. package/dist/components/Carousel/Carousel.d.ts.map +1 -0
  28. package/dist/components/Carousel/Carousel.js +22 -0
  29. package/dist/components/Carousel/CarouselBase.d.ts +98 -0
  30. package/dist/components/Carousel/CarouselBase.d.ts.map +1 -0
  31. package/dist/components/Carousel/CarouselBase.js +144 -0
  32. package/dist/components/Checkbox/Checkbox.d.ts +27 -0
  33. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  34. package/dist/components/Checkbox/Checkbox.js +30 -0
  35. package/dist/components/Checkbox/CheckboxBase.d.ts +40 -0
  36. package/dist/components/Checkbox/CheckboxBase.d.ts.map +1 -0
  37. package/dist/components/Checkbox/CheckboxBase.js +57 -0
  38. package/dist/components/Checkbox/CheckboxGroup.d.ts +22 -0
  39. package/dist/components/Checkbox/CheckboxGroup.d.ts.map +1 -0
  40. package/dist/components/Checkbox/CheckboxGroup.js +13 -0
  41. package/dist/components/Checkbox/FormCheckbox.d.ts +14 -0
  42. package/dist/components/Checkbox/FormCheckbox.d.ts.map +1 -0
  43. package/dist/components/Checkbox/FormCheckbox.js +9 -0
  44. package/dist/components/Checkbox/FormCheckboxGroup.d.ts +13 -0
  45. package/dist/components/Checkbox/FormCheckboxGroup.d.ts.map +1 -0
  46. package/dist/components/Checkbox/FormCheckboxGroup.js +9 -0
  47. package/dist/components/DataCalendar/DataCalendar.d.ts +12 -0
  48. package/dist/components/DataCalendar/DataCalendar.d.ts.map +1 -0
  49. package/dist/components/DataCalendar/DataCalendar.js +13 -0
  50. package/dist/components/DataCalendar/DataCalendarBase.d.ts +45 -0
  51. package/dist/components/DataCalendar/DataCalendarBase.d.ts.map +1 -0
  52. package/dist/components/DataCalendar/DataCalendarBase.js +57 -0
  53. package/dist/components/DatePicker/DatePicker.d.ts +34 -0
  54. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
  55. package/dist/components/DatePicker/DatePicker.js +44 -0
  56. package/dist/components/DatePicker/FormDatePicker.d.ts +12 -0
  57. package/dist/components/DatePicker/FormDatePicker.d.ts.map +1 -0
  58. package/dist/components/DatePicker/FormDatePicker.js +12 -0
  59. package/dist/components/DateRangePicker/DateRangePicker.d.ts +49 -0
  60. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -0
  61. package/dist/components/DateRangePicker/DateRangePicker.js +197 -0
  62. package/dist/components/DateRangePicker/FormDateRangePicker.d.ts +12 -0
  63. package/dist/components/DateRangePicker/FormDateRangePicker.d.ts.map +1 -0
  64. package/dist/components/DateRangePicker/FormDateRangePicker.js +10 -0
  65. package/dist/components/Drawer/Drawer.d.ts +51 -0
  66. package/dist/components/Drawer/Drawer.d.ts.map +1 -0
  67. package/dist/components/Drawer/Drawer.js +30 -0
  68. package/dist/components/Drawer/DrawerBase.d.ts +52 -0
  69. package/dist/components/Drawer/DrawerBase.d.ts.map +1 -0
  70. package/dist/components/Drawer/DrawerBase.js +38 -0
  71. package/dist/components/Editor/Editor.d.ts +12 -0
  72. package/dist/components/Editor/Editor.d.ts.map +1 -0
  73. package/dist/components/Editor/Editor.js +162 -0
  74. package/dist/components/Editor/EditorBase.d.ts +52 -0
  75. package/dist/components/Editor/EditorBase.d.ts.map +1 -0
  76. package/dist/components/Editor/EditorBase.js +89 -0
  77. package/dist/components/Editor/Viewer.d.ts +7 -0
  78. package/dist/components/Editor/Viewer.d.ts.map +1 -0
  79. package/dist/components/Editor/Viewer.js +9 -0
  80. package/dist/components/Editor/extensions.d.ts +6 -0
  81. package/dist/components/Editor/extensions.d.ts.map +1 -0
  82. package/dist/components/Editor/extensions.js +38 -0
  83. package/dist/components/FileUpload/FileUploadBase.d.ts +50 -0
  84. package/dist/components/FileUpload/FileUploadBase.d.ts.map +1 -0
  85. package/dist/components/FileUpload/FileUploadBase.js +102 -0
  86. package/dist/components/Form/Form.d.ts +21 -0
  87. package/dist/components/Form/Form.d.ts.map +1 -0
  88. package/dist/components/Form/Form.js +18 -0
  89. package/dist/components/Form/FormErrorMessage.d.ts +9 -0
  90. package/dist/components/Form/FormErrorMessage.d.ts.map +1 -0
  91. package/dist/components/Form/FormErrorMessage.js +6 -0
  92. package/dist/components/Form/FormField.d.ts +55 -0
  93. package/dist/components/Form/FormField.d.ts.map +1 -0
  94. package/dist/components/Form/FormField.js +43 -0
  95. package/dist/components/Icon/LucideIcon.d.ts +11 -0
  96. package/dist/components/Icon/LucideIcon.d.ts.map +1 -0
  97. package/dist/components/Icon/LucideIcon.js +41 -0
  98. package/dist/components/Input/FormInput.d.ts +15 -0
  99. package/dist/components/Input/FormInput.d.ts.map +1 -0
  100. package/dist/components/Input/FormInput.js +19 -0
  101. package/dist/components/Input/Input.d.ts +24 -0
  102. package/dist/components/Input/Input.d.ts.map +1 -0
  103. package/dist/components/Input/Input.js +71 -0
  104. package/dist/components/Input/InputBase.d.ts +22 -0
  105. package/dist/components/Input/InputBase.d.ts.map +1 -0
  106. package/dist/components/Input/InputBase.js +17 -0
  107. package/dist/components/LNB/LNBBase.d.ts +82 -0
  108. package/dist/components/LNB/LNBBase.d.ts.map +1 -0
  109. package/dist/components/LNB/LNBBase.js +108 -0
  110. package/dist/components/LoadingDots/LoadingDots.d.ts +8 -0
  111. package/dist/components/LoadingDots/LoadingDots.d.ts.map +1 -0
  112. package/dist/components/LoadingDots/LoadingDots.js +29 -0
  113. package/dist/components/MenuBar/MenuBar.d.ts +21 -0
  114. package/dist/components/MenuBar/MenuBar.d.ts.map +1 -0
  115. package/dist/components/MenuBar/MenuBar.js +33 -0
  116. package/dist/components/MenuBar/MenuBarBase.d.ts +43 -0
  117. package/dist/components/MenuBar/MenuBarBase.d.ts.map +1 -0
  118. package/dist/components/MenuBar/MenuBarBase.js +69 -0
  119. package/dist/components/Modal/Modal.d.ts +51 -0
  120. package/dist/components/Modal/Modal.d.ts.map +1 -0
  121. package/dist/components/Modal/Modal.js +72 -0
  122. package/dist/components/Modal/ModalBase.d.ts +42 -0
  123. package/dist/components/Modal/ModalBase.d.ts.map +1 -0
  124. package/dist/components/Modal/ModalBase.js +30 -0
  125. package/dist/components/Modal/openModal.d.ts +24 -0
  126. package/dist/components/Modal/openModal.d.ts.map +1 -0
  127. package/dist/components/Modal/openModal.js +52 -0
  128. package/dist/components/OTPInput/OTPInput.d.ts +46 -0
  129. package/dist/components/OTPInput/OTPInput.d.ts.map +1 -0
  130. package/dist/components/OTPInput/OTPInput.js +87 -0
  131. package/dist/components/Pagination/Pagination.d.ts +12 -0
  132. package/dist/components/Pagination/Pagination.d.ts.map +1 -0
  133. package/dist/components/Pagination/Pagination.js +5 -0
  134. package/dist/components/Pagination/PaginationBase.d.ts +36 -0
  135. package/dist/components/Pagination/PaginationBase.d.ts.map +1 -0
  136. package/dist/components/Pagination/PaginationBase.js +44 -0
  137. package/dist/components/Pagination/paginationUtils.d.ts +2 -0
  138. package/dist/components/Pagination/paginationUtils.d.ts.map +1 -0
  139. package/dist/components/Pagination/paginationUtils.js +18 -0
  140. package/dist/components/Popover/Popover.d.ts +42 -0
  141. package/dist/components/Popover/Popover.d.ts.map +1 -0
  142. package/dist/components/Popover/Popover.js +31 -0
  143. package/dist/components/Popover/PopoverBase.d.ts +31 -0
  144. package/dist/components/Popover/PopoverBase.d.ts.map +1 -0
  145. package/dist/components/Popover/PopoverBase.js +18 -0
  146. package/dist/components/Radio/FormRadioGroup.d.ts +13 -0
  147. package/dist/components/Radio/FormRadioGroup.d.ts.map +1 -0
  148. package/dist/components/Radio/FormRadioGroup.js +9 -0
  149. package/dist/components/Radio/Radio.d.ts +24 -0
  150. package/dist/components/Radio/Radio.d.ts.map +1 -0
  151. package/dist/components/Radio/Radio.js +39 -0
  152. package/dist/components/Radio/RadioBase.d.ts +38 -0
  153. package/dist/components/Radio/RadioBase.d.ts.map +1 -0
  154. package/dist/components/Radio/RadioBase.js +46 -0
  155. package/dist/components/Radio/RadioGroup.d.ts +22 -0
  156. package/dist/components/Radio/RadioGroup.d.ts.map +1 -0
  157. package/dist/components/Radio/RadioGroup.js +7 -0
  158. package/dist/components/ScrollArea/ScrollArea.d.ts +15 -0
  159. package/dist/components/ScrollArea/ScrollArea.d.ts.map +1 -0
  160. package/dist/components/ScrollArea/ScrollArea.js +10 -0
  161. package/dist/components/Select/FormMultiSelect.d.ts +13 -0
  162. package/dist/components/Select/FormMultiSelect.d.ts.map +1 -0
  163. package/dist/components/Select/FormMultiSelect.js +14 -0
  164. package/dist/components/Select/FormSelect.d.ts +13 -0
  165. package/dist/components/Select/FormSelect.d.ts.map +1 -0
  166. package/dist/components/Select/FormSelect.js +10 -0
  167. package/dist/components/Select/MultiSelect.d.ts +31 -0
  168. package/dist/components/Select/MultiSelect.d.ts.map +1 -0
  169. package/dist/components/Select/MultiSelect.js +59 -0
  170. package/dist/components/Select/Select.d.ts +41 -0
  171. package/dist/components/Select/Select.d.ts.map +1 -0
  172. package/dist/components/Select/Select.js +55 -0
  173. package/dist/components/Select/SelectBase.d.ts +59 -0
  174. package/dist/components/Select/SelectBase.d.ts.map +1 -0
  175. package/dist/components/Select/SelectBase.js +211 -0
  176. package/dist/components/Skeleton/Skeleton.d.ts +10 -0
  177. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
  178. package/dist/components/Skeleton/Skeleton.js +8 -0
  179. package/dist/components/Slider/Slider.d.ts +23 -0
  180. package/dist/components/Slider/Slider.d.ts.map +1 -0
  181. package/dist/components/Slider/Slider.js +195 -0
  182. package/dist/components/Spinner/Spinner.d.ts +25 -0
  183. package/dist/components/Spinner/Spinner.d.ts.map +1 -0
  184. package/dist/components/Spinner/Spinner.js +20 -0
  185. package/dist/components/Table/Table.d.ts +34 -0
  186. package/dist/components/Table/Table.d.ts.map +1 -0
  187. package/dist/components/Table/Table.js +29 -0
  188. package/dist/components/Table/TableBase.d.ts +37 -0
  189. package/dist/components/Table/TableBase.d.ts.map +1 -0
  190. package/dist/components/Table/TableBase.js +39 -0
  191. package/dist/components/Table/TableField.d.ts +64 -0
  192. package/dist/components/Table/TableField.d.ts.map +1 -0
  193. package/dist/components/Table/TableField.js +87 -0
  194. package/dist/components/Table/TanstackTable.d.ts +23 -0
  195. package/dist/components/Table/TanstackTable.d.ts.map +1 -0
  196. package/dist/components/Table/TanstackTable.js +35 -0
  197. package/dist/components/TimePicker/FormTimePicker.d.ts +12 -0
  198. package/dist/components/TimePicker/FormTimePicker.d.ts.map +1 -0
  199. package/dist/components/TimePicker/FormTimePicker.js +12 -0
  200. package/dist/components/TimePicker/TimePicker.d.ts +27 -0
  201. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -0
  202. package/dist/components/TimePicker/TimePicker.js +120 -0
  203. package/dist/components/Toast/Toast.d.ts +18 -0
  204. package/dist/components/Toast/Toast.d.ts.map +1 -0
  205. package/dist/components/Toast/Toast.js +42 -0
  206. package/dist/components/Toast/Toaster.d.ts +7 -0
  207. package/dist/components/Toast/Toaster.d.ts.map +1 -0
  208. package/dist/components/Toast/Toaster.js +7 -0
  209. package/dist/components/ToggleButton/FormToggleButton.d.ts +12 -0
  210. package/dist/components/ToggleButton/FormToggleButton.d.ts.map +1 -0
  211. package/dist/components/ToggleButton/FormToggleButton.js +9 -0
  212. package/dist/components/ToggleButton/ToggleButton.d.ts +31 -0
  213. package/dist/components/ToggleButton/ToggleButton.d.ts.map +1 -0
  214. package/dist/components/ToggleButton/ToggleButton.js +42 -0
  215. package/dist/components/ToggleButton/ToggleButtonBase.d.ts +41 -0
  216. package/dist/components/ToggleButton/ToggleButtonBase.d.ts.map +1 -0
  217. package/dist/components/ToggleButton/ToggleButtonBase.js +59 -0
  218. package/dist/components/Tooltip/Tooltip.d.ts +18 -0
  219. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
  220. package/dist/components/Tooltip/Tooltip.js +13 -0
  221. package/dist/components/Tooltip/TooltipBase.d.ts +39 -0
  222. package/dist/components/Tooltip/TooltipBase.d.ts.map +1 -0
  223. package/dist/components/Tooltip/TooltipBase.js +46 -0
  224. package/dist/constants/file.d.ts +42 -0
  225. package/dist/constants/file.d.ts.map +1 -0
  226. package/dist/constants/file.js +47 -0
  227. package/dist/index.css +4061 -0
  228. package/dist/index.d.ts +54 -0
  229. package/dist/index.d.ts.map +1 -0
  230. package/dist/index.js +88 -0
  231. package/dist/types/polymorphic.d.ts +19 -0
  232. package/dist/types/polymorphic.d.ts.map +1 -0
  233. package/dist/types/polymorphic.js +1 -0
  234. package/dist/utils/cn.d.ts +4 -0
  235. package/dist/utils/cn.d.ts.map +1 -0
  236. package/dist/utils/cn.js +6 -0
  237. package/dist/utils/file.d.ts +16 -0
  238. package/dist/utils/file.d.ts.map +1 -0
  239. package/dist/utils/file.js +58 -0
  240. package/dist/utils/renderIcon.d.ts +4 -0
  241. package/dist/utils/renderIcon.d.ts.map +1 -0
  242. package/dist/utils/renderIcon.js +11 -0
  243. package/dist/utils/utils.d.ts +2 -0
  244. package/dist/utils/utils.d.ts.map +1 -0
  245. package/dist/utils/utils.js +5 -0
  246. package/package.json +239 -0
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # @loword/ui-custom
2
+
3
+ 노코드 빌더용 React 컴포넌트 패키지입니다.
4
+
5
+ ## 빠른 시작
6
+
7
+ ```bash
8
+ pnpm install # 의존성 설치
9
+ pnpm storybook # Storybook 개발 서버 (port 6006)
10
+ pnpm build # 프로덕션 빌드
11
+ ```
12
+
13
+ ## 문서
14
+
15
+ - **아키텍처 및 상세 가이드**: [docs/architecture.md](./docs/architecture.md)
16
+ - 3-Layer 구조 (Base → Custom → Function)
17
+ - 컴포넌트 목록 및 특수 구조
18
+ - 스타일 체계 (디자인 토큰, `cn()`)
19
+ - Storybook 스타일 제어 및 stories 생성 방법
20
+ - Props 문서화 (JSDoc)
@@ -0,0 +1,11 @@
1
+ type AvatarSize = 'sm' | 'md' | 'lg';
2
+ export interface AvatarProps {
3
+ src?: string | null;
4
+ alt?: string;
5
+ size?: AvatarSize;
6
+ className?: string;
7
+ style?: React.CSSProperties;
8
+ }
9
+ declare const Avatar: ({ src, alt, size, className, style, }: AvatarProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default Avatar;
11
+ //# sourceMappingURL=Avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/Avatar.tsx"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAqBrC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,QAAA,MAAM,MAAM,GAAI,uCAMb,WAAW,4CAeb,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { UserRound } from 'lucide-react';
3
+ import AvatarBase from './AvatarBase.js';
4
+ import cn from '../../utils/cn.js';
5
+ const SIZE_MAP = {
6
+ sm: 'w-8 h-8',
7
+ md: 'w-12 h-12',
8
+ lg: 'w-16 h-16',
9
+ };
10
+ const IMAGE_SIZE_MAP = {
11
+ sm: 32,
12
+ md: 48,
13
+ lg: 64,
14
+ };
15
+ const ICON_SIZE_MAP = {
16
+ sm: 24,
17
+ md: 32,
18
+ lg: 40,
19
+ };
20
+ const Avatar = ({ src, alt = 'avatar', size = 'sm', className, style, }) => {
21
+ const px = IMAGE_SIZE_MAP[size];
22
+ return (_jsxs(AvatarBase.Root, { src: src, style: style, className: cn(SIZE_MAP[size], className), children: [_jsx(AvatarBase.Image, { alt: alt, width: px, height: px }), _jsx(AvatarBase.Fallback, { className: "bg-mono100", children: _jsx(UserRound, { size: ICON_SIZE_MAP[size], className: "text-mono400" }) })] }));
23
+ };
24
+ export default Avatar;
@@ -0,0 +1,32 @@
1
+ import { type ReactNode } from 'react';
2
+ interface AvatarContextType {
3
+ src?: string | null;
4
+ status: 'idle' | 'loading' | 'loaded' | 'error';
5
+ setStatus: (status: 'idle' | 'loading' | 'loaded' | 'error') => void;
6
+ }
7
+ export declare const useAvatarContext: () => AvatarContextType;
8
+ interface RootProps {
9
+ src?: string | null;
10
+ className?: string;
11
+ style?: React.CSSProperties;
12
+ children?: ReactNode;
13
+ }
14
+ interface ImageProps {
15
+ alt?: string;
16
+ width?: number;
17
+ height?: number;
18
+ className?: string;
19
+ }
20
+ interface FallbackProps {
21
+ className?: string;
22
+ children?: ReactNode;
23
+ /** 이미지 로드 지연 처리용 딜레이(ms). 기본값 0 (즉시 표시) */
24
+ delayMs?: number;
25
+ }
26
+ export declare const AvatarBase: {
27
+ Root: ({ src, className, style, children }: RootProps) => import("react/jsx-runtime").JSX.Element;
28
+ Image: ({ alt, width, height, className }: ImageProps) => import("react/jsx-runtime").JSX.Element | null;
29
+ Fallback: ({ className, children, delayMs }: FallbackProps) => import("react/jsx-runtime").JSX.Element | null;
30
+ };
31
+ export default AvatarBase;
32
+ //# sourceMappingURL=AvatarBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarBase.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/AvatarBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AAIf,UAAU,iBAAiB;IACzB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IAChD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;CACtE;AAID,eAAO,MAAM,gBAAgB,yBAO5B,CAAC;AAGF,UAAU,SAAS;IACjB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAiCD,UAAU,UAAU;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqBD,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA6BD,eAAO,MAAM,UAAU;gDA3F4B,SAAS;+CAsCC,UAAU;iDA0Bf,aAAa;CA+BpE,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,49 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useState, useEffect, } from 'react';
4
+ import cn from '../../utils/cn.js';
5
+ const AvatarContext = createContext(null);
6
+ export const useAvatarContext = () => {
7
+ const ctx = useContext(AvatarContext);
8
+ if (!ctx)
9
+ throw new Error('AvatarBase 하위 컴포넌트는 Root 내부에서 사용해야 합니다.');
10
+ return ctx;
11
+ };
12
+ const Root = ({ src, className, style, children }) => {
13
+ const [status, setStatus] = useState(src ? 'loading' : 'error');
14
+ useEffect(() => {
15
+ setStatus(src ? 'loading' : 'error');
16
+ }, [src]);
17
+ return (_jsx(AvatarContext, { value: {
18
+ src,
19
+ status,
20
+ setStatus,
21
+ }, children: _jsx("span", { style: style, className: cn('relative flex shrink-0 overflow-hidden rounded-full', className), children: children }) }));
22
+ };
23
+ const Image = ({ alt = 'avatar', width, height, className }) => {
24
+ const { src, status, setStatus } = useAvatarContext();
25
+ if (!src || status === 'error')
26
+ return null;
27
+ return (_jsx("img", { src: src, alt: alt, width: width, height: height, onLoad: () => setStatus('loaded'), onError: () => setStatus('error'), className: cn('aspect-square h-full w-full object-cover', className) }));
28
+ };
29
+ const Fallback = ({ className, children, delayMs = 0 }) => {
30
+ const { status } = useAvatarContext();
31
+ const [show, setShow] = useState(delayMs === 0);
32
+ useEffect(() => {
33
+ if (delayMs === 0) {
34
+ setShow(true);
35
+ return;
36
+ }
37
+ const timer = setTimeout(() => setShow(true), delayMs);
38
+ return () => clearTimeout(timer);
39
+ }, [delayMs]);
40
+ if (status === 'loaded' || !show)
41
+ return null;
42
+ return (_jsx("span", { className: cn('flex h-full w-full items-center justify-center rounded-full', className), children: children }));
43
+ };
44
+ export const AvatarBase = {
45
+ Root,
46
+ Image,
47
+ Fallback,
48
+ };
49
+ export default AvatarBase;
@@ -0,0 +1,25 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type IconName } from '../Icon/LucideIcon.js';
3
+ type BadgeSize = 'xsmall' | 'small' | 'medium' | 'large';
4
+ type BadgeColor = 'orange' | 'fillOrange' | 'red' | 'fillRed' | 'green' | 'fillGreen' | 'blue' | 'fillBlue' | 'yellow' | 'fillYellow' | 'gray' | 'fillGray';
5
+ export interface BadgeProps<T extends string> {
6
+ /** 뱃지 유형 키 (colorsMap의 키와 매칭) */
7
+ type: T;
8
+ /** 뱃지 사이즈 */
9
+ size?: BadgeSize;
10
+ /** type별 색상 매핑 객체 (프리셋 BadgeColor 또는 커스텀 Tailwind 클래스) */
11
+ colorsMap: Record<T, BadgeColor | string>;
12
+ /** 뱃지 내용 */
13
+ children?: ReactNode;
14
+ /** 왼쪽 아이콘 (IconName 또는 ReactNode) */
15
+ leftIcon?: IconName | ReactNode;
16
+ /** 오른쪽 아이콘 (IconName 또는 ReactNode) */
17
+ rightIcon?: IconName | ReactNode;
18
+ /** 추가 CSS 클래스 */
19
+ className?: string;
20
+ /** 인라인 스타일 */
21
+ style?: React.CSSProperties;
22
+ }
23
+ declare const Badge: <T extends string>({ type, size, colorsMap, children, leftIcon, rightIcon, className, style, }: BadgeProps<T>) => import("react/jsx-runtime").JSX.Element;
24
+ export default Badge;
25
+ //# sourceMappingURL=Badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../src/components/Badge/Badge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD,KAAK,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AACzD,KAAK,UAAU,GACX,QAAQ,GACR,YAAY,GACZ,KAAK,GACL,SAAS,GACT,OAAO,GACP,WAAW,GACX,MAAM,GACN,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,MAAM,GACN,UAAU,CAAC;AAEf,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM;IAC1C,iCAAiC;IACjC,IAAI,EAAE,CAAC,CAAC;IACR,aAAa;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IAC1C,YAAY;IACZ,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,sCAAsC;IACtC,SAAS,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACjC,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AA+BD,QAAA,MAAM,KAAK,GAAI,CAAC,SAAS,MAAM,EAAE,6EAS9B,UAAU,CAAC,CAAC,CAAC,4CAmBf,CAAC;AAEF,eAAe,KAAK,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { jsxs as _jsxs } from "react/jsx-runtime";
2
+ import BadgeBase from './BadgeBase.js';
3
+ import { renderIcon } from '../../utils/renderIcon.js';
4
+ import cn from '../../utils/cn.js';
5
+ const colorClasses = {
6
+ orange: 'bg-tintOrange text-orange500',
7
+ fillOrange: 'bg-orange400 text-white',
8
+ green: 'bg-tintGreen text-green700',
9
+ fillGreen: 'bg-success600 text-white',
10
+ red: 'bg-tintRed text-red200',
11
+ fillRed: 'bg-danger600 text-white',
12
+ blue: 'bg-tintBlue text-blue200',
13
+ fillBlue: 'bg-accept600 text-white',
14
+ yellow: 'bg-tintYellow text-yellow700',
15
+ fillYellow: 'bg-warning600 text-white',
16
+ gray: 'bg-mono200 text-neutral800',
17
+ fillGray: 'bg-neutral200 text-white',
18
+ };
19
+ const sizeClasses = {
20
+ xsmall: 'badge-xs',
21
+ small: 'badge-sm',
22
+ medium: 'badge-md',
23
+ large: 'badge-lg',
24
+ };
25
+ const iconSizes = {
26
+ xsmall: 'icon-xs',
27
+ small: 'icon-sm',
28
+ medium: 'icon-md',
29
+ large: 'icon-lg',
30
+ };
31
+ const Badge = ({ type, size = 'small', colorsMap, children, leftIcon, rightIcon, className, style, }) => {
32
+ const color = colorsMap[type];
33
+ const iconSize = iconSizes[size];
34
+ return (_jsxs(BadgeBase.Root, { className: cn('w-auto text-center whitespace-nowrap border border-transparent', colorClasses[color] ?? color, sizeClasses[size], className), style: style, children: [renderIcon(leftIcon, iconSize), children, renderIcon(rightIcon, iconSize)] }));
35
+ };
36
+ export default Badge;
@@ -0,0 +1,10 @@
1
+ import { type HTMLAttributes, type ReactNode, type Ref } from 'react';
2
+ interface RootProps extends HTMLAttributes<HTMLSpanElement> {
3
+ children?: ReactNode;
4
+ ref?: Ref<HTMLSpanElement>;
5
+ }
6
+ export declare const BadgeBase: {
7
+ Root: ({ className, children, ref, ...props }: RootProps) => import("react/jsx-runtime").JSX.Element;
8
+ };
9
+ export default BadgeBase;
10
+ //# sourceMappingURL=BadgeBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BadgeBase.d.ts","sourceRoot":"","sources":["../../../src/components/Badge/BadgeBase.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAItE,UAAU,SAAU,SAAQ,cAAc,CAAC,eAAe,CAAC;IACzD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;CAC5B;AAcD,eAAO,MAAM,SAAS;mDAZgC,SAAS;CAc9D,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import cn from '../../utils/cn.js';
3
+ const Root = ({ className, children, ref, ...props }) => {
4
+ return (_jsx("span", { ref: ref, className: cn('inline-flex items-center justify-center', className), ...props, children: children }));
5
+ };
6
+ export const BadgeBase = {
7
+ Root,
8
+ };
9
+ export default BadgeBase;
@@ -0,0 +1,26 @@
1
+ import * as React from 'react';
2
+ import { type ElementType } from 'react';
3
+ import { PolymorphicComponentProps } from '../../types/polymorphic.js';
4
+ import { type IconName } from '../Icon/LucideIcon.js';
5
+ type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'link';
6
+ type ButtonColor = 'neutral' | 'point' | 'danger';
7
+ export type ButtonSize = '2xsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
8
+ type ButtonShape = 'default' | 'capsule';
9
+ type ButtonAlign = 'left' | 'center' | 'right';
10
+ type _ButtonProps = {
11
+ variant?: ButtonVariant;
12
+ color?: ButtonColor;
13
+ size?: ButtonSize;
14
+ shape?: ButtonShape;
15
+ align?: ButtonAlign;
16
+ loading?: boolean;
17
+ block?: boolean;
18
+ leftIcon?: IconName | React.ReactNode;
19
+ rightIcon?: IconName | React.ReactNode;
20
+ compact?: boolean;
21
+ };
22
+ export type ButtonProps<T extends ElementType> = PolymorphicComponentProps<T, _ButtonProps>;
23
+ type ButtonComponent = <T extends React.ElementType = 'button'>(props: ButtonProps<T>) => React.ReactElement | null;
24
+ declare const Button: ButtonComponent;
25
+ export default Button;
26
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/Button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAQnD,KAAK,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAC5D,KAAK,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAClD,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AACb,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AACzC,KAAK,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAkG/C,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;IACtC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,WAAW,IAAI,yBAAyB,CACxE,CAAC,EACD,YAAY,CACb,CAAC;AAEF,KAAK,eAAe,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,QAAQ,EAC5D,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAClB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;AAE/B,QAAA,MAAM,MAAM,EAAE,eAoEb,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import cn from '../../utils/cn.js';
3
+ import ButtonBase from './ButtonBase.js';
4
+ import { renderIcon } from '../../utils/renderIcon.js';
5
+ import ButtonSpinner from './ButtonSpinner.js';
6
+ // ── 스타일 매핑 (static) ──
7
+ const variantBaseClasses = {
8
+ solid: {
9
+ neutral: 'bg-neutral800 text-white',
10
+ point: 'bg-lb500 text-white',
11
+ danger: 'bg-danger500 text-white',
12
+ },
13
+ outline: {
14
+ neutral: 'bg-white outline outline-neutral200',
15
+ point: 'bg-white outline outline-lb500 text-lb500',
16
+ danger: 'bg-white outline outline-danger500 text-danger500',
17
+ },
18
+ ghost: {
19
+ neutral: 'bg-transparent',
20
+ point: 'bg-transparent text-lb500',
21
+ danger: 'bg-transparent text-danger500',
22
+ },
23
+ link: {
24
+ neutral: 'bg-transparent underline underline-offset-[4px]',
25
+ point: 'bg-transparent text-lb500 underline underline-offset-[4px]',
26
+ danger: 'bg-transparent text-danger500 underline underline-offset-[4px]',
27
+ },
28
+ };
29
+ const variantHoverClasses = {
30
+ solid: {
31
+ neutral: 'hover:bg-neutral900 active:bg-neutral900',
32
+ point: 'hover:bg-lb700 active:bg-lb700',
33
+ danger: 'hover:bg-danger700 active:bg-danger700',
34
+ },
35
+ outline: {
36
+ neutral: 'hover:bg-mono100 active:bg-mono100',
37
+ point: 'hover:bg-accept50 active:bg-accept50',
38
+ danger: 'hover:bg-danger50 active:bg-danger50',
39
+ },
40
+ ghost: {
41
+ neutral: 'hover:bg-mono100',
42
+ point: 'hover:bg-accept50',
43
+ danger: 'hover:bg-danger50',
44
+ },
45
+ link: {
46
+ neutral: 'hover:text-neutral700 active:text-neutral700',
47
+ point: 'hover:text-lb700 active:text-lb700',
48
+ danger: 'hover:text-danger600 active:text-danger600',
49
+ },
50
+ };
51
+ const variantDisabledClasses = {
52
+ solid: 'bg-mono300 text-white',
53
+ outline: 'text-mono300 outline outline-neutral100',
54
+ ghost: 'text-mono300',
55
+ link: 'text-mono300 underline underline-offset-[4px]',
56
+ };
57
+ const colorFocusClasses = {
58
+ neutral: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral800',
59
+ point: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-lb500',
60
+ danger: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-danger500',
61
+ };
62
+ const sizeClasses = {
63
+ '2xsmall': 'btn-2xs',
64
+ xsmall: 'btn-xs',
65
+ small: 'btn-sm',
66
+ medium: 'btn-md',
67
+ large: 'btn-lg',
68
+ xlarge: 'btn-xl',
69
+ };
70
+ const iconSizeClasses = {
71
+ '2xsmall': 'icon-2xs',
72
+ xsmall: 'icon-xs',
73
+ small: 'icon-sm',
74
+ medium: 'icon-md',
75
+ large: 'icon-lg',
76
+ xlarge: 'icon-xl',
77
+ };
78
+ const alignClasses = {
79
+ left: 'justify-start',
80
+ center: 'justify-center',
81
+ right: 'justify-end',
82
+ };
83
+ const shapeClasses = {
84
+ default: 'rounded-[5px]',
85
+ capsule: 'rounded-full',
86
+ };
87
+ const Button = ({ as, variant = 'solid', color = 'point', size = 'small', shape = 'default', align = 'center', loading = false, block = false, children, className, leftIcon, rightIcon, compact = false, ref, ...props }) => {
88
+ const iconSize = iconSizeClasses[size];
89
+ return (_jsxs(ButtonBase.Root, { as: as, ref: ref, className: cn('relative ld-transition', {
90
+ [variantBaseClasses[variant][color]]: !props.disabled,
91
+ [variantHoverClasses[variant][color]]: !props.disabled && !loading,
92
+ [variantDisabledClasses[variant]]: props.disabled,
93
+ }, {
94
+ [`${colorFocusClasses[color]} focus-visible:ring-offset-2`]: variant === 'solid',
95
+ [`${colorFocusClasses[color]} focus-visible:ring-inset`]: variant !== 'solid',
96
+ }, {
97
+ ['cursor-pointer']: !props.disabled && !loading,
98
+ ['cursor-wait']: !props.disabled && loading,
99
+ ['cursor-not-allowed']: props.disabled,
100
+ }, block && 'w-full', sizeClasses[size], shapeClasses[shape], alignClasses[align], compact && 'px-0 min-w-0 aspect-square', className), ...props, disabled: props.disabled || loading, children: [loading ? (_jsx(ButtonSpinner, { size: size, className: "mobile:absolute mobile:left-1/2 mobile:top-1/2 mobile:-translate-x-1/2 mobile:-translate-y-1/2" })) : (renderIcon(leftIcon, iconSize)), children && (_jsx("span", { className: cn('shrink-0', loading && 'mobile:invisible'), children: children })), renderIcon(rightIcon, iconSize, loading && 'mobile:invisible')] }));
101
+ };
102
+ export default Button;
@@ -0,0 +1,5 @@
1
+ export declare const ButtonBase: {
2
+ Root: React.ElementType;
3
+ };
4
+ export default ButtonBase;
5
+ //# sourceMappingURL=ButtonBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonBase.d.ts","sourceRoot":"","sources":["../../../src/components/Button/ButtonBase.tsx"],"names":[],"mappings":"AA0BA,eAAO,MAAM,UAAU;UACP,KAAK,CAAC,WAAW;CAChC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import cn from '../../utils/cn.js';
3
+ const Root = ({ as, className, children, ref, ...props }) => {
4
+ const Component = as ?? 'button';
5
+ return (_jsx(Component, { ref: ref, className: cn('relative inline-flex flex-row items-center justify-center', className), ...props, children: children }));
6
+ };
7
+ export const ButtonBase = {
8
+ Root: Root,
9
+ };
10
+ export default ButtonBase;
@@ -0,0 +1,9 @@
1
+ interface ButtonSpinnerProps {
2
+ size?: ButtonSpinnerSize;
3
+ repeat?: 'once' | 'infinite';
4
+ className?: string;
5
+ }
6
+ type ButtonSpinnerSize = '2xsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
7
+ declare const ButtonSpinner: ({ size, repeat, className, }: ButtonSpinnerProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default ButtonSpinner;
9
+ //# sourceMappingURL=ButtonSpinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonSpinner.d.ts","sourceRoot":"","sources":["../../../src/components/Button/ButtonSpinner.tsx"],"names":[],"mappings":"AAEA,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,iBAAiB,GAClB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AAWb,QAAA,MAAM,aAAa,GAAI,8BAIpB,kBAAkB,4CAWpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import cn from '../../utils/cn.js';
3
+ const sizeClasses = {
4
+ '2xsmall': 'spinner-2xs',
5
+ xsmall: 'spinner-xs',
6
+ small: 'spinner-sm',
7
+ medium: 'spinner-md',
8
+ large: 'spinner-lg',
9
+ xlarge: 'spinner-xl',
10
+ };
11
+ const ButtonSpinner = ({ size = 'small', repeat, className, }) => {
12
+ return (_jsx("div", { className: cn('shrink-0 rounded-full border-2 border-current border-t-transparent', sizeClasses[size], repeat !== 'once' && 'animate-spin', className) }));
13
+ };
14
+ export default ButtonSpinner;
@@ -0,0 +1,16 @@
1
+ import { type DayPickerProps, type Matcher } from 'react-day-picker';
2
+ import { type CSSProperties } from 'react';
3
+ /** react-day-picker의 DayPickerProps를 확장한 캘린더 props */
4
+ type CalendarProps = DayPickerProps & {
5
+ /** 추가 CSS 클래스 */
6
+ className?: string;
7
+ /** 인라인 스타일 */
8
+ style?: CSSProperties;
9
+ /** 예약 완료된 날짜 (취소선 표시) */
10
+ booked?: Matcher | Matcher[];
11
+ /** 예약 가능한 날짜 (아래에 점 표시) */
12
+ book?: Matcher | Matcher[];
13
+ };
14
+ declare const Calendar: ({ className, style, classNames, showOutsideDays, captionLayout, formatters, components, booked, book, modifiers, ...props }: CalendarProps) => import("react/jsx-runtime").JSX.Element;
15
+ export default Calendar;
16
+ //# sourceMappingURL=Calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,OAAO,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,aAAa,EAInB,MAAM,OAAO,CAAC;AAIf,sDAAsD;AACtD,KAAK,aAAa,GAAG,cAAc,GAAG;IACpC,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,yBAAyB;IACzB,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;IAC7B,2BAA2B;IAC3B,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;CAC5B,CAAC;AAEF,QAAA,MAAM,QAAQ,GAAI,6HAYf,aAAa,4CAsJf,CAAC;AAoEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,75 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { DayPicker, getDefaultClassNames, } from 'react-day-picker';
4
+ import { useRef, useEffect, } from 'react';
5
+ import LucideIcon from '../Icon/LucideIcon.js';
6
+ import cn from '../../utils/cn.js';
7
+ const Calendar = ({ className, style, classNames, showOutsideDays = true, captionLayout = 'label', formatters, components, booked, book, modifiers, ...props }) => {
8
+ // 라이브러리가 기본적으로 사용하는 모든 css 클래스 이름을 담고있는 객체
9
+ const defaultClassNames = getDefaultClassNames();
10
+ return (_jsx(DayPicker, { showOutsideDays: showOutsideDays, startMonth: new Date(1900, 0), endMonth: new Date(new Date().getFullYear() + 10, 11), style: style, className: cn('bg-white group/calendar p-3 [--cell-size:--spacing(8)] w-fit',
11
+ //rtl일때 버튼 아이콘 방향 전환
12
+ String.raw `rtl:**:[.rdp-button\_next>svg]:rotate-180`, String.raw `rtl:**:[.rdp-button\_previous>svg]:rotate-180`, className), captionLayout: captionLayout, formatters: {
13
+ formatMonthDropdown: (date) => date.toLocaleString('default', { month: 'short' }),
14
+ ...formatters,
15
+ }, classNames: {
16
+ root: cn(defaultClassNames.root),
17
+ months: cn('flex gap-4 flex-col md:flex-row relative', defaultClassNames.months),
18
+ month: cn('flex flex-col w-full gap-4', defaultClassNames.month),
19
+ nav: cn('flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between', defaultClassNames.nav),
20
+ button_previous: cn('inline-flex items-center justify-center rounded-md text-sm font-medium transition-all outline-none hover:bg-neutral-100 hover:text-neutral-900 focus-visible:border-neutral-950 focus-visible:ring-neutral-950/50 focus-visible:ring-[3px]', 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none cursor-pointer', defaultClassNames.button_previous),
21
+ button_next: cn('inline-flex items-center justify-center rounded-md text-sm font-medium transition-all outline-none hover:bg-neutral-100 hover:text-neutral-900 focus-visible:border-neutral-950 focus-visible:ring-neutral-950/50 focus-visible:ring-[3px]', 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none cursor-pointer', defaultClassNames.button_next),
22
+ month_caption: cn('flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)', defaultClassNames.month_caption),
23
+ dropdowns: cn('w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5', defaultClassNames.dropdowns),
24
+ dropdown_root: cn('relative has-focus:border-lb600 border border-neutral-200 shadow-xs has-focus:ring-lb600/50 has-focus:ring-[3px] rounded-md', defaultClassNames.dropdown_root),
25
+ dropdown: cn('absolute bg-white inset-0 opacity-0', defaultClassNames.dropdown),
26
+ caption_label: cn('select-none font-medium', captionLayout === 'label'
27
+ ? 'text-sm'
28
+ : cn('rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-neutral-500 [&>svg]:size-3.5'), defaultClassNames.caption_label),
29
+ table: 'w-full border-collapse',
30
+ weekdays: cn('flex', defaultClassNames.weekdays),
31
+ weekday: cn('text-neutral-500 rounded-md flex-1 font-normal text-[0.8rem] select-none', defaultClassNames.weekday),
32
+ week: cn('flex w-full mt-2', defaultClassNames.week),
33
+ week_number_header: cn('select-none w-(--cell-size)', defaultClassNames.week_number_header),
34
+ week_number: cn('text-[0.8rem] select-none text-neutral-500', defaultClassNames.week_number),
35
+ day: cn('relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none', defaultClassNames.day),
36
+ range_start: cn('rounded-l-md bg-neutral-100', defaultClassNames.range_start),
37
+ range_middle: cn('rounded-none', defaultClassNames.range_middle),
38
+ range_end: cn('rounded-r-md bg-neutral-100', defaultClassNames.range_end),
39
+ today: cn('bg-lb50 text-lb900 rounded-md data-[selected=true]:rounded-none font-semibold', defaultClassNames.today),
40
+ outside: cn('text-neutral-500 aria-selected:text-neutral-500', defaultClassNames.outside),
41
+ disabled: cn('text-neutral-500 opacity-50', defaultClassNames.disabled),
42
+ hidden: cn('invisible', defaultClassNames.hidden),
43
+ ...classNames,
44
+ }, modifiers: {
45
+ booked,
46
+ book,
47
+ ...modifiers,
48
+ }, components: {
49
+ Root: ({ className: rootClassName, rootRef, ...rootProps }) => (_jsx("div", { "data-slot": "calendar", ref: rootRef, className: cn(rootClassName), ...rootProps })),
50
+ Chevron: ({ className: chevronClassName, orientation }) => {
51
+ const iconName = orientation === 'left'
52
+ ? 'chevronLeft'
53
+ : orientation === 'right'
54
+ ? 'chevronRight'
55
+ : 'chevronDown';
56
+ return (_jsx(LucideIcon, { name: iconName, className: cn('size-4', chevronClassName) }));
57
+ },
58
+ DayButton: CalendarDayButton,
59
+ WeekNumber: ({ children, ...weekNumberProps }) => (_jsx("td", { ...weekNumberProps, children: _jsx("div", { className: "flex size-(--cell-size) items-center justify-center text-center", children: children }) })),
60
+ ...components,
61
+ }, ...props }));
62
+ };
63
+ function CalendarDayButton({ className: btnClassName, day, modifiers, ...btnProps }) {
64
+ const defaultClassNames = getDefaultClassNames();
65
+ const ref = useRef(null);
66
+ useEffect(() => {
67
+ if (modifiers.focused)
68
+ ref.current?.focus();
69
+ }, [modifiers.focused]);
70
+ return (_jsxs("button", { ref: ref, type: "button", "data-day": day.date.toLocaleDateString(), "data-selected-single": modifiers.selected &&
71
+ !modifiers.range_start &&
72
+ !modifiers.range_end &&
73
+ !modifiers.range_middle, "data-range-start": modifiers.range_start, "data-range-end": modifiers.range_end, "data-range-middle": modifiers.range_middle, className: cn('relative inline-flex items-center justify-center rounded-md text-sm font-medium transition-all outline-none cursor-pointer', 'hover:bg-lb50 hover:text-lb900', 'focus-visible:border-lb600 focus-visible:ring-lb600/50 focus-visible:ring-[3px]', 'data-[selected-single=true]:bg-lb600 data-[selected-single=true]:text-white', 'data-[range-middle=true]:bg-lb50 data-[range-middle=true]:text-lb900', 'data-[range-start=true]:bg-lb600 data-[range-start=true]:text-white', 'data-[range-end=true]:bg-lb600 data-[range-end=true]:text-white', 'flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal', 'group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-lb600/50 group-data-[focused=true]/day:ring-[3px]', 'data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md', 'data-[range-middle=true]:rounded-none', 'data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md', '[&>span]:text-xs [&>span]:opacity-70', defaultClassNames.day, btnClassName), ...btnProps, children: [_jsx("span", { className: cn('relative z-10', modifiers.booked && 'line-through opacity-40 decoration-current'), children: btnProps.children }), modifiers.book && (_jsx("span", { className: cn('absolute bottom-1.5 size-1 rounded-full bg-lb600', modifiers.selected && 'bg-white') }))] }));
74
+ }
75
+ export default Calendar;
@@ -0,0 +1,50 @@
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
+ import { type CarouselOrientation, type RootProps } from './CarouselBase.js';
3
+ export interface CarouselProps {
4
+ /** 슬라이드로 렌더링할 노드 배열 */
5
+ slides: ReactNode[];
6
+ /** 가로/세로 방향. 기본 'horizontal' */
7
+ orientation?: CarouselOrientation;
8
+ /** 무한 루프. 기본 false */
9
+ loop?: boolean;
10
+ /** 자동재생(스텝형). true 또는 { delay, stopOnInteraction } */
11
+ autoplay?: boolean | {
12
+ delay?: number;
13
+ stopOnInteraction?: boolean;
14
+ };
15
+ /** 연속 흐름(Auto Scroll). autoplay와 동시 사용 불가, loop와 함께 권장 */
16
+ autoScroll?: RootProps['autoScroll'];
17
+ /** 슬라이드 정렬 위치. 기본 'start'(왼쪽 끝 붙음) */
18
+ align?: RootProps['align'];
19
+ /** 이전/다음 화살표 표시. 기본 true */
20
+ showArrows?: boolean;
21
+ /** 하단 도트 페이지네이션 표시. 기본 true */
22
+ showDots?: boolean;
23
+ /** "현재 / 전체" 숫자 표시. 기본 false */
24
+ showCounter?: boolean;
25
+ /** 슬라이드 한 개의 크기(basis). 기본 '100%' */
26
+ slideSize?: string;
27
+ /** 슬라이드 사이 간격(Tailwind gap 단위 px). 기본 16 */
28
+ gap?: number;
29
+ className?: string;
30
+ style?: CSSProperties;
31
+ /** Viewport에 적용할 클래스 (세로 모드 높이 지정 등) */
32
+ viewportClassName?: string;
33
+ }
34
+ /**
35
+ * embla-carousel 기반 기본 캐러셀.
36
+ * 고급 커스터마이징이 필요하면 `Carousel.Root` 등 compound API를 직접 조합하세요.
37
+ */
38
+ declare const Carousel: {
39
+ ({ slides, orientation, loop, autoplay, autoScroll, align, showArrows, showDots, showCounter, slideSize, gap, className, style, viewportClassName, }: CarouselProps): import("react/jsx-runtime").JSX.Element;
40
+ Root: ({ orientation, loop, autoplay, autoScroll, align, options, gap, className, style, children, }: RootProps) => import("react/jsx-runtime").JSX.Element;
41
+ Viewport: ({ className, children }: import("./CarouselBase.js").ViewportProps) => import("react/jsx-runtime").JSX.Element;
42
+ Container: ({ className, style, children }: import("./CarouselBase.js").ContainerProps) => import("react/jsx-runtime").JSX.Element;
43
+ Slide: ({ size, index, total, className, style, children, }: import("./CarouselBase.js").SlideProps) => import("react/jsx-runtime").JSX.Element;
44
+ Prev: ({ className, children, ...props }: import("./CarouselBase.js").NavButtonProps) => import("react/jsx-runtime").JSX.Element;
45
+ Next: ({ className, children, ...props }: import("./CarouselBase.js").NavButtonProps) => import("react/jsx-runtime").JSX.Element;
46
+ Dots: ({ className, dotClassName }: import("./CarouselBase.js").DotsProps) => import("react/jsx-runtime").JSX.Element;
47
+ Counter: ({ className, format }: import("./CarouselBase.js").CounterProps) => import("react/jsx-runtime").JSX.Element;
48
+ };
49
+ export default Carousel;
50
+ //# sourceMappingURL=Carousel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../../src/components/Carousel/Carousel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAqB,EACnB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,gCAAgC;IAChC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,sBAAsB;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACrE,0DAA0D;IAC1D,UAAU,CAAC,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;IACrC,sCAAsC;IACtC,KAAK,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3B,4BAA4B;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,wCAAwC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,QAAA,MAAM,QAAQ;0JAeX,aAAa;;;;;;;;;CAuDf,CAAC;AAWF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,22 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import CarouselBase from './CarouselBase.js';
4
+ import cn from '../../utils/cn.js';
5
+ /**
6
+ * embla-carousel 기반 기본 캐러셀.
7
+ * 고급 커스터마이징이 필요하면 `Carousel.Root` 등 compound API를 직접 조합하세요.
8
+ */
9
+ const Carousel = ({ slides, orientation = 'horizontal', loop = false, autoplay = false, autoScroll = false, align = 'start', showArrows = true, showDots = true, showCounter = false, slideSize = '100%', gap = 16, className, style, viewportClassName, }) => {
10
+ const isVertical = orientation === 'vertical';
11
+ const total = slides.length;
12
+ return (_jsx(CarouselBase.Root, { orientation: orientation, loop: loop, autoplay: autoplay, autoScroll: autoScroll, align: align, gap: gap, className: className, style: style, children: _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: cn('flex items-center gap-3 w-full', isVertical && 'flex-col'), children: [showArrows && _jsx(CarouselBase.Prev, {}), _jsx(CarouselBase.Viewport, { className: cn('w-full', viewportClassName), children: _jsx(CarouselBase.Container, { children: slides.map((slide, i) => (_jsx(CarouselBase.Slide, { size: slideSize, index: i, total: total, children: slide }, i))) }) }), showArrows && _jsx(CarouselBase.Next, {})] }), (showDots || showCounter) && (_jsxs("div", { className: "flex items-center justify-center gap-3", children: [showDots && (_jsx(CarouselBase.Dots, { className: isVertical ? 'flex-col' : undefined })), showCounter && _jsx(CarouselBase.Counter, {})] }))] }) }));
13
+ };
14
+ Carousel.Root = CarouselBase.Root;
15
+ Carousel.Viewport = CarouselBase.Viewport;
16
+ Carousel.Container = CarouselBase.Container;
17
+ Carousel.Slide = CarouselBase.Slide;
18
+ Carousel.Prev = CarouselBase.Prev;
19
+ Carousel.Next = CarouselBase.Next;
20
+ Carousel.Dots = CarouselBase.Dots;
21
+ Carousel.Counter = CarouselBase.Counter;
22
+ export default Carousel;