@rotki/ui-library 2.27.0 → 3.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +36 -15
  2. package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
  3. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +0 -4
  4. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +9 -10
  5. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  6. package/dist/components/accordions/accordions/RuiAccordions.js.map +1 -1
  7. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js +16 -3
  8. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/alerts/RuiAlert.js.map +1 -1
  10. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js +43 -212
  11. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/avatars/RuiAvatar.js.map +1 -1
  13. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +22 -32
  14. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  15. package/dist/components/avatars/RuiAvatarGroup.js.map +1 -1
  16. package/dist/components/avatars/RuiAvatarGroup.vue.d.ts +6 -0
  17. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js +17 -13
  18. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/avatars/avatar-props.d.ts +16 -3
  20. package/dist/components/avatars/avatar-props.js +42 -5
  21. package/dist/components/avatars/avatar-props.js.map +1 -1
  22. package/dist/components/buttons/button/RuiButton.js.map +1 -1
  23. package/dist/components/buttons/button/RuiButton.vue.d.ts +0 -1
  24. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js +39 -26
  25. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/components/buttons/button/button-props.d.ts +0 -2
  27. package/dist/components/buttons/button/button-props.js +5 -5
  28. package/dist/components/buttons/button/button-props.js.map +1 -1
  29. package/dist/components/buttons/button/button-styles.d.ts +4 -1
  30. package/dist/components/buttons/button/button-styles.js +136 -55
  31. package/dist/components/buttons/button/button-styles.js.map +1 -1
  32. package/dist/components/buttons/button-group/RuiButtonGroup.js.map +1 -1
  33. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +8 -2
  34. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +66 -97
  35. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/components/buttons/button-group/button-group-context.d.ts +28 -0
  37. package/dist/components/buttons/button-group/button-group-context.js +22 -0
  38. package/dist/components/buttons/button-group/button-group-context.js.map +1 -0
  39. package/dist/components/calendar/RuiCalendar.js.map +1 -1
  40. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +6 -3
  41. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
  43. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +12 -8
  44. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/calendar/RuiCalendarHeader.js.map +1 -1
  46. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js +21 -22
  47. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
  49. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +17 -21
  50. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/components/cards/RuiCard.js.map +1 -1
  52. package/dist/components/cards/RuiCard.vue.d.ts +0 -3
  53. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +31 -19
  54. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  55. package/dist/components/cards/RuiCardHeader.js.map +1 -1
  56. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js +13 -25
  57. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/chips/RuiChip.js.map +1 -1
  59. package/dist/components/chips/RuiChip.vue.d.ts +5 -2
  60. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +127 -78
  61. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  62. package/dist/components/chips/chip-props.d.ts +2 -0
  63. package/dist/components/chips/chip-props.js +5 -3
  64. package/dist/components/chips/chip-props.js.map +1 -1
  65. package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
  66. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +5 -5
  67. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js +1 -1
  69. package/dist/components/color-picker/RuiColorHue.js.map +1 -1
  70. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +2 -2
  71. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/color-picker/RuiColorInput.js.map +1 -1
  73. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js +46 -36
  74. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  75. package/dist/components/color-picker/RuiColorPicker.js.map +1 -1
  76. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js +4 -5
  77. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  78. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  79. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +3 -2
  80. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +81 -80
  81. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/date-time-picker/RuiDateTimePickerMenu.js.map +1 -1
  83. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js +2 -2
  84. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/components/date-time-picker/RuiTimezoneSelect.js.map +1 -1
  86. package/dist/components/date-time-picker/RuiTimezoneSelect.vue.d.ts +4 -3
  87. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js +3 -3
  88. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  89. package/dist/components/date-time-picker/date-time-picker-styles.d.ts +128 -219
  90. package/dist/components/date-time-picker/date-time-picker-styles.js +1 -2
  91. package/dist/components/date-time-picker/date-time-picker-styles.js.map +1 -1
  92. package/dist/components/date-time-picker/use-date-bounds.js +1 -1
  93. package/dist/components/date-time-picker/use-date-time-selection.js +65 -66
  94. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
  95. package/dist/components/date-time-picker/use-input-handler.js +1 -1
  96. package/dist/components/date-time-picker/use-keyboard-handler.js +29 -30
  97. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  98. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  99. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +1 -68
  100. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +203 -198
  101. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  102. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.js.map +1 -1
  103. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js +1 -0
  104. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js.map +1 -1
  106. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue.d.ts +2 -0
  107. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js +8 -3
  108. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js.map +1 -1
  110. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue.d.ts +4 -0
  111. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js +24 -10
  112. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js.map +1 -1
  113. package/dist/components/forms/auto-complete/auto-complete-props.d.ts +66 -0
  114. package/dist/components/forms/auto-complete/auto-complete-styles.d.ts +128 -218
  115. package/dist/components/forms/auto-complete/auto-complete-styles.js +4 -2
  116. package/dist/components/forms/auto-complete/auto-complete-styles.js.map +1 -1
  117. package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -1
  118. package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +3 -6
  119. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +154 -154
  120. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/components/forms/category-picker/category-picker-styles.d.ts +83 -232
  122. package/dist/components/forms/category-picker/category-picker-styles.js +20 -26
  123. package/dist/components/forms/category-picker/category-picker-styles.js.map +1 -1
  124. package/dist/components/forms/check-control-styles.d.ts +61 -2
  125. package/dist/components/forms/check-control-styles.js +53 -46
  126. package/dist/components/forms/check-control-styles.js.map +1 -1
  127. package/dist/components/forms/checkbox/RuiCheckbox.js.map +1 -1
  128. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js +32 -19
  129. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.js.map +1 -1
  131. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js +4 -4
  132. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  133. package/dist/components/forms/field-defaults/RuiFieldDefaults.js +7 -0
  134. package/dist/components/forms/field-defaults/RuiFieldDefaults.js.map +1 -0
  135. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue.d.ts +16 -0
  136. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js +18 -0
  137. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js.map +1 -0
  138. package/dist/components/forms/field-label/RuiFieldLabel.js +7 -0
  139. package/dist/components/forms/field-label/RuiFieldLabel.js.map +1 -0
  140. package/dist/components/forms/field-label/RuiFieldLabel.vue.d.ts +17 -0
  141. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js +57 -0
  142. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  143. package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -1
  144. package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +1 -1
  145. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +56 -35
  146. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  147. package/dist/components/forms/radio-button/radio/RuiRadio.js.map +1 -1
  148. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js +14 -15
  149. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  150. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.js.map +1 -1
  151. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js +3 -3
  152. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  153. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.js.map +1 -1
  154. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js +6 -6
  155. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  156. package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
  157. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +3 -12
  158. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +61 -56
  159. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  160. package/dist/components/forms/select/RuiSimpleSelect.js.map +1 -1
  161. package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +0 -1
  162. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js +13 -20
  163. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/components/forms/select/menu-select-styles.d.ts +99 -221
  165. package/dist/components/forms/select/menu-select-styles.js +1 -4
  166. package/dist/components/forms/select/menu-select-styles.js.map +1 -1
  167. package/dist/components/forms/slider/RuiSlider.js.map +1 -1
  168. package/dist/components/forms/slider/RuiSlider.vue.d.ts +0 -4
  169. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js +129 -106
  170. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/components/forms/slider/slider-styles.d.ts +40 -40
  172. package/dist/components/forms/slider/slider-styles.js +67 -109
  173. package/dist/components/forms/slider/slider-styles.js.map +1 -1
  174. package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
  175. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +33 -45
  176. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/components/forms/text-area/RuiTextArea.js.map +1 -1
  178. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +3 -2
  179. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js +138 -117
  180. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/components/forms/text-area/text-area-styles.d.ts +41 -115
  182. package/dist/components/forms/text-area/text-area-styles.js +34 -194
  183. package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
  184. package/dist/components/forms/text-field/RuiTextField.js.map +1 -1
  185. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +5 -2
  186. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js +112 -105
  187. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  188. package/dist/components/forms/text-field/text-field-styles.d.ts +37 -145
  189. package/dist/components/forms/text-field/text-field-styles.js +24 -267
  190. package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
  191. package/dist/components/forms/text-input-styles.d.ts +98 -229
  192. package/dist/components/forms/text-input-styles.js +63 -193
  193. package/dist/components/forms/text-input-styles.js.map +1 -1
  194. package/dist/components/helpers/RuiFormTextDetail.js.map +1 -1
  195. package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +11 -1
  196. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js +5 -5
  197. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/components/icons/RuiIcon.js.map +1 -1
  199. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +7 -4
  200. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  201. package/dist/components/index.d.ts +5 -3
  202. package/dist/components/index.js +4 -3
  203. package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
  204. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js +6 -5
  205. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  206. package/dist/components/loaders/RuiSkeletonLoader.js.map +1 -1
  207. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js +8 -8
  208. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  209. package/dist/components/logos/RuiLogo.js.map +1 -1
  210. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js +2 -2
  211. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js.map +1 -1
  212. package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
  213. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +76 -48
  214. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  215. package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
  216. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +3 -2
  217. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +17 -13
  218. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  219. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  220. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +9 -7
  221. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +33 -29
  222. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
  224. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +6 -2
  225. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js +49 -25
  226. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  227. package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
  228. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +7 -8
  229. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
  230. package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
  231. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +0 -5
  232. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +17 -11
  233. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  234. package/dist/components/overlays/tooltip/tooltip-styles.d.ts +5 -12
  235. package/dist/components/overlays/tooltip/tooltip-styles.js +11 -18
  236. package/dist/components/overlays/tooltip/tooltip-styles.js.map +1 -1
  237. package/dist/components/progress/RuiProgress.js.map +1 -1
  238. package/dist/components/progress/RuiProgress.vue.d.ts +4 -0
  239. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js +73 -47
  240. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/components/steppers/RuiFooterStepper.js.map +1 -1
  242. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +28 -29
  243. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  244. package/dist/components/steppers/RuiStepper.js.map +1 -1
  245. package/dist/components/steppers/RuiStepper.vue.d.ts +0 -4
  246. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +36 -29
  247. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  248. package/dist/components/steppers/RuiStepperIcon.js.map +1 -1
  249. package/dist/components/steppers/RuiStepperIcon.vue.d.ts +2 -0
  250. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js +47 -47
  251. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  252. package/dist/components/tables/RuiDataTable.js.map +1 -1
  253. package/dist/components/tables/RuiDataTable.vue.d.ts +3 -6
  254. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +85 -67
  255. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  256. package/dist/components/tables/RuiExpandButton.js.map +1 -1
  257. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js +1 -0
  258. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  259. package/dist/components/tables/RuiTable.js.map +1 -1
  260. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js +8 -5
  261. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  262. package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
  263. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +1 -1
  264. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  265. package/dist/components/tables/RuiTableHead.js.map +1 -1
  266. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +89 -67
  267. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  268. package/dist/components/tables/RuiTablePagination.js.map +1 -1
  269. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +9 -12
  270. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  271. package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js +1 -1
  272. package/dist/components/tables/data-table/RuiDataTableExpandedRow.js.map +1 -1
  273. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js +3 -3
  274. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  275. package/dist/components/tables/data-table/RuiDataTableGroupRow.js.map +1 -1
  276. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js +8 -4
  277. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  278. package/dist/components/tables/data-table/RuiDataTableMobileSort.js.map +1 -1
  279. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js +2 -2
  280. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
  281. package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -1
  282. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +47 -8
  283. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  284. package/dist/components/tables/data-table-styles.d.ts +24 -0
  285. package/dist/components/tables/data-table-styles.js +35 -20
  286. package/dist/components/tables/data-table-styles.js.map +1 -1
  287. package/dist/components/tables/table_no_data_placeholder.js +1 -1
  288. package/dist/components/tables/table_no_data_placeholder.js.map +1 -1
  289. package/dist/components/tables/table_no_data_placeholder_dark.js +1 -1
  290. package/dist/components/tables/table_no_data_placeholder_dark.js.map +1 -1
  291. package/dist/components/tables/use-pagination-navigation.js +1 -1
  292. package/dist/components/tabs/tab/RuiTab.js.map +1 -1
  293. package/dist/components/tabs/tab/RuiTab.vue.d.ts +2 -5
  294. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +95 -69
  295. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  296. package/dist/components/tabs/tab/use-tab-link.js +1 -1
  297. package/dist/components/tabs/tab-item/RuiTabItem.js.map +1 -1
  298. package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +0 -1
  299. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js +5 -11
  300. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  301. package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
  302. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +8 -13
  303. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
  304. package/dist/components/tabs/tab-props.d.ts +7 -1
  305. package/dist/components/tabs/tab-props.js +7 -1
  306. package/dist/components/tabs/tab-props.js.map +1 -1
  307. package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
  308. package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +2 -1
  309. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +188 -43
  310. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  311. package/dist/components/tabs/tabs/use-tab-indicator.d.ts +27 -0
  312. package/dist/components/tabs/tabs/use-tab-indicator.js +67 -0
  313. package/dist/components/tabs/tabs/use-tab-indicator.js.map +1 -0
  314. package/dist/components/tabs/tabs/use-tab-keyboard.d.ts +17 -0
  315. package/dist/components/tabs/tabs/use-tab-keyboard.js +57 -0
  316. package/dist/components/tabs/tabs/use-tab-keyboard.js.map +1 -0
  317. package/dist/components/tabs/tabs/use-tab-routing.js +1 -2
  318. package/dist/components/tabs/tabs/use-tab-routing.js.map +1 -1
  319. package/dist/components/tabs/tabs/use-tab-scroll.js +15 -15
  320. package/dist/components/tabs/tabs/use-tab-scroll.js.map +1 -1
  321. package/dist/components/time-picker/RuiTimePicker.js.map +1 -1
  322. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js +95 -93
  323. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  324. package/dist/components/time-picker/time-picker-styles.d.ts +18 -0
  325. package/dist/components/time-picker/time-picker-styles.js +16 -10
  326. package/dist/components/time-picker/time-picker-styles.js.map +1 -1
  327. package/dist/composables/breakpoint.js +3 -3
  328. package/dist/composables/breakpoint.js.map +1 -1
  329. package/dist/composables/defaults/field.d.ts +22 -0
  330. package/dist/composables/defaults/field.js +29 -0
  331. package/dist/composables/defaults/field.js.map +1 -0
  332. package/dist/composables/dropdown-menu.d.ts +23 -11
  333. package/dist/composables/dropdown-menu.js +44 -34
  334. package/dist/composables/dropdown-menu.js.map +1 -1
  335. package/dist/composables/floating.d.ts +1 -3
  336. package/dist/composables/floating.js +16 -13
  337. package/dist/composables/floating.js.map +1 -1
  338. package/dist/composables/forms/auto-complete/chips.d.ts +22 -0
  339. package/dist/composables/forms/auto-complete/chips.js +42 -0
  340. package/dist/composables/forms/auto-complete/chips.js.map +1 -0
  341. package/dist/composables/forms/auto-complete/combobox.d.ts +25 -0
  342. package/dist/composables/forms/auto-complete/combobox.js +35 -0
  343. package/dist/composables/forms/auto-complete/combobox.js.map +1 -0
  344. package/dist/composables/forms/auto-complete/focus.d.ts +5 -2
  345. package/dist/composables/forms/auto-complete/focus.js +44 -19
  346. package/dist/composables/forms/auto-complete/focus.js.map +1 -1
  347. package/dist/composables/forms/auto-complete/index.d.ts +3 -0
  348. package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +8 -1
  349. package/dist/composables/forms/auto-complete/keyboard-navigation.js +49 -21
  350. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  351. package/dist/composables/forms/auto-complete/search.js +6 -7
  352. package/dist/composables/forms/auto-complete/search.js.map +1 -1
  353. package/dist/composables/forms/auto-complete/selection.d.ts +37 -0
  354. package/dist/composables/forms/auto-complete/selection.js +60 -0
  355. package/dist/composables/forms/auto-complete/selection.js.map +1 -0
  356. package/dist/composables/forms/auto-complete/value.js +20 -1
  357. package/dist/composables/forms/auto-complete/value.js.map +1 -1
  358. package/dist/composables/forms/category-picker/use-category-picker.js +1 -1
  359. package/dist/composables/forms/use-prepend-append-width.js +6 -6
  360. package/dist/composables/forms/use-prepend-append-width.js.map +1 -1
  361. package/dist/composables/keyboard-scroll.d.ts +17 -0
  362. package/dist/composables/keyboard-scroll.js +58 -0
  363. package/dist/composables/keyboard-scroll.js.map +1 -0
  364. package/dist/composables/overlay-stack.js +1 -1
  365. package/dist/composables/sticky-header.d.ts +8 -0
  366. package/dist/composables/sticky-header.js +21 -10
  367. package/dist/composables/sticky-header.js.map +1 -1
  368. package/dist/composables/tables/data-table/columns.js +1 -1
  369. package/dist/composables/tables/data-table/expansion.js +1 -1
  370. package/dist/composables/tables/data-table/grouping.js +27 -28
  371. package/dist/composables/tables/data-table/grouping.js.map +1 -1
  372. package/dist/composables/tables/data-table/page-scroll.d.ts +32 -0
  373. package/dist/composables/tables/data-table/page-scroll.js +144 -0
  374. package/dist/composables/tables/data-table/page-scroll.js.map +1 -0
  375. package/dist/composables/tables/data-table/pagination.js +1 -1
  376. package/dist/composables/tables/data-table/selection.js +37 -38
  377. package/dist/composables/tables/data-table/selection.js.map +1 -1
  378. package/dist/composables/tables/data-table/sort.js +1 -1
  379. package/dist/composables/theme.js +12 -12
  380. package/dist/composables/theme.js.map +1 -1
  381. package/dist/composables/timeout-manager.js +1 -1
  382. package/dist/consts/colors.d.ts +4 -0
  383. package/dist/consts/colors.js +1 -37
  384. package/dist/consts/colors.js.map +1 -1
  385. package/dist/consts/tokens.d.ts +56 -0
  386. package/dist/consts/tokens.js +46 -0
  387. package/dist/consts/tokens.js.map +1 -0
  388. package/dist/consts/typography.d.ts +51 -18
  389. package/dist/index.d.ts +7 -2
  390. package/dist/index.js +10 -6
  391. package/dist/index.js.map +1 -1
  392. package/dist/library-icons.json +0 -10
  393. package/dist/style.css +5629 -4678
  394. package/dist/styles/colors.css +315 -0
  395. package/dist/styles/tokens.css +50 -0
  396. package/dist/tailwind.css +145 -0
  397. package/dist/theme/theme.css +403 -0
  398. package/dist/theme.css +403 -0
  399. package/dist/types/dom.d.ts +9 -0
  400. package/dist/types/theme.d.ts +2 -3
  401. package/dist/types/theme.js.map +1 -1
  402. package/dist/utils/form-text-detail.js +1 -1
  403. package/dist/utils/helpers.d.ts +0 -8
  404. package/dist/utils/helpers.js +1 -2
  405. package/dist/utils/helpers.js.map +1 -1
  406. package/dist/utils/tv.js +13 -21
  407. package/dist/utils/tv.js.map +1 -1
  408. package/dist/vendor/@vueuse/core/dist/index.js +1577 -0
  409. package/dist/vendor/@vueuse/core/dist/index.js.map +1 -0
  410. package/dist/vendor/@vueuse/shared/dist/index.js +563 -0
  411. package/dist/vendor/@vueuse/shared/dist/index.js.map +1 -0
  412. package/dist/vite-plugin/index.js +5 -6
  413. package/dist/vite-plugin/index.js.map +1 -1
  414. package/dist/web-types.json +278 -403
  415. package/package.json +17 -19
  416. package/dist/components/icons/LazyIcon.vue.d.ts +0 -8
  417. package/dist/components/steppers/RuiStepperCustomIcon.js +0 -7
  418. package/dist/components/steppers/RuiStepperCustomIcon.js.map +0 -1
  419. package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +0 -8
  420. package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js +0 -43
  421. package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js.map +0 -1
  422. package/dist/composables/colors/common.d.ts +0 -20
  423. package/dist/composables/colors/index.d.ts +0 -3
  424. package/dist/composables/colors/text-input.d.ts +0 -27
  425. package/dist/composables/forms/use-label-with-quote.d.ts +0 -2
  426. package/dist/composables/popper.d.ts +0 -16
  427. package/dist/composables/popper.js +0 -23
  428. package/dist/composables/popper.js.map +0 -1
  429. package/dist/consts/forms/auto-complete/index.d.ts +0 -4
  430. package/dist/theme/index.d.ts +0 -5
  431. package/dist/theme/index.js +0 -162
  432. package/dist/theme/index.js.map +0 -1
  433. package/dist/utils/forms/auto-complete/index.d.ts +0 -2
@@ -1,6 +1,6 @@
1
+ import { get, set } from "../vendor/@vueuse/shared/dist/index.js";
2
+ import { useEventListener, useMutationObserver, useResizeObserver } from "../vendor/@vueuse/core/dist/index.js";
1
3
  import { onMounted, readonly, shallowRef, toValue } from "vue";
2
- import { useEventListener, useMutationObserver, useResizeObserver } from "@vueuse/core";
3
- import { get as get$1, set as set$1 } from "@vueuse/shared";
4
4
  //#region src/composables/sticky-header.ts
5
5
  var SELECTORS = {
6
6
  head: ":scope > thead[data-id=head-main]",
@@ -50,8 +50,18 @@ function findScrollParent(element) {
50
50
  parent = parent.parentElement;
51
51
  }
52
52
  }
53
+ function isSet(value) {
54
+ return value !== void 0 && value !== "" && value !== "none";
55
+ }
56
+ /**
57
+ * Whether an element becomes the containing block of its `position: fixed`
58
+ * descendants. The individual `translate`, `rotate` and `scale` properties
59
+ * count like `transform`: Tailwind 4 writes its translate utilities to
60
+ * `translate`, so a dialog centred with `-translate-x-1/2` leaves `transform`
61
+ * at `none`.
62
+ */
53
63
  function createsFixedContainingBlock(style) {
54
- return style.transform !== "none" || style.perspective !== "none" || style.filter !== "none" || style.backdropFilter !== void 0 && style.backdropFilter !== "none" || /transform|perspective|filter/.test(style.willChange) || /paint|layout|strict|content/.test(style.contain);
64
+ return isSet(style.transform) || isSet(style.translate) || isSet(style.rotate) || isSet(style.scale) || isSet(style.perspective) || isSet(style.filter) || isSet(style.backdropFilter) || /transform|translate|rotate|scale|perspective|filter/.test(style.willChange) || /paint|layout|strict|content/.test(style.contain);
55
65
  }
56
66
  /**
57
67
  * Where a `position: fixed` descendant's `top: 0; left: 0` lands in the viewport. That is the
@@ -101,6 +111,7 @@ function useStickyTableHeader(sticky = shallowRef(false), offsetTop, tableRefs)
101
111
  syncRafId = requestAnimationFrame(() => {
102
112
  syncRafId = null;
103
113
  applyColumnWidths(mainColumns, readColumnWidths(cloneColumns));
114
+ toggleStickyClass();
104
115
  });
105
116
  }
106
117
  function observeColumnResizes(cloneColumns, mainColumns) {
@@ -113,7 +124,7 @@ function useStickyTableHeader(sticky = shallowRef(false), offsetTop, tableRefs)
113
124
  }
114
125
  }
115
126
  function watchCellWidth() {
116
- const root = get$1(table);
127
+ const root = get(table);
117
128
  if (!toValue(sticky) || !root) return;
118
129
  const cloneRow = queryHeadRow(root, SELECTORS.headClone);
119
130
  const mainRow = queryHeadRow(root, SELECTORS.head);
@@ -129,7 +140,7 @@ function useStickyTableHeader(sticky = shallowRef(false), offsetTop, tableRefs)
129
140
  observeColumnResizes(cloneColumns, mainColumns);
130
141
  }
131
142
  function queryStickyElements() {
132
- const root = get$1(table);
143
+ const root = get(table);
133
144
  if (!toValue(sticky) || !root) return void 0;
134
145
  const theadClone = root.querySelector(SELECTORS.headClone);
135
146
  const head = root.querySelector(SELECTORS.head);
@@ -152,12 +163,12 @@ function useStickyTableHeader(sticky = shallowRef(false), offsetTop, tableRefs)
152
163
  head.style.width = `${clonedRect.width}px`;
153
164
  const lastRowHeight = getLastRowHeight(root);
154
165
  if (lastRowHeight === void 0) {
155
- set$1(stick, false);
166
+ set(stick, false);
156
167
  positionHeadAtRest(head);
157
168
  return;
158
169
  }
159
170
  if (isInStickyRange(tableRect, top)) {
160
- set$1(stick, true);
171
+ set(stick, true);
161
172
  positionHeadStuck(head, {
162
173
  clonedRect,
163
174
  lastRowHeight,
@@ -166,7 +177,7 @@ function useStickyTableHeader(sticky = shallowRef(false), offsetTop, tableRefs)
166
177
  top
167
178
  });
168
179
  } else {
169
- set$1(stick, false);
180
+ set(stick, false);
170
181
  positionHeadAtRest(head);
171
182
  }
172
183
  }
@@ -178,7 +189,7 @@ function useStickyTableHeader(sticky = shallowRef(false), offsetTop, tableRefs)
178
189
  });
179
190
  }
180
191
  function onScroll(event) {
181
- const root = get$1(table);
192
+ const root = get(table);
182
193
  const target = event.target;
183
194
  if (!root || !(target instanceof Node) || !target.contains(root)) return;
184
195
  throttledToggleStickyClass();
@@ -195,6 +206,6 @@ function useStickyTableHeader(sticky = shallowRef(false), offsetTop, tableRefs)
195
206
  return { stick: readonly(stick) };
196
207
  }
197
208
  //#endregion
198
- export { useStickyTableHeader };
209
+ export { createsFixedContainingBlock, useStickyTableHeader };
199
210
 
200
211
  //# sourceMappingURL=sticky-header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sticky-header.js","names":[],"sources":["../../src/composables/sticky-header.ts"],"sourcesContent":["import type { MaybeRefOrGetter, Ref, ShallowRef } from 'vue';\n\nexport interface UseStickyTableHeaderRefs {\n table: Readonly<ShallowRef<HTMLTableElement | null>>;\n}\n\ninterface StickyElements {\n head: HTMLElement;\n theadClone: HTMLElement;\n root: HTMLTableElement;\n}\n\ninterface UseStickyTableHeaderReturn {\n stick: Readonly<Ref<boolean>>;\n}\n\nconst SELECTORS = {\n head: ':scope > thead[data-id=head-main]',\n headClone: ':scope > thead[data-id=head-clone]',\n row: ':scope > tbody > tr:not([hidden])',\n th: ':scope > th',\n} as const;\n\nconst BORDER_PRECISION = -0.5;\n\nfunction queryHeadRow(root: HTMLTableElement, selector: string): HTMLTableRowElement | null {\n return root.querySelector(`${selector} > tr`);\n}\n\nfunction queryColumns(row: HTMLTableRowElement | null): HTMLElement[] {\n if (!row)\n return [];\n return Array.from(row.querySelectorAll<HTMLElement>(SELECTORS.th));\n}\n\nfunction readColumnWidths(columns: HTMLElement[]): number[] {\n return columns.map(col => col.getBoundingClientRect().width);\n}\n\nfunction applyColumnWidths(columns: HTMLElement[], widths: number[]): void {\n for (const [i, column] of columns.entries()) {\n const width = widths[i];\n if (width !== undefined)\n column.style.width = `${width}px`;\n }\n}\n\nfunction positionHeadAtRest(head: HTMLElement): void {\n head.style.left = `${BORDER_PRECISION}px`;\n head.style.top = '0';\n}\n\ninterface StuckPosition {\n clonedRect: DOMRect;\n tableRect: DOMRect;\n lastRowHeight: number;\n top: number;\n origin: Point;\n}\n\nfunction positionHeadStuck(head: HTMLElement, { clonedRect, lastRowHeight, origin, tableRect, top }: StuckPosition): void {\n head.style.left = `${clonedRect.left - origin.left + BORDER_PRECISION}px`;\n\n const isNearBottom = tableRect.bottom <= lastRowHeight + clonedRect.height + top;\n const viewportTop = isNearBottom ? tableRect.bottom - lastRowHeight - clonedRect.height : top;\n head.style.top = `${viewportTop - origin.top}px`;\n}\n\nfunction isInStickyRange(tableRect: DOMRect, top: number): boolean {\n return tableRect.top <= top && tableRect.bottom > top;\n}\n\ninterface Point {\n left: number;\n top: number;\n}\n\n/**\n * The nearest ancestor that currently scrolls vertically, e.g. a dialog or drawer body, or\n * `undefined` when only the page does. One that could scroll but has nothing to (a card body on a\n * page) is skipped, as is the table's own scroller, which only scrolls sideways.\n */\nfunction findScrollParent(element: HTMLElement): HTMLElement | undefined {\n let parent = element.parentElement;\n while (parent && parent !== document.body && parent !== document.documentElement) {\n const { overflowY } = getComputedStyle(parent);\n if ((overflowY === 'auto' || overflowY === 'scroll') && parent.scrollHeight > parent.clientHeight)\n return parent;\n parent = parent.parentElement;\n }\n return undefined;\n}\n\nfunction createsFixedContainingBlock(style: CSSStyleDeclaration): boolean {\n return style.transform !== 'none'\n || style.perspective !== 'none'\n || style.filter !== 'none'\n || (style.backdropFilter !== undefined && style.backdropFilter !== 'none')\n || /transform|perspective|filter/.test(style.willChange)\n || /paint|layout|strict|content/.test(style.contain);\n}\n\n/**\n * Where a `position: fixed` descendant's `top: 0; left: 0` lands in the viewport. That is the\n * viewport origin, unless an ancestor (a centred dialog is translated) becomes its containing block.\n */\nfunction getFixedOrigin(element: HTMLElement): Point {\n let parent = element.parentElement;\n while (parent) {\n if (createsFixedContainingBlock(getComputedStyle(parent))) {\n const rect = parent.getBoundingClientRect();\n return { left: rect.left + parent.clientLeft, top: rect.top + parent.clientTop };\n }\n parent = parent.parentElement;\n }\n return { left: 0, top: 0 };\n}\n\nfunction getLastRowHeight(root: HTMLTableElement): number | undefined {\n const rows = root.querySelectorAll(SELECTORS.row);\n if (rows.length <= 1)\n return undefined;\n return rows.item(rows.length - 1)?.getBoundingClientRect().height ?? 0;\n}\n\n/**\n * Setup sticky table header\n */\nexport function useStickyTableHeader(\n sticky: MaybeRefOrGetter<boolean> = shallowRef(false),\n offsetTop: MaybeRefOrGetter<number | undefined>,\n tableRefs: UseStickyTableHeaderRefs,\n): UseStickyTableHeaderReturn {\n const { table } = tableRefs;\n const stick = shallowRef<boolean>(false);\n\n let resizeCleanups: (() => void)[] = [];\n let syncRafId: number | null = null;\n let rafId: number | null = null;\n\n function cleanupResizeObservers(): void {\n for (const cleanup of resizeCleanups)\n cleanup();\n resizeCleanups = [];\n }\n\n function cancelPendingSync(): void {\n if (syncRafId !== null)\n cancelAnimationFrame(syncRafId);\n syncRafId = null;\n }\n\n function scheduleSyncWidths(cloneColumns: HTMLElement[], mainColumns: HTMLElement[]): void {\n cancelPendingSync();\n\n // One frame is enough: the main thead is positioned, so its widths never feed back into the clone's\n syncRafId = requestAnimationFrame(() => {\n syncRafId = null;\n applyColumnWidths(mainColumns, readColumnWidths(cloneColumns));\n });\n }\n\n function observeColumnResizes(cloneColumns: HTMLElement[], mainColumns: HTMLElement[]): void {\n cleanupResizeObservers();\n\n for (const th of cloneColumns) {\n const { stop } = useResizeObserver(th, () => {\n scheduleSyncWidths(cloneColumns, mainColumns);\n });\n resizeCleanups.push(stop);\n }\n }\n\n function watchCellWidth(): void {\n const root = get(table);\n if (!toValue(sticky) || !root)\n return;\n\n const cloneRow = queryHeadRow(root, SELECTORS.headClone);\n const mainRow = queryHeadRow(root, SELECTORS.head);\n const cloneColumns = queryColumns(cloneRow);\n const mainColumns = queryColumns(mainRow);\n\n useMutationObserver(cloneRow, (mutations) => {\n const hasRelevantMutation = mutations.some(\n m => m.type === 'childList' || m.type === 'attributes',\n );\n if (hasRelevantMutation)\n observeColumnResizes(queryColumns(cloneRow), queryColumns(mainRow));\n }, { attributes: true, childList: true, subtree: true });\n\n observeColumnResizes(cloneColumns, mainColumns);\n }\n\n function queryStickyElements(): StickyElements | undefined {\n const root = get(table);\n if (!toValue(sticky) || !root)\n return undefined;\n\n const theadClone = root.querySelector<HTMLElement>(SELECTORS.headClone);\n const head = root.querySelector<HTMLElement>(SELECTORS.head);\n if (!theadClone || !head)\n return undefined;\n\n return { head, root, theadClone };\n }\n\n function toggleStickyClass(): void {\n const elements = queryStickyElements();\n if (!elements)\n return;\n\n const { head, root, theadClone } = elements;\n const clonedRect = theadClone.getBoundingClientRect();\n const tableRect = root.getBoundingClientRect();\n const pageTop = toValue(offsetTop) ?? 0;\n const scrollParent = findScrollParent(root);\n const top = scrollParent\n ? Math.max(scrollParent.getBoundingClientRect().top + scrollParent.clientTop, pageTop)\n : pageTop;\n\n head.style.width = `${clonedRect.width}px`;\n\n const lastRowHeight = getLastRowHeight(root);\n if (lastRowHeight === undefined) {\n set(stick, false);\n positionHeadAtRest(head);\n return;\n }\n\n if (isInStickyRange(tableRect, top)) {\n set(stick, true);\n positionHeadStuck(head, { clonedRect, lastRowHeight, origin: getFixedOrigin(head), tableRect, top });\n }\n else {\n set(stick, false);\n positionHeadAtRest(head);\n }\n }\n\n function throttledToggleStickyClass(): void {\n if (rafId !== null)\n return;\n rafId = requestAnimationFrame(() => {\n toggleStickyClass();\n rafId = null;\n });\n }\n\n function onScroll(event: Event): void {\n const root = get(table);\n const target = event.target;\n // scroll does not bubble, so this runs in capture for every scroll: only an ancestor's matters\n if (!root || !(target instanceof Node) || !target.contains(root))\n return;\n throttledToggleStickyClass();\n }\n\n onMounted(() => {\n toggleStickyClass();\n useEventListener(document, 'scroll', onScroll, { capture: true, passive: true });\n useEventListener(window, 'resize', throttledToggleStickyClass);\n watchCellWidth();\n });\n\n return {\n stick: readonly(stick),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sticky-header.js","names":[],"sources":["../../src/composables/sticky-header.ts"],"sourcesContent":["import type { MaybeRefOrGetter, Ref, ShallowRef } from 'vue';\n\nexport interface UseStickyTableHeaderRefs {\n table: Readonly<ShallowRef<HTMLTableElement | null>>;\n}\n\ninterface StickyElements {\n head: HTMLElement;\n theadClone: HTMLElement;\n root: HTMLTableElement;\n}\n\ninterface UseStickyTableHeaderReturn {\n stick: Readonly<Ref<boolean>>;\n}\n\nconst SELECTORS = {\n head: ':scope > thead[data-id=head-main]',\n headClone: ':scope > thead[data-id=head-clone]',\n row: ':scope > tbody > tr:not([hidden])',\n th: ':scope > th',\n} as const;\n\nconst BORDER_PRECISION = -0.5;\n\nfunction queryHeadRow(root: HTMLTableElement, selector: string): HTMLTableRowElement | null {\n return root.querySelector(`${selector} > tr`);\n}\n\nfunction queryColumns(row: HTMLTableRowElement | null): HTMLElement[] {\n if (!row)\n return [];\n return Array.from(row.querySelectorAll<HTMLElement>(SELECTORS.th));\n}\n\nfunction readColumnWidths(columns: HTMLElement[]): number[] {\n return columns.map(col => col.getBoundingClientRect().width);\n}\n\nfunction applyColumnWidths(columns: HTMLElement[], widths: number[]): void {\n for (const [i, column] of columns.entries()) {\n const width = widths[i];\n if (width !== undefined)\n column.style.width = `${width}px`;\n }\n}\n\nfunction positionHeadAtRest(head: HTMLElement): void {\n head.style.left = `${BORDER_PRECISION}px`;\n head.style.top = '0';\n}\n\ninterface StuckPosition {\n clonedRect: DOMRect;\n tableRect: DOMRect;\n lastRowHeight: number;\n top: number;\n origin: Point;\n}\n\nfunction positionHeadStuck(head: HTMLElement, { clonedRect, lastRowHeight, origin, tableRect, top }: StuckPosition): void {\n head.style.left = `${clonedRect.left - origin.left + BORDER_PRECISION}px`;\n\n const isNearBottom = tableRect.bottom <= lastRowHeight + clonedRect.height + top;\n const viewportTop = isNearBottom ? tableRect.bottom - lastRowHeight - clonedRect.height : top;\n head.style.top = `${viewportTop - origin.top}px`;\n}\n\nfunction isInStickyRange(tableRect: DOMRect, top: number): boolean {\n return tableRect.top <= top && tableRect.bottom > top;\n}\n\ninterface Point {\n left: number;\n top: number;\n}\n\n/**\n * The nearest ancestor that currently scrolls vertically, e.g. a dialog or drawer body, or\n * `undefined` when only the page does. One that could scroll but has nothing to (a card body on a\n * page) is skipped, as is the table's own scroller, which only scrolls sideways.\n */\nfunction findScrollParent(element: HTMLElement): HTMLElement | undefined {\n let parent = element.parentElement;\n while (parent && parent !== document.body && parent !== document.documentElement) {\n const { overflowY } = getComputedStyle(parent);\n if ((overflowY === 'auto' || overflowY === 'scroll') && parent.scrollHeight > parent.clientHeight)\n return parent;\n parent = parent.parentElement;\n }\n return undefined;\n}\n\nfunction isSet(value: string | undefined): boolean {\n return value !== undefined && value !== '' && value !== 'none';\n}\n\n/**\n * Whether an element becomes the containing block of its `position: fixed`\n * descendants. The individual `translate`, `rotate` and `scale` properties\n * count like `transform`: Tailwind 4 writes its translate utilities to\n * `translate`, so a dialog centred with `-translate-x-1/2` leaves `transform`\n * at `none`.\n */\nexport function createsFixedContainingBlock(style: CSSStyleDeclaration): boolean {\n return isSet(style.transform)\n || isSet(style.translate)\n || isSet(style.rotate)\n || isSet(style.scale)\n || isSet(style.perspective)\n || isSet(style.filter)\n || isSet(style.backdropFilter)\n || /transform|translate|rotate|scale|perspective|filter/.test(style.willChange)\n || /paint|layout|strict|content/.test(style.contain);\n}\n\n/**\n * Where a `position: fixed` descendant's `top: 0; left: 0` lands in the viewport. That is the\n * viewport origin, unless an ancestor (a centred dialog is translated) becomes its containing block.\n */\nfunction getFixedOrigin(element: HTMLElement): Point {\n let parent = element.parentElement;\n while (parent) {\n if (createsFixedContainingBlock(getComputedStyle(parent))) {\n const rect = parent.getBoundingClientRect();\n return { left: rect.left + parent.clientLeft, top: rect.top + parent.clientTop };\n }\n parent = parent.parentElement;\n }\n return { left: 0, top: 0 };\n}\n\nfunction getLastRowHeight(root: HTMLTableElement): number | undefined {\n const rows = root.querySelectorAll(SELECTORS.row);\n if (rows.length <= 1)\n return undefined;\n return rows.item(rows.length - 1)?.getBoundingClientRect().height ?? 0;\n}\n\n/**\n * Setup sticky table header\n */\nexport function useStickyTableHeader(\n sticky: MaybeRefOrGetter<boolean> = shallowRef(false),\n offsetTop: MaybeRefOrGetter<number | undefined>,\n tableRefs: UseStickyTableHeaderRefs,\n): UseStickyTableHeaderReturn {\n const { table } = tableRefs;\n const stick = shallowRef<boolean>(false);\n\n let resizeCleanups: (() => void)[] = [];\n let syncRafId: number | null = null;\n let rafId: number | null = null;\n\n function cleanupResizeObservers(): void {\n for (const cleanup of resizeCleanups)\n cleanup();\n resizeCleanups = [];\n }\n\n function cancelPendingSync(): void {\n if (syncRafId !== null)\n cancelAnimationFrame(syncRafId);\n syncRafId = null;\n }\n\n function scheduleSyncWidths(cloneColumns: HTMLElement[], mainColumns: HTMLElement[]): void {\n cancelPendingSync();\n\n // One frame is enough: the main thead is positioned, so its widths never feed back into the clone's\n syncRafId = requestAnimationFrame(() => {\n syncRafId = null;\n applyColumnWidths(mainColumns, readColumnWidths(cloneColumns));\n // the head's own width too: left stale, it squeezes the columns and leaves an untinted strip at the end\n toggleStickyClass();\n });\n }\n\n function observeColumnResizes(cloneColumns: HTMLElement[], mainColumns: HTMLElement[]): void {\n cleanupResizeObservers();\n\n for (const th of cloneColumns) {\n const { stop } = useResizeObserver(th, () => {\n scheduleSyncWidths(cloneColumns, mainColumns);\n });\n resizeCleanups.push(stop);\n }\n }\n\n function watchCellWidth(): void {\n const root = get(table);\n if (!toValue(sticky) || !root)\n return;\n\n const cloneRow = queryHeadRow(root, SELECTORS.headClone);\n const mainRow = queryHeadRow(root, SELECTORS.head);\n const cloneColumns = queryColumns(cloneRow);\n const mainColumns = queryColumns(mainRow);\n\n useMutationObserver(cloneRow, (mutations) => {\n const hasRelevantMutation = mutations.some(\n m => m.type === 'childList' || m.type === 'attributes',\n );\n if (hasRelevantMutation)\n observeColumnResizes(queryColumns(cloneRow), queryColumns(mainRow));\n }, { attributes: true, childList: true, subtree: true });\n\n observeColumnResizes(cloneColumns, mainColumns);\n }\n\n function queryStickyElements(): StickyElements | undefined {\n const root = get(table);\n if (!toValue(sticky) || !root)\n return undefined;\n\n const theadClone = root.querySelector<HTMLElement>(SELECTORS.headClone);\n const head = root.querySelector<HTMLElement>(SELECTORS.head);\n if (!theadClone || !head)\n return undefined;\n\n return { head, root, theadClone };\n }\n\n function toggleStickyClass(): void {\n const elements = queryStickyElements();\n if (!elements)\n return;\n\n const { head, root, theadClone } = elements;\n const clonedRect = theadClone.getBoundingClientRect();\n const tableRect = root.getBoundingClientRect();\n const pageTop = toValue(offsetTop) ?? 0;\n const scrollParent = findScrollParent(root);\n const top = scrollParent\n ? Math.max(scrollParent.getBoundingClientRect().top + scrollParent.clientTop, pageTop)\n : pageTop;\n\n head.style.width = `${clonedRect.width}px`;\n\n const lastRowHeight = getLastRowHeight(root);\n if (lastRowHeight === undefined) {\n set(stick, false);\n positionHeadAtRest(head);\n return;\n }\n\n if (isInStickyRange(tableRect, top)) {\n set(stick, true);\n positionHeadStuck(head, { clonedRect, lastRowHeight, origin: getFixedOrigin(head), tableRect, top });\n }\n else {\n set(stick, false);\n positionHeadAtRest(head);\n }\n }\n\n function throttledToggleStickyClass(): void {\n if (rafId !== null)\n return;\n rafId = requestAnimationFrame(() => {\n toggleStickyClass();\n rafId = null;\n });\n }\n\n function onScroll(event: Event): void {\n const root = get(table);\n const target = event.target;\n // scroll does not bubble, so this runs in capture for every scroll: only an ancestor's matters\n if (!root || !(target instanceof Node) || !target.contains(root))\n return;\n throttledToggleStickyClass();\n }\n\n onMounted(() => {\n toggleStickyClass();\n useEventListener(document, 'scroll', onScroll, { capture: true, passive: true });\n useEventListener(window, 'resize', throttledToggleStickyClass);\n watchCellWidth();\n });\n\n return {\n stick: readonly(stick),\n };\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
+ import { get } from "../../../vendor/@vueuse/shared/dist/index.js";
1
2
  import { TableAlign, getAlignClass } from "../../../components/tables/table-props.js";
2
3
  import { getObjectKeys, isHeaderSlot } from "./types.js";
3
4
  import { computed, toValue } from "vue";
4
- import { get } from "@vueuse/shared";
5
5
  //#region src/composables/tables/data-table/columns.ts
6
6
  function useTableColumns(options) {
7
7
  const { cols, columnAttr, expandable, groupKeys, isMobile, rows, selectedData, slots, tdResolver } = options;
@@ -1,5 +1,5 @@
1
+ import { get, set } from "../../../vendor/@vueuse/shared/dist/index.js";
1
2
  import { computed } from "vue";
2
- import { get, set } from "@vueuse/shared";
3
3
  //#region src/composables/tables/data-table/expansion.ts
4
4
  function useTableExpansion(options, deps) {
5
5
  const { rowAttr, singleExpand } = options;
@@ -1,57 +1,56 @@
1
1
  import { assert } from "../../../utils/assert.js";
2
+ import { get, isDefined, set } from "../../../vendor/@vueuse/shared/dist/index.js";
2
3
  import { GROUP_HEADER_BRAND, isRow } from "./types.js";
3
4
  import { computed, ref, watch } from "vue";
4
- import { isDefined } from "@vueuse/core";
5
- import { get as get$1, set as set$1 } from "@vueuse/shared";
6
5
  //#region src/composables/tables/data-table/grouping.ts
7
6
  var GROUP_KEY_SEPARATOR = "\0";
8
7
  function useTableGrouping(options, deps) {
9
8
  const { rowAttr } = options;
10
9
  const { group, collapsed, sorted } = deps;
11
10
  const collapsedRows = ref([]);
12
- watch(collapsed, (value) => set$1(collapsedRows, value ?? []), { immediate: true });
11
+ watch(collapsed, (value) => set(collapsedRows, value ?? []), { immediate: true });
13
12
  const groupKeys = computed(() => {
14
- const groupBy = get$1(group);
13
+ const groupBy = get(group);
15
14
  if (!groupBy) return [];
16
15
  if (!Array.isArray(groupBy)) return [groupBy];
17
16
  return groupBy;
18
17
  });
19
18
  const groupKey = computed(() => {
20
- return get$1(groupKeys).join(":") || void 0;
19
+ return get(groupKeys).join(":") || void 0;
21
20
  });
22
- const isGrouped = computed(() => get$1(groupKey) !== void 0);
23
- const collapsedIdentifierSet = computed(() => new Set(get$1(collapsedRows).map((row) => row[rowAttr])));
21
+ const isGrouped = computed(() => get(groupKey) !== void 0);
22
+ const collapsedIdentifierSet = computed(() => new Set(get(collapsedRows).map((row) => row[rowAttr])));
24
23
  const collapsedGroupKeySet = computed(() => {
25
- const grouping = get$1(groupKeys);
24
+ const grouping = get(groupKeys);
26
25
  if (grouping.length === 0) return /* @__PURE__ */ new Set();
27
26
  const seen = /* @__PURE__ */ new Set();
28
- for (const row of get$1(collapsedRows)) seen.add(computeGroupKey(row, grouping));
27
+ for (const row of get(collapsedRows)) seen.add(computeGroupKey(row, grouping));
29
28
  return seen;
30
29
  });
31
30
  function getRowGroup(row) {
32
31
  const result = {};
33
- for (const key of get$1(groupKeys)) result[key] = row[key];
32
+ for (const key of get(groupKeys)) result[key] = row[key];
34
33
  return result;
35
34
  }
36
35
  function compareGroupsFn(a, b) {
37
- const grouping = get$1(groupKeys);
36
+ const grouping = get(groupKeys);
38
37
  if (grouping.length === 0) return false;
39
38
  return grouping.every((key) => a[key] === b[key]);
40
39
  }
41
40
  function isExpandedGroup(value) {
42
- const grouping = get$1(groupKeys);
41
+ const grouping = get(groupKeys);
43
42
  let groupVal = "";
44
43
  for (const gk of grouping) {
45
44
  if (groupVal) groupVal += GROUP_KEY_SEPARATOR;
46
45
  const val = value[gk];
47
46
  groupVal += isDefined(val) ? val : "";
48
47
  }
49
- return !get$1(collapsedGroupKeySet).has(groupVal);
48
+ return !get(collapsedGroupKeySet).has(groupVal);
50
49
  }
51
50
  function isHiddenRow(row) {
52
- if (!get$1(isGrouped)) return false;
51
+ if (!get(isGrouped)) return false;
53
52
  if (!isRow(row)) return false;
54
- return get$1(collapsedIdentifierSet).has(row[rowAttr]);
53
+ return get(collapsedIdentifierSet).has(row[rowAttr]);
55
54
  }
56
55
  function computeGroupKey(row, grouping) {
57
56
  let key = "";
@@ -63,9 +62,9 @@ function useTableGrouping(options, deps) {
63
62
  return key;
64
63
  }
65
64
  const mappedGroups = computed(() => {
66
- const grouping = get$1(groupKeys);
65
+ const grouping = get(groupKeys);
67
66
  if (grouping.length === 0) return {};
68
- const result = get$1(sorted);
67
+ const result = get(sorted);
69
68
  const identifier = rowAttr;
70
69
  const acc = {};
71
70
  for (const row of result) {
@@ -81,31 +80,31 @@ function useTableGrouping(options, deps) {
81
80
  return acc;
82
81
  });
83
82
  const grouped = computed(() => {
84
- const result = get$1(sorted);
85
- if (!get$1(groupKey)) return result;
86
- const groups = get$1(mappedGroups);
83
+ const result = get(sorted);
84
+ if (!get(groupKey)) return result;
85
+ const groups = get(mappedGroups);
87
86
  const out = [];
88
87
  for (const items of Object.values(groups)) for (const item of items) out.push(item);
89
88
  return out;
90
89
  });
91
90
  function getGroupRows(groupVal) {
92
- if (!get$1(isGrouped)) return [];
93
- const groupRows = get$1(mappedGroups)[groupVal];
91
+ if (!get(isGrouped)) return [];
92
+ const groupRows = get(mappedGroups)[groupVal];
94
93
  assert(groupRows);
95
94
  return groupRows.filter(isRow);
96
95
  }
97
96
  function onToggleExpandGroup(groupPartial, value) {
98
97
  if (!value) return;
99
- const currentCollapsed = get$1(collapsedRows);
98
+ const currentCollapsed = get(collapsedRows);
100
99
  const groupExpanded = isExpandedGroup(groupPartial);
101
100
  const groupRows = getGroupRows(value);
102
- set$1(collapsedRows, groupExpanded ? [...currentCollapsed, ...groupRows] : currentCollapsed.filter((row) => !compareGroupsFn(row, groupPartial)));
103
- set$1(collapsed, get$1(collapsedRows));
101
+ set(collapsedRows, groupExpanded ? [...currentCollapsed, ...groupRows] : currentCollapsed.filter((row) => !compareGroupsFn(row, groupPartial)));
102
+ set(collapsed, get(collapsedRows));
104
103
  }
105
104
  function onUngroup() {
106
- set$1(collapsedRows, []);
107
- set$1(collapsed, []);
108
- set$1(group, Array.isArray(get$1(group)) ? [] : void 0);
105
+ set(collapsedRows, []);
106
+ set(collapsed, []);
107
+ set(group, Array.isArray(get(group)) ? [] : void 0);
109
108
  }
110
109
  return {
111
110
  groupKeys,
@@ -1 +1 @@
1
- {"version":3,"file":"grouping.js","names":[],"sources":["../../../../src/composables/tables/data-table/grouping.ts"],"sourcesContent":["import type { ComputedRef, Ref } from 'vue';\nimport type { TableRowKey, TableRowKeyData } from '@/components/tables/RuiTableHead.vue';\nimport {\n GROUP_HEADER_BRAND,\n type GroupedTableRow,\n type GroupHeader,\n isRow,\n} from '@/composables/tables/data-table/types';\nimport { assert } from '@/utils/assert';\n\nexport interface UseTableGroupingOptions<T extends object, IdType extends keyof T> {\n /** The property on each row used as the unique row identifier. */\n rowAttr: IdType;\n}\n\nexport interface UseTableGroupingDeps<T extends object> {\n group: Ref<TableRowKeyData<T>>;\n collapsed: Ref<T[] | undefined>;\n sorted: ComputedRef<readonly T[]>;\n}\n\nexport interface UseTableGroupingReturn<T extends object> {\n groupKeys: ComputedRef<TableRowKey<T>[]>;\n groupKey: ComputedRef<string | undefined>;\n isGrouped: ComputedRef<boolean>;\n mappedGroups: ComputedRef<Record<string, GroupedTableRow<T>[]>>;\n grouped: ComputedRef<readonly GroupedTableRow<T>[]>;\n getRowGroup: (row: T) => Partial<T>;\n getGroupRows: (groupVal: string) => T[];\n compareGroupsFn: (a: T, b: Partial<T>) => boolean;\n isExpandedGroup: (value: Partial<T>) => boolean;\n isHiddenRow: (row: GroupedTableRow<T>) => boolean;\n onToggleExpandGroup: (group: Partial<T>, value?: string) => void;\n onUngroup: () => void;\n}\n\n// Null character separator prevents false collisions when group values contain commas\nconst GROUP_KEY_SEPARATOR = '\\0';\n\nexport function useTableGrouping<T extends object, IdType extends keyof T>(\n options: UseTableGroupingOptions<T, IdType>,\n deps: UseTableGroupingDeps<T>,\n): UseTableGroupingReturn<T> {\n const { rowAttr } = options;\n const { group, collapsed, sorted } = deps;\n\n const collapsedRows: Ref<T[]> = ref([]);\n\n watch(collapsed, value => set(collapsedRows, value ?? []), { immediate: true });\n\n const groupKeys: ComputedRef<TableRowKey<T>[]> = computed(() => {\n const groupBy = get(group);\n\n if (!groupBy)\n return [];\n\n if (!Array.isArray(groupBy))\n return [groupBy];\n\n return groupBy;\n });\n\n const groupKey = computed<string | undefined>(() => {\n const key = get(groupKeys).join(':');\n return key || undefined;\n });\n\n const isGrouped = computed<boolean>(() => get(groupKey) !== undefined);\n\n const collapsedIdentifierSet = computed<Set<T[IdType]>>(\n () => new Set(get(collapsedRows).map(row => row[rowAttr])),\n );\n\n const collapsedGroupKeySet = computed<Set<string>>(() => {\n const grouping = get(groupKeys);\n if (grouping.length === 0)\n return new Set<string>();\n\n const seen = new Set<string>();\n for (const row of get(collapsedRows))\n seen.add(computeGroupKey(row, grouping));\n return seen;\n });\n\n function getRowGroup(row: T): Partial<T> {\n const result: Partial<T> = {};\n for (const key of get(groupKeys)) {\n result[key] = row[key];\n }\n return result;\n }\n\n function compareGroupsFn(a: T, b: Partial<T>): boolean {\n const grouping = get(groupKeys);\n if (grouping.length === 0)\n return false;\n\n return grouping.every(key => a[key] === b[key]);\n }\n\n function isExpandedGroup(value: Partial<T>): boolean {\n const grouping = get(groupKeys);\n let groupVal = '';\n for (const gk of grouping) {\n if (groupVal)\n groupVal += GROUP_KEY_SEPARATOR;\n const val = value[gk];\n groupVal += isDefined(val) ? val : '';\n }\n return !get(collapsedGroupKeySet).has(groupVal);\n }\n\n function isHiddenRow(row: GroupedTableRow<T>): boolean {\n if (!get(isGrouped))\n return false;\n if (!isRow(row))\n return false;\n return get(collapsedIdentifierSet).has(row[rowAttr]);\n }\n\n function computeGroupKey(row: T, grouping: TableRowKey<T>[]): string {\n let key = '';\n for (const gk of grouping) {\n if (key)\n key += GROUP_KEY_SEPARATOR;\n const val = row[gk];\n key += isDefined(val) ? val : '';\n }\n return key;\n }\n\n const mappedGroups = computed<Record<string, GroupedTableRow<T>[]>>(() => {\n const grouping = get(groupKeys);\n if (grouping.length === 0)\n return {};\n\n const result = get(sorted);\n const identifier = rowAttr;\n const acc: Record<string, GroupedTableRow<T>[]> = {};\n\n for (const row of result) {\n if (!isDefined(row[identifier]) || row[identifier] === '')\n continue;\n\n const groupVal = computeGroupKey(row, grouping);\n if (!acc[groupVal]) {\n acc[groupVal] = [\n {\n [GROUP_HEADER_BRAND]: true,\n group: getRowGroup(row),\n identifier: groupVal,\n } satisfies GroupHeader<T>,\n ];\n }\n\n acc[groupVal].push(row);\n }\n\n return acc;\n });\n\n const grouped = computed<readonly GroupedTableRow<T>[]>(() => {\n const result = get(sorted);\n const groupByKey = get(groupKey);\n\n if (!groupByKey)\n return result;\n\n const groups = get(mappedGroups);\n const out: GroupedTableRow<T>[] = [];\n for (const items of Object.values(groups)) {\n for (const item of items)\n out.push(item);\n }\n return out;\n });\n\n function getGroupRows(groupVal: string): T[] {\n if (!get(isGrouped))\n return [];\n\n const groupRows = get(mappedGroups)[groupVal];\n assert(groupRows);\n return groupRows.filter(isRow);\n }\n\n function onToggleExpandGroup(groupPartial: Partial<T>, value?: string): void {\n if (!value)\n return;\n\n const currentCollapsed = get(collapsedRows);\n\n const groupExpanded = isExpandedGroup(groupPartial);\n\n const groupRows = getGroupRows(value);\n\n set(\n collapsedRows,\n groupExpanded\n ? [...currentCollapsed, ...groupRows]\n : currentCollapsed.filter(row => !compareGroupsFn(row, groupPartial)),\n );\n\n set(collapsed, get(collapsedRows));\n }\n\n function onUngroup(): void {\n set(collapsedRows, []);\n\n set(collapsed, []);\n set(group, Array.isArray(get(group)) ? [] : undefined);\n }\n\n return {\n groupKeys,\n groupKey,\n isGrouped,\n mappedGroups,\n grouped,\n getRowGroup,\n getGroupRows,\n compareGroupsFn,\n isExpandedGroup,\n isHiddenRow,\n onToggleExpandGroup,\n onUngroup,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"grouping.js","names":[],"sources":["../../../../src/composables/tables/data-table/grouping.ts"],"sourcesContent":["import type { ComputedRef, Ref } from 'vue';\nimport type { TableRowKey, TableRowKeyData } from '@/components/tables/RuiTableHead.vue';\nimport {\n GROUP_HEADER_BRAND,\n type GroupedTableRow,\n type GroupHeader,\n isRow,\n} from '@/composables/tables/data-table/types';\nimport { assert } from '@/utils/assert';\n\nexport interface UseTableGroupingOptions<T extends object, IdType extends keyof T> {\n /** The property on each row used as the unique row identifier. */\n rowAttr: IdType;\n}\n\nexport interface UseTableGroupingDeps<T extends object> {\n group: Ref<TableRowKeyData<T>>;\n collapsed: Ref<T[] | undefined>;\n sorted: ComputedRef<readonly T[]>;\n}\n\nexport interface UseTableGroupingReturn<T extends object> {\n groupKeys: ComputedRef<TableRowKey<T>[]>;\n groupKey: ComputedRef<string | undefined>;\n isGrouped: ComputedRef<boolean>;\n mappedGroups: ComputedRef<Record<string, GroupedTableRow<T>[]>>;\n grouped: ComputedRef<readonly GroupedTableRow<T>[]>;\n getRowGroup: (row: T) => Partial<T>;\n getGroupRows: (groupVal: string) => T[];\n compareGroupsFn: (a: T, b: Partial<T>) => boolean;\n isExpandedGroup: (value: Partial<T>) => boolean;\n isHiddenRow: (row: GroupedTableRow<T>) => boolean;\n onToggleExpandGroup: (group: Partial<T>, value?: string) => void;\n onUngroup: () => void;\n}\n\n// Null character separator prevents false collisions when group values contain commas\nconst GROUP_KEY_SEPARATOR = '\\0';\n\nexport function useTableGrouping<T extends object, IdType extends keyof T>(\n options: UseTableGroupingOptions<T, IdType>,\n deps: UseTableGroupingDeps<T>,\n): UseTableGroupingReturn<T> {\n const { rowAttr } = options;\n const { group, collapsed, sorted } = deps;\n\n const collapsedRows: Ref<T[]> = ref([]);\n\n watch(collapsed, value => set(collapsedRows, value ?? []), { immediate: true });\n\n const groupKeys: ComputedRef<TableRowKey<T>[]> = computed(() => {\n const groupBy = get(group);\n\n if (!groupBy)\n return [];\n\n if (!Array.isArray(groupBy))\n return [groupBy];\n\n return groupBy;\n });\n\n const groupKey = computed<string | undefined>(() => {\n const key = get(groupKeys).join(':');\n return key || undefined;\n });\n\n const isGrouped = computed<boolean>(() => get(groupKey) !== undefined);\n\n const collapsedIdentifierSet = computed<Set<T[IdType]>>(\n () => new Set(get(collapsedRows).map(row => row[rowAttr])),\n );\n\n const collapsedGroupKeySet = computed<Set<string>>(() => {\n const grouping = get(groupKeys);\n if (grouping.length === 0)\n return new Set<string>();\n\n const seen = new Set<string>();\n for (const row of get(collapsedRows))\n seen.add(computeGroupKey(row, grouping));\n return seen;\n });\n\n function getRowGroup(row: T): Partial<T> {\n const result: Partial<T> = {};\n for (const key of get(groupKeys)) {\n result[key] = row[key];\n }\n return result;\n }\n\n function compareGroupsFn(a: T, b: Partial<T>): boolean {\n const grouping = get(groupKeys);\n if (grouping.length === 0)\n return false;\n\n return grouping.every(key => a[key] === b[key]);\n }\n\n function isExpandedGroup(value: Partial<T>): boolean {\n const grouping = get(groupKeys);\n let groupVal = '';\n for (const gk of grouping) {\n if (groupVal)\n groupVal += GROUP_KEY_SEPARATOR;\n const val = value[gk];\n groupVal += isDefined(val) ? val : '';\n }\n return !get(collapsedGroupKeySet).has(groupVal);\n }\n\n function isHiddenRow(row: GroupedTableRow<T>): boolean {\n if (!get(isGrouped))\n return false;\n if (!isRow(row))\n return false;\n return get(collapsedIdentifierSet).has(row[rowAttr]);\n }\n\n function computeGroupKey(row: T, grouping: TableRowKey<T>[]): string {\n let key = '';\n for (const gk of grouping) {\n if (key)\n key += GROUP_KEY_SEPARATOR;\n const val = row[gk];\n key += isDefined(val) ? val : '';\n }\n return key;\n }\n\n const mappedGroups = computed<Record<string, GroupedTableRow<T>[]>>(() => {\n const grouping = get(groupKeys);\n if (grouping.length === 0)\n return {};\n\n const result = get(sorted);\n const identifier = rowAttr;\n const acc: Record<string, GroupedTableRow<T>[]> = {};\n\n for (const row of result) {\n if (!isDefined(row[identifier]) || row[identifier] === '')\n continue;\n\n const groupVal = computeGroupKey(row, grouping);\n if (!acc[groupVal]) {\n acc[groupVal] = [\n {\n [GROUP_HEADER_BRAND]: true,\n group: getRowGroup(row),\n identifier: groupVal,\n } satisfies GroupHeader<T>,\n ];\n }\n\n acc[groupVal].push(row);\n }\n\n return acc;\n });\n\n const grouped = computed<readonly GroupedTableRow<T>[]>(() => {\n const result = get(sorted);\n const groupByKey = get(groupKey);\n\n if (!groupByKey)\n return result;\n\n const groups = get(mappedGroups);\n const out: GroupedTableRow<T>[] = [];\n for (const items of Object.values(groups)) {\n for (const item of items)\n out.push(item);\n }\n return out;\n });\n\n function getGroupRows(groupVal: string): T[] {\n if (!get(isGrouped))\n return [];\n\n const groupRows = get(mappedGroups)[groupVal];\n assert(groupRows);\n return groupRows.filter(isRow);\n }\n\n function onToggleExpandGroup(groupPartial: Partial<T>, value?: string): void {\n if (!value)\n return;\n\n const currentCollapsed = get(collapsedRows);\n\n const groupExpanded = isExpandedGroup(groupPartial);\n\n const groupRows = getGroupRows(value);\n\n set(\n collapsedRows,\n groupExpanded\n ? [...currentCollapsed, ...groupRows]\n : currentCollapsed.filter(row => !compareGroupsFn(row, groupPartial)),\n );\n\n set(collapsed, get(collapsedRows));\n }\n\n function onUngroup(): void {\n set(collapsedRows, []);\n\n set(collapsed, []);\n set(group, Array.isArray(get(group)) ? [] : undefined);\n }\n\n return {\n groupKeys,\n groupKey,\n isGrouped,\n mappedGroups,\n grouped,\n getRowGroup,\n getGroupRows,\n compareGroupsFn,\n isExpandedGroup,\n isHiddenRow,\n onToggleExpandGroup,\n onUngroup,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { MaybeRefOrGetter, Ref } from 'vue';
2
+ import type { MaybeElementRef } from '../../../types/dom';
3
+ export interface UsePageScrollReturn {
4
+ /** Scroll the table's top into view, if it has scrolled above the visible area. */
5
+ revealTableTop: () => Promise<void>;
6
+ }
7
+ /**
8
+ * After a page change, brings the table's first row back into view so the new page reads from the
9
+ * top. It scrolls only when the table's top sits above the visible area, as it does after paging
10
+ * from the bottom bar of a long page; a table that already shows its top stays put, so paging never
11
+ * makes the view jump.
12
+ */
13
+ export declare function usePageScroll(wrapper: Readonly<Ref<HTMLElement | null | undefined>>, stickyOffset: MaybeRefOrGetter<number | undefined>): UsePageScrollReturn;
14
+ /**
15
+ * Whether the pagination bar may stick: true once the top {@link STICK_AFTER}px of the table are
16
+ * inside its scrolling area. It starts true, so a page without IntersectionObserver keeps the bar
17
+ * sticky.
18
+ */
19
+ export declare function useStickyPaginationBar(wrapper: Readonly<Ref<HTMLElement | null | undefined>>, enabled: MaybeRefOrGetter<boolean>): Readonly<Ref<boolean>>;
20
+ /**
21
+ * Publishes how much of the view's bottom a stuck pagination bar covers, as `--rui-sticky-bottom` on
22
+ * the document root, so the page's own floating parts (a dock, a FAB) can rise above the bar instead of
23
+ * covering its page buttons. A bar resting at its own place in the bottom band of the view counts too,
24
+ * since it sits in the same corner; it covers from its top down, which is more than its height when it
25
+ * rests above the view's bottom, so the parts keep the same gap above it as above a stuck bar. Only a
26
+ * bar at page level counts: one inside a scrolling area sits under nothing the page floats.
27
+ *
28
+ * @param sentinel - an empty element at the bar's own place after the rows; while it is below the view's bottom band, the bar covers that corner
29
+ * @param bar - the bar, measured for its height
30
+ * @param canStick - whether the bar may stick at all
31
+ */
32
+ export declare function useStickyBottomInset(sentinel: Readonly<Ref<HTMLElement | null | undefined>>, bar: MaybeElementRef, canStick: MaybeRefOrGetter<boolean>): void;
@@ -0,0 +1,144 @@
1
+ import { get, set } from "../../../vendor/@vueuse/shared/dist/index.js";
2
+ import { unrefElement, useElementSize, useEventListener, useIntersectionObserver, useWindowSize } from "../../../vendor/@vueuse/core/dist/index.js";
3
+ import { nextTick, onMounted, onScopeDispose, shallowRef, toValue, watch, watchEffect } from "vue";
4
+ //#region src/composables/tables/data-table/page-scroll.ts
5
+ /**
6
+ * How much of a table, from its top, must be on screen before its pagination bar sticks: the
7
+ * column header and the first rows. A table just scrolling in from below keeps its bar under the
8
+ * rows, rather than showing the bar on top of the header.
9
+ */
10
+ var STICK_AFTER = 128;
11
+ /**
12
+ * The nearest ancestor that scrolls vertically. `undefined` means the page itself does, through
13
+ * the window or a scrolling `<body>`, which is where a sticky offset such as an app bar applies.
14
+ */
15
+ function findScroller(element) {
16
+ let node = element.parentElement;
17
+ while (node && node !== document.body && node !== document.documentElement) {
18
+ const { overflowY } = getComputedStyle(node);
19
+ if ((overflowY === "auto" || overflowY === "scroll") && node.scrollHeight > node.clientHeight) return node;
20
+ node = node.parentElement;
21
+ }
22
+ }
23
+ function scrollPageBy(top) {
24
+ const body = document.body;
25
+ if (body.scrollHeight > body.clientHeight && ["auto", "scroll"].includes(getComputedStyle(body).overflowY)) body.scrollBy({ top });
26
+ else window.scrollBy({ top });
27
+ }
28
+ /**
29
+ * After a page change, brings the table's first row back into view so the new page reads from the
30
+ * top. It scrolls only when the table's top sits above the visible area, as it does after paging
31
+ * from the bottom bar of a long page; a table that already shows its top stays put, so paging never
32
+ * makes the view jump.
33
+ */
34
+ function usePageScroll(wrapper, stickyOffset) {
35
+ async function revealTableTop() {
36
+ await nextTick();
37
+ const element = get(wrapper);
38
+ if (!element) return;
39
+ const scroller = findScroller(element);
40
+ const viewTop = scroller ? scroller.getBoundingClientRect().top : toValue(stickyOffset) ?? 0;
41
+ const distance = element.getBoundingClientRect().top - viewTop;
42
+ if (distance >= 0) return;
43
+ if (scroller) scroller.scrollBy({ top: distance });
44
+ else scrollPageBy(distance);
45
+ }
46
+ return { revealTableTop };
47
+ }
48
+ /**
49
+ * Whether the pagination bar may stick: true once the top {@link STICK_AFTER}px of the table are
50
+ * inside its scrolling area. It starts true, so a page without IntersectionObserver keeps the bar
51
+ * sticky.
52
+ */
53
+ function useStickyPaginationBar(wrapper, enabled) {
54
+ const canStick = shallowRef(true);
55
+ const root = shallowRef();
56
+ onMounted(() => {
57
+ const element = get(wrapper);
58
+ if (element) set(root, findScroller(element));
59
+ });
60
+ useIntersectionObserver(() => toValue(enabled) ? get(wrapper) : void 0, ([entry]) => {
61
+ if (!entry) return;
62
+ set(canStick, entry.isIntersecting || entry.boundingClientRect.bottom <= (entry.rootBounds?.top ?? 0));
63
+ }, {
64
+ root,
65
+ rootMargin: `0px 0px -${STICK_AFTER}px 0px`
66
+ });
67
+ return canStick;
68
+ }
69
+ /**
70
+ * How far above the bar a bar resting at its own place still counts as covered: a part docked in the
71
+ * bottom corner (rotki's task dock is 82px with its offset) reaches over the bar's top by about this much.
72
+ */
73
+ var RESTING_CLEARANCE = 48;
74
+ /** How much of the view's bottom each pagination bar covers, by table; the page's floating parts clear the most. */
75
+ var stuckBarHeights = /* @__PURE__ */ new Map();
76
+ function publishStickyBottom() {
77
+ if (typeof document === "undefined") return;
78
+ const style = document.documentElement.style;
79
+ if (stuckBarHeights.size === 0) style.removeProperty("--rui-sticky-bottom");
80
+ else style.setProperty("--rui-sticky-bottom", `${Math.max(...stuckBarHeights.values())}px`);
81
+ }
82
+ /**
83
+ * Publishes how much of the view's bottom a stuck pagination bar covers, as `--rui-sticky-bottom` on
84
+ * the document root, so the page's own floating parts (a dock, a FAB) can rise above the bar instead of
85
+ * covering its page buttons. A bar resting at its own place in the bottom band of the view counts too,
86
+ * since it sits in the same corner; it covers from its top down, which is more than its height when it
87
+ * rests above the view's bottom, so the parts keep the same gap above it as above a stuck bar. Only a
88
+ * bar at page level counts: one inside a scrolling area sits under nothing the page floats.
89
+ *
90
+ * @param sentinel - an empty element at the bar's own place after the rows; while it is below the view's bottom band, the bar covers that corner
91
+ * @param bar - the bar, measured for its height
92
+ * @param canStick - whether the bar may stick at all
93
+ */
94
+ function useStickyBottomInset(sentinel, bar, canStick) {
95
+ const id = Symbol("sticky-pagination-bar");
96
+ const belowView = shallowRef(false);
97
+ const pageLevel = shallowRef(false);
98
+ const covered = shallowRef(0);
99
+ const { height } = useElementSize(bar, void 0, { box: "border-box" });
100
+ const { height: viewHeight } = useWindowSize();
101
+ let frame = 0;
102
+ /** From the bar's top to the view's bottom; a stuck bar sits on that bottom, so this is its height. */
103
+ function measureCovered() {
104
+ frame = 0;
105
+ const element = unrefElement(bar);
106
+ if (!element) return;
107
+ set(covered, Math.max(get(height), Math.ceil(get(viewHeight) - element.getBoundingClientRect().top)));
108
+ }
109
+ /** A resting bar moves with the page, so while it is in the band, follow it once per frame. */
110
+ function scheduleMeasure() {
111
+ if (get(belowView) && !frame) frame = requestAnimationFrame(measureCovered);
112
+ }
113
+ useEventListener("scroll", scheduleMeasure, {
114
+ capture: true,
115
+ passive: true
116
+ });
117
+ onMounted(() => {
118
+ const element = get(sentinel);
119
+ set(pageLevel, !!element && !findScroller(element));
120
+ });
121
+ useIntersectionObserver(sentinel, ([entry]) => {
122
+ if (!entry) return;
123
+ set(belowView, !entry.isIntersecting && entry.boundingClientRect.top >= (entry.rootBounds?.bottom ?? Number.POSITIVE_INFINITY));
124
+ }, { rootMargin: () => `0px 0px -${Math.ceil(get(height)) + RESTING_CLEARANCE}px 0px` });
125
+ watch([
126
+ belowView,
127
+ height,
128
+ viewHeight
129
+ ], () => measureCovered());
130
+ watchEffect(() => {
131
+ if (get(pageLevel) && toValue(canStick) && get(belowView) && get(height) > 0) stuckBarHeights.set(id, Math.max(get(height), get(covered)));
132
+ else stuckBarHeights.delete(id);
133
+ publishStickyBottom();
134
+ });
135
+ onScopeDispose(() => {
136
+ if (frame) cancelAnimationFrame(frame);
137
+ stuckBarHeights.delete(id);
138
+ publishStickyBottom();
139
+ });
140
+ }
141
+ //#endregion
142
+ export { usePageScroll, useStickyBottomInset, useStickyPaginationBar };
143
+
144
+ //# sourceMappingURL=page-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-scroll.js","names":[],"sources":["../../../../src/composables/tables/data-table/page-scroll.ts"],"sourcesContent":["import type { MaybeRefOrGetter, Ref } from 'vue';\nimport type { MaybeElementRef } from '@/types/dom';\n\nexport interface UsePageScrollReturn {\n /** Scroll the table's top into view, if it has scrolled above the visible area. */\n revealTableTop: () => Promise<void>;\n}\n\n/**\n * How much of a table, from its top, must be on screen before its pagination bar sticks: the\n * column header and the first rows. A table just scrolling in from below keeps its bar under the\n * rows, rather than showing the bar on top of the header.\n */\nconst STICK_AFTER = 128;\n\n/**\n * The nearest ancestor that scrolls vertically. `undefined` means the page itself does, through\n * the window or a scrolling `<body>`, which is where a sticky offset such as an app bar applies.\n */\nfunction findScroller(element: HTMLElement): HTMLElement | undefined {\n let node = element.parentElement;\n while (node && node !== document.body && node !== document.documentElement) {\n const { overflowY } = getComputedStyle(node);\n if ((overflowY === 'auto' || overflowY === 'scroll') && node.scrollHeight > node.clientHeight)\n return node;\n node = node.parentElement;\n }\n return undefined;\n}\n\nfunction scrollPageBy(top: number): void {\n const body = document.body;\n if (body.scrollHeight > body.clientHeight && ['auto', 'scroll'].includes(getComputedStyle(body).overflowY))\n body.scrollBy({ top });\n else\n window.scrollBy({ top });\n}\n\n/**\n * After a page change, brings the table's first row back into view so the new page reads from the\n * top. It scrolls only when the table's top sits above the visible area, as it does after paging\n * from the bottom bar of a long page; a table that already shows its top stays put, so paging never\n * makes the view jump.\n */\nexport function usePageScroll(\n wrapper: Readonly<Ref<HTMLElement | null | undefined>>,\n stickyOffset: MaybeRefOrGetter<number | undefined>,\n): UsePageScrollReturn {\n async function revealTableTop(): Promise<void> {\n await nextTick();\n const element = get(wrapper);\n if (!element)\n return;\n\n const scroller = findScroller(element);\n const viewTop = scroller ? scroller.getBoundingClientRect().top : (toValue(stickyOffset) ?? 0);\n const distance = element.getBoundingClientRect().top - viewTop;\n if (distance >= 0)\n return;\n\n if (scroller)\n scroller.scrollBy({ top: distance });\n else\n scrollPageBy(distance);\n }\n\n return { revealTableTop };\n}\n\n/**\n * Whether the pagination bar may stick: true once the top {@link STICK_AFTER}px of the table are\n * inside its scrolling area. It starts true, so a page without IntersectionObserver keeps the bar\n * sticky.\n */\nexport function useStickyPaginationBar(\n wrapper: Readonly<Ref<HTMLElement | null | undefined>>,\n enabled: MaybeRefOrGetter<boolean>,\n): Readonly<Ref<boolean>> {\n const canStick = shallowRef<boolean>(true);\n const root = shallowRef<HTMLElement>();\n\n onMounted(() => {\n const element = get(wrapper);\n if (element)\n set(root, findScroller(element));\n });\n\n useIntersectionObserver(\n () => (toValue(enabled) ? get(wrapper) : undefined),\n ([entry]) => {\n if (!entry)\n return;\n // also true once the table has scrolled past the top, when the bar is out of view anyway\n set(canStick, entry.isIntersecting || entry.boundingClientRect.bottom <= (entry.rootBounds?.top ?? 0));\n },\n { root, rootMargin: `0px 0px -${STICK_AFTER}px 0px` },\n );\n\n return canStick;\n}\n\n/**\n * How far above the bar a bar resting at its own place still counts as covered: a part docked in the\n * bottom corner (rotki's task dock is 82px with its offset) reaches over the bar's top by about this much.\n */\nconst RESTING_CLEARANCE = 48;\n\n/** How much of the view's bottom each pagination bar covers, by table; the page's floating parts clear the most. */\nconst stuckBarHeights = new Map<symbol, number>();\n\nfunction publishStickyBottom(): void {\n if (typeof document === 'undefined')\n return;\n const style = document.documentElement.style;\n if (stuckBarHeights.size === 0)\n style.removeProperty('--rui-sticky-bottom');\n else\n style.setProperty('--rui-sticky-bottom', `${Math.max(...stuckBarHeights.values())}px`);\n}\n\n/**\n * Publishes how much of the view's bottom a stuck pagination bar covers, as `--rui-sticky-bottom` on\n * the document root, so the page's own floating parts (a dock, a FAB) can rise above the bar instead of\n * covering its page buttons. A bar resting at its own place in the bottom band of the view counts too,\n * since it sits in the same corner; it covers from its top down, which is more than its height when it\n * rests above the view's bottom, so the parts keep the same gap above it as above a stuck bar. Only a\n * bar at page level counts: one inside a scrolling area sits under nothing the page floats.\n *\n * @param sentinel - an empty element at the bar's own place after the rows; while it is below the view's bottom band, the bar covers that corner\n * @param bar - the bar, measured for its height\n * @param canStick - whether the bar may stick at all\n */\nexport function useStickyBottomInset(\n sentinel: Readonly<Ref<HTMLElement | null | undefined>>,\n bar: MaybeElementRef,\n canStick: MaybeRefOrGetter<boolean>,\n): void {\n const id = Symbol('sticky-pagination-bar');\n const belowView = shallowRef<boolean>(false);\n const pageLevel = shallowRef<boolean>(false);\n const covered = shallowRef<number>(0);\n const { height } = useElementSize(bar, undefined, { box: 'border-box' });\n const { height: viewHeight } = useWindowSize();\n let frame = 0;\n\n /** From the bar's top to the view's bottom; a stuck bar sits on that bottom, so this is its height. */\n function measureCovered(): void {\n frame = 0;\n const element = unrefElement(bar);\n if (!element)\n return;\n set(covered, Math.max(get(height), Math.ceil(get(viewHeight) - element.getBoundingClientRect().top)));\n }\n\n /** A resting bar moves with the page, so while it is in the band, follow it once per frame. */\n function scheduleMeasure(): void {\n if (get(belowView) && !frame)\n frame = requestAnimationFrame(measureCovered);\n }\n\n useEventListener('scroll', scheduleMeasure, { capture: true, passive: true });\n\n onMounted(() => {\n const element = get(sentinel);\n set(pageLevel, !!element && !findScroller(element));\n });\n\n useIntersectionObserver(sentinel, ([entry]) => {\n if (!entry)\n return;\n // no root bounds (a cross-origin frame) reads as not stuck, which leaves the floating parts where they are\n set(belowView, !entry.isIntersecting && entry.boundingClientRect.top >= (entry.rootBounds?.bottom ?? Number.POSITIVE_INFINITY));\n }, {\n // the view's bottom edge, raised by the band a resting bar covers\n rootMargin: () => `0px 0px -${Math.ceil(get(height)) + RESTING_CLEARANCE}px 0px`,\n });\n\n watch([belowView, height, viewHeight], () => measureCovered());\n\n watchEffect(() => {\n if (get(pageLevel) && toValue(canStick) && get(belowView) && get(height) > 0)\n stuckBarHeights.set(id, Math.max(get(height), get(covered)));\n else\n stuckBarHeights.delete(id);\n publishStickyBottom();\n });\n\n onScopeDispose(() => {\n if (frame)\n cancelAnimationFrame(frame);\n stuckBarHeights.delete(id);\n publishStickyBottom();\n });\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
+ import { get, set } from "../../../vendor/@vueuse/shared/dist/index.js";
1
2
  import { isRow } from "./types.js";
2
3
  import { computed, readonly, ref, shallowRef, watch } from "vue";
3
- import { get, set } from "@vueuse/shared";
4
4
  //#region src/composables/tables/data-table/pagination.ts
5
5
  /**
6
6
  * Skip data rows until the page start offset, tracking the last group header seen.