@ktnpm_devops/react-component 0.17.0 → 0.18.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 (409) hide show
  1. package/dist/composites/CustomRangePicker/CustomRangePicker.d.ts.map +1 -1
  2. package/dist/composites/DatePickerDropdown/DatePickerDropdown.d.ts.map +1 -1
  3. package/dist/composites/FilterDropdown/FilterDropdown.d.ts.map +1 -1
  4. package/dist/composites/MultiSelectDropdown/MultiSelectDropdown.d.ts.map +1 -1
  5. package/dist/composites/SingleSelectDropdown/SingleSelectDropdown.d.ts.map +1 -1
  6. package/dist/constants.d.ts +2 -0
  7. package/dist/constants.d.ts.map +1 -1
  8. package/dist/hooks/usePanelPlacement.d.ts +24 -0
  9. package/dist/hooks/usePanelPlacement.d.ts.map +1 -0
  10. package/dist/index10.cjs +1 -1
  11. package/dist/index10.js +1 -1
  12. package/dist/index100.cjs +33 -39
  13. package/dist/index100.cjs.map +1 -1
  14. package/dist/index100.js +32 -38
  15. package/dist/index100.js.map +1 -1
  16. package/dist/index101.cjs +22 -9
  17. package/dist/index101.cjs.map +1 -1
  18. package/dist/index101.js +21 -8
  19. package/dist/index101.js.map +1 -1
  20. package/dist/index102.cjs +34 -9
  21. package/dist/index102.cjs.map +1 -1
  22. package/dist/index102.js +35 -10
  23. package/dist/index102.js.map +1 -1
  24. package/dist/index103.cjs +43 -19
  25. package/dist/index103.cjs.map +1 -1
  26. package/dist/index103.js +43 -19
  27. package/dist/index103.js.map +1 -1
  28. package/dist/index104.cjs +24 -13
  29. package/dist/index104.cjs.map +1 -1
  30. package/dist/index104.js +24 -13
  31. package/dist/index104.js.map +1 -1
  32. package/dist/index105.cjs +38 -9
  33. package/dist/index105.cjs.map +1 -1
  34. package/dist/index105.js +38 -9
  35. package/dist/index105.js.map +1 -1
  36. package/dist/index106.cjs +9 -70
  37. package/dist/index106.cjs.map +1 -1
  38. package/dist/index106.js +8 -69
  39. package/dist/index106.js.map +1 -1
  40. package/dist/index107.cjs +10 -15
  41. package/dist/index107.cjs.map +1 -1
  42. package/dist/index107.js +9 -14
  43. package/dist/index107.js.map +1 -1
  44. package/dist/index108.cjs +18 -46
  45. package/dist/index108.cjs.map +1 -1
  46. package/dist/index108.js +18 -46
  47. package/dist/index108.js.map +1 -1
  48. package/dist/index109.cjs +13 -17
  49. package/dist/index109.cjs.map +1 -1
  50. package/dist/index109.js +13 -17
  51. package/dist/index109.js.map +1 -1
  52. package/dist/index11.cjs +1 -1
  53. package/dist/index11.js +1 -1
  54. package/dist/index110.cjs +10 -36
  55. package/dist/index110.cjs.map +1 -1
  56. package/dist/index110.js +9 -35
  57. package/dist/index110.js.map +1 -1
  58. package/dist/index111.cjs +62 -47
  59. package/dist/index111.cjs.map +1 -1
  60. package/dist/index111.js +62 -47
  61. package/dist/index111.js.map +1 -1
  62. package/dist/index112.cjs +49 -34
  63. package/dist/index112.cjs.map +1 -1
  64. package/dist/index112.js +49 -34
  65. package/dist/index112.js.map +1 -1
  66. package/dist/index113.cjs +13 -7
  67. package/dist/index113.cjs.map +1 -1
  68. package/dist/index113.js +13 -7
  69. package/dist/index113.js.map +1 -1
  70. package/dist/index114.cjs +2 -17
  71. package/dist/index114.cjs.map +1 -1
  72. package/dist/index114.js +3 -18
  73. package/dist/index114.js.map +1 -1
  74. package/dist/index115.cjs +48 -40
  75. package/dist/index115.cjs.map +1 -1
  76. package/dist/index115.js +47 -39
  77. package/dist/index115.js.map +1 -1
  78. package/dist/index116.cjs +18 -70
  79. package/dist/index116.cjs.map +1 -1
  80. package/dist/index116.js +17 -69
  81. package/dist/index116.js.map +1 -1
  82. package/dist/index117.cjs +31 -52
  83. package/dist/index117.cjs.map +1 -1
  84. package/dist/index117.js +31 -52
  85. package/dist/index117.js.map +1 -1
  86. package/dist/index118.cjs +22 -15
  87. package/dist/index118.cjs.map +1 -1
  88. package/dist/index118.js +21 -14
  89. package/dist/index118.js.map +1 -1
  90. package/dist/index119.cjs +69 -21
  91. package/dist/index119.cjs.map +1 -1
  92. package/dist/index119.js +68 -20
  93. package/dist/index119.js.map +1 -1
  94. package/dist/index12.cjs +1 -1
  95. package/dist/index12.js +1 -1
  96. package/dist/index120.cjs +6 -16
  97. package/dist/index120.cjs.map +1 -1
  98. package/dist/index120.js +6 -16
  99. package/dist/index120.js.map +1 -1
  100. package/dist/index121.cjs +35 -2
  101. package/dist/index121.cjs.map +1 -1
  102. package/dist/index121.js +36 -3
  103. package/dist/index121.js.map +1 -1
  104. package/dist/index122.cjs +38 -14
  105. package/dist/index122.cjs.map +1 -1
  106. package/dist/index122.js +38 -14
  107. package/dist/index122.js.map +1 -1
  108. package/dist/index123.cjs +1 -1
  109. package/dist/index123.js +1 -1
  110. package/dist/index124.cjs +52 -13
  111. package/dist/index124.cjs.map +1 -1
  112. package/dist/index124.js +53 -14
  113. package/dist/index124.js.map +1 -1
  114. package/dist/index125.cjs +27 -54
  115. package/dist/index125.cjs.map +1 -1
  116. package/dist/index125.js +28 -55
  117. package/dist/index125.js.map +1 -1
  118. package/dist/index126.cjs +39 -21
  119. package/dist/index126.cjs.map +1 -1
  120. package/dist/index126.js +38 -20
  121. package/dist/index126.js.map +1 -1
  122. package/dist/index127.cjs +92 -33
  123. package/dist/index127.cjs.map +1 -1
  124. package/dist/index127.js +91 -32
  125. package/dist/index127.js.map +1 -1
  126. package/dist/index128.cjs +40 -1164
  127. package/dist/index128.cjs.map +1 -1
  128. package/dist/index128.js +38 -1163
  129. package/dist/index128.js.map +1 -1
  130. package/dist/index129.cjs +13 -1574
  131. package/dist/index129.cjs.map +1 -1
  132. package/dist/index129.js +12 -1574
  133. package/dist/index129.js.map +1 -1
  134. package/dist/index13.cjs +1 -1
  135. package/dist/index13.js +1 -1
  136. package/dist/index130.cjs +1161 -32
  137. package/dist/index130.cjs.map +1 -1
  138. package/dist/index130.js +1162 -32
  139. package/dist/index130.js.map +1 -1
  140. package/dist/index131.cjs +1578 -0
  141. package/dist/index131.cjs.map +1 -0
  142. package/dist/index131.js +1579 -0
  143. package/dist/index131.js.map +1 -0
  144. package/dist/index132.cjs +37 -0
  145. package/dist/index132.cjs.map +1 -0
  146. package/dist/index132.js +37 -0
  147. package/dist/index132.js.map +1 -0
  148. package/dist/index14.cjs +1 -1
  149. package/dist/index14.js +1 -1
  150. package/dist/index15.cjs +1 -1
  151. package/dist/index15.js +1 -1
  152. package/dist/index16.cjs +2 -2
  153. package/dist/index16.js +2 -2
  154. package/dist/index17.cjs +1 -1
  155. package/dist/index17.js +1 -1
  156. package/dist/index18.cjs +1 -1
  157. package/dist/index18.js +1 -1
  158. package/dist/index19.cjs +1 -1
  159. package/dist/index19.js +1 -1
  160. package/dist/index20.cjs +1 -1
  161. package/dist/index20.js +1 -1
  162. package/dist/index21.cjs +1 -1
  163. package/dist/index21.js +1 -1
  164. package/dist/index22.cjs +2 -2
  165. package/dist/index22.js +2 -2
  166. package/dist/index23.cjs +2 -2
  167. package/dist/index23.js +2 -2
  168. package/dist/index24.cjs +2 -2
  169. package/dist/index24.js +2 -2
  170. package/dist/index25.cjs +49 -35
  171. package/dist/index25.cjs.map +1 -1
  172. package/dist/index25.js +49 -35
  173. package/dist/index25.js.map +1 -1
  174. package/dist/index26.cjs +1 -1
  175. package/dist/index26.js +1 -1
  176. package/dist/index27.cjs +83 -56
  177. package/dist/index27.cjs.map +1 -1
  178. package/dist/index27.js +83 -56
  179. package/dist/index27.js.map +1 -1
  180. package/dist/index28.cjs +1 -1
  181. package/dist/index28.js +1 -1
  182. package/dist/index29.cjs +51 -39
  183. package/dist/index29.cjs.map +1 -1
  184. package/dist/index29.js +51 -39
  185. package/dist/index29.js.map +1 -1
  186. package/dist/index30.cjs +11 -11
  187. package/dist/index30.js +11 -11
  188. package/dist/index31.cjs +4 -4
  189. package/dist/index31.js +4 -4
  190. package/dist/index32.cjs +3 -3
  191. package/dist/index32.js +3 -3
  192. package/dist/index33.cjs +1 -1
  193. package/dist/index33.js +1 -1
  194. package/dist/index34.cjs +2 -2
  195. package/dist/index34.js +2 -2
  196. package/dist/index35.cjs +2 -2
  197. package/dist/index35.js +2 -2
  198. package/dist/index36.cjs +2 -2
  199. package/dist/index36.js +2 -2
  200. package/dist/index37.cjs +1 -1
  201. package/dist/index37.js +1 -1
  202. package/dist/index38.cjs +138 -62
  203. package/dist/index38.cjs.map +1 -1
  204. package/dist/index38.js +138 -62
  205. package/dist/index38.js.map +1 -1
  206. package/dist/index39.cjs +1 -1
  207. package/dist/index39.js +1 -1
  208. package/dist/index40.cjs +2 -2
  209. package/dist/index40.js +2 -2
  210. package/dist/index41.cjs +2 -2
  211. package/dist/index41.js +2 -2
  212. package/dist/index42.cjs +2 -2
  213. package/dist/index42.js +2 -2
  214. package/dist/index43.cjs +1 -1
  215. package/dist/index43.js +1 -1
  216. package/dist/index44.cjs +2 -2
  217. package/dist/index44.js +2 -2
  218. package/dist/index45.cjs +4 -4
  219. package/dist/index45.js +4 -4
  220. package/dist/index46.cjs +1 -1
  221. package/dist/index46.js +1 -1
  222. package/dist/index47.cjs +1 -1
  223. package/dist/index47.js +1 -1
  224. package/dist/index48.cjs +1 -1
  225. package/dist/index48.js +1 -1
  226. package/dist/index49.cjs +2 -2
  227. package/dist/index49.js +2 -2
  228. package/dist/index50.cjs +86 -47
  229. package/dist/index50.cjs.map +1 -1
  230. package/dist/index50.js +86 -47
  231. package/dist/index50.js.map +1 -1
  232. package/dist/index51.cjs +1 -1
  233. package/dist/index51.js +1 -1
  234. package/dist/index52.cjs +3 -3
  235. package/dist/index52.js +3 -3
  236. package/dist/index53.cjs +1 -1
  237. package/dist/index53.js +1 -1
  238. package/dist/index54.cjs +1 -1
  239. package/dist/index54.js +1 -1
  240. package/dist/index55.cjs +3 -3
  241. package/dist/index55.js +3 -3
  242. package/dist/index56.cjs +1 -1
  243. package/dist/index56.js +1 -1
  244. package/dist/index57.cjs +1 -1
  245. package/dist/index57.js +1 -1
  246. package/dist/index58.cjs +2 -2
  247. package/dist/index58.js +2 -2
  248. package/dist/index60.cjs +16 -10
  249. package/dist/index60.cjs.map +1 -1
  250. package/dist/index60.js +17 -11
  251. package/dist/index60.js.map +1 -1
  252. package/dist/index61.cjs +15 -21
  253. package/dist/index61.cjs.map +1 -1
  254. package/dist/index61.js +15 -21
  255. package/dist/index61.js.map +1 -1
  256. package/dist/index62.cjs +145 -19
  257. package/dist/index62.cjs.map +1 -1
  258. package/dist/index62.js +143 -17
  259. package/dist/index62.js.map +1 -1
  260. package/dist/index63.cjs +23 -5
  261. package/dist/index63.cjs.map +1 -1
  262. package/dist/index63.js +24 -6
  263. package/dist/index63.js.map +1 -1
  264. package/dist/index64.cjs +19 -143
  265. package/dist/index64.cjs.map +1 -1
  266. package/dist/index64.js +17 -141
  267. package/dist/index64.js.map +1 -1
  268. package/dist/index65.cjs +2 -17
  269. package/dist/index65.cjs.map +1 -1
  270. package/dist/index65.js +2 -17
  271. package/dist/index65.js.map +1 -1
  272. package/dist/index66.cjs +10 -19
  273. package/dist/index66.cjs.map +1 -1
  274. package/dist/index66.js +10 -19
  275. package/dist/index66.js.map +1 -1
  276. package/dist/index67.cjs +20 -14
  277. package/dist/index67.cjs.map +1 -1
  278. package/dist/index67.js +20 -14
  279. package/dist/index67.js.map +1 -1
  280. package/dist/index68.cjs +5 -38
  281. package/dist/index68.cjs.map +1 -1
  282. package/dist/index68.js +6 -39
  283. package/dist/index68.js.map +1 -1
  284. package/dist/index69.cjs +13 -28
  285. package/dist/index69.cjs.map +1 -1
  286. package/dist/index69.js +13 -28
  287. package/dist/index69.js.map +1 -1
  288. package/dist/index70.cjs +16 -19
  289. package/dist/index70.cjs.map +1 -1
  290. package/dist/index70.js +17 -20
  291. package/dist/index70.js.map +1 -1
  292. package/dist/index71.cjs +19 -4
  293. package/dist/index71.cjs.map +1 -1
  294. package/dist/index71.js +19 -4
  295. package/dist/index71.js.map +1 -1
  296. package/dist/index72.cjs +25 -116
  297. package/dist/index72.cjs.map +1 -1
  298. package/dist/index72.js +24 -115
  299. package/dist/index72.js.map +1 -1
  300. package/dist/index73.cjs +10 -37
  301. package/dist/index73.cjs.map +1 -1
  302. package/dist/index73.js +10 -37
  303. package/dist/index73.js.map +1 -1
  304. package/dist/index74.cjs +2 -53
  305. package/dist/index74.cjs.map +1 -1
  306. package/dist/index74.js +3 -54
  307. package/dist/index74.js.map +1 -1
  308. package/dist/index75.cjs +24 -39
  309. package/dist/index75.cjs.map +1 -1
  310. package/dist/index75.js +23 -38
  311. package/dist/index75.js.map +1 -1
  312. package/dist/index76.cjs +45 -91
  313. package/dist/index76.cjs.map +1 -1
  314. package/dist/index76.js +45 -91
  315. package/dist/index76.js.map +1 -1
  316. package/dist/index77.cjs +28 -34
  317. package/dist/index77.cjs.map +1 -1
  318. package/dist/index77.js +28 -34
  319. package/dist/index77.js.map +1 -1
  320. package/dist/index78.cjs +15 -20
  321. package/dist/index78.cjs.map +1 -1
  322. package/dist/index78.js +15 -20
  323. package/dist/index78.js.map +1 -1
  324. package/dist/index79.cjs +6 -69
  325. package/dist/index79.cjs.map +1 -1
  326. package/dist/index79.js +5 -68
  327. package/dist/index79.js.map +1 -1
  328. package/dist/index80.cjs +6 -7
  329. package/dist/index80.cjs.map +1 -1
  330. package/dist/index80.js +5 -6
  331. package/dist/index80.js.map +1 -1
  332. package/dist/index81.cjs +64 -34
  333. package/dist/index81.cjs.map +1 -1
  334. package/dist/index81.js +64 -34
  335. package/dist/index81.js.map +1 -1
  336. package/dist/index82.cjs +52 -134
  337. package/dist/index82.cjs.map +1 -1
  338. package/dist/index82.js +51 -133
  339. package/dist/index82.js.map +1 -1
  340. package/dist/index83.cjs +13 -40
  341. package/dist/index83.cjs.map +1 -1
  342. package/dist/index83.js +14 -41
  343. package/dist/index83.js.map +1 -1
  344. package/dist/index84.cjs +30 -3
  345. package/dist/index84.cjs.map +1 -1
  346. package/dist/index84.js +30 -3
  347. package/dist/index84.js.map +1 -1
  348. package/dist/index85.cjs +36 -36
  349. package/dist/index85.js +36 -36
  350. package/dist/index86.cjs +34 -28
  351. package/dist/index86.cjs.map +1 -1
  352. package/dist/index86.js +34 -28
  353. package/dist/index86.js.map +1 -1
  354. package/dist/index87.cjs +14 -2
  355. package/dist/index87.cjs.map +1 -1
  356. package/dist/index87.js +14 -2
  357. package/dist/index87.js.map +1 -1
  358. package/dist/index88.cjs +16 -16
  359. package/dist/index88.js +16 -16
  360. package/dist/index89.cjs +16 -19
  361. package/dist/index89.cjs.map +1 -1
  362. package/dist/index89.js +17 -20
  363. package/dist/index89.js.map +1 -1
  364. package/dist/index90.cjs +10 -46
  365. package/dist/index90.cjs.map +1 -1
  366. package/dist/index90.js +11 -47
  367. package/dist/index90.js.map +1 -1
  368. package/dist/index91.cjs +116 -28
  369. package/dist/index91.cjs.map +1 -1
  370. package/dist/index91.js +115 -27
  371. package/dist/index91.js.map +1 -1
  372. package/dist/index92.cjs +37 -22
  373. package/dist/index92.cjs.map +1 -1
  374. package/dist/index92.js +37 -22
  375. package/dist/index92.js.map +1 -1
  376. package/dist/index93.cjs +35 -2
  377. package/dist/index93.cjs.map +1 -1
  378. package/dist/index93.js +36 -3
  379. package/dist/index93.js.map +1 -1
  380. package/dist/index94.cjs +16 -13
  381. package/dist/index94.cjs.map +1 -1
  382. package/dist/index94.js +17 -14
  383. package/dist/index94.js.map +1 -1
  384. package/dist/index95.cjs +80 -2
  385. package/dist/index95.cjs.map +1 -1
  386. package/dist/index95.js +81 -3
  387. package/dist/index95.js.map +1 -1
  388. package/dist/index96.cjs +4 -19
  389. package/dist/index96.cjs.map +1 -1
  390. package/dist/index96.js +5 -20
  391. package/dist/index96.js.map +1 -1
  392. package/dist/index97.cjs +130 -32
  393. package/dist/index97.cjs.map +1 -1
  394. package/dist/index97.js +130 -32
  395. package/dist/index97.js.map +1 -1
  396. package/dist/index98.cjs +45 -43
  397. package/dist/index98.cjs.map +1 -1
  398. package/dist/index98.js +44 -42
  399. package/dist/index98.js.map +1 -1
  400. package/dist/index99.cjs +24 -24
  401. package/dist/index99.cjs.map +1 -1
  402. package/dist/index99.js +23 -23
  403. package/dist/index99.js.map +1 -1
  404. package/dist/style.css +42 -4
  405. package/dist/utils/clippingRect.d.ts +15 -0
  406. package/dist/utils/clippingRect.d.ts.map +1 -0
  407. package/dist/utils/clippingRect.test.d.ts +2 -0
  408. package/dist/utils/clippingRect.test.d.ts.map +1 -0
  409. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index38.js","sources":["../src/composites/MultiSelectDropdown/MultiSelectDropdown.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { ICON_SIZE, SVG_VIEWBOX, SVG_STROKE_WIDTH } from '../../constants';\nimport styles from './MultiSelectDropdown.module.css';\n\nexport interface MultiSelectOption {\n value: string;\n label?: string;\n count?: number;\n}\n\nexport interface MultiSelectDropdownProps {\n /** Label displayed on the trigger button. */\n label: string;\n /** Available options. */\n options: MultiSelectOption[];\n /** Currently selected values (controlled). */\n selected: string[];\n /** Called when the user applies a new selection. */\n onApply: (values: string[], metadata: { selectionMode: 'all' | 'custom' }) => void;\n /** Show loading indicator and disable controls. */\n isLoading?: boolean;\n /** Error message to display in the option list. */\n error?: string | null;\n /** Allow creating options from the search term. */\n allowCustomValues?: boolean;\n /** Override the trigger value label. */\n customTriggerLabel?: string;\n /** Explicit selection mode override. */\n selectionMode?: 'all' | 'custom';\n /** Treat an empty `selected` array as \"all selected\" (opt-in, legacy behavior). */\n emptyMeansAll?: boolean;\n /** What the trigger shows as a summary: the value label ('text') or just the count badge ('count'). */\n triggerSummary?: 'text' | 'count';\n}\n\nconst arraysMatch = (a: string[], b: string[]): boolean => {\n if (a.length !== b.length) return false;\n const set = new Set(b);\n return a.every((v) => set.has(v));\n};\n\nexport const MultiSelectDropdown = ({\n label,\n options,\n selected,\n onApply,\n isLoading = false,\n error = null,\n allowCustomValues = false,\n customTriggerLabel,\n selectionMode,\n emptyMeansAll = false,\n triggerSummary = 'text',\n}: MultiSelectDropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n const normalizedOptions = useMemo<MultiSelectOption[]>(() => {\n const map = new Map<string, MultiSelectOption>();\n options.forEach((opt) => map.set(opt.value, opt));\n if (Array.isArray(selected)) {\n selected.forEach((v) => {\n if (v && !map.has(v)) map.set(v, { value: v });\n });\n }\n return Array.from(map.values());\n }, [options, selected]);\n\n const filteredOptions = useMemo<MultiSelectOption[]>(() => {\n if (!searchTerm.trim()) return normalizedOptions;\n const term = searchTerm.trim().toLowerCase();\n return normalizedOptions.filter((opt) => {\n const lbl = opt.label ?? opt.value;\n return lbl.toLowerCase().includes(term) || opt.value.toLowerCase().includes(term);\n });\n }, [normalizedOptions, searchTerm]);\n\n const allOptionValues = useMemo(() => normalizedOptions.map((o) => o.value), [normalizedOptions]);\n\n const initialSelection = useMemo(() => {\n if (Array.isArray(selected) && selected.length) return Array.from(new Set(selected));\n return emptyMeansAll ? allOptionValues : [];\n }, [selected, allOptionValues, emptyMeansAll]);\n\n const [pendingSelection, setPendingSelection] = useState<string[]>(initialSelection);\n\n const closeAndReset = useCallback(() => {\n setIsOpen(false);\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }, [initialSelection]);\n\n useClickOutside(containerRef, closeAndReset);\n\n useEffect(() => {\n if (isOpen) {\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }\n }, [isOpen, initialSelection]);\n\n useEffect(() => {\n if (!isOpen) setPendingSelection(initialSelection);\n }, [initialSelection, isOpen]);\n\n const handleToggleOption = (value: string) => {\n setPendingSelection((prev) => {\n const unique = Array.from(new Set(prev));\n return unique.includes(value) ? unique.filter((v) => v !== value) : [...unique, value];\n });\n };\n\n const handleSelectAll = () => {\n if (filteredOptions.length === 0) {\n setPendingSelection([]);\n return;\n }\n setPendingSelection(filteredOptions.map((o) => o.value));\n };\n\n const handleClearAll = () => setPendingSelection([]);\n\n const handleApply = () => {\n const unique = Array.from(new Set(pendingSelection));\n const mode: 'all' | 'custom' =\n unique.length === 0 || unique.length === normalizedOptions.length ? 'all' : 'custom';\n onApply(unique, { selectionMode: mode });\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n setPendingSelection(Array.from(new Set(Array.isArray(selected) ? selected : [])));\n setIsOpen(false);\n };\n\n const pendingSet = useMemo(() => new Set(pendingSelection), [pendingSelection]);\n const selectedSet = useMemo(() => new Set(Array.isArray(selected) ? selected : []), [selected]);\n const hasChanges = !arraysMatch(Array.from(pendingSet), Array.from(selectedSet));\n\n const totalOptions = normalizedOptions.length;\n const selectedSize = selectedSet.size;\n const pendingSize = pendingSet.size;\n const isSelectedAll = selectedSize === 0 || selectedSize === totalOptions;\n const isPendingAll = pendingSize === 0 || pendingSize === totalOptions;\n const selectedCountValue = isSelectedAll ? totalOptions : selectedSize;\n const pendingCountValue = isPendingAll ? totalOptions : pendingSize;\n\n const isActiveFilter = selectionMode !== undefined ? selectionMode === 'custom' : !isSelectedAll;\n\n const getSelectedLabel = (): string => {\n if (isSelectedAll) return 'All';\n if (selectedSize === 1) {\n const val = Array.from(selectedSet)[0];\n const opt = normalizedOptions.find((o) => o.value === val);\n return opt?.label || opt?.value || String(selectedCountValue);\n }\n return String(selectedCountValue);\n };\n\n const shouldDisableControls = isLoading || options.length === 0;\n\n const normalizedSearch = searchTerm.trim();\n const canCreateCustom =\n allowCustomValues &&\n normalizedSearch.length > 0 &&\n !normalizedOptions.some((o) => o.value.toLowerCase() === normalizedSearch.toLowerCase());\n\n const handleCreateCustom = () => {\n if (!normalizedSearch) return;\n setPendingSelection((prev) => Array.from(new Set([...prev, normalizedSearch])));\n setSearchTerm('');\n };\n\n const handleClearFilter = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onApply([], { selectionMode: 'all' });\n };\n\n return (\n <div className={styles.root} ref={containerRef}>\n <button\n type=\"button\"\n className={clsx(styles.trigger, { [styles.active]: isOpen })}\n onClick={() => setIsOpen((prev) => !prev)}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <div className={styles.triggerContent}>\n <svg className={styles.chevron} width={ICON_SIZE.MD} height={ICON_SIZE.MD} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <span className={styles.label}>{label}</span>\n <div className={styles.valueGroup}>\n {triggerSummary === 'text' && (\n <span className={styles.value}>{customTriggerLabel || getSelectedLabel()}</span>\n )}\n {(triggerSummary === 'count' ? selectedSize > 0 : isActiveFilter) && (\n <span className={styles.badge}>{selectedCountValue}</span>\n )}\n {isActiveFilter && (\n <div\n role=\"button\"\n tabIndex={0}\n className={styles.clear}\n onClick={handleClearFilter}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClearFilter(e as unknown as React.MouseEvent);\n }\n }}\n aria-label={`Clear ${label} filter`}\n >\n <svg width={ICON_SIZE.SM} height={ICON_SIZE.SM} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </div>\n )}\n </div>\n </div>\n </button>\n\n {isOpen && (\n <div className={styles.panel} role=\"dialog\" aria-label={`${label} filter`}>\n <div className={styles.header}>\n <input\n type=\"search\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}`}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n disabled={shouldDisableControls}\n />\n <div className={styles.headerActions}>\n <button type=\"button\" className={styles.chip} onClick={handleSelectAll} disabled={shouldDisableControls}>\n Select all\n </button>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleClearAll} disabled={pendingSize === 0}>\n Deselect all\n </button>\n </div>\n </div>\n\n <div className={styles.list} role=\"listbox\">\n {isLoading && <p className={styles.status}>Loading options...</p>}\n {!isLoading && error && <p className={clsx(styles.status, styles.statusError)}>{error}</p>}\n {!isLoading && !error && filteredOptions.length === 0 && (\n <p className={styles.status}>No matches</p>\n )}\n {!isLoading &&\n !error &&\n filteredOptions.map((opt) => {\n const checked = pendingSet.has(opt.value);\n return (\n <label key={opt.value} className={styles.option}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => handleToggleOption(opt.value)}\n aria-checked={checked}\n />\n <span className={styles.optionLabel}>\n {opt.label ?? opt.value}\n {opt.count !== undefined && (\n <span className={styles.optionCount}>{opt.count}</span>\n )}\n </span>\n </label>\n );\n })}\n {!isLoading && !error && canCreateCustom && (\n <button type=\"button\" className={styles.create} onClick={handleCreateCustom}>\n Use &quot;{normalizedSearch}&quot;\n </button>\n )}\n </div>\n\n <div className={styles.footer}>\n <span className={styles.selection}>\n {isPendingAll ? 'All selected' : `${pendingCountValue} selected`}\n {hasChanges && (\n <span className={styles.selectionDelta}>\n ({pendingCountValue - selectedCountValue >= 0 ? '+' : ''}\n {pendingCountValue - selectedCountValue})\n </span>\n )}\n </span>\n <div className={styles.footerActions}>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleCancel}>\n Cancel\n </button>\n <button type=\"button\" className={styles.chip} onClick={handleApply} disabled={!hasChanges}>\n Apply\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index38.js","sources":["../src/composites/MultiSelectDropdown/MultiSelectDropdown.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { usePanelPlacement } from '../../hooks/usePanelPlacement';\nimport { ICON_SIZE, SVG_VIEWBOX, SVG_STROKE_WIDTH } from '../../constants';\nimport styles from './MultiSelectDropdown.module.css';\n\nexport interface MultiSelectOption {\n value: string;\n label?: string;\n count?: number;\n}\n\nexport interface MultiSelectDropdownProps {\n /** Label displayed on the trigger button. */\n label: string;\n /** Available options. */\n options: MultiSelectOption[];\n /** Currently selected values (controlled). */\n selected: string[];\n /** Called when the user applies a new selection. */\n onApply: (values: string[], metadata: { selectionMode: 'all' | 'custom' }) => void;\n /** Show loading indicator and disable controls. */\n isLoading?: boolean;\n /** Error message to display in the option list. */\n error?: string | null;\n /** Allow creating options from the search term. */\n allowCustomValues?: boolean;\n /** Override the trigger value label. */\n customTriggerLabel?: string;\n /** Explicit selection mode override. */\n selectionMode?: 'all' | 'custom';\n /** Treat an empty `selected` array as \"all selected\" (opt-in, legacy behavior). */\n emptyMeansAll?: boolean;\n /** What the trigger shows as a summary: the value label ('text') or just the count badge ('count'). */\n triggerSummary?: 'text' | 'count';\n}\n\nconst arraysMatch = (a: string[], b: string[]): boolean => {\n if (a.length !== b.length) return false;\n const set = new Set(b);\n return a.every((v) => set.has(v));\n};\n\nexport const MultiSelectDropdown = ({\n label,\n options,\n selected,\n onApply,\n isLoading = false,\n error = null,\n allowCustomValues = false,\n customTriggerLabel,\n selectionMode,\n emptyMeansAll = false,\n triggerSummary = 'text',\n}: MultiSelectDropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const placement = usePanelPlacement(containerRef, panelRef, isOpen);\n\n const normalizedOptions = useMemo<MultiSelectOption[]>(() => {\n const map = new Map<string, MultiSelectOption>();\n options.forEach((opt) => map.set(opt.value, opt));\n if (Array.isArray(selected)) {\n selected.forEach((v) => {\n if (v && !map.has(v)) map.set(v, { value: v });\n });\n }\n return Array.from(map.values());\n }, [options, selected]);\n\n const filteredOptions = useMemo<MultiSelectOption[]>(() => {\n if (!searchTerm.trim()) return normalizedOptions;\n const term = searchTerm.trim().toLowerCase();\n return normalizedOptions.filter((opt) => {\n const lbl = opt.label ?? opt.value;\n return lbl.toLowerCase().includes(term) || opt.value.toLowerCase().includes(term);\n });\n }, [normalizedOptions, searchTerm]);\n\n const allOptionValues = useMemo(() => normalizedOptions.map((o) => o.value), [normalizedOptions]);\n\n const initialSelection = useMemo(() => {\n if (Array.isArray(selected) && selected.length) return Array.from(new Set(selected));\n return emptyMeansAll ? allOptionValues : [];\n }, [selected, allOptionValues, emptyMeansAll]);\n\n const [pendingSelection, setPendingSelection] = useState<string[]>(initialSelection);\n\n const closeAndReset = useCallback(() => {\n setIsOpen(false);\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }, [initialSelection]);\n\n useClickOutside(containerRef, closeAndReset);\n\n useEffect(() => {\n if (isOpen) {\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }\n }, [isOpen, initialSelection]);\n\n useEffect(() => {\n if (!isOpen) setPendingSelection(initialSelection);\n }, [initialSelection, isOpen]);\n\n const handleToggleOption = (value: string) => {\n setPendingSelection((prev) => {\n const unique = Array.from(new Set(prev));\n return unique.includes(value) ? unique.filter((v) => v !== value) : [...unique, value];\n });\n };\n\n const handleSelectAll = () => {\n if (filteredOptions.length === 0) {\n setPendingSelection([]);\n return;\n }\n setPendingSelection(filteredOptions.map((o) => o.value));\n };\n\n const handleClearAll = () => setPendingSelection([]);\n\n const handleApply = () => {\n const unique = Array.from(new Set(pendingSelection));\n const mode: 'all' | 'custom' =\n unique.length === 0 || unique.length === normalizedOptions.length ? 'all' : 'custom';\n onApply(unique, { selectionMode: mode });\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n setPendingSelection(Array.from(new Set(Array.isArray(selected) ? selected : [])));\n setIsOpen(false);\n };\n\n const pendingSet = useMemo(() => new Set(pendingSelection), [pendingSelection]);\n const selectedSet = useMemo(() => new Set(Array.isArray(selected) ? selected : []), [selected]);\n const hasChanges = !arraysMatch(Array.from(pendingSet), Array.from(selectedSet));\n\n const totalOptions = normalizedOptions.length;\n const selectedSize = selectedSet.size;\n const pendingSize = pendingSet.size;\n const isSelectedAll = selectedSize === 0 || selectedSize === totalOptions;\n const isPendingAll = pendingSize === 0 || pendingSize === totalOptions;\n const selectedCountValue = isSelectedAll ? totalOptions : selectedSize;\n const pendingCountValue = isPendingAll ? totalOptions : pendingSize;\n\n const isActiveFilter = selectionMode !== undefined ? selectionMode === 'custom' : !isSelectedAll;\n\n const getSelectedLabel = (): string => {\n if (isSelectedAll) return 'All';\n if (selectedSize === 1) {\n const val = Array.from(selectedSet)[0];\n const opt = normalizedOptions.find((o) => o.value === val);\n return opt?.label || opt?.value || String(selectedCountValue);\n }\n return String(selectedCountValue);\n };\n\n const shouldDisableControls = isLoading || options.length === 0;\n\n const normalizedSearch = searchTerm.trim();\n const canCreateCustom =\n allowCustomValues &&\n normalizedSearch.length > 0 &&\n !normalizedOptions.some((o) => o.value.toLowerCase() === normalizedSearch.toLowerCase());\n\n const handleCreateCustom = () => {\n if (!normalizedSearch) return;\n setPendingSelection((prev) => Array.from(new Set([...prev, normalizedSearch])));\n setSearchTerm('');\n };\n\n const handleClearFilter = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onApply([], { selectionMode: 'all' });\n };\n\n return (\n <div className={styles.root} ref={containerRef}>\n <button\n type=\"button\"\n className={clsx(styles.trigger, { [styles.active]: isOpen })}\n onClick={() => setIsOpen((prev) => !prev)}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <div className={styles.triggerContent}>\n <svg\n className={styles.chevron}\n width={ICON_SIZE.MD}\n height={ICON_SIZE.MD}\n viewBox={SVG_VIEWBOX}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={SVG_STROKE_WIDTH}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <span className={styles.label}>{label}</span>\n <div className={styles.valueGroup}>\n {triggerSummary === 'text' && (\n <span className={styles.value}>{customTriggerLabel || getSelectedLabel()}</span>\n )}\n {(triggerSummary === 'count' ? selectedSize > 0 : isActiveFilter) && (\n <span className={styles.badge}>{selectedCountValue}</span>\n )}\n {isActiveFilter && (\n <div\n role=\"button\"\n tabIndex={0}\n className={styles.clear}\n onClick={handleClearFilter}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClearFilter(e as unknown as React.MouseEvent);\n }\n }}\n aria-label={`Clear ${label} filter`}\n >\n <svg\n width={ICON_SIZE.SM}\n height={ICON_SIZE.SM}\n viewBox={SVG_VIEWBOX}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={SVG_STROKE_WIDTH}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </div>\n )}\n </div>\n </div>\n </button>\n\n {isOpen && (\n <div\n ref={panelRef}\n className={styles.panel}\n data-align={placement.align}\n style={placement.style}\n role=\"dialog\"\n aria-label={`${label} filter`}\n >\n <div className={styles.header}>\n <input\n type=\"search\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}`}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n disabled={shouldDisableControls}\n />\n <div className={styles.headerActions}>\n <button\n type=\"button\"\n className={styles.chip}\n onClick={handleSelectAll}\n disabled={shouldDisableControls}\n >\n Select all\n </button>\n <button\n type=\"button\"\n className={clsx(styles.chip, styles.chipGhost)}\n onClick={handleClearAll}\n disabled={pendingSize === 0}\n >\n Deselect all\n </button>\n </div>\n </div>\n\n <div className={styles.list} role=\"listbox\">\n {isLoading && <p className={styles.status}>Loading options...</p>}\n {!isLoading && error && (\n <p className={clsx(styles.status, styles.statusError)}>{error}</p>\n )}\n {!isLoading && !error && filteredOptions.length === 0 && (\n <p className={styles.status}>No matches</p>\n )}\n {!isLoading &&\n !error &&\n filteredOptions.map((opt) => {\n const checked = pendingSet.has(opt.value);\n return (\n <label key={opt.value} className={styles.option}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => handleToggleOption(opt.value)}\n aria-checked={checked}\n />\n <span className={styles.optionLabel}>\n {opt.label ?? opt.value}\n {opt.count !== undefined && (\n <span className={styles.optionCount}>{opt.count}</span>\n )}\n </span>\n </label>\n );\n })}\n {!isLoading && !error && canCreateCustom && (\n <button type=\"button\" className={styles.create} onClick={handleCreateCustom}>\n Use &quot;{normalizedSearch}&quot;\n </button>\n )}\n </div>\n\n <div className={styles.footer}>\n <span className={styles.selection}>\n {isPendingAll ? 'All selected' : `${pendingCountValue} selected`}\n {hasChanges && (\n <span className={styles.selectionDelta}>\n ({pendingCountValue - selectedCountValue >= 0 ? '+' : ''}\n {pendingCountValue - selectedCountValue})\n </span>\n )}\n </span>\n <div className={styles.footerActions}>\n <button\n type=\"button\"\n className={clsx(styles.chip, styles.chipGhost)}\n onClick={handleCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className={styles.chip}\n onClick={handleApply}\n disabled={!hasChanges}\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
package/dist/index39.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index59.cjs");
6
- const NavItem_module = require("./index66.cjs");
6
+ const NavItem_module = require("./index71.cjs");
7
7
  const NavItem = react.forwardRef(
8
8
  ({ icon, label, active = false, badge, collapsed = false, disabled = false, href, onClick, className }, ref) => {
9
9
  const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
package/dist/index39.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index59.js";
4
- import styles from "./index66.js";
4
+ import styles from "./index71.js";
5
5
  const NavItem = forwardRef(
6
6
  ({ icon, label, active = false, badge, collapsed = false, disabled = false, href, onClick, className }, ref) => {
7
7
  const content = /* @__PURE__ */ jsxs(Fragment, { children: [
package/dist/index40.cjs CHANGED
@@ -3,8 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index59.cjs");
6
- const constants = require("./index64.cjs");
7
- const Pagination_module = require("./index65.cjs");
6
+ const constants = require("./index62.cjs");
7
+ const Pagination_module = require("./index70.cjs");
8
8
  function range(start, end) {
9
9
  const out = [];
10
10
  for (let page = start; page <= end; page += 1) out.push(page);
package/dist/index40.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index59.js";
4
- import { PAGINATION, SVG_STROKE_WIDTH, SVG_VIEWBOX, ICON_SIZE } from "./index64.js";
5
- import styles from "./index65.js";
4
+ import { PAGINATION, SVG_STROKE_WIDTH, SVG_VIEWBOX, ICON_SIZE } from "./index62.js";
5
+ import styles from "./index70.js";
6
6
  function range(start, end) {
7
7
  const out = [];
8
8
  for (let page = start; page <= end; page += 1) out.push(page);
package/dist/index41.cjs CHANGED
@@ -3,8 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index59.cjs");
6
- const constants = require("./index64.cjs");
7
- const RangeSlider_module = require("./index70.cjs");
6
+ const constants = require("./index62.cjs");
7
+ const RangeSlider_module = require("./index99.cjs");
8
8
  const buildTicks = (min, max, step) => {
9
9
  const count = Math.round((max - min) / step);
10
10
  return Array.from({ length: count + 1 }, (_, i) => min + i * step);
package/dist/index41.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index59.js";
4
- import { RANGE_SLIDER } from "./index64.js";
5
- import styles from "./index70.js";
4
+ import { RANGE_SLIDER } from "./index62.js";
5
+ import styles from "./index99.js";
6
6
  const buildTicks = (min, max, step) => {
7
7
  const count = Math.round((max - min) / step);
8
8
  return Array.from({ length: count + 1 }, (_, i) => min + i * step);
package/dist/index42.cjs CHANGED
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
- const constants = require("./index64.cjs");
6
- const ResizableSplitPanel_module = require("./index124.cjs");
5
+ const constants = require("./index62.cjs");
6
+ const ResizableSplitPanel_module = require("./index83.cjs");
7
7
  const FULL_PERCENT = 100;
8
8
  const ResizableSplitPanel = ({
9
9
  leftPanel,
package/dist/index42.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useState, useRef, useCallback, useEffect } from "react";
3
- import { KEYBOARD_STEP } from "./index64.js";
4
- import styles from "./index124.js";
3
+ import { KEYBOARD_STEP } from "./index62.js";
4
+ import styles from "./index83.js";
5
5
  const FULL_PERCENT = 100;
6
6
  const ResizableSplitPanel = ({
7
7
  leftPanel,
package/dist/index43.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index59.cjs");
6
- const Row_module = require("./index116.cjs");
6
+ const Row_module = require("./index81.cjs");
7
7
  const gapClass = {
8
8
  none: Row_module.default.gapNone,
9
9
  "2xs": Row_module.default.gap2xs,
package/dist/index43.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index59.js";
4
- import styles from "./index116.js";
4
+ import styles from "./index81.js";
5
5
  const gapClass = {
6
6
  none: styles.gapNone,
7
7
  "2xs": styles.gap2xs,
package/dist/index44.cjs CHANGED
@@ -4,8 +4,8 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const ReactECharts = require("echarts-for-react");
6
6
  const clsx = require("./index59.cjs");
7
- const constants = require("./index64.cjs");
8
- const SankeyChartCard_module = require("./index68.cjs");
7
+ const constants = require("./index62.cjs");
8
+ const SankeyChartCard_module = require("./index122.cjs");
9
9
  const COLOR_METRIC_OPTIONS = [
10
10
  { value: "deviation", label: "Deviation" },
11
11
  { value: "severity", label: "Severity" },
package/dist/index44.js CHANGED
@@ -2,8 +2,8 @@ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useMemo } from "react";
3
3
  import ReactECharts from "echarts-for-react";
4
4
  import { clsx } from "./index59.js";
5
- import { MAX_SANKEY_NODES, CHART_COLORS } from "./index64.js";
6
- import styles from "./index68.js";
5
+ import { MAX_SANKEY_NODES, CHART_COLORS } from "./index62.js";
6
+ import styles from "./index122.js";
7
7
  const COLOR_METRIC_OPTIONS = [
8
8
  { value: "deviation", label: "Deviation" },
9
9
  { value: "severity", label: "Severity" },
package/dist/index45.cjs CHANGED
@@ -4,10 +4,10 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const ReactECharts = require("echarts-for-react");
6
6
  const clsx = require("./index59.cjs");
7
- const foldPoints = require("./index75.cjs");
8
- const buildScatterOption = require("./index76.cjs");
9
- const constants = require("./index64.cjs");
10
- const ScatterChartCard_module = require("./index77.cjs");
7
+ const foldPoints = require("./index126.cjs");
8
+ const buildScatterOption = require("./index127.cjs");
9
+ const constants = require("./index62.cjs");
10
+ const ScatterChartCard_module = require("./index128.cjs");
11
11
  const SOURCE_INDEX_DIM = 3;
12
12
  const buildAriaLabel = (title, xLabel, yLabel) => xLabel && yLabel ? `${title}: scatter plot of ${yLabel} against ${xLabel}` : `${title}: scatter plot`;
13
13
  const ScatterChartCard = ({
package/dist/index45.js CHANGED
@@ -2,10 +2,10 @@ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useMemo, useEffect } from "react";
3
3
  import ReactECharts from "echarts-for-react";
4
4
  import { clsx } from "./index59.js";
5
- import { foldPoints } from "./index75.js";
6
- import { buildScatterOption } from "./index76.js";
7
- import { SCATTER } from "./index64.js";
8
- import styles from "./index77.js";
5
+ import { foldPoints } from "./index126.js";
6
+ import { buildScatterOption } from "./index127.js";
7
+ import { SCATTER } from "./index62.js";
8
+ import styles from "./index128.js";
9
9
  const SOURCE_INDEX_DIM = 3;
10
10
  const buildAriaLabel = (title, xLabel, yLabel) => xLabel && yLabel ? `${title}: scatter plot of ${yLabel} against ${xLabel}` : `${title}: scatter plot`;
11
11
  const ScatterChartCard = ({
package/dist/index46.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index59.cjs");
6
- const SegmentedControl_module = require("./index61.cjs");
6
+ const SegmentedControl_module = require("./index60.cjs");
7
7
  function nextEnabledIndex(options, from, step) {
8
8
  const count = options.length;
9
9
  for (let i = 1; i <= count; i += 1) {
package/dist/index46.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { forwardRef, useRef } from "react";
3
3
  import { clsx } from "./index59.js";
4
- import styles from "./index61.js";
4
+ import styles from "./index60.js";
5
5
  function nextEnabledIndex(options, from, step) {
6
6
  const count = options.length;
7
7
  for (let i = 1; i <= count; i += 1) {
package/dist/index47.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index59.cjs");
6
- const Select_module = require("./index95.cjs");
6
+ const Select_module = require("./index65.cjs");
7
7
  const Select = react.forwardRef(
8
8
  ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("select", { ref, className: clsx.clsx(Select_module.default.root, className), ...props, children })
9
9
  );
package/dist/index47.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index59.js";
4
- import styles from "./index95.js";
4
+ import styles from "./index65.js";
5
5
  const Select = forwardRef(
6
6
  ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx("select", { ref, className: clsx(styles.root, className), ...props, children })
7
7
  );
package/dist/index48.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const clsx = require("./index59.cjs");
5
- const SettingsLayout_module = require("./index114.cjs");
5
+ const SettingsLayout_module = require("./index94.cjs");
6
6
  const SettingsLayout = ({
7
7
  sidebar,
8
8
  children,
package/dist/index48.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { clsx } from "./index59.js";
3
- import styles from "./index114.js";
3
+ import styles from "./index94.js";
4
4
  const SettingsLayout = ({
5
5
  sidebar,
6
6
  children,
package/dist/index49.cjs CHANGED
@@ -3,8 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index59.cjs");
6
- const constants = require("./index64.cjs");
7
- const Sidebar_module = require("./index112.cjs");
6
+ const constants = require("./index62.cjs");
7
+ const Sidebar_module = require("./index86.cjs");
8
8
  const SidebarContext = react.createContext({ isCollapsed: false });
9
9
  const useSidebarContext = () => react.useContext(SidebarContext);
10
10
  const SidebarSection = ({
package/dist/index49.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useContext, useState, useId, createContext } from "react";
3
3
  import { clsx } from "./index59.js";
4
- import { SIDEBAR } from "./index64.js";
5
- import styles from "./index112.js";
4
+ import { SIDEBAR } from "./index62.js";
5
+ import styles from "./index86.js";
6
6
  const SidebarContext = createContext({ isCollapsed: false });
7
7
  const useSidebarContext = () => useContext(SidebarContext);
8
8
  const SidebarSection = ({
package/dist/index50.cjs CHANGED
@@ -4,9 +4,10 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index59.cjs");
6
6
  const useClickOutside = require("./index4.cjs");
7
+ const usePanelPlacement = require("./index76.cjs");
7
8
  const useEscapeKey = require("./index5.cjs");
8
- const constants = require("./index64.cjs");
9
- const SingleSelectDropdown_module = require("./index117.cjs");
9
+ const constants = require("./index62.cjs");
10
+ const SingleSelectDropdown_module = require("./index125.cjs");
10
11
  const SingleSelectDropdown = ({
11
12
  label,
12
13
  options,
@@ -21,6 +22,7 @@ const SingleSelectDropdown = ({
21
22
  const [focusedIndex, setFocusedIndex] = react.useState(-1);
22
23
  const containerRef = react.useRef(null);
23
24
  const listRef = react.useRef(null);
25
+ const placement = usePanelPlacement.usePanelPlacement(containerRef, listRef, isOpen);
24
26
  const close = react.useCallback(() => {
25
27
  setIsOpen(false);
26
28
  setSearchTerm("");
@@ -74,7 +76,21 @@ const SingleSelectDropdown = ({
74
76
  "aria-expanded": isOpen,
75
77
  "aria-haspopup": "listbox",
76
78
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: SingleSelectDropdown_module.default.triggerContent, children: [
77
- /* @__PURE__ */ jsxRuntime.jsx("svg", { className: SingleSelectDropdown_module.default.chevron, width: constants.ICON_SIZE.MD, height: constants.ICON_SIZE.MD, viewBox: constants.SVG_VIEWBOX, fill: "none", stroke: "currentColor", strokeWidth: constants.SVG_STROKE_WIDTH, strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" }) }),
79
+ /* @__PURE__ */ jsxRuntime.jsx(
80
+ "svg",
81
+ {
82
+ className: SingleSelectDropdown_module.default.chevron,
83
+ width: constants.ICON_SIZE.MD,
84
+ height: constants.ICON_SIZE.MD,
85
+ viewBox: constants.SVG_VIEWBOX,
86
+ fill: "none",
87
+ stroke: "currentColor",
88
+ strokeWidth: constants.SVG_STROKE_WIDTH,
89
+ strokeLinecap: "round",
90
+ strokeLinejoin: "round",
91
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" })
92
+ }
93
+ ),
78
94
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: SingleSelectDropdown_module.default.label, children: label }),
79
95
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: SingleSelectDropdown_module.default.value, children: displayLabel }),
80
96
  showClear && /* @__PURE__ */ jsxRuntime.jsx(
@@ -91,56 +107,79 @@ const SingleSelectDropdown = ({
91
107
  handleClear(e);
92
108
  }
93
109
  },
94
- children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: constants.ICON_SIZE.SM, height: constants.ICON_SIZE.SM, viewBox: constants.SVG_VIEWBOX, fill: "none", stroke: "currentColor", strokeWidth: constants.SVG_STROKE_WIDTH, strokeLinecap: "round", strokeLinejoin: "round", children: [
95
- /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
96
- /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
97
- ] })
110
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
111
+ "svg",
112
+ {
113
+ width: constants.ICON_SIZE.SM,
114
+ height: constants.ICON_SIZE.SM,
115
+ viewBox: constants.SVG_VIEWBOX,
116
+ fill: "none",
117
+ stroke: "currentColor",
118
+ strokeWidth: constants.SVG_STROKE_WIDTH,
119
+ strokeLinecap: "round",
120
+ strokeLinejoin: "round",
121
+ children: [
122
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
123
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
124
+ ]
125
+ }
126
+ )
98
127
  }
99
128
  )
100
129
  ] })
101
130
  }
102
131
  ),
103
- isOpen && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: SingleSelectDropdown_module.default.panel, role: "listbox", ref: listRef, children: [
104
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: SingleSelectDropdown_module.default.searchContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
105
- "input",
106
- {
107
- type: "search",
108
- className: SingleSelectDropdown_module.default.search,
109
- placeholder: `Search ${label.toLowerCase()}`,
110
- value: searchTerm,
111
- onChange: (e) => {
112
- setSearchTerm(e.target.value);
113
- setFocusedIndex(-1);
114
- },
115
- onClick: (e) => e.stopPropagation()
116
- }
117
- ) }),
118
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: SingleSelectDropdown_module.default.list, children: [
119
- filteredOptions.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: SingleSelectDropdown_module.default.noResults, children: "No matches found" }),
120
- filteredOptions.map((opt, i) => {
121
- const isSelected = opt.value === selected;
122
- const isFocused = i === focusedIndex;
123
- return /* @__PURE__ */ jsxRuntime.jsx(
124
- "button",
132
+ isOpen && /* @__PURE__ */ jsxRuntime.jsxs(
133
+ "div",
134
+ {
135
+ className: SingleSelectDropdown_module.default.panel,
136
+ role: "listbox",
137
+ ref: listRef,
138
+ "data-align": placement.align,
139
+ style: placement.style,
140
+ children: [
141
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: SingleSelectDropdown_module.default.searchContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
142
+ "input",
125
143
  {
126
- type: "button",
127
- className: clsx.clsx(SingleSelectDropdown_module.default.option, {
128
- [SingleSelectDropdown_module.default.selected]: isSelected,
129
- [SingleSelectDropdown_module.default.focused]: isFocused
130
- }),
131
- onClick: () => handleSelect(opt.value),
132
- role: "option",
133
- "aria-selected": isSelected,
134
- children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: SingleSelectDropdown_module.default.optionLabel, children: [
135
- opt.label ?? opt.value,
136
- opt.count !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: SingleSelectDropdown_module.default.optionCount, children: opt.count })
137
- ] })
138
- },
139
- opt.value
140
- );
141
- })
142
- ] })
143
- ] })
144
+ type: "search",
145
+ className: SingleSelectDropdown_module.default.search,
146
+ placeholder: `Search ${label.toLowerCase()}`,
147
+ value: searchTerm,
148
+ onChange: (e) => {
149
+ setSearchTerm(e.target.value);
150
+ setFocusedIndex(-1);
151
+ },
152
+ onClick: (e) => e.stopPropagation()
153
+ }
154
+ ) }),
155
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: SingleSelectDropdown_module.default.list, children: [
156
+ filteredOptions.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: SingleSelectDropdown_module.default.noResults, children: "No matches found" }),
157
+ filteredOptions.map((opt, i) => {
158
+ const isSelected = opt.value === selected;
159
+ const isFocused = i === focusedIndex;
160
+ return /* @__PURE__ */ jsxRuntime.jsx(
161
+ "button",
162
+ {
163
+ type: "button",
164
+ className: clsx.clsx(SingleSelectDropdown_module.default.option, {
165
+ [SingleSelectDropdown_module.default.selected]: isSelected,
166
+ [SingleSelectDropdown_module.default.focused]: isFocused
167
+ }),
168
+ onClick: () => handleSelect(opt.value),
169
+ role: "option",
170
+ "aria-selected": isSelected,
171
+ children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: SingleSelectDropdown_module.default.optionLabel, children: [
172
+ opt.label ?? opt.value,
173
+ opt.count !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: SingleSelectDropdown_module.default.optionCount, children: opt.count })
174
+ ] })
175
+ },
176
+ opt.value
177
+ );
178
+ })
179
+ ] })
180
+ ]
181
+ }
182
+ )
144
183
  ] });
145
184
  };
146
185
  exports.SingleSelectDropdown = SingleSelectDropdown;
@@ -1 +1 @@
1
- {"version":3,"file":"index50.cjs","sources":["../src/composites/SingleSelectDropdown/SingleSelectDropdown.tsx"],"sourcesContent":["import { useState, useRef, useMemo, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\nimport { ICON_SIZE, SVG_VIEWBOX, SVG_STROKE_WIDTH } from '../../constants';\nimport styles from './SingleSelectDropdown.module.css';\n\nexport interface SingleSelectOption {\n value: string;\n label?: string;\n count?: number;\n}\n\nexport interface SingleSelectDropdownProps {\n /** Label displayed on the trigger. */\n label: string;\n /** Available options. */\n options: SingleSelectOption[];\n /** Currently selected value (controlled). `null` means no selection. */\n selected: string | null;\n /** Called when the user selects an option. */\n onSelect: (value: string) => void;\n /** Override the trigger value label. */\n customTriggerLabel?: string;\n /** Called when the user clears the selection. */\n onClear?: () => void;\n /** Show clear button when a value is selected. */\n showClearButton?: boolean;\n}\n\nexport const SingleSelectDropdown = ({\n label,\n options,\n selected,\n onSelect,\n customTriggerLabel,\n onClear,\n showClearButton = false,\n}: SingleSelectDropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearchTerm('');\n setFocusedIndex(-1);\n }, []);\n\n useClickOutside(containerRef, close);\n useEscapeKey(close, isOpen);\n\n const filteredOptions = useMemo(() => {\n if (!searchTerm.trim()) return options;\n const term = searchTerm.trim().toLowerCase();\n return options.filter((opt) => {\n const lbl = opt.label ?? opt.value;\n return lbl.toLowerCase().includes(term) || opt.value.toLowerCase().includes(term);\n });\n }, [options, searchTerm]);\n\n const handleSelect = (value: string) => {\n onSelect(value);\n close();\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onClear?.();\n close();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isOpen) return;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) => Math.min(prev + 1, filteredOptions.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0 && focusedIndex < filteredOptions.length) {\n e.preventDefault();\n handleSelect(filteredOptions[focusedIndex].value);\n }\n };\n\n const selectedOption = options.find((o) => o.value === selected);\n const displayLabel = customTriggerLabel || selectedOption?.label || selectedOption?.value || 'Select';\n const showClear = showClearButton && selected !== null;\n\n return (\n <div className={styles.root} ref={containerRef} onKeyDown={handleKeyDown}>\n <button\n type=\"button\"\n className={clsx(styles.trigger, { [styles.active]: isOpen })}\n onClick={() => {\n setIsOpen((prev) => !prev);\n setFocusedIndex(-1);\n }}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <div className={styles.triggerContent}>\n <svg className={styles.chevron} width={ICON_SIZE.MD} height={ICON_SIZE.MD} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <span className={styles.label}>{label}</span>\n <span className={styles.value}>{displayLabel}</span>\n {showClear && (\n <span\n className={styles.clear}\n onClick={handleClear}\n role=\"button\"\n tabIndex={0}\n aria-label={`Clear ${label}`}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleClear(e as unknown as React.MouseEvent); } }}\n >\n <svg width={ICON_SIZE.SM} height={ICON_SIZE.SM} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </span>\n )}\n </div>\n </button>\n\n {isOpen && (\n <div className={styles.panel} role=\"listbox\" ref={listRef}>\n <div className={styles.searchContainer}>\n <input\n type=\"search\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}`}\n value={searchTerm}\n onChange={(e) => {\n setSearchTerm(e.target.value);\n setFocusedIndex(-1);\n }}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n <div className={styles.list}>\n {filteredOptions.length === 0 && (\n <div className={styles.noResults}>No matches found</div>\n )}\n {filteredOptions.map((opt, i) => {\n const isSelected = opt.value === selected;\n const isFocused = i === focusedIndex;\n return (\n <button\n key={opt.value}\n type=\"button\"\n className={clsx(styles.option, {\n [styles.selected]: isSelected,\n [styles.focused]: isFocused,\n })}\n onClick={() => handleSelect(opt.value)}\n role=\"option\"\n aria-selected={isSelected}\n >\n <span className={styles.optionLabel}>\n {opt.label ?? opt.value}\n {opt.count !== undefined && (\n <span className={styles.optionCount}>{opt.count}</span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useState","useRef","useCallback","useClickOutside","useEscapeKey","useMemo","jsxs","styles","jsx","clsx","ICON_SIZE","SVG_VIEWBOX","SVG_STROKE_WIDTH"],"mappings":"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"}
1
+ {"version":3,"file":"index50.cjs","sources":["../src/composites/SingleSelectDropdown/SingleSelectDropdown.tsx"],"sourcesContent":["import { useState, useRef, useMemo, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { usePanelPlacement } from '../../hooks/usePanelPlacement';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\nimport { ICON_SIZE, SVG_VIEWBOX, SVG_STROKE_WIDTH } from '../../constants';\nimport styles from './SingleSelectDropdown.module.css';\n\nexport interface SingleSelectOption {\n value: string;\n label?: string;\n count?: number;\n}\n\nexport interface SingleSelectDropdownProps {\n /** Label displayed on the trigger. */\n label: string;\n /** Available options. */\n options: SingleSelectOption[];\n /** Currently selected value (controlled). `null` means no selection. */\n selected: string | null;\n /** Called when the user selects an option. */\n onSelect: (value: string) => void;\n /** Override the trigger value label. */\n customTriggerLabel?: string;\n /** Called when the user clears the selection. */\n onClear?: () => void;\n /** Show clear button when a value is selected. */\n showClearButton?: boolean;\n}\n\nexport const SingleSelectDropdown = ({\n label,\n options,\n selected,\n onSelect,\n customTriggerLabel,\n onClear,\n showClearButton = false,\n}: SingleSelectDropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const placement = usePanelPlacement(containerRef, listRef, isOpen);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearchTerm('');\n setFocusedIndex(-1);\n }, []);\n\n useClickOutside(containerRef, close);\n useEscapeKey(close, isOpen);\n\n const filteredOptions = useMemo(() => {\n if (!searchTerm.trim()) return options;\n const term = searchTerm.trim().toLowerCase();\n return options.filter((opt) => {\n const lbl = opt.label ?? opt.value;\n return lbl.toLowerCase().includes(term) || opt.value.toLowerCase().includes(term);\n });\n }, [options, searchTerm]);\n\n const handleSelect = (value: string) => {\n onSelect(value);\n close();\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onClear?.();\n close();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isOpen) return;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) => Math.min(prev + 1, filteredOptions.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0 && focusedIndex < filteredOptions.length) {\n e.preventDefault();\n handleSelect(filteredOptions[focusedIndex].value);\n }\n };\n\n const selectedOption = options.find((o) => o.value === selected);\n const displayLabel =\n customTriggerLabel || selectedOption?.label || selectedOption?.value || 'Select';\n const showClear = showClearButton && selected !== null;\n\n return (\n <div className={styles.root} ref={containerRef} onKeyDown={handleKeyDown}>\n <button\n type=\"button\"\n className={clsx(styles.trigger, { [styles.active]: isOpen })}\n onClick={() => {\n setIsOpen((prev) => !prev);\n setFocusedIndex(-1);\n }}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <div className={styles.triggerContent}>\n <svg\n className={styles.chevron}\n width={ICON_SIZE.MD}\n height={ICON_SIZE.MD}\n viewBox={SVG_VIEWBOX}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={SVG_STROKE_WIDTH}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <span className={styles.label}>{label}</span>\n <span className={styles.value}>{displayLabel}</span>\n {showClear && (\n <span\n className={styles.clear}\n onClick={handleClear}\n role=\"button\"\n tabIndex={0}\n aria-label={`Clear ${label}`}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClear(e as unknown as React.MouseEvent);\n }\n }}\n >\n <svg\n width={ICON_SIZE.SM}\n height={ICON_SIZE.SM}\n viewBox={SVG_VIEWBOX}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={SVG_STROKE_WIDTH}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </span>\n )}\n </div>\n </button>\n\n {isOpen && (\n <div\n className={styles.panel}\n role=\"listbox\"\n ref={listRef}\n data-align={placement.align}\n style={placement.style}\n >\n <div className={styles.searchContainer}>\n <input\n type=\"search\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}`}\n value={searchTerm}\n onChange={(e) => {\n setSearchTerm(e.target.value);\n setFocusedIndex(-1);\n }}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n <div className={styles.list}>\n {filteredOptions.length === 0 && (\n <div className={styles.noResults}>No matches found</div>\n )}\n {filteredOptions.map((opt, i) => {\n const isSelected = opt.value === selected;\n const isFocused = i === focusedIndex;\n return (\n <button\n key={opt.value}\n type=\"button\"\n className={clsx(styles.option, {\n [styles.selected]: isSelected,\n [styles.focused]: isFocused,\n })}\n onClick={() => handleSelect(opt.value)}\n role=\"option\"\n aria-selected={isSelected}\n >\n <span className={styles.optionLabel}>\n {opt.label ?? opt.value}\n {opt.count !== undefined && (\n <span className={styles.optionCount}>{opt.count}</span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useState","useRef","usePanelPlacement","useCallback","useClickOutside","useEscapeKey","useMemo","jsxs","styles","jsx","clsx","ICON_SIZE","SVG_VIEWBOX","SVG_STROKE_WIDTH"],"mappings":"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"}