@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,367 @@
1
+ /* eslint-disable @typescript-eslint/naming-convention */
2
+ import type { Meta, StoryObj } from "@storybook/vue3"
3
+ import { ref, watchEffect } from "vue"
4
+
5
+ import LibInput from "./LibInput.vue"
6
+
7
+ import IconFaChevronLeft from "~icons/fa6-solid/chevron-left"
8
+ import IconFaChevronRight from "~icons/fa6-solid/chevron-right"
9
+ import IconFaSolidKeyboard from "~icons/fa6-solid/keyboard"
10
+ import IconFaSolidTags from "~icons/fa6-solid/tags"
11
+
12
+ import { vExtractRootEl } from "../../directives/vExtractRootEl.js"
13
+ import { createRecorderHandler, createRecorderWatchEffect } from "../../helpers/storybook.js"
14
+ import Icon from "../Icon/Icon.vue"
15
+ // eslint-disable-next-line @typescript-eslint/no-restricted-imports
16
+ import * as components from "../index.js"
17
+ import {
18
+ playBasicVModel,
19
+ playMultipleValues
20
+ } from "../shared/storyHelpers/playInput.js"
21
+ import {
22
+ playBasicClickSelect,
23
+ playBasicKeyboardSelect,
24
+ playBasicSelect,
25
+ } from "../shared/storyHelpers/playSuggestions.js"
26
+
27
+ const meta = {
28
+ component: LibInput as any,
29
+ title: "Components/Input",
30
+ args: {
31
+ border: true,
32
+ label: "Some Label",
33
+ },
34
+ } satisfies Meta<typeof LibInput> & Meta<{ custom: string }>
35
+
36
+ export default meta
37
+ type Story = StoryObj<typeof LibInput> // & StoryObj<typeof extraArgs>
38
+ const allComponents = {
39
+ ...components,
40
+ LibInput,
41
+ Icon,
42
+ IconFaChevronRight,
43
+ IconFaChevronLeft,
44
+ IconFaSolidKeyboard,
45
+ IconFaSolidTags,
46
+ }
47
+
48
+
49
+ const playAutosuggestSelectLike = async (context: { canvasElement: HTMLElement, args: any }) => {
50
+ await playBasicSelect(context)
51
+ await playBasicKeyboardSelect(context)
52
+ await playBasicClickSelect(context)
53
+ }
54
+
55
+ const setupModelValue = (args: any) => ({
56
+ modelValue: ref(args.modelValue ?? ""),
57
+ })
58
+
59
+ const setupModelValues = (args: any) => ({
60
+ values: ref(args.values ?? undefined),
61
+ })
62
+
63
+ const Base: Story = {
64
+ render: args => ({
65
+ components: allComponents,
66
+ setup: () => ({
67
+ ...setupModelValue(args),
68
+ ...setupModelValues(args),
69
+ args: {
70
+ ...args,
71
+ updateOnlyOnSubmit: args.suggestions !== undefined,
72
+ },
73
+ }),
74
+
75
+ template: `
76
+ Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>\n
77
+ <lib-input
78
+ v-bind="args"
79
+ v-model:values="values"
80
+ v-model="modelValue"
81
+ @submit="modelValue = $event"
82
+ >
83
+ </lib-input>
84
+ `,
85
+ }),
86
+ }
87
+
88
+ export const Primary: Story = {
89
+ ...Base,
90
+ play: playBasicVModel
91
+ }
92
+
93
+ export const Disabled: Story = {
94
+ ...Base,
95
+ args: {
96
+ disabled: true,
97
+ },
98
+ }
99
+ export const Readonly: Story = {
100
+ ...Base,
101
+ args: {
102
+ readonly: true,
103
+ },
104
+ }
105
+ export const Invalid: Story = {
106
+ ...Base,
107
+ args: {
108
+ valid: false,
109
+ },
110
+ }
111
+
112
+ export const AttrsPassword: Story = {
113
+ ...Base,
114
+ args: {
115
+ type: "password",
116
+ } as any,
117
+ }
118
+ export const AttrsDate: Story = {
119
+ ...Base,
120
+ args: {
121
+ type: "date",
122
+ } as any,
123
+ }
124
+ export const AttrsNumber: Story = {
125
+ ...Base,
126
+ args: {
127
+ type: "number",
128
+ } as any,
129
+ }
130
+
131
+ export const Borderless = {
132
+ ...Base,
133
+ args: {
134
+ border: false,
135
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"],
136
+ },
137
+ }
138
+
139
+
140
+ export const WithAutosuggest = {
141
+ ...Base,
142
+ args: {
143
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"],
144
+ },
145
+ play: playAutosuggestSelectLike
146
+ }
147
+ export const WithInstantAutosuggest = {
148
+ ...Base,
149
+ args: {
150
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"],
151
+ },
152
+ }
153
+ export const AutosuggestRestricted = {
154
+ ...WithAutosuggest,
155
+ args: {
156
+ ...WithAutosuggest.args,
157
+ restrictToSuggestions: true,
158
+ },
159
+ play: playAutosuggestSelectLike
160
+ }
161
+ export const AutosuggestSelectLikeShowAllUnrestricted = {
162
+ ...WithAutosuggest,
163
+ args: {
164
+ ...WithAutosuggest.args,
165
+ restrictToSuggestions: false,
166
+ suggestionsFilter: (_input: string, items: string[]) => items,
167
+ },
168
+ play: playAutosuggestSelectLike
169
+ }
170
+ export const AutosuggestObjectOptions = {
171
+ ...WithAutosuggest,
172
+ args: {
173
+ ...WithAutosuggest.args,
174
+ restrictToSuggestions: true,
175
+ suggestions: [
176
+ { label: "A", other: "some data A" },
177
+ { label: "AB", other: "some data AB" },
178
+ { label: "ABC", other: "some data ABC" },
179
+ { label: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", other: "some data ABCDEFGHIJKLMNOPQRSTUVWXYZ" },
180
+ ],
181
+ suggestionLabel: (item: any) => item.label,
182
+ },
183
+ play: playAutosuggestSelectLike
184
+ }
185
+
186
+ export const Slots: Story = {
187
+ render: args => ({
188
+ components: allComponents,
189
+ setup: () => ({
190
+ ...setupModelValue(args),
191
+ ...setupModelValues(args),
192
+ args: {
193
+ ...args,
194
+ updateOnlyOnSubmit: args.suggestions !== undefined,
195
+ },
196
+ })
197
+ ,
198
+ template: `
199
+ Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>\n
200
+
201
+ <lib-input
202
+ v-bind="args"
203
+ v-model="modelValue"
204
+ v-model:values="values"
205
+ >
206
+ <template #label>
207
+ Custom Label Slot
208
+ </template>
209
+ <template #left>
210
+ <lib-button class="px-0" :border="false" :label="'none'">
211
+ <icon><icon-fa-chevron-left/></icon>
212
+ </lib-button>
213
+ </template>
214
+ <template #right>
215
+ <lib-button class="px-0" :border="false" :label="'none'">
216
+ <icon><icon-fa-chevron-right/></icon>
217
+ </lib-button>
218
+ </template>
219
+ </lib-input>
220
+ `,
221
+ }),
222
+ }
223
+ const MultipleValuesBase: Story = {
224
+ render: args => ({
225
+ components: allComponents,
226
+ setup: () => ({
227
+ ...setupModelValue(args),
228
+ ...setupModelValues(args),
229
+ args,
230
+ })
231
+ ,
232
+
233
+ template: `
234
+ Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>\n
235
+ <br/>
236
+ Values: <span class="inline-block" data-testid="values">{{values.join(", ")}}</span>\n
237
+ <lib-input
238
+ v-bind="args"
239
+ v-model="modelValue"
240
+ v-model:values="values"
241
+ >
242
+ <template #left>
243
+ <lib-button class="px-0" :border="false">
244
+ <icon><icon-fa-solid-tags/></icon>
245
+ </lib-button>
246
+ </template>
247
+ </lib-input>
248
+ `,
249
+ }),
250
+ args: {
251
+ values: ["A", "B", "C"],
252
+ },
253
+
254
+ }
255
+ /** Press enter to add a value. */
256
+ export const WithMultipleValues: Story = {
257
+ ...MultipleValuesBase,
258
+ play: playMultipleValues
259
+ }
260
+
261
+ export const WithMultipleValuesWithSuggestions = {
262
+ ...MultipleValuesBase,
263
+ args: {
264
+ ...MultipleValuesBase.args,
265
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"],
266
+ },
267
+ play: playAutosuggestSelectLike
268
+ }
269
+ export const WithMultipleValuesDisabled = {
270
+ ...MultipleValuesBase,
271
+ args: {
272
+ ...MultipleValuesBase.args,
273
+ disabled: true,
274
+ },
275
+ }
276
+ export const WithMultipleValuesReadonly = {
277
+ ...MultipleValuesBase,
278
+ args: {
279
+ ...MultipleValuesBase.args,
280
+ readonly: true,
281
+ },
282
+ }
283
+
284
+ export const InputSlotReplacement: Story = {
285
+ render: args => ({
286
+ components: allComponents,
287
+ directives: { vExtractRootEl },
288
+ setup: () => {
289
+ const recording = ref(false)
290
+ const recordingValue = ref("")
291
+ const modelValue = ref("K E Y S")
292
+ const values = ref<string[]>((args.values as any) ?? [])
293
+ const recorderEl = ref(null)
294
+ const recorder = createRecorderHandler(recordingValue, recording, modelValue, recorderEl)
295
+ watchEffect(createRecorderWatchEffect(recordingValue, recording, modelValue, values as any))
296
+ return {
297
+ recorder,
298
+ recording,
299
+ recordingValue,
300
+ recorderEl,
301
+ modelValue,
302
+ values,
303
+ args,
304
+ }
305
+ }
306
+ ,
307
+
308
+ template: `
309
+ Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>\n
310
+ <br/>
311
+ Values: <span class="inline-block" data-testid="values">{{values.join(", ")}}</span>\n
312
+ <br/>
313
+ Recording: <span class="inline-block" data-testid="recording">{{recording}}</span>\n
314
+ <lib-input
315
+ v-bind="args"
316
+ v-model="modelValue"
317
+ v-model:values="values"
318
+ >
319
+ <template #input >
320
+ <lib-recorder
321
+ class="p-0"
322
+ v-extract-root-el="_ => recorderEl = _"
323
+ :border="false"
324
+ :recordingValue="recordingValue"
325
+ :recorder="recorder"
326
+ v-model:recording="recording"
327
+ v-model="modelValue"
328
+ @recorder:click="recording = !recording"
329
+ @recorder:blur="recordingValue = modelValue; recording = false"
330
+ />
331
+ </template>
332
+ <template #left>
333
+ <icon><icon-fa-solid-keyboard/></icon>
334
+ </template>
335
+ </lib-input>
336
+ `,
337
+ }),
338
+ args: {
339
+ values: ["A", "B", "C"],
340
+ },
341
+ }
342
+
343
+
344
+ export const NextToButton: Story = {
345
+ render: args => ({
346
+ components: allComponents,
347
+ setup: () => ({
348
+ ...setupModelValue(args),
349
+ ...setupModelValues(args),
350
+ args,
351
+ }),
352
+
353
+ template: `
354
+ <div class="flex gap-2 items-center">
355
+ <lib-input
356
+ v-bind="args"
357
+ v-model:values="values"
358
+ v-model="modelValue"
359
+ :label="undefined"
360
+ >
361
+ </lib-input>
362
+ <lib-button>Button</lib-button>
363
+ </div>
364
+ `,
365
+ }),
366
+ }
367
+