@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
@@ -1 +1 @@
1
- {"version":3,"file":"blockie.js","names":[],"sources":["../../src/utils/blockie.ts"],"sourcesContent":["// Source: https://github.com/ethereum/blockies\n// The random number is a js implementation of the Xorshift PRNG\ninterface BlockieOptions {\n /** seed used to generate icon data, default: random */\n seed: string;\n /** to manually specify the icon color, default: random */\n color: string;\n /** choose a different background color, default: random */\n bgcolor: string;\n /** width/height of the icon in blocks, default: 8 */\n size: number;\n /** width/height of each block in pixels, default: 4 */\n scale: number;\n /**\n * each pixel has a 13% chance of being of a third color, default: random.\n *\n * Set to -1 to disable it.\n *\n * These \"spots\" create structures that look like eyes, mouths and noses.\n */\n spotColor: string;\n}\n\nconst randSeed = new Array(4); // Xorshift: [x, y, z, w] 32 bit values\n\nfunction seedRand(seed: string): void {\n for (let i = 0; i < randSeed.length; i++) randSeed[i] = 0;\n\n for (let i = 0; i < seed.length; i++)\n randSeed[i % 4] = (randSeed[i % 4] << 5) - randSeed[i % 4] + seed.charCodeAt(i);\n}\n\nfunction rand(): number {\n // based on Java's String.hashCode(), expanded to 4 32bit values\n const t = randSeed[0] ^ (randSeed[0] << 11);\n\n randSeed[0] = randSeed[1];\n randSeed[1] = randSeed[2];\n randSeed[2] = randSeed[3];\n randSeed[3] = randSeed[3] ^ (randSeed[3] >> 19) ^ t ^ (t >> 8);\n\n return (randSeed[3] >>> 0) / ((1 << 31) >>> 0);\n}\n\nfunction createColor(): string {\n // saturation is the whole color spectrum\n const h = Math.floor(rand() * 360);\n // saturation goes from 40 to 100, it avoids greyish colors\n const s = `${rand() * 60 + 40}%`;\n // lightness can be anything from 0 to 100, but probabilities are a bell curve around 50%\n const l = `${(rand() + rand() + rand() + rand()) * 25}%`;\n\n return `hsl(${h},${s},${l})`;\n}\n\nfunction createImageData(size: number): number[] {\n const width = size; // Only support square icons for now\n const height = size;\n\n const dataWidth = Math.ceil(width / 2);\n const mirrorWidth = width - dataWidth;\n\n const data = [];\n for (let y = 0; y < height; y++) {\n let row = [];\n for (let x = 0; x < dataWidth; x++) {\n // this makes foreground and background color to have a 43% (1/2.3) probability\n // spot color has 13% chance\n row[x] = Math.floor(rand() * 2.3);\n }\n const r = row.slice(0, mirrorWidth);\n r.reverse();\n row = row.concat(r);\n\n for (const element of row) data.push(element);\n }\n\n return data;\n}\n\nfunction buildOpts(opts: Partial<BlockieOptions>): BlockieOptions {\n const newOpts: Partial<BlockieOptions> = {};\n\n newOpts.seed = opts.seed || Math.floor(Math.random() * 10 ** 16).toString(16);\n\n seedRand(newOpts.seed);\n\n newOpts.size = opts.size || 8;\n newOpts.scale = opts.scale || 8;\n newOpts.color = opts.color || createColor();\n newOpts.bgcolor = opts.bgcolor || createColor();\n newOpts.spotColor = opts.spotColor || createColor();\n\n return newOpts as BlockieOptions;\n}\n\nfunction renderIcon(opts: Partial<BlockieOptions>, canvas: HTMLCanvasElement): HTMLCanvasElement {\n const newOpts: BlockieOptions = buildOpts(opts || {});\n const imageData = createImageData(newOpts.size);\n const width = Math.sqrt(imageData.length);\n\n canvas.width = canvas.height = newOpts.size * newOpts.scale;\n\n const cc = canvas.getContext('2d') as CanvasRenderingContext2D;\n if (cc) {\n cc.fillStyle = newOpts.bgcolor;\n cc.fillRect(0, 0, canvas.width, canvas.height);\n cc.fillStyle = newOpts.color;\n\n for (const [i, imageDatum] of imageData.entries()) {\n // if data is 0, leave the background\n if (imageDatum) {\n const row = Math.floor(i / width);\n const col = i % width;\n\n // if data is 2, choose spot color, if 1 choose foreground\n cc.fillStyle = imageDatum === 1 ? newOpts.color : newOpts.spotColor;\n\n cc.fillRect(col * newOpts.scale, row * newOpts.scale, newOpts.scale, newOpts.scale);\n }\n }\n }\n\n return canvas;\n}\n\nexport function createBlockie(opts: Partial<BlockieOptions>): string {\n const canvas = document.createElement('canvas');\n\n renderIcon(opts, canvas);\n\n return canvas.toDataURL('image/jpeg');\n}\n"],"mappings":";AAuBA,IAAM,WAAW,IAAI,MAAM,CAAC;AAE5B,SAAS,SAAS,MAAoB;CACpC,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,SAAS,KAAK;CAExD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,SAAS,IAAI,MAAM,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW,CAAC;AAClF;AAEA,SAAS,OAAe;CAEtB,MAAM,IAAI,SAAS,KAAM,SAAS,MAAM;CAExC,SAAS,KAAK,SAAS;CACvB,SAAS,KAAK,SAAS;CACvB,SAAS,KAAK,SAAS;CACvB,SAAS,KAAK,SAAS,KAAM,SAAS,MAAM,KAAM,IAAK,KAAK;CAE5D,QAAQ,SAAS,OAAO,MAAO,KAAK,OAAQ;AAC9C;AAEA,SAAS,cAAsB;CAQ7B,OAAO,OANG,KAAK,MAAM,KAAK,IAAI,GAMhB,EAAE,GAAG,GAJN,KAAK,IAAI,KAAK,GAAG,GAIT,GAAG,IAFV,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,GAE5B;AAC5B;AAEA,SAAS,gBAAgB,MAAwB;CAC/C,MAAM,QAAQ;CACd,MAAM,SAAS;CAEf,MAAM,YAAY,KAAK,KAAK,QAAQ,CAAC;CACrC,MAAM,cAAc,QAAQ;CAE5B,MAAM,OAAO,CAAC;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAC/B,IAAI,MAAM,CAAC;EACX,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAG7B,IAAI,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;EAElC,MAAM,IAAI,IAAI,MAAM,GAAG,WAAW;EAClC,EAAE,QAAQ;EACV,MAAM,IAAI,OAAO,CAAC;EAElB,KAAK,MAAM,WAAW,KAAK,KAAK,KAAK,OAAO;CAC9C;CAEA,OAAO;AACT;AAEA,SAAS,UAAU,MAA+C;CAChE,MAAM,UAAmC,CAAC;CAE1C,QAAQ,OAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE;CAE5E,SAAS,QAAQ,IAAI;CAErB,QAAQ,OAAO,KAAK,QAAQ;CAC5B,QAAQ,QAAQ,KAAK,SAAS;CAC9B,QAAQ,QAAQ,KAAK,SAAS,YAAY;CAC1C,QAAQ,UAAU,KAAK,WAAW,YAAY;CAC9C,QAAQ,YAAY,KAAK,aAAa,YAAY;CAElD,OAAO;AACT;AAEA,SAAS,WAAW,MAA+B,QAA8C;CAC/F,MAAM,UAA0B,UAAU,QAAQ,CAAC,CAAC;CACpD,MAAM,YAAY,gBAAgB,QAAQ,IAAI;CAC9C,MAAM,QAAQ,KAAK,KAAK,UAAU,MAAM;CAExC,OAAO,QAAQ,OAAO,SAAS,QAAQ,OAAO,QAAQ;CAEtD,MAAM,KAAK,OAAO,WAAW,IAAI;CACjC,IAAI,IAAI;EACN,GAAG,YAAY,QAAQ;EACvB,GAAG,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;EAC7C,GAAG,YAAY,QAAQ;EAEvB,KAAK,MAAM,CAAC,GAAG,eAAe,UAAU,QAAQ,GAE9C,IAAI,YAAY;GACd,MAAM,MAAM,KAAK,MAAM,IAAI,KAAK;GAChC,MAAM,MAAM,IAAI;GAGhB,GAAG,YAAY,eAAe,IAAI,QAAQ,QAAQ,QAAQ;GAE1D,GAAG,SAAS,MAAM,QAAQ,OAAO,MAAM,QAAQ,OAAO,QAAQ,OAAO,QAAQ,KAAK;EACpF;CAEJ;CAEA,OAAO;AACT;AAEA,SAAgB,cAAc,MAAuC;CACnE,MAAM,SAAS,SAAS,cAAc,QAAQ;CAE9C,WAAW,MAAM,MAAM;CAEvB,OAAO,OAAO,UAAU,YAAY;AACtC"}
1
+ {"version":3,"file":"blockie.js","names":[],"sources":["../../src/utils/blockie.ts"],"sourcesContent":["/**\n * Options for a blockie, the identicon from https://github.com/ethereum/blockies.\n * Its randomness comes from a JS implementation of the Xorshift PRNG.\n */\ninterface BlockieOptions {\n /** seed used to generate icon data, default: random */\n seed: string;\n /** to manually specify the icon color, default: random */\n color: string;\n /** choose a different background color, default: random */\n bgcolor: string;\n /** width/height of the icon in blocks, default: 8 */\n size: number;\n /** width/height of each block in pixels, default: 4 */\n scale: number;\n /**\n * each pixel has a 13% chance of being of a third color, default: random.\n *\n * Set to -1 to disable it.\n *\n * These \"spots\" create structures that look like eyes, mouths and noses.\n */\n spotColor: string;\n}\n\nconst randSeed = new Array(4); // Xorshift: [x, y, z, w] 32 bit values\n\nfunction seedRand(seed: string): void {\n for (let i = 0; i < randSeed.length; i++) randSeed[i] = 0;\n\n for (let i = 0; i < seed.length; i++)\n randSeed[i % 4] = (randSeed[i % 4] << 5) - randSeed[i % 4] + seed.charCodeAt(i);\n}\n\n/**\n * The next random number, from a hash based on Java's String.hashCode()\n * expanded to four 32-bit values.\n */\nfunction rand(): number {\n const t = randSeed[0] ^ (randSeed[0] << 11);\n\n randSeed[0] = randSeed[1];\n randSeed[1] = randSeed[2];\n randSeed[2] = randSeed[3];\n randSeed[3] = randSeed[3] ^ (randSeed[3] >> 19) ^ t ^ (t >> 8);\n\n return (randSeed[3] >>> 0) / ((1 << 31) >>> 0);\n}\n\n/**\n * A random colour: any hue, a saturation from 40 to 100 that keeps it out of\n * the greys, and a lightness drawn from a bell curve around 50%.\n */\nfunction createColor(): string {\n const h = Math.floor(rand() * 360);\n const s = `${rand() * 60 + 40}%`;\n const l = `${(rand() + rand() + rand() + rand()) * 25}%`;\n\n return `hsl(${h},${s},${l})`;\n}\n\nfunction createImageData(size: number): number[] {\n const width = size; // Only support square icons for now\n const height = size;\n\n const dataWidth = Math.ceil(width / 2);\n const mirrorWidth = width - dataWidth;\n\n const data = [];\n for (let y = 0; y < height; y++) {\n let row = [];\n for (let x = 0; x < dataWidth; x++) {\n // 43% (1/2.3) each for foreground and background, leaving 13% for the spot colour\n row[x] = Math.floor(rand() * 2.3);\n }\n const r = row.slice(0, mirrorWidth);\n r.reverse();\n row = row.concat(r);\n\n for (const element of row) data.push(element);\n }\n\n return data;\n}\n\nfunction buildOpts(opts: Partial<BlockieOptions>): BlockieOptions {\n const newOpts: Partial<BlockieOptions> = {};\n\n newOpts.seed = opts.seed || Math.floor(Math.random() * 10 ** 16).toString(16);\n\n seedRand(newOpts.seed);\n\n newOpts.size = opts.size || 8;\n newOpts.scale = opts.scale || 8;\n newOpts.color = opts.color || createColor();\n newOpts.bgcolor = opts.bgcolor || createColor();\n newOpts.spotColor = opts.spotColor || createColor();\n\n return newOpts as BlockieOptions;\n}\n\nfunction renderIcon(opts: Partial<BlockieOptions>, canvas: HTMLCanvasElement): HTMLCanvasElement {\n const newOpts: BlockieOptions = buildOpts(opts || {});\n const imageData = createImageData(newOpts.size);\n const width = Math.sqrt(imageData.length);\n\n canvas.width = canvas.height = newOpts.size * newOpts.scale;\n\n const cc = canvas.getContext('2d') as CanvasRenderingContext2D;\n if (cc) {\n cc.fillStyle = newOpts.bgcolor;\n cc.fillRect(0, 0, canvas.width, canvas.height);\n cc.fillStyle = newOpts.color;\n\n for (const [i, imageDatum] of imageData.entries()) {\n // if data is 0, leave the background\n if (imageDatum) {\n const row = Math.floor(i / width);\n const col = i % width;\n\n // if data is 2, choose spot color, if 1 choose foreground\n cc.fillStyle = imageDatum === 1 ? newOpts.color : newOpts.spotColor;\n\n cc.fillRect(col * newOpts.scale, row * newOpts.scale, newOpts.scale, newOpts.scale);\n }\n }\n }\n\n return canvas;\n}\n\nexport function createBlockie(opts: Partial<BlockieOptions>): string {\n const canvas = document.createElement('canvas');\n\n renderIcon(opts, canvas);\n\n return canvas.toDataURL('image/jpeg');\n}\n"],"mappings":";AAyBA,IAAM,WAAW,IAAI,MAAM,CAAC;AAE5B,SAAS,SAAS,MAAoB;CACpC,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,SAAS,KAAK;CAExD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,SAAS,IAAI,MAAM,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW,CAAC;AAClF;;;;;AAMA,SAAS,OAAe;CACtB,MAAM,IAAI,SAAS,KAAM,SAAS,MAAM;CAExC,SAAS,KAAK,SAAS;CACvB,SAAS,KAAK,SAAS;CACvB,SAAS,KAAK,SAAS;CACvB,SAAS,KAAK,SAAS,KAAM,SAAS,MAAM,KAAM,IAAK,KAAK;CAE5D,QAAQ,SAAS,OAAO,MAAO,KAAK,OAAQ;AAC9C;;;;;AAMA,SAAS,cAAsB;CAK7B,OAAO,OAJG,KAAK,MAAM,KAAK,IAAI,GAIhB,EAAE,GAAG,GAHN,KAAK,IAAI,KAAK,GAAG,GAGT,GAAG,IAFV,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,GAE5B;AAC5B;AAEA,SAAS,gBAAgB,MAAwB;CAC/C,MAAM,QAAQ;CACd,MAAM,SAAS;CAEf,MAAM,YAAY,KAAK,KAAK,QAAQ,CAAC;CACrC,MAAM,cAAc,QAAQ;CAE5B,MAAM,OAAO,CAAC;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAC/B,IAAI,MAAM,CAAC;EACX,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAE7B,IAAI,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;EAElC,MAAM,IAAI,IAAI,MAAM,GAAG,WAAW;EAClC,EAAE,QAAQ;EACV,MAAM,IAAI,OAAO,CAAC;EAElB,KAAK,MAAM,WAAW,KAAK,KAAK,KAAK,OAAO;CAC9C;CAEA,OAAO;AACT;AAEA,SAAS,UAAU,MAA+C;CAChE,MAAM,UAAmC,CAAC;CAE1C,QAAQ,OAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE;CAE5E,SAAS,QAAQ,IAAI;CAErB,QAAQ,OAAO,KAAK,QAAQ;CAC5B,QAAQ,QAAQ,KAAK,SAAS;CAC9B,QAAQ,QAAQ,KAAK,SAAS,YAAY;CAC1C,QAAQ,UAAU,KAAK,WAAW,YAAY;CAC9C,QAAQ,YAAY,KAAK,aAAa,YAAY;CAElD,OAAO;AACT;AAEA,SAAS,WAAW,MAA+B,QAA8C;CAC/F,MAAM,UAA0B,UAAU,QAAQ,CAAC,CAAC;CACpD,MAAM,YAAY,gBAAgB,QAAQ,IAAI;CAC9C,MAAM,QAAQ,KAAK,KAAK,UAAU,MAAM;CAExC,OAAO,QAAQ,OAAO,SAAS,QAAQ,OAAO,QAAQ;CAEtD,MAAM,KAAK,OAAO,WAAW,IAAI;CACjC,IAAI,IAAI;EACN,GAAG,YAAY,QAAQ;EACvB,GAAG,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;EAC7C,GAAG,YAAY,QAAQ;EAEvB,KAAK,MAAM,CAAC,GAAG,eAAe,UAAU,QAAQ,GAE9C,IAAI,YAAY;GACd,MAAM,MAAM,KAAK,MAAM,IAAI,KAAK;GAChC,MAAM,MAAM,IAAI;GAGhB,GAAG,YAAY,eAAe,IAAI,QAAQ,QAAQ,QAAQ;GAE1D,GAAG,SAAS,MAAM,QAAQ,OAAO,MAAM,QAAQ,OAAO,QAAQ,OAAO,QAAQ,KAAK;EACpF;CAEJ;CAEA,OAAO;AACT;AAEA,SAAgB,cAAc,MAAuC;CACnE,MAAM,SAAS,SAAS,cAAc,QAAQ;CAE9C,WAAW,MAAM,MAAM;CAEvB,OAAO,OAAO,UAAU,YAAY;AACtC"}
@@ -2,37 +2,43 @@ import type { SetupContext } from 'vue';
2
2
  type SetupContextAttrs = SetupContext['attrs'];
3
3
  type SetupContextAttrsKeys = (keyof SetupContextAttrs)[];
4
4
  /**
5
- * Format number value without fraction
6
- * @param {number} amount
5
+ * Formats a number without a fractional part.
6
+ *
7
+ * @param amount - the value to format
8
+ * @returns the value with no decimals, grouped for the current locale
7
9
  */
8
10
  export declare function formatInteger(amount: number | string): string;
9
11
  /**
10
- * Picks only required attributes for root element
11
- * @param {SetupContextAttrs} data
12
- * @param {SetupContextAttrsKeys} include
13
- * @returns {Pick<SetupContextAttrs, any>}
12
+ * Picks the attributes that belong on the root element.
13
+ *
14
+ * @param data - the attributes handed to the component
15
+ * @param include - keys to keep besides the `data-` ones
16
+ * @returns the attributes to bind on the root element
14
17
  */
15
18
  export declare function getRootAttrs(data: SetupContextAttrs, include?: SetupContextAttrsKeys): Pick<import("vue").Attrs, string>;
16
19
  /**
17
- * Omits root attributes from component's attributes
18
- * @param {SetupContextAttrs} data
19
- * @param {SetupContextAttrsKeys} exclude
20
- * @returns {Omit<SetupContextAttrs, any>}
20
+ * Drops the root element's attributes, leaving what the inner element takes.
21
+ *
22
+ * @param data - the attributes handed to the component
23
+ * @param exclude - keys to drop besides the `data-` ones
24
+ * @returns the remaining attributes
21
25
  */
22
26
  export declare function getNonRootAttrs(data: SetupContextAttrs, exclude?: SetupContextAttrsKeys): Omit<import("vue").Attrs, string>;
23
27
  /**
24
- * Transforms the keys of an object to either camelCase or snake_case
25
- * @param {T} item
26
- * @param {"camelCase" | "snake_case"} to
27
- * @returns {Record<string, any>}
28
+ * Rewrites an object's keys in another case.
29
+ *
30
+ * @param item - the object whose keys to rewrite
31
+ * @param to - the case to write them in
32
+ * @returns a new object holding the same values under the rewritten keys
28
33
  */
29
34
  export declare function transformCase<T extends object>(item: T, to: 'camelCase' | 'snake_case'): Record<string, T[keyof T]>;
30
35
  /**
36
+ * Reduces a value to a token that keyword matching can compare, dropping the
37
+ * spacing and case a reader would otherwise have to match exactly.
31
38
  *
32
- * @param {string} string - String to convert
33
- * @return {string} - String converted to text token, mostly used to matching keyword
34
- * @example
35
- * getTextToken('this is a sentence'); // thisisasentence
39
+ * @param string - the value to convert
40
+ * @returns the token, e.g. `getTextToken('this is a sentence')` gives
41
+ * `thisisasentence`
36
42
  */
37
43
  export declare function getTextToken(string: unknown): string;
38
44
  export declare function transformPropsUnit(value?: string | number): string | undefined;
@@ -8,43 +8,49 @@ function formatNumber(amount, { fractionDigits = 2 }) {
8
8
  }).format(Number(amount));
9
9
  }
10
10
  /**
11
- * Format number value without fraction
12
- * @param {number} amount
11
+ * Formats a number without a fractional part.
12
+ *
13
+ * @param amount - the value to format
14
+ * @returns the value with no decimals, grouped for the current locale
13
15
  */
14
16
  function formatInteger(amount) {
15
17
  return formatNumber(amount, { fractionDigits: 0 });
16
18
  }
17
19
  /**
18
- * Generates and returns the array of root allowed attributes
19
- * @param {SetupContextAttrs} data
20
- * @returns {SetupContextAttrsKeys}
20
+ * The attribute keys that belong on a component's root element.
21
+ *
22
+ * @param data - the attributes handed to the component
23
+ * @returns every `data-` key among them
21
24
  */
22
25
  function getRootKeys(data) {
23
26
  return Object.keys(data).filter((key) => key.startsWith("data-"));
24
27
  }
25
28
  /**
26
- * Picks only required attributes for root element
27
- * @param {SetupContextAttrs} data
28
- * @param {SetupContextAttrsKeys} include
29
- * @returns {Pick<SetupContextAttrs, any>}
29
+ * Picks the attributes that belong on the root element.
30
+ *
31
+ * @param data - the attributes handed to the component
32
+ * @param include - keys to keep besides the `data-` ones
33
+ * @returns the attributes to bind on the root element
30
34
  */
31
35
  function getRootAttrs(data, include = ["class"]) {
32
36
  return objectPick(data, [...getRootKeys(data), ...include]);
33
37
  }
34
38
  /**
35
- * Omits root attributes from component's attributes
36
- * @param {SetupContextAttrs} data
37
- * @param {SetupContextAttrsKeys} exclude
38
- * @returns {Omit<SetupContextAttrs, any>}
39
+ * Drops the root element's attributes, leaving what the inner element takes.
40
+ *
41
+ * @param data - the attributes handed to the component
42
+ * @param exclude - keys to drop besides the `data-` ones
43
+ * @returns the remaining attributes
39
44
  */
40
45
  function getNonRootAttrs(data, exclude = ["class"]) {
41
46
  return objectOmit(data, [...getRootKeys(data), ...exclude]);
42
47
  }
43
48
  /**
44
- * Transforms the keys of an object to either camelCase or snake_case
45
- * @param {T} item
46
- * @param {"camelCase" | "snake_case"} to
47
- * @returns {Record<string, any>}
49
+ * Rewrites an object's keys in another case.
50
+ *
51
+ * @param item - the object whose keys to rewrite
52
+ * @param to - the case to write them in
53
+ * @returns a new object holding the same values under the rewritten keys
48
54
  */
49
55
  function transformCase(item, to) {
50
56
  if (!item) return item;
@@ -55,11 +61,12 @@ function transformCase(item, to) {
55
61
  }, {});
56
62
  }
57
63
  /**
64
+ * Reduces a value to a token that keyword matching can compare, dropping the
65
+ * spacing and case a reader would otherwise have to match exactly.
58
66
  *
59
- * @param {string} string - String to convert
60
- * @return {string} - String converted to text token, mostly used to matching keyword
61
- * @example
62
- * getTextToken('this is a sentence'); // thisisasentence
67
+ * @param string - the value to convert
68
+ * @returns the token, e.g. `getTextToken('this is a sentence')` gives
69
+ * `thisisasentence`
63
70
  */
64
71
  function getTextToken(string) {
65
72
  if (!string) return "";
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","names":[],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["import type { SetupContext } from 'vue';\nimport { objectOmit, objectPick } from '@vueuse/shared';\nimport { camelCase, snakeCase } from 'scule';\n\ninterface FormatNumberOptions {\n fractionDigits?: number;\n}\n\ntype SetupContextAttrs = SetupContext['attrs'];\n\ntype SetupContextAttrsKeys = (keyof SetupContextAttrs)[];\n\nfunction formatNumber(\n amount: number | string,\n { fractionDigits = 2 }: FormatNumberOptions,\n): string {\n return new Intl.NumberFormat(undefined, {\n maximumFractionDigits: fractionDigits,\n minimumFractionDigits: fractionDigits,\n }).format(Number(amount));\n}\n\n/**\n * Format number value without fraction\n * @param {number} amount\n */\nexport function formatInteger(amount: number | string): string {\n return formatNumber(amount, { fractionDigits: 0 });\n}\n\n/**\n * Generates and returns the array of root allowed attributes\n * @param {SetupContextAttrs} data\n * @returns {SetupContextAttrsKeys}\n */\nfunction getRootKeys(data: SetupContextAttrs): SetupContextAttrsKeys {\n return Object.keys(data).filter(key => key.startsWith('data-')) as SetupContextAttrsKeys;\n}\n\n/**\n * Picks only required attributes for root element\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} include\n * @returns {Pick<SetupContextAttrs, any>}\n */\nexport function getRootAttrs(data: SetupContextAttrs, include: SetupContextAttrsKeys = ['class']) {\n return objectPick(data, [...getRootKeys(data), ...include]);\n}\n\n/**\n * Omits root attributes from component's attributes\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} exclude\n * @returns {Omit<SetupContextAttrs, any>}\n */\nexport function getNonRootAttrs(\n data: SetupContextAttrs,\n exclude: SetupContextAttrsKeys = ['class'],\n) {\n return objectOmit(data, [...getRootKeys(data), ...exclude]);\n}\n\n/**\n * Transforms the keys of an object to either camelCase or snake_case\n * @param {T} item\n * @param {\"camelCase\" | \"snake_case\"} to\n * @returns {Record<string, any>}\n */\nexport function transformCase<T extends object>(\n item: T,\n to: 'camelCase' | 'snake_case',\n): Record<string, T[keyof T]> {\n if (!item)\n return item;\n\n return Object.keys(item).reduce(\n (acc, curr) => {\n if (to === 'camelCase')\n acc[camelCase(curr)] = item[curr as keyof T];\n else acc[snakeCase(curr)] = item[curr as keyof T];\n\n return acc;\n },\n {} as Record<string, T[keyof T]>,\n );\n}\n\n/**\n *\n * @param {string} string - String to convert\n * @return {string} - String converted to text token, mostly used to matching keyword\n * @example\n * getTextToken('this is a sentence'); // thisisasentence\n */\n\nexport function getTextToken(string: unknown): string {\n if (!string)\n return '';\n\n return string\n .toString()\n .toLowerCase()\n .replace(/[^\\da-z]/gi, '');\n}\n\nexport function transformPropsUnit(value?: string | number): string | undefined {\n if (value === undefined || (typeof value === 'string' && isNaN(Number(value))))\n return value;\n return `${value}px`;\n}\n\n/**\n * Formats a byte count into a human-readable string (e.g. \"1.2 MB\").\n */\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0)\n return '0 B';\n if (bytes < 1024)\n return `${bytes} B`;\n const units = ['KB', 'MB', 'GB', 'TB'];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${units[unitIndex]}`;\n}\n"],"mappings":";;;AAYA,SAAS,aACP,QACA,EAAE,iBAAiB,KACX;CACR,OAAO,IAAI,KAAK,aAAa,KAAA,GAAW;EACtC,uBAAuB;EACvB,uBAAuB;CACzB,CAAC,CAAC,CAAC,OAAO,OAAO,MAAM,CAAC;AAC1B;;;;;AAMA,SAAgB,cAAc,QAAiC;CAC7D,OAAO,aAAa,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AACnD;;;;;;AAOA,SAAS,YAAY,MAAgD;CACnE,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,QAAO,QAAO,IAAI,WAAW,OAAO,CAAC;AAChE;;;;;;;AAQA,SAAgB,aAAa,MAAyB,UAAiC,CAAC,OAAO,GAAG;CAChG,OAAO,WAAW,MAAM,CAAC,GAAG,YAAY,IAAI,GAAG,GAAG,OAAO,CAAC;AAC5D;;;;;;;AAQA,SAAgB,gBACd,MACA,UAAiC,CAAC,OAAO,GACzC;CACA,OAAO,WAAW,MAAM,CAAC,GAAG,YAAY,IAAI,GAAG,GAAG,OAAO,CAAC;AAC5D;;;;;;;AAQA,SAAgB,cACd,MACA,IAC4B;CAC5B,IAAI,CAAC,MACH,OAAO;CAET,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,QACtB,KAAK,SAAS;EACb,IAAI,OAAO,aACT,IAAI,UAAU,IAAI,KAAK,KAAK;OACzB,IAAI,UAAU,IAAI,KAAK,KAAK;EAEjC,OAAO;CACT,GACA,CAAC,CACH;AACF;;;;;;;;AAUA,SAAgB,aAAa,QAAyB;CACpD,IAAI,CAAC,QACH,OAAO;CAET,OAAO,OACJ,SAAS,CAAC,CACV,YAAY,CAAC,CACb,QAAQ,cAAc,EAAE;AAC7B;AAEA,SAAgB,mBAAmB,OAA6C;CAC9E,IAAI,UAAU,KAAA,KAAc,OAAO,UAAU,YAAY,MAAM,OAAO,KAAK,CAAC,GAC1E,OAAO;CACT,OAAO,GAAG,MAAM;AAClB;;;;AAKA,SAAgB,eAAe,OAAuB;CACpD,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GACrC,OAAO;CACT,IAAI,QAAQ,MACV,OAAO,GAAG,MAAM;CAClB,MAAM,QAAQ;EAAC;EAAM;EAAM;EAAM;CAAI;CACrC,IAAI,QAAQ,QAAQ;CACpB,IAAI,YAAY;CAChB,OAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;EACpD,SAAS;EACT;CACF;CACA,OAAO,GAAG,MAAM,QAAQ,SAAS,KAAK,IAAI,CAAC,EAAE,GAAG,MAAM;AACxD"}
1
+ {"version":3,"file":"helpers.js","names":[],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["import type { SetupContext } from 'vue';\nimport { objectOmit, objectPick } from '@vueuse/shared';\nimport { camelCase, snakeCase } from 'scule';\n\ninterface FormatNumberOptions {\n fractionDigits?: number;\n}\n\ntype SetupContextAttrs = SetupContext['attrs'];\n\ntype SetupContextAttrsKeys = (keyof SetupContextAttrs)[];\n\nfunction formatNumber(\n amount: number | string,\n { fractionDigits = 2 }: FormatNumberOptions,\n): string {\n return new Intl.NumberFormat(undefined, {\n maximumFractionDigits: fractionDigits,\n minimumFractionDigits: fractionDigits,\n }).format(Number(amount));\n}\n\n/**\n * Formats a number without a fractional part.\n *\n * @param amount - the value to format\n * @returns the value with no decimals, grouped for the current locale\n */\nexport function formatInteger(amount: number | string): string {\n return formatNumber(amount, { fractionDigits: 0 });\n}\n\n/**\n * The attribute keys that belong on a component's root element.\n *\n * @param data - the attributes handed to the component\n * @returns every `data-` key among them\n */\nfunction getRootKeys(data: SetupContextAttrs): SetupContextAttrsKeys {\n return Object.keys(data).filter(key => key.startsWith('data-')) as SetupContextAttrsKeys;\n}\n\n/**\n * Picks the attributes that belong on the root element.\n *\n * @param data - the attributes handed to the component\n * @param include - keys to keep besides the `data-` ones\n * @returns the attributes to bind on the root element\n */\nexport function getRootAttrs(data: SetupContextAttrs, include: SetupContextAttrsKeys = ['class']) {\n return objectPick(data, [...getRootKeys(data), ...include]);\n}\n\n/**\n * Drops the root element's attributes, leaving what the inner element takes.\n *\n * @param data - the attributes handed to the component\n * @param exclude - keys to drop besides the `data-` ones\n * @returns the remaining attributes\n */\nexport function getNonRootAttrs(\n data: SetupContextAttrs,\n exclude: SetupContextAttrsKeys = ['class'],\n) {\n return objectOmit(data, [...getRootKeys(data), ...exclude]);\n}\n\n/**\n * Rewrites an object's keys in another case.\n *\n * @param item - the object whose keys to rewrite\n * @param to - the case to write them in\n * @returns a new object holding the same values under the rewritten keys\n */\nexport function transformCase<T extends object>(\n item: T,\n to: 'camelCase' | 'snake_case',\n): Record<string, T[keyof T]> {\n if (!item)\n return item;\n\n return Object.keys(item).reduce(\n (acc, curr) => {\n if (to === 'camelCase')\n acc[camelCase(curr)] = item[curr as keyof T];\n else acc[snakeCase(curr)] = item[curr as keyof T];\n\n return acc;\n },\n {} as Record<string, T[keyof T]>,\n );\n}\n\n/**\n * Reduces a value to a token that keyword matching can compare, dropping the\n * spacing and case a reader would otherwise have to match exactly.\n *\n * @param string - the value to convert\n * @returns the token, e.g. `getTextToken('this is a sentence')` gives\n * `thisisasentence`\n */\nexport function getTextToken(string: unknown): string {\n if (!string)\n return '';\n\n return string\n .toString()\n .toLowerCase()\n .replace(/[^\\da-z]/gi, '');\n}\n\nexport function transformPropsUnit(value?: string | number): string | undefined {\n if (value === undefined || (typeof value === 'string' && isNaN(Number(value))))\n return value;\n return `${value}px`;\n}\n\n/**\n * Formats a byte count into a human-readable string (e.g. \"1.2 MB\").\n */\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0)\n return '0 B';\n if (bytes < 1024)\n return `${bytes} B`;\n const units = ['KB', 'MB', 'GB', 'TB'];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${units[unitIndex]}`;\n}\n"],"mappings":";;;AAYA,SAAS,aACP,QACA,EAAE,iBAAiB,KACX;CACR,OAAO,IAAI,KAAK,aAAa,KAAA,GAAW;EACtC,uBAAuB;EACvB,uBAAuB;CACzB,CAAC,CAAC,CAAC,OAAO,OAAO,MAAM,CAAC;AAC1B;;;;;;;AAQA,SAAgB,cAAc,QAAiC;CAC7D,OAAO,aAAa,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AACnD;;;;;;;AAQA,SAAS,YAAY,MAAgD;CACnE,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,QAAO,QAAO,IAAI,WAAW,OAAO,CAAC;AAChE;;;;;;;;AASA,SAAgB,aAAa,MAAyB,UAAiC,CAAC,OAAO,GAAG;CAChG,OAAO,WAAW,MAAM,CAAC,GAAG,YAAY,IAAI,GAAG,GAAG,OAAO,CAAC;AAC5D;;;;;;;;AASA,SAAgB,gBACd,MACA,UAAiC,CAAC,OAAO,GACzC;CACA,OAAO,WAAW,MAAM,CAAC,GAAG,YAAY,IAAI,GAAG,GAAG,OAAO,CAAC;AAC5D;;;;;;;;AASA,SAAgB,cACd,MACA,IAC4B;CAC5B,IAAI,CAAC,MACH,OAAO;CAET,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,QACtB,KAAK,SAAS;EACb,IAAI,OAAO,aACT,IAAI,UAAU,IAAI,KAAK,KAAK;OACzB,IAAI,UAAU,IAAI,KAAK,KAAK;EAEjC,OAAO;CACT,GACA,CAAC,CACH;AACF;;;;;;;;;AAUA,SAAgB,aAAa,QAAyB;CACpD,IAAI,CAAC,QACH,OAAO;CAET,OAAO,OACJ,SAAS,CAAC,CACV,YAAY,CAAC,CACb,QAAQ,cAAc,EAAE;AAC7B;AAEA,SAAgB,mBAAmB,OAA6C;CAC9E,IAAI,UAAU,KAAA,KAAc,OAAO,UAAU,YAAY,MAAM,OAAO,KAAK,CAAC,GAC1E,OAAO;CACT,OAAO,GAAG,MAAM;AAClB;;;;AAKA,SAAgB,eAAe,OAAuB;CACpD,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GACrC,OAAO;CACT,IAAI,QAAQ,MACV,OAAO,GAAG,MAAM;CAClB,MAAM,QAAQ;EAAC;EAAM;EAAM;EAAM;CAAI;CACrC,IAAI,QAAQ,QAAQ;CACpB,IAAI,YAAY;CAChB,OAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;EACpD,SAAS;EACT;CACF;CACA,OAAO,GAAG,MAAM,QAAQ,SAAS,KAAK,IAAI,CAAC,EAAE,GAAG,MAAM;AACxD"}
@@ -1 +1,10 @@
1
+ /**
2
+ * Compares two values structurally: arrays element by element and objects key
3
+ * by key, with everything else compared by identity, which is what a primitive
4
+ * or a function needs.
5
+ *
6
+ * @param value - the first value
7
+ * @param other - the value to compare it with
8
+ * @returns whether the two are equal
9
+ */
1
10
  export declare function isEqual(value: unknown, other: unknown): boolean;
@@ -1,22 +1,29 @@
1
1
  //#region src/utils/is-equal.ts
2
+ function arraysEqual(value, other) {
3
+ if (!Array.isArray(other) || value.length !== other.length) return false;
4
+ return value.every((element, index) => isEqual(element, other[index]));
5
+ }
6
+ function objectsEqual(value, other) {
7
+ const valueEntries = Object.entries(value);
8
+ if (valueEntries.length !== Object.keys(other).length) return false;
9
+ const otherEntries = Object.fromEntries(Object.entries(other));
10
+ return valueEntries.every(([key, entry]) => Object.hasOwn(otherEntries, key) && isEqual(entry, otherEntries[key]));
11
+ }
12
+ /**
13
+ * Compares two values structurally: arrays element by element and objects key
14
+ * by key, with everything else compared by identity, which is what a primitive
15
+ * or a function needs.
16
+ *
17
+ * @param value - the first value
18
+ * @param other - the value to compare it with
19
+ * @returns whether the two are equal
20
+ */
2
21
  function isEqual(value, other) {
3
22
  if (value === other) return true;
4
- if (value == null || other == null) return value === other;
23
+ if (value === null || value === void 0 || other === null || other === void 0) return false;
5
24
  if (typeof value !== typeof other) return false;
6
- if (Array.isArray(value)) {
7
- if (!Array.isArray(other) || value.length !== other.length) return false;
8
- for (const [i, element] of value.entries()) if (!isEqual(element, other[i])) return false;
9
- return true;
10
- }
11
- if (typeof value === "object") {
12
- const valueRecord = value;
13
- const otherRecord = other;
14
- const valueKeys = Object.keys(valueRecord);
15
- const otherKeys = Object.keys(otherRecord);
16
- if (valueKeys.length !== otherKeys.length) return false;
17
- for (const key of valueKeys) if (!isEqual(valueRecord[key], otherRecord[key])) return false;
18
- return true;
19
- }
25
+ if (Array.isArray(value)) return arraysEqual(value, other);
26
+ if (typeof value === "object" && typeof other === "object") return objectsEqual(value, other);
20
27
  return false;
21
28
  }
22
29
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"is-equal.js","names":[],"sources":["../../src/utils/is-equal.ts"],"sourcesContent":["export function isEqual(value: unknown, other: unknown): boolean {\n // Check if the values are identical (covers primitives and functions)\n if (value === other)\n return true;\n\n // Check if the values are null or undefined\n if (value == null || other == null)\n return value === other;\n\n // Check if the values are of different types\n if (typeof value !== typeof other)\n return false;\n\n // Compare arrays\n if (Array.isArray(value)) {\n if (!Array.isArray(other) || value.length !== other.length)\n return false;\n\n for (const [i, element] of value.entries()) {\n if (!isEqual(element, other[i]))\n return false;\n }\n return true;\n }\n\n // Compare objects\n if (typeof value === 'object') {\n const valueRecord = value as Record<string, unknown>;\n const otherRecord = other as Record<string, unknown>;\n const valueKeys = Object.keys(valueRecord);\n const otherKeys = Object.keys(otherRecord);\n\n if (valueKeys.length !== otherKeys.length)\n return false;\n\n for (const key of valueKeys) {\n if (!isEqual(valueRecord[key], otherRecord[key]))\n return false;\n }\n return true;\n }\n\n // If the values are neither primitives, arrays, nor objects, return false\n return false;\n}\n"],"mappings":";AAAA,SAAgB,QAAQ,OAAgB,OAAyB;CAE/D,IAAI,UAAU,OACZ,OAAO;CAGT,IAAI,SAAS,QAAQ,SAAS,MAC5B,OAAO,UAAU;CAGnB,IAAI,OAAO,UAAU,OAAO,OAC1B,OAAO;CAGT,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,MAAM,QAClD,OAAO;EAET,KAAK,MAAM,CAAC,GAAG,YAAY,MAAM,QAAQ,GACvC,IAAI,CAAC,QAAQ,SAAS,MAAM,EAAE,GAC5B,OAAO;EAEX,OAAO;CACT;CAGA,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,cAAc;EACpB,MAAM,cAAc;EACpB,MAAM,YAAY,OAAO,KAAK,WAAW;EACzC,MAAM,YAAY,OAAO,KAAK,WAAW;EAEzC,IAAI,UAAU,WAAW,UAAU,QACjC,OAAO;EAET,KAAK,MAAM,OAAO,WAChB,IAAI,CAAC,QAAQ,YAAY,MAAM,YAAY,IAAI,GAC7C,OAAO;EAEX,OAAO;CACT;CAGA,OAAO;AACT"}
1
+ {"version":3,"file":"is-equal.js","names":[],"sources":["../../src/utils/is-equal.ts"],"sourcesContent":["function arraysEqual(value: unknown[], other: unknown): boolean {\n if (!Array.isArray(other) || value.length !== other.length)\n return false;\n\n return value.every((element, index) => isEqual(element, other[index]));\n}\n\nfunction objectsEqual(value: object, other: object): boolean {\n const valueEntries = Object.entries(value);\n\n if (valueEntries.length !== Object.keys(other).length)\n return false;\n\n const otherEntries = Object.fromEntries(Object.entries(other));\n\n return valueEntries.every(([key, entry]) =>\n Object.hasOwn(otherEntries, key) && isEqual(entry, otherEntries[key]));\n}\n\n/**\n * Compares two values structurally: arrays element by element and objects key\n * by key, with everything else compared by identity, which is what a primitive\n * or a function needs.\n *\n * @param value - the first value\n * @param other - the value to compare it with\n * @returns whether the two are equal\n */\nexport function isEqual(value: unknown, other: unknown): boolean {\n if (value === other)\n return true;\n\n // A null or undefined only equals itself, which the check above settled\n if (value === null || value === undefined || other === null || other === undefined)\n return false;\n\n if (typeof value !== typeof other)\n return false;\n\n if (Array.isArray(value))\n return arraysEqual(value, other);\n\n if (typeof value === 'object' && typeof other === 'object')\n return objectsEqual(value, other);\n\n // Neither a primitive that matched, nor an array, nor an object\n return false;\n}\n"],"mappings":";AAAA,SAAS,YAAY,OAAkB,OAAyB;CAC9D,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,MAAM,QAClD,OAAO;CAET,OAAO,MAAM,OAAO,SAAS,UAAU,QAAQ,SAAS,MAAM,MAAM,CAAC;AACvE;AAEA,SAAS,aAAa,OAAe,OAAwB;CAC3D,MAAM,eAAe,OAAO,QAAQ,KAAK;CAEzC,IAAI,aAAa,WAAW,OAAO,KAAK,KAAK,CAAC,CAAC,QAC7C,OAAO;CAET,MAAM,eAAe,OAAO,YAAY,OAAO,QAAQ,KAAK,CAAC;CAE7D,OAAO,aAAa,OAAO,CAAC,KAAK,WAC/B,OAAO,OAAO,cAAc,GAAG,KAAK,QAAQ,OAAO,aAAa,IAAI,CAAC;AACzE;;;;;;;;;;AAWA,SAAgB,QAAQ,OAAgB,OAAyB;CAC/D,IAAI,UAAU,OACZ,OAAO;CAGT,IAAI,UAAU,QAAQ,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU,KAAA,GACvE,OAAO;CAET,IAAI,OAAO,UAAU,OAAO,OAC1B,OAAO;CAET,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,YAAY,OAAO,KAAK;CAEjC,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAChD,OAAO,aAAa,OAAO,KAAK;CAGlC,OAAO;AACT"}
@@ -2,13 +2,17 @@
2
2
  * Tailwind Variants wrapper.
3
3
  *
4
4
  * Re-exports `tv` from `tailwind-variants` with project-level configuration.
5
- * Uses `createTV()` so we can extend twMerge config for custom theme classes
6
- * (e.g., `text-rui-primary`) in the future.
5
+ * `createTV()` teaches the conflict resolver about the theme's own class
6
+ * groups, so `text-rui-primary` reads as a colour rather than a font size.
7
+ *
8
+ * The resolver ships inside tailwind-variants as of 3.3, which is why there is
9
+ * no `tailwind-merge` dependency: the peer is optional and nothing imports it.
7
10
  *
8
11
  * @see https://www.tailwind-variants.org/docs/introduction
9
12
  */
10
13
  import type { VueClassValue } from '../types/class-value';
11
14
  import { type ClassValue } from 'vue';
15
+ /** The library's tailwind-variants instance, with its own tw-merge groups. */
12
16
  export declare const tv: import("tailwind-variants").TV;
13
17
  /**
14
18
  * Normalizes any Vue `:class` binding value (string, object, array, nullish
package/dist/utils/tv.js CHANGED
@@ -2,20 +2,36 @@ import { normalizeClass } from "vue";
2
2
  import { createTV } from "tailwind-variants";
3
3
  //#region src/utils/tv.ts
4
4
  var isAny = () => true;
5
- var tv = /* @__PURE__ */ createTV({ twMergeConfig: { classGroups: {
6
- "bg-tint": [{ "bg-tint": [isAny] }],
7
- "bg-shade": [{ "bg-shade": [isAny] }],
8
- "text-tint": [{ "text-tint": [isAny] }],
9
- "text-shade": [{ "text-shade": [isAny] }],
10
- "text-color": [{ "text-rui": [isAny] }],
11
- "font-size": [
12
- { "text-body": [isAny] },
13
- "text-caption",
14
- "text-overline",
15
- { "text-h": [isAny] },
16
- { "text-subtitle": [isAny] }
17
- ]
18
- } } });
5
+ /** An outline width: a scale number, an arbitrary `[2px]`, or an arbitrary variable `(--w)`. */
6
+ function isWidth(value) {
7
+ return /^\d+$/.test(value) || /^\[.+\]$/.test(value) || /^\(.+\)$/.test(value);
8
+ }
9
+ /** The library's tailwind-variants instance, with its own tw-merge groups. */
10
+ var tv = /* #__PURE__ */ createTV({ twMergeConfig: {
11
+ extend: { classGroups: {
12
+ "bg-tint": [{ "bg-tint": [isAny] }],
13
+ "bg-shade": [{ "bg-shade": [isAny] }],
14
+ "text-tint": [{ "text-tint": [isAny] }],
15
+ "text-shade": [{ "text-shade": [isAny] }],
16
+ "text-color": [{ "text-rui": [isAny] }],
17
+ "bg-opacity": [{ "bg-opacity": [isAny] }],
18
+ "text-opacity": [{ "text-opacity": [isAny] }],
19
+ "border-opacity": [{ "border-opacity": [isAny] }],
20
+ "ring-opacity": [{ "ring-opacity": [isAny] }],
21
+ "ring-offset-opacity": [{ "ring-offset-opacity": [isAny] }],
22
+ "divide-opacity": [{ "divide-opacity": [isAny] }],
23
+ "placeholder-opacity": [{ "placeholder-opacity": [isAny] }],
24
+ "outline-style": ["outline"],
25
+ "font-size": [
26
+ { "text-body": [isAny] },
27
+ "text-caption",
28
+ "text-overline",
29
+ { "text-h": [isAny] },
30
+ { "text-subtitle": [isAny] }
31
+ ]
32
+ } },
33
+ override: { classGroups: { "outline-w": [{ outline: [isWidth] }] } }
34
+ } });
19
35
  /**
20
36
  * Normalizes any Vue `:class` binding value (string, object, array, nullish
21
37
  * or `false`) to a plain string compatible with tailwind-variants' `class`
@@ -1 +1 @@
1
- {"version":3,"file":"tv.js","names":[],"sources":["../../src/utils/tv.ts"],"sourcesContent":["/**\n * Tailwind Variants wrapper.\n *\n * Re-exports `tv` from `tailwind-variants` with project-level configuration.\n * Uses `createTV()` so we can extend twMerge config for custom theme classes\n * (e.g., `text-rui-primary`) in the future.\n *\n * @see https://www.tailwind-variants.org/docs/introduction\n */\n\nimport type { VueClassValue } from '@/types/class-value';\nimport { createTV } from 'tailwind-variants';\nimport { type ClassValue, normalizeClass } from 'vue';\n\nconst isAny: (v: string) => boolean = () => true;\n\nexport const tv = /* @__PURE__ */ createTV({\n twMergeConfig: {\n classGroups: {\n 'bg-tint': [{ 'bg-tint': [isAny] }],\n 'bg-shade': [{ 'bg-shade': [isAny] }],\n 'text-tint': [{ 'text-tint': [isAny] }],\n 'text-shade': [{ 'text-shade': [isAny] }],\n // Custom theme colors (text-rui-*) belong to the text-color group so\n // they don't conflict with the custom typography utilities below, which\n // tw-merge would otherwise both classify as font-size.\n 'text-color': [{ 'text-rui': [isAny] }],\n 'font-size': [\n { 'text-body': [isAny] },\n 'text-caption',\n 'text-overline',\n { 'text-h': [isAny] },\n { 'text-subtitle': [isAny] },\n ],\n },\n },\n});\n\n/**\n * Normalizes any Vue `:class` binding value (string, object, array, nullish\n * or `false`) to a plain string compatible with tailwind-variants' `class`\n * parameter. Accepts Vue's runtime `ClassValue` so call sites can pass\n * `$attrs.class` directly without casting.\n */\nexport function cn(value: ClassValue | VueClassValue | undefined): string | undefined {\n if (value == null || value === false)\n return undefined;\n if (typeof value === 'string')\n return value || undefined;\n const result = normalizeClass(value);\n return result || undefined;\n}\n"],"mappings":";;;AAcA,IAAM,cAAsC;AAE5C,IAAa,KAAqB,yBAAS,EACzC,eAAe,EACb,aAAa;CACX,WAAW,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;CAClC,YAAY,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;CACpC,aAAa,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;CACtC,cAAc,CAAC,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC;CAIxC,cAAc,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;CACtC,aAAa;EACX,EAAE,aAAa,CAAC,KAAK,EAAE;EACvB;EACA;EACA,EAAE,UAAU,CAAC,KAAK,EAAE;EACpB,EAAE,iBAAiB,CAAC,KAAK,EAAE;CAC7B;AACF,EACF,EACF,CAAC;;;;;;;AAQD,SAAgB,GAAG,OAAmE;CACpF,IAAI,SAAS,QAAQ,UAAU,OAC7B,OAAO,KAAA;CACT,IAAI,OAAO,UAAU,UACnB,OAAO,SAAS,KAAA;CAElB,OADe,eAAe,KACvB,KAAU,KAAA;AACnB"}
1
+ {"version":3,"file":"tv.js","names":[],"sources":["../../src/utils/tv.ts"],"sourcesContent":["/**\n * Tailwind Variants wrapper.\n *\n * Re-exports `tv` from `tailwind-variants` with project-level configuration.\n * `createTV()` teaches the conflict resolver about the theme's own class\n * groups, so `text-rui-primary` reads as a colour rather than a font size.\n *\n * The resolver ships inside tailwind-variants as of 3.3, which is why there is\n * no `tailwind-merge` dependency: the peer is optional and nothing imports it.\n *\n * @see https://www.tailwind-variants.org/docs/introduction\n */\n\nimport type { VueClassValue } from '@/types/class-value';\nimport { createTV } from 'tailwind-variants';\nimport { type ClassValue, normalizeClass } from 'vue';\n\nconst isAny: (v: string) => boolean = () => true;\n\n/** An outline width: a scale number, an arbitrary `[2px]`, or an arbitrary variable `(--w)`. */\nfunction isWidth(value: string): boolean {\n return /^\\d+$/.test(value) || /^\\[.+\\]$/.test(value) || /^\\(.+\\)$/.test(value);\n}\n\n/** The library's tailwind-variants instance, with its own tw-merge groups. */\nexport const tv = /* #__PURE__ */ createTV({\n twMergeConfig: {\n // `extend` appends to the built-in groups, which is what the flat form these sat in folded into\n extend: {\n classGroups: {\n 'bg-tint': [{ 'bg-tint': [isAny] }],\n 'bg-shade': [{ 'bg-shade': [isAny] }],\n 'text-tint': [{ 'text-tint': [isAny] }],\n 'text-shade': [{ 'text-shade': [isAny] }],\n // `text-rui-*` is a text colour, so the merger stops classifying it as a font size like the typography utilities below\n 'text-color': [{ 'text-rui': [isAny] }],\n /*\n * Tailwind 3's `*-opacity-*` utilities, which the merger has no group for: it ships the\n * Tailwind 4 groups, where they no longer exist. `bg-opacity-40` then parses as a\n * background *colour*, lands in the same group as `bg-rui-primary`, and wins as the later\n * class, leaving the element with an opacity and no colour. Giving them groups of their\n * own keeps both. They can go when the project moves to Tailwind 4 and slash opacity.\n */\n 'bg-opacity': [{ 'bg-opacity': [isAny] }],\n 'text-opacity': [{ 'text-opacity': [isAny] }],\n 'border-opacity': [{ 'border-opacity': [isAny] }],\n 'ring-opacity': [{ 'ring-opacity': [isAny] }],\n 'ring-offset-opacity': [{ 'ring-offset-opacity': [isAny] }],\n 'divide-opacity': [{ 'divide-opacity': [isAny] }],\n 'placeholder-opacity': [{ 'placeholder-opacity': [isAny] }],\n /*\n * A bare `outline` is `outline-style: solid` in Tailwind 3 and a *width* in Tailwind 4,\n * so the merger reads it as a width and `outline outline-1` loses the style, leaving an\n * outlined button with a colour, a width and nothing drawn. It belongs with the other\n * style keywords here, and comes back out of the width group in `override` below.\n */\n 'outline-style': ['outline'],\n 'font-size': [\n { 'text-body': [isAny] },\n 'text-caption',\n 'text-overline',\n { 'text-h': [isAny] },\n { 'text-subtitle': [isAny] },\n ],\n },\n },\n override: {\n classGroups: {\n /*\n * Without the empty string the built-in group carries, a bare `outline` stops counting as\n * a width and stays a style keyword, the way Tailwind 3 means it. Widths still replace one\n * another.\n */\n 'outline-w': [{ outline: [isWidth] }],\n },\n },\n },\n});\n\n/**\n * Normalizes any Vue `:class` binding value (string, object, array, nullish\n * or `false`) to a plain string compatible with tailwind-variants' `class`\n * parameter. Accepts Vue's runtime `ClassValue` so call sites can pass\n * `$attrs.class` directly without casting.\n */\nexport function cn(value: ClassValue | VueClassValue | undefined): string | undefined {\n if (value == null || value === false)\n return undefined;\n if (typeof value === 'string')\n return value || undefined;\n const result = normalizeClass(value);\n return result || undefined;\n}\n"],"mappings":";;;AAiBA,IAAM,cAAsC;;AAG5C,SAAS,QAAQ,OAAwB;CACvC,OAAO,QAAQ,KAAK,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,KAAK,KAAK;AAC/E;;AAGA,IAAa,KAAqB,yBAAS,EACzC,eAAe;CAEb,QAAQ,EACN,aAAa;EACX,WAAW,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;EAClC,YAAY,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;EACpC,aAAa,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;EACtC,cAAc,CAAC,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC;EAExC,cAAc,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;EAQtC,cAAc,CAAC,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC;EACxC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC;EAC5C,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,KAAK,EAAE,CAAC;EAChD,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC;EAC5C,uBAAuB,CAAC,EAAE,uBAAuB,CAAC,KAAK,EAAE,CAAC;EAC1D,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,KAAK,EAAE,CAAC;EAChD,uBAAuB,CAAC,EAAE,uBAAuB,CAAC,KAAK,EAAE,CAAC;EAO1D,iBAAiB,CAAC,SAAS;EAC3B,aAAa;GACX,EAAE,aAAa,CAAC,KAAK,EAAE;GACvB;GACA;GACA,EAAE,UAAU,CAAC,KAAK,EAAE;GACpB,EAAE,iBAAiB,CAAC,KAAK,EAAE;EAC7B;CACF,EACF;CACA,UAAU,EACR,aAAa,EAMX,aAAa,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,EACtC,EACF;AACF,EACF,CAAC;;;;;;;AAQD,SAAgB,GAAG,OAAmE;CACpF,IAAI,SAAS,QAAQ,UAAU,OAC7B,OAAO,KAAA;CACT,IAAI,OAAO,UAAU,UACnB,OAAO,SAAS,KAAA;CAElB,OADe,eAAe,KACvB,KAAU,KAAA;AACnB"}
@@ -1,4 +1,4 @@
1
- /* eslint-disable import/no-default-export */
1
+ /* eslint-disable import/no-default-export -- a virtual module's shape is fixed by the plugin that serves it */
2
2
  declare module 'virtual:rotki-icons' {
3
3
  /**
4
4
  * Auto-detected icons from your source files.
@@ -15,29 +15,32 @@ var EXCLUDED_PATTERNS = [
15
15
  "**/dist/**",
16
16
  "**/.git/**"
17
17
  ];
18
- var __dirname = dirname(fileURLToPath(import.meta.url));
18
+ var __filename = fileURLToPath(import.meta.url);
19
+ var __dirname = dirname(__filename);
19
20
  /**
20
- * Loads the valid RuiIcons array from the library
21
+ * Pulls the quoted icon names out of a `RuiIcons = [...]` array literal.
22
+ *
23
+ * @param path - file that may hold the array
24
+ * @param pattern - matches the array literal in that file, capturing its body
25
+ * @returns the names, or undefined when the file is absent or holds no array
26
+ */
27
+ function readIconNames(path, pattern) {
28
+ if (!existsSync(path)) return void 0;
29
+ const body = readFileSync(path, "utf-8").match(pattern)?.[1];
30
+ if (!body) return void 0;
31
+ return new Set(body.match(/"([^"]+)"/g)?.map((name) => name.slice(1, -1)) ?? []);
32
+ }
33
+ /**
34
+ * Loads the valid RuiIcons array from the library, preferring the built dist
35
+ * that consumers install and falling back to the source the repo generates.
21
36
  */
22
37
  function loadValidIcons() {
23
38
  try {
24
- const distPath = resolve(__dirname, "../icons/index.js");
25
- if (existsSync(distPath)) {
26
- const match = readFileSync(distPath, "utf-8").match(/(?:const|var|let) RuiIcons = \[(.*?)];?/s);
27
- if (match?.[1]) {
28
- const icons = match[1].match(/"([^"]+)"/g)?.map((s) => s.slice(1, -1)) || [];
29
- return new Set(icons);
30
- }
31
- }
39
+ const built = readIconNames(resolve(__dirname, "../icons/index.js"), /(?:const|var|let) RuiIcons = \[(.*?)];?/s);
40
+ if (built) return built;
32
41
  } catch {}
33
- const sourcePath = resolve(__dirname, "../icons/index.ts");
34
- if (existsSync(sourcePath)) {
35
- const match = readFileSync(sourcePath, "utf-8").match(/export const RuiIcons = \[(.*?)] as const/s);
36
- if (match?.[1]) {
37
- const icons = match[1].match(/"([^"]+)"/g)?.map((s) => s.slice(1, -1)) || [];
38
- return new Set(icons);
39
- }
40
- }
42
+ const source = readIconNames(resolve(__dirname, "../icons/index.ts"), /export const RuiIcons = \[(.*?)] as const/s);
43
+ if (source) return source;
41
44
  console.warn("[@rotki/ui-library] Could not load RuiIcons list, validation disabled");
42
45
  return /* @__PURE__ */ new Set();
43
46
  }
@@ -87,7 +90,8 @@ function ruiIconsPlugin(options = {}) {
87
90
  });
88
91
  log(`Scanning ${files.length} files for icon usage...`);
89
92
  for (const filePath of files) try {
90
- const detectedIcons = extractIconsFromSource(readFileSync(filePath, "utf-8"));
93
+ const content = readFileSync(filePath, "utf-8");
94
+ const detectedIcons = extractIconsFromSource(content);
91
95
  if (detectedIcons.size > 0) {
92
96
  log(`Found ${detectedIcons.size} potential icons in ${filePath}`);
93
97
  validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);
@@ -106,7 +110,10 @@ function ruiIconsPlugin(options = {}) {
106
110
  }
107
111
  }
108
112
  /**
109
- * Handles file changes in dev mode
113
+ * Handles a file change in dev mode, ignoring files the scan patterns do not
114
+ * cover.
115
+ *
116
+ * @param filePath - the file that changed
110
117
  */
111
118
  function handleFileChange(filePath) {
112
119
  if (!scanPatterns.some((pattern) => {
@@ -114,7 +121,8 @@ function ruiIconsPlugin(options = {}) {
114
121
  return pattern.includes(`*.${ext}`);
115
122
  })) return;
116
123
  try {
117
- const detectedIcons = extractIconsFromSource(readFileSync(filePath, "utf-8"));
124
+ const content = readFileSync(filePath, "utf-8");
125
+ const detectedIcons = extractIconsFromSource(content);
118
126
  const previousSize = scanResult.icons.size;
119
127
  validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);
120
128
  if (scanResult.icons.size > previousSize) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/vite-plugin/index.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite';\nimport type { RuiIconsPluginOptions, ScanResult } from './types';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n extractIconsFromSource,\n generateVirtualModule,\n validateIcons,\n} from './scanner';\n\nconst VIRTUAL_MODULE_ID = 'virtual:rotki-icons';\nconst RESOLVED_VIRTUAL_MODULE_ID = `\\0${VIRTUAL_MODULE_ID}`;\n\nconst DEFAULT_SCAN_PATTERNS = ['**/*.vue', '**/*.ts', '**/*.tsx'];\nconst EXCLUDED_PATTERNS = ['**/node_modules/**', '**/dist/**', '**/.git/**'];\n\n// Get __dirname equivalent in ES modules\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Loads the valid RuiIcons array from the library\n */\nfunction loadValidIcons(): Set<string> {\n // Import the RuiIcons array from the icons module\n // This will be resolved at build time\n try {\n // Try to load from the built dist first (for consumers)\n const distPath = resolve(__dirname, '../icons/index.js');\n if (existsSync(distPath)) {\n // Read and parse the file to extract the RuiIcons array\n const content = readFileSync(distPath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/(?:const|var|let) RuiIcons = \\[(.*?)];?/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n }\n catch {\n // Fallback: parse the icons source file directly\n }\n\n // Fallback: read and parse the source file\n const sourcePath = resolve(__dirname, '../icons/index.ts');\n if (existsSync(sourcePath)) {\n const content = readFileSync(sourcePath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/export const RuiIcons = \\[(.*?)] as const/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n\n console.warn('[@rotki/ui-library] Could not load RuiIcons list, validation disabled');\n return new Set();\n}\n\n/**\n * Loads the baseline icons used by library components, emitted at library\n * build time. Consumers always need these regardless of their own source.\n */\nfunction loadLibraryBaselineIcons(): string[] {\n const distPath = resolve(__dirname, '../library-icons.json');\n if (existsSync(distPath)) {\n try {\n const parsed: unknown = JSON.parse(readFileSync(distPath, 'utf-8'));\n if (Array.isArray(parsed))\n return parsed.filter((v): v is string => typeof v === 'string');\n }\n catch {\n // fall through\n }\n }\n return [];\n}\n\n/**\n * Vite plugin for automatic icon detection and registration\n */\nexport function ruiIconsPlugin(options: RuiIconsPluginOptions = {}): Plugin {\n const {\n include = [],\n customIcons = [],\n scanPatterns = DEFAULT_SCAN_PATTERNS,\n strict = false,\n debug = false,\n } = options;\n\n const customIconSet = new Set(customIcons);\n\n let validIcons: Set<string>;\n let libraryBaseline: string[];\n let scanResult: ScanResult;\n let server: ViteDevServer | null = null;\n let root: string;\n\n const log = (message: string): void => {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[@rotki/ui-library/icons] ${message}`);\n }\n };\n\n const warn = (message: string): void => {\n console.warn(`[@rotki/ui-library/icons] ${message}`);\n };\n\n /**\n * Scans all matching files for icon usage\n */\n async function scanFiles(): Promise<void> {\n const fg = await import('fast-glob');\n const glob = fg.default || fg;\n\n scanResult = {\n icons: new Set([...libraryBaseline, ...include]),\n invalidIcons: new Map(),\n };\n\n const files = glob.sync(scanPatterns, {\n cwd: root,\n ignore: EXCLUDED_PATTERNS,\n absolute: true,\n });\n\n log(`Scanning ${files.length} files for icon usage...`);\n\n for (const filePath of files) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n\n if (detectedIcons.size > 0) {\n log(`Found ${detectedIcons.size} potential icons in ${filePath}`);\n validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);\n }\n }\n catch {\n warn(`Failed to read file: ${filePath}`);\n }\n }\n\n // Add manually included icons\n for (const icon of include) {\n if (validIcons.has(icon)) {\n scanResult.icons.add(icon);\n }\n else {\n warn(`Included icon \"${icon}\" is not a valid RuiIcon`);\n }\n }\n\n log(`Detected ${scanResult.icons.size} valid icons`);\n\n // Report invalid icons\n if (scanResult.invalidIcons.size > 0) {\n const invalidList = Array.from(scanResult.invalidIcons.entries(), ([icon, files]) => ` - \"${icon}\" in: ${files.join(', ')}`)\n .join('\\n');\n\n const message = `Found ${scanResult.invalidIcons.size} invalid icon name(s):\\n${invalidList}`;\n\n if (strict) {\n throw new Error(message);\n }\n else {\n warn(message);\n }\n }\n }\n\n /**\n * Handles file changes in dev mode\n */\n function handleFileChange(filePath: string): void {\n // Check if the changed file matches our scan patterns\n const isRelevantFile = scanPatterns.some((pattern) => {\n const ext = filePath.split('.').pop();\n return pattern.includes(`*.${ext}`);\n });\n\n if (!isRelevantFile)\n return;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n const previousSize = scanResult.icons.size;\n\n validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);\n\n // If new icons were detected, invalidate the virtual module\n if (scanResult.icons.size > previousSize) {\n log(`New icons detected in ${filePath}, invalidating virtual module...`);\n\n // Invalidate the virtual module to trigger re-import\n const mod = server?.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);\n if (mod) {\n server?.moduleGraph.invalidateModule(mod);\n // Trigger HMR update\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n }\n }\n }\n catch {\n // Ignore read errors\n }\n }\n\n return {\n name: 'rotki-ui-library-icons',\n enforce: 'pre',\n\n configResolved(config) {\n root = config.root;\n validIcons = loadValidIcons();\n libraryBaseline = loadLibraryBaselineIcons();\n log(`Loaded ${validIcons.size} valid icon names`);\n log(`Loaded ${libraryBaseline.length} baseline icons used by library components`);\n },\n\n configureServer(_server) {\n server = _server;\n\n // Watch for file changes\n server.watcher.on('change', handleFileChange);\n server.watcher.on('add', handleFileChange);\n },\n\n async buildStart() {\n await scanFiles();\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const moduleContent = generateVirtualModule(scanResult.icons);\n log(`Generated virtual module with ${scanResult.icons.size} icons`);\n return moduleContent;\n }\n },\n };\n}\n\nexport type { RuiIconsPluginOptions } from './types';\n\n// eslint-disable-next-line import/no-default-export\nexport default ruiIconsPlugin;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/vite-plugin/index.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite';\nimport type { RuiIconsPluginOptions, ScanResult } from './types';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n extractIconsFromSource,\n generateVirtualModule,\n validateIcons,\n} from './scanner';\n\nconst VIRTUAL_MODULE_ID = 'virtual:rotki-icons';\nconst RESOLVED_VIRTUAL_MODULE_ID = `\\0${VIRTUAL_MODULE_ID}`;\n\nconst DEFAULT_SCAN_PATTERNS = ['**/*.vue', '**/*.ts', '**/*.tsx'];\nconst EXCLUDED_PATTERNS = ['**/node_modules/**', '**/dist/**', '**/.git/**'];\n\n// Get __dirname equivalent in ES modules\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Pulls the quoted icon names out of a `RuiIcons = [...]` array literal.\n *\n * @param path - file that may hold the array\n * @param pattern - matches the array literal in that file, capturing its body\n * @returns the names, or undefined when the file is absent or holds no array\n */\nfunction readIconNames(path: string, pattern: RegExp): Set<string> | undefined {\n if (!existsSync(path))\n return undefined;\n\n const body = readFileSync(path, 'utf-8').match(pattern)?.[1];\n if (!body)\n return undefined;\n\n return new Set(body.match(/\"([^\"]+)\"/g)?.map(name => name.slice(1, -1)) ?? []);\n}\n\n/**\n * Loads the valid RuiIcons array from the library, preferring the built dist\n * that consumers install and falling back to the source the repo generates.\n */\nfunction loadValidIcons(): Set<string> {\n try {\n // eslint-disable-next-line regexp/strict -- the unescaped `]` closes the built array literal and reads better than `\\]`\n const built = readIconNames(resolve(__dirname, '../icons/index.js'), /(?:const|var|let) RuiIcons = \\[(.*?)];?/s);\n if (built)\n return built;\n }\n catch {\n // A dist that cannot be read falls through to the source below\n }\n\n // eslint-disable-next-line regexp/strict -- the unescaped `]` closes the generated array literal and reads better than `\\]`\n const source = readIconNames(resolve(__dirname, '../icons/index.ts'), /export const RuiIcons = \\[(.*?)] as const/s);\n if (source)\n return source;\n\n console.warn('[@rotki/ui-library] Could not load RuiIcons list, validation disabled');\n return new Set();\n}\n\n/**\n * Loads the baseline icons used by library components, emitted at library\n * build time. Consumers always need these regardless of their own source.\n */\nfunction loadLibraryBaselineIcons(): string[] {\n const distPath = resolve(__dirname, '../library-icons.json');\n if (existsSync(distPath)) {\n try {\n const parsed: unknown = JSON.parse(readFileSync(distPath, 'utf-8'));\n if (Array.isArray(parsed))\n return parsed.filter((v): v is string => typeof v === 'string');\n }\n catch {\n // fall through\n }\n }\n return [];\n}\n\n/**\n * Vite plugin for automatic icon detection and registration\n */\nexport function ruiIconsPlugin(options: RuiIconsPluginOptions = {}): Plugin {\n const {\n include = [],\n customIcons = [],\n scanPatterns = DEFAULT_SCAN_PATTERNS,\n strict = false,\n debug = false,\n } = options;\n\n const customIconSet = new Set(customIcons);\n\n let validIcons: Set<string>;\n let libraryBaseline: string[];\n let scanResult: ScanResult;\n let server: ViteDevServer | null = null;\n let root: string;\n\n const log = (message: string): void => {\n if (debug) {\n // eslint-disable-next-line no-console -- the plugin's debug output belongs on the build console\n console.log(`[@rotki/ui-library/icons] ${message}`);\n }\n };\n\n const warn = (message: string): void => {\n console.warn(`[@rotki/ui-library/icons] ${message}`);\n };\n\n /**\n * Scans all matching files for icon usage\n */\n async function scanFiles(): Promise<void> {\n const fg = await import('fast-glob');\n const glob = fg.default || fg;\n\n scanResult = {\n icons: new Set([...libraryBaseline, ...include]),\n invalidIcons: new Map(),\n };\n\n const files = glob.sync(scanPatterns, {\n cwd: root,\n ignore: EXCLUDED_PATTERNS,\n absolute: true,\n });\n\n log(`Scanning ${files.length} files for icon usage...`);\n\n for (const filePath of files) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n\n if (detectedIcons.size > 0) {\n log(`Found ${detectedIcons.size} potential icons in ${filePath}`);\n validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);\n }\n }\n catch {\n warn(`Failed to read file: ${filePath}`);\n }\n }\n\n // Add manually included icons\n for (const icon of include) {\n if (validIcons.has(icon)) {\n scanResult.icons.add(icon);\n }\n else {\n warn(`Included icon \"${icon}\" is not a valid RuiIcon`);\n }\n }\n\n log(`Detected ${scanResult.icons.size} valid icons`);\n\n // Report invalid icons\n if (scanResult.invalidIcons.size > 0) {\n const invalidList = Array.from(scanResult.invalidIcons.entries(), ([icon, files]) => ` - \"${icon}\" in: ${files.join(', ')}`)\n .join('\\n');\n\n const message = `Found ${scanResult.invalidIcons.size} invalid icon name(s):\\n${invalidList}`;\n\n if (strict) {\n throw new Error(message);\n }\n else {\n warn(message);\n }\n }\n }\n\n /**\n * Handles a file change in dev mode, ignoring files the scan patterns do not\n * cover.\n *\n * @param filePath - the file that changed\n */\n function handleFileChange(filePath: string): void {\n const isRelevantFile = scanPatterns.some((pattern) => {\n const ext = filePath.split('.').pop();\n return pattern.includes(`*.${ext}`);\n });\n\n if (!isRelevantFile)\n return;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n const previousSize = scanResult.icons.size;\n\n validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);\n\n // If new icons were detected, invalidate the virtual module\n if (scanResult.icons.size > previousSize) {\n log(`New icons detected in ${filePath}, invalidating virtual module...`);\n\n // Invalidate the virtual module to trigger re-import\n const mod = server?.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);\n if (mod) {\n server?.moduleGraph.invalidateModule(mod);\n // Trigger HMR update\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n }\n }\n }\n catch {\n // Ignore read errors\n }\n }\n\n return {\n name: 'rotki-ui-library-icons',\n enforce: 'pre',\n\n configResolved(config) {\n root = config.root;\n validIcons = loadValidIcons();\n libraryBaseline = loadLibraryBaselineIcons();\n log(`Loaded ${validIcons.size} valid icon names`);\n log(`Loaded ${libraryBaseline.length} baseline icons used by library components`);\n },\n\n configureServer(_server) {\n server = _server;\n\n // Watch for file changes\n server.watcher.on('change', handleFileChange);\n server.watcher.on('add', handleFileChange);\n },\n\n async buildStart() {\n await scanFiles();\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const moduleContent = generateVirtualModule(scanResult.icons);\n log(`Generated virtual module with ${scanResult.icons.size} icons`);\n return moduleContent;\n }\n },\n };\n}\n\nexport type { RuiIconsPluginOptions } from './types';\n\n// eslint-disable-next-line import/no-default-export -- vite plugins are consumed as default imports\nexport default ruiIconsPlugin;\n"],"mappings":"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"}
@@ -8,8 +8,11 @@ export declare function extractIconsFromSource(source: string): Set<string>;
8
8
  */
9
9
  export declare function validateIcons(detectedIcons: Set<string>, validIcons: Set<string>, filePath: string, result: ScanResult, ignore?: Set<string>): void;
10
10
  /**
11
- * Converts icon name to export constant name
12
- * e.g., 'lu-arrow-down' -> 'LuArrowDown'
11
+ * Names the generated constant an icon is exported as, which is its kebab-case
12
+ * name in pascal case: `lu-arrow-down` is exported as `LuArrowDown`.
13
+ *
14
+ * @param iconName - kebab-case name, as it is written in a template
15
+ * @returns the constant the generated module exports it under
13
16
  */
14
17
  export declare function iconNameToExportName(iconName: string): string;
15
18
  /**
@@ -38,8 +38,11 @@ function validateIcons(detectedIcons, validIcons, filePath, result, ignore) {
38
38
  }
39
39
  }
40
40
  /**
41
- * Converts icon name to export constant name
42
- * e.g., 'lu-arrow-down' -> 'LuArrowDown'
41
+ * Names the generated constant an icon is exported as, which is its kebab-case
42
+ * name in pascal case: `lu-arrow-down` is exported as `LuArrowDown`.
43
+ *
44
+ * @param iconName - kebab-case name, as it is written in a template
45
+ * @returns the constant the generated module exports it under
43
46
  */
44
47
  function iconNameToExportName(iconName) {
45
48
  return iconName.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","names":[],"sources":["../../src/vite-plugin/scanner.ts"],"sourcesContent":["import type { ScanResult } from './types';\n\n/**\n * Regex patterns to detect icon usage in source files\n */\nconst ICON_PATTERNS: RegExp[] = [\n // Static name attribute: <RuiIcon name=\"lu-star\" /> or name='lu-star'\n /\\bname=[\"'](lu-[\\da-z-]+)[\"']/gi,\n\n // Dynamic bound name with string literal: :name=\"'lu-star'\" or :name=\"`lu-star`\"\n /:name=[\"']['`](lu-[\\da-z-]+)['`]?[\"']/gi,\n\n // String literals that look like icon names: 'lu-star' or \"lu-star\"\n /[\"'`](lu-[\\da-z-]+)[\"'`]/gi,\n];\n\n/**\n * Extracts all potential icon names from source code\n */\nexport function extractIconsFromSource(source: string): Set<string> {\n const icons = new Set<string>();\n\n for (const pattern of ICON_PATTERNS) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n\n let match: RegExpExecArray | null = pattern.exec(source);\n while (match !== null) {\n const iconName = match[1];\n if (iconName) {\n icons.add(iconName);\n }\n match = pattern.exec(source);\n }\n }\n\n return icons;\n}\n\n/**\n * Validates detected icons against known valid icons\n */\nexport function validateIcons(\n detectedIcons: Set<string>,\n validIcons: Set<string>,\n filePath: string,\n result: ScanResult,\n ignore?: Set<string>,\n): void {\n for (const icon of detectedIcons) {\n if (ignore?.has(icon)) {\n // App-provided custom icon: registered by the consumer, not shipped by\n // the library — neither imported nor reported invalid.\n continue;\n }\n if (validIcons.has(icon)) {\n result.icons.add(icon);\n }\n else {\n // Track invalid icons\n const files = result.invalidIcons.get(icon) || [];\n files.push(filePath);\n result.invalidIcons.set(icon, files);\n }\n }\n}\n\n/**\n * Converts icon name to export constant name\n * e.g., 'lu-arrow-down' -> 'LuArrowDown'\n */\nexport function iconNameToExportName(iconName: string): string {\n return iconName\n .split('-')\n .map(part => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n\n/**\n * Generates the virtual module content with detected icons\n */\nexport function generateVirtualModule(icons: Set<string>): string {\n if (icons.size === 0) {\n return `// No icons detected\nexport default [];\n`;\n }\n\n const sortedIcons = [...icons].sort();\n const exports = sortedIcons.map(iconNameToExportName);\n\n const importStatement = `import {\\n ${exports.join(',\\n ')},\\n} from '@rotki/ui-library';\\n`;\n const exportStatement = `\\nexport default [\\n ${exports.join(',\\n ')},\\n];\\n`;\n\n return importStatement + exportStatement;\n}\n"],"mappings":";;;;AAKA,IAAM,gBAA0B;CAE9B;CAGA;CAGA;AACF;;;;AAKA,SAAgB,uBAAuB,QAA6B;CAClE,MAAM,wBAAQ,IAAI,IAAY;CAE9B,KAAK,MAAM,WAAW,eAAe;EAEnC,QAAQ,YAAY;EAEpB,IAAI,QAAgC,QAAQ,KAAK,MAAM;EACvD,OAAO,UAAU,MAAM;GACrB,MAAM,WAAW,MAAM;GACvB,IAAI,UACF,MAAM,IAAI,QAAQ;GAEpB,QAAQ,QAAQ,KAAK,MAAM;EAC7B;CACF;CAEA,OAAO;AACT;;;;AAKA,SAAgB,cACd,eACA,YACA,UACA,QACA,QACM;CACN,KAAK,MAAM,QAAQ,eAAe;EAChC,IAAI,QAAQ,IAAI,IAAI,GAGlB;EAEF,IAAI,WAAW,IAAI,IAAI,GACrB,OAAO,MAAM,IAAI,IAAI;OAElB;GAEH,MAAM,QAAQ,OAAO,aAAa,IAAI,IAAI,KAAK,CAAC;GAChD,MAAM,KAAK,QAAQ;GACnB,OAAO,aAAa,IAAI,MAAM,KAAK;EACrC;CACF;AACF;;;;;AAMA,SAAgB,qBAAqB,UAA0B;CAC7D,OAAO,SACJ,MAAM,GAAG,CAAC,CACV,KAAI,SAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CACzD,KAAK,EAAE;AACZ;;;;AAKA,SAAgB,sBAAsB,OAA4B;CAChE,IAAI,MAAM,SAAS,GACjB,OAAO;;;CAMT,MAAM,UADc,CAAC,GAAG,KAAK,CAAC,CAAC,KACf,CAAA,CAAY,IAAI,oBAAoB;CAKpD,OAAO,eAHgC,QAAQ,KAAK,OAAO,EAAE,wDACZ,QAAQ,KAAK,OAAO,EAAE;AAGzE"}
1
+ {"version":3,"file":"scanner.js","names":[],"sources":["../../src/vite-plugin/scanner.ts"],"sourcesContent":["import type { ScanResult } from './types';\n\n/**\n * Regex patterns to detect icon usage in source files\n */\nconst ICON_PATTERNS: RegExp[] = [\n // Static name attribute: <RuiIcon name=\"lu-star\" /> or name='lu-star'\n /\\bname=[\"'](lu-[\\da-z-]+)[\"']/gi,\n\n // Dynamic bound name with string literal: :name=\"'lu-star'\" or :name=\"`lu-star`\"\n /:name=[\"']['`](lu-[\\da-z-]+)['`]?[\"']/gi,\n\n // String literals that look like icon names: 'lu-star' or \"lu-star\"\n /[\"'`](lu-[\\da-z-]+)[\"'`]/gi,\n];\n\n/**\n * Extracts all potential icon names from source code\n */\nexport function extractIconsFromSource(source: string): Set<string> {\n const icons = new Set<string>();\n\n for (const pattern of ICON_PATTERNS) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n\n let match: RegExpExecArray | null = pattern.exec(source);\n while (match !== null) {\n const iconName = match[1];\n if (iconName) {\n icons.add(iconName);\n }\n match = pattern.exec(source);\n }\n }\n\n return icons;\n}\n\n/**\n * Validates detected icons against known valid icons\n */\nexport function validateIcons(\n detectedIcons: Set<string>,\n validIcons: Set<string>,\n filePath: string,\n result: ScanResult,\n ignore?: Set<string>,\n): void {\n for (const icon of detectedIcons) {\n if (ignore?.has(icon)) {\n // The consumer registers this one themselves, so it is neither imported nor reported invalid\n continue;\n }\n if (validIcons.has(icon)) {\n result.icons.add(icon);\n }\n else {\n // Track invalid icons\n const files = result.invalidIcons.get(icon) || [];\n files.push(filePath);\n result.invalidIcons.set(icon, files);\n }\n }\n}\n\n/**\n * Names the generated constant an icon is exported as, which is its kebab-case\n * name in pascal case: `lu-arrow-down` is exported as `LuArrowDown`.\n *\n * @param iconName - kebab-case name, as it is written in a template\n * @returns the constant the generated module exports it under\n */\nexport function iconNameToExportName(iconName: string): string {\n return iconName\n .split('-')\n .map(part => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n\n/**\n * Generates the virtual module content with detected icons\n */\nexport function generateVirtualModule(icons: Set<string>): string {\n if (icons.size === 0) {\n return `// No icons detected\nexport default [];\n`;\n }\n\n const sortedIcons = [...icons].sort();\n const exports = sortedIcons.map(iconNameToExportName);\n\n const importStatement = `import {\\n ${exports.join(',\\n ')},\\n} from '@rotki/ui-library';\\n`;\n const exportStatement = `\\nexport default [\\n ${exports.join(',\\n ')},\\n];\\n`;\n\n return importStatement + exportStatement;\n}\n"],"mappings":";;;;AAKA,IAAM,gBAA0B;CAE9B;CAGA;CAGA;AACF;;;;AAKA,SAAgB,uBAAuB,QAA6B;CAClE,MAAM,wBAAQ,IAAI,IAAY;CAE9B,KAAK,MAAM,WAAW,eAAe;EAEnC,QAAQ,YAAY;EAEpB,IAAI,QAAgC,QAAQ,KAAK,MAAM;EACvD,OAAO,UAAU,MAAM;GACrB,MAAM,WAAW,MAAM;GACvB,IAAI,UACF,MAAM,IAAI,QAAQ;GAEpB,QAAQ,QAAQ,KAAK,MAAM;EAC7B;CACF;CAEA,OAAO;AACT;;;;AAKA,SAAgB,cACd,eACA,YACA,UACA,QACA,QACM;CACN,KAAK,MAAM,QAAQ,eAAe;EAChC,IAAI,QAAQ,IAAI,IAAI,GAElB;EAEF,IAAI,WAAW,IAAI,IAAI,GACrB,OAAO,MAAM,IAAI,IAAI;OAElB;GAEH,MAAM,QAAQ,OAAO,aAAa,IAAI,IAAI,KAAK,CAAC;GAChD,MAAM,KAAK,QAAQ;GACnB,OAAO,aAAa,IAAI,MAAM,KAAK;EACrC;CACF;AACF;;;;;;;;AASA,SAAgB,qBAAqB,UAA0B;CAC7D,OAAO,SACJ,MAAM,GAAG,CAAC,CACV,KAAI,SAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CACzD,KAAK,EAAE;AACZ;;;;AAKA,SAAgB,sBAAsB,OAA4B;CAChE,IAAI,MAAM,SAAS,GACjB,OAAO;;;CAMT,MAAM,UADc,CAAC,GAAG,KAAK,CAAC,CAAC,KACf,CAAA,CAAY,IAAI,oBAAoB;CAKpD,OAAO,eAHgC,QAAQ,KAAK,OAAO,EAAE,wDACZ,QAAQ,KAAK,OAAO,EAAE;AAGzE"}