Skip to content

Commit 949362e

Browse files
committed
feat: Added CCard coponents and export.
1 parent 3357a02 commit 949362e

File tree

9 files changed

+265
-0
lines changed

9 files changed

+265
-0
lines changed

src/components/Card/CCard.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { mergeData } from 'vue-functional-data-merge'
2+
// import pluckProps from '../../utils/pluck-props'
3+
import { assign } from '../../utils/object'
4+
import cardCommon from '../../mixins/cardMixin'
5+
import CCardHeader from './CCardHeader'
6+
import CCardBody from './CCardBody'
7+
import CCardFooter from './CCardFooter'
8+
9+
const props = assign(
10+
cardCommon.props,
11+
{
12+
header: String,
13+
body: String,
14+
footer: String
15+
}
16+
)
17+
export default {
18+
functional: true,
19+
name: 'CCard',
20+
props,
21+
render (h, { props, data, slots }) {
22+
const $slots = slots()
23+
24+
if (!$slots.header && props.header)
25+
$slots.header = h(CCardHeader, { domProps: { innerHTML: props.header }})
26+
27+
if (!$slots.body && !$slots.default && props.body)
28+
$slots.body = h(CCardBody, { domProps: { innerHTML: props.body }})
29+
30+
if (!$slots.footer && props.footer)
31+
$slots.footer = h(CCardFooter, { domProps: { innerHTML: props.footer }})
32+
33+
return h(
34+
props.tag,
35+
mergeData(data, {
36+
staticClass: 'card',
37+
class: {
38+
[`text-${props.align}`]: Boolean(props.align),
39+
[`bg-${props.variant}`]: Boolean(props.variant),
40+
[`border-${props.borderVariant}`]: Boolean(props.borderVariant),
41+
[`text-${props.textVariant}`]: Boolean(props.textVariant)
42+
}
43+
}),
44+
[ $slots.header, $slots.body || $slots.default, $slots.footer ]
45+
)
46+
}
47+
}

src/components/Card/CCardBody.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { mergeData } from 'vue-functional-data-merge'
2+
import { assign } from '../../utils/object'
3+
import cardCommon from '../../mixins/cardMixin'
4+
5+
export const props = assign(
6+
cardCommon.props,
7+
{
8+
title: String,
9+
titleTag: {
10+
type: String,
11+
default: 'h4'
12+
},
13+
subtitle: String,
14+
subtitleTag: {
15+
type: String,
16+
default: 'h6'
17+
},
18+
body: String,
19+
overlay: Boolean,
20+
}
21+
)
22+
23+
export default {
24+
functional: true,
25+
name: 'CCardBody',
26+
props,
27+
render (h, { props, data, children }) {
28+
let cardTitle = h(false)
29+
let cardSubtitle = h(false)
30+
let cardContent = children || props.body || [ h(false) ]
31+
32+
if (props.title) {
33+
cardTitle = h(props.titleTag, {
34+
staticClass: 'card-title',
35+
domProps: { innerHTML: props.title }
36+
})
37+
}
38+
39+
if (props.subtitle) {
40+
cardSubtitle = h(props.subtitleTag, {
41+
staticClass: 'card-subtitle mb-2 text-muted',
42+
domProps: { innerHTML: props.subtitle }
43+
})
44+
}
45+
46+
return h(
47+
props.tag,
48+
mergeData(data, {
49+
staticClass: 'card-body',
50+
class: [
51+
{
52+
'card-img-overlay': props.overlay,
53+
[`bg-${props.variant}`]: Boolean(props.variant),
54+
[`border-${props.borderVariant}`]: Boolean(props.borderVariant),
55+
[`text-${props.textVariant}`]: Boolean(props.textVariant)
56+
}
57+
]
58+
}),
59+
[ cardTitle, cardSubtitle, ...cardContent ]
60+
)
61+
}
62+
}

src/components/Card/CCardFooter.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { mergeData } from 'vue-functional-data-merge'
2+
import { assign } from '../../utils/object'
3+
import cardCommon from '../../mixins/cardMixin'
4+
5+
export const props = assign(
6+
cardCommon.props,
7+
{
8+
footer: String,
9+
}
10+
)
11+
12+
export default {
13+
functional: true,
14+
name: 'CCardFooter',
15+
props,
16+
render (h, { props, data, children }) {
17+
return h(
18+
props.tag,
19+
mergeData(data, {
20+
staticClass: 'card-footer',
21+
class: [
22+
{
23+
[`text-${props.align}`]: Boolean(props.align),
24+
[`bg-${props.variant}`]: Boolean(props.variant),
25+
[`border-${props.borderVariant}`]: Boolean(props.borderVariant),
26+
[`text-${props.textVariant}`]: Boolean(props.textVariant)
27+
}
28+
]
29+
}),
30+
children || [h('div', { domProps: { innerHTML: props.footer } })]
31+
)
32+
}
33+
}

src/components/Card/CCardGroup.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { mergeData } from 'vue-functional-data-merge'
2+
3+
export const props = {
4+
tag: {
5+
type: String,
6+
default: 'div'
7+
},
8+
deck: Boolean,
9+
columns: Boolean,
10+
}
11+
export default {
12+
functional: true,
13+
name: 'CCardGroup',
14+
props,
15+
render (h, { props, data, children }) {
16+
let staticClass = 'card-group'
17+
if (props.columns)
18+
staticClass = 'card-columns'
19+
if (props.deck)
20+
staticClass = 'card-deck'
21+
return h(props.tag, mergeData(data, { staticClass }), children)
22+
}
23+
}

src/components/Card/CCardHeader.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { mergeData } from 'vue-functional-data-merge'
2+
import { assign } from '../../utils/object'
3+
import cardCommon from '../../mixins/cardMixin'
4+
5+
export const props = assign(
6+
cardCommon.props,
7+
{
8+
header: String
9+
}
10+
)
11+
12+
export default {
13+
functional: true,
14+
name: 'CCardHeader',
15+
props,
16+
render (h, { props, data, children }) {
17+
return h(
18+
props.tag,
19+
mergeData(data, {
20+
staticClass: 'card-header',
21+
class: [
22+
{
23+
[`text-${props.align}`]: Boolean(props.align),
24+
[`bg-${props.variant}`]: Boolean(props.variant),
25+
[`border-${props.borderVariant}`]: Boolean(props.borderVariant),
26+
[`text-${props.textVariant}`]: Boolean(props.textVariant)
27+
}
28+
]
29+
}),
30+
children || [h('div', { domProps: { innerHTML: props.header } })]
31+
)
32+
}
33+
}

src/components/Card/CCardImg.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {mergeData} from 'vue-functional-data-merge'
2+
3+
export const props = {
4+
imgSrc: String,
5+
imgAlt: String,
6+
imgTop: Boolean,
7+
imgBottom: Boolean,
8+
imgLeft: Boolean,
9+
imgRight: Boolean,
10+
imgHeight: String,
11+
imgWidth: String,
12+
imgFluid: Boolean
13+
}
14+
15+
export default {
16+
functional: true,
17+
name: 'CCardImg',
18+
props,
19+
render (h, {props, data}) {
20+
let staticClass = 'card-img'
21+
if (props.imgTop)
22+
staticClass += '-top'
23+
else if (props.imgRight)
24+
staticClass += '-right'
25+
else if (props.imgBottom)
26+
staticClass += '-bottom'
27+
else if (props.imgLeft)
28+
staticClass += '-left'
29+
30+
return h(
31+
'img',
32+
mergeData(data, {
33+
staticClass,
34+
class: {'img-fluid': props.imgFluid},
35+
attrs: {src: props.imgSrc, alt: props.imgAlt, height: props.imgHeight, width: props.imgWidth}
36+
})
37+
)
38+
}
39+
}

src/components/Card/index.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import CCardGroup from './CCardGroup'
2+
import CCard from './CCard'
3+
import CCardBody from './CCardBody'
4+
import CCardFooter from './CCardFooter'
5+
import CCardHeader from './CCardHeader'
6+
import CCardImg from './CCardImg'
7+
8+
export {
9+
CCardGroup,
10+
CCard,
11+
CCardBody,
12+
CCardFooter,
13+
CCardHeader,
14+
CCardImg
15+
}

src/components/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ export * from './Badge'
1313
export * from './Progress'
1414
export * from './Alert'
1515
export * from './Button'
16+
export * from './Card'

src/mixins/cardMixin.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export default {
2+
props: {
3+
tag: {
4+
type: String,
5+
default: 'div'
6+
},
7+
variant: String,
8+
borderVariant: String,
9+
textVariant: String,
10+
align: String
11+
}
12+
}

0 commit comments

Comments
 (0)