Skip to content

Commit 1b43a49

Browse files
committed
Accurate message reactions and popups
1 parent c538e19 commit 1b43a49

File tree

4 files changed

+118
-13
lines changed

4 files changed

+118
-13
lines changed

css/backdrop-blur.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.backdrop-blur {
22
overflow: hidden;
33
z-index: 9;
4-
backdrop-filter: blur(0px) brightness(25%);
4+
backdrop-filter: blur(25px) brightness(25%);
55
opacity: 1;
66
transition-duration: 0.25s;
77
pointer-events: all;

css/message-reaction.css

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,70 @@
11
.message-reaction {
22
position: absolute;
3-
top: -21px;
3+
top: -17.5px;
44
border-radius: 30px;
5+
border: 1px solid var(--background-0);
56
padding: 5px;
6-
font-size: 14px;
7-
border: 4px solid var(--background-0);
7+
font-size: 12px;
88
aspect-ratio: 1/1;
99
width: 18px;
1010
text-align: center;
1111
font-weight: bolder;
12-
transform: scale(0%);
12+
transform: scale(0);
1313
transition-duration: 0.5s;
1414
pointer-events: none;
15+
padding-top: 6px;
16+
height: 18px;
17+
padding-bottom: 4px;
1518
}
1619

1720
.message-reaction-visible {
1821
transform: scale(100%);
1922
}
2023

21-
.message-reaction-sender-color {
24+
.message-reaction-sender-color,
25+
.message-reaction-sender-color * {
2226
background: var(--recipient);
2327
color: var(--foreground-0);
2428
}
25-
.message-reaction-recipient-color {
26-
background: var(--accent);
29+
.message-reaction-recipient-color,
30+
.message-reaction-recipient-color * {
31+
background: var(--accent);
2732
color: white;
2833
}
2934
.message-reaction-sender {
30-
left: -21px;
35+
left: -17.5px;
3136
}
3237
.message-reaction-recipient {
33-
right: -21px;
38+
right: -17.5px;
3439
}
40+
41+
.message-reaction-dot {
42+
position: absolute;
43+
border-radius: 30px;
44+
}
45+
46+
47+
.message-reaction-sender .message-reaction-dot-1 {
48+
width: 35%;
49+
height: 35%;
50+
bottom: -1px;
51+
left: -1px;
52+
}
53+
.message-reaction-sender .message-reaction-dot-2 {
54+
width: calc(35% / 2);
55+
height: calc(35% / 2);
56+
bottom: -5px;
57+
left: -5px;
58+
}
59+
.message-reaction-recipient .message-reaction-dot-1 {
60+
width: 35%;
61+
height: 35%;
62+
bottom: -1px;
63+
right: -1px;
64+
}
65+
.message-reaction-recipient .message-reaction-dot-2 {
66+
width: calc(35% / 2);
67+
height: calc(35% / 2);
68+
bottom: -5px;
69+
right: -5px;
70+
}

css/reaction-popup.css

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
border-radius: 100px;
77
display: flex;
88
z-index: 10;
9-
box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.2);
109
opacity: 0;
1110
transition-duration: 0.5s;
1211
pointer-events: none;
@@ -27,7 +26,44 @@
2726
cursor: pointer;
2827
font-weight: bolder;
2928
}
30-
.reaction-popup span:hover, .reaction-popup .reaction-popup-selected {
29+
.reaction-popup span:hover,
30+
.reaction-popup .reaction-popup-selected {
3131
color: white;
3232
background-color: var(--accent);
3333
}
34+
35+
.popup-orb-container {
36+
position: absolute;
37+
width: 100%;
38+
height: 100%;
39+
top: 0;
40+
left: 0;
41+
}
42+
.popup-orb-container-inner {
43+
position: relative;
44+
}
45+
.popup-orb {
46+
border-radius: 100px;
47+
position: absolute;
48+
background-color: var(--recipient);
49+
}
50+
.popup-orb-1 {
51+
height: 20px;
52+
width: 20px;
53+
}
54+
.popup-orb-2 {
55+
height: 10px;
56+
width: 10px;
57+
}
58+
.message-orb-container-recipient .popup-orb-1 {
59+
bottom: -10px;
60+
}
61+
.message-orb-container-sender .popup-orb-1 {
62+
bottom: -10px;
63+
}
64+
.message-orb-container-recipient .popup-orb-2 {
65+
bottom: -20px
66+
}
67+
.message-orb-container-sender .popup-orb-2 {
68+
bottom: -20px;
69+
}

scripts/iMessage.js

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,31 @@ const CreateMessageBubble = (TypingIndicator = false, MessageJSON = {}, Message
656656
CloneMessage.style.right = `${window.visualViewport.width - MessageArea.right - 12}px`
657657
else
658658
CloneMessage.style.left = `${MessageArea.left - 12}px`
659+
await new Promise(r => setTimeout(r, 100));
660+
CloneMessage.classList.add("message-clone-visible")
661+
662+
const OrbContainer = document.createElement("div")
663+
OrbContainer.className = "popup-orb-container"
664+
OrbContainer.classList.add(Sender ? "message-orb-container-sender" : "message-orb-container-recipient")
665+
ReactionPopup.appendChild(OrbContainer)
666+
const Orb1 = document.createElement("div")
667+
Orb1.className = "popup-orb popup-orb-1"
668+
OrbContainer.appendChild(Orb1)
669+
const Orb2 = document.createElement("div")
670+
Orb2.className = "popup-orb popup-orb-2"
671+
OrbContainer.appendChild(Orb2)
672+
const GetX = () => {
673+
let MessageBounds = CloneMessage.getBoundingClientRect();
674+
return MessageBounds.right - MessageBounds.left
675+
}
676+
if (Sender) {
677+
Orb1.style.right = `${GetX() - 4}px`
678+
Orb2.style.right = `${GetX() + 13}px`
679+
}
680+
else {
681+
Orb1.style.left = `${GetX() - 4}px`
682+
Orb2.style.left = `${GetX() + 13}px`
683+
}
659684

660685
let CurrentReactions = JSON.parse(MessageContentItem.getAttribute("rawjson")).reactions
661686
for (let x = 0; x < CurrentReactions.length; x++) {
@@ -1182,7 +1207,14 @@ const ApplyReactions = async (json) => {
11821207
MessageReactionObject.className = "message-reaction"
11831208
MessageReactionObject.classList.add(json.sender == 1 ? "message-reaction-sender" : "message-reaction-recipient")
11841209
MessageReactionObject.classList.add(LastReaction.sender == 0 ? "message-reaction-sender-color" : "message-reaction-recipient-color")
1185-
MessageReactionObject.textContent = ((text) => {
1210+
let Dot1 = document.createElement("div")
1211+
Dot1.className = "message-reaction-dot message-reaction-dot-1"
1212+
MessageReactionObject.appendChild(Dot1)
1213+
let Dot2 = document.createElement("div")
1214+
Dot2.className = "message-reaction-dot message-reaction-dot-2"
1215+
MessageReactionObject.appendChild(Dot2)
1216+
let TextContainer = document.createElement("div")
1217+
TextContainer.textContent = ((text) => {
11861218
switch (text) {
11871219
case 2000:
11881220
return "􀊵";
@@ -1205,6 +1237,7 @@ const ApplyReactions = async (json) => {
12051237
}
12061238
return "..."
12071239
})(LastReaction.reactionType)
1240+
MessageReactionObject.appendChild(TextContainer)
12081241
if (json.action != "newReaction") {
12091242
MessageReactionObject.classList.add("message-reaction-visible")
12101243
}

0 commit comments

Comments
 (0)