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

+ + + 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 ( +
+ + +
+
+ Mulher em atividade ao ar livre +
+
+ +
+
+ + Nossa Seguros + +

+ Seguro Saúde Mulher — cuidado que acompanha o seu ritmo. +

+
+
+ Redes sociais + + f + + + in + + + ◎ + +
+
+ +
+ Bem-estar e cuidados de saúde +
+
+
+ +
+
+
+ tv +
+ tvone +
+
+
+ ); +} 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 ? ( + {imageAlt} + ) : ( +
+
+

{title}

+

{subtitle}

+
+ + 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 ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
-
- - Vercel logomark - Deploy Now - - - Documentation - -
-
+
+ + + + + + +
); } 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