Viitorul dezvoltării web
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ță.
Colecție de componente pentru configurarea blogului în proiecte Next.js + TailwindCSS. Exemple live + explicații de utilizare.
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.
O analiză profundă a tendințelor actuale și viitoare în dezvoltarea web modernă.
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ă.
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).language — ro | 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).content poate avea props pentru background, overlay, culori, fonturi, etc.Bloc pentru titluri (h1-h6). Suportă aliniere, nivel de heading, background (color/gradient/image/video), overlay, și stilizare completă.
Titlu simplu, nivel 1, aliniat la stânga.
Titlu centrat cu background gradient.
Titlu cu imagine de fundal și overlay pentru contrast.
{
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.Bloc pentru subtitluri (h2-h4). Similar cu Title, dar optimizat pentru subtitluri cu opțiuni de dimensiune și greutate font.
Subtitlu simplu, nivel 2.
Subtitlu centrat cu gradient background.
{
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).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.
{
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).Bloc combinat care include un titlu și un paragraf. Util pentru secțiuni introductive sau pentru evidențierea unor informații importante.
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.
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.
{
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).Bloc pentru imagini. Suportă caption, object-fit, rounded corners, background, overlay, și stilizare completă.

Imagine simplă cu object-fit contain.

Imagine cu caption și stilizare.
{
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.Bloc pentru videouri. Suportă poster (thumbnail), autoplay, loop, muted, controls, caption, și stilizare completă.
Video simplu cu controls.
Video autoplay, loop, fără controls.
{
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).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.

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

Caption pentru imagine
Paragraf cu imagine la stânga și gradient background.
{
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ă.Bloc pentru galerii de imagini. Suportă layout-uri multiple (grid/masonry/carousel), captions, și stilizare completă.



Galerie grid cu 3 coloane.


Galerie masonry cu captions.
{
type: "Gallery",
images: [
{ src: "/image1.jpg", alt: "Image 1", caption: "Caption 1" },
{ src: "/image2.jpg", alt: "Image 2" },
],
layout: "grid", // "grid" | "masonry" | "carousel"
columnsClass: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
gapClass: "gap-4",
roundedClass: "rounded-lg",
showCaptions: false,
}images — array de obiecte cu src, alt, caption (opțional) (obligatoriu).layout — tipul layout-ului: grid | masonry | carousel (implicit: grid).columnsClass — clase Tailwind pentru coloane (ex: grid-cols-1 sm:grid-cols-2).showCaptions — afișează captions (implicit: false).carousel creează un scroll orizontal.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).
Embed Vimeo cu caption.
{
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).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.”
Citat cu autor și border la stânga.
“Citat centrat cu background highlighted. Ideal pentru evidențierea unor mesaje foarte importante.”
Citat highlighted cu gradient background.
{
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.Bloc pentru cod sursă. Suportă highlight de sintaxă (prin language), filename, line numbers, și stilizare completă.
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.
{
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).Bloc pentru liste (ordered/unordered). Suportă aliniere, gap între items, și stilizare completă.
Listă neordonată (unordered).
Listă ordonată (ordered) cu gradient background.
{
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).Bloc pentru tabele. Suportă headers, rows, caption, variante (simple/bordered/striped), și stilizare completă.
| Nume | Vârstă | Oraș |
|---|---|---|
| John Doe | 30 | București |
| Jane Smith | 25 | Cluj |
Tabel simplu, fără border.
| Produs | Preț | Stoc |
|---|---|---|
| Laptop | 5000 RON | 10 |
| Mouse | 100 RON | 50 |
Tabel cu border și caption.
| ID | Nume | Status |
|---|---|---|
| 1 | Item 1 | Active |
| 2 | Item 2 | Inactive |
| 3 | Item 3 | Active |
Tabel cu striped rows (alternate background).
{
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.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.
{
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).Bloc pentru afișarea articolelor recomandate. Suportă grid layout, cards cu cover, excerpt, date, și stilizare completă.
Grid de articole recomandate cu cover, title, excerpt și date.
Grid de articole cu gradient background.
{
type: "SeeMoreArticles",
title: "Articole recomandate", // opțional
articles: [
{
slug: "article-slug",
title: "Titlul articolului",
excerpt: "Rezumat...", // opțional
cover: "/cover.jpg", // opțional
date: "2024-01-15", // opțional
},
],
columnsClass: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
gapClass: "gap-6",
cardClassName: "custom-card",
}articles — array de obiecte cu articole (obligatoriu).slug — slug-ul articolului (folosit pentru link).title — titlul articolului (obligatoriu).excerpt — rezumat scurt (opțional).cover — imagine cover (opțional).date — data articolului (opțional).