@toptal/picasso-dropdown 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-package/src/Dropdown/Dropdown.d.ts +12 -1
- package/dist-package/src/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist-package/src/Dropdown/Dropdown.js +9 -14
- package/dist-package/src/Dropdown/Dropdown.js.map +1 -1
- package/dist-package/src/Dropdown/styles.d.ts +1 -10
- package/dist-package/src/Dropdown/styles.d.ts.map +1 -1
- package/dist-package/src/Dropdown/styles.js +14 -43
- package/dist-package/src/Dropdown/styles.js.map +1 -1
- package/package.json +3 -2
- package/src/Dropdown/Dropdown.tsx +30 -21
- package/src/Dropdown/__snapshots__/test.tsx.snap +10 -10
- package/src/Dropdown/styles.ts +14 -55
|
@@ -3,8 +3,14 @@ import type { PopperPlacementType } from '@material-ui/core/Popper';
|
|
|
3
3
|
import type { PopperOptions } from 'popper.js';
|
|
4
4
|
import type { StandardProps } from '@toptal/picasso-shared';
|
|
5
5
|
import type { DeprecatedSpacingType, SpacingType } from '@toptal/picasso-provider';
|
|
6
|
-
import type { StyleProps } from './styles';
|
|
7
6
|
declare type ContentOverflowType = 'scroll' | 'visible';
|
|
7
|
+
declare type StyleProps = {
|
|
8
|
+
/** Control content element style */
|
|
9
|
+
contentStyle?: {
|
|
10
|
+
height?: string;
|
|
11
|
+
maxHeight?: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
8
14
|
interface InternalProps extends StandardProps, HTMLAttributes<HTMLDivElement>, StyleProps {
|
|
9
15
|
/** Anchor element that opens content on click */
|
|
10
16
|
children: ReactNode;
|
|
@@ -29,6 +35,11 @@ interface InternalProps extends StandardProps, HTMLAttributes<HTMLDivElement>, S
|
|
|
29
35
|
/** Sets the desired behavior for an element's overflow */
|
|
30
36
|
contentOverflow?: ContentOverflowType;
|
|
31
37
|
popperContainer?: HTMLElement;
|
|
38
|
+
/** Sets styles for the inner wrapper */
|
|
39
|
+
classes?: {
|
|
40
|
+
popper?: string;
|
|
41
|
+
content?: string;
|
|
42
|
+
};
|
|
32
43
|
}
|
|
33
44
|
declare type PropsWithBaseSpacing = InternalProps & {
|
|
34
45
|
/** Offset of content element relative to anchor element */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../src/Dropdown/Dropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../src/Dropdown/Dropdown.tsx"],"names":[],"mappings":"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"}
|
|
@@ -10,15 +10,14 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
12
|
import React, { forwardRef, useContext, useRef, useState } from 'react';
|
|
13
|
-
import ClickAwayListener from '@material-ui/core/ClickAwayListener';
|
|
14
13
|
import Grow from '@material-ui/core/Grow';
|
|
15
|
-
import { makeStyles } from '@material-ui/core/styles';
|
|
16
|
-
import cx from 'classnames';
|
|
17
14
|
import { makeResponsiveSpacingProps } from '@toptal/picasso-provider';
|
|
18
15
|
import { Popper } from '@toptal/picasso-popper';
|
|
19
16
|
import { Paper } from '@toptal/picasso-paper';
|
|
20
17
|
import { noop } from '@toptal/picasso-utils';
|
|
21
|
-
import
|
|
18
|
+
import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge';
|
|
19
|
+
import { ClickAwayListener } from '@mui/base/ClickAwayListener';
|
|
20
|
+
import { contentClass } from './styles';
|
|
22
21
|
const DropdownContext = React.createContext(null);
|
|
23
22
|
export const useDropdownContext = () => {
|
|
24
23
|
const context = useContext(DropdownContext);
|
|
@@ -27,9 +26,6 @@ export const useDropdownContext = () => {
|
|
|
27
26
|
}
|
|
28
27
|
return context;
|
|
29
28
|
};
|
|
30
|
-
const useStyles = makeStyles(styles, {
|
|
31
|
-
name: 'PicassoDropdown',
|
|
32
|
-
});
|
|
33
29
|
const useResponsiveProps = makeResponsiveSpacingProps(['margin-top', 'margin-bottom', 'margin-left', 'margin-right'], 'PicassoDropdown-Responsive');
|
|
34
30
|
// eslint-disable-next-line react/display-name
|
|
35
31
|
export const Dropdown = forwardRef(function Dropdown(props, ref) {
|
|
@@ -37,7 +33,6 @@ export const Dropdown = forwardRef(function Dropdown(props, ref) {
|
|
|
37
33
|
// Avoid passing external classes inside the rest props
|
|
38
34
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
39
35
|
classes: externalClasses, contentOverflow = 'scroll' } = props, rest = __rest(props, ["className", "style", "children", "content", "offset", "placement", "disableAutoClose", "disableAutoFocus", "disablePortal", "popperOptions", "popperProps", "keepMounted", "onOpen", "popperContainer", "onClose", "contentStyle", "classes", "contentOverflow"]);
|
|
40
|
-
const classes = useStyles(props);
|
|
41
36
|
const contentRef = useRef(null);
|
|
42
37
|
const [anchorEl, setAnchorEl] = useState();
|
|
43
38
|
const [isOpen, setIsOpen] = useState(false);
|
|
@@ -118,9 +113,9 @@ export const Dropdown = forwardRef(function Dropdown(props, ref) {
|
|
|
118
113
|
}
|
|
119
114
|
forceClose();
|
|
120
115
|
};
|
|
121
|
-
return (React.createElement("div", Object.assign({}, rest, { ref: ref, className:
|
|
122
|
-
React.createElement("div", { className:
|
|
123
|
-
(isOpen || keepMounted) && (React.createElement(Popper, Object.assign({ className:
|
|
116
|
+
return (React.createElement("div", Object.assign({}, rest, { ref: ref, className: twMerge('flex items-center', className), style: style }),
|
|
117
|
+
React.createElement("div", { className: 'inline-flex items-center cursor-pointer', onClick: handleAnchorClick }, typeof children === 'function' ? children({ isOpen }) : children),
|
|
118
|
+
(isOpen || keepMounted) && (React.createElement(Popper, Object.assign({ className: twJoin('shadow-2', externalClasses === null || externalClasses === void 0 ? void 0 : externalClasses.popper, responsiveClasses), anchorEl: anchorEl !== null && anchorEl !== void 0 ? anchorEl : null, popperOptions: Object.assign({ onCreate: focus,
|
|
124
119
|
/*
|
|
125
120
|
Fixes https://github.com/toptal/picasso/pull/2124#issuecomment-894341054
|
|
126
121
|
When the anchor goes above the viewport, popper goes to infinite flipping.
|
|
@@ -130,9 +125,9 @@ export const Dropdown = forwardRef(function Dropdown(props, ref) {
|
|
|
130
125
|
React.createElement(ClickAwayListener, { onClickAway: handleClickAway },
|
|
131
126
|
React.createElement("div", { onClick: close },
|
|
132
127
|
React.createElement(Grow, { in: isOpen, appear: true },
|
|
133
|
-
React.createElement(Paper, { style: contentStyle, className:
|
|
134
|
-
|
|
135
|
-
|
|
128
|
+
React.createElement(Paper, { style: contentStyle, className: twMerge(contentOverflow === 'visible'
|
|
129
|
+
? contentClass.contentVisible
|
|
130
|
+
: contentClass.content, externalClasses === null || externalClasses === void 0 ? void 0 : externalClasses.content), onKeyDown: handleContentKeyDown, elevation: 0 },
|
|
136
131
|
React.createElement(DropdownContext.Provider, { value: context },
|
|
137
132
|
React.createElement("div", { ref: contentRef }, content))))))))));
|
|
138
133
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../../src/Dropdown/Dropdown.tsx"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../../src/Dropdown/Dropdown.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export declare type StyleProps = {
|
|
3
|
-
/** Control content element style */
|
|
4
|
-
contentStyle?: {
|
|
5
|
-
height?: string;
|
|
6
|
-
maxHeight?: string;
|
|
7
|
-
};
|
|
8
|
-
};
|
|
9
|
-
declare const _default: ({ screens, shadows, palette }: Theme) => import("@material-ui/styles").StyleRules<{}, "root" | "content" | "anchor" | "popper" | "contentVisible">;
|
|
10
|
-
export default _default;
|
|
1
|
+
export declare const contentClass: Record<'content' | 'contentVisible', string[]>;
|
|
11
2
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/Dropdown/styles.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/Dropdown/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,SAAS,GAAG,gBAAgB,EAAE,MAAM,EAAE,CAgBvE,CAAA"}
|
|
@@ -1,44 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
maxHeight: '14.75rem',
|
|
16
|
-
overflowY: 'auto',
|
|
17
|
-
// height under which maxHeight menu starts to overflow
|
|
18
|
-
// and needs to reduce height dynamically to avoid overflow
|
|
19
|
-
'@media screen and (max-height: 585px)': {
|
|
20
|
-
maxHeight: 'calc(50vh - 3rem)',
|
|
21
|
-
[screens('md', 'lg', 'xl')]: {
|
|
22
|
-
maxHeight: 'calc(50vh - 3.5rem)', // half of screen minus header and anchor
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
popper: {
|
|
27
|
-
boxShadow: shadows[2],
|
|
28
|
-
},
|
|
29
|
-
contentVisible: {
|
|
30
|
-
// Basically a whole content of a dropdown will be shown without a vertical scrollbar inside the dropdown
|
|
31
|
-
maxHeight: 'none',
|
|
32
|
-
// Will show a whole content on the `xs` and `sm` screens with a vertical scrollbar if needed
|
|
33
|
-
// For non desktop devices better if we have a scrollbar when a dropdown content is pretty long
|
|
34
|
-
[screens('xs', 'sm')]: {
|
|
35
|
-
overflowY: 'scroll',
|
|
36
|
-
maxHeight: '100vh',
|
|
37
|
-
},
|
|
38
|
-
'@media screen and (max-height: 585px)': {
|
|
39
|
-
overflowY: 'scroll',
|
|
40
|
-
maxHeight: '100vh',
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
});
|
|
1
|
+
export const contentClass = {
|
|
2
|
+
content: [
|
|
3
|
+
'overflow-y-auto',
|
|
4
|
+
'max-h-[14.75rem]',
|
|
5
|
+
'[@media(max-height:585px)]:max-h-[calc(50vh-3rem)]',
|
|
6
|
+
'[@media(max-height:585px)]:md:max-h-[calc(50vh-3.5rem)]',
|
|
7
|
+
],
|
|
8
|
+
contentVisible: [
|
|
9
|
+
'max-h-screen md:max-h-none ',
|
|
10
|
+
'overflow-y-scroll md:overflow-y-hidden',
|
|
11
|
+
'[@media(max-height:585px)]:max-h-screen',
|
|
12
|
+
'[@media(max-height:585px)]:overflow-y-scroll',
|
|
13
|
+
],
|
|
14
|
+
};
|
|
44
15
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/Dropdown/styles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/Dropdown/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAmD;IAC1E,OAAO,EAAE;QACP,iBAAiB;QAEjB,kBAAkB;QAClB,oDAAoD;QACpD,yDAAyD;KAC1D;IACD,cAAc,EAAE;QACd,8BAA8B;QAE9B,wCAAwC;QAExC,yCAAyC;QACzC,8CAA8C;KAC/C;CACF,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toptal/picasso-dropdown",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "Toptal UI components library - Dropdown",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
},
|
|
23
23
|
"homepage": "https://github.com/toptal/picasso/tree/master/packages/picasso#readme",
|
|
24
24
|
"dependencies": {
|
|
25
|
+
"@mui/base": "5.0.0-beta.40",
|
|
25
26
|
"@toptal/picasso-paper": "4.0.0",
|
|
26
27
|
"@toptal/picasso-popper": "1.0.3",
|
|
27
28
|
"@toptal/picasso-utils": "1.0.3",
|
|
@@ -39,8 +40,8 @@
|
|
|
39
40
|
},
|
|
40
41
|
"devDependencies": {
|
|
41
42
|
"@toptal/picasso-provider": "5.0.0",
|
|
42
|
-
"@toptal/picasso-test-utils": "1.1.1",
|
|
43
43
|
"@toptal/picasso-tailwind-merge": "2.0.0",
|
|
44
|
+
"@toptal/picasso-test-utils": "1.1.1",
|
|
44
45
|
"popper.js": "^1.16.1"
|
|
45
46
|
},
|
|
46
47
|
"exports": {
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import type { HTMLAttributes, ReactElement, ReactNode, Ref } from 'react'
|
|
2
2
|
import React, { forwardRef, useContext, useRef, useState } from 'react'
|
|
3
|
-
import ClickAwayListener from '@material-ui/core/ClickAwayListener'
|
|
4
3
|
import Grow from '@material-ui/core/Grow'
|
|
5
4
|
import type { PopperPlacementType } from '@material-ui/core/Popper'
|
|
6
5
|
import type { PopperOptions } from 'popper.js'
|
|
7
|
-
import type { Theme } from '@material-ui/core/styles'
|
|
8
|
-
import { makeStyles } from '@material-ui/core/styles'
|
|
9
|
-
import cx from 'classnames'
|
|
10
6
|
import type { StandardProps } from '@toptal/picasso-shared'
|
|
11
7
|
import type {
|
|
12
8
|
DeprecatedSpacingType,
|
|
@@ -16,12 +12,21 @@ import { makeResponsiveSpacingProps } from '@toptal/picasso-provider'
|
|
|
16
12
|
import { Popper } from '@toptal/picasso-popper'
|
|
17
13
|
import { Paper } from '@toptal/picasso-paper'
|
|
18
14
|
import { noop } from '@toptal/picasso-utils'
|
|
15
|
+
import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge'
|
|
16
|
+
import { ClickAwayListener } from '@mui/base/ClickAwayListener'
|
|
19
17
|
|
|
20
|
-
import
|
|
21
|
-
import styles from './styles'
|
|
18
|
+
import { contentClass } from './styles'
|
|
22
19
|
|
|
23
20
|
type ContentOverflowType = 'scroll' | 'visible'
|
|
24
21
|
|
|
22
|
+
type StyleProps = {
|
|
23
|
+
/** Control content element style */
|
|
24
|
+
contentStyle?: {
|
|
25
|
+
height?: string
|
|
26
|
+
maxHeight?: string
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
25
30
|
interface InternalProps
|
|
26
31
|
extends StandardProps,
|
|
27
32
|
HTMLAttributes<HTMLDivElement>,
|
|
@@ -49,6 +54,8 @@ interface InternalProps
|
|
|
49
54
|
/** Sets the desired behavior for an element's overflow */
|
|
50
55
|
contentOverflow?: ContentOverflowType
|
|
51
56
|
popperContainer?: HTMLElement
|
|
57
|
+
/** Sets styles for the inner wrapper */
|
|
58
|
+
classes?: { popper?: string; content?: string }
|
|
52
59
|
}
|
|
53
60
|
|
|
54
61
|
type PropsWithBaseSpacing = InternalProps & {
|
|
@@ -94,13 +101,6 @@ export const useDropdownContext = () => {
|
|
|
94
101
|
return context
|
|
95
102
|
}
|
|
96
103
|
|
|
97
|
-
const useStyles = makeStyles<
|
|
98
|
-
Theme,
|
|
99
|
-
PropsWithBaseSpacing | PropsWithDeprecatedSpacing
|
|
100
|
-
>(styles, {
|
|
101
|
-
name: 'PicassoDropdown',
|
|
102
|
-
})
|
|
103
|
-
|
|
104
104
|
const useResponsiveProps = makeResponsiveSpacingProps(
|
|
105
105
|
['margin-top', 'margin-bottom', 'margin-left', 'margin-right'] as const,
|
|
106
106
|
'PicassoDropdown-Responsive'
|
|
@@ -147,7 +147,6 @@ export const Dropdown: DropdownProps = forwardRef<
|
|
|
147
147
|
contentOverflow = 'scroll',
|
|
148
148
|
...rest
|
|
149
149
|
} = props
|
|
150
|
-
const classes = useStyles(props)
|
|
151
150
|
|
|
152
151
|
const contentRef = useRef<HTMLDivElement>(null)
|
|
153
152
|
const [anchorEl, setAnchorEl] = useState<HTMLDivElement | undefined>()
|
|
@@ -238,7 +237,7 @@ export const Dropdown: DropdownProps = forwardRef<
|
|
|
238
237
|
close: () => forceClose(),
|
|
239
238
|
}
|
|
240
239
|
|
|
241
|
-
const handleClickAway = (event:
|
|
240
|
+
const handleClickAway = (event: MouseEvent | TouchEvent) => {
|
|
242
241
|
const target = event.target
|
|
243
242
|
|
|
244
243
|
const isAnchorTapEvent =
|
|
@@ -255,16 +254,23 @@ export const Dropdown: DropdownProps = forwardRef<
|
|
|
255
254
|
<div
|
|
256
255
|
{...rest}
|
|
257
256
|
ref={ref}
|
|
258
|
-
className={
|
|
257
|
+
className={twMerge('flex items-center', className)}
|
|
259
258
|
style={style}
|
|
260
259
|
>
|
|
261
|
-
<div
|
|
260
|
+
<div
|
|
261
|
+
className='inline-flex items-center cursor-pointer'
|
|
262
|
+
onClick={handleAnchorClick}
|
|
263
|
+
>
|
|
262
264
|
{typeof children === 'function' ? children({ isOpen }) : children}
|
|
263
265
|
</div>
|
|
264
266
|
|
|
265
267
|
{(isOpen || keepMounted) && (
|
|
266
268
|
<Popper
|
|
267
|
-
className={
|
|
269
|
+
className={twJoin(
|
|
270
|
+
'shadow-2',
|
|
271
|
+
externalClasses?.popper,
|
|
272
|
+
responsiveClasses
|
|
273
|
+
)}
|
|
268
274
|
anchorEl={anchorEl ?? null}
|
|
269
275
|
popperOptions={{
|
|
270
276
|
onCreate: focus,
|
|
@@ -293,9 +299,12 @@ export const Dropdown: DropdownProps = forwardRef<
|
|
|
293
299
|
<Grow in={isOpen} appear>
|
|
294
300
|
<Paper
|
|
295
301
|
style={contentStyle}
|
|
296
|
-
className={
|
|
297
|
-
|
|
298
|
-
|
|
302
|
+
className={twMerge(
|
|
303
|
+
contentOverflow === 'visible'
|
|
304
|
+
? contentClass.contentVisible
|
|
305
|
+
: contentClass.content,
|
|
306
|
+
externalClasses?.content
|
|
307
|
+
)}
|
|
299
308
|
onKeyDown={handleContentKeyDown}
|
|
300
309
|
elevation={0}
|
|
301
310
|
>
|
|
@@ -6,10 +6,10 @@ exports[`Dropdown renders 1`] = `
|
|
|
6
6
|
class="Picasso-root"
|
|
7
7
|
>
|
|
8
8
|
<div
|
|
9
|
-
class="
|
|
9
|
+
class="flex items-center"
|
|
10
10
|
>
|
|
11
11
|
<div
|
|
12
|
-
class="
|
|
12
|
+
class="inline-flex items-center cursor-pointer"
|
|
13
13
|
>
|
|
14
14
|
Open Dropdown
|
|
15
15
|
<span
|
|
@@ -37,10 +37,10 @@ exports[`Dropdown should render menu 1`] = `
|
|
|
37
37
|
class="Picasso-root"
|
|
38
38
|
>
|
|
39
39
|
<div
|
|
40
|
-
class="
|
|
40
|
+
class="flex items-center"
|
|
41
41
|
>
|
|
42
42
|
<div
|
|
43
|
-
class="
|
|
43
|
+
class="inline-flex items-center cursor-pointer"
|
|
44
44
|
>
|
|
45
45
|
Open Dropdown
|
|
46
46
|
<span
|
|
@@ -58,14 +58,14 @@ exports[`Dropdown should render menu 1`] = `
|
|
|
58
58
|
</div>
|
|
59
59
|
</div>
|
|
60
60
|
<div
|
|
61
|
-
class="PicassoPopper-root
|
|
61
|
+
class="PicassoPopper-root shadow-2"
|
|
62
62
|
role="tooltip"
|
|
63
63
|
style="position: absolute; top: 0px; left: 0px;"
|
|
64
64
|
x-placement="bottom-end"
|
|
65
65
|
>
|
|
66
66
|
<div>
|
|
67
67
|
<div
|
|
68
|
-
class="bg-white shadow-0 transition-shadow duration-300 delay-0
|
|
68
|
+
class="bg-white shadow-0 transition-shadow duration-300 delay-0 overflow-y max-h [@media(max-height:585px)]:max-h-[calc(50vh [@media(max-height:585px)]:md:max-h-[calc(50vh"
|
|
69
69
|
style="opacity: 1; transform: scale(1, 1); transition: opacity 0ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 0ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;"
|
|
70
70
|
>
|
|
71
71
|
<div>
|
|
@@ -166,10 +166,10 @@ exports[`Dropdown should render menu with focus 1`] = `
|
|
|
166
166
|
class=""
|
|
167
167
|
>
|
|
168
168
|
<div
|
|
169
|
-
class="
|
|
169
|
+
class="flex items-center"
|
|
170
170
|
>
|
|
171
171
|
<div
|
|
172
|
-
class="
|
|
172
|
+
class="inline-flex items-center cursor-pointer"
|
|
173
173
|
>
|
|
174
174
|
Open Dropdown
|
|
175
175
|
<span
|
|
@@ -188,14 +188,14 @@ exports[`Dropdown should render menu with focus 1`] = `
|
|
|
188
188
|
</div>
|
|
189
189
|
</div>
|
|
190
190
|
<div
|
|
191
|
-
class="PicassoPopper-root
|
|
191
|
+
class="PicassoPopper-root shadow-2"
|
|
192
192
|
role="tooltip"
|
|
193
193
|
style="position: absolute; top: 0px; left: 0px; transform: translate3d(NaNpx, NaNpx, 0); will-change: transform;"
|
|
194
194
|
x-placement="bottom-end"
|
|
195
195
|
>
|
|
196
196
|
<div>
|
|
197
197
|
<div
|
|
198
|
-
class="bg-white shadow-0 transition-shadow duration-300 delay-0
|
|
198
|
+
class="bg-white shadow-0 transition-shadow duration-300 delay-0 overflow-y max-h [@media(max-height:585px)]:max-h-[calc(50vh [@media(max-height:585px)]:md:max-h-[calc(50vh"
|
|
199
199
|
style="opacity: 1; transform: scale(1, 1); transition: opacity 0ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 0ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;"
|
|
200
200
|
>
|
|
201
201
|
<div>
|
package/src/Dropdown/styles.ts
CHANGED
|
@@ -1,58 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export const contentClass: Record<'content' | 'contentVisible', string[]> = {
|
|
2
|
+
content: [
|
|
3
|
+
'overflow-y-auto',
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export default ({ screens, shadows, palette }: Theme) =>
|
|
13
|
-
createStyles({
|
|
14
|
-
root: {
|
|
15
|
-
display: 'flex',
|
|
16
|
-
alignItems: 'center',
|
|
17
|
-
},
|
|
18
|
-
anchor: {
|
|
19
|
-
display: 'inline-flex',
|
|
20
|
-
alignItems: 'center',
|
|
21
|
-
cursor: 'pointer',
|
|
22
|
-
},
|
|
23
|
-
content: {
|
|
24
|
-
fontSize: 'inherit',
|
|
25
|
-
background: palette.common.white,
|
|
26
|
-
|
|
27
|
-
maxHeight: '14.75rem', // 6.5 lines of menu to show
|
|
28
|
-
overflowY: 'auto',
|
|
5
|
+
'max-h-[14.75rem]',
|
|
6
|
+
'[@media(max-height:585px)]:max-h-[calc(50vh-3rem)]',
|
|
7
|
+
'[@media(max-height:585px)]:md:max-h-[calc(50vh-3.5rem)]',
|
|
8
|
+
],
|
|
9
|
+
contentVisible: [
|
|
10
|
+
'max-h-screen md:max-h-none ',
|
|
29
11
|
|
|
30
|
-
|
|
31
|
-
// and needs to reduce height dynamically to avoid overflow
|
|
32
|
-
'@media screen and (max-height: 585px)': {
|
|
33
|
-
maxHeight: 'calc(50vh - 3rem)', // half of viewport minus header and anchor
|
|
12
|
+
'overflow-y-scroll md:overflow-y-hidden',
|
|
34
13
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
},
|
|
40
|
-
popper: {
|
|
41
|
-
boxShadow: shadows[2],
|
|
42
|
-
},
|
|
43
|
-
contentVisible: {
|
|
44
|
-
// Basically a whole content of a dropdown will be shown without a vertical scrollbar inside the dropdown
|
|
45
|
-
maxHeight: 'none',
|
|
46
|
-
|
|
47
|
-
// Will show a whole content on the `xs` and `sm` screens with a vertical scrollbar if needed
|
|
48
|
-
// For non desktop devices better if we have a scrollbar when a dropdown content is pretty long
|
|
49
|
-
[screens('xs', 'sm')]: {
|
|
50
|
-
overflowY: 'scroll',
|
|
51
|
-
maxHeight: '100vh',
|
|
52
|
-
},
|
|
53
|
-
'@media screen and (max-height: 585px)': {
|
|
54
|
-
overflowY: 'scroll',
|
|
55
|
-
maxHeight: '100vh',
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
})
|
|
14
|
+
'[@media(max-height:585px)]:max-h-screen',
|
|
15
|
+
'[@media(max-height:585px)]:overflow-y-scroll',
|
|
16
|
+
],
|
|
17
|
+
}
|