@witchcraft/ui 0.3.26 → 0.4.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/README.md +54 -61
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +1 -1
  4. package/dist/runtime/assets/animations.css +1 -1
  5. package/dist/runtime/assets/locales/en.json +2 -0
  6. package/dist/runtime/build/WitchcraftUiResolver.js +2 -2
  7. package/dist/runtime/components/TestControls/TestControls.vue +3 -3
  8. package/dist/runtime/components/WButton/WButton.d.vue.ts +34 -0
  9. package/dist/runtime/components/{LibButton/LibButton.vue → WButton/WButton.vue} +26 -38
  10. package/dist/runtime/components/WButton/WButton.vue.d.ts +34 -0
  11. package/dist/runtime/components/WCheckbox/WCheckbox.d.vue.ts +33 -0
  12. package/dist/runtime/components/WCheckbox/WCheckbox.vue +110 -0
  13. package/dist/runtime/components/WCheckbox/WCheckbox.vue.d.ts +33 -0
  14. package/dist/runtime/components/WColorInput/WColorInput.d.vue.ts +45 -0
  15. package/dist/runtime/components/WColorInput/WColorInput.vue +85 -0
  16. package/dist/runtime/components/WColorInput/WColorInput.vue.d.ts +45 -0
  17. package/dist/runtime/components/WColorInput/WColorSwatchButton.d.vue.ts +28 -0
  18. package/dist/runtime/components/WColorInput/WColorSwatchButton.vue +86 -0
  19. package/dist/runtime/components/WColorInput/WColorSwatchButton.vue.d.ts +28 -0
  20. package/dist/runtime/components/{LibColorPicker/LibColorPicker.d.vue.ts → WColorPicker/WColorPicker.d.vue.ts} +7 -6
  21. package/dist/runtime/components/{LibColorPicker/LibColorPicker.vue → WColorPicker/WColorPicker.vue} +41 -29
  22. package/dist/runtime/components/{LibColorPicker/LibColorPicker.vue.d.ts → WColorPicker/WColorPicker.vue.d.ts} +7 -6
  23. package/dist/runtime/components/WCombobox/WCombobox.d.vue.ts +111 -0
  24. package/dist/runtime/components/WCombobox/WCombobox.vue +405 -0
  25. package/dist/runtime/components/WCombobox/WCombobox.vue.d.ts +111 -0
  26. package/dist/runtime/components/WCombobox/storyPlays.d.ts +18 -0
  27. package/dist/runtime/components/WCombobox/storyPlays.js +68 -0
  28. package/dist/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.d.vue.ts → WDarkModeSwitcher/WDarkModeSwitcher.d.vue.ts} +8 -13
  29. package/dist/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.vue → WDarkModeSwitcher/WDarkModeSwitcher.vue} +11 -14
  30. package/dist/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.vue.d.ts → WDarkModeSwitcher/WDarkModeSwitcher.vue.d.ts} +8 -13
  31. package/dist/runtime/components/WDatePicker/WDatePicker.d.vue.ts +40 -0
  32. package/dist/runtime/components/{LibDatePicker/LibDatePicker.vue → WDatePicker/WDatePicker.vue} +3 -7
  33. package/dist/runtime/components/WDatePicker/WDatePicker.vue.d.ts +40 -0
  34. package/dist/runtime/components/{LibDatePicker/LibRangeDatePicker.vue → WDatePicker/WRangeDatePicker.vue} +21 -21
  35. package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.vue → WDatePicker/WSingleDatePicker.vue} +21 -21
  36. package/dist/runtime/components/{LibDatePicker/LibTimeZonePicker.d.vue.ts → WDatePicker/WTimeZonePicker.d.vue.ts} +1 -11
  37. package/dist/runtime/components/{LibDatePicker/LibTimeZonePicker.vue → WDatePicker/WTimeZonePicker.vue} +5 -12
  38. package/dist/runtime/components/{LibDatePicker/LibTimeZonePicker.vue.d.ts → WDatePicker/WTimeZonePicker.vue.d.ts} +1 -11
  39. package/dist/runtime/components/{LibDebug/LibDebug.vue → WDebug/WDebug.vue} +10 -12
  40. package/dist/runtime/components/{LibDevOnly/LibDevOnly.d.vue.ts → WDevOnly/WDevOnly.d.vue.ts} +0 -3
  41. package/dist/runtime/components/{LibDevOnly/LibDevOnly.vue.d.ts → WDevOnly/WDevOnly.vue.d.ts} +0 -3
  42. package/dist/runtime/components/WFileInput/WFileInput.d.vue.ts +58 -0
  43. package/dist/runtime/components/{LibFileInput/LibFileInput.vue → WFileInput/WFileInput.vue} +74 -57
  44. package/dist/runtime/components/WFileInput/WFileInput.vue.d.ts +58 -0
  45. package/dist/runtime/components/{Icon/Icon.vue.d.ts → WIcon/WIcon.d.vue.ts} +2 -6
  46. package/dist/runtime/components/{Icon/Icon.vue → WIcon/WIcon.vue} +1 -1
  47. package/dist/runtime/components/{Icon/Icon.d.vue.ts → WIcon/WIcon.vue.d.ts} +2 -6
  48. package/dist/runtime/components/{LibMultiValues/LibMultiValues.d.vue.ts → WMultiValues/WMultiValues.d.vue.ts} +8 -14
  49. package/dist/runtime/components/WMultiValues/WMultiValues.vue +150 -0
  50. package/dist/runtime/components/{LibMultiValues/LibMultiValues.vue.d.ts → WMultiValues/WMultiValues.vue.d.ts} +8 -14
  51. package/dist/runtime/components/WNotifications/WNotification.d.vue.ts +37 -0
  52. package/dist/runtime/components/{LibNotifications/LibNotification.vue → WNotifications/WNotification.vue} +34 -47
  53. package/dist/runtime/components/WNotifications/WNotification.vue.d.ts +37 -0
  54. package/dist/runtime/components/WNotifications/WNotifications.d.vue.ts +11 -0
  55. package/dist/runtime/components/{LibNotifications/LibNotifications.vue → WNotifications/WNotifications.vue} +35 -17
  56. package/dist/runtime/components/WNotifications/WNotifications.vue.d.ts +11 -0
  57. package/dist/runtime/components/WNumberInput/WNumberInput.d.vue.ts +27 -0
  58. package/dist/runtime/components/WNumberInput/WNumberInput.vue +96 -0
  59. package/dist/runtime/components/WNumberInput/WNumberInput.vue.d.ts +27 -0
  60. package/dist/runtime/components/WPagination/WPagination.d.vue.ts +59 -0
  61. package/dist/runtime/components/WPagination/WPagination.vue +182 -0
  62. package/dist/runtime/components/WPagination/WPagination.vue.d.ts +59 -0
  63. package/dist/runtime/components/WPalette/WPalette.d.vue.ts +11 -0
  64. package/dist/runtime/components/{LibPalette/LibPalette.vue → WPalette/WPalette.vue} +3 -8
  65. package/dist/runtime/components/WPalette/WPalette.vue.d.ts +11 -0
  66. package/dist/runtime/components/WPopover/WPopover.d.vue.ts +45 -0
  67. package/dist/runtime/components/WPopover/WPopover.vue +144 -0
  68. package/dist/runtime/components/WPopover/WPopover.vue.d.ts +45 -0
  69. package/dist/runtime/components/WPopup/WPopup.d.vue.ts +51 -0
  70. package/dist/runtime/components/WPopup/WPopup.vue +106 -0
  71. package/dist/runtime/components/WPopup/WPopup.vue.d.ts +51 -0
  72. package/dist/runtime/components/{LibProgressBar/LibProgressBar.d.vue.ts → WProgressBar/WProgressBar.d.vue.ts} +14 -18
  73. package/dist/runtime/components/WProgressBar/WProgressBar.vue +150 -0
  74. package/dist/runtime/components/{LibProgressBar/LibProgressBar.vue.d.ts → WProgressBar/WProgressBar.vue.d.ts} +14 -18
  75. package/dist/runtime/components/{LibRecorder/LibRecorder.d.vue.ts → WRecorder/WRecorder.d.vue.ts} +14 -29
  76. package/dist/runtime/components/{LibRecorder/LibRecorder.vue → WRecorder/WRecorder.vue} +37 -36
  77. package/dist/runtime/components/{LibRecorder/LibRecorder.vue.d.ts → WRecorder/WRecorder.vue.d.ts} +14 -29
  78. package/dist/runtime/components/{LibRoot/LibRoot.d.vue.ts → WRoot/WRoot.d.vue.ts} +6 -5
  79. package/dist/runtime/components/{LibRoot/LibRoot.vue → WRoot/WRoot.vue} +17 -15
  80. package/dist/runtime/components/{LibRoot/LibRoot.vue.d.ts → WRoot/WRoot.vue.d.ts} +6 -5
  81. package/dist/runtime/components/{LibSimpleInput/LibSimpleInput.d.vue.ts → WSimpleInput/WSimpleInput.d.vue.ts} +10 -16
  82. package/dist/runtime/components/{LibSimpleInput/LibSimpleInput.vue → WSimpleInput/WSimpleInput.vue} +14 -24
  83. package/dist/runtime/components/{LibSimpleInput/LibSimpleInput.vue.d.ts → WSimpleInput/WSimpleInput.vue.d.ts} +10 -16
  84. package/dist/runtime/components/WTable/WTable.d.vue.ts +102 -0
  85. package/dist/runtime/components/{LibTable/LibTable.vue → WTable/WTable.vue} +13 -14
  86. package/dist/runtime/components/WTable/WTable.vue.d.ts +102 -0
  87. package/dist/runtime/components/WTooltip/WTooltip.d.vue.ts +40 -0
  88. package/dist/runtime/components/WTooltip/WTooltip.vue +112 -0
  89. package/dist/runtime/components/WTooltip/WTooltip.vue.d.ts +40 -0
  90. package/dist/runtime/components/index.d.ts +20 -20
  91. package/dist/runtime/components/index.js +20 -20
  92. package/dist/runtime/composables/index.d.ts +4 -4
  93. package/dist/runtime/composables/index.js +4 -4
  94. package/dist/runtime/composables/useDelayedLoadingIndicator.d.ts +9 -0
  95. package/dist/runtime/composables/useDelayedLoadingIndicator.js +18 -0
  96. package/dist/runtime/composables/useDisplayForReka.d.ts +25 -0
  97. package/dist/runtime/composables/useDisplayForReka.js +16 -0
  98. package/dist/runtime/composables/useFallbackId.d.ts +3 -0
  99. package/dist/runtime/composables/useFallbackId.js +5 -0
  100. package/dist/runtime/composables/useInjectedDarkMode.d.ts +1 -1
  101. package/dist/runtime/composables/usePopupConstrainToStyle.d.ts +8 -0
  102. package/dist/runtime/composables/usePopupConstrainToStyle.js +8 -0
  103. package/dist/runtime/composables/useSetupDarkMode.d.ts +2 -3
  104. package/dist/runtime/composables/useSetupDarkMode.js +90 -4
  105. package/dist/runtime/helpers/NotificationHandler.d.ts +2 -2
  106. package/dist/runtime/injectionKeys.d.ts +1 -5
  107. package/dist/runtime/injectionKeys.js +0 -2
  108. package/dist/runtime/types/index.d.ts +85 -27
  109. package/dist/runtime/types/index.js +1 -0
  110. package/package.json +1 -1
  111. package/src/module.ts +1 -1
  112. package/src/runtime/assets/animations.css +3 -3
  113. package/src/runtime/assets/locales/en.json +2 -0
  114. package/src/runtime/build/WitchcraftUiResolver.ts +2 -2
  115. package/src/runtime/components/TestControls/TestControls.vue +3 -3
  116. package/src/runtime/components/WButton/WButton.stories.ts +112 -0
  117. package/src/runtime/components/{LibButton/LibButton.vue → WButton/WButton.vue} +34 -50
  118. package/src/runtime/components/{LibCheckbox/LibCheckbox.stories.ts → WCheckbox/WCheckbox.stories.ts} +5 -5
  119. package/src/runtime/components/WCheckbox/WCheckbox.vue +125 -0
  120. package/src/runtime/components/{LibColorInput/LibColorInput.stories.ts → WColorInput/WColorInput.stories.ts} +8 -8
  121. package/src/runtime/components/WColorInput/WColorInput.vue +112 -0
  122. package/src/runtime/components/WColorInput/WColorSwatchButton.vue +102 -0
  123. package/src/runtime/components/{LibColorPicker/LibColorPicker.stories.ts → WColorPicker/WColorPicker.stories.ts} +12 -12
  124. package/src/runtime/components/{LibColorPicker/LibColorPicker.vue → WColorPicker/WColorPicker.vue} +44 -31
  125. package/src/runtime/components/WCombobox/WCombobox.stories.ts +209 -0
  126. package/src/runtime/components/WCombobox/WCombobox.vue +450 -0
  127. package/src/runtime/components/WCombobox/storyPlays.ts +92 -0
  128. package/src/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.stories.ts → WDarkModeSwitcher/WDarkModeSwitcher.stories.ts} +6 -6
  129. package/src/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.vue → WDarkModeSwitcher/WDarkModeSwitcher.vue} +19 -30
  130. package/src/runtime/components/{LibDatePicker/LibDatePicker.stories.ts → WDatePicker/WDatePicker.stories.ts} +42 -34
  131. package/src/runtime/components/{LibDatePicker/LibDatePicker.vue → WDatePicker/WDatePicker.vue} +3 -7
  132. package/src/runtime/components/{LibDatePicker/LibRangeDatePicker.vue → WDatePicker/WRangeDatePicker.vue} +21 -21
  133. package/src/runtime/components/{LibDatePicker/LibSingleDatePicker.vue → WDatePicker/WSingleDatePicker.vue} +21 -21
  134. package/src/runtime/components/{LibDatePicker/LibTimeZonePicker.vue → WDatePicker/WTimeZonePicker.vue} +5 -12
  135. package/src/runtime/components/{LibDebug/LibDebug.stories.ts → WDebug/WDebug.stories.ts} +5 -5
  136. package/src/runtime/components/{LibDebug/LibDebug.vue → WDebug/WDebug.vue} +9 -10
  137. package/src/runtime/components/{LibDevOnly/LibDevOnly.vue → WDevOnly/WDevOnly.vue} +0 -4
  138. package/src/runtime/components/{LibFileInput/LibFileInput.stories.ts → WFileInput/WFileInput.stories.ts} +7 -7
  139. package/src/runtime/components/{LibFileInput/LibFileInput.vue → WFileInput/WFileInput.vue} +98 -97
  140. package/src/runtime/components/{Icon/Icon.vue → WIcon/WIcon.vue} +5 -8
  141. package/src/runtime/components/{LibMultiValues/LibMultiValues.stories.ts → WMultiValues/WMultiValues.stories.ts} +9 -9
  142. package/src/runtime/components/WMultiValues/WMultiValues.vue +163 -0
  143. package/src/runtime/components/{LibNotifications/LibNotification.stories.ts → WNotifications/WNotification.stories.ts} +9 -9
  144. package/src/runtime/components/{LibNotifications/LibNotification.vue → WNotifications/WNotification.vue} +45 -65
  145. package/src/runtime/components/WNotifications/WNotifications.stories.ts +139 -0
  146. package/src/runtime/components/{LibNotifications/LibNotifications.vue → WNotifications/WNotifications.vue} +51 -29
  147. package/src/runtime/components/WNumberInput/WNumberInput.vue +109 -0
  148. package/src/runtime/components/WPagination/WPagination.stories.ts +51 -0
  149. package/src/runtime/components/WPagination/WPagination.vue +207 -0
  150. package/src/runtime/components/{LibPalette/LibPalette.stories.ts → WPalette/WPalette.stories.ts} +6 -6
  151. package/src/runtime/components/{LibPalette/LibPalette.vue → WPalette/WPalette.vue} +3 -8
  152. package/src/runtime/components/WPopover/WPopover.stories.ts +218 -0
  153. package/src/runtime/components/WPopover/WPopover.vue +168 -0
  154. package/src/runtime/components/WPopup/WPopup.stories.ts +104 -0
  155. package/src/runtime/components/WPopup/WPopup.vue +125 -0
  156. package/src/runtime/components/WProgressBar/WProgressBar.stories.ts +119 -0
  157. package/src/runtime/components/WProgressBar/WProgressBar.vue +185 -0
  158. package/src/runtime/components/{LibRecorder/LibRecorder.stories.ts → WRecorder/WRecorder.stories.ts} +9 -6
  159. package/src/runtime/components/{LibRecorder/LibRecorder.vue → WRecorder/WRecorder.vue} +69 -68
  160. package/src/runtime/components/{LibRoot/LibRoot.vue → WRoot/WRoot.vue} +18 -15
  161. package/src/runtime/components/{LibSimpleInput/LibSimpleInput.stories.ts → WSimpleInput/WSimpleInput.stories.ts} +11 -12
  162. package/src/runtime/components/{LibSimpleInput/LibSimpleInput.vue → WSimpleInput/WSimpleInput.vue} +28 -44
  163. package/src/runtime/components/{LibTable/LibTable.stories.ts → WTable/WTable.stories.ts} +60 -52
  164. package/src/runtime/components/{LibTable/LibTable.vue → WTable/WTable.vue} +85 -88
  165. package/src/runtime/components/WTooltip/WTooltip.stories.ts +82 -0
  166. package/src/runtime/components/WTooltip/WTooltip.vue +128 -0
  167. package/src/runtime/components/index.ts +20 -20
  168. package/src/runtime/composables/index.ts +4 -4
  169. package/src/runtime/composables/useDelayedLoadingIndicator.ts +30 -0
  170. package/src/runtime/composables/useDisplayForReka.ts +37 -0
  171. package/src/runtime/composables/useFallbackId.ts +6 -0
  172. package/src/runtime/composables/useInjectedDarkMode.ts +1 -2
  173. package/src/runtime/composables/usePopupConstrainToStyle.ts +29 -0
  174. package/src/runtime/composables/useSetupDarkMode.ts +122 -4
  175. package/src/runtime/helpers/NotificationHandler.ts +2 -2
  176. package/src/runtime/injectionKeys.ts +1 -7
  177. package/src/runtime/types/index.ts +105 -32
  178. package/types/components.d.ts +14 -15
  179. package/dist/runtime/components/Aria/Aria.d.vue.ts +0 -6
  180. package/dist/runtime/components/Aria/Aria.vue +0 -16
  181. package/dist/runtime/components/Aria/Aria.vue.d.ts +0 -6
  182. package/dist/runtime/components/LibButton/LibButton.d.vue.ts +0 -37
  183. package/dist/runtime/components/LibButton/LibButton.vue.d.ts +0 -37
  184. package/dist/runtime/components/LibCheckbox/LibCheckbox.d.vue.ts +0 -41
  185. package/dist/runtime/components/LibCheckbox/LibCheckbox.vue +0 -103
  186. package/dist/runtime/components/LibCheckbox/LibCheckbox.vue.d.ts +0 -41
  187. package/dist/runtime/components/LibColorInput/LibColorInput.d.vue.ts +0 -64
  188. package/dist/runtime/components/LibColorInput/LibColorInput.vue +0 -162
  189. package/dist/runtime/components/LibColorInput/LibColorInput.vue.d.ts +0 -64
  190. package/dist/runtime/components/LibDatePicker/LibDatePicker.d.vue.ts +0 -191
  191. package/dist/runtime/components/LibDatePicker/LibDatePicker.vue.d.ts +0 -191
  192. package/dist/runtime/components/LibFileInput/LibFileInput.d.vue.ts +0 -46
  193. package/dist/runtime/components/LibFileInput/LibFileInput.vue.d.ts +0 -46
  194. package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.d.vue.ts +0 -256
  195. package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.vue +0 -387
  196. package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.vue.d.ts +0 -256
  197. package/dist/runtime/components/LibLabel/LibLabel.d.vue.ts +0 -27
  198. package/dist/runtime/components/LibLabel/LibLabel.vue +0 -45
  199. package/dist/runtime/components/LibLabel/LibLabel.vue.d.ts +0 -27
  200. package/dist/runtime/components/LibMultiValues/LibMultiValues.vue +0 -109
  201. package/dist/runtime/components/LibNotifications/LibNotification.d.vue.ts +0 -45
  202. package/dist/runtime/components/LibNotifications/LibNotification.vue.d.ts +0 -45
  203. package/dist/runtime/components/LibNotifications/LibNotifications.d.vue.ts +0 -15
  204. package/dist/runtime/components/LibNotifications/LibNotifications.vue.d.ts +0 -15
  205. package/dist/runtime/components/LibPagination/LibPagination.d.vue.ts +0 -105
  206. package/dist/runtime/components/LibPagination/LibPagination.vue +0 -229
  207. package/dist/runtime/components/LibPagination/LibPagination.vue.d.ts +0 -105
  208. package/dist/runtime/components/LibPalette/LibPalette.d.vue.ts +0 -15
  209. package/dist/runtime/components/LibPalette/LibPalette.vue.d.ts +0 -15
  210. package/dist/runtime/components/LibPopup/LibPopup.d.vue.ts +0 -52
  211. package/dist/runtime/components/LibPopup/LibPopup.vue +0 -365
  212. package/dist/runtime/components/LibPopup/LibPopup.vue.d.ts +0 -52
  213. package/dist/runtime/components/LibProgressBar/LibProgressBar.vue +0 -169
  214. package/dist/runtime/components/LibSuggestions/LibSuggestions.d.vue.ts +0 -99
  215. package/dist/runtime/components/LibSuggestions/LibSuggestions.vue +0 -178
  216. package/dist/runtime/components/LibSuggestions/LibSuggestions.vue.d.ts +0 -99
  217. package/dist/runtime/components/LibTable/LibTable.d.vue.ts +0 -125
  218. package/dist/runtime/components/LibTable/LibTable.vue.d.ts +0 -125
  219. package/dist/runtime/components/Template/NAME.d.vue.ts +0 -18
  220. package/dist/runtime/components/Template/NAME.vue +0 -27
  221. package/dist/runtime/components/Template/NAME.vue.d.ts +0 -18
  222. package/dist/runtime/components/Template/TemplateStory.d.ts +0 -7
  223. package/dist/runtime/components/Template/TemplateStory.js +0 -22
  224. package/dist/runtime/components/shared/props.d.ts +0 -171
  225. package/dist/runtime/components/shared/props.js +0 -2
  226. package/dist/runtime/composables/useAriaLabel.d.ts +0 -6
  227. package/dist/runtime/composables/useAriaLabel.js +0 -15
  228. package/dist/runtime/composables/useDarkMode.d.ts +0 -77
  229. package/dist/runtime/composables/useDarkMode.js +0 -89
  230. package/dist/runtime/composables/useDivideAttrs.d.ts +0 -27
  231. package/dist/runtime/composables/useDivideAttrs.js +0 -27
  232. package/dist/runtime/composables/useSuggestions.d.ts +0 -40
  233. package/dist/runtime/composables/useSuggestions.js +0 -263
  234. package/src/runtime/components/Aria/Aria.vue +0 -26
  235. package/src/runtime/components/LibButton/LibButton.stories.ts +0 -106
  236. package/src/runtime/components/LibCheckbox/LibCheckbox.vue +0 -131
  237. package/src/runtime/components/LibColorInput/LibColorInput.vue +0 -203
  238. package/src/runtime/components/LibInputDeprecated/LibInputDeprecated.stories.ts +0 -405
  239. package/src/runtime/components/LibInputDeprecated/LibInputDeprecated.vue +0 -419
  240. package/src/runtime/components/LibLabel/LibLabel.stories.ts +0 -33
  241. package/src/runtime/components/LibLabel/LibLabel.vue +0 -65
  242. package/src/runtime/components/LibMultiValues/LibMultiValues.vue +0 -123
  243. package/src/runtime/components/LibNotifications/LibNotifications.stories.ts +0 -131
  244. package/src/runtime/components/LibPagination/LibPagination.stories.ts +0 -49
  245. package/src/runtime/components/LibPagination/LibPagination.vue +0 -274
  246. package/src/runtime/components/LibPopup/LibPopup.stories.ts +0 -153
  247. package/src/runtime/components/LibPopup/LibPopup.vue +0 -396
  248. package/src/runtime/components/LibProgressBar/LibProgressBar.stories.ts +0 -90
  249. package/src/runtime/components/LibProgressBar/LibProgressBar.vue +0 -197
  250. package/src/runtime/components/LibSuggestions/LibSuggestions.stories.ts +0 -134
  251. package/src/runtime/components/LibSuggestions/LibSuggestions.vue +0 -212
  252. package/src/runtime/components/Template/NAME.vue +0 -49
  253. package/src/runtime/components/Template/TemplateStory.ts +0 -37
  254. package/src/runtime/components/shared/props.ts +0 -199
  255. package/src/runtime/composables/useAriaLabel.ts +0 -23
  256. package/src/runtime/composables/useDarkMode.ts +0 -199
  257. package/src/runtime/composables/useDivideAttrs.ts +0 -53
  258. package/src/runtime/composables/useSuggestions.ts +0 -339
  259. /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToHsva.d.ts +0 -0
  260. /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToHsva.js +0 -0
  261. /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToRgba.d.ts +0 -0
  262. /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToRgba.js +0 -0
  263. /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/toLowPrecisionRgbaString.d.ts +0 -0
  264. /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/toLowPrecisionRgbaString.js +0 -0
  265. /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/truncate.d.ts +0 -0
  266. /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/truncate.js +0 -0
  267. /package/dist/runtime/components/{LibDatePicker/LibRangeDatePicker.d.vue.ts → WDatePicker/WRangeDatePicker.d.vue.ts} +0 -0
  268. /package/dist/runtime/components/{LibDatePicker/LibRangeDatePicker.vue.d.ts → WDatePicker/WRangeDatePicker.vue.d.ts} +0 -0
  269. /package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.d.vue.ts → WDatePicker/WSingleDatePicker.d.vue.ts} +0 -0
  270. /package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.vue.d.ts → WDatePicker/WSingleDatePicker.vue.d.ts} +0 -0
  271. /package/dist/runtime/components/{LibDatePicker → WDatePicker}/helpers.d.ts +0 -0
  272. /package/dist/runtime/components/{LibDatePicker → WDatePicker}/helpers.js +0 -0
  273. /package/dist/runtime/components/{LibDebug/LibDebug.d.vue.ts → WDebug/WDebug.d.vue.ts} +0 -0
  274. /package/dist/runtime/components/{LibDebug/LibDebug.vue.d.ts → WDebug/WDebug.vue.d.ts} +0 -0
  275. /package/dist/runtime/components/{LibDevOnly/LibDevOnly.vue → WDevOnly/WDevOnly.vue} +0 -0
  276. /package/dist/runtime/components/{LibNotifications/LibNotificationTestMessageComponent.d.vue.ts → WNotifications/WNotificationTestMessageComponent.d.vue.ts} +0 -0
  277. /package/dist/runtime/components/{LibNotifications/LibNotificationTestMessageComponent.vue → WNotifications/WNotificationTestMessageComponent.vue} +0 -0
  278. /package/dist/runtime/components/{LibNotifications/LibNotificationTestMessageComponent.vue.d.ts → WNotifications/WNotificationTestMessageComponent.vue.d.ts} +0 -0
  279. /package/dist/runtime/components/{LibNotifications → WNotifications}/calculateNotificationProgress.d.ts +0 -0
  280. /package/dist/runtime/components/{LibNotifications → WNotifications}/calculateNotificationProgress.js +0 -0
  281. /package/src/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToHsva.ts +0 -0
  282. /package/src/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToRgba.ts +0 -0
  283. /package/src/runtime/components/{LibColorPicker → WColorPicker}/utils/toLowPrecisionRgbaString.ts +0 -0
  284. /package/src/runtime/components/{LibColorPicker → WColorPicker}/utils/truncate.ts +0 -0
  285. /package/src/runtime/components/{LibDatePicker → WDatePicker}/helpers.ts +0 -0
  286. /package/src/runtime/components/{LibNotifications/LibNotificationTestMessageComponent.vue → WNotifications/WNotificationTestMessageComponent.vue} +0 -0
  287. /package/src/runtime/components/{LibNotifications → WNotifications}/calculateNotificationProgress.ts +0 -0
@@ -14,20 +14,19 @@
14
14
  >
15
15
  <div class="debug--header flex justify-between">
16
16
  <span class="debug--title font-bold">{{ title }}</span>
17
- <LibButton
17
+ <WButton
18
18
  class="debug--copy-button w-min-content"
19
19
  @click="copy()"
20
20
  >
21
- <icon><i-fa6-regular-copy/></icon>
22
- </LibButton>
21
+ <WIcon><i-lucide-copy/></WIcon>
22
+ </WButton>
23
23
  </div>
24
24
  <pre
25
25
  v-if="value"
26
26
  :class="`
27
27
  debug--value
28
- [tab-size:${tab}]
29
- `
30
- "
28
+ `"
29
+ :style="`tab-size:${tab}`"
31
30
  >{{ getStringValue(value) }}</pre>
32
31
  <pre v-if="value === undefined"><slot/></pre>
33
32
  </div>
@@ -36,10 +35,10 @@
36
35
  <script setup lang="ts">
37
36
  import { useSlots } from "vue"
38
37
 
39
- import IFa6RegularCopy from "~icons/fa-regular/copy"
38
+ import ILucideCopy from "~icons/lucide/copy"
40
39
 
41
- import Icon from "../Icon/Icon.vue"
42
- import LibButton from "../LibButton/LibButton.vue"
40
+ import WButton from "../WButton/WButton.vue"
41
+ import WIcon from "../WIcon/WIcon.vue"
43
42
 
44
43
  const $slots = useSlots()
45
44
 
@@ -100,7 +99,7 @@ const copy = (): void => {
100
99
  * The value can be undefined, it will just display undefined.
101
100
  */
102
101
  export default {
103
- name: "LibDebug"
102
+ name: "WDebug"
104
103
  // https://v3.vuejs.org/guide/typescript-support.html#annotating-props
105
104
  }
106
105
  </script>
@@ -40,10 +40,6 @@ const doShow = computed(() => props.show || injectedShow.value)
40
40
  </script>
41
41
 
42
42
  <script lang="ts">
43
- export interface Props {
44
- show?: boolean
45
- }
46
-
47
43
  // Not sure why nuxt's types aren't correctly getting detected
48
44
  // This should be enough to bypass the type lint error.
49
45
  declare module "vue" {
@@ -2,12 +2,12 @@
2
2
  import type { Meta, StoryObj } from "@storybook/vue3"
3
3
  import { ref } from "vue"
4
4
 
5
- import LibFileInput from "./LibFileInput.vue"
5
+ import WFileInput from "./WFileInput.vue"
6
6
 
7
7
  import * as components from "../index.js"
8
8
 
9
- const meta: Meta<typeof LibFileInput> = {
10
- component: LibFileInput,
9
+ const meta: Meta<typeof WFileInput> = {
10
+ component: WFileInput,
11
11
  title: "Components/FileInput",
12
12
  args: {
13
13
 
@@ -15,7 +15,7 @@ const meta: Meta<typeof LibFileInput> = {
15
15
  }
16
16
 
17
17
  export default meta
18
- type Story = StoryObj<typeof LibFileInput>
18
+ type Story = StoryObj<typeof WFileInput>
19
19
 
20
20
  export const SingleFile: Story = {
21
21
  render: args => ({
@@ -30,7 +30,7 @@ export const SingleFile: Story = {
30
30
  return { args, errorHandler, errors }
31
31
  },
32
32
  template: `
33
- <lib-file-input v-bind="{...args}" @errors="errorHandler"></lib-file-input>
33
+ <WFileInput v-bind="{...args}" @errors="errorHandler"></WFileInput>
34
34
  <div
35
35
  v-if="errors.length > 0"
36
36
  class="border-2 border-red-500 rounded-lg p-2 mt-2 w-full"
@@ -79,8 +79,8 @@ export const ErrorHandling: Story = {
79
79
  }
80
80
  },
81
81
  template: `
82
- <lib-debug :title="'Errors'">{{errors}}</lib-debug>
83
- <lib-file-input v-bind="{...args}" @errors="errorHandler"></lib-file-input>
82
+ <WDebug :title="'Errors'">{{errors}}</WDebug>
83
+ <WFileInput v-bind="{...args}" @errors="errorHandler"></WFileInput>
84
84
  `
85
85
  })
86
86
  }
@@ -1,5 +1,4 @@
1
1
  <template>
2
- <!-- todo aria errors -->
3
2
  <div
4
3
  :class="twMerge(`
5
4
  file-input
@@ -23,11 +22,11 @@
23
22
  rounded-xl
24
23
  p-2
25
24
  `,
26
- errors.length > 0 && errorFlashing && `border-danger-400`,
27
25
  isHovered && `bg-accent-500/10`,
28
- ($.wrapperAttrs as any).class
26
+ errors.length > 0 && isErrored && `errored border-red-400 hover:border-red-500`,
27
+ wrapperAttrs?.class
29
28
  )"
30
- v-bind="{ ...$.wrapperAttrs, class: undefined }"
29
+ v-bind="{ ...wrapperAttrs, class: undefined }"
31
30
  @drop="onDrop"
32
31
  @dragover.prevent="isHovered = true"
33
32
  @dragleave="isHovered = false"
@@ -49,7 +48,7 @@
49
48
  )"
50
49
  >
51
50
  <label
52
- :for="id ?? fallbackId"
51
+ :for="finalId"
53
52
  :class="twMerge(`
54
53
  file-input--label
55
54
  pointer-events-none
@@ -65,7 +64,7 @@
65
64
  v-if="compact || multiple || files.length === 0"
66
65
  name="icon"
67
66
  >
68
- <icon><i-fa6-solid-arrow-up-from-bracket/></icon>
67
+ <WIcon><i-lucide-upload/></WIcon>
69
68
  </slot>
70
69
  <slot name="label">
71
70
  <div class="text-ellipsis overflow-hidden shrink-1 hidden @min-[15ch]:block">
@@ -110,7 +109,7 @@
110
109
  </div>
111
110
  </label>
112
111
  <input
113
- :id="id ?? fallbackId"
112
+ :id="finalId"
114
113
  :class="twMerge(`
115
114
  file-input--input
116
115
  absolute
@@ -120,13 +119,15 @@
120
119
  text-[0]
121
120
  opacity-0
122
121
  `,
123
- ($.inputAttrs as any)?.class
122
+ inputAttrs?.class
124
123
  )"
125
124
  type="file"
126
125
  :accept="formats.join(', ')"
127
126
  :multiple="multiple"
127
+ v-bind="{ ...inputAttrs, class: undefined }"
128
+ :aria-invalid="errors.length > 0"
129
+ :aria-errormessage="errors.map(_ => _.message).join(', ')"
128
130
  ref="el"
129
- v-bind="{ ...$.inputAttrs, class: undefined }"
130
131
  @input="(inputFile as any)"
131
132
  @click="($event.target! as any).value = null"
132
133
  >
@@ -139,8 +140,7 @@
139
140
  `,
140
141
  multiple && `
141
142
  w-full
142
- `,
143
- ($.previewsAttrs as any)?.class
143
+ `
144
144
  )"
145
145
  >
146
146
  <div
@@ -170,14 +170,14 @@
170
170
  :key="entry.file.name"
171
171
  >
172
172
  <div class="flex flex-initial basis-full justify-start items-center max-w-full gap-2 px-1">
173
- <lib-button
173
+ <WButton
174
174
  :border="false"
175
175
  class="file-input--remove-button rounded-full p-0"
176
176
  :aria-label="`Remove file ${entry.file.name}`"
177
177
  @click="removeFile(entry)"
178
178
  >
179
- <icon><i-fa6-solid-xmark/></icon>
180
- </lib-button>
179
+ <WIcon><i-lucide-x/></WIcon>
180
+ </Wbutton>
181
181
  <div
182
182
  class="file-input--preview-filename min-w-0 flex-1 basis-0 truncate break-all rounded-sm text-sm"
183
183
  :title="entry.file.name"
@@ -197,7 +197,7 @@
197
197
  >
198
198
  <img
199
199
  class="max-h-full w-auto"
200
- :src="getSrc(entry.file)"
200
+ :src="entry.previewUrl"
201
201
  >
202
202
  </div>
203
203
  <div
@@ -207,41 +207,86 @@
207
207
  flex-1 basis-full flex-wrap items-center justify-center
208
208
  "
209
209
  >
210
- <icon><i-fa6-regular-file class="text-4xl opacity-50"/></icon>
210
+ <WIcon><i-lucide-file class="text-4xl opacity-50"/></WIcon>
211
211
  </div>
212
212
  </div>
213
213
  </div>
214
214
  </div>
215
+ <div
216
+ v-if="!compact && errors.length > 0"
217
+ class="file-input--errors flex flex-col gap-2 text-sm text-red-600 dark:text-red-400 items-center px-2"
218
+ >
219
+ <div
220
+ class="file-input--error text-center"
221
+ v-for="error of errors"
222
+ :key="error.message"
223
+ >
224
+ {{ error.message }}
225
+ </div>
226
+ </div>
215
227
  </div>
216
228
  </template>
217
229
 
218
230
  <script setup lang="ts">
219
- import { computed, type HTMLAttributes, type InputHTMLAttributes, ref, shallowReactive, watch } from "vue"
231
+ import type { HTMLAttributes, InputHTMLAttributes } from "vue"
232
+ import { computed, onBeforeUnmount, ref, shallowReactive, watch } from "vue"
220
233
 
221
- import IFa6RegularFile from "~icons/fa6-regular/file"
222
- import IFa6SolidArrowUpFromBracket from "~icons/fa6-solid/arrow-up-from-bracket"
223
- import IFa6SolidXmark from "~icons/fa6-solid/xmark"
234
+ import ILucideFile from "~icons/lucide/file"
235
+ import ILucideUpload from "~icons/lucide/upload"
236
+ import ILucideX from "~icons/lucide/x"
224
237
 
225
- import { useDivideAttrs } from "../../composables/useDivideAttrs.js"
238
+ import { useFallbackId } from "../../composables/useFallbackId.js"
226
239
  import { useInjectedI18n } from "../../composables/useInjectedI18n.js"
227
- import type { FileInputError } from "../../types/index.js"
240
+ import type { FileInputError, TailwindClassProp } from "../../types/index.js"
228
241
  import { twMerge } from "../../utils/twMerge.js"
229
- import Icon from "../Icon/Icon.vue"
230
- import LibButton from "../LibButton/LibButton.vue"
231
- import { getFallbackId, type LinkableByIdProps, type TailwindClassProp, type WrapperProps } from "../shared/props.js"
242
+ import WButton from "../WButton/WButton.vue"
243
+ import WIcon from "../WIcon/WIcon.vue"
232
244
 
233
245
  const t = useInjectedI18n()
234
246
  const el = ref<null | HTMLInputElement>(null)
235
- type Entry = { file: File, isImg: boolean }
247
+
248
+
249
+ const props = withDefaults(defineProps<
250
+ & {
251
+ id?: string
252
+ multiple?: boolean
253
+ /**
254
+ * A list of extensions or mime types to add to the input's accept. Basic validations are done so that files match an extension and mimeType, but note that a file could still be lying, all files should be validated server side.
255
+ *
256
+ * Pass an empty array to allow any filetype.
257
+ */
258
+ formats?: string[]
259
+ compact?: boolean
260
+ inputAttrs?: Omit<InputHTMLAttributes, "class"> & TailwindClassProp
261
+ wrapperAttrs?: Omit<HTMLAttributes, "class"> & TailwindClassProp
262
+ }
263
+ >(), {
264
+ multiple: false,
265
+ formats: () => ["image/*", ".jpeg", ".jpg", ".png"],
266
+ compact: false
267
+ })
268
+ const finalId = useFallbackId(props)
269
+
270
+ const emits = defineEmits<{
271
+ (e: "input", val: File[], clearFiles: () => void): void
272
+ (e: "errors", val: FileInputError[], clearErrors: () => void): void
273
+ }>()
274
+
275
+ type Entry = { file: File } & ({ isImg: true, previewUrl: string } | { isImg: false, previewUrl: undefined })
236
276
 
237
277
  const files = shallowReactive<(Entry)[]>([])
238
278
  const errors = shallowReactive<(FileInputError)[]>([])
239
- const errorFlashing = ref(false)
279
+ const isErrored = ref(false)
240
280
  const isHovered = ref(false)
241
281
 
242
-
243
282
  function clearFiles() {
244
- el.value!.value = ""
283
+ if (el.value) {
284
+ // not sure why sometimes el.value is undefined but it can be
285
+ el.value.value = ""
286
+ }
287
+ for (const entry of files) {
288
+ if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl)
289
+ }
245
290
  files.splice(0, files.length)
246
291
  }
247
292
 
@@ -250,45 +295,37 @@ watch(files, () => {
250
295
  })
251
296
  watch(errors, () => {
252
297
  if (errors.length > 0) {
253
- errorFlashing.value = true
254
- setTimeout(() => {
255
- errorFlashing.value = false
256
- }, 500)
257
- emits("errors", [...errors])
258
- errors.splice(0, errors.length)
298
+ isErrored.value = true
299
+ emits("errors", [...errors], clearErrors)
259
300
  }
260
301
  })
261
302
 
303
+ function clearErrors() {
304
+ isErrored.value = false
305
+ errors.splice(0, errors.length)
306
+ }
307
+
262
308
  defineOptions({
263
- name: "LibFileInput",
309
+ name: "WFileInput",
264
310
  inheritAttrs: false
265
311
  })
266
- const $ = useDivideAttrs(["wrapper", "input", "previews"] as const)
267
-
268
- const emits = defineEmits<{
269
- (e: "input", val: File[], clearFiles: () => void): void
270
- (e: "errors", val: FileInputError[]): void
271
- }>()
272
-
273
- const fallbackId = getFallbackId()
274
- const props = withDefaults(defineProps<Props>(), {
275
- multiple: false,
276
- formats: () => ["image/*", ".jpeg", ".jpg", ".png"],
277
- compact: false
278
- })
279
312
 
280
313
  const mimeTypes = computed(() => props.formats?.filter(_ => !_.startsWith(".")) ?? [])
281
314
  const extensions = computed(() => props.formats?.filter(_ => _.startsWith(".")) ?? [])
282
315
 
283
- const getSrc = (file: File) => {
284
- const src = URL.createObjectURL(file)
285
- return src
286
- }
287
316
 
288
- const removeFile = (entry: Entry) => {
317
+ onBeforeUnmount(() => {
318
+ for (const entry of files) {
319
+ if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl)
320
+ }
321
+ })
322
+
323
+ function removeFile(entry: Entry) {
324
+ if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl)
289
325
  const index = files.indexOf(entry)
290
- files.splice(index, 1)
326
+ if (index > -1) files.splice(index, 1)
291
327
  }
328
+
292
329
  const extensionsList = computed(() => extensions.value.join(", "))
293
330
 
294
331
  function onDrop(e: DragEvent) {
@@ -327,13 +364,14 @@ function updateFiles(filesList: FileList): boolean | undefined {
327
364
  errs.push(err)
328
365
  continue
329
366
  }
367
+ const previewUrl = isImg ? URL.createObjectURL(file) : undefined
330
368
  if (errs.length > 0) continue
331
369
  if (!files.find(_ => _.file === file)) {
332
370
  if ((props.multiple || files.length < 1)
333
371
  ) {
334
- files.push({ file, isImg })
372
+ files.push({ file, isImg, previewUrl: previewUrl as any })
335
373
  } else {
336
- files.splice(0, files.length, { file, isImg })
374
+ files.splice(0, files.length, { file, isImg, previewUrl: previewUrl as any })
337
375
  }
338
376
  }
339
377
  }
@@ -341,51 +379,14 @@ function updateFiles(filesList: FileList): boolean | undefined {
341
379
  errors.splice(0, errors.length, ...errs)
342
380
  return false
343
381
  } else if (errors.length > 0) {
344
- errors.splice(0, errors.length)
382
+ clearErrors()
345
383
  }
346
384
  return undefined
347
385
  }
348
386
 
349
387
  defineExpose({
350
- clearFiles
388
+ clearFiles,
389
+ clearErrors
351
390
  })
352
391
  </script>
353
392
 
354
- <script lang="ts">
355
- export default { name: "LibFileInput" }
356
-
357
- type WrapperTypes
358
- = & WrapperProps<
359
- "input",
360
- // https://github.com/vuejs/core/pull/14237
361
- Omit<InputHTMLAttributes, "autocomplete">
362
- >
363
- & WrapperProps<"wrapper", HTMLAttributes>
364
- & WrapperProps<"previews", HTMLAttributes>
365
-
366
- type RealProps
367
- = & LinkableByIdProps
368
- & {
369
- multiple?: boolean
370
- /**
371
- * A list of extensions or mime types to add to the input's accept. Basic validations are done so that files match an extension and mimeType, but note that a file could still be lying, all files should be validated server side.
372
- *
373
- * Pass an empty array to allow any filetype.
374
- */
375
- formats?: string[]
376
- compact?: boolean
377
- }
378
-
379
- interface Props
380
- extends
381
- /** @vue-ignore */
382
- Partial<Omit<
383
- InputHTMLAttributes,
384
- "class" | "multiple" | "formats" | "compact"
385
- // https://github.com/vuejs/core/pull/14237
386
- | "autocomplete"
387
- > & TailwindClassProp>,
388
- /** @vue-ignore */
389
- Partial<WrapperTypes>,
390
- RealProps { }
391
- </script>
@@ -19,7 +19,9 @@ defineOptions({
19
19
 
20
20
  const $attrs = useAttrs() as any
21
21
 
22
- /* const props = */defineProps<Props>()
22
+ defineProps<
23
+ & /** @vue-ignore */ Omit<HTMLAttributes, "class">
24
+ >()
23
25
  </script>
24
26
 
25
27
  <script lang="ts">
@@ -27,13 +29,8 @@ const $attrs = useAttrs() as any
27
29
  * Just a very simple wrapper for wrapping unplugin-icons in an inline-block div so the icon in the slot take's up a normal line height when it's alone.
28
30
  *
29
31
  * ```vue
30
- * <icon><i-...></icon>
32
+ * <WIcon><i-...></WIcon>
31
33
  * ``
32
34
  */
33
-
34
- interface Props
35
- extends
36
- /** @vue-ignore */
37
- Partial<Omit<HTMLAttributes, "class">
38
- > { }
35
+ export default { name: "Icon" }
39
36
  </script>
@@ -2,22 +2,22 @@
2
2
  import type { Meta, StoryObj } from "@storybook/vue3"
3
3
  import { ref } from "vue"
4
4
 
5
- import LibMultiValues from "./LibMultiValues.vue"
5
+ import WMultiValues from "./WMultiValues.vue"
6
6
 
7
7
  import * as components from "../index.js"
8
8
 
9
9
  const meta = {
10
- component: LibMultiValues as any,
10
+ component: WMultiValues as any,
11
11
  title: "Components/MultiValues",
12
12
  args: {
13
13
  modelValue: ["A", "B", "C"],
14
14
  border: true
15
15
  },
16
16
  tags: ["!test"]
17
- } satisfies Meta<typeof LibMultiValues> & Meta<{ custom: string }>
17
+ } satisfies Meta<typeof WMultiValues>
18
18
 
19
19
  export default meta
20
- type Story = StoryObj<typeof LibMultiValues> // & StoryObj<typeof extraArgs>
20
+ type Story = StoryObj<typeof WMultiValues>
21
21
 
22
22
  /**
23
23
  * The multi-value component is just the values part beneath the input.
@@ -28,10 +28,10 @@ type Story = StoryObj<typeof LibMultiValues> // & StoryObj<typeof extraArgs>
28
28
  */
29
29
  export const Primary: Story = {
30
30
  render: args => ({
31
- components: { ...components, LibMultiValues },
31
+ components: { ...components, WMultiValues },
32
32
  setup: () => {
33
33
  const inputValue = ref("B")
34
- const multiValueEl = ref<typeof LibMultiValues | null>(null)
34
+ const multiValueEl = ref<typeof WMultiValues | null>(null)
35
35
  const onKeydownEnter = (e: KeyboardEvent): void => {
36
36
  if (e.key === "Enter") (args.modelValue!).push(inputValue.value)
37
37
  }
@@ -47,14 +47,14 @@ export const Primary: Story = {
47
47
  <p>Simple Input connected to multi-value.</p>
48
48
  <p>Note: You will be able to add values, including duplicates, even to the disabled/readonly version in this test, see the Input component for a properly connected approach.</p>
49
49
  <p> Press enter to add value :</p>
50
- <lib-simple-input
50
+ <WSimpleInput
51
51
  v-model="inputValue"
52
52
  @keydown="onKeydownEnter"
53
53
  >
54
- </lib-simple-input>
54
+ </WSimpleInput>
55
55
  <p>Multi-value component: </p>
56
56
  <div class="flex justify-start">
57
- <lib-multi-values
57
+ <WMultiValues
58
58
  ref="multiValueEl"
59
59
  v-bind="args"
60
60
  v-model="args.modelValue"
@@ -0,0 +1,163 @@
1
+ <template>
2
+ <div
3
+ v-if="$modelValue && $modelValue?.length > 0"
4
+ role="list"
5
+ :class="twMerge(`
6
+ multivalues
7
+ group
8
+ flex
9
+ flex-initial
10
+ items-center
11
+ justify-center
12
+ gap-1
13
+ overflow-x-scroll
14
+ scrollbar-hidden
15
+ `,
16
+ ($attrs as any)?.class)
17
+ "
18
+ :data-disabled="disabled"
19
+ :data-read-only="readonly"
20
+ :aria-label="label ? `Values for ${label}` : undefined"
21
+ v-bind="{ ...$attrs, class: undefined }"
22
+ @keydown="handleKeydown"
23
+ >
24
+ <div
25
+ role="listitem"
26
+ :data-border="border"
27
+ :class="twMerge(`
28
+ multivalues--item
29
+ flex-basis-0
30
+ min-w-2
31
+ flex
32
+ max-w-fit
33
+ flex-1
34
+ items-center
35
+ gap-0.5
36
+ overflow-hidden
37
+ px-1
38
+ text-xs
39
+ leading-none
40
+ focus-outline
41
+ outlined:outline-offset-0
42
+ `,
43
+ !(disabled || readonly) && `
44
+ group-focus:text-accent-500
45
+ focus:text-accent-500`,
46
+ border && `
47
+ rounded-sm
48
+ border-neutral-400
49
+ border
50
+ focus:border-accent-400
51
+ `,
52
+ border && (disabled || readonly) && `
53
+ border-neutral-200
54
+ focus:border-neutral-200
55
+ dark:border-neutral-800
56
+ dark:focus:border-neutral-800
57
+ `,
58
+ itemAttrs?.class
59
+ )"
60
+ :tabindex="canEdit ? (activeIndex === index ? 0 : -1) : undefined"
61
+ v-for="(value, index) of $modelValue"
62
+ :key="value"
63
+ ref="itemRefs"
64
+ @keydown.ctrl.c.prevent="copy(value.toString())"
65
+ @focus="activeIndex = index"
66
+ >
67
+ <span class="multivalues--label truncate">{{ value }}</span>
68
+ <WButton
69
+ class="multivalues--remove-button !p-0 text-sm !leading-none"
70
+ :aria-label="`Remove ${value}`"
71
+ :border="false"
72
+ :disabled="disabled || readonly"
73
+ tabindex="-1"
74
+ @click="removeVal(value)"
75
+ >
76
+ <WIcon><i-lucide-x/></WIcon>
77
+ </Wbutton>
78
+ </div>
79
+ </div>
80
+ </template>
81
+
82
+ <script setup lang="ts" generic="T extends string | number">
83
+ import { removeIfIn } from "@alanscodelog/utils/removeIfIn"
84
+ import { computed, type HTMLAttributes, nextTick, ref, useAttrs } from "vue"
85
+
86
+ import ILucideX from "~icons/lucide/x"
87
+
88
+ import { copy } from "../../helpers/copy.js"
89
+ import type { BaseInteractiveProps, TailwindClassProp } from "../../types/index.js"
90
+ import { twMerge } from "../../utils/twMerge.js"
91
+ import WButton from "../WButton/WButton.vue"
92
+ import WIcon from "../WIcon/WIcon.vue"
93
+
94
+ defineOptions({
95
+ name: "WMultiValues",
96
+ inheritAttrs: false
97
+ })
98
+
99
+ const $attrs = useAttrs()
100
+ const props = withDefaults(defineProps<
101
+ & BaseInteractiveProps
102
+ & {
103
+ label?: string
104
+ border?: boolean
105
+ itemAttrs?: Omit<HTMLAttributes, "class"> & TailwindClassProp
106
+ }
107
+ & /** @vue-ignore */ Omit<HTMLAttributes, "class">
108
+ & /** @vue-ignore */ TailwindClassProp
109
+ >(), {
110
+ border: true
111
+ })
112
+
113
+ const canEdit = computed(() => !props.disabled && !props.readonly)
114
+ const $modelValue = defineModel<T[]>({ default: () => [] })
115
+ const itemRefs = ref<HTMLElement[]>([])
116
+ const activeIndex = ref(0)
117
+
118
+
119
+ function removeVal(value: T) {
120
+ if (!canEdit.value) return
121
+ removeIfIn($modelValue.value, value)
122
+
123
+ if ($modelValue.value.length > 0) {
124
+ if (activeIndex.value >= $modelValue.value.length) {
125
+ activeIndex.value = $modelValue.value.length - 1
126
+ }
127
+ nextTick(() => {
128
+ itemRefs.value[activeIndex.value]?.focus()
129
+ })
130
+ }
131
+ }
132
+
133
+ function handleKeydown(e: KeyboardEvent) {
134
+ if (props.disabled) return
135
+
136
+ const len = $modelValue.value.length
137
+ if (len === 0) return
138
+
139
+ if (e.key === "ArrowRight") {
140
+ activeIndex.value = (activeIndex.value + 1) % len
141
+ itemRefs.value[activeIndex.value]?.focus()
142
+ e.preventDefault()
143
+ } else if (e.key === "ArrowLeft") {
144
+ activeIndex.value = (activeIndex.value - 1 + len) % len
145
+ itemRefs.value[activeIndex.value]?.focus()
146
+ e.preventDefault()
147
+ } else if (e.key === "Delete" || e.key === "Backspace") {
148
+ if (canEdit.value) {
149
+ removeVal($modelValue.value[activeIndex.value]!)
150
+ e.preventDefault()
151
+ }
152
+ } else if (e.key === "Home") {
153
+ activeIndex.value = 0
154
+ itemRefs.value[activeIndex.value]?.focus()
155
+ e.preventDefault()
156
+ } else if (e.key === "End") {
157
+ activeIndex.value = len - 1
158
+ itemRefs.value[activeIndex.value]?.focus()
159
+ e.preventDefault()
160
+ }
161
+ }
162
+ </script>
163
+