@rotki/ui-library 2.12.1 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +6 -14
  2. package/dist/components/accordions/accordion/RuiAccordion.vue.js +3 -4
  3. package/dist/components/accordions/accordion/RuiAccordion.vue.js.map +1 -1
  4. package/dist/components/accordions/accordions/RuiAccordions.vue.d.ts +10 -9
  5. package/dist/components/accordions/accordions/RuiAccordions.vue.js +27 -26
  6. package/dist/components/accordions/accordions/RuiAccordions.vue.js.map +1 -1
  7. package/dist/components/alerts/RuiAlert.vue.d.ts +7 -17
  8. package/dist/components/alerts/RuiAlert.vue2.js +8 -16
  9. package/dist/components/alerts/RuiAlert.vue2.js.map +1 -1
  10. package/dist/components/buttons/button/RuiButton.vue.d.ts +5 -7
  11. package/dist/components/buttons/button/RuiButton.vue2.js +19 -20
  12. package/dist/components/buttons/button/RuiButton.vue2.js.map +1 -1
  13. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +6 -5
  14. package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js +42 -41
  15. package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js.map +1 -1
  16. package/dist/components/calendar/RuiCalendar.vue.d.ts +1 -6
  17. package/dist/components/calendar/RuiCalendar.vue.js +7 -8
  18. package/dist/components/calendar/RuiCalendar.vue.js.map +1 -1
  19. package/dist/components/calendar/RuiCalendarGrid.vue.js +1 -1
  20. package/dist/components/calendar/RuiCalendarGrid.vue2.js +20 -18
  21. package/dist/components/calendar/RuiCalendarGrid.vue2.js.map +1 -1
  22. package/dist/components/calendar/RuiCalendarHeader.vue.js +1 -1
  23. package/dist/components/calendar/RuiCalendarHeader.vue2.js +3 -4
  24. package/dist/components/calendar/RuiCalendarHeader.vue2.js.map +1 -1
  25. package/dist/components/calendar/RuiCalendarMenu.vue.js +1 -1
  26. package/dist/components/calendar/RuiCalendarMenu.vue2.js +48 -40
  27. package/dist/components/calendar/RuiCalendarMenu.vue2.js.map +1 -1
  28. package/dist/components/cards/RuiCard.vue.d.ts +9 -24
  29. package/dist/components/cards/RuiCard.vue2.js +7 -7
  30. package/dist/components/cards/RuiCard.vue2.js.map +1 -1
  31. package/dist/components/cards/RuiCardHeader.vue.d.ts +5 -10
  32. package/dist/components/cards/RuiCardHeader.vue2.js +1 -1
  33. package/dist/components/cards/RuiCardHeader.vue2.js.map +1 -1
  34. package/dist/components/chips/RuiChip.vue.d.ts +7 -21
  35. package/dist/components/chips/RuiChip.vue2.js +16 -21
  36. package/dist/components/chips/RuiChip.vue2.js.map +1 -1
  37. package/dist/components/color-picker/RuiColorBoard.vue.d.ts +1 -1
  38. package/dist/components/color-picker/RuiColorBoard.vue2.js +19 -19
  39. package/dist/components/color-picker/RuiColorBoard.vue2.js.map +1 -1
  40. package/dist/components/color-picker/RuiColorDisplay.vue.js +3 -5
  41. package/dist/components/color-picker/RuiColorDisplay.vue.js.map +1 -1
  42. package/dist/components/color-picker/RuiColorHue.vue2.js +17 -14
  43. package/dist/components/color-picker/RuiColorHue.vue2.js.map +1 -1
  44. package/dist/components/color-picker/RuiColorInput.vue.js +9 -7
  45. package/dist/components/color-picker/RuiColorInput.vue.js.map +1 -1
  46. package/dist/components/color-picker/RuiColorPicker.vue.d.ts +7 -9
  47. package/dist/components/color-picker/RuiColorPicker.vue.js +23 -14
  48. package/dist/components/color-picker/RuiColorPicker.vue.js.map +1 -1
  49. package/dist/components/color-picker/utils.js +22 -5
  50. package/dist/components/color-picker/utils.js.map +1 -1
  51. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +2 -44
  52. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js +75 -79
  53. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -1
  54. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.js +1 -1
  55. package/dist/components/date-time-picker/dayjs-setup.d.ts +1 -0
  56. package/dist/components/date-time-picker/dayjs-setup.js +8 -0
  57. package/dist/components/date-time-picker/dayjs-setup.js.map +1 -0
  58. package/dist/components/date-time-picker/segment-config.d.ts +14 -0
  59. package/dist/components/date-time-picker/segment-config.js +23 -0
  60. package/dist/components/date-time-picker/segment-config.js.map +1 -0
  61. package/dist/components/date-time-picker/segment-utils.d.ts +5 -0
  62. package/dist/components/date-time-picker/segment-utils.js +36 -0
  63. package/dist/components/date-time-picker/segment-utils.js.map +1 -0
  64. package/dist/components/date-time-picker/use-date-time-selection.d.ts +1 -0
  65. package/dist/components/date-time-picker/use-date-time-selection.js +1 -0
  66. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
  67. package/dist/components/date-time-picker/use-keyboard-handler.d.ts +4 -8
  68. package/dist/components/date-time-picker/use-keyboard-handler.js +9 -54
  69. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  70. package/dist/components/date-time-picker/utils.d.ts +1 -0
  71. package/dist/components/date-time-picker/utils.js +1 -0
  72. package/dist/components/date-time-picker/utils.js.map +1 -1
  73. package/dist/components/divider/RuiDivider.vue.d.ts +1 -3
  74. package/dist/components/divider/RuiDivider.vue.js +6 -3
  75. package/dist/components/divider/RuiDivider.vue.js.map +1 -1
  76. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +10 -1138
  77. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +153 -160
  78. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js.map +1 -1
  79. package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +15 -24
  80. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js +32 -32
  81. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -1
  82. package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +2 -2
  83. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +19 -22
  84. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js.map +1 -1
  85. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +4 -2
  86. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js +13 -16
  87. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js.map +1 -1
  88. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +7 -13
  89. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js +10 -9
  90. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js.map +1 -1
  91. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +10 -785
  92. package/dist/components/forms/select/RuiMenuSelect.vue2.js +60 -56
  93. package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -1
  94. package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +11 -10
  95. package/dist/components/forms/select/RuiSimpleSelect.vue2.js +21 -26
  96. package/dist/components/forms/select/RuiSimpleSelect.vue2.js.map +1 -1
  97. package/dist/components/forms/slider/RuiSlider.vue.d.ts +10 -26
  98. package/dist/components/forms/slider/RuiSlider.vue2.js +45 -48
  99. package/dist/components/forms/slider/RuiSlider.vue2.js.map +1 -1
  100. package/dist/components/forms/switch/RuiSwitch.vue.d.ts +12 -20
  101. package/dist/components/forms/switch/RuiSwitch.vue2.js +22 -21
  102. package/dist/components/forms/switch/RuiSwitch.vue2.js.map +1 -1
  103. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +5 -30
  104. package/dist/components/forms/text-area/RuiTextArea.vue2.js +47 -83
  105. package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -1
  106. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +10 -30
  107. package/dist/components/forms/text-field/RuiTextField.vue2.js +36 -67
  108. package/dist/components/forms/text-field/RuiTextField.vue2.js.map +1 -1
  109. package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +1 -5
  110. package/dist/components/helpers/RuiFormTextDetail.vue.js +5 -9
  111. package/dist/components/helpers/RuiFormTextDetail.vue.js.map +1 -1
  112. package/dist/components/icons/LazyIcon.vue.d.ts +1 -3
  113. package/dist/components/icons/RuiIcon.vue.d.ts +1 -4
  114. package/dist/components/icons/RuiIcon.vue2.js +11 -14
  115. package/dist/components/icons/RuiIcon.vue2.js.map +1 -1
  116. package/dist/components/index.d.ts +4 -4
  117. package/dist/components/loaders/RuiSkeletonBase.vue.d.ts +1 -3
  118. package/dist/components/loaders/RuiSkeletonBase.vue2.js +2 -2
  119. package/dist/components/loaders/RuiSkeletonBase.vue2.js.map +1 -1
  120. package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +1 -4
  121. package/dist/components/loaders/RuiSkeletonLoader.vue2.js +2 -2
  122. package/dist/components/loaders/RuiSkeletonLoader.vue2.js.map +1 -1
  123. package/dist/components/logos/RuiLogo.vue.d.ts +1 -7
  124. package/dist/components/logos/RuiLogo.vue.js +13 -13
  125. package/dist/components/logos/RuiLogo.vue.js.map +1 -1
  126. package/dist/components/overlays/badge/RuiBadge.vue.d.ts +5 -20
  127. package/dist/components/overlays/badge/RuiBadge.vue2.js +11 -13
  128. package/dist/components/overlays/badge/RuiBadge.vue2.js.map +1 -1
  129. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.d.ts +10 -5
  130. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js +18 -7
  131. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js.map +1 -1
  132. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +22 -27
  133. package/dist/components/overlays/dialog/RuiDialog.vue2.js +90 -67
  134. package/dist/components/overlays/dialog/RuiDialog.vue2.js.map +1 -1
  135. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +24 -35
  136. package/dist/components/overlays/menu/RuiMenu.vue2.js +71 -78
  137. package/dist/components/overlays/menu/RuiMenu.vue2.js.map +1 -1
  138. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +23 -30
  139. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js +78 -49
  140. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js.map +1 -1
  141. package/dist/components/overlays/notification/RuiNotification.vue.d.ts +12 -12
  142. package/dist/components/overlays/notification/RuiNotification.vue.js +27 -22
  143. package/dist/components/overlays/notification/RuiNotification.vue.js.map +1 -1
  144. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +7 -18
  145. package/dist/components/overlays/tooltip/RuiTooltip.vue2.js +16 -9
  146. package/dist/components/overlays/tooltip/RuiTooltip.vue2.js.map +1 -1
  147. package/dist/components/progress/RuiProgress.vue.d.ts +8 -10
  148. package/dist/components/progress/RuiProgress.vue2.js +18 -24
  149. package/dist/components/progress/RuiProgress.vue2.js.map +1 -1
  150. package/dist/components/steppers/RuiFooterStepper.vue.d.ts +10 -11
  151. package/dist/components/steppers/RuiFooterStepper.vue2.js +33 -26
  152. package/dist/components/steppers/RuiFooterStepper.vue2.js.map +1 -1
  153. package/dist/components/steppers/RuiStepper.vue.d.ts +6 -15
  154. package/dist/components/steppers/RuiStepper.vue2.js +39 -36
  155. package/dist/components/steppers/RuiStepper.vue2.js.map +1 -1
  156. package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +1 -3
  157. package/dist/components/steppers/RuiStepperCustomIcon.vue2.js +2 -2
  158. package/dist/components/steppers/RuiStepperCustomIcon.vue2.js.map +1 -1
  159. package/dist/components/steppers/RuiStepperIcon.vue.d.ts +1 -3
  160. package/dist/components/steppers/RuiStepperIcon.vue2.js +2 -2
  161. package/dist/components/steppers/RuiStepperIcon.vue2.js.map +1 -1
  162. package/dist/components/tables/RuiDataTable.vue.d.ts +29 -81
  163. package/dist/components/tables/RuiDataTable.vue2.js +196 -601
  164. package/dist/components/tables/RuiDataTable.vue2.js.map +1 -1
  165. package/dist/components/tables/RuiDataTable.vue3.js +24 -27
  166. package/dist/components/tables/RuiDataTable.vue3.js.map +1 -1
  167. package/dist/components/tables/RuiExpandButton.vue.d.ts +3 -6
  168. package/dist/components/tables/RuiExpandButton.vue2.js +4 -2
  169. package/dist/components/tables/RuiExpandButton.vue2.js.map +1 -1
  170. package/dist/components/tables/RuiTableHead.vue.d.ts +4 -7
  171. package/dist/components/tables/RuiTableHead.vue2.js +20 -20
  172. package/dist/components/tables/RuiTableHead.vue2.js.map +1 -1
  173. package/dist/components/tables/RuiTablePagination.vue.d.ts +10 -10
  174. package/dist/components/tables/RuiTablePagination.vue2.js +27 -19
  175. package/dist/components/tables/RuiTablePagination.vue2.js.map +1 -1
  176. package/dist/components/tabs/tab/RuiTab.vue.d.ts +3 -18
  177. package/dist/components/tabs/tab/RuiTab.vue2.js +84 -52
  178. package/dist/components/tabs/tab/RuiTab.vue2.js.map +1 -1
  179. package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +3 -11
  180. package/dist/components/tabs/tab-item/RuiTabItem.vue2.js +3 -2
  181. package/dist/components/tabs/tab-item/RuiTabItem.vue2.js.map +1 -1
  182. package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +2 -5
  183. package/dist/components/tabs/tab-items/RuiTabItems.vue2.js +18 -18
  184. package/dist/components/tabs/tab-items/RuiTabItems.vue2.js.map +1 -1
  185. package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +10 -14
  186. package/dist/components/tabs/tabs/RuiTabs.vue2.js +101 -94
  187. package/dist/components/tabs/tabs/RuiTabs.vue2.js.map +1 -1
  188. package/dist/components/time-picker/RuiTimePicker.vue.d.ts +1 -4
  189. package/dist/components/time-picker/RuiTimePicker.vue2.js +88 -38
  190. package/dist/components/time-picker/RuiTimePicker.vue2.js.map +1 -1
  191. package/dist/composables/breakpoint.js +8 -13
  192. package/dist/composables/breakpoint.js.map +1 -1
  193. package/dist/composables/dropdown-menu.d.ts +7 -4
  194. package/dist/composables/dropdown-menu.js +73 -50
  195. package/dist/composables/dropdown-menu.js.map +1 -1
  196. package/dist/composables/forms/auto-complete/focus.d.ts +7 -5
  197. package/dist/composables/forms/auto-complete/focus.js +28 -17
  198. package/dist/composables/forms/auto-complete/focus.js.map +1 -1
  199. package/dist/composables/forms/auto-complete/index.d.ts +0 -9
  200. package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +8 -3
  201. package/dist/composables/forms/auto-complete/keyboard-navigation.js +11 -5
  202. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  203. package/dist/composables/forms/auto-complete/search.d.ts +7 -0
  204. package/dist/composables/forms/auto-complete/search.js +10 -8
  205. package/dist/composables/forms/auto-complete/search.js.map +1 -1
  206. package/dist/composables/forms/auto-complete/value.d.ts +4 -0
  207. package/dist/composables/forms/auto-complete/value.js +24 -42
  208. package/dist/composables/forms/auto-complete/value.js.map +1 -1
  209. package/dist/composables/forms/use-label-with-quote.d.ts +2 -0
  210. package/dist/composables/forms/use-label-with-quote.js +14 -0
  211. package/dist/composables/forms/use-label-with-quote.js.map +1 -0
  212. package/dist/composables/forms/use-prepend-append-width.d.ts +6 -0
  213. package/dist/composables/forms/use-prepend-append-width.js +25 -0
  214. package/dist/composables/forms/use-prepend-append-width.js.map +1 -0
  215. package/dist/composables/icons.js +1 -1
  216. package/dist/composables/icons.js.map +1 -1
  217. package/dist/composables/popper.js +63 -49
  218. package/dist/composables/popper.js.map +1 -1
  219. package/dist/composables/sticky-header.d.ts +7 -5
  220. package/dist/composables/sticky-header.js +51 -41
  221. package/dist/composables/sticky-header.js.map +1 -1
  222. package/dist/composables/tables/data-table/columns.d.ts +25 -0
  223. package/dist/composables/tables/data-table/columns.js +54 -0
  224. package/dist/composables/tables/data-table/columns.js.map +1 -0
  225. package/dist/composables/tables/data-table/expansion.d.ts +17 -0
  226. package/dist/composables/tables/data-table/expansion.js +38 -0
  227. package/dist/composables/tables/data-table/expansion.js.map +1 -0
  228. package/dist/composables/tables/data-table/grouping.d.ts +29 -0
  229. package/dist/composables/tables/data-table/grouping.js +136 -0
  230. package/dist/composables/tables/data-table/grouping.js.map +1 -0
  231. package/dist/composables/tables/data-table/pagination.d.ts +33 -0
  232. package/dist/composables/tables/data-table/pagination.js +119 -0
  233. package/dist/composables/tables/data-table/pagination.js.map +1 -0
  234. package/dist/composables/tables/data-table/selection.d.ts +29 -0
  235. package/dist/composables/tables/data-table/selection.js +164 -0
  236. package/dist/composables/tables/data-table/selection.js.map +1 -0
  237. package/dist/composables/tables/data-table/sort.d.ts +32 -0
  238. package/dist/composables/tables/data-table/sort.js +136 -0
  239. package/dist/composables/tables/data-table/sort.js.map +1 -0
  240. package/dist/composables/tables/data-table/types.d.ts +14 -0
  241. package/dist/composables/tables/data-table/types.js +11 -0
  242. package/dist/composables/tables/data-table/types.js.map +1 -0
  243. package/dist/composables/theme.js +5 -21
  244. package/dist/composables/theme.js.map +1 -1
  245. package/dist/composables/timeout-manager.d.ts +4 -2
  246. package/dist/composables/timeout-manager.js +2 -1
  247. package/dist/composables/timeout-manager.js.map +1 -1
  248. package/dist/icons/icons_1.d.ts +15 -15
  249. package/dist/icons/icons_1.js +123 -123
  250. package/dist/icons/icons_1.js.map +1 -1
  251. package/dist/icons/icons_2.d.ts +46 -46
  252. package/dist/icons/icons_2.js +301 -301
  253. package/dist/icons/icons_2.js.map +1 -1
  254. package/dist/icons/icons_3.d.ts +43 -43
  255. package/dist/icons/icons_3.js +252 -252
  256. package/dist/icons/icons_3.js.map +1 -1
  257. package/dist/icons/icons_4.d.ts +72 -2
  258. package/dist/icons/icons_4.js +368 -18
  259. package/dist/icons/icons_4.js.map +1 -1
  260. package/dist/icons/index.d.ts +1 -1
  261. package/dist/icons/index.js +1 -1
  262. package/dist/icons/index.js.map +1 -1
  263. package/dist/index.js +105 -42
  264. package/dist/index.js.map +1 -1
  265. package/dist/style.css +189 -162
  266. package/dist/theme/index.js +15 -1
  267. package/dist/theme/index.js.map +1 -1
  268. package/dist/utils/assert.d.ts +1 -1
  269. package/dist/utils/assert.js.map +1 -1
  270. package/dist/utils/form-text-detail.d.ts +9 -8
  271. package/dist/utils/form-text-detail.js +1 -2
  272. package/dist/utils/form-text-detail.js.map +1 -1
  273. package/dist/utils/helpers.d.ts +4 -32
  274. package/dist/utils/helpers.js +8 -9
  275. package/dist/utils/helpers.js.map +1 -1
  276. package/dist/utils/is-equal.d.ts +1 -1
  277. package/dist/utils/is-equal.js +5 -3
  278. package/dist/utils/is-equal.js.map +1 -1
  279. package/dist/vite-plugin/index.js +4 -4
  280. package/dist/vite-plugin/index.js.map +1 -1
  281. package/dist/vite-plugin/scanner.js +3 -3
  282. package/dist/vite-plugin/scanner.js.map +1 -1
  283. package/dist/web-types.json +390 -371
  284. package/package.json +47 -44
  285. package/dist/utils/generate-id.d.ts +0 -5
  286. package/dist/utils/generate-id.js +0 -21
  287. package/dist/utils/generate-id.js.map +0 -1
@@ -0,0 +1,164 @@
1
+ import { isRow } from "./types.js";
2
+ import { useTimeoutManager } from "../../timeout-manager.js";
3
+ import { assert } from "../../../utils/assert.js";
4
+ import { shallowRef, ref, watch, computed, toValue } from "vue";
5
+ import { set, get } from "@vueuse/shared";
6
+ import { isDefined } from "@vueuse/core";
7
+ function useTableSelection(options, deps) {
8
+ const { rowAttr, multiPageSelect, disabledRows } = options;
9
+ const { selectedData, filtered } = deps;
10
+ const shiftClicked = shallowRef(false);
11
+ const lastSelectedIndex = shallowRef(-1);
12
+ const internalSelectedData = ref([]);
13
+ const { create: scheduleShiftSelect } = useTimeoutManager();
14
+ watch(selectedData, (val) => set(internalSelectedData, val), { immediate: true });
15
+ const visibleIdentifiers = computed(
16
+ () => get(filtered).filter(isRow).map((row) => row[rowAttr])
17
+ );
18
+ const selectedSet = computed(() => new Set(get(selectedData) ?? []));
19
+ const disabledRowKeySet = computed(() => {
20
+ const currentDisabledRows = toValue(disabledRows);
21
+ if (!currentDisabledRows || !rowAttr)
22
+ return /* @__PURE__ */ new Set();
23
+ return new Set(currentDisabledRows.map((row) => row[rowAttr]));
24
+ });
25
+ const isAllSelected = computed(() => {
26
+ const selectedRows = get(selectedData);
27
+ if (!selectedRows || selectedRows.length === 0)
28
+ return false;
29
+ const selected = get(selectedSet);
30
+ return get(visibleIdentifiers).every((id) => selected.has(id));
31
+ });
32
+ const indeterminate = computed(() => {
33
+ const selectedRows = get(selectedData);
34
+ if (!selectedRows)
35
+ return false;
36
+ return selectedRows.length > 0 && !get(isAllSelected);
37
+ });
38
+ function isSelected(identifier) {
39
+ return get(selectedSet).has(identifier);
40
+ }
41
+ function isDisabledRow(rowKey) {
42
+ return get(disabledRowKeySet).has(rowKey);
43
+ }
44
+ function isSelectable(rowKey) {
45
+ return isSelected(rowKey) || !isDisabledRow(rowKey);
46
+ }
47
+ function mustSelect(rowKey) {
48
+ return isSelected(rowKey) && isDisabledRow(rowKey);
49
+ }
50
+ function resetCheckboxShiftState() {
51
+ set(shiftClicked, false);
52
+ set(lastSelectedIndex, -1);
53
+ }
54
+ function onToggleAll(checked) {
55
+ const selectedRows = get(selectedData);
56
+ if (!isDefined(selectedRows))
57
+ return;
58
+ if (!multiPageSelect) {
59
+ if (checked)
60
+ set(selectedData, get(visibleIdentifiers).filter(isSelectable));
61
+ else set(selectedData, get(visibleIdentifiers).filter(mustSelect));
62
+ } else {
63
+ if (checked) {
64
+ set(
65
+ selectedData,
66
+ Array.from(/* @__PURE__ */ new Set([...selectedRows, ...get(visibleIdentifiers).filter(isSelectable)]))
67
+ );
68
+ } else {
69
+ const visibleSet = new Set(get(visibleIdentifiers));
70
+ const mustSelectSet = new Set(get(visibleIdentifiers).filter(mustSelect));
71
+ set(
72
+ selectedData,
73
+ selectedRows.filter((rowKey) => !visibleSet.has(rowKey) || mustSelectSet.has(rowKey))
74
+ );
75
+ }
76
+ }
77
+ }
78
+ function onSelect(checked, value, userAction = false) {
79
+ if (get(shiftClicked) && userAction)
80
+ return;
81
+ const selectedRows = get(internalSelectedData);
82
+ if (!selectedRows)
83
+ return;
84
+ const selected = isSelected(value);
85
+ if (checked && !selected) {
86
+ set(internalSelectedData, [...selectedRows, value]);
87
+ } else if (!checked && selected) {
88
+ set(
89
+ internalSelectedData,
90
+ [...selectedRows].filter((r) => r !== value)
91
+ );
92
+ }
93
+ if (userAction)
94
+ set(selectedData, get(internalSelectedData));
95
+ }
96
+ function onCheckboxClick(event, value, index) {
97
+ const currentTarget = event.currentTarget;
98
+ if (!(currentTarget instanceof HTMLElement))
99
+ return;
100
+ const input = currentTarget.querySelector("input");
101
+ const target = event.target;
102
+ const nodeName = target instanceof HTMLElement ? target.nodeName : void 0;
103
+ const shiftKey = event.shiftKey;
104
+ set(shiftClicked, shiftKey);
105
+ if (input && nodeName !== "INPUT") {
106
+ if (shiftKey) {
107
+ scheduleShiftSelect(() => {
108
+ let lastIndex = get(lastSelectedIndex);
109
+ if (lastIndex === -1)
110
+ lastIndex = index;
111
+ const tableData = get(filtered);
112
+ const lastSelectedData = tableData[lastIndex];
113
+ assert(lastSelectedData);
114
+ if (isRow(lastSelectedData)) {
115
+ const valueToApply = isSelected(lastSelectedData[rowAttr]);
116
+ if (lastIndex === index) {
117
+ onSelect(!valueToApply, value);
118
+ } else {
119
+ const from = Math.min(lastIndex, index);
120
+ const to = Math.max(lastIndex, index);
121
+ for (let i = from; i <= to; i++) {
122
+ const currSelectedData = tableData[i];
123
+ assert(currSelectedData);
124
+ if (isRow(currSelectedData) && !isDisabledRow(currSelectedData[rowAttr]))
125
+ onSelect(valueToApply, currSelectedData[rowAttr]);
126
+ }
127
+ }
128
+ set(lastSelectedIndex, index);
129
+ set(selectedData, get(internalSelectedData));
130
+ }
131
+ }, 1);
132
+ } else {
133
+ set(lastSelectedIndex, index);
134
+ }
135
+ }
136
+ }
137
+ function deselectRemovedRows() {
138
+ const currentSelected = get(selectedData);
139
+ if (!currentSelected)
140
+ return;
141
+ const visibleSet = new Set(get(visibleIdentifiers));
142
+ const remaining = currentSelected.filter((key) => visibleSet.has(key));
143
+ if (remaining.length !== currentSelected.length)
144
+ set(selectedData, remaining);
145
+ }
146
+ return {
147
+ visibleIdentifiers,
148
+ isAllSelected,
149
+ indeterminate,
150
+ isSelected,
151
+ isDisabledRow,
152
+ isSelectable,
153
+ mustSelect,
154
+ onToggleAll,
155
+ onSelect,
156
+ onCheckboxClick,
157
+ deselectRemovedRows,
158
+ resetCheckboxShiftState
159
+ };
160
+ }
161
+ export {
162
+ useTableSelection
163
+ };
164
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.js","sources":["../../../../src/composables/tables/data-table/selection.ts"],"sourcesContent":["import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';\nimport { type GroupedTableRow, isRow } from '@/composables/tables/data-table/types';\nimport { useTimeoutManager } from '@/composables/timeout-manager';\nimport { assert } from '@/utils/assert';\n\nexport interface UseTableSelectionOptions<T extends object, IdType extends keyof T> {\n /** The property on each row used as the unique row identifier. */\n rowAttr: IdType;\n /** Whether selection persists across pages. */\n multiPageSelect: boolean;\n /** Rows that cannot be selected or deselected by the user. */\n disabledRows: MaybeRefOrGetter<readonly T[] | undefined>;\n}\n\nexport interface UseTableSelectionDeps<T extends object, IdType extends keyof T> {\n selectedData: Ref<T[IdType][] | undefined>;\n filtered: ComputedRef<GroupedTableRow<T>[]>;\n}\n\nexport interface UseTableSelectionReturn<T extends object, IdType extends keyof T> {\n visibleIdentifiers: ComputedRef<T[IdType][]>;\n isAllSelected: ComputedRef<boolean>;\n indeterminate: ComputedRef<boolean>;\n isSelected: (identifier: T[IdType]) => boolean;\n isDisabledRow: (rowKey: T[IdType]) => boolean;\n isSelectable: (rowKey: T[IdType]) => boolean;\n mustSelect: (rowKey: T[IdType]) => boolean;\n onToggleAll: (checked: boolean) => void;\n onSelect: (checked: boolean, value: T[IdType], userAction?: boolean) => void;\n onCheckboxClick: (event: MouseEvent, value: T[IdType], index: number) => void;\n deselectRemovedRows: () => void;\n resetCheckboxShiftState: () => void;\n}\n\nexport function useTableSelection<T extends object, IdType extends keyof T>(\n options: UseTableSelectionOptions<T, IdType>,\n deps: UseTableSelectionDeps<T, IdType>,\n): UseTableSelectionReturn<T, IdType> {\n const { rowAttr, multiPageSelect, disabledRows } = options;\n const { selectedData, filtered } = deps;\n\n const shiftClicked: Ref<boolean> = shallowRef(false);\n const lastSelectedIndex: Ref<number> = shallowRef(-1);\n const internalSelectedData: Ref<T[IdType][]> = ref([]);\n const { create: scheduleShiftSelect } = useTimeoutManager();\n\n // Sync external selection model to internal state\n watch(selectedData, val => set(internalSelectedData, val), { immediate: true });\n\n const visibleIdentifiers = computed<T[IdType][]>(() =>\n get(filtered)\n .filter(isRow)\n .map(row => row[rowAttr]),\n );\n\n const selectedSet = computed<Set<T[IdType]>>(() => new Set(get(selectedData) ?? []));\n\n const disabledRowKeySet = computed<Set<T[IdType]>>(() => {\n const currentDisabledRows = toValue(disabledRows);\n if (!currentDisabledRows || !rowAttr)\n return new Set<T[IdType]>();\n return new Set<T[IdType]>(currentDisabledRows.map((row: T) => row[rowAttr]));\n });\n\n const isAllSelected = computed<boolean>(() => {\n const selectedRows = get(selectedData);\n if (!selectedRows || selectedRows.length === 0)\n return false;\n\n const selected = get(selectedSet);\n return get(visibleIdentifiers).every(id => selected.has(id));\n });\n\n const indeterminate = computed<boolean>(() => {\n const selectedRows = get(selectedData);\n if (!selectedRows)\n return false;\n\n return selectedRows.length > 0 && !get(isAllSelected);\n });\n\n function isSelected(identifier: T[IdType]): boolean {\n return get(selectedSet).has(identifier);\n }\n\n function isDisabledRow(rowKey: T[IdType]): boolean {\n return get(disabledRowKeySet).has(rowKey);\n }\n\n function isSelectable(rowKey: T[IdType]): boolean {\n return isSelected(rowKey) || !isDisabledRow(rowKey);\n }\n\n function mustSelect(rowKey: T[IdType]): boolean {\n return isSelected(rowKey) && isDisabledRow(rowKey);\n }\n\n function resetCheckboxShiftState(): void {\n set(shiftClicked, false);\n set(lastSelectedIndex, -1);\n }\n\n function onToggleAll(checked: boolean): void {\n const selectedRows = get(selectedData);\n\n if (!isDefined(selectedRows))\n return;\n\n if (!multiPageSelect) {\n if (checked)\n set(selectedData, get(visibleIdentifiers).filter(isSelectable));\n else set(selectedData, get(visibleIdentifiers).filter(mustSelect));\n }\n else {\n if (checked) {\n set(\n selectedData,\n Array.from(new Set([...selectedRows, ...get(visibleIdentifiers).filter(isSelectable)])),\n );\n }\n else {\n const visibleSet = new Set(get(visibleIdentifiers));\n const mustSelectSet = new Set(get(visibleIdentifiers).filter(mustSelect));\n set(\n selectedData,\n selectedRows.filter(rowKey => !visibleSet.has(rowKey) || mustSelectSet.has(rowKey)),\n );\n }\n }\n }\n\n function onSelect(checked: boolean, value: T[IdType], userAction: boolean = false): void {\n if (get(shiftClicked) && userAction)\n return;\n\n const selectedRows = get(internalSelectedData);\n if (!selectedRows)\n return;\n\n const selected = isSelected(value);\n\n if (checked && !selected) {\n set(internalSelectedData, [...selectedRows, value]);\n }\n else if (!checked && selected) {\n set(\n internalSelectedData,\n [...selectedRows].filter(r => r !== value),\n );\n }\n\n if (userAction)\n set(selectedData, get(internalSelectedData));\n }\n\n function onCheckboxClick(event: MouseEvent, value: T[IdType], index: number): void {\n const currentTarget = event.currentTarget;\n if (!(currentTarget instanceof HTMLElement))\n return;\n\n const input = currentTarget.querySelector('input');\n const target = event.target;\n const nodeName = target instanceof HTMLElement ? target.nodeName : undefined;\n\n const shiftKey = event.shiftKey;\n set(shiftClicked, shiftKey);\n\n if (input && nodeName !== 'INPUT') {\n if (shiftKey) {\n scheduleShiftSelect(() => {\n let lastIndex = get(lastSelectedIndex);\n if (lastIndex === -1)\n lastIndex = index;\n const tableData = get(filtered);\n const lastSelectedData = tableData[lastIndex];\n assert(lastSelectedData);\n\n if (isRow(lastSelectedData)) {\n const valueToApply = isSelected(lastSelectedData[rowAttr]);\n\n if (lastIndex === index) {\n onSelect(!valueToApply, value);\n }\n else {\n const from = Math.min(lastIndex, index);\n const to = Math.max(lastIndex, index);\n\n for (let i = from; i <= to; i++) {\n const currSelectedData = tableData[i];\n assert(currSelectedData);\n if (isRow(currSelectedData) && !isDisabledRow(currSelectedData[rowAttr]))\n onSelect(valueToApply, currSelectedData[rowAttr]);\n }\n }\n\n set(lastSelectedIndex, index);\n set(selectedData, get(internalSelectedData));\n }\n }, 1);\n }\n else {\n set(lastSelectedIndex, index);\n }\n }\n }\n\n function deselectRemovedRows(): void {\n const currentSelected = get(selectedData);\n if (!currentSelected)\n return;\n\n const visibleSet = new Set(get(visibleIdentifiers));\n const remaining = currentSelected.filter(key => visibleSet.has(key));\n\n if (remaining.length !== currentSelected.length)\n set(selectedData, remaining);\n }\n\n return {\n visibleIdentifiers,\n isAllSelected,\n indeterminate,\n isSelected,\n isDisabledRow,\n isSelectable,\n mustSelect,\n onToggleAll,\n onSelect,\n onCheckboxClick,\n deselectRemovedRows,\n resetCheckboxShiftState,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';
2
+ import type { SortColumn, TableRowKey, TableSortData } from '../../../components/tables/RuiTableHead.vue.js';
3
+ import type { TablePaginationData } from '../../../components/tables/RuiTablePagination.vue.js';
4
+ export interface UseTableSortOptions<T extends object> {
5
+ /** The data rows to sort. */
6
+ rows: MaybeRefOrGetter<readonly T[]>;
7
+ /** The current search query used to filter rows before sorting. */
8
+ search: MaybeRefOrGetter<string>;
9
+ /** Whether sorting is managed externally (e.g. server-side). */
10
+ sortModifiersExternal: boolean | undefined;
11
+ }
12
+ export interface UseTableSortDeps<T extends object> {
13
+ sort: Ref<TableSortData<T>>;
14
+ pagination: Ref<TablePaginationData | undefined>;
15
+ emitUpdateOptions: (options: {
16
+ sort?: TableSortData<T>;
17
+ pagination?: TablePaginationData;
18
+ }) => void;
19
+ }
20
+ export interface UseTableSortReturn<T extends object> {
21
+ sortData: ComputedRef<TableSortData<T>>;
22
+ sortedMap: ComputedRef<Partial<Record<TableRowKey<T>, SortColumn<T>>>>;
23
+ searchData: ComputedRef<T[]>;
24
+ sorted: ComputedRef<T[]>;
25
+ isSortedBy: (key: TableRowKey<T>) => boolean;
26
+ getSortIndex: (key: TableRowKey<T>) => number;
27
+ onSort: (payload: {
28
+ key: TableRowKey<T>;
29
+ direction?: 'asc' | 'desc';
30
+ }) => void;
31
+ }
32
+ export declare function useTableSort<T extends object>(options: UseTableSortOptions<T>, deps: UseTableSortDeps<T>): UseTableSortReturn<T>;
@@ -0,0 +1,136 @@
1
+ import { assert } from "../../../utils/assert.js";
2
+ import { computed, toValue } from "vue";
3
+ import { set, get } from "@vueuse/shared";
4
+ const SORT_COLLATOR = new Intl.Collator(void 0, { sensitivity: "accent", usage: "sort" });
5
+ function useTableSort(options, deps) {
6
+ const { rows, search, sortModifiersExternal } = options;
7
+ const { sort, pagination, emitUpdateOptions } = deps;
8
+ const getKeys = (t) => Object.keys(t);
9
+ const sortData = computed({
10
+ get() {
11
+ return get(sort);
12
+ },
13
+ set(value) {
14
+ set(sort, value);
15
+ emitUpdateOptions({
16
+ sort: value,
17
+ pagination: get(pagination)
18
+ });
19
+ }
20
+ });
21
+ const sortedMap = computed(() => {
22
+ const mapped = {};
23
+ const sortBy = get(sortData);
24
+ if (!sortBy)
25
+ return mapped;
26
+ if (!Array.isArray(sortBy)) {
27
+ if (sortBy.column)
28
+ mapped[sortBy.column] = sortBy;
29
+ return mapped;
30
+ }
31
+ return sortBy.reduce((acc, curr) => {
32
+ if (!curr.column)
33
+ return acc;
34
+ acc[curr.column] = curr;
35
+ return acc;
36
+ }, mapped);
37
+ });
38
+ const searchData = computed(() => {
39
+ const currentRows = toValue(rows);
40
+ const query = toValue(search)?.toLocaleLowerCase();
41
+ if (!query)
42
+ return [...currentRows];
43
+ return currentRows.filter(
44
+ (row) => getKeys(row).some((key) => `${row[key]}`.toLocaleLowerCase().includes(query))
45
+ );
46
+ });
47
+ const sorted = computed(() => {
48
+ const sortBy = get(sortData);
49
+ if (!sortBy || sortModifiersExternal)
50
+ return get(searchData);
51
+ const data = [...get(searchData)];
52
+ const sortFn = (by) => {
53
+ data.sort((a, b) => {
54
+ const column = by.column;
55
+ if (!column)
56
+ return 0;
57
+ let [aValue, bValue] = [a[column], b[column]];
58
+ if (by.direction === "desc")
59
+ [aValue, bValue] = [bValue, aValue];
60
+ const aNumber = Number(aValue);
61
+ const bNumber = Number(bValue);
62
+ if (!isNaN(aNumber) && !isNaN(bNumber))
63
+ return aNumber - bNumber;
64
+ return SORT_COLLATOR.compare(`${aValue}`, `${bValue}`);
65
+ });
66
+ };
67
+ if (!Array.isArray(sortBy))
68
+ sortFn(sortBy);
69
+ else [...sortBy].reverse().forEach(sortFn);
70
+ return data;
71
+ });
72
+ function isSortedBy(key) {
73
+ return key in get(sortedMap);
74
+ }
75
+ function getSortIndex(key) {
76
+ const sortBy = get(sortData);
77
+ if (!sortBy || !Array.isArray(sortBy) || !isSortedBy(key))
78
+ return -1;
79
+ return sortBy.findIndex((s) => s.column === key);
80
+ }
81
+ function onSort({ key, direction }) {
82
+ const sortBy = get(sortData);
83
+ if (!sortBy)
84
+ return;
85
+ if (!Array.isArray(sortBy)) {
86
+ if (isSortedBy(key)) {
87
+ const newDirection = !direction || direction === "asc" ? "desc" : "asc";
88
+ if (sortBy.direction === newDirection) {
89
+ set(sortData, { ...sortBy, column: void 0, direction: "asc" });
90
+ } else {
91
+ set(sortData, {
92
+ ...sortBy,
93
+ direction: sortBy.direction === "asc" ? "desc" : "asc"
94
+ });
95
+ }
96
+ } else {
97
+ set(sortData, { column: key, direction: direction || "asc" });
98
+ }
99
+ return;
100
+ }
101
+ if (isSortedBy(key)) {
102
+ const newDirection = !direction || direction === "asc" ? "desc" : "asc";
103
+ const index = getSortIndex(key);
104
+ const sortByCol = sortBy[index];
105
+ assert(sortByCol);
106
+ if (sortByCol.direction === newDirection) {
107
+ set(
108
+ sortData,
109
+ sortBy.filter((_, i) => i !== index)
110
+ );
111
+ } else {
112
+ set(
113
+ sortData,
114
+ sortBy.map(
115
+ (col, i) => i === index ? { ...col, direction: col.direction === "asc" ? "desc" : "asc" } : col
116
+ )
117
+ );
118
+ }
119
+ } else {
120
+ set(sortData, [...sortBy, { column: key, direction: direction || "asc" }]);
121
+ }
122
+ }
123
+ return {
124
+ sortData,
125
+ sortedMap,
126
+ searchData,
127
+ sorted,
128
+ isSortedBy,
129
+ getSortIndex,
130
+ onSort
131
+ };
132
+ }
133
+ export {
134
+ useTableSort
135
+ };
136
+ //# sourceMappingURL=sort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort.js","sources":["../../../../src/composables/tables/data-table/sort.ts"],"sourcesContent":["import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';\nimport type { SortColumn, TableRowKey, TableSortData } from '@/components/tables/RuiTableHead.vue';\nimport type { TablePaginationData } from '@/components/tables/RuiTablePagination.vue';\nimport { assert } from '@/utils/assert';\n\nconst SORT_COLLATOR = new Intl.Collator(undefined, { sensitivity: 'accent', usage: 'sort' });\n\nexport interface UseTableSortOptions<T extends object> {\n /** The data rows to sort. */\n rows: MaybeRefOrGetter<readonly T[]>;\n /** The current search query used to filter rows before sorting. */\n search: MaybeRefOrGetter<string>;\n /** Whether sorting is managed externally (e.g. server-side). */\n sortModifiersExternal: boolean | undefined;\n}\n\nexport interface UseTableSortDeps<T extends object> {\n sort: Ref<TableSortData<T>>;\n pagination: Ref<TablePaginationData | undefined>;\n emitUpdateOptions: (options: {\n sort?: TableSortData<T>;\n pagination?: TablePaginationData;\n }) => void;\n}\n\nexport interface UseTableSortReturn<T extends object> {\n sortData: ComputedRef<TableSortData<T>>;\n sortedMap: ComputedRef<Partial<Record<TableRowKey<T>, SortColumn<T>>>>;\n searchData: ComputedRef<T[]>;\n sorted: ComputedRef<T[]>;\n isSortedBy: (key: TableRowKey<T>) => boolean;\n getSortIndex: (key: TableRowKey<T>) => number;\n onSort: (payload: { key: TableRowKey<T>; direction?: 'asc' | 'desc' }) => void;\n}\n\nexport function useTableSort<T extends object>(\n options: UseTableSortOptions<T>,\n deps: UseTableSortDeps<T>,\n): UseTableSortReturn<T> {\n const { rows, search, sortModifiersExternal } = options;\n const { sort, pagination, emitUpdateOptions } = deps;\n\n const getKeys = <O extends object>(t: O): TableRowKey<O>[] => Object.keys(t) as TableRowKey<O>[];\n\n const sortData = computed<TableSortData<T>>({\n get(): TableSortData<T> {\n return get(sort);\n },\n set(value: TableSortData<T>) {\n set(sort, value);\n emitUpdateOptions({\n sort: value,\n pagination: get(pagination),\n });\n },\n });\n\n const sortedMap = computed<Partial<Record<TableRowKey<T>, SortColumn<T>>>>(() => {\n const mapped: Partial<Record<TableRowKey<T>, SortColumn<T>>> = {};\n const sortBy = get(sortData);\n if (!sortBy)\n return mapped;\n\n if (!Array.isArray(sortBy)) {\n if (sortBy.column)\n mapped[sortBy.column] = sortBy;\n\n return mapped;\n }\n\n return sortBy.reduce((acc, curr) => {\n if (!curr.column)\n return acc;\n\n acc[curr.column] = curr;\n return acc;\n }, mapped);\n });\n\n const searchData = computed<T[]>(() => {\n const currentRows = toValue(rows);\n const query = toValue(search)?.toLocaleLowerCase();\n if (!query)\n return [...currentRows];\n\n return currentRows.filter(row =>\n getKeys(row).some(key => `${row[key]}`.toLocaleLowerCase().includes(query)),\n );\n });\n\n const sorted: ComputedRef<T[]> = computed(() => {\n const sortBy = get(sortData);\n if (!sortBy || sortModifiersExternal)\n return get(searchData);\n\n const data = [...get(searchData)];\n\n const sortFn = (by: SortColumn<T>): void => {\n data.sort((a, b) => {\n const column = by.column;\n if (!column)\n return 0;\n\n let [aValue, bValue] = [a[column], b[column]];\n if (by.direction === 'desc')\n [aValue, bValue] = [bValue, aValue];\n\n const aNumber = Number(aValue);\n const bNumber = Number(bValue);\n if (!isNaN(aNumber) && !isNaN(bNumber))\n return aNumber - bNumber;\n\n return SORT_COLLATOR.compare(`${aValue}`, `${bValue}`);\n });\n };\n\n if (!Array.isArray(sortBy))\n sortFn(sortBy);\n else [...sortBy].reverse().forEach(sortFn);\n\n return data;\n });\n\n function isSortedBy(key: TableRowKey<T>): boolean {\n return key in get(sortedMap);\n }\n\n function getSortIndex(key: TableRowKey<T>): number {\n const sortBy = get(sortData);\n\n if (!sortBy || !Array.isArray(sortBy) || !isSortedBy(key))\n return -1;\n\n return sortBy.findIndex(s => s.column === key);\n }\n\n function onSort({ key, direction }: { key: TableRowKey<T>; direction?: 'asc' | 'desc' }): void {\n const sortBy = get(sortData);\n if (!sortBy)\n return;\n\n if (!Array.isArray(sortBy)) {\n if (isSortedBy(key)) {\n const newDirection = !direction || direction === 'asc' ? 'desc' : 'asc';\n\n if (sortBy.direction === newDirection) {\n set(sortData, { ...sortBy, column: undefined, direction: 'asc' });\n }\n else {\n set(sortData, {\n ...sortBy,\n direction: sortBy.direction === 'asc' ? 'desc' : 'asc',\n });\n }\n }\n else {\n set(sortData, { column: key, direction: direction || 'asc' });\n }\n return;\n }\n\n if (isSortedBy(key)) {\n const newDirection = !direction || direction === 'asc' ? 'desc' : 'asc';\n\n const index = getSortIndex(key);\n const sortByCol = sortBy[index];\n assert(sortByCol);\n\n if (sortByCol.direction === newDirection) {\n set(\n sortData,\n sortBy.filter((_, i) => i !== index),\n );\n }\n else {\n set(\n sortData,\n sortBy.map((col, i) =>\n i === index ? { ...col, direction: col.direction === 'asc' ? 'desc' : 'asc' } : col,\n ),\n );\n }\n }\n else {\n set(sortData, [...sortBy, { column: key, direction: direction || 'asc' }]);\n }\n }\n\n return {\n sortData,\n sortedMap,\n searchData,\n sorted,\n isSortedBy,\n getSortIndex,\n onSort,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { TableSortData } from '../../../components/tables/RuiTableHead.vue.js';
2
+ import type { TablePaginationData } from '../../../components/tables/RuiTablePagination.vue.js';
3
+ export interface TableOptions<T> {
4
+ pagination?: TablePaginationData;
5
+ sort?: TableSortData<T>;
6
+ }
7
+ export interface GroupHeader<T> {
8
+ __header__: true;
9
+ identifier: string;
10
+ group: Partial<T>;
11
+ }
12
+ export type GroupedTableRow<T> = T | GroupHeader<T>;
13
+ export declare function isRow<T extends object>(item: GroupedTableRow<T>): item is T;
14
+ export declare function isHeaderSlot(slotName: string): slotName is `header.${string}`;
@@ -0,0 +1,11 @@
1
+ function isRow(item) {
2
+ return !("__header__" in item);
3
+ }
4
+ function isHeaderSlot(slotName) {
5
+ return slotName.startsWith("header.");
6
+ }
7
+ export {
8
+ isHeaderSlot,
9
+ isRow
10
+ };
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../../../src/composables/tables/data-table/types.ts"],"sourcesContent":["import type { TableSortData } from '@/components/tables/RuiTableHead.vue';\nimport type { TablePaginationData } from '@/components/tables/RuiTablePagination.vue';\n\nexport interface TableOptions<T> {\n pagination?: TablePaginationData;\n sort?: TableSortData<T>;\n}\n\nexport interface GroupHeader<T> {\n __header__: true;\n identifier: string;\n group: Partial<T>;\n}\n\nexport type GroupedTableRow<T> = T | GroupHeader<T>;\n\nexport function isRow<T extends object>(item: GroupedTableRow<T>): item is T {\n return !('__header__' in item);\n}\n\nexport function isHeaderSlot(slotName: string): slotName is `header.${string}` {\n return slotName.startsWith('header.');\n}\n"],"names":[],"mappings":"AAgBO,SAAS,MAAwB,MAAqC;AAC3E,SAAO,EAAE,gBAAgB;AAC3B;AAEO,SAAS,aAAa,UAAkD;AAC7E,SAAO,SAAS,WAAW,SAAS;AACtC;"}
@@ -1,5 +1,5 @@
1
- import { createSharedComposable, getSSRHandler, useColorMode } from "@vueuse/core";
2
- import { ref, computed, watch } from "vue";
1
+ import { createSharedComposable, getSSRHandler, defaultWindow, useColorMode } from "@vueuse/core";
2
+ import { ref, computed } from "vue";
3
3
  import { defaultTheme, ThemeMode } from "../types/theme.js";
4
4
  import { get, set } from "@vueuse/shared";
5
5
  const config = ref({ ...defaultTheme });
@@ -7,7 +7,9 @@ const useRotkiTheme = createSharedComposable(() => {
7
7
  const updateHTMLAttrs = getSSRHandler(
8
8
  "updateHTMLAttrs",
9
9
  (selector, attribute, value) => {
10
- const el = typeof selector === "string" ? window?.document.querySelector(selector) : null;
10
+ if (typeof selector !== "string" || !defaultWindow)
11
+ return;
12
+ const el = defaultWindow.document.querySelector(selector);
11
13
  if (!el)
12
14
  return;
13
15
  el.setAttribute(attribute, value);
@@ -44,24 +46,6 @@ const useRotkiTheme = createSharedComposable(() => {
44
46
  const init = (options) => {
45
47
  switchThemeScheme(options.mode ?? ThemeMode.auto);
46
48
  setThemeConfig(options.config ?? { ...defaultTheme });
47
- if (typeof window !== "undefined") {
48
- watch([isLight, theme], ([isLight2, theme2]) => {
49
- const styleVariables = /* @__PURE__ */ new Map();
50
- Object.entries(theme2).forEach(([context, contextObject]) => {
51
- styleVariables.set(`--rui-${context}-darker`, contextObject.darker);
52
- styleVariables.set(`--rui-${context}-lighter`, contextObject.lighter);
53
- styleVariables.set(`--rui-${context}-main`, contextObject.DEFAULT);
54
- });
55
- const state2 = isLight2 ? ThemeMode.light : ThemeMode.dark;
56
- styleVariables.set("--rui-text-disabled", `var(--rui-${state2}-text-disabled)`);
57
- styleVariables.set("--rui-text-primary", `var(--rui-${state2}-text-primary)`);
58
- styleVariables.set("--rui-text-secondary", `var(--rui-${state2}-text-secondary)`);
59
- const rootStyle = document.documentElement.style;
60
- styleVariables.forEach((value, variableName) => {
61
- rootStyle.setProperty(variableName, value);
62
- });
63
- }, { immediate: true });
64
- }
65
49
  };
66
50
  return {
67
51
  config,
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sources":["../../src/composables/theme.ts"],"sourcesContent":["import { getSSRHandler, useColorMode } from '@vueuse/core';\nimport { computed, type ComputedRef, type Ref, ref } from 'vue';\nimport {\n type ColorIntensity,\n defaultTheme,\n type InitThemeOptions,\n type ThemeConfig,\n type ThemeContent,\n type ThemeData,\n ThemeMode,\n} from '@/types/theme';\n\nconst config: Ref<ThemeConfig> = ref({ ...defaultTheme });\n\n/**\n * Theme manager\n * @returns {ThemeContent}\n */\nexport const useRotkiTheme = createSharedComposable<() => ThemeContent>(() => {\n const updateHTMLAttrs = getSSRHandler(\n 'updateHTMLAttrs',\n (selector, attribute, value) => {\n const el = typeof selector === 'string' ? window?.document.querySelector(selector) : null;\n if (!el)\n return;\n el.setAttribute(attribute, value);\n },\n );\n\n const { state, store } = useColorMode<ThemeMode>({\n onChanged(mode, defaultHandler) {\n defaultHandler(mode);\n updateHTMLAttrs('html', 'data-theme', mode);\n },\n });\n\n /**\n * whether the current theme is controlled by system or user\n * @type {ComputedRef<boolean>}\n */\n const isAutoControlled: ComputedRef<boolean> = computed(() => get(store) === ThemeMode.auto);\n\n /**\n * truthy for light theme\n * @type {ComputedRef<boolean>}\n */\n const isLight: ComputedRef<boolean> = computed(() => get(state) === ThemeMode.light);\n\n /**\n * truthy for dark theme\n * @type {ComputedRef<boolean>}\n */\n const isDark: ComputedRef<boolean> = computed(() => get(state) === ThemeMode.dark);\n\n /**\n * current theme based on light or dark mode\n * @type {ComputedRef<ThemeData>}\n */\n const theme: ComputedRef<ThemeData> = computed(() => {\n if (get(isLight))\n return get(config).light;\n\n return get(config).dark;\n });\n\n /**\n * switch theme through dark/light/auto modes\n * @param {ThemeMode} mode\n */\n const switchThemeScheme = (mode: ThemeMode): void => {\n set(store, mode || ThemeMode.auto);\n };\n\n /**\n * toggle between auto|light|dark\n */\n const toggleThemeMode = (): void => {\n if (get(isAutoControlled))\n switchThemeScheme(ThemeMode.light);\n else if (get(isLight))\n switchThemeScheme(ThemeMode.dark);\n else if (get(isDark))\n switchThemeScheme(ThemeMode.auto);\n };\n\n /**\n * sets the configuration for the theme\n * @param {ThemeConfig} newConfig\n */\n const setThemeConfig = (newConfig: ThemeConfig): void => {\n set(config, newConfig);\n };\n\n /**\n * theme initializer, must be called once from the app's entry\n * @param {InitThemeOptions} options\n */\n const init = (options: InitThemeOptions): void => {\n switchThemeScheme(options.mode ?? ThemeMode.auto);\n setThemeConfig(options.config ?? { ...defaultTheme });\n\n if (typeof window !== 'undefined') {\n watch([isLight, theme], ([isLight, theme]) => {\n const styleVariables = new Map();\n\n // Compute context variables\n Object.entries(theme).forEach(([context, contextObject]: [string, ColorIntensity]) => {\n styleVariables.set(`--rui-${context}-darker`, contextObject.darker);\n styleVariables.set(`--rui-${context}-lighter`, contextObject.lighter);\n styleVariables.set(`--rui-${context}-main`, contextObject.DEFAULT);\n });\n\n // Determine the theme mode\n const state = isLight ? ThemeMode.light : ThemeMode.dark;\n\n // Add text color variables\n styleVariables.set('--rui-text-disabled', `var(--rui-${state}-text-disabled)`);\n styleVariables.set('--rui-text-primary', `var(--rui-${state}-text-primary)`);\n styleVariables.set('--rui-text-secondary', `var(--rui-${state}-text-secondary)`);\n\n // Apply all style variables in one operation\n const rootStyle = document.documentElement.style;\n styleVariables.forEach((value, variableName) => {\n rootStyle.setProperty(variableName, value);\n });\n }, { immediate: true });\n }\n };\n\n return {\n config,\n init,\n isAutoControlled,\n isDark,\n isLight,\n setThemeConfig,\n state,\n store,\n switchThemeScheme,\n theme,\n toggleThemeMode,\n };\n});\n"],"names":["isLight","theme","state"],"mappings":";;;;AAYA,MAAM,SAA2B,IAAI,EAAE,GAAG,cAAc;AAMjD,MAAM,gBAAgB,uBAA2C,MAAM;AAC5E,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,CAAC,UAAU,WAAW,UAAU;AAC9B,YAAM,KAAK,OAAO,aAAa,WAAW,QAAQ,SAAS,cAAc,QAAQ,IAAI;AACrF,UAAI,CAAC;AACH;AACF,SAAG,aAAa,WAAW,KAAK;AAAA,IAClC;AAAA,EAAA;AAGF,QAAM,EAAE,OAAO,MAAA,IAAU,aAAwB;AAAA,IAC/C,UAAU,MAAM,gBAAgB;AAC9B,qBAAe,IAAI;AACnB,sBAAgB,QAAQ,cAAc,IAAI;AAAA,IAC5C;AAAA,EAAA,CACD;AAMD,QAAM,mBAAyC,SAAS,MAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AAM3F,QAAM,UAAgC,SAAS,MAAM,IAAI,KAAK,MAAM,UAAU,KAAK;AAMnF,QAAM,SAA+B,SAAS,MAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AAMjF,QAAM,QAAgC,SAAS,MAAM;AACnD,QAAI,IAAI,OAAO;AACb,aAAO,IAAI,MAAM,EAAE;AAErB,WAAO,IAAI,MAAM,EAAE;AAAA,EACrB,CAAC;AAMD,QAAM,oBAAoB,CAAC,SAA0B;AACnD,QAAI,OAAO,QAAQ,UAAU,IAAI;AAAA,EACnC;AAKA,QAAM,kBAAkB,MAAY;AAClC,QAAI,IAAI,gBAAgB;AACtB,wBAAkB,UAAU,KAAK;AAAA,aAC1B,IAAI,OAAO;AAClB,wBAAkB,UAAU,IAAI;AAAA,aACzB,IAAI,MAAM;AACjB,wBAAkB,UAAU,IAAI;AAAA,EACpC;AAMA,QAAM,iBAAiB,CAAC,cAAiC;AACvD,QAAI,QAAQ,SAAS;AAAA,EACvB;AAMA,QAAM,OAAO,CAAC,YAAoC;AAChD,sBAAkB,QAAQ,QAAQ,UAAU,IAAI;AAChD,mBAAe,QAAQ,UAAU,EAAE,GAAG,cAAc;AAEpD,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,CAAC,SAAS,KAAK,GAAG,CAAC,CAACA,UAASC,MAAK,MAAM;AAC5C,cAAM,qCAAqB,IAAA;AAG3B,eAAO,QAAQA,MAAK,EAAE,QAAQ,CAAC,CAAC,SAAS,aAAa,MAAgC;AACpF,yBAAe,IAAI,SAAS,OAAO,WAAW,cAAc,MAAM;AAClE,yBAAe,IAAI,SAAS,OAAO,YAAY,cAAc,OAAO;AACpE,yBAAe,IAAI,SAAS,OAAO,SAAS,cAAc,OAAO;AAAA,QACnE,CAAC;AAGD,cAAMC,SAAQF,WAAU,UAAU,QAAQ,UAAU;AAGpD,uBAAe,IAAI,uBAAuB,aAAaE,MAAK,iBAAiB;AAC7E,uBAAe,IAAI,sBAAsB,aAAaA,MAAK,gBAAgB;AAC3E,uBAAe,IAAI,wBAAwB,aAAaA,MAAK,kBAAkB;AAG/E,cAAM,YAAY,SAAS,gBAAgB;AAC3C,uBAAe,QAAQ,CAAC,OAAO,iBAAiB;AAC9C,oBAAU,YAAY,cAAc,KAAK;AAAA,QAC3C,CAAC;AAAA,MACH,GAAG,EAAE,WAAW,MAAM;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ,CAAC;"}
1
+ {"version":3,"file":"theme.js","sources":["../../src/composables/theme.ts"],"sourcesContent":["import { defaultWindow, getSSRHandler, useColorMode } from '@vueuse/core';\nimport { computed, type ComputedRef, type Ref, ref } from 'vue';\nimport {\n defaultTheme,\n type InitThemeOptions,\n type ThemeConfig,\n type ThemeContent,\n type ThemeData,\n ThemeMode,\n} from '@/types/theme';\n\nconst config: Ref<ThemeConfig> = ref({ ...defaultTheme });\n\n/**\n * Theme manager\n * @returns {ThemeContent}\n */\nexport const useRotkiTheme = createSharedComposable<() => ThemeContent>(() => {\n const updateHTMLAttrs = getSSRHandler(\n 'updateHTMLAttrs',\n (selector, attribute, value) => {\n if (typeof selector !== 'string' || !defaultWindow)\n return;\n\n const el = defaultWindow.document.querySelector(selector);\n if (!el)\n return;\n\n el.setAttribute(attribute, value);\n },\n );\n\n const { state, store } = useColorMode<ThemeMode>({\n onChanged(mode, defaultHandler) {\n defaultHandler(mode);\n updateHTMLAttrs('html', 'data-theme', mode);\n },\n });\n\n /**\n * whether the current theme is controlled by system or user\n * @type {ComputedRef<boolean>}\n */\n const isAutoControlled: ComputedRef<boolean> = computed(() => get(store) === ThemeMode.auto);\n\n /**\n * truthy for light theme\n * @type {ComputedRef<boolean>}\n */\n const isLight: ComputedRef<boolean> = computed(() => get(state) === ThemeMode.light);\n\n /**\n * truthy for dark theme\n * @type {ComputedRef<boolean>}\n */\n const isDark: ComputedRef<boolean> = computed(() => get(state) === ThemeMode.dark);\n\n /**\n * current theme based on light or dark mode\n * @type {ComputedRef<ThemeData>}\n */\n const theme: ComputedRef<ThemeData> = computed(() => {\n if (get(isLight))\n return get(config).light;\n\n return get(config).dark;\n });\n\n /**\n * switch theme through dark/light/auto modes\n * @param {ThemeMode} mode\n */\n const switchThemeScheme = (mode: ThemeMode): void => {\n set(store, mode || ThemeMode.auto);\n };\n\n /**\n * toggle between auto|light|dark\n */\n const toggleThemeMode = (): void => {\n if (get(isAutoControlled))\n switchThemeScheme(ThemeMode.light);\n else if (get(isLight))\n switchThemeScheme(ThemeMode.dark);\n else if (get(isDark))\n switchThemeScheme(ThemeMode.auto);\n };\n\n /**\n * sets the configuration for the theme\n * @param {ThemeConfig} newConfig\n */\n const setThemeConfig = (newConfig: ThemeConfig): void => {\n set(config, newConfig);\n };\n\n /**\n * theme initializer, must be called once from the app's entry\n * @param {InitThemeOptions} options\n */\n const init = (options: InitThemeOptions): void => {\n switchThemeScheme(options.mode ?? ThemeMode.auto);\n setThemeConfig(options.config ?? { ...defaultTheme });\n };\n\n return {\n config,\n init,\n isAutoControlled,\n isDark,\n isLight,\n setThemeConfig,\n state,\n store,\n switchThemeScheme,\n theme,\n toggleThemeMode,\n };\n});\n"],"names":[],"mappings":";;;;AAWA,MAAM,SAA2B,IAAI,EAAE,GAAG,cAAc;AAMjD,MAAM,gBAAgB,uBAA2C,MAAM;AAC5E,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,CAAC,UAAU,WAAW,UAAU;AAC9B,UAAI,OAAO,aAAa,YAAY,CAAC;AACnC;AAEF,YAAM,KAAK,cAAc,SAAS,cAAc,QAAQ;AACxD,UAAI,CAAC;AACH;AAEF,SAAG,aAAa,WAAW,KAAK;AAAA,IAClC;AAAA,EAAA;AAGF,QAAM,EAAE,OAAO,MAAA,IAAU,aAAwB;AAAA,IAC/C,UAAU,MAAM,gBAAgB;AAC9B,qBAAe,IAAI;AACnB,sBAAgB,QAAQ,cAAc,IAAI;AAAA,IAC5C;AAAA,EAAA,CACD;AAMD,QAAM,mBAAyC,SAAS,MAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AAM3F,QAAM,UAAgC,SAAS,MAAM,IAAI,KAAK,MAAM,UAAU,KAAK;AAMnF,QAAM,SAA+B,SAAS,MAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AAMjF,QAAM,QAAgC,SAAS,MAAM;AACnD,QAAI,IAAI,OAAO;AACb,aAAO,IAAI,MAAM,EAAE;AAErB,WAAO,IAAI,MAAM,EAAE;AAAA,EACrB,CAAC;AAMD,QAAM,oBAAoB,CAAC,SAA0B;AACnD,QAAI,OAAO,QAAQ,UAAU,IAAI;AAAA,EACnC;AAKA,QAAM,kBAAkB,MAAY;AAClC,QAAI,IAAI,gBAAgB;AACtB,wBAAkB,UAAU,KAAK;AAAA,aAC1B,IAAI,OAAO;AAClB,wBAAkB,UAAU,IAAI;AAAA,aACzB,IAAI,MAAM;AACjB,wBAAkB,UAAU,IAAI;AAAA,EACpC;AAMA,QAAM,iBAAiB,CAAC,cAAiC;AACvD,QAAI,QAAQ,SAAS;AAAA,EACvB;AAMA,QAAM,OAAO,CAAC,YAAoC;AAChD,sBAAkB,QAAQ,QAAQ,UAAU,IAAI;AAChD,mBAAe,QAAQ,UAAU,EAAE,GAAG,cAAc;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ,CAAC;"}
@@ -1,5 +1,7 @@
1
- export declare function useTimeoutManager(): {
1
+ interface UseTimeoutManagerReturn {
2
2
  clear: () => void;
3
3
  create: (callback: () => void, delay: number) => void;
4
4
  isActive: () => boolean;
5
- };
5
+ }
6
+ export declare function useTimeoutManager(): UseTimeoutManagerReturn;
7
+ export {};
@@ -1,5 +1,5 @@
1
1
  import { get, set } from "@vueuse/shared";
2
- import { ref } from "vue";
2
+ import { ref, onScopeDispose } from "vue";
3
3
  function useTimeoutManager() {
4
4
  const timeout = ref();
5
5
  const clear = () => {
@@ -13,6 +13,7 @@ function useTimeoutManager() {
13
13
  set(timeout, setTimeout(callback, delay));
14
14
  };
15
15
  const isActive = () => !!get(timeout);
16
+ onScopeDispose(clear);
16
17
  return { clear, create, isActive };
17
18
  }
18
19
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"timeout-manager.js","sources":["../../src/composables/timeout-manager.ts"],"sourcesContent":["import { get, set } from '@vueuse/shared';\nimport { ref } from 'vue';\n\nexport function useTimeoutManager() {\n const timeout = ref<NodeJS.Timeout>();\n\n const clear = () => {\n if (get(timeout)) {\n clearTimeout(get(timeout));\n set(timeout, undefined);\n }\n };\n\n const create = (callback: () => void, delay: number) => {\n clear();\n set(timeout, setTimeout(callback, delay));\n };\n\n const isActive = () => !!get(timeout);\n\n return { clear, create, isActive };\n}\n"],"names":[],"mappings":";;AAGO,SAAS,oBAAoB;AAClC,QAAM,UAAU,IAAA;AAEhB,QAAM,QAAQ,MAAM;AAClB,QAAI,IAAI,OAAO,GAAG;AAChB,mBAAa,IAAI,OAAO,CAAC;AACzB,UAAI,SAAS,MAAS;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,UAAsB,UAAkB;AACtD,UAAA;AACA,QAAI,SAAS,WAAW,UAAU,KAAK,CAAC;AAAA,EAC1C;AAEA,QAAM,WAAW,MAAM,CAAC,CAAC,IAAI,OAAO;AAEpC,SAAO,EAAE,OAAO,QAAQ,SAAA;AAC1B;"}
1
+ {"version":3,"file":"timeout-manager.js","sources":["../../src/composables/timeout-manager.ts"],"sourcesContent":["import { get, set } from '@vueuse/shared';\nimport { onScopeDispose, ref } from 'vue';\n\ninterface UseTimeoutManagerReturn {\n clear: () => void;\n create: (callback: () => void, delay: number) => void;\n isActive: () => boolean;\n}\n\nexport function useTimeoutManager(): UseTimeoutManagerReturn {\n const timeout = ref<NodeJS.Timeout>();\n\n const clear = (): void => {\n if (get(timeout)) {\n clearTimeout(get(timeout));\n set(timeout, undefined);\n }\n };\n\n const create = (callback: () => void, delay: number): void => {\n clear();\n set(timeout, setTimeout(callback, delay));\n };\n\n const isActive = (): boolean => !!get(timeout);\n\n onScopeDispose(clear);\n\n return { clear, create, isActive };\n}\n"],"names":[],"mappings":";;AASO,SAAS,oBAA6C;AAC3D,QAAM,UAAU,IAAA;AAEhB,QAAM,QAAQ,MAAY;AACxB,QAAI,IAAI,OAAO,GAAG;AAChB,mBAAa,IAAI,OAAO,CAAC;AACzB,UAAI,SAAS,MAAS;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,UAAsB,UAAwB;AAC5D,UAAA;AACA,QAAI,SAAS,WAAW,UAAU,KAAK,CAAC;AAAA,EAC1C;AAEA,QAAM,WAAW,MAAe,CAAC,CAAC,IAAI,OAAO;AAE7C,iBAAe,KAAK;AAEpB,SAAO,EAAE,OAAO,QAAQ,SAAA;AAC1B;"}
@@ -66,7 +66,6 @@ export declare const LuAlarmSmoke: GeneratedIcon;
66
66
  export declare const LuAlbum: GeneratedIcon;
67
67
  export declare const LuAlignCenterHorizontal: GeneratedIcon;
68
68
  export declare const LuAlignCenterVertical: GeneratedIcon;
69
- export declare const LuAlignCenter: GeneratedIcon;
70
69
  export declare const LuAlignEndHorizontal: GeneratedIcon;
71
70
  export declare const LuAlignEndVertical: GeneratedIcon;
72
71
  export declare const LuAlignHorizontalDistributeCenter: GeneratedIcon;
@@ -77,9 +76,6 @@ export declare const LuAlignHorizontalJustifyEnd: GeneratedIcon;
77
76
  export declare const LuAlignHorizontalJustifyStart: GeneratedIcon;
78
77
  export declare const LuAlignHorizontalSpaceAround: GeneratedIcon;
79
78
  export declare const LuAlignHorizontalSpaceBetween: GeneratedIcon;
80
- export declare const LuAlignJustify: GeneratedIcon;
81
- export declare const LuAlignLeft: GeneratedIcon;
82
- export declare const LuAlignRight: GeneratedIcon;
83
79
  export declare const LuAlignStartHorizontal: GeneratedIcon;
84
80
  export declare const LuAlignStartVertical: GeneratedIcon;
85
81
  export declare const LuAlignVerticalDistributeCenter: GeneratedIcon;
@@ -179,6 +175,7 @@ export declare const LuBadgeTurkishLira: GeneratedIcon;
179
175
  export declare const LuBadgeX: GeneratedIcon;
180
176
  export declare const LuBadge: GeneratedIcon;
181
177
  export declare const LuBaggageClaim: GeneratedIcon;
178
+ export declare const LuBalloon: GeneratedIcon;
182
179
  export declare const LuBan: GeneratedIcon;
183
180
  export declare const LuBanana: GeneratedIcon;
184
181
  export declare const LuBandage: GeneratedIcon;
@@ -223,6 +220,7 @@ export declare const LuBinary: GeneratedIcon;
223
220
  export declare const LuBinoculars: GeneratedIcon;
224
221
  export declare const LuBiohazard: GeneratedIcon;
225
222
  export declare const LuBird: GeneratedIcon;
223
+ export declare const LuBirdhouse: GeneratedIcon;
226
224
  export declare const LuBitcoin: GeneratedIcon;
227
225
  export declare const LuBlend: GeneratedIcon;
228
226
  export declare const LuBlinds: GeneratedIcon;
@@ -253,6 +251,7 @@ export declare const LuBookOpenCheck: GeneratedIcon;
253
251
  export declare const LuBookOpenText: GeneratedIcon;
254
252
  export declare const LuBookOpen: GeneratedIcon;
255
253
  export declare const LuBookPlus: GeneratedIcon;
254
+ export declare const LuBookSearch: GeneratedIcon;
256
255
  export declare const LuBookText: GeneratedIcon;
257
256
  export declare const LuBookType: GeneratedIcon;
258
257
  export declare const LuBookUp2: GeneratedIcon;
@@ -322,11 +321,13 @@ export declare const LuCalendarSync: GeneratedIcon;
322
321
  export declare const LuCalendarX2: GeneratedIcon;
323
322
  export declare const LuCalendarX: GeneratedIcon;
324
323
  export declare const LuCalendar: GeneratedIcon;
324
+ export declare const LuCalendars: GeneratedIcon;
325
325
  export declare const LuCameraOff: GeneratedIcon;
326
326
  export declare const LuCamera: GeneratedIcon;
327
327
  export declare const LuCandyCane: GeneratedIcon;
328
328
  export declare const LuCandyOff: GeneratedIcon;
329
329
  export declare const LuCandy: GeneratedIcon;
330
+ export declare const LuCannabisOff: GeneratedIcon;
330
331
  export declare const LuCannabis: GeneratedIcon;
331
332
  export declare const LuCaptionsOff: GeneratedIcon;
332
333
  export declare const LuCaptions: GeneratedIcon;
@@ -372,6 +373,12 @@ export declare const LuCheckLine: GeneratedIcon;
372
373
  export declare const LuCheck: GeneratedIcon;
373
374
  export declare const LuChefHat: GeneratedIcon;
374
375
  export declare const LuCherry: GeneratedIcon;
376
+ export declare const LuChessBishop: GeneratedIcon;
377
+ export declare const LuChessKing: GeneratedIcon;
378
+ export declare const LuChessKnight: GeneratedIcon;
379
+ export declare const LuChessPawn: GeneratedIcon;
380
+ export declare const LuChessQueen: GeneratedIcon;
381
+ export declare const LuChessRook: GeneratedIcon;
375
382
  export declare const LuChevronDown: GeneratedIcon;
376
383
  export declare const LuChevronFirst: GeneratedIcon;
377
384
  export declare const LuChevronLast: GeneratedIcon;
@@ -422,6 +429,7 @@ export declare const LuCircleParkingOff: GeneratedIcon;
422
429
  export declare const LuCircleParking: GeneratedIcon;
423
430
  export declare const LuCirclePause: GeneratedIcon;
424
431
  export declare const LuCirclePercent: GeneratedIcon;
432
+ export declare const LuCirclePile: GeneratedIcon;
425
433
  export declare const LuCirclePlay: GeneratedIcon;
426
434
  export declare const LuCirclePlus: GeneratedIcon;
427
435
  export declare const LuCirclePoundSterling: GeneratedIcon;
@@ -466,11 +474,13 @@ export declare const LuClock9: GeneratedIcon;
466
474
  export declare const LuClockAlert: GeneratedIcon;
467
475
  export declare const LuClockArrowDown: GeneratedIcon;
468
476
  export declare const LuClockArrowUp: GeneratedIcon;
477
+ export declare const LuClockCheck: GeneratedIcon;
469
478
  export declare const LuClockFading: GeneratedIcon;
470
479
  export declare const LuClockPlus: GeneratedIcon;
471
480
  export declare const LuClock: GeneratedIcon;
472
481
  export declare const LuClosedCaption: GeneratedIcon;
473
482
  export declare const LuCloudAlert: GeneratedIcon;
483
+ export declare const LuCloudBackup: GeneratedIcon;
474
484
  export declare const LuCloudCheck: GeneratedIcon;
475
485
  export declare const LuCloudCog: GeneratedIcon;
476
486
  export declare const LuCloudDownload: GeneratedIcon;
@@ -486,16 +496,6 @@ export declare const LuCloudRain: GeneratedIcon;
486
496
  export declare const LuCloudSnow: GeneratedIcon;
487
497
  export declare const LuCloudSunRain: GeneratedIcon;
488
498
  export declare const LuCloudSun: GeneratedIcon;
499
+ export declare const LuCloudSync: GeneratedIcon;
489
500
  export declare const LuCloudUpload: GeneratedIcon;
490
501
  export declare const LuCloud: GeneratedIcon;
491
- export declare const LuCloudy: GeneratedIcon;
492
- export declare const LuClover: GeneratedIcon;
493
- export declare const LuClub: GeneratedIcon;
494
- export declare const LuCodeXml: GeneratedIcon;
495
- export declare const LuCode: GeneratedIcon;
496
- export declare const LuCodepen: GeneratedIcon;
497
- export declare const LuCodesandbox: GeneratedIcon;
498
- export declare const LuCoffee: GeneratedIcon;
499
- export declare const LuCog: GeneratedIcon;
500
- export declare const LuCoins: GeneratedIcon;
501
- export declare const LuColumns2: GeneratedIcon;