@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,57 @@
1
+ import { Button as e } from "../button/Button.esm.js";
2
+ import { DateInput as t } from "../date-input/DateInput.esm.js";
3
+ import { parseDateRangeValue as n, serializeDateRangeValue as r } from "./parseDateRange.esm.js";
4
+ import { SearchBoxSheetContext as i } from "./SearchBoxSheetContext.esm.js";
5
+ import { useContext as a, useMemo as o } from "react";
6
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
+ //#region src/components/search-box/SearchBoxDateRange.tsx
8
+ function l({ value: l, onChange: u, presets: d, size: f }) {
9
+ let { from: p, to: m } = n(l), h = a(i), g = o(() => d?.map((e) => ({
10
+ preset: e,
11
+ range: e.range()
12
+ })) ?? [], [d]), _ = (e) => {
13
+ let t = e.range();
14
+ u(r(t.from, t.to));
15
+ };
16
+ return /* @__PURE__ */ c("div", {
17
+ className: "flex flex-wrap items-center gap-x-3 gap-y-1.5",
18
+ children: [/* @__PURE__ */ c("div", {
19
+ className: "flex items-center gap-1.5",
20
+ children: [
21
+ /* @__PURE__ */ s(t, {
22
+ value: p,
23
+ onChange: (e) => u(r(e, m)),
24
+ size: f,
25
+ ariaLabel: "시작일",
26
+ disableMobileSheet: h
27
+ }),
28
+ /* @__PURE__ */ s("span", {
29
+ className: "text-neutral-400",
30
+ children: "~"
31
+ }),
32
+ /* @__PURE__ */ s(t, {
33
+ value: m,
34
+ onChange: (e) => u(r(p, e)),
35
+ size: f,
36
+ ariaLabel: "종료일",
37
+ disableMobileSheet: h
38
+ })
39
+ ]
40
+ }), g.length > 0 && /* @__PURE__ */ s("div", {
41
+ className: "flex items-center gap-1",
42
+ children: g.map(({ preset: t, range: n }) => {
43
+ let r = p === n.from && m === n.to;
44
+ return /* @__PURE__ */ s(e, {
45
+ variant: r ? "primary" : "tertiary",
46
+ appearance: r ? "filled" : "outlined",
47
+ size: f,
48
+ onClick: () => _(t),
49
+ className: `whitespace-nowrap ${f === "small" ? "h-10" : ""} ${r ? "" : "border-border-tertiary! dark:border-border-secondary!"}`,
50
+ children: t.label
51
+ }, t.label);
52
+ })
53
+ })]
54
+ });
55
+ }
56
+ //#endregion
57
+ export { l as SearchBoxDateRange };
@@ -0,0 +1 @@
1
+ const e=require("../button/Button.cjs.js"),t=require("../date-input/DateInput.cjs.js"),n=require("./SearchBoxSheetContext.cjs.js");let r=require("react"),i=require("react/jsx-runtime");function a({value:a,onChange:o,ariaLabel:s,presets:c,size:l}){let u=(0,r.useContext)(n.SearchBoxSheetContext),d=(0,r.useMemo)(()=>c?.map(e=>({preset:e,date:e.date()}))??[],[c]);return(0,i.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1.5`,children:[(0,i.jsx)(t.DateInput,{value:a,onChange:o,size:l,ariaLabel:s,disableMobileSheet:u}),d.length>0&&(0,i.jsx)(`div`,{className:`flex items-center gap-1`,children:d.map(({preset:t,date:n})=>{let r=a===n;return(0,i.jsx)(e.Button,{variant:r?`primary`:`tertiary`,appearance:r?`filled`:`outlined`,size:l,onClick:()=>o(n),className:`whitespace-nowrap ${l===`small`?`h-10`:``} ${r?``:`border-border-tertiary! dark:border-border-secondary!`}`,children:t.label},t.label)})})]})}exports.SearchBoxDateSingle=a;
@@ -0,0 +1,37 @@
1
+ import { Button as e } from "../button/Button.esm.js";
2
+ import { DateInput as t } from "../date-input/DateInput.esm.js";
3
+ import { SearchBoxSheetContext as n } from "./SearchBoxSheetContext.esm.js";
4
+ import { useContext as r, useMemo as i } from "react";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
+ //#region src/components/search-box/SearchBoxDateSingle.tsx
7
+ function s({ value: s, onChange: c, ariaLabel: l, presets: u, size: d }) {
8
+ let f = r(n), p = i(() => u?.map((e) => ({
9
+ preset: e,
10
+ date: e.date()
11
+ })) ?? [], [u]);
12
+ return /* @__PURE__ */ o("div", {
13
+ className: "flex flex-wrap items-center gap-x-3 gap-y-1.5",
14
+ children: [/* @__PURE__ */ a(t, {
15
+ value: s,
16
+ onChange: c,
17
+ size: d,
18
+ ariaLabel: l,
19
+ disableMobileSheet: f
20
+ }), p.length > 0 && /* @__PURE__ */ a("div", {
21
+ className: "flex items-center gap-1",
22
+ children: p.map(({ preset: t, date: n }) => {
23
+ let r = s === n;
24
+ return /* @__PURE__ */ a(e, {
25
+ variant: r ? "primary" : "tertiary",
26
+ appearance: r ? "filled" : "outlined",
27
+ size: d,
28
+ onClick: () => c(n),
29
+ className: `whitespace-nowrap ${d === "small" ? "h-10" : ""} ${r ? "" : "border-border-tertiary! dark:border-border-secondary!"}`,
30
+ children: t.label
31
+ }, t.label);
32
+ })
33
+ })]
34
+ });
35
+ }
36
+ //#endregion
37
+ export { s as SearchBoxDateSingle };
@@ -0,0 +1 @@
1
+ const e=require("./SearchBoxDateRange.cjs.js"),t=require("./SearchBoxDateSingle.cjs.js"),n=require("./SearchBoxFloatingInput.cjs.js"),r=require("./SearchBoxFloatingSelect.cjs.js"),i=require("./SearchBoxMonth.cjs.js"),a=require("./SearchBoxMultiSelect.cjs.js");let o=require("react/jsx-runtime");function s({field:s,value:c,onChange:l,onEnter:u,size:d}){return s.type===`text`?(0,o.jsx)(n.SearchBoxFloatingInput,{label:s.label,value:c,onChange:l,onEnter:u,size:d,inputMode:s.inputMode}):s.type===`multiSelect`?(0,o.jsx)(a.SearchBoxMultiSelect,{label:s.label,options:s.options,value:c,onChange:l,size:d}):s.type===`dateRange`?(0,o.jsx)(e.SearchBoxDateRange,{value:c,onChange:l,presets:s.presets,size:d}):s.type===`dateSingle`?(0,o.jsx)(t.SearchBoxDateSingle,{value:c,onChange:l,ariaLabel:s.label,presets:s.presets,size:d}):s.type===`month`?(0,o.jsx)(i.SearchBoxMonth,{value:c,onChange:l,ariaLabel:s.label,size:d}):(0,o.jsx)(r.SearchBoxFloatingSelect,{label:s.label,options:s.options,value:c,onChange:l,size:d})}exports.SearchBoxField=s;
@@ -0,0 +1,48 @@
1
+ import { SearchBoxDateRange as e } from "./SearchBoxDateRange.esm.js";
2
+ import { SearchBoxDateSingle as t } from "./SearchBoxDateSingle.esm.js";
3
+ import { SearchBoxFloatingInput as n } from "./SearchBoxFloatingInput.esm.js";
4
+ import { SearchBoxFloatingSelect as r } from "./SearchBoxFloatingSelect.esm.js";
5
+ import { SearchBoxMonth as i } from "./SearchBoxMonth.esm.js";
6
+ import { SearchBoxMultiSelect as a } from "./SearchBoxMultiSelect.esm.js";
7
+ import { jsx as o } from "react/jsx-runtime";
8
+ //#region src/components/search-box/SearchBoxField.tsx
9
+ function s({ field: s, value: c, onChange: l, onEnter: u, size: d }) {
10
+ return s.type === "text" ? /* @__PURE__ */ o(n, {
11
+ label: s.label,
12
+ value: c,
13
+ onChange: l,
14
+ onEnter: u,
15
+ size: d,
16
+ inputMode: s.inputMode
17
+ }) : s.type === "multiSelect" ? /* @__PURE__ */ o(a, {
18
+ label: s.label,
19
+ options: s.options,
20
+ value: c,
21
+ onChange: l,
22
+ size: d
23
+ }) : s.type === "dateRange" ? /* @__PURE__ */ o(e, {
24
+ value: c,
25
+ onChange: l,
26
+ presets: s.presets,
27
+ size: d
28
+ }) : s.type === "dateSingle" ? /* @__PURE__ */ o(t, {
29
+ value: c,
30
+ onChange: l,
31
+ ariaLabel: s.label,
32
+ presets: s.presets,
33
+ size: d
34
+ }) : s.type === "month" ? /* @__PURE__ */ o(i, {
35
+ value: c,
36
+ onChange: l,
37
+ ariaLabel: s.label,
38
+ size: d
39
+ }) : /* @__PURE__ */ o(r, {
40
+ label: s.label,
41
+ options: s.options,
42
+ value: c,
43
+ onChange: l,
44
+ size: d
45
+ });
46
+ }
47
+ //#endregion
48
+ export { s as SearchBoxField };
@@ -0,0 +1 @@
1
+ let e=require("react"),t=require("react/jsx-runtime");function n({label:n,value:r,onChange:i,onEnter:a,size:o,inputMode:s,trailing:c}){let[l,u]=(0,e.useState)(!1),d=(0,e.useRef)(null),f=r.length>0,p=l||f,m=o===`mini`?`h-8`:`h-10`,h=o===`mini`?`text-xs`:`text-sm`,g=o===`mini`?`px-2.5`:`px-3`;return(0,t.jsxs)(`div`,{className:`relative ${m} w-full cursor-text rounded-lg border bg-bg-white transition-colors ${l?`border-primary-500`:`border-border-tertiary dark:border-border-secondary`}`,onClick:()=>d.current?.focus(),children:[(0,t.jsx)(`input`,{ref:d,type:`text`,value:r,onChange:e=>i(e.target.value),onFocus:()=>u(!0),onBlur:()=>u(!1),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),a?.())},inputMode:s,"aria-label":n,className:`peer h-full w-full bg-transparent ${g} ${h} text-text-primary placeholder-transparent focus:outline-hidden`,placeholder:n}),(0,t.jsx)(`span`,{"aria-hidden":`true`,className:`pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${p?`-top-2 ${o===`mini`?`text-[10px]`:`text-xs`} ${l?`text-primary-500`:`text-text-secondary`}`:`top-1/2 -translate-y-1/2 ${h} text-text-tertiary`}`,children:n}),c&&(0,t.jsx)(`div`,{className:`absolute inset-y-0 right-2 flex items-center`,children:c})]})}exports.SearchBoxFloatingInput=n;
@@ -0,0 +1,38 @@
1
+ import { useRef as e, useState as t } from "react";
2
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
+ //#region src/components/search-box/SearchBoxFloatingInput.tsx
4
+ function i({ label: i, value: a, onChange: o, onEnter: s, size: c, inputMode: l, trailing: u }) {
5
+ let [d, f] = t(!1), p = e(null), m = a.length > 0, h = d || m, g = c === "mini" ? "h-8" : "h-10", _ = c === "mini" ? "text-xs" : "text-sm", v = c === "mini" ? "px-2.5" : "px-3";
6
+ return /* @__PURE__ */ r("div", {
7
+ className: `relative ${g} w-full cursor-text rounded-lg border bg-bg-white transition-colors ${d ? "border-primary-500" : "border-border-tertiary dark:border-border-secondary"}`,
8
+ onClick: () => p.current?.focus(),
9
+ children: [
10
+ /* @__PURE__ */ n("input", {
11
+ ref: p,
12
+ type: "text",
13
+ value: a,
14
+ onChange: (e) => o(e.target.value),
15
+ onFocus: () => f(!0),
16
+ onBlur: () => f(!1),
17
+ onKeyDown: (e) => {
18
+ e.key === "Enter" && (e.preventDefault(), s?.());
19
+ },
20
+ inputMode: l,
21
+ "aria-label": i,
22
+ className: `peer h-full w-full bg-transparent ${v} ${_} text-text-primary placeholder-transparent focus:outline-hidden`,
23
+ placeholder: i
24
+ }),
25
+ /* @__PURE__ */ n("span", {
26
+ "aria-hidden": "true",
27
+ className: `pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${h ? `-top-2 ${c === "mini" ? "text-[10px]" : "text-xs"} ${d ? "text-primary-500" : "text-text-secondary"}` : `top-1/2 -translate-y-1/2 ${_} text-text-tertiary`}`,
28
+ children: i
29
+ }),
30
+ u && /* @__PURE__ */ n("div", {
31
+ className: "absolute inset-y-0 right-2 flex items-center",
32
+ children: u
33
+ })
34
+ ]
35
+ });
36
+ }
37
+ //#endregion
38
+ export { i as SearchBoxFloatingInput };
@@ -0,0 +1 @@
1
+ const e=require("../../node_modules/lucide-react/dist/esm/icons/check.cjs.js"),t=require("../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js");let n=require("react"),r=require("react/jsx-runtime"),i=require("@floating-ui/react");function a({label:a,options:o,value:s,onChange:c,size:l}){let[u,d]=(0,n.useState)(!1),{refs:f,floatingStyles:p,context:m}=(0,i.useFloating)({open:u,onOpenChange:d,placement:`bottom-start`,whileElementsMounted:i.autoUpdate,middleware:[(0,i.offset)(4),(0,i.flip)({fallbackAxisSideDirection:`start`}),(0,i.shift)({padding:8}),(0,i.size)({apply({rects:e,elements:t}){Object.assign(t.floating.style,{minWidth:`${e.reference.width}px`})}})]}),{getReferenceProps:h,getFloatingProps:g}=(0,i.useInteractions)([(0,i.useClick)(m),(0,i.useDismiss)(m),(0,i.useRole)(m,{role:`listbox`})]),_=o.find(e=>String(e.value)===s),v=!!_,y=u||v,b=l===`mini`?`h-8`:`h-10`,x=l===`mini`?`text-xs`:`text-sm`,S=l===`mini`?`px-2.5`:`px-3`;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(`button`,{ref:f.setReference,type:`button`,...h(),"aria-expanded":u,"aria-haspopup":`listbox`,className:`relative ${b} w-full rounded-lg border bg-bg-white ${S} text-left transition-colors focus-visible:border-primary-500 focus-visible:outline-hidden ${u?`border-primary-500`:`border-border-tertiary dark:border-border-secondary`}`,children:[(0,r.jsxs)(`div`,{className:`flex h-full w-full items-center justify-between gap-2`,children:[(0,r.jsx)(`span`,{className:`truncate ${x} ${v?`text-text-primary`:`text-text-tertiary`}`,children:v?_.label:``}),(0,r.jsx)(t.ChevronDown,{className:`h-3.5 w-3.5 shrink-0 text-icon-tertiary transition-transform ${u?`rotate-180`:``}`})]}),(0,r.jsx)(`span`,{"aria-hidden":`true`,className:`pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${y?`-top-2 ${l===`mini`?`text-[10px]`:`text-xs`} ${u?`text-primary-500`:`text-text-secondary`}`:`top-1/2 -translate-y-1/2 ${x} text-text-tertiary`}`,children:a})]}),u&&(0,r.jsx)(i.FloatingPortal,{children:(0,r.jsxs)(`div`,{ref:f.setFloating,style:p,...g(),className:`z-9999 max-h-60 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800`,children:[o.map(t=>{let n=String(t.value),i=n===s;return(0,r.jsxs)(`button`,{type:`button`,onClick:()=>{c(n),d(!1)},className:`flex w-full items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-700 ${x} ${i?`text-text-primary`:`text-text-secondary`}`,role:`option`,"aria-selected":i,children:[(0,r.jsx)(`span`,{className:`flex-1 truncate`,children:t.label}),i&&(0,r.jsx)(e.Check,{className:`h-3 w-3 text-primary-500`,strokeWidth:3})]},n)}),o.length===0&&(0,r.jsx)(`div`,{className:`px-3 py-2 text-xs text-text-tertiary`,children:`옵션이 없어요`})]})})]})}exports.SearchBoxFloatingSelect=a;
@@ -0,0 +1,74 @@
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 { useState as n } from "react";
4
+ import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ import { FloatingPortal as o, autoUpdate as s, flip as c, offset as l, shift as u, size as d, useClick as f, useDismiss as p, useFloating as m, useInteractions as h, useRole as g } from "@floating-ui/react";
6
+ //#region src/components/search-box/SearchBoxFloatingSelect.tsx
7
+ function _({ label: _, options: v, value: y, onChange: b, size: x }) {
8
+ let [S, C] = n(!1), { refs: w, floatingStyles: T, context: E } = m({
9
+ open: S,
10
+ onOpenChange: C,
11
+ placement: "bottom-start",
12
+ whileElementsMounted: s,
13
+ middleware: [
14
+ l(4),
15
+ c({ fallbackAxisSideDirection: "start" }),
16
+ u({ padding: 8 }),
17
+ d({ apply({ rects: e, elements: t }) {
18
+ Object.assign(t.floating.style, { minWidth: `${e.reference.width}px` });
19
+ } })
20
+ ]
21
+ }), { getReferenceProps: D, getFloatingProps: O } = h([
22
+ f(E),
23
+ p(E),
24
+ g(E, { role: "listbox" })
25
+ ]), k = v.find((e) => String(e.value) === y), A = !!k, j = S || A, M = x === "mini" ? "h-8" : "h-10", N = x === "mini" ? "text-xs" : "text-sm", P = x === "mini" ? "px-2.5" : "px-3";
26
+ return /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ a("button", {
27
+ ref: w.setReference,
28
+ type: "button",
29
+ ...D(),
30
+ "aria-expanded": S,
31
+ "aria-haspopup": "listbox",
32
+ className: `relative ${M} w-full rounded-lg border bg-bg-white ${P} text-left transition-colors focus-visible:border-primary-500 focus-visible:outline-hidden ${S ? "border-primary-500" : "border-border-tertiary dark:border-border-secondary"}`,
33
+ children: [/* @__PURE__ */ a("div", {
34
+ className: "flex h-full w-full items-center justify-between gap-2",
35
+ children: [/* @__PURE__ */ i("span", {
36
+ className: `truncate ${N} ${A ? "text-text-primary" : "text-text-tertiary"}`,
37
+ children: A ? k.label : ""
38
+ }), /* @__PURE__ */ i(t, { className: `h-3.5 w-3.5 shrink-0 text-icon-tertiary transition-transform ${S ? "rotate-180" : ""}` })]
39
+ }), /* @__PURE__ */ i("span", {
40
+ "aria-hidden": "true",
41
+ className: `pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${j ? `-top-2 ${x === "mini" ? "text-[10px]" : "text-xs"} ${S ? "text-primary-500" : "text-text-secondary"}` : `top-1/2 -translate-y-1/2 ${N} text-text-tertiary`}`,
42
+ children: _
43
+ })]
44
+ }), S && /* @__PURE__ */ i(o, { children: /* @__PURE__ */ a("div", {
45
+ ref: w.setFloating,
46
+ style: T,
47
+ ...O(),
48
+ className: "z-9999 max-h-60 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800",
49
+ children: [v.map((t) => {
50
+ let n = String(t.value), r = n === y;
51
+ return /* @__PURE__ */ a("button", {
52
+ type: "button",
53
+ onClick: () => {
54
+ b(n), C(!1);
55
+ },
56
+ className: `flex w-full items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-700 ${N} ${r ? "text-text-primary" : "text-text-secondary"}`,
57
+ role: "option",
58
+ "aria-selected": r,
59
+ children: [/* @__PURE__ */ i("span", {
60
+ className: "flex-1 truncate",
61
+ children: t.label
62
+ }), r && /* @__PURE__ */ i(e, {
63
+ className: "h-3 w-3 text-primary-500",
64
+ strokeWidth: 3
65
+ })]
66
+ }, n);
67
+ }), v.length === 0 && /* @__PURE__ */ i("div", {
68
+ className: "px-3 py-2 text-xs text-text-tertiary",
69
+ children: "옵션이 없어요"
70
+ })]
71
+ }) })] });
72
+ }
73
+ //#endregion
74
+ export { _ as SearchBoxFloatingSelect };
@@ -0,0 +1 @@
1
+ const e=require("../../node_modules/lucide-react/dist/esm/icons/calendar.cjs.js"),t=require("../date-picker/month-picker.cjs.js"),n=require("./SearchBoxSheetContext.cjs.js");let r=require("react"),i=require("react/jsx-runtime");function a(e){let[t,n]=e.split(`-`),r=Number(t),i=Number(n);if(!(!r||!i))return{year:r,month:i}}function o({year:e,month:t}){return`${e}-${String(t).padStart(2,`0`)}`}function s({value:s,onChange:c,ariaLabel:l,size:u}){let d=(0,r.useContext)(n.SearchBoxSheetContext),f=a(s),p=f?`${f.year}년 ${f.month}월`:`년월 선택`;return(0,i.jsx)(t.MonthPicker,{value:f,onChange:e=>c(o(e)),disableMobileSheet:d,children:(0,i.jsxs)(`button`,{type:`button`,"aria-label":l,className:`inline-flex w-full items-center gap-2 rounded-lg border border-border-tertiary bg-bg-card px-3 text-sm text-text-primary transition-colors hover:bg-bg-base-primary dark:border-border-secondary ${u===`small`?`h-10 py-2`:`h-9 py-1.5`}`,children:[(0,i.jsx)(e.Calendar,{className:`h-4 w-4 shrink-0 text-text-secondary`}),(0,i.jsx)(`span`,{className:f?``:`text-text-tertiary`,children:p})]})})}exports.SearchBoxMonth=s;
@@ -0,0 +1,35 @@
1
+ import { Calendar as e } from "../../node_modules/lucide-react/dist/esm/icons/calendar.esm.js";
2
+ import { MonthPicker as t } from "../date-picker/month-picker.esm.js";
3
+ import { SearchBoxSheetContext as n } from "./SearchBoxSheetContext.esm.js";
4
+ import { useContext as r } from "react";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ //#region src/components/search-box/SearchBoxMonth.tsx
7
+ function o(e) {
8
+ let [t, n] = e.split("-"), r = Number(t), i = Number(n);
9
+ if (!(!r || !i)) return {
10
+ year: r,
11
+ month: i
12
+ };
13
+ }
14
+ function s({ year: e, month: t }) {
15
+ return `${e}-${String(t).padStart(2, "0")}`;
16
+ }
17
+ function c({ value: c, onChange: l, ariaLabel: u, size: d }) {
18
+ let f = r(n), p = o(c), m = p ? `${p.year}년 ${p.month}월` : "년월 선택";
19
+ return /* @__PURE__ */ i(t, {
20
+ value: p,
21
+ onChange: (e) => l(s(e)),
22
+ disableMobileSheet: f,
23
+ children: /* @__PURE__ */ a("button", {
24
+ type: "button",
25
+ "aria-label": u,
26
+ className: `inline-flex w-full items-center gap-2 rounded-lg border border-border-tertiary bg-bg-card px-3 text-sm text-text-primary transition-colors hover:bg-bg-base-primary dark:border-border-secondary ${d === "small" ? "h-10 py-2" : "h-9 py-1.5"}`,
27
+ children: [/* @__PURE__ */ i(e, { className: "h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ i("span", {
28
+ className: p ? "" : "text-text-tertiary",
29
+ children: m
30
+ })]
31
+ })
32
+ });
33
+ }
34
+ //#endregion
35
+ export { c as SearchBoxMonth };
@@ -0,0 +1 @@
1
+ const e=require("../../node_modules/lucide-react/dist/esm/icons/check.cjs.js"),t=require("../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js");let n=require("react"),r=require("react/jsx-runtime"),i=require("@floating-ui/react");function a({label:a,options:o,value:s,onChange:c,size:l}){let[u,d]=(0,n.useState)(!1),{refs:f,floatingStyles:p,context:m}=(0,i.useFloating)({open:u,onOpenChange:d,placement:`bottom-start`,whileElementsMounted:i.autoUpdate,middleware:[(0,i.offset)(4),(0,i.flip)({fallbackAxisSideDirection:`start`}),(0,i.shift)({padding:8}),(0,i.size)({apply({rects:e,elements:t}){Object.assign(t.floating.style,{minWidth:`${e.reference.width}px`})}})]}),{getReferenceProps:h,getFloatingProps:g}=(0,i.useInteractions)([(0,i.useClick)(m),(0,i.useDismiss)(m),(0,i.useRole)(m,{role:`listbox`})]),_=s?s.split(`,`).filter(Boolean):[],v=new Set(_),y=_.length>0,b=u||y,x=e=>{let t=new Set(v);t.has(e)?t.delete(e):t.add(e),c(o.filter(e=>t.has(String(e.value))).map(e=>String(e.value)).join(`,`))},S=l===`mini`?`h-8`:`h-10`,C=l===`mini`?`text-xs`:`text-sm`,w=l===`mini`?`px-2.5`:`px-3`,T=y?o.filter(e=>v.has(String(e.value))).map(e=>e.label).join(`, `):``;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(`button`,{ref:f.setReference,type:`button`,...h(),"aria-expanded":u,"aria-haspopup":`listbox`,className:`relative ${S} w-full rounded-lg border bg-bg-white ${w} text-left transition-colors focus-visible:border-primary-500 focus-visible:outline-hidden ${u?`border-primary-500`:`border-border-tertiary dark:border-border-secondary`}`,children:[(0,r.jsxs)(`div`,{className:`flex h-full w-full items-center justify-between gap-2`,children:[(0,r.jsx)(`span`,{className:`truncate ${C} ${y?`text-text-primary`:`text-text-tertiary`}`,children:T}),(0,r.jsx)(t.ChevronDown,{className:`h-3.5 w-3.5 shrink-0 text-icon-tertiary transition-transform ${u?`rotate-180`:``}`})]}),(0,r.jsx)(`span`,{"aria-hidden":`true`,className:`pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${b?`-top-2 ${l===`mini`?`text-[10px]`:`text-xs`} ${u?`text-primary-500`:`text-text-secondary`}`:`top-1/2 -translate-y-1/2 ${C} text-text-tertiary`}`,children:a})]}),u&&(0,r.jsx)(i.FloatingPortal,{children:(0,r.jsxs)(`div`,{ref:f.setFloating,style:p,...g(),className:`z-9999 max-h-60 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800`,children:[o.map(t=>{let n=String(t.value),i=v.has(n);return(0,r.jsxs)(`button`,{type:`button`,onClick:()=>x(n),className:`flex w-full items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-700 ${C} ${i?`text-text-primary`:`text-text-secondary`}`,role:`option`,"aria-selected":i,children:[(0,r.jsx)(`span`,{className:`flex h-4 w-4 shrink-0 items-center justify-center rounded border ${i?`border-primary-500 bg-primary-500 text-white`:`border-neutral-300 dark:border-neutral-600`}`,children:i&&(0,r.jsx)(e.Check,{className:`h-3 w-3`,strokeWidth:3})}),(0,r.jsx)(`span`,{className:`flex-1 truncate`,children:t.label})]},n)}),o.length===0&&(0,r.jsx)(`div`,{className:`px-3 py-2 text-xs text-text-tertiary`,children:`옵션이 없어요`})]})})]})}exports.SearchBoxMultiSelect=a;
@@ -0,0 +1,78 @@
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 { useState as n } from "react";
4
+ import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ import { FloatingPortal as o, autoUpdate as s, flip as c, offset as l, shift as u, size as d, useClick as f, useDismiss as p, useFloating as m, useInteractions as h, useRole as g } from "@floating-ui/react";
6
+ //#region src/components/search-box/SearchBoxMultiSelect.tsx
7
+ function _({ label: _, options: v, value: y, onChange: b, size: x }) {
8
+ let [S, C] = n(!1), { refs: w, floatingStyles: T, context: E } = m({
9
+ open: S,
10
+ onOpenChange: C,
11
+ placement: "bottom-start",
12
+ whileElementsMounted: s,
13
+ middleware: [
14
+ l(4),
15
+ c({ fallbackAxisSideDirection: "start" }),
16
+ u({ padding: 8 }),
17
+ d({ apply({ rects: e, elements: t }) {
18
+ Object.assign(t.floating.style, { minWidth: `${e.reference.width}px` });
19
+ } })
20
+ ]
21
+ }), { getReferenceProps: D, getFloatingProps: O } = h([
22
+ f(E),
23
+ p(E),
24
+ g(E, { role: "listbox" })
25
+ ]), k = y ? y.split(",").filter(Boolean) : [], A = new Set(k), j = k.length > 0, M = S || j, N = (e) => {
26
+ let t = new Set(A);
27
+ t.has(e) ? t.delete(e) : t.add(e), b(v.filter((e) => t.has(String(e.value))).map((e) => String(e.value)).join(","));
28
+ }, P = x === "mini" ? "h-8" : "h-10", F = x === "mini" ? "text-xs" : "text-sm", I = x === "mini" ? "px-2.5" : "px-3", L = j ? v.filter((e) => A.has(String(e.value))).map((e) => e.label).join(", ") : "";
29
+ return /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ a("button", {
30
+ ref: w.setReference,
31
+ type: "button",
32
+ ...D(),
33
+ "aria-expanded": S,
34
+ "aria-haspopup": "listbox",
35
+ className: `relative ${P} w-full rounded-lg border bg-bg-white ${I} text-left transition-colors focus-visible:border-primary-500 focus-visible:outline-hidden ${S ? "border-primary-500" : "border-border-tertiary dark:border-border-secondary"}`,
36
+ children: [/* @__PURE__ */ a("div", {
37
+ className: "flex h-full w-full items-center justify-between gap-2",
38
+ children: [/* @__PURE__ */ i("span", {
39
+ className: `truncate ${F} ${j ? "text-text-primary" : "text-text-tertiary"}`,
40
+ children: L
41
+ }), /* @__PURE__ */ i(t, { className: `h-3.5 w-3.5 shrink-0 text-icon-tertiary transition-transform ${S ? "rotate-180" : ""}` })]
42
+ }), /* @__PURE__ */ i("span", {
43
+ "aria-hidden": "true",
44
+ className: `pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${M ? `-top-2 ${x === "mini" ? "text-[10px]" : "text-xs"} ${S ? "text-primary-500" : "text-text-secondary"}` : `top-1/2 -translate-y-1/2 ${F} text-text-tertiary`}`,
45
+ children: _
46
+ })]
47
+ }), S && /* @__PURE__ */ i(o, { children: /* @__PURE__ */ a("div", {
48
+ ref: w.setFloating,
49
+ style: T,
50
+ ...O(),
51
+ className: "z-9999 max-h-60 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800",
52
+ children: [v.map((t) => {
53
+ let n = String(t.value), r = A.has(n);
54
+ return /* @__PURE__ */ a("button", {
55
+ type: "button",
56
+ onClick: () => N(n),
57
+ className: `flex w-full items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-700 ${F} ${r ? "text-text-primary" : "text-text-secondary"}`,
58
+ role: "option",
59
+ "aria-selected": r,
60
+ children: [/* @__PURE__ */ i("span", {
61
+ className: `flex h-4 w-4 shrink-0 items-center justify-center rounded border ${r ? "border-primary-500 bg-primary-500 text-white" : "border-neutral-300 dark:border-neutral-600"}`,
62
+ children: r && /* @__PURE__ */ i(e, {
63
+ className: "h-3 w-3",
64
+ strokeWidth: 3
65
+ })
66
+ }), /* @__PURE__ */ i("span", {
67
+ className: "flex-1 truncate",
68
+ children: t.label
69
+ })]
70
+ }, n);
71
+ }), v.length === 0 && /* @__PURE__ */ i("div", {
72
+ className: "px-3 py-2 text-xs text-text-tertiary",
73
+ children: "옵션이 없어요"
74
+ })]
75
+ }) })] });
76
+ }
77
+ //#endregion
78
+ export { _ as SearchBoxMultiSelect };
@@ -0,0 +1 @@
1
+ var e=(0,require("react").createContext)(!1);exports.SearchBoxSheetContext=e;
@@ -0,0 +1,5 @@
1
+ import { createContext as e } from "react";
2
+ //#region src/components/search-box/SearchBoxSheetContext.ts
3
+ var t = e(!1);
4
+ //#endregion
5
+ export { t as SearchBoxSheetContext };
@@ -0,0 +1 @@
1
+ const e=require("./parseDateRange.cjs.js");let t=require("date-fns");var n=`yyyy-MM-dd`;function r(){let e=(0,t.format)(new Date,n);return{from:e,to:e}}function i(){let{from:t,to:n}=r();return e.serializeDateRangeValue(t,n)}var a=[{label:`전일`,range:()=>{let e=(0,t.format)((0,t.subDays)(new Date,1),n);return{from:e,to:e}}},{label:`당일`,range:()=>{let e=(0,t.format)(new Date,n);return{from:e,to:e}}},{label:`당월`,range:()=>{let e=new Date;return{from:(0,t.format)((0,t.startOfMonth)(e),n),to:(0,t.format)((0,t.endOfMonth)(e),n)}}},{label:`전월`,range:()=>{let e=(0,t.subMonths)(new Date,1);return{from:(0,t.format)((0,t.startOfMonth)(e),n),to:(0,t.format)((0,t.endOfMonth)(e),n)}}}];exports.DEFAULT_DATE_RANGE_PRESETS=a,exports.getTodayDateRange=r,exports.getTodayDateRangeValue=i;
@@ -0,0 +1,59 @@
1
+ import { serializeDateRangeValue as e } from "./parseDateRange.esm.js";
2
+ import { endOfMonth as t, format as n, startOfMonth as r, subDays as i, subMonths as a } from "date-fns";
3
+ //#region src/components/search-box/dateRangePresets.ts
4
+ var o = "yyyy-MM-dd";
5
+ function s() {
6
+ let e = n(/* @__PURE__ */ new Date(), o);
7
+ return {
8
+ from: e,
9
+ to: e
10
+ };
11
+ }
12
+ function c() {
13
+ let { from: t, to: n } = s();
14
+ return e(t, n);
15
+ }
16
+ var l = [
17
+ {
18
+ label: "전일",
19
+ range: () => {
20
+ let e = n(i(/* @__PURE__ */ new Date(), 1), o);
21
+ return {
22
+ from: e,
23
+ to: e
24
+ };
25
+ }
26
+ },
27
+ {
28
+ label: "당일",
29
+ range: () => {
30
+ let e = n(/* @__PURE__ */ new Date(), o);
31
+ return {
32
+ from: e,
33
+ to: e
34
+ };
35
+ }
36
+ },
37
+ {
38
+ label: "당월",
39
+ range: () => {
40
+ let e = /* @__PURE__ */ new Date();
41
+ return {
42
+ from: n(r(e), o),
43
+ to: n(t(e), o)
44
+ };
45
+ }
46
+ },
47
+ {
48
+ label: "전월",
49
+ range: () => {
50
+ let e = a(/* @__PURE__ */ new Date(), 1);
51
+ return {
52
+ from: n(r(e), o),
53
+ to: n(t(e), o)
54
+ };
55
+ }
56
+ }
57
+ ];
58
+ //#endregion
59
+ export { l as DEFAULT_DATE_RANGE_PRESETS, s as getTodayDateRange, c as getTodayDateRangeValue };
@@ -0,0 +1 @@
1
+ var e=`~`;function t(t){if(!t)return{from:``,to:``};let n=t.indexOf(e);return n===-1?{from:t,to:``}:{from:t.slice(0,n),to:t.slice(n+1)}}function n(t,n){return!t&&!n?``:`${t}${e}${n}`}exports.parseDateRangeValue=t,exports.serializeDateRangeValue=n;
@@ -0,0 +1,21 @@
1
+ //#region src/components/search-box/parseDateRange.ts
2
+ var e = "~";
3
+ function t(t) {
4
+ if (!t) return {
5
+ from: "",
6
+ to: ""
7
+ };
8
+ let n = t.indexOf(e);
9
+ return n === -1 ? {
10
+ from: t,
11
+ to: ""
12
+ } : {
13
+ from: t.slice(0, n),
14
+ to: t.slice(n + 1)
15
+ };
16
+ }
17
+ function n(t, n) {
18
+ return !t && !n ? "" : `${t}${e}${n}`;
19
+ }
20
+ //#endregion
21
+ export { t as parseDateRangeValue, n as serializeDateRangeValue };
@@ -0,0 +1 @@
1
+ const e=require("./parseDateRange.cjs.js");function t(e){return e?e.split(`,`).filter(Boolean):[]}function n(n,r){let i={};for(let a of n){let n=a.hidden?``:r[a.key]??``;a.type===`multiSelect`?i[a.key]=t(n):a.type===`dateRange`?i[a.key]=e.parseDateRangeValue(n):i[a.key]=n}return i}exports.parseMultiSelectValue=t,exports.parseSearchValues=n;
@@ -0,0 +1,15 @@
1
+ import { parseDateRangeValue as e } from "./parseDateRange.esm.js";
2
+ //#region src/components/search-box/parseSearchValues.ts
3
+ function t(e) {
4
+ return e ? e.split(",").filter(Boolean) : [];
5
+ }
6
+ function n(n, r) {
7
+ let i = {};
8
+ for (let a of n) {
9
+ let n = a.hidden ? "" : r[a.key] ?? "";
10
+ a.type === "multiSelect" ? i[a.key] = t(n) : a.type === "dateRange" ? i[a.key] = e(n) : i[a.key] = n;
11
+ }
12
+ return i;
13
+ }
14
+ //#endregion
15
+ export { t as parseMultiSelectValue, n as parseSearchValues };
@@ -0,0 +1 @@
1
+ const e=require("../../_virtual/_rolldown/runtime.cjs.js"),t=require("./parseDateRange.cjs.js");let n=require("react"),r=require("react-hot-toast");r=e.__toESM(r,1);function i({fields:e,values:i,onSearch:l,onClear:u}){let[d,f]=(0,n.useState)(()=>a(e,i)),p=(0,n.useRef)(i);return(0,n.useEffect)(()=>{let t=p.current;c(i,t,e)||(f(n=>{let r={...n};for(let a of e)(n[a.key]??``)===(t[a.key]??``)&&(r[a.key]=i[a.key]??``);return r}),p.current=i)},[i]),{draft:d,setFieldValue:(e,t)=>{f(n=>({...n,[e]:t}))},submit:()=>{for(let n of e){if(n.hidden||n.type!==`dateRange`)continue;let{from:e,to:i}=t.parseDateRangeValue(d[n.key]??``);if(e&&i&&e>i)return r.default.error(`${n.label} 종료일이 시작일보다 빠를 수 없어요`),!1}return l(s(e,d)),!0},clear:()=>{let t=o(e);f(t),u?u():l(t)},chips:e.map(e=>{if(e.hidden)return null;let t=i[e.key]??``;if(t===``)return null;if(e.type===`select`){let n=e.options.find(e=>String(e.value)===t);return{key:e.key,label:e.label,valueLabel:n?.label??t}}if(e.type===`multiSelect`){let n=t.split(`,`).filter(Boolean);if(n.length===0)return null;let r=new Map(e.options.map(e=>[String(e.value),e.label])),i=n.map(e=>r.get(e)??e);return{key:e.key,label:e.label,valueLabel:i.join(`, `)}}return null}).filter(e=>e!==null),removeChip:e=>{let t={...i,[e]:``};f(t),l(t)}}}function a(e,t){let n={};for(let r of e)n[r.key]=t[r.key]??``;return n}function o(e){let t={};for(let n of e)t[n.key]=``;return t}function s(e,t){let n={...t};for(let t of e)t.hidden&&(n[t.key]=``);return n}function c(e,t,n){for(let r of n)if((e[r.key]??``)!==(t[r.key]??``))return!1;return!0}exports.useSearchBoxState=i;
@@ -0,0 +1,87 @@
1
+ import { parseDateRangeValue as e } from "./parseDateRange.esm.js";
2
+ import { useEffect as t, useRef as n, useState as r } from "react";
3
+ import i from "react-hot-toast";
4
+ //#region src/components/search-box/useSearchBoxState.ts
5
+ function a({ fields: a, values: u, onSearch: d, onClear: f }) {
6
+ let [p, m] = r(() => o(a, u)), h = n(u);
7
+ return t(() => {
8
+ let e = h.current;
9
+ l(u, e, a) || (m((t) => {
10
+ let n = { ...t };
11
+ for (let r of a) (t[r.key] ?? "") === (e[r.key] ?? "") && (n[r.key] = u[r.key] ?? "");
12
+ return n;
13
+ }), h.current = u);
14
+ }, [u]), {
15
+ draft: p,
16
+ setFieldValue: (e, t) => {
17
+ m((n) => ({
18
+ ...n,
19
+ [e]: t
20
+ }));
21
+ },
22
+ submit: () => {
23
+ for (let t of a) {
24
+ if (t.hidden || t.type !== "dateRange") continue;
25
+ let { from: n, to: r } = e(p[t.key] ?? "");
26
+ if (n && r && n > r) return i.error(`${t.label} 종료일이 시작일보다 빠를 수 없어요`), !1;
27
+ }
28
+ return d(c(a, p)), !0;
29
+ },
30
+ clear: () => {
31
+ let e = s(a);
32
+ m(e), f ? f() : d(e);
33
+ },
34
+ chips: a.map((e) => {
35
+ if (e.hidden) return null;
36
+ let t = u[e.key] ?? "";
37
+ if (t === "") return null;
38
+ if (e.type === "select") {
39
+ let n = e.options.find((e) => String(e.value) === t);
40
+ return {
41
+ key: e.key,
42
+ label: e.label,
43
+ valueLabel: n?.label ?? t
44
+ };
45
+ }
46
+ if (e.type === "multiSelect") {
47
+ let n = t.split(",").filter(Boolean);
48
+ if (n.length === 0) return null;
49
+ let r = new Map(e.options.map((e) => [String(e.value), e.label])), i = n.map((e) => r.get(e) ?? e);
50
+ return {
51
+ key: e.key,
52
+ label: e.label,
53
+ valueLabel: i.join(", ")
54
+ };
55
+ }
56
+ return null;
57
+ }).filter((e) => e !== null),
58
+ removeChip: (e) => {
59
+ let t = {
60
+ ...u,
61
+ [e]: ""
62
+ };
63
+ m(t), d(t);
64
+ }
65
+ };
66
+ }
67
+ function o(e, t) {
68
+ let n = {};
69
+ for (let r of e) n[r.key] = t[r.key] ?? "";
70
+ return n;
71
+ }
72
+ function s(e) {
73
+ let t = {};
74
+ for (let n of e) t[n.key] = "";
75
+ return t;
76
+ }
77
+ function c(e, t) {
78
+ let n = { ...t };
79
+ for (let t of e) t.hidden && (n[t.key] = "");
80
+ return n;
81
+ }
82
+ function l(e, t, n) {
83
+ for (let r of n) if ((e[r.key] ?? "") !== (t[r.key] ?? "")) return !1;
84
+ return !0;
85
+ }
86
+ //#endregion
87
+ export { a as useSearchBoxState };
@@ -0,0 +1 @@
1
+ const e=require("../../node_modules/lucide-react/dist/esm/icons/check.cjs.js"),t=require("../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js"),n=require("../../node_modules/lucide-react/dist/esm/icons/circle-x.cjs.js"),r=require("../../node_modules/lucide-react/dist/esm/icons/search.cjs.js"),i=require("../_shared/form-size-tokens.cjs.js"),a=require("../input/utils.cjs.js"),ee=require("./loading-dots.cjs.js");let o=require("react"),s=require("react/jsx-runtime"),c=require("@floating-ui/react");var te=e=>e.length===0?``:e.map(e=>e.label).join(`, `),ne=e=>e.length===0?``:`${e.length}개 선택`,l=(0,o.forwardRef)(function({options:l,value:u,onChange:d,variant:f,selectSize:p=`medium`,label:m,labelOption:h=`appear`,help:g,placeholder:re=`선택해주세요`,hasError:_=!1,disabled:v=!1,suffix:y,trailingIcon:b,clearable:x=!1,badge:S,searchable:C=!1,searchPlaceholder:ie=`검색...`,onSearchChange:w,isSearchLoading:T=!1,containerProps:ae,containerRef:oe,className:se=``,panelClassName:ce=``,formatTrigger:le=te,formatCollapsed:ue=ne,disableAutoCollapse:E=!1,showSelectAll:de=!1,id:D,name:O,"data-testid":fe},k){let[A,pe]=(0,o.useState)(!1),[j,M]=(0,o.useState)(null),[N,P]=(0,o.useState)(``),[me,F]=(0,o.useState)(!1),I=(0,o.useRef)([]),L=(0,o.useRef)(null),R=(0,o.useRef)(null),z=(0,o.useRef)(null),B=(0,o.useId)(),V=e=>`${B}-opt-${e}`,he=j===null?void 0:V(j),H=typeof w==`function`,U=(0,o.useMemo)(()=>{if(!C||H||N.length===0)return l;let e=N.toLowerCase();return l.filter(t=>t.label.toLowerCase().includes(e))},[l,C,H,N]),W=(0,o.useMemo)(()=>new Set(u),[u]),G=(0,o.useMemo)(()=>l.filter(e=>W.has(String(e.value))),[l,W]),{refs:K,floatingStyles:ge,context:q}=(0,c.useFloating)({open:A,onOpenChange:pe,placement:`bottom-start`,whileElementsMounted:c.autoUpdate,middleware:[(0,c.offset)(4),(0,c.flip)({padding:8}),(0,c.shift)({padding:8}),(0,c.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:_e,getFloatingProps:ve,getItemProps:ye}=(0,c.useInteractions)([(0,c.useClick)(q,{enabled:!v}),(0,c.useDismiss)(q),(0,c.useRole)(q,{role:`listbox`}),(0,c.useListNavigation)(q,{listRef:I,activeIndex:j,onNavigate:M,virtual:C,loop:!0})]);(0,o.useEffect)(()=>{A||(P(``),M(null),H&&w(``))},[A,H,w]),(0,o.useEffect)(()=>{A&&C&&L.current&&L.current.focus()},[A,C]),(0,o.useLayoutEffect)(()=>{if(E){F(!1);return}let e=R.current,t=z.current;if(!e||!t)return;let n=()=>{let n=t.scrollWidth,r=e.clientWidth;F(n>r-1)};n();let r=new ResizeObserver(()=>{requestAnimationFrame(n)});return r.observe(e),()=>r.disconnect()},[E,u.join(`,`)]);let J=e=>{let t=new Set(W);t.has(e)?t.delete(e):t.add(e),d(l.filter(e=>t.has(String(e.value))).map(e=>String(e.value)))},be=e=>{e.stopPropagation(),d([])},Y=U.filter(e=>!e.disabled).map(e=>String(e.value)),xe=Y.length>0&&Y.every(e=>W.has(e)),Se=()=>{if(xe){let e=new Set(Y);d(u.filter(t=>!e.has(t)))}else{let e=new Set([...u,...Y]);d(l.filter(t=>e.has(String(t.value))).map(e=>String(e.value)))}},Ce=e=>{!x||v||u.length===0||A||(e.key===`Backspace`||e.key===`Delete`)&&(e.preventDefault(),d([]))},we=e=>{let t=e.target.value;P(t),H&&w(t)},Te=e=>{if(!e.nativeEvent.isComposing&&e.key===`Enter`&&j!==null){e.preventDefault();let t=U[j];t&&!t.disabled&&J(String(t.value))}},X=G.length>0,Ee=h===`sustain`||h===`appear`&&X,De=X?le(G):``,Oe=X?ue(G):``,ke=X?me?Oe:De:re,Ae=i.SLOT_GAP_CLASS[p],Z=i.SLOT_CHILD_ICON_CLASS[p],je=i.SLOT_BADGE_TEXT_CLASS[p],Me=i.SLOT_ICON_SIZE_CLASS[p],Ne=i.CHEVRON_SIZE_CLASS[p],Pe=a.getInputVariantClasses(f,_,v,p),Q=a.getInputTrailingIconColor(_,v,X||A),$=p===`mini`?`text-xs`:p===`large`?`text-base`:`text-sm`,Fe=v?`text-text-disabled`:_?`text-text-danger`:X?`text-text-primary`:`text-text-tertiary`;return(0,s.jsxs)(`div`,{ref:oe,className:a.getInputContainerClasses(),...ae,children:[!E&&X&&(0,s.jsx)(`span`,{ref:z,"aria-hidden":!0,className:`pointer-events-none fixed left-0 -top-[9999px] whitespace-nowrap ${$}`,children:De}),Ee&&m&&(0,s.jsx)(`label`,{className:a.getInputLabelClasses(f,_),htmlFor:D,children:m}),(0,s.jsxs)(`button`,{ref:e=>{K.setReference(e),typeof k==`function`?k(e):k&&(k.current=e)},id:D,type:`button`,disabled:v,"aria-haspopup":`listbox`,"aria-expanded":A,"aria-controls":A?B:void 0,"aria-activedescendant":he,"data-testid":fe,..._e({onKeyDown:Ce}),className:`${Pe} flex w-full items-center ${Ae} ${v?`cursor-not-allowed`:`cursor-pointer`} ${se}`.trim().replace(/\s+/g,` `),children:[(0,s.jsx)(`span`,{ref:R,className:`flex-1 truncate text-left ${$} ${Fe}`,children:ke}),y&&(0,s.jsx)(`span`,{className:`shrink-0 whitespace-nowrap ${$} ${Q}`,children:y}),b&&(0,s.jsx)(`span`,{className:`flex shrink-0 items-center ${Q} ${Z}`,children:b}),x&&!v&&X&&(0,s.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,s.jsx)(n.CircleX,{className:Me,strokeWidth:1.5,"aria-hidden":!0})}),S&&(0,s.jsx)(`span`,{className:`flex shrink-0 items-center ${Z} ${je}`,children:S}),(0,s.jsx)(t.ChevronDown,{className:`shrink-0 transition-transform ${Ne} ${Q} ${A?`rotate-180`:``}`,strokeWidth:1.5,"aria-hidden":!0})]}),O&&(0,s.jsx)(`input`,{type:`hidden`,name:O,value:u.join(`,`)}),A&&(0,s.jsx)(c.FloatingPortal,{children:(0,s.jsx)(c.FloatingFocusManager,{context:q,modal:!1,initialFocus:C?-1:0,children:(0,s.jsxs)(`div`,{ref:K.setFloating,id:B,style:ge,...ve(),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:[C&&(0,s.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border-tertiary px-3 py-2 dark:border-border-secondary`,children:[(0,s.jsx)(r.Search,{className:`h-4 w-4 shrink-0 text-icon-tertiary`,"aria-hidden":!0}),(0,s.jsx)(`input`,{ref:L,type:`text`,value:N,onChange:we,onKeyDown:Te,placeholder:ie,className:`flex-1 bg-transparent text-sm outline-hidden placeholder:text-text-tertiary`}),T&&(0,s.jsx)(ee.LoadingDots,{className:`h-4 w-4 shrink-0 text-icon-tertiary`})]}),de&&U.length>0&&(0,s.jsxs)(`button`,{type:`button`,onClick:Se,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`,children:[(0,s.jsx)(`span`,{children:xe?`전체 해제`:`전체 선택`}),(0,s.jsxs)(`span`,{className:`text-text-tertiary`,children:[Y.length,`개`]})]}),(0,s.jsx)(`div`,{className:`max-h-72 overflow-y-auto py-1`,children:U.length===0?(0,s.jsx)(`div`,{className:`px-3 py-4 text-center text-sm text-text-tertiary`,children:T?`검색 중...`:`옵션이 없어요`}):U.map((t,n)=>{let r=String(t.value),i=W.has(r),a=j===n;return(0,s.jsxs)(`div`,{id:V(n),ref:e=>{I.current[n]=e},role:`option`,"aria-selected":i,"aria-disabled":t.disabled||void 0,tabIndex:a?0:-1,...ye({onClick:()=>{t.disabled||J(r)},onKeyDown:e=>{t.disabled||(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),J(r))}}),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`}`,children:[(0,s.jsx)(`span`,{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`}`,"aria-hidden":!0,children:i&&(0,s.jsx)(e.Check,{className:`h-3 w-3`,strokeWidth:3})}),(0,s.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,s.jsx)(`div`,{className:`truncate ${i?`font-medium`:``}`,children:t.label}),t.description&&(0,s.jsx)(`div`,{className:`mt-0.5 truncate text-xs text-text-tertiary`,children:t.description})]}),t.trailing&&(0,s.jsx)(`span`,{className:`shrink-0 text-xs text-text-tertiary`,children:t.trailing})]},r)})})]})})}),g&&(0,s.jsx)(`div`,{className:a.getInputHelpClasses(_),children:g})]})});exports.MultiSelect=l;