Skip to content

Commit 1ceb1c1

Browse files
committed
Add portal and fix container hell
1 parent 458521e commit 1ceb1c1

File tree

2 files changed

+67
-70
lines changed

2 files changed

+67
-70
lines changed

example/MultiSelect/MultiSelect.css

+7-11
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,23 @@
99
}
1010

1111
.wrapper {
12+
position: relative;
1213
border: 1px solid #ccc;
1314
border-radius: 15px;
1415
min-width: 400px;
1516
max-width: 700px;
1617
padding: 2px 5px;
17-
background-color: #fff;
18-
}
19-
20-
.inner-wrapper {
21-
position: relative;
22-
width: 100%;
23-
padding-right: 40px;
18+
padding-right: 50px;
2419
display: flex;
2520
flex-wrap: wrap;
21+
background-color: #fff;
2622
}
2723

28-
.inner-wrapper::before {
24+
.wrapper::before {
2925
content: '';
3026
position: absolute;
3127
top: 50%;
32-
right: 0;
28+
right: 10px;
3329
transform: translate(0, -50%) rotate(0deg);
3430
display: block;
3531
width: 16px;
@@ -41,7 +37,7 @@
4137
transition: 0.3s ease-in-out;
4238
}
4339

44-
.inner-wrapper-open::before {
40+
.wrapper-open::before {
4541
transform: translate(0, -50%) rotate(180deg);
4642
}
4743

@@ -112,7 +108,7 @@
112108
.reset {
113109
position: absolute;
114110
top: 50%;
115-
right: 20px;
111+
right: 30px;
116112
width: 16px;
117113
height: 16px;
118114
border: none;

example/MultiSelect/MultiSelect.tsx

+60-59
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import classNames from 'classnames';
22
import React, { ChangeEvent, KeyboardEvent, useMemo, useState } from 'react';
3+
import { createPortal } from 'react-dom';
34
import { DropdownState, ReducerAction, StateChangeType, useDropdown } from '../../src';
45
import './MultiSelect.css';
56

@@ -125,71 +126,71 @@ export const Dropdown: React.FC<Props> = ({ onSelect, values }) => {
125126

126127
return (
127128
<div
128-
className="wrapper"
129+
className={classNames('wrapper', { 'wrapper-open': isOpen })}
129130
{...getWrapperProps()}
130131
onKeyDown={handleKeyDown}
131132
onFocus={handleFocus}
132133
onBlur={handleBlur}
133134
>
134-
<div className={classNames('inner-wrapper', { 'inner-wrapper-open': isOpen })}>
135-
{values.length === 0
136-
? null
137-
: values.map((item: Item) => {
138-
return (
139-
<div className="multivalue" key={item.value}>
140-
<span className="multivalue-name">{item.name}</span>
141-
<button
142-
type="button"
143-
className="remove"
144-
onClick={handleRemoveClick(item)}
145-
tabIndex={isFocused ? 0 : -1}
146-
aria-label={`Remove value ${item.name}`}
147-
></button>
148-
</div>
149-
);
150-
})}
151-
152-
<input
153-
className="input"
154-
type="text"
155-
id="input"
156-
{...getInputProps()}
157-
placeholder="Select city"
158-
value={inputValue}
159-
onChange={handleChange}
160-
autoComplete="off"
161-
/>
162-
163-
{values.length === 0 ? null : (
164-
<button
165-
className="reset"
166-
onClick={handleResetClick}
167-
type="button"
168-
aria-label="Clear all values"
169-
></button>
170-
)}
171-
</div>
172-
173-
{isOpen && (
174-
<ul className="menu" {...(getMenuProps() as any)}>
175-
{options.length === 0 ? (
176-
<li>No data</li>
177-
) : (
178-
options.map((item: Item, index) => (
179-
<li
180-
key={item.value}
181-
className={classNames('item', {
182-
active: highlightedIndex === index,
183-
selected: values.some((el) => el.value === item.value),
184-
})}
185-
{...getItemProps(item, index)}
186-
>
187-
{item.name}
188-
</li>
189-
))
190-
)}
191-
</ul>
135+
{values.length === 0
136+
? null
137+
: values.map((item: Item) => {
138+
return (
139+
<div className="multivalue" key={item.value}>
140+
<span className="multivalue-name">{item.name}</span>
141+
<button
142+
type="button"
143+
className="remove"
144+
onClick={handleRemoveClick(item)}
145+
tabIndex={isFocused ? 0 : -1}
146+
aria-label={`Remove value ${item.name}`}
147+
></button>
148+
</div>
149+
);
150+
})}
151+
152+
<input
153+
className="input"
154+
type="text"
155+
id="input"
156+
{...getInputProps()}
157+
placeholder="Select city"
158+
value={inputValue}
159+
onChange={handleChange}
160+
autoComplete="off"
161+
/>
162+
163+
{values.length === 0 ? null : (
164+
<button
165+
className="reset"
166+
onClick={handleResetClick}
167+
type="button"
168+
aria-label="Clear all values"
169+
></button>
192170
)}
171+
172+
{isOpen &&
173+
createPortal(
174+
<ul className="menu" {...(getMenuProps() as any)}>
175+
{options.length === 0 ? (
176+
<li>No data</li>
177+
) : (
178+
options.map((item: Item, index) => (
179+
<li
180+
key={item.value}
181+
className={classNames('item', {
182+
active: highlightedIndex === index,
183+
selected: values.some((el) => el.value === item.value),
184+
})}
185+
{...getItemProps(item, index)}
186+
>
187+
{item.name}
188+
</li>
189+
))
190+
)}
191+
</ul>,
192+
document.body
193+
)}
193194
</div>
194195
);
195196
};

0 commit comments

Comments
 (0)