Skip to content

Commit aefa098

Browse files
committed
Generate version 5.0.0
1 parent c2020a3 commit aefa098

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+847
-326
lines changed

README.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MDB 5 React
22

3-
Version: FREE 4.2.0
3+
Version: FREE 5.0.0
44

55
Documentation:
66
https://mdbootstrap.com/docs/b5/react/

app/demo/App.tsx

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,20 @@
11
import React from "react";
2-
import { MDBBtn, MDBContainer, MDBIcon } from "mdb-react-ui-kit";
3-
function App() {
2+
import {
3+
MDBDropdown,
4+
MDBDropdownMenu,
5+
MDBDropdownToggle,
6+
MDBDropdownItem,
7+
} from "mdb-react-ui-kit";
8+
9+
export default function App() {
410
return (
5-
<MDBContainer fluid>
6-
<div
7-
className="d-flex justify-content-center align-items-center"
8-
style={{ height: "100vh" }}
9-
>
10-
<div className="text-center">
11-
<img
12-
className="mb-4"
13-
src="https://mdbootstrap.com/img/logo/mdb-transparent-250px.png"
14-
style={{ width: 250, height: 90 }}
15-
/>
16-
<h5 className="mb-3">
17-
Thank you for using our product. We're glad you're with us.
18-
</h5>
19-
<p className="mb-3">MDB Team</p>
20-
<MDBBtn
21-
tag="a"
22-
href="https://mdbootstrap.com/docs/standard/getting-started/"
23-
target="_blank"
24-
role="button"
25-
>
26-
Start MDB tutorial
27-
</MDBBtn>
28-
<p className="mt-4">
29-
<a href="https://mdbootstrap.com/sale/free/">
30-
<MDBIcon far icon="surprise" size="lg" /> Free users buy cheaper
31-
..{" "}
32-
</a>
33-
</p>
34-
</div>
35-
</div>
36-
</MDBContainer>
11+
<MDBDropdown>
12+
<MDBDropdownToggle>Dropdown button</MDBDropdownToggle>
13+
<MDBDropdownMenu>
14+
<MDBDropdownItem>Action</MDBDropdownItem>
15+
<MDBDropdownItem>Another action</MDBDropdownItem>
16+
<MDBDropdownItem>Something else here</MDBDropdownItem>
17+
</MDBDropdownMenu>
18+
</MDBDropdown>
3719
);
3820
}
39-
export default App;

app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mdb-react-ui-kit-demo",
3-
"version": "4.2.0",
3+
"version": "5.0.0",
44
"main": "index.js",
55
"repository": {
66
"type": "git",

app/src/components/Accordion/Accordion.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import type { AccordionProps } from './types';
44
import { AccordionContext } from './AccordionContext';
55

66
const MDBAccordion: React.FC<AccordionProps> = React.forwardRef<HTMLAllCollection, AccordionProps>(
7-
({ alwaysOpen, className, flush, initialActive, tag: Tag, children, onChange, ...props }, ref) => {
8-
const classes = clsx('accordion', flush && 'accordion-flush', className);
7+
({ alwaysOpen, borderless, className, flush, initialActive, tag: Tag, children, onChange, ...props }, ref) => {
8+
const classes = clsx('accordion', flush && 'accordion-flush', borderless && 'accordion-borderless', className);
99

1010
const [activeItem, setActiveItem] = useState(initialActive);
1111

app/src/components/Accordion/types.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BaseComponent } from "../../types/baseComponent";
33

44
interface AccordionProps extends BaseComponent {
55
alwaysOpen?: boolean;
6+
borderless?: boolean;
67
flush?: boolean;
78
initialActive?: number;
89
onChange?: (id: number) => void;

app/src/components/Badge/types.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from "react";
22
import { BaseComponent } from "../../types/baseComponent";
3+
34
import { backgroundColor } from "../../types/colors";
45

56
interface BadgeProps extends BaseComponent {

app/src/components/Button/types.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ interface ButtonProps extends Omit<joinedTypes, 'size' | 'color'> {
1818
| 'white'
1919
| 'info'
2020
| 'none'
21-
| 'link';
22-
21+
| 'link'
22+
| 'tertiary';
2323
floating?: boolean;
2424
noRipple?: boolean;
2525
outline?: boolean;

app/src/components/ButtonGroup/types.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { BaseComponent } from "../../types/baseComponent";
2+
23
import { size } from "../../types/size";
34

45
interface ButtonGroupProps extends BaseComponent {

app/src/components/Carousel/CarouselItem/CarouselItem.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const MDBCarouselItem: React.FC<CarouselItemProps> = ({
1010
src,
1111
alt,
1212
itemId,
13+
video,
1314
...props
1415
}) => {
1516
const { active } = useContext(CarouselContext);
@@ -31,7 +32,13 @@ const MDBCarouselItem: React.FC<CarouselItemProps> = ({
3132

3233
return (
3334
<div className='carousel-item' ref={itemRef}>
34-
<img className={className} src={src} alt={alt} {...props} />
35+
{video ? (
36+
<video className={className} autoPlay loop muted {...props}>
37+
<source src={src} type='video/mp4' />
38+
</video>
39+
) : (
40+
<img className={className} src={src} alt={alt} {...props} />
41+
)}
3542
<div className={captionClasses}>{children}</div>
3643
</div>
3744
);
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import React from 'react';
1+
import { ImgHTMLAttributes, VideoHTMLAttributes } from 'react';
22

3-
type CarouselItemProps = {
4-
className?: string;
5-
interval?: number;
3+
type ImgVideo = ImgHTMLAttributes<HTMLImageElement> & VideoHTMLAttributes<HTMLVideoElement>;
4+
5+
type CarouselItemProps = ImgVideo & {
6+
captionClassName?: string;
67
itemId: number;
7-
tag?: React.ComponentProps<any>;
8-
[rest: string]: any;
8+
video?: boolean;
99
};
1010

1111
export { CarouselItemProps };

app/src/components/Carousel/types.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
import React from 'react';
1+
import { BaseComponent } from "../../types/baseComponent";
22

3-
type CarouselProps = {
4-
className?: string;
3+
interface CarouselProps extends BaseComponent {
4+
dark?: boolean;
55
fade?: boolean;
66
interval?: number;
77
keyboard?: boolean;
8-
onSlide?: () => any;
8+
onSlide?: () => void;
99
pause?: boolean;
1010
showControls?: boolean;
1111
showIndicators?: boolean;
1212
touch?: boolean;
13-
tag?: React.ComponentProps<any>;
14-
[rest: string]: any;
15-
};
13+
}
1614

1715
export { CarouselProps };

app/src/components/Collapse/Collapse.tsx

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import clsx from 'clsx';
2-
import React, { useEffect, useRef } from 'react';
2+
import React, { useCallback, useEffect, useRef, useState } from 'react';
33
import type { CollapseProps } from './types';
44

55
const MDBCollapse: React.FC<CollapseProps> = ({
@@ -10,64 +10,68 @@ const MDBCollapse: React.FC<CollapseProps> = ({
1010
navbar,
1111
tag: Tag,
1212
collapseRef,
13+
style,
1314
...props
1415
}): JSX.Element => {
15-
const classes = clsx('collapse', navbar && 'navbar-collapse', className);
16+
const [showCollapse, setShowCollapse] = useState<boolean | undefined>(false);
17+
const [collapseHeight, setCollapseHeight] = useState<string | number | undefined>(undefined);
18+
const [transition, setTransition] = useState(false);
19+
20+
const classes = clsx(
21+
transition ? 'collapsing' : 'collapse',
22+
!transition && showCollapse && 'show',
23+
navbar && 'navbar-collapse',
24+
className
25+
);
1626
const collapseEl = useRef<HTMLElement>(null);
17-
18-
const isFirstRender = useRef(show);
19-
2027
const refCollapse = collapseRef ?? collapseEl;
2128

22-
useEffect(() => {
23-
if (isFirstRender.current && show) {
24-
isFirstRender.current = false;
25-
refCollapse?.current?.classList.add('show');
29+
const handleResize = useCallback(() => {
30+
if (showCollapse) {
31+
setCollapseHeight(undefined);
32+
}
33+
}, [showCollapse]);
2634

27-
return;
35+
useEffect(() => {
36+
if (collapseHeight === undefined && showCollapse) {
37+
setCollapseHeight(refCollapse?.current?.scrollHeight);
2838
}
29-
}, [refCollapse, show]);
39+
}, [collapseHeight, showCollapse, refCollapse]);
3040

3141
useEffect(() => {
32-
const collapseElement = refCollapse.current;
42+
setShowCollapse(show);
3343

34-
if (!collapseElement || isFirstRender.current) {
35-
return;
44+
if (showCollapse) {
45+
setTransition(true);
3646
}
3747

38-
const toggleCollapse = () => {
39-
collapseElement.classList.toggle('collapsing');
40-
collapseElement.classList.toggle('collapse');
41-
};
42-
43-
if (show) {
44-
toggleCollapse();
45-
collapseElement.style.height = `${collapseElement.scrollHeight}px`;
48+
const timer = setTimeout(() => {
49+
setTransition(false);
50+
}, 350);
4651

47-
setTimeout(() => {
48-
toggleCollapse();
52+
return () => {
53+
clearTimeout(timer);
54+
};
55+
}, [show, showCollapse]);
4956

50-
collapseElement.classList.toggle('show');
51-
collapseElement.style.height = '';
52-
}, 350);
57+
useEffect(() => {
58+
if (showCollapse) {
59+
setCollapseHeight(refCollapse?.current?.scrollHeight);
5360
} else {
54-
collapseElement.style.height = `${collapseElement.scrollHeight}px`;
55-
56-
setTimeout(() => {
57-
toggleCollapse();
61+
setCollapseHeight(0);
62+
}
63+
}, [showCollapse, refCollapse]);
5864

59-
collapseElement.style.height = '';
60-
collapseElement.classList.toggle('show');
61-
});
65+
useEffect(() => {
66+
window.addEventListener('resize', handleResize);
6267

63-
setTimeout(() => {
64-
toggleCollapse();
65-
}, 350);
66-
}
67-
}, [show, refCollapse]);
68+
return () => {
69+
window.removeEventListener('resize', handleResize);
70+
};
71+
}, [handleResize]);
6872

6973
return (
70-
<Tag id={id} className={classes} {...props} ref={refCollapse}>
74+
<Tag style={{ height: collapseHeight, ...style }} id={id} className={classes} {...props} ref={refCollapse}>
7175
{children}
7276
</Tag>
7377
);

app/src/components/Dropdown/DropdownMenu/DropdownMenu.tsx

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { useKeyboard } from '../hooks/useKeyboard';
66
import { useFade } from '../hooks/useFade';
77
import type { DropdownMenuProps } from './types';
88
import './style.css';
9+
import { usePopper } from 'react-popper';
10+
import { flip } from '@popperjs/core';
911

1012
const MDBDropdownMenu = ({
1113
className,
@@ -18,12 +20,47 @@ const MDBDropdownMenu = ({
1820
alwaysOpen,
1921
...props
2022
}: DropdownMenuProps) => {
21-
const { activeIndex, setPopperElement, isOpenState, animation, styles } = useDropdownContext();
23+
const {
24+
activeIndex,
25+
setPopperElement,
26+
isOpenState,
27+
animation,
28+
referenceElement,
29+
popperElement,
30+
options,
31+
dropleft,
32+
dropup,
33+
dropright,
34+
} = useDropdownContext();
2235

2336
const { show, isFadeIn, isFadeOut } = useFade();
2437

2538
useKeyboard(children);
2639

40+
const calculatePlacement = () => {
41+
if (dropright) {
42+
return 'right-start';
43+
}
44+
45+
if (dropleft) {
46+
return 'left-start';
47+
}
48+
49+
const isEnd = popperElement && getComputedStyle(popperElement).getPropertyValue('--bs-position').trim() === 'end';
50+
51+
if (dropup) {
52+
return isEnd ? 'top-end' : 'top-start';
53+
}
54+
55+
return isEnd ? 'bottom-end' : 'bottom-start';
56+
};
57+
58+
const { styles } = usePopper(referenceElement, popperElement, {
59+
placement: calculatePlacement(),
60+
modifiers: [flip],
61+
...options,
62+
});
63+
2764
const classes = clsx(
2865
'dropdown-menu',
2966
dark && 'dropdown-menu-dark',

app/src/components/Dropdown/ItemChild/ItemChild.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ export const ItemChild = ({
3838
return <h6 className='dropdown-header'>{children}</h6>;
3939
}
4040

41-
return null;
41+
return <>{children}</>;
4242
};

0 commit comments

Comments
 (0)