@witchcraft/ui 0.0.1

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 (315) hide show
  1. package/README.md +236 -0
  2. package/dist/module.cjs +5 -0
  3. package/dist/module.d.mts +34 -0
  4. package/dist/module.d.ts +34 -0
  5. package/dist/module.json +9 -0
  6. package/dist/module.mjs +124 -0
  7. package/dist/runtime/assets/base.css +1 -0
  8. package/dist/runtime/assets/locales/en.json +33 -0
  9. package/dist/runtime/assets/style.css +1 -0
  10. package/dist/runtime/assets/tailwind.css +1 -0
  11. package/dist/runtime/assets/theme.css +1 -0
  12. package/dist/runtime/build/WitchcraftUiResolver.d.ts +5 -0
  13. package/dist/runtime/build/WitchcraftUiResolver.js +17 -0
  14. package/dist/runtime/build/generateTheme.d.ts +1 -0
  15. package/dist/runtime/build/generateTheme.js +14 -0
  16. package/dist/runtime/build/unpluginIconViteOptions.d.ts +2 -0
  17. package/dist/runtime/build/unpluginIconViteOptions.js +10 -0
  18. package/dist/runtime/components/Aria/Aria.vue +18 -0
  19. package/dist/runtime/components/Focus.stories.d.ts +11 -0
  20. package/dist/runtime/components/Focus.stories.js +53 -0
  21. package/dist/runtime/components/Icon/Icon.vue +39 -0
  22. package/dist/runtime/components/LibButton/LibButton.stories.d.ts +12 -0
  23. package/dist/runtime/components/LibButton/LibButton.stories.js +94 -0
  24. package/dist/runtime/components/LibButton/LibButton.vue +247 -0
  25. package/dist/runtime/components/LibCheckbox/LibCheckbox.stories.d.ts +14 -0
  26. package/dist/runtime/components/LibCheckbox/LibCheckbox.stories.js +29 -0
  27. package/dist/runtime/components/LibCheckbox/LibCheckbox.vue +132 -0
  28. package/dist/runtime/components/LibColorInput/LibColorInput.stories.d.ts +7 -0
  29. package/dist/runtime/components/LibColorInput/LibColorInput.stories.js +58 -0
  30. package/dist/runtime/components/LibColorInput/LibColorInput.vue +125 -0
  31. package/dist/runtime/components/LibColorPicker/LibColorPicker.stories.d.ts +7 -0
  32. package/dist/runtime/components/LibColorPicker/LibColorPicker.stories.js +51 -0
  33. package/dist/runtime/components/LibColorPicker/LibColorPicker.vue +448 -0
  34. package/dist/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.stories.d.ts +7 -0
  35. package/dist/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.stories.js +36 -0
  36. package/dist/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.vue +95 -0
  37. package/dist/runtime/components/LibDatePicker/LibDatePicker.stories.d.ts +11 -0
  38. package/dist/runtime/components/LibDatePicker/LibDatePicker.stories.js +98 -0
  39. package/dist/runtime/components/LibDatePicker/LibDatePicker.vue +67 -0
  40. package/dist/runtime/components/LibDatePicker/LibRangeDatePicker.vue +370 -0
  41. package/dist/runtime/components/LibDatePicker/LibSingleDatePicker.vue +314 -0
  42. package/dist/runtime/components/LibDatePicker/LibTimeZonePicker.vue +27 -0
  43. package/dist/runtime/components/LibDatePicker/helpers.d.ts +25 -0
  44. package/dist/runtime/components/LibDatePicker/helpers.js +28 -0
  45. package/dist/runtime/components/LibDebug/LibDebug.stories.d.ts +9 -0
  46. package/dist/runtime/components/LibDebug/LibDebug.stories.js +46 -0
  47. package/dist/runtime/components/LibDebug/LibDebug.vue +91 -0
  48. package/dist/runtime/components/LibDevOnly/LibDevOnly.vue +53 -0
  49. package/dist/runtime/components/LibFileInput/LibFileInput.stories.d.ts +10 -0
  50. package/dist/runtime/components/LibFileInput/LibFileInput.stories.js +63 -0
  51. package/dist/runtime/components/LibFileInput/LibFileInput.vue +273 -0
  52. package/dist/runtime/components/LibInput/LibInput.stories.d.ts +33 -0
  53. package/dist/runtime/components/LibInput/LibInput.stories.js +339 -0
  54. package/dist/runtime/components/LibInput/LibInput.vue +372 -0
  55. package/dist/runtime/components/LibLabel/LibLabel.stories.d.ts +6 -0
  56. package/dist/runtime/components/LibLabel/LibLabel.stories.js +25 -0
  57. package/dist/runtime/components/LibLabel/LibLabel.vue +66 -0
  58. package/dist/runtime/components/LibMultiValues/LibMultiValues.stories.d.ts +23 -0
  59. package/dist/runtime/components/LibMultiValues/LibMultiValues.stories.js +60 -0
  60. package/dist/runtime/components/LibMultiValues/LibMultiValues.vue +127 -0
  61. package/dist/runtime/components/LibNotifications/LibNotification.stories.d.ts +15 -0
  62. package/dist/runtime/components/LibNotifications/LibNotification.stories.js +126 -0
  63. package/dist/runtime/components/LibNotifications/LibNotification.vue +121 -0
  64. package/dist/runtime/components/LibNotifications/LibNotifications.stories.d.ts +6 -0
  65. package/dist/runtime/components/LibNotifications/LibNotifications.stories.js +109 -0
  66. package/dist/runtime/components/LibNotifications/LibNotifications.vue +133 -0
  67. package/dist/runtime/components/LibPagination/LibPagination.stories.d.ts +6 -0
  68. package/dist/runtime/components/LibPagination/LibPagination.stories.js +40 -0
  69. package/dist/runtime/components/LibPagination/LibPagination.vue +261 -0
  70. package/dist/runtime/components/LibPalette/LibPalette.stories.d.ts +6 -0
  71. package/dist/runtime/components/LibPalette/LibPalette.stories.js +20 -0
  72. package/dist/runtime/components/LibPalette/LibPalette.vue +49 -0
  73. package/dist/runtime/components/LibPopup/LibPopup.stories.d.ts +14 -0
  74. package/dist/runtime/components/LibPopup/LibPopup.stories.js +147 -0
  75. package/dist/runtime/components/LibPopup/LibPopup.vue +441 -0
  76. package/dist/runtime/components/LibProgressBar/LibProgressBar.stories.d.ts +10 -0
  77. package/dist/runtime/components/LibProgressBar/LibProgressBar.stories.js +81 -0
  78. package/dist/runtime/components/LibProgressBar/LibProgressBar.vue +192 -0
  79. package/dist/runtime/components/LibRecorder/LibRecorder.stories.d.ts +19 -0
  80. package/dist/runtime/components/LibRecorder/LibRecorder.stories.js +63 -0
  81. package/dist/runtime/components/LibRecorder/LibRecorder.vue +243 -0
  82. package/dist/runtime/components/LibRoot/LibRoot.vue +126 -0
  83. package/dist/runtime/components/LibSimpleInput/LibSimpleInput.stories.d.ts +26 -0
  84. package/dist/runtime/components/LibSimpleInput/LibSimpleInput.stories.js +78 -0
  85. package/dist/runtime/components/LibSimpleInput/LibSimpleInput.vue +148 -0
  86. package/dist/runtime/components/LibSuggestions/LibSuggestions.stories.d.ts +27 -0
  87. package/dist/runtime/components/LibSuggestions/LibSuggestions.stories.js +112 -0
  88. package/dist/runtime/components/LibSuggestions/LibSuggestions.vue +198 -0
  89. package/dist/runtime/components/LibTable/LibTable.stories.d.ts +16 -0
  90. package/dist/runtime/components/LibTable/LibTable.stories.js +156 -0
  91. package/dist/runtime/components/LibTable/LibTable.vue +177 -0
  92. package/dist/runtime/components/Template/NAME.vue +49 -0
  93. package/dist/runtime/components/Template/TemplateStory.d.ts +7 -0
  94. package/dist/runtime/components/Template/TemplateStory.js +22 -0
  95. package/dist/runtime/components/TestControls/TestControls.vue +19 -0
  96. package/dist/runtime/components/index.d.ts +19 -0
  97. package/dist/runtime/components/index.js +19 -0
  98. package/dist/runtime/components/reset.stories.d.ts +5 -0
  99. package/dist/runtime/components/reset.stories.js +19 -0
  100. package/dist/runtime/components/shared/props.d.ts +135 -0
  101. package/dist/runtime/components/shared/props.js +14 -0
  102. package/dist/runtime/components/shared/storyHelpers/playInput.d.ts +8 -0
  103. package/dist/runtime/components/shared/storyHelpers/playInput.js +26 -0
  104. package/dist/runtime/components/shared/storyHelpers/playSuggestions.d.ts +12 -0
  105. package/dist/runtime/components/shared/storyHelpers/playSuggestions.js +83 -0
  106. package/dist/runtime/composables/index.d.ts +11 -0
  107. package/dist/runtime/composables/index.js +11 -0
  108. package/dist/runtime/composables/useAccesibilityOutline.d.ts +41 -0
  109. package/dist/runtime/composables/useAccesibilityOutline.js +58 -0
  110. package/dist/runtime/composables/useAriaLabel.d.ts +6 -0
  111. package/dist/runtime/composables/useAriaLabel.js +15 -0
  112. package/dist/runtime/composables/useDarkMode.d.ts +38 -0
  113. package/dist/runtime/composables/useDarkMode.js +79 -0
  114. package/dist/runtime/composables/useDivideAttrs.d.ts +27 -0
  115. package/dist/runtime/composables/useDivideAttrs.js +26 -0
  116. package/dist/runtime/composables/useGlobalResizeObserver.d.ts +3 -0
  117. package/dist/runtime/composables/useGlobalResizeObserver.js +28 -0
  118. package/dist/runtime/composables/useInjectedDarkMode.d.ts +2 -0
  119. package/dist/runtime/composables/useInjectedDarkMode.js +13 -0
  120. package/dist/runtime/composables/useInjectedI18n.d.ts +2 -0
  121. package/dist/runtime/composables/useInjectedI18n.js +7 -0
  122. package/dist/runtime/composables/useInjectedLocale.d.ts +2 -0
  123. package/dist/runtime/composables/useInjectedLocale.js +21 -0
  124. package/dist/runtime/composables/useNotificationHandler.d.ts +4 -0
  125. package/dist/runtime/composables/useNotificationHandler.js +21 -0
  126. package/dist/runtime/composables/useScrollNearContainerEdges.d.ts +68 -0
  127. package/dist/runtime/composables/useScrollNearContainerEdges.js +116 -0
  128. package/dist/runtime/composables/useScrollNearContainerEdges.stories.d.ts +7 -0
  129. package/dist/runtime/composables/useScrollNearContainerEdges.stories.js +85 -0
  130. package/dist/runtime/composables/useSetupDarkMode.d.ts +12 -0
  131. package/dist/runtime/composables/useSetupDarkMode.js +4 -0
  132. package/dist/runtime/composables/useSetupI18n.d.ts +20 -0
  133. package/dist/runtime/composables/useSetupI18n.js +50 -0
  134. package/dist/runtime/composables/useSetupLocale.d.ts +9 -0
  135. package/dist/runtime/composables/useSetupLocale.js +21 -0
  136. package/dist/runtime/composables/useShowDevOnlyKey.d.ts +7 -0
  137. package/dist/runtime/composables/useShowDevOnlyKey.js +20 -0
  138. package/dist/runtime/composables/useSuggestions.d.ts +38 -0
  139. package/dist/runtime/composables/useSuggestions.js +226 -0
  140. package/dist/runtime/directives/index.d.ts +4 -0
  141. package/dist/runtime/directives/index.js +4 -0
  142. package/dist/runtime/directives/vDetectFlex.d.ts +2 -0
  143. package/dist/runtime/directives/vDetectFlex.js +109 -0
  144. package/dist/runtime/directives/vExtractRootEl.d.ts +22 -0
  145. package/dist/runtime/directives/vExtractRootEl.js +13 -0
  146. package/dist/runtime/directives/vResizableCols.d.ts +60 -0
  147. package/dist/runtime/directives/vResizableCols.js +252 -0
  148. package/dist/runtime/directives/vResizeObserver.d.ts +2 -0
  149. package/dist/runtime/directives/vResizeObserver.js +34 -0
  150. package/dist/runtime/globalResizeObserver.d.ts +5 -0
  151. package/dist/runtime/globalResizeObserver.js +5 -0
  152. package/dist/runtime/helpers/NotificationHandler.d.ts +48 -0
  153. package/dist/runtime/helpers/NotificationHandler.js +162 -0
  154. package/dist/runtime/helpers/addValue.d.ts +1 -0
  155. package/dist/runtime/helpers/addValue.js +8 -0
  156. package/dist/runtime/helpers/base64ToImg.d.ts +1 -0
  157. package/dist/runtime/helpers/base64ToImg.js +11 -0
  158. package/dist/runtime/helpers/copy.d.ts +1 -0
  159. package/dist/runtime/helpers/copy.js +10 -0
  160. package/dist/runtime/helpers/createNoonUtcDate.d.ts +7 -0
  161. package/dist/runtime/helpers/createNoonUtcDate.js +14 -0
  162. package/dist/runtime/helpers/defaultTranslationFunction.d.ts +16 -0
  163. package/dist/runtime/helpers/defaultTranslationFunction.js +14 -0
  164. package/dist/runtime/helpers/getTimeZoneList.d.ts +1 -0
  165. package/dist/runtime/helpers/getTimeZoneList.js +3 -0
  166. package/dist/runtime/helpers/hasModifiers.d.ts +1 -0
  167. package/dist/runtime/helpers/hasModifiers.js +1 -0
  168. package/dist/runtime/helpers/index.d.ts +8 -0
  169. package/dist/runtime/helpers/index.js +8 -0
  170. package/dist/runtime/helpers/readFile.d.ts +1 -0
  171. package/dist/runtime/helpers/readFile.js +13 -0
  172. package/dist/runtime/helpers/resizeObserverWrapper.d.ts +8 -0
  173. package/dist/runtime/helpers/resizeObserverWrapper.js +37 -0
  174. package/dist/runtime/helpers/storybook.d.ts +7 -0
  175. package/dist/runtime/helpers/storybook.js +42 -0
  176. package/dist/runtime/main.lib.d.ts +26 -0
  177. package/dist/runtime/main.lib.js +8 -0
  178. package/dist/runtime/nuxt/plugins/vue-plugin.d.ts +2 -0
  179. package/dist/runtime/nuxt/plugins/vue-plugin.js +12 -0
  180. package/dist/runtime/tailwind/index.d.ts +1 -0
  181. package/dist/runtime/tailwind/index.js +1 -0
  182. package/dist/runtime/tailwind/themeConvertionOpts.d.ts +2 -0
  183. package/dist/runtime/tailwind/themeConvertionOpts.js +12 -0
  184. package/dist/runtime/theme.d.ts +2 -0
  185. package/dist/runtime/theme.js +2 -0
  186. package/dist/runtime/types/index.d.ts +119 -0
  187. package/dist/runtime/types/index.js +0 -0
  188. package/dist/runtime/utils/twMerge.d.ts +10 -0
  189. package/dist/runtime/utils/twMerge.js +10 -0
  190. package/dist/runtime/vue/VueComponentsPlugin.d.ts +2 -0
  191. package/dist/runtime/vue/VueComponentsPlugin.js +10 -0
  192. package/dist/runtime/vue/registerComponents.d.ts +19 -0
  193. package/dist/runtime/vue/registerComponents.js +10 -0
  194. package/dist/runtime/vue/registerDirectives.d.ts +3 -0
  195. package/dist/runtime/vue/registerDirectives.js +9 -0
  196. package/dist/types.d.mts +7 -0
  197. package/dist/types.d.ts +7 -0
  198. package/package.json +207 -0
  199. package/src/module.ts +176 -0
  200. package/src/runtime/assets/base.css +67 -0
  201. package/src/runtime/assets/locales/en.json +33 -0
  202. package/src/runtime/assets/style.css +144 -0
  203. package/src/runtime/assets/tailwind.css +5 -0
  204. package/src/runtime/assets/theme.css +65 -0
  205. package/src/runtime/build/WitchcraftUiResolver.ts +27 -0
  206. package/src/runtime/build/generateTheme.ts +16 -0
  207. package/src/runtime/build/unpluginIconViteOptions.ts +11 -0
  208. package/src/runtime/components/Aria/Aria.vue +27 -0
  209. package/src/runtime/components/Focus.stories.ts +67 -0
  210. package/src/runtime/components/Icon/Icon.vue +39 -0
  211. package/src/runtime/components/LibButton/LibButton.stories.ts +107 -0
  212. package/src/runtime/components/LibButton/LibButton.vue +247 -0
  213. package/src/runtime/components/LibCheckbox/LibCheckbox.stories.ts +41 -0
  214. package/src/runtime/components/LibCheckbox/LibCheckbox.vue +132 -0
  215. package/src/runtime/components/LibColorInput/LibColorInput.stories.ts +69 -0
  216. package/src/runtime/components/LibColorInput/LibColorInput.vue +125 -0
  217. package/src/runtime/components/LibColorPicker/LibColorPicker.stories.ts +60 -0
  218. package/src/runtime/components/LibColorPicker/LibColorPicker.vue +448 -0
  219. package/src/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.stories.ts +51 -0
  220. package/src/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.vue +95 -0
  221. package/src/runtime/components/LibDatePicker/LibDatePicker.stories.ts +114 -0
  222. package/src/runtime/components/LibDatePicker/LibDatePicker.vue +67 -0
  223. package/src/runtime/components/LibDatePicker/LibRangeDatePicker.vue +370 -0
  224. package/src/runtime/components/LibDatePicker/LibSingleDatePicker.vue +314 -0
  225. package/src/runtime/components/LibDatePicker/LibTimeZonePicker.vue +27 -0
  226. package/src/runtime/components/LibDatePicker/helpers.ts +55 -0
  227. package/src/runtime/components/LibDebug/LibDebug.stories.ts +58 -0
  228. package/src/runtime/components/LibDebug/LibDebug.vue +91 -0
  229. package/src/runtime/components/LibDevOnly/LibDevOnly.vue +53 -0
  230. package/src/runtime/components/LibFileInput/LibFileInput.stories.ts +79 -0
  231. package/src/runtime/components/LibFileInput/LibFileInput.vue +273 -0
  232. package/src/runtime/components/LibInput/LibInput.stories.ts +367 -0
  233. package/src/runtime/components/LibInput/LibInput.vue +372 -0
  234. package/src/runtime/components/LibLabel/LibLabel.stories.ts +37 -0
  235. package/src/runtime/components/LibLabel/LibLabel.vue +66 -0
  236. package/src/runtime/components/LibMultiValues/LibMultiValues.stories.ts +83 -0
  237. package/src/runtime/components/LibMultiValues/LibMultiValues.vue +127 -0
  238. package/src/runtime/components/LibNotifications/LibNotification.stories.ts +142 -0
  239. package/src/runtime/components/LibNotifications/LibNotification.vue +121 -0
  240. package/src/runtime/components/LibNotifications/LibNotifications.stories.ts +124 -0
  241. package/src/runtime/components/LibNotifications/LibNotifications.vue +133 -0
  242. package/src/runtime/components/LibPagination/LibPagination.stories.ts +53 -0
  243. package/src/runtime/components/LibPagination/LibPagination.vue +261 -0
  244. package/src/runtime/components/LibPalette/LibPalette.stories.ts +32 -0
  245. package/src/runtime/components/LibPalette/LibPalette.vue +49 -0
  246. package/src/runtime/components/LibPopup/LibPopup.stories.ts +157 -0
  247. package/src/runtime/components/LibPopup/LibPopup.vue +441 -0
  248. package/src/runtime/components/LibProgressBar/LibProgressBar.stories.ts +94 -0
  249. package/src/runtime/components/LibProgressBar/LibProgressBar.vue +192 -0
  250. package/src/runtime/components/LibRecorder/LibRecorder.stories.ts +81 -0
  251. package/src/runtime/components/LibRecorder/LibRecorder.vue +243 -0
  252. package/src/runtime/components/LibRoot/LibRoot.vue +126 -0
  253. package/src/runtime/components/LibSimpleInput/LibSimpleInput.stories.ts +98 -0
  254. package/src/runtime/components/LibSimpleInput/LibSimpleInput.vue +148 -0
  255. package/src/runtime/components/LibSuggestions/LibSuggestions.stories.ts +137 -0
  256. package/src/runtime/components/LibSuggestions/LibSuggestions.vue +198 -0
  257. package/src/runtime/components/LibTable/LibTable.stories.ts +170 -0
  258. package/src/runtime/components/LibTable/LibTable.vue +177 -0
  259. package/src/runtime/components/Template/NAME.vue +49 -0
  260. package/src/runtime/components/Template/TemplateStory.ts +38 -0
  261. package/src/runtime/components/TestControls/TestControls.vue +19 -0
  262. package/src/runtime/components/index.ts +22 -0
  263. package/src/runtime/components/reset.stories.ts +32 -0
  264. package/src/runtime/components/shared/props.ts +142 -0
  265. package/src/runtime/components/shared/storyHelpers/playInput.ts +35 -0
  266. package/src/runtime/components/shared/storyHelpers/playSuggestions.ts +105 -0
  267. package/src/runtime/composables/index.ts +13 -0
  268. package/src/runtime/composables/useAccesibilityOutline.ts +104 -0
  269. package/src/runtime/composables/useAriaLabel.ts +23 -0
  270. package/src/runtime/composables/useDarkMode.ts +146 -0
  271. package/src/runtime/composables/useDivideAttrs.ts +52 -0
  272. package/src/runtime/composables/useGlobalResizeObserver.ts +33 -0
  273. package/src/runtime/composables/useInjectedDarkMode.ts +15 -0
  274. package/src/runtime/composables/useInjectedI18n.ts +10 -0
  275. package/src/runtime/composables/useInjectedLocale.ts +24 -0
  276. package/src/runtime/composables/useNotificationHandler.ts +32 -0
  277. package/src/runtime/composables/useScrollNearContainerEdges.stories.ts +93 -0
  278. package/src/runtime/composables/useScrollNearContainerEdges.ts +205 -0
  279. package/src/runtime/composables/useSetupDarkMode.ts +14 -0
  280. package/src/runtime/composables/useSetupI18n.ts +77 -0
  281. package/src/runtime/composables/useSetupLocale.ts +32 -0
  282. package/src/runtime/composables/useShowDevOnlyKey.ts +28 -0
  283. package/src/runtime/composables/useSuggestions.ts +297 -0
  284. package/src/runtime/directives/index.ts +6 -0
  285. package/src/runtime/directives/vDetectFlex.ts +159 -0
  286. package/src/runtime/directives/vExtractRootEl.ts +38 -0
  287. package/src/runtime/directives/vResizableCols.ts +378 -0
  288. package/src/runtime/directives/vResizeObserver.ts +45 -0
  289. package/src/runtime/globalResizeObserver.ts +12 -0
  290. package/src/runtime/helpers/NotificationHandler.ts +227 -0
  291. package/src/runtime/helpers/addValue.ts +10 -0
  292. package/src/runtime/helpers/base64ToImg.ts +14 -0
  293. package/src/runtime/helpers/copy.ts +11 -0
  294. package/src/runtime/helpers/createNoonUtcDate.ts +21 -0
  295. package/src/runtime/helpers/defaultTranslationFunction.ts +33 -0
  296. package/src/runtime/helpers/getTimeZoneList.ts +4 -0
  297. package/src/runtime/helpers/hasModifiers.ts +1 -0
  298. package/src/runtime/helpers/index.ts +10 -0
  299. package/src/runtime/helpers/readFile.ts +22 -0
  300. package/src/runtime/helpers/resizeObserverWrapper.ts +45 -0
  301. package/src/runtime/helpers/storybook.ts +52 -0
  302. package/src/runtime/main.lib.ts +31 -0
  303. package/src/runtime/nuxt/plugins/vue-plugin.ts +19 -0
  304. package/src/runtime/tailwind/index.ts +3 -0
  305. package/src/runtime/tailwind/themeConvertionOpts.ts +15 -0
  306. package/src/runtime/theme.ts +5 -0
  307. package/src/runtime/types/index.ts +116 -0
  308. package/src/runtime/utils/twMerge.ts +13 -0
  309. package/src/runtime/vue/VueComponentsPlugin.ts +16 -0
  310. package/src/runtime/vue/registerComponents.ts +31 -0
  311. package/src/runtime/vue/registerDirectives.ts +12 -0
  312. package/types/components.d.ts +27 -0
  313. package/types/global.d.ts +16 -0
  314. package/types/index.d.ts +5 -0
  315. package/types/vite.d.ts +2 -0
@@ -0,0 +1,273 @@
1
+ <template>
2
+ <!-- todo aria errors -->
3
+ <div :class="twMerge(
4
+ `file-input
5
+ justify-center
6
+ border-2
7
+ border-dashed
8
+ border-accent-500/80
9
+ focus-outline-within
10
+ transition-[border-color,box-shadow]
11
+ ease-out`,
12
+ compact && `rounded-sm`,
13
+ !compact && `flex w-full flex-col items-center gap-2 rounded-xl p-2 `,
14
+ errors.length > 0 && errorFlashing && `border-danger-400`,
15
+ ( $.wrapperAttrs as any ).class
16
+ )"
17
+ v-bind="{...$.wrapperAttrs, class:undefined}"
18
+ >
19
+ <div :class="twMerge(
20
+ `relative justify-center`,
21
+ compact && `flex gap-2`,
22
+ !compact && `input-wrapper
23
+ flex flex-col items-center
24
+ `
25
+ )"
26
+ >
27
+ <label
28
+ :for="id ?? fallbackId"
29
+ :class="twMerge(
30
+ `pointer-events-none flex gap-1 items-center whitespace-nowrap`
31
+ )"
32
+ >
33
+ <slot v-if="compact || multiple || files.length === 0" name="icon">
34
+ <icon><i-fa6-solid-arrow-up-from-bracket/></icon>
35
+ </slot>
36
+ <slot name="label">
37
+ {{
38
+ (compact
39
+ ? multiple
40
+ ? t("file-input.compact-choose-file-plural")
41
+ : t("file-input.compact-choose-file")
42
+ : multiple
43
+ ? t("file-input.non-compact-choose-file-plural")
44
+ : t("file-input.non-compact-choose-file")
45
+ )
46
+ }}
47
+ </slot>
48
+ <span v-if="compact && multiple">{{ ` (${files.length})` }}</span>
49
+ </label>
50
+ <label v-if="!compact && formats?.length > 0" class="flex flex-col items-center text-sm">
51
+ <slot name="formats">{{ t("file-input.accepted-formats") }}: </slot>
52
+ <div class="">
53
+ {{ extensions.join(", ") }}
54
+ </div>
55
+ </label>
56
+ <input
57
+ :id="id ?? fallbackId"
58
+ :class="twMerge(
59
+ `absolute inset-0
60
+ z-0
61
+ cursor-pointer
62
+ text-[0]
63
+ opacity-0
64
+ `,
65
+ ($.inputAttrs as any)?.class
66
+ )"
67
+ type="file"
68
+ :accept="formats.join(', ')"
69
+ :multiple="multiple"
70
+ ref="el"
71
+ v-bind="{...$.inputAttrs, class:undefined}"
72
+ @input="(inputFile as any)"
73
+ @click="($event.target! as any).value = null"
74
+ >
75
+ <!-- click event allows event to fire even if the user picks the same file -->
76
+ </div>
77
+ <div v-if="!compact && files.length > 0"
78
+ :class="twMerge(`previews
79
+ flex items-stretch justify-center gap-2 flex-wrap
80
+ `,
81
+ multiple && `
82
+ w-full
83
+ `,
84
+ ($.previewsAttrs as any)?.class
85
+ )"
86
+ >
87
+ <div class="flex-1"/>
88
+ <div class="preview
89
+ z-1
90
+ relative
91
+ flex
92
+ min-w-0
93
+ max-w-[150px]
94
+ flex-initial
95
+ flex-wrap
96
+ items-center
97
+ gap-2 rounded-sm border border-neutral-400
98
+ shadow-xs
99
+ shadow-neutral-800/20
100
+ "
101
+ v-for="entry of files"
102
+ :key="entry.file.name"
103
+ >
104
+ <div class="flex flex-initial basis-full justify-start">
105
+ <lib-button
106
+ :border="false"
107
+ :aria-label="`Remove file ${entry.file.name}`"
108
+ @click="removeFile(entry)"
109
+ >
110
+ <icon><i-fa6-solid-xmark/></icon>
111
+ </lib-button>
112
+ </div>
113
+
114
+ <div class="flex flex-initial basis-full justify-center">
115
+ <div v-if="entry.isImg"
116
+ class="image
117
+ bg-transparency-squares flex
118
+ h-[80px] flex-wrap items-center
119
+ justify-center
120
+ "
121
+ >
122
+ <img class="max-h-full w-auto" :src="getSrc(entry.file)">
123
+ </div>
124
+ <div v-if="!entry.isImg"
125
+ class="no-image
126
+ flex h-[80px]
127
+ flex-1 basis-full flex-wrap items-center justify-center
128
+ "
129
+ >
130
+ <icon><i-fa6-regular-file class="text-4xl opacity-50"/></icon>
131
+ </div>
132
+ </div>
133
+ <div class="filename min-w-0 flex-1 basis-0 truncate break-all rounded-sm p-1 text-sm" :title="entry.file.name">{{ entry.file.name }}</div>
134
+ </div>
135
+
136
+ <div class="flex-1"/>
137
+ </div>
138
+ </div>
139
+ </template>
140
+ <script setup lang="ts">
141
+ import { computed, type HTMLAttributes, type InputHTMLAttributes,ref, shallowReactive, watch } from "vue"
142
+
143
+ import { useDivideAttrs } from "../../composables/useDivideAttrs.js"
144
+ import { useInjectedI18n } from "../../composables/useInjectedI18n.js"
145
+ import { type FileInputError } from "../../types/index.js"
146
+ import { twMerge } from "../../utils/twMerge.js"
147
+ import Icon from "../Icon/Icon.vue"
148
+ import LibButton from "../LibButton/LibButton.vue"
149
+ import { getFallbackId,type LinkableByIdProps, type TailwindClassProp, type WrapperProps } from "../shared/props.js"
150
+
151
+ const t = useInjectedI18n()
152
+ const el = ref<null | HTMLInputElement>(null)
153
+ type Entry = { file: File, isImg: boolean }
154
+
155
+ const files = shallowReactive<(Entry)[]>([])
156
+ const errors = shallowReactive<(FileInputError)[]>([])
157
+ const errorFlashing = ref(false)
158
+
159
+ watch(files, () => {
160
+ emits("input", files.map(entry => entry.file))
161
+ })
162
+ watch(errors, () => {
163
+ if (errors.length > 0) {
164
+ errorFlashing.value = true
165
+ setTimeout(() => {
166
+ errorFlashing.value = false
167
+ }, 500)
168
+ emits("errors", errors)
169
+ }
170
+ })
171
+
172
+ defineOptions({
173
+ name: "lib-file-input",
174
+ inheritAttrs: false,
175
+ })
176
+ const $ = useDivideAttrs(["wrapper", "input", "previews"] as const)
177
+
178
+ const emits = defineEmits<{
179
+ (e: "input", val: File[]): void
180
+ (e: "errors", val: FileInputError[]): void
181
+ }>()
182
+
183
+ const fallbackId = getFallbackId()
184
+ // eslint-disable-next-line no-use-before-define
185
+ const props = withDefaults(defineProps<Props>(), {
186
+ multiple: false,
187
+ formats: () => ["image/*", ".jpeg", ".jpg", ".png"],
188
+ compact: false,
189
+ })
190
+
191
+ const mimeTypes = computed(() => props.formats?.filter(_ => !_.startsWith(".")) ?? [])
192
+ const extensions = computed(() => props.formats?.filter(_ => _.startsWith(".")) ?? [])
193
+
194
+ const getSrc = (file: File) => {
195
+ const src = URL.createObjectURL(file)
196
+ return src
197
+ }
198
+
199
+ const removeFile = (entry: Entry) => {
200
+ const index = files.indexOf(entry)
201
+ files.splice(index, 1)
202
+ }
203
+ const extensionsList = computed(() => extensions.value.join(", "))
204
+ const inputFile = async (e: InputEvent): Promise<void | boolean> => {
205
+ e.preventDefault()
206
+ if (el.value!.files) {
207
+ const errs = []
208
+ for (const file of el.value!.files) {
209
+ const isImg = file.type.startsWith("image")
210
+
211
+ const byPassValidation = props.formats.length === 0
212
+ const isValidMimeType = mimeTypes.value.find(_ => _.endsWith("/*") ? file.type.startsWith(_.slice(0, -2)) : _ === file.type) !== undefined
213
+ const isValidExtension = extensions.value.find(_ => file.name.endsWith(_)) !== undefined
214
+ if (!byPassValidation && (!isValidMimeType || !isValidExtension)) {
215
+ const extension = file.name.match(/.*(\..*)/)?.[1] ?? "Unknown"
216
+ const type = file.type === "" ? "" : ` (${file.type})`
217
+ const message = `File type ${extension}${type} is not allowed. Allowed file types are: ${extensionsList.value}.`
218
+ const err = new Error(message) as FileInputError
219
+ err.file = file
220
+ err.isValidExtension = isValidExtension
221
+ err.isValidMimeType = isValidMimeType
222
+ errs.push(err)
223
+ continue
224
+ }
225
+ if (errs.length > 0) continue
226
+ if (!files.find(_ => _.file === file)) {
227
+ if ((props.multiple || files.length < 1)
228
+ ) {
229
+ files.push({ file, isImg })
230
+ } else {
231
+ files.splice(0, files.length, { file, isImg })
232
+ }
233
+ }
234
+ }
235
+ if (errs.length > 0) {
236
+ errors.splice(0, errors.length, ...errs)
237
+ return false
238
+ } else if (errors.length > 0) {
239
+ errors.splice(0, errors.length)
240
+ }
241
+ }
242
+ }
243
+
244
+ </script>
245
+ <script lang="ts">
246
+ export default { name: "lib-file-input" }
247
+
248
+ type WrapperTypes =
249
+ & WrapperProps<"input", InputHTMLAttributes >
250
+ & WrapperProps<"wrapper", HTMLAttributes >
251
+ & WrapperProps<"previews",HTMLAttributes >
252
+
253
+ type RealProps =
254
+ & LinkableByIdProps
255
+ & {
256
+ multiple?: boolean
257
+ /**
258
+ * 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.
259
+ *
260
+ * Pass an empty array to allow any filetype.
261
+ */
262
+ formats?: string[]
263
+ compact?: boolean
264
+ }
265
+
266
+ interface Props
267
+ extends
268
+ /** @vue-ignore */
269
+ Partial<Omit<InputHTMLAttributes,"class" | "multiple" | "formats" | "compact"> & TailwindClassProp>,
270
+ /** @vue-ignore */
271
+ Partial<WrapperTypes>,
272
+ RealProps { }
273
+ </script>
@@ -0,0 +1,33 @@
1
+ import type { StoryObj } from "@storybook/vue3";
2
+ import LibInput from "./LibInput.vue.js";
3
+ declare const meta: {
4
+ component: any;
5
+ title: string;
6
+ args: {
7
+ border: boolean;
8
+ label: string;
9
+ };
10
+ };
11
+ export default meta;
12
+ type Story = StoryObj<typeof LibInput>;
13
+ export declare const Primary: Story;
14
+ export declare const Disabled: Story;
15
+ export declare const Readonly: Story;
16
+ export declare const Invalid: Story;
17
+ export declare const AttrsPassword: Story;
18
+ export declare const AttrsDate: Story;
19
+ export declare const AttrsNumber: Story;
20
+ export declare const Borderless: any;
21
+ export declare const WithAutosuggest: any;
22
+ export declare const WithInstantAutosuggest: any;
23
+ export declare const AutosuggestRestricted: any;
24
+ export declare const AutosuggestSelectLikeShowAllUnrestricted: any;
25
+ export declare const AutosuggestObjectOptions: any;
26
+ export declare const Slots: Story;
27
+ /** Press enter to add a value. */
28
+ export declare const WithMultipleValues: Story;
29
+ export declare const WithMultipleValuesWithSuggestions: any;
30
+ export declare const WithMultipleValuesDisabled: any;
31
+ export declare const WithMultipleValuesReadonly: any;
32
+ export declare const InputSlotReplacement: Story;
33
+ export declare const NextToButton: Story;
@@ -0,0 +1,339 @@
1
+ import { ref, watchEffect } from "vue";
2
+ import LibInput from "./LibInput.vue";
3
+ import IconFaChevronLeft from "~icons/fa6-solid/chevron-left";
4
+ import IconFaChevronRight from "~icons/fa6-solid/chevron-right";
5
+ import IconFaSolidKeyboard from "~icons/fa6-solid/keyboard";
6
+ import IconFaSolidTags from "~icons/fa6-solid/tags";
7
+ import { vExtractRootEl } from "../../directives/vExtractRootEl.js";
8
+ import { createRecorderHandler, createRecorderWatchEffect } from "../../helpers/storybook.js";
9
+ import Icon from "../Icon/Icon.vue";
10
+ import * as components from "../index.js";
11
+ import {
12
+ playBasicVModel,
13
+ playMultipleValues
14
+ } from "../shared/storyHelpers/playInput.js";
15
+ import {
16
+ playBasicClickSelect,
17
+ playBasicKeyboardSelect,
18
+ playBasicSelect
19
+ } from "../shared/storyHelpers/playSuggestions.js";
20
+ const meta = {
21
+ component: LibInput,
22
+ title: "Components/Input",
23
+ args: {
24
+ border: true,
25
+ label: "Some Label"
26
+ }
27
+ };
28
+ export default meta;
29
+ const allComponents = {
30
+ ...components,
31
+ LibInput,
32
+ Icon,
33
+ IconFaChevronRight,
34
+ IconFaChevronLeft,
35
+ IconFaSolidKeyboard,
36
+ IconFaSolidTags
37
+ };
38
+ const playAutosuggestSelectLike = async (context) => {
39
+ await playBasicSelect(context);
40
+ await playBasicKeyboardSelect(context);
41
+ await playBasicClickSelect(context);
42
+ };
43
+ const setupModelValue = (args) => ({
44
+ modelValue: ref(args.modelValue ?? "")
45
+ });
46
+ const setupModelValues = (args) => ({
47
+ values: ref(args.values ?? void 0)
48
+ });
49
+ const Base = {
50
+ render: (args) => ({
51
+ components: allComponents,
52
+ setup: () => ({
53
+ ...setupModelValue(args),
54
+ ...setupModelValues(args),
55
+ args: {
56
+ ...args,
57
+ updateOnlyOnSubmit: args.suggestions !== void 0
58
+ }
59
+ }),
60
+ template: `
61
+ Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>
62
+
63
+ <lib-input
64
+ v-bind="args"
65
+ v-model:values="values"
66
+ v-model="modelValue"
67
+ @submit="modelValue = $event"
68
+ >
69
+ </lib-input>
70
+ `
71
+ })
72
+ };
73
+ export const Primary = {
74
+ ...Base,
75
+ play: playBasicVModel
76
+ };
77
+ export const Disabled = {
78
+ ...Base,
79
+ args: {
80
+ disabled: true
81
+ }
82
+ };
83
+ export const Readonly = {
84
+ ...Base,
85
+ args: {
86
+ readonly: true
87
+ }
88
+ };
89
+ export const Invalid = {
90
+ ...Base,
91
+ args: {
92
+ valid: false
93
+ }
94
+ };
95
+ export const AttrsPassword = {
96
+ ...Base,
97
+ args: {
98
+ type: "password"
99
+ }
100
+ };
101
+ export const AttrsDate = {
102
+ ...Base,
103
+ args: {
104
+ type: "date"
105
+ }
106
+ };
107
+ export const AttrsNumber = {
108
+ ...Base,
109
+ args: {
110
+ type: "number"
111
+ }
112
+ };
113
+ export const Borderless = {
114
+ ...Base,
115
+ args: {
116
+ border: false,
117
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
118
+ }
119
+ };
120
+ export const WithAutosuggest = {
121
+ ...Base,
122
+ args: {
123
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
124
+ },
125
+ play: playAutosuggestSelectLike
126
+ };
127
+ export const WithInstantAutosuggest = {
128
+ ...Base,
129
+ args: {
130
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
131
+ }
132
+ };
133
+ export const AutosuggestRestricted = {
134
+ ...WithAutosuggest,
135
+ args: {
136
+ ...WithAutosuggest.args,
137
+ restrictToSuggestions: true
138
+ },
139
+ play: playAutosuggestSelectLike
140
+ };
141
+ export const AutosuggestSelectLikeShowAllUnrestricted = {
142
+ ...WithAutosuggest,
143
+ args: {
144
+ ...WithAutosuggest.args,
145
+ restrictToSuggestions: false,
146
+ suggestionsFilter: (_input, items) => items
147
+ },
148
+ play: playAutosuggestSelectLike
149
+ };
150
+ export const AutosuggestObjectOptions = {
151
+ ...WithAutosuggest,
152
+ args: {
153
+ ...WithAutosuggest.args,
154
+ restrictToSuggestions: true,
155
+ suggestions: [
156
+ { label: "A", other: "some data A" },
157
+ { label: "AB", other: "some data AB" },
158
+ { label: "ABC", other: "some data ABC" },
159
+ { label: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", other: "some data ABCDEFGHIJKLMNOPQRSTUVWXYZ" }
160
+ ],
161
+ suggestionLabel: (item) => item.label
162
+ },
163
+ play: playAutosuggestSelectLike
164
+ };
165
+ export const Slots = {
166
+ render: (args) => ({
167
+ components: allComponents,
168
+ setup: () => ({
169
+ ...setupModelValue(args),
170
+ ...setupModelValues(args),
171
+ args: {
172
+ ...args,
173
+ updateOnlyOnSubmit: args.suggestions !== void 0
174
+ }
175
+ }),
176
+ template: `
177
+ Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>
178
+
179
+
180
+ <lib-input
181
+ v-bind="args"
182
+ v-model="modelValue"
183
+ v-model:values="values"
184
+ >
185
+ <template #label>
186
+ Custom Label Slot
187
+ </template>
188
+ <template #left>
189
+ <lib-button class="px-0" :border="false" :label="'none'">
190
+ <icon><icon-fa-chevron-left/></icon>
191
+ </lib-button>
192
+ </template>
193
+ <template #right>
194
+ <lib-button class="px-0" :border="false" :label="'none'">
195
+ <icon><icon-fa-chevron-right/></icon>
196
+ </lib-button>
197
+ </template>
198
+ </lib-input>
199
+ `
200
+ })
201
+ };
202
+ const MultipleValuesBase = {
203
+ render: (args) => ({
204
+ components: allComponents,
205
+ setup: () => ({
206
+ ...setupModelValue(args),
207
+ ...setupModelValues(args),
208
+ args
209
+ }),
210
+ template: `
211
+ Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>
212
+
213
+ <br/>
214
+ Values: <span class="inline-block" data-testid="values">{{values.join(", ")}}</span>
215
+
216
+ <lib-input
217
+ v-bind="args"
218
+ v-model="modelValue"
219
+ v-model:values="values"
220
+ >
221
+ <template #left>
222
+ <lib-button class="px-0" :border="false">
223
+ <icon><icon-fa-solid-tags/></icon>
224
+ </lib-button>
225
+ </template>
226
+ </lib-input>
227
+ `
228
+ }),
229
+ args: {
230
+ values: ["A", "B", "C"]
231
+ }
232
+ };
233
+ export const WithMultipleValues = {
234
+ ...MultipleValuesBase,
235
+ play: playMultipleValues
236
+ };
237
+ export const WithMultipleValuesWithSuggestions = {
238
+ ...MultipleValuesBase,
239
+ args: {
240
+ ...MultipleValuesBase.args,
241
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
242
+ },
243
+ play: playAutosuggestSelectLike
244
+ };
245
+ export const WithMultipleValuesDisabled = {
246
+ ...MultipleValuesBase,
247
+ args: {
248
+ ...MultipleValuesBase.args,
249
+ disabled: true
250
+ }
251
+ };
252
+ export const WithMultipleValuesReadonly = {
253
+ ...MultipleValuesBase,
254
+ args: {
255
+ ...MultipleValuesBase.args,
256
+ readonly: true
257
+ }
258
+ };
259
+ export const InputSlotReplacement = {
260
+ render: (args) => ({
261
+ components: allComponents,
262
+ directives: { vExtractRootEl },
263
+ setup: () => {
264
+ const recording = ref(false);
265
+ const recordingValue = ref("");
266
+ const modelValue = ref("K E Y S");
267
+ const values = ref(args.values ?? []);
268
+ const recorderEl = ref(null);
269
+ const recorder = createRecorderHandler(recordingValue, recording, modelValue, recorderEl);
270
+ watchEffect(createRecorderWatchEffect(recordingValue, recording, modelValue, values));
271
+ return {
272
+ recorder,
273
+ recording,
274
+ recordingValue,
275
+ recorderEl,
276
+ modelValue,
277
+ values,
278
+ args
279
+ };
280
+ },
281
+ template: `
282
+ Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>
283
+
284
+ <br/>
285
+ Values: <span class="inline-block" data-testid="values">{{values.join(", ")}}</span>
286
+
287
+ <br/>
288
+ Recording: <span class="inline-block" data-testid="recording">{{recording}}</span>
289
+
290
+ <lib-input
291
+ v-bind="args"
292
+ v-model="modelValue"
293
+ v-model:values="values"
294
+ >
295
+ <template #input >
296
+ <lib-recorder
297
+ class="p-0"
298
+ v-extract-root-el="_ => recorderEl = _"
299
+ :border="false"
300
+ :recordingValue="recordingValue"
301
+ :recorder="recorder"
302
+ v-model:recording="recording"
303
+ v-model="modelValue"
304
+ @recorder:click="recording = !recording"
305
+ @recorder:blur="recordingValue = modelValue; recording = false"
306
+ />
307
+ </template>
308
+ <template #left>
309
+ <icon><icon-fa-solid-keyboard/></icon>
310
+ </template>
311
+ </lib-input>
312
+ `
313
+ }),
314
+ args: {
315
+ values: ["A", "B", "C"]
316
+ }
317
+ };
318
+ export const NextToButton = {
319
+ render: (args) => ({
320
+ components: allComponents,
321
+ setup: () => ({
322
+ ...setupModelValue(args),
323
+ ...setupModelValues(args),
324
+ args
325
+ }),
326
+ template: `
327
+ <div class="flex gap-2 items-center">
328
+ <lib-input
329
+ v-bind="args"
330
+ v-model:values="values"
331
+ v-model="modelValue"
332
+ :label="undefined"
333
+ >
334
+ </lib-input>
335
+ <lib-button>Button</lib-button>
336
+ </div>
337
+ `
338
+ })
339
+ };