Skip to content

Commit b89d714

Browse files
committed
feat(): update
1 parent 970eca6 commit b89d714

File tree

6 files changed

+60
-19
lines changed

6 files changed

+60
-19
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import * as React from 'react';
2+
import { mergeRefs, mergeHandlers } from 'src/utils';
3+
4+
export const Slot = React.forwardRef<any, any>((props, forwardedRef) => {
5+
const { children, ...slotProps } = props;
6+
7+
if (!React.isValidElement(children)) {
8+
return null;
9+
}
10+
11+
const child = children as React.ReactElement<any>;
12+
const childProps = child.props;
13+
14+
const mergedProps: Record<string, any> = { ...slotProps };
15+
16+
// merge event handlers
17+
for (const key in slotProps) {
18+
if (/^on[A-Z]/.test(key)) {
19+
mergedProps[key] = mergeHandlers(childProps[key], slotProps[key]);
20+
}
21+
}
22+
23+
if (childProps.className || slotProps.className) {
24+
mergedProps.className = [slotProps.className, childProps.className].filter(Boolean).join(' ');
25+
}
26+
27+
// merge style
28+
if (childProps.style || slotProps.style) {
29+
mergedProps.style = { ...slotProps.style, ...childProps.style };
30+
}
31+
32+
mergedProps.ref = mergeRefs(childProps.ref, forwardedRef);
33+
34+
return React.cloneElement(children, mergedProps);
35+
});

packages/plasma-new-hope/src/components/_beta/Popover/Popover.styles.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@ export const base = css`
1414
box-sizing: border-box;
1515
`;
1616

17-
export const Target = styled.div`
18-
display: inline-block;
19-
max-width: 100%;
20-
`;
21-
2217
export const CloseButton = styled.button`
2318
position: absolute;
2419
top: var(${tokens.iconOffset});

packages/plasma-new-hope/src/components/_beta/Popover/Popover.tsx

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ import { css } from '@linaria/core';
2222

2323
import { IconClose } from '../../_Icon';
2424
import { Resizable } from '../../_Resizable';
25+
import { Slot } from '../../_Slot/Slot';
2526

2627
import { sizeToIconSize, matchPlacements } from './utils';
2728
import { tokens, classes } from './Popover.tokens';
28-
import { base, Target, CloseButton } from './Popover.styles';
29+
import { base, CloseButton } from './Popover.styles';
2930
import type { PopoverProps } from './Popover.types';
3031

3132
/* Ширина хвостика */
@@ -117,9 +118,9 @@ export const popoverRoot = (Root: RootProps<HTMLDivElement, PopoverProps>) =>
117118

118119
return (
119120
<>
120-
<Target ref={refs.setReference} {...getReferenceProps()}>
121+
<Slot ref={refs.setReference} {...getReferenceProps()}>
121122
{target}
122-
</Target>
123+
</Slot>
123124

124125
{opened && (
125126
<FloatingPortal>
@@ -143,15 +144,6 @@ export const popoverRoot = (Root: RootProps<HTMLDivElement, PopoverProps>) =>
143144
{...rest}
144145
data-popover-open={opened}
145146
>
146-
{appearance === 'closeInner' && (
147-
<CloseButton
148-
className={classes.popoverCloseIconButton}
149-
onClick={() => handleToggle(false)}
150-
>
151-
<IconClose size={sizeToIconSize(size)} color="inherit" />
152-
</CloseButton>
153-
)}
154-
155147
{outerArrow && (
156148
<FloatingArrow
157149
ref={arrowRef}
@@ -164,6 +156,15 @@ export const popoverRoot = (Root: RootProps<HTMLDivElement, PopoverProps>) =>
164156
)}
165157

166158
{children}
159+
160+
{appearance === 'closeInner' && (
161+
<CloseButton
162+
className={classes.popoverCloseIconButton}
163+
onClick={() => handleToggle(false)}
164+
>
165+
<IconClose size={sizeToIconSize(size)} color="inherit" />
166+
</CloseButton>
167+
)}
167168
</Root>
168169
</Resizable>
169170
</div>

packages/plasma-new-hope/src/components/_beta/Popover/Popover.types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { HTMLAttributes, ReactNode } from 'react';
1+
import type { HTMLAttributes, ReactNode, ReactElement } from 'react';
22

33
import { ResizableProps } from '../../_Resizable';
44

@@ -30,7 +30,7 @@ export type BasicPopoverProps = {
3030
/**
3131
* Целевой элемент взаимодействия с всплывающим окном.
3232
*/
33-
target: ReactNode;
33+
target: ReactElement;
3434
/**
3535
* Управление скрытием/раскрытием всплывающего окна.
3636
*/

packages/plasma-new-hope/src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,4 @@ export const composableStyle = (s: TemplateStringsArray, ...expr: Array<string |
3030
};
3131

3232
export { fixedForwardRef } from './fixedForwardRef';
33+
export { mergeHandlers } from './mergeHandlers';
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const mergeHandlers = (userHandler: any, injectedHandler: any) => {
2+
return (event: any) => {
3+
try {
4+
userHandler?.(event);
5+
} finally {
6+
if (!event.defaultPrevented) injectedHandler?.(event);
7+
}
8+
};
9+
};

0 commit comments

Comments
 (0)