@thewrong/ui 0.1.0 → 0.2.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 (256) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs.js +1 -0
  2. package/dist/components/_shared/form-size-tokens.cjs.js +1 -0
  3. package/dist/components/_shared/form-size-tokens.esm.js +29 -0
  4. package/dist/components/action-toast/ActionToast.cjs.js +1 -0
  5. package/dist/components/action-toast/ActionToast.esm.js +228 -0
  6. package/dist/components/animated-height/AnimatedHeight.cjs.js +1 -0
  7. package/dist/components/animated-height/AnimatedHeight.esm.js +36 -0
  8. package/dist/components/badge/Badge.cjs.js +1 -0
  9. package/dist/components/badge/Badge.esm.js +30 -0
  10. package/dist/components/badge/utils.cjs.js +1 -0
  11. package/dist/components/badge/utils.esm.js +38 -0
  12. package/dist/components/button/Button.cjs.js +1 -0
  13. package/dist/components/button/Button.esm.js +84 -0
  14. package/dist/components/button/utils.cjs.js +1 -0
  15. package/dist/components/button/utils.esm.js +38 -0
  16. package/dist/components/checkbox/Checkbox.cjs.js +1 -0
  17. package/dist/components/checkbox/Checkbox.esm.js +68 -0
  18. package/dist/components/checkbox/utils.cjs.js +1 -0
  19. package/dist/components/checkbox/utils.esm.js +44 -0
  20. package/dist/components/collapsible/Collapsible.cjs.js +1 -0
  21. package/dist/components/collapsible/Collapsible.esm.js +19 -0
  22. package/dist/components/date-input/DateInput.cjs.js +1 -0
  23. package/dist/components/date-input/DateInput.esm.js +39 -0
  24. package/dist/components/date-picker/date-picker.cjs.js +1 -0
  25. package/dist/components/date-picker/date-picker.esm.js +231 -0
  26. package/dist/components/date-picker/date-range-picker.cjs.js +1 -0
  27. package/dist/components/date-picker/date-range-picker.esm.js +287 -0
  28. package/dist/components/date-picker/month-picker.cjs.js +1 -0
  29. package/dist/components/date-picker/month-picker.esm.js +147 -0
  30. package/dist/components/drawer/Drawer.cjs.js +1 -0
  31. package/dist/components/drawer/Drawer.esm.js +113 -0
  32. package/dist/components/info-tooltip/InfoTooltip.cjs.js +1 -0
  33. package/dist/components/info-tooltip/InfoTooltip.esm.js +24 -0
  34. package/dist/components/input/Input.cjs.js +1 -0
  35. package/dist/components/input/Input.esm.js +95 -0
  36. package/dist/components/input/PasswordInput.cjs.js +1 -0
  37. package/dist/components/input/PasswordInput.esm.js +29 -0
  38. package/dist/components/input/format.cjs.js +1 -0
  39. package/dist/components/input/format.esm.js +33 -0
  40. package/dist/components/input/utils.cjs.js +1 -0
  41. package/dist/components/input/utils.esm.js +23 -0
  42. package/dist/components/loading-spinner/LoadingSpinner.cjs.js +1 -0
  43. package/dist/components/loading-spinner/LoadingSpinner.esm.js +47 -0
  44. package/dist/components/modal/Modal.cjs.js +1 -0
  45. package/dist/components/modal/Modal.esm.js +137 -0
  46. package/dist/components/modal/ModalSubView.cjs.js +1 -0
  47. package/dist/components/modal/ModalSubView.esm.js +91 -0
  48. package/dist/components/modal/StandardModal.cjs.js +1 -0
  49. package/dist/components/modal/StandardModal.esm.js +54 -0
  50. package/dist/components/page-title/PageTitle.cjs.js +1 -0
  51. package/dist/components/page-title/PageTitle.esm.js +16 -0
  52. package/dist/components/popover/Popover.cjs.js +1 -0
  53. package/dist/components/popover/Popover.esm.js +57 -0
  54. package/dist/components/search-box/ExactMatchToggle.cjs.js +1 -0
  55. package/dist/components/search-box/ExactMatchToggle.esm.js +27 -0
  56. package/dist/components/search-box/SearchBox.cjs.js +1 -0
  57. package/dist/components/search-box/SearchBox.esm.js +154 -0
  58. package/dist/components/search-box/SearchBoxChips.cjs.js +1 -0
  59. package/dist/components/search-box/SearchBoxChips.esm.js +36 -0
  60. package/dist/components/search-box/SearchBoxDateRange.cjs.js +1 -0
  61. package/dist/components/search-box/SearchBoxDateRange.esm.js +57 -0
  62. package/dist/components/search-box/SearchBoxDateSingle.cjs.js +1 -0
  63. package/dist/components/search-box/SearchBoxDateSingle.esm.js +37 -0
  64. package/dist/components/search-box/SearchBoxField.cjs.js +1 -0
  65. package/dist/components/search-box/SearchBoxField.esm.js +48 -0
  66. package/dist/components/search-box/SearchBoxFloatingInput.cjs.js +1 -0
  67. package/dist/components/search-box/SearchBoxFloatingInput.esm.js +38 -0
  68. package/dist/components/search-box/SearchBoxFloatingSelect.cjs.js +1 -0
  69. package/dist/components/search-box/SearchBoxFloatingSelect.esm.js +74 -0
  70. package/dist/components/search-box/SearchBoxMonth.cjs.js +1 -0
  71. package/dist/components/search-box/SearchBoxMonth.esm.js +35 -0
  72. package/dist/components/search-box/SearchBoxMultiSelect.cjs.js +1 -0
  73. package/dist/components/search-box/SearchBoxMultiSelect.esm.js +78 -0
  74. package/dist/components/search-box/SearchBoxSheetContext.cjs.js +1 -0
  75. package/dist/components/search-box/SearchBoxSheetContext.esm.js +5 -0
  76. package/dist/components/search-box/dateRangePresets.cjs.js +1 -0
  77. package/dist/components/search-box/dateRangePresets.esm.js +59 -0
  78. package/dist/components/search-box/parseDateRange.cjs.js +1 -0
  79. package/dist/components/search-box/parseDateRange.esm.js +21 -0
  80. package/dist/components/search-box/parseSearchValues.cjs.js +1 -0
  81. package/dist/components/search-box/parseSearchValues.esm.js +15 -0
  82. package/dist/components/search-box/useSearchBoxState.cjs.js +1 -0
  83. package/dist/components/search-box/useSearchBoxState.esm.js +87 -0
  84. package/dist/components/select/MultiSelect.cjs.js +1 -0
  85. package/dist/components/select/MultiSelect.esm.js +277 -0
  86. package/dist/components/select/Select.cjs.js +1 -0
  87. package/dist/components/select/Select.esm.js +308 -0
  88. package/dist/components/select/loading-dots.cjs.js +1 -0
  89. package/dist/components/select/loading-dots.esm.js +23 -0
  90. package/dist/components/switch/Switch.cjs.js +1 -0
  91. package/dist/components/switch/Switch.esm.js +36 -0
  92. package/dist/components/switch/utils.cjs.js +1 -0
  93. package/dist/components/switch/utils.esm.js +39 -0
  94. package/dist/components/table/accordion-table.cjs.js +1 -0
  95. package/dist/components/table/accordion-table.esm.js +418 -0
  96. package/dist/components/table/column-group-utils.cjs.js +1 -0
  97. package/dist/components/table/column-group-utils.esm.js +53 -0
  98. package/dist/components/table/components/ColumnPresetSelector.cjs.js +1 -0
  99. package/dist/components/table/components/ColumnPresetSelector.esm.js +165 -0
  100. package/dist/components/table/components/ColumnSettingsTable.cjs.js +4 -0
  101. package/dist/components/table/components/ColumnSettingsTable.esm.js +196 -0
  102. package/dist/components/table/components/KeyboardNavButton.cjs.js +1 -0
  103. package/dist/components/table/components/KeyboardNavButton.esm.js +24 -0
  104. package/dist/components/table/components/PageJumpInput.cjs.js +1 -0
  105. package/dist/components/table/components/PageJumpInput.esm.js +53 -0
  106. package/dist/components/table/components/Pagination.cjs.js +1 -0
  107. package/dist/components/table/components/Pagination.esm.js +162 -0
  108. package/dist/components/table/components/PaginationFooter.cjs.js +1 -0
  109. package/dist/components/table/components/PaginationFooter.esm.js +80 -0
  110. package/dist/components/table/components/SortableHeaderCell.cjs.js +1 -0
  111. package/dist/components/table/components/SortableHeaderCell.esm.js +30 -0
  112. package/dist/components/table/hooks/useColumnPresets.cjs.js +1 -0
  113. package/dist/components/table/hooks/useColumnPresets.esm.js +165 -0
  114. package/dist/components/table/hooks/useColumnResize.cjs.js +1 -0
  115. package/dist/components/table/hooks/useColumnResize.esm.js +106 -0
  116. package/dist/components/table/hooks/useFillEmptyRows.cjs.js +1 -0
  117. package/dist/components/table/hooks/useFillEmptyRows.esm.js +49 -0
  118. package/dist/components/table/hooks/useInfiniteScroll.cjs.js +1 -0
  119. package/dist/components/table/hooks/useInfiniteScroll.esm.js +32 -0
  120. package/dist/components/table/hooks/useTableColumnState.cjs.js +1 -0
  121. package/dist/components/table/hooks/useTableColumnState.esm.js +46 -0
  122. package/dist/components/table/hooks/useTableDragSelection.cjs.js +1 -0
  123. package/dist/components/table/hooks/useTableDragSelection.esm.js +76 -0
  124. package/dist/components/table/hooks/useTableSort.cjs.js +1 -0
  125. package/dist/components/table/hooks/useTableSort.esm.js +30 -0
  126. package/dist/components/table/hooks/useVirtualTable.cjs.js +1 -0
  127. package/dist/components/table/hooks/useVirtualTable.esm.js +18 -0
  128. package/dist/components/table/mini-table.cjs.js +1 -0
  129. package/dist/components/table/mini-table.esm.js +126 -0
  130. package/dist/components/table/paginated-mini-table.cjs.js +1 -0
  131. package/dist/components/table/paginated-mini-table.esm.js +31 -0
  132. package/dist/components/table/paginated-table.cjs.js +1 -0
  133. package/dist/components/table/paginated-table.esm.js +31 -0
  134. package/dist/components/table/table.cjs.js +1 -0
  135. package/dist/components/table/table.esm.js +342 -0
  136. package/dist/components/table/utils.cjs.js +37 -0
  137. package/dist/components/table/utils.esm.js +16 -0
  138. package/dist/components/table-checkbox/TableCheckbox.cjs.js +1 -0
  139. package/dist/components/table-checkbox/TableCheckbox.esm.js +39 -0
  140. package/dist/components/table-page-layout/TablePageLayout.cjs.js +1 -0
  141. package/dist/components/table-page-layout/TablePageLayout.esm.js +37 -0
  142. package/dist/components/textarea/Textarea.cjs.js +1 -0
  143. package/dist/components/textarea/Textarea.esm.js +62 -0
  144. package/dist/components/toast/ToastProvider.cjs.js +1 -0
  145. package/dist/components/toast/ToastProvider.esm.js +82 -0
  146. package/dist/components/toast/index.esm.js +3 -0
  147. package/dist/components/toolbar/Toolbar.cjs.js +1 -0
  148. package/dist/components/toolbar/Toolbar.esm.js +148 -0
  149. package/dist/components/tooltip/Tooltip.cjs.js +1 -0
  150. package/dist/components/tooltip/Tooltip.esm.js +39 -0
  151. package/dist/hooks/useBottomSheetDrag.cjs.js +1 -0
  152. package/dist/hooks/useBottomSheetDrag.esm.js +17 -0
  153. package/dist/hooks/useClickOutside.cjs.js +1 -0
  154. package/dist/hooks/useClickOutside.esm.js +20 -0
  155. package/dist/hooks/useMediaQuery.cjs.js +1 -0
  156. package/dist/hooks/useMediaQuery.esm.js +15 -0
  157. package/dist/hooks/useScrollLock.cjs.js +1 -0
  158. package/dist/hooks/useScrollLock.esm.js +16 -0
  159. package/dist/hooks.cjs.js +1 -0
  160. package/dist/hooks.esm.js +5 -0
  161. package/dist/index.cjs.js +1 -40
  162. package/dist/index.esm.js +58 -0
  163. package/dist/lib/Portal.cjs.js +1 -0
  164. package/dist/lib/Portal.esm.js +11 -0
  165. package/dist/lib/column-preset-storage.cjs.js +1 -0
  166. package/dist/lib/column-preset-storage.esm.js +123 -0
  167. package/dist/lib/overlay-stack.cjs.js +1 -0
  168. package/dist/lib/overlay-stack.esm.js +28 -0
  169. package/dist/lib/utils.cjs.js +1 -0
  170. package/dist/lib/utils.esm.js +11 -0
  171. package/dist/node_modules/clsx/dist/clsx.cjs.js +1 -0
  172. package/dist/node_modules/clsx/dist/clsx.esm.js +16 -0
  173. package/dist/node_modules/lucide-react/dist/esm/Icon.cjs.js +1 -0
  174. package/dist/node_modules/lucide-react/dist/esm/Icon.esm.js +23 -0
  175. package/dist/node_modules/lucide-react/dist/esm/context.cjs.js +1 -0
  176. package/dist/node_modules/lucide-react/dist/esm/context.esm.js +6 -0
  177. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.cjs.js +1 -0
  178. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.esm.js +17 -0
  179. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.cjs.js +1 -0
  180. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.esm.js +14 -0
  181. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-left.cjs.js +1 -0
  182. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-left.esm.js +10 -0
  183. package/dist/node_modules/lucide-react/dist/esm/icons/calendar.cjs.js +1 -0
  184. package/dist/node_modules/lucide-react/dist/esm/icons/calendar.esm.js +25 -0
  185. package/dist/node_modules/lucide-react/dist/esm/icons/check.cjs.js +1 -0
  186. package/dist/node_modules/lucide-react/dist/esm/icons/check.esm.js +7 -0
  187. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js +1 -0
  188. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.esm.js +7 -0
  189. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.cjs.js +1 -0
  190. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.esm.js +7 -0
  191. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.cjs.js +1 -0
  192. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.esm.js +7 -0
  193. package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-left.cjs.js +1 -0
  194. package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-left.esm.js +10 -0
  195. package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-right.cjs.js +1 -0
  196. package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-right.esm.js +10 -0
  197. package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.cjs.js +1 -0
  198. package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.esm.js +12 -0
  199. package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.cjs.js +1 -0
  200. package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.esm.js +19 -0
  201. package/dist/node_modules/lucide-react/dist/esm/icons/eye-off.cjs.js +1 -0
  202. package/dist/node_modules/lucide-react/dist/esm/icons/eye-off.esm.js +21 -0
  203. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.js +1 -0
  204. package/dist/node_modules/lucide-react/dist/esm/icons/eye.esm.js +12 -0
  205. package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.cjs.js +1 -0
  206. package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.esm.js +41 -0
  207. package/dist/node_modules/lucide-react/dist/esm/icons/info.cjs.js +1 -0
  208. package/dist/node_modules/lucide-react/dist/esm/icons/info.esm.js +19 -0
  209. package/dist/node_modules/lucide-react/dist/esm/icons/keyboard.cjs.js +1 -0
  210. package/dist/node_modules/lucide-react/dist/esm/icons/keyboard.esm.js +45 -0
  211. package/dist/node_modules/lucide-react/dist/esm/icons/list-filter.cjs.js +1 -0
  212. package/dist/node_modules/lucide-react/dist/esm/icons/list-filter.esm.js +17 -0
  213. package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.cjs.js +1 -0
  214. package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.esm.js +7 -0
  215. package/dist/node_modules/lucide-react/dist/esm/icons/minus.cjs.js +1 -0
  216. package/dist/node_modules/lucide-react/dist/esm/icons/minus.esm.js +7 -0
  217. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs.js +1 -0
  218. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.esm.js +10 -0
  219. package/dist/node_modules/lucide-react/dist/esm/icons/save.cjs.js +1 -0
  220. package/dist/node_modules/lucide-react/dist/esm/icons/save.esm.js +17 -0
  221. package/dist/node_modules/lucide-react/dist/esm/icons/search.cjs.js +1 -0
  222. package/dist/node_modules/lucide-react/dist/esm/icons/search.esm.js +12 -0
  223. package/dist/node_modules/lucide-react/dist/esm/icons/settings.cjs.js +1 -0
  224. package/dist/node_modules/lucide-react/dist/esm/icons/settings.esm.js +12 -0
  225. package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.cjs.js +1 -0
  226. package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.esm.js +17 -0
  227. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.js +1 -0
  228. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.esm.js +7 -0
  229. package/dist/node_modules/lucide-react/dist/esm/icons/x.cjs.js +1 -0
  230. package/dist/node_modules/lucide-react/dist/esm/icons/x.esm.js +10 -0
  231. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.cjs.js +1 -0
  232. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.esm.js +7 -0
  233. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.cjs.js +1 -0
  234. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.esm.js +4 -0
  235. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.cjs.js +1 -0
  236. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.esm.js +4 -0
  237. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.cjs.js +1 -0
  238. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.esm.js +4 -0
  239. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.cjs.js +1 -0
  240. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.esm.js +8 -0
  241. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs.js +1 -0
  242. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.esm.js +1714 -0
  243. package/dist/node_modules/use-debounce/dist/index.module.cjs.js +1 -0
  244. package/dist/node_modules/use-debounce/dist/index.module.esm.js +70 -0
  245. package/dist/src/components/action-toast/ActionToast.d.ts +6 -1
  246. package/dist/src/components/button/Button.d.ts +16 -0
  247. package/dist/src/components/drawer/Drawer.d.ts +6 -1
  248. package/dist/src/components/info-tooltip/InfoTooltip.d.ts +7 -0
  249. package/dist/src/components/loading-spinner/LoadingSpinner.d.ts +7 -0
  250. package/dist/src/components/modal/Modal.d.ts +7 -1
  251. package/dist/src/components/popover/Popover.d.ts +19 -1
  252. package/dist/src/components/tooltip/Tooltip.d.ts +10 -0
  253. package/dist/ui.css +1 -1
  254. package/llms.txt +91 -0
  255. package/package.json +10 -4
  256. package/dist/index.es.js +0 -8066
@@ -0,0 +1,277 @@
1
+ import { Check as e } from "../../node_modules/lucide-react/dist/esm/icons/check.esm.js";
2
+ import { ChevronDown as t } from "../../node_modules/lucide-react/dist/esm/icons/chevron-down.esm.js";
3
+ import { CircleX as n } from "../../node_modules/lucide-react/dist/esm/icons/circle-x.esm.js";
4
+ import { Search as r } from "../../node_modules/lucide-react/dist/esm/icons/search.esm.js";
5
+ import { CHEVRON_SIZE_CLASS as i, SLOT_BADGE_TEXT_CLASS as a, SLOT_CHILD_ICON_CLASS as ee, SLOT_GAP_CLASS as te, SLOT_ICON_SIZE_CLASS as ne } from "../_shared/form-size-tokens.esm.js";
6
+ import { getInputContainerClasses as re, getInputHelpClasses as ie, getInputLabelClasses as ae, getInputTrailingIconColor as oe, getInputVariantClasses as se } from "../input/utils.esm.js";
7
+ import { LoadingDots as ce } from "./loading-dots.esm.js";
8
+ import { forwardRef as o, useEffect as s, useId as le, useLayoutEffect as ue, useMemo as c, useRef as l, useState as u } from "react";
9
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
10
+ import { FloatingFocusManager as de, FloatingPortal as fe, autoUpdate as pe, flip as me, offset as he, shift as ge, size as _e, useClick as ve, useDismiss as ye, useFloating as be, useInteractions as xe, useListNavigation as Se, useRole as Ce } from "@floating-ui/react";
11
+ //#region src/components/select/MultiSelect.tsx
12
+ var we = (e) => e.length === 0 ? "" : e.map((e) => e.label).join(", "), Te = (e) => e.length === 0 ? "" : `${e.length}개 선택`, p = o(function({ options: o, value: p, onChange: m, variant: Ee, selectSize: h = "medium", label: g, labelOption: _ = "appear", help: v, placeholder: De = "선택해주세요", hasError: y = !1, disabled: b = !1, suffix: x, trailingIcon: S, clearable: C = !1, badge: w, searchable: T = !1, searchPlaceholder: Oe = "검색...", onSearchChange: E, isSearchLoading: D = !1, containerProps: ke, containerRef: Ae, className: je = "", panelClassName: Me = "", formatTrigger: Ne = we, formatCollapsed: Pe = Te, disableAutoCollapse: O = !1, showSelectAll: Fe = !1, id: k, name: A, "data-testid": Ie }, j) {
13
+ let [M, Le] = u(!1), [N, P] = u(null), [F, I] = u(""), [Re, L] = u(!1), R = l([]), z = l(null), B = l(null), V = l(null), H = le(), ze = (e) => `${H}-opt-${e}`, Be = N === null ? void 0 : ze(N), U = typeof E == "function", W = c(() => {
14
+ if (!T || U || F.length === 0) return o;
15
+ let e = F.toLowerCase();
16
+ return o.filter((t) => t.label.toLowerCase().includes(e));
17
+ }, [
18
+ o,
19
+ T,
20
+ U,
21
+ F
22
+ ]), G = c(() => new Set(p), [p]), K = c(() => o.filter((e) => G.has(String(e.value))), [o, G]), { refs: Ve, floatingStyles: He, context: q } = be({
23
+ open: M,
24
+ onOpenChange: Le,
25
+ placement: "bottom-start",
26
+ whileElementsMounted: pe,
27
+ middleware: [
28
+ he(4),
29
+ me({ padding: 8 }),
30
+ ge({ padding: 8 }),
31
+ _e({
32
+ apply({ rects: e, elements: t, availableHeight: n }) {
33
+ Object.assign(t.floating.style, {
34
+ minWidth: `${e.reference.width}px`,
35
+ maxHeight: `${Math.min(n, 320)}px`
36
+ });
37
+ },
38
+ padding: 8
39
+ })
40
+ ]
41
+ }), { getReferenceProps: Ue, getFloatingProps: We, getItemProps: Ge } = xe([
42
+ ve(q, { enabled: !b }),
43
+ ye(q),
44
+ Ce(q, { role: "listbox" }),
45
+ Se(q, {
46
+ listRef: R,
47
+ activeIndex: N,
48
+ onNavigate: P,
49
+ virtual: T,
50
+ loop: !0
51
+ })
52
+ ]);
53
+ s(() => {
54
+ M || (I(""), P(null), U && E(""));
55
+ }, [
56
+ M,
57
+ U,
58
+ E
59
+ ]), s(() => {
60
+ M && T && z.current && z.current.focus();
61
+ }, [M, T]), ue(() => {
62
+ if (O) {
63
+ L(!1);
64
+ return;
65
+ }
66
+ let e = B.current, t = V.current;
67
+ if (!e || !t) return;
68
+ let n = () => {
69
+ let n = t.scrollWidth, r = e.clientWidth;
70
+ L(n > r - 1);
71
+ };
72
+ n();
73
+ let r = new ResizeObserver(() => {
74
+ requestAnimationFrame(n);
75
+ });
76
+ return r.observe(e), () => r.disconnect();
77
+ }, [O, p.join(",")]);
78
+ let J = (e) => {
79
+ let t = new Set(G);
80
+ t.has(e) ? t.delete(e) : t.add(e), m(o.filter((e) => t.has(String(e.value))).map((e) => String(e.value)));
81
+ }, Ke = (e) => {
82
+ e.stopPropagation(), m([]);
83
+ }, Y = W.filter((e) => !e.disabled).map((e) => String(e.value)), qe = Y.length > 0 && Y.every((e) => G.has(e)), Je = () => {
84
+ if (qe) {
85
+ let e = new Set(Y);
86
+ m(p.filter((t) => !e.has(t)));
87
+ } else {
88
+ let e = new Set([...p, ...Y]);
89
+ m(o.filter((t) => e.has(String(t.value))).map((e) => String(e.value)));
90
+ }
91
+ }, Ye = (e) => {
92
+ !C || b || p.length === 0 || M || (e.key === "Backspace" || e.key === "Delete") && (e.preventDefault(), m([]));
93
+ }, Xe = (e) => {
94
+ let t = e.target.value;
95
+ I(t), U && E(t);
96
+ }, Ze = (e) => {
97
+ if (!e.nativeEvent.isComposing && e.key === "Enter" && N !== null) {
98
+ e.preventDefault();
99
+ let t = W[N];
100
+ t && !t.disabled && J(String(t.value));
101
+ }
102
+ }, X = K.length > 0, Qe = _ === "sustain" || _ === "appear" && X, $e = X ? Ne(K) : "", et = X ? Pe(K) : "", tt = X ? Re ? et : $e : De, nt = te[h], Z = ee[h], rt = a[h], it = ne[h], at = i[h], ot = se(Ee, y, b, h), Q = oe(y, b, X || M), $ = h === "mini" ? "text-xs" : h === "large" ? "text-base" : "text-sm", st = b ? "text-text-disabled" : y ? "text-text-danger" : X ? "text-text-primary" : "text-text-tertiary";
103
+ return /* @__PURE__ */ f("div", {
104
+ ref: Ae,
105
+ className: re(),
106
+ ...ke,
107
+ children: [
108
+ !O && X && /* @__PURE__ */ d("span", {
109
+ ref: V,
110
+ "aria-hidden": !0,
111
+ className: `pointer-events-none fixed left-0 -top-[9999px] whitespace-nowrap ${$}`,
112
+ children: $e
113
+ }),
114
+ Qe && g && /* @__PURE__ */ d("label", {
115
+ className: ae(Ee, y),
116
+ htmlFor: k,
117
+ children: g
118
+ }),
119
+ /* @__PURE__ */ f("button", {
120
+ ref: (e) => {
121
+ Ve.setReference(e), typeof j == "function" ? j(e) : j && (j.current = e);
122
+ },
123
+ id: k,
124
+ type: "button",
125
+ disabled: b,
126
+ "aria-haspopup": "listbox",
127
+ "aria-expanded": M,
128
+ "aria-controls": M ? H : void 0,
129
+ "aria-activedescendant": Be,
130
+ "data-testid": Ie,
131
+ ...Ue({ onKeyDown: Ye }),
132
+ className: `${ot} flex w-full items-center ${nt} ${b ? "cursor-not-allowed" : "cursor-pointer"} ${je}`.trim().replace(/\s+/g, " "),
133
+ children: [
134
+ /* @__PURE__ */ d("span", {
135
+ ref: B,
136
+ className: `flex-1 truncate text-left ${$} ${st}`,
137
+ children: tt
138
+ }),
139
+ x && /* @__PURE__ */ d("span", {
140
+ className: `shrink-0 whitespace-nowrap ${$} ${Q}`,
141
+ children: x
142
+ }),
143
+ S && /* @__PURE__ */ d("span", {
144
+ className: `flex shrink-0 items-center ${Q} ${Z}`,
145
+ children: S
146
+ }),
147
+ C && !b && X && /* @__PURE__ */ d("span", {
148
+ role: "button",
149
+ tabIndex: -1,
150
+ onClick: Ke,
151
+ "aria-label": "선택 모두 지우기",
152
+ className: `flex shrink-0 cursor-pointer items-center ${Q} hover:text-text-primary`,
153
+ children: /* @__PURE__ */ d(n, {
154
+ className: it,
155
+ strokeWidth: 1.5,
156
+ "aria-hidden": !0
157
+ })
158
+ }),
159
+ w && /* @__PURE__ */ d("span", {
160
+ className: `flex shrink-0 items-center ${Z} ${rt}`,
161
+ children: w
162
+ }),
163
+ /* @__PURE__ */ d(t, {
164
+ className: `shrink-0 transition-transform ${at} ${Q} ${M ? "rotate-180" : ""}`,
165
+ strokeWidth: 1.5,
166
+ "aria-hidden": !0
167
+ })
168
+ ]
169
+ }),
170
+ A && /* @__PURE__ */ d("input", {
171
+ type: "hidden",
172
+ name: A,
173
+ value: p.join(",")
174
+ }),
175
+ M && /* @__PURE__ */ d(fe, { children: /* @__PURE__ */ d(de, {
176
+ context: q,
177
+ modal: !1,
178
+ initialFocus: T ? -1 : 0,
179
+ children: /* @__PURE__ */ f("div", {
180
+ ref: Ve.setFloating,
181
+ id: H,
182
+ style: He,
183
+ ...We(),
184
+ className: `z-9999 overflow-hidden rounded-lg border border-border-tertiary bg-bg-white shadow-lg dark:border-border-secondary dark:bg-neutral-800 ${Me}`,
185
+ children: [
186
+ T && /* @__PURE__ */ f("div", {
187
+ className: "flex items-center gap-2 border-b border-border-tertiary px-3 py-2 dark:border-border-secondary",
188
+ children: [
189
+ /* @__PURE__ */ d(r, {
190
+ className: "h-4 w-4 shrink-0 text-icon-tertiary",
191
+ "aria-hidden": !0
192
+ }),
193
+ /* @__PURE__ */ d("input", {
194
+ ref: z,
195
+ type: "text",
196
+ value: F,
197
+ onChange: Xe,
198
+ onKeyDown: Ze,
199
+ placeholder: Oe,
200
+ className: "flex-1 bg-transparent text-sm outline-hidden placeholder:text-text-tertiary"
201
+ }),
202
+ D && /* @__PURE__ */ d(ce, { className: "h-4 w-4 shrink-0 text-icon-tertiary" })
203
+ ]
204
+ }),
205
+ Fe && W.length > 0 && /* @__PURE__ */ f("button", {
206
+ type: "button",
207
+ onClick: Je,
208
+ className: "flex w-full items-center justify-between border-b border-border-tertiary px-3 py-2 text-xs text-text-secondary transition-colors hover:bg-neutral-50 dark:border-border-secondary dark:hover:bg-neutral-700",
209
+ children: [/* @__PURE__ */ d("span", { children: qe ? "전체 해제" : "전체 선택" }), /* @__PURE__ */ f("span", {
210
+ className: "text-text-tertiary",
211
+ children: [Y.length, "개"]
212
+ })]
213
+ }),
214
+ /* @__PURE__ */ d("div", {
215
+ className: "max-h-72 overflow-y-auto py-1",
216
+ children: W.length === 0 ? /* @__PURE__ */ d("div", {
217
+ className: "px-3 py-4 text-center text-sm text-text-tertiary",
218
+ children: D ? "검색 중..." : "옵션이 없어요"
219
+ }) : W.map((t, n) => {
220
+ let r = String(t.value), i = G.has(r), a = N === n;
221
+ return /* @__PURE__ */ f("div", {
222
+ id: ze(n),
223
+ ref: (e) => {
224
+ R.current[n] = e;
225
+ },
226
+ role: "option",
227
+ "aria-selected": i,
228
+ "aria-disabled": t.disabled || void 0,
229
+ tabIndex: a ? 0 : -1,
230
+ ...Ge({
231
+ onClick: () => {
232
+ t.disabled || J(r);
233
+ },
234
+ onKeyDown: (e) => {
235
+ t.disabled || (e.key === "Enter" || e.key === " ") && (e.preventDefault(), J(r));
236
+ }
237
+ }),
238
+ className: `flex cursor-pointer items-start gap-3 px-3 py-2 text-sm transition-colors ${t.disabled ? "cursor-not-allowed text-text-disabled" : a ? "bg-neutral-100 text-text-primary dark:bg-neutral-700" : "text-text-primary hover:bg-neutral-50 dark:hover:bg-neutral-700"}`,
239
+ children: [
240
+ /* @__PURE__ */ d("span", {
241
+ className: `mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border ${i ? "border-primary-500 bg-primary-500 text-white" : "border-border-tertiary dark:border-border-secondary"}`,
242
+ "aria-hidden": !0,
243
+ children: i && /* @__PURE__ */ d(e, {
244
+ className: "h-3 w-3",
245
+ strokeWidth: 3
246
+ })
247
+ }),
248
+ /* @__PURE__ */ f("div", {
249
+ className: "min-w-0 flex-1",
250
+ children: [/* @__PURE__ */ d("div", {
251
+ className: `truncate ${i ? "font-medium" : ""}`,
252
+ children: t.label
253
+ }), t.description && /* @__PURE__ */ d("div", {
254
+ className: "mt-0.5 truncate text-xs text-text-tertiary",
255
+ children: t.description
256
+ })]
257
+ }),
258
+ t.trailing && /* @__PURE__ */ d("span", {
259
+ className: "shrink-0 text-xs text-text-tertiary",
260
+ children: t.trailing
261
+ })
262
+ ]
263
+ }, r);
264
+ })
265
+ })
266
+ ]
267
+ })
268
+ }) }),
269
+ v && /* @__PURE__ */ d("div", {
270
+ className: ie(y),
271
+ children: v
272
+ })
273
+ ]
274
+ });
275
+ });
276
+ //#endregion
277
+ export { p as MultiSelect };
@@ -0,0 +1 @@
1
+ const e=require("../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js"),t=require("../../node_modules/lucide-react/dist/esm/icons/circle-x.cjs.js"),n=require("../_shared/form-size-tokens.cjs.js"),r=require("../input/utils.cjs.js"),ee=require("../../node_modules/use-debounce/dist/index.module.cjs.js"),i=require("./loading-dots.cjs.js");let a=require("react"),o=require("react/jsx-runtime"),s=require("@floating-ui/react");var c=(0,a.forwardRef)(function({options:c,value:l,onChange:u,variant:te,selectSize:d=`medium`,label:f,labelOption:p=`appear`,help:ne,placeholder:re=`선택해주세요`,hasError:m=!1,disabled:h=!1,suffix:g,trailingIcon:_,clearable:v=!1,badge:y,searchable:b=!1,searchPlaceholder:ie=`검색...`,onSearchChange:x,isSearchLoading:S=!1,containerProps:ae,containerRef:oe,className:se=``,panelClassName:ce=``,id:C,name:w,onLoadMore:T,hasMore:E=!1,searchDebounceMs:D=300,"data-testid":le},O){let[k,A]=(0,a.useState)(!1),[j,M]=(0,a.useState)(null),[N,P]=(0,a.useState)(``),ue=(0,a.useRef)([]),de=(0,a.useRef)(null),[F,fe]=(0,a.useState)(null),[I,pe]=(0,a.useState)(null),L=(0,a.useId)(),R=e=>`${L}-opt-${e}`,z=j===null?void 0:R(j),B=typeof x==`function`,V=D===!1||D<=0?0:D,H=ee.c(e=>{x?.(e)},V),U=(e,t)=>{B&&(t||V===0?(H.cancel(),x(e)):H(e))},W=c.find(e=>String(e.value)===l),me=b&&(W!==void 0&&N===W.label||W===void 0&&l!==``&&N!==``),G=(0,a.useMemo)(()=>{if(!b||B||N.length===0||me)return c;let e=N.toLowerCase();return c.filter(t=>t.label.toLowerCase().includes(e))},[c,b,B,N,me]),{refs:K,floatingStyles:he,context:q}=(0,s.useFloating)({open:k,onOpenChange:A,placement:`bottom-start`,whileElementsMounted:s.autoUpdate,middleware:[(0,s.offset)(4),(0,s.flip)({padding:8}),(0,s.shift)({padding:8}),(0,s.size)({apply({rects:e,elements:t,availableHeight:n}){Object.assign(t.floating.style,{minWidth:`${e.reference.width}px`,maxHeight:`${Math.min(n,320)}px`})},padding:8})]}),{getReferenceProps:ge,getFloatingProps:_e,getItemProps:ve}=(0,s.useInteractions)([(0,s.useClick)(q,{enabled:!h&&!b}),(0,s.useDismiss)(q),(0,s.useRole)(q,{role:`listbox`}),(0,s.useListNavigation)(q,{listRef:ue,activeIndex:j,onNavigate:M,virtual:b,loop:!0}),(0,s.useTypeahead)(q,{listRef:{current:G.map(e=>e.label)},activeIndex:j,onMatch:M,enabled:!b})]),ye=(0,a.useRef)(!1);(0,a.useEffect)(()=>{if(k){if(ye.current=!0,b){let e=W?.label??``;P(e),e!==``&&requestAnimationFrame(()=>{de.current?.select()})}}else P(``),M(null),ye.current&&U(``,!0)},[k,b,B,x]),(0,a.useEffect)(()=>{if(!k||!T||!E||!F||!I)return;let e=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&!S&&T()},{root:I,rootMargin:`0px 0px 80px 0px`});return e.observe(F),()=>e.disconnect()},[k,T,E,S,F,I]);let J=e=>{u(e),A(!1)},be=e=>{e.stopPropagation(),u(``),P(``)},xe=e=>{b||!v||h||!Y||k||(e.key===`Backspace`||e.key===`Delete`)&&(e.preventDefault(),u(``))},Se=e=>{let t=e.target.value;P(t),U(t,!1),k||A(!0)},Ce=e=>{if(!e.nativeEvent.isComposing){if(e.key===`Enter`&&j!==null){e.preventDefault();let t=G[j];t&&!t.disabled&&J(String(t.value));return}(e.key===`Backspace`||e.key===`Delete`)&&W&&(!k||N===``)&&(e.preventDefault(),u(``))}},we=p===`sustain`||p===`appear`&&!!W,Y=!!W,Te=W?W.label:re,Ee=k?N:W?.label??``,De=n.SLOT_GAP_CLASS[d],X=n.SLOT_CHILD_ICON_CLASS[d],Oe=n.SLOT_BADGE_TEXT_CLASS[d],Z=n.SLOT_ICON_SIZE_CLASS[d],ke=n.CHEVRON_SIZE_CLASS[d],Ae=r.getInputVariantClasses(te,m,h,d),Q=r.getInputTrailingIconColor(m,h,Y||k),$=d===`mini`?`text-xs`:d===`large`?`text-base`:`text-sm`,je=h?`text-text-disabled`:m?`text-text-danger`:Y?`text-text-primary`:`text-text-tertiary`;return(0,o.jsxs)(`div`,{ref:oe,className:r.getInputContainerClasses(),...ae,children:[we&&f&&(0,o.jsx)(`label`,{className:r.getInputLabelClasses(te,m),htmlFor:C,children:f}),b?(0,o.jsxs)(`div`,{ref:e=>{K.setReference(e)},...ge(),className:`${Ae} flex w-full items-center ${De} ${h?`cursor-not-allowed`:`cursor-text`} ${se}`.trim().replace(/\s+/g,` `),children:[(0,o.jsx)(`input`,{ref:e=>{de.current=e,typeof O==`function`?O(e):O&&(O.current=e)},id:C,type:`text`,role:`combobox`,readOnly:!k,disabled:h,"aria-haspopup":`listbox`,"aria-expanded":k,"aria-controls":k?L:void 0,"aria-activedescendant":z,"aria-autocomplete":`list`,"data-testid":le,value:Ee,placeholder:W?ie:re,onChange:Se,onKeyDown:Ce,onClick:()=>{h||k||A(!0)},className:`flex-1 bg-transparent text-left outline-hidden ${$} ${je} ${h?`cursor-not-allowed`:``} placeholder:text-text-tertiary`}),g&&(0,o.jsx)(`span`,{className:`shrink-0 whitespace-nowrap ${$} ${Q}`,children:g}),_&&(0,o.jsx)(`span`,{className:`flex shrink-0 items-center ${Q} ${X}`,children:_}),S&&(0,o.jsx)(i.LoadingDots,{className:`shrink-0 text-icon-tertiary ${Z}`}),v&&!h&&Y&&(0,o.jsx)(`button`,{type:`button`,tabIndex:-1,onClick:be,"aria-label":`선택 지우기`,className:`flex shrink-0 cursor-pointer items-center rounded ${Q} hover:text-text-primary focus:outline-hidden focus-visible:ring-2 focus-visible:ring-primary-500/40`,children:(0,o.jsx)(t.CircleX,{className:Z,strokeWidth:1.5,"aria-hidden":!0})}),y&&(0,o.jsx)(`span`,{className:`flex shrink-0 items-center ${X} ${Oe}`,children:y}),(0,o.jsx)(e.ChevronDown,{className:`shrink-0 transition-transform ${ke} ${Q} ${k?`rotate-180`:``}`,strokeWidth:1.5,"aria-hidden":!0})]}):(0,o.jsxs)(`button`,{ref:e=>{K.setReference(e),typeof O==`function`?O(e):O&&(O.current=e)},id:C,type:`button`,disabled:h,"aria-haspopup":`listbox`,"aria-expanded":k,"aria-controls":k?L:void 0,"aria-activedescendant":z,"data-testid":le,...ge({onKeyDown:xe}),className:`${Ae} flex w-full items-center ${De} ${h?`cursor-not-allowed`:`cursor-pointer`} ${se}`.trim().replace(/\s+/g,` `),children:[(0,o.jsx)(`span`,{className:`flex-1 truncate text-left ${$} ${je}`,children:Te}),g&&(0,o.jsx)(`span`,{className:`shrink-0 whitespace-nowrap ${$} ${Q}`,children:g}),_&&(0,o.jsx)(`span`,{className:`flex shrink-0 items-center ${Q} ${X}`,children:_}),v&&!h&&Y&&(0,o.jsx)(`span`,{role:`button`,tabIndex:-1,onClick:be,"aria-label":`선택 지우기`,className:`flex shrink-0 cursor-pointer items-center ${Q} hover:text-text-primary`,children:(0,o.jsx)(t.CircleX,{className:Z,strokeWidth:1.5,"aria-hidden":!0})}),y&&(0,o.jsx)(`span`,{className:`flex shrink-0 items-center ${X} ${Oe}`,children:y}),(0,o.jsx)(e.ChevronDown,{className:`shrink-0 transition-transform ${ke} ${Q} ${k?`rotate-180`:``}`,strokeWidth:1.5,"aria-hidden":!0})]}),w&&(0,o.jsx)(`input`,{type:`hidden`,name:w,value:l}),k&&(0,o.jsx)(s.FloatingPortal,{children:(0,o.jsx)(s.FloatingFocusManager,{context:q,modal:!1,initialFocus:b?-1:0,children:(0,o.jsx)(`div`,{ref:K.setFloating,id:L,style:he,..._e(),className:`z-9999 overflow-hidden rounded-lg border border-border-tertiary bg-bg-white shadow-lg dark:border-border-secondary dark:bg-neutral-800 ${ce}`,children:(0,o.jsxs)(`div`,{ref:pe,className:`max-h-72 overflow-y-auto py-1`,children:[G.length===0?(0,o.jsx)(`div`,{className:`px-3 py-4 text-center text-sm text-text-tertiary`,children:S?`검색 중...`:`옵션이 없어요`}):G.map((e,t)=>{let n=String(e.value)===l,r=j===t;return(0,o.jsxs)(`div`,{id:R(t),ref:e=>{ue.current[t]=e},role:`option`,"aria-selected":n,"aria-disabled":e.disabled||void 0,tabIndex:r?0:-1,...ve({onClick:()=>{e.disabled||J(String(e.value))},onKeyDown:t=>{e.disabled||(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),J(String(e.value)))}}),className:`flex cursor-pointer items-start gap-3 px-3 py-2 text-sm transition-colors ${e.disabled?`cursor-not-allowed text-text-disabled`:n?`font-medium text-primary-600 dark:text-primary-400 ${r?`bg-primary-50 dark:bg-primary-900/30`:`hover:bg-primary-50/60 dark:hover:bg-primary-900/20`}`:r?`bg-neutral-100 text-text-primary dark:bg-neutral-700`:`text-text-primary hover:bg-neutral-50 dark:hover:bg-neutral-700`}`,children:[(0,o.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,o.jsx)(`div`,{className:`truncate`,children:e.label}),e.description&&(0,o.jsx)(`div`,{className:`mt-0.5 truncate text-xs text-text-tertiary`,children:e.description})]}),e.trailing&&(0,o.jsx)(`span`,{className:`shrink-0 text-xs text-text-tertiary`,children:e.trailing})]},String(e.value))}),T&&E&&(0,o.jsx)(`div`,{ref:fe,"aria-hidden":!0,className:`flex items-center justify-center px-3 py-3 text-text-tertiary`,children:S&&(0,o.jsx)(i.LoadingDots,{})})]})})})}),ne&&(0,o.jsx)(`div`,{className:r.getInputHelpClasses(m),children:ne})]})});exports.Select=c;
@@ -0,0 +1,308 @@
1
+ import { ChevronDown as e } from "../../node_modules/lucide-react/dist/esm/icons/chevron-down.esm.js";
2
+ import { CircleX as t } from "../../node_modules/lucide-react/dist/esm/icons/circle-x.esm.js";
3
+ import { CHEVRON_SIZE_CLASS as n, SLOT_BADGE_TEXT_CLASS as r, SLOT_CHILD_ICON_CLASS as ee, SLOT_GAP_CLASS as te, SLOT_ICON_SIZE_CLASS as ne } from "../_shared/form-size-tokens.esm.js";
4
+ import { getInputContainerClasses as re, getInputHelpClasses as ie, getInputLabelClasses as ae, getInputTrailingIconColor as oe, getInputVariantClasses as se } from "../input/utils.esm.js";
5
+ import { c as ce } from "../../node_modules/use-debounce/dist/index.module.esm.js";
6
+ import { LoadingDots as le } from "./loading-dots.esm.js";
7
+ import { forwardRef as i, useEffect as ue, useId as de, useMemo as fe, useRef as a, useState as o } from "react";
8
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
9
+ import { FloatingFocusManager as pe, FloatingPortal as me, autoUpdate as he, flip as ge, offset as _e, shift as ve, size as ye, useClick as be, useDismiss as xe, useFloating as Se, useInteractions as Ce, useListNavigation as we, useRole as Te, useTypeahead as Ee } from "@floating-ui/react";
10
+ //#region src/components/select/Select.tsx
11
+ var l = i(function({ options: i, value: l, onChange: u, variant: De, selectSize: d = "medium", label: f, labelOption: Oe = "appear", help: ke, placeholder: p = "선택해주세요", hasError: m = !1, disabled: h = !1, suffix: g, trailingIcon: _, clearable: v = !1, badge: y, searchable: b = !1, searchPlaceholder: Ae = "검색...", onSearchChange: x, isSearchLoading: S = !1, containerProps: je, containerRef: Me, className: Ne = "", panelClassName: Pe = "", id: C, name: w, onLoadMore: T, hasMore: E = !1, searchDebounceMs: D = 300, "data-testid": Fe }, O) {
12
+ let [k, A] = o(!1), [j, M] = o(null), [N, P] = o(""), Ie = a([]), Le = a(null), [F, Re] = o(null), [I, ze] = o(null), L = de(), Be = (e) => `${L}-opt-${e}`, Ve = j === null ? void 0 : Be(j), R = typeof x == "function", z = D === !1 || D <= 0 ? 0 : D, B = ce((e) => {
13
+ x?.(e);
14
+ }, z), V = (e, t) => {
15
+ R && (t || z === 0 ? (B.cancel(), x(e)) : B(e));
16
+ }, H = i.find((e) => String(e.value) === l), U = b && (H !== void 0 && N === H.label || H === void 0 && l !== "" && N !== ""), W = fe(() => {
17
+ if (!b || R || N.length === 0 || U) return i;
18
+ let e = N.toLowerCase();
19
+ return i.filter((t) => t.label.toLowerCase().includes(e));
20
+ }, [
21
+ i,
22
+ b,
23
+ R,
24
+ N,
25
+ U
26
+ ]), { refs: G, floatingStyles: He, context: K } = Se({
27
+ open: k,
28
+ onOpenChange: A,
29
+ placement: "bottom-start",
30
+ whileElementsMounted: he,
31
+ middleware: [
32
+ _e(4),
33
+ ge({ padding: 8 }),
34
+ ve({ padding: 8 }),
35
+ ye({
36
+ apply({ rects: e, elements: t, availableHeight: n }) {
37
+ Object.assign(t.floating.style, {
38
+ minWidth: `${e.reference.width}px`,
39
+ maxHeight: `${Math.min(n, 320)}px`
40
+ });
41
+ },
42
+ padding: 8
43
+ })
44
+ ]
45
+ }), { getReferenceProps: Ue, getFloatingProps: We, getItemProps: Ge } = Ce([
46
+ be(K, { enabled: !h && !b }),
47
+ xe(K),
48
+ Te(K, { role: "listbox" }),
49
+ we(K, {
50
+ listRef: Ie,
51
+ activeIndex: j,
52
+ onNavigate: M,
53
+ virtual: b,
54
+ loop: !0
55
+ }),
56
+ Ee(K, {
57
+ listRef: { current: W.map((e) => e.label) },
58
+ activeIndex: j,
59
+ onMatch: M,
60
+ enabled: !b
61
+ })
62
+ ]), Ke = a(!1);
63
+ ue(() => {
64
+ if (k) {
65
+ if (Ke.current = !0, b) {
66
+ let e = H?.label ?? "";
67
+ P(e), e !== "" && requestAnimationFrame(() => {
68
+ Le.current?.select();
69
+ });
70
+ }
71
+ } else P(""), M(null), Ke.current && V("", !0);
72
+ }, [
73
+ k,
74
+ b,
75
+ R,
76
+ x
77
+ ]), ue(() => {
78
+ if (!k || !T || !E || !F || !I) return;
79
+ let e = new IntersectionObserver((e) => {
80
+ for (let t of e) t.isIntersecting && !S && T();
81
+ }, {
82
+ root: I,
83
+ rootMargin: "0px 0px 80px 0px"
84
+ });
85
+ return e.observe(F), () => e.disconnect();
86
+ }, [
87
+ k,
88
+ T,
89
+ E,
90
+ S,
91
+ F,
92
+ I
93
+ ]);
94
+ let q = (e) => {
95
+ u(e), A(!1);
96
+ }, qe = (e) => {
97
+ e.stopPropagation(), u(""), P("");
98
+ }, Je = (e) => {
99
+ b || !v || h || !J || k || (e.key === "Backspace" || e.key === "Delete") && (e.preventDefault(), u(""));
100
+ }, Ye = (e) => {
101
+ let t = e.target.value;
102
+ P(t), V(t, !1), k || A(!0);
103
+ }, Xe = (e) => {
104
+ if (!e.nativeEvent.isComposing) {
105
+ if (e.key === "Enter" && j !== null) {
106
+ e.preventDefault();
107
+ let t = W[j];
108
+ t && !t.disabled && q(String(t.value));
109
+ return;
110
+ }
111
+ (e.key === "Backspace" || e.key === "Delete") && H && (!k || N === "") && (e.preventDefault(), u(""));
112
+ }
113
+ }, Ze = Oe === "sustain" || Oe === "appear" && !!H, J = !!H, Qe = H ? H.label : p, $e = k ? N : H?.label ?? "", Y = te[d], X = ee[d], et = r[d], Z = ne[d], tt = n[d], nt = se(De, m, h, d), Q = oe(m, h, J || k), $ = d === "mini" ? "text-xs" : d === "large" ? "text-base" : "text-sm", rt = h ? "text-text-disabled" : m ? "text-text-danger" : J ? "text-text-primary" : "text-text-tertiary";
114
+ return /* @__PURE__ */ c("div", {
115
+ ref: Me,
116
+ className: re(),
117
+ ...je,
118
+ children: [
119
+ Ze && f && /* @__PURE__ */ s("label", {
120
+ className: ae(De, m),
121
+ htmlFor: C,
122
+ children: f
123
+ }),
124
+ b ? /* @__PURE__ */ c("div", {
125
+ ref: (e) => {
126
+ G.setReference(e);
127
+ },
128
+ ...Ue(),
129
+ className: `${nt} flex w-full items-center ${Y} ${h ? "cursor-not-allowed" : "cursor-text"} ${Ne}`.trim().replace(/\s+/g, " "),
130
+ children: [
131
+ /* @__PURE__ */ s("input", {
132
+ ref: (e) => {
133
+ Le.current = e, typeof O == "function" ? O(e) : O && (O.current = e);
134
+ },
135
+ id: C,
136
+ type: "text",
137
+ role: "combobox",
138
+ readOnly: !k,
139
+ disabled: h,
140
+ "aria-haspopup": "listbox",
141
+ "aria-expanded": k,
142
+ "aria-controls": k ? L : void 0,
143
+ "aria-activedescendant": Ve,
144
+ "aria-autocomplete": "list",
145
+ "data-testid": Fe,
146
+ value: $e,
147
+ placeholder: H ? Ae : p,
148
+ onChange: Ye,
149
+ onKeyDown: Xe,
150
+ onClick: () => {
151
+ h || k || A(!0);
152
+ },
153
+ className: `flex-1 bg-transparent text-left outline-hidden ${$} ${rt} ${h ? "cursor-not-allowed" : ""} placeholder:text-text-tertiary`
154
+ }),
155
+ g && /* @__PURE__ */ s("span", {
156
+ className: `shrink-0 whitespace-nowrap ${$} ${Q}`,
157
+ children: g
158
+ }),
159
+ _ && /* @__PURE__ */ s("span", {
160
+ className: `flex shrink-0 items-center ${Q} ${X}`,
161
+ children: _
162
+ }),
163
+ S && /* @__PURE__ */ s(le, { className: `shrink-0 text-icon-tertiary ${Z}` }),
164
+ v && !h && J && /* @__PURE__ */ s("button", {
165
+ type: "button",
166
+ tabIndex: -1,
167
+ onClick: qe,
168
+ "aria-label": "선택 지우기",
169
+ className: `flex shrink-0 cursor-pointer items-center rounded ${Q} hover:text-text-primary focus:outline-hidden focus-visible:ring-2 focus-visible:ring-primary-500/40`,
170
+ children: /* @__PURE__ */ s(t, {
171
+ className: Z,
172
+ strokeWidth: 1.5,
173
+ "aria-hidden": !0
174
+ })
175
+ }),
176
+ y && /* @__PURE__ */ s("span", {
177
+ className: `flex shrink-0 items-center ${X} ${et}`,
178
+ children: y
179
+ }),
180
+ /* @__PURE__ */ s(e, {
181
+ className: `shrink-0 transition-transform ${tt} ${Q} ${k ? "rotate-180" : ""}`,
182
+ strokeWidth: 1.5,
183
+ "aria-hidden": !0
184
+ })
185
+ ]
186
+ }) : /* @__PURE__ */ c("button", {
187
+ ref: (e) => {
188
+ G.setReference(e), typeof O == "function" ? O(e) : O && (O.current = e);
189
+ },
190
+ id: C,
191
+ type: "button",
192
+ disabled: h,
193
+ "aria-haspopup": "listbox",
194
+ "aria-expanded": k,
195
+ "aria-controls": k ? L : void 0,
196
+ "aria-activedescendant": Ve,
197
+ "data-testid": Fe,
198
+ ...Ue({ onKeyDown: Je }),
199
+ className: `${nt} flex w-full items-center ${Y} ${h ? "cursor-not-allowed" : "cursor-pointer"} ${Ne}`.trim().replace(/\s+/g, " "),
200
+ children: [
201
+ /* @__PURE__ */ s("span", {
202
+ className: `flex-1 truncate text-left ${$} ${rt}`,
203
+ children: Qe
204
+ }),
205
+ g && /* @__PURE__ */ s("span", {
206
+ className: `shrink-0 whitespace-nowrap ${$} ${Q}`,
207
+ children: g
208
+ }),
209
+ _ && /* @__PURE__ */ s("span", {
210
+ className: `flex shrink-0 items-center ${Q} ${X}`,
211
+ children: _
212
+ }),
213
+ v && !h && J && /* @__PURE__ */ s("span", {
214
+ role: "button",
215
+ tabIndex: -1,
216
+ onClick: qe,
217
+ "aria-label": "선택 지우기",
218
+ className: `flex shrink-0 cursor-pointer items-center ${Q} hover:text-text-primary`,
219
+ children: /* @__PURE__ */ s(t, {
220
+ className: Z,
221
+ strokeWidth: 1.5,
222
+ "aria-hidden": !0
223
+ })
224
+ }),
225
+ y && /* @__PURE__ */ s("span", {
226
+ className: `flex shrink-0 items-center ${X} ${et}`,
227
+ children: y
228
+ }),
229
+ /* @__PURE__ */ s(e, {
230
+ className: `shrink-0 transition-transform ${tt} ${Q} ${k ? "rotate-180" : ""}`,
231
+ strokeWidth: 1.5,
232
+ "aria-hidden": !0
233
+ })
234
+ ]
235
+ }),
236
+ w && /* @__PURE__ */ s("input", {
237
+ type: "hidden",
238
+ name: w,
239
+ value: l
240
+ }),
241
+ k && /* @__PURE__ */ s(me, { children: /* @__PURE__ */ s(pe, {
242
+ context: K,
243
+ modal: !1,
244
+ initialFocus: b ? -1 : 0,
245
+ children: /* @__PURE__ */ s("div", {
246
+ ref: G.setFloating,
247
+ id: L,
248
+ style: He,
249
+ ...We(),
250
+ className: `z-9999 overflow-hidden rounded-lg border border-border-tertiary bg-bg-white shadow-lg dark:border-border-secondary dark:bg-neutral-800 ${Pe}`,
251
+ children: /* @__PURE__ */ c("div", {
252
+ ref: ze,
253
+ className: "max-h-72 overflow-y-auto py-1",
254
+ children: [W.length === 0 ? /* @__PURE__ */ s("div", {
255
+ className: "px-3 py-4 text-center text-sm text-text-tertiary",
256
+ children: S ? "검색 중..." : "옵션이 없어요"
257
+ }) : W.map((e, t) => {
258
+ let n = String(e.value) === l, r = j === t;
259
+ return /* @__PURE__ */ c("div", {
260
+ id: Be(t),
261
+ ref: (e) => {
262
+ Ie.current[t] = e;
263
+ },
264
+ role: "option",
265
+ "aria-selected": n,
266
+ "aria-disabled": e.disabled || void 0,
267
+ tabIndex: r ? 0 : -1,
268
+ ...Ge({
269
+ onClick: () => {
270
+ e.disabled || q(String(e.value));
271
+ },
272
+ onKeyDown: (t) => {
273
+ e.disabled || (t.key === "Enter" || t.key === " ") && (t.preventDefault(), q(String(e.value)));
274
+ }
275
+ }),
276
+ className: `flex cursor-pointer items-start gap-3 px-3 py-2 text-sm transition-colors ${e.disabled ? "cursor-not-allowed text-text-disabled" : n ? `font-medium text-primary-600 dark:text-primary-400 ${r ? "bg-primary-50 dark:bg-primary-900/30" : "hover:bg-primary-50/60 dark:hover:bg-primary-900/20"}` : r ? "bg-neutral-100 text-text-primary dark:bg-neutral-700" : "text-text-primary hover:bg-neutral-50 dark:hover:bg-neutral-700"}`,
277
+ children: [/* @__PURE__ */ c("div", {
278
+ className: "min-w-0 flex-1",
279
+ children: [/* @__PURE__ */ s("div", {
280
+ className: "truncate",
281
+ children: e.label
282
+ }), e.description && /* @__PURE__ */ s("div", {
283
+ className: "mt-0.5 truncate text-xs text-text-tertiary",
284
+ children: e.description
285
+ })]
286
+ }), e.trailing && /* @__PURE__ */ s("span", {
287
+ className: "shrink-0 text-xs text-text-tertiary",
288
+ children: e.trailing
289
+ })]
290
+ }, String(e.value));
291
+ }), T && E && /* @__PURE__ */ s("div", {
292
+ ref: Re,
293
+ "aria-hidden": !0,
294
+ className: "flex items-center justify-center px-3 py-3 text-text-tertiary",
295
+ children: S && /* @__PURE__ */ s(le, {})
296
+ })]
297
+ })
298
+ })
299
+ }) }),
300
+ ke && /* @__PURE__ */ s("div", {
301
+ className: ie(m),
302
+ children: ke
303
+ })
304
+ ]
305
+ });
306
+ });
307
+ //#endregion
308
+ export { l as Select };
@@ -0,0 +1 @@
1
+ let e=require("react/jsx-runtime");var t=({className:t=``})=>(0,e.jsxs)(`span`,{className:`inline-flex items-end gap-0.5 ${t}`,"aria-label":`로딩 중`,role:`status`,children:[(0,e.jsx)(`span`,{className:`block h-1 w-1 animate-pulse rounded-full bg-current`,style:{animationDelay:`0ms`}}),(0,e.jsx)(`span`,{className:`block h-1 w-1 animate-pulse rounded-full bg-current`,style:{animationDelay:`200ms`}}),(0,e.jsx)(`span`,{className:`block h-1 w-1 animate-pulse rounded-full bg-current`,style:{animationDelay:`400ms`}})]});exports.LoadingDots=t;
@@ -0,0 +1,23 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/components/select/loading-dots.tsx
3
+ var n = ({ className: n = "" }) => /* @__PURE__ */ t("span", {
4
+ className: `inline-flex items-end gap-0.5 ${n}`,
5
+ "aria-label": "로딩 중",
6
+ role: "status",
7
+ children: [
8
+ /* @__PURE__ */ e("span", {
9
+ className: "block h-1 w-1 animate-pulse rounded-full bg-current",
10
+ style: { animationDelay: "0ms" }
11
+ }),
12
+ /* @__PURE__ */ e("span", {
13
+ className: "block h-1 w-1 animate-pulse rounded-full bg-current",
14
+ style: { animationDelay: "200ms" }
15
+ }),
16
+ /* @__PURE__ */ e("span", {
17
+ className: "block h-1 w-1 animate-pulse rounded-full bg-current",
18
+ style: { animationDelay: "400ms" }
19
+ })
20
+ ]
21
+ });
22
+ //#endregion
23
+ export { n as LoadingDots };
@@ -0,0 +1 @@
1
+ const e=require("./utils.cjs.js");let t=require("react"),n=require("react/jsx-runtime");var r=(0,t.forwardRef)(({size:t=`medium`,label:r,className:i=``,disabled:a=!1,onCheckedChange:o,onChange:s,...c},l)=>(0,n.jsxs)(`label`,{className:`inline-flex items-center gap-2 ${a?`cursor-not-allowed`:`cursor-pointer`} ${i}`,children:[(0,n.jsxs)(`span`,{className:`relative inline-flex items-center`,children:[(0,n.jsx)(`input`,{ref:l,type:`checkbox`,className:`peer sr-only`,disabled:a,onChange:e=>{s?.(e),o?.(e.target.checked)},...c}),(0,n.jsx)(`span`,{"aria-hidden":!0,className:e.getSwitchTrackClasses(t,a)}),(0,n.jsx)(`span`,{"aria-hidden":!0,className:e.getSwitchThumbClasses(t)})]}),r&&(0,n.jsx)(`span`,{className:a?`text-sm text-text-disabled`:`text-sm text-text-primary`,children:r})]}));r.displayName=`Switch`,exports.Switch=r;
@@ -0,0 +1,36 @@
1
+ import { getSwitchThumbClasses as e, getSwitchTrackClasses as t } from "./utils.esm.js";
2
+ import { forwardRef as n } from "react";
3
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
+ //#region src/components/switch/Switch.tsx
5
+ var a = n(({ size: n = "medium", label: a, className: o = "", disabled: s = !1, onCheckedChange: c, onChange: l, ...u }, d) => /* @__PURE__ */ i("label", {
6
+ className: `inline-flex items-center gap-2 ${s ? "cursor-not-allowed" : "cursor-pointer"} ${o}`,
7
+ children: [/* @__PURE__ */ i("span", {
8
+ className: "relative inline-flex items-center",
9
+ children: [
10
+ /* @__PURE__ */ r("input", {
11
+ ref: d,
12
+ type: "checkbox",
13
+ className: "peer sr-only",
14
+ disabled: s,
15
+ onChange: (e) => {
16
+ l?.(e), c?.(e.target.checked);
17
+ },
18
+ ...u
19
+ }),
20
+ /* @__PURE__ */ r("span", {
21
+ "aria-hidden": !0,
22
+ className: t(n, s)
23
+ }),
24
+ /* @__PURE__ */ r("span", {
25
+ "aria-hidden": !0,
26
+ className: e(n)
27
+ })
28
+ ]
29
+ }), a && /* @__PURE__ */ r("span", {
30
+ className: s ? "text-sm text-text-disabled" : "text-sm text-text-primary",
31
+ children: a
32
+ })]
33
+ }));
34
+ a.displayName = "Switch";
35
+ //#endregion
36
+ export { a as Switch };
@@ -0,0 +1 @@
1
+ var e={small:{track:`h-5 w-9`,thumb:`h-3.5 w-3.5`,translate:`peer-checked:translate-x-4`},medium:{track:`h-6 w-11`,thumb:`h-4.5 w-4.5`,translate:`peer-checked:translate-x-5`}};function t(t,n){let{track:r}=e[t];return n?[`relative inline-flex shrink-0 items-center rounded-full`,r,`bg-bg-disabled cursor-not-allowed`].join(` `):[`relative inline-flex shrink-0 items-center rounded-full cursor-pointer`,r,`bg-neutral-200 dark:bg-neutral-700`,`peer-checked:bg-primary-500`,`peer-focus-visible:ring-2 peer-focus-visible:ring-primary-300 peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-bg-card`,`transition-colors duration-200 ease-out`].join(` `)}function n(t){let{thumb:n,translate:r}=e[t];return[`pointer-events-none absolute left-[3px] top-[3px] inline-block rounded-full bg-white shadow-sm`,n,r,`transition-transform duration-200 ease-out`].join(` `)}exports.getSwitchThumbClasses=n,exports.getSwitchTrackClasses=t;