diff --git a/quotevote-frontend/public/assets/VoxPOPLogoHighres.png b/quotevote-frontend/public/assets/VoxPOPLogoHighres.png new file mode 100644 index 0000000..8b64ca5 Binary files /dev/null and b/quotevote-frontend/public/assets/VoxPOPLogoHighres.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/avataaars-20-1.png b/quotevote-frontend/public/assets/all the group of characters/avataaars-20-1.png new file mode 100644 index 0000000..dd2c9eb Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/avataaars-20-1.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/avataaars-20-1@2x.png b/quotevote-frontend/public/assets/all the group of characters/avataaars-20-1@2x.png new file mode 100644 index 0000000..5bd319b Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/avataaars-20-1@2x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/avataaars-20-1@3x.png b/quotevote-frontend/public/assets/all the group of characters/avataaars-20-1@3x.png new file mode 100644 index 0000000..55f900b Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/avataaars-20-1@3x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-57.png b/quotevote-frontend/public/assets/all the group of characters/group-57.png new file mode 100644 index 0000000..1e26641 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-57.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-57@2x.png b/quotevote-frontend/public/assets/all the group of characters/group-57@2x.png new file mode 100644 index 0000000..f8d3816 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-57@2x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-57@3x.png b/quotevote-frontend/public/assets/all the group of characters/group-57@3x.png new file mode 100644 index 0000000..fa9b5b9 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-57@3x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-58.png b/quotevote-frontend/public/assets/all the group of characters/group-58.png new file mode 100644 index 0000000..9dcdfcc Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-58.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-58@2x.png b/quotevote-frontend/public/assets/all the group of characters/group-58@2x.png new file mode 100644 index 0000000..ff6cb61 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-58@2x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-58@3x.png b/quotevote-frontend/public/assets/all the group of characters/group-58@3x.png new file mode 100644 index 0000000..fe3cd73 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-58@3x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-6.png b/quotevote-frontend/public/assets/all the group of characters/group-6.png new file mode 100644 index 0000000..e02fed9 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-6.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-6@2x.png b/quotevote-frontend/public/assets/all the group of characters/group-6@2x.png new file mode 100644 index 0000000..ef23e48 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-6@2x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-6@3x.png b/quotevote-frontend/public/assets/all the group of characters/group-6@3x.png new file mode 100644 index 0000000..5ec2b6d Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-6@3x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-8.png b/quotevote-frontend/public/assets/all the group of characters/group-8.png new file mode 100644 index 0000000..050e9f7 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-8.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-89.png b/quotevote-frontend/public/assets/all the group of characters/group-89.png new file mode 100644 index 0000000..fec9646 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-89.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-89@2x.png b/quotevote-frontend/public/assets/all the group of characters/group-89@2x.png new file mode 100644 index 0000000..72c6eed Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-89@2x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-89@3x.png b/quotevote-frontend/public/assets/all the group of characters/group-89@3x.png new file mode 100644 index 0000000..044e5ca Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-89@3x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-8@2x.png b/quotevote-frontend/public/assets/all the group of characters/group-8@2x.png new file mode 100644 index 0000000..87823dd Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-8@2x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/group-8@3x.png b/quotevote-frontend/public/assets/all the group of characters/group-8@3x.png new file mode 100644 index 0000000..6a44c75 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/group-8@3x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/open-peeps-standing.png b/quotevote-frontend/public/assets/all the group of characters/open-peeps-standing.png new file mode 100644 index 0000000..0549888 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/open-peeps-standing.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/open-peeps-standing@2x.png b/quotevote-frontend/public/assets/all the group of characters/open-peeps-standing@2x.png new file mode 100644 index 0000000..b59b655 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/open-peeps-standing@2x.png differ diff --git a/quotevote-frontend/public/assets/all the group of characters/open-peeps-standing@3x.png b/quotevote-frontend/public/assets/all the group of characters/open-peeps-standing@3x.png new file mode 100644 index 0000000..76125c9 Binary files /dev/null and b/quotevote-frontend/public/assets/all the group of characters/open-peeps-standing@3x.png differ diff --git a/quotevote-frontend/public/assets/frame-11.png b/quotevote-frontend/public/assets/frame-11.png new file mode 100644 index 0000000..ff4afde Binary files /dev/null and b/quotevote-frontend/public/assets/frame-11.png differ diff --git a/quotevote-frontend/public/assets/frame-11@2x.png b/quotevote-frontend/public/assets/frame-11@2x.png new file mode 100644 index 0000000..1742c2f Binary files /dev/null and b/quotevote-frontend/public/assets/frame-11@2x.png differ diff --git a/quotevote-frontend/public/assets/frame-11@3x.png b/quotevote-frontend/public/assets/frame-11@3x.png new file mode 100644 index 0000000..1505b52 Binary files /dev/null and b/quotevote-frontend/public/assets/frame-11@3x.png differ diff --git a/quotevote-frontend/public/assets/frame-38.png b/quotevote-frontend/public/assets/frame-38.png new file mode 100644 index 0000000..b12ae52 Binary files /dev/null and b/quotevote-frontend/public/assets/frame-38.png differ diff --git a/quotevote-frontend/public/assets/frame-38@2x.png b/quotevote-frontend/public/assets/frame-38@2x.png new file mode 100644 index 0000000..5931e60 Binary files /dev/null and b/quotevote-frontend/public/assets/frame-38@2x.png differ diff --git a/quotevote-frontend/public/assets/frame-38@3x.png b/quotevote-frontend/public/assets/frame-38@3x.png new file mode 100644 index 0000000..367f12a Binary files /dev/null and b/quotevote-frontend/public/assets/frame-38@3x.png differ diff --git a/quotevote-frontend/public/assets/frame-45.png b/quotevote-frontend/public/assets/frame-45.png new file mode 100644 index 0000000..cd6cbc1 Binary files /dev/null and b/quotevote-frontend/public/assets/frame-45.png differ diff --git a/quotevote-frontend/public/assets/frame-45@2x.png b/quotevote-frontend/public/assets/frame-45@2x.png new file mode 100644 index 0000000..8854cb6 Binary files /dev/null and b/quotevote-frontend/public/assets/frame-45@2x.png differ diff --git a/quotevote-frontend/public/assets/frame-45@3x.png b/quotevote-frontend/public/assets/frame-45@3x.png new file mode 100644 index 0000000..73d8a5f Binary files /dev/null and b/quotevote-frontend/public/assets/frame-45@3x.png differ diff --git a/quotevote-frontend/public/assets/frame-47.png b/quotevote-frontend/public/assets/frame-47.png new file mode 100644 index 0000000..e84ff0c Binary files /dev/null and b/quotevote-frontend/public/assets/frame-47.png differ diff --git a/quotevote-frontend/public/assets/frame-47@2x.png b/quotevote-frontend/public/assets/frame-47@2x.png new file mode 100644 index 0000000..ad5e144 Binary files /dev/null and b/quotevote-frontend/public/assets/frame-47@2x.png differ diff --git a/quotevote-frontend/public/assets/frame-47@3x.png b/quotevote-frontend/public/assets/frame-47@3x.png new file mode 100644 index 0000000..cec67d8 Binary files /dev/null and b/quotevote-frontend/public/assets/frame-47@3x.png differ diff --git a/quotevote-frontend/public/assets/group-107.png b/quotevote-frontend/public/assets/group-107.png new file mode 100644 index 0000000..7cb356a Binary files /dev/null and b/quotevote-frontend/public/assets/group-107.png differ diff --git a/quotevote-frontend/public/assets/group-107@2x.png b/quotevote-frontend/public/assets/group-107@2x.png new file mode 100644 index 0000000..657de54 Binary files /dev/null and b/quotevote-frontend/public/assets/group-107@2x.png differ diff --git a/quotevote-frontend/public/assets/group-107@3x.png b/quotevote-frontend/public/assets/group-107@3x.png new file mode 100644 index 0000000..230706b Binary files /dev/null and b/quotevote-frontend/public/assets/group-107@3x.png differ diff --git a/quotevote-frontend/public/assets/group-74.png b/quotevote-frontend/public/assets/group-74.png new file mode 100644 index 0000000..a23f8a7 Binary files /dev/null and b/quotevote-frontend/public/assets/group-74.png differ diff --git a/quotevote-frontend/public/assets/group-74@2x.png b/quotevote-frontend/public/assets/group-74@2x.png new file mode 100644 index 0000000..bec40aa Binary files /dev/null and b/quotevote-frontend/public/assets/group-74@2x.png differ diff --git a/quotevote-frontend/public/assets/group-74@3x.png b/quotevote-frontend/public/assets/group-74@3x.png new file mode 100644 index 0000000..980f96b Binary files /dev/null and b/quotevote-frontend/public/assets/group-74@3x.png differ diff --git a/quotevote-frontend/public/assets/group.png b/quotevote-frontend/public/assets/group.png new file mode 100644 index 0000000..a6cb4d0 Binary files /dev/null and b/quotevote-frontend/public/assets/group.png differ diff --git a/quotevote-frontend/public/assets/group@2x.png b/quotevote-frontend/public/assets/group@2x.png new file mode 100644 index 0000000..87ac6c8 Binary files /dev/null and b/quotevote-frontend/public/assets/group@2x.png differ diff --git a/quotevote-frontend/public/assets/group@3x.png b/quotevote-frontend/public/assets/group@3x.png new file mode 100644 index 0000000..64e89ee Binary files /dev/null and b/quotevote-frontend/public/assets/group@3x.png differ diff --git a/quotevote-frontend/public/assets/header-separator.png b/quotevote-frontend/public/assets/header-separator.png new file mode 100644 index 0000000..a068bde Binary files /dev/null and b/quotevote-frontend/public/assets/header-separator.png differ diff --git a/quotevote-frontend/public/assets/header-separator@2x.png b/quotevote-frontend/public/assets/header-separator@2x.png new file mode 100644 index 0000000..24553bd Binary files /dev/null and b/quotevote-frontend/public/assets/header-separator@2x.png differ diff --git a/quotevote-frontend/public/assets/header-separator@3x.png b/quotevote-frontend/public/assets/header-separator@3x.png new file mode 100644 index 0000000..a54f561 Binary files /dev/null and b/quotevote-frontend/public/assets/header-separator@3x.png differ diff --git a/quotevote-frontend/public/assets/heart.png b/quotevote-frontend/public/assets/heart.png new file mode 100644 index 0000000..201987b Binary files /dev/null and b/quotevote-frontend/public/assets/heart.png differ diff --git a/quotevote-frontend/public/assets/heart@2x.png b/quotevote-frontend/public/assets/heart@2x.png new file mode 100644 index 0000000..b1f6581 Binary files /dev/null and b/quotevote-frontend/public/assets/heart@2x.png differ diff --git a/quotevote-frontend/public/assets/heart@3x.png b/quotevote-frontend/public/assets/heart@3x.png new file mode 100644 index 0000000..2c1d35a Binary files /dev/null and b/quotevote-frontend/public/assets/heart@3x.png differ diff --git a/quotevote-frontend/public/assets/list-with-tags.png b/quotevote-frontend/public/assets/list-with-tags.png new file mode 100644 index 0000000..5bef9e4 Binary files /dev/null and b/quotevote-frontend/public/assets/list-with-tags.png differ diff --git a/quotevote-frontend/public/assets/list-with-tags@2x.png b/quotevote-frontend/public/assets/list-with-tags@2x.png new file mode 100644 index 0000000..7f7ce29 Binary files /dev/null and b/quotevote-frontend/public/assets/list-with-tags@2x.png differ diff --git a/quotevote-frontend/public/assets/list-with-tags@3x.png b/quotevote-frontend/public/assets/list-with-tags@3x.png new file mode 100644 index 0000000..8889d42 Binary files /dev/null and b/quotevote-frontend/public/assets/list-with-tags@3x.png differ diff --git a/quotevote-frontend/public/assets/nav-menu.png b/quotevote-frontend/public/assets/nav-menu.png new file mode 100644 index 0000000..ed18f72 Binary files /dev/null and b/quotevote-frontend/public/assets/nav-menu.png differ diff --git a/quotevote-frontend/public/assets/nav-menu@2x.png b/quotevote-frontend/public/assets/nav-menu@2x.png new file mode 100644 index 0000000..e72bdf1 Binary files /dev/null and b/quotevote-frontend/public/assets/nav-menu@2x.png differ diff --git a/quotevote-frontend/public/assets/nav-menu@3x.png b/quotevote-frontend/public/assets/nav-menu@3x.png new file mode 100644 index 0000000..4657043 Binary files /dev/null and b/quotevote-frontend/public/assets/nav-menu@3x.png differ diff --git a/quotevote-frontend/public/assets/quote-v-te.png b/quotevote-frontend/public/assets/quote-v-te.png new file mode 100644 index 0000000..4d70e2c Binary files /dev/null and b/quotevote-frontend/public/assets/quote-v-te.png differ diff --git a/quotevote-frontend/public/assets/quote-v-te@2x.png b/quotevote-frontend/public/assets/quote-v-te@2x.png new file mode 100644 index 0000000..7028058 Binary files /dev/null and b/quotevote-frontend/public/assets/quote-v-te@2x.png differ diff --git a/quotevote-frontend/public/assets/quote-v-te@3x.png b/quotevote-frontend/public/assets/quote-v-te@3x.png new file mode 100644 index 0000000..97b36c9 Binary files /dev/null and b/quotevote-frontend/public/assets/quote-v-te@3x.png differ diff --git a/quotevote-frontend/public/assets/search-page.png b/quotevote-frontend/public/assets/search-page.png new file mode 100644 index 0000000..7316b2e Binary files /dev/null and b/quotevote-frontend/public/assets/search-page.png differ diff --git a/quotevote-frontend/public/assets/search-page@2x.png b/quotevote-frontend/public/assets/search-page@2x.png new file mode 100644 index 0000000..a2be4b0 Binary files /dev/null and b/quotevote-frontend/public/assets/search-page@2x.png differ diff --git a/quotevote-frontend/public/assets/search-page@3x.png b/quotevote-frontend/public/assets/search-page@3x.png new file mode 100644 index 0000000..d976431 Binary files /dev/null and b/quotevote-frontend/public/assets/search-page@3x.png differ diff --git a/quotevote-frontend/public/assets/user-icon.png b/quotevote-frontend/public/assets/user-icon.png new file mode 100644 index 0000000..1d13c83 Binary files /dev/null and b/quotevote-frontend/public/assets/user-icon.png differ diff --git a/quotevote-frontend/public/assets/user-icon@2x.png b/quotevote-frontend/public/assets/user-icon@2x.png new file mode 100644 index 0000000..3ea8d66 Binary files /dev/null and b/quotevote-frontend/public/assets/user-icon@2x.png differ diff --git a/quotevote-frontend/public/assets/user-icon@3x.png b/quotevote-frontend/public/assets/user-icon@3x.png new file mode 100644 index 0000000..a877172 Binary files /dev/null and b/quotevote-frontend/public/assets/user-icon@3x.png differ diff --git a/quotevote-frontend/public/assets/vector-2.png b/quotevote-frontend/public/assets/vector-2.png new file mode 100644 index 0000000..7efe751 Binary files /dev/null and b/quotevote-frontend/public/assets/vector-2.png differ diff --git a/quotevote-frontend/public/assets/vector-2@2x.png b/quotevote-frontend/public/assets/vector-2@2x.png new file mode 100644 index 0000000..d82628f Binary files /dev/null and b/quotevote-frontend/public/assets/vector-2@2x.png differ diff --git a/quotevote-frontend/public/assets/vector-2@3x.png b/quotevote-frontend/public/assets/vector-2@3x.png new file mode 100644 index 0000000..065a0f7 Binary files /dev/null and b/quotevote-frontend/public/assets/vector-2@3x.png differ diff --git a/quotevote-frontend/public/assets/vector-3.png b/quotevote-frontend/public/assets/vector-3.png new file mode 100644 index 0000000..d5ff7a8 Binary files /dev/null and b/quotevote-frontend/public/assets/vector-3.png differ diff --git a/quotevote-frontend/public/assets/vector-3@2x.png b/quotevote-frontend/public/assets/vector-3@2x.png new file mode 100644 index 0000000..df3da36 Binary files /dev/null and b/quotevote-frontend/public/assets/vector-3@2x.png differ diff --git a/quotevote-frontend/public/assets/vector-3@3x.png b/quotevote-frontend/public/assets/vector-3@3x.png new file mode 100644 index 0000000..637e0a4 Binary files /dev/null and b/quotevote-frontend/public/assets/vector-3@3x.png differ diff --git a/quotevote-frontend/public/assets/vector-4.png b/quotevote-frontend/public/assets/vector-4.png new file mode 100644 index 0000000..bb65dbb Binary files /dev/null and b/quotevote-frontend/public/assets/vector-4.png differ diff --git a/quotevote-frontend/public/assets/vector-4@2x.png b/quotevote-frontend/public/assets/vector-4@2x.png new file mode 100644 index 0000000..d05053d Binary files /dev/null and b/quotevote-frontend/public/assets/vector-4@2x.png differ diff --git a/quotevote-frontend/public/assets/vector-4@3x.png b/quotevote-frontend/public/assets/vector-4@3x.png new file mode 100644 index 0000000..58a0f81 Binary files /dev/null and b/quotevote-frontend/public/assets/vector-4@3x.png differ diff --git a/quotevote-frontend/public/assets/vector.png b/quotevote-frontend/public/assets/vector.png new file mode 100644 index 0000000..35d0cdc Binary files /dev/null and b/quotevote-frontend/public/assets/vector.png differ diff --git a/quotevote-frontend/public/assets/vector@2x.png b/quotevote-frontend/public/assets/vector@2x.png new file mode 100644 index 0000000..27f3312 Binary files /dev/null and b/quotevote-frontend/public/assets/vector@2x.png differ diff --git a/quotevote-frontend/public/assets/vector@3x.png b/quotevote-frontend/public/assets/vector@3x.png new file mode 100644 index 0000000..7b49882 Binary files /dev/null and b/quotevote-frontend/public/assets/vector@3x.png differ diff --git a/quotevote-frontend/public/assets/voting-pop-up.png b/quotevote-frontend/public/assets/voting-pop-up.png new file mode 100644 index 0000000..9b289a0 Binary files /dev/null and b/quotevote-frontend/public/assets/voting-pop-up.png differ diff --git a/quotevote-frontend/public/assets/voting-pop-up@2x.png b/quotevote-frontend/public/assets/voting-pop-up@2x.png new file mode 100644 index 0000000..ea1faf4 Binary files /dev/null and b/quotevote-frontend/public/assets/voting-pop-up@2x.png differ diff --git a/quotevote-frontend/public/assets/voting-pop-up@3x.png b/quotevote-frontend/public/assets/voting-pop-up@3x.png new file mode 100644 index 0000000..82a571b Binary files /dev/null and b/quotevote-frontend/public/assets/voting-pop-up@3x.png differ diff --git a/quotevote-frontend/public/images/avatar-1.png b/quotevote-frontend/public/images/avatar-1.png new file mode 100644 index 0000000..dd2c9eb Binary files /dev/null and b/quotevote-frontend/public/images/avatar-1.png differ diff --git a/quotevote-frontend/public/images/avatar-1@2x.png b/quotevote-frontend/public/images/avatar-1@2x.png new file mode 100644 index 0000000..5bd319b Binary files /dev/null and b/quotevote-frontend/public/images/avatar-1@2x.png differ diff --git a/quotevote-frontend/public/images/avatars/avatar-2.svg b/quotevote-frontend/public/images/avatars/avatar-2.svg new file mode 100644 index 0000000..de1031e --- /dev/null +++ b/quotevote-frontend/public/images/avatars/avatar-2.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/quotevote-frontend/public/images/avatars/avatar-3.svg b/quotevote-frontend/public/images/avatars/avatar-3.svg new file mode 100644 index 0000000..12f029f --- /dev/null +++ b/quotevote-frontend/public/images/avatars/avatar-3.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/quotevote-frontend/public/images/avatars/avatar-4.svg b/quotevote-frontend/public/images/avatars/avatar-4.svg new file mode 100644 index 0000000..a906137 --- /dev/null +++ b/quotevote-frontend/public/images/avatars/avatar-4.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/quotevote-frontend/public/images/avatars/avatar-5.svg b/quotevote-frontend/public/images/avatars/avatar-5.svg new file mode 100644 index 0000000..d500907 --- /dev/null +++ b/quotevote-frontend/public/images/avatars/avatar-5.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/quotevote-frontend/public/images/characters.png b/quotevote-frontend/public/images/characters.png new file mode 100644 index 0000000..947f529 Binary files /dev/null and b/quotevote-frontend/public/images/characters.png differ diff --git a/quotevote-frontend/public/images/characters/avataaars-20-1.png b/quotevote-frontend/public/images/characters/avataaars-20-1.png new file mode 100644 index 0000000..dd2c9eb Binary files /dev/null and b/quotevote-frontend/public/images/characters/avataaars-20-1.png differ diff --git a/quotevote-frontend/public/images/characters/avataaars-20-1@2x.png b/quotevote-frontend/public/images/characters/avataaars-20-1@2x.png new file mode 100644 index 0000000..5bd319b Binary files /dev/null and b/quotevote-frontend/public/images/characters/avataaars-20-1@2x.png differ diff --git a/quotevote-frontend/public/images/characters/avataaars-20-1@3x.png b/quotevote-frontend/public/images/characters/avataaars-20-1@3x.png new file mode 100644 index 0000000..55f900b Binary files /dev/null and b/quotevote-frontend/public/images/characters/avataaars-20-1@3x.png differ diff --git a/quotevote-frontend/public/images/characters/group-57.png b/quotevote-frontend/public/images/characters/group-57.png new file mode 100644 index 0000000..1e26641 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-57.png differ diff --git a/quotevote-frontend/public/images/characters/group-57@2x.png b/quotevote-frontend/public/images/characters/group-57@2x.png new file mode 100644 index 0000000..f8d3816 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-57@2x.png differ diff --git a/quotevote-frontend/public/images/characters/group-57@3x.png b/quotevote-frontend/public/images/characters/group-57@3x.png new file mode 100644 index 0000000..fa9b5b9 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-57@3x.png differ diff --git a/quotevote-frontend/public/images/characters/group-58.png b/quotevote-frontend/public/images/characters/group-58.png new file mode 100644 index 0000000..9dcdfcc Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-58.png differ diff --git a/quotevote-frontend/public/images/characters/group-58@2x.png b/quotevote-frontend/public/images/characters/group-58@2x.png new file mode 100644 index 0000000..ff6cb61 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-58@2x.png differ diff --git a/quotevote-frontend/public/images/characters/group-58@3x.png b/quotevote-frontend/public/images/characters/group-58@3x.png new file mode 100644 index 0000000..fe3cd73 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-58@3x.png differ diff --git a/quotevote-frontend/public/images/characters/group-6.png b/quotevote-frontend/public/images/characters/group-6.png new file mode 100644 index 0000000..e02fed9 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-6.png differ diff --git a/quotevote-frontend/public/images/characters/group-6@2x.png b/quotevote-frontend/public/images/characters/group-6@2x.png new file mode 100644 index 0000000..ef23e48 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-6@2x.png differ diff --git a/quotevote-frontend/public/images/characters/group-6@3x.png b/quotevote-frontend/public/images/characters/group-6@3x.png new file mode 100644 index 0000000..5ec2b6d Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-6@3x.png differ diff --git a/quotevote-frontend/public/images/characters/group-8.png b/quotevote-frontend/public/images/characters/group-8.png new file mode 100644 index 0000000..050e9f7 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-8.png differ diff --git a/quotevote-frontend/public/images/characters/group-89.png b/quotevote-frontend/public/images/characters/group-89.png new file mode 100644 index 0000000..fec9646 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-89.png differ diff --git a/quotevote-frontend/public/images/characters/group-89@2x.png b/quotevote-frontend/public/images/characters/group-89@2x.png new file mode 100644 index 0000000..72c6eed Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-89@2x.png differ diff --git a/quotevote-frontend/public/images/characters/group-89@3x.png b/quotevote-frontend/public/images/characters/group-89@3x.png new file mode 100644 index 0000000..044e5ca Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-89@3x.png differ diff --git a/quotevote-frontend/public/images/characters/group-8@2x.png b/quotevote-frontend/public/images/characters/group-8@2x.png new file mode 100644 index 0000000..87823dd Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-8@2x.png differ diff --git a/quotevote-frontend/public/images/characters/group-8@3x.png b/quotevote-frontend/public/images/characters/group-8@3x.png new file mode 100644 index 0000000..6a44c75 Binary files /dev/null and b/quotevote-frontend/public/images/characters/group-8@3x.png differ diff --git a/quotevote-frontend/public/images/characters/open-peeps-standing.png b/quotevote-frontend/public/images/characters/open-peeps-standing.png new file mode 100644 index 0000000..0549888 Binary files /dev/null and b/quotevote-frontend/public/images/characters/open-peeps-standing.png differ diff --git a/quotevote-frontend/public/images/characters/open-peeps-standing@2x.png b/quotevote-frontend/public/images/characters/open-peeps-standing@2x.png new file mode 100644 index 0000000..b59b655 Binary files /dev/null and b/quotevote-frontend/public/images/characters/open-peeps-standing@2x.png differ diff --git a/quotevote-frontend/public/images/characters/open-peeps-standing@3x.png b/quotevote-frontend/public/images/characters/open-peeps-standing@3x.png new file mode 100644 index 0000000..76125c9 Binary files /dev/null and b/quotevote-frontend/public/images/characters/open-peeps-standing@3x.png differ diff --git a/quotevote-frontend/public/images/community-strip-full-cropped.png b/quotevote-frontend/public/images/community-strip-full-cropped.png new file mode 100644 index 0000000..3db6f78 Binary files /dev/null and b/quotevote-frontend/public/images/community-strip-full-cropped.png differ diff --git a/quotevote-frontend/public/images/community-strip-full.png b/quotevote-frontend/public/images/community-strip-full.png new file mode 100644 index 0000000..edf4beb Binary files /dev/null and b/quotevote-frontend/public/images/community-strip-full.png differ diff --git a/quotevote-frontend/public/images/community-strip.png b/quotevote-frontend/public/images/community-strip.png new file mode 100644 index 0000000..5526e7d Binary files /dev/null and b/quotevote-frontend/public/images/community-strip.png differ diff --git a/quotevote-frontend/public/images/frame-11.png b/quotevote-frontend/public/images/frame-11.png new file mode 100644 index 0000000..19fd156 Binary files /dev/null and b/quotevote-frontend/public/images/frame-11.png differ diff --git a/quotevote-frontend/public/images/frame-11@2x.png b/quotevote-frontend/public/images/frame-11@2x.png new file mode 100644 index 0000000..bd78360 Binary files /dev/null and b/quotevote-frontend/public/images/frame-11@2x.png differ diff --git a/quotevote-frontend/public/images/frame-11@3x.png b/quotevote-frontend/public/images/frame-11@3x.png new file mode 100644 index 0000000..ba89be2 Binary files /dev/null and b/quotevote-frontend/public/images/frame-11@3x.png differ diff --git a/quotevote-frontend/public/images/frame-38.png b/quotevote-frontend/public/images/frame-38.png new file mode 100644 index 0000000..b12ae52 Binary files /dev/null and b/quotevote-frontend/public/images/frame-38.png differ diff --git a/quotevote-frontend/public/images/frame-38@2x.png b/quotevote-frontend/public/images/frame-38@2x.png new file mode 100644 index 0000000..5931e60 Binary files /dev/null and b/quotevote-frontend/public/images/frame-38@2x.png differ diff --git a/quotevote-frontend/public/images/frame-38@3x.png b/quotevote-frontend/public/images/frame-38@3x.png new file mode 100644 index 0000000..367f12a Binary files /dev/null and b/quotevote-frontend/public/images/frame-38@3x.png differ diff --git a/quotevote-frontend/public/images/frame-45.png b/quotevote-frontend/public/images/frame-45.png new file mode 100644 index 0000000..cd6cbc1 Binary files /dev/null and b/quotevote-frontend/public/images/frame-45.png differ diff --git a/quotevote-frontend/public/images/frame-45@2x.png b/quotevote-frontend/public/images/frame-45@2x.png new file mode 100644 index 0000000..8854cb6 Binary files /dev/null and b/quotevote-frontend/public/images/frame-45@2x.png differ diff --git a/quotevote-frontend/public/images/frame-45@3x.png b/quotevote-frontend/public/images/frame-45@3x.png new file mode 100644 index 0000000..73d8a5f Binary files /dev/null and b/quotevote-frontend/public/images/frame-45@3x.png differ diff --git a/quotevote-frontend/public/images/frame-47.png b/quotevote-frontend/public/images/frame-47.png new file mode 100644 index 0000000..e84ff0c Binary files /dev/null and b/quotevote-frontend/public/images/frame-47.png differ diff --git a/quotevote-frontend/public/images/frame-47@2x.png b/quotevote-frontend/public/images/frame-47@2x.png new file mode 100644 index 0000000..ad5e144 Binary files /dev/null and b/quotevote-frontend/public/images/frame-47@2x.png differ diff --git a/quotevote-frontend/public/images/frame-47@3x.png b/quotevote-frontend/public/images/frame-47@3x.png new file mode 100644 index 0000000..cec67d8 Binary files /dev/null and b/quotevote-frontend/public/images/frame-47@3x.png differ diff --git a/quotevote-frontend/public/images/github-logo.png b/quotevote-frontend/public/images/github-logo.png new file mode 100644 index 0000000..e68786b Binary files /dev/null and b/quotevote-frontend/public/images/github-logo.png differ diff --git a/quotevote-frontend/public/images/globe-icon-1.png b/quotevote-frontend/public/images/globe-icon-1.png new file mode 100644 index 0000000..346c91d Binary files /dev/null and b/quotevote-frontend/public/images/globe-icon-1.png differ diff --git a/quotevote-frontend/public/images/globe-icon-1@2x.png b/quotevote-frontend/public/images/globe-icon-1@2x.png new file mode 100644 index 0000000..299d304 Binary files /dev/null and b/quotevote-frontend/public/images/globe-icon-1@2x.png differ diff --git a/quotevote-frontend/public/images/globe-icon-1@3x.png b/quotevote-frontend/public/images/globe-icon-1@3x.png new file mode 100644 index 0000000..286f367 Binary files /dev/null and b/quotevote-frontend/public/images/globe-icon-1@3x.png differ diff --git a/quotevote-frontend/public/images/group-107.png b/quotevote-frontend/public/images/group-107.png new file mode 100644 index 0000000..a974417 Binary files /dev/null and b/quotevote-frontend/public/images/group-107.png differ diff --git a/quotevote-frontend/public/images/group-107@2x.png b/quotevote-frontend/public/images/group-107@2x.png new file mode 100644 index 0000000..27dc139 Binary files /dev/null and b/quotevote-frontend/public/images/group-107@2x.png differ diff --git a/quotevote-frontend/public/images/group-107@3x.png b/quotevote-frontend/public/images/group-107@3x.png new file mode 100644 index 0000000..2f91588 Binary files /dev/null and b/quotevote-frontend/public/images/group-107@3x.png differ diff --git a/quotevote-frontend/public/images/group-5.png b/quotevote-frontend/public/images/group-5.png new file mode 100644 index 0000000..2c77792 Binary files /dev/null and b/quotevote-frontend/public/images/group-5.png differ diff --git a/quotevote-frontend/public/images/group-5@2x.png b/quotevote-frontend/public/images/group-5@2x.png new file mode 100644 index 0000000..720d9e4 Binary files /dev/null and b/quotevote-frontend/public/images/group-5@2x.png differ diff --git a/quotevote-frontend/public/images/group-5@3x.png b/quotevote-frontend/public/images/group-5@3x.png new file mode 100644 index 0000000..fa10591 Binary files /dev/null and b/quotevote-frontend/public/images/group-5@3x.png differ diff --git a/quotevote-frontend/public/images/group-74.png b/quotevote-frontend/public/images/group-74.png new file mode 100644 index 0000000..a30a218 Binary files /dev/null and b/quotevote-frontend/public/images/group-74.png differ diff --git a/quotevote-frontend/public/images/group-74@2x.png b/quotevote-frontend/public/images/group-74@2x.png new file mode 100644 index 0000000..6f6f269 Binary files /dev/null and b/quotevote-frontend/public/images/group-74@2x.png differ diff --git a/quotevote-frontend/public/images/group-74@3x.png b/quotevote-frontend/public/images/group-74@3x.png new file mode 100644 index 0000000..1432472 Binary files /dev/null and b/quotevote-frontend/public/images/group-74@3x.png differ diff --git a/quotevote-frontend/public/images/group.png b/quotevote-frontend/public/images/group.png new file mode 100644 index 0000000..a6cb4d0 Binary files /dev/null and b/quotevote-frontend/public/images/group.png differ diff --git a/quotevote-frontend/public/images/group@2x.png b/quotevote-frontend/public/images/group@2x.png new file mode 100644 index 0000000..87ac6c8 Binary files /dev/null and b/quotevote-frontend/public/images/group@2x.png differ diff --git a/quotevote-frontend/public/images/group@3x.png b/quotevote-frontend/public/images/group@3x.png new file mode 100644 index 0000000..64e89ee Binary files /dev/null and b/quotevote-frontend/public/images/group@3x.png differ diff --git a/quotevote-frontend/public/images/header-separator.png b/quotevote-frontend/public/images/header-separator.png new file mode 100644 index 0000000..a068bde Binary files /dev/null and b/quotevote-frontend/public/images/header-separator.png differ diff --git a/quotevote-frontend/public/images/header-separator@2x.png b/quotevote-frontend/public/images/header-separator@2x.png new file mode 100644 index 0000000..24553bd Binary files /dev/null and b/quotevote-frontend/public/images/header-separator@2x.png differ diff --git a/quotevote-frontend/public/images/header-separator@3x.png b/quotevote-frontend/public/images/header-separator@3x.png new file mode 100644 index 0000000..a54f561 Binary files /dev/null and b/quotevote-frontend/public/images/header-separator@3x.png differ diff --git a/quotevote-frontend/public/images/heart.png b/quotevote-frontend/public/images/heart.png new file mode 100644 index 0000000..201987b Binary files /dev/null and b/quotevote-frontend/public/images/heart.png differ diff --git a/quotevote-frontend/public/images/heart@2x.png b/quotevote-frontend/public/images/heart@2x.png new file mode 100644 index 0000000..8401d81 Binary files /dev/null and b/quotevote-frontend/public/images/heart@2x.png differ diff --git a/quotevote-frontend/public/images/heart@3x.png b/quotevote-frontend/public/images/heart@3x.png new file mode 100644 index 0000000..4fc7767 Binary files /dev/null and b/quotevote-frontend/public/images/heart@3x.png differ diff --git a/quotevote-frontend/public/images/hero-post-card.png b/quotevote-frontend/public/images/hero-post-card.png new file mode 100644 index 0000000..527ddc9 Binary files /dev/null and b/quotevote-frontend/public/images/hero-post-card.png differ diff --git a/quotevote-frontend/public/images/list-with-tags.png b/quotevote-frontend/public/images/list-with-tags.png new file mode 100644 index 0000000..6d222c0 Binary files /dev/null and b/quotevote-frontend/public/images/list-with-tags.png differ diff --git a/quotevote-frontend/public/images/list-with-tags@2x.png b/quotevote-frontend/public/images/list-with-tags@2x.png new file mode 100644 index 0000000..b9e3964 Binary files /dev/null and b/quotevote-frontend/public/images/list-with-tags@2x.png differ diff --git a/quotevote-frontend/public/images/list-with-tags@3x.png b/quotevote-frontend/public/images/list-with-tags@3x.png new file mode 100644 index 0000000..fc1a133 Binary files /dev/null and b/quotevote-frontend/public/images/list-with-tags@3x.png differ diff --git a/quotevote-frontend/public/images/nav-menu.png b/quotevote-frontend/public/images/nav-menu.png new file mode 100644 index 0000000..422dfdb Binary files /dev/null and b/quotevote-frontend/public/images/nav-menu.png differ diff --git a/quotevote-frontend/public/images/nav-menu@2x.png b/quotevote-frontend/public/images/nav-menu@2x.png new file mode 100644 index 0000000..fb9fe4a Binary files /dev/null and b/quotevote-frontend/public/images/nav-menu@2x.png differ diff --git a/quotevote-frontend/public/images/nav-menu@3x.png b/quotevote-frontend/public/images/nav-menu@3x.png new file mode 100644 index 0000000..b2ddec1 Binary files /dev/null and b/quotevote-frontend/public/images/nav-menu@3x.png differ diff --git a/quotevote-frontend/public/images/quote-comments.png b/quotevote-frontend/public/images/quote-comments.png new file mode 100644 index 0000000..389b8de Binary files /dev/null and b/quotevote-frontend/public/images/quote-comments.png differ diff --git a/quotevote-frontend/public/images/quote-v-te.png b/quotevote-frontend/public/images/quote-v-te.png new file mode 100644 index 0000000..0607df4 Binary files /dev/null and b/quotevote-frontend/public/images/quote-v-te.png differ diff --git a/quotevote-frontend/public/images/quote-v-te@2x.png b/quotevote-frontend/public/images/quote-v-te@2x.png new file mode 100644 index 0000000..3815cd1 Binary files /dev/null and b/quotevote-frontend/public/images/quote-v-te@2x.png differ diff --git a/quotevote-frontend/public/images/quote-v-te@3x.png b/quotevote-frontend/public/images/quote-v-te@3x.png new file mode 100644 index 0000000..0fe63cf Binary files /dev/null and b/quotevote-frontend/public/images/quote-v-te@3x.png differ diff --git a/quotevote-frontend/public/images/search-page.png b/quotevote-frontend/public/images/search-page.png new file mode 100644 index 0000000..3fa3c9c Binary files /dev/null and b/quotevote-frontend/public/images/search-page.png differ diff --git a/quotevote-frontend/public/images/search-page@2x.png b/quotevote-frontend/public/images/search-page@2x.png new file mode 100644 index 0000000..b38d30f Binary files /dev/null and b/quotevote-frontend/public/images/search-page@2x.png differ diff --git a/quotevote-frontend/public/images/search-page@3x.png b/quotevote-frontend/public/images/search-page@3x.png new file mode 100644 index 0000000..42cc597 Binary files /dev/null and b/quotevote-frontend/public/images/search-page@3x.png differ diff --git a/quotevote-frontend/public/images/track-conversations.png b/quotevote-frontend/public/images/track-conversations.png new file mode 100644 index 0000000..d1470d1 Binary files /dev/null and b/quotevote-frontend/public/images/track-conversations.png differ diff --git a/quotevote-frontend/public/images/user-icon.png b/quotevote-frontend/public/images/user-icon.png new file mode 100644 index 0000000..1d13c83 Binary files /dev/null and b/quotevote-frontend/public/images/user-icon.png differ diff --git a/quotevote-frontend/public/images/user-icon@2x.png b/quotevote-frontend/public/images/user-icon@2x.png new file mode 100644 index 0000000..4b10d35 Binary files /dev/null and b/quotevote-frontend/public/images/user-icon@2x.png differ diff --git a/quotevote-frontend/public/images/user-icon@3x.png b/quotevote-frontend/public/images/user-icon@3x.png new file mode 100644 index 0000000..10dc35c Binary files /dev/null and b/quotevote-frontend/public/images/user-icon@3x.png differ diff --git a/quotevote-frontend/public/images/vector-2.png b/quotevote-frontend/public/images/vector-2.png new file mode 100644 index 0000000..7efe751 Binary files /dev/null and b/quotevote-frontend/public/images/vector-2.png differ diff --git a/quotevote-frontend/public/images/vector-2@2x.png b/quotevote-frontend/public/images/vector-2@2x.png new file mode 100644 index 0000000..d82628f Binary files /dev/null and b/quotevote-frontend/public/images/vector-2@2x.png differ diff --git a/quotevote-frontend/public/images/vector-2@3x.png b/quotevote-frontend/public/images/vector-2@3x.png new file mode 100644 index 0000000..065a0f7 Binary files /dev/null and b/quotevote-frontend/public/images/vector-2@3x.png differ diff --git a/quotevote-frontend/public/images/vector-3.png b/quotevote-frontend/public/images/vector-3.png new file mode 100644 index 0000000..d5ff7a8 Binary files /dev/null and b/quotevote-frontend/public/images/vector-3.png differ diff --git a/quotevote-frontend/public/images/vector-3@2x.png b/quotevote-frontend/public/images/vector-3@2x.png new file mode 100644 index 0000000..df3da36 Binary files /dev/null and b/quotevote-frontend/public/images/vector-3@2x.png differ diff --git a/quotevote-frontend/public/images/vector-3@3x.png b/quotevote-frontend/public/images/vector-3@3x.png new file mode 100644 index 0000000..637e0a4 Binary files /dev/null and b/quotevote-frontend/public/images/vector-3@3x.png differ diff --git a/quotevote-frontend/public/images/vector-4.png b/quotevote-frontend/public/images/vector-4.png new file mode 100644 index 0000000..bb65dbb Binary files /dev/null and b/quotevote-frontend/public/images/vector-4.png differ diff --git a/quotevote-frontend/public/images/vector-4@2x.png b/quotevote-frontend/public/images/vector-4@2x.png new file mode 100644 index 0000000..d05053d Binary files /dev/null and b/quotevote-frontend/public/images/vector-4@2x.png differ diff --git a/quotevote-frontend/public/images/vector-4@3x.png b/quotevote-frontend/public/images/vector-4@3x.png new file mode 100644 index 0000000..58a0f81 Binary files /dev/null and b/quotevote-frontend/public/images/vector-4@3x.png differ diff --git a/quotevote-frontend/public/images/vector.png b/quotevote-frontend/public/images/vector.png new file mode 100644 index 0000000..35d0cdc Binary files /dev/null and b/quotevote-frontend/public/images/vector.png differ diff --git a/quotevote-frontend/public/images/vector@2x.png b/quotevote-frontend/public/images/vector@2x.png new file mode 100644 index 0000000..27f3312 Binary files /dev/null and b/quotevote-frontend/public/images/vector@2x.png differ diff --git a/quotevote-frontend/public/images/vector@3x.png b/quotevote-frontend/public/images/vector@3x.png new file mode 100644 index 0000000..7b49882 Binary files /dev/null and b/quotevote-frontend/public/images/vector@3x.png differ diff --git a/quotevote-frontend/public/images/vote-card.png b/quotevote-frontend/public/images/vote-card.png new file mode 100644 index 0000000..9ae2bed Binary files /dev/null and b/quotevote-frontend/public/images/vote-card.png differ diff --git a/quotevote-frontend/public/images/voting-pop-up.png b/quotevote-frontend/public/images/voting-pop-up.png new file mode 100644 index 0000000..521ae74 Binary files /dev/null and b/quotevote-frontend/public/images/voting-pop-up.png differ diff --git a/quotevote-frontend/public/images/voting-pop-up@2x.png b/quotevote-frontend/public/images/voting-pop-up@2x.png new file mode 100644 index 0000000..bee2c66 Binary files /dev/null and b/quotevote-frontend/public/images/voting-pop-up@2x.png differ diff --git a/quotevote-frontend/public/images/voting-pop-up@3x.png b/quotevote-frontend/public/images/voting-pop-up@3x.png new file mode 100644 index 0000000..6e0b410 Binary files /dev/null and b/quotevote-frontend/public/images/voting-pop-up@3x.png differ diff --git a/quotevote-frontend/public/images/voting-toggle-on.png b/quotevote-frontend/public/images/voting-toggle-on.png new file mode 100644 index 0000000..a7842a8 Binary files /dev/null and b/quotevote-frontend/public/images/voting-toggle-on.png differ diff --git a/quotevote-frontend/src/__tests__/app/page.test.tsx b/quotevote-frontend/src/__tests__/app/page.test.tsx index 7f58db1..2a1493a 100644 --- a/quotevote-frontend/src/__tests__/app/page.test.tsx +++ b/quotevote-frontend/src/__tests__/app/page.test.tsx @@ -440,6 +440,88 @@ describe('LandingPage', () => { }); }); + // ── Platform Principles Section ──────────────────────────── + + describe('Platform Principles section', () => { + it('renders the Platform Principles heading', () => { + renderLandingPage(); + expect( + screen.getByRole('heading', { name: /built on values/i }) + ).toBeInTheDocument(); + }); + + it('renders all 4 principle cards', () => { + renderLandingPage(); + const principlesSection = screen.getByRole('heading', { name: /built on values/i }).closest('section'); + expect(principlesSection).toBeInTheDocument(); + expect(screen.getByText('No Ads')).toBeInTheDocument(); + expect(screen.getByText('No Algorithms')).toBeInTheDocument(); + expect(screen.getAllByText('Open Source').length).toBeGreaterThan(0); + expect(screen.getByText('Everyone Welcome')).toBeInTheDocument(); + }); + + it('renders principle descriptions', () => { + renderLandingPage(); + expect(screen.getByText(/pure conversations without commercial influence/i)).toBeInTheDocument(); + expect(screen.getByText(/community-driven development/i)).toBeInTheDocument(); + }); + }); + + // ── Community Use Cases Section ──────────────────────────── + + describe('Community Use Cases section', () => { + it('renders the Community Use Cases heading', () => { + renderLandingPage(); + expect( + screen.getByRole('heading', { name: /who is quote\.vote for/i }) + ).toBeInTheDocument(); + }); + + it('renders all 6 use case cards', () => { + renderLandingPage(); + expect(screen.getByText('Schools & Universities')).toBeInTheDocument(); + expect(screen.getByText('Parent Groups')).toBeInTheDocument(); + expect(screen.getByText('Organizations')).toBeInTheDocument(); + expect(screen.getByText('Governments')).toBeInTheDocument(); + expect(screen.getByText('Nonprofits & Advocacy')).toBeInTheDocument(); + expect(screen.getByText('Teams & Projects')).toBeInTheDocument(); + }); + + it('renders use case descriptions', () => { + renderLandingPage(); + expect(screen.getByText(/structured discussions and transparent voting/i)).toBeInTheDocument(); + expect(screen.getByText(/democratic feedback and decision-making/i)).toBeInTheDocument(); + }); + }); + + // ── Private Conversations Section ────────────────────────── + + describe('Private Conversations section', () => { + it('renders the Private Circle heading', () => { + renderLandingPage(); + expect( + screen.getByRole('heading', { name: /your private circle/i }) + ).toBeInTheDocument(); + }); + + it('renders private messaging and buddy system cards', () => { + renderLandingPage(); + expect(screen.getByText('Private Messages')).toBeInTheDocument(); + expect(screen.getByText('Your Buddy System')).toBeInTheDocument(); + }); + + it('renders private conversation description', () => { + renderLandingPage(); + expect(screen.getByText(/connect with friends and colleagues privately/i)).toBeInTheDocument(); + }); + + it('renders private conversation features list', () => { + renderLandingPage(); + expect(screen.getByText(/username-based connections and messaging/i)).toBeInTheDocument(); + expect(screen.getByText(/follow shared interests/i)).toBeInTheDocument(); + }); + }); + // ── New marketing sections ──────────────────────────────── describe('Marketing sections', () => { diff --git a/quotevote-frontend/src/__tests__/components/Chat/ChatList.test.tsx b/quotevote-frontend/src/__tests__/components/Chat/ChatList.test.tsx index 7740ac2..9d0b195 100644 --- a/quotevote-frontend/src/__tests__/components/Chat/ChatList.test.tsx +++ b/quotevote-frontend/src/__tests__/components/Chat/ChatList.test.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @next/next/no-img-element */ /** * ChatList Component Tests * diff --git a/quotevote-frontend/src/__tests__/components/Profile/ProfileHeaderMessage.test.tsx b/quotevote-frontend/src/__tests__/components/Profile/ProfileHeaderMessage.test.tsx index 7de0c4b..9ef6165 100644 --- a/quotevote-frontend/src/__tests__/components/Profile/ProfileHeaderMessage.test.tsx +++ b/quotevote-frontend/src/__tests__/components/Profile/ProfileHeaderMessage.test.tsx @@ -57,11 +57,14 @@ jest.mock('@/hooks/useGuestGuard', () => ({ const mockUseQuery = jest.fn(); const mockUseMutation = jest.fn(); -jest.mock('@apollo/client/react', () => ({ - ...jest.requireActual('@apollo/client/react'), - useQuery: (...args: unknown[]) => mockUseQuery(...args), - useMutation: (...args: unknown[]) => mockUseMutation(...args), -})); +jest.mock('@apollo/client/react', () => { + const actual = jest.requireActual('@apollo/client/react') as any; + return { + ...actual, + useQuery: (...args: unknown[]) => mockUseQuery(...args), + useMutation: (...args: unknown[]) => mockUseMutation(...args), + }; +}); const mockProfileUser: ProfileUser = { _id: 'user1', diff --git a/quotevote-frontend/src/app/components/LandingPage/LandingPageContent.tsx b/quotevote-frontend/src/app/components/LandingPage/LandingPageContent.tsx index 0085096..c3a31a4 100644 --- a/quotevote-frontend/src/app/components/LandingPage/LandingPageContent.tsx +++ b/quotevote-frontend/src/app/components/LandingPage/LandingPageContent.tsx @@ -1,177 +1,40 @@ 'use client'; -import React, { useEffect, useState, useRef } from 'react'; +import { useEffect } from 'react'; import Image from 'next/image'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; -import { useQuery, useMutation } from '@apollo/client/react'; -import { - Github, - Twitter, - Linkedin, - Mail, - ArrowRight, - MessageSquareQuote, - ThumbsUp, - ThumbsDown, - Zap, - ShieldOff, - Search, - FileText, - User, - CheckCircle2, - Users, - TrendingUp, - Globe, - Heart, - ChevronRight, - ChevronLeft, - Star, - MessageCircle, -} from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import { Separator } from '@/components/ui/separator'; import { useAppStore } from '@/store'; -import { SEARCH, GET_FEATURED_POSTS } from '@/graphql/queries'; -import { REQUEST_USER_ACCESS_MUTATION } from '@/graphql/mutations'; -import { useDebounce } from '@/hooks/useDebounce'; -import { toAppPostUrl } from '@/lib/utils/sanitizeUrl'; -import type { Post } from '@/types/post'; - -// ── Types ────────────────────────────────────────────────────────────────── - -interface ContentResult { - _id: string; - title: string; - text?: string; - url?: string; - groupId?: string; - creator?: { _id: string; name?: string; username?: string }; -} - -interface CreatorResult { - _id: string; - name: string; - username?: string; - avatar?: string; -} - -// ── Static data ───────────────────────────────────────────────────────────── - -const quickLinks = [ - { href: '/auths/request-access', label: 'Request Invite', external: false }, - { href: '/auths/login', label: 'Login', external: false }, - { href: 'https://opencollective.com/quotevote/donate', label: 'Donate', external: true }, - { href: 'mailto:admin@quote.vote', label: 'Volunteer', external: true }, -] as const; - -const resourceLinks = [ - { href: '/terms', label: 'Terms of Service' }, - { href: '/code-of-conduct', label: 'Code of Conduct' }, - { href: '/contributing', label: 'Contributing' }, -] as const; - -const socialLinks = [ - { href: 'https://github.com/QuoteVote/quotevote-monorepo', Icon: Github, label: 'GitHub' }, - { href: 'https://twitter.com/quotevote', Icon: Twitter, label: 'Twitter' }, - { href: 'https://linkedin.com/company/quotevote', Icon: Linkedin, label: 'LinkedIn' }, -] as const; - -const baseStats = [ - { value: '100%', label: 'Open Source', icon: Globe }, - { value: '0', label: 'Ads or trackers', icon: ShieldOff }, - { value: '∞', label: 'Community-driven', icon: Users }, -] as const; - -function scrollToSection(id: string): void { - document.getElementById(id)?.scrollIntoView({ behavior: 'smooth' }); -} - -/** Hook: returns [ref, isInView] — fires once when element enters viewport */ -function useInView(threshold = 0.15) { - const ref = useRef(null); - const [inView, setInView] = useState(false); - useEffect(() => { - const el = ref.current; - if (!el) return; - const obs = new IntersectionObserver( - ([entry]) => { if (entry?.isIntersecting) { setInView(true); obs.disconnect(); } }, - { threshold }, - ); - obs.observe(el); - return () => obs.disconnect(); - }, [threshold]); - return [ref, inView] as const; -} - -/** Scroll-reveal wrapper — fades/slides children in when scrolled into view */ -function ScrollReveal({ children, className = '', delay = 0 }: { children: React.ReactNode; className?: string; delay?: number }) { - const [ref, inView] = useInView(0.12); - return ( -
- {children} -
- ); -} - -/** Animated counter — counts up from 0 to value when visible */ -function AnimatedCounter({ value, duration = 1200 }: { value: string; duration?: number }) { - const [display, setDisplay] = useState(value); - const [counterRef, isVisible] = useInView(0.3); - const hasAnimated = useRef(false); - - useEffect(() => { - if (!isVisible || hasAnimated.current) return; - // Extract numeric portion - const match = value.match(/^([^0-9]*)(\d+)(.*)$/); - if (!match) return; - const prefix = match[1]; - const target = parseInt(match[2], 10); - const suffix = match[3]; - hasAnimated.current = true; - const start = performance.now(); - const step = (now: number) => { - const progress = Math.min((now - start) / duration, 1); - const eased = 1 - Math.pow(1 - progress, 3); // ease-out cubic - setDisplay(`${prefix}${Math.round(target * eased)}${suffix}`); - if (progress < 1) requestAnimationFrame(step); - }; - requestAnimationFrame(step); - }, [isVisible, value, duration]); - - return {display}; -} +import { Check, Clock, Code2, Users } from 'lucide-react'; interface LandingPageContentProps { totalRaised?: string; progressPct?: number; } -/** - * LandingPageContent - * - * Client component for the Quote.Vote landing page. - */ +const FEATURE_STRIP = [ + { icon: Check, bg: '#EAF6F0', iconColor: '#1AAE5A', title: 'No ads', desc: 'Your attention belongs to you.' }, + { icon: Clock, bg: '#F3F2FB', iconColor: '#7C3AED', title: 'No algorithms', desc: 'Chronological and transparent.' }, + { icon: Code2, bg: '#EEF0FF', iconColor: '#4F46E5', title: 'Open source', desc: 'Built in the open for the public good.' }, + { icon: Users, bg: '#EAF6F0', iconColor: '#1AAE5A', title: 'Everyone welcome', desc: 'Diverse views. Shared future.' }, +]; + +const COMMUNITY_CARDS = [ + { emoji: '👥', title: 'Teams & Projects', bg: '#EAF6F0' }, + { emoji: '🏫', title: 'Schools & Universities', bg: '#F3F2FB' }, + { emoji: '🤝', title: 'Organizations', bg: '#EEF0FF' }, + { emoji: '🏛️', title: 'Governments', bg: '#EAF6F0' }, + { emoji: '💚', title: 'Nonprofits & Advocacy', bg: '#F3F2FB' }, + { emoji: '👪', title: 'Parent Groups', bg: '#EEF0FF' }, +]; + export function LandingPageContent({ - totalRaised = '$500+', - progressPct = 50, + totalRaised: _totalRaised = '$500+', + progressPct: _progressPct = 50, }: LandingPageContentProps) { const router = useRouter(); const user = useAppStore((state) => state.user.data); - const stats = [ - { value: totalRaised, label: 'Raised in donations', icon: Heart }, - ...baseStats, - ]; - useEffect(() => { if (user?.id) { router.push('/dashboard/explore'); @@ -179,2067 +42,308 @@ export function LandingPageContent({ }, [user, router]); return ( -
- {/* ── Navbar ────────────────────────────────────────────── */} - - - {/* ── Hero ──────────────────────────────────────────────── */} -
- {/* Background atmosphere */} -
-
+ -
-

- No algorithms. No ads. Just conversations. -

- -

- Share Ideas.{' '} - - Vote - {' '} - on What Matters. + {/* ── Hero Section ──────────────────────────────────────── */} +
+
+

+ Better conversations build stronger communities.

- -

- An open-source, text-first platform for thoughtful dialogue. Quote, - vote, and engage in real conversations. +

+ Quote.Vote is a neutral public square for structured dialogue. Highlight what matters, vote on ideas, and find common ground across any divide.

- - - -
- - - -
- -
- {(['Open Source', 'Ad-Free', 'Community-Driven', 'No Tracking'] as const).map( - (label, i, arr) => ( - - - {label} - - {i < arr.length - 1 && ( - - )} - - ) - )} -
-
-
- - {/* ── Page Sections ──────────────────────────────────────── */} - <> - - {/* ── Stats Strip ───────────────────────────────────────── */} -
-
-
- {stats.map(({ value, label, icon: Icon }, i) => ( -
0 ? '1px solid #e2e8f0' : undefined, - paddingLeft: i > 0 ? '1.5rem' : undefined, - }} - > -
- -
- - - - - {label} - -
- ))} -
-
-
- - {/* ── Featured Posts ────────────────────────────────────── */} - - - {/* ── Mission / About ───────────────────────────────────── */} -
-
-
- {/* Left — headline */} -
-

- Our Mission -

-

- Welcome to{' '} - - Quote.Vote - -

-

- A non-profit platform where every voice counts. Donate your time or - money and be part of the change you'd like to see in the world. -

- - {/* Blockquote */} -
-

- “Thoughtful, respectful discourse leads to stronger communities and richer dialogue.” -

-
- -
- - Get Started - - - - Donate - -
-
- - {/* Right — pillars */} -
- {[ - { - emoji: '🗣️', - title: 'Freedom of Expression', - body: 'We understand the delicate balance between fostering free expression and curbing harmful behavior.', - num: '01', - }, - { - emoji: '⚖️', - title: 'Thoughtful Moderation', - body: 'Our policies maximize the benefits of free speech while minimizing potential harm for everyone.', - num: '02', - }, - { - emoji: '🤝', - title: 'Stronger Communities', - body: 'Thoughtful, respectful discourse leads to stronger communities and richer dialogue for all.', - num: '03', - }, - ].map(({ emoji, title, body, num }) => ( -
-
- - {num} - -
-
-
- - {emoji} - -

{title}

-
-

- {body} -

-
-
- ))} -
-
-
-
- - {/* ── Features — Bento Grid ─────────────────────────────── */} -
-
-
-

- Platform Features -

-

- Built for{' '} - - Meaningful - {' '} - Conversations -

+
+ + Request Invite + + + Explore Discussions +
- - {/* Bento grid */} -
- {/* Feature 01 — large */} - -
-
-
- - 01 - -
- -
-
-

Targeted Feedback

-

- Quote specific text for precise, contextual responses that keep conversations - focused and productive. No more talking past each other. -

-
-
- - - Precision quoting on any passage - -
-
-
- - {/* Feature 02 */} - -
-
-
- - 02 - -
- -
-
-

Live Chat Threads

-

- Every post spawns its own real-time discussion space for immediate, live - engagement. -

-
-
- - - Real-time public threads - -
-
-
- - {/* Feature 03 */} - -
-
-
- - 03 - -
- -
-
-

Voting Mechanics

-

- Support thoughtful discourse through democratic, transparent voting on any - quoted passage. -

+
+
+
+
-
- - - Transparent democratic voting - +
+
-
- - - {/* Feature 04 — wide */} - -
-
-
- - 04 - -
- -
-
-

Ad-Free & Algorithm-Free

-

- Pure, unmanipulated conversations — no ads, no hidden agendas, no engagement - traps. What you see is what the community actually cares about. -

+
+
-
- {['No ads', 'No tracking', 'No algorithms', 'Open source'].map((tag) => ( - - {tag} - - ))} +
+
- +

+ Join thousands of people building a better world—together. +

-
- {/* ── Product Showcase — Voting UI ──────────────────────── */} -
-
-
- {/* Text side */} -
-

- See it in action -

-

- What people{' '} - - are saying - -

-

- For a project as small as your household, or around the world, Quote.Vote - can host the next conversation in your life — and knock it out of the park. -

-
    - {[ - 'Quote any passage for targeted discussion', - 'Vote up the ideas that matter most', - 'Follow conversations in real time', - ].map((item) => ( -
  • -
    - -
    - - {item} - -
  • - ))} -
-
- - {/* Images side */} -
-
- Voting popup preview showing quote selection -
-
- Second voting popup view with vote options -
-
-
+ {/* Hero Mockup */} +
+ Product screenshot: a post card with vote counts and a reaction bubble
- {/* ── Product Showcase — At Any Time ────────────────────── */} -
-
-
-
-

- Any time, anywhere -

-

- Put your{' '} - - Quote - {' '} - to Vote -

-
- - Start sharing - -
+ {/* ── Put Specific Ideas To a Vote ──────────────────────── */} +
+
+

+ Put Specific Ideas To a Vote +

+
-
+
+ {/* Left Mockup */} +
Interface showing how to submit a quote for voting at any time
-
-
- {/* ── Product Showcase — Track Conversations ────────────── */} -
-
-
- {/* Image side — left */} -
+ {/* Right: Follow Discussions */} +
+
Dashboard showing conversation tracking and engagement metrics
- - {/* Text side — right */} -
-

- Stay informed -

-

- Track every{' '} - - Conversation - -

-

- Never lose track of a discussion. See where conversations are heading, - follow the threads that matter, and engage when it counts. -

-
    - {[ - 'See engagement and vote counts at a glance', - 'Filter by keyword, date, or people you follow', - 'Discover trending topics without algorithmic bias', - ].map((item) => ( -
  • -
    - -
    - - {item} - -
  • - ))} -
-
- {/* ── How It Works — 3 steps ────────────────────────────── */} -
-
-

- Simple by design -

-

- How it works -

-

- Three steps to joining a community built on thoughtful discourse. -

-
- {/* Connector line */} -
- - {[ - { - step: '01', - icon: FileText, - title: 'Post Your Idea', - body: 'Share a thought, plan, or topic you want feedback on. Text-first, no noise.', - }, - { - step: '02', - icon: MessageSquareQuote, - title: 'Quote & Respond', - body: 'Others quote your specific words for targeted, precise feedback.', - }, - { - step: '03', - icon: ThumbsUp, - title: 'Vote on What Matters', - body: 'The community votes on ideas democratically, transparently, without gaming.', - }, - ].map(({ step, icon: Icon, title, body }) => ( -
-
- -
- - Step {step} - -

{title}

-

- {body} -

+ {/* ── Feature Strip ──────────────────────────────────────── */} +
+
+ {FEATURE_STRIP.map((item, idx) => ( +
+
+
- ))} -
+

{item.title}

+

{item.desc}

+
+ ))}
- {/* ── Full-width CTA Banner ─────────────────────────────── */} -
- {/* Decorative large quote */} - - ” - - -
-

- Ready to join? -

-

- The future of{' '} - - thoughtful discourse - {' '} - is here. -

-

- Join a growing community of thinkers, builders, and changemakers who believe - great conversations can change the world. -

-
- - Request Invite - - - - Read our mission - + {/* ── Built for every community ──────────────────────── */} +
+
+
+
+

BUILT FOR EVERY COMMUNITY

+

Classrooms to a Global Townsquare

+

Works wherever people need to listen, deliberate, and decide together.

+
+ + Implementation Guide
-
-
- {/* ── Discover & Share — two-column ─────────────────────── */} -
-
-
-

- For everyone -

-

- Find your place in the conversation -

-
- -
- {/* Discover card */} -
-
- -
-

- Discover{' '} - - without bias - -

-

- All conversations are searchable without ads, discovered through exploration, - not algorithms. Filter by keyword, sort by interactions, or explore by date. -

-
    - {['No algorithmic curation', 'Historical event search', 'Follow-based filtering'].map( - (item) => ( -
  • - - - {item} - -
  • - ) - )} -
-
- - {/* Share card */} -
-
- +
+ {COMMUNITY_CARDS.map((card) => ( +
+
{card.emoji}
+

{card.title}

-

- Share{' '} - - your ideas - -

-

- Post to your social circle and beyond. Engage in meaningful, respectful - discussions that solve problems, challenge perspectives, or spark new ideas. -

-
    - {['Public and private circles', 'Quote-based responses', 'Democratic voting on ideas'].map( - (item) => ( -
  • - - - {item} - -
  • - ) - )} -
-
+ ))}
- {/* ── Donate ────────────────────────────────────────────── */} -
-
-
- {/* Left */} -
-

- Support the mission -

- - {/* Progress bar */} -
-
- {totalRaised} raised - - community funded - -
-
-
-
-
- -

- Join us in creating a truly open and equal community where civil conversation is - the main objective. If you fork our project, kindly consider contributing back. -

+ {/* ── Private Conversations ──────────────────────────────── */} +
+
+ {/* Left-Aligned Top Text */} +
+

+ Private conversations, add buddies by username +

+

+ Real conversations with real impact. +

+
-
- - Request Invite - - - - Donate Today - + {/* 2-Column Content */} +
+ {/* Left: Follow Discussions Text */} +
+

+ Follow Discussions +

+
+

Every post becomes a chat.

+

Keep up-to-date with your bookmarks list.

- {/* Right — impact cards */} -
- {[ - { icon: Heart, value: totalRaised, label: 'Total Raised', color: '#ef4444', bg: '#fef2f2', border: '#fecaca' }, - { icon: Users, value: '∞', label: 'Community Members', color: '#2ecc71', bg: '#f0fdf4', border: '#bbf7d0' }, - { icon: Globe, value: '100%', label: 'Open Source', color: '#0891b2', bg: '#ecfeff', border: '#a5f3fc' }, - { icon: ShieldOff, value: '0', label: 'Ads or Trackers', color: '#2ecc71', bg: '#f0fdf4', border: '#bbf7d0' }, - ].map(({ icon: Icon, value, label, color, bg, border }) => ( -
- - - {value} - - - {label} - -
- ))} + {/* Right: Image */} +
+
+ Track conversations +
- {/* ── Be in Touch ───────────────────────────────────────── */} - - - - {/* ── Footer ────────────────────────────────────────────── */} -
- {/* Top border accent */} -
- -
- {/* Logo row */} -
- - Quote.Vote Logo - - QUOTE.VOTE - - -

- Empowering thoughtful discourse through democratic, ad-free conversations. + {/* ── Donation ─────────────────────────────────────────── */} +

+
+ {/* Col 1 */} +
+

Join us in creating a truly
open and equal community.

+

+ Quote.Vote is a nonprofit, open-source platform.
Every contribution goes directly toward keeping
the service free and supporting communities.

-
- -
- {/* About */} -
-

- Company -

- - - admin@quote.vote - -
- - {/* Quick Links */} -
-

- Quick Links -

-
    - {quickLinks.map(({ href, label, external }) => ( -
  • - - {label} - -
  • - ))} -
-
- - {/* Resources */} -
-

- Resources -

-
    - {resourceLinks.map(({ href, label }) => ( -
  • - - {label} - -
  • - ))} -
+
+ Quote.Vote Globe + + Request Invite +
+
- {/* Connect */} -
-

- Connect -

-
- {socialLinks.map(({ href, Icon, label }) => ( - - - - ))} -
+ {/* Col 2 */} +
+

Please be in touch!

+
+ +
+

No spam, ever. Unsubscribe anytime.

- {/* Bottom row */} -
-

- © {new Date().getFullYear()} Quote.Vote. All rights reserved. -

-

- Made with ❤️ on Earth + {/* Col 3 */} +

+
💚
+

Help keep Quote.Vote
free for everyone.

+

+ Your donation supports development,
moderation, and hosting.

-
-
-
- -
- ); -} - -// ── Hero Search Bar ──────────────────────────────────────────────────────── - -interface HeroSearchProps { - router: ReturnType; -} - -function HeroSearch({ router }: HeroSearchProps) { - const [query, setQuery] = useState(''); - const [isOpen, setIsOpen] = useState(false); - const containerRef = useRef(null); - - const debouncedQuery = useDebounce(query, 300); - - const { data, loading, error } = useQuery<{ - posts: { entities: ContentResult[] }; - searchUser: CreatorResult[]; - }>(SEARCH, { - variables: { text: debouncedQuery }, - skip: !debouncedQuery.trim(), - }); - - const contentResults: ContentResult[] = data?.posts?.entities ?? []; - const creatorResults: CreatorResult[] = data?.searchUser ?? []; - const hasResults = contentResults.length > 0 || creatorResults.length > 0; - const showDropdown = isOpen && debouncedQuery.trim().length > 0; - - useEffect(() => { - function handleClickOutside(e: MouseEvent) { - if (containerRef.current && !containerRef.current.contains(e.target as Node)) { - setIsOpen(false); - } - } - document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside); - }, []); - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - if (query.trim()) { - setIsOpen(true); - } - }; - - const handleKeyDown = (e: React.KeyboardEvent) => { - if (e.key === 'Escape') setIsOpen(false); - }; - - const handlePostClick = (item: ContentResult) => { - setIsOpen(false); - if (item.url) { - router.push(toAppPostUrl(item.url)); - return; - } - router.push(`/dashboard/explore?q=${encodeURIComponent(item.title)}`); - }; - - const handleCreatorClick = (creator: CreatorResult) => { - setIsOpen(false); - const profileSlug = creator.username || creator._id; - router.push(`/dashboard/profile/${profileSlug}`); - }; - - return ( -
-
-
- - - { - setQuery(e.target.value); - setIsOpen(true); - }} - onFocus={() => setIsOpen(true)} - onKeyDown={handleKeyDown} - placeholder="Search topics, quotes, conversations…" - className="flex-1 bg-transparent border-none outline-none text-base px-4 py-4" - style={{ color: '#0f172a' }} - role="combobox" - aria-label="Search topics, quotes, conversations" - aria-expanded={showDropdown} - aria-controls="hero-search-listbox" - aria-autocomplete="list" - autoComplete="off" - /> - -
-
- - {showDropdown && ( -
- {loading && ( -
- {[1, 2, 3].map((i) => ( -
-
-
-
-
-
-
- ))} -
- )} - - {error && !loading && ( -
-

- Search unavailable. Please try again. -

-
- )} - - {!loading && !error && !hasResults && ( -
-

- No results for “{debouncedQuery}” -

-

Try a different search term

-
- )} - - {!loading && !error && hasResults && ( -
- {contentResults.length > 0 && ( - <> -

- Posts -

- {contentResults.slice(0, 5).map((item) => ( - - ))} - - )} - - {creatorResults.length > 0 && ( - <> -

- People -

- {creatorResults.slice(0, 3).map((creator) => ( - - ))} - - )} - -
- -
-
- )} -
- )} -
- ); -} - -// ── Featured Posts Section ───────────────────────────────────────────────── - -interface FeaturedPostsData { - featuredPosts: { - entities: Post[]; - pagination: { total_count: number; limit: number; offset: number }; - }; -} - -// Capture once at module load — stable across renders, avoids impure-render lint -const MODULE_NOW = typeof window !== 'undefined' ? Date.now() : 0; - -function FeaturedPostsSection() { - const [activeIndex, setActiveIndex] = useState(0); - const scrollRef = useRef(null); - const now = MODULE_NOW; - - const { data, loading } = useQuery(GET_FEATURED_POSTS, { - variables: { limit: 10, offset: 0 }, - fetchPolicy: 'cache-first', - errorPolicy: 'all', - }); - - const posts = data?.featuredPosts?.entities || []; - - const scrollToIndex = (index: number) => { - const container = scrollRef.current; - if (!container) return; - const cards = container.children; - if (cards[index]) { - (cards[index] as HTMLElement).scrollIntoView({ - behavior: 'smooth', - block: 'nearest', - inline: 'center', - }); - } - setActiveIndex(index); - }; - - const handlePrev = () => { - const next = Math.max(0, activeIndex - 1); - scrollToIndex(next); - }; - - const handleNext = () => { - const next = Math.min(posts.length - 1, activeIndex + 1); - scrollToIndex(next); - }; - - // Update active index on scroll - useEffect(() => { - const container = scrollRef.current; - if (!container) return; - - const handleScroll = () => { - const { scrollLeft, clientWidth } = container; - const cardWidth = clientWidth * 0.85; - const index = Math.round(scrollLeft / cardWidth); - setActiveIndex(Math.min(index, posts.length - 1)); - }; - - container.addEventListener('scroll', handleScroll, { passive: true }); - return () => container.removeEventListener('scroll', handleScroll); - }, [posts.length]); - - if (loading || posts.length === 0) return null; - - return ( -
-
- {/* Header */} -
-

- Community Highlights -

- -

- See what the community is talking about right now. -

-
- -
- {/* Navigation arrows */} - {posts.length > 1 && ( - <> - - - - )} - - {/* Scrollable card row */} -
- {posts.map((post) => ( - - ))} +
+ + Donate Today + + + Learn more about donations → +
- - {/* Dot indicators */} - {posts.length > 1 && ( -
- {posts.map((post, i) => ( -
- )}
- -
- - Join to see more and participate - -
-
-
- ); -} - -function formatTimeAgo(created: string | undefined, now: number): string { - if (!created) return ''; - const diff = now - new Date(created).getTime(); - const days = Math.floor(diff / 86400000); - if (days < 1) return 'Today'; - if (days === 1) return '1d ago'; - if (days < 30) return `${days}d ago`; - const months = Math.floor(days / 30); - return months === 1 ? '1mo ago' : `${months}mo ago`; -} - -function FeaturedPostCard({ post, timeAgo }: { post: Post; timeAgo: string }) { - const creatorName = post.creator?.name || post.creator?.username || 'Anonymous'; - const username = post.creator?.username || 'anonymous'; - const upvotes = post.upvotes ?? 0; - const downvotes = post.downvotes ?? 0; - const commentCount = post.comments?.length || 0; - const quoteCount = post.quotes?.length || 0; +
- const displayText = post.text - ? post.text.length > 200 - ? post.text.slice(0, 200) + '...' - : post.text - : ''; + {/* ── Community Strip Image ─────────────────────────────────── */} +
+ Community members +
- return ( -
-
- {/* Header: author + star badge */} -
-
- {creatorName[0]?.toUpperCase() || '?'} -
-
-

{creatorName}

-

- @{username} · {timeAgo} -

-
-
- - - Featured - + {/* ── Footer ──────────────────────────────────────── */} +
+
+ {/* Logo & Description */} +
+ + Quote.Vote logo + +

Quote.Vote
A neutral public square.
Powered by people.

-
- {/* Title */} - {post.title && ( -

- {post.title} -

- )} - - {/* Body */} - {displayText && ( -

- {displayText} -

- )} - - {/* Engagement stats */} -
-
- - - {upvotes} - -
-
- - - {downvotes} - + {/* Links */} +
+

PLATFORM

+
    +
  • Explore
  • +
  • How It Works
  • +
  • Pricing
  • +
  • FAQ
  • +
-
- - - {commentCount} - +
+

ABOUT

+
    +
  • Our Mission
  • +
  • Team
  • +
  • Blog
  • +
  • Press
  • +
-
- - - {quoteCount} - +
+

RESOURCES

+
    +
  • Docs
  • +
  • GitHub
  • +
  • Community
  • +
  • Contact
  • +
-
-
-
- ); -} - -// ── Be in Touch Section ──────────────────────────────────────────────────── - -const EMAIL_REGEX = - /^(("[\w-+\s]+")|(([\w-+]+(?:\.[\w-+]+)*)|("[\w-+\s]+")([\w-+]+(?:\.[\w-+]+)*)))(@((?:[\w-+]+\.)*\w[\w-+]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][\d]\.|1[\d]{2}\.|[\d]{1,2}\.))((25[0-5]|2[0-4][\d]|1[\d]{2}|[\d]{1,2})\.){2}(25[0-5]|2[0-4][\d]|1[\d]{2}|[\d]{1,2})\]?$)/i; - -function BeInTouchSection() { - const [email, setEmail] = useState(''); - const [errorMessage, setErrorMessage] = useState(''); - const [successMessage, setSuccessMessage] = useState(''); - const [isSubmitting, setIsSubmitting] = useState(false); - - const [requestUserAccess] = useMutation(REQUEST_USER_ACCESS_MUTATION); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setErrorMessage(''); - setSuccessMessage(''); - const trimmed = email.trim(); - - if (!EMAIL_REGEX.test(trimmed)) { - setErrorMessage('Please enter a valid email address.'); - return; - } - - setIsSubmitting(true); - try { - await requestUserAccess({ variables: { requestUserAccessInput: { email: trimmed } } }); - setSuccessMessage("Thank you for requesting access! We'll be in touch soon."); - setEmail(''); - } catch (error) { - const message = error instanceof Error ? error.message : ''; - if (message.includes('Email already exists')) { - setErrorMessage('This email is already registered.'); - } else { - setErrorMessage('Failed to submit request. Please try again.'); - } - } finally { - setIsSubmitting(false); - } - }; - - const handleEmailChange = (e: React.ChangeEvent) => { - setEmail(e.target.value); - if (errorMessage) setErrorMessage(''); - }; - - return ( -
-
-
- {/* Icon */} -
- + {/* Buttons */} +
+ + Request Invite + + + Donate +
+
-

- Please Be{' '} - in Touch! -

-

- Our team is made up of volunteer contributors from around the world. - We will send updates as we make progress.{' '} - - Your contributions, as simple as a contact or as great as a donation, everything is much appreciated. - -

- -
-
- - - -
- - {errorMessage && ( - - )} - {successMessage && ( -

- {successMessage} -

- )} -
- + {/* Copyright */} +
+
+

© 2026 Quote.Vote. All rights reserved.

+

Quote.Vote made with 💚 on Earth

+
-
-
+
+
); } diff --git a/quotevote-frontend/src/app/globals.css b/quotevote-frontend/src/app/globals.css index f5bdd89..d3a6efe 100644 --- a/quotevote-frontend/src/app/globals.css +++ b/quotevote-frontend/src/app/globals.css @@ -121,6 +121,8 @@ /* Fonts */ --font-sans: var(--font-sans, "Inter", ui-sans-serif, system-ui, sans-serif); --font-mono: ui-monospace, monospace; + --font-montserrat: var(--font-montserrat, "Montserrat", ui-sans-serif, sans-serif); + --font-roboto: var(--font-roboto, "Roboto", ui-sans-serif, sans-serif); --color-sidebar-ring: var(--sidebar-ring); --color-sidebar-border: var(--sidebar-border); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); @@ -1079,7 +1081,7 @@ body { box-shadow: var(--nb-shadow-sm) !important; } -/* DM & Group pills — rounded-full px-2 py-0.5 with bg-*/10 tint */ +/* DM & Group pills — rounded-full px-2 py-0.5 with bg-color/10 tint */ .neo-brutalism [class*="rounded-full"][class*="bg-[#52b274]/10"], .neo-brutalism [class*="rounded-full"][class*="bg-sky-500/10"] { background-color: var(--nb-yellow) !important; diff --git a/quotevote-frontend/src/app/layout.tsx b/quotevote-frontend/src/app/layout.tsx index 80d2334..1b825ac 100644 --- a/quotevote-frontend/src/app/layout.tsx +++ b/quotevote-frontend/src/app/layout.tsx @@ -1,6 +1,6 @@ import type { Metadata } from "next"; import type { ReactNode } from "react"; -import { Inter } from "next/font/google"; +import { Inter, Montserrat, Roboto } from "next/font/google"; import { Toaster } from "sonner"; import { ApolloProviderWrapper } from "@/lib/apollo"; import { ErrorBoundary } from "@/components/ErrorBoundary"; @@ -28,6 +28,8 @@ import "./globals.css"; */ const inter = Inter({ subsets: ["latin"], variable: "--font-sans" }); +const montserrat = Montserrat({ subsets: ["latin"], weight: ["700"], variable: "--font-montserrat" }); +const roboto = Roboto({ subsets: ["latin"], weight: ["700"], variable: "--font-roboto" }); export const metadata: Metadata = { title: "Quote.Vote - Text-First Platform for Thoughtful Dialogue", @@ -63,7 +65,7 @@ export default function RootLayout({ /> diff --git a/quotevote-frontend/src/components/VotingComponents/SelectionPopover.tsx b/quotevote-frontend/src/components/VotingComponents/SelectionPopover.tsx index c2a5e78..70b7c8d 100644 --- a/quotevote-frontend/src/components/VotingComponents/SelectionPopover.tsx +++ b/quotevote-frontend/src/components/VotingComponents/SelectionPopover.tsx @@ -93,7 +93,7 @@ export default function SelectionPopover({ right: 0, }) } - }, [topOffset, selectionExists]) + }, [selectionExists]) const selectionChange = useCallback(() => { const selection = window.getSelection()