@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.
- package/README.md +54 -61
- package/dist/module.json +1 -1
- package/dist/module.mjs +1 -1
- package/dist/runtime/assets/animations.css +1 -1
- package/dist/runtime/assets/locales/en.json +2 -0
- package/dist/runtime/build/WitchcraftUiResolver.js +2 -2
- package/dist/runtime/components/TestControls/TestControls.vue +3 -3
- package/dist/runtime/components/WButton/WButton.d.vue.ts +34 -0
- package/dist/runtime/components/{LibButton/LibButton.vue → WButton/WButton.vue} +26 -38
- package/dist/runtime/components/WButton/WButton.vue.d.ts +34 -0
- package/dist/runtime/components/WCheckbox/WCheckbox.d.vue.ts +33 -0
- package/dist/runtime/components/WCheckbox/WCheckbox.vue +110 -0
- package/dist/runtime/components/WCheckbox/WCheckbox.vue.d.ts +33 -0
- package/dist/runtime/components/WColorInput/WColorInput.d.vue.ts +45 -0
- package/dist/runtime/components/WColorInput/WColorInput.vue +85 -0
- package/dist/runtime/components/WColorInput/WColorInput.vue.d.ts +45 -0
- package/dist/runtime/components/WColorInput/WColorSwatchButton.d.vue.ts +28 -0
- package/dist/runtime/components/WColorInput/WColorSwatchButton.vue +86 -0
- package/dist/runtime/components/WColorInput/WColorSwatchButton.vue.d.ts +28 -0
- package/dist/runtime/components/{LibColorPicker/LibColorPicker.d.vue.ts → WColorPicker/WColorPicker.d.vue.ts} +7 -6
- package/dist/runtime/components/{LibColorPicker/LibColorPicker.vue → WColorPicker/WColorPicker.vue} +41 -29
- package/dist/runtime/components/{LibColorPicker/LibColorPicker.vue.d.ts → WColorPicker/WColorPicker.vue.d.ts} +7 -6
- package/dist/runtime/components/WCombobox/WCombobox.d.vue.ts +111 -0
- package/dist/runtime/components/WCombobox/WCombobox.vue +405 -0
- package/dist/runtime/components/WCombobox/WCombobox.vue.d.ts +111 -0
- package/dist/runtime/components/WCombobox/storyPlays.d.ts +18 -0
- package/dist/runtime/components/WCombobox/storyPlays.js +68 -0
- package/dist/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.d.vue.ts → WDarkModeSwitcher/WDarkModeSwitcher.d.vue.ts} +8 -13
- package/dist/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.vue → WDarkModeSwitcher/WDarkModeSwitcher.vue} +11 -14
- package/dist/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.vue.d.ts → WDarkModeSwitcher/WDarkModeSwitcher.vue.d.ts} +8 -13
- package/dist/runtime/components/WDatePicker/WDatePicker.d.vue.ts +40 -0
- package/dist/runtime/components/{LibDatePicker/LibDatePicker.vue → WDatePicker/WDatePicker.vue} +3 -7
- package/dist/runtime/components/WDatePicker/WDatePicker.vue.d.ts +40 -0
- package/dist/runtime/components/{LibDatePicker/LibRangeDatePicker.vue → WDatePicker/WRangeDatePicker.vue} +21 -21
- package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.vue → WDatePicker/WSingleDatePicker.vue} +21 -21
- package/dist/runtime/components/{LibDatePicker/LibTimeZonePicker.d.vue.ts → WDatePicker/WTimeZonePicker.d.vue.ts} +1 -11
- package/dist/runtime/components/{LibDatePicker/LibTimeZonePicker.vue → WDatePicker/WTimeZonePicker.vue} +5 -12
- package/dist/runtime/components/{LibDatePicker/LibTimeZonePicker.vue.d.ts → WDatePicker/WTimeZonePicker.vue.d.ts} +1 -11
- package/dist/runtime/components/{LibDebug/LibDebug.vue → WDebug/WDebug.vue} +10 -12
- package/dist/runtime/components/{LibDevOnly/LibDevOnly.d.vue.ts → WDevOnly/WDevOnly.d.vue.ts} +0 -3
- package/dist/runtime/components/{LibDevOnly/LibDevOnly.vue.d.ts → WDevOnly/WDevOnly.vue.d.ts} +0 -3
- package/dist/runtime/components/WFileInput/WFileInput.d.vue.ts +58 -0
- package/dist/runtime/components/{LibFileInput/LibFileInput.vue → WFileInput/WFileInput.vue} +74 -57
- package/dist/runtime/components/WFileInput/WFileInput.vue.d.ts +58 -0
- package/dist/runtime/components/{Icon/Icon.vue.d.ts → WIcon/WIcon.d.vue.ts} +2 -6
- package/dist/runtime/components/{Icon/Icon.vue → WIcon/WIcon.vue} +1 -1
- package/dist/runtime/components/{Icon/Icon.d.vue.ts → WIcon/WIcon.vue.d.ts} +2 -6
- package/dist/runtime/components/{LibMultiValues/LibMultiValues.d.vue.ts → WMultiValues/WMultiValues.d.vue.ts} +8 -14
- package/dist/runtime/components/WMultiValues/WMultiValues.vue +150 -0
- package/dist/runtime/components/{LibMultiValues/LibMultiValues.vue.d.ts → WMultiValues/WMultiValues.vue.d.ts} +8 -14
- package/dist/runtime/components/WNotifications/WNotification.d.vue.ts +37 -0
- package/dist/runtime/components/{LibNotifications/LibNotification.vue → WNotifications/WNotification.vue} +34 -47
- package/dist/runtime/components/WNotifications/WNotification.vue.d.ts +37 -0
- package/dist/runtime/components/WNotifications/WNotifications.d.vue.ts +11 -0
- package/dist/runtime/components/{LibNotifications/LibNotifications.vue → WNotifications/WNotifications.vue} +35 -17
- package/dist/runtime/components/WNotifications/WNotifications.vue.d.ts +11 -0
- package/dist/runtime/components/WNumberInput/WNumberInput.d.vue.ts +27 -0
- package/dist/runtime/components/WNumberInput/WNumberInput.vue +96 -0
- package/dist/runtime/components/WNumberInput/WNumberInput.vue.d.ts +27 -0
- package/dist/runtime/components/WPagination/WPagination.d.vue.ts +59 -0
- package/dist/runtime/components/WPagination/WPagination.vue +182 -0
- package/dist/runtime/components/WPagination/WPagination.vue.d.ts +59 -0
- package/dist/runtime/components/WPalette/WPalette.d.vue.ts +11 -0
- package/dist/runtime/components/{LibPalette/LibPalette.vue → WPalette/WPalette.vue} +3 -8
- package/dist/runtime/components/WPalette/WPalette.vue.d.ts +11 -0
- package/dist/runtime/components/WPopover/WPopover.d.vue.ts +45 -0
- package/dist/runtime/components/WPopover/WPopover.vue +144 -0
- package/dist/runtime/components/WPopover/WPopover.vue.d.ts +45 -0
- package/dist/runtime/components/WPopup/WPopup.d.vue.ts +51 -0
- package/dist/runtime/components/WPopup/WPopup.vue +106 -0
- package/dist/runtime/components/WPopup/WPopup.vue.d.ts +51 -0
- package/dist/runtime/components/{LibProgressBar/LibProgressBar.d.vue.ts → WProgressBar/WProgressBar.d.vue.ts} +14 -18
- package/dist/runtime/components/WProgressBar/WProgressBar.vue +150 -0
- package/dist/runtime/components/{LibProgressBar/LibProgressBar.vue.d.ts → WProgressBar/WProgressBar.vue.d.ts} +14 -18
- package/dist/runtime/components/{LibRecorder/LibRecorder.d.vue.ts → WRecorder/WRecorder.d.vue.ts} +14 -29
- package/dist/runtime/components/{LibRecorder/LibRecorder.vue → WRecorder/WRecorder.vue} +37 -36
- package/dist/runtime/components/{LibRecorder/LibRecorder.vue.d.ts → WRecorder/WRecorder.vue.d.ts} +14 -29
- package/dist/runtime/components/{LibRoot/LibRoot.d.vue.ts → WRoot/WRoot.d.vue.ts} +6 -5
- package/dist/runtime/components/{LibRoot/LibRoot.vue → WRoot/WRoot.vue} +17 -15
- package/dist/runtime/components/{LibRoot/LibRoot.vue.d.ts → WRoot/WRoot.vue.d.ts} +6 -5
- package/dist/runtime/components/{LibSimpleInput/LibSimpleInput.d.vue.ts → WSimpleInput/WSimpleInput.d.vue.ts} +10 -16
- package/dist/runtime/components/{LibSimpleInput/LibSimpleInput.vue → WSimpleInput/WSimpleInput.vue} +14 -24
- package/dist/runtime/components/{LibSimpleInput/LibSimpleInput.vue.d.ts → WSimpleInput/WSimpleInput.vue.d.ts} +10 -16
- package/dist/runtime/components/WTable/WTable.d.vue.ts +102 -0
- package/dist/runtime/components/{LibTable/LibTable.vue → WTable/WTable.vue} +13 -14
- package/dist/runtime/components/WTable/WTable.vue.d.ts +102 -0
- package/dist/runtime/components/WTooltip/WTooltip.d.vue.ts +40 -0
- package/dist/runtime/components/WTooltip/WTooltip.vue +112 -0
- package/dist/runtime/components/WTooltip/WTooltip.vue.d.ts +40 -0
- package/dist/runtime/components/index.d.ts +20 -20
- package/dist/runtime/components/index.js +20 -20
- package/dist/runtime/composables/index.d.ts +4 -4
- package/dist/runtime/composables/index.js +4 -4
- package/dist/runtime/composables/useDelayedLoadingIndicator.d.ts +9 -0
- package/dist/runtime/composables/useDelayedLoadingIndicator.js +18 -0
- package/dist/runtime/composables/useDisplayForReka.d.ts +25 -0
- package/dist/runtime/composables/useDisplayForReka.js +16 -0
- package/dist/runtime/composables/useFallbackId.d.ts +3 -0
- package/dist/runtime/composables/useFallbackId.js +5 -0
- package/dist/runtime/composables/useInjectedDarkMode.d.ts +1 -1
- package/dist/runtime/composables/usePopupConstrainToStyle.d.ts +8 -0
- package/dist/runtime/composables/usePopupConstrainToStyle.js +8 -0
- package/dist/runtime/composables/useSetupDarkMode.d.ts +2 -3
- package/dist/runtime/composables/useSetupDarkMode.js +90 -4
- package/dist/runtime/helpers/NotificationHandler.d.ts +2 -2
- package/dist/runtime/injectionKeys.d.ts +1 -5
- package/dist/runtime/injectionKeys.js +0 -2
- package/dist/runtime/types/index.d.ts +85 -27
- package/dist/runtime/types/index.js +1 -0
- package/package.json +1 -1
- package/src/module.ts +1 -1
- package/src/runtime/assets/animations.css +3 -3
- package/src/runtime/assets/locales/en.json +2 -0
- package/src/runtime/build/WitchcraftUiResolver.ts +2 -2
- package/src/runtime/components/TestControls/TestControls.vue +3 -3
- package/src/runtime/components/WButton/WButton.stories.ts +112 -0
- package/src/runtime/components/{LibButton/LibButton.vue → WButton/WButton.vue} +34 -50
- package/src/runtime/components/{LibCheckbox/LibCheckbox.stories.ts → WCheckbox/WCheckbox.stories.ts} +5 -5
- package/src/runtime/components/WCheckbox/WCheckbox.vue +125 -0
- package/src/runtime/components/{LibColorInput/LibColorInput.stories.ts → WColorInput/WColorInput.stories.ts} +8 -8
- package/src/runtime/components/WColorInput/WColorInput.vue +112 -0
- package/src/runtime/components/WColorInput/WColorSwatchButton.vue +102 -0
- package/src/runtime/components/{LibColorPicker/LibColorPicker.stories.ts → WColorPicker/WColorPicker.stories.ts} +12 -12
- package/src/runtime/components/{LibColorPicker/LibColorPicker.vue → WColorPicker/WColorPicker.vue} +44 -31
- package/src/runtime/components/WCombobox/WCombobox.stories.ts +209 -0
- package/src/runtime/components/WCombobox/WCombobox.vue +450 -0
- package/src/runtime/components/WCombobox/storyPlays.ts +92 -0
- package/src/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.stories.ts → WDarkModeSwitcher/WDarkModeSwitcher.stories.ts} +6 -6
- package/src/runtime/components/{LibDarkModeSwitcher/LibDarkModeSwitcher.vue → WDarkModeSwitcher/WDarkModeSwitcher.vue} +19 -30
- package/src/runtime/components/{LibDatePicker/LibDatePicker.stories.ts → WDatePicker/WDatePicker.stories.ts} +42 -34
- package/src/runtime/components/{LibDatePicker/LibDatePicker.vue → WDatePicker/WDatePicker.vue} +3 -7
- package/src/runtime/components/{LibDatePicker/LibRangeDatePicker.vue → WDatePicker/WRangeDatePicker.vue} +21 -21
- package/src/runtime/components/{LibDatePicker/LibSingleDatePicker.vue → WDatePicker/WSingleDatePicker.vue} +21 -21
- package/src/runtime/components/{LibDatePicker/LibTimeZonePicker.vue → WDatePicker/WTimeZonePicker.vue} +5 -12
- package/src/runtime/components/{LibDebug/LibDebug.stories.ts → WDebug/WDebug.stories.ts} +5 -5
- package/src/runtime/components/{LibDebug/LibDebug.vue → WDebug/WDebug.vue} +9 -10
- package/src/runtime/components/{LibDevOnly/LibDevOnly.vue → WDevOnly/WDevOnly.vue} +0 -4
- package/src/runtime/components/{LibFileInput/LibFileInput.stories.ts → WFileInput/WFileInput.stories.ts} +7 -7
- package/src/runtime/components/{LibFileInput/LibFileInput.vue → WFileInput/WFileInput.vue} +98 -97
- package/src/runtime/components/{Icon/Icon.vue → WIcon/WIcon.vue} +5 -8
- package/src/runtime/components/{LibMultiValues/LibMultiValues.stories.ts → WMultiValues/WMultiValues.stories.ts} +9 -9
- package/src/runtime/components/WMultiValues/WMultiValues.vue +163 -0
- package/src/runtime/components/{LibNotifications/LibNotification.stories.ts → WNotifications/WNotification.stories.ts} +9 -9
- package/src/runtime/components/{LibNotifications/LibNotification.vue → WNotifications/WNotification.vue} +45 -65
- package/src/runtime/components/WNotifications/WNotifications.stories.ts +139 -0
- package/src/runtime/components/{LibNotifications/LibNotifications.vue → WNotifications/WNotifications.vue} +51 -29
- package/src/runtime/components/WNumberInput/WNumberInput.vue +109 -0
- package/src/runtime/components/WPagination/WPagination.stories.ts +51 -0
- package/src/runtime/components/WPagination/WPagination.vue +207 -0
- package/src/runtime/components/{LibPalette/LibPalette.stories.ts → WPalette/WPalette.stories.ts} +6 -6
- package/src/runtime/components/{LibPalette/LibPalette.vue → WPalette/WPalette.vue} +3 -8
- package/src/runtime/components/WPopover/WPopover.stories.ts +218 -0
- package/src/runtime/components/WPopover/WPopover.vue +168 -0
- package/src/runtime/components/WPopup/WPopup.stories.ts +104 -0
- package/src/runtime/components/WPopup/WPopup.vue +125 -0
- package/src/runtime/components/WProgressBar/WProgressBar.stories.ts +119 -0
- package/src/runtime/components/WProgressBar/WProgressBar.vue +185 -0
- package/src/runtime/components/{LibRecorder/LibRecorder.stories.ts → WRecorder/WRecorder.stories.ts} +9 -6
- package/src/runtime/components/{LibRecorder/LibRecorder.vue → WRecorder/WRecorder.vue} +69 -68
- package/src/runtime/components/{LibRoot/LibRoot.vue → WRoot/WRoot.vue} +18 -15
- package/src/runtime/components/{LibSimpleInput/LibSimpleInput.stories.ts → WSimpleInput/WSimpleInput.stories.ts} +11 -12
- package/src/runtime/components/{LibSimpleInput/LibSimpleInput.vue → WSimpleInput/WSimpleInput.vue} +28 -44
- package/src/runtime/components/{LibTable/LibTable.stories.ts → WTable/WTable.stories.ts} +60 -52
- package/src/runtime/components/{LibTable/LibTable.vue → WTable/WTable.vue} +85 -88
- package/src/runtime/components/WTooltip/WTooltip.stories.ts +82 -0
- package/src/runtime/components/WTooltip/WTooltip.vue +128 -0
- package/src/runtime/components/index.ts +20 -20
- package/src/runtime/composables/index.ts +4 -4
- package/src/runtime/composables/useDelayedLoadingIndicator.ts +30 -0
- package/src/runtime/composables/useDisplayForReka.ts +37 -0
- package/src/runtime/composables/useFallbackId.ts +6 -0
- package/src/runtime/composables/useInjectedDarkMode.ts +1 -2
- package/src/runtime/composables/usePopupConstrainToStyle.ts +29 -0
- package/src/runtime/composables/useSetupDarkMode.ts +122 -4
- package/src/runtime/helpers/NotificationHandler.ts +2 -2
- package/src/runtime/injectionKeys.ts +1 -7
- package/src/runtime/types/index.ts +105 -32
- package/types/components.d.ts +14 -15
- package/dist/runtime/components/Aria/Aria.d.vue.ts +0 -6
- package/dist/runtime/components/Aria/Aria.vue +0 -16
- package/dist/runtime/components/Aria/Aria.vue.d.ts +0 -6
- package/dist/runtime/components/LibButton/LibButton.d.vue.ts +0 -37
- package/dist/runtime/components/LibButton/LibButton.vue.d.ts +0 -37
- package/dist/runtime/components/LibCheckbox/LibCheckbox.d.vue.ts +0 -41
- package/dist/runtime/components/LibCheckbox/LibCheckbox.vue +0 -103
- package/dist/runtime/components/LibCheckbox/LibCheckbox.vue.d.ts +0 -41
- package/dist/runtime/components/LibColorInput/LibColorInput.d.vue.ts +0 -64
- package/dist/runtime/components/LibColorInput/LibColorInput.vue +0 -162
- package/dist/runtime/components/LibColorInput/LibColorInput.vue.d.ts +0 -64
- package/dist/runtime/components/LibDatePicker/LibDatePicker.d.vue.ts +0 -191
- package/dist/runtime/components/LibDatePicker/LibDatePicker.vue.d.ts +0 -191
- package/dist/runtime/components/LibFileInput/LibFileInput.d.vue.ts +0 -46
- package/dist/runtime/components/LibFileInput/LibFileInput.vue.d.ts +0 -46
- package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.d.vue.ts +0 -256
- package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.vue +0 -387
- package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.vue.d.ts +0 -256
- package/dist/runtime/components/LibLabel/LibLabel.d.vue.ts +0 -27
- package/dist/runtime/components/LibLabel/LibLabel.vue +0 -45
- package/dist/runtime/components/LibLabel/LibLabel.vue.d.ts +0 -27
- package/dist/runtime/components/LibMultiValues/LibMultiValues.vue +0 -109
- package/dist/runtime/components/LibNotifications/LibNotification.d.vue.ts +0 -45
- package/dist/runtime/components/LibNotifications/LibNotification.vue.d.ts +0 -45
- package/dist/runtime/components/LibNotifications/LibNotifications.d.vue.ts +0 -15
- package/dist/runtime/components/LibNotifications/LibNotifications.vue.d.ts +0 -15
- package/dist/runtime/components/LibPagination/LibPagination.d.vue.ts +0 -105
- package/dist/runtime/components/LibPagination/LibPagination.vue +0 -229
- package/dist/runtime/components/LibPagination/LibPagination.vue.d.ts +0 -105
- package/dist/runtime/components/LibPalette/LibPalette.d.vue.ts +0 -15
- package/dist/runtime/components/LibPalette/LibPalette.vue.d.ts +0 -15
- package/dist/runtime/components/LibPopup/LibPopup.d.vue.ts +0 -52
- package/dist/runtime/components/LibPopup/LibPopup.vue +0 -365
- package/dist/runtime/components/LibPopup/LibPopup.vue.d.ts +0 -52
- package/dist/runtime/components/LibProgressBar/LibProgressBar.vue +0 -169
- package/dist/runtime/components/LibSuggestions/LibSuggestions.d.vue.ts +0 -99
- package/dist/runtime/components/LibSuggestions/LibSuggestions.vue +0 -178
- package/dist/runtime/components/LibSuggestions/LibSuggestions.vue.d.ts +0 -99
- package/dist/runtime/components/LibTable/LibTable.d.vue.ts +0 -125
- package/dist/runtime/components/LibTable/LibTable.vue.d.ts +0 -125
- package/dist/runtime/components/Template/NAME.d.vue.ts +0 -18
- package/dist/runtime/components/Template/NAME.vue +0 -27
- package/dist/runtime/components/Template/NAME.vue.d.ts +0 -18
- package/dist/runtime/components/Template/TemplateStory.d.ts +0 -7
- package/dist/runtime/components/Template/TemplateStory.js +0 -22
- package/dist/runtime/components/shared/props.d.ts +0 -171
- package/dist/runtime/components/shared/props.js +0 -2
- package/dist/runtime/composables/useAriaLabel.d.ts +0 -6
- package/dist/runtime/composables/useAriaLabel.js +0 -15
- package/dist/runtime/composables/useDarkMode.d.ts +0 -77
- package/dist/runtime/composables/useDarkMode.js +0 -89
- package/dist/runtime/composables/useDivideAttrs.d.ts +0 -27
- package/dist/runtime/composables/useDivideAttrs.js +0 -27
- package/dist/runtime/composables/useSuggestions.d.ts +0 -40
- package/dist/runtime/composables/useSuggestions.js +0 -263
- package/src/runtime/components/Aria/Aria.vue +0 -26
- package/src/runtime/components/LibButton/LibButton.stories.ts +0 -106
- package/src/runtime/components/LibCheckbox/LibCheckbox.vue +0 -131
- package/src/runtime/components/LibColorInput/LibColorInput.vue +0 -203
- package/src/runtime/components/LibInputDeprecated/LibInputDeprecated.stories.ts +0 -405
- package/src/runtime/components/LibInputDeprecated/LibInputDeprecated.vue +0 -419
- package/src/runtime/components/LibLabel/LibLabel.stories.ts +0 -33
- package/src/runtime/components/LibLabel/LibLabel.vue +0 -65
- package/src/runtime/components/LibMultiValues/LibMultiValues.vue +0 -123
- package/src/runtime/components/LibNotifications/LibNotifications.stories.ts +0 -131
- package/src/runtime/components/LibPagination/LibPagination.stories.ts +0 -49
- package/src/runtime/components/LibPagination/LibPagination.vue +0 -274
- package/src/runtime/components/LibPopup/LibPopup.stories.ts +0 -153
- package/src/runtime/components/LibPopup/LibPopup.vue +0 -396
- package/src/runtime/components/LibProgressBar/LibProgressBar.stories.ts +0 -90
- package/src/runtime/components/LibProgressBar/LibProgressBar.vue +0 -197
- package/src/runtime/components/LibSuggestions/LibSuggestions.stories.ts +0 -134
- package/src/runtime/components/LibSuggestions/LibSuggestions.vue +0 -212
- package/src/runtime/components/Template/NAME.vue +0 -49
- package/src/runtime/components/Template/TemplateStory.ts +0 -37
- package/src/runtime/components/shared/props.ts +0 -199
- package/src/runtime/composables/useAriaLabel.ts +0 -23
- package/src/runtime/composables/useDarkMode.ts +0 -199
- package/src/runtime/composables/useDivideAttrs.ts +0 -53
- package/src/runtime/composables/useSuggestions.ts +0 -339
- /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToHsva.d.ts +0 -0
- /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToHsva.js +0 -0
- /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToRgba.d.ts +0 -0
- /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToRgba.js +0 -0
- /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/toLowPrecisionRgbaString.d.ts +0 -0
- /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/toLowPrecisionRgbaString.js +0 -0
- /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/truncate.d.ts +0 -0
- /package/dist/runtime/components/{LibColorPicker → WColorPicker}/utils/truncate.js +0 -0
- /package/dist/runtime/components/{LibDatePicker/LibRangeDatePicker.d.vue.ts → WDatePicker/WRangeDatePicker.d.vue.ts} +0 -0
- /package/dist/runtime/components/{LibDatePicker/LibRangeDatePicker.vue.d.ts → WDatePicker/WRangeDatePicker.vue.d.ts} +0 -0
- /package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.d.vue.ts → WDatePicker/WSingleDatePicker.d.vue.ts} +0 -0
- /package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.vue.d.ts → WDatePicker/WSingleDatePicker.vue.d.ts} +0 -0
- /package/dist/runtime/components/{LibDatePicker → WDatePicker}/helpers.d.ts +0 -0
- /package/dist/runtime/components/{LibDatePicker → WDatePicker}/helpers.js +0 -0
- /package/dist/runtime/components/{LibDebug/LibDebug.d.vue.ts → WDebug/WDebug.d.vue.ts} +0 -0
- /package/dist/runtime/components/{LibDebug/LibDebug.vue.d.ts → WDebug/WDebug.vue.d.ts} +0 -0
- /package/dist/runtime/components/{LibDevOnly/LibDevOnly.vue → WDevOnly/WDevOnly.vue} +0 -0
- /package/dist/runtime/components/{LibNotifications/LibNotificationTestMessageComponent.d.vue.ts → WNotifications/WNotificationTestMessageComponent.d.vue.ts} +0 -0
- /package/dist/runtime/components/{LibNotifications/LibNotificationTestMessageComponent.vue → WNotifications/WNotificationTestMessageComponent.vue} +0 -0
- /package/dist/runtime/components/{LibNotifications/LibNotificationTestMessageComponent.vue.d.ts → WNotifications/WNotificationTestMessageComponent.vue.d.ts} +0 -0
- /package/dist/runtime/components/{LibNotifications → WNotifications}/calculateNotificationProgress.d.ts +0 -0
- /package/dist/runtime/components/{LibNotifications → WNotifications}/calculateNotificationProgress.js +0 -0
- /package/src/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToHsva.ts +0 -0
- /package/src/runtime/components/{LibColorPicker → WColorPicker}/utils/safeConvertToRgba.ts +0 -0
- /package/src/runtime/components/{LibColorPicker → WColorPicker}/utils/toLowPrecisionRgbaString.ts +0 -0
- /package/src/runtime/components/{LibColorPicker → WColorPicker}/utils/truncate.ts +0 -0
- /package/src/runtime/components/{LibDatePicker → WDatePicker}/helpers.ts +0 -0
- /package/src/runtime/components/{LibNotifications/LibNotificationTestMessageComponent.vue → WNotifications/WNotificationTestMessageComponent.vue} +0 -0
- /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
|
-
<
|
|
17
|
+
<WButton
|
|
18
18
|
class="debug--copy-button w-min-content"
|
|
19
19
|
@click="copy()"
|
|
20
20
|
>
|
|
21
|
-
<
|
|
22
|
-
</
|
|
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
|
-
|
|
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
|
|
38
|
+
import ILucideCopy from "~icons/lucide/copy"
|
|
40
39
|
|
|
41
|
-
import
|
|
42
|
-
import
|
|
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: "
|
|
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
|
|
5
|
+
import WFileInput from "./WFileInput.vue"
|
|
6
6
|
|
|
7
7
|
import * as components from "../index.js"
|
|
8
8
|
|
|
9
|
-
const meta: Meta<typeof
|
|
10
|
-
component:
|
|
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
|
|
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
|
-
<
|
|
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
|
-
<
|
|
83
|
-
<
|
|
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
|
-
|
|
26
|
+
errors.length > 0 && isErrored && `errored border-red-400 hover:border-red-500`,
|
|
27
|
+
wrapperAttrs?.class
|
|
29
28
|
)"
|
|
30
|
-
v-bind="{
|
|
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="
|
|
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
|
-
<
|
|
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="
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
180
|
-
</
|
|
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="
|
|
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
|
-
<
|
|
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 {
|
|
231
|
+
import type { HTMLAttributes, InputHTMLAttributes } from "vue"
|
|
232
|
+
import { computed, onBeforeUnmount, ref, shallowReactive, watch } from "vue"
|
|
220
233
|
|
|
221
|
-
import
|
|
222
|
-
import
|
|
223
|
-
import
|
|
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 {
|
|
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
|
|
230
|
-
import
|
|
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
|
-
|
|
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
|
|
279
|
+
const isErrored = ref(false)
|
|
240
280
|
const isHovered = ref(false)
|
|
241
281
|
|
|
242
|
-
|
|
243
282
|
function clearFiles() {
|
|
244
|
-
el.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
|
-
|
|
254
|
-
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
* <
|
|
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
|
|
5
|
+
import WMultiValues from "./WMultiValues.vue"
|
|
6
6
|
|
|
7
7
|
import * as components from "../index.js"
|
|
8
8
|
|
|
9
9
|
const meta = {
|
|
10
|
-
component:
|
|
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
|
|
17
|
+
} satisfies Meta<typeof WMultiValues>
|
|
18
18
|
|
|
19
19
|
export default meta
|
|
20
|
-
type Story = StoryObj<typeof
|
|
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,
|
|
31
|
+
components: { ...components, WMultiValues },
|
|
32
32
|
setup: () => {
|
|
33
33
|
const inputValue = ref("B")
|
|
34
|
-
const multiValueEl = ref<typeof
|
|
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
|
-
<
|
|
50
|
+
<WSimpleInput
|
|
51
51
|
v-model="inputValue"
|
|
52
52
|
@keydown="onKeydownEnter"
|
|
53
53
|
>
|
|
54
|
-
</
|
|
54
|
+
</WSimpleInput>
|
|
55
55
|
<p>Multi-value component: </p>
|
|
56
56
|
<div class="flex justify-start">
|
|
57
|
-
<
|
|
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
|
+
|