@witchcraft/ui 0.3.25 → 0.4.0-beta.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.
- package/README.md +54 -61
- package/dist/module.json +1 -1
- package/dist/runtime/assets/animations.css +1 -1
- package/dist/runtime/assets/locales/en.json +2 -0
- package/dist/runtime/assets/utils.css +1 -1
- package/dist/runtime/build/WitchcraftUiResolver.js +1 -1
- 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 +109 -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} +40 -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 +109 -0
- package/dist/runtime/components/WCombobox/WCombobox.vue +402 -0
- package/dist/runtime/components/WCombobox/WCombobox.vue.d.ts +109 -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} +16 -21
- package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.vue → WDatePicker/WSingleDatePicker.vue} +16 -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} +9 -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} +71 -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 +149 -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} +32 -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 +43 -0
- package/dist/runtime/components/WPopover/WPopover.vue +138 -0
- package/dist/runtime/components/WPopover/WPopover.vue.d.ts +43 -0
- package/dist/runtime/components/WPopup/WPopup.d.vue.ts +41 -0
- package/dist/runtime/components/WPopup/WPopup.vue +74 -0
- package/dist/runtime/components/WPopup/WPopup.vue.d.ts +41 -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} +9 -16
- package/dist/runtime/components/{LibSimpleInput/LibSimpleInput.vue → WSimpleInput/WSimpleInput.vue} +12 -23
- package/dist/runtime/components/{LibSimpleInput/LibSimpleInput.vue.d.ts → WSimpleInput/WSimpleInput.vue.d.ts} +9 -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 +111 -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 +8 -4
- package/dist/runtime/helpers/NotificationHandler.js +5 -8
- 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 +7 -7
- package/src/runtime/assets/animations.css +3 -3
- package/src/runtime/assets/locales/en.json +2 -0
- package/src/runtime/assets/utils.css +43 -0
- package/src/runtime/build/WitchcraftUiResolver.ts +1 -1
- 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 +123 -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} +43 -32
- package/src/runtime/components/WCombobox/WCombobox.stories.ts +209 -0
- package/src/runtime/components/WCombobox/WCombobox.vue +446 -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} +16 -22
- package/src/runtime/components/{LibDatePicker/LibSingleDatePicker.vue → WDatePicker/WSingleDatePicker.vue} +16 -22
- 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} +8 -11
- 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} +95 -98
- 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 +161 -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} +43 -66
- 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 +161 -0
- package/src/runtime/components/WPopup/WPopup.stories.ts +60 -0
- package/src/runtime/components/WPopup/WPopup.vue +93 -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} +27 -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 -87
- package/src/runtime/components/WTooltip/WTooltip.stories.ts +82 -0
- package/src/runtime/components/WTooltip/WTooltip.vue +126 -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 +9 -11
- package/src/runtime/injectionKeys.ts +1 -7
- package/src/runtime/types/index.ts +105 -32
- package/types/components.d.ts +13 -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
|
@@ -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,82 @@
|
|
|
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 {
|
|
220
|
-
|
|
221
|
-
import IFa6RegularFile from "~icons/fa6-regular/file"
|
|
222
|
-
import IFa6SolidArrowUpFromBracket from "~icons/fa6-solid/arrow-up-from-bracket"
|
|
223
|
-
import IFa6SolidXmark from "~icons/fa6-solid/xmark"
|
|
231
|
+
import type { HTMLAttributes, InputHTMLAttributes } from "vue"
|
|
232
|
+
import { computed, onBeforeUnmount, ref, shallowReactive, watch } from "vue"
|
|
224
233
|
|
|
225
|
-
import {
|
|
234
|
+
import { useFallbackId } from "../../composables/useFallbackId.js"
|
|
226
235
|
import { useInjectedI18n } from "../../composables/useInjectedI18n.js"
|
|
227
|
-
import type { FileInputError } from "../../types/index.js"
|
|
236
|
+
import type { FileInputError, TailwindClassProp } from "../../types/index.js"
|
|
228
237
|
import { twMerge } from "../../utils/twMerge.js"
|
|
229
|
-
import
|
|
230
|
-
import
|
|
231
|
-
import { getFallbackId, type LinkableByIdProps, type TailwindClassProp, type WrapperProps } from "../shared/props.js"
|
|
238
|
+
import WButton from "../WButton/WButton.vue"
|
|
239
|
+
import WIcon from "../WIcon/WIcon.vue"
|
|
232
240
|
|
|
233
241
|
const t = useInjectedI18n()
|
|
234
242
|
const el = ref<null | HTMLInputElement>(null)
|
|
235
|
-
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
const props = withDefaults(defineProps<
|
|
246
|
+
& {
|
|
247
|
+
id?: string
|
|
248
|
+
multiple?: boolean
|
|
249
|
+
/**
|
|
250
|
+
* 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.
|
|
251
|
+
*
|
|
252
|
+
* Pass an empty array to allow any filetype.
|
|
253
|
+
*/
|
|
254
|
+
formats?: string[]
|
|
255
|
+
compact?: boolean
|
|
256
|
+
inputAttrs?: Omit<InputHTMLAttributes, "class"> & TailwindClassProp
|
|
257
|
+
wrapperAttrs?: Omit<HTMLAttributes, "class"> & TailwindClassProp
|
|
258
|
+
}
|
|
259
|
+
>(), {
|
|
260
|
+
multiple: false,
|
|
261
|
+
formats: () => ["image/*", ".jpeg", ".jpg", ".png"],
|
|
262
|
+
compact: false
|
|
263
|
+
})
|
|
264
|
+
const finalId = useFallbackId(props)
|
|
265
|
+
|
|
266
|
+
const emits = defineEmits<{
|
|
267
|
+
(e: "input", val: File[], clearFiles: () => void): void
|
|
268
|
+
(e: "errors", val: FileInputError[], clearErrors: () => void): void
|
|
269
|
+
}>()
|
|
270
|
+
|
|
271
|
+
type Entry = { file: File } & ({ isImg: true, previewUrl: string } | { isImg: false, previewUrl: undefined })
|
|
236
272
|
|
|
237
273
|
const files = shallowReactive<(Entry)[]>([])
|
|
238
274
|
const errors = shallowReactive<(FileInputError)[]>([])
|
|
239
|
-
const
|
|
275
|
+
const isErrored = ref(false)
|
|
240
276
|
const isHovered = ref(false)
|
|
241
277
|
|
|
242
|
-
|
|
243
278
|
function clearFiles() {
|
|
244
|
-
el.value
|
|
279
|
+
if (el.value) {
|
|
280
|
+
// not sure why sometimes el.value is undefined but it can be
|
|
281
|
+
el.value.value = ""
|
|
282
|
+
}
|
|
283
|
+
for (const entry of files) {
|
|
284
|
+
if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl)
|
|
285
|
+
}
|
|
245
286
|
files.splice(0, files.length)
|
|
246
287
|
}
|
|
247
288
|
|
|
@@ -250,45 +291,37 @@ watch(files, () => {
|
|
|
250
291
|
})
|
|
251
292
|
watch(errors, () => {
|
|
252
293
|
if (errors.length > 0) {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
errorFlashing.value = false
|
|
256
|
-
}, 500)
|
|
257
|
-
emits("errors", [...errors])
|
|
258
|
-
errors.splice(0, errors.length)
|
|
294
|
+
isErrored.value = true
|
|
295
|
+
emits("errors", [...errors], clearErrors)
|
|
259
296
|
}
|
|
260
297
|
})
|
|
261
298
|
|
|
299
|
+
function clearErrors() {
|
|
300
|
+
isErrored.value = false
|
|
301
|
+
errors.splice(0, errors.length)
|
|
302
|
+
}
|
|
303
|
+
|
|
262
304
|
defineOptions({
|
|
263
|
-
name: "
|
|
305
|
+
name: "WFileInput",
|
|
264
306
|
inheritAttrs: false
|
|
265
307
|
})
|
|
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
308
|
|
|
280
309
|
const mimeTypes = computed(() => props.formats?.filter(_ => !_.startsWith(".")) ?? [])
|
|
281
310
|
const extensions = computed(() => props.formats?.filter(_ => _.startsWith(".")) ?? [])
|
|
282
311
|
|
|
283
|
-
const getSrc = (file: File) => {
|
|
284
|
-
const src = URL.createObjectURL(file)
|
|
285
|
-
return src
|
|
286
|
-
}
|
|
287
312
|
|
|
288
|
-
|
|
313
|
+
onBeforeUnmount(() => {
|
|
314
|
+
for (const entry of files) {
|
|
315
|
+
if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl)
|
|
316
|
+
}
|
|
317
|
+
})
|
|
318
|
+
|
|
319
|
+
function removeFile(entry: Entry) {
|
|
320
|
+
if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl)
|
|
289
321
|
const index = files.indexOf(entry)
|
|
290
|
-
files.splice(index, 1)
|
|
322
|
+
if (index > -1) files.splice(index, 1)
|
|
291
323
|
}
|
|
324
|
+
|
|
292
325
|
const extensionsList = computed(() => extensions.value.join(", "))
|
|
293
326
|
|
|
294
327
|
function onDrop(e: DragEvent) {
|
|
@@ -327,13 +360,14 @@ function updateFiles(filesList: FileList): boolean | undefined {
|
|
|
327
360
|
errs.push(err)
|
|
328
361
|
continue
|
|
329
362
|
}
|
|
363
|
+
const previewUrl = isImg ? URL.createObjectURL(file) : undefined
|
|
330
364
|
if (errs.length > 0) continue
|
|
331
365
|
if (!files.find(_ => _.file === file)) {
|
|
332
366
|
if ((props.multiple || files.length < 1)
|
|
333
367
|
) {
|
|
334
|
-
files.push({ file, isImg })
|
|
368
|
+
files.push({ file, isImg, previewUrl: previewUrl as any })
|
|
335
369
|
} else {
|
|
336
|
-
files.splice(0, files.length, { file, isImg })
|
|
370
|
+
files.splice(0, files.length, { file, isImg, previewUrl: previewUrl as any })
|
|
337
371
|
}
|
|
338
372
|
}
|
|
339
373
|
}
|
|
@@ -341,51 +375,14 @@ function updateFiles(filesList: FileList): boolean | undefined {
|
|
|
341
375
|
errors.splice(0, errors.length, ...errs)
|
|
342
376
|
return false
|
|
343
377
|
} else if (errors.length > 0) {
|
|
344
|
-
|
|
378
|
+
clearErrors()
|
|
345
379
|
}
|
|
346
380
|
return undefined
|
|
347
381
|
}
|
|
348
382
|
|
|
349
383
|
defineExpose({
|
|
350
|
-
clearFiles
|
|
384
|
+
clearFiles,
|
|
385
|
+
clearErrors
|
|
351
386
|
})
|
|
352
387
|
</script>
|
|
353
388
|
|
|
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,161 @@
|
|
|
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 { copy } from "../../helpers/copy.js"
|
|
87
|
+
import type { BaseInteractiveProps, TailwindClassProp } from "../../types/index.js"
|
|
88
|
+
import { twMerge } from "../../utils/twMerge.js"
|
|
89
|
+
import WButton from "../WButton/WButton.vue"
|
|
90
|
+
import WIcon from "../WIcon/WIcon.vue"
|
|
91
|
+
|
|
92
|
+
defineOptions({
|
|
93
|
+
name: "WMultiValues",
|
|
94
|
+
inheritAttrs: false
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
const $attrs = useAttrs()
|
|
98
|
+
const props = withDefaults(defineProps<
|
|
99
|
+
& BaseInteractiveProps
|
|
100
|
+
& {
|
|
101
|
+
label?: string
|
|
102
|
+
border?: boolean
|
|
103
|
+
itemAttrs?: Omit<HTMLAttributes, "class"> & TailwindClassProp
|
|
104
|
+
}
|
|
105
|
+
& /** @vue-ignore */ Omit<HTMLAttributes, "class">
|
|
106
|
+
& /** @vue-ignore */ TailwindClassProp
|
|
107
|
+
>(), {
|
|
108
|
+
border: true
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
const canEdit = computed(() => !props.disabled && !props.readonly)
|
|
112
|
+
const $modelValue = defineModel<T[]>({ default: () => [] })
|
|
113
|
+
const itemRefs = ref<HTMLElement[]>([])
|
|
114
|
+
const activeIndex = ref(0)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
function removeVal(value: T) {
|
|
118
|
+
if (!canEdit.value) return
|
|
119
|
+
removeIfIn($modelValue.value, value)
|
|
120
|
+
|
|
121
|
+
if ($modelValue.value.length > 0) {
|
|
122
|
+
if (activeIndex.value >= $modelValue.value.length) {
|
|
123
|
+
activeIndex.value = $modelValue.value.length - 1
|
|
124
|
+
}
|
|
125
|
+
nextTick(() => {
|
|
126
|
+
itemRefs.value[activeIndex.value]?.focus()
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
132
|
+
if (props.disabled) return
|
|
133
|
+
|
|
134
|
+
const len = $modelValue.value.length
|
|
135
|
+
if (len === 0) return
|
|
136
|
+
|
|
137
|
+
if (e.key === "ArrowRight") {
|
|
138
|
+
activeIndex.value = (activeIndex.value + 1) % len
|
|
139
|
+
itemRefs.value[activeIndex.value]?.focus()
|
|
140
|
+
e.preventDefault()
|
|
141
|
+
} else if (e.key === "ArrowLeft") {
|
|
142
|
+
activeIndex.value = (activeIndex.value - 1 + len) % len
|
|
143
|
+
itemRefs.value[activeIndex.value]?.focus()
|
|
144
|
+
e.preventDefault()
|
|
145
|
+
} else if (e.key === "Delete" || e.key === "Backspace") {
|
|
146
|
+
if (canEdit.value) {
|
|
147
|
+
removeVal($modelValue.value[activeIndex.value]!)
|
|
148
|
+
e.preventDefault()
|
|
149
|
+
}
|
|
150
|
+
} else if (e.key === "Home") {
|
|
151
|
+
activeIndex.value = 0
|
|
152
|
+
itemRefs.value[activeIndex.value]?.focus()
|
|
153
|
+
e.preventDefault()
|
|
154
|
+
} else if (e.key === "End") {
|
|
155
|
+
activeIndex.value = len - 1
|
|
156
|
+
itemRefs.value[activeIndex.value]?.focus()
|
|
157
|
+
e.preventDefault()
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
</script>
|
|
161
|
+
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
2
2
|
import type { Meta, StoryObj } from "@storybook/vue3"
|
|
3
3
|
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import WNotification from "./WNotification.vue"
|
|
5
|
+
import WNotificationTestMessageComponent from "./WNotificationTestMessageComponent.vue"
|
|
6
6
|
|
|
7
7
|
import { NotificationHandler } from "../../helpers/NotificationHandler.js"
|
|
8
8
|
import * as components from "../index.js"
|
|
9
9
|
|
|
10
10
|
const handler = new NotificationHandler()
|
|
11
11
|
|
|
12
|
-
const meta: Meta<typeof
|
|
13
|
-
component:
|
|
12
|
+
const meta: Meta<typeof WNotification> = {
|
|
13
|
+
component: WNotification,
|
|
14
14
|
title: "Components/Notification",
|
|
15
15
|
args: {
|
|
16
16
|
|
|
@@ -18,21 +18,21 @@ const meta: Meta<typeof LibNotification> = {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export default meta
|
|
21
|
-
type Story = StoryObj<typeof
|
|
21
|
+
type Story = StoryObj<typeof WNotification>
|
|
22
22
|
|
|
23
23
|
export const Primary: Story = {
|
|
24
24
|
render: args => ({
|
|
25
25
|
components: {
|
|
26
26
|
...components,
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
WNotification,
|
|
28
|
+
WNotificationTestMessageComponent
|
|
29
29
|
},
|
|
30
30
|
setup() {
|
|
31
31
|
return { args }
|
|
32
32
|
},
|
|
33
33
|
backgrounds: { disable: true },
|
|
34
34
|
template: `
|
|
35
|
-
<
|
|
35
|
+
<WNotification v-bind="args"/>
|
|
36
36
|
`
|
|
37
37
|
}),
|
|
38
38
|
args: {
|
|
@@ -150,7 +150,7 @@ export const CustomMessageComponent: Story = {
|
|
|
150
150
|
// @ts-expect-error calling protected method
|
|
151
151
|
notification: handler._createEntry({
|
|
152
152
|
...Primary.args!.notification,
|
|
153
|
-
component:
|
|
153
|
+
component: WNotificationTestMessageComponent,
|
|
154
154
|
componentProps: {
|
|
155
155
|
customProp: "Custom Prop"
|
|
156
156
|
}
|