-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathanalytics.js
154 lines (143 loc) · 4.62 KB
/
analytics.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
dynamically creates and animates chat bubbles on a webpage, simulating a conversation-like interface.
The messages appear one by one with loading animations, typing effects, and other visual enhancements. *
*/
window.onload = function() {
var messagesEl = document.querySelector('.textsInBubbles');
var typingSpeed = 20;
var loadingText = '<b>•</b><b>•</b><b>•</b>';
var messageIndex = 0;
var getFontSize = function() {
return parseInt(getComputedStyle(document.body).getPropertyValue('font-size'));
}
var pxToRem = function(px) {
return px / getFontSize() + 'rem';
}
var createBubbleElements = function(message, position) {
var bubbleEl = document.createElement('div');
var messageEl = document.createElement('span');
var loadingEl = document.createElement('span');
bubbleEl.classList.add('bubble');
bubbleEl.classList.add('is-loading');
bubbleEl.classList.add('cornered');
bubbleEl.classList.add(position === 'right' ? 'right' : 'left');
messageEl.classList.add('message');
loadingEl.classList.add('loading');
messageEl.innerHTML = message;
loadingEl.innerHTML = loadingText;
bubbleEl.appendChild(loadingEl);
bubbleEl.appendChild(messageEl);
bubbleEl.style.opacity = 0;
return {
bubble: bubbleEl,
message: messageEl,
loading: loadingEl
}
}
var getDimentions = function(elements) {
return dimensions = {
loading: {
w: '4rem',
h: '2.25rem'
},
bubble: {
w: pxToRem(elements.bubble.offsetWidth + 4),
h: pxToRem(elements.bubble.offsetHeight)
},
message: {
w: pxToRem(elements.message.offsetWidth + 4),
h: pxToRem(elements.message.offsetHeight)
}
}
}
var sendMessage = function(message, position) {
var loadingDuration = (message.replace(/<(?:.|\n)*?>/gm, '').length * typingSpeed) + 500;
var elements = createBubbleElements(message, position);
messagesEl.appendChild(elements.bubble);
messagesEl.appendChild(document.createElement('br'));
var dimensions = getDimentions(elements);
elements.bubble.style.width = '0rem';
elements.bubble.style.height = dimensions.loading.h;
elements.message.style.width = dimensions.message.w;
elements.message.style.height = dimensions.message.h;
elements.bubble.style.opacity = 1;
var bubbleOffset = elements.bubble.offsetTop + elements.bubble.offsetHeight;
if (bubbleOffset > messagesEl.offsetHeight) {
var scrollMessages = anime({
targets: messagesEl,
scrollTop: bubbleOffset,
duration: 750
});
}
var bubbleSize = anime({
targets: elements.bubble,
width: ['0rem', dimensions.loading.w],
marginTop: ['2.5rem', 0],
marginLeft: ['-2.5rem', 0],
duration: 800,
easing: 'easeOutElastic'
});
var loadingLoop = anime({
targets: elements.bubble,
scale: [1.05, .95],
duration: 1100,
loop: true,
direction: 'alternate',
easing: 'easeInOutQuad'
});
var dotsStart = anime({
targets: elements.loading,
translateX: ['-2rem', '0rem'],
scale: [.5, 1],
duration: 400,
delay: 25,
easing: 'easeOutElastic',
});
var dotsPulse = anime({
targets: elements.bubble.querySelectorAll('b'),
scale: [1, 1.25],
opacity: [.5, 1],
duration: 300,
loop: true,
direction: 'alternate',
delay: function(i) {return (i * 100) + 50}
});
setTimeout(function() {
loadingLoop.pause();
dotsPulse.restart({
opacity: 0,
scale: 0,
loop: false,
direction: 'forwards',
update: function(a) {
if (a.progress >= 65 && elements.bubble.classList.contains('is-loading')) {
elements.bubble.classList.remove('is-loading');
anime({
targets: elements.message,
opacity: [0, 1],
duration: 300,
});
}
}
});
bubbleSize.restart({
scale: 1,
width: [dimensions.loading.w, dimensions.bubble.w ],
height: [dimensions.loading.h, dimensions.bubble.h ],
marginTop: 0,
marginLeft: 0,
begin: function() {
if (messageIndex < textsInBubbles.length) elements.bubble.classList.remove('cornered');
}
})
}, loadingDuration - 50);
}
var sendMessages = function() {
var message = textsInBubbles[messageIndex];
if (!message) return;
sendMessage(message);
++messageIndex;
setTimeout(sendMessages, (message.replace(/<(?:.|\n)*?>/gm, '').length * typingSpeed) + anime.random(900, 1200));
}
sendMessages();
}