shadcn-vue
shadcn-vue copied to clipboard
[Bug]: Broken files for `Select` component when installing over CLI
Describe the bug
When installing the Select component as described on the website like so:
npx shadcn-vue@latest add select
I was getting the following errors:
[plugin:vite:vue] Error parsing JavaScript expression: Unexpected token, expected "," (5:1)
/TestProject/resources/js/Components/ui/select/SelectItem.vue:33:13
32 | v-bind="forwardedProps"
33 | :class="
34 | cn(
| ^
35 | 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
36 | props.class
[plugin:vite:vue] Error parsing JavaScript expression: Unexpected token, expected "," (6:1)
/TestProject/resources/js/Components/ui/select/SelectContent.vue:55:15
53 | <SelectContent
54 | v-bind="{ ...forwarded, ...$attrs }"
55 | :class="cn(
| ^
56 | 'relative z-50 max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
57 | position === 'popper' &&
I checked out the installed files SelectItem.vue and SelectContent.vue and noticed that there is an extra square bracket ] placed after the cn(...) function call in each file respectively for the :class attribute.
Code for SelectItem.vue when installing the Select component over the CLI
<script setup>
import { computed } from "vue";
import {
SelectItem,
SelectItemIndicator,
SelectItemText,
useForwardProps,
} from "radix-vue";
import { Check } from "lucide-vue-next";
import { cn } from "@/lib/utils";
const props = defineProps({
value: { type: String, required: true },
disabled: { type: Boolean, required: false },
textValue: { type: String, required: false },
asChild: { type: Boolean, required: false },
as: { type: null, required: false },
class: { type: null, required: false },
});
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwardedProps = useForwardProps(delegatedProps);
</script>
<template>
<SelectItem
v-bind="forwardedProps"
:class="
cn(
'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
props.class
)]"
>
<span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<SelectItemIndicator>
<Check class="h-4 w-4" />
</SelectItemIndicator>
</span>
<SelectItemText>
<slot />
</SelectItemText>
</SelectItem>
</template>
Code for SelectContent.vue when installing the Select component over the CLI
<script setup>
import { computed } from "vue";
import {
SelectContent,
SelectPortal,
SelectViewport,
useForwardPropsEmits,
} from "radix-vue";
import { SelectScrollDownButton, SelectScrollUpButton } from ".";
import { cn } from "@/lib/utils";
defineOptions({
inheritAttrs: false,
});
const props = defineProps({
forceMount: { type: Boolean, required: false },
position: { type: String, required: false, default: "popper" },
bodyLock: { type: Boolean, required: false },
side: { type: null, required: false },
sideOffset: { type: Number, required: false },
align: { type: null, required: false },
alignOffset: { type: Number, required: false },
avoidCollisions: { type: Boolean, required: false },
collisionBoundary: { type: null, required: false },
collisionPadding: { type: [Number, Object], required: false },
arrowPadding: { type: Number, required: false },
sticky: { type: String, required: false },
hideWhenDetached: { type: Boolean, required: false },
updatePositionStrategy: { type: String, required: false },
prioritizePosition: { type: Boolean, required: false },
asChild: { type: Boolean, required: false },
as: { type: null, required: false },
class: { type: null, required: false },
});
const emits = defineEmits([
"closeAutoFocus",
"escapeKeyDown",
"pointerDownOutside",
]);
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>
<template>
<SelectPortal>
<SelectContent
v-bind="{ ...forwarded, ...$attrs }"
:class="cn(
'relative z-50 max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
position === 'popper' &&
'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',
props.class
)]"
>
<SelectScrollUpButton />
<SelectViewport
:class="
cn(
'p-1',
position === 'popper' &&
'h-[--radix-select-trigger-height] w-full min-w-[--radix-select-trigger-width]',
)
"
>
<slot />
</SelectViewport>
<SelectScrollDownButton />
</SelectContent>
</SelectPortal>
</template>
Weirdly enough the code in the repository / registry seems to be correct, hence there isn't any ] after the cn(...) function call for the :class attribute:
https://github.com/radix-vue/shadcn-vue/blob/d50ea38f4abccdad5db190ad2b1da26815e4c6aa/apps/www/src/lib/registry/default/ui/select/SelectItem.vue#L31
and
https://github.com/radix-vue/shadcn-vue/blob/d50ea38f4abccdad5db190ad2b1da26815e4c6aa/apps/www/src/lib/registry/default/ui/select/SelectContent.vue#L43
System Info
* macOS
* node 20.15.0
* npm 10.7.0
* Safari 17.5
* npmPackages:
* @vueuse/core: ^10.11.0 => 10.11.0
* radix-vue: ^1.8.5 => 1.8.5
* vue: ^3.4.31 => 3.4.31
Contributes
- [ ] I am willing to submit a PR to fix this issue
- [ ] I am willing to submit a PR with failing tests