diff --git a/app/components/tvone-content.tsx b/app/components/tvone-content.tsx
new file mode 100644
index 0000000..dd6cb79
--- /dev/null
+++ b/app/components/tvone-content.tsx
@@ -0,0 +1,337 @@
+import Image from "next/image";
+import Link from "next/link";
+
+const destaques = [
+ {
+ cat: "FAMOSOS",
+ catColor: "text-pink-600",
+ title: "Cerimónia reúne estrelas nacionais e internacionais em Lisboa.",
+ date: "24 Mar 2025",
+ img: "https://images.unsplash.com/photo-1524504388940-b1c1722653e1?w=600&q=80",
+ },
+ {
+ 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-c627a92ad4ab?w=600&q=80",
+ },
+ {
+ 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=600&q=80",
+ },
+ {
+ cat: "TECNOLOGIA",
+ catColor: "text-violet-600",
+ title: "Novos dispositivos chegam às lojas com foco em sustentabilidade.",
+ date: "23 Mar 2025",
+ img: "https://images.unsplash.com/photo-1518770660439-4636190af475?w=600&q=80",
+ },
+];
+
+const recentes = [
+ {
+ cat: "EM FOCO",
+ 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",
+ 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",
+ 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-1549887534-1541e9326642?w=200&q=80",
+ },
+ {
+ cat: "SAÚDE",
+ 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 aSeguir = [
+ {
+ title: "Mercado imobiliário: especialistas explicam tendências para 2025.",
+ date: "23 Mar",
+ img: "https://images.unsplash.com/photo-1560518883-ce09059eeffa?w=120&q=80",
+ },
+ {
+ title: "Cinema: estreia nacional bate recordes de bilheteira no primeiro fim de semana.",
+ date: "22 Mar",
+ img: "https://images.unsplash.com/photo-1489599849927-2ee91cede3ba?w=120&q=80",
+ },
+ {
+ title: "Ambiente: projeto de reflorestação ultrapassa meta anual em três meses.",
+ date: "22 Mar",
+ img: "https://images.unsplash.com/photo-1448375240586-882707db888d?w=120&q=80",
+ },
+];
+
+export function TvoneDestaques() {
+ return (
+
+ Destaques
+
+ {destaques.map((item) => (
+
+
+
+
+
+
+
{item.cat}
+
{item.title}
+
{item.date}
+
+
+
+ ))}
+
+
+ );
+}
+
+export function TvoneMainColumns() {
+ return (
+
+
+ Mais Recentes
+
+ {recentes.map((item) => (
+ -
+
+
+
+
+
+
+ {item.cat}
+
+
+ {item.title}
+
+
{item.excerpt}
+
+ {item.byline} · {item.date}
+
+
+
+
+ ))}
+
+
+ Ver todas as notícias
+
+
+
+
+
+ );
+}
+
+export function TvoneAdBanner() {
+ return (
+
+
+
+
BAI Directo
+
Actualização do BAI Directo
+
Faça as suas operações com mais rapidez e segurança em qualquer dispositivo.
+
+
+
+
+
+ BAI
+
+
+
+ );
+}
+
+const services = [
+ { icon: "truck", label: "Entrega gratuita" },
+ { icon: "return", label: "Devoluções fáceis" },
+ { icon: "shield", label: "Pagamento seguro" },
+ { icon: "headset", label: "Apoio 24/7" },
+];
+
+function ServiceIcon({ name }: { name: string }) {
+ const common = "h-6 w-6 text-neutral-600";
+ switch (name) {
+ case "truck":
+ return (
+
+ );
+ case "return":
+ return (
+
+ );
+ case "shield":
+ return (
+
+ );
+ case "headset":
+ return (
+
+ );
+ default:
+ return null;
+ }
+}
+
+export function TvoneServiceStrip() {
+ return (
+
+
+ {services.map((s) => (
+
+
+ {s.label}
+
+ ))}
+
+
+ );
+}
+
+export function TvoneFooter() {
+ return (
+
+ );
+}
diff --git a/app/components/tvone-header.tsx b/app/components/tvone-header.tsx
new file mode 100644
index 0000000..bdcb69e
--- /dev/null
+++ b/app/components/tvone-header.tsx
@@ -0,0 +1,143 @@
+import Image from "next/image";
+import Link from "next/link";
+
+const PROMO_IMG_LEFT =
+ "https://images.unsplash.com/photo-1571019613454-1cb2f99b2d8b?w=800&q=80&auto=format&fit=crop";
+const PROMO_IMG_RIGHT =
+ "https://images.unsplash.com/photo-1544367567-0f2fcb009e0b?w=800&q=80&auto=format&fit=crop";
+
+const appleNav = [
+ "Loja",
+ "Mac",
+ "iPad",
+ "iPhone",
+ "Watch",
+ "AirPods",
+ "TV e Casa",
+ "Entretenimento",
+ "Acessórios",
+ "Suporte",
+];
+
+function AppleLogo({ className }: { className?: string }) {
+ return (
+
+ );
+}
+
+function SearchIcon({ className }: { className?: string }) {
+ return (
+
+ );
+}
+
+function BagIcon({ className }: { className?: string }) {
+ return (
+
+ );
+}
+
+export function TvoneHeader() {
+ return (
+
+
+
+
+
+
+
+
+
+ Nossa Seguros
+
+
+ Seguro Saúde Mulher — cuidado que acompanha o seu ritmo.
+
+
+
+ Redes sociais
+
+ f
+
+
+ in
+
+
+ ◎
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/app/components/tvone-hero.tsx b/app/components/tvone-hero.tsx
new file mode 100644
index 0000000..491e7cf
--- /dev/null
+++ b/app/components/tvone-hero.tsx
@@ -0,0 +1,76 @@
+"use client";
+
+import Image from "next/image";
+import { useState } from "react";
+
+const slides = [
+ {
+ id: 1,
+ tag: "MÚSICA",
+ title:
+ "Diddy na XB Label? Gerilson Israel responde após anúncio de lançamento de nova música em conjunto.",
+ byline: "Por Redação — 24 de Março, 2025",
+ image:
+ "https://images.unsplash.com/photo-1493225457124-a3eb161ffa5f?w=1400&q=80",
+ },
+ {
+ id: 2,
+ tag: "CULTURA",
+ title: "Festivais de verão: calendário completo e bilhetes à venda esta semana.",
+ byline: "Por Equipa tvone — 23 de Março, 2025",
+ image:
+ "https://images.unsplash.com/photo-1459749411175-04bf5292ceea?w=1400&q=80",
+ },
+ {
+ id: 3,
+ tag: "TV",
+ title: "Novas séries internacionais chegam às plataformas — o que não pode perder.",
+ byline: "Por Redação — 22 de Março, 2025",
+ image:
+ "https://images.unsplash.com/photo-1522869635100-9f4c5e86aa37?w=1400&q=80",
+ },
+];
+
+export function TvoneHero() {
+ const [active, setActive] = useState(0);
+ const slide = slides[active]!;
+
+ return (
+
+
+
+
+
+
+
+ {slide.tag}
+
+
+ {slide.title}
+
+
{slide.byline}
+
+
+
+ {slides.map((s, i) => (
+
+
+
+ );
+}
diff --git a/app/components/tvone-publication-banner.tsx b/app/components/tvone-publication-banner.tsx
new file mode 100644
index 0000000..290a730
--- /dev/null
+++ b/app/components/tvone-publication-banner.tsx
@@ -0,0 +1,73 @@
+import Image from "next/image";
+import Link from "next/link";
+
+export type TvonePublicationBannerProps = {
+ /** When set, the whole slot links here (campaign URL). */
+ href?: string;
+ /** Optional creative — leaderboard-style wide image (e.g. 970×90 or similar). */
+ imageSrc?: string;
+ imageAlt?: string;
+ /** Short line shown when no image (placeholder for unsold inventory). */
+ title?: string;
+ subtitle?: string;
+ /** Small label above the slot (legal / transparency). */
+ slotLabel?: string;
+};
+
+export function TvonePublicationBanner({
+ href = "#publicidade",
+ imageSrc,
+ imageAlt = "Publicidade",
+ title = "Espaço publicitário",
+ subtitle = "Reserve este espaço para a sua marca. Contacte a nossa equipa comercial.",
+ slotLabel = "Publicidade",
+}: TvonePublicationBannerProps) {
+ const inner = imageSrc ? (
+
+ ) : (
+
+
+
+ Espaço disponível
+
+
+ );
+
+ return (
+
+ );
+}
diff --git a/app/globals.css b/app/globals.css
index a2dc41e..2597cc9 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -3,24 +3,19 @@
:root {
--background: #ffffff;
--foreground: #171717;
+ --tvone-blue: #0066cc;
+ --tvone-magenta: #d9468f;
+ --tvone-muted: #f5f5f7;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
- --font-sans: var(--font-geist-sans);
- --font-mono: var(--font-geist-mono);
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --background: #0a0a0a;
- --foreground: #ededed;
- }
+ --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif;
}
body {
background: var(--background);
color: var(--foreground);
- font-family: Arial, Helvetica, sans-serif;
+ font-family: var(--font-inter), ui-sans-serif, system-ui, sans-serif;
}
diff --git a/app/layout.tsx b/app/layout.tsx
index 976eb90..bad8a44 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,20 +1,15 @@
import type { Metadata } from "next";
-import { Geist, Geist_Mono } from "next/font/google";
+import { Inter } from "next/font/google";
import "./globals.css";
-const geistSans = Geist({
- variable: "--font-geist-sans",
- subsets: ["latin"],
-});
-
-const geistMono = Geist_Mono({
- variable: "--font-geist-mono",
+const inter = Inter({
+ variable: "--font-inter",
subsets: ["latin"],
});
export const metadata: Metadata = {
- title: "Create Next App",
- description: "Generated by create next app",
+ title: "tvone — Notícias e entretenimento",
+ description: "O seu portal de notícias, música e cultura.",
};
export default function RootLayout({
@@ -23,11 +18,12 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
- {children}
+
+
+ {children}
+
);
}
diff --git a/app/page.tsx b/app/page.tsx
index 3f36f7c..e642835 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,65 +1,23 @@
-import Image from "next/image";
+import { TvoneHeader } from "./components/tvone-header";
+import { TvoneHero } from "./components/tvone-hero";
+import {
+ TvoneAdBanner,
+ TvoneDestaques,
+ TvoneFooter,
+ TvoneMainColumns,
+ TvoneServiceStrip,
+} from "./components/tvone-content";
export default function Home() {
return (
-
-
-
-
-
- To get started, edit the page.tsx file.
-
-
- Looking for a starting point or more instructions? Head over to{" "}
-
- Templates
- {" "}
- or the{" "}
-
- Learning
- {" "}
- center.
-
-
-
-
+
+
+
+
+
+
+
+
);
}
diff --git a/next.config.ts b/next.config.ts
index e9ffa30..886e38f 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -1,7 +1,15 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
- /* config options here */
+ images: {
+ remotePatterns: [
+ {
+ protocol: "https",
+ hostname: "images.unsplash.com",
+ pathname: "/**",
+ },
+ ],
+ },
};
export default nextConfig;
diff --git a/public/site-reference.png b/public/site-reference.png
new file mode 100644
index 0000000..c7fb18a
Binary files /dev/null and b/public/site-reference.png differ