diff --git a/app/category/page.tsx b/app/category/page.tsx
new file mode 100644
index 0000000..04bea7f
--- /dev/null
+++ b/app/category/page.tsx
@@ -0,0 +1,524 @@
+"use client";
+import React, { useState } from 'react';
+import Image from 'next/image';
+import { ThumbsUp, MessageCircle, Send, Share2, LinkIcon, Link2, ChevronRight } from 'lucide-react';
+import { TvoneAdBanner, TvoneFooter } from '../components/tvone-content';
+import { TvonePromoStrip } from '../components/tvone-promo-strip';
+import { TvoneSiteNav } from '../components/tvone-site-nav';
+import { SiWhatsapp, SiFacebook, SiX } from 'react-icons/si'; // Ícones oficiais de marca
+import { FiCopy } from 'react-icons/fi'; // Ícone de cópia mais limpo
+import Link from 'next/link';
+import { Users } from 'lucide-react';
+import { v4 as uuidv4 } from 'uuid';
+
+export default function NewsArticlePage() {
+ // Estado para controlar o play do vídeo customizado
+ const [isPlaying, setIsPlaying] = useState(false);
+ const recentes = [
+ {
+ cat: "EM FOCO",
+ readTime: "6",
+ catBg: "bg-pink-100 text-pink-700",
+ title: "Governo anuncia medidas para apoiar famílias e pequenas empresas.",
+ excerpt: "Pacote inclui linhas de crédito e simplificação de procedimentos.",
+ byline: "Por Redação",
+ date: "24 Mar 2025",
+ img: "https://images.unsplash.com/photo-1507679799987-c73779587ccf?w=200&q=80",
+ },
+ {
+ cat: "ECONOMIA",
+ readTime: "6",
+ catBg: "bg-amber-100 text-amber-800",
+ title: "Inflação desce pelo terceiro mês consecutivo, segundo dados preliminares.",
+ excerpt: "Analistas mantêm cautela face ao cenário internacional.",
+ byline: "Por Economia",
+ date: "24 Mar 2025",
+ img: "https://images.unsplash.com/photo-1611974789855-9c2a0a7236a3?w=200&q=80",
+ },
+ {
+ cat: "CULTURA",
+ readTime: "6",
+ catBg: "bg-violet-100 text-violet-800",
+ title: "Museu inaugura exposição com obras inéditas de artistas locais.",
+ excerpt: "Visitas guiadas e programa educativo arrancam no próximo fim de semana.",
+ byline: "Por Cultura",
+ date: "23 Mar 2025",
+ img: "https://images.unsplash.com/photo-1507679799987-c73779587ccf?w=200&q=80",
+ },
+ {
+ cat: "SAÚDE",
+ readTime: "6",
+ catBg: "bg-emerald-100 text-emerald-800",
+ title: "Campanha de vacinação alarga faixas etárias em todo o país.",
+ excerpt: "Autoridades de saúde reforçam importância da adesão às janelas recomendadas.",
+ byline: "Por Saúde",
+ date: "23 Mar 2025",
+ img: "https://images.unsplash.com/photo-1576091160399-112ba8d25d1d?w=200&q=80",
+ },
+ ];
+
+ const destaques = [
+ {
+ id: uuidv4(),
+ cat: "FAMOSOS",
+ catColor: "text-pink-600",
+ title: "Cerimónia reúne estrelas nacionais e internacionais em Lisboa.",
+ date: "24 Mar 2025",
+ // High-quality video-style thumbnail
+ img: "https://images.unsplash.com/photo-1492684223066-81342ee5ff30?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "NEGÓCIOS",
+ catColor: "text-[#0066cc]",
+ title: "Mercados reagem às novas projeções de crescimento para a região.",
+ date: "24 Mar 2025",
+ img: "https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "DESPORTO",
+ catColor: "text-emerald-600",
+ title: "Taça: equipa da casa garante lugar nas meias com exibição sólida.",
+ date: "23 Mar 2025",
+ img: "https://images.unsplash.com/photo-1574629810360-7efbbe195018?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "NEGÓCIOS",
+ catColor: "text-[#0066cc]",
+ title: "Mercados reagem às novas projeções de crescimento para a região.",
+ date: "24 Mar 2025",
+ img: "https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "FAMOSOS",
+ catColor: "text-pink-600",
+ title: "Cerimónia reúne estrelas nacionais e internacionais em Lisboa.",
+ date: "24 Mar 2025",
+ // High-quality video-style thumbnail
+ img: "https://images.unsplash.com/photo-1492684223066-81342ee5ff30?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "NEGÓCIOS",
+ catColor: "text-[#0066cc]",
+ title: "Mercados reagem às novas projeções de crescimento para a região.",
+ date: "24 Mar 2025",
+ img: "https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "DESPORTO",
+ catColor: "text-emerald-600",
+ title: "Taça: equipa da casa garante lugar nas meias com exibição sólida.",
+ date: "23 Mar 2025",
+ img: "https://images.unsplash.com/photo-1574629810360-7efbbe195018?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "NEGÓCIOS",
+ catColor: "text-[#0066cc]",
+ title: "Mercados reagem às novas projeções de crescimento para a região.",
+ date: "24 Mar 2025",
+ img: "https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "FAMOSOS",
+ catColor: "text-pink-600",
+ title: "Cerimónia reúne estrelas nacionais e internacionais em Lisboa.",
+ date: "24 Mar 2025",
+ // High-quality video-style thumbnail
+ img: "https://images.unsplash.com/photo-1492684223066-81342ee5ff30?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "NEGÓCIOS",
+ catColor: "text-[#0066cc]",
+ title: "Mercados reagem às novas projeções de crescimento para a região.",
+ date: "24 Mar 2025",
+ img: "https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "DESPORTO",
+ catColor: "text-emerald-600",
+ title: "Taça: equipa da casa garante lugar nas meias com exibição sólida.",
+ date: "23 Mar 2025",
+ img: "https://images.unsplash.com/photo-1574629810360-7efbbe195018?w=800&q=80",
+ },
+ {
+ id: uuidv4(),
+ cat: "NEGÓCIOS",
+ catColor: "text-[#0066cc]",
+ title: "Mercados reagem às novas projeções de crescimento para a região.",
+ date: "24 Mar 2025",
+ img: "https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=800&q=80",
+ },
+ ];
+
+ return (
+
+
+
+
+
+
+
+
+ {/* --- COLUNA PRINCIPAL (ARTIGO) --- */}
+
+
+
+
+ Noticias Recentes
+
+
+ Conversas exclusivas com as personalidades que movem o mercado, a tecnologia e a cultura em Angola.
+
+
+
+
+
+
+
+ {destaques.map((item, index) => (
+
+
+
+
+
+
+ {item.title}
+
+
{item.date}
+
+
+
+ ))}
+
+
+
+
+ {/* --- SIDEBAR REFINADA --- */}
+
+ {/* --- SIDEBAR REFINADA COM SOCIAL SHARE --- */}
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/components/tvone-promo-strip.tsx b/app/components/tvone-promo-strip.tsx
index b2e33e9..496a1a5 100644
--- a/app/components/tvone-promo-strip.tsx
+++ b/app/components/tvone-promo-strip.tsx
@@ -4,7 +4,6 @@ import Image from "next/image";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import type { CSSProperties } from "react";
-// Definição do tipo para garantir 100% de compatibilidade TS
export interface SliderPhoto {
src: string;
alt: string;
@@ -13,13 +12,12 @@ export interface SliderPhoto {
const ROTATE_MS = 5500;
-// --- 1. COMPONENTE DE SLIDE INDIVIDUAL ---
+// --- 1. SLIDE COMPONENT ---
interface SlideProps {
photo: SliderPhoto;
- onRatioLoad: (src: string, ratio: number) => void;
}
-function PromoStripSingleSlide({ photo, onRatioLoad }: SlideProps) {
+function PromoStripSingleSlide({ photo }: SlideProps) {
return (
{
- const target = e.currentTarget;
- if (target.naturalHeight > 0) {
- onRatioLoad(photo.src, target.naturalWidth / target.naturalHeight);
- }
- }}
/>
-
);
}
-// --- 2. HOOK DE DADOS (Simulação de Fetch) ---
+// --- 2. DATA HOOK ---
function useSliderPhotos(): { photos: SliderPhoto[]; loading: boolean } {
const [photos, setPhotos] = useState([]);
const [loading, setLoading] = useState(true);
@@ -72,14 +63,15 @@ function useSliderPhotos(): { photos: SliderPhoto[]; loading: boolean } {
return { photos, loading };
}
-// --- 3. COMPONENTE PRINCIPAL (O CARROSSEL) ---
+// --- 3. MAIN COMPONENT ---
export function TvonePromoStrip() {
const { photos, loading } = useSliderPhotos();
const [index, setIndex] = useState(0);
- const [ratios, setRatios] = useState>({});
const [reduceMotion, setReduceMotion] = useState(false);
- // Detetar preferência de movimento do sistema (iOS/MacOS/Windows)
+ // Constants for the 4.8:1 ratio
+ const FIXED_RATIO = 4.8 / 1;
+
useEffect(() => {
const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
const sync = () => setReduceMotion(mq.matches);
@@ -88,7 +80,6 @@ export function TvonePromoStrip() {
return () => mq.removeEventListener("change", sync);
}, []);
- // Lógica de avanço automático
const advance = useCallback(() => {
if (photos.length <= 1) return;
setIndex((i: number) => (i + 1) % photos.length);
@@ -100,54 +91,46 @@ export function TvonePromoStrip() {
return () => window.clearInterval(id);
}, [photos.length, reduceMotion, advance]);
- // Handler para atualizar rácios de imagem
- const handleRatio = useCallback((src: string, ratio: number) => {
- setRatios((prev) => (prev[src] === ratio ? prev : { ...prev, [src]: ratio }));
- }, []);
-
- // Calcula a proporção do contentor baseado no slide ativo
- const currentRatio = useMemo(() => {
- const activePhoto = photos[index];
- return activePhoto ? (ratios[activePhoto.src] || 16 / 9) : 16 / 9;
- }, [photos, index, ratios]);
-
+ // Loading state with fixed ratio
if (loading && photos.length === 0) {
- return ;
+ return (
+
+ );
}
if (photos.length === 0) return null;
return (
- {/* O "ROLO" (A fita flexível) */}
+ {/* THE TRACK */}
{photos.map((photo: SliderPhoto, i: number) => (
))}
- {/* INDICADORES (iOS Dot Style) */}
+ {/* INDICATORS */}
{photos.length > 1 && (
-
+
{photos.map((_, i: number) => (