Skip to content

Commit 46cb2c8

Browse files
author
dwaju
committed
Release 2.0.0
1 parent 073d441 commit 46cb2c8

30 files changed

+683
-88
lines changed

README.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MDB 5 Vue
22

3-
Version: FREE 1.14.0
3+
Version: FREE 2.0.0
44

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

css/mdb.dark.min.css

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

css/mdb.dark.min.css.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

css/mdb.dark.rtl.min.css

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

css/mdb.min.css

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

css/mdb.min.css.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

css/mdb.rtl.min.css

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/mdb.common.js

+114-39
Large diffs are not rendered by default.

js/mdb.common.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/mdb.umd.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/mdb.umd.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mdb-vue-ui-kit",
3-
"version": "1.14.0",
3+
"version": "2.0.0",
44
"main": "js/mdb.umd.min.js",
55
"repository": "https://github.com/mdbootstrap/mdb-vue-ui-kit.git",
66
"author": "MDBootstrap",

src/components/free/components/MDBCarousel.vue

+10-2
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222
></button>
2323
</div>
2424

25-
<div class="carousel-inner" ref="carouselInnerRef">
25+
<div :class="innerClassName" ref="carouselInnerRef">
2626
<div v-for="(item, key) in items" class="carousel-item" :key="key">
27-
<img :src="item.src" :alt="item.alt" :class="itemsClass" />
27+
<video v-if="item.video" class="img-fluid" autoplay loop muted>
28+
<source :src="item.video" :type="item.videoType" />
29+
</video>
30+
<img v-else :src="item.src" :alt="item.alt" :class="itemsClass" />
2831
<div v-if="item.label || item.caption" :class="captionsClass">
2932
<h5 v-if="item.label">{{ item.label }}</h5>
3033
<p v-if="item.caption">{{ item.caption }}</p>
@@ -105,6 +108,7 @@ export default {
105108
type: Boolean,
106109
default: true,
107110
},
111+
innerClass: String,
108112
},
109113
emits: ["update:modelValue"],
110114
setup(props, { emit }) {
@@ -116,6 +120,9 @@ export default {
116120
props.dark && "carousel-dark",
117121
];
118122
});
123+
const innerClassName = computed(() => {
124+
return ["carousel-inner", props.innerClass];
125+
});
119126
120127
const activeItemKey = ref(props.modelValue);
121128
const carouselInnerRef = ref(null);
@@ -334,6 +341,7 @@ export default {
334341
335342
return {
336343
className,
344+
innerClassName,
337345
carouselInnerRef,
338346
activeItemKey,
339347
handleMouseenter,

src/components/free/components/MDBListGroup.vue

+10
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ export default {
2121
type: String,
2222
default: "ul",
2323
},
24+
light: {
25+
type: Boolean,
26+
default: false,
27+
},
28+
small: {
29+
type: Boolean,
30+
default: false,
31+
},
2432
},
2533
setup(props) {
2634
const className = computed(() => {
@@ -29,6 +37,8 @@ export default {
2937
props.horizontal && horizontalClass.value,
3038
props.flush && "list-group-flush",
3139
props.numbered && "list-group-numbered",
40+
props.light && "list-group-light",
41+
props.small && "list-group-small",
3242
];
3343
});
3444

src/components/free/components/MDBListGroupItem.vue

+24
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
:aria-current="active ? true : null"
66
:aria-disabled="disabled ? true : null"
77
:disabled="disabled ? true : null"
8+
v-mdb-ripple="props.ripple"
89
><slot></slot
910
></component>
1011
</template>
1112

1213
<script>
1314
import { computed } from "vue";
15+
import mdbRipple from "@/directives/free/mdbRipple";
1416
1517
export default {
1618
name: "MDBListGroupItem",
@@ -32,15 +34,37 @@ export default {
3234
default: false,
3335
},
3436
color: String,
37+
noBorder: {
38+
type: Boolean,
39+
default: false,
40+
},
41+
spacing: {
42+
type: [Boolean, String],
43+
default: false,
44+
},
45+
ripple: {
46+
type: [Object, Boolean],
47+
default: false,
48+
},
3549
},
50+
directives: { mdbRipple },
3651
setup(props) {
52+
const spacingClass = computed(() => {
53+
if (!props.spacing) {
54+
return;
55+
}
56+
return props.spacing !== true ? props.spacing : "px-3";
57+
});
58+
3759
const className = computed(() => {
3860
return [
3961
"list-group-item",
4062
props.active && "active",
4163
props.disabled && "disabled",
4264
props.action && "list-group-item-action",
4365
props.color && `list-group-item-${props.color}`,
66+
props.noBorder && `border-0`,
67+
props.spacing && spacingClass.value,
4468
];
4569
});
4670

src/composables/free/useMDBModal.js

+206
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
import { computed, onBeforeUnmount, provide, ref, watchEffect } from "vue";
2+
import { on, off } from "../../components/utils/MDBEventHandlers";
3+
import MDBFocusTrap from "@/components/utils/MDBFocusTrap.js";
4+
5+
export default function useMDBModal(props, emit) {
6+
const root = ref("root");
7+
const dialog = ref("dialog");
8+
const dialogTransform = ref("");
9+
const focusTrap = ref(null);
10+
11+
const isActive = ref(props.modelValue);
12+
13+
const thisElement = ref(null);
14+
15+
watchEffect(() => {
16+
isActive.value = props.modelValue;
17+
if (isActive.value) {
18+
emit("update:modelValue", true);
19+
}
20+
});
21+
22+
const wrapperClass = computed(() => {
23+
return [
24+
"modal",
25+
props.animation && "fade",
26+
isActive.value && "show",
27+
props.staticBackdrop && "modal-static",
28+
];
29+
});
30+
31+
const dialogClass = computed(() => {
32+
return [
33+
"modal-dialog",
34+
props.size && "modal-" + props.size,
35+
props.centered && "modal-dialog-centered",
36+
props.scrollable && "modal-dialog-scrollable",
37+
props.fullscreen && fullscreenClass.value,
38+
props.dialogClasses,
39+
];
40+
});
41+
42+
const backdropStyle = computed(() => {
43+
return props.removeBackdrop
44+
? false
45+
: { "background-color": `rgba(0,0,0, 0.5)` };
46+
});
47+
48+
// shouldOverflow with backdropOverflowStyle prevents bottom modal create additional scrollbar on show
49+
const shouldOverflow = ref(false);
50+
const backdropOverflowStyle = computed(() => {
51+
if (shouldOverflow.value || props.keepOverflow) {
52+
return;
53+
}
54+
return "overflow: hidden";
55+
});
56+
57+
const computedContentStyle = computed(() => {
58+
return props.bgSrc
59+
? { "background-image": `url("${props.bgSrc}")` }
60+
: false;
61+
});
62+
63+
const fullscreenClass = computed(() => {
64+
if (!props.fullscreen) {
65+
return false;
66+
}
67+
return [
68+
props.fullscreen !== true
69+
? `modal-fullscreen-${props.fullscreen}`
70+
: "modal-fullscreen",
71+
];
72+
});
73+
74+
const animateStaticBackdrop = () => {
75+
animateStaticModal(dialog.value);
76+
};
77+
78+
const closeModal = () => {
79+
emit("update:modelValue", false);
80+
};
81+
82+
provide("closeModal", closeModal);
83+
84+
const animateStaticModal = (el) => {
85+
el.style.transform = `scale(1.02)`;
86+
setTimeout(() => (el.style.transform = `scale(1.0)`), 300);
87+
};
88+
89+
const handleEscKeyUp = (e) => {
90+
if (e.key === "Escape" && isActive.value) {
91+
closeModal();
92+
}
93+
};
94+
95+
const isBodyOverflowing = ref(null);
96+
const scrollbarWidth = ref(0);
97+
98+
// Bootstrap way to measure scrollbar width
99+
const getScrollbarWidth = () => {
100+
const scrollDiv = document.createElement("div");
101+
scrollDiv.className = "modal-scrollbar-measure";
102+
document.body.appendChild(scrollDiv);
103+
const scrollbarWidth =
104+
scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
105+
document.body.removeChild(scrollDiv);
106+
return scrollbarWidth;
107+
};
108+
109+
const setScrollbar = () => {
110+
const rect = document.body.getBoundingClientRect();
111+
isBodyOverflowing.value =
112+
Math.round(rect.left + rect.right) < window.innerWidth;
113+
scrollbarWidth.value = isBodyOverflowing.value
114+
? getScrollbarWidth().toFixed(2)
115+
: 0;
116+
};
117+
118+
const enter = (el) => {
119+
shouldOverflow.value = false;
120+
121+
dialogTransform.value = "translate(0, -25%)";
122+
123+
el.childNodes[0].style.transform = dialogTransform.value;
124+
el.style.opacity = 0;
125+
el.style.display = "block";
126+
127+
setScrollbar();
128+
129+
document.body.style.paddingRight = `${scrollbarWidth.value}px`;
130+
el.style.paddingRight = `${scrollbarWidth.value}px`;
131+
document.body.classList.add("modal-open");
132+
133+
emit("show", root.value);
134+
};
135+
const afterEnter = (el) => {
136+
el.childNodes[0].style.transform = "translate(0,0)";
137+
el.style.opacity = 1;
138+
139+
setTimeout(() => {
140+
shouldOverflow.value = true;
141+
emit("shown", root.value);
142+
}, 400);
143+
thisElement.value = root.value;
144+
145+
if (props.keyboard) {
146+
on(window, "keyup", handleEscKeyUp);
147+
}
148+
149+
if (props.focus) {
150+
focusTrap.value = MDBFocusTrap();
151+
focusTrap.value.initFocusTrap(root.value);
152+
}
153+
};
154+
const beforeLeave = (el) => {
155+
el.childNodes[0].style.transform = dialogTransform.value;
156+
el.style.opacity = 0;
157+
setTimeout(() => {
158+
el.style.paddingRight = null;
159+
document.body.style.paddingRight = null;
160+
document.body.classList.remove("modal-open");
161+
}, 200);
162+
163+
emit("hide", thisElement.value);
164+
165+
if (props.keyboard) {
166+
off(window, "keyup", handleEscKeyUp);
167+
}
168+
if (props.focus && focusTrap.value) {
169+
focusTrap.value.removeFocusTrap();
170+
}
171+
};
172+
const afterLeave = () => {
173+
emit("hidden", thisElement.value);
174+
shouldOverflow.value = false;
175+
};
176+
177+
onBeforeUnmount(() => {
178+
off(window, "keyup", handleEscKeyUp);
179+
});
180+
181+
return {
182+
wrapperClass,
183+
dialogClass,
184+
backdropStyle,
185+
backdropOverflowStyle,
186+
computedContentStyle,
187+
root,
188+
dialog,
189+
isActive,
190+
closeModal,
191+
animateStaticBackdrop,
192+
enter,
193+
afterEnter,
194+
beforeLeave,
195+
afterLeave,
196+
scrollbarWidth,
197+
setScrollbar,
198+
shouldOverflow,
199+
thisElement,
200+
handleEscKeyUp,
201+
focusTrap,
202+
dialogTransform,
203+
animateStaticModal,
204+
fullscreenClass,
205+
};
206+
}

src/index.free.js

+2
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ import MDBRange from "@/components/free/forms/MDBRange";
7272
import MDBSwitch from "@/components/free/forms/MDBSwitch";
7373

7474
/* ------------- Directives ------------- */
75+
import mdbClickOutside from "@/directives/free/mdbClickOutside";
7576
import mdbRipple from "@/directives/free/mdbRipple";
7677
import mdbScrollspy from "@/directives/free/mdbScrollspy";
7778

@@ -137,6 +138,7 @@ export {
137138
MDBFile,
138139
MDBRange,
139140
MDBSwitch,
141+
mdbClickOutside,
140142
mdbRipple,
141143
mdbScrollspy,
142144
};

src/scss/free/_variables.scss

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
$valid-color: #00b74a;
2-
$invalid-color: #f93154;
1+
$valid-color: #00b74a !default;
2+
$invalid-color: #f93154 !default;

src/scss/standard/free/_card.scss

+11
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,20 @@
88
border-top-left-radius: $card-border-radius;
99
border-top-right-radius: $card-border-radius;
1010
}
11+
12+
&[class*='bg-'] {
13+
.card-header {
14+
border-bottom-color: $card-border-color;
15+
}
16+
.card-footer {
17+
border-top-color: $card-border-color;
18+
}
19+
}
1120
}
1221

1322
.card-header {
1423
background-color: $card-header-background-color;
24+
border-bottom: $card-header-border-width solid $card-header-border-color;
1525
}
1626

1727
.card-body {
@@ -23,6 +33,7 @@
2333

2434
.card-footer {
2535
background-color: $card-footer-background-color;
36+
border-top: $card-header-border-width solid $card-header-border-color;
2637
}
2738

2839
.card-img-left {

src/scss/standard/free/_dropdown.scss

+5
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,8 @@
114114
.fade-out {
115115
animation-name: fade-out;
116116
}
117+
118+
.dropdown-divider {
119+
border-top: 2px solid $dropdown-divider-bg;
120+
opacity: 1;
121+
}

0 commit comments

Comments
 (0)