Exerciศ›iu Seminar:

Portofoliu personal cu DOM Manipulation ศ™i GitHub

Obiectiv general

Studenศ›ii vor crea pagini personale dinamice folosind HTML, CSS, JavaScript ศ™i GitHub, consolidรขnd cunoศ™tinศ›ele de manipulare DOM ศ™i colaborare prin Git.

Structura proiectului

web-portfolio-2025/
โ”‚
โ”œโ”€โ”€ index.html              # Pagina principalฤƒ (catalog studenศ›i)
โ”œโ”€โ”€ main.css                # Stiluri pentru pagina principalฤƒ
โ”œโ”€โ”€ main.js                 # Script pentru pagina principalฤƒ
โ”œโ”€โ”€ students.json           # JSON master cu lista studenศ›ilor
โ”‚
โ””โ”€โ”€ students/               # Folder pentru paginile individuale
    โ”œโ”€โ”€ popescu-ion/
    โ”‚   โ”œโ”€โ”€ index.html
    โ”‚   โ”œโ”€โ”€ styles.css
    โ”‚   โ””โ”€โ”€ script.js
    โ”‚
    โ”œโ”€โ”€ ionescu-maria/
    โ”‚   โ”œโ”€โ”€ index.html
    โ”‚   โ”œโ”€โ”€ styles.css
    โ”‚   โ””โ”€โ”€ script.js
    โ”‚
    โ””โ”€โ”€ ... (alte foldere studenti)

Cerinศ›e pentru fiecare student

1. Crearea paginii personale

Fiecare student va crea un folder รฎn students/ cu structura:

  • Nume folder: prenume-nume (lowercase, cu cratimฤƒ, fฤƒrฤƒ diacritice)

    • Exemplu: popescu-ion, ionescu-maria

2. Structura JSON personalฤƒ (Hardcoded รฎn script.js)

// script.js - รฎncepe cu JSON-ul personal
const studentData = {
  personalInfo: {
    firstName: "Ion",
    lastName: "Popescu",
    email: "ion.popescu@csie.ase.ro",
    phone: "+40 123 456 789",
    birthDate: "2003-05-15"
  },
  education: {
    university: "BUES",
    faculty: "CSIE - eBusiness",
    year: 1,
    group: "1234A"
  },
  skills: [
    { name: "HTML", level: 80, category: "Frontend" },
    { name: "CSS", level: 75, category: "Frontend" },
    { name: "JavaScript", level: 70, category: "Frontend" },
    { name: "Python", level: 60, category: "Backend" }
  ],
  projects: [
    {
      title: "Primul meu website",
      description: "Un website personal creat cu HTML ศ™i CSS",
      technologies: ["HTML", "CSS"],
      link: "https://github.com/username/project1"
    },
    {
      title: "Calculator JavaScript",
      description: "Calculator funcศ›ional cu operaศ›ii matematice",
      technologies: ["HTML", "CSS", "JavaScript"],
      link: "https://github.com/username/project2"
    }
  ],
  avatar: "https://ui-avatars.com/api/?name=Ion+Popescu&size=200&background=random"
};

Cerinศ›e JSON:

  • Minimum 3 niveluri de nested objects (exemplu: studentData.personalInfo.firstName)

  • Cel puศ›in 2 arrays cu obiecte (exemplu: skills, projects)

  • Proprietatea avatar trebuie sฤƒ foloseascฤƒ un generator automat:

    • UI Avatars: https://ui-avatars.com/api/?name=Prenume+Nume&size=200

    • DiceBear: https://api.dicebear.com/7.x/initials/svg?seed=PrenumeNume

    • RoboHash: https://robohash.org/PrenumeNume.png?size=200x200

3. Fiศ™ierul index.html (template minimal)

<!DOCTYPE html>
<html lang="ro">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Portofoliu - [Prenume Nume]</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <!-- Conศ›inutul va fi generat dinamic de JavaScript -->
  <div id="app"></div>
  
  <script src="script.js"></script>
</body>
</html>

Cerinศ›ฤƒ importantฤƒ: Tot conศ›inutul paginii trebuie generat dinamic prin JavaScript!

4. Fiศ™ierul script.js (Manipulare DOM)

Cerinศ›e obligatorii:

// 1. JSON-ul studentData (vezi mai sus)

// 2. Funcศ›ie pentru crearea structurii paginii
function createPersonalPage() {
  const app = document.getElementById('app');
  
  // Creeazฤƒ elementele DOM dinamic:
  // - Header cu avatar ศ™i nume
  // - Secศ›iune informaศ›ii personale
  // - Secศ›iune educaศ›ie
  // - Secศ›iune skills (cu bare de progres)
  // - Secศ›iune proiecte (carduri)
  // - Footer cu link-uri sociale
  
  // Exemplu pentru header:
  const header = document.createElement('header');
  header.className = 'hero';
  
  const avatar = document.createElement('img');
  avatar.src = studentData.avatar;
  avatar.alt = `${studentData.personalInfo.firstName} ${studentData.personalInfo.lastName}`;
  avatar.className = 'avatar';
  
  const name = document.createElement('h1');
  name.textContent = `${studentData.personalInfo.firstName} ${studentData.personalInfo.lastName}`;
  
  header.appendChild(avatar);
  header.appendChild(name);
  app.appendChild(header);
  
  // ... continuฤƒ cu restul secศ›iunilor
}

// 3. Apeleazฤƒ funcศ›ia cรขnd DOM-ul este gata
document.addEventListener('DOMContentLoaded', createPersonalPage);

Cerinศ›e tehnice pentru script.js:

  • Minimum 5 tipuri diferite de elemente HTML create dinamic

  • Folosirea createElement, appendChild, textContent, innerHTML

  • Setarea className sau classList pentru stilizare

  • Iterare prin arrays cu forEach sau for...of

  • Acces la proprietฤƒศ›i nested din JSON (ex: studentData.personalInfo.firstName)

  • Cel puศ›in 1 event listener (exemplu: click pe proiect, hover pe skill)

5. Fiศ™ierul styles.css

Cerinศ›e obligatorii:

  • Layout responsive (mobile-first cu media queries)

  • Stilizare pentru toate clasele folosite รฎn JavaScript

  • Minimum 3 culori coordonate (folosiศ›i CSS variables)

  • Avatar rotund cu border-radius: 50%

Exemplu de structurฤƒ:

:root {
  --primary-color: #3498db;
  --secondary-color: #2ecc71;
  --text-color: #333;
  --bg-color: #f8f9fa;
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  color: var(--text-color);
  background-color: var(--bg-color);
  line-height: 1.6;
}

.hero {
  text-align: center;
  padding: 3rem 1rem;
  background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
  color: white;
}

.avatar {
  width: 200px;
  height: 200px;
  border-radius: 50%;
  border: 5px solid white;
  box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}

/* ... restul stilurilor */

Cerinศ›e pentru Pagina Principalฤƒ (catalog)

Responsabil: Un student voluntar

1. Fiศ™ierul students.json (root), actualizat de studentul voluntar la fiecare pull request

{
  "course": "TIC - Web Technologies",
  "semester": "2025-2026",
  "students": [
    {
      "id": 1,
      "firstName": "Ion",
      "lastName": "Popescu",
      "folder": "popescu-ion"
    },
    {
      "id": 2,
      "firstName": "Maria",
      "lastName": "Ionescu",
      "folder": "ionescu-maria"
    }
  ]
}

2. Fiศ™ierul index.html (root)

<!DOCTYPE html>
<html lang="ro">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Catalog Studenศ›i - Web Technologies 2025</title>
  <link rel="stylesheet" href="main.css">
</head>
<body>
  <header>
    <h1>Catalog Portofolii Studenศ›i</h1>
    <p>Web Technologies - 2025/2026</p>
  </header>
  
  <main>
    <div id="students-grid">
      <!-- Carduri generate dinamic din students.json -->
    </div>
  </main>
  
  <footer>
    <p>&copy; BUES - eBUSINESS</p>
  </footer>
  
  <script src="main.js"></script>
</body>
</html>

3. Fiศ™ierul main.js (root)

async function loadStudents() {
  try {
    const response = await fetch('students.json');
    const data = await response.json();
    renderStudentCards(data.students);
  } catch (error) {
    console.error('Eroare la รฎncฤƒrcarea studenศ›ilor:', error);
  }
}

function renderStudentCards(students) {
  const grid = document.getElementById('students-grid');
  
  students.forEach(student => {
    const card = document.createElement('div');
    card.className = 'student-card';
    
    const avatar = document.createElement('img');
    avatar.src = student.avatar;
    avatar.alt = `${student.firstName} ${student.lastName}`;
    
    const name = document.createElement('h3');
    name.textContent = `${student.firstName} ${student.lastName}`;
    
    const group = document.createElement('p');
    group.textContent = `Grupa: ${student.group}`;
    
    const link = document.createElement('a');
    link.href = `students/${student.folder}/index.html`;
    link.textContent = 'Vezi portofoliu โ†’';
    link.className = 'portfolio-link';
    
    card.appendChild(avatar);
    card.appendChild(name);
    card.appendChild(group);
    card.appendChild(link);
    
    grid.appendChild(card);
  });
}

document.addEventListener('DOMContentLoaded', loadStudents);

Workflow GitHub

Pasul 1: Iniศ›ializare Repo (Student voluntar)

# Voluntarul creeazฤƒ repo-ul principal
git init web-portfolio-2025
cd web-portfolio-2025

# Structurฤƒ iniศ›ialฤƒ
mkdir students
touch index.html main.css main.js students.json README.md

# Commit iniศ›ial
git add .
git commit -m "Initial structure"

# Push pe GitHub
git remote add origin https://github.com/username/web-portfolio-2025.git
git push -u origin main

Pasul 2: Fork ศ™i Clone (fiecare student)

  1. Fork repo-ul principal pe contul propriu GitHub

  2. Clone fork-ul local:

git clone https://github.com/ContulTau/web-portfolio-2025.git
cd web-portfolio-2025

Pasul 3: Creare Branch ศ™i dezvoltare (student)

# Creeazฤƒ branch propriu
git checkout -b add-popescu-ion

# Creeazฤƒ folderul personal
mkdir -p students/popescu-ion
cd students/popescu-ion

# Creeazฤƒ fiศ™ierele (index.html, styles.css, script.js)
# ... dezvoltฤƒ pagina personalฤƒ ...

# Adaugฤƒ modificฤƒrile
git add students/popescu-ion/
git commit -m "Add personal portfolio for Ion Popescu"

# Push branch
git push origin add-popescu-ion

Pasul 4: Pull Request (student)

  1. Acceseazฤƒ fork-ul pe GitHub

  2. Click pe "Compare & pull request"

  3. Titlu: Add portfolio - Prenume Nume

  4. Descriere:

    - Adฤƒugat pagina personalฤƒ pentru [Prenume Nume]- Folder: students/popescu-ion/- JSON complet cu informaศ›ii personale- Paginฤƒ generatฤƒ dinamic cu DOM manipulation
  5. Submit pull request

Pasul 5: Review ศ™i Merge (Voluntar)

Git CheatSheet

# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# FAZA 1: SETUP INIศšIAL (o singurฤƒ datฤƒ)
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

# 1. Fork repo-ul pe GitHub (click pe butonul "Fork" รฎn interfaศ›a web)
# URL repo original: https://github.com/user-voluntar/web-portfolio-2025

# 2. Cloneazฤƒ fork-ul Tฤ‚U pe calculatorul local (autentificare cu PAT)
git clone https://github.com/ContulTau/web-portfolio-2025.git
cd web-portfolio-2025

# 3. Configureazฤƒ upstream (repo-ul studentului voluntar)
git remote add upstream https://github.com/user-voluntar/web-portfolio-2025.git

# 4. Verificฤƒ cฤƒ ai ambele remote-uri
git remote -v
# Output:
# origin    https://github.com/ContulTau/web-portfolio-2025.git (fetch)
# origin    https://github.com/ContulTau/web-portfolio-2025.git (push)
# upstream  https://github.com/user-voluntar/web-portfolio-2025.git (fetch)
# upstream  https://github.com/user-voluntar/web-portfolio-2025.git (push)


# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# FAZA 2: SINCRONIZARE รŽNAINTE DE LUCRU
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

# 5. Asigurฤƒ-te cฤƒ ai ultima versiune de pe main
git checkout main
git pull upstream main
git push origin main  # Actualizeazฤƒ ศ™i fork-ul tฤƒu pe GitHub


# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# FAZA 3: CREAREA BRANCH-ULUI ศ˜I รŽNCEPEREA LUCRULUI
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

# 6. Creeazฤƒ branch-ul tฤƒu de lucru (foloseศ™te numele tฤƒu!)
git checkout -b add-popescu-ion

# 7. Creeazฤƒ folderul ศ™i fiศ™ierele tale
mkdir -p students/popescu-ion
cd students/popescu-ion

# Creeazฤƒ fiศ™ierele
touch index.html styles.css script.js

# 8. Lucreazฤƒ la proiect (editeazฤƒ fiศ™ierele รฎn editor)
# - Adaugฤƒ JSON-ul รฎn script.js
# - Creeazฤƒ HTML-ul minimal รฎn index.html
# - Stilizeazฤƒ รฎn styles.css

# 9. Commit-uri pe parcurs (fฤƒ mai multe, nu unul singur!)
cd ../..  # รŽnapoi รฎn root
git add students/popescu-ion/
git commit -m "Add HTML structure and initial JSON data"

# ... continui sฤƒ lucrezi...

git add students/popescu-ion/
git commit -m "Add CSS styling with flexbox layout"

# ... continui sฤƒ lucrezi...

git add students/popescu-ion/
git commit -m "Add JavaScript DOM manipulation"


# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# FAZA 4: PUSH BRANCH-UL (prima datฤƒ sau dupฤƒ modificฤƒri)
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

# 10. Push branch-ul pe fork-ul tฤƒu
git push origin add-popescu-ion


# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# โฐ รŽNTRE TIMP: Alศ›i studenศ›i au fฤƒcut PR-uri care au fost acceptate pe main
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# Studentul voluntar a merge-uit PR-urile pentru:
# - ionescu-maria
# - vasilescu-ana
# Main-ul de pe upstream acum are mai multe foldere รฎn students/


# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# FAZA 5: ACTUALIZARE BRANCH CU MODIFICฤ‚RILE DIN MAIN
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

# 11. Salveazฤƒ munca curentฤƒ (dacฤƒ ai modificฤƒri nesalvate)
git status  # Verificฤƒ ce modificฤƒri ai

# Dacฤƒ ai modificฤƒri uncommitted:
git add .
git commit -m "Work in progress - before sync"

# 12. Treci pe main ศ™i actualizeazฤƒ-l cu upstream
git checkout main
git pull upstream main              # Descarcฤƒ modificฤƒrile de la repo-ul principal
git push origin main                # (Opศ›ional) Actualizeazฤƒ ศ™i fork-ul pe GitHub

# 13. Revino pe branch-ul tฤƒu ศ™i รฎmbinฤƒ modificฤƒrile din main
git checkout add-popescu-ion
git merge main                      # Aduce modificฤƒrile din main รฎn branch-ul tฤƒu

# Dacฤƒ merge-ul reuศ™eศ™te fฤƒrฤƒ conflicte, vei vedea:
# "Merge made by the 'recursive' strategy."
# sau "Already up to date." (dacฤƒ nu erau modificฤƒri noi)

# Dacฤƒ apar conflicte (rar รฎn acest proiect!):
# - Editeazฤƒ manual fiศ™ierele marcate cu conflict
# - git add fisier-rezolvat
# - git commit


# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# FAZA 6: VERIFICARE ศ˜I TESTARE
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

# 14. Verificฤƒ cฤƒ totul funcศ›ioneazฤƒ
# Deschide students/popescu-ion/index.html รฎn browser
# Verificฤƒ consola pentru erori JavaScript
# Testeazฤƒ cฤƒ toate elementele se creeazฤƒ corect

# 15. Dacฤƒ ai fฤƒcut modificฤƒri dupฤƒ merge, commit-eazฤƒ-le
git add .
git commit -m "Fix styling after merge with main"


# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# FAZA 7: PUSH FINAL ศ˜I PULL REQUEST
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

# 16. Push branch-ul actualizat
git push origin add-popescu-ion

# 17. Creeazฤƒ Pull Request pe GitHub:
# - Mergi pe https://github.com/ContulTau/web-portfolio-2025
# - Vei vedea un banner galben: "add-popescu-ion had recent pushes"
# - Click pe "Compare & pull request"
# - Asigurฤƒ-te cฤƒ:
#   * Base repository: user-voluntar/web-portfolio-2025
#   * Base: main
#   * Head repository: ContulTau/web-portfolio-2025
#   * Compare: add-popescu-ion
# - Titlu: "Add portfolio - Ion Popescu"
# - Descriere:
#   ```
#   ## Modificฤƒri
#   - Adฤƒugat pagina personalฤƒ pentru Ion Popescu
#   - Folder: `students/popescu-ion/`
#   - JSON complet cu informaศ›ii personale pe 3 niveluri
#   - Paginฤƒ generatฤƒ 100% dinamic cu JavaScript
#   - Design responsive cu Flexbox
#   
#   ## Checklist
#   - [x] JSON cu minimum 3 niveluri nested
#   - [x] Minimum 5 tipuri de elemente HTML create dinamic
#   - [x] CSS responsive cu media queries
#   - [x] Event listeners funcศ›ionali
#   - [x] Cod testat รฎn browser
#   ```
# - Click "Create pull request"


# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# FAZA 8: DUPฤ‚ MERGE (cรขnd voluntarul acceptฤƒ PR-ul)
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

# 18. Dupฤƒ ce PR-ul e acceptat, actualizeazฤƒ-ศ›i repo-ul local
git checkout main
git pull upstream main
git push origin main

# 19. ศ˜terge branch-ul local (nu mai e nevoie de el)
git branch -d add-popescu-ion

# 20. (Opศ›ional) ศ˜terge branch-ul de pe GitHub
git push origin --delete add-popescu-ion

Last updated

Was this helpful?