@rotki/ui-library 3.0.0-beta.3 → 3.0.0-beta.5

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 (248) hide show
  1. package/README.md +27 -14
  2. package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
  3. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +1 -1
  4. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  5. package/dist/components/accordions/accordions/RuiAccordions.js.map +1 -1
  6. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/components/alerts/RuiAlert.js.map +1 -1
  8. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/avatars/RuiAvatar.js.map +1 -1
  10. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  11. package/dist/components/avatars/RuiAvatarGroup.js.map +1 -1
  12. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/buttons/button/RuiButton.js.map +1 -1
  14. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  15. package/dist/components/buttons/button-group/RuiButtonGroup.js.map +1 -1
  16. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  17. package/dist/components/calendar/RuiCalendar.js.map +1 -1
  18. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
  20. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/components/calendar/RuiCalendarHeader.js.map +1 -1
  22. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
  24. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/cards/RuiCard.js.map +1 -1
  26. package/dist/components/cards/RuiCard.vue.d.ts +1 -1
  27. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  28. package/dist/components/cards/RuiCardHeader.js.map +1 -1
  29. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/chips/RuiChip.js.map +1 -1
  31. package/dist/components/chips/RuiChip.vue.d.ts +1 -1
  32. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
  34. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/color-picker/RuiColorDisplay.js.map +1 -1
  36. package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/color-picker/RuiColorHue.js.map +1 -1
  38. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
  39. package/dist/components/color-picker/RuiColorInput.js.map +1 -1
  40. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/components/color-picker/RuiColorPicker.js.map +1 -1
  42. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  43. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  44. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/date-time-picker/RuiDateTimePickerMenu.js.map +1 -1
  46. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.d.ts +1 -1
  47. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/components/date-time-picker/RuiTimezoneSelect.js.map +1 -1
  49. package/dist/components/date-time-picker/RuiTimezoneSelect.vue.d.ts +2 -2
  50. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/components/divider/RuiDivider.js.map +1 -1
  52. package/dist/components/divider/RuiDivider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  53. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  54. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +1 -1
  55. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  56. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.js.map +1 -1
  57. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js.map +1 -1
  59. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue.d.ts +1 -1
  60. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  61. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js.map +1 -1
  62. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/components/forms/auto-complete/auto-complete-props.d.ts +2 -2
  64. package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -1
  65. package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +2 -2
  66. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +6 -2
  67. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/forms/checkbox/RuiCheckbox.js.map +1 -1
  69. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  70. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.js.map +1 -1
  71. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/forms/field-defaults/RuiFieldDefaults.js.map +1 -1
  73. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js.map +1 -1
  74. package/dist/components/forms/field-label/RuiFieldLabel.js.map +1 -1
  75. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  76. package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -1
  77. package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +4 -1
  78. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +17 -8
  79. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  80. package/dist/components/forms/radio-button/radio/RuiRadio.js.map +1 -1
  81. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.js.map +1 -1
  83. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  84. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.js.map +1 -1
  85. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +1 -1
  86. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  87. package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
  88. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +2 -2
  89. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  90. package/dist/components/forms/select/RuiSimpleSelect.js.map +1 -1
  91. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  92. package/dist/components/forms/slider/RuiSlider.js.map +1 -1
  93. package/dist/components/forms/slider/RuiSlider.vue.d.ts +1 -1
  94. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  95. package/dist/components/forms/slider/RuiSliderTicks.js.map +1 -1
  96. package/dist/components/forms/slider/RuiSliderTicks.vue_vue_type_script_setup_true_lang.js.map +1 -1
  97. package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
  98. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  99. package/dist/components/forms/text-area/RuiTextArea.js.map +1 -1
  100. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  101. package/dist/components/forms/text-field/RuiTextField.js.map +1 -1
  102. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  103. package/dist/components/helpers/RuiFormTextDetail.js.map +1 -1
  104. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js +1 -2
  105. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  106. package/dist/components/icons/RuiIcon.js.map +1 -1
  107. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +11 -10
  108. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/index.d.ts +57 -57
  110. package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
  111. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  112. package/dist/components/loaders/RuiSkeletonLoader.js.map +1 -1
  113. package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +1 -1
  114. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/components/logos/RuiLogo.js.map +1 -1
  116. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js.map +1 -1
  117. package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
  118. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  119. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.js.map +1 -1
  120. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
  122. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +1 -1
  123. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  124. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  125. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +1 -1
  126. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  127. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
  128. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +1 -1
  129. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
  131. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
  132. package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
  133. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +1 -1
  134. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  135. package/dist/components/progress/RuiProgress.js.map +1 -1
  136. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  137. package/dist/components/steppers/RuiFooterStepper.js.map +1 -1
  138. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +6 -2
  139. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/components/steppers/RuiStepper.js.map +1 -1
  141. package/dist/components/steppers/RuiStepper.vue.d.ts +1 -1
  142. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  143. package/dist/components/steppers/RuiStepperIcon.js.map +1 -1
  144. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  145. package/dist/components/tables/RuiDataTable.js.map +1 -1
  146. package/dist/components/tables/RuiDataTable.vue.d.ts +11 -2
  147. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +8 -3
  148. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  149. package/dist/components/tables/RuiExpandButton.js.map +1 -1
  150. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  151. package/dist/components/tables/RuiTable.js.map +1 -1
  152. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  153. package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
  154. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  155. package/dist/components/tables/RuiTableErrorState.js.map +1 -1
  156. package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  157. package/dist/components/tables/RuiTableHead.js.map +1 -1
  158. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  159. package/dist/components/tables/RuiTableLoadingState.js.map +1 -1
  160. package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/components/tables/RuiTablePagination.js.map +1 -1
  162. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  163. package/dist/components/tables/data-table/RuiDataTableAppendRow.js +7 -0
  164. package/dist/components/tables/data-table/RuiDataTableAppendRow.js.map +1 -0
  165. package/dist/components/tables/data-table/RuiDataTableAppendRow.vue.d.ts +26 -0
  166. package/dist/components/tables/data-table/RuiDataTableAppendRow.vue_vue_type_script_setup_true_lang.js +29 -0
  167. package/dist/components/tables/data-table/RuiDataTableAppendRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
  168. package/dist/components/tables/data-table/RuiDataTableBody.js.map +1 -1
  169. package/dist/components/tables/data-table/RuiDataTableBody.vue.d.ts +5 -1
  170. package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js +18 -10
  171. package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js.map +1 -1
  172. package/dist/components/tables/data-table/RuiDataTableCell.js.map +1 -1
  173. package/dist/components/tables/data-table/RuiDataTableCell.vue.d.ts +1 -1
  174. package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  175. package/dist/components/tables/data-table/RuiDataTableEmptyRow.js.map +1 -1
  176. package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/components/tables/data-table/RuiDataTableErrorRow.js.map +1 -1
  178. package/dist/components/tables/data-table/RuiDataTableErrorRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  179. package/dist/components/tables/data-table/RuiDataTableExpandedRow.js.map +1 -1
  180. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/components/tables/data-table/RuiDataTableGroupRow.js.map +1 -1
  182. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  183. package/dist/components/tables/data-table/RuiDataTableLoadingRow.js.map +1 -1
  184. package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  185. package/dist/components/tables/data-table/RuiDataTableMobileSort.js.map +1 -1
  186. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue.d.ts +1 -1
  187. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
  188. package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -1
  189. package/dist/components/tables/data-table/RuiDataTableRow.vue.d.ts +5 -1
  190. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +144 -88
  191. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/components/tables/data-table/context.d.ts +1 -1
  193. package/dist/components/tables/data-table-styles.js +1 -1
  194. package/dist/components/tables/data-table-styles.js.map +1 -1
  195. package/dist/components/tabs/tab/RuiTab.js.map +1 -1
  196. package/dist/components/tabs/tab/RuiTab.vue.d.ts +1 -1
  197. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/components/tabs/tab-item/RuiTabItem.js.map +1 -1
  199. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  200. package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
  201. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
  202. package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
  203. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  204. package/dist/components/time-picker/RuiTimePicker.js.map +1 -1
  205. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js +12 -8
  206. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  207. package/dist/composables/floating.d.ts +1 -1
  208. package/dist/composables/icons.d.ts +1 -1
  209. package/dist/composables/icons.js +1 -7
  210. package/dist/composables/icons.js.map +1 -1
  211. package/dist/composables/tables/data-table/columns.d.ts +1 -1
  212. package/dist/composables/tables/data-table/grouping.d.ts +1 -1
  213. package/dist/composables/tables/data-table/page-scroll.d.ts +1 -1
  214. package/dist/composables/tables/data-table/pagination.d.ts +2 -2
  215. package/dist/composables/tables/data-table/sort.d.ts +2 -2
  216. package/dist/composables/tables/data-table/types.d.ts +2 -2
  217. package/dist/i18n/keys.d.ts +9 -0
  218. package/dist/i18n/keys.js +9 -0
  219. package/dist/i18n/keys.js.map +1 -1
  220. package/dist/icons/icons_1.d.ts +26 -26
  221. package/dist/icons/icons_1.js +348 -365
  222. package/dist/icons/icons_1.js.map +1 -1
  223. package/dist/icons/icons_2.d.ts +28 -28
  224. package/dist/icons/icons_2.js +434 -323
  225. package/dist/icons/icons_2.js.map +1 -1
  226. package/dist/icons/icons_3.d.ts +32 -32
  227. package/dist/icons/icons_3.js +334 -364
  228. package/dist/icons/icons_3.js.map +1 -1
  229. package/dist/icons/icons_4.d.ts +64 -64
  230. package/dist/icons/icons_4.js +769 -669
  231. package/dist/icons/icons_4.js.map +1 -1
  232. package/dist/icons/icons_5.d.ts +66 -9
  233. package/dist/icons/icons_5.js +693 -83
  234. package/dist/icons/icons_5.js.map +1 -1
  235. package/dist/icons/index.d.ts +1 -1
  236. package/dist/icons/index.js +108 -51
  237. package/dist/icons/index.js.map +1 -1
  238. package/dist/index.d.ts +1 -1
  239. package/dist/index.js +6 -6
  240. package/dist/style.css +22 -4
  241. package/dist/types/theme.d.ts +1 -1
  242. package/dist/utils/tv.d.ts +1 -1
  243. package/dist/vendor/@vueuse/core/dist/index.js +63 -55
  244. package/dist/vendor/@vueuse/core/dist/index.js.map +1 -1
  245. package/dist/vendor/@vueuse/shared/dist/index.js +4 -4
  246. package/dist/vendor/@vueuse/shared/dist/index.js.map +1 -1
  247. package/dist/web-types.json +88 -4
  248. package/package.json +26 -26
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAutoComplete.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../../src/components/forms/auto-complete/RuiAutoComplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue, TItem\">\nimport type { AutoCompleteModelValue, AutoCompleteProps } from '@/components/forms/auto-complete/auto-complete-props';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport { autoCompleteStyles } from '@/components/forms/auto-complete/auto-complete-styles';\nimport RuiAutoCompleteOptionList from '@/components/forms/auto-complete/RuiAutoCompleteOptionList.vue';\nimport RuiAutoCompleteSelection from '@/components/forms/auto-complete/RuiAutoCompleteSelection.vue';\nimport RuiFieldLabel from '@/components/forms/field-label/RuiFieldLabel.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { activatorHandlers } from '@/components/overlays/menu/activator-handlers';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { useLabelPlacement } from '@/composables/defaults/field';\nimport { getOptionHeight, useDropdownMenu, useDropdownOptionProperty } from '@/composables/dropdown-menu';\nimport { type FloatingOptions, Placement } from '@/composables/floating';\nimport {\n splitAriaAttrs,\n useAutoCompleteChips,\n useAutoCompleteCombobox,\n useAutoCompleteFocus,\n useAutoCompleteKeyboardNavigation,\n useAutoCompleteSearch,\n useAutoCompleteSelection,\n useAutoCompleteValue,\n} from '@/composables/forms/auto-complete';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\nimport { cn } from '@/utils/tv';\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 labelPlacement = undefined,\n menuOptions,\n classNames,\n prependIcon,\n hideArrow = false,\n hint,\n keyAttr,\n textAttr,\n itemHeight,\n prependWidth,\n appendWidth,\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 readOnly: boolean;\n attrs: Record<string, unknown>;\n open: boolean;\n hasError: boolean;\n hasSuccess: boolean;\n }) => 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');\n// Owned by the option list, so it arrives through a ref callback rather than this template\nconst menuRef = shallowRef<HTMLElement | null>(null);\n\nfunction setMenuRef(element: Element | ComponentPublicInstance | null): void {\n set(menuRef, element instanceof HTMLElement ? element : null);\n}\nconst menuWrapperRef = useTemplateRef<HTMLDivElement>('menuWrapperRef');\n\nconst { focused: activatorFocusedWithin } = useFocusWithin(activator);\nconst { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);\nconst { focused: searchInputFocused } = useFocus(textInput);\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 } = 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 ?? getOptionHeight(dense);\n\n/* eslint-disable @typescript-eslint/no-use-before-define -- these call the selection composable below, which needs their helpers; the calls run after setup */\nconst {\n containerProps,\n wrapperProps,\n renderedData,\n menuWidth,\n isActiveItem,\n itemIndexInValue,\n modelHighlightedIndex,\n moveHighlight,\n applyHighlighted,\n optionsWithSelectedHidden,\n modelUserNavigated,\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: (item: TItem): void => { setValue(item); },\n autoSelectFirst,\n hideSelected,\n isOpen,\n getText,\n getIdentifier,\n groupBy: () => groupBy,\n itemDisabled: () => itemDisabled,\n prependWidth,\n appendWidth,\n});\n\nconst {\n focusedValueIndex,\n moveSelectedValueHighlight,\n onEnter,\n onInputDeletePressed,\n onInputKeydown,\n onTab,\n setValueFocus,\n} = useAutoCompleteKeyboardNavigation<TItem>(\n {\n chips: () => chips,\n customValue: () => customValue,\n multiple,\n },\n {\n activator,\n applyHighlighted,\n clear: (): void => clear(),\n filteredOptions,\n getText,\n highlightedIndex: modelHighlightedIndex,\n internalSearch,\n isOpen,\n removeValue: (item: TItem): void => { setValue(item); },\n searchInputFocused,\n setSearchAsValue: (): void => setSearchAsValue(),\n updateInternalSearch,\n userNavigated: modelUserNavigated,\n value,\n },\n);\n\nconst { chipAttrs, selectChip } = useAutoCompleteChips<TItem>({\n focusInput: (): void => get(textInput)?.focus(),\n getIdentifier,\n setValue: (item: TItem): void => { setValue(item); },\n setValueFocus,\n});\n\n/** The selected chip's text, read out by the live region so the selection is heard, not only seen. */\nconst selectedChipAnnouncement = computed<string>(() => {\n const item = get(value)[get(focusedValueIndex)];\n return chips && item !== undefined ? `${getText(item) ?? ''}, press Backspace to remove` : '';\n});\n\nconst {\n anyFocused: focusAnyFocused,\n editing,\n inputClass: focusInputClass,\n onInputFocused: focusOnInputFocused,\n onSettledKeydown,\n setInputFocus: focusSetInputFocus,\n settleOnInput,\n unsettle,\n} = useAutoCompleteFocus(\n {\n customValue: () => customValue,\n disabled: () => disabled,\n shouldApplyValueAsSearch,\n },\n {\n activatorFocusedWithin,\n focusedValueIndex,\n internalSearch,\n isOpen,\n justOpened,\n menuWrapperFocusedWithin,\n searchInputFocused,\n setSearchAsValue: (): void => setSearchAsValue(),\n textInput,\n updateInternalSearch,\n },\n);\n\n/* eslint-enable @typescript-eslint/no-use-before-define -- the wiring above ends here */\n\nconst { clear, setSearchAsValue, setValue } = useAutoCompleteSelection<TItem>({\n getText,\n internalSearch,\n isOpen,\n itemIndexInValue,\n multiple,\n resetModel: (): void => set(modelValue, (Array.isArray(get(modelValue)) ? [] : undefined) as AutoCompleteModelValue<TValue>),\n searchInputFocused,\n settleOnInput,\n shouldApplyValueAsSearch,\n textValueToProperValue,\n updateInternalSearch,\n value,\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(editing))\n return placeholder;\n return '';\n});\n\nconst labelId = useId();\nconst placement = useLabelPlacement(() => labelPlacement);\nconst { activeDescendant, optionIdPrefix } = useAutoCompleteCombobox(isOpen, modelHighlightedIndex);\n\n// An empty, unfocused field shows the placeholder where the collapsed search input sits\nconst restingPlaceholder = computed<boolean>(() =>\n !!placeholder && !get(valueSet) && !get(editing) && !slots.placeholder,\n);\n\nconst ui = computed<ReturnType<typeof autoCompleteStyles>>(() => autoCompleteStyles({\n opened: get(isOpen),\n hovered: get(isHovered),\n dense,\n disabled,\n readonly: readOnly,\n multiple: get(multiple),\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 unsettle();\n set(isOpen, true);\n updateInternalSearch(value);\n set(justOpened, false);\n}\n\n/**\n * Moves the highlight through the options, which also leaves the picked-value display for a search.\n *\n * @param up - whether to move towards the first option\n */\nfunction onArrow(up: boolean): void {\n unsettle();\n moveHighlight(up);\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\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 :class-names=\"{\n ...menuOptions?.classNames,\n details: ['px-0', cn(menuOptions?.classNames?.details) ?? ''],\n menu: [\n { hidden: optionsWithSelectedHidden.length === 0 && customValue && !slots['no-data'] },\n cn(menuOptions?.classNames?.menu) ?? '',\n ],\n }\"\n :options=\"menuFloatingOptions\"\n :close-on-content-click=\"false\"\n full-width\n persist-on-activator-click\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 role=\"listbox\"\n >\n <template\n v-if=\"label\"\n #label\n >\n <RuiFieldLabel\n :id=\"labelId\"\n :text=\"label\"\n :hidden=\"placement === 'hidden'\"\n :required=\"required\"\n :disabled=\"disabled\"\n />\n </template>\n <template #activator=\"{ attrs, open, hasError: slotHasError, hasSuccess: slotHasSuccess }\">\n <slot\n name=\"activator\"\n v-bind=\"{ disabled, value, readOnly, attrs, open, hasError: slotHasError, hasSuccess: slotHasSuccess }\"\n >\n <!--\n The visual box: it takes clicks and the keys that bubble from the input and the chips, but\n is no tab stop and carries no role. The input inside is the combobox (ARIA 1.2), so the\n chips sit beside it rather than nested in it.\n -->\n <div\n ref=\"activator\"\n :class=\"ui.activator({ class: cn([hideArrow && 'pr-3', classNames?.label]) })\"\n v-bind=\"{\n ...splitAriaAttrs(getNonRootAttrs($attrs, ['onClick', 'class']), false),\n ...(readOnly ? {} : activatorHandlers(attrs)),\n }\"\n data-id=\"activator\"\n @mouseenter=\"isHovered = true\"\n @mouseleave=\"isHovered = false\"\n @click=\"focusSetInputFocus()\"\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=\"onArrow(true)\"\n @keydown.down.prevent=\"onArrow(false)\"\n @keydown.home.prevent=\"modelHighlightedIndex = 0\"\n @keydown.end.prevent=\"modelHighlightedIndex = optionsWithSelectedHidden.length - 1\"\n >\n <span\n v-if=\"prependIcon\"\n :class=\"ui.prepend()\"\n data-id=\"prepend\"\n >\n <RuiIcon\n :name=\"prependIcon\"\n :size=\"dense ? 16 : 18\"\n />\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 <span\n v-if=\"restingPlaceholder\"\n data-id=\"resting-placeholder\"\n class=\"truncate text-rui-text-secondary pointer-events-none\"\n >\n {{ placeholder }}\n </span>\n <div\n v-if=\"!valueSet && !editing && 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 <RuiAutoCompleteSelection\n :items=\"value\"\n :chips=\"chips\"\n :dense=\"dense\"\n :multiple=\"multiple\"\n :search-input-focused=\"editing\"\n :hide-selection-wrapper=\"hideSelectionWrapper\"\n :get-identifier=\"getIdentifier\"\n :get-text=\"getText\"\n :chip-attrs=\"chipAttrs\"\n :selected-index=\"focusedValueIndex\"\n :select-chip=\"selectChip\"\n >\n <template\n v-if=\"slots['selection.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"selection.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"slots.selection\"\n #default=\"slotProps\"\n >\n <slot\n name=\"selection\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteSelection>\n <!-- with hideSearchInput the input stays as a collapsed, read-only combobox, so the field keeps a focus target -->\n <input\n ref=\"textInput\"\n :disabled=\"disabled\"\n :readonly=\"readOnly || hideSearchInput\"\n :value=\"internalSearch\"\n class=\"bg-transparent outline-hidden\"\n type=\"text\"\n :placeholder=\"usedPlaceholder\"\n :class=\"hideSearchInput ? 'w-0 h-0 min-w-0 opacity-0' : focusInputClass\"\n role=\"combobox\"\n :tabindex=\"readOnly ? -1 : undefined\"\n :aria-labelledby=\"label ? labelId : undefined\"\n :aria-expanded=\"open\"\n aria-haspopup=\"listbox\"\n :aria-controls=\"attrs['aria-controls']\"\n :aria-activedescendant=\"activeDescendant\"\n :aria-readonly=\"readOnly || undefined\"\n :aria-required=\"required || undefined\"\n :aria-busy=\"loading || undefined\"\n :aria-invalid=\"hasError\"\n aria-autocomplete=\"list\"\n data-id=\"search-input\"\n v-bind=\"splitAriaAttrs(getNonRootAttrs($attrs, ['onClick', 'class']), true)\"\n @keydown=\"onSettledKeydown($event); onInputKeydown($event)\"\n @keydown.delete=\"onInputDeletePressed($event)\"\n @input.stop=\"updateSearchInput($event)\"\n @focus=\"focusOnInputFocused()\"\n />\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n >\n {{ selectedChipAnnouncement }}\n </span>\n </div>\n\n <RuiButton\n v-if=\"clearable && valueSet && !disabled && !readOnly\"\n variant=\"text\"\n icon\n size=\"sm\"\n tabindex=\"-1\"\n data-id=\"clear\"\n aria-label=\"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=\"16\"\n />\n </RuiButton>\n\n <span\n v-if=\"!hideArrow\"\n :class=\"ui.iconWrapper()\"\n @click=\"arrowClicked($event)\"\n >\n <RuiIcon\n :class=\"ui.icon()\"\n :size=\"dense ? 16 : 20\"\n name=\"lu-chevron-down\"\n />\n </span>\n\n <RuiProgress\n v-if=\"loading\"\n :class=\"ui.progress()\"\n color=\"primary\"\n thickness=\"2\"\n variant=\"indeterminate\"\n />\n </div>\n <fieldset :class=\"ui.fieldset()\" />\n </slot>\n </template>\n <template #default=\"{ width }\">\n <div ref=\"menuWrapperRef\">\n <RuiAutoCompleteOptionList\n v-if=\"optionsWithSelectedHidden.length > 0\"\n :container-props=\"containerProps\"\n :wrapper-props=\"wrapperProps\"\n :set-menu-ref=\"setMenuRef\"\n :is-grouped=\"isGrouped\"\n :grouped-options=\"groupedOptions\"\n :rendered-data=\"renderedData\"\n :options=\"optionsWithSelectedHidden\"\n :highlighted-index=\"modelHighlightedIndex\"\n :highlighted-class=\"highlightedClass\"\n :dense=\"dense\"\n :menu-class=\"ui.menu({ class: cn(classNames?.menu) })\"\n :menu-style=\"{ width: `${width}px`, minWidth: menuWidth, minHeight: `${menuMinHeight}px` }\"\n :get-identifier=\"getIdentifier\"\n :get-text=\"getText\"\n :is-active-item=\"isActiveItem\"\n :is-item-disabled=\"isItemDisabled\"\n :option-id-prefix=\"optionIdPrefix\"\n @select=\"setValue($event)\"\n @move-highlight=\"moveHighlight($event)\"\n >\n <template\n v-if=\"slots['group-header']\"\n #group-header=\"slotProps\"\n >\n <slot\n name=\"group-header\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"slots['item.prepend']\"\n #item.prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"slots.item\"\n #item=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"slots['item.append']\"\n #item.append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOptionList>\n\n <div\n v-else-if=\"!hideNoData\"\n :style=\"{ width: `${width}px`, minWidth: menuWidth }\"\n :class=\"classNames?.menu\"\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-(--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-rui-menu border-t border-rui-divider pr-(--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":"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"}
1
+ {"version":3,"file":"RuiAutoComplete.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_useModel","_useSlots","_openBlock","_createBlock","RuiMenu","_mergeProps","_unref","_isRef","_createSlots","_withCtx","_renderSlot","_normalizeProps","_guardReactiveProps","_createElementVNode","_withKeys","_withModifiers","_createElementBlock","_normalizeClass","_createVNode","RuiIcon","_createCommentVNode","_toDisplayString","RuiAutoCompleteSelection","RuiButton","RuiProgress","RuiAutoCompleteOptionList","_normalizeStyle","RuiFieldLabel"],"sources":["../../../../src/components/forms/auto-complete/RuiAutoComplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue, TItem\">\nimport type { AutoCompleteModelValue, AutoCompleteProps } from '@/components/forms/auto-complete/auto-complete-props';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport { autoCompleteStyles } from '@/components/forms/auto-complete/auto-complete-styles';\nimport RuiAutoCompleteOptionList from '@/components/forms/auto-complete/RuiAutoCompleteOptionList.vue';\nimport RuiAutoCompleteSelection from '@/components/forms/auto-complete/RuiAutoCompleteSelection.vue';\nimport RuiFieldLabel from '@/components/forms/field-label/RuiFieldLabel.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { activatorHandlers } from '@/components/overlays/menu/activator-handlers';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { useLabelPlacement } from '@/composables/defaults/field';\nimport { getOptionHeight, useDropdownMenu, useDropdownOptionProperty } from '@/composables/dropdown-menu';\nimport { type FloatingOptions, Placement } from '@/composables/floating';\nimport {\n splitAriaAttrs,\n useAutoCompleteChips,\n useAutoCompleteCombobox,\n useAutoCompleteFocus,\n useAutoCompleteKeyboardNavigation,\n useAutoCompleteSearch,\n useAutoCompleteSelection,\n useAutoCompleteValue,\n} from '@/composables/forms/auto-complete';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\nimport { cn } from '@/utils/tv';\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 labelPlacement = undefined,\n menuOptions,\n classNames,\n prependIcon,\n hideArrow = false,\n hint,\n keyAttr,\n textAttr,\n itemHeight,\n prependWidth,\n appendWidth,\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 readOnly: boolean;\n attrs: Record<string, unknown>;\n open: boolean;\n hasError: boolean;\n hasSuccess: boolean;\n }) => 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');\n// Owned by the option list, so it arrives through a ref callback rather than this template\nconst menuRef = shallowRef<HTMLElement | null>(null);\n\nfunction setMenuRef(element: Element | ComponentPublicInstance | null): void {\n set(menuRef, element instanceof HTMLElement ? element : null);\n}\nconst menuWrapperRef = useTemplateRef<HTMLDivElement>('menuWrapperRef');\n\nconst { focused: activatorFocusedWithin } = useFocusWithin(activator);\nconst { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);\nconst { focused: searchInputFocused } = useFocus(textInput);\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 } = 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 ?? getOptionHeight(dense);\n\n/* eslint-disable @typescript-eslint/no-use-before-define -- these call the selection composable below, which needs their helpers; the calls run after setup */\nconst {\n containerProps,\n wrapperProps,\n renderedData,\n menuWidth,\n isActiveItem,\n itemIndexInValue,\n modelHighlightedIndex,\n moveHighlight,\n applyHighlighted,\n optionsWithSelectedHidden,\n modelUserNavigated,\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: (item: TItem): void => { setValue(item); },\n autoSelectFirst,\n hideSelected,\n isOpen,\n getText,\n getIdentifier,\n groupBy: () => groupBy,\n itemDisabled: () => itemDisabled,\n prependWidth,\n appendWidth,\n});\n\nconst {\n focusedValueIndex,\n moveSelectedValueHighlight,\n onEnter,\n onInputDeletePressed,\n onInputKeydown,\n onTab,\n setValueFocus,\n} = useAutoCompleteKeyboardNavigation<TItem>(\n {\n chips: () => chips,\n customValue: () => customValue,\n multiple,\n },\n {\n activator,\n applyHighlighted,\n clear: (): void => clear(),\n filteredOptions,\n getText,\n highlightedIndex: modelHighlightedIndex,\n internalSearch,\n isOpen,\n removeValue: (item: TItem): void => { setValue(item); },\n searchInputFocused,\n setSearchAsValue: (): void => setSearchAsValue(),\n updateInternalSearch,\n userNavigated: modelUserNavigated,\n value,\n },\n);\n\nconst { chipAttrs, selectChip } = useAutoCompleteChips<TItem>({\n focusInput: (): void => get(textInput)?.focus(),\n getIdentifier,\n setValue: (item: TItem): void => { setValue(item); },\n setValueFocus,\n});\n\n/** The selected chip's text, read out by the live region so the selection is heard, not only seen. */\nconst selectedChipAnnouncement = computed<string>(() => {\n const item = get(value)[get(focusedValueIndex)];\n return chips && item !== undefined ? `${getText(item) ?? ''}, press Backspace to remove` : '';\n});\n\nconst {\n anyFocused: focusAnyFocused,\n editing,\n inputClass: focusInputClass,\n onInputFocused: focusOnInputFocused,\n onSettledKeydown,\n setInputFocus: focusSetInputFocus,\n settleOnInput,\n unsettle,\n} = useAutoCompleteFocus(\n {\n customValue: () => customValue,\n disabled: () => disabled,\n shouldApplyValueAsSearch,\n },\n {\n activatorFocusedWithin,\n focusedValueIndex,\n internalSearch,\n isOpen,\n justOpened,\n menuWrapperFocusedWithin,\n searchInputFocused,\n setSearchAsValue: (): void => setSearchAsValue(),\n textInput,\n updateInternalSearch,\n },\n);\n\n/* eslint-enable @typescript-eslint/no-use-before-define -- the wiring above ends here */\n\nconst { clear, setSearchAsValue, setValue } = useAutoCompleteSelection<TItem>({\n getText,\n internalSearch,\n isOpen,\n itemIndexInValue,\n multiple,\n resetModel: (): void => set(modelValue, (Array.isArray(get(modelValue)) ? [] : undefined) as AutoCompleteModelValue<TValue>),\n searchInputFocused,\n settleOnInput,\n shouldApplyValueAsSearch,\n textValueToProperValue,\n updateInternalSearch,\n value,\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(editing))\n return placeholder;\n return '';\n});\n\nconst labelId = useId();\nconst placement = useLabelPlacement(() => labelPlacement);\nconst { activeDescendant, optionIdPrefix } = useAutoCompleteCombobox(isOpen, modelHighlightedIndex);\n\n// An empty, unfocused field shows the placeholder where the collapsed search input sits\nconst restingPlaceholder = computed<boolean>(() =>\n !!placeholder && !get(valueSet) && !get(editing) && !slots.placeholder,\n);\n\nconst ui = computed<ReturnType<typeof autoCompleteStyles>>(() => autoCompleteStyles({\n opened: get(isOpen),\n hovered: get(isHovered),\n dense,\n disabled,\n readonly: readOnly,\n multiple: get(multiple),\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 unsettle();\n set(isOpen, true);\n updateInternalSearch(value);\n set(justOpened, false);\n}\n\n/**\n * Moves the highlight through the options, which also leaves the picked-value display for a search.\n *\n * @param up - whether to move towards the first option\n */\nfunction onArrow(up: boolean): void {\n unsettle();\n moveHighlight(up);\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\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 :class-names=\"{\n ...menuOptions?.classNames,\n details: ['px-0', cn(menuOptions?.classNames?.details) ?? ''],\n menu: [\n { hidden: optionsWithSelectedHidden.length === 0 && customValue && !slots['no-data'] },\n cn(menuOptions?.classNames?.menu) ?? '',\n ],\n }\"\n :options=\"menuFloatingOptions\"\n :close-on-content-click=\"false\"\n full-width\n persist-on-activator-click\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 role=\"listbox\"\n >\n <template\n v-if=\"label\"\n #label\n >\n <RuiFieldLabel\n :id=\"labelId\"\n :text=\"label\"\n :hidden=\"placement === 'hidden'\"\n :required=\"required\"\n :disabled=\"disabled\"\n />\n </template>\n <template #activator=\"{ attrs, open, hasError: slotHasError, hasSuccess: slotHasSuccess }\">\n <slot\n name=\"activator\"\n v-bind=\"{ disabled, value, readOnly, attrs, open, hasError: slotHasError, hasSuccess: slotHasSuccess }\"\n >\n <!--\n The visual box: it takes clicks and the keys that bubble from the input and the chips, but\n is no tab stop and carries no role. The input inside is the combobox (ARIA 1.2), so the\n chips sit beside it rather than nested in it.\n -->\n <div\n ref=\"activator\"\n :class=\"ui.activator({ class: cn([hideArrow && 'pr-3', classNames?.label]) })\"\n v-bind=\"{\n ...splitAriaAttrs(getNonRootAttrs($attrs, ['onClick', 'class']), false),\n ...(readOnly ? {} : activatorHandlers(attrs)),\n }\"\n data-id=\"activator\"\n @mouseenter=\"isHovered = true\"\n @mouseleave=\"isHovered = false\"\n @click=\"focusSetInputFocus()\"\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=\"onArrow(true)\"\n @keydown.down.prevent=\"onArrow(false)\"\n @keydown.home.prevent=\"modelHighlightedIndex = 0\"\n @keydown.end.prevent=\"modelHighlightedIndex = optionsWithSelectedHidden.length - 1\"\n >\n <span\n v-if=\"prependIcon\"\n :class=\"ui.prepend()\"\n data-id=\"prepend\"\n >\n <RuiIcon\n :name=\"prependIcon\"\n :size=\"dense ? 16 : 18\"\n />\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 <span\n v-if=\"restingPlaceholder\"\n data-id=\"resting-placeholder\"\n class=\"truncate text-rui-text-secondary pointer-events-none\"\n >\n {{ placeholder }}\n </span>\n <div\n v-if=\"!valueSet && !editing && 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 <RuiAutoCompleteSelection\n :items=\"value\"\n :chips=\"chips\"\n :dense=\"dense\"\n :multiple=\"multiple\"\n :search-input-focused=\"editing\"\n :hide-selection-wrapper=\"hideSelectionWrapper\"\n :get-identifier=\"getIdentifier\"\n :get-text=\"getText\"\n :chip-attrs=\"chipAttrs\"\n :selected-index=\"focusedValueIndex\"\n :select-chip=\"selectChip\"\n >\n <template\n v-if=\"slots['selection.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"selection.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"slots.selection\"\n #default=\"slotProps\"\n >\n <slot\n name=\"selection\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteSelection>\n <!-- with hideSearchInput the input stays as a collapsed, read-only combobox, so the field keeps a focus target -->\n <input\n ref=\"textInput\"\n :disabled=\"disabled\"\n :readonly=\"readOnly || hideSearchInput\"\n :value=\"internalSearch\"\n class=\"bg-transparent outline-hidden\"\n type=\"text\"\n :placeholder=\"usedPlaceholder\"\n :class=\"hideSearchInput ? 'w-0 h-0 min-w-0 opacity-0' : focusInputClass\"\n role=\"combobox\"\n :tabindex=\"readOnly ? -1 : undefined\"\n :aria-labelledby=\"label ? labelId : undefined\"\n :aria-expanded=\"open\"\n aria-haspopup=\"listbox\"\n :aria-controls=\"attrs['aria-controls']\"\n :aria-activedescendant=\"activeDescendant\"\n :aria-readonly=\"readOnly || undefined\"\n :aria-required=\"required || undefined\"\n :aria-busy=\"loading || undefined\"\n :aria-invalid=\"hasError\"\n aria-autocomplete=\"list\"\n data-id=\"search-input\"\n v-bind=\"splitAriaAttrs(getNonRootAttrs($attrs, ['onClick', 'class']), true)\"\n @keydown=\"onSettledKeydown($event); onInputKeydown($event)\"\n @keydown.delete=\"onInputDeletePressed($event)\"\n @input.stop=\"updateSearchInput($event)\"\n @focus=\"focusOnInputFocused()\"\n />\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n >\n {{ selectedChipAnnouncement }}\n </span>\n </div>\n\n <RuiButton\n v-if=\"clearable && valueSet && !disabled && !readOnly\"\n variant=\"text\"\n icon\n size=\"sm\"\n tabindex=\"-1\"\n data-id=\"clear\"\n aria-label=\"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=\"16\"\n />\n </RuiButton>\n\n <span\n v-if=\"!hideArrow\"\n :class=\"ui.iconWrapper()\"\n @click=\"arrowClicked($event)\"\n >\n <RuiIcon\n :class=\"ui.icon()\"\n :size=\"dense ? 16 : 20\"\n name=\"lu-chevron-down\"\n />\n </span>\n\n <RuiProgress\n v-if=\"loading\"\n :class=\"ui.progress()\"\n color=\"primary\"\n thickness=\"2\"\n variant=\"indeterminate\"\n />\n </div>\n <fieldset :class=\"ui.fieldset()\" />\n </slot>\n </template>\n <template #default=\"{ width }\">\n <div ref=\"menuWrapperRef\">\n <RuiAutoCompleteOptionList\n v-if=\"optionsWithSelectedHidden.length > 0\"\n :container-props=\"containerProps\"\n :wrapper-props=\"wrapperProps\"\n :set-menu-ref=\"setMenuRef\"\n :is-grouped=\"isGrouped\"\n :grouped-options=\"groupedOptions\"\n :rendered-data=\"renderedData\"\n :options=\"optionsWithSelectedHidden\"\n :highlighted-index=\"modelHighlightedIndex\"\n :highlighted-class=\"highlightedClass\"\n :dense=\"dense\"\n :menu-class=\"ui.menu({ class: cn(classNames?.menu) })\"\n :menu-style=\"{ width: `${width}px`, minWidth: menuWidth, minHeight: `${menuMinHeight}px` }\"\n :get-identifier=\"getIdentifier\"\n :get-text=\"getText\"\n :is-active-item=\"isActiveItem\"\n :is-item-disabled=\"isItemDisabled\"\n :option-id-prefix=\"optionIdPrefix\"\n @select=\"setValue($event)\"\n @move-highlight=\"moveHighlight($event)\"\n >\n <template\n v-if=\"slots['group-header']\"\n #group-header=\"slotProps\"\n >\n <slot\n name=\"group-header\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"slots['item.prepend']\"\n #item.prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"slots.item\"\n #item=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"slots['item.append']\"\n #item.append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOptionList>\n\n <div\n v-else-if=\"!hideNoData\"\n :style=\"{ width: `${width}px`, minWidth: menuWidth }\"\n :class=\"classNames?.menu\"\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-(--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-rui-menu border-t border-rui-divider pr-(--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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAutoCompleteOption.js","names":[],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteOption.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\n\nexport interface AutoCompleteOptionProps<TItem> {\n item: TItem;\n text: string | undefined;\n active: boolean;\n disabled: boolean;\n dense: boolean;\n highlighted: boolean;\n highlightedClass: string;\n}\n\nconst {\n active,\n dense,\n disabled,\n highlighted,\n highlightedClass,\n item,\n text,\n} = defineProps<AutoCompleteOptionProps<TItem>>();\n\nconst emit = defineEmits<{\n select: [item: TItem];\n}>();\n\ndefineSlots<{\n prepend?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n default?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n append?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n}>();\n\nconst slotProps = computed<{ disabled: boolean; item: TItem; active: boolean }>(() => ({\n active,\n disabled,\n item,\n}));\n\nfunction onClick(): void {\n if (!disabled)\n emit('select', item);\n}\n</script>\n\n<template>\n <RuiButton\n :active=\"active\"\n role=\"option\"\n :aria-selected=\"active\"\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"disabled\"\n tabindex=\"0\"\n variant=\"list\"\n :data-highlighted=\"highlighted\"\n :data-disabled=\"disabled || undefined\"\n :class=\"{ [highlightedClass]: !active && highlighted }\"\n @click=\"onClick()\"\n >\n <template #prepend>\n <slot\n name=\"prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <slot v-bind=\"slotProps\">\n {{ text }}\n </slot>\n <template #append>\n <slot\n name=\"append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiButton>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiAutoCompleteOption.js","names":["_sfc_main"],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteOption.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\n\nexport interface AutoCompleteOptionProps<TItem> {\n item: TItem;\n text: string | undefined;\n active: boolean;\n disabled: boolean;\n dense: boolean;\n highlighted: boolean;\n highlightedClass: string;\n}\n\nconst {\n active,\n dense,\n disabled,\n highlighted,\n highlightedClass,\n item,\n text,\n} = defineProps<AutoCompleteOptionProps<TItem>>();\n\nconst emit = defineEmits<{\n select: [item: TItem];\n}>();\n\ndefineSlots<{\n prepend?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n default?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n append?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n}>();\n\nconst slotProps = computed<{ disabled: boolean; item: TItem; active: boolean }>(() => ({\n active,\n disabled,\n item,\n}));\n\nfunction onClick(): void {\n if (!disabled)\n emit('select', item);\n}\n</script>\n\n<template>\n <RuiButton\n :active=\"active\"\n role=\"option\"\n :aria-selected=\"active\"\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"disabled\"\n tabindex=\"0\"\n variant=\"list\"\n :data-highlighted=\"highlighted\"\n :data-disabled=\"disabled || undefined\"\n :class=\"{ [highlightedClass]: !active && highlighted }\"\n @click=\"onClick()\"\n >\n <template #prepend>\n <slot\n name=\"prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <slot v-bind=\"slotProps\">\n {{ text }}\n </slot>\n <template #append>\n <slot\n name=\"append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiButton>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteOption.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\n\nexport interface AutoCompleteOptionProps<TItem> {\n item: TItem;\n text: string | undefined;\n active: boolean;\n disabled: boolean;\n dense: boolean;\n highlighted: boolean;\n highlightedClass: string;\n}\n\nconst {\n active,\n dense,\n disabled,\n highlighted,\n highlightedClass,\n item,\n text,\n} = defineProps<AutoCompleteOptionProps<TItem>>();\n\nconst emit = defineEmits<{\n select: [item: TItem];\n}>();\n\ndefineSlots<{\n prepend?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n default?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n append?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n}>();\n\nconst slotProps = computed<{ disabled: boolean; item: TItem; active: boolean }>(() => ({\n active,\n disabled,\n item,\n}));\n\nfunction onClick(): void {\n if (!disabled)\n emit('select', item);\n}\n</script>\n\n<template>\n <RuiButton\n :active=\"active\"\n role=\"option\"\n :aria-selected=\"active\"\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"disabled\"\n tabindex=\"0\"\n variant=\"list\"\n :data-highlighted=\"highlighted\"\n :data-disabled=\"disabled || undefined\"\n :class=\"{ [highlightedClass]: !active && highlighted }\"\n @click=\"onClick()\"\n >\n <template #prepend>\n <slot\n name=\"prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <slot v-bind=\"slotProps\">\n {{ text }}\n </slot>\n <template #append>\n <slot\n name=\"append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiButton>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAuBA,MAAM,OAAO;EAUb,MAAM,YAAY,gBAAqE;GACrF,QAAK,QAAA;GACL,UAAO,QAAA;GACP,MAAG,QAAA;EACL,EAAE;EAEF,SAAS,UAAgB;GACvB,IAAI,CAAC,QAAA,UACH,KAAK,UAAU,QAAA,IAAI;EACvB;;GAIE,OAAA,UAAA,GAAA,YA4BY,mBAAA;IA3BT,QAAQ,QAAA;IACT,MAAK;IACJ,iBAAe,QAAA;IACf,MAAM,QAAA,QAAK,OAAU,KAAA;IACrB,UAAU,QAAA;IACX,UAAS;IACT,SAAQ;IACP,oBAAkB,QAAA;IAClB,iBAAe,QAAA,YAAY,KAAA;IAC3B,OAAK,eAAA,GAAK,QAAA,mBAAgB,CAAI,QAAA,UAAU,QAAA,YAAW,CAAA;IACnD,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAO;;IAEJ,SAAO,cAId,CAHF,WAGE,KAAA,QAAA,WAAA,eAAA,mBADQ,MAAA,SAAA,CAAS,CAAA,CAAA,CAAA,CAAA;IAMV,QAAM,cAIb,CAHF,WAGE,KAAA,QAAA,UAAA,eAAA,mBADQ,MAAA,SAAA,CAAS,CAAA,CAAA,CAAA,CAAA;IANrB,SAAA,cAEO,CAFP,WAEO,KAAA,QAAA,WAAA,eAAA,mBAFO,MAAA,SAAA,CAAS,CAAA,SAEhB,CADF,gBAAA,gBAAA,QAAA,IAAI,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","RuiButton","_normalizeClass","_withCtx","_renderSlot","_normalizeProps","_guardReactiveProps","_unref","_createTextVNode","_toDisplayString"],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteOption.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\n\nexport interface AutoCompleteOptionProps<TItem> {\n item: TItem;\n text: string | undefined;\n active: boolean;\n disabled: boolean;\n dense: boolean;\n highlighted: boolean;\n highlightedClass: string;\n}\n\nconst {\n active,\n dense,\n disabled,\n highlighted,\n highlightedClass,\n item,\n text,\n} = defineProps<AutoCompleteOptionProps<TItem>>();\n\nconst emit = defineEmits<{\n select: [item: TItem];\n}>();\n\ndefineSlots<{\n prepend?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n default?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n append?: (props: { disabled: boolean; item: TItem; active: boolean }) => any;\n}>();\n\nconst slotProps = computed<{ disabled: boolean; item: TItem; active: boolean }>(() => ({\n active,\n disabled,\n item,\n}));\n\nfunction onClick(): void {\n if (!disabled)\n emit('select', item);\n}\n</script>\n\n<template>\n <RuiButton\n :active=\"active\"\n role=\"option\"\n :aria-selected=\"active\"\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"disabled\"\n tabindex=\"0\"\n variant=\"list\"\n :data-highlighted=\"highlighted\"\n :data-disabled=\"disabled || undefined\"\n :class=\"{ [highlightedClass]: !active && highlighted }\"\n @click=\"onClick()\"\n >\n <template #prepend>\n <slot\n name=\"prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <slot v-bind=\"slotProps\">\n {{ text }}\n </slot>\n <template #append>\n <slot\n name=\"append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiButton>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAuBA,MAAM,OAAO;EAUb,MAAM,YAAY,gBAAqE;GACrF,QAAK,QAAA;GACL,UAAO,QAAA;GACP,MAAG,QAAA;EACL,EAAE;EAEF,SAAS,UAAgB;GACvB,IAAI,CAAC,QAAA,UACH,KAAK,UAAU,QAAA,IAAI;EACvB;;GAIE,OAAAA,UAAA,GAAAC,YA4BYC,mBAAA;IA3BT,QAAQ,QAAA;IACT,MAAK;IACJ,iBAAe,QAAA;IACf,MAAM,QAAA,QAAK,OAAU,KAAA;IACrB,UAAU,QAAA;IACX,UAAS;IACT,SAAQ;IACP,oBAAkB,QAAA;IAClB,iBAAe,QAAA,YAAY,KAAA;IAC3B,OAAKC,eAAA,GAAK,QAAA,mBAAgB,CAAI,QAAA,UAAU,QAAA,YAAW,CAAA;IACnD,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAO;;IAEJ,SAAOC,cAId,CAHFC,WAGE,KAAA,QAAA,WAAAC,eAAAC,mBADQC,MAAA,SAAA,CAAS,CAAA,CAAA,CAAA,CAAA;IAMV,QAAMJ,cAIb,CAHFC,WAGE,KAAA,QAAA,UAAAC,eAAAC,mBADQC,MAAA,SAAA,CAAS,CAAA,CAAA,CAAA,CAAA;IANrB,SAAAJ,cAEO,CAFPC,WAEO,KAAA,QAAA,WAAAC,eAAAC,mBAFOC,MAAA,SAAA,CAAS,CAAA,SAEhB,CADFC,gBAAAC,gBAAA,QAAA,IAAI,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAutoCompleteOptionList.js","names":[],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteOptionList.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport type { ComponentPublicInstance, Ref, StyleValue } from 'vue';\nimport type { DropdownOptionGroup } from '@/composables/dropdown-menu';\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiAutoCompleteOption from '@/components/forms/auto-complete/RuiAutoCompleteOption.vue';\n\nexport interface AutoCompleteOptionListProps<TItem> {\n containerProps: {\n ref: Ref<HTMLElement | null>;\n onScroll: () => void;\n style: StyleValue;\n };\n wrapperProps: Record<string, unknown>;\n /** Hands the list element back to the parent, which the dropdown composable measures. */\n setMenuRef: (element: Element | ComponentPublicInstance | null) => void;\n isGrouped: boolean;\n groupedOptions: DropdownOptionGroup<TItem>[];\n renderedData: { _index: number; item: TItem }[];\n options: TItem[];\n highlightedIndex: number;\n highlightedClass: string;\n dense: boolean;\n menuClass: VueClassValue;\n menuStyle: StyleValue;\n getIdentifier: (item: TItem) => unknown;\n getText: (item: TItem) => string | undefined;\n isActiveItem: (item: TItem) => boolean;\n isItemDisabled: (item: TItem) => boolean;\n /** Prefix of each option's id, which the combobox input names in `aria-activedescendant`. */\n optionIdPrefix: string;\n}\n\nconst {\n containerProps,\n dense,\n getIdentifier,\n getText,\n groupedOptions,\n highlightedClass,\n highlightedIndex,\n isActiveItem,\n isGrouped,\n isItemDisabled,\n menuClass,\n menuStyle,\n optionIdPrefix,\n options,\n renderedData,\n setMenuRef,\n wrapperProps,\n} = defineProps<AutoCompleteOptionListProps<TItem>>();\n\nconst emit = defineEmits<{\n 'select': [item: TItem];\n 'move-highlight': [up: boolean];\n}>();\n\ndefineSlots<{\n 'group-header'?: (props: { group: string; items: TItem[] }) => 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}>();\n\n/**\n * The highlight follows the option's place in the flat option list, which is\n * the order the keyboard walks, so a grouped option looks its index up there\n * rather than in the bucket it is drawn in.\n */\nfunction isHighlighted(item: TItem): boolean {\n return options.indexOf(item) === highlightedIndex;\n}\n</script>\n\n<template>\n <div\n :ref=\"containerProps.ref\"\n :class=\"menuClass\"\n :style=\"[containerProps.style, menuStyle]\"\n @scroll=\"containerProps.onScroll()\"\n @keydown.up.prevent=\"emit('move-highlight', true)\"\n @keydown.down.prevent=\"emit('move-highlight', false)\"\n >\n <div\n v-if=\"isGrouped\"\n :ref=\"setMenuRef\"\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-rui-raised bg-rui-menu\"\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 pt-2 pb-1 text-xs font-medium text-rui-text-secondary\">\n {{ bucket.group }}\n </div>\n </slot>\n </div>\n <RuiAutoCompleteOption\n v-for=\"item in bucket.items\"\n :id=\"`${optionIdPrefix}-${options.indexOf(item)}`\"\n :key=\"getIdentifier(item)?.toString()\"\n :item=\"item\"\n :text=\"getText(item)\"\n :active=\"isActiveItem(item)\"\n :disabled=\"isItemDisabled(item)\"\n :dense=\"dense\"\n :highlighted=\"isHighlighted(item)\"\n :highlighted-class=\"highlightedClass\"\n @select=\"emit('select', $event)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots.item\"\n #default=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots['item.append']\"\n #append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOption>\n </template>\n </div>\n <div\n v-else\n v-bind=\"wrapperProps\"\n :ref=\"setMenuRef\"\n >\n <RuiAutoCompleteOption\n v-for=\"{ item, _index } in renderedData\"\n :id=\"`${optionIdPrefix}-${_index}`\"\n :key=\"getIdentifier(item)?.toString()\"\n :item=\"item\"\n :text=\"getText(item)\"\n :active=\"isActiveItem(item)\"\n :disabled=\"isItemDisabled(item)\"\n :dense=\"dense\"\n :highlighted=\"highlightedIndex === _index\"\n :highlighted-class=\"highlightedClass\"\n @select=\"emit('select', $event)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots.item\"\n #default=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots['item.append']\"\n #append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOption>\n </div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiAutoCompleteOptionList.js","names":["_sfc_main"],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteOptionList.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport type { ComponentPublicInstance, Ref, StyleValue } from 'vue';\nimport type { DropdownOptionGroup } from '@/composables/dropdown-menu';\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiAutoCompleteOption from '@/components/forms/auto-complete/RuiAutoCompleteOption.vue';\n\nexport interface AutoCompleteOptionListProps<TItem> {\n containerProps: {\n ref: Ref<HTMLElement | null>;\n onScroll: () => void;\n style: StyleValue;\n };\n wrapperProps: Record<string, unknown>;\n /** Hands the list element back to the parent, which the dropdown composable measures. */\n setMenuRef: (element: Element | ComponentPublicInstance | null) => void;\n isGrouped: boolean;\n groupedOptions: DropdownOptionGroup<TItem>[];\n renderedData: { _index: number; item: TItem }[];\n options: TItem[];\n highlightedIndex: number;\n highlightedClass: string;\n dense: boolean;\n menuClass: VueClassValue;\n menuStyle: StyleValue;\n getIdentifier: (item: TItem) => unknown;\n getText: (item: TItem) => string | undefined;\n isActiveItem: (item: TItem) => boolean;\n isItemDisabled: (item: TItem) => boolean;\n /** Prefix of each option's id, which the combobox input names in `aria-activedescendant`. */\n optionIdPrefix: string;\n}\n\nconst {\n containerProps,\n dense,\n getIdentifier,\n getText,\n groupedOptions,\n highlightedClass,\n highlightedIndex,\n isActiveItem,\n isGrouped,\n isItemDisabled,\n menuClass,\n menuStyle,\n optionIdPrefix,\n options,\n renderedData,\n setMenuRef,\n wrapperProps,\n} = defineProps<AutoCompleteOptionListProps<TItem>>();\n\nconst emit = defineEmits<{\n 'select': [item: TItem];\n 'move-highlight': [up: boolean];\n}>();\n\ndefineSlots<{\n 'group-header'?: (props: { group: string; items: TItem[] }) => 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}>();\n\n/**\n * The highlight follows the option's place in the flat option list, which is\n * the order the keyboard walks, so a grouped option looks its index up there\n * rather than in the bucket it is drawn in.\n */\nfunction isHighlighted(item: TItem): boolean {\n return options.indexOf(item) === highlightedIndex;\n}\n</script>\n\n<template>\n <div\n :ref=\"containerProps.ref\"\n :class=\"menuClass\"\n :style=\"[containerProps.style, menuStyle]\"\n @scroll=\"containerProps.onScroll()\"\n @keydown.up.prevent=\"emit('move-highlight', true)\"\n @keydown.down.prevent=\"emit('move-highlight', false)\"\n >\n <div\n v-if=\"isGrouped\"\n :ref=\"setMenuRef\"\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-rui-raised bg-rui-menu\"\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 pt-2 pb-1 text-xs font-medium text-rui-text-secondary\">\n {{ bucket.group }}\n </div>\n </slot>\n </div>\n <RuiAutoCompleteOption\n v-for=\"item in bucket.items\"\n :id=\"`${optionIdPrefix}-${options.indexOf(item)}`\"\n :key=\"getIdentifier(item)?.toString()\"\n :item=\"item\"\n :text=\"getText(item)\"\n :active=\"isActiveItem(item)\"\n :disabled=\"isItemDisabled(item)\"\n :dense=\"dense\"\n :highlighted=\"isHighlighted(item)\"\n :highlighted-class=\"highlightedClass\"\n @select=\"emit('select', $event)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots.item\"\n #default=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots['item.append']\"\n #append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOption>\n </template>\n </div>\n <div\n v-else\n v-bind=\"wrapperProps\"\n :ref=\"setMenuRef\"\n >\n <RuiAutoCompleteOption\n v-for=\"{ item, _index } in renderedData\"\n :id=\"`${optionIdPrefix}-${_index}`\"\n :key=\"getIdentifier(item)?.toString()\"\n :item=\"item\"\n :text=\"getText(item)\"\n :active=\"isActiveItem(item)\"\n :disabled=\"isItemDisabled(item)\"\n :dense=\"dense\"\n :highlighted=\"highlightedIndex === _index\"\n :highlighted-class=\"highlightedClass\"\n @select=\"emit('select', $event)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots.item\"\n #default=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots['item.append']\"\n #append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOption>\n </div>\n </div>\n</template>\n"],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import type { ComponentPublicInstance, Ref, StyleValue } from 'vue';
2
2
  import type { DropdownOptionGroup } from '../../../composables/dropdown-menu.js';
3
- import type { VueClassValue } from '../../../types/class-value';
3
+ import type { VueClassValue } from '../../../types/class-value.js';
4
4
  export interface AutoCompleteOptionListProps<TItem> {
5
5
  containerProps: {
6
6
  ref: Ref<HTMLElement | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteOptionList.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport type { ComponentPublicInstance, Ref, StyleValue } from 'vue';\nimport type { DropdownOptionGroup } from '@/composables/dropdown-menu';\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiAutoCompleteOption from '@/components/forms/auto-complete/RuiAutoCompleteOption.vue';\n\nexport interface AutoCompleteOptionListProps<TItem> {\n containerProps: {\n ref: Ref<HTMLElement | null>;\n onScroll: () => void;\n style: StyleValue;\n };\n wrapperProps: Record<string, unknown>;\n /** Hands the list element back to the parent, which the dropdown composable measures. */\n setMenuRef: (element: Element | ComponentPublicInstance | null) => void;\n isGrouped: boolean;\n groupedOptions: DropdownOptionGroup<TItem>[];\n renderedData: { _index: number; item: TItem }[];\n options: TItem[];\n highlightedIndex: number;\n highlightedClass: string;\n dense: boolean;\n menuClass: VueClassValue;\n menuStyle: StyleValue;\n getIdentifier: (item: TItem) => unknown;\n getText: (item: TItem) => string | undefined;\n isActiveItem: (item: TItem) => boolean;\n isItemDisabled: (item: TItem) => boolean;\n /** Prefix of each option's id, which the combobox input names in `aria-activedescendant`. */\n optionIdPrefix: string;\n}\n\nconst {\n containerProps,\n dense,\n getIdentifier,\n getText,\n groupedOptions,\n highlightedClass,\n highlightedIndex,\n isActiveItem,\n isGrouped,\n isItemDisabled,\n menuClass,\n menuStyle,\n optionIdPrefix,\n options,\n renderedData,\n setMenuRef,\n wrapperProps,\n} = defineProps<AutoCompleteOptionListProps<TItem>>();\n\nconst emit = defineEmits<{\n 'select': [item: TItem];\n 'move-highlight': [up: boolean];\n}>();\n\ndefineSlots<{\n 'group-header'?: (props: { group: string; items: TItem[] }) => 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}>();\n\n/**\n * The highlight follows the option's place in the flat option list, which is\n * the order the keyboard walks, so a grouped option looks its index up there\n * rather than in the bucket it is drawn in.\n */\nfunction isHighlighted(item: TItem): boolean {\n return options.indexOf(item) === highlightedIndex;\n}\n</script>\n\n<template>\n <div\n :ref=\"containerProps.ref\"\n :class=\"menuClass\"\n :style=\"[containerProps.style, menuStyle]\"\n @scroll=\"containerProps.onScroll()\"\n @keydown.up.prevent=\"emit('move-highlight', true)\"\n @keydown.down.prevent=\"emit('move-highlight', false)\"\n >\n <div\n v-if=\"isGrouped\"\n :ref=\"setMenuRef\"\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-rui-raised bg-rui-menu\"\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 pt-2 pb-1 text-xs font-medium text-rui-text-secondary\">\n {{ bucket.group }}\n </div>\n </slot>\n </div>\n <RuiAutoCompleteOption\n v-for=\"item in bucket.items\"\n :id=\"`${optionIdPrefix}-${options.indexOf(item)}`\"\n :key=\"getIdentifier(item)?.toString()\"\n :item=\"item\"\n :text=\"getText(item)\"\n :active=\"isActiveItem(item)\"\n :disabled=\"isItemDisabled(item)\"\n :dense=\"dense\"\n :highlighted=\"isHighlighted(item)\"\n :highlighted-class=\"highlightedClass\"\n @select=\"emit('select', $event)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots.item\"\n #default=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots['item.append']\"\n #append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOption>\n </template>\n </div>\n <div\n v-else\n v-bind=\"wrapperProps\"\n :ref=\"setMenuRef\"\n >\n <RuiAutoCompleteOption\n v-for=\"{ item, _index } in renderedData\"\n :id=\"`${optionIdPrefix}-${_index}`\"\n :key=\"getIdentifier(item)?.toString()\"\n :item=\"item\"\n :text=\"getText(item)\"\n :active=\"isActiveItem(item)\"\n :disabled=\"isItemDisabled(item)\"\n :dense=\"dense\"\n :highlighted=\"highlightedIndex === _index\"\n :highlighted-class=\"highlightedClass\"\n @select=\"emit('select', $event)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots.item\"\n #default=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots['item.append']\"\n #append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOption>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js","names":["$slots","_openBlock","_createElementBlock","_normalizeClass","_normalizeStyle","_withKeys","_withModifiers","_Fragment","_renderList","_createElementVNode","_renderSlot","_mergeProps","_toDisplayString","_createBlock","RuiAutoCompleteOption","_createSlots","_withCtx"],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteOptionList.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport type { ComponentPublicInstance, Ref, StyleValue } from 'vue';\nimport type { DropdownOptionGroup } from '@/composables/dropdown-menu';\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiAutoCompleteOption from '@/components/forms/auto-complete/RuiAutoCompleteOption.vue';\n\nexport interface AutoCompleteOptionListProps<TItem> {\n containerProps: {\n ref: Ref<HTMLElement | null>;\n onScroll: () => void;\n style: StyleValue;\n };\n wrapperProps: Record<string, unknown>;\n /** Hands the list element back to the parent, which the dropdown composable measures. */\n setMenuRef: (element: Element | ComponentPublicInstance | null) => void;\n isGrouped: boolean;\n groupedOptions: DropdownOptionGroup<TItem>[];\n renderedData: { _index: number; item: TItem }[];\n options: TItem[];\n highlightedIndex: number;\n highlightedClass: string;\n dense: boolean;\n menuClass: VueClassValue;\n menuStyle: StyleValue;\n getIdentifier: (item: TItem) => unknown;\n getText: (item: TItem) => string | undefined;\n isActiveItem: (item: TItem) => boolean;\n isItemDisabled: (item: TItem) => boolean;\n /** Prefix of each option's id, which the combobox input names in `aria-activedescendant`. */\n optionIdPrefix: string;\n}\n\nconst {\n containerProps,\n dense,\n getIdentifier,\n getText,\n groupedOptions,\n highlightedClass,\n highlightedIndex,\n isActiveItem,\n isGrouped,\n isItemDisabled,\n menuClass,\n menuStyle,\n optionIdPrefix,\n options,\n renderedData,\n setMenuRef,\n wrapperProps,\n} = defineProps<AutoCompleteOptionListProps<TItem>>();\n\nconst emit = defineEmits<{\n 'select': [item: TItem];\n 'move-highlight': [up: boolean];\n}>();\n\ndefineSlots<{\n 'group-header'?: (props: { group: string; items: TItem[] }) => 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}>();\n\n/**\n * The highlight follows the option's place in the flat option list, which is\n * the order the keyboard walks, so a grouped option looks its index up there\n * rather than in the bucket it is drawn in.\n */\nfunction isHighlighted(item: TItem): boolean {\n return options.indexOf(item) === highlightedIndex;\n}\n</script>\n\n<template>\n <div\n :ref=\"containerProps.ref\"\n :class=\"menuClass\"\n :style=\"[containerProps.style, menuStyle]\"\n @scroll=\"containerProps.onScroll()\"\n @keydown.up.prevent=\"emit('move-highlight', true)\"\n @keydown.down.prevent=\"emit('move-highlight', false)\"\n >\n <div\n v-if=\"isGrouped\"\n :ref=\"setMenuRef\"\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-rui-raised bg-rui-menu\"\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 pt-2 pb-1 text-xs font-medium text-rui-text-secondary\">\n {{ bucket.group }}\n </div>\n </slot>\n </div>\n <RuiAutoCompleteOption\n v-for=\"item in bucket.items\"\n :id=\"`${optionIdPrefix}-${options.indexOf(item)}`\"\n :key=\"getIdentifier(item)?.toString()\"\n :item=\"item\"\n :text=\"getText(item)\"\n :active=\"isActiveItem(item)\"\n :disabled=\"isItemDisabled(item)\"\n :dense=\"dense\"\n :highlighted=\"isHighlighted(item)\"\n :highlighted-class=\"highlightedClass\"\n @select=\"emit('select', $event)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots.item\"\n #default=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots['item.append']\"\n #append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOption>\n </template>\n </div>\n <div\n v-else\n v-bind=\"wrapperProps\"\n :ref=\"setMenuRef\"\n >\n <RuiAutoCompleteOption\n v-for=\"{ item, _index } in renderedData\"\n :id=\"`${optionIdPrefix}-${_index}`\"\n :key=\"getIdentifier(item)?.toString()\"\n :item=\"item\"\n :text=\"getText(item)\"\n :active=\"isActiveItem(item)\"\n :disabled=\"isItemDisabled(item)\"\n :dense=\"dense\"\n :highlighted=\"highlightedIndex === _index\"\n :highlighted-class=\"highlightedClass\"\n @select=\"emit('select', $event)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend=\"slotProps\"\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots.item\"\n #default=\"slotProps\"\n >\n <slot\n name=\"item\"\n v-bind=\"slotProps\"\n />\n </template>\n <template\n v-if=\"$slots['item.append']\"\n #append=\"slotProps\"\n >\n <slot\n name=\"item.append\"\n v-bind=\"slotProps\"\n />\n </template>\n </RuiAutoCompleteOption>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAutoCompleteSelection.js","names":[],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteSelection.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport RuiChip from '@/components/chips/RuiChip.vue';\nimport { getTextToken } from '@/utils/helpers';\n\nexport interface AutoCompleteSelectionProps<TItem> {\n items: TItem[];\n chips: boolean;\n dense: boolean;\n multiple: boolean;\n searchInputFocused: boolean;\n hideSelectionWrapper: boolean;\n getIdentifier: (item: TItem) => unknown;\n getText: (item: TItem) => string | undefined;\n chipAttrs: (item: TItem, index: number) => Record<string, unknown>;\n /** The chip Backspace and Delete act on, -1 for none, drawn with a ring though it never takes focus. */\n selectedIndex: number;\n /** Selects a clicked chip, with focus left in the input. */\n selectChip: (index: number) => void;\n}\n\nconst {\n chipAttrs,\n selectChip,\n selectedIndex,\n chips,\n dense,\n getIdentifier,\n getText,\n hideSelectionWrapper,\n items,\n multiple,\n searchInputFocused,\n} = defineProps<AutoCompleteSelectionProps<TItem>>();\n\nconst slots = defineSlots<{\n prepend?: (props: { index: number; item: TItem }) => any;\n default?: (props: { index: number; item: TItem; chipAttrs: Record<string, unknown> }) => any;\n}>();\n\n/**\n * Without a chip, a selected value is only drawn when it cannot be read off the\n * search input: while picking several values, or while the input is unfocused\n * and a slot renders the selection itself.\n */\nconst showPlainSelection = computed<boolean>(() =>\n multiple || (!searchInputFocused && (!!slots.prepend || !!slots.default)),\n);\n</script>\n\n<template>\n <template\n v-for=\"(item, i) in items\"\n :key=\"getIdentifier(item)?.toString()\"\n >\n <!--\n Not a clickable chip: that would make it a button around its own close button. It never takes\n focus either, which stays in the input; the wrapper, which takes no box, selects it on a click.\n -->\n <span\n v-if=\"chips\"\n class=\"contents\"\n @click.stop=\"selectChip(i)\"\n >\n <RuiChip\n :key=\"getTextToken(getIdentifier(item))\"\n :size=\"dense ? 'sm' : 'md'\"\n closeable\n close-unfocusable\n :class=\"{\n 'leading-3': dense,\n // drawn inside the chip's edge: the field clips anything outside it\n 'outline-2 outline-solid outline-rui-primary -outline-offset-2': i === selectedIndex,\n }\"\n :data-selected=\"i === selectedIndex || undefined\"\n v-bind=\"chipAttrs(item, i)\"\n >\n <div class=\"flex\">\n <slot\n name=\"prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n :index=\"i\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n {{ getText(item) }}\n </slot>\n </div>\n </RuiChip>\n </span>\n <div\n v-else-if=\"showPlainSelection\"\n :class=\"hideSelectionWrapper ? 'contents' : 'flex'\"\n >\n <slot\n name=\"prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n v-if=\"multiple || !!slots.default\"\n :index=\"i\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n <!-- plain values are joined with a comma, the value row's gap standing in for the space -->\n {{ getText(item) }}{{ multiple && i < items.length - 1 ? ',' : '' }}\n </slot>\n </div>\n </template>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiAutoCompleteSelection.js","names":["_sfc_main"],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteSelection.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport RuiChip from '@/components/chips/RuiChip.vue';\nimport { getTextToken } from '@/utils/helpers';\n\nexport interface AutoCompleteSelectionProps<TItem> {\n items: TItem[];\n chips: boolean;\n dense: boolean;\n multiple: boolean;\n searchInputFocused: boolean;\n hideSelectionWrapper: boolean;\n getIdentifier: (item: TItem) => unknown;\n getText: (item: TItem) => string | undefined;\n chipAttrs: (item: TItem, index: number) => Record<string, unknown>;\n /** The chip Backspace and Delete act on, -1 for none, drawn with a ring though it never takes focus. */\n selectedIndex: number;\n /** Selects a clicked chip, with focus left in the input. */\n selectChip: (index: number) => void;\n}\n\nconst {\n chipAttrs,\n selectChip,\n selectedIndex,\n chips,\n dense,\n getIdentifier,\n getText,\n hideSelectionWrapper,\n items,\n multiple,\n searchInputFocused,\n} = defineProps<AutoCompleteSelectionProps<TItem>>();\n\nconst slots = defineSlots<{\n prepend?: (props: { index: number; item: TItem }) => any;\n default?: (props: { index: number; item: TItem; chipAttrs: Record<string, unknown> }) => any;\n}>();\n\n/**\n * Without a chip, a selected value is only drawn when it cannot be read off the\n * search input: while picking several values, or while the input is unfocused\n * and a slot renders the selection itself.\n */\nconst showPlainSelection = computed<boolean>(() =>\n multiple || (!searchInputFocused && (!!slots.prepend || !!slots.default)),\n);\n</script>\n\n<template>\n <template\n v-for=\"(item, i) in items\"\n :key=\"getIdentifier(item)?.toString()\"\n >\n <!--\n Not a clickable chip: that would make it a button around its own close button. It never takes\n focus either, which stays in the input; the wrapper, which takes no box, selects it on a click.\n -->\n <span\n v-if=\"chips\"\n class=\"contents\"\n @click.stop=\"selectChip(i)\"\n >\n <RuiChip\n :key=\"getTextToken(getIdentifier(item))\"\n :size=\"dense ? 'sm' : 'md'\"\n closeable\n close-unfocusable\n :class=\"{\n 'leading-3': dense,\n // drawn inside the chip's edge: the field clips anything outside it\n 'outline-2 outline-solid outline-rui-primary -outline-offset-2': i === selectedIndex,\n }\"\n :data-selected=\"i === selectedIndex || undefined\"\n v-bind=\"chipAttrs(item, i)\"\n >\n <div class=\"flex\">\n <slot\n name=\"prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n :index=\"i\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n {{ getText(item) }}\n </slot>\n </div>\n </RuiChip>\n </span>\n <div\n v-else-if=\"showPlainSelection\"\n :class=\"hideSelectionWrapper ? 'contents' : 'flex'\"\n >\n <slot\n name=\"prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n v-if=\"multiple || !!slots.default\"\n :index=\"i\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n <!-- plain values are joined with a comma, the value row's gap standing in for the space -->\n {{ getText(item) }}{{ multiple && i < items.length - 1 ? ',' : '' }}\n </slot>\n </div>\n </template>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteSelection.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport RuiChip from '@/components/chips/RuiChip.vue';\nimport { getTextToken } from '@/utils/helpers';\n\nexport interface AutoCompleteSelectionProps<TItem> {\n items: TItem[];\n chips: boolean;\n dense: boolean;\n multiple: boolean;\n searchInputFocused: boolean;\n hideSelectionWrapper: boolean;\n getIdentifier: (item: TItem) => unknown;\n getText: (item: TItem) => string | undefined;\n chipAttrs: (item: TItem, index: number) => Record<string, unknown>;\n /** The chip Backspace and Delete act on, -1 for none, drawn with a ring though it never takes focus. */\n selectedIndex: number;\n /** Selects a clicked chip, with focus left in the input. */\n selectChip: (index: number) => void;\n}\n\nconst {\n chipAttrs,\n selectChip,\n selectedIndex,\n chips,\n dense,\n getIdentifier,\n getText,\n hideSelectionWrapper,\n items,\n multiple,\n searchInputFocused,\n} = defineProps<AutoCompleteSelectionProps<TItem>>();\n\nconst slots = defineSlots<{\n prepend?: (props: { index: number; item: TItem }) => any;\n default?: (props: { index: number; item: TItem; chipAttrs: Record<string, unknown> }) => any;\n}>();\n\n/**\n * Without a chip, a selected value is only drawn when it cannot be read off the\n * search input: while picking several values, or while the input is unfocused\n * and a slot renders the selection itself.\n */\nconst showPlainSelection = computed<boolean>(() =>\n multiple || (!searchInputFocused && (!!slots.prepend || !!slots.default)),\n);\n</script>\n\n<template>\n <template\n v-for=\"(item, i) in items\"\n :key=\"getIdentifier(item)?.toString()\"\n >\n <!--\n Not a clickable chip: that would make it a button around its own close button. It never takes\n focus either, which stays in the input; the wrapper, which takes no box, selects it on a click.\n -->\n <span\n v-if=\"chips\"\n class=\"contents\"\n @click.stop=\"selectChip(i)\"\n >\n <RuiChip\n :key=\"getTextToken(getIdentifier(item))\"\n :size=\"dense ? 'sm' : 'md'\"\n closeable\n close-unfocusable\n :class=\"{\n 'leading-3': dense,\n // drawn inside the chip's edge: the field clips anything outside it\n 'outline-2 outline-solid outline-rui-primary -outline-offset-2': i === selectedIndex,\n }\"\n :data-selected=\"i === selectedIndex || undefined\"\n v-bind=\"chipAttrs(item, i)\"\n >\n <div class=\"flex\">\n <slot\n name=\"prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n :index=\"i\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n {{ getText(item) }}\n </slot>\n </div>\n </RuiChip>\n </span>\n <div\n v-else-if=\"showPlainSelection\"\n :class=\"hideSelectionWrapper ? 'contents' : 'flex'\"\n >\n <slot\n name=\"prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n v-if=\"multiple || !!slots.default\"\n :index=\"i\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n <!-- plain values are joined with a comma, the value row's gap standing in for the space -->\n {{ getText(item) }}{{ multiple && i < items.length - 1 ? ',' : '' }}\n </slot>\n </div>\n </template>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAkCA,MAAM,QAAQ,SAAA;;;;;;EAUd,MAAM,qBAAqB,eACzB,QAAA,YAAa,CAAC,QAAA,uBAAuB,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,MAAM,QAClE;;GAIE,OAAA,UAAA,IAAA,GAAA,mBA2DW,UAAA,MAAA,WA1DW,QAAA,QAAZ,MAAM,MAAC;IACT,OAAA,UAAA,GAAA,mBAAA,UAAA,EAAA,KAAA,QAAA,cAAc,IAAI,CAAA,EAAG,SAAQ,EAAA,GAAA,CAO3B,QAAA,SADR,UAAA,GAAA,mBAgCO,QAAA;;KA9BL,OAAM;KACL,SAAK,eAAA,WAAO,QAAA,WAAW,CAAC,GAAA,CAAA,MAAA,CAAA;IAEzB,GAAA,EAAA,UAAA,GAAA,YA0BU,iBA1BV,WA0BU;KAzBP,KAAK,MAAA,YAAA,CAAY,CAAC,QAAA,cAAc,IAAI,CAAA;KACpC,MAAM,QAAA,QAAK,OAAA;KACZ,WAAA;KACA,qBAAA;KACC,OAAK;MAA2B,aAAA,QAAA;MAAiK,iEAAA,MAAM,QAAA;;KAKvM,iBAAe,MAAM,QAAA,iBAAiB,KAAA;IAC/B,GAAA,EAAA,SAAA,KAAA,GAAA,QAAA,UAAU,MAAM,CAAC,CAAA,GAAA;KAEzB,SAAA,cAYM,CAZN,mBAYM,OAZN,YAYM,CAXJ,WAIE,KAAA,QAAA,WAJF,WAIE,EAFC,OAAO,EAAC,GAAA,EAAA,SAAA,KAAA,GAAA,EACC,KAAI,CAAA,CAAA,GAEhB,WAKO,KAAA,QAAA,WALP,WAKO,EAJJ,OAAO,EAAC,GAAA,EAAA,SAAA,KAAA,GAAA;MACC;MAAI,WAAa,QAAA,UAAU,MAAM,CAAC;KAAA,CAAA,SAGvC,CADF,gBAAA,gBAAA,QAAA,QAAQ,IAAI,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;IAMV,CAAA,EAAA,GAAA,GAAA,UAAA,KAAA,MAAA,kBAAA,KADb,UAAA,GAAA,mBAiBM,OAAA;;KAfH,OAAK,eAAE,QAAA,uBAAoB,aAAA,MAAA;IAE5B,GAAA,CAAA,WAIE,KAAA,QAAA,WAJF,WAIE,EAFC,OAAO,EAAC,GAAA,EAAA,SAAA,KAAA,GAAA,EACC,KAAI,CAAA,CAAA,GAGR,QAAA,YAAQ,CAAA,CAAM,MAAM,UAD5B,WAOO,KAAA,QAAA,WAPP,WAOO,EALJ,OAAO,EAAC,GAAA,EAAA,SAAA,KAAA,GAAA;KACC;KAAI,WAAa,QAAA,UAAU,MAAM,CAAC;IAAA,CAAA,SAIvC,CADF,gBAAA,gBAAA,QAAA,QAAQ,IAAI,CAAA,IAAA,gBAAO,QAAA,YAAY,IAAI,QAAA,MAAM,SAAM,IAAA,MAAA,EAAA,GAAA,CAAA,CAAA,GAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,EAAA"}
1
+ {"version":3,"file":"RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_Fragment","_renderList","_withModifiers","_createBlock","RuiChip","_mergeProps","_unref","_withCtx","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","_normalizeClass","_createCommentVNode"],"sources":["../../../../src/components/forms/auto-complete/RuiAutoCompleteSelection.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport RuiChip from '@/components/chips/RuiChip.vue';\nimport { getTextToken } from '@/utils/helpers';\n\nexport interface AutoCompleteSelectionProps<TItem> {\n items: TItem[];\n chips: boolean;\n dense: boolean;\n multiple: boolean;\n searchInputFocused: boolean;\n hideSelectionWrapper: boolean;\n getIdentifier: (item: TItem) => unknown;\n getText: (item: TItem) => string | undefined;\n chipAttrs: (item: TItem, index: number) => Record<string, unknown>;\n /** The chip Backspace and Delete act on, -1 for none, drawn with a ring though it never takes focus. */\n selectedIndex: number;\n /** Selects a clicked chip, with focus left in the input. */\n selectChip: (index: number) => void;\n}\n\nconst {\n chipAttrs,\n selectChip,\n selectedIndex,\n chips,\n dense,\n getIdentifier,\n getText,\n hideSelectionWrapper,\n items,\n multiple,\n searchInputFocused,\n} = defineProps<AutoCompleteSelectionProps<TItem>>();\n\nconst slots = defineSlots<{\n prepend?: (props: { index: number; item: TItem }) => any;\n default?: (props: { index: number; item: TItem; chipAttrs: Record<string, unknown> }) => any;\n}>();\n\n/**\n * Without a chip, a selected value is only drawn when it cannot be read off the\n * search input: while picking several values, or while the input is unfocused\n * and a slot renders the selection itself.\n */\nconst showPlainSelection = computed<boolean>(() =>\n multiple || (!searchInputFocused && (!!slots.prepend || !!slots.default)),\n);\n</script>\n\n<template>\n <template\n v-for=\"(item, i) in items\"\n :key=\"getIdentifier(item)?.toString()\"\n >\n <!--\n Not a clickable chip: that would make it a button around its own close button. It never takes\n focus either, which stays in the input; the wrapper, which takes no box, selects it on a click.\n -->\n <span\n v-if=\"chips\"\n class=\"contents\"\n @click.stop=\"selectChip(i)\"\n >\n <RuiChip\n :key=\"getTextToken(getIdentifier(item))\"\n :size=\"dense ? 'sm' : 'md'\"\n closeable\n close-unfocusable\n :class=\"{\n 'leading-3': dense,\n // drawn inside the chip's edge: the field clips anything outside it\n 'outline-2 outline-solid outline-rui-primary -outline-offset-2': i === selectedIndex,\n }\"\n :data-selected=\"i === selectedIndex || undefined\"\n v-bind=\"chipAttrs(item, i)\"\n >\n <div class=\"flex\">\n <slot\n name=\"prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n :index=\"i\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n {{ getText(item) }}\n </slot>\n </div>\n </RuiChip>\n </span>\n <div\n v-else-if=\"showPlainSelection\"\n :class=\"hideSelectionWrapper ? 'contents' : 'flex'\"\n >\n <slot\n name=\"prepend\"\n :index=\"i\"\n v-bind=\"{ item }\"\n />\n <slot\n v-if=\"multiple || !!slots.default\"\n :index=\"i\"\n v-bind=\"{ item, chipAttrs: chipAttrs(item, i) }\"\n >\n <!-- plain values are joined with a comma, the value row's gap standing in for the space -->\n {{ getText(item) }}{{ multiple && i < items.length - 1 ? ',' : '' }}\n </slot>\n </div>\n </template>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAkCA,MAAM,QAAQA,SAAA;;;;;;EAUd,MAAM,qBAAqB,eACzB,QAAA,YAAa,CAAC,QAAA,uBAAuB,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,MAAM,QAClE;;GAIE,OAAAC,UAAA,IAAA,GAAAC,mBA2DWC,UAAA,MAAAC,WA1DW,QAAA,QAAZ,MAAM,MAAC;IACT,OAAA,UAAA,GAAA,mBAAA,UAAA,EAAA,KAAA,QAAA,cAAc,IAAI,CAAA,EAAG,SAAQ,EAAA,GAAA,CAO3B,QAAA,SADRH,UAAA,GAAAC,mBAgCO,QAAA;;KA9BL,OAAM;KACL,SAAKG,eAAA,WAAO,QAAA,WAAW,CAAC,GAAA,CAAA,MAAA,CAAA;IAEzBJ,GAAAA,EAAAA,UAAA,GAAAK,YA0BUC,iBA1BVC,WA0BU;KAzBP,KAAKC,MAAA,YAAA,CAAY,CAAC,QAAA,cAAc,IAAI,CAAA;KACpC,MAAM,QAAA,QAAK,OAAA;KACZ,WAAA;KACA,qBAAA;KACC,OAAK;MAA2B,aAAA,QAAA;MAAiK,iEAAA,MAAM,QAAA;;KAKvM,iBAAe,MAAM,QAAA,iBAAiB,KAAA;IAC/B,GAAA,EAAA,SAAA,KAAA,GAAA,QAAA,UAAU,MAAM,CAAC,CAAA,GAAA;KAEzB,SAAAC,cAYM,CAZNC,mBAYM,OAZN,YAYM,CAXJC,WAIE,KAAA,QAAA,WAJFJ,WAIE,EAFC,OAAO,EAAC,GAAA,EAAA,SAAA,KAAA,GAAA,EACC,KAAI,CAAA,CAAA,GAEhBI,WAKO,KAAA,QAAA,WALPJ,WAKO,EAJJ,OAAO,EAAC,GAAA,EAAA,SAAA,KAAA,GAAA;MACC;MAAI,WAAa,QAAA,UAAU,MAAM,CAAC;KAAA,CAAA,SAGvC,CADFK,gBAAAC,gBAAA,QAAA,QAAQ,IAAI,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;IAMVL,CAAAA,EAAAA,GAAAA,GAAAA,UAAAA,KAAAA,MAAA,kBAAA,KADbR,UAAA,GAAAC,mBAiBM,OAAA;;KAfH,OAAKa,eAAE,QAAA,uBAAoB,aAAA,MAAA;IAE5BH,GAAAA,CAAAA,WAIE,KAAA,QAAA,WAJFJ,WAIE,EAFC,OAAO,EAAC,GAAA,EAAA,SAAA,KAAA,GAAA,EACC,KAAI,CAAA,CAAA,GAGR,QAAA,YAAQ,CAAA,CAAM,MAAM,UAD5BI,WAOO,KAAA,QAAA,WAPPJ,WAOO,EALJ,OAAO,EAAC,GAAA,EAAA,SAAA,KAAA,GAAA;KACC;KAAI,WAAa,QAAA,UAAU,MAAM,CAAC;IAAA,CAAA,SAIvC,CADFK,gBAAAC,gBAAA,QAAA,QAAQ,IAAI,CAAA,IAAAA,gBAAO,QAAA,YAAY,IAAI,QAAA,MAAM,SAAM,IAAA,MAAA,EAAA,GAAA,CAAA,CAAA,GAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,EAAA"}
@@ -1,8 +1,8 @@
1
- import type { MenuProps } from '../../overlays/menu/RuiMenu.vue';
1
+ import type { MenuProps } from '../../overlays/menu/RuiMenu.vue.js';
2
2
  import type { LabelPlacement } from '../../../composables/defaults/field.js';
3
3
  import type { GroupBy, ItemDisabled, KeyOfType } from '../../../composables/dropdown-menu.js';
4
4
  import type { RuiIcons } from '../../../icons/index.js';
5
- import type { VueClassValue } from '../../../types/class-value';
5
+ import type { VueClassValue } from '../../../types/class-value.js';
6
6
  export type AutoCompleteModelValue<TValue> = TValue extends Array<infer U> ? U[] : TValue | undefined;
7
7
  export interface RuiAutoCompleteClassNames {
8
8
  root?: VueClassValue;
@@ -1 +1 @@
1
- {"version":3,"file":"RuiCategoryPicker.js","names":[],"sources":["../../../../src/components/forms/category-picker/RuiCategoryPicker.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue, TItem\">\nimport type { KeyOfType } from '@/composables/dropdown-menu';\nimport type { VueClassValue } from '@/types/class-value';\nimport { breakpointsTailwind, useBreakpoints } from '@vueuse/core';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport { categoryPickerActivatorStyles, categoryPickerStyles } from '@/components/forms/category-picker/category-picker-styles';\nimport RuiFieldLabel from '@/components/forms/field-label/RuiFieldLabel.vue';\nimport RuiTextField from '@/components/forms/text-field/RuiTextField.vue';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiDialog, { type DialogProps } from '@/components/overlays/dialog/RuiDialog.vue';\nimport { activatorHandlers } from '@/components/overlays/menu/activator-handlers';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { type LabelPlacement, useLabelPlacement } from '@/composables/defaults/field';\nimport { Placement } from '@/composables/floating';\nimport { useCategoryPicker } from '@/composables/forms/category-picker/use-category-picker';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { cn } from '@/utils/tv';\n\nexport interface RuiCategoryPickerClassNames {\n root?: VueClassValue;\n rail?: VueClassValue;\n detail?: VueClassValue;\n search?: VueClassValue;\n}\n\nexport type CategoryPickerBreakpoint = 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport interface RuiCategoryPickerProps<TValue, TItem> {\n /** The full catalogue of selectable items. */\n items: TItem[];\n /** Resolve an item's category label. Takes precedence over `categoryAttr`. */\n categoryOf?: (item: TItem) => string;\n /** Resolve an item's category from one of its own properties. */\n categoryAttr?: keyof TItem;\n /** Property whose value becomes the model value. Omit to use the item itself. */\n keyAttr?: KeyOfType<TItem, TValue extends (infer U)[] ? U : TValue>;\n /** Property that produces an item's display text. */\n textAttr?: keyof TItem;\n /** Field label, and the title of the mobile sheet. */\n label?: string;\n /** Placeholder shown in the field while it is empty or being searched. */\n placeholder?: string;\n /** Allow filtering: type in the field (desktop) or the sheet's search box (mobile). */\n searchable?: boolean;\n /**\n * Custom predicate. Receives the resolved category label as the third\n * argument, matching the `RuiAutoComplete` filter signature.\n */\n filter?: (item: TItem, query: string, category: string) => boolean;\n /** Show the synthetic \"All\" pseudo-category as the first rail entry. */\n showAll?: boolean;\n /** Label for the \"All\" pseudo-category. */\n allLabel?: string;\n /** Text shown when no item matches the current search. */\n emptyText?: string;\n disabled?: boolean;\n readOnly?: boolean;\n dense?: boolean;\n clearable?: boolean;\n loading?: boolean;\n /** Where the label shows; falls back to the nearest `RuiFieldDefaults`, then the app default, then `top`. */\n labelPlacement?: LabelPlacement;\n /** Marks the trigger field as required (renders the asterisk). */\n required?: boolean;\n /** Validation errors rendered under the trigger field. */\n errorMessages?: string | string[];\n /** Success messages rendered under the trigger field. */\n successMessages?: string | string[];\n /** Hint rendered under the trigger field. */\n hint?: string;\n /** Hide the details row (errors/success/hint) under the trigger field. */\n hideDetails?: boolean;\n /** Below this breakpoint the picker collapses to a single-pane drill-in. */\n mobileBreakpoint?: CategoryPickerBreakpoint;\n /** Forwarded to the mobile bottom-sheet (`RuiDialog`). */\n dialogOptions?: DialogProps;\n classNames?: RuiCategoryPickerClassNames;\n}\n\ndefineOptions({\n name: 'RuiCategoryPicker',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<TValue>();\nconst searchInput = defineModel<string>('search', { default: '' });\n\nconst {\n items,\n categoryOf = undefined,\n categoryAttr = undefined,\n keyAttr = undefined,\n textAttr = undefined,\n label = 'Select',\n placeholder = 'Search',\n searchable = true,\n filter = undefined,\n showAll = true,\n allLabel = 'All',\n emptyText = 'No results',\n disabled = false,\n readOnly = false,\n dense = false,\n clearable = false,\n loading = false,\n labelPlacement = undefined,\n required = false,\n errorMessages = [],\n successMessages = [],\n hint = '',\n hideDetails = false,\n mobileBreakpoint = 'md',\n dialogOptions = undefined,\n classNames = undefined,\n} = defineProps<RuiCategoryPickerProps<TValue, TItem>>();\n\nconst emit = defineEmits<{\n select: [item: TItem];\n}>();\n\ndefineSlots<{\n 'activator'?: (props: { attrs: { onClick?: () => void; onMouseover?: () => void; onMouseleave?: () => void }; isOpen: boolean; open: () => void; item: TItem | undefined; text: string | undefined }) => any;\n 'selection'?: (props: { item: TItem }) => any;\n 'selection.prepend'?: (props: { item: TItem }) => any;\n 'category'?: (props: { category: string | null; label: string; active: boolean; count: number }) => any;\n 'item'?: (props: { item: TItem; active: boolean; selected: boolean }) => any;\n 'item.prepend'?: (props: { item: TItem; active: boolean; selected: boolean }) => any;\n 'item.append'?: (props: { item: TItem; active: boolean; selected: boolean }) => any;\n 'empty'?: () => any;\n 'header'?: () => any;\n 'footer'?: (props: { close: () => void }) => any;\n}>();\n\nconst isOpen = ref<boolean>(false);\nconst focusedPane = ref<'rail' | 'detail'>('rail');\nconst highlightedItemIndex = ref<number>(0);\nconst drillStep = ref<'category' | 'detail'>('category');\n\nconst railRef = useTemplateRef<HTMLDivElement>('railRef');\nconst detailRef = useTemplateRef<HTMLDivElement>('detailRef');\nconst activatorRef = useTemplateRef<HTMLInputElement>('activatorRef');\nconst fieldRef = useTemplateRef<HTMLElement>('fieldRef');\nconst isHovered = ref<boolean>(false);\n\nconst { focused } = useFocus(activatorRef);\nconst { hasError, hasSuccess } = useFormTextDetail(() => errorMessages, () => successMessages);\n\nconst baseId = useId();\nconst breakpoints = useBreakpoints(breakpointsTailwind);\n\nfunction resolveCategory(item: TItem): string {\n if (categoryOf)\n return categoryOf(item);\n if (categoryAttr !== undefined)\n return String(item[categoryAttr] ?? '');\n return '';\n}\n\nconst {\n activeCategory,\n detailItems,\n detailRows,\n getIdentifier,\n getText,\n isEmpty,\n isSelected,\n railEntries,\n setActiveCategory,\n syncActiveToSelection,\n} = useCategoryPicker<TValue, TItem>({\n allLabel: () => allLabel,\n categoryOf: resolveCategory,\n filter: () => filter,\n items: () => items,\n keyAttr,\n modelValue,\n search: searchInput,\n searchable: () => searchable,\n showAll: () => showAll,\n textAttr,\n});\n\nconst isMobile = computed<boolean>(() => get(breakpoints.smaller(mobileBreakpoint)));\n\nconst mode = computed<'twoPane' | 'drill'>(() => (get(isMobile) ? 'drill' : 'twoPane'));\n\n/**\n * Desktop anchors an outside-click popover under the field (RuiMenu); narrow\n * width shows a full-width bottom sheet (RuiDialog).\n */\nconst shell = computed<typeof RuiMenu | typeof RuiDialog>(() => (get(isMobile) ? RuiDialog : RuiMenu));\n\n/**\n * The bottom sheet's props. Each shell is given only its own props, so the\n * other component's never leak through as attributes.\n */\nfunction dialogShellProps(): Record<string, unknown> {\n return {\n ariaLabel: dialogOptions?.ariaLabel ?? label,\n bottomSheet: dialogOptions?.bottomSheet ?? true,\n maxWidth: dialogOptions?.maxWidth,\n persistent: dialogOptions?.persistent,\n width: dialogOptions?.width ?? '100%',\n };\n}\n\n/**\n * The popover's props. It anchors to the field box rather than the wrapper, so\n * it sits directly under the input instead of below the reserved details row,\n * and drops the menu's default vertical padding so the popover box equals the\n * panel: the size middleware caps the panel to the available height, and any\n * extra chrome padding would push the popover past the viewport edge.\n */\nfunction menuShellProps(): Record<string, unknown> {\n return {\n anchorEl: get(fieldRef) ?? undefined,\n classNames: { content: 'py-0' },\n closeOnContentClick: false,\n disableAutoFocus: true,\n fullWidth: true,\n options: { placement: Placement.bottomStart, size: true },\n persistent: dialogOptions?.persistent,\n persistOnActivatorClick: true,\n };\n}\n\nconst shellProps = computed<Record<string, unknown>>(() =>\n get(isMobile) ? dialogShellProps() : menuShellProps());\n\nconst ui = computed<ReturnType<typeof categoryPickerStyles>>(() => categoryPickerStyles({\n dense,\n mode: get(mode),\n}));\n\nconst selectedItem = computed<TItem | undefined>(() => {\n const value = get(modelValue);\n if (value === undefined)\n return undefined;\n return items.find(item => getIdentifier(item) === value);\n});\n\nconst selectedText = computed<string | undefined>(() => {\n const selected = get(selectedItem);\n return selected ? getText(selected) : undefined;\n});\n\nconst placement = useLabelPlacement(() => labelPlacement);\n\n/**\n * Desktop lets the user type in the field itself (no separate search box);\n * narrow width keeps a read-only trigger that opens the sheet's own search.\n */\nconst canType = computed<boolean>(() => searchable && !get(isMobile) && !readOnly && !disabled);\n\nconst isTyping = computed<boolean>(() => get(isOpen) && get(canType));\n\n/**\n * Drives both the clear button itself and the room the selection overlay has\n * to leave for it, so the two can never disagree.\n */\nconst showClear = computed<boolean>(() =>\n clearable && get(selectedItem) !== undefined && !disabled && !readOnly);\n\nconst activatorUi = computed<ReturnType<typeof categoryPickerActivatorStyles>>(() => categoryPickerActivatorStyles({\n dense,\n disabled,\n hasError: get(hasError),\n hasSuccess: get(hasSuccess) && !get(hasError),\n hovered: get(isHovered),\n opened: get(isOpen),\n readonly: readOnly,\n withClear: get(showClear),\n}));\n\nconst activeRailIndex = computed<number>(() =>\n get(railEntries).findIndex(entry => entry.category === get(activeCategory)));\n\nconst showRail = computed<boolean>(() => get(mode) === 'twoPane' || get(drillStep) === 'category');\nconst showDetail = computed<boolean>(() => get(mode) === 'twoPane' || get(drillStep) === 'detail');\n\nfunction clamp(value: number, max: number): number {\n if (value < 0)\n return 0;\n if (value > max)\n return max;\n return value;\n}\n\nfunction open(): void {\n if (disabled)\n return;\n set(isOpen, true);\n}\n\nfunction close(): void {\n set(isOpen, false);\n}\n\nfunction onInput(event: Event): void {\n const target = event.target;\n if (!(target instanceof HTMLInputElement))\n return;\n set(searchInput, target.value);\n if (!get(isOpen))\n open();\n}\n\nfunction selectItem(item: TItem): void {\n if (readOnly)\n return;\n set(modelValue, getIdentifier(item));\n emit('select', item);\n close();\n}\n\nfunction clearSelection(): void {\n set(modelValue, undefined);\n}\n\nfunction onCategoryClick(category: string | null): void {\n setActiveCategory(category);\n if (get(mode) === 'drill')\n set(drillStep, 'detail');\n else\n focusPane('detail');\n}\n\n/**\n * Moves focus to one of the panes. The focus call prevents scrolling because\n * the panes sit inside a teleported popover, and without it the browser\n * scrolls the page behind to reveal the pane.\n */\nfunction focusPane(pane: 'rail' | 'detail'): void {\n set(focusedPane, pane);\n nextTick(() => {\n (pane === 'rail' ? get(railRef) : get(detailRef))?.focus({ preventScroll: true });\n });\n}\n\nfunction moveRail(direction: 1 | -1): void {\n const entries = get(railEntries);\n if (entries.length === 0)\n return;\n const next = clamp(get(activeRailIndex) + direction, entries.length - 1);\n setActiveCategory(entries[next]?.category ?? null);\n}\n\nfunction moveItem(direction: 1 | -1): void {\n const total = get(detailItems).length;\n if (total === 0)\n return;\n set(highlightedItemIndex, clamp(get(highlightedItemIndex) + direction, total - 1));\n}\n\nfunction enterDetail(): void {\n if (get(detailItems).length === 0)\n return;\n resetHighlightToSelection();\n if (get(mode) === 'drill')\n set(drillStep, 'detail');\n focusPane('detail');\n}\n\nfunction selectHighlighted(): void {\n const item = get(detailItems)[get(highlightedItemIndex)];\n if (item !== undefined)\n selectItem(item);\n}\n\n/**\n * Enter from the field commits the best match for the current query, so a\n * type-to-pick flow (type a few letters, press Enter) works without leaving\n * the input. Does nothing when the field is empty.\n */\nfunction selectTopResult(): void {\n if (!get(searchInput).trim())\n return;\n const item = get(detailItems)[0];\n if (item !== undefined)\n selectItem(item);\n}\n\nfunction resetHighlightToSelection(): void {\n const index = get(detailItems).findIndex(item => isSelected(item));\n set(highlightedItemIndex, index >= 0 ? index : 0);\n}\n\nfunction backToRail(): void {\n if (get(mode) === 'drill')\n set(drillStep, 'category');\n else\n focusPane('rail');\n}\n\nfunction scrollActiveDescendantIntoView(container: HTMLElement | null, id: string): void {\n if (!container)\n return;\n nextTick(() => {\n container.querySelector(`#${id}`)?.scrollIntoView({ block: 'nearest' });\n });\n}\n\n// Reset the item highlight whenever the active category changes.\nwatch(activeCategory, () => {\n resetHighlightToSelection();\n});\n\nwatch(highlightedItemIndex, (index) => {\n scrollActiveDescendantIntoView(get(detailRef), `${baseId}-opt-${index}`);\n});\n\nwatch(activeRailIndex, (index) => {\n if (index >= 0)\n scrollActiveDescendantIntoView(get(railRef), `${baseId}-cat-${index}`);\n});\n\n/**\n * Opening takes focus where the user types next: desktop is a combobox, so\n * focus stays in the field and ArrowDown moves into the panes, while the\n * mobile sheet has no typing field and focuses the rail instead. Closing\n * resets the query, so the field shows the selection again next time, and\n * returns focus to the trigger, which the APG dialog contract asks for.\n */\nfunction onOpenChanged(value: boolean): void {\n if (value) {\n syncActiveToSelection();\n set(focusedPane, 'rail');\n set(drillStep, 'category');\n resetHighlightToSelection();\n nextTick(() => (get(canType) ? get(activatorRef) : get(railRef))?.focus({ preventScroll: true }));\n }\n else {\n set(searchInput, '');\n nextTick(() => get(activatorRef)?.focus({ preventScroll: true }));\n }\n}\n\nwatch(isOpen, onOpenChanged);\n</script>\n\n<template>\n <component\n :is=\"shell\"\n v-model=\"isOpen\"\n v-bind=\"{ ...$attrs, ...shellProps }\"\n >\n <template #activator=\"{ attrs }\">\n <slot\n name=\"activator\"\n v-bind=\"{ attrs, isOpen, item: selectedItem, open, text: selectedText }\"\n >\n <div :class=\"activatorUi.wrapper()\">\n <RuiFieldLabel\n v-if=\"label\"\n :id=\"`${baseId}-label`\"\n :text=\"label\"\n :hidden=\"placement === 'hidden'\"\n :required=\"required\"\n :disabled=\"disabled\"\n />\n <div\n ref=\"fieldRef\"\n role=\"combobox\"\n data-id=\"activator\"\n :class=\"activatorUi.activator()\"\n :aria-labelledby=\"label ? `${baseId}-label` : undefined\"\n aria-haspopup=\"dialog\"\n :aria-controls=\"isOpen ? `${baseId}-panel` : undefined\"\n :aria-expanded=\"isOpen\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"(readOnly || !canType) || undefined\"\n :aria-required=\"required || undefined\"\n :aria-invalid=\"hasError || undefined\"\n :aria-busy=\"loading || undefined\"\n v-bind=\"readOnly ? {} : activatorHandlers(attrs)\"\n @mouseenter=\"isHovered = true\"\n @mouseleave=\"isHovered = false\"\n >\n <span\n v-if=\"selectedItem && !isTyping && $slots.selection\"\n data-id=\"selection\"\n :class=\"activatorUi.selection()\"\n >\n <slot\n name=\"selection.prepend\"\n v-bind=\"{ item: selectedItem }\"\n />\n <slot\n name=\"selection\"\n v-bind=\"{ item: selectedItem }\"\n />\n </span>\n <input\n ref=\"activatorRef\"\n data-id=\"search-input\"\n :value=\"isTyping ? searchInput : (($slots.selection && selectedItem) ? '' : (selectedText ?? ''))\"\n :placeholder=\"isTyping ? placeholder : ''\"\n :readonly=\"!canType\"\n :disabled=\"disabled\"\n :aria-invalid=\"hasError || undefined\"\n :aria-labelledby=\"label ? `${baseId}-label` : undefined\"\n class=\"bg-transparent outline-hidden\"\n :class=\"[activatorUi.value(), !canType && 'cursor-pointer']\"\n @input=\"onInput($event)\"\n @keydown.down.prevent=\"focusPane('rail')\"\n @keydown.enter.prevent=\"selectTopResult()\"\n @keydown.esc=\"close()\"\n />\n <span\n v-if=\"showClear\"\n data-id=\"clear\"\n :class=\"[activatorUi.clear(), focused && 'visible!', { 'mr-2': !dense }]\"\n @click.stop.prevent=\"clearSelection()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"16\"\n />\n </span>\n <span\n data-id=\"chevron\"\n :class=\"activatorUi.iconWrapper()\"\n >\n <RuiIcon\n :class=\"activatorUi.icon()\"\n :size=\"dense ? 16 : 20\"\n name=\"lu-chevron-down\"\n />\n </span>\n <RuiProgress\n v-if=\"loading\"\n :class=\"activatorUi.progress()\"\n color=\"primary\"\n thickness=\"3\"\n variant=\"indeterminate\"\n />\n <fieldset :class=\"activatorUi.fieldset()\" />\n </div>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n class=\"pt-1\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n </slot>\n </template>\n\n <div\n :id=\"`${baseId}-panel`\"\n :class=\"ui.root({ class: cn(classNames?.root) })\"\n data-id=\"panel\"\n >\n <!-- On desktop the field itself is the search input, so the panel only\n needs its own search box in the mobile sheet. -->\n <div\n v-if=\"isMobile || $slots.header\"\n :class=\"ui.header()\"\n >\n <slot name=\"header\">\n <div :class=\"ui.title()\">\n {{ label }}\n </div>\n </slot>\n <RuiTextField\n v-if=\"searchable && isMobile\"\n v-model=\"searchInput\"\n :class=\"cn(classNames?.search)\"\n :placeholder=\"placeholder\"\n :dense=\"dense\"\n prepend-icon=\"lu-search\"\n hide-details\n clearable\n data-id=\"search\"\n />\n </div>\n\n <div :class=\"ui.body()\">\n <!-- Category rail (master) -->\n <div\n v-show=\"showRail\"\n ref=\"railRef\"\n :class=\"ui.rail({ class: cn(classNames?.rail) })\"\n role=\"tablist\"\n aria-orientation=\"vertical\"\n :aria-label=\"label\"\n :aria-activedescendant=\"focusedPane === 'rail' && activeRailIndex >= 0 ? `${baseId}-cat-${activeRailIndex}` : undefined\"\n tabindex=\"0\"\n data-id=\"rail\"\n @focus=\"focusedPane = 'rail'\"\n @keydown.down.prevent=\"moveRail(1)\"\n @keydown.up.prevent=\"moveRail(-1)\"\n @keydown.right.prevent=\"enterDetail()\"\n @keydown.enter.prevent=\"enterDetail()\"\n @keydown.home.prevent=\"setActiveCategory(railEntries[0]?.category ?? null)\"\n @keydown.end.prevent=\"setActiveCategory(railEntries[railEntries.length - 1]?.category ?? null)\"\n >\n <RuiButton\n v-for=\"(entry, index) in railEntries\"\n :id=\"`${baseId}-cat-${index}`\"\n :key=\"entry.category ?? '__all__'\"\n role=\"tab\"\n variant=\"list\"\n :size=\"dense ? 'sm' : undefined\"\n :active=\"entry.category === activeCategory\"\n :aria-selected=\"entry.category === activeCategory\"\n tabindex=\"-1\"\n :data-highlighted=\"focusedPane === 'rail' && index === activeRailIndex\"\n :data-category=\"entry.category ?? '__all__'\"\n @click=\"onCategoryClick(entry.category)\"\n >\n <slot\n name=\"category\"\n v-bind=\"{ active: entry.category === activeCategory, category: entry.category, count: entry.count, label: entry.label }\"\n >\n <span class=\"truncate\">{{ entry.label }}</span>\n <span :class=\"ui.railCount()\">{{ entry.count }}</span>\n </slot>\n </RuiButton>\n </div>\n\n <!-- Detail pane -->\n <div\n v-show=\"showDetail\"\n ref=\"detailRef\"\n :class=\"ui.detail({ class: cn(classNames?.detail) })\"\n role=\"listbox\"\n :aria-label=\"activeCategory ?? allLabel\"\n :aria-activedescendant=\"focusedPane === 'detail' && !isEmpty ? `${baseId}-opt-${highlightedItemIndex}` : undefined\"\n tabindex=\"0\"\n data-id=\"detail\"\n @focus=\"focusedPane = 'detail'\"\n @keydown.down.prevent=\"moveItem(1)\"\n @keydown.up.prevent=\"moveItem(-1)\"\n @keydown.left.prevent=\"backToRail()\"\n @keydown.home.prevent=\"highlightedItemIndex = 0\"\n @keydown.end.prevent=\"highlightedItemIndex = detailItems.length - 1\"\n @keydown.enter.prevent=\"selectHighlighted()\"\n @keydown.space.prevent=\"selectHighlighted()\"\n >\n <template v-if=\"mode === 'drill' && showDetail\">\n <button\n type=\"button\"\n :class=\"ui.backButton()\"\n data-id=\"back\"\n @click=\"backToRail()\"\n >\n <RuiIcon\n name=\"lu-chevron-left\"\n size=\"18\"\n />\n <span>{{ activeCategory ?? allLabel }}</span>\n </button>\n </template>\n\n <slot\n v-if=\"isEmpty\"\n name=\"empty\"\n >\n <div :class=\"ui.empty()\">\n {{ emptyText }}\n </div>\n </slot>\n\n <template\n v-for=\"row in detailRows\"\n v-else\n :key=\"row.type === 'header' ? `h-${row.category}` : `i-${row.index}`\"\n >\n <div\n v-if=\"row.type === 'header'\"\n :class=\"ui.subheader()\"\n role=\"presentation\"\n >\n {{ row.category }}\n </div>\n <RuiButton\n v-else\n :id=\"`${baseId}-opt-${row.index}`\"\n role=\"option\"\n variant=\"list\"\n :size=\"dense ? 'sm' : undefined\"\n :active=\"isSelected(row.item)\"\n :aria-selected=\"isSelected(row.item)\"\n tabindex=\"-1\"\n :data-highlighted=\"focusedPane === 'detail' && row.index === highlightedItemIndex\"\n :class=\"{ [ui.highlighted()]: focusedPane === 'detail' && row.index === highlightedItemIndex && !isSelected(row.item) }\"\n @click=\"selectItem(row.item)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"{ active: row.index === highlightedItemIndex, item: row.item, selected: isSelected(row.item) }\"\n />\n </template>\n <slot\n name=\"item\"\n v-bind=\"{ active: row.index === highlightedItemIndex, item: row.item, selected: isSelected(row.item) }\"\n >\n {{ getText(row.item) }}\n </slot>\n <template\n v-if=\"$slots['item.append']\"\n #append\n >\n <slot\n name=\"item.append\"\n v-bind=\"{ active: row.index === highlightedItemIndex, item: row.item, selected: isSelected(row.item) }\"\n />\n </template>\n </RuiButton>\n </template>\n </div>\n </div>\n\n <div\n v-if=\"$slots.footer\"\n :class=\"ui.footer()\"\n >\n <slot\n name=\"footer\"\n v-bind=\"{ close }\"\n />\n </div>\n </div>\n </component>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiCategoryPicker.js","names":["_sfc_main"],"sources":["../../../../src/components/forms/category-picker/RuiCategoryPicker.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue, TItem\">\nimport type { KeyOfType } from '@/composables/dropdown-menu';\nimport type { VueClassValue } from '@/types/class-value';\nimport { breakpointsTailwind, useBreakpoints } from '@vueuse/core';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport { categoryPickerActivatorStyles, categoryPickerStyles } from '@/components/forms/category-picker/category-picker-styles';\nimport RuiFieldLabel from '@/components/forms/field-label/RuiFieldLabel.vue';\nimport RuiTextField from '@/components/forms/text-field/RuiTextField.vue';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiDialog, { type DialogProps } from '@/components/overlays/dialog/RuiDialog.vue';\nimport { activatorHandlers } from '@/components/overlays/menu/activator-handlers';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { type LabelPlacement, useLabelPlacement } from '@/composables/defaults/field';\nimport { Placement } from '@/composables/floating';\nimport { useCategoryPicker } from '@/composables/forms/category-picker/use-category-picker';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { cn } from '@/utils/tv';\n\nexport interface RuiCategoryPickerClassNames {\n root?: VueClassValue;\n rail?: VueClassValue;\n detail?: VueClassValue;\n search?: VueClassValue;\n}\n\nexport type CategoryPickerBreakpoint = 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport interface RuiCategoryPickerProps<TValue, TItem> {\n /** The full catalogue of selectable items. */\n items: TItem[];\n /** Resolve an item's category label. Takes precedence over `categoryAttr`. */\n categoryOf?: (item: TItem) => string;\n /** Resolve an item's category from one of its own properties. */\n categoryAttr?: keyof TItem;\n /** Property whose value becomes the model value. Omit to use the item itself. */\n keyAttr?: KeyOfType<TItem, TValue extends (infer U)[] ? U : TValue>;\n /** Property that produces an item's display text. */\n textAttr?: keyof TItem;\n /** Field label, and the title of the mobile sheet. */\n label?: string;\n /** Placeholder shown in the field while it is empty or being searched. */\n placeholder?: string;\n /** Allow filtering: type in the field (desktop) or the sheet's search box (mobile). */\n searchable?: boolean;\n /**\n * Custom predicate. Receives the resolved category label as the third\n * argument, matching the `RuiAutoComplete` filter signature.\n */\n filter?: (item: TItem, query: string, category: string) => boolean;\n /** Show the synthetic \"All\" pseudo-category as the first rail entry. */\n showAll?: boolean;\n /** Label for the \"All\" pseudo-category. */\n allLabel?: string;\n /** Text shown when no item matches the current search. */\n emptyText?: string;\n disabled?: boolean;\n readOnly?: boolean;\n dense?: boolean;\n clearable?: boolean;\n loading?: boolean;\n /** Where the label shows; falls back to the nearest `RuiFieldDefaults`, then the app default, then `top`. */\n labelPlacement?: LabelPlacement;\n /** Marks the trigger field as required (renders the asterisk). */\n required?: boolean;\n /** Validation errors rendered under the trigger field. */\n errorMessages?: string | string[];\n /** Success messages rendered under the trigger field. */\n successMessages?: string | string[];\n /** Hint rendered under the trigger field. */\n hint?: string;\n /** Hide the details row (errors/success/hint) under the trigger field. */\n hideDetails?: boolean;\n /** Below this breakpoint the picker collapses to a single-pane drill-in. */\n mobileBreakpoint?: CategoryPickerBreakpoint;\n /** Forwarded to the mobile bottom-sheet (`RuiDialog`). */\n dialogOptions?: DialogProps;\n classNames?: RuiCategoryPickerClassNames;\n}\n\ndefineOptions({\n name: 'RuiCategoryPicker',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<TValue>();\nconst searchInput = defineModel<string>('search', { default: '' });\n\nconst {\n items,\n categoryOf = undefined,\n categoryAttr = undefined,\n keyAttr = undefined,\n textAttr = undefined,\n label = 'Select',\n placeholder = 'Search',\n searchable = true,\n filter = undefined,\n showAll = true,\n allLabel = 'All',\n emptyText = 'No results',\n disabled = false,\n readOnly = false,\n dense = false,\n clearable = false,\n loading = false,\n labelPlacement = undefined,\n required = false,\n errorMessages = [],\n successMessages = [],\n hint = '',\n hideDetails = false,\n mobileBreakpoint = 'md',\n dialogOptions = undefined,\n classNames = undefined,\n} = defineProps<RuiCategoryPickerProps<TValue, TItem>>();\n\nconst emit = defineEmits<{\n select: [item: TItem];\n}>();\n\ndefineSlots<{\n 'activator'?: (props: { attrs: { onClick?: () => void; onMouseover?: () => void; onMouseleave?: () => void }; isOpen: boolean; open: () => void; item: TItem | undefined; text: string | undefined }) => any;\n 'selection'?: (props: { item: TItem }) => any;\n 'selection.prepend'?: (props: { item: TItem }) => any;\n 'category'?: (props: { category: string | null; label: string; active: boolean; count: number }) => any;\n 'item'?: (props: { item: TItem; active: boolean; selected: boolean }) => any;\n 'item.prepend'?: (props: { item: TItem; active: boolean; selected: boolean }) => any;\n 'item.append'?: (props: { item: TItem; active: boolean; selected: boolean }) => any;\n 'empty'?: () => any;\n 'header'?: () => any;\n 'footer'?: (props: { close: () => void }) => any;\n}>();\n\nconst isOpen = ref<boolean>(false);\nconst focusedPane = ref<'rail' | 'detail'>('rail');\nconst highlightedItemIndex = ref<number>(0);\nconst drillStep = ref<'category' | 'detail'>('category');\n\nconst railRef = useTemplateRef<HTMLDivElement>('railRef');\nconst detailRef = useTemplateRef<HTMLDivElement>('detailRef');\nconst activatorRef = useTemplateRef<HTMLInputElement>('activatorRef');\nconst fieldRef = useTemplateRef<HTMLElement>('fieldRef');\nconst isHovered = ref<boolean>(false);\n\nconst { focused } = useFocus(activatorRef);\nconst { hasError, hasSuccess } = useFormTextDetail(() => errorMessages, () => successMessages);\n\nconst baseId = useId();\nconst breakpoints = useBreakpoints(breakpointsTailwind);\n\nfunction resolveCategory(item: TItem): string {\n if (categoryOf)\n return categoryOf(item);\n if (categoryAttr !== undefined)\n return String(item[categoryAttr] ?? '');\n return '';\n}\n\nconst {\n activeCategory,\n detailItems,\n detailRows,\n getIdentifier,\n getText,\n isEmpty,\n isSelected,\n railEntries,\n setActiveCategory,\n syncActiveToSelection,\n} = useCategoryPicker<TValue, TItem>({\n allLabel: () => allLabel,\n categoryOf: resolveCategory,\n filter: () => filter,\n items: () => items,\n keyAttr,\n modelValue,\n search: searchInput,\n searchable: () => searchable,\n showAll: () => showAll,\n textAttr,\n});\n\nconst isMobile = computed<boolean>(() => get(breakpoints.smaller(mobileBreakpoint)));\n\nconst mode = computed<'twoPane' | 'drill'>(() => (get(isMobile) ? 'drill' : 'twoPane'));\n\n/**\n * Desktop anchors an outside-click popover under the field (RuiMenu); narrow\n * width shows a full-width bottom sheet (RuiDialog).\n */\nconst shell = computed<typeof RuiMenu | typeof RuiDialog>(() => (get(isMobile) ? RuiDialog : RuiMenu));\n\n/**\n * The bottom sheet's props. Each shell is given only its own props, so the\n * other component's never leak through as attributes.\n */\nfunction dialogShellProps(): Record<string, unknown> {\n return {\n ariaLabel: dialogOptions?.ariaLabel ?? label,\n bottomSheet: dialogOptions?.bottomSheet ?? true,\n maxWidth: dialogOptions?.maxWidth,\n persistent: dialogOptions?.persistent,\n width: dialogOptions?.width ?? '100%',\n };\n}\n\n/**\n * The popover's props. It anchors to the field box rather than the wrapper, so\n * it sits directly under the input instead of below the reserved details row,\n * and drops the menu's default vertical padding so the popover box equals the\n * panel: the size middleware caps the panel to the available height, and any\n * extra chrome padding would push the popover past the viewport edge. The\n * popover is a dialog, as the activator's `aria-haspopup` says: it holds a\n * tablist and a listbox, which a `menu` may not contain.\n */\nfunction menuShellProps(): Record<string, unknown> {\n return {\n anchorEl: get(fieldRef) ?? undefined,\n classNames: { content: 'py-0' },\n closeOnContentClick: false,\n disableAutoFocus: true,\n fullWidth: true,\n menuLabel: label,\n options: { placement: Placement.bottomStart, size: true },\n persistent: dialogOptions?.persistent,\n persistOnActivatorClick: true,\n role: 'dialog',\n };\n}\n\nconst shellProps = computed<Record<string, unknown>>(() =>\n get(isMobile) ? dialogShellProps() : menuShellProps());\n\nconst ui = computed<ReturnType<typeof categoryPickerStyles>>(() => categoryPickerStyles({\n dense,\n mode: get(mode),\n}));\n\nconst selectedItem = computed<TItem | undefined>(() => {\n const value = get(modelValue);\n if (value === undefined)\n return undefined;\n return items.find(item => getIdentifier(item) === value);\n});\n\nconst selectedText = computed<string | undefined>(() => {\n const selected = get(selectedItem);\n return selected ? getText(selected) : undefined;\n});\n\nconst placement = useLabelPlacement(() => labelPlacement);\n\n/**\n * Desktop lets the user type in the field itself (no separate search box);\n * narrow width keeps a read-only trigger that opens the sheet's own search.\n */\nconst canType = computed<boolean>(() => searchable && !get(isMobile) && !readOnly && !disabled);\n\nconst isTyping = computed<boolean>(() => get(isOpen) && get(canType));\n\n/**\n * Drives both the clear button itself and the room the selection overlay has\n * to leave for it, so the two can never disagree.\n */\nconst showClear = computed<boolean>(() =>\n clearable && get(selectedItem) !== undefined && !disabled && !readOnly);\n\nconst activatorUi = computed<ReturnType<typeof categoryPickerActivatorStyles>>(() => categoryPickerActivatorStyles({\n dense,\n disabled,\n hasError: get(hasError),\n hasSuccess: get(hasSuccess) && !get(hasError),\n hovered: get(isHovered),\n opened: get(isOpen),\n readonly: readOnly,\n withClear: get(showClear),\n}));\n\nconst activeRailIndex = computed<number>(() =>\n get(railEntries).findIndex(entry => entry.category === get(activeCategory)));\n\nconst showRail = computed<boolean>(() => get(mode) === 'twoPane' || get(drillStep) === 'category');\nconst showDetail = computed<boolean>(() => get(mode) === 'twoPane' || get(drillStep) === 'detail');\n\nfunction clamp(value: number, max: number): number {\n if (value < 0)\n return 0;\n if (value > max)\n return max;\n return value;\n}\n\nfunction open(): void {\n if (disabled)\n return;\n set(isOpen, true);\n}\n\nfunction close(): void {\n set(isOpen, false);\n}\n\nfunction onInput(event: Event): void {\n const target = event.target;\n if (!(target instanceof HTMLInputElement))\n return;\n set(searchInput, target.value);\n if (!get(isOpen))\n open();\n}\n\nfunction selectItem(item: TItem): void {\n if (readOnly)\n return;\n set(modelValue, getIdentifier(item));\n emit('select', item);\n close();\n}\n\nfunction clearSelection(): void {\n set(modelValue, undefined);\n}\n\nfunction onCategoryClick(category: string | null): void {\n setActiveCategory(category);\n if (get(mode) === 'drill')\n set(drillStep, 'detail');\n else\n focusPane('detail');\n}\n\n/**\n * Moves focus to one of the panes. The focus call prevents scrolling because\n * the panes sit inside a teleported popover, and without it the browser\n * scrolls the page behind to reveal the pane.\n */\nfunction focusPane(pane: 'rail' | 'detail'): void {\n set(focusedPane, pane);\n nextTick(() => {\n (pane === 'rail' ? get(railRef) : get(detailRef))?.focus({ preventScroll: true });\n });\n}\n\nfunction moveRail(direction: 1 | -1): void {\n const entries = get(railEntries);\n if (entries.length === 0)\n return;\n const next = clamp(get(activeRailIndex) + direction, entries.length - 1);\n setActiveCategory(entries[next]?.category ?? null);\n}\n\nfunction moveItem(direction: 1 | -1): void {\n const total = get(detailItems).length;\n if (total === 0)\n return;\n set(highlightedItemIndex, clamp(get(highlightedItemIndex) + direction, total - 1));\n}\n\nfunction enterDetail(): void {\n if (get(detailItems).length === 0)\n return;\n resetHighlightToSelection();\n if (get(mode) === 'drill')\n set(drillStep, 'detail');\n focusPane('detail');\n}\n\nfunction selectHighlighted(): void {\n const item = get(detailItems)[get(highlightedItemIndex)];\n if (item !== undefined)\n selectItem(item);\n}\n\n/**\n * Enter from the field commits the best match for the current query, so a\n * type-to-pick flow (type a few letters, press Enter) works without leaving\n * the input. Does nothing when the field is empty.\n */\nfunction selectTopResult(): void {\n if (!get(searchInput).trim())\n return;\n const item = get(detailItems)[0];\n if (item !== undefined)\n selectItem(item);\n}\n\nfunction resetHighlightToSelection(): void {\n const index = get(detailItems).findIndex(item => isSelected(item));\n set(highlightedItemIndex, index >= 0 ? index : 0);\n}\n\nfunction backToRail(): void {\n if (get(mode) === 'drill')\n set(drillStep, 'category');\n else\n focusPane('rail');\n}\n\nfunction scrollActiveDescendantIntoView(container: HTMLElement | null, id: string): void {\n if (!container)\n return;\n nextTick(() => {\n container.querySelector(`#${id}`)?.scrollIntoView({ block: 'nearest' });\n });\n}\n\n// Reset the item highlight whenever the active category changes.\nwatch(activeCategory, () => {\n resetHighlightToSelection();\n});\n\nwatch(highlightedItemIndex, (index) => {\n scrollActiveDescendantIntoView(get(detailRef), `${baseId}-opt-${index}`);\n});\n\nwatch(activeRailIndex, (index) => {\n if (index >= 0)\n scrollActiveDescendantIntoView(get(railRef), `${baseId}-cat-${index}`);\n});\n\n/**\n * Opening takes focus where the user types next: desktop is a combobox, so\n * focus stays in the field and ArrowDown moves into the panes, while the\n * mobile sheet has no typing field and focuses the rail instead. Closing\n * resets the query, so the field shows the selection again next time, and\n * returns focus to the trigger, which the APG dialog contract asks for.\n */\nfunction onOpenChanged(value: boolean): void {\n if (value) {\n syncActiveToSelection();\n set(focusedPane, 'rail');\n set(drillStep, 'category');\n resetHighlightToSelection();\n nextTick(() => (get(canType) ? get(activatorRef) : get(railRef))?.focus({ preventScroll: true }));\n }\n else {\n set(searchInput, '');\n nextTick(() => get(activatorRef)?.focus({ preventScroll: true }));\n }\n}\n\nwatch(isOpen, onOpenChanged);\n</script>\n\n<template>\n <component\n :is=\"shell\"\n v-model=\"isOpen\"\n v-bind=\"{ ...$attrs, ...shellProps }\"\n >\n <template #activator=\"{ attrs }\">\n <slot\n name=\"activator\"\n v-bind=\"{ attrs, isOpen, item: selectedItem, open, text: selectedText }\"\n >\n <div :class=\"activatorUi.wrapper()\">\n <RuiFieldLabel\n v-if=\"label\"\n :id=\"`${baseId}-label`\"\n :text=\"label\"\n :hidden=\"placement === 'hidden'\"\n :required=\"required\"\n :disabled=\"disabled\"\n />\n <div\n ref=\"fieldRef\"\n role=\"combobox\"\n data-id=\"activator\"\n :class=\"activatorUi.activator()\"\n :aria-labelledby=\"label ? `${baseId}-label` : undefined\"\n aria-haspopup=\"dialog\"\n :aria-controls=\"isOpen ? `${baseId}-panel` : undefined\"\n :aria-expanded=\"isOpen\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"(readOnly || !canType) || undefined\"\n :aria-required=\"required || undefined\"\n :aria-invalid=\"hasError || undefined\"\n :aria-busy=\"loading || undefined\"\n v-bind=\"readOnly ? {} : activatorHandlers(attrs)\"\n @mouseenter=\"isHovered = true\"\n @mouseleave=\"isHovered = false\"\n >\n <span\n v-if=\"selectedItem && !isTyping && $slots.selection\"\n data-id=\"selection\"\n :class=\"activatorUi.selection()\"\n >\n <slot\n name=\"selection.prepend\"\n v-bind=\"{ item: selectedItem }\"\n />\n <slot\n name=\"selection\"\n v-bind=\"{ item: selectedItem }\"\n />\n </span>\n <input\n ref=\"activatorRef\"\n data-id=\"search-input\"\n :value=\"isTyping ? searchInput : (($slots.selection && selectedItem) ? '' : (selectedText ?? ''))\"\n :placeholder=\"isTyping ? placeholder : ''\"\n :readonly=\"!canType\"\n :disabled=\"disabled\"\n :aria-invalid=\"hasError || undefined\"\n :aria-labelledby=\"label ? `${baseId}-label` : undefined\"\n class=\"bg-transparent outline-hidden\"\n :class=\"[activatorUi.value(), !canType && 'cursor-pointer']\"\n @input=\"onInput($event)\"\n @keydown.down.prevent=\"focusPane('rail')\"\n @keydown.enter.prevent=\"selectTopResult()\"\n @keydown.esc=\"close()\"\n />\n <span\n v-if=\"showClear\"\n data-id=\"clear\"\n :class=\"[activatorUi.clear(), focused && 'visible!', { 'mr-2': !dense }]\"\n @click.stop.prevent=\"clearSelection()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"16\"\n />\n </span>\n <span\n data-id=\"chevron\"\n :class=\"activatorUi.iconWrapper()\"\n >\n <RuiIcon\n :class=\"activatorUi.icon()\"\n :size=\"dense ? 16 : 20\"\n name=\"lu-chevron-down\"\n />\n </span>\n <RuiProgress\n v-if=\"loading\"\n :class=\"activatorUi.progress()\"\n color=\"primary\"\n thickness=\"3\"\n variant=\"indeterminate\"\n />\n <fieldset :class=\"activatorUi.fieldset()\" />\n </div>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n class=\"pt-1\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n </slot>\n </template>\n\n <div\n :id=\"`${baseId}-panel`\"\n :class=\"ui.root({ class: cn(classNames?.root) })\"\n data-id=\"panel\"\n >\n <!-- On desktop the field itself is the search input, so the panel only\n needs its own search box in the mobile sheet. -->\n <div\n v-if=\"isMobile || $slots.header\"\n :class=\"ui.header()\"\n >\n <slot name=\"header\">\n <div :class=\"ui.title()\">\n {{ label }}\n </div>\n </slot>\n <RuiTextField\n v-if=\"searchable && isMobile\"\n v-model=\"searchInput\"\n :class=\"cn(classNames?.search)\"\n :placeholder=\"placeholder\"\n :dense=\"dense\"\n prepend-icon=\"lu-search\"\n hide-details\n clearable\n data-id=\"search\"\n />\n </div>\n\n <div :class=\"ui.body()\">\n <!-- Category rail (master) -->\n <div\n v-show=\"showRail\"\n ref=\"railRef\"\n :class=\"ui.rail({ class: cn(classNames?.rail) })\"\n role=\"tablist\"\n aria-orientation=\"vertical\"\n :aria-label=\"label\"\n :aria-activedescendant=\"focusedPane === 'rail' && activeRailIndex >= 0 ? `${baseId}-cat-${activeRailIndex}` : undefined\"\n tabindex=\"0\"\n data-id=\"rail\"\n @focus=\"focusedPane = 'rail'\"\n @keydown.down.prevent=\"moveRail(1)\"\n @keydown.up.prevent=\"moveRail(-1)\"\n @keydown.right.prevent=\"enterDetail()\"\n @keydown.enter.prevent=\"enterDetail()\"\n @keydown.home.prevent=\"setActiveCategory(railEntries[0]?.category ?? null)\"\n @keydown.end.prevent=\"setActiveCategory(railEntries[railEntries.length - 1]?.category ?? null)\"\n >\n <RuiButton\n v-for=\"(entry, index) in railEntries\"\n :id=\"`${baseId}-cat-${index}`\"\n :key=\"entry.category ?? '__all__'\"\n role=\"tab\"\n variant=\"list\"\n :size=\"dense ? 'sm' : undefined\"\n :active=\"entry.category === activeCategory\"\n :aria-selected=\"entry.category === activeCategory\"\n tabindex=\"-1\"\n :data-highlighted=\"focusedPane === 'rail' && index === activeRailIndex\"\n :data-category=\"entry.category ?? '__all__'\"\n @click=\"onCategoryClick(entry.category)\"\n >\n <slot\n name=\"category\"\n v-bind=\"{ active: entry.category === activeCategory, category: entry.category, count: entry.count, label: entry.label }\"\n >\n <span class=\"truncate\">{{ entry.label }}</span>\n <span :class=\"ui.railCount()\">{{ entry.count }}</span>\n </slot>\n </RuiButton>\n </div>\n\n <!-- Detail pane -->\n <div\n v-show=\"showDetail\"\n ref=\"detailRef\"\n :class=\"ui.detail({ class: cn(classNames?.detail) })\"\n role=\"listbox\"\n :aria-label=\"activeCategory ?? allLabel\"\n :aria-activedescendant=\"focusedPane === 'detail' && !isEmpty ? `${baseId}-opt-${highlightedItemIndex}` : undefined\"\n tabindex=\"0\"\n data-id=\"detail\"\n @focus=\"focusedPane = 'detail'\"\n @keydown.down.prevent=\"moveItem(1)\"\n @keydown.up.prevent=\"moveItem(-1)\"\n @keydown.left.prevent=\"backToRail()\"\n @keydown.home.prevent=\"highlightedItemIndex = 0\"\n @keydown.end.prevent=\"highlightedItemIndex = detailItems.length - 1\"\n @keydown.enter.prevent=\"selectHighlighted()\"\n @keydown.space.prevent=\"selectHighlighted()\"\n >\n <template v-if=\"mode === 'drill' && showDetail\">\n <button\n type=\"button\"\n :class=\"ui.backButton()\"\n data-id=\"back\"\n @click=\"backToRail()\"\n >\n <RuiIcon\n name=\"lu-chevron-left\"\n size=\"18\"\n />\n <span>{{ activeCategory ?? allLabel }}</span>\n </button>\n </template>\n\n <slot\n v-if=\"isEmpty\"\n name=\"empty\"\n >\n <div :class=\"ui.empty()\">\n {{ emptyText }}\n </div>\n </slot>\n\n <template\n v-for=\"row in detailRows\"\n v-else\n :key=\"row.type === 'header' ? `h-${row.category}` : `i-${row.index}`\"\n >\n <div\n v-if=\"row.type === 'header'\"\n :class=\"ui.subheader()\"\n role=\"presentation\"\n >\n {{ row.category }}\n </div>\n <RuiButton\n v-else\n :id=\"`${baseId}-opt-${row.index}`\"\n role=\"option\"\n variant=\"list\"\n :size=\"dense ? 'sm' : undefined\"\n :active=\"isSelected(row.item)\"\n :aria-selected=\"isSelected(row.item)\"\n tabindex=\"-1\"\n :data-highlighted=\"focusedPane === 'detail' && row.index === highlightedItemIndex\"\n :class=\"{ [ui.highlighted()]: focusedPane === 'detail' && row.index === highlightedItemIndex && !isSelected(row.item) }\"\n @click=\"selectItem(row.item)\"\n >\n <template\n v-if=\"$slots['item.prepend']\"\n #prepend\n >\n <slot\n name=\"item.prepend\"\n v-bind=\"{ active: row.index === highlightedItemIndex, item: row.item, selected: isSelected(row.item) }\"\n />\n </template>\n <slot\n name=\"item\"\n v-bind=\"{ active: row.index === highlightedItemIndex, item: row.item, selected: isSelected(row.item) }\"\n >\n {{ getText(row.item) }}\n </slot>\n <template\n v-if=\"$slots['item.append']\"\n #append\n >\n <slot\n name=\"item.append\"\n v-bind=\"{ active: row.index === highlightedItemIndex, item: row.item, selected: isSelected(row.item) }\"\n />\n </template>\n </RuiButton>\n </template>\n </div>\n </div>\n\n <div\n v-if=\"$slots.footer\"\n :class=\"ui.footer()\"\n >\n <slot\n name=\"footer\"\n v-bind=\"{ close }\"\n />\n </div>\n </div>\n </component>\n</template>\n"],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import type { KeyOfType } from '../../../composables/dropdown-menu.js';
2
- import type { VueClassValue } from '../../../types/class-value';
3
- import { type DialogProps } from '../../overlays/dialog/RuiDialog.vue';
2
+ import type { VueClassValue } from '../../../types/class-value.js';
3
+ import { type DialogProps } from '../../overlays/dialog/RuiDialog.vue.js';
4
4
  import { type LabelPlacement } from '../../../composables/defaults/field.js';
5
5
  export interface RuiCategoryPickerClassNames {
6
6
  root?: VueClassValue;
@@ -169,7 +169,9 @@ var RuiCategoryPicker_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
169
169
  * it sits directly under the input instead of below the reserved details row,
170
170
  * and drops the menu's default vertical padding so the popover box equals the
171
171
  * panel: the size middleware caps the panel to the available height, and any
172
- * extra chrome padding would push the popover past the viewport edge.
172
+ * extra chrome padding would push the popover past the viewport edge. The
173
+ * popover is a dialog, as the activator's `aria-haspopup` says: it holds a
174
+ * tablist and a listbox, which a `menu` may not contain.
173
175
  */
174
176
  function menuShellProps() {
175
177
  return {
@@ -178,12 +180,14 @@ var RuiCategoryPicker_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
178
180
  closeOnContentClick: false,
179
181
  disableAutoFocus: true,
180
182
  fullWidth: true,
183
+ menuLabel: __props.label,
181
184
  options: {
182
185
  placement: Placement.bottomStart,
183
186
  size: true
184
187
  },
185
188
  persistent: __props.dialogOptions?.persistent,
186
- persistOnActivatorClick: true
189
+ persistOnActivatorClick: true,
190
+ role: "dialog"
187
191
  };
188
192
  }
189
193
  const shellProps = computed(() => get(isMobile) ? dialogShellProps() : menuShellProps());