@rotki/ui-library 2.23.5 → 2.25.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 (337) hide show
  1. package/README.md +1 -2
  2. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  3. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  4. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
  5. package/dist/components/avatars/RuiAvatar.vue.d.ts +1 -1
  6. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/components/avatars/RuiAvatarGroup.js.map +1 -1
  8. package/dist/components/avatars/RuiAvatarGroup.vue.d.ts +1 -1
  9. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/avatars/use-avatar-group.d.ts +1 -1
  11. package/dist/components/buttons/button/RuiButton.vue.d.ts +1 -1
  12. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/buttons/button/button-styles.d.ts +40 -2
  14. package/dist/components/buttons/button/button-styles.js +38 -0
  15. package/dist/components/buttons/button/button-styles.js.map +1 -1
  16. package/dist/components/buttons/button-group/RuiButtonGroup.js.map +1 -1
  17. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +1 -1
  18. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +26 -14
  19. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  20. package/dist/components/calendar/RuiCalendar.js.map +1 -1
  21. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  22. package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
  23. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +7 -0
  24. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/calendar/RuiCalendarHeader.vue.d.ts +1 -1
  26. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  27. package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
  28. package/dist/components/calendar/RuiCalendarMenu.vue.d.ts +1 -1
  29. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +1 -0
  30. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  31. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/chips/RuiChip.vue.d.ts +1 -1
  34. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +2 -1
  38. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
  39. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  42. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +18 -2
  43. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +73 -28
  44. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.d.ts +2 -2
  46. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  47. package/dist/components/date-time-picker/RuiTimezoneSelect.vue.d.ts +3 -3
  48. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  49. package/dist/components/date-time-picker/date-time-picker-styles.d.ts +48 -3
  50. package/dist/components/date-time-picker/partial-time.d.ts +35 -0
  51. package/dist/components/date-time-picker/partial-time.js +82 -0
  52. package/dist/components/date-time-picker/partial-time.js.map +1 -0
  53. package/dist/components/date-time-picker/segment-config.d.ts +1 -1
  54. package/dist/components/date-time-picker/segment-utils.d.ts +2 -2
  55. package/dist/components/date-time-picker/segment-utils.js +17 -5
  56. package/dist/components/date-time-picker/segment-utils.js.map +1 -1
  57. package/dist/components/date-time-picker/timezones.js.map +1 -1
  58. package/dist/components/date-time-picker/use-date-bounds.d.ts +28 -0
  59. package/dist/components/date-time-picker/use-date-bounds.js +60 -0
  60. package/dist/components/date-time-picker/use-date-bounds.js.map +1 -0
  61. package/dist/components/date-time-picker/use-date-time-selection.d.ts +16 -12
  62. package/dist/components/date-time-picker/use-date-time-selection.js +126 -115
  63. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
  64. package/dist/components/date-time-picker/use-input-handler.d.ts +1 -1
  65. package/dist/components/date-time-picker/use-keyboard-handler.d.ts +2 -2
  66. package/dist/components/date-time-picker/use-keyboard-handler.js +52 -13
  67. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  68. package/dist/components/date-time-picker/utils.d.ts +1 -1
  69. package/dist/components/date-time-picker/utils.js.map +1 -1
  70. package/dist/components/divider/RuiDivider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  71. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  72. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +2 -2
  73. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +136 -158
  74. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  75. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.js +7 -0
  76. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.js.map +1 -0
  77. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue.d.ts +45 -0
  78. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js +58 -0
  79. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js.map +1 -0
  80. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js +7 -0
  81. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js.map +1 -0
  82. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue.d.ts +70 -0
  83. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js +140 -0
  84. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js.map +1 -0
  85. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js +7 -0
  86. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js.map +1 -0
  87. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue.d.ts +39 -0
  88. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js +56 -0
  89. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js.map +1 -0
  90. package/dist/components/forms/auto-complete/auto-complete-styles.d.ts +48 -3
  91. package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -1
  92. package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +2 -2
  93. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +49 -5
  94. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  95. package/dist/components/forms/category-picker/category-picker-styles.d.ts +69 -5
  96. package/dist/components/forms/category-picker/category-picker-styles.js +19 -0
  97. package/dist/components/forms/category-picker/category-picker-styles.js.map +1 -1
  98. package/dist/components/forms/check-control-styles.d.ts +2 -2
  99. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  100. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  101. package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -1
  102. package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +1 -1
  103. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  104. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.js.map +1 -1
  106. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  107. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +1 -1
  108. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
  110. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +2 -2
  111. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +10 -8
  112. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  113. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  114. package/dist/components/forms/select/menu-select-styles.d.ts +48 -3
  115. package/dist/components/forms/slider/RuiSlider.js.map +1 -1
  116. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js +22 -12
  117. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/components/forms/slider/RuiSliderTicks.js +7 -0
  119. package/dist/components/forms/slider/RuiSliderTicks.js.map +1 -0
  120. package/dist/components/forms/slider/RuiSliderTicks.vue.d.ts +15 -0
  121. package/dist/components/forms/slider/RuiSliderTicks.vue_vue_type_script_setup_true_lang.js +59 -0
  122. package/dist/components/forms/slider/RuiSliderTicks.vue_vue_type_script_setup_true_lang.js.map +1 -0
  123. package/dist/components/forms/slider/slider-styles.d.ts +2 -2
  124. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  125. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +1 -1
  126. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  127. package/dist/components/forms/text-area/text-area-styles.d.ts +3 -3
  128. package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
  129. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +3 -3
  130. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  131. package/dist/components/forms/text-field/text-field-styles.d.ts +37 -4
  132. package/dist/components/forms/text-field/text-field-styles.js +34 -1
  133. package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
  134. package/dist/components/forms/text-input-styles.d.ts +20 -5
  135. package/dist/components/forms/text-input-styles.js +16 -1
  136. package/dist/components/forms/text-input-styles.js.map +1 -1
  137. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  138. package/dist/components/icons/RuiIcon.js.map +1 -1
  139. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +26 -0
  140. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  141. package/dist/components/index.d.ts +57 -53
  142. package/dist/components/index.js +5 -1
  143. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  144. package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +2 -2
  145. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  146. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js.map +1 -1
  147. package/dist/components/logos/use-logo-sources.d.ts +1 -1
  148. package/dist/components/logos/use-logo-sources.js +6 -1
  149. package/dist/components/logos/use-logo-sources.js.map +1 -1
  150. package/dist/components/overlays/badge/RuiBadge.vue.d.ts +1 -1
  151. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  152. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.js.map +1 -1
  153. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.d.ts +1 -0
  154. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue_vue_type_script_setup_true_lang.js.map +1 -1
  155. package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
  156. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +2 -0
  157. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +15 -1
  158. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  159. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  160. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +20 -0
  161. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  162. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
  163. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
  165. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/components/overlays/tooltip/tooltip-styles.d.ts +2 -2
  167. package/dist/components/progress/RuiProgress.js.map +1 -1
  168. package/dist/components/progress/RuiProgress.vue.d.ts +3 -3
  169. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/components/steppers/RuiFooterStepper.vue.d.ts +1 -1
  171. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  172. package/dist/components/steppers/RuiStepper.js.map +1 -1
  173. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +8 -0
  174. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  175. package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  176. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/components/tables/RuiDataTable.js.map +1 -1
  178. package/dist/components/tables/RuiDataTable.vue.d.ts +5 -6
  179. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +42 -22
  180. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  182. package/dist/components/tables/RuiTable.js +7 -0
  183. package/dist/components/tables/RuiTable.js.map +1 -0
  184. package/dist/components/tables/RuiTable.vue.d.ts +40 -0
  185. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js +95 -0
  186. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  187. package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
  188. package/dist/components/tables/RuiTableEmptyState.vue.d.ts +5 -0
  189. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +25 -10
  190. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  191. package/dist/components/tables/RuiTableErrorState.js +7 -0
  192. package/dist/components/tables/RuiTableErrorState.js.map +1 -0
  193. package/dist/components/tables/RuiTableErrorState.vue.d.ts +28 -0
  194. package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js +44 -0
  195. package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js.map +1 -0
  196. package/dist/components/tables/RuiTableHead.js.map +1 -1
  197. package/dist/components/tables/RuiTableHead.vue.d.ts +5 -9
  198. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  199. package/dist/components/tables/RuiTableLoadingState.js +7 -0
  200. package/dist/components/tables/RuiTableLoadingState.js.map +1 -0
  201. package/dist/components/tables/RuiTableLoadingState.vue.d.ts +13 -0
  202. package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js +40 -0
  203. package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js.map +1 -0
  204. package/dist/components/tables/RuiTablePagination.vue.d.ts +1 -1
  205. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +2 -1
  206. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  207. package/dist/components/tables/data-table/RuiDataTableBody.vue.d.ts +1 -1
  208. package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js.map +1 -1
  209. package/dist/components/tables/data-table/RuiDataTableCell.js.map +1 -1
  210. package/dist/components/tables/data-table/RuiDataTableCell.vue.d.ts +1 -1
  211. package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js +6 -0
  212. package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  213. package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  214. package/dist/components/tables/data-table/RuiDataTableExpandedRow.js.map +1 -1
  215. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js +6 -0
  216. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  217. package/dist/components/tables/data-table/RuiDataTableGroupRow.js.map +1 -1
  218. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js +5 -0
  219. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  220. package/dist/components/tables/data-table/RuiDataTableLoadingRow.js.map +1 -1
  221. package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js +2 -6
  222. package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/components/tables/data-table/RuiDataTableMobileSort.js.map +1 -1
  224. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue.d.ts +2 -2
  225. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js +4 -0
  226. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
  227. package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -1
  228. package/dist/components/tables/data-table/RuiDataTableRow.vue.d.ts +1 -1
  229. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +25 -0
  230. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  231. package/dist/components/tables/data-table/context.d.ts +2 -3
  232. package/dist/components/tables/data-table/context.js.map +1 -1
  233. package/dist/components/tables/data-table-styles.d.ts +2 -5
  234. package/dist/components/tables/data-table-styles.js +1 -2
  235. package/dist/components/tables/data-table-styles.js.map +1 -1
  236. package/dist/components/tabs/tab/RuiTab.js.map +1 -1
  237. package/dist/components/tabs/tab/RuiTab.vue.d.ts +1 -1
  238. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  239. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  240. package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
  241. package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +9 -0
  242. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +16 -0
  243. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
  244. package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
  245. package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +6 -1
  246. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +12 -0
  247. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  248. package/dist/components/tabs/tabs/use-tab-routing.d.ts +1 -1
  249. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  250. package/dist/components/time-picker/time-picker-styles.d.ts +2 -2
  251. package/dist/composables/colors/index.d.ts +3 -3
  252. package/dist/composables/dropdown-menu.d.ts +2 -2
  253. package/dist/composables/dropdown-menu.js +26 -23
  254. package/dist/composables/dropdown-menu.js.map +1 -1
  255. package/dist/composables/floating.d.ts +7 -8
  256. package/dist/composables/floating.js +19 -14
  257. package/dist/composables/floating.js.map +1 -1
  258. package/dist/composables/forms/auto-complete/focus.js +5 -0
  259. package/dist/composables/forms/auto-complete/focus.js.map +1 -1
  260. package/dist/composables/forms/auto-complete/keyboard-navigation.js +12 -5
  261. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  262. package/dist/composables/forms/auto-complete/search.d.ts +1 -1
  263. package/dist/composables/forms/auto-complete/search.js +5 -0
  264. package/dist/composables/forms/auto-complete/search.js.map +1 -1
  265. package/dist/composables/forms/auto-complete/value.js.map +1 -1
  266. package/dist/composables/forms/category-picker/use-category-picker.d.ts +1 -1
  267. package/dist/composables/forms/category-picker/use-category-picker.js +1 -0
  268. package/dist/composables/forms/category-picker/use-category-picker.js.map +1 -1
  269. package/dist/composables/forms/use-prepend-append-width.d.ts +18 -3
  270. package/dist/composables/forms/use-prepend-append-width.js +18 -3
  271. package/dist/composables/forms/use-prepend-append-width.js.map +1 -1
  272. package/dist/composables/index.d.ts +4 -3
  273. package/dist/composables/index.js +2 -1
  274. package/dist/composables/overlay-stack.d.ts +52 -0
  275. package/dist/composables/overlay-stack.js +93 -0
  276. package/dist/composables/overlay-stack.js.map +1 -0
  277. package/dist/composables/sticky-header.js.map +1 -1
  278. package/dist/composables/tables/data-table/expansion.js +7 -0
  279. package/dist/composables/tables/data-table/expansion.js.map +1 -1
  280. package/dist/composables/tables/data-table/grouping.d.ts +1 -1
  281. package/dist/composables/tables/data-table/pagination.d.ts +2 -2
  282. package/dist/composables/tables/data-table/selection.d.ts +1 -1
  283. package/dist/composables/tables/data-table/selection.js +37 -34
  284. package/dist/composables/tables/data-table/selection.js.map +1 -1
  285. package/dist/composables/theme.d.ts +4 -2
  286. package/dist/composables/theme.js +18 -24
  287. package/dist/composables/theme.js.map +1 -1
  288. package/dist/i18n/keys.d.ts +1 -1
  289. package/dist/i18n/keys.js +1 -1
  290. package/dist/i18n/keys.js.map +1 -1
  291. package/dist/icons/icons_1.d.ts +8 -8
  292. package/dist/icons/icons_1.js +246 -223
  293. package/dist/icons/icons_1.js.map +1 -1
  294. package/dist/icons/icons_2.d.ts +26 -26
  295. package/dist/icons/icons_2.js +320 -400
  296. package/dist/icons/icons_2.js.map +1 -1
  297. package/dist/icons/icons_3.d.ts +46 -46
  298. package/dist/icons/icons_3.js +661 -706
  299. package/dist/icons/icons_3.js.map +1 -1
  300. package/dist/icons/icons_4.d.ts +63 -63
  301. package/dist/icons/icons_4.js +4347 -4480
  302. package/dist/icons/icons_4.js.map +1 -1
  303. package/dist/icons/icons_5.d.ts +60 -1
  304. package/dist/icons/icons_5.js +774 -31
  305. package/dist/icons/icons_5.js.map +1 -1
  306. package/dist/icons/index.d.ts +1 -1
  307. package/dist/icons/index.js +84 -25
  308. package/dist/icons/index.js.map +1 -1
  309. package/dist/index.js +11 -6
  310. package/dist/index.js.map +1 -1
  311. package/dist/style.css +83 -10
  312. package/dist/theme/index.js +1 -0
  313. package/dist/theme/index.js.map +1 -1
  314. package/dist/types/theme.d.ts +1 -1
  315. package/dist/utils/assert.js +2 -2
  316. package/dist/utils/assert.js.map +1 -1
  317. package/dist/utils/blockie.d.ts +4 -0
  318. package/dist/utils/blockie.js +8 -0
  319. package/dist/utils/blockie.js.map +1 -1
  320. package/dist/utils/helpers.d.ts +24 -18
  321. package/dist/utils/helpers.js +28 -21
  322. package/dist/utils/helpers.js.map +1 -1
  323. package/dist/utils/is-equal.d.ts +9 -0
  324. package/dist/utils/is-equal.js +22 -15
  325. package/dist/utils/is-equal.js.map +1 -1
  326. package/dist/utils/tv.d.ts +6 -2
  327. package/dist/utils/tv.js +30 -14
  328. package/dist/utils/tv.js.map +1 -1
  329. package/dist/vite-plugin/client.d.ts +1 -1
  330. package/dist/vite-plugin/index.js +29 -21
  331. package/dist/vite-plugin/index.js.map +1 -1
  332. package/dist/vite-plugin/scanner.d.ts +5 -2
  333. package/dist/vite-plugin/scanner.js +5 -2
  334. package/dist/vite-plugin/scanner.js.map +1 -1
  335. package/dist/vite-plugin/types.d.ts +4 -8
  336. package/dist/web-types.json +872 -50
  337. package/package.json +32 -33
@@ -0,0 +1,93 @@
1
+ import { computed, onScopeDispose, ref, toValue, watch } from "vue";
2
+ import { get, set } from "@vueuse/shared";
3
+ //#region src/composables/overlay-stack.ts
4
+ /**
5
+ * Module scoped rather than per call. Layers stack in the window, not in a
6
+ * component tree, and whatever pops them (a router guard, a hardware back
7
+ * button) runs outside any component, so both sides have to read one list.
8
+ *
9
+ * Order is the order layers opened, not their `zIndex`: every RuiDialog carries
10
+ * the same default z-index, so it says nothing about which is on top.
11
+ */
12
+ var overlays = ref([]);
13
+ var nextId = 0;
14
+ function useOverlayStack() {
15
+ const hasOverlay = computed(() => get(overlays).some((layer) => layer.isOpen()));
16
+ function register(isOpen, dismiss) {
17
+ const id = nextId++;
18
+ set(overlays, [...get(overlays), {
19
+ dismiss,
20
+ id,
21
+ isOpen
22
+ }]);
23
+ return id;
24
+ }
25
+ function unregister(id) {
26
+ set(overlays, get(overlays).filter((overlay) => overlay.id !== id));
27
+ }
28
+ function dismissTop() {
29
+ const layers = get(overlays);
30
+ for (let index = layers.length - 1; index >= 0; index--) {
31
+ const layer = layers[index];
32
+ if (!layer?.isOpen()) continue;
33
+ layer.dismiss();
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+ return {
39
+ dismissTop,
40
+ hasOverlay,
41
+ register,
42
+ unregister
43
+ };
44
+ }
45
+ /**
46
+ * Declares something as a layer the stack should be able to take down.
47
+ *
48
+ * RuiDialog does this for itself, and RuiBottomSheet through it. Anything else
49
+ * covering the page - a custom panel, a wrapper around RuiMenu - opts in here.
50
+ *
51
+ * @param open - whether the layer is showing; the registration follows it, so the
52
+ * stack ends up ordered by when layers opened rather than when they were built
53
+ * @param dismiss - what the gesture should do, which is whatever the layer's own
54
+ * close control does. It may decline, and the layer then stays in the stack, so
55
+ * the gesture keeps being swallowed for as long as the layer is up. Deciding
56
+ * inside `dismiss` rather than by dropping out of `open` matters: a dialog that
57
+ * turns persistent partway through its life would otherwise leave the stack
58
+ * exactly when the gesture costs most.
59
+ */
60
+ function useDismissableOverlay(open, dismiss) {
61
+ const { register, unregister } = useOverlayStack();
62
+ let id;
63
+ function drop() {
64
+ if (id === void 0) return;
65
+ unregister(id);
66
+ id = void 0;
67
+ }
68
+ watch(() => toValue(open), (isOpen) => {
69
+ if (isOpen && id === void 0) id = register(() => toValue(open), dismiss);
70
+ else if (!isOpen) drop();
71
+ }, { immediate: true });
72
+ /**
73
+ * A layer whose component is torn down never sets `open` back to false, and
74
+ * would sit in the stack for the rest of the session swallowing every later
75
+ * gesture.
76
+ */
77
+ onScopeDispose(drop);
78
+ }
79
+ /**
80
+ * Empties the stack.
81
+ *
82
+ * The stack outlives any component, and the unit project runs on a pool that
83
+ * shares one module registry across the files in a worker, so without this a
84
+ * layer left behind by one spec is still listed in the next.
85
+ */
86
+ function resetOverlayStack() {
87
+ set(overlays, []);
88
+ nextId = 0;
89
+ }
90
+ //#endregion
91
+ export { resetOverlayStack, useDismissableOverlay, useOverlayStack };
92
+
93
+ //# sourceMappingURL=overlay-stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-stack.js","names":[],"sources":["../../src/composables/overlay-stack.ts"],"sourcesContent":["import { get, set } from '@vueuse/shared';\nimport { computed, type ComputedRef, type MaybeRefOrGetter, onScopeDispose, ref, toValue, watch } from 'vue';\n\n/** One layer covering the page, and the way to ask it to go. */\ninterface OverlayLayer {\n readonly id: number;\n /**\n * Whether the layer is still showing. A getter rather than a boolean, so the\n * stack reads it live: a layer is asked to dismiss long before it leaves, and\n * between those two moments it is listed but no longer up.\n */\n readonly isOpen: () => boolean;\n readonly dismiss: () => void;\n}\n\n/**\n * Module scoped rather than per call. Layers stack in the window, not in a\n * component tree, and whatever pops them (a router guard, a hardware back\n * button) runs outside any component, so both sides have to read one list.\n *\n * Order is the order layers opened, not their `zIndex`: every RuiDialog carries\n * the same default z-index, so it says nothing about which is on top.\n */\nconst overlays = ref<OverlayLayer[]>([]);\n\nlet nextId = 0;\n\nexport interface UseOverlayStackReturn {\n /**\n * Whether any layer is still showing. Counts what is up rather than what is\n * registered, since a layer that was asked to dismiss stays listed until its\n * own open state says otherwise.\n */\n hasOverlay: ComputedRef<boolean>;\n /**\n * Asks the topmost layer still showing to dismiss itself, and reports whether\n * there was one. The caller needs that answer to tell a gesture it handled\n * from one it has to let through.\n *\n * Nothing is removed here. A layer leaves only when its own open state says\n * so, because dismissing is a request the layer may decline: a persistent\n * dialog refuses outright, and a dirty form may raise a discard prompt and\n * stay up. Dropping the layer here would deregister something still covering\n * the page, and the next gesture would sail past it.\n *\n * A layer that declines still counts as handled, so the gesture is swallowed\n * rather than passed through to whatever is underneath.\n */\n dismissTop: () => boolean;\n /** Adds a layer on top. Returns the handle it is removed with. */\n register: (isOpen: () => boolean, dismiss: () => void) => number;\n unregister: (id: number) => void;\n}\n\nexport function useOverlayStack(): UseOverlayStackReturn {\n const hasOverlay = computed<boolean>(() => get(overlays).some(layer => layer.isOpen()));\n\n function register(isOpen: () => boolean, dismiss: () => void): number {\n const id = nextId++;\n set(overlays, [...get(overlays), { dismiss, id, isOpen }]);\n return id;\n }\n\n function unregister(id: number): void {\n set(overlays, get(overlays).filter(overlay => overlay.id !== id));\n }\n\n function dismissTop(): boolean {\n const layers = get(overlays);\n\n for (let index = layers.length - 1; index >= 0; index--) {\n const layer = layers[index];\n\n if (!layer?.isOpen())\n continue;\n\n layer.dismiss();\n return true;\n }\n\n return false;\n }\n\n return { dismissTop, hasOverlay, register, unregister };\n}\n\n/**\n * Declares something as a layer the stack should be able to take down.\n *\n * RuiDialog does this for itself, and RuiBottomSheet through it. Anything else\n * covering the page - a custom panel, a wrapper around RuiMenu - opts in here.\n *\n * @param open - whether the layer is showing; the registration follows it, so the\n * stack ends up ordered by when layers opened rather than when they were built\n * @param dismiss - what the gesture should do, which is whatever the layer's own\n * close control does. It may decline, and the layer then stays in the stack, so\n * the gesture keeps being swallowed for as long as the layer is up. Deciding\n * inside `dismiss` rather than by dropping out of `open` matters: a dialog that\n * turns persistent partway through its life would otherwise leave the stack\n * exactly when the gesture costs most.\n */\nexport function useDismissableOverlay(open: MaybeRefOrGetter<boolean>, dismiss: () => void): void {\n const { register, unregister } = useOverlayStack();\n\n let id: number | undefined;\n\n function drop(): void {\n if (id === undefined)\n return;\n\n unregister(id);\n id = undefined;\n }\n\n watch(() => toValue(open), (isOpen) => {\n if (isOpen && id === undefined)\n id = register(() => toValue(open), dismiss);\n else if (!isOpen)\n drop();\n }, { immediate: true });\n\n /**\n * A layer whose component is torn down never sets `open` back to false, and\n * would sit in the stack for the rest of the session swallowing every later\n * gesture.\n */\n onScopeDispose(drop);\n}\n\n/**\n * Empties the stack.\n *\n * The stack outlives any component, and the unit project runs on a pool that\n * shares one module registry across the files in a worker, so without this a\n * layer left behind by one spec is still listed in the next.\n */\nexport function resetOverlayStack(): void {\n set(overlays, []);\n nextId = 0;\n}\n"],"mappings":";;;;;;;;;;;AAuBA,IAAM,WAAW,IAAoB,CAAC,CAAC;AAEvC,IAAI,SAAS;AA6Bb,SAAgB,kBAAyC;CACvD,MAAM,aAAa,eAAwB,IAAI,QAAQ,CAAC,CAAC,MAAK,UAAS,MAAM,OAAO,CAAC,CAAC;CAEtF,SAAS,SAAS,QAAuB,SAA6B;EACpE,MAAM,KAAK;EACX,IAAI,UAAU,CAAC,GAAG,IAAI,QAAQ,GAAG;GAAE;GAAS;GAAI;EAAO,CAAC,CAAC;EACzD,OAAO;CACT;CAEA,SAAS,WAAW,IAAkB;EACpC,IAAI,UAAU,IAAI,QAAQ,CAAC,CAAC,QAAO,YAAW,QAAQ,OAAO,EAAE,CAAC;CAClE;CAEA,SAAS,aAAsB;EAC7B,MAAM,SAAS,IAAI,QAAQ;EAE3B,KAAK,IAAI,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS;GACvD,MAAM,QAAQ,OAAO;GAErB,IAAI,CAAC,OAAO,OAAO,GACjB;GAEF,MAAM,QAAQ;GACd,OAAO;EACT;EAEA,OAAO;CACT;CAEA,OAAO;EAAE;EAAY;EAAY;EAAU;CAAW;AACxD;;;;;;;;;;;;;;;;AAiBA,SAAgB,sBAAsB,MAAiC,SAA2B;CAChG,MAAM,EAAE,UAAU,eAAe,gBAAgB;CAEjD,IAAI;CAEJ,SAAS,OAAa;EACpB,IAAI,OAAO,KAAA,GACT;EAEF,WAAW,EAAE;EACb,KAAK,KAAA;CACP;CAEA,YAAY,QAAQ,IAAI,IAAI,WAAW;EACrC,IAAI,UAAU,OAAO,KAAA,GACnB,KAAK,eAAe,QAAQ,IAAI,GAAG,OAAO;OACvC,IAAI,CAAC,QACR,KAAK;CACT,GAAG,EAAE,WAAW,KAAK,CAAC;;;;;;CAOtB,eAAe,IAAI;AACrB;;;;;;;;AASA,SAAgB,oBAA0B;CACxC,IAAI,UAAU,CAAC,CAAC;CAChB,SAAS;AACX"}
@@ -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 tableScroller: Readonly<ShallowRef<HTMLElement | 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}\n\nfunction positionHeadStuck(head: HTMLElement, { clonedRect, lastRowHeight, tableRect, top }: StuckPosition): void {\n head.style.left = `${clonedRect.left + BORDER_PRECISION}px`;\n\n const isNearBottom = tableRect.bottom <= lastRowHeight + clonedRect.height + top;\n head.style.top = isNearBottom\n ? `${tableRect.bottom - lastRowHeight - clonedRect.height}px`\n : `${top}px`;\n}\n\nfunction isInStickyRange(tableRect: DOMRect, top: number): boolean {\n return tableRect.top <= top && tableRect.bottom > top;\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, tableScroller } = 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 // Single-frame sync: the main thead is position absolute/fixed so clearing\n // its widths is unnecessary clone widths are independent of main widths.\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 top = toValue(offsetTop) ?? 0;\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, 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 onMounted(() => {\n toggleStickyClass();\n useEventListener(tableScroller, 'scroll', throttledToggleStickyClass);\n useEventListener(document.body, 'scroll', throttledToggleStickyClass);\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 tableScroller: Readonly<ShallowRef<HTMLElement | 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}\n\nfunction positionHeadStuck(head: HTMLElement, { clonedRect, lastRowHeight, tableRect, top }: StuckPosition): void {\n head.style.left = `${clonedRect.left + BORDER_PRECISION}px`;\n\n const isNearBottom = tableRect.bottom <= lastRowHeight + clonedRect.height + top;\n head.style.top = isNearBottom\n ? `${tableRect.bottom - lastRowHeight - clonedRect.height}px`\n : `${top}px`;\n}\n\nfunction isInStickyRange(tableRect: DOMRect, top: number): boolean {\n return tableRect.top <= top && tableRect.bottom > top;\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, tableScroller } = 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 top = toValue(offsetTop) ?? 0;\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, 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 onMounted(() => {\n toggleStickyClass();\n useEventListener(tableScroller, 'scroll', throttledToggleStickyClass);\n useEventListener(document.body, 'scroll', throttledToggleStickyClass);\n useEventListener(window, 'resize', throttledToggleStickyClass);\n watchCellWidth();\n });\n\n return {\n stick: readonly(stick),\n };\n}\n"],"mappings":";;;;AAiBA,IAAM,YAAY;CAChB,MAAM;CACN,WAAW;CACX,KAAK;CACL,IAAI;AACN;AAEA,IAAM,mBAAmB;AAEzB,SAAS,aAAa,MAAwB,UAA8C;CAC1F,OAAO,KAAK,cAAc,GAAG,SAAS,MAAM;AAC9C;AAEA,SAAS,aAAa,KAAgD;CACpE,IAAI,CAAC,KACH,OAAO,CAAC;CACV,OAAO,MAAM,KAAK,IAAI,iBAA8B,UAAU,EAAE,CAAC;AACnE;AAEA,SAAS,iBAAiB,SAAkC;CAC1D,OAAO,QAAQ,KAAI,QAAO,IAAI,sBAAsB,CAAC,CAAC,KAAK;AAC7D;AAEA,SAAS,kBAAkB,SAAwB,QAAwB;CACzE,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GAAG;EAC3C,MAAM,QAAQ,OAAO;EACrB,IAAI,UAAU,KAAA,GACZ,OAAO,MAAM,QAAQ,GAAG,MAAM;CAClC;AACF;AAEA,SAAS,mBAAmB,MAAyB;CACnD,KAAK,MAAM,OAAO,GAAG,iBAAiB;CACtC,KAAK,MAAM,MAAM;AACnB;AASA,SAAS,kBAAkB,MAAmB,EAAE,YAAY,eAAe,WAAW,OAA4B;CAChH,KAAK,MAAM,OAAO,GAAG,WAAW,OAAO,iBAAiB;CAExD,MAAM,eAAe,UAAU,UAAU,gBAAgB,WAAW,SAAS;CAC7E,KAAK,MAAM,MAAM,eACb,GAAG,UAAU,SAAS,gBAAgB,WAAW,OAAO,MACxD,GAAG,IAAI;AACb;AAEA,SAAS,gBAAgB,WAAoB,KAAsB;CACjE,OAAO,UAAU,OAAO,OAAO,UAAU,SAAS;AACpD;AAEA,SAAS,iBAAiB,MAA4C;CACpE,MAAM,OAAO,KAAK,iBAAiB,UAAU,GAAG;CAChD,IAAI,KAAK,UAAU,GACjB,OAAO,KAAA;CACT,OAAO,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,UAAU;AACvE;;;;AAKA,SAAgB,qBACd,SAAoC,WAAW,KAAK,GACpD,WACA,WAC4B;CAC5B,MAAM,EAAE,OAAO,kBAAkB;CACjC,MAAM,QAAQ,WAAoB,KAAK;CAEvC,IAAI,iBAAiC,CAAC;CACtC,IAAI,YAA2B;CAC/B,IAAI,QAAuB;CAE3B,SAAS,yBAA+B;EACtC,KAAK,MAAM,WAAW,gBACpB,QAAQ;EACV,iBAAiB,CAAC;CACpB;CAEA,SAAS,oBAA0B;EACjC,IAAI,cAAc,MAChB,qBAAqB,SAAS;EAChC,YAAY;CACd;CAEA,SAAS,mBAAmB,cAA6B,aAAkC;EACzF,kBAAkB;EAGlB,YAAY,4BAA4B;GACtC,YAAY;GACZ,kBAAkB,aAAa,iBAAiB,YAAY,CAAC;EAC/D,CAAC;CACH;CAEA,SAAS,qBAAqB,cAA6B,aAAkC;EAC3F,uBAAuB;EAEvB,KAAK,MAAM,MAAM,cAAc;GAC7B,MAAM,EAAE,SAAS,kBAAkB,UAAU;IAC3C,mBAAmB,cAAc,WAAW;GAC9C,CAAC;GACD,eAAe,KAAK,IAAI;EAC1B;CACF;CAEA,SAAS,iBAAuB;EAC9B,MAAM,OAAO,MAAI,KAAK;EACtB,IAAI,CAAC,QAAQ,MAAM,KAAK,CAAC,MACvB;EAEF,MAAM,WAAW,aAAa,MAAM,UAAU,SAAS;EACvD,MAAM,UAAU,aAAa,MAAM,UAAU,IAAI;EACjD,MAAM,eAAe,aAAa,QAAQ;EAC1C,MAAM,cAAc,aAAa,OAAO;EAExC,oBAAoB,WAAW,cAAc;GAI3C,IAH4B,UAAU,MACpC,MAAK,EAAE,SAAS,eAAe,EAAE,SAAS,YAExC,GACF,qBAAqB,aAAa,QAAQ,GAAG,aAAa,OAAO,CAAC;EACtE,GAAG;GAAE,YAAY;GAAM,WAAW;GAAM,SAAS;EAAK,CAAC;EAEvD,qBAAqB,cAAc,WAAW;CAChD;CAEA,SAAS,sBAAkD;EACzD,MAAM,OAAO,MAAI,KAAK;EACtB,IAAI,CAAC,QAAQ,MAAM,KAAK,CAAC,MACvB,OAAO,KAAA;EAET,MAAM,aAAa,KAAK,cAA2B,UAAU,SAAS;EACtE,MAAM,OAAO,KAAK,cAA2B,UAAU,IAAI;EAC3D,IAAI,CAAC,cAAc,CAAC,MAClB,OAAO,KAAA;EAET,OAAO;GAAE;GAAM;GAAM;EAAW;CAClC;CAEA,SAAS,oBAA0B;EACjC,MAAM,WAAW,oBAAoB;EACrC,IAAI,CAAC,UACH;EAEF,MAAM,EAAE,MAAM,MAAM,eAAe;EACnC,MAAM,aAAa,WAAW,sBAAsB;EACpD,MAAM,YAAY,KAAK,sBAAsB;EAC7C,MAAM,MAAM,QAAQ,SAAS,KAAK;EAElC,KAAK,MAAM,QAAQ,GAAG,WAAW,MAAM;EAEvC,MAAM,gBAAgB,iBAAiB,IAAI;EAC3C,IAAI,kBAAkB,KAAA,GAAW;GAC/B,MAAI,OAAO,KAAK;GAChB,mBAAmB,IAAI;GACvB;EACF;EAEA,IAAI,gBAAgB,WAAW,GAAG,GAAG;GACnC,MAAI,OAAO,IAAI;GACf,kBAAkB,MAAM;IAAE;IAAY;IAAe;IAAW;GAAI,CAAC;EACvE,OACK;GACH,MAAI,OAAO,KAAK;GAChB,mBAAmB,IAAI;EACzB;CACF;CAEA,SAAS,6BAAmC;EAC1C,IAAI,UAAU,MACZ;EACF,QAAQ,4BAA4B;GAClC,kBAAkB;GAClB,QAAQ;EACV,CAAC;CACH;CAEA,gBAAgB;EACd,kBAAkB;EAClB,iBAAiB,eAAe,UAAU,0BAA0B;EACpE,iBAAiB,SAAS,MAAM,UAAU,0BAA0B;EACpE,iBAAiB,QAAQ,UAAU,0BAA0B;EAC7D,eAAe;CACjB,CAAC;CAED,OAAO,EACL,OAAO,SAAS,KAAK,EACvB;AACF"}
@@ -4,6 +4,13 @@ import { get, set } from "@vueuse/shared";
4
4
  function useTableExpansion(options, deps) {
5
5
  const { rowAttr, singleExpand } = options;
6
6
  const { expanded } = deps;
7
+ /**
8
+ * Whether the consumer wired a two-way `expanded` model. Whether the
9
+ * `#expanded-item` slot is there is checked fresh in the template instead,
10
+ * so a consumer gating that slot with `v-if`, until data loads say, is not
11
+ * stuck on the first render's snapshot: Vue's `slots` object is not reactive
12
+ * to property access inside a computed.
13
+ */
7
14
  const expandable = computed(() => !!get(expanded));
8
15
  const expandedSet = computed(() => {
9
16
  const expandedVal = get(expanded);
@@ -1 +1 @@
1
- {"version":3,"file":"expansion.js","names":[],"sources":["../../../../src/composables/tables/data-table/expansion.ts"],"sourcesContent":["import type { ComputedRef, Ref } from 'vue';\n\nexport interface UseTableExpansionOptions<T extends object, IdType extends keyof T> {\n /** The property on each row used as the unique row identifier. */\n rowAttr: IdType;\n /** Whether only one row can be expanded at a time. */\n singleExpand: boolean;\n}\n\nexport interface UseTableExpansionDeps<T extends object> {\n expanded: Ref<T[] | undefined>;\n}\n\nexport interface UseTableExpansionReturn<T extends object, IdType extends keyof T> {\n expandable: ComputedRef<boolean>;\n isExpanded: (identifier: T[IdType]) => boolean;\n onToggleExpand: (row: T) => void;\n}\n\nexport function useTableExpansion<T extends object, IdType extends keyof T>(\n options: UseTableExpansionOptions<T, IdType>,\n deps: UseTableExpansionDeps<T>,\n): UseTableExpansionReturn<T, IdType> {\n const { rowAttr, singleExpand } = options;\n const { expanded } = deps;\n\n // `expandable` only tracks whether the consumer has wired a two-way\n // `expanded` model. Whether an `#expanded-item` slot is present is\n // checked fresh in the template (`!!$slots['expanded-item']`) so that\n // consumers which gate the slot with `v-if` (e.g. only after data\n // loads) don't get stuck on the first-render slot snapshot Vue's\n // `slots` object is not reactive to property access inside a computed.\n const expandable = computed<boolean>(() => !!get(expanded));\n\n const expandedSet = computed<Set<T[IdType]>>(() => {\n const expandedVal = get(expanded);\n if (!expandedVal?.length)\n return new Set<T[IdType]>();\n return new Set<T[IdType]>(expandedVal.map(row => row[rowAttr]));\n });\n\n function isExpanded(identifier: T[IdType]): boolean {\n return get(expandedSet).has(identifier);\n }\n\n function onToggleExpand(row: T): void {\n const expandedVal = get(expanded);\n if (!expandedVal)\n return;\n\n const key = rowAttr;\n const rowExpanded = isExpanded(row[key]);\n\n if (singleExpand)\n return set(expanded, rowExpanded ? [] : [row]);\n\n return set(\n expanded,\n rowExpanded ? expandedVal.filter(item => item[key] !== row[key]) : [...expandedVal, row],\n );\n }\n\n return {\n expandable,\n isExpanded,\n onToggleExpand,\n };\n}\n"],"mappings":";;;AAmBA,SAAgB,kBACd,SACA,MACoC;CACpC,MAAM,EAAE,SAAS,iBAAiB;CAClC,MAAM,EAAE,aAAa;CAQrB,MAAM,aAAa,eAAwB,CAAC,CAAC,IAAI,QAAQ,CAAC;CAE1D,MAAM,cAAc,eAA+B;EACjD,MAAM,cAAc,IAAI,QAAQ;EAChC,IAAI,CAAC,aAAa,QAChB,uBAAO,IAAI,IAAe;EAC5B,OAAO,IAAI,IAAe,YAAY,KAAI,QAAO,IAAI,QAAQ,CAAC;CAChE,CAAC;CAED,SAAS,WAAW,YAAgC;EAClD,OAAO,IAAI,WAAW,CAAC,CAAC,IAAI,UAAU;CACxC;CAEA,SAAS,eAAe,KAAc;EACpC,MAAM,cAAc,IAAI,QAAQ;EAChC,IAAI,CAAC,aACH;EAEF,MAAM,MAAM;EACZ,MAAM,cAAc,WAAW,IAAI,IAAI;EAEvC,IAAI,cACF,OAAO,IAAI,UAAU,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;EAE/C,OAAO,IACL,UACA,cAAc,YAAY,QAAO,SAAQ,KAAK,SAAS,IAAI,IAAI,IAAI,CAAC,GAAG,aAAa,GAAG,CACzF;CACF;CAEA,OAAO;EACL;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"expansion.js","names":[],"sources":["../../../../src/composables/tables/data-table/expansion.ts"],"sourcesContent":["import type { ComputedRef, Ref } from 'vue';\n\nexport interface UseTableExpansionOptions<T extends object, IdType extends keyof T> {\n /** The property on each row used as the unique row identifier. */\n rowAttr: IdType;\n /** Whether only one row can be expanded at a time. */\n singleExpand: boolean;\n}\n\nexport interface UseTableExpansionDeps<T extends object> {\n expanded: Ref<T[] | undefined>;\n}\n\nexport interface UseTableExpansionReturn<T extends object, IdType extends keyof T> {\n expandable: ComputedRef<boolean>;\n isExpanded: (identifier: T[IdType]) => boolean;\n onToggleExpand: (row: T) => void;\n}\n\nexport function useTableExpansion<T extends object, IdType extends keyof T>(\n options: UseTableExpansionOptions<T, IdType>,\n deps: UseTableExpansionDeps<T>,\n): UseTableExpansionReturn<T, IdType> {\n const { rowAttr, singleExpand } = options;\n const { expanded } = deps;\n\n /**\n * Whether the consumer wired a two-way `expanded` model. Whether the\n * `#expanded-item` slot is there is checked fresh in the template instead,\n * so a consumer gating that slot with `v-if`, until data loads say, is not\n * stuck on the first render's snapshot: Vue's `slots` object is not reactive\n * to property access inside a computed.\n */\n const expandable = computed<boolean>(() => !!get(expanded));\n\n const expandedSet = computed<Set<T[IdType]>>(() => {\n const expandedVal = get(expanded);\n if (!expandedVal?.length)\n return new Set<T[IdType]>();\n return new Set<T[IdType]>(expandedVal.map(row => row[rowAttr]));\n });\n\n function isExpanded(identifier: T[IdType]): boolean {\n return get(expandedSet).has(identifier);\n }\n\n function onToggleExpand(row: T): void {\n const expandedVal = get(expanded);\n if (!expandedVal)\n return;\n\n const key = rowAttr;\n const rowExpanded = isExpanded(row[key]);\n\n if (singleExpand)\n return set(expanded, rowExpanded ? [] : [row]);\n\n return set(\n expanded,\n rowExpanded ? expandedVal.filter(item => item[key] !== row[key]) : [...expandedVal, row],\n );\n }\n\n return {\n expandable,\n isExpanded,\n onToggleExpand,\n };\n}\n"],"mappings":";;;AAmBA,SAAgB,kBACd,SACA,MACoC;CACpC,MAAM,EAAE,SAAS,iBAAiB;CAClC,MAAM,EAAE,aAAa;;;;;;;;CASrB,MAAM,aAAa,eAAwB,CAAC,CAAC,IAAI,QAAQ,CAAC;CAE1D,MAAM,cAAc,eAA+B;EACjD,MAAM,cAAc,IAAI,QAAQ;EAChC,IAAI,CAAC,aAAa,QAChB,uBAAO,IAAI,IAAe;EAC5B,OAAO,IAAI,IAAe,YAAY,KAAI,QAAO,IAAI,QAAQ,CAAC;CAChE,CAAC;CAED,SAAS,WAAW,YAAgC;EAClD,OAAO,IAAI,WAAW,CAAC,CAAC,IAAI,UAAU;CACxC;CAEA,SAAS,eAAe,KAAc;EACpC,MAAM,cAAc,IAAI,QAAQ;EAChC,IAAI,CAAC,aACH;EAEF,MAAM,MAAM;EACZ,MAAM,cAAc,WAAW,IAAI,IAAI;EAEvC,IAAI,cACF,OAAO,IAAI,UAAU,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;EAE/C,OAAO,IACL,UACA,cAAc,YAAY,QAAO,SAAQ,KAAK,SAAS,IAAI,IAAI,IAAI,CAAC,GAAG,aAAa,GAAG,CACzF;CACF;CAEA,OAAO;EACL;EACA;EACA;CACF;AACF"}
@@ -1,6 +1,6 @@
1
1
  import type { ComputedRef, Ref } from 'vue';
2
2
  import type { TableRowKey, TableRowKeyData } from '../../../components/tables/RuiTableHead.vue';
3
- import { type GroupedTableRow } from '../../../composables/tables/data-table/types.js';
3
+ import { type GroupedTableRow } from './types.js';
4
4
  export interface UseTableGroupingOptions<T extends object, IdType extends keyof T> {
5
5
  /** The property on each row used as the unique row identifier. */
6
6
  rowAttr: IdType;
@@ -1,8 +1,8 @@
1
1
  import type { ComputedRef, DeepReadonly, Ref, ShallowRef } from 'vue';
2
2
  import type { TableSortData } from '../../../components/tables/RuiTableHead.vue';
3
3
  import type { TablePaginationData } from '../../../components/tables/RuiTablePagination.vue';
4
- import type { TableOptions as TableDefaultOptions } from '../../../composables/defaults/table.js';
5
- import { type GroupedTableRow } from '../../../composables/tables/data-table/types.js';
4
+ import type { TableOptions as TableDefaultOptions } from '../../defaults/table.js';
5
+ import { type GroupedTableRow } from './types.js';
6
6
  export interface UseTablePaginationOptions {
7
7
  /** The default number of items displayed per page. */
8
8
  itemsPerPage: number;
@@ -1,5 +1,5 @@
1
1
  import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';
2
- import { type GroupedTableRow } from '../../../composables/tables/data-table/types.js';
2
+ import { type GroupedTableRow } from './types.js';
3
3
  export interface UseTableSelectionOptions<T extends object, IdType extends keyof T> {
4
4
  /** The property on each row used as the unique row identifier. */
5
5
  rowAttr: IdType;
@@ -50,9 +50,10 @@ function useTableSelection(options, deps) {
50
50
  function onToggleAll(checked) {
51
51
  const selectedRows = get$1(selectedData);
52
52
  if (!isDefined(selectedRows)) return;
53
- if (!multiPageSelect) if (checked) set$1(selectedData, get$1(visibleIdentifiers).filter(isSelectable));
54
- else set$1(selectedData, get$1(visibleIdentifiers).filter(mustSelect));
55
- else if (checked) set$1(selectedData, Array.from(/* @__PURE__ */ new Set([...selectedRows, ...get$1(visibleIdentifiers).filter(isSelectable)])));
53
+ if (!multiPageSelect) {
54
+ if (checked) set$1(selectedData, get$1(visibleIdentifiers).filter(isSelectable));
55
+ else set$1(selectedData, get$1(visibleIdentifiers).filter(mustSelect));
56
+ } else if (checked) set$1(selectedData, Array.from(/* @__PURE__ */ new Set([...selectedRows, ...get$1(visibleIdentifiers).filter(isSelectable)])));
56
57
  else {
57
58
  const visibleSet = new Set(get$1(visibleIdentifiers));
58
59
  const mustSelectSet = new Set(get$1(visibleIdentifiers).filter(mustSelect));
@@ -76,39 +77,41 @@ function useTableSelection(options, deps) {
76
77
  const nodeName = target instanceof HTMLElement ? target.nodeName : void 0;
77
78
  const shiftKey = event.shiftKey;
78
79
  set$1(shiftClicked, shiftKey);
79
- if (input && nodeName !== "INPUT") if (shiftKey) scheduleShiftSelect(() => {
80
- let lastIndex = get$1(lastSelectedIndex);
81
- if (lastIndex === -1) lastIndex = index;
82
- const tableData = get$1(filtered);
83
- const lastSelectedData = tableData[lastIndex];
84
- assert(lastSelectedData);
85
- if (isRow(lastSelectedData)) {
86
- const valueToApply = isSelected(lastSelectedData[rowAttr]);
87
- if (lastIndex === index) onSelect(!valueToApply, value);
88
- else {
89
- const from = Math.min(lastIndex, index);
90
- const to = Math.max(lastIndex, index);
91
- const currentSelected = get$1(internalSelectedData);
92
- const rangeIds = [];
93
- for (let i = from; i <= to; i++) {
94
- const currSelectedData = tableData[i];
95
- assert(currSelectedData);
96
- if (isRow(currSelectedData) && !isDisabledRow(currSelectedData[rowAttr])) rangeIds.push(currSelectedData[rowAttr]);
97
- }
98
- if (valueToApply) {
99
- const existing = new Set(currentSelected);
100
- const toAdd = rangeIds.filter((id) => !existing.has(id));
101
- set$1(internalSelectedData, [...currentSelected, ...toAdd]);
102
- } else {
103
- const toRemove = new Set(rangeIds);
104
- set$1(internalSelectedData, currentSelected.filter((id) => !toRemove.has(id)));
80
+ if (input && nodeName !== "INPUT") {
81
+ if (shiftKey) scheduleShiftSelect(() => {
82
+ let lastIndex = get$1(lastSelectedIndex);
83
+ if (lastIndex === -1) lastIndex = index;
84
+ const tableData = get$1(filtered);
85
+ const lastSelectedData = tableData[lastIndex];
86
+ assert(lastSelectedData);
87
+ if (isRow(lastSelectedData)) {
88
+ const valueToApply = isSelected(lastSelectedData[rowAttr]);
89
+ if (lastIndex === index) onSelect(!valueToApply, value);
90
+ else {
91
+ const from = Math.min(lastIndex, index);
92
+ const to = Math.max(lastIndex, index);
93
+ const currentSelected = get$1(internalSelectedData);
94
+ const rangeIds = [];
95
+ for (let i = from; i <= to; i++) {
96
+ const currSelectedData = tableData[i];
97
+ assert(currSelectedData);
98
+ if (isRow(currSelectedData) && !isDisabledRow(currSelectedData[rowAttr])) rangeIds.push(currSelectedData[rowAttr]);
99
+ }
100
+ if (valueToApply) {
101
+ const existing = new Set(currentSelected);
102
+ const toAdd = rangeIds.filter((id) => !existing.has(id));
103
+ set$1(internalSelectedData, [...currentSelected, ...toAdd]);
104
+ } else {
105
+ const toRemove = new Set(rangeIds);
106
+ set$1(internalSelectedData, currentSelected.filter((id) => !toRemove.has(id)));
107
+ }
105
108
  }
109
+ set$1(lastSelectedIndex, index);
110
+ set$1(selectedData, get$1(internalSelectedData));
106
111
  }
107
- set$1(lastSelectedIndex, index);
108
- set$1(selectedData, get$1(internalSelectedData));
109
- }
110
- }, 1);
111
- else set$1(lastSelectedIndex, index);
112
+ }, 1);
113
+ else set$1(lastSelectedIndex, index);
114
+ }
112
115
  }
113
116
  function deselectRemovedRows() {
114
117
  const currentSelected = get$1(selectedData);
@@ -1 +1 @@
1
- {"version":3,"file":"selection.js","names":[],"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][]> = shallowRef([]);\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 // Batch: collect all IDs in range, then update once\n const currentSelected = get(internalSelectedData);\n const rangeIds: T[IdType][] = [];\n for (let i = from; i <= to; i++) {\n const currSelectedData = tableData[i];\n assert(currSelectedData);\n if (isRow(currSelectedData) && !isDisabledRow(currSelectedData[rowAttr]))\n rangeIds.push(currSelectedData[rowAttr]);\n }\n\n if (valueToApply) {\n const existing = new Set(currentSelected);\n const toAdd = rangeIds.filter(id => !existing.has(id));\n set(internalSelectedData, [...currentSelected, ...toAdd]);\n }\n else {\n const toRemove = new Set(rangeIds);\n set(internalSelectedData, currentSelected.filter(id => !toRemove.has(id)));\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"],"mappings":"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"}
1
+ {"version":3,"file":"selection.js","names":[],"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][]> = shallowRef([]);\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 // Batch: collect all IDs in range, then update once\n const currentSelected = get(internalSelectedData);\n const rangeIds: T[IdType][] = [];\n for (let i = from; i <= to; i++) {\n const currSelectedData = tableData[i];\n assert(currSelectedData);\n if (isRow(currSelectedData) && !isDisabledRow(currSelectedData[rowAttr]))\n rangeIds.push(currSelectedData[rowAttr]);\n }\n\n if (valueToApply) {\n const existing = new Set(currentSelected);\n const toAdd = rangeIds.filter(id => !existing.has(id));\n set(internalSelectedData, [...currentSelected, ...toAdd]);\n }\n else {\n const toRemove = new Set(rangeIds);\n set(internalSelectedData, currentSelected.filter(id => !toRemove.has(id)));\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"],"mappings":";;;;;;;AAkCA,SAAgB,kBACd,SACA,MACoC;CACpC,MAAM,EAAE,SAAS,iBAAiB,iBAAiB;CACnD,MAAM,EAAE,cAAc,aAAa;CAEnC,MAAM,eAA6B,WAAW,KAAK;CACnD,MAAM,oBAAiC,WAAW,EAAE;CACpD,MAAM,uBAAyC,WAAW,CAAC,CAAC;CAC5D,MAAM,EAAE,QAAQ,wBAAwB,kBAAkB;CAG1D,MAAM,eAAc,QAAO,MAAI,sBAAsB,OAAO,CAAC,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;CAEpF,MAAM,qBAAqB,eACzB,MAAI,QAAQ,CAAC,CACV,OAAO,KAAK,CAAC,CACb,KAAI,QAAO,IAAI,QAAQ,CAC5B;CAEA,MAAM,cAAc,eAA+B,IAAI,IAAI,MAAI,YAAY,KAAK,CAAC,CAAC,CAAC;CAEnF,MAAM,oBAAoB,eAA+B;EACvD,MAAM,sBAAsB,QAAQ,YAAY;EAChD,IAAI,CAAC,uBAAuB,CAAC,SAC3B,uBAAO,IAAI,IAAe;EAC5B,OAAO,IAAI,IAAe,oBAAoB,KAAK,QAAW,IAAI,QAAQ,CAAC;CAC7E,CAAC;CAED,MAAM,gBAAgB,eAAwB;EAC5C,MAAM,eAAe,MAAI,YAAY;EACrC,IAAI,CAAC,gBAAgB,aAAa,WAAW,GAC3C,OAAO;EAET,MAAM,WAAW,MAAI,WAAW;EAChC,OAAO,MAAI,kBAAkB,CAAC,CAAC,OAAM,OAAM,SAAS,IAAI,EAAE,CAAC;CAC7D,CAAC;CAED,MAAM,gBAAgB,eAAwB;EAC5C,MAAM,eAAe,MAAI,YAAY;EACrC,IAAI,CAAC,cACH,OAAO;EAET,OAAO,aAAa,SAAS,KAAK,CAAC,MAAI,aAAa;CACtD,CAAC;CAED,SAAS,WAAW,YAAgC;EAClD,OAAO,MAAI,WAAW,CAAC,CAAC,IAAI,UAAU;CACxC;CAEA,SAAS,cAAc,QAA4B;EACjD,OAAO,MAAI,iBAAiB,CAAC,CAAC,IAAI,MAAM;CAC1C;CAEA,SAAS,aAAa,QAA4B;EAChD,OAAO,WAAW,MAAM,KAAK,CAAC,cAAc,MAAM;CACpD;CAEA,SAAS,WAAW,QAA4B;EAC9C,OAAO,WAAW,MAAM,KAAK,cAAc,MAAM;CACnD;CAEA,SAAS,0BAAgC;EACvC,MAAI,cAAc,KAAK;EACvB,MAAI,mBAAmB,EAAE;CAC3B;CAEA,SAAS,YAAY,SAAwB;EAC3C,MAAM,eAAe,MAAI,YAAY;EAErC,IAAI,CAAC,UAAU,YAAY,GACzB;EAEF,IAAI,CAAC,iBAAiB;GACpB,IAAI,SACF,MAAI,cAAc,MAAI,kBAAkB,CAAC,CAAC,OAAO,YAAY,CAAC;QAC3D,MAAI,cAAc,MAAI,kBAAkB,CAAC,CAAC,OAAO,UAAU,CAAC;EACnE,OAEE,IAAI,SACF,MACE,cACA,MAAM,qBAAK,IAAI,IAAI,CAAC,GAAG,cAAc,GAAG,MAAI,kBAAkB,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CACxF;OAEG;GACH,MAAM,aAAa,IAAI,IAAI,MAAI,kBAAkB,CAAC;GAClD,MAAM,gBAAgB,IAAI,IAAI,MAAI,kBAAkB,CAAC,CAAC,OAAO,UAAU,CAAC;GACxE,MACE,cACA,aAAa,QAAO,WAAU,CAAC,WAAW,IAAI,MAAM,KAAK,cAAc,IAAI,MAAM,CAAC,CACpF;EACF;CAEJ;CAEA,SAAS,SAAS,SAAkB,OAAkB,aAAsB,OAAa;EACvF,IAAI,MAAI,YAAY,KAAK,YACvB;EAEF,MAAM,eAAe,MAAI,oBAAoB;EAC7C,IAAI,CAAC,cACH;EAEF,MAAM,WAAW,WAAW,KAAK;EAEjC,IAAI,WAAW,CAAC,UACd,MAAI,sBAAsB,CAAC,GAAG,cAAc,KAAK,CAAC;OAE/C,IAAI,CAAC,WAAW,UACnB,MACE,sBACA,aAAa,QAAO,MAAK,MAAM,KAAK,CACtC;EAGF,IAAI,YACF,MAAI,cAAc,MAAI,oBAAoB,CAAC;CAC/C;CAEA,SAAS,gBAAgB,OAAmB,OAAkB,OAAqB;EACjF,MAAM,gBAAgB,MAAM;EAC5B,IAAI,EAAE,yBAAyB,cAC7B;EAEF,MAAM,QAAQ,cAAc,cAAc,OAAO;EACjD,MAAM,SAAS,MAAM;EACrB,MAAM,WAAW,kBAAkB,cAAc,OAAO,WAAW,KAAA;EAEnE,MAAM,WAAW,MAAM;EACvB,MAAI,cAAc,QAAQ;EAE1B,IAAI,SAAS,aAAa,SAAS;GACjC,IAAI,UACF,0BAA0B;IACxB,IAAI,YAAY,MAAI,iBAAiB;IACrC,IAAI,cAAc,IAChB,YAAY;IACd,MAAM,YAAY,MAAI,QAAQ;IAC9B,MAAM,mBAAmB,UAAU;IACnC,OAAO,gBAAgB;IAEvB,IAAI,MAAM,gBAAgB,GAAG;KAC3B,MAAM,eAAe,WAAW,iBAAiB,QAAQ;KAEzD,IAAI,cAAc,OAChB,SAAS,CAAC,cAAc,KAAK;UAE1B;MACH,MAAM,OAAO,KAAK,IAAI,WAAW,KAAK;MACtC,MAAM,KAAK,KAAK,IAAI,WAAW,KAAK;MAGpC,MAAM,kBAAkB,MAAI,oBAAoB;MAChD,MAAM,WAAwB,CAAC;MAC/B,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,KAAK;OAC/B,MAAM,mBAAmB,UAAU;OACnC,OAAO,gBAAgB;OACvB,IAAI,MAAM,gBAAgB,KAAK,CAAC,cAAc,iBAAiB,QAAQ,GACrE,SAAS,KAAK,iBAAiB,QAAQ;MAC3C;MAEA,IAAI,cAAc;OAChB,MAAM,WAAW,IAAI,IAAI,eAAe;OACxC,MAAM,QAAQ,SAAS,QAAO,OAAM,CAAC,SAAS,IAAI,EAAE,CAAC;OACrD,MAAI,sBAAsB,CAAC,GAAG,iBAAiB,GAAG,KAAK,CAAC;MAC1D,OACK;OACH,MAAM,WAAW,IAAI,IAAI,QAAQ;OACjC,MAAI,sBAAsB,gBAAgB,QAAO,OAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;MAC3E;KACF;KAEA,MAAI,mBAAmB,KAAK;KAC5B,MAAI,cAAc,MAAI,oBAAoB,CAAC;IAC7C;GACF,GAAG,CAAC;QAGJ,MAAI,mBAAmB,KAAK;EAEhC;CACF;CAEA,SAAS,sBAA4B;EACnC,MAAM,kBAAkB,MAAI,YAAY;EACxC,IAAI,CAAC,iBACH;EAEF,MAAM,aAAa,IAAI,IAAI,MAAI,kBAAkB,CAAC;EAClD,MAAM,YAAY,gBAAgB,QAAO,QAAO,WAAW,IAAI,GAAG,CAAC;EAEnE,IAAI,UAAU,WAAW,gBAAgB,QACvC,MAAI,cAAc,SAAS;CAC/B;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -1,6 +1,8 @@
1
1
  import { type ThemeContent } from '../types/theme.js';
2
2
  /**
3
- * Theme manager
4
- * @returns {ThemeContent}
3
+ * The theme manager: the current mode and palette, and the calls that change
4
+ * them. Shared, so every caller reads and writes the same theme.
5
+ *
6
+ * @returns the theme state and the operations on it
5
7
  */
6
8
  export declare const useRotkiTheme: () => ThemeContent;
@@ -5,8 +5,10 @@ import { get as get$1, set as set$1 } from "@vueuse/shared";
5
5
  //#region src/composables/theme.ts
6
6
  var config = ref({ ...defaultTheme });
7
7
  /**
8
- * Theme manager
9
- * @returns {ThemeContent}
8
+ * The theme manager: the current mode and palette, and the calls that change
9
+ * them. Shared, so every caller reads and writes the same theme.
10
+ *
11
+ * @returns the theme state and the operations on it
10
12
  */
11
13
  var useRotkiTheme = createSharedComposable(() => {
12
14
  const updateHTMLAttrs = getSSRHandler("updateHTMLAttrs", (selector, attribute, value) => {
@@ -19,32 +21,21 @@ var useRotkiTheme = createSharedComposable(() => {
19
21
  defaultHandler(mode);
20
22
  updateHTMLAttrs("html", "data-theme", mode);
21
23
  } });
22
- /**
23
- * whether the current theme is controlled by system or user
24
- * @type {ComputedRef<boolean>}
25
- */
24
+ /** Whether the system picks the theme rather than the user. */
26
25
  const isAutoControlled = computed(() => get$1(store) === ThemeMode.auto);
27
- /**
28
- * truthy for light theme
29
- * @type {ComputedRef<boolean>}
30
- */
26
+ /** Whether the light theme is showing. */
31
27
  const isLight = computed(() => get$1(state) === ThemeMode.light);
32
- /**
33
- * truthy for dark theme
34
- * @type {ComputedRef<boolean>}
35
- */
28
+ /** Whether the dark theme is showing. */
36
29
  const isDark = computed(() => get$1(state) === ThemeMode.dark);
37
- /**
38
- * current theme based on light or dark mode
39
- * @type {ComputedRef<ThemeData>}
40
- */
30
+ /** The palette the current mode reads from. */
41
31
  const theme = computed(() => {
42
32
  if (get$1(isLight)) return get$1(config).light;
43
33
  return get$1(config).dark;
44
34
  });
45
35
  /**
46
- * switch theme through dark/light/auto modes
47
- * @param {ThemeMode} mode
36
+ * Switches the theme.
37
+ *
38
+ * @param mode - the mode to switch to; an empty mode falls back to auto
48
39
  */
49
40
  const switchThemeScheme = (mode) => {
50
41
  set$1(store, mode || ThemeMode.auto);
@@ -58,15 +49,18 @@ var useRotkiTheme = createSharedComposable(() => {
58
49
  else if (get$1(isDark)) switchThemeScheme(ThemeMode.auto);
59
50
  };
60
51
  /**
61
- * sets the configuration for the theme
62
- * @param {ThemeConfig} newConfig
52
+ * Replaces the palettes the theme draws from.
53
+ *
54
+ * @param newConfig - the light and dark palettes to use
63
55
  */
64
56
  const setThemeConfig = (newConfig) => {
65
57
  set$1(config, newConfig);
66
58
  };
67
59
  /**
68
- * theme initializer, must be called once from the app's entry
69
- * @param {InitThemeOptions} options
60
+ * Sets the theme up. Call once, from the app's entry point.
61
+ *
62
+ * @param options - the starting mode and palettes; each falls back to its
63
+ * default when left out
70
64
  */
71
65
  const init = (options) => {
72
66
  switchThemeScheme(options.mode ?? ThemeMode.auto);
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","names":[],"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"],"mappings":";;;;;AAWA,IAAM,SAA2B,IAAI,EAAE,GAAG,aAAa,CAAC;;;;;AAMxD,IAAa,gBAAgB,6BAAiD;CAC5E,MAAM,kBAAkB,cACtB,oBACC,UAAU,WAAW,UAAU;EAC9B,IAAI,OAAO,aAAa,YAAY,CAAC,eACnC;EAEF,MAAM,KAAK,cAAc,SAAS,cAAc,QAAQ;EACxD,IAAI,CAAC,IACH;EAEF,GAAG,aAAa,WAAW,KAAK;CAClC,CACF;CAEA,MAAM,EAAE,OAAO,UAAU,aAAwB,EAC/C,UAAU,MAAM,gBAAgB;EAC9B,eAAe,IAAI;EACnB,gBAAgB,QAAQ,cAAc,IAAI;CAC5C,EACF,CAAC;;;;;CAMD,MAAM,mBAAyC,eAAe,MAAI,KAAK,MAAM,UAAU,IAAI;;;;;CAM3F,MAAM,UAAgC,eAAe,MAAI,KAAK,MAAM,UAAU,KAAK;;;;;CAMnF,MAAM,SAA+B,eAAe,MAAI,KAAK,MAAM,UAAU,IAAI;;;;;CAMjF,MAAM,QAAgC,eAAe;EACnD,IAAI,MAAI,OAAO,GACb,OAAO,MAAI,MAAM,CAAC,CAAC;EAErB,OAAO,MAAI,MAAM,CAAC,CAAC;CACrB,CAAC;;;;;CAMD,MAAM,qBAAqB,SAA0B;EACnD,MAAI,OAAO,QAAQ,UAAU,IAAI;CACnC;;;;CAKA,MAAM,wBAA8B;EAClC,IAAI,MAAI,gBAAgB,GACtB,kBAAkB,UAAU,KAAK;OAC9B,IAAI,MAAI,OAAO,GAClB,kBAAkB,UAAU,IAAI;OAC7B,IAAI,MAAI,MAAM,GACjB,kBAAkB,UAAU,IAAI;CACpC;;;;;CAMA,MAAM,kBAAkB,cAAiC;EACvD,MAAI,QAAQ,SAAS;CACvB;;;;;CAMA,MAAM,QAAQ,YAAoC;EAChD,kBAAkB,QAAQ,QAAQ,UAAU,IAAI;EAChD,eAAe,QAAQ,UAAU,EAAE,GAAG,aAAa,CAAC;CACtD;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"theme.js","names":[],"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 * The theme manager: the current mode and palette, and the calls that change\n * them. Shared, so every caller reads and writes the same theme.\n *\n * @returns the theme state and the operations on it\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 /** Whether the system picks the theme rather than the user. */\n const isAutoControlled: ComputedRef<boolean> = computed(() => get(store) === ThemeMode.auto);\n\n /** Whether the light theme is showing. */\n const isLight: ComputedRef<boolean> = computed(() => get(state) === ThemeMode.light);\n\n /** Whether the dark theme is showing. */\n const isDark: ComputedRef<boolean> = computed(() => get(state) === ThemeMode.dark);\n\n /** The palette the current mode reads from. */\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 * Switches the theme.\n *\n * @param mode - the mode to switch to; an empty mode falls back to auto\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 * Replaces the palettes the theme draws from.\n *\n * @param newConfig - the light and dark palettes to use\n */\n const setThemeConfig = (newConfig: ThemeConfig): void => {\n set(config, newConfig);\n };\n\n /**\n * Sets the theme up. Call once, from the app's entry point.\n *\n * @param options - the starting mode and palettes; each falls back to its\n * default when left out\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"],"mappings":";;;;;AAWA,IAAM,SAA2B,IAAI,EAAE,GAAG,aAAa,CAAC;;;;;;;AAQxD,IAAa,gBAAgB,6BAAiD;CAC5E,MAAM,kBAAkB,cACtB,oBACC,UAAU,WAAW,UAAU;EAC9B,IAAI,OAAO,aAAa,YAAY,CAAC,eACnC;EAEF,MAAM,KAAK,cAAc,SAAS,cAAc,QAAQ;EACxD,IAAI,CAAC,IACH;EAEF,GAAG,aAAa,WAAW,KAAK;CAClC,CACF;CAEA,MAAM,EAAE,OAAO,UAAU,aAAwB,EAC/C,UAAU,MAAM,gBAAgB;EAC9B,eAAe,IAAI;EACnB,gBAAgB,QAAQ,cAAc,IAAI;CAC5C,EACF,CAAC;;CAGD,MAAM,mBAAyC,eAAe,MAAI,KAAK,MAAM,UAAU,IAAI;;CAG3F,MAAM,UAAgC,eAAe,MAAI,KAAK,MAAM,UAAU,KAAK;;CAGnF,MAAM,SAA+B,eAAe,MAAI,KAAK,MAAM,UAAU,IAAI;;CAGjF,MAAM,QAAgC,eAAe;EACnD,IAAI,MAAI,OAAO,GACb,OAAO,MAAI,MAAM,CAAC,CAAC;EAErB,OAAO,MAAI,MAAM,CAAC,CAAC;CACrB,CAAC;;;;;;CAOD,MAAM,qBAAqB,SAA0B;EACnD,MAAI,OAAO,QAAQ,UAAU,IAAI;CACnC;;;;CAKA,MAAM,wBAA8B;EAClC,IAAI,MAAI,gBAAgB,GACtB,kBAAkB,UAAU,KAAK;OAC9B,IAAI,MAAI,OAAO,GAClB,kBAAkB,UAAU,IAAI;OAC7B,IAAI,MAAI,MAAM,GACjB,kBAAkB,UAAU,IAAI;CACpC;;;;;;CAOA,MAAM,kBAAkB,cAAiC;EACvD,MAAI,QAAQ,SAAS;CACvB;;;;;;;CAQA,MAAM,QAAQ,YAAoC;EAChD,kBAAkB,QAAQ,QAAQ,UAAU,IAAI;EAChD,eAAe,QAAQ,UAAU,EAAE,GAAG,aAAa,CAAC;CACtD;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF,CAAC"}
@@ -18,6 +18,6 @@ export declare const RUI_I18N_KEYS: {
18
18
  /**
19
19
  * Retrieves all translation keys available in the library.
20
20
  *
21
- * @return {string[]} An array of strings representing flattened translation keys.
21
+ * @returns the flattened translation keys
22
22
  */
23
23
  export declare function translationKeys(): string[];
package/dist/i18n/keys.js CHANGED
@@ -20,7 +20,7 @@ function flattenKeys(obj) {
20
20
  /**
21
21
  * Retrieves all translation keys available in the library.
22
22
  *
23
- * @return {string[]} An array of strings representing flattened translation keys.
23
+ * @returns the flattened translation keys
24
24
  */
25
25
  function translationKeys() {
26
26
  return flattenKeys(RUI_I18N_KEYS);
@@ -1 +1 @@
1
- {"version":3,"file":"keys.js","names":[],"sources":["../../src/i18n/keys.ts"],"sourcesContent":["export const RUI_I18N_KEYS = {\n dateTimePicker: {\n clear: 'rui.date_time_picker.clear',\n clearValue: 'rui.date_time_picker.clear_value',\n closeCalendar: 'rui.date_time_picker.close_calendar',\n dateAfterMax: 'rui.date_time_picker.date_after_max',\n dateBeforeMin: 'rui.date_time_picker.date_before_min',\n dateInFuture: 'rui.date_time_picker.date_in_future',\n label: 'rui.date_time_picker.label',\n now: 'rui.date_time_picker.now',\n openCalendar: 'rui.date_time_picker.open_calendar',\n today: 'rui.date_time_picker.today',\n },\n timezoneSelect: {\n label: 'rui.timezone_select.label',\n },\n} as const;\n\nfunction flattenKeys(obj: Record<string, any>): string[] {\n return Object.values(obj).flatMap(value =>\n typeof value === 'string' ? [value] : flattenKeys(value),\n );\n}\n\n/**\n * Retrieves all translation keys available in the library.\n *\n * @return {string[]} An array of strings representing flattened translation keys.\n */\nexport function translationKeys(): string[] {\n return flattenKeys(RUI_I18N_KEYS);\n}\n"],"mappings":";AAAA,IAAa,gBAAgB;CAC3B,gBAAgB;EACd,OAAO;EACP,YAAY;EACZ,eAAe;EACf,cAAc;EACd,eAAe;EACf,cAAc;EACd,OAAO;EACP,KAAK;EACL,cAAc;EACd,OAAO;CACT;CACA,gBAAgB,EACd,OAAO,4BACT;AACF;AAEA,SAAS,YAAY,KAAoC;CACvD,OAAO,OAAO,OAAO,GAAG,CAAC,CAAC,SAAQ,UAChC,OAAO,UAAU,WAAW,CAAC,KAAK,IAAI,YAAY,KAAK,CACzD;AACF;;;;;;AAOA,SAAgB,kBAA4B;CAC1C,OAAO,YAAY,aAAa;AAClC"}
1
+ {"version":3,"file":"keys.js","names":[],"sources":["../../src/i18n/keys.ts"],"sourcesContent":["export const RUI_I18N_KEYS = {\n dateTimePicker: {\n clear: 'rui.date_time_picker.clear',\n clearValue: 'rui.date_time_picker.clear_value',\n closeCalendar: 'rui.date_time_picker.close_calendar',\n dateAfterMax: 'rui.date_time_picker.date_after_max',\n dateBeforeMin: 'rui.date_time_picker.date_before_min',\n dateInFuture: 'rui.date_time_picker.date_in_future',\n label: 'rui.date_time_picker.label',\n now: 'rui.date_time_picker.now',\n openCalendar: 'rui.date_time_picker.open_calendar',\n today: 'rui.date_time_picker.today',\n },\n timezoneSelect: {\n label: 'rui.timezone_select.label',\n },\n} as const;\n\nfunction flattenKeys(obj: Record<string, any>): string[] {\n return Object.values(obj).flatMap(value =>\n typeof value === 'string' ? [value] : flattenKeys(value),\n );\n}\n\n/**\n * Retrieves all translation keys available in the library.\n *\n * @returns the flattened translation keys\n */\nexport function translationKeys(): string[] {\n return flattenKeys(RUI_I18N_KEYS);\n}\n"],"mappings":";AAAA,IAAa,gBAAgB;CAC3B,gBAAgB;EACd,OAAO;EACP,YAAY;EACZ,eAAe;EACf,cAAc;EACd,eAAe;EACf,cAAc;EACd,OAAO;EACP,KAAK;EACL,cAAc;EACd,OAAO;CACT;CACA,gBAAgB,EACd,OAAO,4BACT;AACF;AAEA,SAAS,YAAY,KAAoC;CACvD,OAAO,OAAO,OAAO,GAAG,CAAC,CAAC,SAAQ,UAChC,OAAO,UAAU,WAAW,CAAC,KAAK,IAAI,YAAY,KAAK,CACzD;AACF;;;;;;AAOA,SAAgB,kBAA4B;CAC1C,OAAO,YAAY,aAAa;AAClC"}
@@ -87,8 +87,7 @@ export declare const LuAmpersand: GeneratedIcon;
87
87
  export declare const LuAmpersands: GeneratedIcon;
88
88
  export declare const LuAmphora: GeneratedIcon;
89
89
  export declare const LuAnchor: GeneratedIcon;
90
- export declare const LuAngry: GeneratedIcon;
91
- export declare const LuAnnoyed: GeneratedIcon;
90
+ export declare const LuAngle: GeneratedIcon;
92
91
  export declare const LuAntenna: GeneratedIcon;
93
92
  export declare const LuAnvil: GeneratedIcon;
94
93
  export declare const LuAperture: GeneratedIcon;
@@ -146,6 +145,8 @@ export declare const LuAsterisk: GeneratedIcon;
146
145
  export declare const LuAstroid: GeneratedIcon;
147
146
  export declare const LuAtSign: GeneratedIcon;
148
147
  export declare const LuAtom: GeneratedIcon;
148
+ export declare const LuAudioLinesOff: GeneratedIcon;
149
+ export declare const LuAudioLinesX: GeneratedIcon;
149
150
  export declare const LuAudioLines: GeneratedIcon;
150
151
  export declare const LuAudioWaveform: GeneratedIcon;
151
152
  export declare const LuAward: GeneratedIcon;
@@ -283,12 +284,15 @@ export declare const LuBrain: GeneratedIcon;
283
284
  export declare const LuBrickWallFire: GeneratedIcon;
284
285
  export declare const LuBrickWallShield: GeneratedIcon;
285
286
  export declare const LuBrickWall: GeneratedIcon;
287
+ export declare const LuBridge: GeneratedIcon;
286
288
  export declare const LuBriefcaseBusiness: GeneratedIcon;
287
289
  export declare const LuBriefcaseConveyorBelt: GeneratedIcon;
288
290
  export declare const LuBriefcaseMedical: GeneratedIcon;
289
291
  export declare const LuBriefcase: GeneratedIcon;
290
292
  export declare const LuBringToFront: GeneratedIcon;
291
293
  export declare const LuBroccoli: GeneratedIcon;
294
+ export declare const LuBroomSparkles: GeneratedIcon;
295
+ export declare const LuBroom: GeneratedIcon;
292
296
  export declare const LuBrushCleaning: GeneratedIcon;
293
297
  export declare const LuBrush: GeneratedIcon;
294
298
  export declare const LuBubbles: GeneratedIcon;
@@ -328,6 +332,7 @@ export declare const LuCalendar: GeneratedIcon;
328
332
  export declare const LuCalendars: GeneratedIcon;
329
333
  export declare const LuCameraOff: GeneratedIcon;
330
334
  export declare const LuCamera: GeneratedIcon;
335
+ export declare const LuCan: GeneratedIcon;
331
336
  export declare const LuCandyCane: GeneratedIcon;
332
337
  export declare const LuCandyOff: GeneratedIcon;
333
338
  export declare const LuCandy: GeneratedIcon;
@@ -335,6 +340,7 @@ export declare const LuCannabisOff: GeneratedIcon;
335
340
  export declare const LuCannabis: GeneratedIcon;
336
341
  export declare const LuCaptionsOff: GeneratedIcon;
337
342
  export declare const LuCaptions: GeneratedIcon;
343
+ export declare const LuCarBattery: GeneratedIcon;
338
344
  export declare const LuCarFront: GeneratedIcon;
339
345
  export declare const LuCarTaxiFront: GeneratedIcon;
340
346
  export declare const LuCar: GeneratedIcon;
@@ -493,9 +499,3 @@ export declare const LuCloudCog: GeneratedIcon;
493
499
  export declare const LuCloudDownload: GeneratedIcon;
494
500
  export declare const LuCloudDrizzle: GeneratedIcon;
495
501
  export declare const LuCloudFog: GeneratedIcon;
496
- export declare const LuCloudHail: GeneratedIcon;
497
- export declare const LuCloudLightning: GeneratedIcon;
498
- export declare const LuCloudMoonRain: GeneratedIcon;
499
- export declare const LuCloudMoon: GeneratedIcon;
500
- export declare const LuCloudOff: GeneratedIcon;
501
- export declare const LuCloudRainWind: GeneratedIcon;