Project

General

Profile

1
import { $ } from '../util/index';
2

    
3
export default function (UIkit) {
4

    
5
    UIkit.component('height-match', {
6

    
7
        args: 'target',
8

    
9
        props: {
10
            target: String,
11
            row: Boolean
12
        },
13

    
14
        defaults: {
15
            target: '> *',
16
            row: true
17
        },
18

    
19
        computed: {
20

    
21
            elements() {
22
                return $(this.target, this.$el);
23
            }
24

    
25
        },
26

    
27
        update: {
28

    
29
            read() {
30

    
31
                var lastOffset = false;
32

    
33
                this.elements.css('minHeight', '');
34

    
35
                this.rows = !this.row
36
                    ? [this.match(this.elements)]
37
                    : this.elements.toArray().reduce((rows, el) => {
38

    
39
                        if (lastOffset !== el.offsetTop) {
40
                            rows.push([el]);
41
                        } else {
42
                            rows[rows.length - 1].push(el);
43
                        }
44

    
45
                        lastOffset = el.offsetTop;
46

    
47
                        return rows;
48

    
49
                    }, []).map(elements => this.match($(elements)));
50
            },
51

    
52
            write() {
53

    
54
                this.rows.forEach(({height, elements}) =>
55
                    elements && elements.each((_, el) =>
56
                        el.style.minHeight = `${height}px`
57
                    )
58
                );
59

    
60
            },
61

    
62
            events: ['resize']
63

    
64
        },
65

    
66
        methods: {
67

    
68
            match(elements) {
69

    
70
                if (elements.length < 2) {
71
                    return {};
72
                }
73

    
74
                var max = 0, heights = [];
75

    
76
                elements = elements
77
                    .each((_, el) => {
78

    
79
                        var $el, style, hidden;
80

    
81
                        if (el.offsetHeight === 0) {
82
                            $el = $(el);
83
                            style = $el.attr('style') || null;
84
                            hidden = $el.attr('hidden') || null;
85

    
86
                            $el.attr({
87
                                style: `${style};display:block !important;`,
88
                                hidden: null
89
                            });
90
                        }
91

    
92
                        max = Math.max(max, el.offsetHeight);
93
                        heights.push(el.offsetHeight);
94

    
95
                        if ($el) {
96
                            $el.attr({style, hidden});
97
                        }
98

    
99
                    })
100
                    .filter(i => heights[i] < max);
101

    
102
                return {height: max, elements};
103
            }
104
        }
105

    
106
    });
107

    
108
}
(9-9/28)