diff --git a/src/components/Button/LuiButton.vue b/src/components/Button/LuiButton.vue index 3d4d84b..cfc47d8 100644 --- a/src/components/Button/LuiButton.vue +++ b/src/components/Button/LuiButton.vue @@ -10,6 +10,7 @@ import { useButtonClasses } from './composables' import type { PropType } from 'vue' import type { ButtonTag } from './button-types' import type { Variant, Filter, Rounded, Block, Color, Size } from '@/globals/types' +import type { TwClassInterface } from '@/globals/interfaces' const props = defineProps({ tag: { @@ -40,18 +41,6 @@ const props = defineProps({ type: Boolean as PropType, default: false } - // prepend: { - // type: [String, Object] as PropType, - // default: "none", - // }, - // append: { - // type: [String, Object] as PropType, - // default: "none", - // }, - // icon: { - // type: [String, Object] as PropType, - // default: "none", - // }, // loading: { // type: Boolean as PropType, // default: false, @@ -64,27 +53,45 @@ const props = defineProps({ const { buttonClasses, computedIconSize } = useButtonClasses(toRefs(props)) const slots = useSlots() -// console.log(slots?.default().props.size = "lg"); +function dynamicSlotClasses() { + // We move this classes from composable, because of slots reactivity issue + // more details: https://github.com/LUI-UI/lui-vue/issues/33 + const hasAnyIcon = slots.prepend || slots.append || slots.icon + const classes: TwClassInterface = { + display: { + flex: hasAnyIcon, + 'inline-block': !hasAnyIcon && props.tag !== 'button' + }, + alignItems: { + 'items-center': hasAnyIcon + }, + justifyContent: { + 'justify-center': hasAnyIcon + }, + space: + !!slots.prepend || !!slots.append + ? { + 'space-x-1': props.size === 'xs' || props.size === 'sm', + 'space-x-1.5': props.size === 'md', + 'space-x-2': props.size === 'lg' || props.size === 'xl' + } + : '' + } + return Object.values({ ...classes }) +} diff --git a/src/components/Button/composables/index.ts b/src/components/Button/composables/index.ts index c3a51ea..5f308a3 100644 --- a/src/components/Button/composables/index.ts +++ b/src/components/Button/composables/index.ts @@ -19,7 +19,7 @@ type PropTypes = { export function useButtonClasses(props: PropTypes) { const slots = useSlots() const hasIcon = computed(() => !!slots.icon) - const hasAnyIcon = computed(() => !!slots.icon || !!slots.prepend || !!slots.append) + // const hasAnyIcon = computed(() => !!slots.icon || !!slots.prepend || !!slots.append) const computedButtonClasses = computed(() => { const buttonClasses: TwClassInterface = { @@ -117,27 +117,7 @@ export function useButtonClasses(props: PropTypes) { borderRadius: { 'rounded-lg': props.rounded.value === true, 'rounded-full': props.rounded.value === 'full' - }, - // display: "inline-block", - display: { - flex: hasAnyIcon.value, - 'inline-block': !hasAnyIcon.value && props.tag.value !== 'button' - }, - alignItems: { - 'items-center': hasAnyIcon.value - }, - justifyContent: { - 'justify-center': hasAnyIcon.value - }, - // 4 4 6 8 8 - space: - !!slots.prepend || !!slots.append - ? { - 'space-x-1': props.size.value === 'xs' || props.size.value === 'sm', - 'space-x-1.5': props.size.value === 'md', - 'space-x-2': props.size.value === 'lg' || props.size.value === 'xl' - } - : '' + } } return Object.values({ ...buttonClasses }) })