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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +36 -15
  2. package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
  3. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +0 -4
  4. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +9 -10
  5. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  6. package/dist/components/accordions/accordions/RuiAccordions.js.map +1 -1
  7. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js +16 -3
  8. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/alerts/RuiAlert.js.map +1 -1
  10. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js +43 -212
  11. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/avatars/RuiAvatar.js.map +1 -1
  13. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +22 -32
  14. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  15. package/dist/components/avatars/RuiAvatarGroup.js.map +1 -1
  16. package/dist/components/avatars/RuiAvatarGroup.vue.d.ts +6 -0
  17. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js +17 -13
  18. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/avatars/avatar-props.d.ts +16 -3
  20. package/dist/components/avatars/avatar-props.js +42 -5
  21. package/dist/components/avatars/avatar-props.js.map +1 -1
  22. package/dist/components/buttons/button/RuiButton.js.map +1 -1
  23. package/dist/components/buttons/button/RuiButton.vue.d.ts +0 -1
  24. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js +39 -26
  25. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/components/buttons/button/button-props.d.ts +0 -2
  27. package/dist/components/buttons/button/button-props.js +5 -5
  28. package/dist/components/buttons/button/button-props.js.map +1 -1
  29. package/dist/components/buttons/button/button-styles.d.ts +4 -1
  30. package/dist/components/buttons/button/button-styles.js +136 -55
  31. package/dist/components/buttons/button/button-styles.js.map +1 -1
  32. package/dist/components/buttons/button-group/RuiButtonGroup.js.map +1 -1
  33. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +8 -2
  34. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +66 -97
  35. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/components/buttons/button-group/button-group-context.d.ts +28 -0
  37. package/dist/components/buttons/button-group/button-group-context.js +22 -0
  38. package/dist/components/buttons/button-group/button-group-context.js.map +1 -0
  39. package/dist/components/calendar/RuiCalendar.js.map +1 -1
  40. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +6 -3
  41. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
  43. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +12 -8
  44. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/calendar/RuiCalendarHeader.js.map +1 -1
  46. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js +21 -22
  47. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
  49. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +17 -21
  50. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/components/cards/RuiCard.js.map +1 -1
  52. package/dist/components/cards/RuiCard.vue.d.ts +0 -3
  53. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +31 -19
  54. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  55. package/dist/components/cards/RuiCardHeader.js.map +1 -1
  56. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js +13 -25
  57. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/chips/RuiChip.js.map +1 -1
  59. package/dist/components/chips/RuiChip.vue.d.ts +5 -2
  60. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +127 -78
  61. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  62. package/dist/components/chips/chip-props.d.ts +2 -0
  63. package/dist/components/chips/chip-props.js +5 -3
  64. package/dist/components/chips/chip-props.js.map +1 -1
  65. package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
  66. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +5 -5
  67. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js +1 -1
  69. package/dist/components/color-picker/RuiColorHue.js.map +1 -1
  70. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +2 -2
  71. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/color-picker/RuiColorInput.js.map +1 -1
  73. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js +46 -36
  74. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  75. package/dist/components/color-picker/RuiColorPicker.js.map +1 -1
  76. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js +4 -5
  77. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  78. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  79. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +3 -2
  80. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +81 -80
  81. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/date-time-picker/RuiDateTimePickerMenu.js.map +1 -1
  83. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js +2 -2
  84. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/components/date-time-picker/RuiTimezoneSelect.js.map +1 -1
  86. package/dist/components/date-time-picker/RuiTimezoneSelect.vue.d.ts +4 -3
  87. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js +3 -3
  88. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  89. package/dist/components/date-time-picker/date-time-picker-styles.d.ts +128 -219
  90. package/dist/components/date-time-picker/date-time-picker-styles.js +1 -2
  91. package/dist/components/date-time-picker/date-time-picker-styles.js.map +1 -1
  92. package/dist/components/date-time-picker/use-date-bounds.js +1 -1
  93. package/dist/components/date-time-picker/use-date-time-selection.js +65 -66
  94. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
  95. package/dist/components/date-time-picker/use-input-handler.js +1 -1
  96. package/dist/components/date-time-picker/use-keyboard-handler.js +29 -30
  97. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  98. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  99. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +1 -68
  100. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +203 -198
  101. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  102. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.js.map +1 -1
  103. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js +1 -0
  104. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js.map +1 -1
  106. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue.d.ts +2 -0
  107. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js +8 -3
  108. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js.map +1 -1
  110. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue.d.ts +4 -0
  111. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js +24 -10
  112. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js.map +1 -1
  113. package/dist/components/forms/auto-complete/auto-complete-props.d.ts +66 -0
  114. package/dist/components/forms/auto-complete/auto-complete-styles.d.ts +128 -218
  115. package/dist/components/forms/auto-complete/auto-complete-styles.js +4 -2
  116. package/dist/components/forms/auto-complete/auto-complete-styles.js.map +1 -1
  117. package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -1
  118. package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +3 -6
  119. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +154 -154
  120. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/components/forms/category-picker/category-picker-styles.d.ts +83 -232
  122. package/dist/components/forms/category-picker/category-picker-styles.js +20 -26
  123. package/dist/components/forms/category-picker/category-picker-styles.js.map +1 -1
  124. package/dist/components/forms/check-control-styles.d.ts +61 -2
  125. package/dist/components/forms/check-control-styles.js +53 -46
  126. package/dist/components/forms/check-control-styles.js.map +1 -1
  127. package/dist/components/forms/checkbox/RuiCheckbox.js.map +1 -1
  128. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js +32 -19
  129. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.js.map +1 -1
  131. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js +4 -4
  132. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  133. package/dist/components/forms/field-defaults/RuiFieldDefaults.js +7 -0
  134. package/dist/components/forms/field-defaults/RuiFieldDefaults.js.map +1 -0
  135. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue.d.ts +16 -0
  136. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js +18 -0
  137. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js.map +1 -0
  138. package/dist/components/forms/field-label/RuiFieldLabel.js +7 -0
  139. package/dist/components/forms/field-label/RuiFieldLabel.js.map +1 -0
  140. package/dist/components/forms/field-label/RuiFieldLabel.vue.d.ts +17 -0
  141. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js +57 -0
  142. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  143. package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -1
  144. package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +1 -1
  145. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +56 -35
  146. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  147. package/dist/components/forms/radio-button/radio/RuiRadio.js.map +1 -1
  148. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js +14 -15
  149. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  150. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.js.map +1 -1
  151. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js +3 -3
  152. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  153. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.js.map +1 -1
  154. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js +6 -6
  155. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  156. package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
  157. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +3 -12
  158. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +61 -56
  159. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  160. package/dist/components/forms/select/RuiSimpleSelect.js.map +1 -1
  161. package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +0 -1
  162. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js +13 -20
  163. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/components/forms/select/menu-select-styles.d.ts +99 -221
  165. package/dist/components/forms/select/menu-select-styles.js +1 -4
  166. package/dist/components/forms/select/menu-select-styles.js.map +1 -1
  167. package/dist/components/forms/slider/RuiSlider.js.map +1 -1
  168. package/dist/components/forms/slider/RuiSlider.vue.d.ts +0 -4
  169. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js +129 -106
  170. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/components/forms/slider/slider-styles.d.ts +40 -40
  172. package/dist/components/forms/slider/slider-styles.js +67 -109
  173. package/dist/components/forms/slider/slider-styles.js.map +1 -1
  174. package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
  175. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +33 -45
  176. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/components/forms/text-area/RuiTextArea.js.map +1 -1
  178. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +3 -2
  179. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js +138 -117
  180. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/components/forms/text-area/text-area-styles.d.ts +41 -115
  182. package/dist/components/forms/text-area/text-area-styles.js +34 -194
  183. package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
  184. package/dist/components/forms/text-field/RuiTextField.js.map +1 -1
  185. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +5 -2
  186. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js +112 -105
  187. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  188. package/dist/components/forms/text-field/text-field-styles.d.ts +37 -145
  189. package/dist/components/forms/text-field/text-field-styles.js +24 -267
  190. package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
  191. package/dist/components/forms/text-input-styles.d.ts +98 -229
  192. package/dist/components/forms/text-input-styles.js +63 -193
  193. package/dist/components/forms/text-input-styles.js.map +1 -1
  194. package/dist/components/helpers/RuiFormTextDetail.js.map +1 -1
  195. package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +11 -1
  196. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js +5 -5
  197. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/components/icons/RuiIcon.js.map +1 -1
  199. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +7 -4
  200. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  201. package/dist/components/index.d.ts +5 -3
  202. package/dist/components/index.js +4 -3
  203. package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
  204. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js +6 -5
  205. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  206. package/dist/components/loaders/RuiSkeletonLoader.js.map +1 -1
  207. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js +8 -8
  208. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  209. package/dist/components/logos/RuiLogo.js.map +1 -1
  210. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js +2 -2
  211. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js.map +1 -1
  212. package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
  213. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +76 -48
  214. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  215. package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
  216. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +3 -2
  217. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +17 -13
  218. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  219. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  220. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +9 -7
  221. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +33 -29
  222. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
  224. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +6 -2
  225. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js +49 -25
  226. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  227. package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
  228. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +7 -8
  229. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
  230. package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
  231. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +0 -5
  232. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +17 -11
  233. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  234. package/dist/components/overlays/tooltip/tooltip-styles.d.ts +5 -12
  235. package/dist/components/overlays/tooltip/tooltip-styles.js +11 -18
  236. package/dist/components/overlays/tooltip/tooltip-styles.js.map +1 -1
  237. package/dist/components/progress/RuiProgress.js.map +1 -1
  238. package/dist/components/progress/RuiProgress.vue.d.ts +4 -0
  239. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js +73 -47
  240. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/components/steppers/RuiFooterStepper.js.map +1 -1
  242. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +28 -29
  243. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  244. package/dist/components/steppers/RuiStepper.js.map +1 -1
  245. package/dist/components/steppers/RuiStepper.vue.d.ts +0 -4
  246. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +36 -29
  247. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  248. package/dist/components/steppers/RuiStepperIcon.js.map +1 -1
  249. package/dist/components/steppers/RuiStepperIcon.vue.d.ts +2 -0
  250. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js +47 -47
  251. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  252. package/dist/components/tables/RuiDataTable.js.map +1 -1
  253. package/dist/components/tables/RuiDataTable.vue.d.ts +3 -6
  254. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +85 -67
  255. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  256. package/dist/components/tables/RuiExpandButton.js.map +1 -1
  257. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js +1 -0
  258. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  259. package/dist/components/tables/RuiTable.js.map +1 -1
  260. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js +8 -5
  261. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  262. package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
  263. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +1 -1
  264. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  265. package/dist/components/tables/RuiTableHead.js.map +1 -1
  266. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +89 -67
  267. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  268. package/dist/components/tables/RuiTablePagination.js.map +1 -1
  269. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +9 -12
  270. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  271. package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js +1 -1
  272. package/dist/components/tables/data-table/RuiDataTableExpandedRow.js.map +1 -1
  273. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js +3 -3
  274. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  275. package/dist/components/tables/data-table/RuiDataTableGroupRow.js.map +1 -1
  276. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js +8 -4
  277. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  278. package/dist/components/tables/data-table/RuiDataTableMobileSort.js.map +1 -1
  279. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js +2 -2
  280. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
  281. package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -1
  282. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +47 -8
  283. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  284. package/dist/components/tables/data-table-styles.d.ts +24 -0
  285. package/dist/components/tables/data-table-styles.js +35 -20
  286. package/dist/components/tables/data-table-styles.js.map +1 -1
  287. package/dist/components/tables/table_no_data_placeholder.js +1 -1
  288. package/dist/components/tables/table_no_data_placeholder.js.map +1 -1
  289. package/dist/components/tables/table_no_data_placeholder_dark.js +1 -1
  290. package/dist/components/tables/table_no_data_placeholder_dark.js.map +1 -1
  291. package/dist/components/tables/use-pagination-navigation.js +1 -1
  292. package/dist/components/tabs/tab/RuiTab.js.map +1 -1
  293. package/dist/components/tabs/tab/RuiTab.vue.d.ts +2 -5
  294. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +95 -69
  295. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  296. package/dist/components/tabs/tab/use-tab-link.js +1 -1
  297. package/dist/components/tabs/tab-item/RuiTabItem.js.map +1 -1
  298. package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +0 -1
  299. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js +5 -11
  300. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  301. package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
  302. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +8 -13
  303. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
  304. package/dist/components/tabs/tab-props.d.ts +7 -1
  305. package/dist/components/tabs/tab-props.js +7 -1
  306. package/dist/components/tabs/tab-props.js.map +1 -1
  307. package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
  308. package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +2 -1
  309. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +188 -43
  310. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  311. package/dist/components/tabs/tabs/use-tab-indicator.d.ts +27 -0
  312. package/dist/components/tabs/tabs/use-tab-indicator.js +67 -0
  313. package/dist/components/tabs/tabs/use-tab-indicator.js.map +1 -0
  314. package/dist/components/tabs/tabs/use-tab-keyboard.d.ts +17 -0
  315. package/dist/components/tabs/tabs/use-tab-keyboard.js +57 -0
  316. package/dist/components/tabs/tabs/use-tab-keyboard.js.map +1 -0
  317. package/dist/components/tabs/tabs/use-tab-routing.js +1 -2
  318. package/dist/components/tabs/tabs/use-tab-routing.js.map +1 -1
  319. package/dist/components/tabs/tabs/use-tab-scroll.js +15 -15
  320. package/dist/components/tabs/tabs/use-tab-scroll.js.map +1 -1
  321. package/dist/components/time-picker/RuiTimePicker.js.map +1 -1
  322. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js +95 -93
  323. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  324. package/dist/components/time-picker/time-picker-styles.d.ts +18 -0
  325. package/dist/components/time-picker/time-picker-styles.js +16 -10
  326. package/dist/components/time-picker/time-picker-styles.js.map +1 -1
  327. package/dist/composables/breakpoint.js +3 -3
  328. package/dist/composables/breakpoint.js.map +1 -1
  329. package/dist/composables/defaults/field.d.ts +22 -0
  330. package/dist/composables/defaults/field.js +29 -0
  331. package/dist/composables/defaults/field.js.map +1 -0
  332. package/dist/composables/dropdown-menu.d.ts +23 -11
  333. package/dist/composables/dropdown-menu.js +44 -34
  334. package/dist/composables/dropdown-menu.js.map +1 -1
  335. package/dist/composables/floating.d.ts +1 -3
  336. package/dist/composables/floating.js +16 -13
  337. package/dist/composables/floating.js.map +1 -1
  338. package/dist/composables/forms/auto-complete/chips.d.ts +22 -0
  339. package/dist/composables/forms/auto-complete/chips.js +42 -0
  340. package/dist/composables/forms/auto-complete/chips.js.map +1 -0
  341. package/dist/composables/forms/auto-complete/combobox.d.ts +25 -0
  342. package/dist/composables/forms/auto-complete/combobox.js +35 -0
  343. package/dist/composables/forms/auto-complete/combobox.js.map +1 -0
  344. package/dist/composables/forms/auto-complete/focus.d.ts +5 -2
  345. package/dist/composables/forms/auto-complete/focus.js +44 -19
  346. package/dist/composables/forms/auto-complete/focus.js.map +1 -1
  347. package/dist/composables/forms/auto-complete/index.d.ts +3 -0
  348. package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +8 -1
  349. package/dist/composables/forms/auto-complete/keyboard-navigation.js +49 -21
  350. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  351. package/dist/composables/forms/auto-complete/search.js +6 -7
  352. package/dist/composables/forms/auto-complete/search.js.map +1 -1
  353. package/dist/composables/forms/auto-complete/selection.d.ts +37 -0
  354. package/dist/composables/forms/auto-complete/selection.js +60 -0
  355. package/dist/composables/forms/auto-complete/selection.js.map +1 -0
  356. package/dist/composables/forms/auto-complete/value.js +20 -1
  357. package/dist/composables/forms/auto-complete/value.js.map +1 -1
  358. package/dist/composables/forms/category-picker/use-category-picker.js +1 -1
  359. package/dist/composables/forms/use-prepend-append-width.js +6 -6
  360. package/dist/composables/forms/use-prepend-append-width.js.map +1 -1
  361. package/dist/composables/keyboard-scroll.d.ts +17 -0
  362. package/dist/composables/keyboard-scroll.js +58 -0
  363. package/dist/composables/keyboard-scroll.js.map +1 -0
  364. package/dist/composables/overlay-stack.js +1 -1
  365. package/dist/composables/sticky-header.d.ts +8 -0
  366. package/dist/composables/sticky-header.js +21 -10
  367. package/dist/composables/sticky-header.js.map +1 -1
  368. package/dist/composables/tables/data-table/columns.js +1 -1
  369. package/dist/composables/tables/data-table/expansion.js +1 -1
  370. package/dist/composables/tables/data-table/grouping.js +27 -28
  371. package/dist/composables/tables/data-table/grouping.js.map +1 -1
  372. package/dist/composables/tables/data-table/page-scroll.d.ts +32 -0
  373. package/dist/composables/tables/data-table/page-scroll.js +144 -0
  374. package/dist/composables/tables/data-table/page-scroll.js.map +1 -0
  375. package/dist/composables/tables/data-table/pagination.js +1 -1
  376. package/dist/composables/tables/data-table/selection.js +37 -38
  377. package/dist/composables/tables/data-table/selection.js.map +1 -1
  378. package/dist/composables/tables/data-table/sort.js +1 -1
  379. package/dist/composables/theme.js +12 -12
  380. package/dist/composables/theme.js.map +1 -1
  381. package/dist/composables/timeout-manager.js +1 -1
  382. package/dist/consts/colors.d.ts +4 -0
  383. package/dist/consts/colors.js +1 -37
  384. package/dist/consts/colors.js.map +1 -1
  385. package/dist/consts/tokens.d.ts +56 -0
  386. package/dist/consts/tokens.js +46 -0
  387. package/dist/consts/tokens.js.map +1 -0
  388. package/dist/consts/typography.d.ts +51 -18
  389. package/dist/index.d.ts +7 -2
  390. package/dist/index.js +10 -6
  391. package/dist/index.js.map +1 -1
  392. package/dist/library-icons.json +0 -10
  393. package/dist/style.css +5629 -4678
  394. package/dist/styles/colors.css +315 -0
  395. package/dist/styles/tokens.css +50 -0
  396. package/dist/tailwind.css +145 -0
  397. package/dist/theme/theme.css +403 -0
  398. package/dist/theme.css +403 -0
  399. package/dist/types/dom.d.ts +9 -0
  400. package/dist/types/theme.d.ts +2 -3
  401. package/dist/types/theme.js.map +1 -1
  402. package/dist/utils/form-text-detail.js +1 -1
  403. package/dist/utils/helpers.d.ts +0 -8
  404. package/dist/utils/helpers.js +1 -2
  405. package/dist/utils/helpers.js.map +1 -1
  406. package/dist/utils/tv.js +13 -21
  407. package/dist/utils/tv.js.map +1 -1
  408. package/dist/vendor/@vueuse/core/dist/index.js +1577 -0
  409. package/dist/vendor/@vueuse/core/dist/index.js.map +1 -0
  410. package/dist/vendor/@vueuse/shared/dist/index.js +563 -0
  411. package/dist/vendor/@vueuse/shared/dist/index.js.map +1 -0
  412. package/dist/vite-plugin/index.js +5 -6
  413. package/dist/vite-plugin/index.js.map +1 -1
  414. package/dist/web-types.json +278 -403
  415. package/package.json +17 -19
  416. package/dist/components/icons/LazyIcon.vue.d.ts +0 -8
  417. package/dist/components/steppers/RuiStepperCustomIcon.js +0 -7
  418. package/dist/components/steppers/RuiStepperCustomIcon.js.map +0 -1
  419. package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +0 -8
  420. package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js +0 -43
  421. package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js.map +0 -1
  422. package/dist/composables/colors/common.d.ts +0 -20
  423. package/dist/composables/colors/index.d.ts +0 -3
  424. package/dist/composables/colors/text-input.d.ts +0 -27
  425. package/dist/composables/forms/use-label-with-quote.d.ts +0 -2
  426. package/dist/composables/popper.d.ts +0 -16
  427. package/dist/composables/popper.js +0 -23
  428. package/dist/composables/popper.js.map +0 -1
  429. package/dist/consts/forms/auto-complete/index.d.ts +0 -4
  430. package/dist/theme/index.d.ts +0 -5
  431. package/dist/theme/index.js +0 -162
  432. package/dist/theme/index.js.map +0 -1
  433. package/dist/utils/forms/auto-complete/index.d.ts +0 -2
@@ -0,0 +1,7 @@
1
+ import RuiFieldLabel_vue_vue_type_script_setup_true_lang_default from "./RuiFieldLabel.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/components/forms/field-label/RuiFieldLabel.vue
3
+ var RuiFieldLabel_default = RuiFieldLabel_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { RuiFieldLabel_default as default };
6
+
7
+ //# sourceMappingURL=RuiFieldLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuiFieldLabel.js","names":[],"sources":["../../../../src/components/forms/field-label/RuiFieldLabel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { tv } from '@/utils/tv';\n\n/**\n * The label a field shows above itself when its label placement is `top`, or\n * keeps for screen readers alone when it is `hidden`. A text input links it\n * through `for`; a select or picker, whose activator is not a labelable\n * element, points at its `id` with `aria-labelledby` instead.\n */\nexport interface FieldLabelProps {\n text: string;\n hidden?: boolean;\n required?: boolean;\n disabled?: boolean;\n for?: string;\n id?: string;\n}\n\ndefineOptions({\n name: 'RuiFieldLabel',\n});\n\nconst {\n text,\n hidden = false,\n required = false,\n disabled = false,\n for: forId = undefined,\n id = undefined,\n} = defineProps<FieldLabelProps>();\n\nconst labelStyles = tv({\n slots: {\n root: 'block mb-1 text-sm leading-5 font-medium text-rui-text',\n required: 'text-rui-error',\n },\n variants: {\n hidden: {\n true: { root: 'sr-only' },\n },\n disabled: {\n true: { root: 'text-rui-text-disabled' },\n },\n },\n});\n\nconst ui = computed<ReturnType<typeof labelStyles>>(() => labelStyles({ hidden, disabled }));\n</script>\n\n<template>\n <label\n :id=\"id\"\n :for=\"forId\"\n :class=\"ui.root()\"\n data-id=\"field-label\"\n >\n {{ text }}\n <span\n v-if=\"required\"\n :class=\"ui.required()\"\n aria-hidden=\"true\"\n >\n *\n </span>\n </label>\n</template>\n"],"mappings":""}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The label a field shows above itself when its label placement is `top`, or
3
+ * keeps for screen readers alone when it is `hidden`. A text input links it
4
+ * through `for`; a select or picker, whose activator is not a labelable
5
+ * element, points at its `id` with `aria-labelledby` instead.
6
+ */
7
+ export interface FieldLabelProps {
8
+ text: string;
9
+ hidden?: boolean;
10
+ required?: boolean;
11
+ disabled?: boolean;
12
+ for?: string;
13
+ id?: string;
14
+ }
15
+ declare const __VLS_export: import("vue").DefineComponent<FieldLabelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FieldLabelProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
16
+ declare const _default: typeof __VLS_export;
17
+ export default _default;
@@ -0,0 +1,57 @@
1
+ import { tv } from "../../../utils/tv.js";
2
+ import { computed, createCommentVNode, createElementBlock, createTextVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref } from "vue";
3
+ //#region src/components/forms/field-label/RuiFieldLabel.vue?vue&type=script&setup=true&lang.ts
4
+ var _hoisted_1 = ["id", "for"];
5
+ var RuiFieldLabel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
+ name: "RuiFieldLabel",
7
+ __name: "RuiFieldLabel",
8
+ props: {
9
+ text: {},
10
+ hidden: {
11
+ type: Boolean,
12
+ default: false
13
+ },
14
+ required: {
15
+ type: Boolean,
16
+ default: false
17
+ },
18
+ disabled: {
19
+ type: Boolean,
20
+ default: false
21
+ },
22
+ for: { default: () => void 0 },
23
+ id: { default: () => void 0 }
24
+ },
25
+ setup(__props) {
26
+ const labelStyles = tv({
27
+ slots: {
28
+ root: "block mb-1 text-sm leading-5 font-medium text-rui-text",
29
+ required: "text-rui-error"
30
+ },
31
+ variants: {
32
+ hidden: { true: { root: "sr-only" } },
33
+ disabled: { true: { root: "text-rui-text-disabled" } }
34
+ }
35
+ });
36
+ const ui = computed(() => labelStyles({
37
+ hidden: __props.hidden,
38
+ disabled: __props.disabled
39
+ }));
40
+ return (_ctx, _cache) => {
41
+ return openBlock(), createElementBlock("label", {
42
+ id: __props.id,
43
+ for: __props.for,
44
+ class: normalizeClass(unref(ui).root()),
45
+ "data-id": "field-label"
46
+ }, [createTextVNode(toDisplayString(__props.text) + " ", 1), __props.required ? (openBlock(), createElementBlock("span", {
47
+ key: 0,
48
+ class: normalizeClass(unref(ui).required()),
49
+ "aria-hidden": "true"
50
+ }, " * ", 2)) : createCommentVNode("", true)], 10, _hoisted_1);
51
+ };
52
+ }
53
+ });
54
+ //#endregion
55
+ export { RuiFieldLabel_vue_vue_type_script_setup_true_lang_default as default };
56
+
57
+ //# sourceMappingURL=RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuiFieldLabel.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/forms/field-label/RuiFieldLabel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { tv } from '@/utils/tv';\n\n/**\n * The label a field shows above itself when its label placement is `top`, or\n * keeps for screen readers alone when it is `hidden`. A text input links it\n * through `for`; a select or picker, whose activator is not a labelable\n * element, points at its `id` with `aria-labelledby` instead.\n */\nexport interface FieldLabelProps {\n text: string;\n hidden?: boolean;\n required?: boolean;\n disabled?: boolean;\n for?: string;\n id?: string;\n}\n\ndefineOptions({\n name: 'RuiFieldLabel',\n});\n\nconst {\n text,\n hidden = false,\n required = false,\n disabled = false,\n for: forId = undefined,\n id = undefined,\n} = defineProps<FieldLabelProps>();\n\nconst labelStyles = tv({\n slots: {\n root: 'block mb-1 text-sm leading-5 font-medium text-rui-text',\n required: 'text-rui-error',\n },\n variants: {\n hidden: {\n true: { root: 'sr-only' },\n },\n disabled: {\n true: { root: 'text-rui-text-disabled' },\n },\n },\n});\n\nconst ui = computed<ReturnType<typeof labelStyles>>(() => labelStyles({ hidden, disabled }));\n</script>\n\n<template>\n <label\n :id=\"id\"\n :for=\"forId\"\n :class=\"ui.root()\"\n data-id=\"field-label\"\n >\n {{ text }}\n <span\n v-if=\"required\"\n :class=\"ui.required()\"\n aria-hidden=\"true\"\n >\n *\n </span>\n </label>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EA+BA,MAAM,cAAc,GAAG;GACrB,OAAO;IACL,MAAM;IACN,UAAU;GACZ;GACA,UAAU;IACR,QAAQ,EACN,MAAM,EAAE,MAAM,UAAU,EAC1B;IACA,UAAU,EACR,MAAM,EAAE,MAAM,yBAAyB,EACzC;GACF;EACF,CAAC;EAED,MAAM,KAAK,eAA+C,YAAY;GAAE,QAAK,QAAA;GAAG,UAAO,QAAA;EAAE,CAAC,CAAC;;GAIzF,OAAA,UAAA,GAAA,mBAcQ,SAAA;IAbL,IAAI,QAAA;IACJ,KAAK,QAAA;IACL,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,KAAI,CAAA;IACf,WAAQ;GAEL,GAAA,CAAA,gBAAA,gBAAA,QAAA,IAAI,IAAG,KACV,CAAA,GACQ,QAAA,YADR,UAAA,GAAA,mBAMO,QAAA;;IAJJ,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,SAAQ,CAAA;IACnB,eAAY;GACb,GAAA,OAED,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,IAAA,UAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiFileUpload.js","names":[],"sources":["../../../../src/components/forms/file-upload/RuiFileUpload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { formatFileSize, getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface FileUploadProps {\n /** File type filter (HTML accept attribute syntax). e.g. '.csv', 'image/*', '.png,.jpg' */\n accept?: string;\n /** Allow multiple file selection. */\n multiple?: boolean;\n disabled?: boolean;\n /** Shows a loading overlay (consumer-driven, e.g. while uploading). */\n loading?: boolean;\n /** Upload progress 0-100. When provided alongside `loading`, the overlay shows a determinate progress bar with percentage. */\n progress?: number;\n /** Renders the success state border/icon. Consumer toggles back to false. */\n uploaded?: boolean;\n /** Optional max size per file in bytes; failures emit `error` and set internal error state. */\n maxSize?: number;\n /** External error messages (e.g. from Vuelidate). Shown via the standard form detail block. */\n errorMessages?: string | string[];\n /** Hint text below the dropzone. */\n hint?: string;\n /** Disable drag-and-drop; the dropzone becomes click-only (matches rotki.com use case). */\n noDrop?: boolean;\n /** Replace the default \"Drag and drop or \\{button\\}\" copy. */\n uploadText?: string;\n /** Label shown on the inline button when no file is selected. */\n clickToUploadText?: string;\n /** Label shown on the inline button when one or more files are already selected. */\n replaceText?: string;\n /** Hide the bottom hint/error details strip. */\n hideDetails?: boolean;\n}\n\ndefineOptions({\n name: 'RuiFileUpload',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<File | File[] | undefined>({ required: true });\n\nconst {\n accept = '*',\n multiple = false,\n disabled = false,\n loading = false,\n progress = undefined,\n uploaded = false,\n maxSize = undefined,\n errorMessages = [],\n hint = '',\n noDrop = false,\n uploadText = 'Drag and drop or',\n clickToUploadText = 'click to upload',\n replaceText = 'replace file',\n hideDetails = false,\n} = defineProps<FileUploadProps>();\n\nconst emit = defineEmits<{\n error: [message: string];\n}>();\n\ndefineSlots<{\n preview?: (props: { files: File[]; remove: () => void }) => any;\n icon?: () => any;\n description?: () => any;\n}>();\n\nconst wrapper = useTemplateRef<HTMLDivElement>('wrapper');\nconst input = useTemplateRef<HTMLInputElement>('input');\nconst internalError = ref<string>('');\n\nconst files = computed<File[]>(() => {\n const value = get(modelValue);\n if (!value)\n return [];\n return Array.isArray(value) ? value : [value];\n});\n\nconst hasFiles = computed<boolean>(() => get(files).length > 0);\n\nconst progressLabel = computed<string | undefined>(() => {\n const value = progress;\n return value === undefined ? undefined : `${Math.round(value)}%`;\n});\n\nconst combinedErrorMessages = computed<string[]>(() => {\n const external = Array.isArray(errorMessages) ? errorMessages : [errorMessages];\n const internal = get(internalError);\n return [...external.filter(Boolean), ...(internal ? [internal] : [])];\n});\n\nconst { hasError } = useFormTextDetail(combinedErrorMessages, () => []);\n\nfunction matchesAccept(file: File, acceptString: string): boolean {\n if (!acceptString || acceptString === '*' || acceptString === '*/*')\n return true;\n\n const fileName = file.name.toLowerCase();\n const fileExtension = fileName.includes('.') ? fileName.slice(fileName.lastIndexOf('.')) : '';\n const fileType = file.type.toLowerCase();\n const acceptTypes = acceptString.split(',').map(value => value.trim().toLowerCase()).filter(Boolean);\n\n return acceptTypes.some((type) => {\n if (type.startsWith('.'))\n return type === fileExtension;\n if (type.endsWith('/*'))\n return fileType.startsWith(type.slice(0, -1));\n return type === fileType;\n });\n}\n\nfunction reportError(message: string): void {\n set(internalError, message);\n emit('error', message);\n}\n\nfunction clearInternalError(): void {\n set(internalError, '');\n}\n\nfunction validate(candidates: File[]): File[] | undefined {\n if (candidates.length === 0)\n return undefined;\n\n if (!multiple && candidates.length > 1) {\n reportError('Only one file can be uploaded');\n return undefined;\n }\n\n for (const file of candidates) {\n if (!matchesAccept(file, accept)) {\n reportError(`Only ${accept} files are allowed`);\n return undefined;\n }\n if (maxSize !== undefined && file.size > maxSize) {\n reportError(`${file.name} exceeds the maximum size of ${formatFileSize(maxSize)}`);\n return undefined;\n }\n }\n\n return candidates;\n}\n\nfunction setFiles(candidates: File[]): void {\n const validated = validate(candidates);\n if (!validated)\n return;\n clearInternalError();\n set(modelValue, multiple ? validated : validated[0]);\n}\n\nfunction removeFile(target?: File): void {\n clearInternalError();\n const inputEl = get(input);\n if (inputEl)\n inputEl.value = '';\n\n if (!target || !multiple) {\n set(modelValue, multiple ? [] : undefined);\n return;\n }\n\n const remaining = get(files).filter(file => file !== target);\n set(modelValue, remaining);\n}\n\nfunction onSelect(event: Event): void {\n const target = event.target as HTMLInputElement;\n if (!target?.files)\n return;\n setFiles(Array.from(target.files));\n}\n\nfunction onDrop(dropped: File[] | null): void {\n if (disabled || noDrop || !dropped || dropped.length === 0)\n return;\n setFiles(dropped);\n}\n\nconst { isOverDropZone } = useDropZone(wrapper, {\n onDrop,\n});\n\nfunction openPicker(): void {\n if (disabled)\n return;\n get(input)?.click();\n}\n\nwatch(() => errorMessages, () => clearInternalError());\n\ndefineExpose({\n removeFile: () => removeFile(),\n openPicker,\n});\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <div\n ref=\"wrapper\"\n class=\"p-4 border border-rui-grey-300 dark:border-rui-grey-800 rounded-md w-full relative border-dashed transition\"\n :class=\"{\n '!border-rui-primary bg-rui-primary/[0.08]': isOverDropZone && !disabled && !noDrop,\n '!border-rui-error !border-solid bg-rui-error/[0.08]': hasError,\n '!border-rui-success !border-solid bg-rui-success/[0.08]': uploaded,\n 'opacity-60 pointer-events-none': disabled,\n }\"\n :data-disabled=\"disabled || undefined\"\n :data-uploaded=\"uploaded || undefined\"\n :data-error=\"hasError ? '' : undefined\"\n :data-drop-active=\"isOverDropZone || undefined\"\n >\n <div\n class=\"flex flex-col items-center justify-center gap-3\"\n :class=\"{ 'opacity-0': loading }\"\n >\n <slot\n name=\"preview\"\n :files=\"files\"\n :remove=\"() => removeFile()\"\n >\n <div\n v-if=\"hasFiles\"\n class=\"flex flex-col gap-1 w-full\"\n data-id=\"file-list\"\n >\n <div\n v-for=\"file in files\"\n :key=\"`${file.name}-${file.lastModified}`\"\n class=\"flex items-center gap-2 bg-rui-primary/[0.08] rounded-full pl-3 pr-1 py-1\"\n data-id=\"file-item\"\n >\n <RuiIcon\n name=\"lu-file\"\n color=\"primary\"\n size=\"20\"\n />\n <div class=\"flex-1 overflow-hidden min-w-0\">\n <div\n class=\"text-sm leading-5 truncate\"\n :title=\"file.name\"\n >\n {{ file.name }}\n </div>\n <div class=\"text-rui-text-secondary text-xs leading-3\">\n {{ formatFileSize(file.size) }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"p-1 rounded-full hover:bg-rui-primary/[0.16] transition\"\n :disabled=\"disabled\"\n :aria-label=\"`Remove ${file.name}`\"\n data-id=\"remove-file\"\n @click=\"removeFile(file)\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"16\"\n />\n </button>\n </div>\n </div>\n <div\n v-else\n class=\"h-10 w-10 rounded-full flex items-center justify-center\"\n :class=\"uploaded ? 'bg-rui-success/[0.12]' : 'bg-rui-primary/[0.12]'\"\n >\n <slot name=\"icon\">\n <RuiIcon\n :name=\"uploaded ? 'lu-circle-check' : 'lu-file-up'\"\n :color=\"uploaded ? 'success' : 'primary'\"\n />\n </slot>\n </div>\n </slot>\n\n <div class=\"text-center text-sm\">\n <slot name=\"description\">\n <div class=\"flex items-center justify-center gap-1 flex-wrap\">\n <span>{{ uploadText }}</span>\n <button\n type=\"button\"\n class=\"text-rui-primary underline disabled:no-underline disabled:text-rui-text-disabled\"\n :disabled=\"disabled\"\n data-id=\"open-picker\"\n @click=\"openPicker()\"\n >\n {{ hasFiles ? replaceText : clickToUploadText }}\n </button>\n </div>\n </slot>\n </div>\n\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n hidden\n data-id=\"file-input\"\n v-bind=\"getNonRootAttrs($attrs, ['class', 'onChange'])\"\n @change=\"onSelect($event)\"\n />\n </div>\n\n <div\n v-if=\"loading\"\n class=\"flex flex-col items-center justify-center absolute h-full w-full top-0 left-0 gap-2\"\n data-id=\"loading\"\n >\n <RuiProgress\n circular\n :variant=\"progress === undefined ? 'indeterminate' : 'determinate'\"\n :value=\"progress\"\n color=\"primary\"\n size=\"40\"\n />\n <div\n v-if=\"progressLabel\"\n class=\"text-xs text-rui-text-secondary\"\n data-id=\"progress-label\"\n v-text=\"progressLabel\"\n />\n </div>\n </div>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n :error-messages=\"combinedErrorMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiFileUpload.js","names":[],"sources":["../../../../src/components/forms/file-upload/RuiFileUpload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { RuiIcons } from '@/icons';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { formatFileSize, getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface FileUploadProps {\n /** File type filter (HTML accept attribute syntax). e.g. '.csv', 'image/*', '.png,.jpg' */\n accept?: string;\n /** Allow multiple file selection. */\n multiple?: boolean;\n disabled?: boolean;\n /** Shows a loading overlay (consumer-driven, e.g. while uploading). */\n loading?: boolean;\n /** Upload progress 0-100. When provided alongside `loading`, the overlay shows a determinate progress bar with percentage. */\n progress?: number;\n /** Renders the success state border/icon. Consumer toggles back to false. */\n uploaded?: boolean;\n /** Optional max size per file in bytes; failures emit `error` and set internal error state. */\n maxSize?: number;\n /** External error messages (e.g. from Vuelidate). Shown via the standard form detail block. */\n errorMessages?: string | string[];\n /** Hint text below the dropzone. */\n hint?: string;\n /** Disable drag-and-drop; the dropzone becomes click-only (matches rotki.com use case). */\n noDrop?: boolean;\n /** Replace the default \"Drag and drop or \\{button\\}\" copy. With `noDrop` the default is empty, so only the button shows. */\n uploadText?: string;\n /** Label shown on the inline button when no file is selected. */\n clickToUploadText?: string;\n /** Label shown on the inline button when one or more files are already selected. */\n replaceText?: string;\n /** Hide the bottom hint/error details strip. */\n hideDetails?: boolean;\n}\n\ndefineOptions({\n name: 'RuiFileUpload',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<File | File[] | undefined>({ required: true });\n\nconst {\n accept = '*',\n multiple = false,\n disabled = false,\n loading = false,\n progress = undefined,\n uploaded = false,\n maxSize = undefined,\n errorMessages = [],\n hint = '',\n noDrop = false,\n uploadText = undefined,\n clickToUploadText = 'click to upload',\n replaceText = 'replace file',\n hideDetails = false,\n} = defineProps<FileUploadProps>();\n\nconst emit = defineEmits<{\n error: [message: string];\n}>();\n\ndefineSlots<{\n preview?: (props: { files: File[]; remove: () => void }) => any;\n icon?: () => any;\n description?: () => any;\n}>();\n\nconst wrapper = useTemplateRef<HTMLDivElement>('wrapper');\nconst input = useTemplateRef<HTMLInputElement>('input');\nconst internalError = ref<string>('');\n\nconst files = computed<File[]>(() => {\n const value = get(modelValue);\n if (!value)\n return [];\n return Array.isArray(value) ? value : [value];\n});\n\nconst hasFiles = computed<boolean>(() => get(files).length > 0);\n\nconst progressLabel = computed<string | undefined>(() => {\n const value = progress;\n return value === undefined ? undefined : `${Math.round(value)}%`;\n});\n\nconst combinedErrorMessages = computed<string[]>(() => {\n const external = Array.isArray(errorMessages) ? errorMessages : [errorMessages];\n const internal = get(internalError);\n return [...external.filter(Boolean), ...(internal ? [internal] : [])];\n});\n\nconst { hasError } = useFormTextDetail(combinedErrorMessages, () => []);\n\n// a click-only dropzone does not offer dragging\nconst resolvedUploadText = computed<string>(() => uploadText ?? (noDrop ? '' : 'Drag and drop or'));\n\ntype WellTone = 'primary' | 'error' | 'success';\n\n// the icon well follows the dropzone's state, like its border\nconst wellTone = computed<WellTone>(() => {\n if (get(hasError))\n return 'error';\n if (uploaded)\n return 'success';\n return 'primary';\n});\n\nconst wellIcon = computed<RuiIcons>(() => {\n const tone = get(wellTone);\n if (tone === 'error')\n return 'lu-circle-alert';\n if (tone === 'success')\n return 'lu-circle-check';\n return 'lu-file-up';\n});\n\n// the 10% tint vanishes on a dark page, so dark doubles it\nconst wellClasses: Record<WellTone, string> = {\n primary: 'bg-rui-primary-soft dark:bg-rui-primary/20',\n error: 'bg-rui-error-soft dark:bg-rui-error/20',\n success: 'bg-rui-success-soft dark:bg-rui-success/20',\n};\n\nfunction matchesAccept(file: File, acceptString: string): boolean {\n if (!acceptString || acceptString === '*' || acceptString === '*/*')\n return true;\n\n const fileName = file.name.toLowerCase();\n const fileExtension = fileName.includes('.') ? fileName.slice(fileName.lastIndexOf('.')) : '';\n const fileType = file.type.toLowerCase();\n const acceptTypes = acceptString.split(',').map(value => value.trim().toLowerCase()).filter(Boolean);\n\n return acceptTypes.some((type) => {\n if (type.startsWith('.'))\n return type === fileExtension;\n if (type.endsWith('/*'))\n return fileType.startsWith(type.slice(0, -1));\n return type === fileType;\n });\n}\n\nfunction reportError(message: string): void {\n set(internalError, message);\n emit('error', message);\n}\n\nfunction clearInternalError(): void {\n set(internalError, '');\n}\n\nfunction validate(candidates: File[]): File[] | undefined {\n if (candidates.length === 0)\n return undefined;\n\n if (!multiple && candidates.length > 1) {\n reportError('Only one file can be uploaded');\n return undefined;\n }\n\n for (const file of candidates) {\n if (!matchesAccept(file, accept)) {\n reportError(`Only ${accept} files are allowed`);\n return undefined;\n }\n if (maxSize !== undefined && file.size > maxSize) {\n reportError(`${file.name} exceeds the maximum size of ${formatFileSize(maxSize)}`);\n return undefined;\n }\n }\n\n return candidates;\n}\n\nfunction setFiles(candidates: File[]): void {\n const validated = validate(candidates);\n if (!validated)\n return;\n clearInternalError();\n set(modelValue, multiple ? validated : validated[0]);\n}\n\nfunction removeFile(target?: File): void {\n clearInternalError();\n const inputEl = get(input);\n if (inputEl)\n inputEl.value = '';\n\n if (!target || !multiple) {\n set(modelValue, multiple ? [] : undefined);\n return;\n }\n\n const remaining = get(files).filter(file => file !== target);\n set(modelValue, remaining);\n}\n\nfunction onSelect(event: Event): void {\n const target = event.target;\n if (!(target instanceof HTMLInputElement) || !target.files)\n return;\n const picked = Array.from(target.files);\n // the model owns the selection; a cleared input fires `change` for the same file again\n target.value = '';\n setFiles(picked);\n}\n\nfunction onDrop(dropped: File[] | null): void {\n if (disabled || noDrop || !dropped || dropped.length === 0)\n return;\n setFiles(dropped);\n}\n\nconst { isOverDropZone } = useDropZone(wrapper, {\n onDrop,\n});\n\nfunction openPicker(): void {\n if (disabled)\n return;\n get(input)?.click();\n}\n\nwatch(() => errorMessages, () => clearInternalError());\n\ndefineExpose({\n removeFile: () => removeFile(),\n openPicker,\n});\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <div\n ref=\"wrapper\"\n class=\"p-4 border border-rui-outline dark:border-rui-neutral-400 rounded-rui-panel w-full relative border-dashed transition\"\n :class=\"{\n 'border-rui-primary! bg-rui-primary-subtle': isOverDropZone && !disabled && !noDrop,\n 'border-rui-error! border-solid! bg-rui-error-subtle': hasError,\n 'border-rui-success! border-solid! bg-rui-success-subtle': uploaded,\n 'opacity-60 pointer-events-none': disabled,\n }\"\n :data-disabled=\"disabled || undefined\"\n :data-uploaded=\"uploaded || undefined\"\n :data-error=\"hasError ? '' : undefined\"\n :data-drop-active=\"isOverDropZone || undefined\"\n >\n <div\n class=\"flex flex-col items-center justify-center gap-3\"\n :class=\"{ 'opacity-0': loading }\"\n >\n <slot\n name=\"preview\"\n :files=\"files\"\n :remove=\"() => removeFile()\"\n >\n <div\n v-if=\"hasFiles\"\n class=\"flex flex-col gap-1 w-full\"\n data-id=\"file-list\"\n >\n <div\n v-for=\"file in files\"\n :key=\"`${file.name}-${file.lastModified}`\"\n class=\"flex items-center gap-2 bg-rui-primary-soft dark:bg-rui-primary/20 rounded-full pl-3 pr-1 py-1\"\n data-id=\"file-item\"\n >\n <RuiIcon\n name=\"lu-file\"\n color=\"primary\"\n size=\"20\"\n />\n <div class=\"flex-1 overflow-hidden min-w-0\">\n <div\n class=\"text-sm leading-5 truncate\"\n :title=\"file.name\"\n >\n {{ file.name }}\n </div>\n <div class=\"text-rui-text-secondary text-xs leading-3\">\n {{ formatFileSize(file.size) }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"p-1 rounded-full hover:bg-rui-hover transition focus-visible:focus-ring outline-hidden\"\n :disabled=\"disabled\"\n :aria-label=\"`Remove ${file.name}`\"\n data-id=\"remove-file\"\n @click=\"removeFile(file)\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"16\"\n />\n </button>\n </div>\n </div>\n <div\n v-else\n class=\"h-10 w-10 rounded-full flex items-center justify-center\"\n :class=\"wellClasses[wellTone]\"\n data-id=\"icon-well\"\n >\n <slot name=\"icon\">\n <RuiIcon\n :name=\"wellIcon\"\n :color=\"wellTone\"\n />\n </slot>\n </div>\n </slot>\n\n <div class=\"text-center text-sm\">\n <slot name=\"description\">\n <div class=\"flex items-center justify-center gap-1 flex-wrap\">\n <span v-if=\"resolvedUploadText\">{{ resolvedUploadText }}</span>\n <button\n type=\"button\"\n class=\"text-rui-primary underline disabled:no-underline disabled:text-rui-text-disabled\"\n :class=\"{ 'first-letter:uppercase': !resolvedUploadText }\"\n :disabled=\"disabled\"\n data-id=\"open-picker\"\n @click=\"openPicker()\"\n >\n {{ hasFiles ? replaceText : clickToUploadText }}\n </button>\n </div>\n </slot>\n </div>\n\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n hidden\n data-id=\"file-input\"\n v-bind=\"getNonRootAttrs($attrs, ['class', 'onChange'])\"\n @change=\"onSelect($event)\"\n />\n </div>\n\n <div\n v-if=\"loading\"\n class=\"flex flex-col items-center justify-center absolute h-full w-full top-0 left-0 gap-2\"\n data-id=\"loading\"\n >\n <RuiProgress\n circular\n :variant=\"progress === undefined ? 'indeterminate' : 'determinate'\"\n :value=\"progress\"\n color=\"primary\"\n size=\"40\"\n />\n <div\n v-if=\"progressLabel\"\n class=\"text-xs text-rui-text-secondary\"\n data-id=\"progress-label\"\n v-text=\"progressLabel\"\n />\n </div>\n </div>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n :error-messages=\"combinedErrorMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n"],"mappings":""}
@@ -18,7 +18,7 @@ export interface FileUploadProps {
18
18
  hint?: string;
19
19
  /** Disable drag-and-drop; the dropzone becomes click-only (matches rotki.com use case). */
20
20
  noDrop?: boolean;
21
- /** Replace the default "Drag and drop or \{button\}" copy. */
21
+ /** Replace the default "Drag and drop or \{button\}" copy. With `noDrop` the default is empty, so only the button shows. */
22
22
  uploadText?: string;
23
23
  /** Label shown on the inline button when no file is selected. */
24
24
  clickToUploadText?: string;
@@ -1,11 +1,11 @@
1
+ import { get, set } from "../../../vendor/@vueuse/shared/dist/index.js";
2
+ import { useDropZone } from "../../../vendor/@vueuse/core/dist/index.js";
1
3
  import RuiIcon_default from "../../icons/RuiIcon.js";
2
4
  import RuiProgress_default from "../../progress/RuiProgress.js";
3
5
  import { useFormTextDetail } from "../../../utils/form-text-detail.js";
4
6
  import RuiFormTextDetail_default from "../../helpers/RuiFormTextDetail.js";
5
7
  import { formatFileSize, getNonRootAttrs, getRootAttrs } from "../../../utils/helpers.js";
6
8
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, guardReactiveProps, mergeModels, mergeProps, normalizeClass, normalizeProps, openBlock, ref, renderList, renderSlot, toDisplayString, unref, useModel, useTemplateRef, watch } from "vue";
7
- import { useDropZone } from "@vueuse/core";
8
- import { get as get$1, set as set$1 } from "@vueuse/shared";
9
9
  //#region src/components/forms/file-upload/RuiFileUpload.vue?vue&type=script&setup=true&lang.ts
10
10
  var _hoisted_1 = [
11
11
  "data-disabled",
@@ -28,18 +28,19 @@ var _hoisted_6 = [
28
28
  ];
29
29
  var _hoisted_7 = { class: "text-center text-sm" };
30
30
  var _hoisted_8 = { class: "flex items-center justify-center gap-1 flex-wrap" };
31
- var _hoisted_9 = ["disabled"];
32
- var _hoisted_10 = [
31
+ var _hoisted_9 = { key: 0 };
32
+ var _hoisted_10 = ["disabled"];
33
+ var _hoisted_11 = [
33
34
  "accept",
34
35
  "multiple",
35
36
  "disabled"
36
37
  ];
37
- var _hoisted_11 = {
38
+ var _hoisted_12 = {
38
39
  key: 0,
39
40
  class: "flex flex-col items-center justify-center absolute h-full w-full top-0 left-0 gap-2",
40
41
  "data-id": "loading"
41
42
  };
42
- var _hoisted_12 = ["textContent"];
43
+ var _hoisted_13 = ["textContent"];
43
44
  var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
44
45
  name: "RuiFileUpload",
45
46
  inheritAttrs: false,
@@ -70,7 +71,7 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
70
71
  type: Boolean,
71
72
  default: false
72
73
  },
73
- uploadText: { default: "Drag and drop or" },
74
+ uploadText: { default: () => void 0 },
74
75
  clickToUploadText: { default: "click to upload" },
75
76
  replaceText: { default: "replace file" },
76
77
  hideDetails: {
@@ -89,21 +90,38 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
89
90
  const input = useTemplateRef("input");
90
91
  const internalError = ref("");
91
92
  const files = computed(() => {
92
- const value = get$1(modelValue);
93
+ const value = get(modelValue);
93
94
  if (!value) return [];
94
95
  return Array.isArray(value) ? value : [value];
95
96
  });
96
- const hasFiles = computed(() => get$1(files).length > 0);
97
+ const hasFiles = computed(() => get(files).length > 0);
97
98
  const progressLabel = computed(() => {
98
99
  const value = __props.progress;
99
100
  return value === void 0 ? void 0 : `${Math.round(value)}%`;
100
101
  });
101
102
  const combinedErrorMessages = computed(() => {
102
103
  const external = Array.isArray(__props.errorMessages) ? __props.errorMessages : [__props.errorMessages];
103
- const internal = get$1(internalError);
104
+ const internal = get(internalError);
104
105
  return [...external.filter(Boolean), ...internal ? [internal] : []];
105
106
  });
106
107
  const { hasError } = useFormTextDetail(combinedErrorMessages, () => []);
108
+ const resolvedUploadText = computed(() => __props.uploadText ?? (__props.noDrop ? "" : "Drag and drop or"));
109
+ const wellTone = computed(() => {
110
+ if (get(hasError)) return "error";
111
+ if (__props.uploaded) return "success";
112
+ return "primary";
113
+ });
114
+ const wellIcon = computed(() => {
115
+ const tone = get(wellTone);
116
+ if (tone === "error") return "lu-circle-alert";
117
+ if (tone === "success") return "lu-circle-check";
118
+ return "lu-file-up";
119
+ });
120
+ const wellClasses = {
121
+ primary: "bg-rui-primary-soft dark:bg-rui-primary/20",
122
+ error: "bg-rui-error-soft dark:bg-rui-error/20",
123
+ success: "bg-rui-success-soft dark:bg-rui-success/20"
124
+ };
107
125
  function matchesAccept(file, acceptString) {
108
126
  if (!acceptString || acceptString === "*" || acceptString === "*/*") return true;
109
127
  const fileName = file.name.toLowerCase();
@@ -116,11 +134,11 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
116
134
  });
117
135
  }
118
136
  function reportError(message) {
119
- set$1(internalError, message);
137
+ set(internalError, message);
120
138
  emit("error", message);
121
139
  }
122
140
  function clearInternalError() {
123
- set$1(internalError, "");
141
+ set(internalError, "");
124
142
  }
125
143
  function validate(candidates) {
126
144
  if (candidates.length === 0) return void 0;
@@ -144,23 +162,25 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
144
162
  const validated = validate(candidates);
145
163
  if (!validated) return;
146
164
  clearInternalError();
147
- set$1(modelValue, __props.multiple ? validated : validated[0]);
165
+ set(modelValue, __props.multiple ? validated : validated[0]);
148
166
  }
149
167
  function removeFile(target) {
150
168
  clearInternalError();
151
- const inputEl = get$1(input);
169
+ const inputEl = get(input);
152
170
  if (inputEl) inputEl.value = "";
153
171
  if (!target || !__props.multiple) {
154
- set$1(modelValue, __props.multiple ? [] : void 0);
172
+ set(modelValue, __props.multiple ? [] : void 0);
155
173
  return;
156
174
  }
157
- const remaining = get$1(files).filter((file) => file !== target);
158
- set$1(modelValue, remaining);
175
+ const remaining = get(files).filter((file) => file !== target);
176
+ set(modelValue, remaining);
159
177
  }
160
178
  function onSelect(event) {
161
179
  const target = event.target;
162
- if (!target?.files) return;
163
- setFiles(Array.from(target.files));
180
+ if (!(target instanceof HTMLInputElement) || !target.files) return;
181
+ const picked = Array.from(target.files);
182
+ target.value = "";
183
+ setFiles(picked);
164
184
  }
165
185
  function onDrop(dropped) {
166
186
  if (__props.disabled || __props.noDrop || !dropped || dropped.length === 0) return;
@@ -169,7 +189,7 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
169
189
  const { isOverDropZone } = useDropZone(wrapper, { onDrop });
170
190
  function openPicker() {
171
191
  if (__props.disabled) return;
172
- get$1(input)?.click();
192
+ get(input)?.click();
173
193
  }
174
194
  watch(() => __props.errorMessages, () => clearInternalError());
175
195
  __expose({
@@ -180,10 +200,10 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
180
200
  return openBlock(), createElementBlock("div", normalizeProps(guardReactiveProps(unref(getRootAttrs)(_ctx.$attrs))), [createElementVNode("div", {
181
201
  ref_key: "wrapper",
182
202
  ref: wrapper,
183
- class: normalizeClass(["p-4 border border-rui-grey-300 dark:border-rui-grey-800 rounded-md w-full relative border-dashed transition", {
184
- "!border-rui-primary bg-rui-primary/[0.08]": unref(isOverDropZone) && !__props.disabled && !__props.noDrop,
185
- "!border-rui-error !border-solid bg-rui-error/[0.08]": unref(hasError),
186
- "!border-rui-success !border-solid bg-rui-success/[0.08]": __props.uploaded,
203
+ class: normalizeClass(["p-4 border border-rui-outline dark:border-rui-neutral-400 rounded-rui-panel w-full relative border-dashed transition", {
204
+ "border-rui-primary! bg-rui-primary-subtle": unref(isOverDropZone) && !__props.disabled && !__props.noDrop,
205
+ "border-rui-error! border-solid! bg-rui-error-subtle": unref(hasError),
206
+ "border-rui-success! border-solid! bg-rui-success-subtle": __props.uploaded,
187
207
  "opacity-60 pointer-events-none": __props.disabled
188
208
  }]),
189
209
  "data-disabled": __props.disabled || void 0,
@@ -197,7 +217,7 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
197
217
  }, () => [unref(hasFiles) ? (openBlock(), createElementBlock("div", _hoisted_2, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(files), (file) => {
198
218
  return openBlock(), createElementBlock("div", {
199
219
  key: `${file.name}-${file.lastModified}`,
200
- class: "flex items-center gap-2 bg-rui-primary/[0.08] rounded-full pl-3 pr-1 py-1",
220
+ class: "flex items-center gap-2 bg-rui-primary-soft dark:bg-rui-primary/20 rounded-full pl-3 pr-1 py-1",
201
221
  "data-id": "file-item"
202
222
  }, [
203
223
  createVNode(RuiIcon_default, {
@@ -211,7 +231,7 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
211
231
  }, toDisplayString(file.name), 9, _hoisted_4), createElementVNode("div", _hoisted_5, toDisplayString(unref(formatFileSize)(file.size)), 1)]),
212
232
  createElementVNode("button", {
213
233
  type: "button",
214
- class: "p-1 rounded-full hover:bg-rui-primary/[0.16] transition",
234
+ class: "p-1 rounded-full hover:bg-rui-hover transition focus-visible:focus-ring outline-hidden",
215
235
  disabled: __props.disabled,
216
236
  "aria-label": `Remove ${file.name}`,
217
237
  "data-id": "remove-file",
@@ -223,18 +243,19 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
223
243
  ]);
224
244
  }), 128))])) : (openBlock(), createElementBlock("div", {
225
245
  key: 1,
226
- class: normalizeClass(["h-10 w-10 rounded-full flex items-center justify-center", __props.uploaded ? "bg-rui-success/[0.12]" : "bg-rui-primary/[0.12]"])
246
+ class: normalizeClass(["h-10 w-10 rounded-full flex items-center justify-center", wellClasses[unref(wellTone)]]),
247
+ "data-id": "icon-well"
227
248
  }, [renderSlot(_ctx.$slots, "icon", {}, () => [createVNode(RuiIcon_default, {
228
- name: __props.uploaded ? "lu-circle-check" : "lu-file-up",
229
- color: __props.uploaded ? "success" : "primary"
249
+ name: unref(wellIcon),
250
+ color: unref(wellTone)
230
251
  }, null, 8, ["name", "color"])])], 2))]),
231
- createElementVNode("div", _hoisted_7, [renderSlot(_ctx.$slots, "description", {}, () => [createElementVNode("div", _hoisted_8, [createElementVNode("span", null, toDisplayString(__props.uploadText), 1), createElementVNode("button", {
252
+ createElementVNode("div", _hoisted_7, [renderSlot(_ctx.$slots, "description", {}, () => [createElementVNode("div", _hoisted_8, [unref(resolvedUploadText) ? (openBlock(), createElementBlock("span", _hoisted_9, toDisplayString(unref(resolvedUploadText)), 1)) : createCommentVNode("", true), createElementVNode("button", {
232
253
  type: "button",
233
- class: "text-rui-primary underline disabled:no-underline disabled:text-rui-text-disabled",
254
+ class: normalizeClass(["text-rui-primary underline disabled:no-underline disabled:text-rui-text-disabled", { "first-letter:uppercase": !unref(resolvedUploadText) }]),
234
255
  disabled: __props.disabled,
235
256
  "data-id": "open-picker",
236
257
  onClick: _cache[0] || (_cache[0] = ($event) => openPicker())
237
- }, toDisplayString(unref(hasFiles) ? __props.replaceText : __props.clickToUploadText), 9, _hoisted_9)])])]),
258
+ }, toDisplayString(unref(hasFiles) ? __props.replaceText : __props.clickToUploadText), 11, _hoisted_10)])])]),
238
259
  createElementVNode("input", mergeProps({
239
260
  ref_key: "input",
240
261
  ref: input,
@@ -244,8 +265,8 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
244
265
  disabled: __props.disabled,
245
266
  hidden: "",
246
267
  "data-id": "file-input"
247
- }, unref(getNonRootAttrs)(_ctx.$attrs, ["class", "onChange"]), { onChange: _cache[1] || (_cache[1] = ($event) => onSelect($event)) }), null, 16, _hoisted_10)
248
- ], 2), __props.loading ? (openBlock(), createElementBlock("div", _hoisted_11, [createVNode(RuiProgress_default, {
268
+ }, unref(getNonRootAttrs)(_ctx.$attrs, ["class", "onChange"]), { onChange: _cache[1] || (_cache[1] = ($event) => onSelect($event)) }), null, 16, _hoisted_11)
269
+ ], 2), __props.loading ? (openBlock(), createElementBlock("div", _hoisted_12, [createVNode(RuiProgress_default, {
249
270
  circular: "",
250
271
  variant: __props.progress === void 0 ? "indeterminate" : "determinate",
251
272
  value: __props.progress,
@@ -256,7 +277,7 @@ var RuiFileUpload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
256
277
  class: "text-xs text-rui-text-secondary",
257
278
  "data-id": "progress-label",
258
279
  textContent: toDisplayString(unref(progressLabel))
259
- }, null, 8, _hoisted_12)) : createCommentVNode("", true)])) : createCommentVNode("", true)], 10, _hoisted_1), !__props.hideDetails ? (openBlock(), createBlock(RuiFormTextDetail_default, {
280
+ }, null, 8, _hoisted_13)) : createCommentVNode("", true)])) : createCommentVNode("", true)], 10, _hoisted_1), !__props.hideDetails ? (openBlock(), createBlock(RuiFormTextDetail_default, {
260
281
  key: 0,
261
282
  "error-messages": unref(combinedErrorMessages),
262
283
  hint: __props.hint
@@ -1 +1 @@
1
- {"version":3,"file":"RuiFileUpload.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../../src/components/forms/file-upload/RuiFileUpload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { formatFileSize, getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface FileUploadProps {\n /** File type filter (HTML accept attribute syntax). e.g. '.csv', 'image/*', '.png,.jpg' */\n accept?: string;\n /** Allow multiple file selection. */\n multiple?: boolean;\n disabled?: boolean;\n /** Shows a loading overlay (consumer-driven, e.g. while uploading). */\n loading?: boolean;\n /** Upload progress 0-100. When provided alongside `loading`, the overlay shows a determinate progress bar with percentage. */\n progress?: number;\n /** Renders the success state border/icon. Consumer toggles back to false. */\n uploaded?: boolean;\n /** Optional max size per file in bytes; failures emit `error` and set internal error state. */\n maxSize?: number;\n /** External error messages (e.g. from Vuelidate). Shown via the standard form detail block. */\n errorMessages?: string | string[];\n /** Hint text below the dropzone. */\n hint?: string;\n /** Disable drag-and-drop; the dropzone becomes click-only (matches rotki.com use case). */\n noDrop?: boolean;\n /** Replace the default \"Drag and drop or \\{button\\}\" copy. */\n uploadText?: string;\n /** Label shown on the inline button when no file is selected. */\n clickToUploadText?: string;\n /** Label shown on the inline button when one or more files are already selected. */\n replaceText?: string;\n /** Hide the bottom hint/error details strip. */\n hideDetails?: boolean;\n}\n\ndefineOptions({\n name: 'RuiFileUpload',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<File | File[] | undefined>({ required: true });\n\nconst {\n accept = '*',\n multiple = false,\n disabled = false,\n loading = false,\n progress = undefined,\n uploaded = false,\n maxSize = undefined,\n errorMessages = [],\n hint = '',\n noDrop = false,\n uploadText = 'Drag and drop or',\n clickToUploadText = 'click to upload',\n replaceText = 'replace file',\n hideDetails = false,\n} = defineProps<FileUploadProps>();\n\nconst emit = defineEmits<{\n error: [message: string];\n}>();\n\ndefineSlots<{\n preview?: (props: { files: File[]; remove: () => void }) => any;\n icon?: () => any;\n description?: () => any;\n}>();\n\nconst wrapper = useTemplateRef<HTMLDivElement>('wrapper');\nconst input = useTemplateRef<HTMLInputElement>('input');\nconst internalError = ref<string>('');\n\nconst files = computed<File[]>(() => {\n const value = get(modelValue);\n if (!value)\n return [];\n return Array.isArray(value) ? value : [value];\n});\n\nconst hasFiles = computed<boolean>(() => get(files).length > 0);\n\nconst progressLabel = computed<string | undefined>(() => {\n const value = progress;\n return value === undefined ? undefined : `${Math.round(value)}%`;\n});\n\nconst combinedErrorMessages = computed<string[]>(() => {\n const external = Array.isArray(errorMessages) ? errorMessages : [errorMessages];\n const internal = get(internalError);\n return [...external.filter(Boolean), ...(internal ? [internal] : [])];\n});\n\nconst { hasError } = useFormTextDetail(combinedErrorMessages, () => []);\n\nfunction matchesAccept(file: File, acceptString: string): boolean {\n if (!acceptString || acceptString === '*' || acceptString === '*/*')\n return true;\n\n const fileName = file.name.toLowerCase();\n const fileExtension = fileName.includes('.') ? fileName.slice(fileName.lastIndexOf('.')) : '';\n const fileType = file.type.toLowerCase();\n const acceptTypes = acceptString.split(',').map(value => value.trim().toLowerCase()).filter(Boolean);\n\n return acceptTypes.some((type) => {\n if (type.startsWith('.'))\n return type === fileExtension;\n if (type.endsWith('/*'))\n return fileType.startsWith(type.slice(0, -1));\n return type === fileType;\n });\n}\n\nfunction reportError(message: string): void {\n set(internalError, message);\n emit('error', message);\n}\n\nfunction clearInternalError(): void {\n set(internalError, '');\n}\n\nfunction validate(candidates: File[]): File[] | undefined {\n if (candidates.length === 0)\n return undefined;\n\n if (!multiple && candidates.length > 1) {\n reportError('Only one file can be uploaded');\n return undefined;\n }\n\n for (const file of candidates) {\n if (!matchesAccept(file, accept)) {\n reportError(`Only ${accept} files are allowed`);\n return undefined;\n }\n if (maxSize !== undefined && file.size > maxSize) {\n reportError(`${file.name} exceeds the maximum size of ${formatFileSize(maxSize)}`);\n return undefined;\n }\n }\n\n return candidates;\n}\n\nfunction setFiles(candidates: File[]): void {\n const validated = validate(candidates);\n if (!validated)\n return;\n clearInternalError();\n set(modelValue, multiple ? validated : validated[0]);\n}\n\nfunction removeFile(target?: File): void {\n clearInternalError();\n const inputEl = get(input);\n if (inputEl)\n inputEl.value = '';\n\n if (!target || !multiple) {\n set(modelValue, multiple ? [] : undefined);\n return;\n }\n\n const remaining = get(files).filter(file => file !== target);\n set(modelValue, remaining);\n}\n\nfunction onSelect(event: Event): void {\n const target = event.target as HTMLInputElement;\n if (!target?.files)\n return;\n setFiles(Array.from(target.files));\n}\n\nfunction onDrop(dropped: File[] | null): void {\n if (disabled || noDrop || !dropped || dropped.length === 0)\n return;\n setFiles(dropped);\n}\n\nconst { isOverDropZone } = useDropZone(wrapper, {\n onDrop,\n});\n\nfunction openPicker(): void {\n if (disabled)\n return;\n get(input)?.click();\n}\n\nwatch(() => errorMessages, () => clearInternalError());\n\ndefineExpose({\n removeFile: () => removeFile(),\n openPicker,\n});\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <div\n ref=\"wrapper\"\n class=\"p-4 border border-rui-grey-300 dark:border-rui-grey-800 rounded-md w-full relative border-dashed transition\"\n :class=\"{\n '!border-rui-primary bg-rui-primary/[0.08]': isOverDropZone && !disabled && !noDrop,\n '!border-rui-error !border-solid bg-rui-error/[0.08]': hasError,\n '!border-rui-success !border-solid bg-rui-success/[0.08]': uploaded,\n 'opacity-60 pointer-events-none': disabled,\n }\"\n :data-disabled=\"disabled || undefined\"\n :data-uploaded=\"uploaded || undefined\"\n :data-error=\"hasError ? '' : undefined\"\n :data-drop-active=\"isOverDropZone || undefined\"\n >\n <div\n class=\"flex flex-col items-center justify-center gap-3\"\n :class=\"{ 'opacity-0': loading }\"\n >\n <slot\n name=\"preview\"\n :files=\"files\"\n :remove=\"() => removeFile()\"\n >\n <div\n v-if=\"hasFiles\"\n class=\"flex flex-col gap-1 w-full\"\n data-id=\"file-list\"\n >\n <div\n v-for=\"file in files\"\n :key=\"`${file.name}-${file.lastModified}`\"\n class=\"flex items-center gap-2 bg-rui-primary/[0.08] rounded-full pl-3 pr-1 py-1\"\n data-id=\"file-item\"\n >\n <RuiIcon\n name=\"lu-file\"\n color=\"primary\"\n size=\"20\"\n />\n <div class=\"flex-1 overflow-hidden min-w-0\">\n <div\n class=\"text-sm leading-5 truncate\"\n :title=\"file.name\"\n >\n {{ file.name }}\n </div>\n <div class=\"text-rui-text-secondary text-xs leading-3\">\n {{ formatFileSize(file.size) }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"p-1 rounded-full hover:bg-rui-primary/[0.16] transition\"\n :disabled=\"disabled\"\n :aria-label=\"`Remove ${file.name}`\"\n data-id=\"remove-file\"\n @click=\"removeFile(file)\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"16\"\n />\n </button>\n </div>\n </div>\n <div\n v-else\n class=\"h-10 w-10 rounded-full flex items-center justify-center\"\n :class=\"uploaded ? 'bg-rui-success/[0.12]' : 'bg-rui-primary/[0.12]'\"\n >\n <slot name=\"icon\">\n <RuiIcon\n :name=\"uploaded ? 'lu-circle-check' : 'lu-file-up'\"\n :color=\"uploaded ? 'success' : 'primary'\"\n />\n </slot>\n </div>\n </slot>\n\n <div class=\"text-center text-sm\">\n <slot name=\"description\">\n <div class=\"flex items-center justify-center gap-1 flex-wrap\">\n <span>{{ uploadText }}</span>\n <button\n type=\"button\"\n class=\"text-rui-primary underline disabled:no-underline disabled:text-rui-text-disabled\"\n :disabled=\"disabled\"\n data-id=\"open-picker\"\n @click=\"openPicker()\"\n >\n {{ hasFiles ? replaceText : clickToUploadText }}\n </button>\n </div>\n </slot>\n </div>\n\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n hidden\n data-id=\"file-input\"\n v-bind=\"getNonRootAttrs($attrs, ['class', 'onChange'])\"\n @change=\"onSelect($event)\"\n />\n </div>\n\n <div\n v-if=\"loading\"\n class=\"flex flex-col items-center justify-center absolute h-full w-full top-0 left-0 gap-2\"\n data-id=\"loading\"\n >\n <RuiProgress\n circular\n :variant=\"progress === undefined ? 'indeterminate' : 'determinate'\"\n :value=\"progress\"\n color=\"primary\"\n size=\"40\"\n />\n <div\n v-if=\"progressLabel\"\n class=\"text-xs text-rui-text-secondary\"\n data-id=\"progress-label\"\n v-text=\"progressLabel\"\n />\n </div>\n </div>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n :error-messages=\"combinedErrorMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RuiFileUpload.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../../src/components/forms/file-upload/RuiFileUpload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { RuiIcons } from '@/icons';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { formatFileSize, getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface FileUploadProps {\n /** File type filter (HTML accept attribute syntax). e.g. '.csv', 'image/*', '.png,.jpg' */\n accept?: string;\n /** Allow multiple file selection. */\n multiple?: boolean;\n disabled?: boolean;\n /** Shows a loading overlay (consumer-driven, e.g. while uploading). */\n loading?: boolean;\n /** Upload progress 0-100. When provided alongside `loading`, the overlay shows a determinate progress bar with percentage. */\n progress?: number;\n /** Renders the success state border/icon. Consumer toggles back to false. */\n uploaded?: boolean;\n /** Optional max size per file in bytes; failures emit `error` and set internal error state. */\n maxSize?: number;\n /** External error messages (e.g. from Vuelidate). Shown via the standard form detail block. */\n errorMessages?: string | string[];\n /** Hint text below the dropzone. */\n hint?: string;\n /** Disable drag-and-drop; the dropzone becomes click-only (matches rotki.com use case). */\n noDrop?: boolean;\n /** Replace the default \"Drag and drop or \\{button\\}\" copy. With `noDrop` the default is empty, so only the button shows. */\n uploadText?: string;\n /** Label shown on the inline button when no file is selected. */\n clickToUploadText?: string;\n /** Label shown on the inline button when one or more files are already selected. */\n replaceText?: string;\n /** Hide the bottom hint/error details strip. */\n hideDetails?: boolean;\n}\n\ndefineOptions({\n name: 'RuiFileUpload',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<File | File[] | undefined>({ required: true });\n\nconst {\n accept = '*',\n multiple = false,\n disabled = false,\n loading = false,\n progress = undefined,\n uploaded = false,\n maxSize = undefined,\n errorMessages = [],\n hint = '',\n noDrop = false,\n uploadText = undefined,\n clickToUploadText = 'click to upload',\n replaceText = 'replace file',\n hideDetails = false,\n} = defineProps<FileUploadProps>();\n\nconst emit = defineEmits<{\n error: [message: string];\n}>();\n\ndefineSlots<{\n preview?: (props: { files: File[]; remove: () => void }) => any;\n icon?: () => any;\n description?: () => any;\n}>();\n\nconst wrapper = useTemplateRef<HTMLDivElement>('wrapper');\nconst input = useTemplateRef<HTMLInputElement>('input');\nconst internalError = ref<string>('');\n\nconst files = computed<File[]>(() => {\n const value = get(modelValue);\n if (!value)\n return [];\n return Array.isArray(value) ? value : [value];\n});\n\nconst hasFiles = computed<boolean>(() => get(files).length > 0);\n\nconst progressLabel = computed<string | undefined>(() => {\n const value = progress;\n return value === undefined ? undefined : `${Math.round(value)}%`;\n});\n\nconst combinedErrorMessages = computed<string[]>(() => {\n const external = Array.isArray(errorMessages) ? errorMessages : [errorMessages];\n const internal = get(internalError);\n return [...external.filter(Boolean), ...(internal ? [internal] : [])];\n});\n\nconst { hasError } = useFormTextDetail(combinedErrorMessages, () => []);\n\n// a click-only dropzone does not offer dragging\nconst resolvedUploadText = computed<string>(() => uploadText ?? (noDrop ? '' : 'Drag and drop or'));\n\ntype WellTone = 'primary' | 'error' | 'success';\n\n// the icon well follows the dropzone's state, like its border\nconst wellTone = computed<WellTone>(() => {\n if (get(hasError))\n return 'error';\n if (uploaded)\n return 'success';\n return 'primary';\n});\n\nconst wellIcon = computed<RuiIcons>(() => {\n const tone = get(wellTone);\n if (tone === 'error')\n return 'lu-circle-alert';\n if (tone === 'success')\n return 'lu-circle-check';\n return 'lu-file-up';\n});\n\n// the 10% tint vanishes on a dark page, so dark doubles it\nconst wellClasses: Record<WellTone, string> = {\n primary: 'bg-rui-primary-soft dark:bg-rui-primary/20',\n error: 'bg-rui-error-soft dark:bg-rui-error/20',\n success: 'bg-rui-success-soft dark:bg-rui-success/20',\n};\n\nfunction matchesAccept(file: File, acceptString: string): boolean {\n if (!acceptString || acceptString === '*' || acceptString === '*/*')\n return true;\n\n const fileName = file.name.toLowerCase();\n const fileExtension = fileName.includes('.') ? fileName.slice(fileName.lastIndexOf('.')) : '';\n const fileType = file.type.toLowerCase();\n const acceptTypes = acceptString.split(',').map(value => value.trim().toLowerCase()).filter(Boolean);\n\n return acceptTypes.some((type) => {\n if (type.startsWith('.'))\n return type === fileExtension;\n if (type.endsWith('/*'))\n return fileType.startsWith(type.slice(0, -1));\n return type === fileType;\n });\n}\n\nfunction reportError(message: string): void {\n set(internalError, message);\n emit('error', message);\n}\n\nfunction clearInternalError(): void {\n set(internalError, '');\n}\n\nfunction validate(candidates: File[]): File[] | undefined {\n if (candidates.length === 0)\n return undefined;\n\n if (!multiple && candidates.length > 1) {\n reportError('Only one file can be uploaded');\n return undefined;\n }\n\n for (const file of candidates) {\n if (!matchesAccept(file, accept)) {\n reportError(`Only ${accept} files are allowed`);\n return undefined;\n }\n if (maxSize !== undefined && file.size > maxSize) {\n reportError(`${file.name} exceeds the maximum size of ${formatFileSize(maxSize)}`);\n return undefined;\n }\n }\n\n return candidates;\n}\n\nfunction setFiles(candidates: File[]): void {\n const validated = validate(candidates);\n if (!validated)\n return;\n clearInternalError();\n set(modelValue, multiple ? validated : validated[0]);\n}\n\nfunction removeFile(target?: File): void {\n clearInternalError();\n const inputEl = get(input);\n if (inputEl)\n inputEl.value = '';\n\n if (!target || !multiple) {\n set(modelValue, multiple ? [] : undefined);\n return;\n }\n\n const remaining = get(files).filter(file => file !== target);\n set(modelValue, remaining);\n}\n\nfunction onSelect(event: Event): void {\n const target = event.target;\n if (!(target instanceof HTMLInputElement) || !target.files)\n return;\n const picked = Array.from(target.files);\n // the model owns the selection; a cleared input fires `change` for the same file again\n target.value = '';\n setFiles(picked);\n}\n\nfunction onDrop(dropped: File[] | null): void {\n if (disabled || noDrop || !dropped || dropped.length === 0)\n return;\n setFiles(dropped);\n}\n\nconst { isOverDropZone } = useDropZone(wrapper, {\n onDrop,\n});\n\nfunction openPicker(): void {\n if (disabled)\n return;\n get(input)?.click();\n}\n\nwatch(() => errorMessages, () => clearInternalError());\n\ndefineExpose({\n removeFile: () => removeFile(),\n openPicker,\n});\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <div\n ref=\"wrapper\"\n class=\"p-4 border border-rui-outline dark:border-rui-neutral-400 rounded-rui-panel w-full relative border-dashed transition\"\n :class=\"{\n 'border-rui-primary! bg-rui-primary-subtle': isOverDropZone && !disabled && !noDrop,\n 'border-rui-error! border-solid! bg-rui-error-subtle': hasError,\n 'border-rui-success! border-solid! bg-rui-success-subtle': uploaded,\n 'opacity-60 pointer-events-none': disabled,\n }\"\n :data-disabled=\"disabled || undefined\"\n :data-uploaded=\"uploaded || undefined\"\n :data-error=\"hasError ? '' : undefined\"\n :data-drop-active=\"isOverDropZone || undefined\"\n >\n <div\n class=\"flex flex-col items-center justify-center gap-3\"\n :class=\"{ 'opacity-0': loading }\"\n >\n <slot\n name=\"preview\"\n :files=\"files\"\n :remove=\"() => removeFile()\"\n >\n <div\n v-if=\"hasFiles\"\n class=\"flex flex-col gap-1 w-full\"\n data-id=\"file-list\"\n >\n <div\n v-for=\"file in files\"\n :key=\"`${file.name}-${file.lastModified}`\"\n class=\"flex items-center gap-2 bg-rui-primary-soft dark:bg-rui-primary/20 rounded-full pl-3 pr-1 py-1\"\n data-id=\"file-item\"\n >\n <RuiIcon\n name=\"lu-file\"\n color=\"primary\"\n size=\"20\"\n />\n <div class=\"flex-1 overflow-hidden min-w-0\">\n <div\n class=\"text-sm leading-5 truncate\"\n :title=\"file.name\"\n >\n {{ file.name }}\n </div>\n <div class=\"text-rui-text-secondary text-xs leading-3\">\n {{ formatFileSize(file.size) }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"p-1 rounded-full hover:bg-rui-hover transition focus-visible:focus-ring outline-hidden\"\n :disabled=\"disabled\"\n :aria-label=\"`Remove ${file.name}`\"\n data-id=\"remove-file\"\n @click=\"removeFile(file)\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"16\"\n />\n </button>\n </div>\n </div>\n <div\n v-else\n class=\"h-10 w-10 rounded-full flex items-center justify-center\"\n :class=\"wellClasses[wellTone]\"\n data-id=\"icon-well\"\n >\n <slot name=\"icon\">\n <RuiIcon\n :name=\"wellIcon\"\n :color=\"wellTone\"\n />\n </slot>\n </div>\n </slot>\n\n <div class=\"text-center text-sm\">\n <slot name=\"description\">\n <div class=\"flex items-center justify-center gap-1 flex-wrap\">\n <span v-if=\"resolvedUploadText\">{{ resolvedUploadText }}</span>\n <button\n type=\"button\"\n class=\"text-rui-primary underline disabled:no-underline disabled:text-rui-text-disabled\"\n :class=\"{ 'first-letter:uppercase': !resolvedUploadText }\"\n :disabled=\"disabled\"\n data-id=\"open-picker\"\n @click=\"openPicker()\"\n >\n {{ hasFiles ? replaceText : clickToUploadText }}\n </button>\n </div>\n </slot>\n </div>\n\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n hidden\n data-id=\"file-input\"\n v-bind=\"getNonRootAttrs($attrs, ['class', 'onChange'])\"\n @change=\"onSelect($event)\"\n />\n </div>\n\n <div\n v-if=\"loading\"\n class=\"flex flex-col items-center justify-center absolute h-full w-full top-0 left-0 gap-2\"\n data-id=\"loading\"\n >\n <RuiProgress\n circular\n :variant=\"progress === undefined ? 'indeterminate' : 'determinate'\"\n :value=\"progress\"\n color=\"primary\"\n size=\"40\"\n />\n <div\n v-if=\"progressLabel\"\n class=\"text-xs text-rui-text-secondary\"\n data-id=\"progress-label\"\n v-text=\"progressLabel\"\n />\n </div>\n </div>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n :error-messages=\"combinedErrorMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiRadio.js","names":[],"sources":["../../../../../src/components/forms/radio-button/radio/RuiRadio.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue\">\nimport type { ContextColorsType } from '@/consts/colors';\nimport { checkControlStyles, getCheckControlIconSize } from '@/components/forms/check-control-styles';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface RadioProps<TValue> {\n value: TValue;\n disabled?: boolean;\n color?: ContextColorsType;\n size?: 'sm' | 'lg';\n label?: string;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiRadio',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<TValue>({ required: false });\n\nconst {\n value,\n disabled = false,\n color,\n size,\n label = '',\n hint = '',\n errorMessages = [],\n successMessages = [],\n hideDetails = false,\n required = false,\n} = defineProps<RadioProps<TValue>>();\n\ndefineSlots<{\n default?: () => any;\n}>();\n\nconst { hasError, validation } = useFormTextDetail(\n () => errorMessages,\n () => successMessages,\n);\n\nconst selected = computed<boolean>(() => get(modelValue) === value);\n\nconst ui = computed<ReturnType<typeof checkControlStyles>>(() => checkControlStyles({\n size,\n disabled,\n checked: get(selected),\n validation: get(validation),\n color,\n}));\n\nconst iconSize = computed<number>(() => getCheckControlIconSize(size));\n\nfunction input(event: Event): void {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.checked)\n set(modelValue, value);\n}\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <label\n :class=\"ui.wrapper()\"\n :data-disabled=\"disabled || undefined\"\n :data-checked=\"selected || undefined\"\n :data-error=\"hasError ? '' : undefined\"\n >\n <input\n :checked=\"selected\"\n type=\"radio\"\n :class=\"ui.input()\"\n :disabled=\"disabled\"\n :aria-invalid=\"hasError\"\n v-bind=\"getNonRootAttrs($attrs)\"\n :value=\"value\"\n @input=\"input($event)\"\n />\n <div :class=\"ui.control()\">\n <RuiIcon\n v-if=\"selected\"\n name=\"lu-radio-button-fill\"\n :size=\"iconSize\"\n />\n <RuiIcon\n v-else\n name=\"lu-checkbox-blank-circle\"\n :size=\"iconSize\"\n />\n </div>\n <div\n v-if=\"label || $slots.default\"\n :class=\"ui.label()\"\n >\n <slot>{{ label }}</slot>\n <span\n v-if=\"required\"\n class=\"text-rui-error\"\n >\n ﹡\n </span>\n </div>\n </label>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiRadio.js","names":[],"sources":["../../../../../src/components/forms/radio-button/radio/RuiRadio.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue\">\nimport type { ContextColorsType } from '@/consts/colors';\nimport { checkControlStyles } from '@/components/forms/check-control-styles';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface RadioProps<TValue> {\n value: TValue;\n disabled?: boolean;\n color?: ContextColorsType;\n size?: 'sm' | 'lg';\n label?: string;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiRadio',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<TValue>({ required: false });\n\nconst {\n value,\n disabled = false,\n color,\n size,\n label = '',\n hint = '',\n errorMessages = [],\n successMessages = [],\n hideDetails = false,\n required = false,\n} = defineProps<RadioProps<TValue>>();\n\ndefineSlots<{\n default?: () => any;\n}>();\n\nconst { hasError, validation } = useFormTextDetail(\n () => errorMessages,\n () => successMessages,\n);\n\nconst selected = computed<boolean>(() => get(modelValue) === value);\n\nconst ui = computed<ReturnType<typeof checkControlStyles>>(() => checkControlStyles({\n size,\n shape: 'round',\n disabled,\n checked: get(selected),\n validation: get(validation),\n color: color ?? 'grey',\n}));\n\nfunction input(event: Event): void {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.checked)\n set(modelValue, value);\n}\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <label\n :class=\"ui.wrapper()\"\n :data-disabled=\"disabled || undefined\"\n :data-checked=\"selected || undefined\"\n :data-error=\"hasError ? '' : undefined\"\n >\n <input\n :checked=\"selected\"\n type=\"radio\"\n :class=\"ui.input()\"\n :disabled=\"disabled\"\n :aria-invalid=\"hasError\"\n v-bind=\"getNonRootAttrs($attrs)\"\n :value=\"value\"\n @input=\"input($event)\"\n />\n <div :class=\"ui.control()\">\n <span\n :class=\"ui.mark()\"\n data-mark\n :data-state=\"selected ? 'checked' : 'unchecked'\"\n >\n <span\n v-if=\"selected\"\n :class=\"ui.dot()\"\n />\n </span>\n </div>\n <div\n v-if=\"label || $slots.default\"\n :class=\"ui.label()\"\n >\n <slot>{{ label }}</slot>\n <span\n v-if=\"required\"\n class=\"text-rui-error\"\n >\n *\n </span>\n </div>\n </label>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n"],"mappings":""}
@@ -1,10 +1,9 @@
1
- import RuiIcon_default from "../../../icons/RuiIcon.js";
1
+ import { get, set } from "../../../../vendor/@vueuse/shared/dist/index.js";
2
2
  import { useFormTextDetail } from "../../../../utils/form-text-detail.js";
3
3
  import RuiFormTextDetail_default from "../../../helpers/RuiFormTextDetail.js";
4
4
  import { getNonRootAttrs, getRootAttrs } from "../../../../utils/helpers.js";
5
- import { checkControlStyles, getCheckControlIconSize } from "../../check-control-styles.js";
5
+ import { checkControlStyles } from "../../check-control-styles.js";
6
6
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, guardReactiveProps, mergeModels, mergeProps, normalizeClass, normalizeProps, openBlock, renderSlot, toDisplayString, unref, useModel } from "vue";
7
- import { get, set } from "@vueuse/shared";
8
7
  //#region src/components/forms/radio-button/radio/RuiRadio.vue?vue&type=script&setup=true&lang.ts
9
8
  var _hoisted_1 = [
10
9
  "data-disabled",
@@ -17,7 +16,8 @@ var _hoisted_2 = [
17
16
  "aria-invalid",
18
17
  "value"
19
18
  ];
20
- var _hoisted_3 = {
19
+ var _hoisted_3 = ["data-state"];
20
+ var _hoisted_4 = {
21
21
  key: 0,
22
22
  class: "text-rui-error"
23
23
  };
@@ -56,12 +56,12 @@ var RuiRadio_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
56
56
  const selected = computed(() => get(modelValue) === __props.value);
57
57
  const ui = computed(() => checkControlStyles({
58
58
  size: __props.size,
59
+ shape: "round",
59
60
  disabled: __props.disabled,
60
61
  checked: get(selected),
61
62
  validation: get(validation),
62
- color: __props.color
63
+ color: __props.color ?? "grey"
63
64
  }));
64
- const iconSize = computed(() => getCheckControlIconSize(__props.size));
65
65
  function input(event) {
66
66
  const target = event.target;
67
67
  if (target instanceof HTMLInputElement && target.checked) set(modelValue, __props.value);
@@ -83,19 +83,18 @@ var RuiRadio_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
83
83
  value: __props.value,
84
84
  onInput: _cache[0] || (_cache[0] = ($event) => input($event))
85
85
  }), null, 16, _hoisted_2),
86
- createElementVNode("div", { class: normalizeClass(unref(ui).control()) }, [unref(selected) ? (openBlock(), createBlock(RuiIcon_default, {
86
+ createElementVNode("div", { class: normalizeClass(unref(ui).control()) }, [createElementVNode("span", {
87
+ class: normalizeClass(unref(ui).mark()),
88
+ "data-mark": "",
89
+ "data-state": unref(selected) ? "checked" : "unchecked"
90
+ }, [unref(selected) ? (openBlock(), createElementBlock("span", {
87
91
  key: 0,
88
- name: "lu-radio-button-fill",
89
- size: unref(iconSize)
90
- }, null, 8, ["size"])) : (openBlock(), createBlock(RuiIcon_default, {
91
- key: 1,
92
- name: "lu-checkbox-blank-circle",
93
- size: unref(iconSize)
94
- }, null, 8, ["size"]))], 2),
92
+ class: normalizeClass(unref(ui).dot())
93
+ }, null, 2)) : createCommentVNode("", true)], 10, _hoisted_3)], 2),
95
94
  __props.label || _ctx.$slots.default ? (openBlock(), createElementBlock("div", {
96
95
  key: 0,
97
96
  class: normalizeClass(unref(ui).label())
98
- }, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.label), 1)]), __props.required ? (openBlock(), createElementBlock("span", _hoisted_3, " ﹡ ")) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)
97
+ }, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.label), 1)]), __props.required ? (openBlock(), createElementBlock("span", _hoisted_4, " * ")) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)
99
98
  ], 10, _hoisted_1), !__props.hideDetails ? (openBlock(), createBlock(RuiFormTextDetail_default, {
100
99
  key: 0,
101
100
  "error-messages": __props.errorMessages,
@@ -1 +1 @@
1
- {"version":3,"file":"RuiRadio.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots"],"sources":["../../../../../src/components/forms/radio-button/radio/RuiRadio.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue\">\nimport type { ContextColorsType } from '@/consts/colors';\nimport { checkControlStyles, getCheckControlIconSize } from '@/components/forms/check-control-styles';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface RadioProps<TValue> {\n value: TValue;\n disabled?: boolean;\n color?: ContextColorsType;\n size?: 'sm' | 'lg';\n label?: string;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiRadio',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<TValue>({ required: false });\n\nconst {\n value,\n disabled = false,\n color,\n size,\n label = '',\n hint = '',\n errorMessages = [],\n successMessages = [],\n hideDetails = false,\n required = false,\n} = defineProps<RadioProps<TValue>>();\n\ndefineSlots<{\n default?: () => any;\n}>();\n\nconst { hasError, validation } = useFormTextDetail(\n () => errorMessages,\n () => successMessages,\n);\n\nconst selected = computed<boolean>(() => get(modelValue) === value);\n\nconst ui = computed<ReturnType<typeof checkControlStyles>>(() => checkControlStyles({\n size,\n disabled,\n checked: get(selected),\n validation: get(validation),\n color,\n}));\n\nconst iconSize = computed<number>(() => getCheckControlIconSize(size));\n\nfunction input(event: Event): void {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.checked)\n set(modelValue, value);\n}\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <label\n :class=\"ui.wrapper()\"\n :data-disabled=\"disabled || undefined\"\n :data-checked=\"selected || undefined\"\n :data-error=\"hasError ? '' : undefined\"\n >\n <input\n :checked=\"selected\"\n type=\"radio\"\n :class=\"ui.input()\"\n :disabled=\"disabled\"\n :aria-invalid=\"hasError\"\n v-bind=\"getNonRootAttrs($attrs)\"\n :value=\"value\"\n @input=\"input($event)\"\n />\n <div :class=\"ui.control()\">\n <RuiIcon\n v-if=\"selected\"\n name=\"lu-radio-button-fill\"\n :size=\"iconSize\"\n />\n <RuiIcon\n v-else\n name=\"lu-checkbox-blank-circle\"\n :size=\"iconSize\"\n />\n </div>\n <div\n v-if=\"label || $slots.default\"\n :class=\"ui.label()\"\n >\n <slot>{{ label }}</slot>\n <span\n v-if=\"required\"\n class=\"text-rui-error\"\n >\n ﹡\n </span>\n </div>\n </label>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BA,MAAM,aAAa,SAAmB,SAAA,YAAoB;EAmB1D,MAAM,EAAE,UAAU,eAAe,wBACzB,QAAA,qBACA,QAAA,eACR;EAEA,MAAM,WAAW,eAAwB,IAAI,UAAU,MAAM,QAAA,KAAK;EAElE,MAAM,KAAK,eAAsD,mBAAmB;GAClF,MAAG,QAAA;GACH,UAAO,QAAA;GACP,SAAS,IAAI,QAAQ;GACrB,YAAY,IAAI,UAAU;GAC1B,OAAI,QAAA;EACN,CAAC,CAAC;EAEF,MAAM,WAAW,eAAuB,wBAAwB,QAAA,IAAI,CAAC;EAErE,SAAS,MAAM,OAAoB;GACjC,MAAM,SAAS,MAAM;GACrB,IAAI,kBAAkB,oBAAoB,OAAO,SAC/C,IAAI,YAAY,QAAA,KAAK;EACzB;;GAIE,OAAA,UAAA,GAAA,mBAgDM,OAAA,eAAA,mBAhDO,MAAA,YAAA,CAAY,CAACA,KAAAA,MAAM,CAAA,CAAA,GAAA,CAC9B,mBAwCQ,SAAA;IAvCL,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA;IACjB,iBAAe,QAAA,YAAY,KAAA;IAC3B,gBAAc,MAAA,QAAA,KAAY,KAAA;IAC1B,cAAY,MAAA,QAAA,IAAQ,KAAQ,KAAA;;IAE7B,mBASE,SATF,WASE;KARC,SAAS,MAAA,QAAA;KACV,MAAK;KACJ,OAAO,MAAA,EAAA,CAAE,CAAC,MAAK;KACf,UAAU,QAAA;KACV,gBAAc,MAAA,QAAA;IACP,GAAA,MAAA,eAAA,CAAe,CAACA,KAAAA,MAAM,GAAA;KAC7B,OAAO,QAAA;KACP,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAM,MAAM;;IAEtB,mBAWM,OAAA,EAXA,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA,EAAA,GAAA,CAEb,MAAA,QAAA,KADR,UAAA,GAAA,YAIE,iBAAA;;KAFA,MAAK;KACJ,MAAM,MAAA,QAAA;IAET,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,MAAA,UAAA,GAAA,YAIE,iBAAA;;KAFA,MAAK;KACJ,MAAM,MAAA,QAAA;;IAIH,QAAA,SAASC,KAAAA,OAAO,WADxB,UAAA,GAAA,mBAWM,OAAA;;KATH,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,MAAK,CAAA;IAEhB,GAAA,CAAA,WAAwB,KAAA,QAAA,WAAA,CAAA,SAAA,CAAf,gBAAA,gBAAA,QAAA,KAAK,GAAA,CAAA,CAAA,CAAA,GAEN,QAAA,YADR,UAAA,GAAA,mBAKO,QALP,YAGC,KAED,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;GAIK,GAAA,IAAA,UAAA,GAAA,CAAA,QAAA,eADT,UAAA,GAAA,YAKE,2BAAA;;IAHC,kBAAgB,QAAA;IAChB,oBAAkB,QAAA;IAClB,MAAM,QAAA"}
1
+ {"version":3,"file":"RuiRadio.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots"],"sources":["../../../../../src/components/forms/radio-button/radio/RuiRadio.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TValue\">\nimport type { ContextColorsType } from '@/consts/colors';\nimport { checkControlStyles } from '@/components/forms/check-control-styles';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport { useFormTextDetail } from '@/utils/form-text-detail';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface RadioProps<TValue> {\n value: TValue;\n disabled?: boolean;\n color?: ContextColorsType;\n size?: 'sm' | 'lg';\n label?: string;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiRadio',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<TValue>({ required: false });\n\nconst {\n value,\n disabled = false,\n color,\n size,\n label = '',\n hint = '',\n errorMessages = [],\n successMessages = [],\n hideDetails = false,\n required = false,\n} = defineProps<RadioProps<TValue>>();\n\ndefineSlots<{\n default?: () => any;\n}>();\n\nconst { hasError, validation } = useFormTextDetail(\n () => errorMessages,\n () => successMessages,\n);\n\nconst selected = computed<boolean>(() => get(modelValue) === value);\n\nconst ui = computed<ReturnType<typeof checkControlStyles>>(() => checkControlStyles({\n size,\n shape: 'round',\n disabled,\n checked: get(selected),\n validation: get(validation),\n color: color ?? 'grey',\n}));\n\nfunction input(event: Event): void {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.checked)\n set(modelValue, value);\n}\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <label\n :class=\"ui.wrapper()\"\n :data-disabled=\"disabled || undefined\"\n :data-checked=\"selected || undefined\"\n :data-error=\"hasError ? '' : undefined\"\n >\n <input\n :checked=\"selected\"\n type=\"radio\"\n :class=\"ui.input()\"\n :disabled=\"disabled\"\n :aria-invalid=\"hasError\"\n v-bind=\"getNonRootAttrs($attrs)\"\n :value=\"value\"\n @input=\"input($event)\"\n />\n <div :class=\"ui.control()\">\n <span\n :class=\"ui.mark()\"\n data-mark\n :data-state=\"selected ? 'checked' : 'unchecked'\"\n >\n <span\n v-if=\"selected\"\n :class=\"ui.dot()\"\n />\n </span>\n </div>\n <div\n v-if=\"label || $slots.default\"\n :class=\"ui.label()\"\n >\n <slot>{{ label }}</slot>\n <span\n v-if=\"required\"\n class=\"text-rui-error\"\n >\n *\n </span>\n </div>\n </label>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBA,MAAM,aAAa,SAAmB,SAAA,YAAoB;EAmB1D,MAAM,EAAE,UAAU,eAAe,wBACzB,QAAA,qBACA,QAAA,eACR;EAEA,MAAM,WAAW,eAAwB,IAAI,UAAU,MAAM,QAAA,KAAK;EAElE,MAAM,KAAK,eAAsD,mBAAmB;GAClF,MAAG,QAAA;GACH,OAAO;GACP,UAAO,QAAA;GACP,SAAS,IAAI,QAAQ;GACrB,YAAY,IAAI,UAAU;GAC1B,OAAO,QAAA,SAAS;EAClB,CAAC,CAAC;EAEF,SAAS,MAAM,OAAoB;GACjC,MAAM,SAAS,MAAM;GACrB,IAAI,kBAAkB,oBAAoB,OAAO,SAC/C,IAAI,YAAY,QAAA,KAAK;EACzB;;GAIE,OAAA,UAAA,GAAA,mBAgDM,OAAA,eAAA,mBAhDO,MAAA,YAAA,CAAY,CAACA,KAAAA,MAAM,CAAA,CAAA,GAAA,CAC9B,mBAwCQ,SAAA;IAvCL,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA;IACjB,iBAAe,QAAA,YAAY,KAAA;IAC3B,gBAAc,MAAA,QAAA,KAAY,KAAA;IAC1B,cAAY,MAAA,QAAA,IAAQ,KAAQ,KAAA;;IAE7B,mBASE,SATF,WASE;KARC,SAAS,MAAA,QAAA;KACV,MAAK;KACJ,OAAO,MAAA,EAAA,CAAE,CAAC,MAAK;KACf,UAAU,QAAA;KACV,gBAAc,MAAA,QAAA;IACP,GAAA,MAAA,eAAA,CAAe,CAACA,KAAAA,MAAM,GAAA;KAC7B,OAAO,QAAA;KACP,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAM,MAAM;;IAEtB,mBAWM,OAAA,EAXA,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA,EAAA,GAAA,CACrB,mBASO,QAAA;KARJ,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,KAAI,CAAA;KACf,aAAA;KACC,cAAY,MAAA,QAAA,IAAQ,YAAA;IAGb,GAAA,CAAA,MAAA,QAAA,KADR,UAAA,GAAA,mBAGE,QAAA;;KADC,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,IAAG,CAAA;;IAKZ,QAAA,SAASC,KAAAA,OAAO,WADxB,UAAA,GAAA,mBAWM,OAAA;;KATH,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,MAAK,CAAA;IAEhB,GAAA,CAAA,WAAwB,KAAA,QAAA,WAAA,CAAA,SAAA,CAAf,gBAAA,gBAAA,QAAA,KAAK,GAAA,CAAA,CAAA,CAAA,GAEN,QAAA,YADR,UAAA,GAAA,mBAKO,QALP,YAGC,KAED,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;GAIK,GAAA,IAAA,UAAA,GAAA,CAAA,QAAA,eADT,UAAA,GAAA,YAKE,2BAAA;;IAHC,kBAAgB,QAAA;IAChB,oBAAkB,QAAA;IAClB,MAAM,QAAA"}