@ayasofyazilim/ui 0.0.0 → 0.0.2

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 (667) hide show
  1. package/dist/aria/index.js +2 -0
  2. package/dist/aria/index.js.map +1 -0
  3. package/dist/aria/number-field.js +46 -0
  4. package/dist/aria/number-field.js.map +1 -0
  5. package/dist/components/accordion.js +66 -0
  6. package/dist/components/accordion.js.map +1 -0
  7. package/dist/components/alert-dialog.js +148 -0
  8. package/dist/components/alert-dialog.js.map +1 -0
  9. package/dist/components/alert.js +69 -0
  10. package/dist/components/alert.js.map +1 -0
  11. package/dist/components/aspect-ratio.js +12 -0
  12. package/dist/components/aspect-ratio.js.map +1 -0
  13. package/dist/components/avatar.js +55 -0
  14. package/dist/components/avatar.js.map +1 -0
  15. package/dist/components/badge.js +62 -0
  16. package/dist/components/badge.js.map +1 -0
  17. package/dist/components/breadcrumb.js +104 -0
  18. package/dist/components/breadcrumb.js.map +1 -0
  19. package/dist/components/button-group.js +77 -0
  20. package/dist/components/button-group.js.map +1 -0
  21. package/dist/components/button.js +56 -0
  22. package/dist/components/button.js.map +1 -0
  23. package/dist/components/calendar.js +196 -0
  24. package/dist/components/calendar.js.map +1 -0
  25. package/dist/components/card.js +91 -0
  26. package/dist/components/card.js.map +1 -0
  27. package/dist/components/carousel.js +200 -0
  28. package/dist/components/carousel.js.map +1 -0
  29. package/dist/components/chart.js +250 -0
  30. package/dist/components/chart.js.map +1 -0
  31. package/dist/components/checkbox.js +33 -0
  32. package/dist/components/checkbox.js.map +1 -0
  33. package/dist/components/collapsible.js +36 -0
  34. package/dist/components/collapsible.js.map +1 -0
  35. package/dist/components/command.js +178 -0
  36. package/dist/components/command.js.map +1 -0
  37. package/dist/components/context-menu.js +225 -0
  38. package/dist/components/context-menu.js.map +1 -0
  39. package/dist/components/dialog.js +139 -0
  40. package/dist/components/dialog.js.map +1 -0
  41. package/dist/components/drawer.js +130 -0
  42. package/dist/components/drawer.js.map +1 -0
  43. package/dist/components/dropdown-menu.js +234 -0
  44. package/dist/components/dropdown-menu.js.map +1 -0
  45. package/dist/components/empty.js +100 -0
  46. package/dist/components/empty.js.map +1 -0
  47. package/dist/components/field.js +231 -0
  48. package/dist/components/field.js.map +1 -0
  49. package/dist/components/form.js +124 -0
  50. package/dist/components/form.js.map +1 -0
  51. package/dist/components/hover-card.js +40 -0
  52. package/dist/components/hover-card.js.map +1 -0
  53. package/dist/components/input-group.js +156 -0
  54. package/dist/components/input-group.js.map +1 -0
  55. package/dist/components/input-otp.js +68 -0
  56. package/dist/components/input-otp.js.map +1 -0
  57. package/dist/components/input.js +22 -0
  58. package/dist/components/input.js.map +1 -0
  59. package/dist/components/item.js +188 -0
  60. package/dist/components/item.js.map +1 -0
  61. package/dist/components/kbd.js +32 -0
  62. package/dist/components/kbd.js.map +1 -0
  63. package/dist/components/label.js +24 -0
  64. package/dist/components/label.js.map +1 -0
  65. package/dist/components/menubar.js +253 -0
  66. package/dist/components/menubar.js.map +1 -0
  67. package/dist/components/navigation-menu.js +171 -0
  68. package/dist/components/navigation-menu.js.map +1 -0
  69. package/dist/components/pagination.js +125 -0
  70. package/dist/components/pagination.js.map +1 -0
  71. package/dist/components/popover.js +82 -0
  72. package/dist/components/popover.js.map +1 -0
  73. package/dist/components/progress.js +33 -0
  74. package/dist/components/progress.js.map +1 -0
  75. package/dist/components/radio-group.js +47 -0
  76. package/dist/components/radio-group.js.map +1 -0
  77. package/dist/components/resizable.js +50 -0
  78. package/dist/components/resizable.js.map +1 -0
  79. package/dist/components/scroll-area.js +62 -0
  80. package/dist/components/scroll-area.js.map +1 -0
  81. package/dist/components/select.js +173 -0
  82. package/dist/components/select.js.map +1 -0
  83. package/dist/components/separator.js +28 -0
  84. package/dist/components/separator.js.map +1 -0
  85. package/dist/components/sheet.js +129 -0
  86. package/dist/components/sheet.js.map +1 -0
  87. package/dist/components/sidebar.js +759 -0
  88. package/dist/components/sidebar.js.map +1 -0
  89. package/dist/components/skeleton.js +16 -0
  90. package/dist/components/skeleton.js.map +1 -0
  91. package/dist/components/slider.js +65 -0
  92. package/dist/components/slider.js.map +1 -0
  93. package/dist/components/sonner.js +40 -0
  94. package/dist/components/sonner.js.map +1 -0
  95. package/dist/components/spinner.js +18 -0
  96. package/dist/components/spinner.js.map +1 -0
  97. package/dist/components/stepper.js +220 -0
  98. package/dist/components/stepper.js.map +1 -0
  99. package/dist/components/switch.js +33 -0
  100. package/dist/components/switch.js.map +1 -0
  101. package/dist/components/table.js +131 -0
  102. package/dist/components/table.js.map +1 -0
  103. package/dist/components/tabs.js +69 -0
  104. package/dist/components/tabs.js.map +1 -0
  105. package/dist/components/textarea.js +19 -0
  106. package/dist/components/textarea.js.map +1 -0
  107. package/dist/components/toggle-group.js +70 -0
  108. package/dist/components/toggle-group.js.map +1 -0
  109. package/dist/components/toggle.js +45 -0
  110. package/dist/components/toggle.js.map +1 -0
  111. package/dist/components/tooltip.js +65 -0
  112. package/dist/components/tooltip.js.map +1 -0
  113. package/dist/custom/action-button.js +38 -0
  114. package/dist/custom/action-button.js.map +1 -0
  115. package/dist/custom/async-select.js +249 -0
  116. package/dist/custom/async-select.js.map +1 -0
  117. package/dist/custom/awesome-not-found.js +113 -0
  118. package/dist/custom/awesome-not-found.js.map +1 -0
  119. package/dist/custom/charts/area-chart.js +125 -0
  120. package/dist/custom/charts/area-chart.js.map +1 -0
  121. package/dist/custom/charts/bar-chart.js +232 -0
  122. package/dist/custom/charts/bar-chart.js.map +1 -0
  123. package/dist/custom/charts/chart-card.js +71 -0
  124. package/dist/custom/charts/chart-card.js.map +1 -0
  125. package/dist/custom/charts/index.js +5 -0
  126. package/dist/custom/charts/index.js.map +1 -0
  127. package/dist/custom/charts/pie-chart.js +153 -0
  128. package/dist/custom/charts/pie-chart.js.map +1 -0
  129. package/dist/custom/charts/radar-chart.js +112 -0
  130. package/dist/custom/charts/radar-chart.js.map +1 -0
  131. package/dist/custom/checkbox-tree.js +70 -0
  132. package/dist/custom/checkbox-tree.js.map +1 -0
  133. package/dist/custom/combobox.js +233 -0
  134. package/dist/custom/combobox.js.map +1 -0
  135. package/dist/custom/confirm-dialog.js +90 -0
  136. package/dist/custom/confirm-dialog.js.map +1 -0
  137. package/dist/custom/country-selector.js +151 -0
  138. package/dist/custom/country-selector.js.map +1 -0
  139. package/dist/custom/date-picker/calendar-rac.js +91 -0
  140. package/dist/custom/date-picker/calendar-rac.js.map +1 -0
  141. package/dist/custom/date-picker/datefield-rac.js +77 -0
  142. package/dist/custom/date-picker/datefield-rac.js.map +1 -0
  143. package/dist/custom/date-picker/index.js +251 -0
  144. package/dist/custom/date-picker/index.js.map +1 -0
  145. package/dist/custom/date-picker/types/index.js +1 -0
  146. package/dist/custom/date-picker/types/index.js.map +1 -0
  147. package/dist/custom/date-picker/utils/index.js +30 -0
  148. package/dist/custom/date-picker/utils/index.js.map +1 -0
  149. package/dist/custom/date-picker-old.js +46 -0
  150. package/dist/custom/date-picker-old.js.map +1 -0
  151. package/dist/custom/date-tooltip.js +89 -0
  152. package/dist/custom/date-tooltip.js.map +1 -0
  153. package/dist/custom/document-scanner/consts.js +13 -0
  154. package/dist/custom/document-scanner/consts.js.map +1 -0
  155. package/dist/custom/document-scanner/corner-adjustment/action-buttons.js +24 -0
  156. package/dist/custom/document-scanner/corner-adjustment/action-buttons.js.map +1 -0
  157. package/dist/custom/document-scanner/corner-adjustment/corner-handle.js +44 -0
  158. package/dist/custom/document-scanner/corner-adjustment/corner-handle.js.map +1 -0
  159. package/dist/custom/document-scanner/corner-adjustment/hooks/use-corner-drag.js +60 -0
  160. package/dist/custom/document-scanner/corner-adjustment/hooks/use-corner-drag.js.map +1 -0
  161. package/dist/custom/document-scanner/corner-adjustment/index.js +124 -0
  162. package/dist/custom/document-scanner/corner-adjustment/index.js.map +1 -0
  163. package/dist/custom/document-scanner/corner-adjustment/types.js +1 -0
  164. package/dist/custom/document-scanner/corner-adjustment/types.js.map +1 -0
  165. package/dist/custom/document-scanner/corner-adjustment/utils/clip-path.js +16 -0
  166. package/dist/custom/document-scanner/corner-adjustment/utils/clip-path.js.map +1 -0
  167. package/dist/custom/document-scanner/corner-adjustment/zoom-magnifier.js +85 -0
  168. package/dist/custom/document-scanner/corner-adjustment/zoom-magnifier.js.map +1 -0
  169. package/dist/custom/document-scanner/hooks/use-document-capture.js +61 -0
  170. package/dist/custom/document-scanner/hooks/use-document-capture.js.map +1 -0
  171. package/dist/custom/document-scanner/hooks/use-document-scanner.js +59 -0
  172. package/dist/custom/document-scanner/hooks/use-document-scanner.js.map +1 -0
  173. package/dist/custom/document-scanner/hooks/use-perspective-crop.js +31 -0
  174. package/dist/custom/document-scanner/hooks/use-perspective-crop.js.map +1 -0
  175. package/dist/custom/document-scanner/index.js +229 -0
  176. package/dist/custom/document-scanner/index.js.map +1 -0
  177. package/dist/custom/document-scanner/lib.js +289 -0
  178. package/dist/custom/document-scanner/lib.js.map +1 -0
  179. package/dist/custom/document-scanner/types.js +1 -0
  180. package/dist/custom/document-scanner/types.js.map +1 -0
  181. package/dist/custom/document-scanner/utils/perspective-correction.js +100 -0
  182. package/dist/custom/document-scanner/utils/perspective-correction.js.map +1 -0
  183. package/dist/custom/document-viewer/controllers.js +76 -0
  184. package/dist/custom/document-viewer/controllers.js.map +1 -0
  185. package/dist/custom/document-viewer/index.js +36 -0
  186. package/dist/custom/document-viewer/index.js.map +1 -0
  187. package/dist/custom/document-viewer/renderers/image.js +40 -0
  188. package/dist/custom/document-viewer/renderers/image.js.map +1 -0
  189. package/dist/custom/document-viewer/renderers/index.js +3 -0
  190. package/dist/custom/document-viewer/renderers/index.js.map +1 -0
  191. package/dist/custom/document-viewer/renderers/pdf.js +95 -0
  192. package/dist/custom/document-viewer/renderers/pdf.js.map +1 -0
  193. package/dist/custom/email-input/email.js +184 -0
  194. package/dist/custom/email-input/email.js.map +1 -0
  195. package/dist/custom/email-input/index.js +8 -0
  196. package/dist/custom/email-input/index.js.map +1 -0
  197. package/dist/custom/email-input/types.js +13 -0
  198. package/dist/custom/email-input/types.js.map +1 -0
  199. package/dist/custom/file-uploader.js +389 -0
  200. package/dist/custom/file-uploader.js.map +1 -0
  201. package/dist/custom/filter-component/fields/async-select.js +31 -0
  202. package/dist/custom/filter-component/fields/async-select.js.map +1 -0
  203. package/dist/custom/filter-component/fields/date.js +56 -0
  204. package/dist/custom/filter-component/fields/date.js.map +1 -0
  205. package/dist/custom/filter-component/fields/multi-select.js +28 -0
  206. package/dist/custom/filter-component/fields/multi-select.js.map +1 -0
  207. package/dist/custom/filter-component/index.js +149 -0
  208. package/dist/custom/filter-component/index.js.map +1 -0
  209. package/dist/custom/image-canvas.js +193 -0
  210. package/dist/custom/image-canvas.js.map +1 -0
  211. package/dist/custom/json-editor.js +30 -0
  212. package/dist/custom/json-editor.js.map +1 -0
  213. package/dist/custom/master-data-grid/components/dialogs/column-settings-dialog.js +84 -0
  214. package/dist/custom/master-data-grid/components/dialogs/column-settings-dialog.js.map +1 -0
  215. package/dist/custom/master-data-grid/components/dialogs/index.js +5 -0
  216. package/dist/custom/master-data-grid/components/dialogs/index.js.map +1 -0
  217. package/dist/custom/master-data-grid/components/filters/client-filter.js +310 -0
  218. package/dist/custom/master-data-grid/components/filters/client-filter.js.map +1 -0
  219. package/dist/custom/master-data-grid/components/filters/filter-input.js +209 -0
  220. package/dist/custom/master-data-grid/components/filters/filter-input.js.map +1 -0
  221. package/dist/custom/master-data-grid/components/filters/index.js +9 -0
  222. package/dist/custom/master-data-grid/components/filters/index.js.map +1 -0
  223. package/dist/custom/master-data-grid/components/filters/inline-column-filter.js +188 -0
  224. package/dist/custom/master-data-grid/components/filters/inline-column-filter.js.map +1 -0
  225. package/dist/custom/master-data-grid/components/filters/multi-filter-dialog.js +65 -0
  226. package/dist/custom/master-data-grid/components/filters/multi-filter-dialog.js.map +1 -0
  227. package/dist/custom/master-data-grid/components/filters/server-filter.js +213 -0
  228. package/dist/custom/master-data-grid/components/filters/server-filter.js.map +1 -0
  229. package/dist/custom/master-data-grid/components/master-data-grid.js +421 -0
  230. package/dist/custom/master-data-grid/components/master-data-grid.js.map +1 -0
  231. package/dist/custom/master-data-grid/components/pagination/index.js +5 -0
  232. package/dist/custom/master-data-grid/components/pagination/index.js.map +1 -0
  233. package/dist/custom/master-data-grid/components/pagination/pagination.js +159 -0
  234. package/dist/custom/master-data-grid/components/pagination/pagination.js.map +1 -0
  235. package/dist/custom/master-data-grid/components/table/cell-renderer.js +442 -0
  236. package/dist/custom/master-data-grid/components/table/cell-renderer.js.map +1 -0
  237. package/dist/custom/master-data-grid/components/table/header-cell.js +116 -0
  238. package/dist/custom/master-data-grid/components/table/header-cell.js.map +1 -0
  239. package/dist/custom/master-data-grid/components/table/index.js +5 -0
  240. package/dist/custom/master-data-grid/components/table/index.js.map +1 -0
  241. package/dist/custom/master-data-grid/components/table/table-body-renderer.js +79 -0
  242. package/dist/custom/master-data-grid/components/table/table-body-renderer.js.map +1 -0
  243. package/dist/custom/master-data-grid/components/table/virtual-body.js +86 -0
  244. package/dist/custom/master-data-grid/components/table/virtual-body.js.map +1 -0
  245. package/dist/custom/master-data-grid/components/toolbar/index.js +5 -0
  246. package/dist/custom/master-data-grid/components/toolbar/index.js.map +1 -0
  247. package/dist/custom/master-data-grid/components/toolbar/toolbar.js +238 -0
  248. package/dist/custom/master-data-grid/components/toolbar/toolbar.js.map +1 -0
  249. package/dist/custom/master-data-grid/hooks/index.js +7 -0
  250. package/dist/custom/master-data-grid/hooks/index.js.map +1 -0
  251. package/dist/custom/master-data-grid/hooks/use-columns.js +278 -0
  252. package/dist/custom/master-data-grid/hooks/use-columns.js.map +1 -0
  253. package/dist/custom/master-data-grid/hooks/use-editing.js +75 -0
  254. package/dist/custom/master-data-grid/hooks/use-editing.js.map +1 -0
  255. package/dist/custom/master-data-grid/hooks/use-table-state-reducer.js +96 -0
  256. package/dist/custom/master-data-grid/hooks/use-table-state-reducer.js.map +1 -0
  257. package/dist/custom/master-data-grid/hooks/use-table-state.js +25 -0
  258. package/dist/custom/master-data-grid/hooks/use-table-state.js.map +1 -0
  259. package/dist/custom/master-data-grid/index.js +5 -0
  260. package/dist/custom/master-data-grid/index.js.map +1 -0
  261. package/dist/custom/master-data-grid/types.js +1 -0
  262. package/dist/custom/master-data-grid/types.js.map +1 -0
  263. package/dist/custom/master-data-grid/utils/column-generator.js +203 -0
  264. package/dist/custom/master-data-grid/utils/column-generator.js.map +1 -0
  265. package/dist/custom/master-data-grid/utils/export-utils.js +46 -0
  266. package/dist/custom/master-data-grid/utils/export-utils.js.map +1 -0
  267. package/dist/custom/master-data-grid/utils/filter-fns.js +218 -0
  268. package/dist/custom/master-data-grid/utils/filter-fns.js.map +1 -0
  269. package/dist/custom/master-data-grid/utils/index.js +16 -0
  270. package/dist/custom/master-data-grid/utils/index.js.map +1 -0
  271. package/dist/custom/master-data-grid/utils/pinning-utils.js +70 -0
  272. package/dist/custom/master-data-grid/utils/pinning-utils.js.map +1 -0
  273. package/dist/custom/master-data-grid/utils/translation-utils.js +33 -0
  274. package/dist/custom/master-data-grid/utils/translation-utils.js.map +1 -0
  275. package/dist/custom/multi-select.js +339 -0
  276. package/dist/custom/multi-select.js.map +1 -0
  277. package/dist/custom/password-input.js +158 -0
  278. package/dist/custom/password-input.js.map +1 -0
  279. package/dist/custom/phone-input.js +127 -0
  280. package/dist/custom/phone-input.js.map +1 -0
  281. package/dist/custom/schema-form/custom/index.js +2 -0
  282. package/dist/custom/schema-form/custom/index.js.map +1 -0
  283. package/dist/custom/schema-form/custom/label.js +39 -0
  284. package/dist/custom/schema-form/custom/label.js.map +1 -0
  285. package/dist/custom/schema-form/fields/base-input-field.js +73 -0
  286. package/dist/custom/schema-form/fields/base-input-field.js.map +1 -0
  287. package/dist/custom/schema-form/fields/field.js +72 -0
  288. package/dist/custom/schema-form/fields/field.js.map +1 -0
  289. package/dist/custom/schema-form/fields/index.js +6 -0
  290. package/dist/custom/schema-form/fields/index.js.map +1 -0
  291. package/dist/custom/schema-form/fields/object.js +9 -0
  292. package/dist/custom/schema-form/fields/object.js.map +1 -0
  293. package/dist/custom/schema-form/fields/table-array/array-field-item.js +58 -0
  294. package/dist/custom/schema-form/fields/table-array/array-field-item.js.map +1 -0
  295. package/dist/custom/schema-form/fields/table-array/array-field-template.js +104 -0
  296. package/dist/custom/schema-form/fields/table-array/array-field-template.js.map +1 -0
  297. package/dist/custom/schema-form/index.js +219 -0
  298. package/dist/custom/schema-form/index.js.map +1 -0
  299. package/dist/custom/schema-form/templates/description.js +19 -0
  300. package/dist/custom/schema-form/templates/description.js.map +1 -0
  301. package/dist/custom/schema-form/templates/index.js +3 -0
  302. package/dist/custom/schema-form/templates/index.js.map +1 -0
  303. package/dist/custom/schema-form/templates/submit.js +31 -0
  304. package/dist/custom/schema-form/templates/submit.js.map +1 -0
  305. package/dist/custom/schema-form/types.js +1 -0
  306. package/dist/custom/schema-form/types.js.map +1 -0
  307. package/dist/custom/schema-form/utils/index.js +10 -0
  308. package/dist/custom/schema-form/utils/index.js.map +1 -0
  309. package/dist/custom/schema-form/utils/schema-dependency.js +349 -0
  310. package/dist/custom/schema-form/utils/schema-dependency.js.map +1 -0
  311. package/dist/custom/schema-form/utils/schemas.js +190 -0
  312. package/dist/custom/schema-form/utils/schemas.js.map +1 -0
  313. package/dist/custom/schema-form/utils/validation.js +19 -0
  314. package/dist/custom/schema-form/utils/validation.js.map +1 -0
  315. package/dist/custom/schema-form/widgets/boolean.js +73 -0
  316. package/dist/custom/schema-form/widgets/boolean.js.map +1 -0
  317. package/dist/custom/schema-form/widgets/combobox.js +222 -0
  318. package/dist/custom/schema-form/widgets/combobox.js.map +1 -0
  319. package/dist/custom/schema-form/widgets/date.js +56 -0
  320. package/dist/custom/schema-form/widgets/date.js.map +1 -0
  321. package/dist/custom/schema-form/widgets/email.js +37 -0
  322. package/dist/custom/schema-form/widgets/email.js.map +1 -0
  323. package/dist/custom/schema-form/widgets/index.js +11 -0
  324. package/dist/custom/schema-form/widgets/index.js.map +1 -0
  325. package/dist/custom/schema-form/widgets/password.js +42 -0
  326. package/dist/custom/schema-form/widgets/password.js.map +1 -0
  327. package/dist/custom/schema-form/widgets/phone.js +39 -0
  328. package/dist/custom/schema-form/widgets/phone.js.map +1 -0
  329. package/dist/custom/schema-form/widgets/select.js +78 -0
  330. package/dist/custom/schema-form/widgets/select.js.map +1 -0
  331. package/dist/custom/schema-form/widgets/selectable.js +25 -0
  332. package/dist/custom/schema-form/widgets/selectable.js.map +1 -0
  333. package/dist/custom/schema-form/widgets/string-array.js +237 -0
  334. package/dist/custom/schema-form/widgets/string-array.js.map +1 -0
  335. package/dist/custom/schema-form/widgets/url.js +53 -0
  336. package/dist/custom/schema-form/widgets/url.js.map +1 -0
  337. package/dist/custom/section-layout-v2.js +150 -0
  338. package/dist/custom/section-layout-v2.js.map +1 -0
  339. package/dist/custom/select-tabs.js +66 -0
  340. package/dist/custom/select-tabs.js.map +1 -0
  341. package/dist/custom/selectable.js +231 -0
  342. package/dist/custom/selectable.js.map +1 -0
  343. package/dist/custom/stepper.js +166 -0
  344. package/dist/custom/stepper.js.map +1 -0
  345. package/dist/custom/tab-layout.js +182 -0
  346. package/dist/custom/tab-layout.js.map +1 -0
  347. package/dist/custom/tanstack-table/fields/index.js +13 -0
  348. package/dist/custom/tanstack-table/fields/index.js.map +1 -0
  349. package/dist/custom/tanstack-table/fields/tanstack-table-action-dialogs.js +76 -0
  350. package/dist/custom/tanstack-table/fields/tanstack-table-action-dialogs.js.map +1 -0
  351. package/dist/custom/tanstack-table/fields/tanstack-table-column-header.js +47 -0
  352. package/dist/custom/tanstack-table/fields/tanstack-table-column-header.js.map +1 -0
  353. package/dist/custom/tanstack-table/fields/tanstack-table-filter-date.js +132 -0
  354. package/dist/custom/tanstack-table/fields/tanstack-table-filter-date.js.map +1 -0
  355. package/dist/custom/tanstack-table/fields/tanstack-table-filter-faceted.js +131 -0
  356. package/dist/custom/tanstack-table/fields/tanstack-table-filter-faceted.js.map +1 -0
  357. package/dist/custom/tanstack-table/fields/tanstack-table-filter-text.js +64 -0
  358. package/dist/custom/tanstack-table/fields/tanstack-table-filter-text.js.map +1 -0
  359. package/dist/custom/tanstack-table/fields/tanstack-table-pagination.js +135 -0
  360. package/dist/custom/tanstack-table/fields/tanstack-table-pagination.js.map +1 -0
  361. package/dist/custom/tanstack-table/fields/tanstack-table-plain-table.js +111 -0
  362. package/dist/custom/tanstack-table/fields/tanstack-table-plain-table.js.map +1 -0
  363. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-confirmation.js +65 -0
  364. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-confirmation.js.map +1 -0
  365. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-custom-dialog.js +69 -0
  366. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-custom-dialog.js.map +1 -0
  367. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions.js +119 -0
  368. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions.js.map +1 -0
  369. package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-custom-dialog.js +75 -0
  370. package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-custom-dialog.js.map +1 -0
  371. package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-schemaform-dialog.js +41 -0
  372. package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-schemaform-dialog.js.map +1 -0
  373. package/dist/custom/tanstack-table/fields/tanstack-table-toolbar.js +106 -0
  374. package/dist/custom/tanstack-table/fields/tanstack-table-toolbar.js.map +1 -0
  375. package/dist/custom/tanstack-table/fields/tanstack-table-view-options.js +132 -0
  376. package/dist/custom/tanstack-table/fields/tanstack-table-view-options.js.map +1 -0
  377. package/dist/custom/tanstack-table/index.js +217 -0
  378. package/dist/custom/tanstack-table/index.js.map +1 -0
  379. package/dist/custom/tanstack-table/types/index.js +1 -0
  380. package/dist/custom/tanstack-table/types/index.js.map +1 -0
  381. package/dist/custom/tanstack-table/utils/cell-with-actions.js +16 -0
  382. package/dist/custom/tanstack-table/utils/cell-with-actions.js.map +1 -0
  383. package/dist/custom/tanstack-table/utils/column-names.js +15 -0
  384. package/dist/custom/tanstack-table/utils/column-names.js.map +1 -0
  385. package/dist/custom/tanstack-table/utils/columns-by-row-data.js +246 -0
  386. package/dist/custom/tanstack-table/utils/columns-by-row-data.js.map +1 -0
  387. package/dist/custom/tanstack-table/utils/editable-columns-by-row-data.js +187 -0
  388. package/dist/custom/tanstack-table/utils/editable-columns-by-row-data.js.map +1 -0
  389. package/dist/custom/tanstack-table/utils/faceted-boolean-options.js +25 -0
  390. package/dist/custom/tanstack-table/utils/faceted-boolean-options.js.map +1 -0
  391. package/dist/custom/tanstack-table/utils/index.js +10 -0
  392. package/dist/custom/tanstack-table/utils/index.js.map +1 -0
  393. package/dist/custom/tanstack-table/utils/pinning-styles.js +38 -0
  394. package/dist/custom/tanstack-table/utils/pinning-styles.js.map +1 -0
  395. package/dist/custom/tanstack-table/utils/table.js +66 -0
  396. package/dist/custom/tanstack-table/utils/table.js.map +1 -0
  397. package/dist/custom/tanstack-table/utils/test-conditions.js +10 -0
  398. package/dist/custom/tanstack-table/utils/test-conditions.js.map +1 -0
  399. package/dist/custom/timeline.js +165 -0
  400. package/dist/custom/timeline.js.map +1 -0
  401. package/dist/custom/tree.js +130 -0
  402. package/dist/custom/tree.js.map +1 -0
  403. package/dist/custom/tscanify/browser.js +36 -0
  404. package/dist/custom/tscanify/browser.js.map +1 -0
  405. package/dist/custom/tscanify/index.js +34 -0
  406. package/dist/custom/tscanify/index.js.map +1 -0
  407. package/dist/custom/tscanify/tscanify-browser.js +363 -0
  408. package/dist/custom/tscanify/tscanify-browser.js.map +1 -0
  409. package/dist/custom/tscanify/tscanify.js +197 -0
  410. package/dist/custom/tscanify/tscanify.js.map +1 -0
  411. package/dist/custom/tscanify/types.js +1 -0
  412. package/dist/custom/tscanify/types.js.map +1 -0
  413. package/dist/custom/webcam.js +519 -0
  414. package/dist/custom/webcam.js.map +1 -0
  415. package/dist/hooks/use-callback-ref.js +15 -0
  416. package/dist/hooks/use-callback-ref.js.map +1 -0
  417. package/dist/hooks/use-controllable-state.js +49 -0
  418. package/dist/hooks/use-controllable-state.js.map +1 -0
  419. package/dist/hooks/use-debounce.js +18 -0
  420. package/dist/hooks/use-debounce.js.map +1 -0
  421. package/dist/hooks/use-is-visible.js +22 -0
  422. package/dist/hooks/use-is-visible.js.map +1 -0
  423. package/dist/hooks/use-media-query.js +19 -0
  424. package/dist/hooks/use-media-query.js.map +1 -0
  425. package/dist/hooks/use-mobile.js +21 -0
  426. package/dist/hooks/use-mobile.js.map +1 -0
  427. package/dist/hooks/use-on-window-resize.js +15 -0
  428. package/dist/hooks/use-on-window-resize.js.map +1 -0
  429. package/dist/hooks/use-scroll.js +20 -0
  430. package/dist/hooks/use-scroll.js.map +1 -0
  431. package/dist/lib/utils.js +48 -0
  432. package/dist/lib/utils.js.map +1 -0
  433. package/dist/lib/zod.js +7 -0
  434. package/dist/lib/zod.js.map +1 -0
  435. package/package.json +34 -8
  436. package/src/aria/index.tsx +1 -1
  437. package/src/aria/number-field.tsx +41 -41
  438. package/src/components/accordion.tsx +66 -66
  439. package/src/components/alert-dialog.tsx +157 -157
  440. package/src/components/alert.tsx +70 -70
  441. package/src/components/aspect-ratio.tsx +11 -11
  442. package/src/components/avatar.tsx +53 -53
  443. package/src/components/badge.tsx +74 -67
  444. package/src/components/breadcrumb.tsx +109 -109
  445. package/src/components/button-group.tsx +83 -83
  446. package/src/components/button.tsx +69 -68
  447. package/src/components/calendar.tsx +216 -219
  448. package/src/components/card.tsx +92 -92
  449. package/src/components/carousel.tsx +241 -241
  450. package/src/components/chart.tsx +363 -363
  451. package/src/components/checkbox.tsx +32 -32
  452. package/src/components/collapsible.tsx +33 -33
  453. package/src/components/command.tsx +184 -184
  454. package/src/components/context-menu.tsx +252 -252
  455. package/src/components/dialog.tsx +144 -144
  456. package/src/components/drawer.tsx +135 -135
  457. package/src/components/dropdown-menu.tsx +258 -258
  458. package/src/components/empty.tsx +100 -100
  459. package/src/components/field.tsx +248 -248
  460. package/src/components/form.tsx +169 -169
  461. package/src/components/hover-card.tsx +44 -44
  462. package/src/components/input-group.tsx +170 -170
  463. package/src/components/input-otp.tsx +77 -77
  464. package/src/components/input.tsx +21 -21
  465. package/src/components/item.tsx +193 -193
  466. package/src/components/kbd.tsx +28 -28
  467. package/src/components/label.tsx +24 -24
  468. package/src/components/menubar.tsx +276 -276
  469. package/src/components/navigation-menu.tsx +168 -168
  470. package/src/components/pagination.tsx +127 -130
  471. package/src/components/popover.tsx +88 -88
  472. package/src/components/progress.tsx +31 -31
  473. package/src/components/radio-group.tsx +45 -45
  474. package/src/components/resizable.tsx +56 -56
  475. package/src/components/scroll-area.tsx +58 -58
  476. package/src/components/select.tsx +189 -189
  477. package/src/components/separator.tsx +28 -28
  478. package/src/components/sheet.tsx +140 -140
  479. package/src/components/sidebar.tsx +862 -862
  480. package/src/components/skeleton.tsx +13 -13
  481. package/src/components/slider.tsx +63 -63
  482. package/src/components/sonner.tsx +40 -40
  483. package/src/components/spinner.tsx +16 -16
  484. package/src/components/stepper.tsx +290 -291
  485. package/src/components/switch.tsx +31 -31
  486. package/src/components/table.tsx +133 -133
  487. package/src/components/tabs.tsx +66 -66
  488. package/src/components/textarea.tsx +18 -18
  489. package/src/components/toggle-group.tsx +83 -83
  490. package/src/components/toggle.tsx +47 -47
  491. package/src/components/tooltip.tsx +66 -66
  492. package/src/custom/action-button.tsx +45 -48
  493. package/src/custom/async-select.tsx +287 -287
  494. package/src/custom/awesome-not-found.tsx +116 -116
  495. package/src/custom/charts/area-chart.tsx +147 -147
  496. package/src/custom/charts/bar-chart.tsx +233 -233
  497. package/src/custom/charts/chart-card.tsx +103 -103
  498. package/src/custom/charts/index.tsx +16 -16
  499. package/src/custom/charts/pie-chart.tsx +168 -168
  500. package/src/custom/charts/radar-chart.tsx +126 -126
  501. package/src/custom/checkbox-tree.tsx +100 -100
  502. package/src/custom/combobox.tsx +296 -296
  503. package/src/custom/confirm-dialog.tsx +114 -102
  504. package/src/custom/country-selector.tsx +204 -204
  505. package/src/custom/date-picker/calendar-rac.tsx +109 -109
  506. package/src/custom/date-picker/datefield-rac.tsx +84 -84
  507. package/src/custom/date-picker/index.tsx +273 -273
  508. package/src/custom/date-picker/types/index.ts +4 -4
  509. package/src/custom/date-picker/utils/index.ts +42 -42
  510. package/src/custom/date-picker-old.tsx +50 -50
  511. package/src/custom/date-tooltip.tsx +98 -98
  512. package/src/custom/document-scanner/consts.ts +5 -5
  513. package/src/custom/document-scanner/corner-adjustment/action-buttons.tsx +33 -33
  514. package/src/custom/document-scanner/corner-adjustment/corner-handle.tsx +43 -43
  515. package/src/custom/document-scanner/corner-adjustment/hooks/use-corner-drag.ts +85 -85
  516. package/src/custom/document-scanner/corner-adjustment/index.tsx +125 -125
  517. package/src/custom/document-scanner/corner-adjustment/types.ts +53 -53
  518. package/src/custom/document-scanner/corner-adjustment/utils/clip-path.ts +22 -22
  519. package/src/custom/document-scanner/corner-adjustment/zoom-magnifier.tsx +115 -115
  520. package/src/custom/document-scanner/hooks/use-document-capture.ts +81 -81
  521. package/src/custom/document-scanner/hooks/use-document-scanner.ts +80 -80
  522. package/src/custom/document-scanner/hooks/use-perspective-crop.ts +38 -38
  523. package/src/custom/document-scanner/index.tsx +255 -255
  524. package/src/custom/document-scanner/lib.ts +407 -407
  525. package/src/custom/document-scanner/types.ts +205 -205
  526. package/src/custom/document-scanner/utils/perspective-correction.ts +139 -139
  527. package/src/custom/document-viewer/controllers.tsx +98 -98
  528. package/src/custom/document-viewer/index.tsx +43 -43
  529. package/src/custom/document-viewer/renderers/image.tsx +37 -37
  530. package/src/custom/document-viewer/renderers/index.tsx +2 -2
  531. package/src/custom/document-viewer/renderers/pdf.tsx +105 -105
  532. package/src/custom/email-input/domains.json +159 -159
  533. package/src/custom/email-input/email.tsx +231 -229
  534. package/src/custom/email-input/index.tsx +4 -4
  535. package/src/custom/email-input/types.ts +104 -104
  536. package/src/custom/file-uploader.tsx +541 -541
  537. package/src/custom/filter-component/fields/async-select.tsx +33 -33
  538. package/src/custom/filter-component/fields/date.tsx +60 -60
  539. package/src/custom/filter-component/fields/multi-select.tsx +30 -30
  540. package/src/custom/filter-component/index.tsx +217 -217
  541. package/src/custom/image-canvas.tsx +260 -260
  542. package/src/custom/json-editor.tsx +22 -22
  543. package/src/custom/master-data-grid/components/dialogs/column-settings-dialog.tsx +100 -100
  544. package/src/custom/master-data-grid/components/dialogs/index.ts +1 -1
  545. package/src/custom/master-data-grid/components/filters/client-filter.tsx +369 -368
  546. package/src/custom/master-data-grid/components/filters/filter-input.tsx +256 -256
  547. package/src/custom/master-data-grid/components/filters/index.ts +3 -3
  548. package/src/custom/master-data-grid/components/filters/inline-column-filter.tsx +233 -233
  549. package/src/custom/master-data-grid/components/filters/multi-filter-dialog.tsx +91 -90
  550. package/src/custom/master-data-grid/components/filters/server-filter.tsx +265 -255
  551. package/src/custom/master-data-grid/components/master-data-grid.tsx +472 -472
  552. package/src/custom/master-data-grid/components/pagination/index.ts +1 -1
  553. package/src/custom/master-data-grid/components/pagination/pagination.tsx +178 -178
  554. package/src/custom/master-data-grid/components/table/cell-renderer.tsx +621 -634
  555. package/src/custom/master-data-grid/components/table/header-cell.tsx +162 -162
  556. package/src/custom/master-data-grid/components/table/index.ts +4 -4
  557. package/src/custom/master-data-grid/components/table/table-body-renderer.tsx +113 -113
  558. package/src/custom/master-data-grid/components/table/virtual-body.tsx +138 -138
  559. package/src/custom/master-data-grid/components/toolbar/index.ts +1 -1
  560. package/src/custom/master-data-grid/components/toolbar/toolbar.tsx +314 -314
  561. package/src/custom/master-data-grid/hooks/index.ts +3 -3
  562. package/src/custom/master-data-grid/hooks/use-columns.tsx +353 -332
  563. package/src/custom/master-data-grid/hooks/use-editing.ts +106 -106
  564. package/src/custom/master-data-grid/hooks/use-table-state-reducer.ts +157 -157
  565. package/src/custom/master-data-grid/hooks/use-table-state.ts +31 -31
  566. package/src/custom/master-data-grid/index.ts +16 -16
  567. package/src/custom/master-data-grid/types.ts +487 -466
  568. package/src/custom/master-data-grid/utils/column-generator.tsx +324 -306
  569. package/src/custom/master-data-grid/utils/export-utils.ts +67 -67
  570. package/src/custom/master-data-grid/utils/filter-fns.ts +310 -290
  571. package/src/custom/master-data-grid/utils/index.ts +8 -8
  572. package/src/custom/master-data-grid/utils/pinning-utils.ts +88 -88
  573. package/src/custom/master-data-grid/utils/translation-utils.ts +42 -42
  574. package/src/custom/multi-select.tsx +434 -432
  575. package/src/custom/password-input.tsx +194 -194
  576. package/src/custom/phone-input.tsx +172 -172
  577. package/src/custom/schema-form/custom/index.tsx +1 -1
  578. package/src/custom/schema-form/custom/label.tsx +53 -53
  579. package/src/custom/schema-form/fields/base-input-field.tsx +82 -82
  580. package/src/custom/schema-form/fields/field.tsx +67 -67
  581. package/src/custom/schema-form/fields/index.tsx +5 -5
  582. package/src/custom/schema-form/fields/object.tsx +12 -12
  583. package/src/custom/schema-form/fields/table-array/array-field-item.tsx +90 -90
  584. package/src/custom/schema-form/fields/table-array/array-field-template.tsx +115 -115
  585. package/src/custom/schema-form/index.tsx +259 -259
  586. package/src/custom/schema-form/templates/description.tsx +20 -20
  587. package/src/custom/schema-form/templates/index.tsx +2 -2
  588. package/src/custom/schema-form/templates/submit.tsx +32 -32
  589. package/src/custom/schema-form/types.ts +64 -64
  590. package/src/custom/schema-form/utils/index.ts +4 -4
  591. package/src/custom/schema-form/utils/schema-dependency.ts +655 -655
  592. package/src/custom/schema-form/utils/schemas.ts +289 -289
  593. package/src/custom/schema-form/utils/validation.ts +23 -23
  594. package/src/custom/schema-form/widgets/boolean.tsx +77 -77
  595. package/src/custom/schema-form/widgets/combobox.tsx +274 -274
  596. package/src/custom/schema-form/widgets/date.tsx +59 -59
  597. package/src/custom/schema-form/widgets/email.tsx +34 -34
  598. package/src/custom/schema-form/widgets/index.tsx +10 -10
  599. package/src/custom/schema-form/widgets/password.tsx +40 -40
  600. package/src/custom/schema-form/widgets/phone.tsx +40 -40
  601. package/src/custom/schema-form/widgets/select.tsx +105 -105
  602. package/src/custom/schema-form/widgets/selectable.tsx +25 -25
  603. package/src/custom/schema-form/widgets/string-array.tsx +296 -296
  604. package/src/custom/schema-form/widgets/url.tsx +56 -56
  605. package/src/custom/section-layout-v2.tsx +212 -212
  606. package/src/custom/select-tabs.tsx +109 -109
  607. package/src/custom/selectable.tsx +316 -316
  608. package/src/custom/stepper.tsx +236 -236
  609. package/src/custom/tab-layout.tsx +213 -213
  610. package/src/custom/tanstack-table/fields/index.tsx +12 -12
  611. package/src/custom/tanstack-table/fields/tanstack-table-action-dialogs.tsx +89 -89
  612. package/src/custom/tanstack-table/fields/tanstack-table-column-header.tsx +68 -66
  613. package/src/custom/tanstack-table/fields/tanstack-table-filter-date.tsx +180 -180
  614. package/src/custom/tanstack-table/fields/tanstack-table-filter-faceted.tsx +158 -158
  615. package/src/custom/tanstack-table/fields/tanstack-table-filter-text.tsx +73 -76
  616. package/src/custom/tanstack-table/fields/tanstack-table-pagination.tsx +136 -136
  617. package/src/custom/tanstack-table/fields/tanstack-table-plain-table.tsx +142 -142
  618. package/src/custom/tanstack-table/fields/tanstack-table-row-actions-confirmation.tsx +77 -77
  619. package/src/custom/tanstack-table/fields/tanstack-table-row-actions-custom-dialog.tsx +87 -87
  620. package/src/custom/tanstack-table/fields/tanstack-table-row-actions.tsx +151 -151
  621. package/src/custom/tanstack-table/fields/tanstack-table-table-actions-custom-dialog.tsx +88 -88
  622. package/src/custom/tanstack-table/fields/tanstack-table-table-actions-schemaform-dialog.tsx +47 -47
  623. package/src/custom/tanstack-table/fields/tanstack-table-toolbar.tsx +143 -143
  624. package/src/custom/tanstack-table/fields/tanstack-table-view-options.tsx +171 -171
  625. package/src/custom/tanstack-table/index.tsx +244 -244
  626. package/src/custom/tanstack-table/types/index.ts +328 -328
  627. package/src/custom/tanstack-table/utils/cell-with-actions.tsx +21 -21
  628. package/src/custom/tanstack-table/utils/column-names.ts +26 -26
  629. package/src/custom/tanstack-table/utils/columns-by-row-data.tsx +312 -312
  630. package/src/custom/tanstack-table/utils/editable-columns-by-row-data.tsx +219 -219
  631. package/src/custom/tanstack-table/utils/faceted-boolean-options.tsx +22 -22
  632. package/src/custom/tanstack-table/utils/index.tsx +10 -10
  633. package/src/custom/tanstack-table/utils/pinning-styles.ts +57 -57
  634. package/src/custom/tanstack-table/utils/table.tsx +83 -83
  635. package/src/custom/tanstack-table/utils/test-conditions.ts +17 -17
  636. package/src/custom/timeline.tsx +208 -208
  637. package/src/custom/tree.tsx +202 -200
  638. package/src/custom/tscanify/browser.ts +66 -66
  639. package/src/custom/tscanify/index.ts +51 -51
  640. package/src/custom/tscanify/tscanify-browser.ts +522 -522
  641. package/src/custom/tscanify/tscanify.ts +262 -262
  642. package/src/custom/tscanify/types.ts +22 -22
  643. package/src/custom/webcam.tsx +737 -737
  644. package/src/hooks/use-callback-ref.ts +27 -27
  645. package/src/hooks/use-controllable-state.ts +67 -67
  646. package/src/hooks/use-debounce.ts +19 -19
  647. package/src/hooks/use-is-visible.ts +23 -23
  648. package/src/hooks/use-media-query.ts +21 -21
  649. package/src/hooks/use-mobile.ts +21 -21
  650. package/src/hooks/use-on-window-resize.ts +15 -15
  651. package/src/hooks/use-scroll.tsx +22 -22
  652. package/src/lib/utils.ts +61 -61
  653. package/src/lib/zod.ts +2 -2
  654. package/src/styles/core.css +57 -57
  655. package/src/test/email-input.test.tsx +217 -217
  656. package/src/test/password-input.test.tsx +92 -92
  657. package/src/test/select-tabs.test.tsx +302 -302
  658. package/src/test/selectable.test.tsx +1093 -1093
  659. package/__mocks__/canvas.ts +0 -8
  660. package/components.json +0 -21
  661. package/eslint.config.js +0 -4
  662. package/jest-environment.js +0 -37
  663. package/jest.config.ts +0 -47
  664. package/jest.setup.ts +0 -69
  665. package/postcss.config.mjs +0 -6
  666. package/tsconfig.json +0 -13
  667. package/tsconfig.lint.json +0 -8
@@ -1,432 +1,434 @@
1
- "use client";
2
-
3
- // src/components/multi-select.tsx
4
- import * as React from "react";
5
- import { cva, type VariantProps } from "class-variance-authority";
6
- import {
7
- CheckIcon,
8
- XCircle,
9
- ChevronDown,
10
- XIcon,
11
- WandSparkles,
12
- } from "lucide-react";
13
-
14
- import { cn } from "@repo/ayasofyazilim-ui/lib/utils";
15
- import { Separator } from "@repo/ayasofyazilim-ui/components/separator";
16
- import { Button } from "@repo/ayasofyazilim-ui/components/button";
17
- import { Badge } from "@repo/ayasofyazilim-ui/components/badge";
18
- import {
19
- Popover,
20
- PopoverContent,
21
- PopoverTrigger,
22
- } from "@repo/ayasofyazilim-ui/components/popover";
23
- import {
24
- Command,
25
- CommandEmpty,
26
- CommandGroup,
27
- CommandInput,
28
- CommandItem,
29
- CommandList,
30
- CommandSeparator,
31
- } from "@repo/ayasofyazilim-ui/components/command";
32
-
33
- /**
34
- * Variants for the multi-select component to handle different styles.
35
- * Uses class-variance-authority (cva) to define different styles based on "variant" prop.
36
- */
37
- const multiSelectVariants = cva(
38
- "m-1 transition ease-in-out delay-150 hover:-translate-y-1 hover:scale-110 duration-300",
39
- {
40
- variants: {
41
- variant: {
42
- default:
43
- "border-foreground/10 text-foreground bg-card hover:bg-card/80",
44
- secondary:
45
- "border-foreground/10 bg-secondary text-secondary-foreground hover:bg-secondary/80",
46
- destructive:
47
- "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
48
- inverted: "inverted",
49
- },
50
- },
51
- defaultVariants: {
52
- variant: "default",
53
- },
54
- }
55
- );
56
-
57
- /**
58
- * Props for MultiSelect component
59
- */
60
- export interface MultiSelectProps
61
- extends React.ButtonHTMLAttributes<HTMLButtonElement>,
62
- VariantProps<typeof multiSelectVariants> {
63
- /**
64
- * Animation duration in seconds for the visual effects (e.g., bouncing badges).
65
- * Optional, defaults to 0 (no animation).
66
- */
67
- animation?: number;
68
-
69
- /**
70
- * If true, renders the multi-select component as a child of another component.
71
- * Optional, defaults to false.
72
- */
73
- asChild?: boolean;
74
-
75
- /**
76
- * Additional class names to apply custom styles to the multi-select component.
77
- * Optional, can be used to add custom styles.
78
- */
79
- className?: string;
80
-
81
- /** The default selected values when the component mounts. */
82
- defaultValue?: string[];
83
-
84
- /**
85
- * Maximum number of items to display. Extra selected items will be summarized.
86
- * Optional, defaults to 3.
87
- */
88
- maxCount?: number;
89
-
90
- /**
91
- * The modality of the popover. When set to true, interaction with outside elements
92
- * will be disabled and only popover content will be visible to screen readers.
93
- * Optional, defaults to false.
94
- */
95
- modalPopover?: boolean;
96
-
97
- /**
98
- * Callback function triggered when the selected values change.
99
- * Receives an array of the new selected values.
100
- */
101
- onValueChange?: (value: string[]) => void;
102
-
103
- /**
104
- * An array of option objects to be displayed in the multi-select component.
105
- * Each option object has a label, value, and an optional icon.
106
- */
107
- options: {
108
- /** Optional icon component to display alongside the option. */
109
- icon?: React.ComponentType<{ className?: string }>;
110
- /** The text to display for the option. */
111
- label: string;
112
- /** The unique value associated with the option. */
113
- value: string;
114
- /** Optional badge component to display alongside the option. */
115
- children?: React.ReactNode;
116
- disabled?: boolean;
117
- }[];
118
-
119
- /**
120
- * Placeholder text to be displayed when no values are selected.
121
- * Optional, defaults to "Select options".
122
- */
123
- placeholder?: string;
124
-
125
- /**
126
- * selectAllLabel text to be displayed for select all option.
127
- * Optional, defaults to "Select all".
128
- */
129
- selectAllLabel?: string;
130
-
131
- /**
132
- * If true, the multi-select component will be disabled.
133
- * Optional, defaults to false.
134
- */
135
- disabled?: boolean;
136
- }
137
-
138
- export const MultiSelect = React.forwardRef<
139
- HTMLButtonElement,
140
- MultiSelectProps
141
- >(
142
- (
143
- {
144
- options,
145
- onValueChange,
146
- variant,
147
- defaultValue = [],
148
- placeholder = "Select options",
149
- selectAllLabel = "Select all",
150
- animation = 0,
151
- maxCount = 3,
152
- modalPopover = false,
153
- className,
154
- disabled,
155
- ...props
156
- },
157
- ref
158
- ) => {
159
- const [selectedValues, setSelectedValues] =
160
- React.useState<string[]>(defaultValue);
161
- const previousDefaultValue = React.useRef<string[]>(defaultValue);
162
- React.useEffect(() => {
163
- if (
164
- JSON.stringify(previousDefaultValue.current) !==
165
- JSON.stringify(defaultValue)
166
- ) {
167
- setSelectedValues(defaultValue);
168
- previousDefaultValue.current = defaultValue;
169
- }
170
- }, [defaultValue]);
171
- const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);
172
- const [isAnimating, setIsAnimating] = React.useState(false);
173
-
174
- const handleInputKeyDown = (
175
- event: React.KeyboardEvent<HTMLInputElement>
176
- ) => {
177
- if (event.key === "Enter") {
178
- setIsPopoverOpen(true);
179
- } else if (event.key === "Backspace" && !event.currentTarget.value) {
180
- const newSelectedValues = [...selectedValues];
181
- newSelectedValues.pop();
182
- setSelectedValues(newSelectedValues);
183
- if (onValueChange) onValueChange(newSelectedValues);
184
- }
185
- };
186
-
187
- const toggleOption = (option: string) => {
188
- const newSelectedValues = selectedValues.includes(option)
189
- ? selectedValues.filter((value) => value !== option)
190
- : [...selectedValues, option];
191
- setSelectedValues(newSelectedValues);
192
- if (onValueChange) onValueChange(newSelectedValues);
193
- };
194
-
195
- const handleClear = () => {
196
- setSelectedValues(
197
- selectedValues.filter(
198
- (value) => !options.map((o) => !o.disabled && o.value).includes(value)
199
- )
200
- );
201
- if (onValueChange) onValueChange([]);
202
- };
203
-
204
- const handleTogglePopover = () => {
205
- setIsPopoverOpen((prev) => !prev);
206
- };
207
-
208
- const clearExtraOptions = () => {
209
- const newSelectedValues = selectedValues.slice(0, maxCount);
210
- setSelectedValues(newSelectedValues);
211
- if (onValueChange) onValueChange(newSelectedValues);
212
- };
213
-
214
- const toggleAll = () => {
215
- if (selectedValues.length === options.length) {
216
- handleClear();
217
- } else {
218
- const allValues = options.map((option) => option.value);
219
- setSelectedValues(allValues);
220
- if (onValueChange) onValueChange(allValues);
221
- }
222
- };
223
-
224
- return (
225
- <Popover
226
- open={isPopoverOpen}
227
- onOpenChange={setIsPopoverOpen}
228
- modal={modalPopover}
229
- >
230
- <PopoverTrigger asChild className="w-full">
231
- <Button
232
- ref={ref}
233
- data-testid={props.id}
234
- type="button"
235
- disabled={disabled}
236
- onClick={handleTogglePopover}
237
- className={cn(
238
- "flex w-full p-1 rounded-md border min-h-9 h-auto items-center justify-between bg-inherit hover:bg-inherit",
239
- className
240
- )}
241
- >
242
- {selectedValues.length > 0 ? (
243
- <div className="flex justify-between items-center w-full">
244
- <div className="flex flex-wrap items-center">
245
- {selectedValues.slice(0, maxCount).map((value) => {
246
- const option = options.find((o) => o.value === value);
247
- const IconComponent = option?.icon;
248
- return (
249
- <Badge
250
- key={value}
251
- className={cn(
252
- isAnimating ? "animate-bounce" : "",
253
- multiSelectVariants({ variant })
254
- )}
255
- style={{ animationDuration: `${animation}s` }}
256
- >
257
- {IconComponent && (
258
- <IconComponent className="h-4 w-4 mr-2" />
259
- )}
260
- {option?.label}
261
- {!option?.disabled && (
262
- <XCircle
263
- className="ml-2 h-4 w-4 cursor-pointer"
264
- onClick={(event) => {
265
- event.stopPropagation();
266
- toggleOption(value);
267
- }}
268
- />
269
- )}
270
- </Badge>
271
- );
272
- })}
273
- {selectedValues.length > maxCount && (
274
- <Badge
275
- className={cn(
276
- "bg-transparent text-foreground border-foreground/1 hover:bg-transparent",
277
- isAnimating ? "animate-bounce" : "",
278
- multiSelectVariants({ variant })
279
- )}
280
- style={{ animationDuration: `${animation}s` }}
281
- >
282
- {`+ ${selectedValues.length - maxCount} more`}
283
- <XCircle
284
- className="ml-2 h-4 w-4 cursor-pointer"
285
- onClick={(event) => {
286
- event.stopPropagation();
287
- clearExtraOptions();
288
- }}
289
- />
290
- </Badge>
291
- )}
292
- </div>
293
- <div className="flex items-center justify-between">
294
- {options.filter((x) => x.disabled).length !==
295
- options.length && (
296
- <XIcon
297
- className="h-4 mx-2 cursor-pointer text-muted-foreground"
298
- onClick={(event) => {
299
- event.stopPropagation();
300
- handleClear();
301
- }}
302
- />
303
- )}
304
- <Separator
305
- orientation="vertical"
306
- className="flex min-h-6 h-full"
307
- />
308
- <ChevronDown className="h-4 mx-2 cursor-pointer text-muted-foreground" />
309
- </div>
310
- </div>
311
- ) : (
312
- <div className="flex items-center justify-between w-full mx-auto">
313
- <span className="text-sm text-black mx-3 font-normal">
314
- {placeholder}
315
- </span>
316
- <ChevronDown className="h-4 cursor-pointer text-muted-foreground mx-2" />
317
- </div>
318
- )}
319
- </Button>
320
- </PopoverTrigger>
321
- <PopoverContent
322
- className="p-0"
323
- onEscapeKeyDown={() => setIsPopoverOpen(false)}
324
- >
325
- <Command className="w-full">
326
- <CommandInput
327
- data-testid={`${props.id}_search`}
328
- placeholder="Search..."
329
- onKeyDown={handleInputKeyDown}
330
- />
331
- <CommandList>
332
- <CommandEmpty>No results found.</CommandEmpty>
333
- <CommandGroup>
334
- <CommandItem
335
- data-testid={`${props.id}_select_all`}
336
- key="all"
337
- onSelect={toggleAll}
338
- className="cursor-pointer"
339
- disabled={
340
- options.filter((x) => x.disabled).length === options.length
341
- }
342
- >
343
- <div
344
- className={cn(
345
- "mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
346
- selectedValues.length === options.length
347
- ? "bg-primary text-primary-foreground"
348
- : "opacity-50 [&_svg]:invisible"
349
- )}
350
- >
351
- <CheckIcon className="h-4 w-4" />
352
- </div>
353
- <span>({selectAllLabel})</span>
354
- </CommandItem>
355
- {options.map((option) => {
356
- const isSelected = selectedValues.includes(option.value);
357
- return (
358
- <CommandItem
359
- data-testid={`${props.id}_${option.value}`}
360
- key={option.value}
361
- onSelect={() => toggleOption(option.value)}
362
- className="cursor-pointer"
363
- disabled={option.disabled}
364
- >
365
- <div
366
- className={cn(
367
- "mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
368
- isSelected
369
- ? "bg-primary text-primary-foreground"
370
- : "opacity-50 [&_svg]:invisible"
371
- )}
372
- >
373
- <CheckIcon className="h-4 w-4" />
374
- </div>
375
- {option.icon && (
376
- <option.icon className="mr-2 h-4 w-4 text-muted-foreground" />
377
- )}
378
- <span>{option.label}</span>
379
- {option.children}
380
- </CommandItem>
381
- );
382
- })}
383
- </CommandGroup>
384
- <CommandSeparator />
385
- <CommandGroup>
386
- <div className="flex items-center justify-between">
387
- {selectedValues.length > 0 && (
388
- <>
389
- <CommandItem
390
- data-testid={`${props.id}_clear`}
391
- onSelect={handleClear}
392
- className="flex-1 justify-center cursor-pointer"
393
- disabled={
394
- options.filter((x) => x.disabled).length ===
395
- options.length
396
- }
397
- >
398
- Clear
399
- </CommandItem>
400
- <Separator
401
- orientation="vertical"
402
- className="flex min-h-6 h-full"
403
- />
404
- </>
405
- )}
406
- <CommandItem
407
- data-testid={`${props.id}_close`}
408
- onSelect={() => setIsPopoverOpen(false)}
409
- className="flex-1 justify-center cursor-pointer max-w-full"
410
- >
411
- Close
412
- </CommandItem>
413
- </div>
414
- </CommandGroup>
415
- </CommandList>
416
- </Command>
417
- </PopoverContent>
418
- {animation > 0 && selectedValues.length > 0 && (
419
- <WandSparkles
420
- className={cn(
421
- "cursor-pointer my-2 text-foreground bg-background w-3 h-3",
422
- isAnimating ? "" : "text-muted-foreground"
423
- )}
424
- onClick={() => setIsAnimating(!isAnimating)}
425
- />
426
- )}
427
- </Popover>
428
- );
429
- }
430
- );
431
-
432
- MultiSelect.displayName = "MultiSelect";
1
+ "use client";
2
+
3
+ // src/components/multi-select.tsx
4
+ import * as React from "react";
5
+ import { cva, type VariantProps } from "class-variance-authority";
6
+ import {
7
+ CheckIcon,
8
+ XCircle,
9
+ ChevronDown,
10
+ XIcon,
11
+ WandSparkles,
12
+ } from "lucide-react";
13
+
14
+ import { cn } from "@ayasofyazilim/ui/lib/utils";
15
+ import { Separator } from "@ayasofyazilim/ui/components/separator";
16
+ import { Button } from "@ayasofyazilim/ui/components/button";
17
+ import { Badge } from "@ayasofyazilim/ui/components/badge";
18
+ import {
19
+ Popover,
20
+ PopoverContent,
21
+ PopoverTrigger,
22
+ } from "@ayasofyazilim/ui/components/popover";
23
+ import {
24
+ Command,
25
+ CommandEmpty,
26
+ CommandGroup,
27
+ CommandInput,
28
+ CommandItem,
29
+ CommandList,
30
+ CommandSeparator,
31
+ } from "@ayasofyazilim/ui/components/command";
32
+
33
+ /**
34
+ * Variants for the multi-select component to handle different styles.
35
+ * Uses class-variance-authority (cva) to define different styles based on "variant" prop.
36
+ */
37
+ const multiSelectVariants = cva(
38
+ "m-1 transition ease-in-out delay-150 hover:-translate-y-1 hover:scale-110 duration-300",
39
+ {
40
+ variants: {
41
+ variant: {
42
+ default:
43
+ "border-foreground/10 text-foreground bg-card hover:bg-card/80",
44
+ secondary:
45
+ "border-foreground/10 bg-secondary text-secondary-foreground hover:bg-secondary/80",
46
+ destructive:
47
+ "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
48
+ inverted: "inverted",
49
+ },
50
+ },
51
+ defaultVariants: {
52
+ variant: "default",
53
+ },
54
+ },
55
+ );
56
+
57
+ /**
58
+ * Props for MultiSelect component
59
+ */
60
+ export interface MultiSelectProps
61
+ extends
62
+ React.ButtonHTMLAttributes<HTMLButtonElement>,
63
+ VariantProps<typeof multiSelectVariants> {
64
+ /**
65
+ * Animation duration in seconds for the visual effects (e.g., bouncing badges).
66
+ * Optional, defaults to 0 (no animation).
67
+ */
68
+ animation?: number;
69
+
70
+ /**
71
+ * If true, renders the multi-select component as a child of another component.
72
+ * Optional, defaults to false.
73
+ */
74
+ asChild?: boolean;
75
+
76
+ /**
77
+ * Additional class names to apply custom styles to the multi-select component.
78
+ * Optional, can be used to add custom styles.
79
+ */
80
+ className?: string;
81
+
82
+ /** The default selected values when the component mounts. */
83
+ defaultValue?: string[];
84
+
85
+ /**
86
+ * Maximum number of items to display. Extra selected items will be summarized.
87
+ * Optional, defaults to 3.
88
+ */
89
+ maxCount?: number;
90
+
91
+ /**
92
+ * The modality of the popover. When set to true, interaction with outside elements
93
+ * will be disabled and only popover content will be visible to screen readers.
94
+ * Optional, defaults to false.
95
+ */
96
+ modalPopover?: boolean;
97
+
98
+ /**
99
+ * Callback function triggered when the selected values change.
100
+ * Receives an array of the new selected values.
101
+ */
102
+ onValueChange?: (value: string[]) => void;
103
+
104
+ /**
105
+ * An array of option objects to be displayed in the multi-select component.
106
+ * Each option object has a label, value, and an optional icon.
107
+ */
108
+ options: {
109
+ /** Optional icon component to display alongside the option. */
110
+ icon?: React.ComponentType<{ className?: string }>;
111
+ /** The text to display for the option. */
112
+ label: string;
113
+ /** The unique value associated with the option. */
114
+ value: string;
115
+ /** Optional badge component to display alongside the option. */
116
+ children?: React.ReactNode;
117
+ disabled?: boolean;
118
+ }[];
119
+
120
+ /**
121
+ * Placeholder text to be displayed when no values are selected.
122
+ * Optional, defaults to "Select options".
123
+ */
124
+ placeholder?: string;
125
+
126
+ /**
127
+ * selectAllLabel text to be displayed for select all option.
128
+ * Optional, defaults to "Select all".
129
+ */
130
+ selectAllLabel?: string;
131
+
132
+ /**
133
+ * If true, the multi-select component will be disabled.
134
+ * Optional, defaults to false.
135
+ */
136
+ disabled?: boolean;
137
+ }
138
+
139
+ export const MultiSelect = React.forwardRef<
140
+ HTMLButtonElement,
141
+ MultiSelectProps
142
+ >(
143
+ (
144
+ {
145
+ options,
146
+ onValueChange,
147
+ variant,
148
+ defaultValue = [],
149
+ placeholder = "Select options",
150
+ selectAllLabel = "Select all",
151
+ animation = 0,
152
+ maxCount = 3,
153
+ modalPopover = false,
154
+ className,
155
+ disabled,
156
+ ...props
157
+ },
158
+ ref,
159
+ ) => {
160
+ const [selectedValues, setSelectedValues] =
161
+ React.useState<string[]>(defaultValue);
162
+ const previousDefaultValue = React.useRef<string[]>(defaultValue);
163
+ React.useEffect(() => {
164
+ if (
165
+ JSON.stringify(previousDefaultValue.current) !==
166
+ JSON.stringify(defaultValue)
167
+ ) {
168
+ setSelectedValues(defaultValue);
169
+ previousDefaultValue.current = defaultValue;
170
+ }
171
+ }, [defaultValue]);
172
+ const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);
173
+ const [isAnimating, setIsAnimating] = React.useState(false);
174
+
175
+ const handleInputKeyDown = (
176
+ event: React.KeyboardEvent<HTMLInputElement>,
177
+ ) => {
178
+ if (event.key === "Enter") {
179
+ setIsPopoverOpen(true);
180
+ } else if (event.key === "Backspace" && !event.currentTarget.value) {
181
+ const newSelectedValues = [...selectedValues];
182
+ newSelectedValues.pop();
183
+ setSelectedValues(newSelectedValues);
184
+ if (onValueChange) onValueChange(newSelectedValues);
185
+ }
186
+ };
187
+
188
+ const toggleOption = (option: string) => {
189
+ const newSelectedValues = selectedValues.includes(option)
190
+ ? selectedValues.filter((value) => value !== option)
191
+ : [...selectedValues, option];
192
+ setSelectedValues(newSelectedValues);
193
+ if (onValueChange) onValueChange(newSelectedValues);
194
+ };
195
+
196
+ const handleClear = () => {
197
+ setSelectedValues(
198
+ selectedValues.filter(
199
+ (value) =>
200
+ !options.map((o) => !o.disabled && o.value).includes(value),
201
+ ),
202
+ );
203
+ if (onValueChange) onValueChange([]);
204
+ };
205
+
206
+ const handleTogglePopover = () => {
207
+ setIsPopoverOpen((prev) => !prev);
208
+ };
209
+
210
+ const clearExtraOptions = () => {
211
+ const newSelectedValues = selectedValues.slice(0, maxCount);
212
+ setSelectedValues(newSelectedValues);
213
+ if (onValueChange) onValueChange(newSelectedValues);
214
+ };
215
+
216
+ const toggleAll = () => {
217
+ if (selectedValues.length === options.length) {
218
+ handleClear();
219
+ } else {
220
+ const allValues = options.map((option) => option.value);
221
+ setSelectedValues(allValues);
222
+ if (onValueChange) onValueChange(allValues);
223
+ }
224
+ };
225
+
226
+ return (
227
+ <Popover
228
+ open={isPopoverOpen}
229
+ onOpenChange={setIsPopoverOpen}
230
+ modal={modalPopover}
231
+ >
232
+ <PopoverTrigger asChild className="w-full">
233
+ <Button
234
+ ref={ref}
235
+ data-testid={props.id}
236
+ type="button"
237
+ disabled={disabled}
238
+ onClick={handleTogglePopover}
239
+ className={cn(
240
+ "flex w-full p-1 rounded-md border min-h-9 h-auto items-center justify-between bg-inherit hover:bg-inherit",
241
+ className,
242
+ )}
243
+ >
244
+ {selectedValues.length > 0 ? (
245
+ <div className="flex justify-between items-center w-full">
246
+ <div className="flex flex-wrap items-center">
247
+ {selectedValues.slice(0, maxCount).map((value) => {
248
+ const option = options.find((o) => o.value === value);
249
+ const IconComponent = option?.icon;
250
+ return (
251
+ <Badge
252
+ key={value}
253
+ className={cn(
254
+ isAnimating ? "animate-bounce" : "",
255
+ multiSelectVariants({ variant }),
256
+ )}
257
+ style={{ animationDuration: `${animation}s` }}
258
+ >
259
+ {IconComponent && (
260
+ <IconComponent className="h-4 w-4 mr-2" />
261
+ )}
262
+ {option?.label}
263
+ {!option?.disabled && (
264
+ <XCircle
265
+ className="ml-2 h-4 w-4 cursor-pointer"
266
+ onClick={(event) => {
267
+ event.stopPropagation();
268
+ toggleOption(value);
269
+ }}
270
+ />
271
+ )}
272
+ </Badge>
273
+ );
274
+ })}
275
+ {selectedValues.length > maxCount && (
276
+ <Badge
277
+ className={cn(
278
+ "bg-transparent text-foreground border-foreground/1 hover:bg-transparent",
279
+ isAnimating ? "animate-bounce" : "",
280
+ multiSelectVariants({ variant }),
281
+ )}
282
+ style={{ animationDuration: `${animation}s` }}
283
+ >
284
+ {`+ ${selectedValues.length - maxCount} more`}
285
+ <XCircle
286
+ className="ml-2 h-4 w-4 cursor-pointer"
287
+ onClick={(event) => {
288
+ event.stopPropagation();
289
+ clearExtraOptions();
290
+ }}
291
+ />
292
+ </Badge>
293
+ )}
294
+ </div>
295
+ <div className="flex items-center justify-between">
296
+ {options.filter((x) => x.disabled).length !==
297
+ options.length && (
298
+ <XIcon
299
+ className="h-4 mx-2 cursor-pointer text-muted-foreground"
300
+ onClick={(event) => {
301
+ event.stopPropagation();
302
+ handleClear();
303
+ }}
304
+ />
305
+ )}
306
+ <Separator
307
+ orientation="vertical"
308
+ className="flex min-h-6 h-full"
309
+ />
310
+ <ChevronDown className="h-4 mx-2 cursor-pointer text-muted-foreground" />
311
+ </div>
312
+ </div>
313
+ ) : (
314
+ <div className="flex items-center justify-between w-full mx-auto">
315
+ <span className="text-sm text-black mx-3 font-normal">
316
+ {placeholder}
317
+ </span>
318
+ <ChevronDown className="h-4 cursor-pointer text-muted-foreground mx-2" />
319
+ </div>
320
+ )}
321
+ </Button>
322
+ </PopoverTrigger>
323
+ <PopoverContent
324
+ className="p-0"
325
+ onEscapeKeyDown={() => setIsPopoverOpen(false)}
326
+ >
327
+ <Command className="w-full">
328
+ <CommandInput
329
+ data-testid={`${props.id}_search`}
330
+ placeholder="Search..."
331
+ onKeyDown={handleInputKeyDown}
332
+ />
333
+ <CommandList>
334
+ <CommandEmpty>No results found.</CommandEmpty>
335
+ <CommandGroup>
336
+ <CommandItem
337
+ data-testid={`${props.id}_select_all`}
338
+ key="all"
339
+ onSelect={toggleAll}
340
+ className="cursor-pointer"
341
+ disabled={
342
+ options.filter((x) => x.disabled).length === options.length
343
+ }
344
+ >
345
+ <div
346
+ className={cn(
347
+ "mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
348
+ selectedValues.length === options.length
349
+ ? "bg-primary text-primary-foreground"
350
+ : "opacity-50 [&_svg]:invisible",
351
+ )}
352
+ >
353
+ <CheckIcon className="h-4 w-4" />
354
+ </div>
355
+ <span>({selectAllLabel})</span>
356
+ </CommandItem>
357
+ {options.map((option) => {
358
+ const isSelected = selectedValues.includes(option.value);
359
+ return (
360
+ <CommandItem
361
+ data-testid={`${props.id}_${option.value}`}
362
+ key={option.value}
363
+ onSelect={() => toggleOption(option.value)}
364
+ className="cursor-pointer"
365
+ disabled={option.disabled}
366
+ >
367
+ <div
368
+ className={cn(
369
+ "mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
370
+ isSelected
371
+ ? "bg-primary text-primary-foreground"
372
+ : "opacity-50 [&_svg]:invisible",
373
+ )}
374
+ >
375
+ <CheckIcon className="h-4 w-4" />
376
+ </div>
377
+ {option.icon && (
378
+ <option.icon className="mr-2 h-4 w-4 text-muted-foreground" />
379
+ )}
380
+ <span>{option.label}</span>
381
+ {option.children}
382
+ </CommandItem>
383
+ );
384
+ })}
385
+ </CommandGroup>
386
+ <CommandSeparator />
387
+ <CommandGroup>
388
+ <div className="flex items-center justify-between">
389
+ {selectedValues.length > 0 && (
390
+ <>
391
+ <CommandItem
392
+ data-testid={`${props.id}_clear`}
393
+ onSelect={handleClear}
394
+ className="flex-1 justify-center cursor-pointer"
395
+ disabled={
396
+ options.filter((x) => x.disabled).length ===
397
+ options.length
398
+ }
399
+ >
400
+ Clear
401
+ </CommandItem>
402
+ <Separator
403
+ orientation="vertical"
404
+ className="flex min-h-6 h-full"
405
+ />
406
+ </>
407
+ )}
408
+ <CommandItem
409
+ data-testid={`${props.id}_close`}
410
+ onSelect={() => setIsPopoverOpen(false)}
411
+ className="flex-1 justify-center cursor-pointer max-w-full"
412
+ >
413
+ Close
414
+ </CommandItem>
415
+ </div>
416
+ </CommandGroup>
417
+ </CommandList>
418
+ </Command>
419
+ </PopoverContent>
420
+ {animation > 0 && selectedValues.length > 0 && (
421
+ <WandSparkles
422
+ className={cn(
423
+ "cursor-pointer my-2 text-foreground bg-background w-3 h-3",
424
+ isAnimating ? "" : "text-muted-foreground",
425
+ )}
426
+ onClick={() => setIsAnimating(!isAnimating)}
427
+ />
428
+ )}
429
+ </Popover>
430
+ );
431
+ },
432
+ );
433
+
434
+ MultiSelect.displayName = "MultiSelect";