@witchcraft/ui 0.4.0 → 0.4.2
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 +56 -61
- package/dist/module.d.mts +1 -1
- package/dist/module.json +1 -1
- package/dist/module.mjs +13 -9
- 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 -2
- package/dist/runtime/components/TestControls/TestControls.d.vue.ts +2 -1
- package/dist/runtime/components/TestControls/TestControls.vue +3 -3
- package/dist/runtime/components/TestControls/TestControls.vue.d.ts +2 -1
- 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/{LibColorInput/LibColorInput.d.vue.ts → WColorInput/WColorInput.d.vue.ts} +18 -36
- package/dist/runtime/components/WColorInput/WColorInput.vue +85 -0
- package/dist/runtime/components/{LibColorInput/LibColorInput.vue.d.ts → WColorInput/WColorInput.vue.d.ts} +18 -36
- 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} +12 -9
- 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} +12 -9
- 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} +9 -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} +9 -13
- package/dist/runtime/components/{LibDatePicker/LibDatePicker.d.vue.ts → WDatePicker/WDatePicker.d.vue.ts} +7 -7
- package/dist/runtime/components/{LibDatePicker/LibDatePicker.vue → WDatePicker/WDatePicker.vue} +3 -7
- package/dist/runtime/components/{LibDatePicker/LibDatePicker.vue.d.ts → WDatePicker/WDatePicker.vue.d.ts} +7 -7
- package/dist/runtime/components/WDatePicker/WRangeDatePicker.d.vue.ts +182 -0
- package/dist/runtime/components/{LibDatePicker/LibRangeDatePicker.vue → WDatePicker/WRangeDatePicker.vue} +29 -25
- package/dist/runtime/components/WDatePicker/WRangeDatePicker.vue.d.ts +182 -0
- package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.d.vue.ts → WDatePicker/WSingleDatePicker.d.vue.ts} +7 -5
- package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.vue → WDatePicker/WSingleDatePicker.vue} +21 -21
- package/dist/runtime/components/{LibDatePicker/LibSingleDatePicker.vue.d.ts → WDatePicker/WSingleDatePicker.vue.d.ts} +7 -5
- package/dist/runtime/components/WDatePicker/WTimeZonePicker.d.vue.ts +13 -0
- package/dist/runtime/components/{LibDatePicker/LibTimeZonePicker.vue → WDatePicker/WTimeZonePicker.vue} +5 -12
- package/dist/runtime/components/WDatePicker/WTimeZonePicker.vue.d.ts +13 -0
- package/dist/runtime/components/{LibDebug/LibDebug.d.vue.ts → WDebug/WDebug.d.vue.ts} +3 -2
- package/dist/runtime/components/{LibDebug/LibDebug.vue → WDebug/WDebug.vue} +10 -12
- package/dist/runtime/components/{LibDebug/LibDebug.vue.d.ts → WDebug/WDebug.vue.d.ts} +3 -2
- package/dist/runtime/components/{LibDevOnly/LibDevOnly.d.vue.ts → WDevOnly/WDevOnly.d.vue.ts} +3 -5
- package/dist/runtime/components/{LibDevOnly/LibDevOnly.vue.d.ts → WDevOnly/WDevOnly.vue.d.ts} +3 -5
- package/dist/runtime/components/WFileInput/WFileInput.d.vue.ts +58 -0
- package/dist/runtime/components/WFileInput/WFileInput.vue +348 -0
- package/dist/runtime/components/WFileInput/WFileInput.vue.d.ts +58 -0
- package/dist/runtime/components/WIcon/WIcon.d.vue.ts +18 -0
- package/dist/runtime/components/{Icon/Icon.vue → WIcon/WIcon.vue} +1 -1
- package/dist/runtime/components/WIcon/WIcon.vue.d.ts +18 -0
- package/dist/runtime/components/WMultiValues/WMultiValues.d.vue.ts +28 -0
- package/dist/runtime/components/WMultiValues/WMultiValues.vue +150 -0
- package/dist/runtime/components/WMultiValues/WMultiValues.vue.d.ts +28 -0
- package/dist/runtime/components/WNotifications/WNotification.d.vue.ts +37 -0
- package/dist/runtime/components/{LibNotifications/LibNotification.vue → WNotifications/WNotification.vue} +61 -35
- package/dist/runtime/components/WNotifications/WNotification.vue.d.ts +37 -0
- package/dist/runtime/components/WNotifications/WNotificationTestMessageComponent.d.vue.ts +7 -0
- package/dist/runtime/components/WNotifications/WNotificationTestMessageComponent.vue +29 -0
- package/dist/runtime/components/WNotifications/WNotificationTestMessageComponent.vue.d.ts +7 -0
- package/dist/runtime/components/WNotifications/WNotifications.d.vue.ts +11 -0
- package/dist/runtime/components/{LibNotifications/LibNotifications.vue → WNotifications/WNotifications.vue} +72 -36
- package/dist/runtime/components/WNotifications/WNotifications.vue.d.ts +11 -0
- package/dist/runtime/components/WNotifications/calculateNotificationProgress.d.ts +2 -0
- package/dist/runtime/components/WNotifications/calculateNotificationProgress.js +4 -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 +115 -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} +13 -16
- package/dist/runtime/components/WProgressBar/WProgressBar.vue +150 -0
- package/dist/runtime/components/{LibProgressBar/LibProgressBar.vue.d.ts → WProgressBar/WProgressBar.vue.d.ts} +13 -16
- package/dist/runtime/components/{LibRecorder/LibRecorder.d.vue.ts → WRecorder/WRecorder.d.vue.ts} +13 -27
- 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} +13 -27
- package/dist/runtime/components/{LibRoot/LibRoot.d.vue.ts → WRoot/WRoot.d.vue.ts} +11 -9
- 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} +11 -9
- package/dist/runtime/components/WSimpleInput/WSimpleInput.d.vue.ts +34 -0
- package/dist/runtime/components/{LibSimpleInput/LibSimpleInput.vue → WSimpleInput/WSimpleInput.vue} +14 -24
- package/dist/runtime/components/WSimpleInput/WSimpleInput.vue.d.ts +34 -0
- package/dist/runtime/components/WTable/WTable.d.vue.ts +102 -0
- package/dist/runtime/components/WTable/WTable.vue +370 -0
- 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/composables/useTimeConditionally.d.ts +16 -0
- package/dist/runtime/composables/useTimeConditionally.js +27 -0
- package/dist/runtime/directives/vResizableCols.js +101 -34
- package/dist/runtime/helpers/NotificationHandler.d.ts +28 -3
- package/dist/runtime/helpers/NotificationHandler.js +7 -10
- package/dist/runtime/injectionKeys.d.ts +1 -5
- package/dist/runtime/injectionKeys.js +0 -2
- package/dist/runtime/types/index.d.ts +97 -31
- package/dist/runtime/types/index.js +1 -0
- package/dist/runtime/utils/notifyIfError.d.ts +3 -1
- package/dist/runtime/utils/notifyIfError.js +4 -2
- package/dist/runtime/utils/twMerge.d.ts +1 -0
- package/dist/runtime/utils/twMerge.js +2 -1
- package/package.json +59 -56
- package/src/module.ts +16 -8
- package/src/runtime/assets/animations.css +53 -6
- package/src/runtime/assets/locales/en.json +2 -0
- package/src/runtime/assets/tailwind.css +1 -1
- package/src/runtime/assets/utils.css +52 -4
- package/src/runtime/build/WitchcraftUiResolver.ts +1 -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} +29 -25
- 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} +20 -10
- package/src/runtime/components/WFileInput/WFileInput.vue +392 -0
- 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} +42 -6
- package/src/runtime/components/{LibNotifications/LibNotification.vue → WNotifications/WNotification.vue} +72 -45
- package/src/runtime/components/WNotifications/WNotificationTestMessageComponent.vue +27 -0
- package/src/runtime/components/WNotifications/WNotifications.stories.ts +139 -0
- package/src/runtime/components/{LibNotifications/LibNotifications.vue → WNotifications/WNotifications.vue} +87 -47
- package/src/runtime/components/WNotifications/calculateNotificationProgress.ts +8 -0
- 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 +134 -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 -42
- package/src/runtime/components/WTable/WTable.stories.ts +334 -0
- package/src/runtime/components/WTable/WTable.vue +471 -0
- 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/composables/useTimeConditionally.ts +51 -0
- package/src/runtime/directives/vResizableCols.ts +121 -38
- package/src/runtime/helpers/NotificationHandler.ts +30 -11
- package/src/runtime/injectionKeys.ts +1 -7
- package/src/runtime/types/index.ts +118 -36
- package/src/runtime/utils/notifyIfError.ts +6 -2
- package/src/runtime/utils/twMerge.ts +2 -1
- package/types/components.d.ts +14 -15
- package/dist/runtime/components/Aria/Aria.d.vue.ts +0 -5
- package/dist/runtime/components/Aria/Aria.vue +0 -16
- package/dist/runtime/components/Aria/Aria.vue.d.ts +0 -5
- package/dist/runtime/components/Icon/Icon.d.vue.ts +0 -21
- package/dist/runtime/components/Icon/Icon.vue.d.ts +0 -21
- package/dist/runtime/components/LibButton/LibButton.d.vue.ts +0 -36
- package/dist/runtime/components/LibButton/LibButton.vue.d.ts +0 -36
- package/dist/runtime/components/LibCheckbox/LibCheckbox.d.vue.ts +0 -42
- package/dist/runtime/components/LibCheckbox/LibCheckbox.vue +0 -103
- package/dist/runtime/components/LibCheckbox/LibCheckbox.vue.d.ts +0 -42
- package/dist/runtime/components/LibColorInput/LibColorInput.vue +0 -162
- package/dist/runtime/components/LibDatePicker/LibRangeDatePicker.d.vue.ts +0 -34
- package/dist/runtime/components/LibDatePicker/LibRangeDatePicker.vue.d.ts +0 -34
- package/dist/runtime/components/LibDatePicker/LibTimeZonePicker.d.vue.ts +0 -22
- package/dist/runtime/components/LibDatePicker/LibTimeZonePicker.vue.d.ts +0 -22
- package/dist/runtime/components/LibFileInput/LibFileInput.d.vue.ts +0 -43
- package/dist/runtime/components/LibFileInput/LibFileInput.vue +0 -274
- package/dist/runtime/components/LibFileInput/LibFileInput.vue.d.ts +0 -43
- package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.d.vue.ts +0 -165
- package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.vue +0 -387
- package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.vue.d.ts +0 -165
- package/dist/runtime/components/LibLabel/LibLabel.d.vue.ts +0 -26
- package/dist/runtime/components/LibLabel/LibLabel.vue +0 -45
- package/dist/runtime/components/LibLabel/LibLabel.vue.d.ts +0 -26
- package/dist/runtime/components/LibMultiValues/LibMultiValues.d.vue.ts +0 -29
- package/dist/runtime/components/LibMultiValues/LibMultiValues.vue +0 -109
- package/dist/runtime/components/LibMultiValues/LibMultiValues.vue.d.ts +0 -29
- package/dist/runtime/components/LibNotifications/LibNotification.d.vue.ts +0 -30
- package/dist/runtime/components/LibNotifications/LibNotification.vue.d.ts +0 -30
- package/dist/runtime/components/LibNotifications/LibNotifications.d.vue.ts +0 -13
- package/dist/runtime/components/LibNotifications/LibNotifications.vue.d.ts +0 -13
- package/dist/runtime/components/LibPagination/LibPagination.d.vue.ts +0 -104
- package/dist/runtime/components/LibPagination/LibPagination.vue +0 -229
- package/dist/runtime/components/LibPagination/LibPagination.vue.d.ts +0 -104
- package/dist/runtime/components/LibPalette/LibPalette.d.vue.ts +0 -14
- package/dist/runtime/components/LibPalette/LibPalette.vue.d.ts +0 -14
- package/dist/runtime/components/LibPopup/LibPopup.d.vue.ts +0 -46
- package/dist/runtime/components/LibPopup/LibPopup.vue +0 -365
- package/dist/runtime/components/LibPopup/LibPopup.vue.d.ts +0 -46
- package/dist/runtime/components/LibProgressBar/LibProgressBar.vue +0 -169
- package/dist/runtime/components/LibSimpleInput/LibSimpleInput.d.vue.ts +0 -35
- package/dist/runtime/components/LibSimpleInput/LibSimpleInput.vue.d.ts +0 -35
- package/dist/runtime/components/LibSuggestions/LibSuggestions.d.vue.ts +0 -94
- package/dist/runtime/components/LibSuggestions/LibSuggestions.vue +0 -178
- package/dist/runtime/components/LibSuggestions/LibSuggestions.vue.d.ts +0 -94
- package/dist/runtime/components/LibTable/LibTable.d.vue.ts +0 -45
- package/dist/runtime/components/LibTable/LibTable.vue +0 -155
- package/dist/runtime/components/LibTable/LibTable.vue.d.ts +0 -45
- package/dist/runtime/components/Template/NAME.d.vue.ts +0 -17
- package/dist/runtime/components/Template/NAME.vue +0 -27
- package/dist/runtime/components/Template/NAME.vue.d.ts +0 -17
- 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 -129
- package/src/runtime/components/LibColorInput/LibColorInput.vue +0 -203
- package/src/runtime/components/LibFileInput/LibFileInput.vue +0 -320
- package/src/runtime/components/LibInputDeprecated/LibInputDeprecated.stories.ts +0 -405
- package/src/runtime/components/LibInputDeprecated/LibInputDeprecated.vue +0 -414
- 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 -120
- 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/LibTable/LibTable.stories.ts +0 -167
- package/src/runtime/components/LibTable/LibTable.vue +0 -190
- 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 → WDatePicker}/helpers.d.ts +0 -0
- /package/dist/runtime/components/{LibDatePicker → WDatePicker}/helpers.js +0 -0
- /package/dist/runtime/components/{LibDevOnly/LibDevOnly.vue → WDevOnly/WDevOnly.vue} +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
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<!--
|
|
3
|
+
- moving the border to the wrapper is to hide the little bits of border sticking out
|
|
4
|
+
added back the right straight border otherwise the scrollbar looks ass
|
|
5
|
+
this is ever so slightly visible if there is no scrollbar
|
|
6
|
+
|
|
7
|
+
- relative is for the sticky header in dynamic mode
|
|
8
|
+
|
|
9
|
+
- dynamic mode REQUIRES grid since otherwise the transforms don't work because of how tanstack calculates them
|
|
10
|
+
- tried pre-calculating the transforms to take into account the previous elements (e.g. virtual.start - (height of previous rows)) but this was way to slow and buggy
|
|
11
|
+
-->
|
|
12
|
+
<div
|
|
13
|
+
:class="twMerge(`
|
|
14
|
+
table--container
|
|
15
|
+
overflow-auto
|
|
16
|
+
`,
|
|
17
|
+
hasScrollbar.vertical && `has-scrollbar-vertical`,
|
|
18
|
+
hasScrollbar.horizontal && `has-scrollbar-horizontal`,
|
|
19
|
+
stickyHeader && `
|
|
20
|
+
[&_thead]:sticky
|
|
21
|
+
[&_thead]:top-0
|
|
22
|
+
[&_thead]:z-1
|
|
23
|
+
[&_.grip]:z-2
|
|
24
|
+
`,
|
|
25
|
+
isPostSetup && `resizable-cols-setup`,
|
|
26
|
+
border && `
|
|
27
|
+
border
|
|
28
|
+
border-neutral-500
|
|
29
|
+
`,
|
|
30
|
+
border && cellBorder && `
|
|
31
|
+
[&.has-scrollbar-horizontal_.last-row]:border-b
|
|
32
|
+
[&.has-scrollbar-horizontal_.last-row]:border-neutral-500
|
|
33
|
+
[&.has-scrollbar-vertical_.last-col]:border-r
|
|
34
|
+
[&.has-scrollbar-vertical_.last-col]:border-neutral-500
|
|
35
|
+
`,
|
|
36
|
+
(!resizableOptions.fitWidth || stickyHeader) && `
|
|
37
|
+
[&_td.tr]:rounded-tr-none!
|
|
38
|
+
[&_td.br]:rounded-br-none!
|
|
39
|
+
`,
|
|
40
|
+
// this combo prevents the x-scrollbar from showing up when it shouldn't
|
|
41
|
+
// and max-w-fit allows the border to shrink with the table columns
|
|
42
|
+
resizableOptions.fitWidth === false && `
|
|
43
|
+
[&_.grip]:last:translate-x-[-5px]
|
|
44
|
+
mr-1
|
|
45
|
+
max-w-fit
|
|
46
|
+
`,
|
|
47
|
+
rounded &&`
|
|
48
|
+
rounded-md
|
|
49
|
+
`,
|
|
50
|
+
mergedVirtualizerOpts.enabled && mergedVirtualizerOpts.method === 'dynamic' && `
|
|
51
|
+
relative
|
|
52
|
+
`,
|
|
53
|
+
wrapperAttrs?.class
|
|
54
|
+
)"
|
|
55
|
+
v-bind="{ ...wrapperAttrs, class: undefined }"
|
|
56
|
+
ref="parentRef"
|
|
57
|
+
>
|
|
58
|
+
<div
|
|
59
|
+
class="table--inner-container"
|
|
60
|
+
:style="{
|
|
61
|
+
...(mergedVirtualizerOpts.enabled
|
|
62
|
+
? { height: `${totalSize}px` }
|
|
63
|
+
: {})
|
|
64
|
+
}"
|
|
65
|
+
>
|
|
66
|
+
<!-- https://github.com/TanStack/virtual/issues/640#issuecomment-2795731690 -->
|
|
67
|
+
<table
|
|
68
|
+
:style="[{
|
|
69
|
+
...(stickyHeader && mergedVirtualizerOpts.enabled
|
|
70
|
+
? { '--table-sticky-fix': `${totalSize-tableHeight}px` }
|
|
71
|
+
: {})
|
|
72
|
+
|
|
73
|
+
}, $attrs?.style]"
|
|
74
|
+
:class="twMerge(`
|
|
75
|
+
table
|
|
76
|
+
table-fixed
|
|
77
|
+
border-separate
|
|
78
|
+
border-spacing-0
|
|
79
|
+
scrollbar-hidden
|
|
80
|
+
[&_.grip]:w-[5px]
|
|
81
|
+
relative
|
|
82
|
+
w-full
|
|
83
|
+
box-content
|
|
84
|
+
[&_thead]:font-bold
|
|
85
|
+
[&_td]:p-1
|
|
86
|
+
[&_th]:p-1
|
|
87
|
+
[&.resizable-cols-error]:cursor-not-allowed
|
|
88
|
+
[&.resizable-cols-error]:user-select-none
|
|
89
|
+
[&_thead_th]:bg-neutral-200
|
|
90
|
+
dark:[&_thead_th]:bg-neutral-800
|
|
91
|
+
`,
|
|
92
|
+
isPostSetup && mergedVirtualizerOpts.enabled && mergedVirtualizerOpts.method === 'dynamic' && `
|
|
93
|
+
grid
|
|
94
|
+
`,
|
|
95
|
+
stickyHeader && mergedVirtualizerOpts.enabled && mergedVirtualizerOpts.method === 'fixed' && `
|
|
96
|
+
after:inline-block
|
|
97
|
+
after:h-(--table-sticky-fix)
|
|
98
|
+
`,
|
|
99
|
+
cellBorder && `
|
|
100
|
+
[&_td]:border-neutral-500
|
|
101
|
+
[&_td:not(.last-row)]:border-b
|
|
102
|
+
[&_td:not(.first-col)]:border-l
|
|
103
|
+
[&_th]:border-neutral-500
|
|
104
|
+
[&_th:not(.last-row)]:border-b
|
|
105
|
+
[&_th:not(.first-col)]:border-l
|
|
106
|
+
`,
|
|
107
|
+
!cellBorder && `
|
|
108
|
+
[&_.grip]:hover:bg-neutral-300
|
|
109
|
+
dark:[&_.grip]:hover:bg-neutral-700
|
|
110
|
+
`,
|
|
111
|
+
($attrs as any).class)"
|
|
112
|
+
v-bind="{ ...$attrs, class: undefined, style: undefined }"
|
|
113
|
+
v-resizable-cols="resizableOptions"
|
|
114
|
+
>
|
|
115
|
+
<thead
|
|
116
|
+
v-if="header"
|
|
117
|
+
:class="twMerge(
|
|
118
|
+
`table--header`,
|
|
119
|
+
isPostSetup && mergedVirtualizerOpts.enabled && mergedVirtualizerOpts.method === 'dynamic' && `
|
|
120
|
+
grid
|
|
121
|
+
top-0
|
|
122
|
+
`
|
|
123
|
+
)"
|
|
124
|
+
>
|
|
125
|
+
<tr
|
|
126
|
+
:class="twMerge(
|
|
127
|
+
`table--row`,
|
|
128
|
+
isPostSetup && mergedVirtualizerOpts.enabled && mergedVirtualizerOpts.method === 'dynamic'
|
|
129
|
+
&& `flex w-full`
|
|
130
|
+
)"
|
|
131
|
+
>
|
|
132
|
+
<template
|
|
133
|
+
v-for="col, i of cols"
|
|
134
|
+
:key="col"
|
|
135
|
+
>
|
|
136
|
+
<slot
|
|
137
|
+
:name="`header-${col.toString()}`"
|
|
138
|
+
:class="classes[`-1-${i}`]"
|
|
139
|
+
:style="{ width: widths[i] }"
|
|
140
|
+
:col-key="col"
|
|
141
|
+
:config="(colConfig as any)[col]"
|
|
142
|
+
>
|
|
143
|
+
<th
|
|
144
|
+
:class="classes[`-1-${i}`]"
|
|
145
|
+
:style="{ width: widths[i] }"
|
|
146
|
+
>
|
|
147
|
+
{{ (colConfig as any)[col]?.name ?? col }}
|
|
148
|
+
</th>
|
|
149
|
+
</slot>
|
|
150
|
+
</template>
|
|
151
|
+
</tr>
|
|
152
|
+
</thead>
|
|
153
|
+
<tbody
|
|
154
|
+
:class="twMerge(
|
|
155
|
+
`table--body`,
|
|
156
|
+
isPostSetup && mergedVirtualizerOpts.enabled && mergedVirtualizerOpts.method === 'dynamic' && `
|
|
157
|
+
grid
|
|
158
|
+
relative
|
|
159
|
+
`
|
|
160
|
+
)"
|
|
161
|
+
:style="{
|
|
162
|
+
...(mergedVirtualizerOpts.enabled && mergedVirtualizerOpts.method === 'dynamic'
|
|
163
|
+
? { height: `${totalSize}px` }
|
|
164
|
+
: {})
|
|
165
|
+
}"
|
|
166
|
+
>
|
|
167
|
+
<template
|
|
168
|
+
v-for="(virtual, index) in virtualList"
|
|
169
|
+
:key="virtual.key as any"
|
|
170
|
+
>
|
|
171
|
+
<tr
|
|
172
|
+
:class="twMerge(`
|
|
173
|
+
table--row
|
|
174
|
+
`,
|
|
175
|
+
isPostSetup && mergedVirtualizerOpts.enabled && mergedVirtualizerOpts.method === 'dynamic' && `
|
|
176
|
+
flex
|
|
177
|
+
absolute
|
|
178
|
+
w-full
|
|
179
|
+
`,
|
|
180
|
+
isPostSetup && mergedVirtualizerOpts.enabled && ` will-change-transform `
|
|
181
|
+
)"
|
|
182
|
+
:style="{
|
|
183
|
+
...(mergedVirtualizerOpts.enabled
|
|
184
|
+
? {
|
|
185
|
+
transform: mergedVirtualizerOpts.method === 'fixed'
|
|
186
|
+
? `translateY(${virtual.start - index * virtual.size!}px)`
|
|
187
|
+
: `translateY(${virtual.start}px)`,
|
|
188
|
+
height: mergedVirtualizerOpts.method === 'fixed' ? `${virtual.size}px` : undefined
|
|
189
|
+
}
|
|
190
|
+
: {})
|
|
191
|
+
}"
|
|
192
|
+
:data-index="virtual.index"
|
|
193
|
+
:ref="measureElement"
|
|
194
|
+
>
|
|
195
|
+
<template
|
|
196
|
+
v-for="col, j of cols"
|
|
197
|
+
:key="virtual.key + '-' + col.toString()"
|
|
198
|
+
>
|
|
199
|
+
<slot
|
|
200
|
+
:name="col"
|
|
201
|
+
:item="values[virtual.index]"
|
|
202
|
+
:value="values[virtual.index]![col]"
|
|
203
|
+
:style="{ width: widths[j] }"
|
|
204
|
+
:class="classes[`${virtual.index}-${j}`]"
|
|
205
|
+
>
|
|
206
|
+
<td
|
|
207
|
+
:style="{ width: widths[j] }"
|
|
208
|
+
:class="classes[`${virtual.index}-${j}`]"
|
|
209
|
+
>
|
|
210
|
+
{{ values[virtual.index]![col] }}
|
|
211
|
+
</td>
|
|
212
|
+
</slot>
|
|
213
|
+
</template>
|
|
214
|
+
</tr>
|
|
215
|
+
</template>
|
|
216
|
+
</tbody>
|
|
217
|
+
</table>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
</template>
|
|
221
|
+
|
|
222
|
+
<!-- generic="T extends Record<string, any> -->"
|
|
223
|
+
<script setup lang="ts" generic="T">
|
|
224
|
+
import type { MakeRequired } from "@alanscodelog/utils"
|
|
225
|
+
import { keys } from "@alanscodelog/utils/keys"
|
|
226
|
+
import { throttle } from "@alanscodelog/utils/throttle"
|
|
227
|
+
import { useVirtualizer, type VirtualizerOptions } from "@tanstack/vue-virtual"
|
|
228
|
+
import { computed, type HTMLAttributes, onMounted, ref, type TableHTMLAttributes, useAttrs } from "vue"
|
|
229
|
+
|
|
230
|
+
import { useGlobalResizeObserver } from "../../composables/useGlobalResizeObserver.js"
|
|
231
|
+
import { vResizableCols } from "../../directives/vResizableCols.js"
|
|
232
|
+
import type { ResizableOptions, TableColConfig, TailwindClassProp } from "../../types/index.js"
|
|
233
|
+
import { twMerge } from "../../utils/twMerge.js"
|
|
234
|
+
|
|
235
|
+
defineOptions({
|
|
236
|
+
name: "WTable",
|
|
237
|
+
inheritAttrs: false
|
|
238
|
+
})
|
|
239
|
+
|
|
240
|
+
const $attrs = useAttrs()
|
|
241
|
+
const props = withDefaults(defineProps<
|
|
242
|
+
& {
|
|
243
|
+
resizable?: Partial<ResizableOptions>
|
|
244
|
+
values: T[]
|
|
245
|
+
/** Let's the table know the shape of the data since values might be empty. */
|
|
246
|
+
cols?: (keyof T)[]
|
|
247
|
+
rounded?: boolean
|
|
248
|
+
border?: boolean
|
|
249
|
+
cellBorder?: boolean
|
|
250
|
+
/** Disables the header. This also sets the selector to `tr:first-child > td` instead to avoid issues with the vResizableCols directive. */
|
|
251
|
+
header?: boolean
|
|
252
|
+
colConfig?: TableColConfig<T>
|
|
253
|
+
/**
|
|
254
|
+
* See tanstack/vue-virtual {@link https://tanstack.com/virtual/latest/docs/api/virtualizer}
|
|
255
|
+
*
|
|
256
|
+
* The defaults are:
|
|
257
|
+
*
|
|
258
|
+
* - enabled: false
|
|
259
|
+
* - method: "fixed"
|
|
260
|
+
* - overscan: (50 if fixed, 10 if dynamic)
|
|
261
|
+
* - estimateSize: () => { return 33 }
|
|
262
|
+
*
|
|
263
|
+
* This also has an additional option, `method`, which can be set to `fixed` or `dynamic` (experimental).
|
|
264
|
+
*
|
|
265
|
+
* Notes:
|
|
266
|
+
*
|
|
267
|
+
* - Because of how virtualization works, initial layout (before .resizable-cols-setup class is applied) will only have access to the headers and not the rows. This can cause cols to look very small, especially if using resizable.fitWidth false.
|
|
268
|
+
*
|
|
269
|
+
* ### Fixed
|
|
270
|
+
*
|
|
271
|
+
* `fixed` is the default and will set the height of ALL items to the height of the first item onMounted (tanstack does not do this and if your estimateSize if off, the scrolling is weird).
|
|
272
|
+
*
|
|
273
|
+
* Since the table now truncates rows by default, they will always be the same height unless you change the inner styling. In fixed mode, `forceRecalculateFixedVirtualizer` is exposed if you need to force re-calculation.
|
|
274
|
+
*
|
|
275
|
+
* If using slots, be sure to at least pass the `class` slot prop to the td element. `style` with width is also supplied but is not required if you're displaying the table as a table.
|
|
276
|
+
*
|
|
277
|
+
* ### Dynamic (experimental)
|
|
278
|
+
*
|
|
279
|
+
* In `dynamic` mode we use tanstack's measureElement method. This is more expensive, but it will work with any heights.
|
|
280
|
+
*
|
|
281
|
+
* Dynamic mode also requires the table displays itself using grid and flex post setup as otherwise dynamic mode doesn't work.
|
|
282
|
+
*
|
|
283
|
+
* You don't need to do anything unless using slots. If using slots, pass the given `ref` slot prop to ref (internally this is tanstack's measureElement) and the class and style slot props at the very least:
|
|
284
|
+
* ```vue
|
|
285
|
+
* <template #[`${colName}`]="slotProps">
|
|
286
|
+
* <td
|
|
287
|
+
* :ref="slotProps.ref"
|
|
288
|
+
* :class="slotProps.class"
|
|
289
|
+
* :style="slotProps.style"
|
|
290
|
+
* >
|
|
291
|
+
* {{ slotProps.value }}
|
|
292
|
+
* </td>
|
|
293
|
+
* </template>
|
|
294
|
+
* ```
|
|
295
|
+
*/
|
|
296
|
+
virtualizerOptions?: Partial<VirtualizerOptions<any, any>> & { method?: "fixed" | "dynamic" }
|
|
297
|
+
/** Whether to enable sticky header styles. This requires `border:false`. This moves the border to the wrapper and styles a straight border between the scroll bar and the rounded border. */
|
|
298
|
+
stickyHeader?: boolean
|
|
299
|
+
/** Which key to use for the rows (only if not using virtualization). */
|
|
300
|
+
itemKey?: keyof T | ((item: T) => string)
|
|
301
|
+
/** Pass attributes to the wrapper div. To pass to the table you can use regular top level attributes. */
|
|
302
|
+
wrapperAttrs?: Omit<HTMLAttributes, "class"> & TailwindClassProp
|
|
303
|
+
}
|
|
304
|
+
& /** @vue-ignore */ Omit<TableHTMLAttributes, "class" | "readonly" | "disabled">
|
|
305
|
+
& /** @vue-ignore */ TailwindClassProp
|
|
306
|
+
>(), {
|
|
307
|
+
resizable: () => ({}),
|
|
308
|
+
cols: () => [] as (keyof T)[],
|
|
309
|
+
rounded: true,
|
|
310
|
+
border: true,
|
|
311
|
+
cellBorder: true,
|
|
312
|
+
header: true,
|
|
313
|
+
colConfig: () => ({} as any),
|
|
314
|
+
virtualizerOptions: () => ({ }),
|
|
315
|
+
enableStickyHeader: false
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
const widths = ref([])
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
const isPostSetup = ref(false)
|
|
323
|
+
const resizableOptions = computed<MakeRequired<Partial<ResizableOptions>, "colCount" | "widths">>(() => ({
|
|
324
|
+
colCount: props.cols.length,
|
|
325
|
+
widths,
|
|
326
|
+
selector: props.header ? undefined : `tr:first-child > td`,
|
|
327
|
+
...props.resizable,
|
|
328
|
+
onSetup: el => {
|
|
329
|
+
isPostSetup.value = true
|
|
330
|
+
if (props.resizable.onSetup) {
|
|
331
|
+
props.resizable.onSetup(el)
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
onTeardown: el => {
|
|
335
|
+
isPostSetup.value = false
|
|
336
|
+
if (props.resizable.onTeardown) {
|
|
337
|
+
props.resizable.onTeardown(el)
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}))
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
const parentRef = ref<HTMLElement | null>(null)
|
|
344
|
+
const mergedVirtualizerOpts = computed(() => {
|
|
345
|
+
return {
|
|
346
|
+
// we have to put the defaults here as they can't reference local variables
|
|
347
|
+
count: props.values.length,
|
|
348
|
+
getScrollElement: () => parentRef.value,
|
|
349
|
+
estimateSize: () => { return 33 },
|
|
350
|
+
overscan: props.virtualizerOptions?.overscan ?? (props.virtualizerOptions?.method === "dynamic" ? 10 : 50),
|
|
351
|
+
method: "fixed",
|
|
352
|
+
enabled: false,
|
|
353
|
+
...props.virtualizerOptions
|
|
354
|
+
} satisfies Partial<VirtualizerOptions<any, any>> & { method: "fixed" | "dynamic" }
|
|
355
|
+
})
|
|
356
|
+
|
|
357
|
+
const rowVirtualizer = useVirtualizer(mergedVirtualizerOpts)
|
|
358
|
+
|
|
359
|
+
const virtualList = computed(() => {
|
|
360
|
+
return mergedVirtualizerOpts.value.enabled
|
|
361
|
+
? rowVirtualizer.value.getVirtualItems()
|
|
362
|
+
: props.values.map((_, i) => ({
|
|
363
|
+
index: i,
|
|
364
|
+
size: undefined,
|
|
365
|
+
start: 0,
|
|
366
|
+
end: 0,
|
|
367
|
+
key: typeof props.itemKey === "function"
|
|
368
|
+
? props.itemKey(_)
|
|
369
|
+
: props.itemKey
|
|
370
|
+
? props.values[props.itemKey as keyof typeof props.values]
|
|
371
|
+
: i
|
|
372
|
+
}))
|
|
373
|
+
})
|
|
374
|
+
|
|
375
|
+
const totalSize = computed(() => rowVirtualizer.value.getTotalSize())
|
|
376
|
+
|
|
377
|
+
function measureElement(el: any): void {
|
|
378
|
+
if (!el || !mergedVirtualizerOpts.value.enabled) return
|
|
379
|
+
if (mergedVirtualizerOpts.value?.method === "dynamic") {
|
|
380
|
+
rowVirtualizer.value.measureElement(el)
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
let mounted = false
|
|
385
|
+
function forceRecalculateFixedVirtualizer() {
|
|
386
|
+
if (mergedVirtualizerOpts.value?.method === "dynamic" || !mergedVirtualizerOpts.value.enabled) return
|
|
387
|
+
if (!mounted) {
|
|
388
|
+
throw new Error("forceRecalculateFixedVirtualizer cannot be called before the table is mounted.")
|
|
389
|
+
}
|
|
390
|
+
if (!parentRef.value) return // this could happen if the table is destroyed before the timeout (highly unlikely, probably impossible)
|
|
391
|
+
const height = parentRef.value.querySelector("td")?.getBoundingClientRect().height
|
|
392
|
+
if (!height) return
|
|
393
|
+
for (let i = 0; i < props.values.length; i++) {
|
|
394
|
+
rowVirtualizer.value.resizeItem(i, height)
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const tableHeight = ref(0)
|
|
399
|
+
function updateTableHeight(): void {
|
|
400
|
+
if (!parentRef.value) return
|
|
401
|
+
const el = parentRef.value.querySelector("tbody")
|
|
402
|
+
if (!el) return
|
|
403
|
+
if (tableHeight.value === el.getBoundingClientRect().height) return
|
|
404
|
+
tableHeight.value = el.getBoundingClientRect().height
|
|
405
|
+
}
|
|
406
|
+
const throttledUpdateTableHeight = throttle(updateTableHeight, 100, { leading: true })
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
onMounted(() => {
|
|
410
|
+
throttledUpdateTableHeight()
|
|
411
|
+
mounted = true
|
|
412
|
+
setTimeout(() => {
|
|
413
|
+
forceRecalculateFixedVirtualizer()
|
|
414
|
+
}, 0)
|
|
415
|
+
useGlobalResizeObserver(parentRef, onResize)
|
|
416
|
+
})
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
const hasScrollbar = ref({ vertical: false, horizontal: false })
|
|
420
|
+
function onResize(): void {
|
|
421
|
+
const el = parentRef.value
|
|
422
|
+
if (!el) return
|
|
423
|
+
hasScrollbar.value = {
|
|
424
|
+
vertical: el.scrollHeight > el.clientHeight,
|
|
425
|
+
horizontal: el.scrollWidth > el.clientWidth
|
|
426
|
+
}
|
|
427
|
+
if (hasScrollbar.value.vertical) {
|
|
428
|
+
throttledUpdateTableHeight()
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/* props.values.length instead of `props.values.length - 1` because we're creating an artificial first row for the header */
|
|
433
|
+
const getExtraClasses = (row: number, col: number, isHeader: boolean): string[] => {
|
|
434
|
+
const res = {
|
|
435
|
+
bl: !isHeader && row === props.values.length - 1 && col === 0,
|
|
436
|
+
br: !isHeader && row === props.values.length - 1 && col === props.cols.length - 1,
|
|
437
|
+
tr: (isHeader || !props.header) && row === 0 && col === props.cols.length - 1,
|
|
438
|
+
tl: (isHeader || !props.header) && row === 0 && col === 0,
|
|
439
|
+
"first-row": (isHeader || !props.header) && row === 0,
|
|
440
|
+
"last-row": row === props.values.length - 1,
|
|
441
|
+
"first-col": col === 0,
|
|
442
|
+
"last-col": col === props.cols.length - 1
|
|
443
|
+
}
|
|
444
|
+
return keys(res).filter(key => res[key])
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const classes = computed(() => {
|
|
448
|
+
const res: Record<string, string> = {}
|
|
449
|
+
const headerTdClass = `table--header-cell cell truncate`
|
|
450
|
+
const bodyTdClass = `table--cell cell truncate`
|
|
451
|
+
for (let i = -1; i < props.values.length + 1; i++) {
|
|
452
|
+
for (let j = 0; j < props.cols.length; j++) {
|
|
453
|
+
const col = props.cols[j]!
|
|
454
|
+
const colConfig = props.colConfig[col]
|
|
455
|
+
const key = `${i}-${j}`
|
|
456
|
+
res[key] = twMerge(
|
|
457
|
+
getExtraClasses(i, j, i === -1).join(" "),
|
|
458
|
+
i === -1 ? headerTdClass : bodyTdClass,
|
|
459
|
+
i === -1 ? colConfig?.resizable === false && `no-resize` : undefined,
|
|
460
|
+
i !== -1 && mergedVirtualizerOpts.value.enabled && mergedVirtualizerOpts.value.method === "dynamic" && `flex`
|
|
461
|
+
)
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return res
|
|
465
|
+
})
|
|
466
|
+
|
|
467
|
+
defineExpose({
|
|
468
|
+
forceRecalculateFixedVirtualizer
|
|
469
|
+
})
|
|
470
|
+
</script>
|
|
471
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/vue3"
|
|
3
|
+
import { ref } from "vue"
|
|
4
|
+
|
|
5
|
+
import WTooltip from "./WTooltip.vue"
|
|
6
|
+
|
|
7
|
+
import * as components from "../index.js"
|
|
8
|
+
|
|
9
|
+
const meta: Meta<typeof WTooltip> = {
|
|
10
|
+
component: WTooltip as any,
|
|
11
|
+
title: "Components/Tooltip",
|
|
12
|
+
args: {
|
|
13
|
+
content: "This is a tooltip"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default meta
|
|
18
|
+
|
|
19
|
+
type ExtraTestArgs = {
|
|
20
|
+
_testContent?: string
|
|
21
|
+
_testTrigger?: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type Story = StoryObj<typeof WTooltip> & {
|
|
25
|
+
args?: ExtraTestArgs
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const Primary: Story = {
|
|
29
|
+
render: args => {
|
|
30
|
+
const extraArgs = args as ExtraTestArgs
|
|
31
|
+
return {
|
|
32
|
+
components,
|
|
33
|
+
setup() {
|
|
34
|
+
const showTooltip = ref(false)
|
|
35
|
+
return {
|
|
36
|
+
showTooltip,
|
|
37
|
+
extraArgs,
|
|
38
|
+
args
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
template: `
|
|
42
|
+
<div class="flex flex-col gap-3 items-center pt-10">
|
|
43
|
+
<WTooltip v-bind="args">
|
|
44
|
+
${extraArgs._testTrigger ?? ""}
|
|
45
|
+
<template #content>
|
|
46
|
+
${extraArgs._testContent ?? "This is a tooltip"}
|
|
47
|
+
</template>
|
|
48
|
+
</WTooltip>
|
|
49
|
+
</div>
|
|
50
|
+
`
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
export const CustomTrigger: Story = {
|
|
57
|
+
...Primary,
|
|
58
|
+
args: {
|
|
59
|
+
|
|
60
|
+
_testTrigger: "Custom Trigger"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const VeryLongContentConstrainedToTriggerWidth: Story = {
|
|
65
|
+
...Primary,
|
|
66
|
+
args: {
|
|
67
|
+
constrainWidthTo: "trigger",
|
|
68
|
+
constrainHeightTo: "available",
|
|
69
|
+
_testTrigger: "<button>Tiny Trigger</button>",
|
|
70
|
+
// should scroll
|
|
71
|
+
_testContent: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.".repeat(10)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export const VeryLongContentConstrainedToCustomPxHeight: Story = {
|
|
76
|
+
...Primary,
|
|
77
|
+
args: {
|
|
78
|
+
constrainHeightTo: 50,
|
|
79
|
+
// should scroll
|
|
80
|
+
_testContent: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.".repeat(10)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<TooltipProvider :disabled="disabled">
|
|
3
|
+
<TooltipRoot
|
|
4
|
+
:delay-duration="rootProps?.delayDuration ?? 200"
|
|
5
|
+
:disable-closing-trigger="rootProps?.disableClosingTrigger ?? false"
|
|
6
|
+
v-bind="rootProps"
|
|
7
|
+
>
|
|
8
|
+
<TooltipTrigger
|
|
9
|
+
v-if="triggerWhileDisabled"
|
|
10
|
+
as-child
|
|
11
|
+
>
|
|
12
|
+
<!-- https://reka-ui.com/docs/components/tooltip#displaying-a-tooltip-from-a-disabled-button -->
|
|
13
|
+
<span>
|
|
14
|
+
<slot>
|
|
15
|
+
<WIcon class="text-neutral-500"><i-lucide-info/></WIcon>
|
|
16
|
+
</slot>
|
|
17
|
+
</span>
|
|
18
|
+
</TooltipTrigger>
|
|
19
|
+
<TooltipTrigger v-else>
|
|
20
|
+
<slot>
|
|
21
|
+
<WIcon class="text-neutral-500">
|
|
22
|
+
<i-lucide-info/>
|
|
23
|
+
</WIcon>
|
|
24
|
+
</slot>
|
|
25
|
+
</TooltipTrigger>
|
|
26
|
+
<TooltipPortal
|
|
27
|
+
:to="to"
|
|
28
|
+
>
|
|
29
|
+
<TooltipContent
|
|
30
|
+
:style="contentStyle"
|
|
31
|
+
:class="twMerge(`
|
|
32
|
+
z-100
|
|
33
|
+
tooltip--content-wrapper
|
|
34
|
+
origin-[var(--reka-tooltip-content-transform-origin)]
|
|
35
|
+
data-[side=top]:animate-slideDownAndFade
|
|
36
|
+
data-[side=right]:animate-slideLeftAndFade
|
|
37
|
+
data-[side=bottom]:animate-slideUpAndFade
|
|
38
|
+
data-[side=left]:animate-slideRightAndFade
|
|
39
|
+
bg-neutral-50
|
|
40
|
+
dark:bg-neutral-800
|
|
41
|
+
rounded-sm
|
|
42
|
+
shadow-sm
|
|
43
|
+
shadow-black/30
|
|
44
|
+
border
|
|
45
|
+
border-black/30
|
|
46
|
+
p-2
|
|
47
|
+
overflow-auto
|
|
48
|
+
`,
|
|
49
|
+
contentProps?.class
|
|
50
|
+
) "
|
|
51
|
+
v-bind="{
|
|
52
|
+
collisionPadding: 20,
|
|
53
|
+
side: 'top',
|
|
54
|
+
...contentProps,
|
|
55
|
+
class: undefined,
|
|
56
|
+
style: undefined
|
|
57
|
+
}"
|
|
58
|
+
>
|
|
59
|
+
<div
|
|
60
|
+
class="
|
|
61
|
+
tooltip--content-container
|
|
62
|
+
text-sm
|
|
63
|
+
whitespace-pre-wrap
|
|
64
|
+
flex
|
|
65
|
+
flex-col
|
|
66
|
+
justify-center
|
|
67
|
+
"
|
|
68
|
+
>
|
|
69
|
+
<slot
|
|
70
|
+
name="content"
|
|
71
|
+
v-bind="{ content }"
|
|
72
|
+
>
|
|
73
|
+
{{ content }}
|
|
74
|
+
</slot>
|
|
75
|
+
</div>
|
|
76
|
+
<TooltipArrow
|
|
77
|
+
class="
|
|
78
|
+
tooltip--arrow
|
|
79
|
+
-mt-px
|
|
80
|
+
fill-neutral-50
|
|
81
|
+
dark:fill-neutral-800
|
|
82
|
+
drop-shadow-[0_2px_1px_rgba(0,0,0,0.3)]
|
|
83
|
+
relative
|
|
84
|
+
"
|
|
85
|
+
/>
|
|
86
|
+
</TooltipContent>
|
|
87
|
+
</TooltipPortal>
|
|
88
|
+
</TooltipRoot>
|
|
89
|
+
</TooltipProvider>
|
|
90
|
+
</template>
|
|
91
|
+
|
|
92
|
+
<script setup lang="ts">
|
|
93
|
+
import { TooltipArrow, TooltipContent, TooltipPortal, TooltipProvider, TooltipRoot, TooltipTrigger } from "reka-ui"
|
|
94
|
+
|
|
95
|
+
import ILucideInfo from "~icons/lucide/info"
|
|
96
|
+
|
|
97
|
+
import { usePopupConstrainToStyle } from "../../composables/usePopupConstrainToStyle.js"
|
|
98
|
+
import type { PopupConstrainToProps } from "../../types/index.js"
|
|
99
|
+
import { twMerge } from "../../utils/twMerge.js"
|
|
100
|
+
import WIcon from "../WIcon/WIcon.vue"
|
|
101
|
+
|
|
102
|
+
const props = withDefaults(defineProps<
|
|
103
|
+
& PopupConstrainToProps
|
|
104
|
+
& {
|
|
105
|
+
delayDuration?: number
|
|
106
|
+
disabled?: boolean
|
|
107
|
+
triggerWhileDisabled?: boolean
|
|
108
|
+
content?: string
|
|
109
|
+
collisionBoundary?: Element | null
|
|
110
|
+
to?: string
|
|
111
|
+
/** Reka's TooltipRoot props */
|
|
112
|
+
rootProps?: any
|
|
113
|
+
/** Reka's TooltipContent props */
|
|
114
|
+
contentProps?: any
|
|
115
|
+
}>(),
|
|
116
|
+
{
|
|
117
|
+
delayDuration: 200,
|
|
118
|
+
disabled: false,
|
|
119
|
+
triggerWhileDisabled: false,
|
|
120
|
+
constrainWidthTo: "available",
|
|
121
|
+
constrainHeightTo: "available",
|
|
122
|
+
content: "",
|
|
123
|
+
to: "#root"
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
const contentStyle = usePopupConstrainToStyle("tooltip", props, [props?.contentProps?.style])
|
|
127
|
+
</script>
|
|
128
|
+
|