@rotki/ui-library 2.12.1 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +6 -14
  2. package/dist/components/accordions/accordion/RuiAccordion.vue.js +3 -4
  3. package/dist/components/accordions/accordion/RuiAccordion.vue.js.map +1 -1
  4. package/dist/components/accordions/accordions/RuiAccordions.vue.d.ts +10 -9
  5. package/dist/components/accordions/accordions/RuiAccordions.vue.js +27 -26
  6. package/dist/components/accordions/accordions/RuiAccordions.vue.js.map +1 -1
  7. package/dist/components/alerts/RuiAlert.vue.d.ts +7 -17
  8. package/dist/components/alerts/RuiAlert.vue2.js +8 -16
  9. package/dist/components/alerts/RuiAlert.vue2.js.map +1 -1
  10. package/dist/components/buttons/button/RuiButton.vue.d.ts +5 -7
  11. package/dist/components/buttons/button/RuiButton.vue2.js +19 -20
  12. package/dist/components/buttons/button/RuiButton.vue2.js.map +1 -1
  13. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +6 -5
  14. package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js +42 -41
  15. package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js.map +1 -1
  16. package/dist/components/calendar/RuiCalendar.vue.d.ts +1 -6
  17. package/dist/components/calendar/RuiCalendar.vue.js +7 -8
  18. package/dist/components/calendar/RuiCalendar.vue.js.map +1 -1
  19. package/dist/components/calendar/RuiCalendarGrid.vue.js +1 -1
  20. package/dist/components/calendar/RuiCalendarGrid.vue2.js +20 -18
  21. package/dist/components/calendar/RuiCalendarGrid.vue2.js.map +1 -1
  22. package/dist/components/calendar/RuiCalendarHeader.vue.js +1 -1
  23. package/dist/components/calendar/RuiCalendarHeader.vue2.js +3 -4
  24. package/dist/components/calendar/RuiCalendarHeader.vue2.js.map +1 -1
  25. package/dist/components/calendar/RuiCalendarMenu.vue.js +1 -1
  26. package/dist/components/calendar/RuiCalendarMenu.vue2.js +48 -40
  27. package/dist/components/calendar/RuiCalendarMenu.vue2.js.map +1 -1
  28. package/dist/components/cards/RuiCard.vue.d.ts +9 -24
  29. package/dist/components/cards/RuiCard.vue2.js +7 -7
  30. package/dist/components/cards/RuiCard.vue2.js.map +1 -1
  31. package/dist/components/cards/RuiCardHeader.vue.d.ts +5 -10
  32. package/dist/components/cards/RuiCardHeader.vue2.js +1 -1
  33. package/dist/components/cards/RuiCardHeader.vue2.js.map +1 -1
  34. package/dist/components/chips/RuiChip.vue.d.ts +7 -21
  35. package/dist/components/chips/RuiChip.vue2.js +16 -21
  36. package/dist/components/chips/RuiChip.vue2.js.map +1 -1
  37. package/dist/components/color-picker/RuiColorBoard.vue.d.ts +1 -1
  38. package/dist/components/color-picker/RuiColorBoard.vue2.js +19 -19
  39. package/dist/components/color-picker/RuiColorBoard.vue2.js.map +1 -1
  40. package/dist/components/color-picker/RuiColorDisplay.vue.js +3 -5
  41. package/dist/components/color-picker/RuiColorDisplay.vue.js.map +1 -1
  42. package/dist/components/color-picker/RuiColorHue.vue2.js +17 -14
  43. package/dist/components/color-picker/RuiColorHue.vue2.js.map +1 -1
  44. package/dist/components/color-picker/RuiColorInput.vue.js +9 -7
  45. package/dist/components/color-picker/RuiColorInput.vue.js.map +1 -1
  46. package/dist/components/color-picker/RuiColorPicker.vue.d.ts +7 -9
  47. package/dist/components/color-picker/RuiColorPicker.vue.js +23 -14
  48. package/dist/components/color-picker/RuiColorPicker.vue.js.map +1 -1
  49. package/dist/components/color-picker/utils.js +22 -5
  50. package/dist/components/color-picker/utils.js.map +1 -1
  51. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +2 -44
  52. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js +75 -79
  53. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -1
  54. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.js +1 -1
  55. package/dist/components/date-time-picker/dayjs-setup.d.ts +1 -0
  56. package/dist/components/date-time-picker/dayjs-setup.js +8 -0
  57. package/dist/components/date-time-picker/dayjs-setup.js.map +1 -0
  58. package/dist/components/date-time-picker/segment-config.d.ts +14 -0
  59. package/dist/components/date-time-picker/segment-config.js +23 -0
  60. package/dist/components/date-time-picker/segment-config.js.map +1 -0
  61. package/dist/components/date-time-picker/segment-utils.d.ts +5 -0
  62. package/dist/components/date-time-picker/segment-utils.js +36 -0
  63. package/dist/components/date-time-picker/segment-utils.js.map +1 -0
  64. package/dist/components/date-time-picker/use-date-time-selection.d.ts +1 -0
  65. package/dist/components/date-time-picker/use-date-time-selection.js +1 -0
  66. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
  67. package/dist/components/date-time-picker/use-keyboard-handler.d.ts +4 -8
  68. package/dist/components/date-time-picker/use-keyboard-handler.js +9 -54
  69. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  70. package/dist/components/date-time-picker/utils.d.ts +1 -0
  71. package/dist/components/date-time-picker/utils.js +1 -0
  72. package/dist/components/date-time-picker/utils.js.map +1 -1
  73. package/dist/components/divider/RuiDivider.vue.d.ts +1 -3
  74. package/dist/components/divider/RuiDivider.vue.js +6 -3
  75. package/dist/components/divider/RuiDivider.vue.js.map +1 -1
  76. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +10 -1138
  77. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +153 -160
  78. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js.map +1 -1
  79. package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +15 -24
  80. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js +32 -32
  81. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -1
  82. package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +2 -2
  83. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +19 -22
  84. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js.map +1 -1
  85. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +4 -2
  86. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js +13 -16
  87. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js.map +1 -1
  88. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +7 -13
  89. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js +10 -9
  90. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js.map +1 -1
  91. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +10 -785
  92. package/dist/components/forms/select/RuiMenuSelect.vue2.js +60 -56
  93. package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -1
  94. package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +11 -10
  95. package/dist/components/forms/select/RuiSimpleSelect.vue2.js +21 -26
  96. package/dist/components/forms/select/RuiSimpleSelect.vue2.js.map +1 -1
  97. package/dist/components/forms/slider/RuiSlider.vue.d.ts +10 -26
  98. package/dist/components/forms/slider/RuiSlider.vue2.js +45 -48
  99. package/dist/components/forms/slider/RuiSlider.vue2.js.map +1 -1
  100. package/dist/components/forms/switch/RuiSwitch.vue.d.ts +12 -20
  101. package/dist/components/forms/switch/RuiSwitch.vue2.js +22 -21
  102. package/dist/components/forms/switch/RuiSwitch.vue2.js.map +1 -1
  103. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +5 -30
  104. package/dist/components/forms/text-area/RuiTextArea.vue2.js +47 -83
  105. package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -1
  106. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +10 -30
  107. package/dist/components/forms/text-field/RuiTextField.vue2.js +36 -67
  108. package/dist/components/forms/text-field/RuiTextField.vue2.js.map +1 -1
  109. package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +1 -5
  110. package/dist/components/helpers/RuiFormTextDetail.vue.js +5 -9
  111. package/dist/components/helpers/RuiFormTextDetail.vue.js.map +1 -1
  112. package/dist/components/icons/LazyIcon.vue.d.ts +1 -3
  113. package/dist/components/icons/RuiIcon.vue.d.ts +1 -4
  114. package/dist/components/icons/RuiIcon.vue2.js +11 -14
  115. package/dist/components/icons/RuiIcon.vue2.js.map +1 -1
  116. package/dist/components/index.d.ts +4 -4
  117. package/dist/components/loaders/RuiSkeletonBase.vue.d.ts +1 -3
  118. package/dist/components/loaders/RuiSkeletonBase.vue2.js +2 -2
  119. package/dist/components/loaders/RuiSkeletonBase.vue2.js.map +1 -1
  120. package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +1 -4
  121. package/dist/components/loaders/RuiSkeletonLoader.vue2.js +2 -2
  122. package/dist/components/loaders/RuiSkeletonLoader.vue2.js.map +1 -1
  123. package/dist/components/logos/RuiLogo.vue.d.ts +1 -7
  124. package/dist/components/logos/RuiLogo.vue.js +13 -13
  125. package/dist/components/logos/RuiLogo.vue.js.map +1 -1
  126. package/dist/components/overlays/badge/RuiBadge.vue.d.ts +5 -20
  127. package/dist/components/overlays/badge/RuiBadge.vue2.js +11 -13
  128. package/dist/components/overlays/badge/RuiBadge.vue2.js.map +1 -1
  129. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.d.ts +10 -5
  130. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js +18 -7
  131. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js.map +1 -1
  132. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +22 -27
  133. package/dist/components/overlays/dialog/RuiDialog.vue2.js +90 -67
  134. package/dist/components/overlays/dialog/RuiDialog.vue2.js.map +1 -1
  135. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +24 -35
  136. package/dist/components/overlays/menu/RuiMenu.vue2.js +71 -78
  137. package/dist/components/overlays/menu/RuiMenu.vue2.js.map +1 -1
  138. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +23 -30
  139. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js +78 -49
  140. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js.map +1 -1
  141. package/dist/components/overlays/notification/RuiNotification.vue.d.ts +12 -12
  142. package/dist/components/overlays/notification/RuiNotification.vue.js +27 -22
  143. package/dist/components/overlays/notification/RuiNotification.vue.js.map +1 -1
  144. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +7 -18
  145. package/dist/components/overlays/tooltip/RuiTooltip.vue2.js +16 -9
  146. package/dist/components/overlays/tooltip/RuiTooltip.vue2.js.map +1 -1
  147. package/dist/components/progress/RuiProgress.vue.d.ts +8 -10
  148. package/dist/components/progress/RuiProgress.vue2.js +18 -24
  149. package/dist/components/progress/RuiProgress.vue2.js.map +1 -1
  150. package/dist/components/steppers/RuiFooterStepper.vue.d.ts +10 -11
  151. package/dist/components/steppers/RuiFooterStepper.vue2.js +33 -26
  152. package/dist/components/steppers/RuiFooterStepper.vue2.js.map +1 -1
  153. package/dist/components/steppers/RuiStepper.vue.d.ts +6 -15
  154. package/dist/components/steppers/RuiStepper.vue2.js +39 -36
  155. package/dist/components/steppers/RuiStepper.vue2.js.map +1 -1
  156. package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +1 -3
  157. package/dist/components/steppers/RuiStepperCustomIcon.vue2.js +2 -2
  158. package/dist/components/steppers/RuiStepperCustomIcon.vue2.js.map +1 -1
  159. package/dist/components/steppers/RuiStepperIcon.vue.d.ts +1 -3
  160. package/dist/components/steppers/RuiStepperIcon.vue2.js +2 -2
  161. package/dist/components/steppers/RuiStepperIcon.vue2.js.map +1 -1
  162. package/dist/components/tables/RuiDataTable.vue.d.ts +29 -81
  163. package/dist/components/tables/RuiDataTable.vue2.js +196 -601
  164. package/dist/components/tables/RuiDataTable.vue2.js.map +1 -1
  165. package/dist/components/tables/RuiDataTable.vue3.js +24 -27
  166. package/dist/components/tables/RuiDataTable.vue3.js.map +1 -1
  167. package/dist/components/tables/RuiExpandButton.vue.d.ts +3 -6
  168. package/dist/components/tables/RuiExpandButton.vue2.js +4 -2
  169. package/dist/components/tables/RuiExpandButton.vue2.js.map +1 -1
  170. package/dist/components/tables/RuiTableHead.vue.d.ts +4 -7
  171. package/dist/components/tables/RuiTableHead.vue2.js +20 -20
  172. package/dist/components/tables/RuiTableHead.vue2.js.map +1 -1
  173. package/dist/components/tables/RuiTablePagination.vue.d.ts +10 -10
  174. package/dist/components/tables/RuiTablePagination.vue2.js +27 -19
  175. package/dist/components/tables/RuiTablePagination.vue2.js.map +1 -1
  176. package/dist/components/tabs/tab/RuiTab.vue.d.ts +3 -18
  177. package/dist/components/tabs/tab/RuiTab.vue2.js +84 -52
  178. package/dist/components/tabs/tab/RuiTab.vue2.js.map +1 -1
  179. package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +3 -11
  180. package/dist/components/tabs/tab-item/RuiTabItem.vue2.js +3 -2
  181. package/dist/components/tabs/tab-item/RuiTabItem.vue2.js.map +1 -1
  182. package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +2 -5
  183. package/dist/components/tabs/tab-items/RuiTabItems.vue2.js +18 -18
  184. package/dist/components/tabs/tab-items/RuiTabItems.vue2.js.map +1 -1
  185. package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +10 -14
  186. package/dist/components/tabs/tabs/RuiTabs.vue2.js +101 -94
  187. package/dist/components/tabs/tabs/RuiTabs.vue2.js.map +1 -1
  188. package/dist/components/time-picker/RuiTimePicker.vue.d.ts +1 -4
  189. package/dist/components/time-picker/RuiTimePicker.vue2.js +88 -38
  190. package/dist/components/time-picker/RuiTimePicker.vue2.js.map +1 -1
  191. package/dist/composables/breakpoint.js +8 -13
  192. package/dist/composables/breakpoint.js.map +1 -1
  193. package/dist/composables/dropdown-menu.d.ts +7 -4
  194. package/dist/composables/dropdown-menu.js +73 -50
  195. package/dist/composables/dropdown-menu.js.map +1 -1
  196. package/dist/composables/forms/auto-complete/focus.d.ts +7 -5
  197. package/dist/composables/forms/auto-complete/focus.js +28 -17
  198. package/dist/composables/forms/auto-complete/focus.js.map +1 -1
  199. package/dist/composables/forms/auto-complete/index.d.ts +0 -9
  200. package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +8 -3
  201. package/dist/composables/forms/auto-complete/keyboard-navigation.js +11 -5
  202. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  203. package/dist/composables/forms/auto-complete/search.d.ts +7 -0
  204. package/dist/composables/forms/auto-complete/search.js +10 -8
  205. package/dist/composables/forms/auto-complete/search.js.map +1 -1
  206. package/dist/composables/forms/auto-complete/value.d.ts +4 -0
  207. package/dist/composables/forms/auto-complete/value.js +24 -42
  208. package/dist/composables/forms/auto-complete/value.js.map +1 -1
  209. package/dist/composables/forms/use-label-with-quote.d.ts +2 -0
  210. package/dist/composables/forms/use-label-with-quote.js +14 -0
  211. package/dist/composables/forms/use-label-with-quote.js.map +1 -0
  212. package/dist/composables/forms/use-prepend-append-width.d.ts +6 -0
  213. package/dist/composables/forms/use-prepend-append-width.js +25 -0
  214. package/dist/composables/forms/use-prepend-append-width.js.map +1 -0
  215. package/dist/composables/icons.js +1 -1
  216. package/dist/composables/icons.js.map +1 -1
  217. package/dist/composables/popper.js +63 -49
  218. package/dist/composables/popper.js.map +1 -1
  219. package/dist/composables/sticky-header.d.ts +7 -5
  220. package/dist/composables/sticky-header.js +51 -41
  221. package/dist/composables/sticky-header.js.map +1 -1
  222. package/dist/composables/tables/data-table/columns.d.ts +25 -0
  223. package/dist/composables/tables/data-table/columns.js +54 -0
  224. package/dist/composables/tables/data-table/columns.js.map +1 -0
  225. package/dist/composables/tables/data-table/expansion.d.ts +17 -0
  226. package/dist/composables/tables/data-table/expansion.js +38 -0
  227. package/dist/composables/tables/data-table/expansion.js.map +1 -0
  228. package/dist/composables/tables/data-table/grouping.d.ts +29 -0
  229. package/dist/composables/tables/data-table/grouping.js +136 -0
  230. package/dist/composables/tables/data-table/grouping.js.map +1 -0
  231. package/dist/composables/tables/data-table/pagination.d.ts +33 -0
  232. package/dist/composables/tables/data-table/pagination.js +119 -0
  233. package/dist/composables/tables/data-table/pagination.js.map +1 -0
  234. package/dist/composables/tables/data-table/selection.d.ts +29 -0
  235. package/dist/composables/tables/data-table/selection.js +164 -0
  236. package/dist/composables/tables/data-table/selection.js.map +1 -0
  237. package/dist/composables/tables/data-table/sort.d.ts +32 -0
  238. package/dist/composables/tables/data-table/sort.js +136 -0
  239. package/dist/composables/tables/data-table/sort.js.map +1 -0
  240. package/dist/composables/tables/data-table/types.d.ts +14 -0
  241. package/dist/composables/tables/data-table/types.js +11 -0
  242. package/dist/composables/tables/data-table/types.js.map +1 -0
  243. package/dist/composables/theme.js +5 -21
  244. package/dist/composables/theme.js.map +1 -1
  245. package/dist/composables/timeout-manager.d.ts +4 -2
  246. package/dist/composables/timeout-manager.js +2 -1
  247. package/dist/composables/timeout-manager.js.map +1 -1
  248. package/dist/icons/icons_1.d.ts +15 -15
  249. package/dist/icons/icons_1.js +123 -123
  250. package/dist/icons/icons_1.js.map +1 -1
  251. package/dist/icons/icons_2.d.ts +46 -46
  252. package/dist/icons/icons_2.js +301 -301
  253. package/dist/icons/icons_2.js.map +1 -1
  254. package/dist/icons/icons_3.d.ts +43 -43
  255. package/dist/icons/icons_3.js +252 -252
  256. package/dist/icons/icons_3.js.map +1 -1
  257. package/dist/icons/icons_4.d.ts +72 -2
  258. package/dist/icons/icons_4.js +368 -18
  259. package/dist/icons/icons_4.js.map +1 -1
  260. package/dist/icons/index.d.ts +1 -1
  261. package/dist/icons/index.js +1 -1
  262. package/dist/icons/index.js.map +1 -1
  263. package/dist/index.js +105 -42
  264. package/dist/index.js.map +1 -1
  265. package/dist/style.css +189 -162
  266. package/dist/theme/index.js +15 -1
  267. package/dist/theme/index.js.map +1 -1
  268. package/dist/utils/assert.d.ts +1 -1
  269. package/dist/utils/assert.js.map +1 -1
  270. package/dist/utils/form-text-detail.d.ts +9 -8
  271. package/dist/utils/form-text-detail.js +1 -2
  272. package/dist/utils/form-text-detail.js.map +1 -1
  273. package/dist/utils/helpers.d.ts +4 -32
  274. package/dist/utils/helpers.js +8 -9
  275. package/dist/utils/helpers.js.map +1 -1
  276. package/dist/utils/is-equal.d.ts +1 -1
  277. package/dist/utils/is-equal.js +5 -3
  278. package/dist/utils/is-equal.js.map +1 -1
  279. package/dist/vite-plugin/index.js +4 -4
  280. package/dist/vite-plugin/index.js.map +1 -1
  281. package/dist/vite-plugin/scanner.js +3 -3
  282. package/dist/vite-plugin/scanner.js.map +1 -1
  283. package/dist/web-types.json +390 -371
  284. package/package.json +47 -44
  285. package/dist/utils/generate-id.d.ts +0 -5
  286. package/dist/utils/generate-id.js +0 -21
  287. package/dist/utils/generate-id.js.map +0 -1
@@ -1,8 +1,7 @@
1
1
  import { get, set } from "@vueuse/shared";
2
2
  import { assert } from "../../../utils/assert.js";
3
- import { computed } from "vue";
3
+ import { computed, watch } from "vue";
4
4
  function useAutoCompleteValue(modelValue, options, opts, deps) {
5
- const multiple = computed(() => Array.isArray(get(modelValue)));
6
5
  const optionsMap = computed(() => {
7
6
  const map = /* @__PURE__ */ new Map();
8
7
  const optionsData = get(options);
@@ -12,7 +11,7 @@ function useAutoCompleteValue(modelValue, options, opts, deps) {
12
11
  return map;
13
12
  });
14
13
  function convertModelValueToArray(modelValueData) {
15
- if (!modelValueData)
14
+ if (modelValueData === null || modelValueData === void 0)
16
15
  return [];
17
16
  return Array.isArray(modelValueData) ? modelValueData : [modelValueData];
18
17
  }
@@ -23,7 +22,7 @@ function useAutoCompleteValue(modelValue, options, opts, deps) {
23
22
  for (const val of valueArray) {
24
23
  const identifier = deps.getIdentifier(val);
25
24
  const inOptions = optionsMapData.get(identifier);
26
- if (inOptions) {
25
+ if (inOptions !== void 0) {
27
26
  filtered[index++] = inOptions;
28
27
  } else if (customValue) {
29
28
  filtered[index++] = deps.textValueToProperValue(val, returnObject);
@@ -38,7 +37,7 @@ function useAutoCompleteValue(modelValue, options, opts, deps) {
38
37
  let index = 0;
39
38
  for (const val of valueArray) {
40
39
  const inOptions = optionsMapData.get(val);
41
- if (inOptions) {
40
+ if (inOptions !== void 0) {
42
41
  filtered[index++] = inOptions;
43
42
  } else if (customValue) {
44
43
  filtered[index++] = deps.textValueToProperValue(val, returnObject);
@@ -47,34 +46,19 @@ function useAutoCompleteValue(modelValue, options, opts, deps) {
47
46
  filtered.length = index;
48
47
  return filtered;
49
48
  }
50
- function processReturnObjectValue(modelValueData, optionsMapData, returnObject, customValue, shouldUpdateInternalSearch) {
49
+ function processReturnObjectValue(modelValueData, optionsMapData, returnObject, customValue) {
51
50
  const multipleValue = Array.isArray(modelValueData);
52
51
  const valueArray = convertModelValueToArray(modelValueData);
53
52
  const filtered = filterValuesByOptions(valueArray, optionsMapData, customValue, returnObject);
54
- if (multipleValue || filtered.length === 0) {
55
- if (shouldUpdateInternalSearch)
56
- deps.updateInternalSearch();
53
+ if (multipleValue || filtered.length === 0)
57
54
  return filtered;
58
- }
59
55
  const val = filtered[0];
60
56
  assert(val);
61
- if (shouldUpdateInternalSearch)
62
- deps.updateInternalSearch(deps.getText(val));
63
57
  return [val];
64
58
  }
65
- function processStandardValue(modelValueData, optionsMapData, returnObject, customValue, shouldUpdateInternalSearch) {
59
+ function processStandardValue(modelValueData, optionsMapData, returnObject, customValue) {
66
60
  const valueArray = convertModelValueToArray(modelValueData);
67
- const filtered = filterValuesByIdentifier(valueArray, optionsMapData, customValue, returnObject);
68
- if (shouldUpdateInternalSearch) {
69
- if (filtered.length > 0) {
70
- const firstItem = filtered[0];
71
- assert(firstItem);
72
- deps.updateInternalSearch(deps.getText(firstItem));
73
- } else {
74
- deps.updateInternalSearch();
75
- }
76
- }
77
- return filtered;
61
+ return filterValuesByIdentifier(valueArray, optionsMapData, customValue, returnObject);
78
62
  }
79
63
  function onUpdateModelValue(value2) {
80
64
  set(modelValue, value2);
@@ -83,7 +67,7 @@ function useAutoCompleteValue(modelValue, options, opts, deps) {
83
67
  const keyAttr = get(opts.keyAttr);
84
68
  const returnObject = get(opts.returnObject);
85
69
  const selection = keyAttr && !returnObject ? selected.map((item) => item[keyAttr]) : selected;
86
- if (get(multiple))
70
+ if (get(deps.multiple))
87
71
  return onUpdateModelValue(selection);
88
72
  if (selection.length === 0)
89
73
  return onUpdateModelValue(void 0);
@@ -96,28 +80,26 @@ function useAutoCompleteValue(modelValue, options, opts, deps) {
96
80
  const returnObject = get(opts.returnObject) ?? false;
97
81
  const customValue = get(opts.customValue) ?? false;
98
82
  const optionsMapData = get(optionsMap);
99
- const shouldUpdateInternalSearch = get(deps.shouldApplyValueAsSearch) && !get(deps.isOpen);
100
- if (keyAttr && returnObject) {
101
- return processReturnObjectValue(
102
- modelValueData,
103
- optionsMapData,
104
- returnObject,
105
- customValue,
106
- shouldUpdateInternalSearch
107
- );
108
- }
109
- return processStandardValue(
110
- modelValueData,
111
- optionsMapData,
112
- returnObject,
113
- customValue,
114
- shouldUpdateInternalSearch
115
- );
83
+ if (keyAttr && returnObject)
84
+ return processReturnObjectValue(modelValueData, optionsMapData, returnObject, customValue);
85
+ return processStandardValue(modelValueData, optionsMapData, returnObject, customValue);
116
86
  },
117
87
  set: (selected) => {
118
88
  setSelected(selected);
119
89
  }
120
90
  });
91
+ watch([modelValue, () => get(deps.isOpen)], () => {
92
+ if (get(deps.isOpen) || !get(deps.shouldApplyValueAsSearch))
93
+ return;
94
+ const currentValue = get(value);
95
+ if (get(deps.multiple) || currentValue.length === 0) {
96
+ deps.updateInternalSearch();
97
+ } else {
98
+ const firstItem = currentValue[0];
99
+ assert(firstItem);
100
+ deps.updateInternalSearch(deps.getText(firstItem));
101
+ }
102
+ }, { immediate: true });
121
103
  return {
122
104
  setSelected,
123
105
  value
@@ -1 +1 @@
1
- {"version":3,"file":"value.js","sources":["../../../../src/composables/forms/auto-complete/value.ts"],"sourcesContent":["import type { ComputedRef, MaybeRef, Ref } from 'vue';\nimport { get, set } from '@vueuse/shared';\nimport { assert } from '@/utils/assert';\n\nexport interface UseAutoCompleteValueOptions<TItem> {\n keyAttr?: MaybeRef<keyof TItem | undefined>;\n returnObject?: MaybeRef<boolean>;\n customValue?: MaybeRef<boolean>;\n}\n\nexport interface UseAutoCompleteValueReturn<TItem> {\n value: ComputedRef<TItem[]>;\n setSelected: (selected: TItem[]) => void;\n}\n\nexport interface UseAutoCompleteValueDeps<TItem> {\n getIdentifier: (item: TItem) => any;\n getText: (item: TItem) => string | undefined;\n textValueToProperValue: (val: any, returnObject?: boolean) => TItem;\n shouldApplyValueAsSearch: MaybeRef<boolean>;\n isOpen: MaybeRef<boolean>;\n updateInternalSearch: (value?: string) => void;\n}\n\nexport function useAutoCompleteValue<TValue, TItem>(\n modelValue: Ref<TValue | undefined>,\n options: MaybeRef<TItem[]>,\n opts: UseAutoCompleteValueOptions<TItem>,\n deps: UseAutoCompleteValueDeps<TItem>,\n): UseAutoCompleteValueReturn<TItem> {\n const multiple = computed<boolean>(() => Array.isArray(get(modelValue)));\n\n // Create maps for O(1) lookup performance\n const optionsMap = computed<Map<any, TItem>>(() => {\n const map = new Map<any, TItem>();\n const optionsData = get(options);\n for (const item of optionsData) {\n map.set(deps.getIdentifier(item), item);\n }\n return map;\n });\n\n function convertModelValueToArray(modelValueData: TValue | undefined): any[] {\n if (!modelValueData)\n return [];\n return Array.isArray(modelValueData) ? modelValueData : [modelValueData];\n }\n\n function filterValuesByOptions(\n valueArray: any[],\n optionsMapData: Map<any, TItem>,\n customValue: boolean,\n returnObject: boolean,\n ): TItem[] {\n const filtered: TItem[] = [];\n filtered.length = valueArray.length; // Pre-allocate array size\n let index = 0;\n\n for (const val of valueArray) {\n const identifier = deps.getIdentifier(val);\n const inOptions = optionsMapData.get(identifier);\n\n if (inOptions) {\n filtered[index++] = inOptions;\n }\n else if (customValue) {\n filtered[index++] = deps.textValueToProperValue(val, returnObject);\n }\n }\n\n filtered.length = index; // Trim to actual size\n return filtered;\n }\n\n function filterValuesByIdentifier(\n valueArray: any[],\n optionsMapData: Map<any, TItem>,\n customValue: boolean,\n returnObject: boolean,\n ): TItem[] {\n const filtered: TItem[] = [];\n filtered.length = valueArray.length; // Pre-allocate array size\n let index = 0;\n\n for (const val of valueArray) {\n const inOptions = optionsMapData.get(val);\n\n if (inOptions) {\n filtered[index++] = inOptions;\n }\n else if (customValue) {\n filtered[index++] = deps.textValueToProperValue(val, returnObject);\n }\n }\n\n filtered.length = index; // Trim to actual size\n return filtered;\n }\n\n function processReturnObjectValue(\n modelValueData: TValue | undefined,\n optionsMapData: Map<any, TItem>,\n returnObject: boolean,\n customValue: boolean,\n shouldUpdateInternalSearch: boolean,\n ): TItem[] {\n const multipleValue = Array.isArray(modelValueData);\n const valueArray = convertModelValueToArray(modelValueData);\n const filtered = filterValuesByOptions(valueArray, optionsMapData, customValue, returnObject);\n\n if (multipleValue || filtered.length === 0) {\n if (shouldUpdateInternalSearch)\n deps.updateInternalSearch();\n return filtered;\n }\n\n const val = filtered[0];\n assert(val);\n if (shouldUpdateInternalSearch)\n deps.updateInternalSearch(deps.getText(val));\n return [val];\n }\n\n function processStandardValue(\n modelValueData: TValue | undefined,\n optionsMapData: Map<any, TItem>,\n returnObject: boolean,\n customValue: boolean,\n shouldUpdateInternalSearch: boolean,\n ): TItem[] {\n const valueArray = convertModelValueToArray(modelValueData);\n const filtered = filterValuesByIdentifier(valueArray, optionsMapData, customValue, returnObject);\n\n if (shouldUpdateInternalSearch) {\n if (filtered.length > 0) {\n const firstItem = filtered[0];\n assert(firstItem);\n deps.updateInternalSearch(deps.getText(firstItem));\n }\n else {\n deps.updateInternalSearch();\n }\n }\n\n return filtered;\n }\n\n function onUpdateModelValue(value: TValue | undefined): void {\n set(modelValue, value);\n }\n\n function setSelected(selected: TItem[]): void {\n const keyAttr = get(opts.keyAttr);\n const returnObject = get(opts.returnObject);\n const selection = keyAttr && !returnObject ? selected.map(item => item[keyAttr]) : selected;\n\n if (get(multiple))\n return onUpdateModelValue(selection as TValue);\n\n if (selection.length === 0)\n return onUpdateModelValue(undefined);\n\n return onUpdateModelValue(selection[0] as TValue);\n }\n\n const value = computed<TItem[]>({\n get: () => {\n const modelValueData = get(modelValue);\n const keyAttr = get(opts.keyAttr);\n const returnObject = get(opts.returnObject) ?? false;\n const customValue = get(opts.customValue) ?? false;\n const optionsMapData = get(optionsMap);\n const shouldUpdateInternalSearch = get(deps.shouldApplyValueAsSearch) && !get(deps.isOpen);\n\n if (keyAttr && returnObject) {\n return processReturnObjectValue(\n modelValueData,\n optionsMapData,\n returnObject,\n customValue,\n shouldUpdateInternalSearch,\n );\n }\n\n return processStandardValue(\n modelValueData,\n optionsMapData,\n returnObject,\n customValue,\n shouldUpdateInternalSearch,\n );\n },\n set: (selected: TItem[]): void => {\n setSelected(selected);\n },\n });\n\n return {\n setSelected,\n value,\n };\n}\n"],"names":["value"],"mappings":"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"}
1
+ {"version":3,"file":"value.js","sources":["../../../../src/composables/forms/auto-complete/value.ts"],"sourcesContent":["import type { ComputedRef, MaybeRef, Ref } from 'vue';\nimport { get, set } from '@vueuse/shared';\nimport { assert } from '@/utils/assert';\n\nexport interface UseAutoCompleteValueOptions<TItem> {\n /** The property used as the unique identifier for each item. */\n keyAttr?: MaybeRef<keyof TItem | undefined>;\n /** Whether to return the full item object instead of just the key. */\n returnObject?: MaybeRef<boolean>;\n /** Whether custom (free-text) values are allowed. */\n customValue?: MaybeRef<boolean>;\n}\n\nexport interface UseAutoCompleteValueReturn<TItem> {\n value: ComputedRef<TItem[]>;\n setSelected: (selected: TItem[]) => void;\n}\n\nexport interface UseAutoCompleteValueDeps<TItem> {\n getIdentifier: (item: TItem) => any;\n getText: (item: TItem) => string | undefined;\n textValueToProperValue: (val: any, returnObject?: boolean) => TItem;\n shouldApplyValueAsSearch: MaybeRef<boolean>;\n isOpen: MaybeRef<boolean>;\n multiple: MaybeRef<boolean>;\n updateInternalSearch: (value?: string) => void;\n}\n\nexport function useAutoCompleteValue<TValue, TItem>(\n modelValue: Ref<TValue | undefined>,\n options: MaybeRef<TItem[]>,\n opts: UseAutoCompleteValueOptions<TItem>,\n deps: UseAutoCompleteValueDeps<TItem>,\n): UseAutoCompleteValueReturn<TItem> {\n // Create maps for O(1) lookup performance\n const optionsMap = computed<Map<any, TItem>>(() => {\n const map = new Map<any, TItem>();\n const optionsData = get(options);\n for (const item of optionsData) {\n map.set(deps.getIdentifier(item), item);\n }\n return map;\n });\n\n function convertModelValueToArray(modelValueData: TValue | undefined): any[] {\n if (modelValueData === null || modelValueData === undefined)\n return [];\n return Array.isArray(modelValueData) ? modelValueData : [modelValueData];\n }\n\n function filterValuesByOptions(\n valueArray: any[],\n optionsMapData: Map<any, TItem>,\n customValue: boolean,\n returnObject: boolean,\n ): TItem[] {\n const filtered: TItem[] = [];\n filtered.length = valueArray.length; // Pre-allocate array size\n let index = 0;\n\n for (const val of valueArray) {\n const identifier = deps.getIdentifier(val);\n const inOptions = optionsMapData.get(identifier);\n\n if (inOptions !== undefined) {\n filtered[index++] = inOptions;\n }\n else if (customValue) {\n filtered[index++] = deps.textValueToProperValue(val, returnObject);\n }\n }\n\n filtered.length = index; // Trim to actual size\n return filtered;\n }\n\n function filterValuesByIdentifier(\n valueArray: any[],\n optionsMapData: Map<any, TItem>,\n customValue: boolean,\n returnObject: boolean,\n ): TItem[] {\n const filtered: TItem[] = [];\n filtered.length = valueArray.length; // Pre-allocate array size\n let index = 0;\n\n for (const val of valueArray) {\n const inOptions = optionsMapData.get(val);\n\n if (inOptions !== undefined) {\n filtered[index++] = inOptions;\n }\n else if (customValue) {\n filtered[index++] = deps.textValueToProperValue(val, returnObject);\n }\n }\n\n filtered.length = index; // Trim to actual size\n return filtered;\n }\n\n function processReturnObjectValue(\n modelValueData: TValue | undefined,\n optionsMapData: Map<any, TItem>,\n returnObject: boolean,\n customValue: boolean,\n ): TItem[] {\n const multipleValue = Array.isArray(modelValueData);\n const valueArray = convertModelValueToArray(modelValueData);\n const filtered = filterValuesByOptions(valueArray, optionsMapData, customValue, returnObject);\n\n if (multipleValue || filtered.length === 0)\n return filtered;\n\n const val = filtered[0];\n assert(val);\n return [val];\n }\n\n function processStandardValue(\n modelValueData: TValue | undefined,\n optionsMapData: Map<any, TItem>,\n returnObject: boolean,\n customValue: boolean,\n ): TItem[] {\n const valueArray = convertModelValueToArray(modelValueData);\n return filterValuesByIdentifier(valueArray, optionsMapData, customValue, returnObject);\n }\n\n function onUpdateModelValue(value: TValue | undefined): void {\n set(modelValue, value);\n }\n\n function setSelected(selected: TItem[]): void {\n const keyAttr = get(opts.keyAttr);\n const returnObject = get(opts.returnObject);\n const selection = keyAttr && !returnObject ? selected.map(item => item[keyAttr]) : selected;\n\n if (get(deps.multiple))\n return onUpdateModelValue(selection as TValue);\n\n if (selection.length === 0)\n return onUpdateModelValue(undefined);\n\n return onUpdateModelValue(selection[0] as TValue);\n }\n\n const value = computed<TItem[]>({\n get: () => {\n const modelValueData = get(modelValue);\n const keyAttr = get(opts.keyAttr);\n const returnObject = get(opts.returnObject) ?? false;\n const customValue = get(opts.customValue) ?? false;\n const optionsMapData = get(optionsMap);\n\n if (keyAttr && returnObject)\n return processReturnObjectValue(modelValueData, optionsMapData, returnObject, customValue);\n\n return processStandardValue(modelValueData, optionsMapData, returnObject, customValue);\n },\n set: (selected: TItem[]): void => {\n setSelected(selected);\n },\n });\n\n // Sync search text when menu is closed and value changes\n watch([modelValue, () => get(deps.isOpen)], () => {\n if (get(deps.isOpen) || !get(deps.shouldApplyValueAsSearch))\n return;\n\n const currentValue = get(value);\n if (get(deps.multiple) || currentValue.length === 0) {\n deps.updateInternalSearch();\n }\n else {\n const firstItem = currentValue[0];\n assert(firstItem);\n deps.updateInternalSearch(deps.getText(firstItem));\n }\n }, { immediate: true });\n\n return {\n setSelected,\n value,\n };\n}\n"],"names":["value"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ComputedRef } from 'vue';
2
+ export declare function useLabelWithQuote(label: () => string, required: () => boolean): ComputedRef<string>;
@@ -0,0 +1,14 @@
1
+ import { computed } from "vue";
2
+ function useLabelWithQuote(label, required) {
3
+ return computed(() => {
4
+ const labelVal = label();
5
+ if (!labelVal)
6
+ return '"\\200B"';
7
+ const asterisk = required() ? "﹡" : "";
8
+ return `' ${labelVal}${asterisk} '`;
9
+ });
10
+ }
11
+ export {
12
+ useLabelWithQuote
13
+ };
14
+ //# sourceMappingURL=use-label-with-quote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-label-with-quote.js","sources":["../../../src/composables/forms/use-label-with-quote.ts"],"sourcesContent":["import type { ComputedRef } from 'vue';\n\nexport function useLabelWithQuote(\n label: () => string,\n required: () => boolean,\n): ComputedRef<string> {\n return computed<string>(() => {\n const labelVal = label();\n if (!labelVal)\n return '\"\\\\200B\"';\n\n const asterisk = required() ? '﹡' : '';\n return `' ${labelVal}${asterisk} '`;\n });\n}\n"],"names":[],"mappings":";AAEO,SAAS,kBACd,OACA,UACqB;AACrB,SAAO,SAAiB,MAAM;AAC5B,UAAM,WAAW,MAAA;AACjB,QAAI,CAAC;AACH,aAAO;AAET,UAAM,WAAW,aAAa,MAAM;AACpC,WAAO,MAAM,QAAQ,GAAG,QAAQ;AAAA,EAClC,CAAC;AACH;"}
@@ -0,0 +1,6 @@
1
+ import type { Ref, ShallowRef } from 'vue';
2
+ export interface PrependAppendWidth {
3
+ prependWidth: Ref<string>;
4
+ appendWidth: Ref<string>;
5
+ }
6
+ export declare function usePrependAppendWidth(prepend: Readonly<ShallowRef<HTMLDivElement | null>>, append: Readonly<ShallowRef<HTMLDivElement | null>>, offset?: number): PrependAppendWidth;
@@ -0,0 +1,25 @@
1
+ import { assert } from "../../utils/assert.js";
2
+ import { shallowRef } from "vue";
3
+ import { useResizeObserver } from "@vueuse/core";
4
+ import { set } from "@vueuse/shared";
5
+ function usePrependAppendWidth(prepend, append, offset = 0) {
6
+ const prependWidth = shallowRef("0px");
7
+ const appendWidth = shallowRef("0px");
8
+ useResizeObserver(prepend, (entries) => {
9
+ const [entry] = entries;
10
+ assert(entry);
11
+ const { width, left } = entry.contentRect;
12
+ set(prependWidth, `${width + left + offset}px`);
13
+ });
14
+ useResizeObserver(append, (entries) => {
15
+ const [entry] = entries;
16
+ assert(entry);
17
+ const { width, right } = entry.contentRect;
18
+ set(appendWidth, `${width + right + offset}px`);
19
+ });
20
+ return { prependWidth, appendWidth };
21
+ }
22
+ export {
23
+ usePrependAppendWidth
24
+ };
25
+ //# sourceMappingURL=use-prepend-append-width.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-prepend-append-width.js","sources":["../../../src/composables/forms/use-prepend-append-width.ts"],"sourcesContent":["import type { Ref, ShallowRef } from 'vue';\nimport { assert } from '@/utils/assert';\n\nexport interface PrependAppendWidth {\n prependWidth: Ref<string>;\n appendWidth: Ref<string>;\n}\n\nexport function usePrependAppendWidth(\n prepend: Readonly<ShallowRef<HTMLDivElement | null>>,\n append: Readonly<ShallowRef<HTMLDivElement | null>>,\n offset: number = 0,\n): PrependAppendWidth {\n const prependWidth = shallowRef<string>('0px');\n const appendWidth = shallowRef<string>('0px');\n\n useResizeObserver(prepend, (entries) => {\n const [entry] = entries;\n assert(entry);\n const { width, left } = entry.contentRect;\n set(prependWidth, `${width + left + offset}px`);\n });\n\n useResizeObserver(append, (entries) => {\n const [entry] = entries;\n assert(entry);\n const { width, right } = entry.contentRect;\n set(appendWidth, `${width + right + offset}px`);\n });\n\n return { prependWidth, appendWidth };\n}\n"],"names":[],"mappings":";;;;AAQO,SAAS,sBACd,SACA,QACA,SAAiB,GACG;AACpB,QAAM,eAAe,WAAmB,KAAK;AAC7C,QAAM,cAAc,WAAmB,KAAK;AAE5C,oBAAkB,SAAS,CAAC,YAAY;AACtC,UAAM,CAAC,KAAK,IAAI;AAChB,WAAO,KAAK;AACZ,UAAM,EAAE,OAAO,KAAA,IAAS,MAAM;AAC9B,QAAI,cAAc,GAAG,QAAQ,OAAO,MAAM,IAAI;AAAA,EAChD,CAAC;AAED,oBAAkB,QAAQ,CAAC,YAAY;AACrC,UAAM,CAAC,KAAK,IAAI;AAChB,WAAO,KAAK;AACZ,UAAM,EAAE,OAAO,MAAA,IAAU,MAAM;AAC/B,QAAI,aAAa,GAAG,QAAQ,QAAQ,MAAM,IAAI;AAAA,EAChD,CAAC;AAED,SAAO,EAAE,cAAc,YAAA;AACzB;"}
@@ -1,8 +1,8 @@
1
1
  import { LuChevronsUpDown, LuArrowUp, LuArrowDown, LuArrowLeft, LuArrowRight, LuChevronUp, LuChevronDown, LuChevronLeft, LuChevronRight, LuChevronsLeft, LuChevronsRight, LuCircleAlert, LuCheck, LuCircleX, LuCircleCheck, LuCheckboxBlank, LuCheckboxFill, LuCheckboxIndeterminateFill, LuCheckboxBlankCircle, LuCheckboxBlankCircleFill, LuRadioButtonFill, LuClock } from "../icons/icons_1.js";
2
2
  import { LuEllipsis, LuInfo, LuEye, LuEyeOff } from "../icons/icons_2.js";
3
3
  import { LuTriangleAlert, LuX } from "../icons/icons_4.js";
4
- import { inject } from "vue";
5
4
  import { assert } from "../utils/assert.js";
5
+ import { inject } from "vue";
6
6
  const requiredIcons = [
7
7
  LuChevronsUpDown,
8
8
  LuEllipsis,
@@ -1 +1 @@
1
- {"version":3,"file":"icons.js","sources":["../../src/composables/icons.ts"],"sourcesContent":["import type { InjectionKey } from 'vue';\nimport type { GeneratedIcon } from '@/types/icons';\nimport {\n LuArrowDown,\n LuArrowLeft,\n LuArrowRight,\n LuArrowUp,\n LuCheck,\n LuCheckboxBlank,\n LuCheckboxBlankCircle,\n LuCheckboxBlankCircleFill,\n LuCheckboxFill,\n LuCheckboxIndeterminateFill,\n LuChevronDown,\n LuChevronLeft,\n LuChevronRight,\n LuChevronsLeft,\n LuChevronsRight,\n LuChevronsUpDown,\n LuChevronUp,\n LuCircleAlert,\n LuCircleCheck,\n LuCircleX,\n LuClock,\n LuEllipsis,\n LuEye,\n LuEyeOff,\n LuInfo,\n LuRadioButtonFill,\n LuTriangleAlert,\n LuX,\n} from '@/icons';\n\nconst requiredIcons: GeneratedIcon[] = [\n LuChevronsUpDown,\n LuEllipsis,\n LuTriangleAlert,\n LuX,\n LuInfo,\n LuArrowUp,\n LuArrowDown,\n LuArrowLeft,\n LuArrowRight,\n LuChevronUp,\n LuChevronDown,\n LuChevronLeft,\n LuChevronRight,\n LuChevronsLeft,\n LuChevronsRight,\n LuCircleAlert,\n LuEye,\n LuEyeOff,\n LuCheck,\n LuCircleX,\n LuCircleCheck,\n LuCheckboxBlank,\n LuCheckboxFill,\n LuCheckboxIndeterminateFill,\n LuCheckboxBlankCircle,\n LuCheckboxBlankCircleFill,\n LuRadioButtonFill,\n LuClock,\n];\n\nexport interface IconsOptions {\n registeredIcons: GeneratedIcon[];\n}\n\nexport interface UseIconsReturn {\n registeredIcons: Readonly<Record<string, [string, Record<string, string>][]>>;\n}\n\nexport const IconsSymbol: InjectionKey<UseIconsReturn> = Symbol.for('rui:icons');\n\nexport function createIconDefaults(options?: Partial<IconsOptions>): UseIconsReturn {\n const iconsToAdd = options?.registeredIcons || [];\n return {\n registeredIcons: {\n ...Object.fromEntries(\n [\n ...requiredIcons,\n ...iconsToAdd,\n ].map(({ components, name }) => [name, components]),\n ),\n },\n };\n}\n\nexport function useIcons(): UseIconsReturn {\n const icons = inject(IconsSymbol);\n assert(icons, 'Could not find icons injection');\n return icons;\n}\n"],"names":[],"mappings":";;;;;AAiCA,MAAM,gBAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,MAAM,cAA4C,uBAAO,IAAI,WAAW;AAExE,SAAS,mBAAmB,SAAiD;AAClF,QAAM,aAAa,SAAS,mBAAmB,CAAA;AAC/C,SAAO;AAAA,IACL,iBAAiB;AAAA,MACf,GAAG,OAAO;AAAA,QACR;AAAA,UACE,GAAG;AAAA,UACH,GAAG;AAAA,QAAA,EACH,IAAI,CAAC,EAAE,YAAY,WAAW,CAAC,MAAM,UAAU,CAAC;AAAA,MAAA;AAAA,IACpD;AAAA,EACF;AAEJ;AAEO,SAAS,WAA2B;AACzC,QAAM,QAAQ,OAAO,WAAW;AAChC,SAAO,OAAO,gCAAgC;AAC9C,SAAO;AACT;"}
1
+ {"version":3,"file":"icons.js","sources":["../../src/composables/icons.ts"],"sourcesContent":["import type { InjectionKey } from 'vue';\nimport type { GeneratedIcon } from '@/types/icons';\nimport {\n LuArrowDown,\n LuArrowLeft,\n LuArrowRight,\n LuArrowUp,\n LuCheck,\n LuCheckboxBlank,\n LuCheckboxBlankCircle,\n LuCheckboxBlankCircleFill,\n LuCheckboxFill,\n LuCheckboxIndeterminateFill,\n LuChevronDown,\n LuChevronLeft,\n LuChevronRight,\n LuChevronsLeft,\n LuChevronsRight,\n LuChevronsUpDown,\n LuChevronUp,\n LuCircleAlert,\n LuCircleCheck,\n LuCircleX,\n LuClock,\n LuEllipsis,\n LuEye,\n LuEyeOff,\n LuInfo,\n LuRadioButtonFill,\n LuTriangleAlert,\n LuX,\n} from '@/icons';\nimport { assert } from '@/utils/assert';\n\nconst requiredIcons: GeneratedIcon[] = [\n LuChevronsUpDown,\n LuEllipsis,\n LuTriangleAlert,\n LuX,\n LuInfo,\n LuArrowUp,\n LuArrowDown,\n LuArrowLeft,\n LuArrowRight,\n LuChevronUp,\n LuChevronDown,\n LuChevronLeft,\n LuChevronRight,\n LuChevronsLeft,\n LuChevronsRight,\n LuCircleAlert,\n LuEye,\n LuEyeOff,\n LuCheck,\n LuCircleX,\n LuCircleCheck,\n LuCheckboxBlank,\n LuCheckboxFill,\n LuCheckboxIndeterminateFill,\n LuCheckboxBlankCircle,\n LuCheckboxBlankCircleFill,\n LuRadioButtonFill,\n LuClock,\n];\n\nexport interface IconsOptions {\n registeredIcons: GeneratedIcon[];\n}\n\nexport interface UseIconsReturn {\n registeredIcons: Readonly<Record<string, [string, Record<string, string>][]>>;\n}\n\nexport const IconsSymbol: InjectionKey<UseIconsReturn> = Symbol.for('rui:icons');\n\nexport function createIconDefaults(options?: Partial<IconsOptions>): UseIconsReturn {\n const iconsToAdd = options?.registeredIcons || [];\n return {\n registeredIcons: {\n ...Object.fromEntries(\n [\n ...requiredIcons,\n ...iconsToAdd,\n ].map(({ components, name }) => [name, components]),\n ),\n },\n };\n}\n\nexport function useIcons(): UseIconsReturn {\n const icons = inject(IconsSymbol);\n assert(icons, 'Could not find icons injection');\n return icons;\n}\n"],"names":[],"mappings":";;;;;AAkCA,MAAM,gBAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,MAAM,cAA4C,uBAAO,IAAI,WAAW;AAExE,SAAS,mBAAmB,SAAiD;AAClF,QAAM,aAAa,SAAS,mBAAmB,CAAA;AAC/C,SAAO;AAAA,IACL,iBAAiB;AAAA,MACf,GAAG,OAAO;AAAA,QACR;AAAA,UACE,GAAG;AAAA,UACH,GAAG;AAAA,QAAA,EACH,IAAI,CAAC,EAAE,YAAY,WAAW,CAAC,MAAM,UAAU,CAAC;AAAA,MAAA;AAAA,IACpD;AAAA,EACF;AAEJ;AAEO,SAAS,WAA2B;AACzC,QAAM,QAAQ,OAAO,WAAW;AAChC,SAAO,OAAO,gCAAgC;AAC9C,SAAO;AACT;"}
@@ -1,6 +1,6 @@
1
1
  import { createPopper } from "@popperjs/core";
2
2
  import { useResizeObserver, isDefined, unrefElement } from "@vueuse/core";
3
- import { ref, computed, onMounted, watchEffect } from "vue";
3
+ import { ref, shallowRef, computed, onMounted, watchEffect } from "vue";
4
4
  import { useTimeoutManager } from "./timeout-manager.js";
5
5
  import { get, set } from "@vueuse/shared";
6
6
  const DEFAULT_POPPER_OPTIONS = {
@@ -15,13 +15,13 @@ const DEFAULT_POPPER_OPTIONS = {
15
15
  scroll: true,
16
16
  strategy: "absolute"
17
17
  };
18
- function usePopper(options, disabled = ref(false), openDelay = ref(0), closeDelay = ref(0), virtualReference) {
19
- const reference = ref(void 0);
20
- const popper = ref(void 0);
21
- const instance = ref(void 0);
22
- const open = ref(false);
23
- const popperEnter = ref(false);
24
- const leavePending = ref(false);
18
+ function usePopper(options, disabled = shallowRef(false), openDelay = shallowRef(0), closeDelay = shallowRef(0), virtualReference) {
19
+ const reference = ref();
20
+ const popper = ref();
21
+ const instance = ref();
22
+ const open = shallowRef(false);
23
+ const popperEnter = shallowRef(false);
24
+ const leavePending = shallowRef(false);
25
25
  const openTimeoutManager = useTimeoutManager();
26
26
  const closeTimeoutManager = useTimeoutManager();
27
27
  const onPopperLeave = () => {
@@ -37,9 +37,12 @@ function usePopper(options, disabled = ref(false), openDelay = ref(0), closeDela
37
37
  set(leavePending, false);
38
38
  if (!openTimeoutManager.isActive()) {
39
39
  set(popperEnter, true);
40
- openTimeoutManager.create(() => {
41
- set(open, true);
42
- }, immediate ? 0 : get(openDelay));
40
+ openTimeoutManager.create(
41
+ () => {
42
+ set(open, true);
43
+ },
44
+ immediate ? 0 : get(openDelay)
45
+ );
43
46
  }
44
47
  };
45
48
  const onClose = (immediate = false) => {
@@ -47,11 +50,14 @@ function usePopper(options, disabled = ref(false), openDelay = ref(0), closeDela
47
50
  return;
48
51
  openTimeoutManager.clear();
49
52
  if (!closeTimeoutManager.isActive()) {
50
- closeTimeoutManager.create(() => {
51
- if (!get(open))
52
- onPopperLeave();
53
- set(open, false);
54
- }, immediate ? 0 : get(closeDelay));
53
+ closeTimeoutManager.create(
54
+ () => {
55
+ if (!get(open))
56
+ onPopperLeave();
57
+ set(open, false);
58
+ },
59
+ immediate ? 0 : get(closeDelay)
60
+ );
55
61
  }
56
62
  };
57
63
  const onLeavePending = () => {
@@ -68,40 +74,48 @@ function usePopper(options, disabled = ref(false), openDelay = ref(0), closeDela
68
74
  resize = DEFAULT_POPPER_OPTIONS.resize,
69
75
  scroll = DEFAULT_POPPER_OPTIONS.scroll
70
76
  } = get(options);
71
- return [{
72
- enabled: false,
73
- name: "hide"
74
- }, {
75
- enabled: !locked,
76
- name: "flip"
77
- }, {
78
- name: "preventOverflow",
79
- options: {
80
- padding: overflowPadding
77
+ return [
78
+ {
79
+ enabled: false,
80
+ name: "hide"
81
+ },
82
+ {
83
+ enabled: !locked,
84
+ name: "flip"
85
+ },
86
+ {
87
+ name: "preventOverflow",
88
+ options: {
89
+ padding: overflowPadding
90
+ }
91
+ },
92
+ {
93
+ name: "offset",
94
+ options: {
95
+ offset: [offsetSkid, offsetDistance]
96
+ }
97
+ },
98
+ {
99
+ name: "computeStyles",
100
+ options: {
101
+ adaptive,
102
+ gpuAcceleration
103
+ }
104
+ },
105
+ {
106
+ name: "eventListeners",
107
+ options: {
108
+ resize,
109
+ scroll
110
+ }
111
+ },
112
+ {
113
+ name: "arrow",
114
+ options: {
115
+ padding: 4
116
+ }
81
117
  }
82
- }, {
83
- name: "offset",
84
- options: {
85
- offset: [offsetSkid, offsetDistance]
86
- }
87
- }, {
88
- name: "computeStyles",
89
- options: {
90
- adaptive,
91
- gpuAcceleration
92
- }
93
- }, {
94
- name: "eventListeners",
95
- options: {
96
- resize,
97
- scroll
98
- }
99
- }, {
100
- name: "arrow",
101
- options: {
102
- padding: 4
103
- }
104
- }];
118
+ ];
105
119
  });
106
120
  const popperConfig = computed(() => {
107
121
  const {
@@ -1 +1 @@
1
- {"version":3,"file":"popper.js","sources":["../../src/composables/popper.ts"],"sourcesContent":["import { createPopper, type Instance, type Placement, type PositioningStrategy, type VirtualElement } from '@popperjs/core';\nimport { type MaybeElement, unrefElement } from '@vueuse/core';\nimport { onMounted, type Ref, ref, watchEffect } from 'vue';\nimport { useTimeoutManager } from './timeout-manager';\n\nexport interface PopperOptions {\n locked?: boolean;\n overflowPadding?: number;\n offsetDistance?: number;\n offsetSkid?: number;\n placement?: Placement;\n strategy?: PositioningStrategy;\n gpuAcceleration?: boolean;\n adaptive?: boolean;\n scroll?: boolean;\n resize?: boolean;\n}\n\nexport const DEFAULT_POPPER_OPTIONS: PopperOptions = {\n adaptive: true,\n gpuAcceleration: true,\n locked: false,\n offsetDistance: 8,\n offsetSkid: 0,\n overflowPadding: 8,\n placement: 'bottom',\n resize: true,\n scroll: true,\n strategy: 'absolute',\n};\n\ninterface UsePopperReturn {\n instance: Ref<Instance | undefined>;\n leavePending: Ref<boolean>;\n onClose: (immediate?: boolean) => void;\n onLeavePending: () => void;\n onOpen: (immediate?: boolean) => void;\n onPopperLeave: () => void;\n open: Ref<boolean, boolean>;\n popper: Ref<MaybeElement>;\n popperEnter: Ref<boolean>;\n reference: Ref<HTMLElement | undefined>;\n updatePopper: () => Promise<void>;\n}\n\nexport function usePopper(\n options: Ref<PopperOptions>,\n disabled: Ref<boolean> = ref(false),\n openDelay: Ref<number> = ref(0),\n closeDelay: Ref<number> = ref(0),\n virtualReference?: Ref<Element | VirtualElement>,\n): UsePopperReturn {\n const reference = ref<HTMLElement | undefined>(undefined);\n const popper = ref<MaybeElement | undefined>(undefined);\n const instance = ref<Instance | undefined>(undefined);\n const open = ref<boolean>(false);\n const popperEnter = ref<boolean>(false);\n const leavePending = ref<boolean>(false);\n\n const openTimeoutManager = useTimeoutManager();\n const closeTimeoutManager = useTimeoutManager();\n\n const onPopperLeave = () => {\n set(popperEnter, false);\n };\n\n const updatePopper = async (): Promise<void> => {\n await get(instance)?.update();\n };\n\n const onOpen = (immediate = false) => {\n if (get(disabled))\n return;\n\n closeTimeoutManager.clear();\n\n set(leavePending, false);\n if (!openTimeoutManager.isActive()) {\n set(popperEnter, true);\n\n openTimeoutManager.create(() => {\n set(open, true);\n }, immediate ? 0 : get(openDelay));\n }\n };\n\n const onClose = (immediate = false) => {\n if (get(disabled))\n return;\n\n openTimeoutManager.clear();\n\n if (!closeTimeoutManager.isActive()) {\n closeTimeoutManager.create(() => {\n if (!get(open))\n onPopperLeave();\n\n set(open, false);\n }, immediate ? 0 : get(closeDelay));\n }\n };\n\n const onLeavePending = () => {\n set(leavePending, true);\n };\n\n const modifiers = computed(() => {\n const {\n adaptive = DEFAULT_POPPER_OPTIONS.adaptive,\n gpuAcceleration = DEFAULT_POPPER_OPTIONS.gpuAcceleration,\n locked = DEFAULT_POPPER_OPTIONS.locked,\n offsetDistance = DEFAULT_POPPER_OPTIONS.offsetDistance,\n offsetSkid = DEFAULT_POPPER_OPTIONS.offsetSkid,\n overflowPadding = DEFAULT_POPPER_OPTIONS.overflowPadding,\n resize = DEFAULT_POPPER_OPTIONS.resize,\n scroll = DEFAULT_POPPER_OPTIONS.scroll,\n } = get(options);\n\n return [{\n enabled: false,\n name: 'hide',\n }, {\n enabled: !locked,\n name: 'flip',\n }, {\n name: 'preventOverflow',\n options: {\n padding: overflowPadding,\n },\n }, {\n name: 'offset',\n options: {\n offset: [offsetSkid, offsetDistance],\n },\n }, {\n name: 'computeStyles',\n options: {\n adaptive,\n gpuAcceleration,\n },\n }, {\n name: 'eventListeners',\n options: {\n resize,\n scroll,\n },\n }, {\n name: 'arrow',\n options: {\n padding: 4,\n },\n }];\n });\n\n const popperConfig = computed(() => {\n const {\n placement = DEFAULT_POPPER_OPTIONS.placement,\n strategy = DEFAULT_POPPER_OPTIONS.strategy,\n } = get(options);\n\n return {\n modifiers: get(modifiers),\n placement,\n strategy,\n };\n });\n\n function getValidElements(): { popperEl: HTMLElement; referenceEl: Element | VirtualElement } | null {\n if (!get(popper) || (!get(reference) && !get(virtualReference))) {\n return null;\n }\n\n const popperEl = unrefElement(popper);\n const referenceEl = get(virtualReference) || unrefElement(reference);\n\n if (!(popperEl instanceof HTMLElement) || !referenceEl) {\n return null;\n }\n\n return { popperEl, referenceEl };\n }\n\n function initializePopper(onInvalidate: (cleanupFn: () => void) => void) {\n const elements = getValidElements();\n if (!elements)\n return;\n\n const { popperEl, referenceEl } = elements;\n\n const value = createPopper(referenceEl, popperEl, get(popperConfig));\n\n set(instance, value);\n onInvalidate(value.destroy);\n }\n\n useResizeObserver([reference, popper], async () => {\n if (isDefined(instance))\n await get(instance).update();\n });\n\n onMounted(() => {\n watchEffect((onInvalidate) => {\n initializePopper(onInvalidate);\n });\n });\n\n return {\n instance,\n leavePending,\n onClose,\n onLeavePending,\n onOpen,\n onPopperLeave,\n open,\n popper,\n popperEnter,\n reference,\n updatePopper,\n };\n}\n"],"names":[],"mappings":";;;;;AAkBO,MAAM,yBAAwC;AAAA,EACnD,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AACZ;AAgBO,SAAS,UACd,SACA,WAAyB,IAAI,KAAK,GAClC,YAAyB,IAAI,CAAC,GAC9B,aAA0B,IAAI,CAAC,GAC/B,kBACiB;AACjB,QAAM,YAAY,IAA6B,MAAS;AACxD,QAAM,SAAS,IAA8B,MAAS;AACtD,QAAM,WAAW,IAA0B,MAAS;AACpD,QAAM,OAAO,IAAa,KAAK;AAC/B,QAAM,cAAc,IAAa,KAAK;AACtC,QAAM,eAAe,IAAa,KAAK;AAEvC,QAAM,qBAAqB,kBAAA;AAC3B,QAAM,sBAAsB,kBAAA;AAE5B,QAAM,gBAAgB,MAAM;AAC1B,QAAI,aAAa,KAAK;AAAA,EACxB;AAEA,QAAM,eAAe,YAA2B;AAC9C,UAAM,IAAI,QAAQ,GAAG,OAAA;AAAA,EACvB;AAEA,QAAM,SAAS,CAAC,YAAY,UAAU;AACpC,QAAI,IAAI,QAAQ;AACd;AAEF,wBAAoB,MAAA;AAEpB,QAAI,cAAc,KAAK;AACvB,QAAI,CAAC,mBAAmB,YAAY;AAClC,UAAI,aAAa,IAAI;AAErB,yBAAmB,OAAO,MAAM;AAC9B,YAAI,MAAM,IAAI;AAAA,MAChB,GAAG,YAAY,IAAI,IAAI,SAAS,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,YAAY,UAAU;AACrC,QAAI,IAAI,QAAQ;AACd;AAEF,uBAAmB,MAAA;AAEnB,QAAI,CAAC,oBAAoB,YAAY;AACnC,0BAAoB,OAAO,MAAM;AAC/B,YAAI,CAAC,IAAI,IAAI;AACX,wBAAA;AAEF,YAAI,MAAM,KAAK;AAAA,MACjB,GAAG,YAAY,IAAI,IAAI,UAAU,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,QAAI,cAAc,IAAI;AAAA,EACxB;AAEA,QAAM,YAAY,SAAS,MAAM;AAC/B,UAAM;AAAA,MACJ,WAAW,uBAAuB;AAAA,MAClC,kBAAkB,uBAAuB;AAAA,MACzC,SAAS,uBAAuB;AAAA,MAChC,iBAAiB,uBAAuB;AAAA,MACxC,aAAa,uBAAuB;AAAA,MACpC,kBAAkB,uBAAuB;AAAA,MACzC,SAAS,uBAAuB;AAAA,MAChC,SAAS,uBAAuB;AAAA,IAAA,IAC9B,IAAI,OAAO;AAEf,WAAO,CAAC;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IAAA,GACL;AAAA,MACD,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,IAAA,GACL;AAAA,MACD,MAAM;AAAA,MACN,SAAS;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,IACX,GACC;AAAA,MACD,MAAM;AAAA,MACN,SAAS;AAAA,QACP,QAAQ,CAAC,YAAY,cAAc;AAAA,MAAA;AAAA,IACrC,GACC;AAAA,MACD,MAAM;AAAA,MACN,SAAS;AAAA,QACP;AAAA,QACA;AAAA,MAAA;AAAA,IACF,GACC;AAAA,MACD,MAAM;AAAA,MACN,SAAS;AAAA,QACP;AAAA,QACA;AAAA,MAAA;AAAA,IACF,GACC;AAAA,MACD,MAAM;AAAA,MACN,SAAS;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,IACX,CACD;AAAA,EACH,CAAC;AAED,QAAM,eAAe,SAAS,MAAM;AAClC,UAAM;AAAA,MACJ,YAAY,uBAAuB;AAAA,MACnC,WAAW,uBAAuB;AAAA,IAAA,IAChC,IAAI,OAAO;AAEf,WAAO;AAAA,MACL,WAAW,IAAI,SAAS;AAAA,MACxB;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ,CAAC;AAED,WAAS,mBAA4F;AACnG,QAAI,CAAC,IAAI,MAAM,KAAM,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,gBAAgB,GAAI;AAC/D,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,aAAa,MAAM;AACpC,UAAM,cAAc,IAAI,gBAAgB,KAAK,aAAa,SAAS;AAEnE,QAAI,EAAE,oBAAoB,gBAAgB,CAAC,aAAa;AACtD,aAAO;AAAA,IACT;AAEA,WAAO,EAAE,UAAU,YAAA;AAAA,EACrB;AAEA,WAAS,iBAAiB,cAA+C;AACvE,UAAM,WAAW,iBAAA;AACjB,QAAI,CAAC;AACH;AAEF,UAAM,EAAE,UAAU,YAAA,IAAgB;AAElC,UAAM,QAAQ,aAAa,aAAa,UAAU,IAAI,YAAY,CAAC;AAEnE,QAAI,UAAU,KAAK;AACnB,iBAAa,MAAM,OAAO;AAAA,EAC5B;AAEA,oBAAkB,CAAC,WAAW,MAAM,GAAG,YAAY;AACjD,QAAI,UAAU,QAAQ;AACpB,YAAM,IAAI,QAAQ,EAAE,OAAA;AAAA,EACxB,CAAC;AAED,YAAU,MAAM;AACd,gBAAY,CAAC,iBAAiB;AAC5B,uBAAiB,YAAY;AAAA,IAC/B,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"popper.js","sources":["../../src/composables/popper.ts"],"sourcesContent":["import {\n createPopper,\n type Instance,\n type Placement,\n type PositioningStrategy,\n type StrictModifiers,\n type VirtualElement,\n} from '@popperjs/core';\nimport { type MaybeElement, unrefElement } from '@vueuse/core';\nimport { onMounted, type Ref, ref, watchEffect } from 'vue';\nimport { useTimeoutManager } from './timeout-manager';\n\nexport interface PopperOptions {\n locked?: boolean;\n overflowPadding?: number;\n offsetDistance?: number;\n offsetSkid?: number;\n placement?: Placement;\n strategy?: PositioningStrategy;\n gpuAcceleration?: boolean;\n adaptive?: boolean;\n scroll?: boolean;\n resize?: boolean;\n}\n\nexport const DEFAULT_POPPER_OPTIONS: PopperOptions = {\n adaptive: true,\n gpuAcceleration: true,\n locked: false,\n offsetDistance: 8,\n offsetSkid: 0,\n overflowPadding: 8,\n placement: 'bottom',\n resize: true,\n scroll: true,\n strategy: 'absolute',\n};\n\ninterface UsePopperReturn {\n instance: Ref<Instance | undefined>;\n leavePending: Ref<boolean>;\n onClose: (immediate?: boolean) => void;\n onLeavePending: () => void;\n onOpen: (immediate?: boolean) => void;\n onPopperLeave: () => void;\n open: Ref<boolean, boolean>;\n popper: Ref<MaybeElement>;\n popperEnter: Ref<boolean>;\n reference: Ref<HTMLElement | undefined>;\n updatePopper: () => Promise<void>;\n}\n\nexport function usePopper(\n options: Ref<PopperOptions>,\n disabled: Ref<boolean> = shallowRef(false),\n openDelay: Ref<number> = shallowRef(0),\n closeDelay: Ref<number> = shallowRef(0),\n virtualReference?: Ref<Element | VirtualElement>,\n): UsePopperReturn {\n const reference = ref<HTMLElement>();\n const popper = ref<MaybeElement>();\n const instance = ref<Instance>();\n const open = shallowRef<boolean>(false);\n const popperEnter = shallowRef<boolean>(false);\n const leavePending = shallowRef<boolean>(false);\n\n const openTimeoutManager = useTimeoutManager();\n const closeTimeoutManager = useTimeoutManager();\n\n const onPopperLeave = (): void => {\n set(popperEnter, false);\n };\n\n const updatePopper = async (): Promise<void> => {\n await get(instance)?.update();\n };\n\n const onOpen = (immediate: boolean = false): void => {\n if (get(disabled))\n return;\n\n closeTimeoutManager.clear();\n\n set(leavePending, false);\n if (!openTimeoutManager.isActive()) {\n set(popperEnter, true);\n\n openTimeoutManager.create(\n () => {\n set(open, true);\n },\n immediate ? 0 : get(openDelay),\n );\n }\n };\n\n const onClose = (immediate: boolean = false): void => {\n if (get(disabled))\n return;\n\n openTimeoutManager.clear();\n\n if (!closeTimeoutManager.isActive()) {\n closeTimeoutManager.create(\n () => {\n if (!get(open))\n onPopperLeave();\n\n set(open, false);\n },\n immediate ? 0 : get(closeDelay),\n );\n }\n };\n\n const onLeavePending = (): void => {\n set(leavePending, true);\n };\n\n const modifiers = computed<StrictModifiers[]>(() => {\n const {\n adaptive = DEFAULT_POPPER_OPTIONS.adaptive,\n gpuAcceleration = DEFAULT_POPPER_OPTIONS.gpuAcceleration,\n locked = DEFAULT_POPPER_OPTIONS.locked,\n offsetDistance = DEFAULT_POPPER_OPTIONS.offsetDistance,\n offsetSkid = DEFAULT_POPPER_OPTIONS.offsetSkid,\n overflowPadding = DEFAULT_POPPER_OPTIONS.overflowPadding,\n resize = DEFAULT_POPPER_OPTIONS.resize,\n scroll = DEFAULT_POPPER_OPTIONS.scroll,\n } = get(options);\n\n return [\n {\n enabled: false,\n name: 'hide',\n },\n {\n enabled: !locked,\n name: 'flip',\n },\n {\n name: 'preventOverflow',\n options: {\n padding: overflowPadding,\n },\n },\n {\n name: 'offset',\n options: {\n offset: [offsetSkid, offsetDistance],\n },\n },\n {\n name: 'computeStyles',\n options: {\n adaptive,\n gpuAcceleration,\n },\n },\n {\n name: 'eventListeners',\n options: {\n resize,\n scroll,\n },\n },\n {\n name: 'arrow',\n options: {\n padding: 4,\n },\n },\n ];\n });\n\n const popperConfig = computed<{\n modifiers: StrictModifiers[];\n placement: Placement | undefined;\n strategy: PositioningStrategy | undefined;\n }>(() => {\n const {\n placement = DEFAULT_POPPER_OPTIONS.placement,\n strategy = DEFAULT_POPPER_OPTIONS.strategy,\n } = get(options);\n\n return {\n modifiers: get(modifiers),\n placement,\n strategy,\n };\n });\n\n function getValidElements(): {\n popperEl: HTMLElement;\n referenceEl: Element | VirtualElement;\n } | null {\n if (!get(popper) || (!get(reference) && !get(virtualReference))) {\n return null;\n }\n\n const popperEl = unrefElement(popper);\n const referenceEl = get(virtualReference) || unrefElement(reference);\n\n if (!(popperEl instanceof HTMLElement) || !referenceEl) {\n return null;\n }\n\n return { popperEl, referenceEl };\n }\n\n function initializePopper(onInvalidate: (cleanupFn: () => void) => void): void {\n const elements = getValidElements();\n if (!elements)\n return;\n\n const { popperEl, referenceEl } = elements;\n\n const value = createPopper(referenceEl, popperEl, get(popperConfig));\n\n set(instance, value);\n onInvalidate(value.destroy);\n }\n\n useResizeObserver([reference, popper], async () => {\n if (isDefined(instance))\n await get(instance).update();\n });\n\n onMounted(() => {\n watchEffect((onInvalidate) => {\n initializePopper(onInvalidate);\n });\n });\n\n return {\n instance,\n leavePending,\n onClose,\n onLeavePending,\n onOpen,\n onPopperLeave,\n open,\n popper,\n popperEnter,\n reference,\n updatePopper,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
- import type { MaybeRef } from 'vue';
1
+ import type { MaybeRef, ShallowRef } from 'vue';
2
+ export interface UseStickyTableHeaderRefs {
3
+ table: Readonly<ShallowRef<HTMLTableElement | null>>;
4
+ tableScroller: Readonly<ShallowRef<HTMLElement | null>>;
5
+ }
2
6
  /**
3
7
  * Setup sticky table header
4
8
  */
5
- export declare function useStickyTableHeader(sticky?: MaybeRef<boolean>, offsetTop?: MaybeRef<number>): {
6
- stick: globalThis.Ref<boolean, boolean>;
7
- table: globalThis.Ref<HTMLTableElement | null, HTMLTableElement | null>;
8
- tableScroller: globalThis.Ref<HTMLElement | null, HTMLElement | null>;
9
+ export declare function useStickyTableHeader(sticky: MaybeRef<boolean> | undefined, offsetTop: MaybeRef<number | undefined>, refs: UseStickyTableHeaderRefs): {
10
+ stick: ShallowRef<boolean>;
9
11
  };
@@ -1,11 +1,10 @@
1
1
  import { assert } from "../utils/assert.js";
2
- import { ref, onMounted } from "vue";
2
+ import { shallowRef, onMounted } from "vue";
3
3
  import { get, set } from "@vueuse/shared";
4
4
  import { useEventListener, useMutationObserver, useResizeObserver } from "@vueuse/core";
5
- function useStickyTableHeader(sticky = ref(false), offsetTop) {
6
- const table = ref(null);
7
- const tableScroller = ref(null);
8
- const stick = ref(false);
5
+ function useStickyTableHeader(sticky = shallowRef(false), offsetTop, refs) {
6
+ const { table, tableScroller } = refs;
7
+ const stick = shallowRef(false);
9
8
  const borderPrecision = -0.5;
10
9
  const selectors = {
11
10
  head: ":scope > thead[data-id=head-main]",
@@ -17,17 +16,18 @@ function useStickyTableHeader(sticky = ref(false), offsetTop) {
17
16
  const root = get(table);
18
17
  if (!get(sticky) || !root)
19
18
  return;
20
- const theadClone = root.querySelector(
21
- `${selectors.headClone} > tr`
22
- );
23
- const head = root.querySelector(`${selectors.head} > tr`) ?? null;
19
+ const theadClone = root.querySelector(`${selectors.headClone} > tr`);
20
+ const head = root.querySelector(`${selectors.head} > tr`);
21
+ let resizeCleanups = [];
24
22
  const observeChildTh = () => {
25
- const columns = head?.querySelectorAll(
23
+ resizeCleanups.forEach((cleanup) => cleanup());
24
+ resizeCleanups = [];
25
+ const columns = head?.querySelectorAll(selectors.th);
26
+ const clonedColumns = theadClone?.querySelectorAll(
26
27
  selectors.th
27
28
  );
28
- const clonedColumns = theadClone?.querySelectorAll(selectors.th);
29
29
  clonedColumns?.forEach((th, i) => {
30
- useResizeObserver(th, (entries) => {
30
+ const { stop } = useResizeObserver(th, (entries) => {
31
31
  const entry = entries[0];
32
32
  assert(entry);
33
33
  const cellRect = entry.target.getBoundingClientRect();
@@ -35,18 +35,23 @@ function useStickyTableHeader(sticky = ref(false), offsetTop) {
35
35
  if (column)
36
36
  column.style.width = `${cellRect.width}px`;
37
37
  });
38
+ resizeCleanups.push(stop);
38
39
  });
39
40
  };
40
- useMutationObserver(theadClone, (mutationsList) => {
41
- for (const mutation of mutationsList) {
42
- if (mutation.type === "childList" || mutation.type === "attributes")
43
- observeChildTh();
41
+ useMutationObserver(
42
+ theadClone,
43
+ (mutationsList) => {
44
+ for (const mutation of mutationsList) {
45
+ if (mutation.type === "childList" || mutation.type === "attributes")
46
+ observeChildTh();
47
+ }
48
+ },
49
+ {
50
+ attributes: true,
51
+ childList: true,
52
+ subtree: true
44
53
  }
45
- }, {
46
- attributes: true,
47
- childList: true,
48
- subtree: true
49
- });
54
+ );
50
55
  observeChildTh();
51
56
  };
52
57
  const toggleStickyClass = () => {
@@ -54,49 +59,54 @@ function useStickyTableHeader(sticky = ref(false), offsetTop) {
54
59
  if (!get(sticky) || !root)
55
60
  return;
56
61
  const rect = root.getBoundingClientRect();
57
- const theadClone = root.querySelector(
58
- selectors.headClone
59
- );
62
+ const theadClone = root.querySelector(selectors.headClone);
60
63
  const clonedRect = theadClone?.getBoundingClientRect();
61
- const head = root.querySelector(selectors.head) ?? null;
62
- const headRect = head?.getBoundingClientRect();
63
- if (!rect || !clonedRect || !head || !theadClone || !headRect)
64
+ const head = root.querySelector(selectors.head);
65
+ if (!clonedRect || !head || !theadClone)
64
66
  return;
65
- const {
66
- height: theadHeight,
67
- left: theadLeft,
68
- width: theadWidth
69
- } = clonedRect;
67
+ const { height: theadHeight, left: theadLeft, width: theadWidth } = clonedRect;
70
68
  const { bottom: tableBottom, top: tableTop } = rect;
71
69
  const top = get(offsetTop) ?? 0;
72
70
  head.style.width = `${theadWidth}px`;
73
71
  const rows = root.querySelectorAll(selectors.row);
72
+ if (rows.length <= 1) {
73
+ set(stick, false);
74
+ head.style.left = `${borderPrecision}px`;
75
+ head.style.top = "0";
76
+ return;
77
+ }
74
78
  const lastRowRect = rows.item(rows.length - 1)?.getBoundingClientRect();
75
- if (tableTop <= top && tableBottom > top && rows.length > 1) {
79
+ if (tableTop <= top && tableBottom > top) {
76
80
  set(stick, true);
77
81
  head.style.left = `${theadLeft + borderPrecision}px`;
78
82
  const lastRowHeight = lastRowRect?.height ?? 0;
79
83
  if (tableBottom <= lastRowHeight + theadHeight + top)
80
84
  head.style.top = `${tableBottom - lastRowHeight - theadHeight}px`;
81
- else
82
- head.style.top = `${top}px`;
85
+ else head.style.top = `${top}px`;
83
86
  } else {
84
87
  set(stick, false);
85
88
  head.style.left = `${borderPrecision}px`;
86
89
  head.style.top = "0";
87
90
  }
88
91
  };
92
+ let rafId = null;
93
+ function throttledToggleStickyClass() {
94
+ if (rafId !== null)
95
+ return;
96
+ rafId = requestAnimationFrame(() => {
97
+ toggleStickyClass();
98
+ rafId = null;
99
+ });
100
+ }
89
101
  onMounted(() => {
90
102
  toggleStickyClass();
91
- useEventListener(tableScroller, "scroll", toggleStickyClass);
92
- useEventListener(document.body, "scroll", toggleStickyClass);
93
- useEventListener(window, "resize", toggleStickyClass);
103
+ useEventListener(tableScroller, "scroll", throttledToggleStickyClass);
104
+ useEventListener(document.body, "scroll", throttledToggleStickyClass);
105
+ useEventListener(window, "resize", throttledToggleStickyClass);
94
106
  watchCellWidth();
95
107
  });
96
108
  return {
97
- stick,
98
- table,
99
- tableScroller
109
+ stick
100
110
  };
101
111
  }
102
112
  export {