Blog Configurator

Colecție de componente pentru configurarea blogului în proiecte Next.js + TailwindCSS. Exemple live + explicații de utilizare.

BlogLayout

Componenta principală pentru renderizarea articolelor de blog. Parsează structura JSON și renderizează blocuri de conținut în ordine. Suportă multi-limbă (ro/en), metadata (autor, dată, tag-uri, cover), și un array flexibil de blocuri de conținut.

Viitorul dezvoltării web

Autor:Tudor-Christian DamianData:
TechWeb DevelopmentNext.js

O analiză profundă a tendințelor actuale și viitoare în dezvoltarea web modernă.

Introducere

Dezvoltarea web a evoluat semnificativ în ultimii ani, iar tehnologiile moderne permit crearea de aplicații complexe cu ușurință.

Exemplu de bază cu articol demo în română.

Utilizare

import BlogLayout from "@/components/blog-configurator/BlogLayout";
import type { BlogArticle } from "@/components/blog-configurator/types/index";

const article: BlogArticle = {
  slug: "my-article",
  date: "2024-01-15",
  author: "John Doe",
  cover: "/cover.jpg", // sau coverVideo: "/video.mp4"
  tags: ["Tech", "Web"],
  ro: {
    title: "Titlul articolului",
    excerpt: "Rezumat scurt...",
    content: [
      { type: "Title", content: "Titlu", level: 2 },
      { type: "Paragraph", content: "Conținut..." },
    ],
  },
  en: {
    title: "Article Title",
    excerpt: "Short summary...",
    content: [
      { type: "Title", content: "Title", level: 2 },
      { type: "Paragraph", content: "Content..." },
    ],
  },
};

<BlogLayout article={article} language="ro" />
  • article — obiect JSON cu structura articolului (slug, date, author, cover/coverVideo, tags, ro/en).
  • cover — URL imagine cover (opțional).
  • coverVideo — URL video cover (opțional, are prioritate față de cover dacă este setat).
  • languagero | en (implicit: ro).
  • defaultTextColor — culoare text implicită (implicit: text-foreground).
  • defaultMaxWidth — lățime maximă implicită (implicit: max-w-4xl).
  • defaultPadding — padding implicit (implicit: px-4 md:px-6).
  • Fiecare bloc de conținut din content poate avea props pentru background, overlay, culori, fonturi, etc.

Title

Bloc pentru titluri (h1-h6). Suportă aliniere, nivel de heading, background (color/gradient/image/video), overlay, și stilizare completă.

Titlu simplu

Titlu simplu, nivel 1, aliniat la stânga.

Titlu cu gradient

Titlu centrat cu background gradient.

Titlu cu imagine de fundal

Titlu cu imagine de fundal și overlay pentru contrast.

Utilizare

{
  type: "Title",
  content: "Titlul meu",
  level: 1, // 1 | 2 | 3 | 4 | 5 | 6
  align: "left", // "left" | "center" | "right"
  backgroundType: "color", // "color" | "gradient" | "image" | "video"
  backgroundValue: "bg-gray-100",
  overlay: "none", // "none" | "tint" | "gradient"
  textColorClass: "text-foreground",
  paddingClass: "p-4 md:p-6",
  marginClass: "mb-4 md:mb-6",
  maxWidthClass: "max-w-4xl",
  titleClassName: "custom-class",
}
  • content — textul titlului (obligatoriu).
  • level — nivelul heading-ului: 1 | 2 | 3 | 4 | 5 | 6 (implicit: 1).
  • align — aliniere: left | center | right (implicit: left).
  • backgroundType — tip de fundal: color | gradient | image | video.
  • backgroundValue — valoare pentru fundal (clasă Tailwind sau URL).
  • overlay — overlay pentru contrast: none | tint | gradient.
  • Toate props-urile comune (padding, margin, maxWidth, textColor, fontClassName) sunt disponibile.

Subtitle

Bloc pentru subtitluri (h2-h4). Similar cu Title, dar optimizat pentru subtitluri cu opțiuni de dimensiune și greutate font.

Subtitlu simplu

Subtitlu simplu, nivel 2.

Subtitlu cu gradient

Subtitlu centrat cu gradient background.

Utilizare

{
  type: "Subtitle",
  content: "Subtitlul meu",
  level: 2, // 2 | 3 | 4
  align: "left",
  size: "base", // "sm" | "base" | "lg"
  backgroundType: "color",
  backgroundValue: "bg-gray-50",
}
  • level — nivelul heading-ului: 2 | 3 | 4 (implicit: 2).
  • size — greutate font: sm (medium) | base (semibold) | lg (bold).
  • Similar cu Title, dar optimizat pentru subtitluri.

Paragraph

Bloc pentru paragrafe de text. Suportă aliniere, dimensiune, background, overlay, și stilizare completă.

Acesta este un paragraf simplu de text. Poate conține orice conținut textual și suportă aliniere, dimensiune, și stilizare completă.

Paragraf simplu, aliniat la stânga.

Paragraf centrat cu background gradient și text colorat. Perfect pentru evidențierea unor secțiuni importante.

Paragraf centrat cu gradient background.

Paragraf justificat cu dimensiune mare. Textul este distribuit uniform pe toată lățimea blocului pentru o citire mai plăcută.

Paragraf justificat, dimensiune mare.

Utilizare

{
  type: "Paragraph",
  content: "Textul paragrafului...",
  align: "left", // "left" | "center" | "right" | "justify"
  size: "base", // "sm" | "base" | "lg" | "xl"
  backgroundType: "color",
  backgroundValue: "bg-gray-50",
  overlay: "none",
  textColorClass: "text-foreground",
  paddingClass: "p-4 md:p-6",
  paragraphClassName: "custom-class",
}
  • content — textul paragrafului (obligatoriu).
  • align — aliniere: left | center | right | justify (implicit: left).
  • size — dimensiune text: sm | base | lg | xl (implicit: base).
  • Toate props-urile comune pentru background, overlay, padding, margin, etc. sunt disponibile.

TitleWithParagraph

Bloc combinat care include un titlu și un paragraf. Util pentru secțiuni introductive sau pentru evidențierea unor informații importante.

Titlu combinat

Acesta este un paragraf care vine imediat după titlu. Perfect pentru secțiuni introductive sau pentru evidențierea unor informații importante.

Titlu și paragraf combinate, aliniate la stânga.

Titlu centrat

Paragraf centrat care vine după titlu. Ideal pentru secțiuni hero sau pentru evidențierea unor mesaje importante.

Titlu și paragraf centrate cu gradient background.

Utilizare

{
  type: "TitleWithParagraph",
  title: "Titlul meu",
  paragraph: "Paragraful meu...",
  titleLevel: 2, // 2 | 3 | 4
  titleAlign: "left", // "left" | "center" | "right"
  paragraphAlign: "left", // "left" | "center" | "right" | "justify"
  gapClass: "gap-4", // spațiere între titlu și paragraf
  backgroundType: "color",
  backgroundValue: "bg-gray-50",
}
  • title — textul titlului (obligatoriu).
  • paragraph — textul paragrafului (obligatoriu).
  • gapClass — spațiere între titlu și paragraf (implicit: gap-4).
  • Alinierea titlului și paragrafului poate fi diferită.

Image

Bloc pentru imagini. Suportă caption, object-fit, rounded corners, background, overlay, și stilizare completă.

Softeneers Logo

Imagine simplă cu object-fit contain.

Background Image
Imagine cu caption și rounded corners mari

Imagine cu caption și stilizare.

Utilizare

{
  type: "Image",
  src: "/path/to/image.jpg",
  alt: "Descriere imagine",
  width: 1200,
  height: 600,
  objectFit: "cover", // "contain" | "cover" | "fill" | "none" | "scale-down"
  roundedClass: "rounded-lg",
  caption: "Caption opțional",
  backgroundType: "color",
  backgroundValue: "bg-gray-50",
}
  • src — URL-ul imaginii (obligatoriu).
  • alt — text alternativ (obligatoriu).
  • objectFit — modul de redare: contain | cover | fill | none | scale-down.
  • caption — caption opțional sub imagine.
  • Toate props-urile comune pentru background, overlay, padding, margin sunt disponibile.

Video

Bloc pentru videouri. Suportă poster (thumbnail), autoplay, loop, muted, controls, caption, și stilizare completă.

Video simplu cu controls.

Video autoplay cu loop și fără controls

Video autoplay, loop, fără controls.

Utilizare

{
  type: "Video",
  src: "/path/to/video.mp4",
  poster: "/path/to/poster.jpg", // thumbnail opțional
  autoPlay: false,
  loop: false,
  muted: false,
  controls: true,
  width: 1200,
  height: 600,
  roundedClass: "rounded-lg",
  caption: "Caption opțional",
}
  • src — URL-ul videoului (obligatoriu).
  • poster — imagine thumbnail opțională.
  • autoPlay — redare automată (implicit: false).
  • loop — buclă continuă (implicit: false).
  • muted — fără sunet (implicit: false).
  • controls — afișează controls (implicit: true).

ParagraphWithImage

Bloc combinat care include un paragraf și o imagine. Suportă layout-uri flexibile: imagine stânga/dreapta/top/bottom, cu opțiune de reverse pe mobile.

Acesta este un paragraf care vine alături de o imagine. Layout-ul poate fi configurat pentru a plasa imaginea la stânga, dreapta, sus sau jos.

Softeneers

Paragraf cu imagine la dreapta.

Paragraf cu imagine la stânga. Perfect pentru a crea un layout alternativ și mai dinamic.

Background

Caption pentru imagine

Paragraf cu imagine la stânga și gradient background.

Utilizare

{
  type: "ParagraphWithImage",
  content: "Textul paragrafului...",
  image: {
    src: "/path/to/image.jpg",
    alt: "Descriere",
    width: 600,
    height: 400,
    objectFit: "cover",
    roundedClass: "rounded-lg",
    caption: "Caption opțional",
  },
  layout: "image-right", // "image-left" | "image-right" | "image-top" | "image-bottom"
  paragraphAlign: "left",
  gapClass: "gap-6",
  reverseOnMobile: false, // inversează ordinea pe mobile
}
  • layout — poziția imaginii: image-left | image-right | image-top | image-bottom.
  • reverseOnMobile — inversează ordinea pe mobile pentru o experiență mai bună.
  • Imaginea suportă toate props-urile standard (objectFit, roundedClass, caption).

Embed

Bloc pentru embed-uri externe (YouTube, Vimeo, Twitter, iframe custom). Suportă aspect ratio, caption, și stilizare completă.

Embed YouTube (se detectează automat video ID-ul).

Video embedat din Vimeo

Embed Vimeo cu caption.

Utilizare

{
  type: "Embed",
  url: "https://www.youtube.com/watch?v=...",
  embedType: "youtube", // "youtube" | "vimeo" | "twitter" | "iframe" | "custom"
  aspectRatio: "16/9", // "16/9" | "4/3" | "1/1" | etc.
  width: 1200,
  height: 600,
  roundedClass: "rounded-lg",
  caption: "Caption opțional",
}
  • url — URL-ul embed-ului (obligatoriu).
  • embedType — tipul embed-ului: youtube | vimeo | twitter | iframe | custom (implicit: iframe).
  • aspectRatio — raportul de aspect (implicit: 16/9).
  • Pentru YouTube și Vimeo, video ID-ul este extras automat din URL.
  • Pentru alte tipuri, se folosește un iframe standard.

Quote

Bloc pentru citate. Suportă autor, rol autor, aliniere, dimensiune, variante (simple/bordered/highlighted), și stilizare completă.

Acesta este un citat simplu fără autor. Perfect pentru evidențierea unor mesaje importante.

Citat simplu, fără autor.

Acesta este un citat cu autor și rol. Perfect pentru testimoniale sau citate din interviuri.

John DoeCEO, Company Name

Citat cu autor și border la stânga.

Citat centrat cu background highlighted. Ideal pentru evidențierea unor mesaje foarte importante.

Jane Smith

Citat highlighted cu gradient background.

Utilizare

{
  type: "Quote",
  content: "Textul citatului...",
  author: "Nume Autor", // opțional
  authorRole: "Rol Autor", // opțional
  align: "left", // "left" | "center" | "right"
  size: "base", // "sm" | "base" | "lg" | "xl"
  variant: "simple", // "simple" | "bordered" | "highlighted"
  backgroundType: "color",
  backgroundValue: "bg-gray-50",
}
  • content — textul citatului (obligatoriu).
  • author — numele autorului (opțional).
  • authorRole — rolul/autoritatea autorului (opțional).
  • variant — stil: simple | bordered (border la stânga) | highlighted (background colorat).
  • size — dimensiune text: sm | base | lg | xl.

Code

Bloc pentru cod sursă. Suportă highlight de sintaxă (prin language), filename, line numbers, și stilizare completă.

greet.ts
function greet(name: string) {
  return `Hello, ${name}!`;
}

Bloc de cod cu filename și language.

const data = {
  name: "Softeneers",
  version: "1.0.0"
};

Bloc de cod simplu, fără filename.

Utilizare

{
  type: "Code",
  code: "const x = 1;",
  language: "javascript", // "typescript" | "javascript" | "css" | etc.
  filename: "example.js", // opțional
  showLineNumbers: false, // opțional
  codeClassName: "custom-class",
  containerClassName: "custom-container",
}
  • code — codul sursă (obligatoriu).
  • language — limba pentru syntax highlighting (opțional).
  • filename — numele fișierului afișat deasupra codului (opțional).
  • showLineNumbers — afișează numere de linie (implicit: false).
  • Background-ul este întotdeauna dark (bg-neutral-950) pentru contrast.

List

Bloc pentru liste (ordered/unordered). Suportă aliniere, gap între items, și stilizare completă.

  • Primul element al listei
  • Al doilea element
  • Al treilea element

Listă neordonată (unordered).

  1. Primul pas
  2. Al doilea pas
  3. Al treilea pas

Listă ordonată (ordered) cu gradient background.

Utilizare

{
  type: "List",
  items: [
    "Element 1",
    "Element 2",
    "Element 3",
  ],
  listType: "unordered", // "unordered" | "ordered"
  align: "left", // "left" | "center" | "right"
  gapClass: "gap-2", // spațiere între items
  itemClassName: "custom-item",
  listClassName: "custom-list",
}
  • items — array de string-uri (obligatoriu).
  • listType — tipul listei: unordered (bullet points) | ordered (numere) (implicit: unordered).
  • gapClass — spațiere între items (implicit: gap-2).
  • Toate props-urile comune pentru background, overlay, padding, margin sunt disponibile.

Table

Bloc pentru tabele. Suportă headers, rows, caption, variante (simple/bordered/striped), și stilizare completă.

NumeVârstăOraș
John Doe30București
Jane Smith25Cluj

Tabel simplu, fără border.

Tabel cu border
ProdusPrețStoc
Laptop5000 RON10
Mouse100 RON50

Tabel cu border și caption.

Tabel cu striped rows
IDNumeStatus
1Item 1Active
2Item 2Inactive
3Item 3Active

Tabel cu striped rows (alternate background).

Utilizare

{
  type: "Table",
  headers: ["Header 1", "Header 2", "Header 3"],
  rows: [
    ["Row 1 Col 1", "Row 1 Col 2", "Row 1 Col 3"],
    ["Row 2 Col 1", "Row 2 Col 2", "Row 2 Col 3"],
  ],
  caption: "Caption opțional",
  variant: "simple", // "simple" | "bordered" | "striped"
  tableClassName: "custom-table",
  headerClassName: "custom-header",
  cellClassName: "custom-cell",
}
  • headers — array de string-uri pentru header-e (obligatoriu).
  • rows — array de array-uri de string-uri pentru rânduri (obligatoriu).
  • variant — stilul tabelului: simple | bordered | striped (implicit: simple).
  • caption — caption opțional deasupra tabelului.
  • Tabelul este responsive și are scroll orizontal pe ecrane mici.

Divider

Bloc pentru separatori vizuali. Suportă variante (solid/dashed/dotted), grosime, culoare, și margin customizabil.

Conținut deasupra


Conținut dedesubt

Divider solid, grosime medie.

Conținut deasupra


Conținut dedesubt

Divider dashed, grosime mare, culoare indigo.

Conținut deasupra


Conținut dedesubt

Divider dotted, grosime mică, culoare purple.

Utilizare

{
  type: "Divider",
  variant: "solid", // "solid" | "dashed" | "dotted"
  thickness: "medium", // "thin" | "medium" | "thick"
  colorClass: "border-gray-300", // clasă Tailwind pentru culoare
  marginClass: "my-8", // margin vertical
}
  • variant — stilul liniei: solid | dashed | dotted (implicit: solid).
  • thickness — grosimea: thin (1px) | medium (2px) | thick (4px) (implicit: medium).
  • colorClass — clasă Tailwind pentru culoare (implicit: border-gray-300).
  • marginClass — margin vertical (implicit: my-8).