diff --git a/.changeset/stale-dryers-speak.md b/.changeset/stale-dryers-speak.md
new file mode 100644
index 000000000..04530b41e
--- /dev/null
+++ b/.changeset/stale-dryers-speak.md
@@ -0,0 +1,5 @@
+---
+'@vapor-ui/core': patch
+---
+
+Change createSlot to memoize
diff --git a/packages/core/src/components/breadcrumb/breadcrumb.tsx b/packages/core/src/components/breadcrumb/breadcrumb.tsx
index af34a9aa0..c69b991ac 100644
--- a/packages/core/src/components/breadcrumb/breadcrumb.tsx
+++ b/packages/core/src/components/breadcrumb/breadcrumb.tsx
@@ -6,8 +6,8 @@ import { useRender } from '@base-ui-components/react';
import { MoreCommonOutlineIcon, SlashOutlineIcon } from '@vapor-ui/icons';
import clsx from 'clsx';
+import { useSlot } from '~/hooks/use-slot';
import { createContext } from '~/libs/create-context';
-import { createSlot } from '~/libs/create-slot';
import { createSplitProps } from '~/utils/create-split-props';
import { resolveStyles } from '~/utils/resolve-styles';
import type { VComponentProps } from '~/utils/types';
@@ -152,7 +152,7 @@ export const BreadcrumbSeparator = forwardRef);
+ const IconElement = useSlot(children, );
return useRender({
ref,
@@ -180,7 +180,7 @@ export const BreadcrumbEllipsisPrimitive = forwardRef<
const { render, className, children, ...componentProps } = resolveStyles(props);
const { size } = useBreadcrumbContext();
- const IconElement = createSlot(children || );
+ const IconElement = useSlot(children, );
return useRender({
ref,
diff --git a/packages/core/src/components/checkbox/checkbox.tsx b/packages/core/src/components/checkbox/checkbox.tsx
index 9889f6340..97d2a0629 100644
--- a/packages/core/src/components/checkbox/checkbox.tsx
+++ b/packages/core/src/components/checkbox/checkbox.tsx
@@ -6,8 +6,8 @@ import { forwardRef } from 'react';
import { Checkbox as BaseCheckbox } from '@base-ui-components/react/checkbox';
import clsx from 'clsx';
+import { useSlot } from '~/hooks/use-slot';
import { createContext } from '~/libs/create-context';
-import { createSlot } from '~/libs/create-slot';
import { createSplitProps } from '~/utils/create-split-props';
import { createDataAttributes } from '~/utils/data-attributes';
import { resolveStyles } from '~/utils/resolve-styles';
@@ -40,7 +40,7 @@ export const CheckboxRoot = forwardRef((p
const { size, invalid, indeterminate } = variantProps;
const dataAttrs = createDataAttributes({ invalid });
- const IndicatorElement = createSlot(children || );
+ const IndicatorElement = useSlot(children, );
return (
diff --git a/packages/core/src/components/dialog/dialog.tsx b/packages/core/src/components/dialog/dialog.tsx
index 10f7dbd5f..972514a47 100644
--- a/packages/core/src/components/dialog/dialog.tsx
+++ b/packages/core/src/components/dialog/dialog.tsx
@@ -7,8 +7,8 @@ import { Dialog as BaseDialog } from '@base-ui-components/react/dialog';
import { useRender } from '@base-ui-components/react/use-render';
import clsx from 'clsx';
+import { useSlot } from '~/hooks/use-slot';
import { createContext } from '~/libs/create-context';
-import { createSlot } from '~/libs/create-slot';
import { resolveStyles } from '~/utils/resolve-styles';
import type { VComponentProps } from '~/utils/types';
@@ -92,8 +92,8 @@ DialogPopupPrimitive.displayName = 'Dialog.PopupPrimitive';
export const DialogPopup = forwardRef((props, ref) => {
const { portalElement, overlayElement, ...componentProps } = resolveStyles(props);
- const PortalElement = createSlot(portalElement || );
- const DialogOverlayPrimitiveElement = createSlot(overlayElement || );
+ const PortalElement = useSlot(portalElement, );
+ const DialogOverlayPrimitiveElement = useSlot(overlayElement, );
return (
diff --git a/packages/core/src/components/icon-button/icon-button.tsx b/packages/core/src/components/icon-button/icon-button.tsx
index 254ad41b7..d850e91e5 100644
--- a/packages/core/src/components/icon-button/icon-button.tsx
+++ b/packages/core/src/components/icon-button/icon-button.tsx
@@ -1,8 +1,8 @@
-import { forwardRef, useMemo } from 'react';
+import { forwardRef } from 'react';
import clsx from 'clsx';
-import { createSlot } from '~/libs/create-slot';
+import { useSlot } from '~/hooks/use-slot';
import { createSplitProps } from '~/utils/create-split-props';
import { resolveStyles } from '~/utils/resolve-styles';
import type { VComponentProps } from '~/utils/types';
@@ -25,7 +25,7 @@ export const IconButton = forwardRef((props
const { size } = otherProps;
- const IconElement = useMemo(() => createSlot(children), [children]);
+ const IconElement = useSlot(children);
return (