\n \u003C/div>\n\n \u003Cdiv class=\"ml-4 flex flex-1 flex-col\">\n \u003Cdiv>\n \u003Cdiv class=\"flex justify-between text-base font-medium text-gray-900 mb-2\">\n \u003CNuxtLink :to=\"'/product/' + product.id\">{{ product.name }}\u003C/NuxtLink>\n \u003Cp class=\"ml-4\">£{{ product.selectedQuantity?.price }}\u003C/p>\n \u003C/div>\n \u003C/div>\n\n \u003Cdiv class=\"flex flex-1 flex-col md:flex-row items-end justify-between text-sm text-black gap-4\">\n \u003Cdiv class=\"w-full flex flex-col md:flex-row flex-wrap gap-2 \">\n \u003CUSelectMenu v-if=\"hasMultipleSkus(product)\" class=\"max-w-56\" v-model=\"product.selectedSku\"\n :search-input=\"false\" :label-key=\"'name'\" :items=\"product.skus\"\n @update:modelValue=\"changeSku($event as Sku, product)\">\n \u003C/USelectMenu>\n \u003Cpre>{{ product.selectedQuantity }}\u003C/pre>\n \u003CUSelectMenu v-model=\"product.selectedQuantity\" :search-input=\"false\"\n :label-key=\"'quantity'\" class=\"max-w-56\" :items=\"updatePricesWithStock(product)\"\n @update:modelValue=\"changeQuantity($event as QuantityPrice, product)\">\n \u003Ctemplate #item=\"{ item }\">\u003Cspan>{{ item.quantity }}\u003C/span>\u003Cspan\n v-if=\"item.disabled\">Out of\n stock\u003C/span>\u003C/template>\n \u003C/USelectMenu>\n \u003C/div>\n \u003Cdiv class=\"flex\">\n \u003Cbutton type=\"button\" class=\"font-medium text-primary-500 hover:text-primary-600\"\n @click=\"basketStore.remove(product.rid)\">Remove\u003C/button>\n \u003C/div>\n\n \u003C/div>\n\n \u003C/div>\n \u003C/li>\n\n \u003C/ul>\n \u003C/div>\n\u003C/template>\n\u003Cscript setup lang=\"ts\">\nimport type { Product, Sku, QuantityPrice } from '../../types';\n\nfunction changeSku(sku: Sku, item: Product) {\n\n}\n\nfunction hasMultipleSkus(item: Product): boolean {\n\n}\n\n\nfunction changeQuantity(quantity: QuantityPrice, item: Product) {\n\n}\n\n// Helper function to map prices and add \"disabled\" property - see other \nconst updatePricesWithStock = (item: any) => {\n return item.selectedSku?.prices.map((price: QuantityPrice) => ({\n ...price,\n disabled: !item?.onDemand && price.quantity > item.selectedSku?.stock\n }));\n};\n\n\n\u003C/script>\n```\n\n### Description\n\n_(Not sure whether to include this issue in Nuxt or Nuxt UI)_\n\nI have a base component that uses a selectMenu with an array. In Nuxt 3.17.6 with compatibiltyVersion: 4 set, the SelectMenu works as expected. When upgrading to nuxt 4 the label key no longer works. I'll attach screenshots and the code is in the reproduction section.\n**Nuxt 3.17.6**\n\u003Cimg width=\"736\" height=\"216\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/04967fa3-d156-46e2-b74d-f060ec68fcc4\" />\n\n**Nuxt 4**\n\u003Cimg width=\"751\" height=\"220\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/8ccf4caf-12f1-46d0-beda-9ebea3b1eee3\" />\n\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell-script\n\n```",[3018,3021,3024],{"name":3019,"color":3020},"bug","d73a4a",{"name":3022,"color":3023},"v3","49DCB8",{"name":3025,"color":3026},"triage","ffffff",4627,"nuxt","ui","open","SelectMenu | Label Key not working correctly with Nuxt 4?","2025-07-29T12:07:37Z","https://github.com/nuxt/ui/issues/4627",0.69841546,{"description":3036,"labels":3037,"number":3043,"owner":3028,"repository":3029,"state":3030,"title":3044,"updated_at":3045,"url":3046,"score":3047},"### Description\n\nIn Vue it's easy to use HTML in every component using v-html. It would be very helpful in Nuxt UI to have this feature without workarounds like slots with additional span tags. In our case we often have some html tags like: b,i,... or nbsp in our database driven app. \n\n### Additional context\n\n_No response_",[3038,3041,3042],{"name":3039,"color":3040},"enhancement","a2eeef",{"name":3022,"color":3023},{"name":3025,"color":3026},4396,"Use HTML in label or in a new prop","2025-06-24T13:00:05Z","https://github.com/nuxt/ui/issues/4396",0.73335916,{"description":3049,"labels":3050,"number":3053,"owner":3028,"repository":3029,"state":3030,"title":3054,"updated_at":3055,"url":3056,"score":3057},"### Description\n\n### 🚀 Feature Request\nI’d like to suggest adding a built-in `\u003CDynamicRenderer>` component to Nuxt UI that renders dynamic, nested components based on a configuration object.\n\n### 📋 Motivation\nThis component would be ideal for:\n\n- Form builders\n\n- CMS-driven UIs\n\n- Low-code tools\n\n- Declarative UI rendering\n\nIt simplifies the process of rendering deeply nested structures without hardcoding components in the template.\n\n### 💡 Proposal\nThe DynamicRenderer would accept a config prop that defines:\n\n- The component to render\n\n- Props to bind\n\n- Slot content (including nested component trees)\n\nIt would recursively render components and their slots. Here's an example implementation:\n\n\n#### `DynamicRenderer.vue`\n```vue\n\u003Cscript setup lang=\"ts\">\ndefineProps\u003C{ config: any }>()\n\u003C/script>\n\n\u003Ctemplate>\n \u003Ccomponent :is=\"config.component\" v-bind=\"config\">\n \u003Ctemplate\n v-for=\"(slotContent, slotName) in config.slots\"\n #[slotName]\n >\n \u003Ctemplate v-if=\"typeof slotContent === 'string'\">\n {{ slotContent }}\n \u003C/template>\n\n \u003Ctemplate v-else-if=\"Array.isArray(slotContent)\">\n \u003CDynamicRenderer\n v-for=\"(nested, index) in slotContent\"\n :key=\"index\"\n :config=\"nested\"\n />\n \u003C/template>\n\n \u003Ctemplate v-else>\n \u003CDynamicRenderer :config=\"slotContent\" :key=\"slotContent.name || slotName\" />\n \u003C/template>\n \u003C/template>\n \u003C/component>\n\u003C/template>\n```\n\n\n\n#### `index.vue`\n```vue\n\u003Cscript setup lang=\"ts\">\nimport { UButton, UCard, UContainer, UForm, UFormField, UInput } from '#components'\n\nconst config = {\n component: UContainer,\n class: 'h-screen flex justify-center items-center',\n slots: {\n default: [\n {\n component: UCard,\n slots: {\n default: [{\n component: UForm,\n class: 'space-y-4',\n slots: {\n default: [\n {\n component: UFormField,\n label: 'Username',\n name: 'username',\n required: true,\n slots: {\n default: [\n {\n component: UInput,\n placeholder: 'Enter Username',\n value: 'hh'\n }\n ]\n }\n },\n {\n component: UFormField,\n label: 'Password',\n name: 'password',\n required: true,\n slots: {\n default: [\n {\n component: UInput,\n type: 'password',\n placeholder: 'Enter Password',\n value: 'hh'\n }\n ]\n }\n },\n {\n component: UButton,\n label: 'Login',\n icon: 'i-lucide-user',\n variant: 'soft',\n type: 'submit',\n block: true\n }\n ]\n }\n }]\n }\n }\n ]\n }\n}\n\u003C/script>\n\n\u003Ctemplate>\n \u003CDynamicRenderer :config=\"config\" />\n\u003C/template>\n```\n\n### Result \n\n\nIt would also be great if using this approach could eliminate the need to manually import components like:\n\n```ts\nimport { UButton, UCard, UContainer, UForm, UFormField, UInput } from '#components'\n```\n\nand instead rely on automatic resolution by the renderer itself.\n\nThanks for your work on Nuxt UI – it’s a fantastic toolkit!\n\n### Additional context\n\n_No response_",[3051,3052],{"name":3039,"color":3040},{"name":3025,"color":3026},4138,"✨ Feature Request: Add `\u003CDynamicRenderer>` component for config-driven UI rendering","2025-05-12T16:36:30Z","https://github.com/nuxt/ui/issues/4138",0.7508005,{"description":3059,"labels":3060,"number":3063,"owner":3028,"repository":3029,"state":3064,"title":3065,"updated_at":3066,"url":3067,"score":3068},"### Description\n\nUSelect displays the label of the selected value. It might be interesting to add a slot to display another key when item is an object instead of the chosen label for some use case.\n\nMy own use case is picking the language :\n\n```\nconst items = [\n { value: 'en', label: 'English' },\n { value: 'fr', label: 'Français' },\n (...)\n]\n```\n\nMy open selection would display flags and labels, but once selected, the component would only display the value ('en' or 'fr' or ...). Could be the icon as well.\n\nProposal :\n\nselectLabelKey : When items is an array of objects, select the field to use as the label for the picked value on the base component (instead of labelKey)\n\n### Additional context\n\n_No response_",[3061,3062],{"name":3039,"color":3040},{"name":3022,"color":3023},4157,"closed","USelect base text display","2025-05-23T12:25:54Z","https://github.com/nuxt/ui/issues/4157",0.694284,{"description":3070,"labels":3071,"number":3079,"owner":3028,"repository":3029,"state":3064,"title":3080,"updated_at":3081,"url":3082,"score":3083},"### Environment\n\n- Operating System: Windows_NT\n- Node Version: v22.8.0\n- Nuxt Version: 3.13.2\n- CLI Version: 3.13.2\n- Nitro Version: 2.9.7\n- Package Manager: yarn@1.22.22\n- Builder: -\n- User Config: modules, plugins, css, colorMode, tiptap, runtimeConfig, nitro, routeRules, compatibilityDate\n- Runtime Modules: @nuxt/ui@2.20.0, @pinia/nuxt@0.5.4, @vueuse/nuxt@11.1.0, nuxt-tiptap-editor@2.0.0\n- Build Modules: -\n\n### Version\n\nv2.20.0\n\n### Reproduction\n\n```\n\u003Cscript setup lang=\"ts\">\nenum DiscountType {\n Fixed = 0,\n Percentage = 1\n}\n\nconst types = [\n {\n label: \"€\",\n value: DiscountType.Fixed\n },\n {\n label: \"%\",\n value: DiscountType.Percentage\n }\n]\nconst type = ref\u003CDiscountType>(DiscountType.Fixed)\n\u003C/script>\n\n\u003Ctemplate>\n \u003CUSelectMenu v-model=\"type\" :options=\"types\" value-attribute=\"value\" />\n\u003C/template>\n```\n\nSelectMenu does not display the label associated to the falsy value \"0\":\n\n\nThe list is populated with both values:\n\n\nThe label associated to the truthy value \"1\" is displayed as expected:\n\n\n### Description\n\nAll falsy values are not displayed anymore since v2.20.0 due to the rework of the computed `label` in the SelectMenu component.\n\nHere is the definition of this computed in `/src/runtime/components/form/SelectMenu.vue`:\n```\nconst label = computed(() => {\n if (!props.modelValue) return null\n\n if (Array.isArray(props.modelValue) && props.modelValue.length) {\n return `${props.modelValue.length} selected`\n } else if (['string', 'number'].includes(typeof props.modelValue)) {\n return props.valueAttribute ? accessor(selected.value, props.optionAttribute) : props.modelValue\n }\n\n return accessor(props.modelValue as Record\u003Cstring, any>, props.optionAttribute)\n})\n```\n\n**The component should treat `0`, `\"\"` and `false` as \"acceptable\" labelled values.**\n\nI believe the first condition should be either :\n`if(props.modelValue == null) return null` \nOr:\n`if(props.modelValue === null || props.modelValue === undefined) return null` \n\n### Additional context\n\nI will try to find some time to create a pull request if this is accepted as an issue. Not sure I can manage to do it short-term though.\n\n### Logs\n\n```shell-script\n\n```",[3072,3073,3074,3077],{"name":3019,"color":3020},{"name":3025,"color":3026},{"name":3075,"color":3076},"closed-by-bot","ededed",{"name":3078,"color":3076},"stale",3132,"SelectMenu label not displayed for falsy values","2025-06-18T09:02:30Z","https://github.com/nuxt/ui/issues/3132",0.7207815,{"description":3085,"labels":3086,"number":3091,"owner":3028,"repository":3029,"state":3064,"title":3092,"updated_at":3093,"url":3094,"score":3095},"### Description\n\nI'm trying to apply styling to specific elements, this is my current code for initializing my NavigationMenu items:\n```js\nconst items = ref\u003CNavigationMenuItem[]>([\n [\n {\n label: \"Something\",\n icon: \"\",\n to: \"/\"\n }\n ],\n [\n {\n icon: \"i-simple-icons-discord\",\n to: \"https://discord.gg/....\"\n }\n ]\n ])\n```\n\nI am trying to apply styling using tailwind like you would via `:ui=\"\"` on the `UNavigationMenu` element but in this case I want to change `linkLeadingIcon` only for the discord element, and replace `list` entirely for the `Something` element. I've been scouring the docs and such and I haven't been able to really find a way to do this. As far as I can tell I can't do styling based on label/icon/etc using compound variants.\n\nI'm fairly new to Nuxt UI so might be missing a obvious solution, thanks!",[3087,3090],{"name":3088,"color":3089},"question","d876e3",{"name":3022,"color":3023},3683,"NavigationMenu styling for specific items","2025-04-18T18:47:43Z","https://github.com/nuxt/ui/issues/3683",0.72427374,{"description":3097,"labels":3098,"number":3102,"owner":3028,"repository":3028,"state":3064,"title":3103,"updated_at":3104,"url":3105,"score":3106},"### Environment\n\n------------------------------\r\n- Operating System: Linux\r\n- Node Version: v20.14.0\r\n- Nuxt Version: 3.12.4\r\n- CLI Version: 3.12.0\r\n- Nitro Version: 2.9.7\r\n- Package Manager: pnpm@9.7.1\r\n- Builder: -\r\n- User Config: runtimeConfig, extends, modules, ui, colorMode, routeRules, devtools, typescript, future, eslint, nitro, i18n, compatibilityDate\r\n- Runtime Modules: @nuxt/eslint@0.5.0, @nuxt/fonts@0.7.1, @nuxt/ui@2.18.4, @vueuse/nuxt@10.11.0, @nuxtjs/i18n@8.5.0\r\n- Build Modules: -\r\n------------------------------\r\n\n\n### Reproduction\n\nhttps://stackblitz.com/edit/nuxt-ui-u6tm1b?file=app.vue\n\n### Describe the bug\n\nWhen using a `v-model` prop with some initial object values (such as fetched already selected data from backend), the `\u003CUSelectMenu>` component doesn't show these as selected and seems to ignore them completely.\r\n\r\nEven when selecting the same objects again, it just seems to add them to the array and disregard anything, that was there previously.\n\n### Additional context\n\nThe behaviour changes when setting the `by` prop. In my case, I set it to `id`, after which I can see the object as selected, **but only** in the dropdown.\r\nThe button itself still shows `0 selected`.\n\n### Logs\n\n_No response_",[3099],{"name":3100,"color":3101},"pending triage","E99695",28733,"SelectMenu initial object values","2024-08-28T03:27:34Z","https://github.com/nuxt/nuxt/issues/28733",0.7326443,{"labels":3108,"number":3112,"owner":3028,"repository":3028,"state":3064,"title":3113,"updated_at":3114,"url":3115,"score":3116},[3109],{"name":3110,"color":3111},"2.x","d4c5f9",4134,"TS2314: Generic type 'ComponentOptions\u003CV>' requires 1 type argument(s).","2023-01-18T20:03:58Z","https://github.com/nuxt/nuxt/issues/4134",0.7349025,{"description":3118,"labels":3119,"number":3125,"owner":3028,"repository":3029,"state":3064,"title":3126,"updated_at":3127,"url":3128,"score":3129},"### Environment\n\n```\n System:\n OS: macOS 15.5\n CPU: (14) arm64 Apple M3 Max\n Memory: 555.83 MB / 36.00 GB\n Shell: 5.9 - /bin/zsh\n Binaries:\n Node: 23.11.0 - /opt/homebrew/bin/node\n Yarn: 1.22.22 - /opt/homebrew/bin/yarn\n npm: 10.9.2 - /opt/homebrew/bin/npm\n pnpm: 9.12.3 - /opt/homebrew/bin/pnpm\n Watchman: 2025.04.28.00 - /opt/homebrew/bin/watchman\n npmPackages:\n nuxt: ^3.17.3 => 3.17.4 \n```\n\n### Is this bug related to Nuxt or Vue?\n\nNuxt\n\n### Version\n\nv3.17.4\n\n### Reproduction\n\nhttps://codesandbox.io/p/devbox/nuxt-ui3-n3sxks\n\n### Description\n\nWhen using the UNavigationMenu component from Nuxt UI 3 in a fresh Nuxt 3 app, the following warning appears in the browser console:\n\n```shell-script\n> [Vue warn] toRefs() expects a reactive object but received a plain one.\n```\n\nThis occurs even when rendering the component barebones:\n\n**pages/index.vue:**\n\n```vue\n\u003Cscript setup lang=\"ts\">\nimport type { NavigationMenuItem } from '@nuxt/ui'\n\nconst items = ref\u003CNavigationMenuItem[]>([\n {\n label: 'Guide',\n icon: 'i-lucide-book-open',\n to: '/getting-started',\n children: [\n {\n label: 'Introduction',\n description: 'Fully styled and customizable components for Nuxt.',\n icon: 'i-lucide-house'\n },\n {\n label: 'Installation',\n description: 'Learn how to install and configure Nuxt UI in your application.',\n icon: 'i-lucide-cloud-download'\n },\n {\n label: 'Icons',\n icon: 'i-lucide-smile',\n description: 'You have nothing to do, @nuxt/icon will handle it automatically.'\n },\n {\n label: 'Colors',\n icon: 'i-lucide-swatch-book',\n description: 'Choose a primary and a neutral color from your Tailwind CSS theme.'\n },\n {\n label: 'Theme',\n icon: 'i-lucide-cog',\n description: 'You can customize components by using the `class` / `ui` props or in your app.config.ts.'\n }\n ]\n },\n {\n label: 'Composables',\n icon: 'i-lucide-database',\n to: '/composables',\n children: [\n {\n label: 'defineShortcuts',\n icon: 'i-lucide-file-text',\n description: 'Define shortcuts for your application.',\n to: '/composables/define-shortcuts'\n },\n {\n label: 'useOverlay',\n icon: 'i-lucide-file-text',\n description: 'Display a modal/slideover within your application.',\n to: '/composables/use-overlay'\n },\n {\n label: 'useToast',\n icon: 'i-lucide-file-text',\n description: 'Display a toast within your application.',\n to: '/composables/use-toast'\n }\n ]\n },\n {\n label: 'Components',\n icon: 'i-lucide-box',\n to: '/components',\n active: true,\n children: [\n {\n label: 'Link',\n icon: 'i-lucide-file-text',\n description: 'Use NuxtLink with superpowers.',\n to: '/components/link'\n },\n {\n label: 'Modal',\n icon: 'i-lucide-file-text',\n description: 'Display a modal within your application.',\n to: '/components/modal'\n },\n {\n label: 'NavigationMenu',\n icon: 'i-lucide-file-text',\n description: 'Display a list of links.',\n to: '/components/navigation-menu'\n },\n {\n label: 'Pagination',\n icon: 'i-lucide-file-text',\n description: 'Display a list of pages.',\n to: '/components/pagination'\n },\n {\n label: 'Popover',\n icon: 'i-lucide-file-text',\n description: 'Display a non-modal dialog that floats around a trigger element.',\n to: '/components/popover'\n },\n {\n label: 'Progress',\n icon: 'i-lucide-file-text',\n description: 'Show a horizontal bar to indicate task progression.',\n to: '/components/progress'\n }\n ]\n },\n {\n label: 'GitHub',\n icon: 'i-simple-icons-github',\n badge: '3.8k',\n to: 'https://github.com/nuxt/ui',\n target: '_blank'\n },\n {\n label: 'Help',\n icon: 'i-lucide-circle-help',\n disabled: true\n }\n])\n\u003C/script>\n\u003Ctemplate>\n \u003CUNavigationMenu :items=\"items\" class=\"w-full justify-center\" />\n\u003C/template>\n\n```\n\n**Minimal Reproduction**\nRepro created using Nuxt 3 + Nuxt UI 3 starter structure.\n\npackage.json:\n```json\n{\n \"name\": \"nuxt-app\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"nuxt build\",\n \"dev\": \"nuxt dev\",\n \"generate\": \"nuxt generate\",\n \"preview\": \"nuxt preview\",\n \"postinstall\": \"nuxt prepare\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint --fix .\"\n },\n \"dependencies\": {\n \"@iconify-json/lucide\": \"^1.2.44\",\n \"@iconify-json/simple-icons\": \"^1.2.35\",\n \"@nuxt/ui\": \"^3.1.1\",\n \"nuxt\": \"^3.17.3\"\n },\n \"devDependencies\": {\n \"@nuxt/eslint\": \"^1.4.1\",\n \"eslint\": \"^9.27.0\",\n \"typescript\": \"^5.8.3\"\n }\n}\n```\n\nNotes\n\t•\tReproduces consistently in local dev.\n\t•\tDoes not reproduce on Codesandbox with the Nuxt UI 3 starter (possibly due to different runtime setup).\n\t•\tNo functional issues observed so far, but the warning pollutes the console.\n\t•\tThis warning has only recently started appearing in the console logs, despite no code changes to this component on our end — possibly introduced in a recent dependency update.\n",[3120,3121,3122],{"name":3019,"color":3020},{"name":3022,"color":3023},{"name":3123,"color":3124},"reka-ui","56d799",4257,"[Vue warn] toRefs() expects a reactive object but received a plain one - \u003CUNavigationMenu />","2025-06-10T14:16:02Z","https://github.com/nuxt/ui/issues/4257",0.7377965,{"description":3131,"labels":3132,"number":3138,"owner":3028,"repository":3029,"state":3064,"title":3139,"updated_at":3140,"url":3141,"score":3142},"### Description\n\nHello there\nCurrently, \u003CUSelect /> and \u003CUSelectMenu /> components render options within a fixed-height dropdown. It is complicated to deal with large datasets. When displaying large lists of options, this can lead to performance issues. Is it possible we can get something like VueUse infinite scroll?\n[https://vueuse.org/core/useinfinitescroll/#useinfinitescroll](url) ??\n\n### Additional context\n\n_No response_",[3133,3136,3137],{"name":3134,"color":3135},"duplicate","cfd3d7",{"name":3039,"color":3040},{"name":3022,"color":3023},4172,"Uselect and UselectMenu content infinite scroll","2025-05-23T13:55:50Z","https://github.com/nuxt/ui/issues/4172",0.7385358,["Reactive",3144],{},["Set"],["ShallowReactive",3147],{"$fTRc1wZytZ_XrK4EfJfei_Sz-An4H4Yy6syhVxH_PVJc":-1,"$fpkwDdJvePe-B3pMRlrLtP3WykfOVyyF2UH2kbPcx05Y":-1},"/nuxt/ui/4581"]