@armoyu/ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/layout.d.ts +7 -0
- package/dist/app/layout.d.ts.map +1 -0
- package/dist/app/layout.js +31 -0
- package/dist/app/layout.js.map +1 -0
- package/dist/app/page.d.ts +2 -0
- package/dist/app/page.d.ts.map +1 -0
- package/dist/app/page.js +40 -0
- package/dist/app/page.js.map +1 -0
- package/dist/components/Button.d.ts +8 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +16 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/GenderStatsBar.d.ts +6 -0
- package/dist/components/GenderStatsBar.d.ts.map +1 -0
- package/dist/components/GenderStatsBar.js +8 -0
- package/dist/components/GenderStatsBar.js.map +1 -0
- package/dist/components/RollingNumber.d.ts +7 -0
- package/dist/components/RollingNumber.d.ts.map +1 -0
- package/dist/components/RollingNumber.js +24 -0
- package/dist/components/RollingNumber.js.map +1 -0
- package/dist/components/Slider.d.ts +11 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Slider.js +36 -0
- package/dist/components/Slider.js.map +1 -0
- package/dist/components/StatsGrid.d.ts +6 -0
- package/dist/components/StatsGrid.d.ts.map +1 -0
- package/dist/components/StatsGrid.js +14 -0
- package/dist/components/StatsGrid.js.map +1 -0
- package/dist/components/ViewModeToggle.d.ts +8 -0
- package/dist/components/ViewModeToggle.d.ts.map +1 -0
- package/dist/components/ViewModeToggle.js +10 -0
- package/dist/components/ViewModeToggle.js.map +1 -0
- package/dist/components/modules/auth/Dashboard.d.ts +2 -0
- package/dist/components/modules/auth/Dashboard.d.ts.map +1 -0
- package/dist/components/modules/auth/Dashboard.js +251 -0
- package/dist/components/modules/auth/Dashboard.js.map +1 -0
- package/dist/components/modules/auth/MediaLightbox.d.ts +14 -0
- package/dist/components/modules/auth/MediaLightbox.d.ts.map +1 -0
- package/dist/components/modules/auth/MediaLightbox.js +47 -0
- package/dist/components/modules/auth/MediaLightbox.js.map +1 -0
- package/dist/components/modules/auth/PostCard.d.ts +25 -0
- package/dist/components/modules/auth/PostCard.d.ts.map +1 -0
- package/dist/components/modules/auth/PostCard.js +113 -0
- package/dist/components/modules/auth/PostCard.js.map +1 -0
- package/dist/components/modules/auth/PostInteractionsModal.d.ts +12 -0
- package/dist/components/modules/auth/PostInteractionsModal.d.ts.map +1 -0
- package/dist/components/modules/auth/PostInteractionsModal.js +13 -0
- package/dist/components/modules/auth/PostInteractionsModal.js.map +1 -0
- package/dist/components/modules/auth/RepostModal.d.ts +22 -0
- package/dist/components/modules/auth/RepostModal.d.ts.map +1 -0
- package/dist/components/modules/auth/RepostModal.js +76 -0
- package/dist/components/modules/auth/RepostModal.js.map +1 -0
- package/dist/components/modules/auth/SidebarLeft.d.ts +2 -0
- package/dist/components/modules/auth/SidebarLeft.d.ts.map +1 -0
- package/dist/components/modules/auth/SidebarLeft.js +41 -0
- package/dist/components/modules/auth/SidebarLeft.js.map +1 -0
- package/dist/components/modules/auth/Stories.d.ts +2 -0
- package/dist/components/modules/auth/Stories.d.ts.map +1 -0
- package/dist/components/modules/auth/Stories.js +16 -0
- package/dist/components/modules/auth/Stories.js.map +1 -0
- package/dist/components/modules/auth/StoryViewer.d.ts +10 -0
- package/dist/components/modules/auth/StoryViewer.d.ts.map +1 -0
- package/dist/components/modules/auth/StoryViewer.js +48 -0
- package/dist/components/modules/auth/StoryViewer.js.map +1 -0
- package/dist/components/modules/chat/ChatContainer.d.ts +2 -0
- package/dist/components/modules/chat/ChatContainer.d.ts.map +1 -0
- package/dist/components/modules/chat/ChatContainer.js +197 -0
- package/dist/components/modules/chat/ChatContainer.js.map +1 -0
- package/dist/components/modules/chat/ChatInput.d.ts +5 -0
- package/dist/components/modules/chat/ChatInput.d.ts.map +1 -0
- package/dist/components/modules/chat/ChatInput.js +31 -0
- package/dist/components/modules/chat/ChatInput.js.map +1 -0
- package/dist/components/modules/chat/ChatList.d.ts +7 -0
- package/dist/components/modules/chat/ChatList.d.ts.map +1 -0
- package/dist/components/modules/chat/ChatList.js +52 -0
- package/dist/components/modules/chat/ChatList.js.map +1 -0
- package/dist/components/modules/chat/ChatMessage.d.ts +12 -0
- package/dist/components/modules/chat/ChatMessage.d.ts.map +1 -0
- package/dist/components/modules/chat/ChatMessage.js +7 -0
- package/dist/components/modules/chat/ChatMessage.js.map +1 -0
- package/dist/components/modules/chat/ChatNotes.d.ts +2 -0
- package/dist/components/modules/chat/ChatNotes.d.ts.map +1 -0
- package/dist/components/modules/chat/ChatNotes.js +12 -0
- package/dist/components/modules/chat/ChatNotes.js.map +1 -0
- package/dist/components/modules/community/GroupHeader.d.ts +11 -0
- package/dist/components/modules/community/GroupHeader.d.ts.map +1 -0
- package/dist/components/modules/community/GroupHeader.js +18 -0
- package/dist/components/modules/community/GroupHeader.js.map +1 -0
- package/dist/components/modules/community/GroupMenu.d.ts +10 -0
- package/dist/components/modules/community/GroupMenu.d.ts.map +1 -0
- package/dist/components/modules/community/GroupMenu.js +17 -0
- package/dist/components/modules/community/GroupMenu.js.map +1 -0
- package/dist/components/modules/community/SchoolCard.d.ts +7 -0
- package/dist/components/modules/community/SchoolCard.d.ts.map +1 -0
- package/dist/components/modules/community/SchoolCard.js +8 -0
- package/dist/components/modules/community/SchoolCard.js.map +1 -0
- package/dist/components/modules/community/SurveyCard.d.ts +7 -0
- package/dist/components/modules/community/SurveyCard.d.ts.map +1 -0
- package/dist/components/modules/community/SurveyCard.js +38 -0
- package/dist/components/modules/community/SurveyCard.js.map +1 -0
- package/dist/components/modules/forum/ForumBoard.d.ts +17 -0
- package/dist/components/modules/forum/ForumBoard.d.ts.map +1 -0
- package/dist/components/modules/forum/ForumBoard.js +7 -0
- package/dist/components/modules/forum/ForumBoard.js.map +1 -0
- package/dist/components/modules/forum/ForumPost.d.ts +14 -0
- package/dist/components/modules/forum/ForumPost.d.ts.map +1 -0
- package/dist/components/modules/forum/ForumPost.js +6 -0
- package/dist/components/modules/forum/ForumPost.js.map +1 -0
- package/dist/components/modules/forum/NewTopicModal.d.ts +8 -0
- package/dist/components/modules/forum/NewTopicModal.d.ts.map +1 -0
- package/dist/components/modules/forum/NewTopicModal.js +27 -0
- package/dist/components/modules/forum/NewTopicModal.js.map +1 -0
- package/dist/components/modules/forum/TopicItem.d.ts +16 -0
- package/dist/components/modules/forum/TopicItem.d.ts.map +1 -0
- package/dist/components/modules/forum/TopicItem.js +7 -0
- package/dist/components/modules/forum/TopicItem.js.map +1 -0
- package/dist/components/modules/galleries/GalleryCard.d.ts +10 -0
- package/dist/components/modules/galleries/GalleryCard.d.ts.map +1 -0
- package/dist/components/modules/galleries/GalleryCard.js +6 -0
- package/dist/components/modules/galleries/GalleryCard.js.map +1 -0
- package/dist/components/modules/giveaways/GiveawayCard.d.ts +10 -0
- package/dist/components/modules/giveaways/GiveawayCard.d.ts.map +1 -0
- package/dist/components/modules/giveaways/GiveawayCard.js +7 -0
- package/dist/components/modules/giveaways/GiveawayCard.js.map +1 -0
- package/dist/components/modules/groups/ApplicationModal.d.ts +8 -0
- package/dist/components/modules/groups/ApplicationModal.d.ts.map +1 -0
- package/dist/components/modules/groups/ApplicationModal.js +28 -0
- package/dist/components/modules/groups/ApplicationModal.js.map +1 -0
- package/dist/components/modules/groups/GroupCard.d.ts +13 -0
- package/dist/components/modules/groups/GroupCard.d.ts.map +1 -0
- package/dist/components/modules/groups/GroupCard.js +7 -0
- package/dist/components/modules/groups/GroupCard.js.map +1 -0
- package/dist/components/modules/guest/Introduction.d.ts +2 -0
- package/dist/components/modules/guest/Introduction.d.ts.map +1 -0
- package/dist/components/modules/guest/Introduction.js +14 -0
- package/dist/components/modules/guest/Introduction.js.map +1 -0
- package/dist/components/modules/magaza/BackToStore.d.ts +2 -0
- package/dist/components/modules/magaza/BackToStore.d.ts.map +1 -0
- package/dist/components/modules/magaza/BackToStore.js +11 -0
- package/dist/components/modules/magaza/BackToStore.js.map +1 -0
- package/dist/components/modules/magaza/StoreHeader.d.ts +6 -0
- package/dist/components/modules/magaza/StoreHeader.d.ts.map +1 -0
- package/dist/components/modules/magaza/StoreHeader.js +9 -0
- package/dist/components/modules/magaza/StoreHeader.js.map +1 -0
- package/dist/components/modules/news/NewsCard.d.ts +12 -0
- package/dist/components/modules/news/NewsCard.d.ts.map +1 -0
- package/dist/components/modules/news/NewsCard.js +7 -0
- package/dist/components/modules/news/NewsCard.js.map +1 -0
- package/dist/components/modules/news/NewsComments.d.ts +2 -0
- package/dist/components/modules/news/NewsComments.d.ts.map +1 -0
- package/dist/components/modules/news/NewsComments.js +53 -0
- package/dist/components/modules/news/NewsComments.js.map +1 -0
- package/dist/components/modules/profile/CloudStorageModal.d.ts +9 -0
- package/dist/components/modules/profile/CloudStorageModal.d.ts.map +1 -0
- package/dist/components/modules/profile/CloudStorageModal.js +32 -0
- package/dist/components/modules/profile/CloudStorageModal.js.map +1 -0
- package/dist/components/modules/profile/EditProfileModal.d.ts +9 -0
- package/dist/components/modules/profile/EditProfileModal.d.ts.map +1 -0
- package/dist/components/modules/profile/EditProfileModal.js +28 -0
- package/dist/components/modules/profile/EditProfileModal.js.map +1 -0
- package/dist/components/modules/profile/ProfileContent.d.ts +5 -0
- package/dist/components/modules/profile/ProfileContent.d.ts.map +1 -0
- package/dist/components/modules/profile/ProfileContent.js +71 -0
- package/dist/components/modules/profile/ProfileContent.js.map +1 -0
- package/dist/components/modules/profile/ProfileHeader.d.ts +8 -0
- package/dist/components/modules/profile/ProfileHeader.d.ts.map +1 -0
- package/dist/components/modules/profile/ProfileHeader.js +20 -0
- package/dist/components/modules/profile/ProfileHeader.js.map +1 -0
- package/dist/components/modules/profile/ProfileStats.d.ts +2 -0
- package/dist/components/modules/profile/ProfileStats.d.ts.map +1 -0
- package/dist/components/modules/profile/ProfileStats.js +15 -0
- package/dist/components/modules/profile/ProfileStats.js.map +1 -0
- package/dist/components/modules/profile/TeamSelectorModal.d.ts +11 -0
- package/dist/components/modules/profile/TeamSelectorModal.d.ts.map +1 -0
- package/dist/components/modules/profile/TeamSelectorModal.js +17 -0
- package/dist/components/modules/profile/TeamSelectorModal.js.map +1 -0
- package/dist/components/modules/stations/StationCard.d.ts +3 -0
- package/dist/components/modules/stations/StationCard.d.ts.map +1 -0
- package/dist/components/modules/stations/StationCard.js +26 -0
- package/dist/components/modules/stations/StationCard.js.map +1 -0
- package/dist/components/modules/stations/StationQRModal.d.ts +10 -0
- package/dist/components/modules/stations/StationQRModal.d.ts.map +1 -0
- package/dist/components/modules/stations/StationQRModal.js +13 -0
- package/dist/components/modules/stations/StationQRModal.js.map +1 -0
- package/dist/components/shared/FloatingChatButton.d.ts +5 -0
- package/dist/components/shared/FloatingChatButton.d.ts.map +1 -0
- package/dist/components/shared/FloatingChatButton.js +21 -0
- package/dist/components/shared/FloatingChatButton.js.map +1 -0
- package/dist/components/shared/Footer.d.ts +2 -0
- package/dist/components/shared/Footer.d.ts.map +1 -0
- package/dist/components/shared/Footer.js +10 -0
- package/dist/components/shared/Footer.js.map +1 -0
- package/dist/components/shared/Header.d.ts +2 -0
- package/dist/components/shared/Header.d.ts.map +1 -0
- package/dist/components/shared/Header.js +98 -0
- package/dist/components/shared/Header.js.map +1 -0
- package/dist/components/shared/LoginModal.d.ts +5 -0
- package/dist/components/shared/LoginModal.d.ts.map +1 -0
- package/dist/components/shared/LoginModal.js +70 -0
- package/dist/components/shared/LoginModal.js.map +1 -0
- package/dist/components/shared/MainLayoutWrapper.d.ts +4 -0
- package/dist/components/shared/MainLayoutWrapper.d.ts.map +1 -0
- package/dist/components/shared/MainLayoutWrapper.js +8 -0
- package/dist/components/shared/MainLayoutWrapper.js.map +1 -0
- package/dist/components/shared/PageWidth.d.ts +6 -0
- package/dist/components/shared/PageWidth.d.ts.map +1 -0
- package/dist/components/shared/PageWidth.js +14 -0
- package/dist/components/shared/PageWidth.js.map +1 -0
- package/dist/components/showcase/CommunityTab.d.ts +2 -0
- package/dist/components/showcase/CommunityTab.d.ts.map +1 -0
- package/dist/components/showcase/CommunityTab.js +6 -0
- package/dist/components/showcase/CommunityTab.js.map +1 -0
- package/dist/components/showcase/CorporateTab.d.ts +2 -0
- package/dist/components/showcase/CorporateTab.d.ts.map +1 -0
- package/dist/components/showcase/CorporateTab.js +6 -0
- package/dist/components/showcase/CorporateTab.js.map +1 -0
- package/dist/components/showcase/GeneralTab.d.ts +2 -0
- package/dist/components/showcase/GeneralTab.d.ts.map +1 -0
- package/dist/components/showcase/GeneralTab.js +6 -0
- package/dist/components/showcase/GeneralTab.js.map +1 -0
- package/dist/components/showcase/MessagesTab.d.ts +2 -0
- package/dist/components/showcase/MessagesTab.d.ts.map +1 -0
- package/dist/components/showcase/MessagesTab.js +6 -0
- package/dist/components/showcase/MessagesTab.js.map +1 -0
- package/dist/components/showcase/ProfileTab.d.ts +2 -0
- package/dist/components/showcase/ProfileTab.d.ts.map +1 -0
- package/dist/components/showcase/ProfileTab.js +7 -0
- package/dist/components/showcase/ProfileTab.js.map +1 -0
- package/dist/components/showcase/ShopTab.d.ts +2 -0
- package/dist/components/showcase/ShopTab.d.ts.map +1 -0
- package/dist/components/showcase/ShopTab.js +6 -0
- package/dist/components/showcase/ShopTab.js.map +1 -0
- package/dist/components/showcase/SocialTab.d.ts +2 -0
- package/dist/components/showcase/SocialTab.d.ts.map +1 -0
- package/dist/components/showcase/SocialTab.js +7 -0
- package/dist/components/showcase/SocialTab.js.map +1 -0
- package/dist/context/AuthContext.d.ts +19 -0
- package/dist/context/AuthContext.d.ts.map +1 -0
- package/dist/context/AuthContext.js +75 -0
- package/dist/context/AuthContext.js.map +1 -0
- package/dist/context/CartContext.d.ts +17 -0
- package/dist/context/CartContext.d.ts.map +1 -0
- package/dist/context/CartContext.js +64 -0
- package/dist/context/CartContext.js.map +1 -0
- package/dist/context/ChatContext.d.ts +13 -0
- package/dist/context/ChatContext.d.ts.map +1 -0
- package/dist/context/ChatContext.js +18 -0
- package/dist/context/ChatContext.js.map +1 -0
- package/dist/context/LayoutContext.d.ts +11 -0
- package/dist/context/LayoutContext.d.ts.map +1 -0
- package/dist/context/LayoutContext.js +17 -0
- package/dist/context/LayoutContext.js.map +1 -0
- package/dist/context/SocketContext.d.ts +13 -0
- package/dist/context/SocketContext.d.ts.map +1 -0
- package/dist/context/SocketContext.js +31 -0
- package/dist/context/SocketContext.js.map +1 -0
- package/dist/context/ThemeContext.d.ts +11 -0
- package/dist/context/ThemeContext.d.ts.map +1 -0
- package/dist/context/ThemeContext.js +40 -0
- package/dist/context/ThemeContext.js.map +1 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/constants/educationData.d.ts +8 -0
- package/dist/lib/constants/educationData.d.ts.map +1 -0
- package/dist/lib/constants/educationData.js +118 -0
- package/dist/lib/constants/educationData.js.map +1 -0
- package/dist/lib/constants/punishmentData.d.ts +30 -0
- package/dist/lib/constants/punishmentData.d.ts.map +1 -0
- package/dist/lib/constants/punishmentData.js +184 -0
- package/dist/lib/constants/punishmentData.js.map +1 -0
- package/dist/lib/constants/seedData.d.ts +165 -0
- package/dist/lib/constants/seedData.d.ts.map +1 -0
- package/dist/lib/constants/seedData.js +709 -0
- package/dist/lib/constants/seedData.js.map +1 -0
- package/dist/lib/constants/stationData.d.ts +14 -0
- package/dist/lib/constants/stationData.d.ts.map +1 -0
- package/dist/lib/constants/stationData.js +167 -0
- package/dist/lib/constants/stationData.js.map +1 -0
- package/dist/lib/constants/surveyData.d.ts +3 -0
- package/dist/lib/constants/surveyData.d.ts.map +1 -0
- package/dist/lib/constants/surveyData.js +50 -0
- package/dist/lib/constants/surveyData.js.map +1 -0
- package/dist/lib/constants/teamData.d.ts +13 -0
- package/dist/lib/constants/teamData.d.ts.map +1 -0
- package/dist/lib/constants/teamData.js +66 -0
- package/dist/lib/constants/teamData.js.map +1 -0
- package/dist/lib/utils/numberFormat.d.ts +10 -0
- package/dist/lib/utils/numberFormat.d.ts.map +1 -0
- package/dist/lib/utils/numberFormat.js +17 -0
- package/dist/lib/utils/numberFormat.js.map +1 -0
- package/dist/lib/utils/odpUtils.d.ts +16 -0
- package/dist/lib/utils/odpUtils.d.ts.map +1 -0
- package/dist/lib/utils/odpUtils.js +44 -0
- package/dist/lib/utils/odpUtils.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/stats.d.ts +18 -0
- package/dist/types/stats.d.ts.map +1 -0
- package/dist/types/stats.js +2 -0
- package/dist/types/stats.js.map +1 -0
- package/next.config.ts +13 -0
- package/package.json +46 -0
- package/postcss.config.js +6 -0
- package/src/app/layout.tsx +64 -0
- package/src/app/page.tsx +101 -0
- package/src/components/Button.tsx +41 -0
- package/src/components/GenderStatsBar.tsx +66 -0
- package/src/components/RollingNumber.tsx +50 -0
- package/src/components/Slider.tsx +114 -0
- package/src/components/StatsGrid.tsx +35 -0
- package/src/components/ViewModeToggle.tsx +39 -0
- package/src/components/modules/auth/Dashboard.tsx +649 -0
- package/src/components/modules/auth/MediaLightbox.tsx +112 -0
- package/src/components/modules/auth/PostCard.tsx +556 -0
- package/src/components/modules/auth/PostInteractionsModal.tsx +138 -0
- package/src/components/modules/auth/RepostModal.tsx +167 -0
- package/src/components/modules/auth/SidebarLeft.tsx +237 -0
- package/src/components/modules/auth/Stories.tsx +69 -0
- package/src/components/modules/auth/StoryViewer.tsx +146 -0
- package/src/components/modules/chat/ChatContainer.tsx +332 -0
- package/src/components/modules/chat/ChatInput.tsx +57 -0
- package/src/components/modules/chat/ChatList.tsx +179 -0
- package/src/components/modules/chat/ChatMessage.tsx +43 -0
- package/src/components/modules/chat/ChatNotes.tsx +58 -0
- package/src/components/modules/community/GroupHeader.tsx +111 -0
- package/src/components/modules/community/GroupMenu.tsx +82 -0
- package/src/components/modules/community/SchoolCard.tsx +104 -0
- package/src/components/modules/community/SurveyCard.tsx +149 -0
- package/src/components/modules/forum/ForumBoard.tsx +78 -0
- package/src/components/modules/forum/ForumPost.tsx +71 -0
- package/src/components/modules/forum/NewTopicModal.tsx +112 -0
- package/src/components/modules/forum/TopicItem.tsx +72 -0
- package/src/components/modules/galleries/GalleryCard.tsx +66 -0
- package/src/components/modules/giveaways/GiveawayCard.tsx +76 -0
- package/src/components/modules/groups/ApplicationModal.tsx +133 -0
- package/src/components/modules/groups/GroupCard.tsx +96 -0
- package/src/components/modules/guest/Introduction.tsx +60 -0
- package/src/components/modules/magaza/BackToStore.tsx +53 -0
- package/src/components/modules/magaza/StoreHeader.tsx +74 -0
- package/src/components/modules/news/NewsCard.tsx +66 -0
- package/src/components/modules/news/NewsComments.tsx +141 -0
- package/src/components/modules/profile/CloudStorageModal.tsx +200 -0
- package/src/components/modules/profile/EditProfileModal.tsx +191 -0
- package/src/components/modules/profile/ProfileContent.tsx +491 -0
- package/src/components/modules/profile/ProfileHeader.tsx +128 -0
- package/src/components/modules/profile/ProfileStats.tsx +72 -0
- package/src/components/modules/profile/TeamSelectorModal.tsx +129 -0
- package/src/components/modules/stations/StationCard.tsx +95 -0
- package/src/components/modules/stations/StationQRModal.tsx +102 -0
- package/src/components/shared/FloatingChatButton.tsx +57 -0
- package/src/components/shared/Footer.tsx +77 -0
- package/src/components/shared/Header.tsx +799 -0
- package/src/components/shared/LoginModal.tsx +208 -0
- package/src/components/shared/MainLayoutWrapper.tsx +15 -0
- package/src/components/shared/PageWidth.tsx +22 -0
- package/src/components/showcase/CommunityTab.tsx +22 -0
- package/src/components/showcase/CorporateTab.tsx +38 -0
- package/src/components/showcase/GeneralTab.tsx +41 -0
- package/src/components/showcase/MessagesTab.tsx +26 -0
- package/src/components/showcase/ProfileTab.tsx +20 -0
- package/src/components/showcase/ShopTab.tsx +24 -0
- package/src/components/showcase/SocialTab.tsx +28 -0
- package/src/context/AuthContext.tsx +104 -0
- package/src/context/CartContext.tsx +93 -0
- package/src/context/ChatContext.tsx +32 -0
- package/src/context/LayoutContext.tsx +29 -0
- package/src/context/SocketContext.tsx +50 -0
- package/src/context/ThemeContext.tsx +52 -0
- package/src/globals.css +187 -0
- package/src/index.ts +96 -0
- package/src/lib/constants/educationData.ts +124 -0
- package/src/lib/constants/punishmentData.ts +201 -0
- package/src/lib/constants/seedData.ts +758 -0
- package/src/lib/constants/stationData.ts +170 -0
- package/src/lib/constants/surveyData.ts +53 -0
- package/src/lib/constants/teamData.ts +69 -0
- package/src/lib/utils/numberFormat.ts +16 -0
- package/src/lib/utils/odpUtils.ts +51 -0
- package/src/types/index.ts +1 -0
- package/src/types/stats.ts +17 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { useChat } from '../../../context/ChatContext';
|
|
2
|
+
import { useSocket } from '../../../context/SocketContext';
|
|
3
|
+
import { ChatNotes } from './ChatNotes';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { Chat } from '@armoyu/core';
|
|
6
|
+
|
|
7
|
+
import { userList } from '../../../lib/constants/seedData';
|
|
8
|
+
import { useAuth } from '../../../context/AuthContext';
|
|
9
|
+
|
|
10
|
+
export function ChatList({ contacts, activeId, onSelect }: { contacts: Chat[], activeId: string, onSelect: (id: string) => void }) {
|
|
11
|
+
const { user } = useAuth();
|
|
12
|
+
const { closeChat } = useChat();
|
|
13
|
+
const { isConnected } = useSocket();
|
|
14
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
15
|
+
const [activeFilter, setActiveFilter] = useState<'all' | 'unread' | 'favorites' | 'groups'>('all');
|
|
16
|
+
|
|
17
|
+
const filteredActiveContacts = contacts
|
|
18
|
+
.filter(c => {
|
|
19
|
+
// 1. Search Query Filter
|
|
20
|
+
const matchesSearch = c.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
21
|
+
(c.lastMessage?.content || '').toLowerCase().includes(searchQuery.toLowerCase());
|
|
22
|
+
if (!matchesSearch) return false;
|
|
23
|
+
|
|
24
|
+
// 2. Category Filter
|
|
25
|
+
if (activeFilter === 'unread') return c.unreadCount > 0;
|
|
26
|
+
if (activeFilter === 'favorites') return c.isFavorite;
|
|
27
|
+
if (activeFilter === 'groups') return c.isGroup;
|
|
28
|
+
|
|
29
|
+
return true; // 'all'
|
|
30
|
+
})
|
|
31
|
+
.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0));
|
|
32
|
+
|
|
33
|
+
// 3. New Contact Search (Only when searching)
|
|
34
|
+
const additionalContacts = searchQuery.length >= 2
|
|
35
|
+
? userList.filter((u: any) => {
|
|
36
|
+
const matchesSearch = u.displayName.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
37
|
+
u.username.toLowerCase().includes(searchQuery.toLowerCase());
|
|
38
|
+
const isNotSelf = u.username !== user?.username;
|
|
39
|
+
const notInContacts = !contacts.some(c => c.id === u.username);
|
|
40
|
+
return matchesSearch && isNotSelf && notInContacts;
|
|
41
|
+
}).slice(0, 10)
|
|
42
|
+
: [];
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<div className="w-full h-full flex flex-col bg-armoyu-bg border-r border-gray-200 dark:border-white/5">
|
|
46
|
+
{/* Arama ve Başlık */}
|
|
47
|
+
<div className="p-4 md:p-5 border-b border-gray-200 dark:border-white/5">
|
|
48
|
+
<div className="flex justify-between items-center">
|
|
49
|
+
<div className="flex items-center gap-2">
|
|
50
|
+
<h2 className="text-xl font-bold text-armoyu-text tracking-tight flex items-center gap-2">
|
|
51
|
+
Sohbetler
|
|
52
|
+
</h2>
|
|
53
|
+
<div className="flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-black/5 dark:bg-white/5 border border-black/5 dark:border-white/5">
|
|
54
|
+
<div className={`w-1.5 h-1.5 rounded-full ${isConnected ? 'bg-emerald-500 shadow-[0_0_5px_rgba(16,185,129,0.8)]' : 'bg-red-500'} animate-pulse`} />
|
|
55
|
+
<span className="text-[10px] font-black text-armoyu-text-muted uppercase tracking-tighter">{isConnected ? 'Sockete Bağlı' : 'Bağlanıyor...'}</span>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
<button onClick={closeChat} className="p-2 -mr-2 text-armoyu-text-muted hover:text-red-500 hover:bg-red-500/10 transition-colors rounded-full" title="Sohbeti Kapat">
|
|
59
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
|
|
60
|
+
</button>
|
|
61
|
+
</div>
|
|
62
|
+
<div className="relative mt-4">
|
|
63
|
+
<svg xmlns="http://www.w3.org/2000/svg" className="absolute left-3 top-1/2 -translate-y-1/2 text-gray-500" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg>
|
|
64
|
+
<input
|
|
65
|
+
type="text"
|
|
66
|
+
placeholder="Kişi ara..."
|
|
67
|
+
value={searchQuery}
|
|
68
|
+
onChange={(e) => setSearchQuery(e.target.value)}
|
|
69
|
+
className="w-full bg-white/5 dark:bg-black/20 border border-black/10 dark:border-white/10 rounded-xl pl-10 pr-4 py-2.5 text-sm text-slate-900 dark:text-white placeholder-gray-500 hover:border-black/20 dark:hover:border-white/20 focus:outline-none focus:border-blue-500 transition-all"
|
|
70
|
+
/>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
{/* Instagram Stil Notlar Kısmı */}
|
|
75
|
+
<ChatNotes />
|
|
76
|
+
|
|
77
|
+
{/* Kategori Filtreleri */}
|
|
78
|
+
<div className="px-4 pb-4 flex gap-2 overflow-x-auto no-scrollbar shrink-0">
|
|
79
|
+
{[
|
|
80
|
+
{ id: 'all', label: 'Tümü' },
|
|
81
|
+
{ id: 'unread', label: 'Okunmamış' },
|
|
82
|
+
{ id: 'favorites', label: 'Favoriler' },
|
|
83
|
+
{ id: 'groups', label: 'Gruplar' }
|
|
84
|
+
].map((filter) => (
|
|
85
|
+
<button
|
|
86
|
+
key={filter.id}
|
|
87
|
+
onClick={() => setActiveFilter(filter.id as any)}
|
|
88
|
+
className={`px-4 py-2 rounded-xl text-xs font-black transition-all whitespace-nowrap border ${
|
|
89
|
+
activeFilter === filter.id
|
|
90
|
+
? 'bg-blue-500 text-white border-blue-500 shadow-md shadow-blue-500/20 scale-105'
|
|
91
|
+
: 'bg-black/5 dark:bg-white/5 text-armoyu-text-muted border-transparent hover:bg-black/10 dark:hover:bg-white/10'
|
|
92
|
+
}`}
|
|
93
|
+
>
|
|
94
|
+
{filter.label}
|
|
95
|
+
</button>
|
|
96
|
+
))}
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
{/* Kullanıcı Listesi */}
|
|
100
|
+
<div className="flex-1 overflow-y-auto no-scrollbar p-3 space-y-1.5">
|
|
101
|
+
{/* Active Conversations Container */}
|
|
102
|
+
<div className="space-y-1.5">
|
|
103
|
+
{searchQuery.length > 0 && filteredActiveContacts.length > 0 && (
|
|
104
|
+
<div className="px-3 py-1 text-[10px] font-black text-armoyu-text-muted uppercase tracking-[0.2em] opacity-50">Sohbet Geçmişi</div>
|
|
105
|
+
)}
|
|
106
|
+
{filteredActiveContacts.map(c => (
|
|
107
|
+
<button
|
|
108
|
+
key={c.id}
|
|
109
|
+
onClick={() => onSelect(c.id)}
|
|
110
|
+
className={`w-full flex items-center gap-4 p-3 rounded-2xl transition-all cursor-pointer text-left ${
|
|
111
|
+
activeId === c.id
|
|
112
|
+
? 'bg-blue-500/10 dark:bg-blue-500/20 border border-blue-500/20 shadow-inner'
|
|
113
|
+
: 'hover:bg-black/5 dark:hover:bg-white/5 border border-transparent'
|
|
114
|
+
}`}
|
|
115
|
+
>
|
|
116
|
+
{/* Avatar Durumu */}
|
|
117
|
+
<div className="relative shrink-0">
|
|
118
|
+
<img src={c.avatar} alt={c.name} className="w-12 h-12 rounded-full object-cover border border-white/10 shadow-sm" />
|
|
119
|
+
{c.isOnline && (
|
|
120
|
+
<div className="absolute -bottom-0.5 -right-0.5 w-3.5 h-3.5 bg-green-500 rounded-full border-2 border-white dark:border-[#0a0a0e] shadow-sm" />
|
|
121
|
+
)}
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
{/* Kişi Bilgisi */}
|
|
125
|
+
<div className="flex-1 overflow-hidden">
|
|
126
|
+
<div className="flex justify-between items-center mb-1">
|
|
127
|
+
<span className="font-black text-slate-900 dark:text-gray-200 text-sm truncate max-w-[130px]">{c.name}</span>
|
|
128
|
+
<span className="text-xs text-gray-500 font-black">{c.time}</span>
|
|
129
|
+
</div>
|
|
130
|
+
<div className="flex justify-between items-center">
|
|
131
|
+
<span className={`text-xs truncate max-w-[120px] font-bold ${c.unreadCount > 0 ? 'text-slate-950 dark:text-white' : 'text-slate-500'}`}>
|
|
132
|
+
{c.lastMessage?.content || 'Mesaj yok'}
|
|
133
|
+
</span>
|
|
134
|
+
{c.unreadCount > 0 && (
|
|
135
|
+
<span className="bg-blue-500 text-white text-[10px] font-black px-1.5 py-0.5 rounded-md leading-none shadow-md animate-in zoom-in duration-300">
|
|
136
|
+
{c.unreadCount > 9 ? '9+' : c.unreadCount}
|
|
137
|
+
</span>
|
|
138
|
+
)}
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</button>
|
|
142
|
+
))}
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
{/* New Contact Search Results */}
|
|
146
|
+
{additionalContacts.length > 0 && (
|
|
147
|
+
<div className="space-y-1.5 mt-6 animate-in fade-in slide-in-from-top-2 duration-500">
|
|
148
|
+
<div className="px-3 py-1 text-[10px] font-black text-blue-500 uppercase tracking-[0.2em]">Yeni Sohbet Başlat</div>
|
|
149
|
+
{additionalContacts.map((u: any) => (
|
|
150
|
+
<button
|
|
151
|
+
key={u.username}
|
|
152
|
+
onClick={() => onSelect(u.username)}
|
|
153
|
+
className="w-full flex items-center gap-4 p-3 rounded-2xl hover:bg-white/5 border border-transparent transition-all group"
|
|
154
|
+
>
|
|
155
|
+
<div className="relative shrink-0">
|
|
156
|
+
<img src={u.avatar} alt={u.displayName} className="w-12 h-12 rounded-full object-cover border border-white/10 shadow-sm opacity-60 group-hover:opacity-100 transition-opacity" />
|
|
157
|
+
</div>
|
|
158
|
+
<div className="flex-1 min-w-0">
|
|
159
|
+
<div className="font-black text-slate-900 dark:text-gray-200 text-sm truncate">{u.displayName}</div>
|
|
160
|
+
<div className="text-[10px] font-bold text-armoyu-text-muted uppercase tracking-tighter">@{u.username}</div>
|
|
161
|
+
</div>
|
|
162
|
+
<div className="w-8 h-8 rounded-full bg-blue-500/10 flex items-center justify-center text-blue-500 scale-0 group-hover:scale-100 transition-all duration-300">
|
|
163
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>
|
|
164
|
+
</div>
|
|
165
|
+
</button>
|
|
166
|
+
))}
|
|
167
|
+
</div>
|
|
168
|
+
)}
|
|
169
|
+
|
|
170
|
+
{searchQuery.length > 0 && filteredActiveContacts.length === 0 && additionalContacts.length === 0 && (
|
|
171
|
+
<div className="py-12 text-center">
|
|
172
|
+
<div className="text-armoyu-text-muted text-sm font-bold opacity-30">Sonuç bulunamadı</div>
|
|
173
|
+
</div>
|
|
174
|
+
)}
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
export interface ChatMessageProps {
|
|
4
|
+
id: string;
|
|
5
|
+
sender: {
|
|
6
|
+
name: string;
|
|
7
|
+
avatar: string;
|
|
8
|
+
isSelf: boolean;
|
|
9
|
+
};
|
|
10
|
+
content: string;
|
|
11
|
+
timestamp: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function ChatMessage({ sender, content, timestamp }: ChatMessageProps) {
|
|
15
|
+
return (
|
|
16
|
+
<div className={`flex w-full ${sender.isSelf ? 'justify-end' : 'justify-start'} mb-4`}>
|
|
17
|
+
<div className={`flex gap-3 items-end max-w-[85%] md:max-w-[70%] ${sender.isSelf ? 'flex-row-reverse' : 'flex-row'}`}>
|
|
18
|
+
|
|
19
|
+
{/* Avatar */}
|
|
20
|
+
<img
|
|
21
|
+
src={sender.avatar}
|
|
22
|
+
alt={sender.name}
|
|
23
|
+
className="w-8 h-8 rounded-full border border-white/10 shadow-sm shrink-0"
|
|
24
|
+
/>
|
|
25
|
+
|
|
26
|
+
{/* Balon & İsim */}
|
|
27
|
+
<div className={`flex flex-col ${sender.isSelf ? 'items-end' : 'items-start'} gap-1.5`}>
|
|
28
|
+
<span className="text-xs text-gray-500 font-bold tracking-wide dark:text-gray-400">
|
|
29
|
+
{sender.name} <span className="opacity-50 mx-1">•</span> {timestamp}
|
|
30
|
+
</span>
|
|
31
|
+
<div className={`p-3.5 rounded-2xl text-sm shadow-lg leading-relaxed font-medium ${
|
|
32
|
+
sender.isSelf
|
|
33
|
+
? 'bg-gradient-to-br from-blue-600 to-blue-500 text-white rounded-br-sm shadow-[0_4px_15px_rgba(37,99,235,0.3)]'
|
|
34
|
+
: 'bg-black/5 dark:bg-[#1a1a24] text-armoyu-text rounded-bl-sm border border-black/5 dark:border-white/5'
|
|
35
|
+
}`}>
|
|
36
|
+
{content}
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useAuth } from '../../../context/AuthContext';
|
|
4
|
+
import { MOCK_NOTES } from '../../../lib/constants/seedData';
|
|
5
|
+
import { Note } from '@armoyu/core';
|
|
6
|
+
|
|
7
|
+
export function ChatNotes() {
|
|
8
|
+
return (
|
|
9
|
+
<div className="w-full px-4 py-6 border-b border-black/5 dark:border-white/5">
|
|
10
|
+
<div className="flex gap-4 overflow-x-auto no-scrollbar pb-1 px-1">
|
|
11
|
+
{MOCK_NOTES.map((note: any) => (
|
|
12
|
+
<NoteItem key={note.id} note={note} />
|
|
13
|
+
))}
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function NoteItem({ note }: { note: Note }) {
|
|
20
|
+
return (
|
|
21
|
+
<div className="flex flex-col items-center shrink-0 cursor-pointer group relative">
|
|
22
|
+
<div className="relative mb-3 flex flex-col items-center">
|
|
23
|
+
|
|
24
|
+
{/* Thought Bubble Box */}
|
|
25
|
+
<div className={`relative px-3 py-1.5 rounded-2xl text-[10px] font-bold max-w-[85px] transition-all group-hover:-translate-y-1 shadow-sm border border-black/5 dark:border-white/10 ${note.isMe
|
|
26
|
+
? 'bg-white dark:bg-white/10 text-armoyu-text-muted italic'
|
|
27
|
+
: 'bg-white dark:bg-white/20 text-armoyu-text animate-in zoom-in duration-500'
|
|
28
|
+
}`}>
|
|
29
|
+
<p className="truncate line-clamp-2 text-center leading-tight">
|
|
30
|
+
{note.note}
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
{/* Bubble Tail (Little Triangle) */}
|
|
34
|
+
<div className="absolute -bottom-1 left-1/2 -translate-x-1/2 w-2 h-2 rotate-45 border-r border-b border-black/5 dark:border-white/10 bg-inherit" />
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
{/* Avatar Area */}
|
|
38
|
+
<div className="mt-1 relative">
|
|
39
|
+
<img
|
|
40
|
+
src={note.user?.avatar}
|
|
41
|
+
alt={note.user?.username}
|
|
42
|
+
className="w-11 h-11 md:w-12 md:h-12 rounded-full border-2 border-white dark:border-white/10 shadow-sm"
|
|
43
|
+
/>
|
|
44
|
+
{note.isMe && (
|
|
45
|
+
<div className="absolute -top-1 -right-1 w-4 h-4 bg-gray-200 dark:bg-zinc-800 rounded-full border-2 border-white dark:border-zinc-900 flex items-center justify-center text-[10px] font-bold text-gray-600 dark:text-gray-400">
|
|
46
|
+
+
|
|
47
|
+
</div>
|
|
48
|
+
)}
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<span className={`text-[10px] text-armoyu-text-muted font-medium truncate w-14 text-center ${note.isMe ? 'italic' : ''}`}>
|
|
53
|
+
{note.isMe ? 'Hikayen' : note.user?.displayName || note.user?.username}
|
|
54
|
+
</span>
|
|
55
|
+
</div>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import React, { useState, useRef, useEffect } from 'react';
|
|
2
|
+
import { Group } from '@armoyu/core';
|
|
3
|
+
|
|
4
|
+
interface GroupHeaderProps {
|
|
5
|
+
group: Group;
|
|
6
|
+
isMember: boolean;
|
|
7
|
+
onJoin?: () => void;
|
|
8
|
+
onLeave?: () => void;
|
|
9
|
+
onReport?: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function GroupHeader({ group, isMember, onJoin, onLeave, onReport }: GroupHeaderProps) {
|
|
13
|
+
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
14
|
+
const menuRef = useRef<HTMLDivElement>(null);
|
|
15
|
+
|
|
16
|
+
// Close menu on click outside
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
function handleClickOutside(event: MouseEvent) {
|
|
19
|
+
if (menuRef.current && !menuRef.current.contains(event.target as Node)) {
|
|
20
|
+
setIsMenuOpen(false);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
24
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
25
|
+
}, []);
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<div className="relative h-64 md:h-80 lg:h-96 rounded-[60px] overflow-hidden mb-12 shadow-2xl animate-in fade-in slide-in-from-top-4 duration-700">
|
|
29
|
+
{/* Banner Image */}
|
|
30
|
+
<img src={group.banner} className="w-full h-full object-cover" alt={group.name} />
|
|
31
|
+
|
|
32
|
+
{/* Premium Overlay Gradient */}
|
|
33
|
+
<div className="absolute inset-0 bg-gradient-to-t from-black/90 via-black/30 to-transparent" />
|
|
34
|
+
|
|
35
|
+
{/* Header Content */}
|
|
36
|
+
<div className="absolute bottom-10 left-10 right-10 flex flex-col md:flex-row items-end justify-between gap-6">
|
|
37
|
+
<div className="flex items-center gap-6">
|
|
38
|
+
<div className="relative">
|
|
39
|
+
<img
|
|
40
|
+
src={group.logo}
|
|
41
|
+
className="w-24 h-24 md:w-32 md:h-32 rounded-[32px] border-4 border-armoyu-bg bg-white dark:bg-zinc-900 shadow-2xl object-cover"
|
|
42
|
+
alt="Logo"
|
|
43
|
+
/>
|
|
44
|
+
<div className="absolute -bottom-2 -right-2 bg-blue-500 text-white p-2 rounded-xl border-4 border-armoyu-bg">
|
|
45
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3"><polyline points="20 6 9 17 4 12"></polyline></svg>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
<div className="mb-2 text-left">
|
|
49
|
+
<div className="flex items-center gap-3 mb-1">
|
|
50
|
+
<h1 className="text-3xl md:text-5xl font-black text-white uppercase tracking-tighter italic drop-shadow-lg">{group.name}</h1>
|
|
51
|
+
<span className="px-3 py-1 bg-blue-600 text-white text-[10px] font-black uppercase tracking-widest rounded-lg shadow-lg">{group.category}</span>
|
|
52
|
+
</div>
|
|
53
|
+
<p className="text-white/70 font-bold text-lg uppercase tracking-tight">@{group.shortName} • {group.recruitment}</p>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div className="flex gap-4 mb-2 relative" ref={menuRef}>
|
|
58
|
+
{!isMember && (
|
|
59
|
+
<button
|
|
60
|
+
onClick={onJoin}
|
|
61
|
+
className="px-10 py-4 bg-white text-blue-600 font-black text-xs uppercase tracking-[0.2em] rounded-2xl shadow-2xl hover:scale-105 active:scale-95 transition-all"
|
|
62
|
+
>
|
|
63
|
+
GRUBA KATIL
|
|
64
|
+
</button>
|
|
65
|
+
)}
|
|
66
|
+
|
|
67
|
+
<button
|
|
68
|
+
onClick={() => setIsMenuOpen(!isMenuOpen)}
|
|
69
|
+
className={`px-4 py-4 ${isMenuOpen ? 'bg-blue-600' : 'bg-white/10 backdrop-blur-md'} border border-white/20 text-white rounded-2xl hover:bg-white/20 transition-all group`}
|
|
70
|
+
>
|
|
71
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" className={`${isMenuOpen ? 'rotate-90' : 'group-hover:rotate-12'} transition-transform`}><circle cx="12" cy="12" r="1"></circle><circle cx="19" cy="12" r="1"></circle><circle cx="5" cy="12" r="1"></circle></svg>
|
|
72
|
+
</button>
|
|
73
|
+
|
|
74
|
+
{/* Dropdown Menu */}
|
|
75
|
+
{isMenuOpen && (
|
|
76
|
+
<div className="absolute bottom-full right-0 mb-4 w-56 glass-panel p-3 rounded-2xl border border-white/20 bg-black/80 backdrop-blur-xl shadow-2xl animate-in fade-in zoom-in-95 duration-200 z-50">
|
|
77
|
+
<div className="flex flex-col gap-1">
|
|
78
|
+
<button className="flex items-center gap-3 w-full p-3 rounded-xl hover:bg-white/10 text-white transition-all group text-left">
|
|
79
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" className="text-white/50 group-hover:text-white transition-colors"><path d="M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8" /><polyline points="16 6 12 2 8 6" /><line x1="12" y1="2" x2="12" y2="15" /></svg>
|
|
80
|
+
<span className="text-[10px] font-black uppercase tracking-widest">Grubu Paylaş</span>
|
|
81
|
+
</button>
|
|
82
|
+
|
|
83
|
+
<button
|
|
84
|
+
onClick={() => { onReport?.(); setIsMenuOpen(false); }}
|
|
85
|
+
className="flex items-center gap-3 w-full p-3 rounded-xl hover:bg-red-500/10 text-red-500 transition-all group text-left"
|
|
86
|
+
>
|
|
87
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" className="text-red-500/50 group-hover:text-red-500 transition-colors"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" /><line x1="12" y1="9" x2="12" y2="13" /><line x1="12" y1="17" x2="12.01" y2="17" /></svg>
|
|
88
|
+
<span className="text-[10px] font-black uppercase tracking-widest">Grubu Şikayet Et</span>
|
|
89
|
+
</button>
|
|
90
|
+
|
|
91
|
+
{isMember && (
|
|
92
|
+
<>
|
|
93
|
+
<div className="h-px bg-white/10 my-1 mx-2" />
|
|
94
|
+
<button
|
|
95
|
+
onClick={() => { onLeave?.(); setIsMenuOpen(false); }}
|
|
96
|
+
className="flex items-center gap-3 w-full p-3 rounded-xl hover:bg-red-600 text-white transition-all group text-left bg-red-600/20"
|
|
97
|
+
>
|
|
98
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" className="text-white/70 group-hover:text-white transition-colors"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" /><polyline points="16 17 21 12 16 7" /><line x1="21" y1="12" x2="9" y2="12" /></svg>
|
|
99
|
+
<span className="text-[10px] font-black uppercase tracking-widest">Gruptan Ayrıl</span>
|
|
100
|
+
</button>
|
|
101
|
+
</>
|
|
102
|
+
)}
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
)}
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Group } from '@armoyu/core';
|
|
5
|
+
import { User } from '@armoyu/core';
|
|
6
|
+
import Link from 'next/link';
|
|
7
|
+
|
|
8
|
+
interface GroupMenuProps {
|
|
9
|
+
group: Group;
|
|
10
|
+
user: User;
|
|
11
|
+
onLeave?: () => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function GroupMenu({ group, user, onLeave }: GroupMenuProps) {
|
|
15
|
+
// Check if owner or moderator
|
|
16
|
+
const isOwner = group.owner?.username === user.username;
|
|
17
|
+
const isMod = group.moderators?.some(m => m.username === user.username);
|
|
18
|
+
const isAdmin = isOwner || isMod || user.role?.id === 'admin';
|
|
19
|
+
|
|
20
|
+
const menuItems = [
|
|
21
|
+
{ id: 'management', label: 'GRUP YÖNETİMİ', icon: 'shield', color: 'text-blue-500', permission: isAdmin },
|
|
22
|
+
{ id: 'members', label: 'ÜYE LİSTESİ', icon: 'users', color: 'text-armoyu-text' },
|
|
23
|
+
{ id: 'events', label: 'GRUP ETKİNLİKLERİ', icon: 'calendar', color: 'text-armoyu-text' },
|
|
24
|
+
{ id: 'settings', label: 'GRUP AYARLARI', icon: 'settings', color: 'text-armoyu-text', permission: isAdmin },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<div className="glass-panel p-8 rounded-[40px] border border-armoyu-card-border bg-armoyu-card-bg relative overflow-hidden">
|
|
29
|
+
{/* Decorative Gradient */}
|
|
30
|
+
<div className="absolute top-0 right-0 w-32 h-32 bg-blue-500/10 blur-[60px] -mr-16 -mt-16 pointer-events-none" />
|
|
31
|
+
|
|
32
|
+
<div className="flex items-center justify-between mb-8">
|
|
33
|
+
<h4 className="text-xs font-black text-armoyu-text uppercase tracking-[0.2em] italic">GRUP MENÜSÜ</h4>
|
|
34
|
+
<div className="px-2 py-0.5 bg-emerald-500/10 border border-emerald-500/20 rounded-md">
|
|
35
|
+
<span className="text-[8px] font-black text-emerald-500 tracking-widest">AKTİF ÜYE</span>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<div className="space-y-4">
|
|
40
|
+
{menuItems.filter(item => item.permission !== false).map((item, idx) => (
|
|
41
|
+
<Link
|
|
42
|
+
key={item.id}
|
|
43
|
+
href={`${group.getGroupUrl()}/${item.id === 'management' || item.id === 'settings' ? 'yonetim' : item.id === 'members' ? 'uyeler' : 'etkinlikler'}`}
|
|
44
|
+
className="w-full flex items-center justify-between p-4 rounded-2xl bg-black/5 dark:bg-white/5 border border-black/5 dark:border-white/5 hover:border-blue-500/30 hover:bg-blue-500/5 transition-all group"
|
|
45
|
+
>
|
|
46
|
+
<div className="flex items-center gap-4">
|
|
47
|
+
<div className={`p-2.5 rounded-xl bg-white dark:bg-zinc-900 shadow-sm border border-black/5 dark:border-white/5 group-hover:scale-110 transition-transform ${item.color}`}>
|
|
48
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
|
|
49
|
+
{item.id === 'management' && <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />}
|
|
50
|
+
{item.id === 'members' && <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />}
|
|
51
|
+
{item.id === 'members' && <circle cx="9" cy="7" r="4" />}
|
|
52
|
+
{item.id === 'members' && <path d="M23 21v-2a4 4 0 0 0-3-3.87" />}
|
|
53
|
+
{item.id === 'members' && <path d="M16 3.13a4 4 0 0 1 0 7.75" />}
|
|
54
|
+
{item.id === 'events' && <rect x="3" y="4" width="18" height="18" rx="2" ry="2" />}
|
|
55
|
+
{item.id === 'events' && <line x1="16" y1="2" x2="16" y2="6" />}
|
|
56
|
+
{item.id === 'events' && <line x1="8" y1="2" x2="8" y2="6" />}
|
|
57
|
+
{item.id === 'events' && <line x1="3" y1="10" x2="21" y2="10" />}
|
|
58
|
+
{item.id === 'settings' && <circle cx="12" cy="12" r="3" />}
|
|
59
|
+
{item.id === 'settings' && <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z" />}
|
|
60
|
+
</svg>
|
|
61
|
+
</div>
|
|
62
|
+
<span className="text-[10px] font-black text-armoyu-text tracking-widest uppercase">{item.label}</span>
|
|
63
|
+
</div>
|
|
64
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3" className="text-armoyu-text-muted opacity-0 group-hover:opacity-100 group-hover:translate-x-1 transition-all">
|
|
65
|
+
<polyline points="9 18 15 12 9 6"></polyline>
|
|
66
|
+
</svg>
|
|
67
|
+
</Link>
|
|
68
|
+
))}
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<div className="mt-8 pt-8 border-t border-black/5 dark:border-white/5">
|
|
72
|
+
<button
|
|
73
|
+
onClick={onLeave}
|
|
74
|
+
className="w-full text-[10px] font-black text-red-500 uppercase tracking-[0.2em] hover:text-red-600 transition-colors"
|
|
75
|
+
>
|
|
76
|
+
GRUPTAN AYRIL
|
|
77
|
+
</button>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { School } from '@armoyu/core';
|
|
6
|
+
import { GraduationCap, Users, Trophy, ChevronRight, MapPin } from 'lucide-react';
|
|
7
|
+
|
|
8
|
+
interface SchoolCardProps {
|
|
9
|
+
school: School;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function SchoolCard({ school }: SchoolCardProps) {
|
|
13
|
+
return (
|
|
14
|
+
<Link href={`/egitim/${school.slug}`} className="block group">
|
|
15
|
+
<div className="glass-panel relative overflow-hidden rounded-[40px] border border-armoyu-card-border bg-armoyu-card-bg hover:border-blue-500/50 hover:shadow-2xl hover:shadow-blue-500/10 transition-all duration-500 group">
|
|
16
|
+
|
|
17
|
+
{/* Banner / Background */}
|
|
18
|
+
<div className="absolute top-0 left-0 w-full h-32 bg-gradient-to-br from-blue-600/20 to-purple-600/20 opacity-30 group-hover:opacity-50 transition-opacity" />
|
|
19
|
+
|
|
20
|
+
<div className="relative p-8 pt-12">
|
|
21
|
+
<div className="flex items-start justify-between mb-8">
|
|
22
|
+
<div className="relative">
|
|
23
|
+
<div className="w-24 h-24 rounded-3xl bg-white dark:bg-zinc-900 border-4 border-armoyu-bg overflow-hidden shadow-xl group-hover:scale-105 transition-transform duration-500">
|
|
24
|
+
<img
|
|
25
|
+
src={school.logo}
|
|
26
|
+
alt={school.name}
|
|
27
|
+
className="w-full h-full object-contain p-2"
|
|
28
|
+
/>
|
|
29
|
+
</div>
|
|
30
|
+
<div className="absolute -bottom-2 -right-2 px-3 py-1 bg-blue-600 text-white text-[10px] font-black italic rounded-lg shadow-lg uppercase tracking-widest border-2 border-armoyu-bg">
|
|
31
|
+
Onaylı Okul
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div className="flex gap-2">
|
|
36
|
+
<div className="px-5 py-2.5 rounded-2xl bg-black/5 dark:bg-white/5 border border-armoyu-card-border text-[10px] font-black text-armoyu-text-muted uppercase tracking-[0.2em]">
|
|
37
|
+
{school.id.toUpperCase()}
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div className="space-y-4 mb-8">
|
|
43
|
+
<h3 className="text-2xl font-black text-armoyu-text uppercase tracking-tighter italic leading-none group-hover:text-blue-500 transition-colors">
|
|
44
|
+
{school.name}
|
|
45
|
+
</h3>
|
|
46
|
+
<div className="flex items-center gap-2 text-armoyu-text-muted">
|
|
47
|
+
<MapPin size={14} className="text-blue-500" />
|
|
48
|
+
<span className="text-[11px] font-bold uppercase tracking-widest opacity-60">Türkiye / İstanbul</span>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
{/* Stats Bar */}
|
|
53
|
+
<div className="grid grid-cols-3 gap-2 py-4 border-y border-armoyu-card-border">
|
|
54
|
+
<div className="text-center group/stat">
|
|
55
|
+
<div className="flex items-center justify-center gap-1.5 text-armoyu-text-muted mb-1">
|
|
56
|
+
<Users size={12} className="group-hover/stat:text-blue-500 transition-colors" />
|
|
57
|
+
<span className="text-[9px] font-black uppercase tracking-widest opacity-50">Öğrenci</span>
|
|
58
|
+
</div>
|
|
59
|
+
<div className="text-sm font-black text-armoyu-text">{school.memberCount}</div>
|
|
60
|
+
</div>
|
|
61
|
+
<div className="text-center group/stat border-x border-armoyu-card-border px-2">
|
|
62
|
+
<div className="flex items-center justify-center gap-1.5 text-armoyu-text-muted mb-1">
|
|
63
|
+
<GraduationCap size={12} className="group-hover/stat:text-blue-500 transition-colors" />
|
|
64
|
+
<span className="text-[9px] font-black uppercase tracking-widest opacity-50">Fakülte</span>
|
|
65
|
+
</div>
|
|
66
|
+
<div className="text-sm font-black text-armoyu-text">{(school.faculties || []).length}</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div className="text-center group/stat">
|
|
69
|
+
<div className="flex items-center justify-center gap-1.5 text-armoyu-text-muted mb-1">
|
|
70
|
+
<Trophy size={12} className="group-hover/stat:text-blue-500 transition-colors" />
|
|
71
|
+
<span className="text-[9px] font-black uppercase tracking-widest opacity-50">Takımlar</span>
|
|
72
|
+
</div>
|
|
73
|
+
<div className="text-sm font-black text-armoyu-text">{(school.teams || []).length}</div>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div className="mt-8 flex items-center justify-between">
|
|
78
|
+
<div className="flex -space-x-3">
|
|
79
|
+
{[1, 2, 3, 4].map((i) => (
|
|
80
|
+
<img
|
|
81
|
+
key={i}
|
|
82
|
+
src={`https://api.dicebear.com/7.x/avataaars/svg?seed=Armoyu${i + (school.id as any)}`}
|
|
83
|
+
className="w-8 h-8 rounded-full border-2 border-armoyu-bg"
|
|
84
|
+
alt="Member"
|
|
85
|
+
/>
|
|
86
|
+
))}
|
|
87
|
+
<div className="w-8 h-8 rounded-full bg-black/5 dark:bg-white/5 border-2 border-armoyu-bg flex items-center justify-center text-[8px] font-black text-armoyu-text-muted uppercase">
|
|
88
|
+
+{(school.memberCount || 0) - 4}
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<div className="flex items-center gap-2 text-blue-500 text-[10px] font-black uppercase tracking-widest group-hover:translate-x-2 transition-transform">
|
|
93
|
+
OKUL PORTALI <ChevronRight size={16} strokeWidth={3} />
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
{/* Decorative Elements */}
|
|
99
|
+
<div className="absolute -bottom-8 -right-8 w-32 h-32 bg-blue-500/5 blur-[40px] rounded-full group-hover:bg-blue-500/10 transition-colors" />
|
|
100
|
+
</div>
|
|
101
|
+
</Link>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|