From f98398f72f0933e0d65104b3b110566727041ae1 Mon Sep 17 00:00:00 2001 From: rijenkii Date: Sat, 16 Aug 2025 10:21:00 +0700 Subject: [PATCH 01/11] feat(icon): allow passing a component instead of a name --- src/runtime/components/Icon.vue | 7 +++++-- src/runtime/vue/components/Icon.vue | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/runtime/components/Icon.vue b/src/runtime/components/Icon.vue index 8d816fa245..72484709d9 100644 --- a/src/runtime/components/Icon.vue +++ b/src/runtime/components/Icon.vue @@ -1,6 +1,8 @@ diff --git a/src/runtime/vue/components/Icon.vue b/src/runtime/vue/components/Icon.vue index 6b6cde5341..db75c4afd3 100644 --- a/src/runtime/vue/components/Icon.vue +++ b/src/runtime/vue/components/Icon.vue @@ -1,6 +1,8 @@ @@ -11,5 +13,6 @@ defineProps() From 0eb7e30dc318474e4519f48a1428d6c671e28545 Mon Sep 17 00:00:00 2001 From: rijenkii Date: Sat, 16 Aug 2025 10:33:22 +0700 Subject: [PATCH 02/11] feat(*): allow passing a component instead of an icon name in all components --- src/runtime/components/Accordion.vue | 7 ++++--- src/runtime/components/Alert.vue | 6 +++--- src/runtime/components/AuthForm.vue | 4 ++-- src/runtime/components/Avatar.vue | 4 ++-- src/runtime/components/Banner.vue | 6 +++--- src/runtime/components/Breadcrumb.vue | 6 +++--- src/runtime/components/Calendar.vue | 10 +++++----- src/runtime/components/Carousel.vue | 6 +++--- src/runtime/components/ChatMessage.vue | 4 ++-- src/runtime/components/ChatMessages.vue | 4 ++-- src/runtime/components/ChatPromptSubmit.vue | 10 +++++----- src/runtime/components/Checkbox.vue | 5 +++-- src/runtime/components/CommandPalette.vue | 16 ++++++++-------- src/runtime/components/ContextMenu.vue | 10 +++++----- src/runtime/components/ContextMenuContent.vue | 8 ++++---- src/runtime/components/DashboardNavbar.vue | 4 ++-- src/runtime/components/DashboardSearch.vue | 8 ++++---- src/runtime/components/DashboardSearchButton.vue | 4 ++-- src/runtime/components/DropdownMenu.vue | 10 +++++----- src/runtime/components/DropdownMenuContent.vue | 8 ++++---- src/runtime/components/FileUpload.vue | 8 ++++---- src/runtime/components/FooterColumns.vue | 4 ++-- src/runtime/components/InputMenu.vue | 10 +++++----- src/runtime/components/InputNumber.vue | 6 +++--- src/runtime/components/InputTags.vue | 4 ++-- src/runtime/components/Modal.vue | 4 ++-- src/runtime/components/NavigationMenu.vue | 10 +++++----- src/runtime/components/PageAnchors.vue | 4 ++-- src/runtime/components/PageCard.vue | 4 ++-- src/runtime/components/PageFeature.vue | 4 ++-- src/runtime/components/PageLinks.vue | 4 ++-- src/runtime/components/PageSection.vue | 4 ++-- src/runtime/components/Pagination.vue | 12 ++++++------ src/runtime/components/PricingPlan.vue | 4 ++-- src/runtime/components/Select.vue | 8 ++++---- src/runtime/components/SelectMenu.vue | 8 ++++---- src/runtime/components/Separator.vue | 4 ++-- src/runtime/components/Slideover.vue | 4 ++-- src/runtime/components/Stepper.vue | 4 ++-- src/runtime/components/Switch.vue | 8 ++++---- src/runtime/components/Tabs.vue | 4 ++-- src/runtime/components/Timeline.vue | 4 ++-- src/runtime/components/Toast.vue | 6 +++--- src/runtime/components/Tree.vue | 12 ++++++------ .../components/content/ContentNavigation.vue | 8 ++++---- src/runtime/components/content/ContentSearch.vue | 12 ++++++------ .../components/content/ContentSearchButton.vue | 4 ++-- .../components/content/ContentSurround.vue | 11 ++++++----- src/runtime/components/content/ContentToc.vue | 3 ++- src/runtime/components/prose/Accordion.vue | 3 ++- src/runtime/components/prose/Callout.vue | 4 ++-- src/runtime/components/prose/Card.vue | 4 ++-- src/runtime/components/prose/CodeCollapse.vue | 3 ++- src/runtime/components/prose/CodeGroup.vue | 3 ++- src/runtime/components/prose/CodeIcon.vue | 3 ++- src/runtime/components/prose/CodeTree.vue | 3 ++- src/runtime/components/prose/Collapsible.vue | 3 ++- src/runtime/components/prose/Pre.vue | 3 ++- src/runtime/components/prose/Tabs.vue | 3 ++- src/runtime/composables/useComponentIcons.ts | 10 +++++----- 60 files changed, 188 insertions(+), 176 deletions(-) diff --git a/src/runtime/components/Accordion.vue b/src/runtime/components/Accordion.vue index 52af6f112b..da99b2271d 100644 --- a/src/runtime/components/Accordion.vue +++ b/src/runtime/components/Accordion.vue @@ -3,6 +3,7 @@ import type { AccordionRootProps, AccordionRootEmits } from 'reka-ui' import type { AppConfig } from '@nuxt/schema' import theme from '#build/ui/accordion' +import type { IconProps } from '../types' import type { DynamicSlots } from '../types/utils' import type { ComponentConfig } from '../types/tv' @@ -13,11 +14,11 @@ export interface AccordionItem { /** * @IconifyIcon */ - icon?: string + icon?: IconProps['name'] /** * @IconifyIcon */ - trailingIcon?: string + trailingIcon?: IconProps['name'] slot?: string content?: string /** A unique value for the accordion item. Defaults to the index. */ @@ -40,7 +41,7 @@ export interface AccordionProps extends * @defaultValue appConfig.ui.icons.chevronDown * @IconifyIcon */ - trailingIcon?: string + trailingIcon?: IconProps['name'] /** * The key used to get the label from the item. * @defaultValue 'label' diff --git a/src/runtime/components/Alert.vue b/src/runtime/components/Alert.vue index d2366dafad..1d9ab5c5c1 100644 --- a/src/runtime/components/Alert.vue +++ b/src/runtime/components/Alert.vue @@ -1,7 +1,7 @@ diff --git a/src/runtime/components/prose/CodeTree.vue b/src/runtime/components/prose/CodeTree.vue index a16786ac38..e2178ba12f 100644 --- a/src/runtime/components/prose/CodeTree.vue +++ b/src/runtime/components/prose/CodeTree.vue @@ -37,6 +37,7 @@ import { TreeRoot, TreeItem } from 'reka-ui' import { createReusableTemplate } from '@vueuse/core' import { useAppConfig } from '#imports' import { tv } from '../../utils/tv' +import type { IconProps } from '../../types' import UCodeIcon from './CodeIcon.vue' import UIcon from '../Icon.vue' @@ -59,7 +60,7 @@ const rerenderCount = ref(1) const flatItems = computed<{ index: number label: string - icon: string + icon: IconProps['name'] component: any }[]>(() => { // eslint-disable-next-line @typescript-eslint/no-unused-expressions diff --git a/src/runtime/components/prose/Collapsible.vue b/src/runtime/components/prose/Collapsible.vue index f14c0f2526..df87bc4ef6 100644 --- a/src/runtime/components/prose/Collapsible.vue +++ b/src/runtime/components/prose/Collapsible.vue @@ -1,6 +1,7 @@ + + diff --git a/docs/content/docs/2.components/icon.md b/docs/content/docs/2.components/icon.md index a3b174febd..1c6923b602 100644 --- a/docs/content/docs/2.components/icon.md +++ b/docs/content/docs/2.components/icon.md @@ -1,5 +1,5 @@ --- -description: A component to display any icon from Iconify. +description: A component to display any icon from Iconify or another component. category: element links: - label: IcĂ´nes @@ -27,6 +27,30 @@ It's highly recommended to install the icons collections you need, read more abo ::: :: +## Examples + +### SVG + +You can also pass a Vue component into the `name` prop: + +::component-example +--- +name: 'icon-svg-example' +--- +:: + +You can define your icon components yourself, or use [`unplugin-icons`](https://github.com/unplugin/unplugin-icons) to import them directly from SVG files: + +```vue + + + +``` + ## API ### Props From be2320df4a091c15d7c9d95d9024ecd3ab0c64cb Mon Sep 17 00:00:00 2001 From: rijenkii Date: Wed, 27 Aug 2025 21:29:00 +0700 Subject: [PATCH 04/11] chore(Icon): move `IconProps` imports into ` diff --git a/src/runtime/components/prose/CodeTree.vue b/src/runtime/components/prose/CodeTree.vue index e2178ba12f..975c8912be 100644 --- a/src/runtime/components/prose/CodeTree.vue +++ b/src/runtime/components/prose/CodeTree.vue @@ -1,4 +1,5 @@ diff --git a/src/runtime/components/prose/CodeTree.vue b/src/runtime/components/prose/CodeTree.vue index 975c8912be..e2178ba12f 100644 --- a/src/runtime/components/prose/CodeTree.vue +++ b/src/runtime/components/prose/CodeTree.vue @@ -1,5 +1,4 @@