@rotki/ui-library 2.20.2 → 2.22.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 (333) hide show
  1. package/dist/__test__/options.d.ts +7 -0
  2. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +1 -1
  3. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  4. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js +2 -2
  5. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  6. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js +1 -1
  7. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
  8. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +1 -1
  9. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js +1 -1
  11. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/avatars/avatar-props.js +1 -1
  13. package/dist/components/avatars/avatar-props.js.map +1 -1
  14. package/dist/components/avatars/use-avatar-group.js.map +1 -1
  15. package/dist/components/buttons/button/RuiButton.js.map +1 -1
  16. package/dist/components/buttons/button/RuiButton.vue.d.ts +2 -2
  17. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js +3 -3
  18. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/buttons/button/button-props.js.map +1 -1
  20. package/dist/components/buttons/button/button-styles.js.map +1 -1
  21. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +2 -2
  22. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +3 -3
  24. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +2 -2
  26. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  27. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js +3 -3
  28. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
  30. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +6 -4
  31. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/components/calendar/state.js.map +1 -1
  33. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +1 -1
  34. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js +1 -1
  36. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +1 -1
  38. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  39. package/dist/components/chips/chip-props.js.map +1 -1
  40. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +1 -1
  41. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js +1 -1
  43. package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js.map +1 -1
  44. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +1 -1
  45. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js +1 -1
  47. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js +1 -1
  49. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/components/color-picker/utils.js.map +1 -1
  51. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  52. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +5 -3
  53. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  54. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js +3 -3
  55. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  56. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js +2 -2
  57. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/date-time-picker/date-time-picker-styles.js.map +1 -1
  59. package/dist/components/date-time-picker/dayjs-setup.js.map +1 -1
  60. package/dist/components/date-time-picker/segment-config.js.map +1 -1
  61. package/dist/components/date-time-picker/segment-utils.js.map +1 -1
  62. package/dist/components/date-time-picker/timezones.js.map +1 -1
  63. package/dist/components/date-time-picker/types.js +1 -1
  64. package/dist/components/date-time-picker/types.js.map +1 -1
  65. package/dist/components/date-time-picker/use-date-time-selection.js +2 -2
  66. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
  67. package/dist/components/date-time-picker/use-input-handler.js.map +1 -1
  68. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  69. package/dist/components/date-time-picker/utils.js.map +1 -1
  70. package/dist/components/divider/RuiDivider.vue_vue_type_script_setup_true_lang.js +1 -1
  71. package/dist/components/divider/RuiDivider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  73. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +26 -2
  74. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +150 -54
  75. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  76. package/dist/components/forms/auto-complete/auto-complete-styles.js.map +1 -1
  77. package/dist/components/forms/category-picker/RuiCategoryPicker.js +7 -0
  78. package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -0
  79. package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +134 -0
  80. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +561 -0
  81. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  82. package/dist/components/forms/category-picker/category-picker-styles.d.ts +432 -0
  83. package/dist/components/forms/category-picker/category-picker-styles.js +59 -0
  84. package/dist/components/forms/category-picker/category-picker-styles.js.map +1 -0
  85. package/dist/components/forms/check-control-styles.js.map +1 -1
  86. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js +2 -2
  87. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js +2 -2
  89. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  90. package/dist/components/forms/checkbox/checkbox-group/context.js.map +1 -1
  91. package/dist/components/forms/file-upload/RuiFileUpload.js +7 -0
  92. package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -0
  93. package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +61 -0
  94. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +269 -0
  95. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -0
  96. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js +2 -2
  97. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js +2 -2
  99. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  100. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js +2 -2
  101. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  102. package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
  103. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +9 -3
  104. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js +2 -2
  106. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  107. package/dist/components/forms/select/menu-select-styles.js.map +1 -1
  108. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js +2 -2
  109. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/components/forms/slider/slider-styles.js.map +1 -1
  111. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +2 -2
  112. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  113. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js +3 -3
  114. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
  116. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js +3 -3
  117. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
  119. package/dist/components/forms/text-input-styles.js.map +1 -1
  120. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js +1 -1
  121. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  122. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  123. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  124. package/dist/components/index.d.ts +4 -2
  125. package/dist/components/index.js +4 -2
  126. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js +1 -1
  127. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  128. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js +1 -1
  129. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/loaders/skeleton-type.js.map +1 -1
  131. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js +1 -1
  132. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js.map +1 -1
  133. package/dist/components/logos/use-logo-sources.js.map +1 -1
  134. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +1 -1
  135. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  136. package/dist/components/overlays/badge/badge-props.js.map +1 -1
  137. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue_vue_type_script_setup_true_lang.js +2 -2
  138. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue_vue_type_script_setup_true_lang.js.map +1 -1
  139. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +3 -3
  140. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  141. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  142. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +6 -0
  143. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +5 -4
  144. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  145. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js +3 -3
  146. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  147. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +2 -2
  148. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
  149. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +1 -1
  150. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  151. package/dist/components/overlays/tooltip/tooltip-styles.js.map +1 -1
  152. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js +1 -1
  153. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  154. package/dist/components/progress/progress-props.js.map +1 -1
  155. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +2 -2
  156. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  157. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +1 -1
  158. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  159. package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  160. package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  162. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  163. package/dist/components/steppers/footer-stepper-variant.js.map +1 -1
  164. package/dist/components/tables/RuiDataTable.js.map +1 -1
  165. package/dist/components/tables/RuiDataTable.vue.d.ts +23 -2
  166. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +186 -217
  167. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  168. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js +1 -1
  169. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +1 -1
  171. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  172. package/dist/components/tables/RuiTableHead.js.map +1 -1
  173. package/dist/components/tables/RuiTableHead.vue.d.ts +11 -1
  174. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +1 -2
  175. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  176. package/dist/components/tables/RuiTablePagination.js.map +1 -1
  177. package/dist/components/tables/RuiTablePagination.vue.d.ts +5 -0
  178. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +24 -8
  179. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  180. package/dist/components/tables/data-table/RuiDataTableBody.js +7 -0
  181. package/dist/components/tables/data-table/RuiDataTableBody.js.map +1 -0
  182. package/dist/components/tables/data-table/RuiDataTableBody.vue.d.ts +55 -0
  183. package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js +78 -0
  184. package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js.map +1 -0
  185. package/dist/components/tables/data-table/RuiDataTableCell.js +7 -0
  186. package/dist/components/tables/data-table/RuiDataTableCell.js.map +1 -0
  187. package/dist/components/tables/data-table/RuiDataTableCell.vue.d.ts +30 -0
  188. package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js +54 -0
  189. package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js.map +1 -0
  190. package/dist/components/tables/data-table/RuiDataTableEmptyRow.js +7 -0
  191. package/dist/components/tables/data-table/RuiDataTableEmptyRow.js.map +1 -0
  192. package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue.d.ts +19 -0
  193. package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue_vue_type_script_setup_true_lang.js +43 -0
  194. package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
  195. package/dist/components/tables/data-table/RuiDataTableExpandedRow.js +7 -0
  196. package/dist/components/tables/data-table/RuiDataTableExpandedRow.js.map +1 -0
  197. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue.d.ts +26 -0
  198. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js +31 -0
  199. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
  200. package/dist/components/tables/data-table/RuiDataTableGroupRow.js +7 -0
  201. package/dist/components/tables/data-table/RuiDataTableGroupRow.js.map +1 -0
  202. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue.d.ts +32 -0
  203. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js +85 -0
  204. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
  205. package/dist/components/tables/data-table/RuiDataTableLoadingRow.js +7 -0
  206. package/dist/components/tables/data-table/RuiDataTableLoadingRow.js.map +1 -0
  207. package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue.d.ts +3 -0
  208. package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js +26 -0
  209. package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
  210. package/dist/components/tables/data-table/RuiDataTableMobileSort.js +7 -0
  211. package/dist/components/tables/data-table/RuiDataTableMobileSort.js.map +1 -0
  212. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue.d.ts +33 -0
  213. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js +101 -0
  214. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js.map +1 -0
  215. package/dist/components/tables/data-table/RuiDataTableRow.js +7 -0
  216. package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -0
  217. package/dist/components/tables/data-table/RuiDataTableRow.vue.d.ts +31 -0
  218. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +142 -0
  219. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
  220. package/dist/components/tables/data-table/context.d.ts +73 -0
  221. package/dist/components/tables/data-table/context.js +100 -0
  222. package/dist/components/tables/data-table/context.js.map +1 -0
  223. package/dist/components/tables/data-table-styles.d.ts +30 -1
  224. package/dist/components/tables/data-table-styles.js +9 -2
  225. package/dist/components/tables/data-table-styles.js.map +1 -1
  226. package/dist/components/tables/table-props.d.ts +5 -0
  227. package/dist/components/tables/table-props.js +5 -1
  228. package/dist/components/tables/table-props.js.map +1 -1
  229. package/dist/components/tables/use-pagination-navigation.js.map +1 -1
  230. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +1 -1
  231. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  232. package/dist/components/tabs/tab/use-tab-link.js.map +1 -1
  233. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js +1 -1
  234. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  235. package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
  236. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +2 -2
  237. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
  238. package/dist/components/tabs/tab-props.js.map +1 -1
  239. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +2 -2
  240. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/components/tabs/tabs/use-tab-routing.js +1 -1
  242. package/dist/components/tabs/tabs/use-tab-routing.js.map +1 -1
  243. package/dist/components/tabs/tabs/use-tab-scroll.js.map +1 -1
  244. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js +2 -2
  245. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  246. package/dist/components/time-picker/time-picker-styles.js.map +1 -1
  247. package/dist/composables/breakpoint.js.map +1 -1
  248. package/dist/composables/defaults/table.d.ts +12 -0
  249. package/dist/composables/defaults/table.js.map +1 -1
  250. package/dist/composables/dropdown-menu.d.ts +12 -1
  251. package/dist/composables/dropdown-menu.js +46 -7
  252. package/dist/composables/dropdown-menu.js.map +1 -1
  253. package/dist/composables/floating.js +1 -1
  254. package/dist/composables/floating.js.map +1 -1
  255. package/dist/composables/forms/auto-complete/focus.js.map +1 -1
  256. package/dist/composables/forms/auto-complete/index.js +5 -4
  257. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  258. package/dist/composables/forms/auto-complete/search.d.ts +6 -1
  259. package/dist/composables/forms/auto-complete/search.js +12 -1
  260. package/dist/composables/forms/auto-complete/search.js.map +1 -1
  261. package/dist/composables/forms/auto-complete/value.js.map +1 -1
  262. package/dist/composables/forms/category-picker/use-category-picker.d.ts +76 -0
  263. package/dist/composables/forms/category-picker/use-category-picker.js +141 -0
  264. package/dist/composables/forms/category-picker/use-category-picker.js.map +1 -0
  265. package/dist/composables/forms/use-prepend-append-width.js.map +1 -1
  266. package/dist/composables/icons.js.map +1 -1
  267. package/dist/composables/popper.js.map +1 -1
  268. package/dist/composables/sticky-header.js.map +1 -1
  269. package/dist/composables/tables/data-table/columns.d.ts +7 -1
  270. package/dist/composables/tables/data-table/columns.js +18 -10
  271. package/dist/composables/tables/data-table/columns.js.map +1 -1
  272. package/dist/composables/tables/data-table/expansion.js.map +1 -1
  273. package/dist/composables/tables/data-table/grouping.d.ts +4 -6
  274. package/dist/composables/tables/data-table/grouping.js +38 -24
  275. package/dist/composables/tables/data-table/grouping.js.map +1 -1
  276. package/dist/composables/tables/data-table/pagination.d.ts +4 -4
  277. package/dist/composables/tables/data-table/pagination.js +63 -21
  278. package/dist/composables/tables/data-table/pagination.js.map +1 -1
  279. package/dist/composables/tables/data-table/selection.js +16 -6
  280. package/dist/composables/tables/data-table/selection.js.map +1 -1
  281. package/dist/composables/tables/data-table/sort.d.ts +4 -3
  282. package/dist/composables/tables/data-table/sort.js +78 -40
  283. package/dist/composables/tables/data-table/sort.js.map +1 -1
  284. package/dist/composables/tables/data-table/types.d.ts +3 -1
  285. package/dist/composables/tables/data-table/types.js +6 -2
  286. package/dist/composables/tables/data-table/types.js.map +1 -1
  287. package/dist/composables/theme.js.map +1 -1
  288. package/dist/composables/timeout-manager.js.map +1 -1
  289. package/dist/composables/use-rui-i18n.js.map +1 -1
  290. package/dist/consts/colors.js.map +1 -1
  291. package/dist/consts/time-accuracy.js.map +1 -1
  292. package/dist/i18n/keys.js.map +1 -1
  293. package/dist/icons/icons_1.d.ts +12 -12
  294. package/dist/icons/icons_1.js +140 -157
  295. package/dist/icons/icons_1.js.map +1 -1
  296. package/dist/icons/icons_2.d.ts +13 -13
  297. package/dist/icons/icons_2.js +128 -149
  298. package/dist/icons/icons_2.js.map +1 -1
  299. package/dist/icons/icons_3.d.ts +18 -18
  300. package/dist/icons/icons_3.js +244 -282
  301. package/dist/icons/icons_3.js.map +1 -1
  302. package/dist/icons/icons_4.d.ts +251 -6
  303. package/dist/icons/icons_4.js +3016 -75
  304. package/dist/icons/icons_4.js.map +1 -1
  305. package/dist/icons/icons_5.d.ts +20 -0
  306. package/dist/icons/icons_5.js +221 -0
  307. package/dist/icons/icons_5.js.map +1 -0
  308. package/dist/icons/index.d.ts +2 -1
  309. package/dist/icons/index.js +297 -32
  310. package/dist/icons/index.js.map +1 -1
  311. package/dist/index.js +9 -6
  312. package/dist/index.js.map +1 -1
  313. package/dist/library-icons.json +3 -0
  314. package/dist/style.css +200 -0
  315. package/dist/theme/index.js.map +1 -1
  316. package/dist/types/stepper.js.map +1 -1
  317. package/dist/types/theme.js.map +1 -1
  318. package/dist/utils/assert.js.map +1 -1
  319. package/dist/utils/blockie.js.map +1 -1
  320. package/dist/utils/form-text-detail.js.map +1 -1
  321. package/dist/utils/helpers.d.ts +4 -0
  322. package/dist/utils/helpers.js +21 -1
  323. package/dist/utils/helpers.js.map +1 -1
  324. package/dist/utils/is-equal.js.map +1 -1
  325. package/dist/utils/tv.js.map +1 -1
  326. package/dist/vite-plugin/index.js +6 -5
  327. package/dist/vite-plugin/index.js.map +1 -1
  328. package/dist/vite-plugin/scanner.d.ts +1 -1
  329. package/dist/vite-plugin/scanner.js +10 -7
  330. package/dist/vite-plugin/scanner.js.map +1 -1
  331. package/dist/vite-plugin/types.d.ts +9 -0
  332. package/dist/web-types.json +2283 -1088
  333. package/package.json +35 -35
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAutoComplete.js","names":[],"sources":["../../../../src/components/forms/auto-complete/RuiAutoComplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue, TItem\">\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiChip from '@/components/chips/RuiChip.vue';\nimport { autoCompleteStyles, type AutoCompleteVariant } from '@/components/forms/auto-complete/auto-complete-styles';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu, { type MenuProps } from '@/components/overlays/menu/RuiMenu.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport {\n type KeyOfType,\n useDropdownMenu,\n useDropdownOptionProperty,\n} from '@/composables/dropdown-menu';\nimport {\n useAutoCompleteFocus,\n useAutoCompleteKeyboardNavigation,\n useAutoCompleteSearch,\n useAutoCompleteValue,\n} from '@/composables/forms/auto-complete';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { getNonRootAttrs, getRootAttrs, getTextToken } from '@/utils/helpers';\nimport { isEqual } from '@/utils/is-equal';\nimport { cn } from '@/utils/tv';\n\nexport type AutoCompleteModelValue<TValue> =\n TValue extends Array<infer U> ? U[] : TValue | undefined;\n\nexport interface RuiAutoCompleteClassNames {\n root?: VueClassValue;\n label?: VueClassValue;\n menu?: VueClassValue;\n}\n\nexport interface AutoCompleteProps<TValue, TItem> {\n options?: TItem[];\n keyAttr?: KeyOfType<TItem, TValue extends Array<infer U> ? U : TValue>;\n textAttr?: keyof TItem;\n disabled?: boolean;\n loading?: boolean;\n readOnly?: boolean;\n dense?: boolean;\n clearable?: boolean;\n label?: string;\n menuOptions?: MenuProps;\n classNames?: RuiAutoCompleteClassNames;\n /** @deprecated Use `classNames.label` instead */\n labelClass?: string;\n /** @deprecated Use `classNames.menu` instead */\n menuClass?: string;\n prependWidth?: number;\n appendWidth?: number;\n itemHeight?: number;\n variant?: AutoCompleteVariant;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n autoSelectFirst?: boolean;\n chips?: boolean;\n noFilter?: boolean;\n hideNoData?: boolean;\n noDataText?: string;\n filter?: (item: TItem, queryText: string) => boolean;\n hideSelected?: boolean;\n placeholder?: string;\n returnObject?: boolean;\n customValue?: boolean;\n hideCustomValue?: boolean;\n required?: boolean;\n hideSearchInput?: boolean;\n hideSelectionWrapper?: boolean;\n}\n\ndefineOptions({\n name: 'RuiAutoComplete',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<AutoCompleteModelValue<TValue>>({ required: true });\n\nconst searchInputModel = defineModel<string>('searchInput', { default: '' });\n\nconst {\n options = [],\n disabled = false,\n loading = false,\n readOnly = false,\n dense = false,\n clearable = false,\n hideDetails = false,\n chips = false,\n label = 'Select',\n menuOptions,\n classNames,\n labelClass,\n menuClass,\n variant = 'default',\n hint,\n keyAttr,\n textAttr,\n itemHeight,\n errorMessages = [],\n successMessages = [],\n autoSelectFirst = false,\n noFilter = false,\n hideNoData = false,\n noDataText = 'No data available',\n filter,\n hideSelected = false,\n placeholder = '',\n returnObject = false,\n customValue = false,\n hideCustomValue = false,\n required = false,\n hideSearchInput = false,\n hideSelectionWrapper = false,\n} = defineProps<AutoCompleteProps<TValue, TItem>>();\n\nconst slots = defineSlots<{\n 'activator'?: (props: {\n disabled: boolean;\n value: TItem[];\n variant: string;\n readOnly: boolean;\n attrs: Record<string, unknown>;\n open: boolean;\n hasError: boolean;\n hasSuccess: boolean;\n }) => any;\n 'activator.label'?: (props: { value: TItem[] }) => any;\n 'selection.prepend'?: (props: { index: number; item: TItem }) => any;\n 'selection'?: (props: { index: number; item: TItem; chipAttrs: Record<string, unknown> }) => any;\n 'item.prepend'?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n 'item'?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n 'item.append'?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n 'no-data'?: () => any;\n}>();\n\nconst { getText, getIdentifier } = useDropdownOptionProperty<TValue, TItem>({\n keyAttr,\n textAttr,\n});\n\nconst textInput = useTemplateRef<HTMLInputElement>('textInput');\nconst activator = useTemplateRef<HTMLDivElement>('activator');\nconst menuRef = useTemplateRef<HTMLDivElement>('menuRef');\nconst menuWrapperRef = useTemplateRef<HTMLDivElement>('menuWrapperRef');\n\nconst { focused: activatorFocusedWithin } = useFocusWithin(activator);\nconst { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);\nconst { focused: searchInputFocused } = useFocus(textInput);\nconst { focused: activatorFocused } = useFocus(activator);\n\nconst {\n internalSearch,\n filteredOptions,\n justOpened,\n updateInternalSearch,\n textValueToProperValue,\n} = useAutoCompleteSearch<TItem>(\n () => options,\n searchInputModel,\n {\n keyAttr: () => keyAttr,\n textAttr: () => textAttr,\n noFilter: () => noFilter,\n filter: () => filter,\n customValue: () => customValue,\n hideCustomValue: () => hideCustomValue,\n returnObject: () => returnObject,\n },\n);\n\nconst isOpen = ref<boolean>(false);\nconst isHovered = ref<boolean>(false);\n\n// Calculate multiple from modelValue directly to avoid circular dependency\nconst multiple = computed<boolean>(() => Array.isArray(get(modelValue)));\n\nconst shouldApplyValueAsSearch = computed<boolean>(\n () => !(slots.selection || get(multiple) || chips),\n);\n\nconst { value, setSelected } = useAutoCompleteValue<AutoCompleteModelValue<TValue>, TItem>(\n modelValue,\n () => options,\n {\n keyAttr: () => keyAttr,\n returnObject: () => returnObject,\n customValue: () => customValue,\n },\n {\n getIdentifier,\n getText,\n textValueToProperValue,\n shouldApplyValueAsSearch,\n isOpen,\n multiple,\n updateInternalSearch,\n },\n);\n\nconst resolvedItemHeight = itemHeight ?? (dense ? 30 : 48);\n\nconst {\n containerProps,\n wrapperProps,\n renderedData,\n menuWidth,\n isActiveItem,\n itemIndexInValue,\n highlightedIndex,\n moveHighlight,\n applyHighlighted,\n optionsWithSelectedHidden,\n userNavigated,\n} = useDropdownMenu<TValue, TItem>({\n itemHeight: resolvedItemHeight,\n keyAttr,\n textAttr,\n options: filteredOptions,\n dense: () => dense,\n value,\n menuRef,\n setValue,\n autoSelectFirst,\n hideSelected,\n isOpen,\n getText,\n getIdentifier,\n});\n\nconst {\n focusedValueIndex,\n moveSelectedValueHighlight,\n onEnter,\n onInputDeletePressed,\n onTab,\n setValueFocus,\n} = useAutoCompleteKeyboardNavigation<TItem>(\n {\n chips: () => chips,\n customValue: () => customValue,\n multiple,\n },\n {\n activator,\n applyHighlighted,\n clear,\n filteredOptions,\n getText,\n highlightedIndex,\n internalSearch,\n isOpen,\n removeValue: (item: TItem): void => { setValue(item); },\n searchInputFocused,\n setSearchAsValue,\n userNavigated,\n value,\n },\n);\n\nconst {\n anyFocused: focusAnyFocused,\n inputClass: focusInputClass,\n onActivatorFocused: focusOnActivatorFocused,\n onInputFocused: focusOnInputFocused,\n setInputFocus: focusSetInputFocus,\n} = useAutoCompleteFocus(\n {\n customValue: () => customValue,\n disabled: () => disabled,\n shouldApplyValueAsSearch,\n },\n {\n activatorFocused,\n activatorFocusedWithin,\n focusedValueIndex,\n internalSearch,\n isOpen,\n justOpened,\n menuWrapperFocusedWithin,\n searchInputFocused,\n setSearchAsValue,\n textInput,\n updateInternalSearch,\n },\n);\n\nconst menuMinHeight = computed<number>(\n () => Math.min(5, get(optionsWithSelectedHidden).length) * resolvedItemHeight,\n);\n\nconst { hasError, hasSuccess } = useFormTextDetail(\n () => errorMessages,\n () => successMessages,\n);\n\nconst valueSet = computed<boolean>(() => get(value).length > 0);\n\nconst usedPlaceholder = computed<string>(() => {\n if (get(searchInputFocused))\n return placeholder;\n return '';\n});\n\nconst outlined = computed<boolean>(() => variant === 'outlined');\nconst float = computed<boolean>(() => (get(isOpen) || get(valueSet) || get(searchInputFocused)) && get(outlined));\n\nconst legendText = computed<string>(() => {\n if (!get(float) || !label)\n return '';\n return required ? `${label} ﹡` : label;\n});\n\nconst ui = computed<ReturnType<typeof autoCompleteStyles>>(() => autoCompleteStyles({\n filled: variant === 'filled',\n outlined: get(outlined),\n float: get(float),\n opened: get(isOpen),\n hovered: get(isHovered),\n dense,\n disabled,\n readonly: readOnly,\n hasError: get(hasError),\n hasSuccess: get(hasSuccess) && !get(hasError),\n}));\n\nconst highlightedClass = autoCompleteStyles({}).highlighted();\n\nfunction updateSearchInput(event: Event): void {\n const target = event.target;\n if (!(target instanceof HTMLInputElement))\n return;\n\n const value = target.value;\n set(isOpen, true);\n updateInternalSearch(value);\n set(justOpened, false);\n}\n\nasync function setValue(val: TItem, skipRefocused = false): Promise<void> {\n const isMultiple = get(multiple);\n\n if (isMultiple) {\n const newValue = [...get(value)];\n const indexInValue = itemIndexInValue(val);\n if (indexInValue === -1) {\n updateInternalSearch();\n newValue.push(val);\n }\n else {\n newValue.splice(indexInValue, 1);\n }\n set(value, newValue);\n }\n else {\n if (get(shouldApplyValueAsSearch))\n updateInternalSearch(getText(val));\n else updateInternalSearch();\n\n set(value, [val]);\n }\n\n if (!isMultiple) {\n if (!skipRefocused) {\n set(activatorFocused, true);\n get(activator)?.focus();\n await nextTick(() => {\n set(isOpen, false);\n });\n }\n else {\n set(isOpen, false);\n }\n }\n else if (!skipRefocused) {\n set(searchInputFocused, true);\n }\n}\n\nfunction setSearchAsValue(): void {\n const searchToBeValue = get(internalSearch);\n if (!searchToBeValue)\n return;\n\n const newValue: TItem = textValueToProperValue(searchToBeValue);\n setValue(newValue, true);\n}\n\nfunction clear(): void {\n updateInternalSearch();\n set(modelValue, (Array.isArray(get(modelValue)) ? [] : undefined) as AutoCompleteModelValue<TValue>);\n}\n\nfunction chipAttrs(item: TItem, index: number): Record<string, unknown> {\n return {\n 'data-index': index,\n 'data-value': getIdentifier(item),\n 'onKeydown': (event: KeyboardEvent): void => {\n const { key } = event;\n if (['Backspace', 'Delete'].includes(key)) {\n event.stopPropagation();\n event.preventDefault();\n setValue(item);\n }\n },\n 'onClick': (e: MouseEvent): void => {\n e.stopPropagation();\n setValueFocus(index);\n },\n 'onClick:close': (): void => {\n setValue(item);\n },\n };\n}\n\nfunction setSelectionRange(start: number, end: number): void {\n set(searchInputFocused, true);\n get(textInput)?.setSelectionRange?.(start, end);\n}\n\nfunction arrowClicked(event: MouseEvent): void {\n if (get(isOpen)) {\n set(isOpen, false);\n event.stopPropagation();\n }\n}\n\nfunction openMenu(): void {\n set(isOpen, true);\n}\n\nfunction closeMenu(): void {\n set(isOpen, false);\n}\n\n// Optimize options watcher with shallow comparison first\nwatch(() => options, (curr, old) => {\n if (curr === old || customValue)\n return;\n\n // Only do deep comparison if reference changed\n if (isEqual(curr, old))\n return;\n\n setSelected(get(value));\n});\n\ndefineExpose({\n closeMenu,\n focus: focusSetInputFocus,\n openMenu,\n setSelectionRange,\n});\n</script>\n\n<template>\n <RuiMenu\n v-model=\"isOpen\"\n v-bind=\"{ ...getRootAttrs($attrs, []), ...menuOptions }\"\n :class=\"ui.wrapper({ class: cn($attrs.class) })\"\n placement=\"bottom-start\"\n :close-on-content-click=\"false\"\n :full-width=\"true\"\n :persist-on-activator-click=\"true\"\n :menu-class=\"[\n { hidden: optionsWithSelectedHidden.length === 0 && customValue && !slots['no-data'] },\n menuOptions?.menuClass,\n ]\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n :dense=\"dense\"\n :show-details=\"!hideDetails\"\n :disabled=\"disabled\"\n disable-auto-focus\n >\n <template #activator=\"{ attrs, open, hasError: slotHasError, hasSuccess: slotHasSuccess }\">\n <slot\n name=\"activator\"\n v-bind=\"{ disabled, value, variant, readOnly, attrs, open, hasError: slotHasError, hasSuccess: slotHasSuccess }\"\n >\n <div\n ref=\"activator\"\n :class=\"ui.activator({ class: cn(classNames?.label) ?? labelClass })\"\n v-bind=\"{\n ...getNonRootAttrs($attrs, ['onClick', 'class']),\n ...(readOnly ? {} : attrs),\n }\"\n role=\"combobox\"\n :aria-expanded=\"open\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readOnly || undefined\"\n :aria-required=\"required || undefined\"\n :aria-busy=\"loading || undefined\"\n data-id=\"activator\"\n :aria-invalid=\"hasError\"\n :tabindex=\"disabled || readOnly ? -1 : 0\"\n @mouseenter=\"isHovered = true\"\n @mouseleave=\"isHovered = false\"\n @click=\"focusSetInputFocus()\"\n @focus=\"focusOnActivatorFocused()\"\n @keydown.enter=\"onEnter($event)\"\n @keydown.tab=\"onTab($event)\"\n @keydown.left=\"moveSelectedValueHighlight($event, false)\"\n @keydown.right=\"moveSelectedValueHighlight($event, true)\"\n @keydown.up.prevent=\"moveHighlight(true)\"\n @keydown.down.prevent=\"moveHighlight(false)\"\n @keydown.home.prevent=\"highlightedIndex = 0\"\n @keydown.end.prevent=\"highlightedIndex = optionsWithSelectedHidden.length - 1\"\n >\n <span\n v-if=\"outlined || (!valueSet && !searchInputFocused)\"\n :class=\"[\n ui.label(),\n { 'pr-2': !valueSet && !open && outlined },\n ]\"\n >\n <slot\n name=\"activator.label\"\n v-bind=\"{ value }\"\n >\n {{ label }}\n </slot>\n <span\n v-if=\"required\"\n :class=\"ui.required()\"\n >\n ﹡\n </span>\n </span>\n <div\n data-id=\"value\"\n :class=\"ui.value()\"\n >\n <template\n v-for=\"(item, i) in value\"\n :key=\"getIdentifier(item)\"\n >\n <RuiChip\n v-if=\"chips\"\n :key=\"getTextToken(getIdentifier(item))\"\n tabindex=\"-1\"\n :size=\"dense ? 'sm' : 'md'\"\n closeable\n :class=\"{ 'leading-3': dense }\"\n clickable\n v-bind=\"chipAttrs(item, i)\"\n >\n <div class=\"flex\">\n <slot\n name=\"selection.prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n :index=\"i\"\n name=\"selection\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n {{ getText(item) }}\n </slot>\n </div>\n </RuiChip>\n <div\n v-else-if=\"\n multiple\n || (!searchInputFocused && (slots['selection.prepend'] || slots.selection))\n \"\n :class=\"hideSelectionWrapper ? 'contents' : 'flex'\"\n >\n <slot\n name=\"selection.prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n v-if=\"multiple || slots.selection\"\n :index=\"i\"\n name=\"selection\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n {{ getText(item) }}\n </slot>\n </div>\n </template>\n <input\n ref=\"textInput\"\n :disabled=\"disabled\"\n :value=\"internalSearch\"\n class=\"bg-transparent outline-none\"\n type=\"text\"\n :placeholder=\"usedPlaceholder\"\n :class=\"[focusInputClass, { hidden: hideSearchInput }]\"\n :aria-invalid=\"hasError\"\n aria-autocomplete=\"list\"\n @keydown.delete=\"onInputDeletePressed()\"\n @input.stop=\"updateSearchInput($event)\"\n @focus=\"focusOnInputFocused()\"\n />\n </div>\n\n <RuiButton\n v-if=\"clearable && valueSet && !disabled\"\n variant=\"text\"\n icon\n size=\"sm\"\n tabindex=\"-1\"\n color=\"error\"\n data-id=\"clear\"\n :class=\"[\n ui.clear(),\n focusAnyFocused && '!visible',\n { 'mr-2': !dense },\n ]\"\n @click.stop.prevent=\"clear()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"18\"\n />\n </RuiButton>\n\n <span\n :class=\"ui.iconWrapper()\"\n @click=\"arrowClicked($event)\"\n >\n <RuiIcon\n :class=\"ui.icon()\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-chevron-down\"\n />\n </span>\n\n <RuiProgress\n v-if=\"loading\"\n :class=\"ui.progress()\"\n color=\"primary\"\n thickness=\"3\"\n variant=\"indeterminate\"\n />\n </div>\n <fieldset\n v-if=\"outlined\"\n :class=\"ui.fieldset()\"\n >\n <legend :class=\"ui.legend()\">\n {{ legendText }}\n </legend>\n </fieldset>\n </slot>\n </template>\n <template #default=\"{ width }\">\n <div ref=\"menuWrapperRef\">\n <div\n v-if=\"optionsWithSelectedHidden.length > 0\"\n :ref=\"containerProps.ref\"\n :class=\"ui.menu({ class: cn(classNames?.menu) ?? menuClass })\"\n :style=\"[containerProps.style, { width: `${width}px`, minWidth: menuWidth, minHeight: `${menuMinHeight}px` }]\"\n @scroll=\"containerProps.onScroll\"\n @keydown.up.prevent=\"moveHighlight(true)\"\n @keydown.down.prevent=\"moveHighlight(false)\"\n >\n <div\n v-bind=\"wrapperProps\"\n ref=\"menuRef\"\n >\n <RuiButton\n v-for=\"{ item, _index } in renderedData\"\n :key=\"getIdentifier(item)?.toString()\"\n :active=\"isActiveItem(item)\"\n :aria-selected=\"isActiveItem(item)\"\n :size=\"dense ? 'sm' : undefined\"\n tabindex=\"0\"\n variant=\"list\"\n :data-highlighted=\"highlightedIndex === _index\"\n :class=\"{\n [highlightedClass]: !isActiveItem(item) && highlightedIndex === _index,\n }\"\n @click=\"setValue(item)\"\n >\n <template #prepend>\n <slot\n name=\"item.prepend\"\n v-bind=\"{ disabled, item, active: isActiveItem(item) }\"\n />\n </template>\n <slot\n name=\"item\"\n v-bind=\"{ disabled, item, active: isActiveItem(item) }\"\n >\n {{ getText(item) }}\n </slot>\n <template #append>\n <slot\n name=\"item.append\"\n v-bind=\"{ disabled, item, active: isActiveItem(item) }\"\n />\n </template>\n </RuiButton>\n </div>\n </div>\n\n <div\n v-else-if=\"!hideNoData\"\n :style=\"{ width: `${width}px`, minWidth: menuWidth }\"\n :class=\"classNames?.menu ?? menuClass\"\n >\n <slot name=\"no-data\">\n <div\n v-if=\"!customValue\"\n class=\"p-4\"\n data-id=\"no-data\"\n >\n {{ noDataText }}\n </div>\n </slot>\n </div>\n </div>\n </template>\n </RuiMenu>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiAutoComplete.js","names":[],"sources":["../../../../src/components/forms/auto-complete/RuiAutoComplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue, TItem\">\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiChip from '@/components/chips/RuiChip.vue';\nimport { autoCompleteStyles, type AutoCompleteVariant } from '@/components/forms/auto-complete/auto-complete-styles';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu, { type MenuProps } from '@/components/overlays/menu/RuiMenu.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport {\n type GroupBy,\n type ItemDisabled,\n type KeyOfType,\n useDropdownMenu,\n useDropdownOptionProperty,\n} from '@/composables/dropdown-menu';\nimport { type FloatingOptions, Placement } from '@/composables/floating';\nimport {\n useAutoCompleteFocus,\n useAutoCompleteKeyboardNavigation,\n useAutoCompleteSearch,\n useAutoCompleteValue,\n} from '@/composables/forms/auto-complete';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { getNonRootAttrs, getRootAttrs, getTextToken } from '@/utils/helpers';\nimport { isEqual } from '@/utils/is-equal';\nimport { cn } from '@/utils/tv';\n\nexport type AutoCompleteModelValue<TValue> =\n TValue extends Array<infer U> ? U[] : TValue | undefined;\n\nexport interface RuiAutoCompleteClassNames {\n root?: VueClassValue;\n label?: VueClassValue;\n menu?: VueClassValue;\n}\n\nexport interface AutoCompleteProps<TValue, TItem> {\n options?: TItem[];\n keyAttr?: KeyOfType<TItem, TValue extends Array<infer U> ? U : TValue>;\n textAttr?: keyof TItem;\n disabled?: boolean;\n loading?: boolean;\n readOnly?: boolean;\n dense?: boolean;\n clearable?: boolean;\n label?: string;\n menuOptions?: MenuProps;\n classNames?: RuiAutoCompleteClassNames;\n /** @deprecated Use `classNames.label` instead */\n labelClass?: string;\n /** @deprecated Use `classNames.menu` instead */\n menuClass?: string;\n prependWidth?: number;\n appendWidth?: number;\n itemHeight?: number;\n variant?: AutoCompleteVariant;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n autoSelectFirst?: boolean;\n chips?: boolean;\n noFilter?: boolean;\n hideNoData?: boolean;\n noDataText?: string;\n /**\n * Custom search predicate. Receives the resolved group label as a third\n * argument when `groupBy` is set, so callers don't have to re-run the\n * `groupBy` resolver themselves.\n */\n filter?: (item: TItem, queryText: string, group?: string) => boolean;\n hideSelected?: boolean;\n placeholder?: string;\n returnObject?: boolean;\n customValue?: boolean;\n hideCustomValue?: boolean;\n required?: boolean;\n hideSearchInput?: boolean;\n hideSelectionWrapper?: boolean;\n groupBy?: GroupBy<TItem>;\n itemDisabled?: ItemDisabled<TItem>;\n /**\n * When true and `groupBy` is set, the default search predicate also matches\n * against the resolved group label. Items belonging to a group whose label\n * matches the query stay visible (group header included), even when the\n * items themselves don't match. No effect when a custom `filter` is supplied\n * or when `groupBy` is undefined.\n */\n searchIncludesGroupLabel?: boolean;\n}\n\ndefineOptions({\n name: 'RuiAutoComplete',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<AutoCompleteModelValue<TValue>>({ required: true });\n\nconst searchInputModel = defineModel<string>('searchInput', { default: '' });\n\nconst {\n options = [],\n disabled = false,\n loading = false,\n readOnly = false,\n dense = false,\n clearable = false,\n hideDetails = false,\n chips = false,\n label = 'Select',\n menuOptions,\n classNames,\n labelClass,\n menuClass,\n variant = 'default',\n hint,\n keyAttr,\n textAttr,\n itemHeight,\n errorMessages = [],\n successMessages = [],\n autoSelectFirst = false,\n noFilter = false,\n hideNoData = false,\n noDataText = 'No data available',\n filter,\n hideSelected = false,\n placeholder = '',\n returnObject = false,\n customValue = false,\n hideCustomValue = false,\n required = false,\n hideSearchInput = false,\n hideSelectionWrapper = false,\n groupBy,\n itemDisabled,\n searchIncludesGroupLabel = false,\n} = defineProps<AutoCompleteProps<TValue, TItem>>();\n\nconst slots = defineSlots<{\n 'activator'?: (props: {\n disabled: boolean;\n value: TItem[];\n variant: string;\n readOnly: boolean;\n attrs: Record<string, unknown>;\n open: boolean;\n hasError: boolean;\n hasSuccess: boolean;\n }) => any;\n 'activator.label'?: (props: { value: TItem[] }) => any;\n 'selection.prepend'?: (props: { index: number; item: TItem }) => any;\n 'selection'?: (props: { index: number; item: TItem; chipAttrs: Record<string, unknown> }) => any;\n 'item.prepend'?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n 'item'?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n 'item.append'?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n 'group-header'?: (props: { group: string; items: TItem[] }) => any;\n 'no-data'?: () => any;\n 'placeholder'?: (props: { disabled: boolean; readOnly: boolean }) => any;\n 'footer'?: () => any;\n}>();\n\nconst { getText, getIdentifier } = useDropdownOptionProperty<TValue, TItem>({\n keyAttr,\n textAttr,\n});\n\nconst textInput = useTemplateRef<HTMLInputElement>('textInput');\nconst activator = useTemplateRef<HTMLDivElement>('activator');\nconst menuRef = useTemplateRef<HTMLDivElement>('menuRef');\nconst menuWrapperRef = useTemplateRef<HTMLDivElement>('menuWrapperRef');\n\nconst { focused: activatorFocusedWithin } = useFocusWithin(activator);\nconst { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);\nconst { focused: searchInputFocused } = useFocus(textInput);\nconst { focused: activatorFocused } = useFocus(activator);\n\nconst {\n internalSearch,\n filteredOptions,\n justOpened,\n updateInternalSearch,\n textValueToProperValue,\n} = useAutoCompleteSearch<TItem>(\n () => options,\n searchInputModel,\n {\n keyAttr: () => keyAttr,\n textAttr: () => textAttr,\n noFilter: () => noFilter,\n filter: () => filter,\n customValue: () => customValue,\n hideCustomValue: () => hideCustomValue,\n returnObject: () => returnObject,\n groupBy: () => groupBy,\n searchIncludesGroupLabel: () => searchIncludesGroupLabel,\n },\n);\n\nconst isOpen = ref<boolean>(false);\nconst isHovered = ref<boolean>(false);\n\n// Calculate multiple from modelValue directly to avoid circular dependency\nconst multiple = computed<boolean>(() => Array.isArray(get(modelValue)));\n\nconst shouldApplyValueAsSearch = computed<boolean>(\n () => !(slots.selection || get(multiple) || chips),\n);\n\nconst { value, setSelected } = useAutoCompleteValue<AutoCompleteModelValue<TValue>, TItem>(\n modelValue,\n () => options,\n {\n keyAttr: () => keyAttr,\n returnObject: () => returnObject,\n customValue: () => customValue,\n },\n {\n getIdentifier,\n getText,\n textValueToProperValue,\n shouldApplyValueAsSearch,\n isOpen,\n multiple,\n updateInternalSearch,\n },\n);\n\nconst resolvedItemHeight = itemHeight ?? (dense ? 30 : 48);\n\nconst {\n containerProps,\n wrapperProps,\n renderedData,\n menuWidth,\n isActiveItem,\n itemIndexInValue,\n highlightedIndex,\n moveHighlight,\n applyHighlighted,\n optionsWithSelectedHidden,\n userNavigated,\n groupedOptions,\n isGrouped,\n isItemDisabled,\n} = useDropdownMenu<TValue, TItem>({\n itemHeight: resolvedItemHeight,\n keyAttr,\n textAttr,\n options: filteredOptions,\n dense: () => dense,\n value,\n menuRef,\n setValue,\n autoSelectFirst,\n hideSelected,\n isOpen,\n getText,\n getIdentifier,\n groupBy: () => groupBy,\n itemDisabled: () => itemDisabled,\n});\n\nconst {\n focusedValueIndex,\n moveSelectedValueHighlight,\n onEnter,\n onInputDeletePressed,\n onTab,\n setValueFocus,\n} = useAutoCompleteKeyboardNavigation<TItem>(\n {\n chips: () => chips,\n customValue: () => customValue,\n multiple,\n },\n {\n activator,\n applyHighlighted,\n clear,\n filteredOptions,\n getText,\n highlightedIndex,\n internalSearch,\n isOpen,\n removeValue: (item: TItem): void => { setValue(item); },\n searchInputFocused,\n setSearchAsValue,\n userNavigated,\n value,\n },\n);\n\nconst {\n anyFocused: focusAnyFocused,\n inputClass: focusInputClass,\n onActivatorFocused: focusOnActivatorFocused,\n onInputFocused: focusOnInputFocused,\n setInputFocus: focusSetInputFocus,\n} = useAutoCompleteFocus(\n {\n customValue: () => customValue,\n disabled: () => disabled,\n shouldApplyValueAsSearch,\n },\n {\n activatorFocused,\n activatorFocusedWithin,\n focusedValueIndex,\n internalSearch,\n isOpen,\n justOpened,\n menuWrapperFocusedWithin,\n searchInputFocused,\n setSearchAsValue,\n textInput,\n updateInternalSearch,\n },\n);\n\nconst menuMinHeight = computed<number>(\n () => Math.min(5, get(optionsWithSelectedHidden).length) * resolvedItemHeight,\n);\n\nconst { hasError, hasSuccess } = useFormTextDetail(\n () => errorMessages,\n () => successMessages,\n);\n\nconst valueSet = computed<boolean>(() => get(value).length > 0);\n\n// True when the consumer's #placeholder slot is taking over the resting\n// content area, so the outlined/resting label must hide to avoid overlapping\n// the slot content.\nconst placeholderSlotActive = computed<boolean>(() => Boolean(slots.placeholder) && !get(valueSet) && !get(searchInputFocused));\n\nconst usedPlaceholder = computed<string>(() => {\n if (get(searchInputFocused))\n return placeholder;\n return '';\n});\n\nconst outlined = computed<boolean>(() => variant === 'outlined');\nconst float = computed<boolean>(() => (get(isOpen) || get(valueSet) || get(searchInputFocused)) && get(outlined));\n\nconst legendText = computed<string>(() => {\n if (!get(float) || !label)\n return '';\n return required ? `${label} ﹡` : label;\n});\n\nconst ui = computed<ReturnType<typeof autoCompleteStyles>>(() => autoCompleteStyles({\n filled: variant === 'filled',\n outlined: get(outlined),\n float: get(float),\n opened: get(isOpen),\n hovered: get(isHovered),\n dense,\n disabled,\n readonly: readOnly,\n hasError: get(hasError),\n hasSuccess: get(hasSuccess) && !get(hasError),\n}));\n\nconst highlightedClass = autoCompleteStyles({}).highlighted();\n\nfunction updateSearchInput(event: Event): void {\n const target = event.target;\n if (!(target instanceof HTMLInputElement))\n return;\n\n const value = target.value;\n set(isOpen, true);\n updateInternalSearch(value);\n set(justOpened, false);\n}\n\nasync function setValue(val: TItem, skipRefocused = false): Promise<void> {\n const isMultiple = get(multiple);\n\n if (isMultiple) {\n const newValue = [...get(value)];\n const indexInValue = itemIndexInValue(val);\n if (indexInValue === -1) {\n updateInternalSearch();\n newValue.push(val);\n }\n else {\n newValue.splice(indexInValue, 1);\n }\n set(value, newValue);\n }\n else {\n if (get(shouldApplyValueAsSearch))\n updateInternalSearch(getText(val));\n else updateInternalSearch();\n\n set(value, [val]);\n }\n\n if (!isMultiple) {\n if (!skipRefocused) {\n set(activatorFocused, true);\n get(activator)?.focus();\n await nextTick(() => {\n set(isOpen, false);\n });\n }\n else {\n set(isOpen, false);\n }\n }\n else if (!skipRefocused) {\n set(searchInputFocused, true);\n }\n}\n\nfunction setSearchAsValue(): void {\n const searchToBeValue = get(internalSearch);\n if (!searchToBeValue)\n return;\n\n const newValue: TItem = textValueToProperValue(searchToBeValue);\n setValue(newValue, true);\n}\n\nfunction clear(): void {\n updateInternalSearch();\n set(modelValue, (Array.isArray(get(modelValue)) ? [] : undefined) as AutoCompleteModelValue<TValue>);\n}\n\nfunction chipAttrs(item: TItem, index: number): Record<string, unknown> {\n return {\n 'data-index': index,\n 'data-value': getIdentifier(item),\n 'onKeydown': (event: KeyboardEvent): void => {\n const { key } = event;\n if (['Backspace', 'Delete'].includes(key)) {\n event.stopPropagation();\n event.preventDefault();\n // Alt/Option + delete converts the chip back into editable search text\n // instead of removing it outright. Only meaningful when custom values\n // are accepted, since the restored text has to be re-selectable.\n if (event.altKey && customValue) {\n const text = getText(item) ?? '';\n setValue(item);\n updateInternalSearch(text);\n }\n else {\n setValue(item);\n }\n }\n },\n 'onClick': (e: MouseEvent): void => {\n e.stopPropagation();\n setValueFocus(index);\n },\n 'onClick:close': (): void => {\n setValue(item);\n },\n };\n}\n\nfunction setSelectionRange(start: number, end: number): void {\n set(searchInputFocused, true);\n get(textInput)?.setSelectionRange?.(start, end);\n}\n\nfunction arrowClicked(event: MouseEvent): void {\n if (get(isOpen)) {\n set(isOpen, false);\n event.stopPropagation();\n }\n}\n\nfunction openMenu(): void {\n set(isOpen, true);\n}\n\nfunction closeMenu(): void {\n set(isOpen, false);\n}\n\n// Optimize options watcher with shallow comparison first\nwatch(() => options, (curr, old) => {\n if (curr === old || customValue)\n return;\n\n // Only do deep comparison if reference changed\n if (isEqual(curr, old))\n return;\n\n setSelected(get(value));\n});\n\nconst menuFloatingOptions = computed<FloatingOptions>(() => ({\n placement: Placement.bottomStart,\n ...menuOptions?.options,\n}));\n\ndefineExpose({\n closeMenu,\n focus: focusSetInputFocus,\n openMenu,\n setSelectionRange,\n});\n</script>\n\n<template>\n <RuiMenu\n v-model=\"isOpen\"\n v-bind=\"{ ...getRootAttrs($attrs, []), ...menuOptions }\"\n :class=\"ui.wrapper({ class: cn($attrs.class) })\"\n :options=\"menuFloatingOptions\"\n :close-on-content-click=\"false\"\n :full-width=\"true\"\n :persist-on-activator-click=\"true\"\n :menu-class=\"[\n { hidden: optionsWithSelectedHidden.length === 0 && customValue && !slots['no-data'] },\n menuOptions?.menuClass,\n ]\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n :dense=\"dense\"\n :show-details=\"!hideDetails\"\n :disabled=\"disabled\"\n disable-auto-focus\n >\n <template #activator=\"{ attrs, open, hasError: slotHasError, hasSuccess: slotHasSuccess }\">\n <slot\n name=\"activator\"\n v-bind=\"{ disabled, value, variant, readOnly, attrs, open, hasError: slotHasError, hasSuccess: slotHasSuccess }\"\n >\n <div\n ref=\"activator\"\n :class=\"ui.activator({ class: cn(classNames?.label) ?? labelClass })\"\n v-bind=\"{\n ...getNonRootAttrs($attrs, ['onClick', 'class']),\n ...(readOnly ? {} : attrs),\n }\"\n role=\"combobox\"\n :aria-expanded=\"open\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readOnly || undefined\"\n :aria-required=\"required || undefined\"\n :aria-busy=\"loading || undefined\"\n data-id=\"activator\"\n :aria-invalid=\"hasError\"\n :tabindex=\"disabled || readOnly ? -1 : 0\"\n @mouseenter=\"isHovered = true\"\n @mouseleave=\"isHovered = false\"\n @click=\"focusSetInputFocus()\"\n @focus=\"focusOnActivatorFocused()\"\n @keydown.enter=\"onEnter($event)\"\n @keydown.tab=\"onTab($event)\"\n @keydown.left=\"moveSelectedValueHighlight($event, false)\"\n @keydown.right=\"moveSelectedValueHighlight($event, true)\"\n @keydown.up.prevent=\"moveHighlight(true)\"\n @keydown.down.prevent=\"moveHighlight(false)\"\n @keydown.home.prevent=\"highlightedIndex = 0\"\n @keydown.end.prevent=\"highlightedIndex = optionsWithSelectedHidden.length - 1\"\n >\n <span\n v-if=\"(outlined || (!valueSet && !searchInputFocused)) && !placeholderSlotActive\"\n :class=\"[\n ui.label(),\n { 'pr-2': !valueSet && !open && outlined },\n ]\"\n >\n <slot\n name=\"activator.label\"\n v-bind=\"{ value }\"\n >\n {{ label }}\n </slot>\n <span\n v-if=\"required\"\n :class=\"ui.required()\"\n >\n ﹡\n </span>\n </span>\n <div\n data-id=\"value\"\n :class=\"ui.value()\"\n >\n <!--\n Placeholder slot occupies the same flex space the input takes\n when focused, so transitioning into the focused state doesn't\n shift the activator's content. pointer-events-none is required\n so clicks pass through to the activator (otherwise the slot\n swallows the first click and the menu needs two taps to open).\n -->\n <div\n v-if=\"!valueSet && !searchInputFocused && slots.placeholder\"\n data-id=\"placeholder\"\n class=\"flex-1 min-w-0 pointer-events-none\"\n >\n <slot\n name=\"placeholder\"\n v-bind=\"{ disabled, readOnly }\"\n />\n </div>\n <template\n v-for=\"(item, i) in value\"\n :key=\"getIdentifier(item)\"\n >\n <RuiChip\n v-if=\"chips\"\n :key=\"getTextToken(getIdentifier(item))\"\n tabindex=\"-1\"\n :size=\"dense ? 'sm' : 'md'\"\n closeable\n :class=\"{ 'leading-3': dense }\"\n clickable\n v-bind=\"chipAttrs(item, i)\"\n >\n <div class=\"flex\">\n <slot\n name=\"selection.prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n :index=\"i\"\n name=\"selection\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n {{ getText(item) }}\n </slot>\n </div>\n </RuiChip>\n <div\n v-else-if=\"\n multiple\n || (!searchInputFocused && (slots['selection.prepend'] || slots.selection))\n \"\n :class=\"hideSelectionWrapper ? 'contents' : 'flex'\"\n >\n <slot\n name=\"selection.prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n v-if=\"multiple || slots.selection\"\n :index=\"i\"\n name=\"selection\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n {{ getText(item) }}\n </slot>\n </div>\n </template>\n <input\n ref=\"textInput\"\n :disabled=\"disabled\"\n :value=\"internalSearch\"\n class=\"bg-transparent outline-none\"\n type=\"text\"\n :placeholder=\"usedPlaceholder\"\n :class=\"[focusInputClass, { hidden: hideSearchInput }]\"\n :aria-invalid=\"hasError\"\n aria-autocomplete=\"list\"\n @keydown.delete=\"onInputDeletePressed()\"\n @input.stop=\"updateSearchInput($event)\"\n @focus=\"focusOnInputFocused()\"\n />\n </div>\n\n <RuiButton\n v-if=\"clearable && valueSet && !disabled\"\n variant=\"text\"\n icon\n size=\"sm\"\n tabindex=\"-1\"\n color=\"error\"\n data-id=\"clear\"\n :class=\"[\n ui.clear(),\n focusAnyFocused && '!visible',\n { 'mr-2': !dense },\n ]\"\n @click.stop.prevent=\"clear()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"18\"\n />\n </RuiButton>\n\n <span\n :class=\"ui.iconWrapper()\"\n @click=\"arrowClicked($event)\"\n >\n <RuiIcon\n :class=\"ui.icon()\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-chevron-down\"\n />\n </span>\n\n <RuiProgress\n v-if=\"loading\"\n :class=\"ui.progress()\"\n color=\"primary\"\n thickness=\"3\"\n variant=\"indeterminate\"\n />\n </div>\n <fieldset\n v-if=\"outlined\"\n :class=\"ui.fieldset()\"\n >\n <legend :class=\"ui.legend()\">\n {{ legendText }}\n </legend>\n </fieldset>\n </slot>\n </template>\n <template #default=\"{ width }\">\n <div ref=\"menuWrapperRef\">\n <div\n v-if=\"optionsWithSelectedHidden.length > 0\"\n :ref=\"containerProps.ref\"\n :class=\"ui.menu({ class: cn(classNames?.menu) ?? menuClass })\"\n :style=\"[containerProps.style, { width: `${width}px`, minWidth: menuWidth, minHeight: `${menuMinHeight}px` }]\"\n @scroll=\"containerProps.onScroll\"\n @keydown.up.prevent=\"moveHighlight(true)\"\n @keydown.down.prevent=\"moveHighlight(false)\"\n >\n <div\n v-if=\"isGrouped\"\n ref=\"menuRef\"\n >\n <template\n v-for=\"(bucket, bucketIndex) in groupedOptions\"\n :key=\"bucket.group || `group-${bucketIndex}`\"\n >\n <div\n class=\"sticky top-0 z-10 bg-white dark:bg-rui-grey-900\"\n data-id=\"group-header\"\n >\n <slot\n name=\"group-header\"\n v-bind=\"{ group: bucket.group, items: bucket.items }\"\n >\n <div class=\"px-3 py-1 text-xs uppercase tracking-wide text-rui-text-secondary\">\n {{ bucket.group }}\n </div>\n </slot>\n </div>\n <RuiButton\n v-for=\"item in bucket.items\"\n :key=\"getIdentifier(item)?.toString()\"\n :active=\"isActiveItem(item)\"\n :aria-selected=\"isActiveItem(item)\"\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"isItemDisabled(item)\"\n tabindex=\"0\"\n variant=\"list\"\n :data-highlighted=\"optionsWithSelectedHidden.indexOf(item) === highlightedIndex\"\n :data-disabled=\"isItemDisabled(item) || undefined\"\n :class=\"{\n [highlightedClass]: !isActiveItem(item) && optionsWithSelectedHidden.indexOf(item) === highlightedIndex,\n }\"\n @click=\"!isItemDisabled(item) && setValue(item)\"\n >\n <template #prepend>\n <slot\n name=\"item.prepend\"\n v-bind=\"{ disabled: isItemDisabled(item), item, active: isActiveItem(item) }\"\n />\n </template>\n <slot\n name=\"item\"\n v-bind=\"{ disabled: isItemDisabled(item), item, active: isActiveItem(item) }\"\n >\n {{ getText(item) }}\n </slot>\n <template #append>\n <slot\n name=\"item.append\"\n v-bind=\"{ disabled: isItemDisabled(item), item, active: isActiveItem(item) }\"\n />\n </template>\n </RuiButton>\n </template>\n </div>\n <div\n v-else\n v-bind=\"wrapperProps\"\n ref=\"menuRef\"\n >\n <RuiButton\n v-for=\"{ item, _index } in renderedData\"\n :key=\"getIdentifier(item)?.toString()\"\n :active=\"isActiveItem(item)\"\n :aria-selected=\"isActiveItem(item)\"\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"isItemDisabled(item)\"\n tabindex=\"0\"\n variant=\"list\"\n :data-highlighted=\"highlightedIndex === _index\"\n :data-disabled=\"isItemDisabled(item) || undefined\"\n :class=\"{\n [highlightedClass]: !isActiveItem(item) && highlightedIndex === _index,\n }\"\n @click=\"!isItemDisabled(item) && setValue(item)\"\n >\n <template #prepend>\n <slot\n name=\"item.prepend\"\n v-bind=\"{ disabled: isItemDisabled(item), item, active: isActiveItem(item) }\"\n />\n </template>\n <slot\n name=\"item\"\n v-bind=\"{ disabled: isItemDisabled(item), item, active: isActiveItem(item) }\"\n >\n {{ getText(item) }}\n </slot>\n <template #append>\n <slot\n name=\"item.append\"\n v-bind=\"{ disabled: isItemDisabled(item), item, active: isActiveItem(item) }\"\n />\n </template>\n </RuiButton>\n </div>\n </div>\n\n <div\n v-else-if=\"!hideNoData\"\n :style=\"{ width: `${width}px`, minWidth: menuWidth }\"\n :class=\"classNames?.menu ?? menuClass\"\n >\n <slot name=\"no-data\">\n <div\n v-if=\"!customValue\"\n class=\"p-4\"\n data-id=\"no-data\"\n >\n {{ noDataText }}\n </div>\n </slot>\n </div>\n <!--\n The scroll container above reserves ~15px on the right for the\n scrollbar gutter. We render an equivalent right-padding here so the\n footer's content aligns with the option rows' content rather than\n the menu's outer edge. `pr-[var(--rui-scrollbar-gutter,15px)]`\n lets consumers override if their theme reserves a different width.\n -->\n <div\n v-if=\"slots.footer\"\n class=\"bg-white dark:bg-rui-grey-900 border-t border-black/[0.12] dark:border-white/[0.12] pr-[var(--rui-scrollbar-gutter,15px)] -mb-2\"\n data-id=\"footer\"\n >\n <slot name=\"footer\" />\n </div>\n </div>\n </template>\n </RuiMenu>\n</template>\n"],"mappings":""}
@@ -1,7 +1,7 @@
1
1
  import type { VueClassValue } from '../../../types/class-value';
2
2
  import { type AutoCompleteVariant } from '../../../components/forms/auto-complete/auto-complete-styles.js';
3
3
  import { type MenuProps } from '../../../components/overlays/menu/RuiMenu.vue';
4
- import { type KeyOfType } from '../../../composables/dropdown-menu.js';
4
+ import { type GroupBy, type ItemDisabled, type KeyOfType } from '../../../composables/dropdown-menu.js';
5
5
  export type AutoCompleteModelValue<TValue> = TValue extends Array<infer U> ? U[] : TValue | undefined;
6
6
  export interface RuiAutoCompleteClassNames {
7
7
  root?: VueClassValue;
@@ -37,7 +37,12 @@ export interface AutoCompleteProps<TValue, TItem> {
37
37
  noFilter?: boolean;
38
38
  hideNoData?: boolean;
39
39
  noDataText?: string;
40
- filter?: (item: TItem, queryText: string) => boolean;
40
+ /**
41
+ * Custom search predicate. Receives the resolved group label as a third
42
+ * argument when `groupBy` is set, so callers don't have to re-run the
43
+ * `groupBy` resolver themselves.
44
+ */
45
+ filter?: (item: TItem, queryText: string, group?: string) => boolean;
41
46
  hideSelected?: boolean;
42
47
  placeholder?: string;
43
48
  returnObject?: boolean;
@@ -46,6 +51,16 @@ export interface AutoCompleteProps<TValue, TItem> {
46
51
  required?: boolean;
47
52
  hideSearchInput?: boolean;
48
53
  hideSelectionWrapper?: boolean;
54
+ groupBy?: GroupBy<TItem>;
55
+ itemDisabled?: ItemDisabled<TItem>;
56
+ /**
57
+ * When true and `groupBy` is set, the default search predicate also matches
58
+ * against the resolved group label. Items belonging to a group whose label
59
+ * matches the query stay visible (group header included), even when the
60
+ * items themselves don't match. No effect when a custom `filter` is supplied
61
+ * or when `groupBy` is undefined.
62
+ */
63
+ searchIncludesGroupLabel?: boolean;
49
64
  }
50
65
  declare const __VLS_export: <TValue, TItem>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
51
66
  props: import("vue").PublicProps & __VLS_PrettifyLocal<(AutoCompleteProps<TValue, TItem> & {
@@ -102,7 +117,16 @@ declare const __VLS_export: <TValue, TItem>(__VLS_props: NonNullable<Awaited<typ
102
117
  item: TItem;
103
118
  active: boolean;
104
119
  }) => any;
120
+ 'group-header'?: (props: {
121
+ group: string;
122
+ items: TItem[];
123
+ }) => any;
105
124
  'no-data'?: () => any;
125
+ placeholder?: (props: {
126
+ disabled: boolean;
127
+ readOnly: boolean;
128
+ }) => any;
129
+ footer?: () => any;
106
130
  };
107
131
  emit: ((event: "update:modelValue", value: AutoCompleteModelValue<TValue>) => void) & ((event: "update:searchInput", value: string) => void);
108
132
  }>) => import("vue").VNode & {
@@ -3,6 +3,7 @@ import RuiIcon_default from "../../icons/RuiIcon.js";
3
3
  import RuiProgress_default from "../../progress/RuiProgress.js";
4
4
  import RuiButton_default from "../../buttons/button/RuiButton.js";
5
5
  import { useFormTextDetail } from "../../../utils/form-text-detail.js";
6
+ import { Placement } from "../../../composables/floating.js";
6
7
  import RuiMenu_default from "../../overlays/menu/RuiMenu.js";
7
8
  import RuiChip_default from "../../chips/RuiChip.js";
8
9
  import { getNonRootAttrs, getRootAttrs, getTextToken } from "../../../utils/helpers.js";
@@ -27,23 +28,38 @@ var _hoisted_1 = [
27
28
  "aria-invalid",
28
29
  "tabindex"
29
30
  ];
30
- var _hoisted_2 = { class: "flex" };
31
- var _hoisted_3 = [
31
+ var _hoisted_2 = {
32
+ key: 0,
33
+ "data-id": "placeholder",
34
+ class: "flex-1 min-w-0 pointer-events-none"
35
+ };
36
+ var _hoisted_3 = { class: "flex" };
37
+ var _hoisted_4 = [
32
38
  "disabled",
33
39
  "value",
34
40
  "placeholder",
35
41
  "aria-invalid"
36
42
  ];
37
- var _hoisted_4 = {
43
+ var _hoisted_5 = {
44
+ class: "sticky top-0 z-10 bg-white dark:bg-rui-grey-900",
45
+ "data-id": "group-header"
46
+ };
47
+ var _hoisted_6 = { class: "px-3 py-1 text-xs uppercase tracking-wide text-rui-text-secondary" };
48
+ var _hoisted_7 = {
38
49
  key: 0,
39
50
  class: "p-4",
40
51
  "data-id": "no-data"
41
52
  };
42
- var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
53
+ var _hoisted_8 = {
54
+ key: 2,
55
+ class: "bg-white dark:bg-rui-grey-900 border-t border-black/[0.12] dark:border-white/[0.12] pr-[var(--rui-scrollbar-gutter,15px)] -mb-2",
56
+ "data-id": "footer"
57
+ };
58
+ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
43
59
  name: "RuiAutoComplete",
44
60
  inheritAttrs: false,
45
61
  __name: "RuiAutoComplete",
46
- props: /* @__PURE__ */ mergeModels({
62
+ props: /*@__PURE__*/ mergeModels({
47
63
  options: { default: () => [] },
48
64
  keyAttr: {},
49
65
  textAttr: {},
@@ -129,6 +145,12 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
129
145
  hideSelectionWrapper: {
130
146
  type: Boolean,
131
147
  default: false
148
+ },
149
+ groupBy: { type: Function },
150
+ itemDisabled: { type: Function },
151
+ searchIncludesGroupLabel: {
152
+ type: Boolean,
153
+ default: false
132
154
  }
133
155
  }, {
134
156
  "modelValue": { required: true },
@@ -160,7 +182,9 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
160
182
  filter: () => __props.filter,
161
183
  customValue: () => __props.customValue,
162
184
  hideCustomValue: () => __props.hideCustomValue,
163
- returnObject: () => __props.returnObject
185
+ returnObject: () => __props.returnObject,
186
+ groupBy: () => __props.groupBy,
187
+ searchIncludesGroupLabel: () => __props.searchIncludesGroupLabel
164
188
  });
165
189
  const isOpen = ref(false);
166
190
  const isHovered = ref(false);
@@ -180,7 +204,7 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
180
204
  updateInternalSearch
181
205
  });
182
206
  const resolvedItemHeight = __props.itemHeight ?? (__props.dense ? 30 : 48);
183
- const { containerProps, wrapperProps, renderedData, menuWidth, isActiveItem, itemIndexInValue, highlightedIndex, moveHighlight, applyHighlighted, optionsWithSelectedHidden, userNavigated } = useDropdownMenu({
207
+ const { containerProps, wrapperProps, renderedData, menuWidth, isActiveItem, itemIndexInValue, highlightedIndex, moveHighlight, applyHighlighted, optionsWithSelectedHidden, userNavigated, groupedOptions, isGrouped, isItemDisabled } = useDropdownMenu({
184
208
  itemHeight: resolvedItemHeight,
185
209
  keyAttr: __props.keyAttr,
186
210
  textAttr: __props.textAttr,
@@ -193,7 +217,9 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
193
217
  hideSelected: __props.hideSelected,
194
218
  isOpen,
195
219
  getText,
196
- getIdentifier
220
+ getIdentifier,
221
+ groupBy: () => __props.groupBy,
222
+ itemDisabled: () => __props.itemDisabled
197
223
  });
198
224
  const { focusedValueIndex, moveSelectedValueHighlight, onEnter, onInputDeletePressed, onTab, setValueFocus } = useAutoCompleteKeyboardNavigation({
199
225
  chips: () => __props.chips,
@@ -236,6 +262,7 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
236
262
  const menuMinHeight = computed(() => Math.min(5, get$1(optionsWithSelectedHidden).length) * resolvedItemHeight);
237
263
  const { hasError, hasSuccess } = useFormTextDetail(() => __props.errorMessages, () => __props.successMessages);
238
264
  const valueSet = computed(() => get$1(value).length > 0);
265
+ const placeholderSlotActive = computed(() => Boolean(slots.placeholder) && !get$1(valueSet) && !get$1(searchInputFocused));
239
266
  const usedPlaceholder = computed(() => {
240
267
  if (get$1(searchInputFocused)) return __props.placeholder;
241
268
  return "";
@@ -309,7 +336,11 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
309
336
  if (["Backspace", "Delete"].includes(key)) {
310
337
  event.stopPropagation();
311
338
  event.preventDefault();
312
- setValue(item);
339
+ if (event.altKey && __props.customValue) {
340
+ const text = getText(item) ?? "";
341
+ setValue(item);
342
+ updateInternalSearch(text);
343
+ } else setValue(item);
313
344
  }
314
345
  },
315
346
  "onClick": (e) => {
@@ -342,6 +373,10 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
342
373
  if (isEqual(curr, old)) return;
343
374
  setSelected(get$1(value));
344
375
  });
376
+ const menuFloatingOptions = computed(() => ({
377
+ placement: Placement.bottomStart,
378
+ ...__props.menuOptions?.options
379
+ }));
345
380
  __expose({
346
381
  closeMenu,
347
382
  focus: focusSetInputFocus,
@@ -357,7 +392,7 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
357
392
  ...__props.menuOptions
358
393
  }, {
359
394
  class: unref(ui).wrapper({ class: unref(cn)(_ctx.$attrs.class) }),
360
- placement: "bottom-start",
395
+ options: unref(menuFloatingOptions),
361
396
  "close-on-content-click": false,
362
397
  "full-width": true,
363
398
  "persist-on-activator-click": true,
@@ -411,7 +446,7 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
411
446
  _cache[16] || (_cache[16] = withKeys(withModifiers(($event) => highlightedIndex.value = unref(optionsWithSelectedHidden).length - 1, ["prevent"]), ["end"]))
412
447
  ]
413
448
  }), [
414
- unref(outlined) || !unref(valueSet) && !unref(searchInputFocused) ? (openBlock(), createElementBlock("span", {
449
+ (unref(outlined) || !unref(valueSet) && !unref(searchInputFocused)) && !unref(placeholderSlotActive) ? (openBlock(), createElementBlock("span", {
415
450
  key: 0,
416
451
  class: normalizeClass([unref(ui).label(), { "pr-2": !unref(valueSet) && !open && unref(outlined) }])
417
452
  }, [renderSlot(_ctx.$slots, "activator.label", normalizeProps(guardReactiveProps({ value: unref(value) })), () => [createTextVNode(toDisplayString(__props.label), 1)]), __props.required ? (openBlock(), createElementBlock("span", {
@@ -421,44 +456,51 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
421
456
  createElementVNode("div", {
422
457
  "data-id": "value",
423
458
  class: normalizeClass(unref(ui).value())
424
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(value), (item, i) => {
425
- return openBlock(), createElementBlock(Fragment, { key: unref(getIdentifier)(item) }, [__props.chips ? (openBlock(), createBlock(RuiChip_default, mergeProps({
426
- key: unref(getTextToken)(unref(getIdentifier)(item)),
427
- tabindex: "-1",
428
- size: __props.dense ? "sm" : "md",
429
- closeable: "",
430
- class: { "leading-3": __props.dense },
431
- clickable: ""
432
- }, { ref_for: true }, chipAttrs(item, i)), {
433
- default: withCtx(() => [createElementVNode("div", _hoisted_2, [renderSlot(_ctx.$slots, "selection.prepend", mergeProps({ index: i }, { ref_for: true }, { item })), renderSlot(_ctx.$slots, "selection", mergeProps({ index: i }, { ref_for: true }, {
459
+ }, [
460
+ !unref(valueSet) && !unref(searchInputFocused) && slots.placeholder ? (openBlock(), createElementBlock("div", _hoisted_2, [renderSlot(_ctx.$slots, "placeholder", normalizeProps(guardReactiveProps({
461
+ disabled: __props.disabled,
462
+ readOnly: __props.readOnly
463
+ })))])) : createCommentVNode("", true),
464
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(value), (item, i) => {
465
+ return openBlock(), createElementBlock(Fragment, { key: unref(getIdentifier)(item) }, [__props.chips ? (openBlock(), createBlock(RuiChip_default, mergeProps({
466
+ key: unref(getTextToken)(unref(getIdentifier)(item)),
467
+ tabindex: "-1",
468
+ size: __props.dense ? "sm" : "md",
469
+ closeable: "",
470
+ class: { "leading-3": __props.dense },
471
+ clickable: ""
472
+ }, { ref_for: true }, chipAttrs(item, i)), {
473
+ default: withCtx(() => [createElementVNode("div", _hoisted_3, [renderSlot(_ctx.$slots, "selection.prepend", mergeProps({ index: i }, { ref_for: true }, { item })), renderSlot(_ctx.$slots, "selection", mergeProps({ index: i }, { ref_for: true }, {
474
+ item,
475
+ chipAttrs: chipAttrs(item, i)
476
+ }), () => [createTextVNode(toDisplayString(unref(getText)(item)), 1)])])]),
477
+ _: 2
478
+ }, 1040, ["size", "class"])) : unref(multiple) || !unref(searchInputFocused) && (slots["selection.prepend"] || slots.selection) ? (openBlock(), createElementBlock("div", {
479
+ key: 1,
480
+ class: normalizeClass(__props.hideSelectionWrapper ? "contents" : "flex")
481
+ }, [renderSlot(_ctx.$slots, "selection.prepend", mergeProps({ index: i }, { ref_for: true }, { item })), unref(multiple) || slots.selection ? renderSlot(_ctx.$slots, "selection", mergeProps({
482
+ key: 0,
483
+ index: i
484
+ }, { ref_for: true }, {
434
485
  item,
435
486
  chipAttrs: chipAttrs(item, i)
436
- }), () => [createTextVNode(toDisplayString(unref(getText)(item)), 1)])])]),
437
- _: 2
438
- }, 1040, ["size", "class"])) : unref(multiple) || !unref(searchInputFocused) && (slots["selection.prepend"] || slots.selection) ? (openBlock(), createElementBlock("div", {
439
- key: 1,
440
- class: normalizeClass(__props.hideSelectionWrapper ? "contents" : "flex")
441
- }, [renderSlot(_ctx.$slots, "selection.prepend", mergeProps({ index: i }, { ref_for: true }, { item })), unref(multiple) || slots.selection ? renderSlot(_ctx.$slots, "selection", mergeProps({
442
- key: 0,
443
- index: i
444
- }, { ref_for: true }, {
445
- item,
446
- chipAttrs: chipAttrs(item, i)
447
- }), () => [createTextVNode(toDisplayString(unref(getText)(item)), 1)]) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)], 64);
448
- }), 128)), createElementVNode("input", {
449
- ref_key: "textInput",
450
- ref: textInput,
451
- disabled: __props.disabled,
452
- value: unref(internalSearch),
453
- class: normalizeClass(["bg-transparent outline-none", [unref(focusInputClass), { hidden: __props.hideSearchInput }]]),
454
- type: "text",
455
- placeholder: unref(usedPlaceholder),
456
- "aria-invalid": unref(hasError),
457
- "aria-autocomplete": "list",
458
- onKeydown: _cache[0] || (_cache[0] = withKeys(($event) => unref(onInputDeletePressed)(), ["delete"])),
459
- onInput: _cache[1] || (_cache[1] = withModifiers(($event) => updateSearchInput($event), ["stop"])),
460
- onFocus: _cache[2] || (_cache[2] = ($event) => unref(focusOnInputFocused)())
461
- }, null, 42, _hoisted_3)], 2),
487
+ }), () => [createTextVNode(toDisplayString(unref(getText)(item)), 1)]) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)], 64);
488
+ }), 128)),
489
+ createElementVNode("input", {
490
+ ref_key: "textInput",
491
+ ref: textInput,
492
+ disabled: __props.disabled,
493
+ value: unref(internalSearch),
494
+ class: normalizeClass(["bg-transparent outline-none", [unref(focusInputClass), { hidden: __props.hideSearchInput }]]),
495
+ type: "text",
496
+ placeholder: unref(usedPlaceholder),
497
+ "aria-invalid": unref(hasError),
498
+ "aria-autocomplete": "list",
499
+ onKeydown: _cache[0] || (_cache[0] = withKeys(($event) => unref(onInputDeletePressed)(), ["delete"])),
500
+ onInput: _cache[1] || (_cache[1] = withModifiers(($event) => updateSearchInput($event), ["stop"])),
501
+ onFocus: _cache[2] || (_cache[2] = ($event) => unref(focusOnInputFocused)())
502
+ }, null, 42, _hoisted_4)
503
+ ], 2),
462
504
  __props.clearable && unref(valueSet) && !__props.disabled ? (openBlock(), createBlock(RuiButton_default, {
463
505
  key: 1,
464
506
  variant: "text",
@@ -513,7 +555,56 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
513
555
  }]),
514
556
  onScroll: _cache[17] || (_cache[17] = (...args) => unref(containerProps).onScroll && unref(containerProps).onScroll(...args)),
515
557
  onKeydown: [_cache[18] || (_cache[18] = withKeys(withModifiers(($event) => unref(moveHighlight)(true), ["prevent"]), ["up"])), _cache[19] || (_cache[19] = withKeys(withModifiers(($event) => unref(moveHighlight)(false), ["prevent"]), ["down"]))]
516
- }, [createElementVNode("div", mergeProps(unref(wrapperProps), {
558
+ }, [unref(isGrouped) ? (openBlock(), createElementBlock("div", {
559
+ key: 0,
560
+ ref_key: "menuRef",
561
+ ref: menuRef
562
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(groupedOptions), (bucket, bucketIndex) => {
563
+ return openBlock(), createElementBlock(Fragment, { key: bucket.group || `group-${bucketIndex}` }, [createElementVNode("div", _hoisted_5, [renderSlot(_ctx.$slots, "group-header", mergeProps({ ref_for: true }, {
564
+ group: bucket.group,
565
+ items: bucket.items
566
+ }), () => [createElementVNode("div", _hoisted_6, toDisplayString(bucket.group), 1)])]), (openBlock(true), createElementBlock(Fragment, null, renderList(bucket.items, (item) => {
567
+ return openBlock(), createBlock(RuiButton_default, {
568
+ key: unref(getIdentifier)(item)?.toString(),
569
+ active: unref(isActiveItem)(item),
570
+ "aria-selected": unref(isActiveItem)(item),
571
+ size: __props.dense ? "sm" : void 0,
572
+ disabled: unref(isItemDisabled)(item),
573
+ tabindex: "0",
574
+ variant: "list",
575
+ "data-highlighted": unref(optionsWithSelectedHidden).indexOf(item) === unref(highlightedIndex),
576
+ "data-disabled": unref(isItemDisabled)(item) || void 0,
577
+ class: normalizeClass({ [unref(highlightedClass)]: !unref(isActiveItem)(item) && unref(optionsWithSelectedHidden).indexOf(item) === unref(highlightedIndex) }),
578
+ onClick: ($event) => !unref(isItemDisabled)(item) && setValue(item)
579
+ }, {
580
+ prepend: withCtx(() => [renderSlot(_ctx.$slots, "item.prepend", mergeProps({ ref_for: true }, {
581
+ disabled: unref(isItemDisabled)(item),
582
+ item,
583
+ active: unref(isActiveItem)(item)
584
+ }))]),
585
+ append: withCtx(() => [renderSlot(_ctx.$slots, "item.append", mergeProps({ ref_for: true }, {
586
+ disabled: unref(isItemDisabled)(item),
587
+ item,
588
+ active: unref(isActiveItem)(item)
589
+ }))]),
590
+ default: withCtx(() => [renderSlot(_ctx.$slots, "item", mergeProps({ ref_for: true }, {
591
+ disabled: unref(isItemDisabled)(item),
592
+ item,
593
+ active: unref(isActiveItem)(item)
594
+ }), () => [createTextVNode(toDisplayString(unref(getText)(item)), 1)])]),
595
+ _: 2
596
+ }, 1032, [
597
+ "active",
598
+ "aria-selected",
599
+ "size",
600
+ "disabled",
601
+ "data-highlighted",
602
+ "data-disabled",
603
+ "class",
604
+ "onClick"
605
+ ]);
606
+ }), 128))], 64);
607
+ }), 128))], 512)) : (openBlock(), createElementBlock("div", mergeProps({ key: 1 }, unref(wrapperProps), {
517
608
  ref_key: "menuRef",
518
609
  ref: menuRef
519
610
  }), [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(renderedData), ({ item, _index }) => {
@@ -522,24 +613,26 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
522
613
  active: unref(isActiveItem)(item),
523
614
  "aria-selected": unref(isActiveItem)(item),
524
615
  size: __props.dense ? "sm" : void 0,
616
+ disabled: unref(isItemDisabled)(item),
525
617
  tabindex: "0",
526
618
  variant: "list",
527
619
  "data-highlighted": unref(highlightedIndex) === _index,
620
+ "data-disabled": unref(isItemDisabled)(item) || void 0,
528
621
  class: normalizeClass({ [unref(highlightedClass)]: !unref(isActiveItem)(item) && unref(highlightedIndex) === _index }),
529
- onClick: ($event) => setValue(item)
622
+ onClick: ($event) => !unref(isItemDisabled)(item) && setValue(item)
530
623
  }, {
531
624
  prepend: withCtx(() => [renderSlot(_ctx.$slots, "item.prepend", mergeProps({ ref_for: true }, {
532
- disabled: __props.disabled,
625
+ disabled: unref(isItemDisabled)(item),
533
626
  item,
534
627
  active: unref(isActiveItem)(item)
535
628
  }))]),
536
629
  append: withCtx(() => [renderSlot(_ctx.$slots, "item.append", mergeProps({ ref_for: true }, {
537
- disabled: __props.disabled,
630
+ disabled: unref(isItemDisabled)(item),
538
631
  item,
539
632
  active: unref(isActiveItem)(item)
540
633
  }))]),
541
634
  default: withCtx(() => [renderSlot(_ctx.$slots, "item", mergeProps({ ref_for: true }, {
542
- disabled: __props.disabled,
635
+ disabled: unref(isItemDisabled)(item),
543
636
  item,
544
637
  active: unref(isActiveItem)(item)
545
638
  }), () => [createTextVNode(toDisplayString(unref(getText)(item)), 1)])]),
@@ -548,22 +641,25 @@ var RuiAutoComplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
548
641
  "active",
549
642
  "aria-selected",
550
643
  "size",
644
+ "disabled",
551
645
  "data-highlighted",
646
+ "data-disabled",
552
647
  "class",
553
648
  "onClick"
554
649
  ]);
555
- }), 128))], 16)], 38)) : !__props.hideNoData ? (openBlock(), createElementBlock("div", {
650
+ }), 128))], 16))], 38)) : !__props.hideNoData ? (openBlock(), createElementBlock("div", {
556
651
  key: 1,
557
652
  style: normalizeStyle({
558
653
  width: `${width}px`,
559
654
  minWidth: unref(menuWidth)
560
655
  }),
561
656
  class: normalizeClass(__props.classNames?.menu ?? __props.menuClass)
562
- }, [renderSlot(_ctx.$slots, "no-data", {}, () => [!__props.customValue ? (openBlock(), createElementBlock("div", _hoisted_4, toDisplayString(__props.noDataText), 1)) : createCommentVNode("", true)])], 6)) : createCommentVNode("", true)], 512)]),
657
+ }, [renderSlot(_ctx.$slots, "no-data", {}, () => [!__props.customValue ? (openBlock(), createElementBlock("div", _hoisted_7, toDisplayString(__props.noDataText), 1)) : createCommentVNode("", true)])], 6)) : createCommentVNode("", true), slots.footer ? (openBlock(), createElementBlock("div", _hoisted_8, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)], 512)]),
563
658
  _: 3
564
659
  }, 16, [
565
660
  "modelValue",
566
661
  "class",
662
+ "options",
567
663
  "menu-class",
568
664
  "error-messages",
569
665
  "success-messages",