Skip to content

Commit c2ee97a

Browse files
committed
fix(slot): Change slot to memoize.
1 parent 22530cc commit c2ee97a

File tree

15 files changed

+88
-81
lines changed

15 files changed

+88
-81
lines changed

packages/core/src/components/breadcrumb/breadcrumb.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import { useRender } from '@base-ui-components/react';
66
import { MoreCommonOutlineIcon, SlashOutlineIcon } from '@vapor-ui/icons';
77
import clsx from 'clsx';
88

9+
import { useSlot } from '~/hooks/use-slot';
910
import { createContext } from '~/libs/create-context';
10-
import { createSlot } from '~/libs/create-slot';
1111
import { createSplitProps } from '~/utils/create-split-props';
1212
import { resolveStyles } from '~/utils/resolve-styles';
1313
import type { VComponentProps } from '~/utils/types';
@@ -152,7 +152,7 @@ export const BreadcrumbSeparator = forwardRef<HTMLLIElement, BreadcrumbSeparator
152152
const { render, className, children, ...componentProps } = resolveStyles(props);
153153

154154
const { size } = useBreadcrumbContext();
155-
const IconElement = createSlot(children || <SlashOutlineIcon size="100%" />);
155+
const IconElement = useSlot(children, <SlashOutlineIcon size="100%" />);
156156

157157
return useRender({
158158
ref,
@@ -180,7 +180,7 @@ export const BreadcrumbEllipsisPrimitive = forwardRef<
180180
const { render, className, children, ...componentProps } = resolveStyles(props);
181181

182182
const { size } = useBreadcrumbContext();
183-
const IconElement = createSlot(children || <MoreCommonOutlineIcon size="100%" />);
183+
const IconElement = useSlot(children, <MoreCommonOutlineIcon size="100%" />);
184184

185185
return useRender({
186186
ref,

packages/core/src/components/checkbox/checkbox.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import { forwardRef } from 'react';
66
import { Checkbox as BaseCheckbox } from '@base-ui-components/react/checkbox';
77
import clsx from 'clsx';
88

9+
import { useSlot } from '~/hooks/use-slot';
910
import { createContext } from '~/libs/create-context';
10-
import { createSlot } from '~/libs/create-slot';
1111
import { createSplitProps } from '~/utils/create-split-props';
1212
import { createDataAttributes } from '~/utils/data-attributes';
1313
import { resolveStyles } from '~/utils/resolve-styles';
@@ -40,7 +40,7 @@ export const CheckboxRoot = forwardRef<HTMLButtonElement, CheckboxRoot.Props>((p
4040
const { size, invalid, indeterminate } = variantProps;
4141
const dataAttrs = createDataAttributes({ invalid });
4242

43-
const IndicatorElement = createSlot(children || <CheckboxIndicatorPrimitive />);
43+
const IndicatorElement = useSlot(children, <CheckboxIndicatorPrimitive />);
4444

4545
return (
4646
<CheckboxProvider value={{ size, indeterminate }}>

packages/core/src/components/dialog/dialog.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { Dialog as BaseDialog } from '@base-ui-components/react/dialog';
77
import { useRender } from '@base-ui-components/react/use-render';
88
import clsx from 'clsx';
99

10+
import { useSlot } from '~/hooks/use-slot';
1011
import { createContext } from '~/libs/create-context';
11-
import { createSlot } from '~/libs/create-slot';
1212
import { resolveStyles } from '~/utils/resolve-styles';
1313
import type { VComponentProps } from '~/utils/types';
1414

@@ -92,8 +92,8 @@ DialogPopupPrimitive.displayName = 'Dialog.PopupPrimitive';
9292
export const DialogPopup = forwardRef<HTMLDivElement, DialogPopup.Props>((props, ref) => {
9393
const { portalElement, overlayElement, ...componentProps } = resolveStyles(props);
9494

95-
const PortalElement = createSlot(portalElement || <DialogPortalPrimitive />);
96-
const DialogOverlayPrimitiveElement = createSlot(overlayElement || <DialogOverlayPrimitive />);
95+
const PortalElement = useSlot(portalElement, <DialogPortalPrimitive />);
96+
const DialogOverlayPrimitiveElement = useSlot(overlayElement, <DialogOverlayPrimitive />);
9797

9898
return (
9999
<PortalElement>

packages/core/src/components/icon-button/icon-button.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { forwardRef, useMemo } from 'react';
22

33
import clsx from 'clsx';
44

5-
import { createSlot } from '~/libs/create-slot';
5+
import { useSlot } from '~/hooks/use-slot';
66
import { createSplitProps } from '~/utils/create-split-props';
77
import { resolveStyles } from '~/utils/resolve-styles';
88
import type { VComponentProps } from '~/utils/types';
@@ -25,7 +25,7 @@ export const IconButton = forwardRef<HTMLButtonElement, IconButton.Props>((props
2525

2626
const { size } = otherProps;
2727

28-
const IconElement = useMemo(() => createSlot(children), [children]);
28+
const IconElement = useSlot(children);
2929

3030
return (
3131
<Button

packages/core/src/components/menu/menu.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { Menu as BaseMenu } from '@base-ui-components/react';
77
import { ChevronRightOutlineIcon, ConfirmOutlineIcon } from '@vapor-ui/icons';
88
import clsx from 'clsx';
99

10+
import { useSlot } from '~/hooks/use-slot';
1011
import { createContext } from '~/libs/create-context';
11-
import { createSlot } from '~/libs/create-slot';
1212
import { composeRefs } from '~/utils/compose-refs';
1313
import { resolveStyles } from '~/utils/resolve-styles';
1414
import type { VComponentProps } from '~/utils/types';
@@ -104,8 +104,8 @@ MenuPopupPrimitive.displayName = 'Menu.PopupPrimitive';
104104

105105
export const MenuPopup = forwardRef<HTMLDivElement, MenuPopup.Props>(
106106
({ portalElement, positionerElement, ...props }, ref) => {
107-
const PortalElement = createSlot(portalElement || <MenuPortalPrimitive />);
108-
const PositionerElement = createSlot(positionerElement || <MenuPositionerPrimitive />);
107+
const PortalElement = useSlot(portalElement, <MenuPortalPrimitive />);
108+
const PositionerElement = useSlot(positionerElement, <MenuPositionerPrimitive />);
109109

110110
return (
111111
<PortalElement>
@@ -270,9 +270,10 @@ MenuSubmenuPopupPrimitive.displayName = 'Menu.SubmenuPopupPrimitive';
270270

271271
export const MenuSubmenuPopup = forwardRef<HTMLDivElement, MenuSubmenuPopup.Props>(
272272
({ portalElement, positionerElement, ...props }, ref) => {
273-
const PortalElement = createSlot(portalElement || <MenuPortalPrimitive />);
274-
const PositionerElement = createSlot(
275-
positionerElement || <MenuPositionerPrimitive side="right" sideOffset={0} />,
273+
const PortalElement = useSlot(portalElement, <MenuPortalPrimitive />);
274+
const PositionerElement = useSlot(
275+
positionerElement,
276+
<MenuPositionerPrimitive side="right" sideOffset={0} />,
276277
);
277278

278279
return (

packages/core/src/components/multi-select/multi-select.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { Select as BaseSelect } from '@base-ui-components/react';
77
import { ChevronDownOutlineIcon, ConfirmOutlineIcon } from '@vapor-ui/icons';
88
import clsx from 'clsx';
99

10+
import { useSlot } from '~/hooks/use-slot';
1011
import { createContext } from '~/libs/create-context';
11-
import { createSlot } from '~/libs/create-slot';
1212
import { createSplitProps } from '~/utils/create-split-props';
1313
import { createDataAttributes } from '~/utils/data-attributes';
1414
import { resolveStyles } from '~/utils/resolve-styles';
@@ -181,7 +181,7 @@ export const MultiSelectTriggerIconPrimitive = forwardRef<
181181
const { className, children, ...componentProps } = resolveStyles(props);
182182

183183
const { size } = useMultiSelectContext();
184-
const IconElement = createSlot(children || <ChevronDownOutlineIcon size="100%" />);
184+
const IconElement = useSlot(children, <ChevronDownOutlineIcon size="100%" />);
185185

186186
return (
187187
<BaseSelect.Icon
@@ -273,10 +273,8 @@ MultiSelectPopupPrimitive.displayName = 'MultiSelect.PopupPrimitive';
273273

274274
export const MultiSelectPopup = forwardRef<HTMLDivElement, MultiSelectPopup.Props>(
275275
({ portalElement, positionerElement, ...props }, ref) => {
276-
const PortalElement = createSlot(portalElement || <MultiSelectPortalPrimitive />);
277-
const PositionerElement = createSlot(
278-
positionerElement || <MultiSelectPositionerPrimitive />,
279-
);
276+
const PortalElement = useSlot(portalElement, <MultiSelectPortalPrimitive />);
277+
const PositionerElement = useSlot(positionerElement, <MultiSelectPositionerPrimitive />);
280278

281279
return (
282280
<PortalElement>
@@ -318,7 +316,7 @@ export const MultiSelectItemIndicatorPrimitive = forwardRef<
318316
>((props, ref) => {
319317
const { className, children, ...componentProps } = resolveStyles(props);
320318

321-
const IconElement = createSlot(children || <ConfirmOutlineIcon size="100%" />);
319+
const IconElement = useSlot(children, <ConfirmOutlineIcon size="100%" />);
322320

323321
return (
324322
<BaseSelect.ItemIndicator

packages/core/src/components/navigation-menu/navigation-menu.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { ChevronDownOutlineIcon } from '@vapor-ui/icons';
88
import clsx from 'clsx';
99

1010
import { useMutationObserver } from '~/hooks/use-mutation-observer';
11+
import { useSlot } from '~/hooks/use-slot';
1112
import { createContext } from '~/libs/create-context';
12-
import { createSlot } from '~/libs/create-slot';
1313
import { vars } from '~/styles/themes.css';
1414
import { composeRefs } from '~/utils/compose-refs';
1515
import { createSplitProps } from '~/utils/create-split-props';
@@ -167,7 +167,7 @@ export const NavigationMenuTriggerIndicatorPrimitive = forwardRef<
167167
>((props, ref) => {
168168
const { className, children, ...componentProps } = resolveStyles(props);
169169

170-
const IconElement = createSlot(children || <ChevronDownOutlineIcon />);
170+
const IconElement = useSlot(children, <ChevronDownOutlineIcon />);
171171

172172
return (
173173
<BaseNavigationMenu.Icon
@@ -403,11 +403,9 @@ NavigationMenuViewportPrimitive.displayName = 'NavigationMenu.ViewportPrimitive'
403403

404404
export const NavigationMenuViewport = forwardRef<HTMLDivElement, NavigationMenuViewport.Props>(
405405
({ portalElement, positionerElement, popupElement, className, ...props }, ref) => {
406-
const PortalElement = createSlot(portalElement ?? <NavigationMenuPortalPrimitive />);
407-
const PopupElement = createSlot(popupElement ?? <NavigationMenuPopupPrimitive />);
408-
const PositionerElement = createSlot(
409-
positionerElement ?? <NavigationMenuPositionerPrimitive />,
410-
);
406+
const PortalElement = useSlot(portalElement, <NavigationMenuPortalPrimitive />);
407+
const PopupElement = useSlot(popupElement, <NavigationMenuPopupPrimitive />);
408+
const PositionerElement = useSlot(positionerElement, <NavigationMenuPositionerPrimitive />);
411409

412410
return (
413411
<PortalElement>

packages/core/src/components/popover/popover.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Popover as BasePopover } from '@base-ui-components/react/popover';
77
import clsx from 'clsx';
88

99
import { useMutationObserver } from '~/hooks/use-mutation-observer';
10-
import { createSlot } from '~/libs/create-slot';
10+
import { useSlot } from '~/hooks/use-slot';
1111
import { vars } from '~/styles/themes.css';
1212
import { composeRefs } from '~/utils/compose-refs';
1313
import { resolveStyles } from '~/utils/resolve-styles';
@@ -157,8 +157,8 @@ const extractPositions = (dataset: DOMStringMap) => {
157157

158158
export const PopoverPopup = forwardRef<HTMLDivElement, PopoverPopup.Props>(
159159
({ portalElement, positionerElement, ...props }, ref) => {
160-
const PortalElement = createSlot(portalElement || <PopoverPortalPrimitive />);
161-
const PositionerElement = createSlot(positionerElement || <PopoverPositionerPrimitive />);
160+
const PortalElement = useSlot(portalElement, <PopoverPortalPrimitive />);
161+
const PositionerElement = useSlot(positionerElement, <PopoverPositionerPrimitive />);
162162

163163
return (
164164
<PortalElement>

packages/core/src/components/radio/radio.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { forwardRef } from 'react';
55
import { Radio as BaseRadio } from '@base-ui-components/react';
66
import clsx from 'clsx';
77

8-
import { createSlot } from '~/libs/create-slot';
8+
import { useSlot } from '~/hooks/use-slot';
99
import { createSplitProps } from '~/utils/create-split-props';
1010
import { createDataAttributes } from '~/utils/data-attributes';
1111
import { resolveStyles } from '~/utils/resolve-styles';
@@ -36,7 +36,7 @@ export const RadioRoot = forwardRef<HTMLButtonElement, RadioRoot.Props>((props,
3636

3737
const dataAttrs = createDataAttributes({ invalid });
3838

39-
const IndicatorElement = createSlot(children || <RadioIndicatorPrimitive />);
39+
const IndicatorElement = useSlot(children, <RadioIndicatorPrimitive />);
4040

4141
return (
4242
<BaseRadio.Root

packages/core/src/components/select/select.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { Select as BaseSelect } from '@base-ui-components/react';
77
import { ChevronDownOutlineIcon, ConfirmOutlineIcon } from '@vapor-ui/icons';
88
import clsx from 'clsx';
99

10+
import { useSlot } from '~/hooks/use-slot';
1011
import { createContext } from '~/libs/create-context';
11-
import { createSlot } from '~/libs/create-slot';
1212
import { createSplitProps } from '~/utils/create-split-props';
1313
import { createDataAttributes } from '~/utils/data-attributes';
1414
import { resolveStyles } from '~/utils/resolve-styles';
@@ -153,7 +153,7 @@ export const SelectTriggerIconPrimitive = forwardRef<
153153

154154
const { size } = useSelectContext();
155155

156-
const IconElement = createSlot(children || <ChevronDownOutlineIcon size="100%" />);
156+
const IconElement = useSlot(children, <ChevronDownOutlineIcon size="100%" />);
157157

158158
return (
159159
<BaseSelect.Icon
@@ -247,8 +247,8 @@ SelectPopupPrimitive.displayName = 'Select.PopupPrimitive';
247247

248248
export const SelectPopup = forwardRef<HTMLDivElement, SelectPopup.Props>(
249249
({ portalElement, positionerElement, ...props }, ref) => {
250-
const PortalElement = createSlot(portalElement || <SelectPortalPrimitive />);
251-
const PositionerElement = createSlot(positionerElement || <SelectPositionerPrimitive />);
250+
const PortalElement = useSlot(portalElement, <SelectPortalPrimitive />);
251+
const PositionerElement = useSlot(positionerElement, <SelectPositionerPrimitive />);
252252

253253
return (
254254
<PortalElement>
@@ -289,7 +289,7 @@ export const SelectItemIndicatorPrimitive = forwardRef<
289289
SelectItemIndicatorPrimitive.Props
290290
>((props, ref) => {
291291
const { className, children, ...componentProps } = resolveStyles(props);
292-
const IconElement = createSlot(children || <ConfirmOutlineIcon />);
292+
const IconElement = useSlot(children, <ConfirmOutlineIcon />);
293293

294294
return (
295295
<BaseSelect.ItemIndicator

0 commit comments

Comments
 (0)