+
{article.title}
- {/* Meta Information */}
-
-
-
+
+
+
{new Date(article.createdAt).toLocaleDateString('mk-MK', {
day: 'numeric',
- month: 'long',
+ month: 'short',
year: 'numeric',
})}
{article.author && (
-
-
+
+
{article.author.name}
)}
-
+
+
{article.views} views
- {/* Excerpt */}
{article.excerpt && (
-
+
{article.excerpt}
)}
- {/* Tags */}
{article.tags && article.tags.length > 0 && (
{article.tags.map((tag) => (
- {tag}
+ #{tag}
))}
)}
- {/* Read More Button */}
-
+
-
+
Read Full Story
-
+
- {/* Social shares count */}
-
-
- {article.facebookShares + article.twitterShares + article.whatsappShares + article.telegramShares}
+
+
+ {(article.facebookShares || 0) + (article.twitterShares || 0) + (article.whatsappShares || 0) + (article.telegramShares || 0)}
shares
-
+
);
-}
\ No newline at end of file
+}
diff --git a/frontend/src/components/home/LatestArticlesGrid.tsx b/frontend/src/components/home/LatestArticlesGrid.tsx
index 4a432f8..8cf0d41 100644
--- a/frontend/src/components/home/LatestArticlesGrid.tsx
+++ b/frontend/src/components/home/LatestArticlesGrid.tsx
@@ -2,6 +2,7 @@ import { useQuery } from '@tanstack/react-query'
import { Link } from '@tanstack/react-router'
import * as api from '@/lib/api'
import { SocialShareButtons } from '@/components/features/social-share'
+import { ArrowRight } from 'lucide-react'
export function LatestArticlesGrid() {
const { data, isLoading, error } = useQuery({
@@ -11,17 +12,13 @@ export function LatestArticlesGrid() {
if (isLoading) {
return (
-
+
{Array.from({ length: 12 }).map((_, i) => (
-
-
-
+
+
+
-
-
-
-
-
+
))}
@@ -30,9 +27,9 @@ export function LatestArticlesGrid() {
if (error) {
return (
-
- Грешка при вчитување на статии
- Обидете се повторно
+
+ ГРЕШКА
+ Обидете се повторно
)
}
@@ -41,107 +38,99 @@ export function LatestArticlesGrid() {
if (articles.length === 0) {
return (
-
- Нема објавени статии
- Проверете подоцна
+
+ НЕМА СТАТИИ
+ Проверете подоцна
)
}
return (
-
-
- Најнови статии
+
+
+ Најнови
- Види сите
-
+ Сите
+
-
- {articles.map((article) => (
-
+ {articles.map((article, index) => (
+
{article.featuredImage ? (
-
+
-
+
) : (
-
-
+
+
+ N
)}
-
- {article.title}
-
-
- {article.excerpt && (
-
- {article.excerpt}
-
- )}
+
+
+ {article.title}
+
+
+ {article.excerpt && (
+
+ {article.excerpt}
+
+ )}
+
-
-
-
-
- {new Date(article.createdAt).toLocaleDateString('mk-MK', {
- day: 'numeric',
- month: 'short',
- year: 'numeric',
- })}
-
- •
- {article.views} прегледи
-
+
+
+
+ {new Date(article.createdAt).toLocaleDateString('mk-MK', {
+ day: 'numeric',
+ month: 'short',
+ })}
+
{article.category && (
{article.category.name}
)}
-
+
+
+
-
+
))}
)
-}
\ No newline at end of file
+}
diff --git a/frontend/src/components/home/PinnedLiveBlogsSidebar.tsx b/frontend/src/components/home/PinnedLiveBlogsSidebar.tsx
index 4374d7a..bd6f74d 100644
--- a/frontend/src/components/home/PinnedLiveBlogsSidebar.tsx
+++ b/frontend/src/components/home/PinnedLiveBlogsSidebar.tsx
@@ -1,7 +1,6 @@
import { useQuery } from '@tanstack/react-query';
import { Link } from '@tanstack/react-router';
import { fetchPinnedLiveBlogs } from '@/lib/api';
-import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Calendar, Eye, MessageSquare, Pin } from 'lucide-react';
@@ -15,25 +14,27 @@ export function PinnedLiveBlogsSidebar() {
switch (status) {
case 'live':
return (
-
+
LIVE
-
+
);
case 'ended':
return (
-
+
ENDED
-
+
);
case 'archived':
return (
-
+
ARCHIVED
-
+
);
default:
return (
- DRAFT
+
+ DRAFT
+
);
}
};
@@ -48,10 +49,10 @@ export function PinnedLiveBlogsSidebar() {
if (isLoading) {
return (
-
+
-
- Pinned Live Blogs
+
+ Pinned Live
{[1, 2, 3].map((i) => (
@@ -67,14 +68,14 @@ export function PinnedLiveBlogsSidebar() {
if (error) {
return (
-
+
-
- Pinned Live Blogs
+
+ Pinned Live
- Error loading live blogs
- window.location.reload()}>
+ ERROR
+ window.location.reload()}>
Retry
@@ -84,15 +85,15 @@ export function PinnedLiveBlogsSidebar() {
if (!liveBlogs || liveBlogs.length === 0) {
return (
-
+
-
- Pinned Live Blogs
+
+ Pinned Live
-
- No pinned live blogs
-
- Pin live blogs from the admin panel to feature them here.
+
+ No pinned live blogs
+
+ Pin live blogs from the admin panel.
@@ -100,44 +101,40 @@ export function PinnedLiveBlogsSidebar() {
}
return (
-
- {/* Header */}
-
+
+
-
- Pinned Live Blogs
+
+ Pinned Live
-
- {liveBlogs.length} pinned
-
+
+ {liveBlogs.length}
+
- {/* Live Blogs List */}
{liveBlogs.map((liveBlog) => (
-
- {/* Title and Status */}
+
-
+
{liveBlog.title}
{getStatusBadge(liveBlog.status)}
- {/* Description */}
{liveBlog.description && (
-
+
{liveBlog.description}
)}
- {/* Meta Information */}
-
+
{formatDate(liveBlog.createdAt)}
@@ -145,33 +142,31 @@ export function PinnedLiveBlogsSidebar() {
- {liveBlog.viewCount} views
+ {liveBlog.viewCount}
{liveBlog.updates && liveBlog.updates.length > 0 && (
- {liveBlog.updates.length} updates
+ {liveBlog.updates.length}
)}
{liveBlog.author && (
- by {liveBlog.author.name}
+ {liveBlog.author.name}
)}
- {/* Featured Image (small) */}
{liveBlog.featuredImage && (
-
+
-
)}
@@ -180,14 +175,13 @@ export function PinnedLiveBlogsSidebar() {
))}
- {/* View All Link */}
-
+
-
- View All Live Blogs
+
+ Сите Live
);
-}
\ No newline at end of file
+}
diff --git a/frontend/src/components/layout/Header.tsx b/frontend/src/components/layout/Header.tsx
index cfd6aa7..fc1e996 100644
--- a/frontend/src/components/layout/Header.tsx
+++ b/frontend/src/components/layout/Header.tsx
@@ -1,10 +1,17 @@
-
import { useState } from 'react';
import { Link } from '@tanstack/react-router';
import { useAuth } from '../../contexts/AuthContext';
import { Button } from '../ui/button';
import { ThemeToggle } from './ThemeToggle';
-import { Menu, X } from 'lucide-react';
+import { Menu, X, Zap } from 'lucide-react';
+
+const mkMonths = ['Јануари', 'Февруари', 'Март', 'Април', 'Мај', 'Јуни', 'Јули', 'Август', 'Септември', 'Октомври', 'Ноември', 'Декември'];
+const mkWeekdays = ['Понеделник', 'Вторник', 'Среда', 'Четврток', 'Петок', 'Сабота', 'Недела'];
+
+const formatDateMk = () => {
+ const d = new Date();
+ return `${mkWeekdays[d.getDay()]}, ${d.getDate()} ${mkMonths[d.getMonth()]} ${d.getFullYear()}`;
+};
export function Header() {
const { user, logout, isAuthenticated, hasRole } = useAuth();
@@ -24,29 +31,54 @@ export function Header() {
{ to: '/art', label: 'Уметност' },
{ to: '/science', label: 'Наука' },
{ to: '/archive', label: 'Архива' },
- { to: '/live-blogs', label: 'Live' },
+ { to: '/live-blogs', label: 'LIVE' },
];
const adminLinks = [
{ to: '/admin', label: 'Admin' },
- { to: '/admin/live-blogs/create', label: '+ New Live Blog' },
+ { to: '/admin/live-blogs/create', label: '+ New Live' },
];
return (
-
+
+
+
+
+
+
+ Сатирични вести од Македонија
+
+
+ {formatDateMk()}
+
+
+
+
+
-
- Placebo.mk
-
+
+
+ P
+ l
+ a
+ c
+ e
+ b
+ o
+ .
+ m
+ k
+
+
- {/* Desktop Navigation */}
-
+
{article.excerpt}
)} - {/* Tags */} {article.tags && article.tags.length > 0 && (Обидете се повторно
+Обидете се повторно
Проверете подоцна
+Проверете подоцна
Најнови статии
+Најнови
- Види сите - + Сите +- {article.title} -
- - {article.excerpt && ( -- {article.excerpt} -
- )} ++ {article.title} +
+ + {article.excerpt && ( ++ {article.excerpt} +
+ )} +Pinned Live Blogs
+Pinned Live
Pinned Live Blogs
+Pinned Live
Pinned Live Blogs
+Pinned Live
- Pin live blogs from the admin panel to feature them here. +
+ Pin live blogs from the admin panel.
Pinned Live Blogs
+Pinned Live
+
{liveBlog.title}
{getStatusBadge(liveBlog.status)}
+
{liveBlog.description}
)} - {/* Meta Information */} -