From e21f3a7cc584f183f81fb3acbd66622350bb5b2c Mon Sep 17 00:00:00 2001 From: Christopher Ament Date: Thu, 13 Mar 2025 16:07:55 -0400 Subject: [PATCH 01/87] Add localStorage functionality for persistent colors and drag-and-drop state --- views/project_template.ejs | 315 +++++++++++++++++++++++++------------ 1 file changed, 218 insertions(+), 97 deletions(-) diff --git a/views/project_template.ejs b/views/project_template.ejs index 05fd953..fa1d169 100644 --- a/views/project_template.ejs +++ b/views/project_template.ejs @@ -339,6 +339,209 @@ const createColumnForm = document.getElementById('createColumnForm'); const createDocumentForm = document.getElementById('createDocumentForm'); const dragparent = document.getElementById('dragparent'); + let columnDrake; + let documentDrake; + + // Move these functions to be accessible in the entire init scope + function initDragula() { + // Initialize column dragula + if (columnDrake) { + columnDrake.destroy(); + } + + columnDrake = dragula([dragparent], { + moves: function (el, container, handle) { + return el.classList.contains('dragColumn') && + (handle.tagName === 'NAV' || handle.parentElement.tagName === 'NAV'); + }, + accepts: function (el, target) { + return el.classList.contains('dragColumn') && target === dragparent; + }, + direction: 'horizontal' + }); + + // Save column order after drag + columnDrake.on('drop', function() { + saveToLocalStorage(); + }); + + // Initialize document dragula with updated column list + if (documentDrake) { + documentDrake.destroy(); + } + + // Get fresh list of columns + listOfColumn = Array.from(document.querySelectorAll('.dragColumn')); + + documentDrake = dragula(listOfColumn, { + moves: function (el, container, handle) { + return el.classList.contains('dragDocument'); + }, + accepts: function (el, target) { + return el.classList.contains('dragDocument') && target.classList.contains('dragColumn'); + }, + revertOnSpill: true, + removeOnSpill: false + }); + + documentDrake.on('drop', function(el, target, source) { + if (target !== source) { + const documentId = el.id; + const newColumnId = target.id; + const oldColumnId = source.id; + updateDocumentColumn(documentId, newColumnId, oldColumnId); + } + saveToLocalStorage(); + }); + } + + function saveToLocalStorage() { + const boardState = { + columns: Array.from(dragparent.children).map(column => { + const documents = Array.from(column.querySelectorAll('.dragDocument')).map(doc => ({ + id: doc.id, + title: doc.querySelector('h2').textContent, + description: doc.querySelector('p').textContent, + backgroundColor: doc.style.backgroundColor || '#08CF65', + colorPickerValue: doc.querySelector('.document-color-picker').value + })); + + return { + id: column.id, + title: column.querySelector('.title').textContent, + backgroundColor: column.style.backgroundColor || '#f9f9f9', + colorPickerValue: column.querySelector('.column-color-picker').value, + documents: documents + }; + }) + }; + + localStorage.setItem('kanbanBoard', JSON.stringify(boardState)); + } + + function loadFromLocalStorage() { + const savedData = localStorage.getItem('kanbanBoard'); + if (!savedData) return; + + const boardState = JSON.parse(savedData); + + // Clear existing columns + dragparent.innerHTML = ''; + listOfColumn = []; + + boardState.columns.forEach(column => { + // Create column with saved data + const newColumn = document.createElement('ul'); + newColumn.className = 'dragColumn'; + newColumn.id = column.id; // Keep original ID for consistency + newColumn.style.backgroundColor = column.backgroundColor || '#f9f9f9'; + + // Create a container for buttons + const buttonContainer = document.createElement('div'); + buttonContainer.className = 'button-container'; + + // Add document button + const newDocPopup = document.createElement("button"); + newDocPopup.className = 'newDocPopupButton'; + newDocPopup.dataset.column = newColumn.id; + newDocPopup.addEventListener("click", () => createDocumentPopup(newDocPopup.dataset.column)); + buttonContainer.appendChild(newDocPopup); + + // Add color picker + const colorPicker = document.createElement("input"); + colorPicker.type = "color"; + colorPicker.className = 'column-color-picker'; + colorPicker.value = column.colorPickerValue || '#f9f9f9'; + colorPicker.addEventListener('input', (e) => { + newColumn.style.backgroundColor = e.target.value; + }); + buttonContainer.appendChild(colorPicker); + + // Delete button + const deleteMe = document.createElement("button"); + deleteMe.className = 'deleteButton'; + deleteMe.dataset.column = newColumn.id; + deleteMe.addEventListener("click", () => deleteDocument(deleteMe.dataset.column)); + buttonContainer.appendChild(deleteMe); + + // Add the button container to nav + const columnNav = document.createElement('nav'); + columnNav.appendChild(buttonContainer); + + // Add title + const title = document.createElement('h1'); + title.className = 'title'; + title.textContent = column.title; + title.addEventListener("dblclick", () => edit(title)); + columnNav.appendChild(title); + + newColumn.appendChild(columnNav); + dragparent.appendChild(newColumn); + listOfColumn.push(newColumn); + + // Create documents + column.documents.forEach(doc => { + const documentLineItem = document.createElement('li'); + documentLineItem.className = 'dragDocument'; + documentLineItem.id = `doc-${Math.random()}`; + + // Create document container + const docContainer = document.createElement('div'); + docContainer.className = 'document-container'; + + // Add title + const docTitle = document.createElement('h2'); + docTitle.textContent = doc.title; + docTitle.style.fontWeight = 'bold'; + docTitle.addEventListener("dblclick", () => edit(docTitle)); + docContainer.appendChild(docTitle); + + // Add description + const docDescription = document.createElement('p'); + docDescription.textContent = doc.description; + docDescription.addEventListener("dblclick", () => edit(docDescription)); + docContainer.appendChild(docDescription); + + // Add color picker + const docColorPicker = document.createElement('input'); + docColorPicker.type = 'color'; + docColorPicker.className = 'document-color-picker'; + docColorPicker.value = doc.colorPickerValue || '#08CF65'; + docColorPicker.style.position = 'absolute'; + docColorPicker.style.right = '40px'; + docColorPicker.style.top = '10px'; + docColorPicker.addEventListener('input', (e) => { + documentLineItem.style.backgroundColor = e.target.value; + saveToLocalStorage(); + }); + docContainer.appendChild(docColorPicker); + + // Add delete button + const deleteDoc = document.createElement("button"); + deleteDoc.className = 'deleteButton'; + deleteDoc.dataset.document = documentLineItem.id; + deleteDoc.addEventListener("click", () => deleteDocument(deleteDoc.dataset.document)); + docContainer.appendChild(deleteDoc); + + // Add container to document + documentLineItem.appendChild(docContainer); + + // Add to column + const parentColumn = document.getElementById(`${newColumn.id}`); + parentColumn.appendChild(documentLineItem); + + // Set the document background color immediately + documentLineItem.style.backgroundColor = doc.backgroundColor || '#08CF65'; + docColorPicker.value = doc.backgroundColor || '#08CF65'; // Set color picker value to match + }); + + // Set the column background color immediately after creation + colorPicker.value = column.backgroundColor || '#f9f9f9'; // Set color picker value to match + }); + + // Initialize dragula after loading all columns + initDragula(); + } // Without this event listener: document form submission not handled createDocumentForm.addEventListener('submit', createDocumentFunc); @@ -353,9 +556,6 @@ createDocumentForm.setAttribute('hidden', ''); }); - // Move dragula initialization outside of createColumnFunc - let columnDrake; - function createColumnFunc(event) { event.preventDefault(); const columnContent = document.getElementById('columnContent').value; @@ -382,9 +582,8 @@ colorPicker.type = "color"; colorPicker.className = 'column-color-picker'; colorPicker.value = '#f9f9f9'; - colorPicker.addEventListener('input', async (e) => { + colorPicker.addEventListener('input', (e) => { newColumn.style.backgroundColor = e.target.value; - await saveColumnColor(newColumn.id, e.target.value); }); buttonContainer.appendChild(colorPicker); @@ -427,6 +626,9 @@ }, direction: 'horizontal' }); + + // Add this at the end of the function + saveToLocalStorage(); } function createDocumentPopup(columnData){ @@ -476,6 +678,7 @@ colorPicker.style.top = '10px'; colorPicker.addEventListener('input', (e) => { documentLineItem.style.backgroundColor = e.target.value; + saveToLocalStorage(); }); docContainer.appendChild(colorPicker); @@ -496,88 +699,11 @@ // Reset and close form createDocumentForm.reset(); createDocumentPopup(null); - } - - // Load saved project data - async function loadProjectData() { - const projectId = window.location.pathname.split('/project/')[1]; - try { - const response = await fetch(`/profile/project/${projectId}/data`); - const project = await response.json(); - - // Create columns from saved data - project.columns.forEach(column => { - const newColumn = createColumnFromData(column); - - // Create documents for each column - column.documents.forEach(doc => { - createDocumentFromData(doc, newColumn.id); - }); - }); - } catch (error) { - console.error('Error loading project:', error); - } - } - - function createColumnFromData(columnData) { - const newColumn = document.createElement('ul'); - newColumn.className = 'dragColumn'; - newColumn.id = columnData._id; - newColumn.style.backgroundColor = columnData.backgroundColor; - - // Create column content (similar to createColumnFunc but using saved data) - // ... rest of column creation code ... - return newColumn; + // Add this at the end of the function + saveToLocalStorage(); } - function createDocumentFromData(docData, columnId) { - const documentLineItem = document.createElement('li'); - documentLineItem.className = 'dragDocument'; - documentLineItem.id = docData._id; - - // Create document content (similar to createDocumentFunc but using saved data) - // ... rest of document creation code ... - - const parentColumn = document.getElementById(columnId); - parentColumn.appendChild(documentLineItem); - } - - // Call loadProjectData when page loads - loadProjectData(); - - // Separate dragula instance for documents - let documentDrake = dragula(listOfColumn, { - moves: function (el, container, handle) { - // Only allow moving if it's a document - return el.classList.contains('dragDocument'); - }, - accepts: function (el, target) { - // Accept drops only if: - // 1. The element being moved is a document - // 2. The target is a column - return el.classList.contains('dragDocument') && target.classList.contains('dragColumn'); - }, - revertOnSpill: true, - removeOnSpill: false - }); - - // Handle successful drops - documentDrake.on('drop', function (el, target, source) { - if (target !== source) { - // Document was moved to a different column - const documentId = el.id; - const newColumnId = target.id; - const oldColumnId = source.id; - - // Update the document's parent in the DOM - target.appendChild(el); - - // Optional: Update the database to persist the change - updateDocumentColumn(documentId, newColumnId, oldColumnId); - } - }); - // Function to update document's column in database async function updateDocumentColumn(documentId, newColumnId, oldColumnId) { try { @@ -599,6 +725,9 @@ console.error('Error updating document column:', error); } } + + // Call loadFromLocalStorage when page loads + loadFromLocalStorage(); } function deleteDocument(docID){ @@ -606,6 +735,9 @@ if(theDoomedDocument){ theDoomedDocument.parentNode.removeChild(theDoomedDocument) } + + // Add save to localStorage after deletion + saveToLocalStorage(); } function edit(element){ let text = element.textContent @@ -632,20 +764,9 @@ rewrite.remove(); // Properly remove the input element from the DOM }) element.appendChild(rewrite).focus(); - } - async function saveColumnColor(columnId, color) { - try { - await fetch(`/projects/columns/${columnId}`, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ backgroundColor: color }) - }); - } catch (error) { - console.error('Error saving column color:', error); - } + // Add save to localStorage after editing + saveToLocalStorage(); } From 94eeac66ed7e7cafd8c2c099e6a288c66f1ccbed Mon Sep 17 00:00:00 2001 From: Christopher Ament Date: Thu, 13 Mar 2025 16:31:59 -0400 Subject: [PATCH 02/87] Add local storage functionality to Kanban board - Implement saveToLocalStorage to persist board state - Add loadFromLocalStorage to restore board on page load - Add auto-save for column/document creation, deletion, and updates - Maintain colors, positions, and content across page reloads --- views/project_template.ejs | 653 ++++++++++++++----------------------- 1 file changed, 251 insertions(+), 402 deletions(-) diff --git a/views/project_template.ejs b/views/project_template.ejs index fa1d169..f82a002 100644 --- a/views/project_template.ejs +++ b/views/project_template.ejs @@ -332,441 +332,290 @@ From 7ab7848425132695a057b714f677d1551f2b92f0 Mon Sep 17 00:00:00 2001 From: Christopher Ament Date: Thu, 13 Mar 2025 17:09:44 -0400 Subject: [PATCH 03/87] Fix delete project functionality and column styling --- views/profile.ejs | 102 +++++++++++++------------------------ views/project_template.ejs | 69 ++++++++++++++++++------- 2 files changed, 85 insertions(+), 86 deletions(-) diff --git a/views/profile.ejs b/views/profile.ejs index 97e43a5..2912998 100644 --- a/views/profile.ejs +++ b/views/profile.ejs @@ -182,7 +182,7 @@ <%= project.name %>
@@ -258,6 +258,7 @@ + + \ No newline at end of file diff --git a/.history/views/profile_20250313170720.ejs b/.history/views/profile_20250313170720.ejs new file mode 100644 index 0000000..60304e7 --- /dev/null +++ b/.history/views/profile_20250313170720.ejs @@ -0,0 +1,548 @@ + + + + + + + + + + + + + + + + + User Profile + User Profile + + + + + <%- include('partials/header') %> +

Adjust your profile here

+
To index Page +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
    + <% if (typeof projectList !== 'undefined' && projectList.length > 0) { %> + <% projectList.forEach(project => { %> +
  • +
    + <%= project.name %> +
    + + + + +
    +
    + +
    +

    Status: <%= project.status %>

    +

    Columns: <%= project.columns ? project.columns.length : 0 %>

    +

    Documents: <%= project.columns ? project.columns.reduce((sum, col) => sum + (col.documents ? col.documents.length : 0), 0) : 0 %>

    +
    +
  • + <% }) %> + <% } else { %> +
  • No projects found
  • + <% } %> +
+
+ + + + +
+ all thanks goes to the 100devs +
+ + + \ No newline at end of file diff --git a/.history/views/profile_20250313170722.ejs b/.history/views/profile_20250313170722.ejs new file mode 100644 index 0000000..ae004bc --- /dev/null +++ b/.history/views/profile_20250313170722.ejs @@ -0,0 +1,548 @@ + + + + + + + + + + + + + + + + + User Profile + User Profile + + + + + <%- include('partials/header') %> +

Adjust your profile here

+ To index Page +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
    + <% if (typeof projectList !== 'undefined' && projectList.length > 0) { %> + <% projectList.forEach(project => { %> +
  • +
    + <%= project.name %> +
    + + + + +
    +
    + +
    +

    Status: <%= project.status %>

    +

    Columns: <%= project.columns ? project.columns.length : 0 %>

    +

    Documents: <%= project.columns ? project.columns.reduce((sum, col) => sum + (col.documents ? col.documents.length : 0), 0) : 0 %>

    +
    +
  • + <% }) %> + <% } else { %> +
  • No projects found
  • + <% } %> +
+
+ + + + +
+ all thanks goes to the 100devs +
+ + + \ No newline at end of file diff --git a/.history/views/profile_20250313170723.ejs b/.history/views/profile_20250313170723.ejs new file mode 100644 index 0000000..ae004bc --- /dev/null +++ b/.history/views/profile_20250313170723.ejs @@ -0,0 +1,548 @@ + + + + + + + + + + + + + + + + + User Profile + User Profile + + + + + <%- include('partials/header') %> +

Adjust your profile here

+ To index Page +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
    + <% if (typeof projectList !== 'undefined' && projectList.length > 0) { %> + <% projectList.forEach(project => { %> +
  • +
    + <%= project.name %> +
    + + + + +
    +
    + +
    +

    Status: <%= project.status %>

    +

    Columns: <%= project.columns ? project.columns.length : 0 %>

    +

    Documents: <%= project.columns ? project.columns.reduce((sum, col) => sum + (col.documents ? col.documents.length : 0), 0) : 0 %>

    +
    +
  • + <% }) %> + <% } else { %> +
  • No projects found
  • + <% } %> +
+
+ + + + +
+ all thanks goes to the 100devs +
+ + + \ No newline at end of file diff --git a/.history/views/profile_20250313170852.ejs b/.history/views/profile_20250313170852.ejs new file mode 100644 index 0000000..2912998 --- /dev/null +++ b/.history/views/profile_20250313170852.ejs @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + User Profile + User Profile + + + + + <%- include('partials/header') %> +

Adjust your profile here

+ To index Page +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
    + <% if (typeof projectList !== 'undefined' && projectList.length > 0) { %> + <% projectList.forEach(project => { %> +
  • +
    + <%= project.name %> +
    + + + + +
    +
    + +
    +

    Status: <%= project.status %>

    +

    Columns: <%= project.columns ? project.columns.length : 0 %>

    +

    Documents: <%= project.columns ? project.columns.reduce((sum, col) => sum + (col.documents ? col.documents.length : 0), 0) : 0 %>

    +
    +
  • + <% }) %> + <% } else { %> +
  • No projects found
  • + <% } %> +
+
+ + + + +
+ all thanks goes to the 100devs +
+ + + \ No newline at end of file diff --git a/.history/views/profile_20250313170853.ejs b/.history/views/profile_20250313170853.ejs new file mode 100644 index 0000000..2912998 --- /dev/null +++ b/.history/views/profile_20250313170853.ejs @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + User Profile + User Profile + + + + + <%- include('partials/header') %> +

Adjust your profile here

+ To index Page +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
    + <% if (typeof projectList !== 'undefined' && projectList.length > 0) { %> + <% projectList.forEach(project => { %> +
  • +
    + <%= project.name %> +
    + + + + +
    +
    + +
    +

    Status: <%= project.status %>

    +

    Columns: <%= project.columns ? project.columns.length : 0 %>

    +

    Documents: <%= project.columns ? project.columns.reduce((sum, col) => sum + (col.documents ? col.documents.length : 0), 0) : 0 %>

    +
    +
  • + <% }) %> + <% } else { %> +
  • No projects found
  • + <% } %> +
+
+ + + + +
+ all thanks goes to the 100devs +
+ + + \ No newline at end of file diff --git a/.history/views/profile_20250316185506.ejs b/.history/views/profile_20250316185506.ejs new file mode 100644 index 0000000..2912998 --- /dev/null +++ b/.history/views/profile_20250316185506.ejs @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + User Profile + User Profile + + + + + <%- include('partials/header') %> +

Adjust your profile here

+ To index Page +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
    + <% if (typeof projectList !== 'undefined' && projectList.length > 0) { %> + <% projectList.forEach(project => { %> +
  • +
    + <%= project.name %> +
    + + + + +
    +
    + +
    +

    Status: <%= project.status %>

    +

    Columns: <%= project.columns ? project.columns.length : 0 %>

    +

    Documents: <%= project.columns ? project.columns.reduce((sum, col) => sum + (col.documents ? col.documents.length : 0), 0) : 0 %>

    +
    +
  • + <% }) %> + <% } else { %> +
  • No projects found
  • + <% } %> +
+
+ + + + +
+ all thanks goes to the 100devs +
+ + + \ No newline at end of file diff --git a/.history/views/profile_20250316185509.ejs b/.history/views/profile_20250316185509.ejs new file mode 100644 index 0000000..2912998 --- /dev/null +++ b/.history/views/profile_20250316185509.ejs @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + User Profile + User Profile + + + + + <%- include('partials/header') %> +

Adjust your profile here

+ To index Page +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
    + <% if (typeof projectList !== 'undefined' && projectList.length > 0) { %> + <% projectList.forEach(project => { %> +
  • +
    + <%= project.name %> +
    + + + + +
    +
    + +
    +

    Status: <%= project.status %>

    +

    Columns: <%= project.columns ? project.columns.length : 0 %>

    +

    Documents: <%= project.columns ? project.columns.reduce((sum, col) => sum + (col.documents ? col.documents.length : 0), 0) : 0 %>

    +
    +
  • + <% }) %> + <% } else { %> +
  • No projects found
  • + <% } %> +
+
+ + + + +
+ all thanks goes to the 100devs +
+ + + \ No newline at end of file diff --git a/.history/views/project_template_20250313164904.ejs b/.history/views/project_template_20250313164904.ejs new file mode 100644 index 0000000..025ce66 --- /dev/null +++ b/.history/views/project_template_20250313164904.ejs @@ -0,0 +1,1115 @@ + }); + } + } + + // Modify your init function to call initializeBoard + function init() { + // ... your existing init code ... + + // Initialize board with project data first + initializeBoard(); + + // Then load any local storage updates + loadFromLocalStorage(); + + // ... rest of your init code ... + } + + // Global variables + const projectId = window.location.pathname.split('/project/')[1]; + + // Define createColumnFunc before init + function createColumnFunc(event) { + event.preventDefault(); + const dragparent = document.getElementById('dragparent'); + const columnContent = document.getElementById('columnContent').value; + + const newColumn = document.createElement('ul'); + const columnNav = document.createElement('nav'); + columnNav.className = 'columnNav'; + + newColumn.className = 'dragColumn'; + newColumn.id = `column-${Math.random()}`; + + // Create a container for buttons + const buttonContainer = document.createElement('div'); + buttonContainer.className = 'button-container'; + + // Add document button + const newDocPopup = document.createElement("button"); + newDocPopup.className = 'newDocPopupButton'; + newDocPopup.dataset.column = newColumn.id; + newDocPopup.addEventListener("click", () => createDocumentPopup(newDocPopup.dataset.column)); + buttonContainer.appendChild(newDocPopup); + + // Add color picker + const colorPicker = document.createElement("input"); + colorPicker.type = "color"; + colorPicker.className = 'column-color-picker'; + colorPicker.value = '#f9f9f9'; + colorPicker.addEventListener('input', async (e) => { + newColumn.style.backgroundColor = e.target.value; + await saveColumnColor(newColumn.id, e.target.value); + saveProjectToSession(); + }); + buttonContainer.appendChild(colorPicker); + + // Delete button + const deleteMe = document.createElement("button"); + deleteMe.className = 'deleteButton'; + deleteMe.addEventListener("click", () => deleteDocument(newColumn.id)); + buttonContainer.appendChild(deleteMe); + + // Add the button container to nav + columnNav.appendChild(buttonContainer); + + // Add title + const title = document.createElement('h1'); + title.className = 'title'; + title.textContent = columnContent; + title.addEventListener("dblclick", () => edit(title)); + columnNav.appendChild(title); + + + newColumn.appendChild(columnNav); + dragparent.appendChild(newColumn); + listOfColumn.push(newColumn); + document.getElementById('createColumnForm').reset(); + + // Save to session storage + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + +
+

<%= project.name %>

+

<%= project.description %>

+
+ + +
+
+

<%= project.name %>

+

<%= project.description %>

+
+ +
+
+ + +
+ +
+ +
+
\ No newline at end of file diff --git a/.history/views/project_template_20250313165737.ejs b/.history/views/project_template_20250313165737.ejs new file mode 100644 index 0000000..37536ae --- /dev/null +++ b/.history/views/project_template_20250313165737.ejs @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313165926.ejs b/.history/views/project_template_20250313165926.ejs new file mode 100644 index 0000000..ff36a4c --- /dev/null +++ b/.history/views/project_template_20250313165926.ejs @@ -0,0 +1,628 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313165929.ejs b/.history/views/project_template_20250313165929.ejs new file mode 100644 index 0000000..ff36a4c --- /dev/null +++ b/.history/views/project_template_20250313165929.ejs @@ -0,0 +1,628 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313170056.ejs b/.history/views/project_template_20250313170056.ejs new file mode 100644 index 0000000..b23ca96 --- /dev/null +++ b/.history/views/project_template_20250313170056.ejs @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313170057.ejs b/.history/views/project_template_20250313170057.ejs new file mode 100644 index 0000000..b23ca96 --- /dev/null +++ b/.history/views/project_template_20250313170057.ejs @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313170231.ejs b/.history/views/project_template_20250313170231.ejs new file mode 100644 index 0000000..bf3ce4e --- /dev/null +++ b/.history/views/project_template_20250313170231.ejs @@ -0,0 +1,647 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313170232.ejs b/.history/views/project_template_20250313170232.ejs new file mode 100644 index 0000000..bf3ce4e --- /dev/null +++ b/.history/views/project_template_20250313170232.ejs @@ -0,0 +1,647 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313170326.ejs b/.history/views/project_template_20250313170326.ejs new file mode 100644 index 0000000..32274a0 --- /dev/null +++ b/.history/views/project_template_20250313170326.ejs @@ -0,0 +1,653 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313170508.ejs b/.history/views/project_template_20250313170508.ejs new file mode 100644 index 0000000..8611428 --- /dev/null +++ b/.history/views/project_template_20250313170508.ejs @@ -0,0 +1,653 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313170600.ejs b/.history/views/project_template_20250313170600.ejs new file mode 100644 index 0000000..d88e55b --- /dev/null +++ b/.history/views/project_template_20250313170600.ejs @@ -0,0 +1,653 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313171254.ejs b/.history/views/project_template_20250313171254.ejs new file mode 100644 index 0000000..d88e55b --- /dev/null +++ b/.history/views/project_template_20250313171254.ejs @@ -0,0 +1,653 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313193541.ejs b/.history/views/project_template_20250313193541.ejs new file mode 100644 index 0000000..03813ee --- /dev/null +++ b/.history/views/project_template_20250313193541.ejs @@ -0,0 +1,653 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313193542.ejs b/.history/views/project_template_20250313193542.ejs new file mode 100644 index 0000000..03813ee --- /dev/null +++ b/.history/views/project_template_20250313193542.ejs @@ -0,0 +1,653 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313193618.ejs b/.history/views/project_template_20250313193618.ejs new file mode 100644 index 0000000..3d02ed3 --- /dev/null +++ b/.history/views/project_template_20250313193618.ejs @@ -0,0 +1,653 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313193730.ejs b/.history/views/project_template_20250313193730.ejs new file mode 100644 index 0000000..75cd660 --- /dev/null +++ b/.history/views/project_template_20250313193730.ejs @@ -0,0 +1,656 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313193846.ejs b/.history/views/project_template_20250313193846.ejs new file mode 100644 index 0000000..dc1eff0 --- /dev/null +++ b/.history/views/project_template_20250313193846.ejs @@ -0,0 +1,658 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313193905.ejs b/.history/views/project_template_20250313193905.ejs new file mode 100644 index 0000000..c2451e4 --- /dev/null +++ b/.history/views/project_template_20250313193905.ejs @@ -0,0 +1,656 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194020.ejs b/.history/views/project_template_20250313194020.ejs new file mode 100644 index 0000000..2fc1e69 --- /dev/null +++ b/.history/views/project_template_20250313194020.ejs @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194023.ejs b/.history/views/project_template_20250313194023.ejs new file mode 100644 index 0000000..2fc1e69 --- /dev/null +++ b/.history/views/project_template_20250313194023.ejs @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194135.ejs b/.history/views/project_template_20250313194135.ejs new file mode 100644 index 0000000..db045e0 --- /dev/null +++ b/.history/views/project_template_20250313194135.ejs @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194258.ejs b/.history/views/project_template_20250313194258.ejs new file mode 100644 index 0000000..c9f1aa7 --- /dev/null +++ b/.history/views/project_template_20250313194258.ejs @@ -0,0 +1,648 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194405.ejs b/.history/views/project_template_20250313194405.ejs new file mode 100644 index 0000000..e6868b1 --- /dev/null +++ b/.history/views/project_template_20250313194405.ejs @@ -0,0 +1,653 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194445.ejs b/.history/views/project_template_20250313194445.ejs new file mode 100644 index 0000000..30dcf9b --- /dev/null +++ b/.history/views/project_template_20250313194445.ejs @@ -0,0 +1,655 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194446.ejs b/.history/views/project_template_20250313194446.ejs new file mode 100644 index 0000000..30dcf9b --- /dev/null +++ b/.history/views/project_template_20250313194446.ejs @@ -0,0 +1,655 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194800.ejs b/.history/views/project_template_20250313194800.ejs new file mode 100644 index 0000000..9c5a649 --- /dev/null +++ b/.history/views/project_template_20250313194800.ejs @@ -0,0 +1,655 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194801.ejs b/.history/views/project_template_20250313194801.ejs new file mode 100644 index 0000000..9c5a649 --- /dev/null +++ b/.history/views/project_template_20250313194801.ejs @@ -0,0 +1,655 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313194850.ejs b/.history/views/project_template_20250313194850.ejs new file mode 100644 index 0000000..4a768de --- /dev/null +++ b/.history/views/project_template_20250313194850.ejs @@ -0,0 +1,656 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195003.ejs b/.history/views/project_template_20250313195003.ejs new file mode 100644 index 0000000..3b0e07c --- /dev/null +++ b/.history/views/project_template_20250313195003.ejs @@ -0,0 +1,656 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195004.ejs b/.history/views/project_template_20250313195004.ejs new file mode 100644 index 0000000..3b0e07c --- /dev/null +++ b/.history/views/project_template_20250313195004.ejs @@ -0,0 +1,656 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195055.ejs b/.history/views/project_template_20250313195055.ejs new file mode 100644 index 0000000..4cd4c78 --- /dev/null +++ b/.history/views/project_template_20250313195055.ejs @@ -0,0 +1,651 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195213.ejs b/.history/views/project_template_20250313195213.ejs new file mode 100644 index 0000000..73a029b --- /dev/null +++ b/.history/views/project_template_20250313195213.ejs @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195214.ejs b/.history/views/project_template_20250313195214.ejs new file mode 100644 index 0000000..73a029b --- /dev/null +++ b/.history/views/project_template_20250313195214.ejs @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195248.ejs b/.history/views/project_template_20250313195248.ejs new file mode 100644 index 0000000..7d036d8 --- /dev/null +++ b/.history/views/project_template_20250313195248.ejs @@ -0,0 +1,643 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195249.ejs b/.history/views/project_template_20250313195249.ejs new file mode 100644 index 0000000..7d036d8 --- /dev/null +++ b/.history/views/project_template_20250313195249.ejs @@ -0,0 +1,643 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195359.ejs b/.history/views/project_template_20250313195359.ejs new file mode 100644 index 0000000..7d036d8 --- /dev/null +++ b/.history/views/project_template_20250313195359.ejs @@ -0,0 +1,643 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195505.ejs b/.history/views/project_template_20250313195505.ejs new file mode 100644 index 0000000..0b3c3e2 --- /dev/null +++ b/.history/views/project_template_20250313195505.ejs @@ -0,0 +1,639 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195506.ejs b/.history/views/project_template_20250313195506.ejs new file mode 100644 index 0000000..0b3c3e2 --- /dev/null +++ b/.history/views/project_template_20250313195506.ejs @@ -0,0 +1,639 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195545.ejs b/.history/views/project_template_20250313195545.ejs new file mode 100644 index 0000000..1484635 --- /dev/null +++ b/.history/views/project_template_20250313195545.ejs @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195644.ejs b/.history/views/project_template_20250313195644.ejs new file mode 100644 index 0000000..4cf8516 --- /dev/null +++ b/.history/views/project_template_20250313195644.ejs @@ -0,0 +1,633 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195737.ejs b/.history/views/project_template_20250313195737.ejs new file mode 100644 index 0000000..e561c92 --- /dev/null +++ b/.history/views/project_template_20250313195737.ejs @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195738.ejs b/.history/views/project_template_20250313195738.ejs new file mode 100644 index 0000000..e561c92 --- /dev/null +++ b/.history/views/project_template_20250313195738.ejs @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195827.ejs b/.history/views/project_template_20250313195827.ejs new file mode 100644 index 0000000..c05aed3 --- /dev/null +++ b/.history/views/project_template_20250313195827.ejs @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195828.ejs b/.history/views/project_template_20250313195828.ejs new file mode 100644 index 0000000..c05aed3 --- /dev/null +++ b/.history/views/project_template_20250313195828.ejs @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195923.ejs b/.history/views/project_template_20250313195923.ejs new file mode 100644 index 0000000..8c2064b --- /dev/null +++ b/.history/views/project_template_20250313195923.ejs @@ -0,0 +1,639 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313195926.ejs b/.history/views/project_template_20250313195926.ejs new file mode 100644 index 0000000..8c2064b --- /dev/null +++ b/.history/views/project_template_20250313195926.ejs @@ -0,0 +1,639 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200021.ejs b/.history/views/project_template_20250313200021.ejs new file mode 100644 index 0000000..91c332f --- /dev/null +++ b/.history/views/project_template_20250313200021.ejs @@ -0,0 +1,638 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200022.ejs b/.history/views/project_template_20250313200022.ejs new file mode 100644 index 0000000..91c332f --- /dev/null +++ b/.history/views/project_template_20250313200022.ejs @@ -0,0 +1,638 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200056.ejs b/.history/views/project_template_20250313200056.ejs new file mode 100644 index 0000000..adea2e8 --- /dev/null +++ b/.history/views/project_template_20250313200056.ejs @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200137.ejs b/.history/views/project_template_20250313200137.ejs new file mode 100644 index 0000000..28eb10d --- /dev/null +++ b/.history/views/project_template_20250313200137.ejs @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200219.ejs b/.history/views/project_template_20250313200219.ejs new file mode 100644 index 0000000..30cdeb3 --- /dev/null +++ b/.history/views/project_template_20250313200219.ejs @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200220.ejs b/.history/views/project_template_20250313200220.ejs new file mode 100644 index 0000000..30cdeb3 --- /dev/null +++ b/.history/views/project_template_20250313200220.ejs @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200318.ejs b/.history/views/project_template_20250313200318.ejs new file mode 100644 index 0000000..c6d3205 --- /dev/null +++ b/.history/views/project_template_20250313200318.ejs @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200445.ejs b/.history/views/project_template_20250313200445.ejs new file mode 100644 index 0000000..367d079 --- /dev/null +++ b/.history/views/project_template_20250313200445.ejs @@ -0,0 +1,650 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200642.ejs b/.history/views/project_template_20250313200642.ejs new file mode 100644 index 0000000..9429f6e --- /dev/null +++ b/.history/views/project_template_20250313200642.ejs @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200644.ejs b/.history/views/project_template_20250313200644.ejs new file mode 100644 index 0000000..9429f6e --- /dev/null +++ b/.history/views/project_template_20250313200644.ejs @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200827.ejs b/.history/views/project_template_20250313200827.ejs new file mode 100644 index 0000000..1e7fd00 --- /dev/null +++ b/.history/views/project_template_20250313200827.ejs @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200829.ejs b/.history/views/project_template_20250313200829.ejs new file mode 100644 index 0000000..1e7fd00 --- /dev/null +++ b/.history/views/project_template_20250313200829.ejs @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200833.ejs b/.history/views/project_template_20250313200833.ejs new file mode 100644 index 0000000..e9dc9c2 --- /dev/null +++ b/.history/views/project_template_20250313200833.ejs @@ -0,0 +1,646 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200834.ejs b/.history/views/project_template_20250313200834.ejs new file mode 100644 index 0000000..e9dc9c2 --- /dev/null +++ b/.history/views/project_template_20250313200834.ejs @@ -0,0 +1,646 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200948.ejs b/.history/views/project_template_20250313200948.ejs new file mode 100644 index 0000000..cec7d5d --- /dev/null +++ b/.history/views/project_template_20250313200948.ejs @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313200949.ejs b/.history/views/project_template_20250313200949.ejs new file mode 100644 index 0000000..cec7d5d --- /dev/null +++ b/.history/views/project_template_20250313200949.ejs @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313201035.ejs b/.history/views/project_template_20250313201035.ejs new file mode 100644 index 0000000..1a0103d --- /dev/null +++ b/.history/views/project_template_20250313201035.ejs @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313201036.ejs b/.history/views/project_template_20250313201036.ejs new file mode 100644 index 0000000..1a0103d --- /dev/null +++ b/.history/views/project_template_20250313201036.ejs @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313201112.ejs b/.history/views/project_template_20250313201112.ejs new file mode 100644 index 0000000..c6682f9 --- /dev/null +++ b/.history/views/project_template_20250313201112.ejs @@ -0,0 +1,626 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313201113.ejs b/.history/views/project_template_20250313201113.ejs new file mode 100644 index 0000000..c6682f9 --- /dev/null +++ b/.history/views/project_template_20250313201113.ejs @@ -0,0 +1,626 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313201351.ejs b/.history/views/project_template_20250313201351.ejs new file mode 100644 index 0000000..19b238e --- /dev/null +++ b/.history/views/project_template_20250313201351.ejs @@ -0,0 +1,643 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250313201457.ejs b/.history/views/project_template_20250313201457.ejs new file mode 100644 index 0000000..bd6c360 --- /dev/null +++ b/.history/views/project_template_20250313201457.ejs @@ -0,0 +1,651 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250316185425.ejs b/.history/views/project_template_20250316185425.ejs new file mode 100644 index 0000000..5b3208a --- /dev/null +++ b/.history/views/project_template_20250316185425.ejs @@ -0,0 +1,647 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.history/views/project_template_20250316185429.ejs b/.history/views/project_template_20250316185429.ejs new file mode 100644 index 0000000..5b3208a --- /dev/null +++ b/.history/views/project_template_20250316185429.ejs @@ -0,0 +1,647 @@ + + + + + + + + + + + + + + + + + Project Template + + + + + + <%- include('partials/header') %> + + +
+
+ + +
+ +
+ + + + + +
+ + + <%- include('partials/footer') %> + + + + + + + + + diff --git a/.lh/.lhignore b/.lh/.lhignore new file mode 100644 index 0000000..1de5100 --- /dev/null +++ b/.lh/.lhignore @@ -0,0 +1,6 @@ +# list file to not track by the local-history extension. comment line starts with a '#' character +# each line describe a regular expression pattern (search for 'Javascript regex') +# it will relate to the workspace directory root. for example: +# '.*\.txt' ignores any file with 'txt' extension +# '/test/.*' ignores all the files under the 'test' directory +# '.*/test/.*' ignores all the files under any 'test' directory (even under sub-folders) diff --git a/.lh/controllers/indexController.js.json b/.lh/controllers/indexController.js.json new file mode 100644 index 0000000..1969dd8 --- /dev/null +++ b/.lh/controllers/indexController.js.json @@ -0,0 +1,18 @@ +{ + "sourceFile": "controllers/indexController.js", + "activeCommit": 0, + "commits": [ + { + "activePatchIndex": 0, + "patches": [ + { + "date": 1743097233171, + "content": "Index: \n===================================================================\n--- \n+++ \n" + } + ], + "date": 1743097233171, + "name": "Commit-0", + "content": "module.exports = {\n getIndex: (req, res) => {\n res.render('index.ejs', {\n user: req.user // Pass the user object from the session\n })\n }\n}\n//" + } + ] +} \ No newline at end of file diff --git a/.lh/public/css/style.css.json b/.lh/public/css/style.css.json new file mode 100644 index 0000000..5e58277 --- /dev/null +++ b/.lh/public/css/style.css.json @@ -0,0 +1,138 @@ +{ + "sourceFile": "public/css/style.css", + "activeCommit": 0, + "commits": [ + { + "activePatchIndex": 30, + "patches": [ + { + "date": 1743095948996, + "content": "Index: \n===================================================================\n--- \n+++ \n" + }, + { + "date": 1743096034429, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -304,14 +304,10 @@\n /***************************/\n /********** HERO *********/\n /***************************/\n .hero {\n- max-width: 1200px;\n- margin: 10px auto;\n- padding: 0 15px;\n- display: grid;\n- grid-template-columns: 250px 1fr; /* Reduced sidebar width from 300px */\n- gap: 20px;\n+ justify-content: left;\n+ display: flex;\n }\n \n /* Project Creation Form (Left Sidebar) */\n .hero form {\n" + }, + { + "date": 1743096083205, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -304,10 +304,16 @@\n /***************************/\n /********** HERO *********/\n /***************************/\n .hero {\n+ display: flex;\n justify-content: left;\n- display: flex;\n+ max-width: 1200px;\n+ margin: 10px auto;\n+ padding: 0 15px;\n+ display: grid;\n+ grid-template-columns: 250px 1fr; /* Reduced sidebar width from 300px */\n+ gap: 20px;\n }\n \n /* Project Creation Form (Left Sidebar) */\n .hero form {\n" + }, + { + "date": 1743096109960, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -309,10 +309,9 @@\n justify-content: left;\n max-width: 1200px;\n margin: 10px auto;\n padding: 0 15px;\n- display: grid;\n- grid-template-columns: 250px 1fr; /* Reduced sidebar width from 300px */\n+ display: flex;\n gap: 20px;\n }\n \n /* Project Creation Form (Left Sidebar) */\n" + }, + { + "date": 1743096134249, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -306,12 +306,11 @@\n /***************************/\n .hero {\n display: flex;\n justify-content: left;\n- max-width: 1200px;\n+ max-width: 800px;\n margin: 10px auto;\n padding: 0 15px;\n- display: flex;\n gap: 20px;\n }\n \n /* Project Creation Form (Left Sidebar) */\n" + }, + { + "date": 1743096412273, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -29,10 +29,16 @@\n .logo-container {\n display: flex;\n justify-content: center;\n align-items: center;\n+ margin-top: 1rem;\n }\n \n+.logo {\n+ max-width: 200px;\n+ height: auto;\n+ margin-top: 1rem;\n+}\n \n /***************************/\n /********** LAYOUT *********/\n /***************************/\n@@ -278,9 +284,9 @@\n /***************************/\n header {\n background-color: var(--light-green);\n height: 5em;\n- padding: 1em;\n+ padding: 1rem 0;\n margin-bottom: 1em;\n display: flex;\n align-items: center;\n justify-content: space-between;\n@@ -288,11 +294,12 @@\n \n header nav {\n text-align: center;\n display: flex;\n- /*align-items: center;*/\n+ align-items: center;\n justify-content: space-between;\n- /*align-self: center;*/\n+ width: 100%;\n+ padding: 0 2rem;\n }\n \n header nav ul {\n justify-content: center;\n" + }, + { + "date": 1743096451643, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -29,16 +29,10 @@\n .logo-container {\n display: flex;\n justify-content: center;\n align-items: center;\n- margin-top: 1rem;\n }\n \n-.logo {\n- max-width: 200px;\n- height: auto;\n- margin-top: 1rem;\n-}\n \n /***************************/\n /********** LAYOUT *********/\n /***************************/\n@@ -284,9 +278,9 @@\n /***************************/\n header {\n background-color: var(--light-green);\n height: 5em;\n- padding: 1rem 0;\n+ padding: 1em;\n margin-bottom: 1em;\n display: flex;\n align-items: center;\n justify-content: space-between;\n@@ -294,12 +288,11 @@\n \n header nav {\n text-align: center;\n display: flex;\n- align-items: center;\n+ /*align-items: center;*/\n justify-content: space-between;\n- width: 100%;\n- padding: 0 2rem;\n+ /*align-self: center;*/\n }\n \n header nav ul {\n justify-content: center;\n" + }, + { + "date": 1743096710666, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -5,9 +5,9 @@\n --white: #fff;\n --black: #000;\n --light-green: #EBF5F3;\n --dark-green: #0C3245;\n- --green: #08CF65;\n+ --red: #d2433c;\n --dark-blue: #181F38;\n --gray: #EBEDF5;\n }\n \n" + }, + { + "date": 1743096808455, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -3,10 +3,10 @@\n /***************************/\n :root {\n --white: #fff;\n --black: #000;\n- --light-green: #EBF5F3;\n- --dark-green: #0C3245;\n+ --light-red: #c99191;\n+ --grey: #b8b8b8;\n --red: #d2433c;\n --dark-blue: #181F38;\n --gray: #EBEDF5;\n }\n" + }, + { + "date": 1743096839153, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -3,9 +3,9 @@\n /***************************/\n :root {\n --white: #fff;\n --black: #000;\n- --light-red: #c99191;\n+ --dark-red: #491313;\n --grey: #b8b8b8;\n --red: #d2433c;\n --dark-blue: #181F38;\n --gray: #EBEDF5;\n" + }, + { + "date": 1743096870795, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -4,11 +4,11 @@\n :root {\n --white: #fff;\n --black: #000;\n --dark-red: #491313;\n- --grey: #b8b8b8;\n+ --grey: #606060;\n --red: #d2433c;\n- --dark-blue: #181F38;\n+ --dark-blue: #6e1818;\n --gray: #EBEDF5;\n }\n \n body {\n" + }, + { + "date": 1743096893955, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -6,9 +6,9 @@\n --black: #000;\n --dark-red: #491313;\n --grey: #606060;\n --red: #d2433c;\n- --dark-blue: #6e1818;\n+ --dark-red: #6e1818;\n --gray: #EBEDF5;\n }\n \n body {\n" + }, + { + "date": 1743096904049, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -7,9 +7,9 @@\n --dark-red: #491313;\n --grey: #606060;\n --red: #d2433c;\n --dark-red: #6e1818;\n- --gray: #EBEDF5;\n+ --gray: #888888;\n }\n \n body {\n background-color: var(--white);\n" + }, + { + "date": 1743096921188, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -7,9 +7,9 @@\n --dark-red: #491313;\n --grey: #606060;\n --red: #d2433c;\n --dark-red: #6e1818;\n- --gray: #888888;\n+ --gray: #cac6c6;\n }\n \n body {\n background-color: var(--white);\n" + }, + { + "date": 1743097170846, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -12,8 +12,9 @@\n }\n \n body {\n background-color: var(--white);\n+ color: var(--black);\n font-family: Roboto, sans-serif\n }\n \n h1 {\n@@ -1159,5 +1160,135 @@\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: -1;\n+}\n+\n+/* Hero Section */\n+.hero {\n+ text-align: center;\n+ padding: 4rem 2rem;\n+ background: linear-gradient(135deg, var(--white) 0%, var(--gray) 100%);\n+ border-bottom: 4px solid var(--red);\n+}\n+\n+.logo-container {\n+ margin-bottom: 2rem;\n+}\n+\n+.logo {\n+ max-width: 200px;\n+ height: auto;\n+}\n+\n+.hero-title {\n+ font-size: 3rem;\n+ font-weight: bold;\n+ color: var(--dark-red);\n+ margin-bottom: 1rem;\n+ text-shadow: 1px 1px 2px rgba(0,0,0,0.1);\n+}\n+\n+.hero-subtitle {\n+ font-size: 1.5rem;\n+ color: var(--grey);\n+ margin-bottom: 2rem;\n+}\n+\n+/* Buttons */\n+.cta-button {\n+ display: inline-block;\n+ padding: 1rem 2rem;\n+ background-color: var(--red);\n+ color: var(--white);\n+ text-decoration: none;\n+ border-radius: 5px;\n+ transition: background-color 0.3s ease;\n+ font-weight: bold;\n+ border: none;\n+}\n+\n+.cta-button:hover {\n+ background-color: var(--dark-red);\n+ transform: translateY(-2px);\n+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n+}\n+\n+/* Features Section */\n+.features {\n+ padding: 4rem 2rem;\n+ display: grid;\n+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n+ gap: 2rem;\n+ max-width: 1200px;\n+ margin: 0 auto;\n+ background-color: var(--white);\n+}\n+\n+.feature-card {\n+ padding: 2rem;\n+ background: var(--white);\n+ border-radius: 10px;\n+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n+ text-align: center;\n+ border: 1px solid var(--gray);\n+ transition: transform 0.3s ease;\n+}\n+\n+.feature-card:hover {\n+ transform: translateY(-5px);\n+ box-shadow: 0 5px 15px rgba(0,0,0,0.2);\n+ border-color: var(--red);\n+}\n+\n+.feature-card h3 {\n+ font-size: 1.5rem;\n+ color: var(--dark-red);\n+ margin-bottom: 1rem;\n+}\n+\n+.feature-card p {\n+ color: var(--grey);\n+ line-height: 1.6;\n+}\n+\n+/* Navigation */\n+nav {\n+ background-color: var(--white);\n+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n+ padding: 1rem 2rem;\n+}\n+\n+.nav-links a {\n+ color: var(--grey);\n+ text-decoration: none;\n+ transition: color 0.3s ease;\n+}\n+\n+.nav-links a:hover {\n+ color: var(--red);\n+}\n+\n+/* Footer */\n+footer {\n+ background-color: var(--dark-red);\n+ color: var(--white);\n+ padding: 2rem;\n+ text-align: center;\n+ margin-top: 4rem;\n+}\n+\n+/* Responsive Design */\n+@media (max-width: 768px) {\n+ .hero-title {\n+ font-size: 2.5rem;\n+ }\n+\n+ .hero-subtitle {\n+ font-size: 1.2rem;\n+ }\n+\n+ .features {\n+ grid-template-columns: 1fr;\n+ padding: 2rem 1rem;\n+ }\n }\n\\ No newline at end of file\n" + }, + { + "date": 1743097414497, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -1191,8 +1191,9 @@\n .hero-subtitle {\n font-size: 1.5rem;\n color: var(--grey);\n margin-bottom: 2rem;\n+ text-align: center;\n }\n \n /* Buttons */\n .cta-button {\n" + }, + { + "date": 1743097431722, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -1191,9 +1191,9 @@\n .hero-subtitle {\n font-size: 1.5rem;\n color: var(--grey);\n margin-bottom: 2rem;\n- text-align: center;\n+ margin-top: 2rem;\n }\n \n /* Buttons */\n .cta-button {\n" + }, + { + "date": 1743097445503, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -1191,9 +1191,9 @@\n .hero-subtitle {\n font-size: 1.5rem;\n color: var(--grey);\n margin-bottom: 2rem;\n- margin-top: 2rem;\n+ margin-top: 2.5rem;\n }\n \n /* Buttons */\n .cta-button {\n" + }, + { + "date": 1743097545717, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -277,30 +277,42 @@\n /***************************/\n /********** HEADER *********/\n /***************************/\n header {\n- background-color: var(--light-green);\n- height: 5em;\n- padding: 1em;\n- margin-bottom: 1em;\n display: flex;\n align-items: center;\n- justify-content: space-between;\n+ padding: 0.5rem 2rem;\n+ background-color: var(--white);\n+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n \n-header nav {\n- text-align: center;\n+.logo-wrapper {\n+ flex-shrink: 0;\n+ margin-right: 2rem;\n+}\n+\n+.nav-logo {\n+ height: 50px; /* Adjust this value to your preferred size */\n+ width: auto;\n+ object-fit: contain;\n+ padding: 5px;\n+ transition: transform 0.2s ease;\n+}\n+\n+.nav-logo:hover {\n+ transform: scale(1.05);\n+}\n+\n+.primary-navigation {\n display: flex;\n- /*align-items: center;*/\n- justify-content: space-between;\n- /*align-self: center;*/\n+ align-items: center;\n+ flex-grow: 1;\n }\n \n-header nav ul {\n- justify-content: center;\n+.primary-navigation ul {\n display: flex;\n- gap: 3em;\n- margin: 0 auto;\n+ gap: 2rem;\n+ list-style: none;\n }\n \n /***************************/\n /********** HERO *********/\n" + }, + { + "date": 1743097625049, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -279,21 +279,21 @@\n /***************************/\n header {\n display: flex;\n align-items: center;\n+ justify-content: space-between;\n padding: 0.5rem 2rem;\n background-color: var(--white);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n \n .logo-wrapper {\n flex-shrink: 0;\n- margin-right: 2rem;\n }\n \n .nav-logo {\n- height: 50px; /* Adjust this value to your preferred size */\n- width: auto;\n+ height: 100px;\n+ width: 100px;\n object-fit: contain;\n padding: 5px;\n transition: transform 0.2s ease;\n }\n@@ -302,17 +302,18 @@\n transform: scale(1.05);\n }\n \n .primary-navigation {\n- display: flex;\n- align-items: center;\n- flex-grow: 1;\n+ position: absolute;\n+ left: 50%;\n+ transform: translateX(-50%);\n }\n \n .primary-navigation ul {\n display: flex;\n gap: 2rem;\n list-style: none;\n+ align-items: center;\n }\n \n /***************************/\n /********** HERO *********/\n@@ -1303,5 +1304,24 @@\n .features {\n grid-template-columns: 1fr;\n padding: 2rem 1rem;\n }\n+}\n+\n+/* Responsive adjustments */\n+@media (max-width: 768px) {\n+ header {\n+ flex-direction: column;\n+ padding: 0.5rem 1rem;\n+ }\n+\n+ .primary-navigation {\n+ position: static;\n+ transform: none;\n+ margin-top: 1rem;\n+ }\n+\n+ .nav-logo {\n+ height: 80px; /* Slightly smaller on mobile */\n+ width: 80px;\n+ }\n }\n\\ No newline at end of file\n" + }, + { + "date": 1743097680399, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -294,8 +294,9 @@\n height: 100px;\n width: 100px;\n object-fit: contain;\n padding: 5px;\n+ margin-top: 10px;\n transition: transform 0.2s ease;\n }\n \n .nav-logo:hover {\n" + }, + { + "date": 1743097706840, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -293,9 +293,9 @@\n .nav-logo {\n height: 100px;\n width: 100px;\n object-fit: contain;\n- padding: 5px;\n+ padding: 10px;\n margin-top: 10px;\n transition: transform 0.2s ease;\n }\n \n" + }, + { + "date": 1743097717004, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -293,9 +293,9 @@\n .nav-logo {\n height: 100px;\n width: 100px;\n object-fit: contain;\n- padding: 10px;\n+ padding: 5px;\n margin-top: 10px;\n transition: transform 0.2s ease;\n }\n \n" + }, + { + "date": 1743097726495, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -294,9 +294,9 @@\n height: 100px;\n width: 100px;\n object-fit: contain;\n padding: 5px;\n- margin-top: 10px;\n+ margin-top: 15px;\n transition: transform 0.2s ease;\n }\n \n .nav-logo:hover {\n" + }, + { + "date": 1743097736771, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -294,9 +294,9 @@\n height: 100px;\n width: 100px;\n object-fit: contain;\n padding: 5px;\n- margin-top: 15px;\n+ margin-top: 20px;\n transition: transform 0.2s ease;\n }\n \n .nav-logo:hover {\n" + }, + { + "date": 1743097837147, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -281,10 +281,10 @@\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 2rem;\n- background-color: var(--white);\n- box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n+ background-color: var(--dark-red);\n+ box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n }\n \n .logo-wrapper {\n flex-shrink: 0;\n@@ -325,8 +325,13 @@\n max-width: 800px;\n margin: 10px auto;\n padding: 0 15px;\n gap: 20px;\n+ text-align: center;\n+ padding: 4rem 2rem;\n+ background: linear-gradient(135deg, var(--dark-red) 0%, var(--red) 100%);\n+ border-bottom: 4px solid var(--gray);\n+ color: var(--white);\n }\n \n /* Project Creation Form (Left Sidebar) */\n .hero form {\n@@ -615,18 +620,20 @@\n .testimonials {\n /*display: flex;*/\n /*flex-flow: row wrap;*/\n text-align: center;\n- background-color: var(--white);\n+ background-color: var(--grey);\n+ padding: 4rem 2rem;\n }\n \n .testimonial-card {\n display: flex;\n /*flex-flow: row wrap;*/\n padding: 1em;\n margin: 3em;\n- background-color: var(--light-green);\n+ background-color: var(--dark-red);\n border-radius: 10px;\n+ color: var(--white);\n }\n \n .testimonial-card>div {\n width: 50%;\n@@ -643,11 +650,15 @@\n /***************************/\n /********** Features *********/\n /***************************/\n .features {\n- background-color: var(--gray);\n- text-align: center;\n- padding: 2em;\n+ padding: 4rem 2rem;\n+ display: grid;\n+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n+ gap: 2rem;\n+ max-width: 1200px;\n+ margin: 0 auto;\n+ background-color: var(--grey);\n }\n \n .feature-card-container {\n display: flex;\n@@ -657,14 +668,35 @@\n gap: 1.5em;\n }\n \n .feature-card {\n- background-color: var(--white);\n- text-align: left;\n- padding: 1em;\n+ padding: 2rem;\n+ background: var(--dark-red);\n border-radius: 10px;\n+ box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n+ text-align: center;\n+ border: 1px solid var(--red);\n+ transition: transform 0.3s ease;\n+ color: var(--white);\n }\n \n+.feature-card:hover {\n+ transform: translateY(-5px);\n+ box-shadow: 0 5px 15px rgba(0,0,0,0.3);\n+ background-color: var(--red);\n+}\n+\n+.feature-card h3 {\n+ font-size: 1.5rem;\n+ color: var(--white);\n+ margin-bottom: 1rem;\n+}\n+\n+.feature-card p {\n+ color: var(--gray);\n+ line-height: 1.6;\n+}\n+\n /*TODO: .feature-card hover and focus state */\n \n .feature-card a {\n color: var(--dark-green);\n@@ -673,10 +705,10 @@\n /***************************/\n /********** Contact Us *********/\n /***************************/\n .contact-us {\n- padding: 1em;\n- background-color: var(--dark-blue);\n+ padding: 4rem 2rem;\n+ background-color: var(--red);\n color: var(--white);\n text-align: center;\n }\n \n@@ -698,22 +730,30 @@\n /*border: 0.2em solid var(--white);*/\n border-radius: 10px;\n border: none;\n height: 3em;\n+ background-color: var(--white);\n+ border: 2px solid var(--gray);\n /*margin: 0 2em;*/\n }\n \n .contact-us button {\n padding: 0.4em 1em;\n- background-color: var(--green);\n+ background-color: var(--dark-red);\n color: var(--white);\n /*border: 0.2em solid var(--white);*/\n border-radius: 10px;\n border: none;\n height: 3em;\n font-weight: bold;\n+ transition: all 0.3s ease;\n }\n \n+.contact-us button:hover {\n+ background-color: var(--grey);\n+ transform: translateY(-2px);\n+}\n+\n /***************************/\n /********** FOOTER *********/\n /***************************/\n footer {\n@@ -1177,56 +1217,40 @@\n z-index: -1;\n }\n \n /* Hero Section */\n-.hero {\n- text-align: center;\n- padding: 4rem 2rem;\n- background: linear-gradient(135deg, var(--white) 0%, var(--gray) 100%);\n- border-bottom: 4px solid var(--red);\n-}\n-\n-.logo-container {\n- margin-bottom: 2rem;\n-}\n-\n-.logo {\n- max-width: 200px;\n- height: auto;\n-}\n-\n .hero-title {\n font-size: 3rem;\n font-weight: bold;\n- color: var(--dark-red);\n+ color: var(--white);\n margin-bottom: 1rem;\n- text-shadow: 1px 1px 2px rgba(0,0,0,0.1);\n+ text-shadow: 2px 2px 4px rgba(0,0,0,0.2);\n }\n \n .hero-subtitle {\n font-size: 1.5rem;\n- color: var(--grey);\n+ color: var(--gray);\n margin-bottom: 2rem;\n margin-top: 2.5rem;\n }\n \n /* Buttons */\n .cta-button {\n display: inline-block;\n padding: 1rem 2rem;\n- background-color: var(--red);\n- color: var(--white);\n+ background-color: var(--white);\n+ color: var(--dark-red);\n text-decoration: none;\n border-radius: 5px;\n- transition: background-color 0.3s ease;\n+ transition: all 0.3s ease;\n font-weight: bold;\n border: none;\n }\n \n .cta-button:hover {\n- background-color: var(--dark-red);\n+ background-color: var(--gray);\n transform: translateY(-2px);\n- box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n+ box-shadow: 0 4px 8px rgba(0,0,0,0.2);\n }\n \n /* Features Section */\n .features {\n@@ -1235,35 +1259,36 @@\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 2rem;\n max-width: 1200px;\n margin: 0 auto;\n- background-color: var(--white);\n+ background-color: var(--grey);\n }\n \n .feature-card {\n padding: 2rem;\n- background: var(--white);\n+ background: var(--dark-red);\n border-radius: 10px;\n- box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n+ box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n text-align: center;\n- border: 1px solid var(--gray);\n+ border: 1px solid var(--red);\n transition: transform 0.3s ease;\n+ color: var(--white);\n }\n \n .feature-card:hover {\n transform: translateY(-5px);\n- box-shadow: 0 5px 15px rgba(0,0,0,0.2);\n- border-color: var(--red);\n+ box-shadow: 0 5px 15px rgba(0,0,0,0.3);\n+ background-color: var(--red);\n }\n \n .feature-card h3 {\n font-size: 1.5rem;\n- color: var(--dark-red);\n+ color: var(--white);\n margin-bottom: 1rem;\n }\n \n .feature-card p {\n- color: var(--grey);\n+ color: var(--gray);\n line-height: 1.6;\n }\n \n /* Navigation */\n" + }, + { + "date": 1743097951144, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -8,14 +8,16 @@\n --grey: #606060;\n --red: #d2433c;\n --dark-red: #6e1818;\n --gray: #cac6c6;\n+ --gradient: linear-gradient(135deg, var(--dark-red) 0%, var(--red) 100%);\n }\n \n body {\n- background-color: var(--white);\n+ background-color: #f5f5f5;\n color: var(--black);\n- font-family: Roboto, sans-serif\n+ font-family: 'Poppins', sans-serif;\n+ line-height: 1.6;\n }\n \n h1 {\n font-size: 2em;\n@@ -277,33 +279,27 @@\n /***************************/\n /********** HEADER *********/\n /***************************/\n header {\n- display: flex;\n- align-items: center;\n- justify-content: space-between;\n- padding: 0.5rem 2rem;\n- background-color: var(--dark-red);\n- box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n+ background: var(--gradient);\n+ padding: 1rem 4rem;\n+ position: fixed;\n+ width: 100%;\n+ top: 0;\n+ z-index: 1000;\n+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n }\n \n .logo-wrapper {\n flex-shrink: 0;\n }\n \n .nav-logo {\n- height: 100px;\n- width: 100px;\n- object-fit: contain;\n- padding: 5px;\n- margin-top: 20px;\n- transition: transform 0.2s ease;\n+ height: 60px;\n+ width: auto;\n+ filter: brightness(0) invert(1);\n }\n \n-.nav-logo:hover {\n- transform: scale(1.05);\n-}\n-\n .primary-navigation {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n@@ -315,8 +311,21 @@\n list-style: none;\n align-items: center;\n }\n \n+.primary-navigation ul li a {\n+ color: var(--white);\n+ font-weight: 500;\n+ text-transform: uppercase;\n+ font-size: 0.9rem;\n+ letter-spacing: 0.5px;\n+ padding: 0.5rem 1rem;\n+ transition: all 0.3s ease;\n+}\n+\n+.primary-navigation ul li a:hover {\n+ color: var(--gray);\n+ transform: translateY(-2px);\n /***************************/\n /********** HERO *********/\n /***************************/\n .hero {\n" + }, + { + "date": 1743097956532, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -324,25 +324,58 @@\n \n .primary-navigation ul li a:hover {\n color: var(--gray);\n transform: translateY(-2px);\n+}\n+\n /***************************/\n /********** HERO *********/\n /***************************/\n .hero {\n- display: flex;\n- justify-content: left;\n- max-width: 800px;\n- margin: 10px auto;\n- padding: 0 15px;\n- gap: 20px;\n+ margin-top: 80px; /* Account for fixed header */\n+ padding: 6rem 2rem;\n+ background: var(--gradient);\n text-align: center;\n- padding: 4rem 2rem;\n- background: linear-gradient(135deg, var(--dark-red) 0%, var(--red) 100%);\n- border-bottom: 4px solid var(--gray);\n+ clip-path: polygon(0 0, 100% 0, 100% 85%, 0 100%);\n+}\n+\n+.hero-title {\n+ font-size: 4rem;\n+ font-weight: 800;\n color: var(--white);\n+ margin-bottom: 1.5rem;\n+ text-shadow: 2px 2px 4px rgba(0,0,0,0.2);\n+ letter-spacing: -1px;\n }\n \n+.hero-subtitle {\n+ font-size: 1.5rem;\n+ color: var(--gray);\n+ margin-bottom: 3rem;\n+ font-weight: 300;\n+ max-width: 600px;\n+ margin-left: auto;\n+ margin-right: auto;\n+}\n+\n+.cta-button {\n+ padding: 1rem 3rem;\n+ background-color: var(--white);\n+ color: var(--dark-red);\n+ font-weight: 600;\n+ border-radius: 30px;\n+ text-transform: uppercase;\n+ letter-spacing: 1px;\n+ transition: all 0.3s ease;\n+ box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n+}\n+\n+.cta-button:hover {\n+ transform: translateY(-3px);\n+ box-shadow: 0 6px 20px rgba(0,0,0,0.2);\n+ background-color: var(--gray);\n+}\n+\n /* Project Creation Form (Left Sidebar) */\n .hero form {\n position: sticky;\n top: 20px;\n@@ -626,84 +659,66 @@\n /***************************/\n /****** Testimonials *******/\n /***************************/\n .testimonials {\n- /*display: flex;*/\n- /*flex-flow: row wrap;*/\n- text-align: center;\n- background-color: var(--grey);\n- padding: 4rem 2rem;\n+ background-color: #f8f9fa;\n+ padding: 6rem 2rem;\n }\n \n .testimonial-card {\n- display: flex;\n- /*flex-flow: row wrap;*/\n- padding: 1em;\n- margin: 3em;\n- background-color: var(--dark-red);\n- border-radius: 10px;\n- color: var(--white);\n+ background: var(--white);\n+ border-radius: 15px;\n+ padding: 2rem;\n+ margin: 2rem auto;\n+ max-width: 1000px;\n+ box-shadow: 0 5px 20px rgba(0,0,0,0.05);\n }\n \n-.testimonial-card>div {\n- width: 50%;\n-}\n-\n-/*.testimonials.card>div:first-child() {*/\n-/* width: 70%;*/\n-/*}*/\n-/**/\n-/*.testimonials.card>div:last-child() {*/\n-/* width: 30%;*/\n-/*}*/\n-\n /***************************/\n /********** Features *********/\n /***************************/\n .features {\n- padding: 4rem 2rem;\n- display: grid;\n- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n- gap: 2rem;\n- max-width: 1200px;\n- margin: 0 auto;\n- background-color: var(--grey);\n+ padding: 8rem 2rem;\n+ background-color: var(--white);\n+ position: relative;\n }\n \n-.feature-card-container {\n- display: flex;\n- justify-content: space-around;\n- width: 80%;\n- margin: 0 auto;\n- gap: 1.5em;\n+.features::before {\n+ content: '';\n+ position: absolute;\n+ top: 0;\n+ left: 0;\n+ right: 0;\n+ height: 100%;\n+ background: linear-gradient(180deg, #f5f5f5 0%, var(--white) 100%);\n+ z-index: -1;\n }\n \n .feature-card {\n- padding: 2rem;\n- background: var(--dark-red);\n- border-radius: 10px;\n- box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n- text-align: center;\n- border: 1px solid var(--red);\n- transition: transform 0.3s ease;\n- color: var(--white);\n+ background: var(--white);\n+ border-radius: 15px;\n+ padding: 3rem 2rem;\n+ box-shadow: 0 10px 30px rgba(0,0,0,0.1);\n+ border: none;\n+ transition: all 0.4s ease;\n }\n \n .feature-card:hover {\n- transform: translateY(-5px);\n- box-shadow: 0 5px 15px rgba(0,0,0,0.3);\n- background-color: var(--red);\n+ transform: translateY(-10px);\n+ box-shadow: 0 15px 40px rgba(0,0,0,0.2);\n }\n \n .feature-card h3 {\n- font-size: 1.5rem;\n- color: var(--white);\n- margin-bottom: 1rem;\n+ color: var(--dark-red);\n+ font-size: 1.8rem;\n+ margin-bottom: 1.5rem;\n+ font-weight: 700;\n }\n \n .feature-card p {\n- color: var(--gray);\n- line-height: 1.6;\n+ color: var(--grey);\n+ font-size: 1.1rem;\n+ line-height: 1.8;\n }\n \n /*TODO: .feature-card hover and focus state */\n \n@@ -714,12 +729,11 @@\n /***************************/\n /********** Contact Us *********/\n /***************************/\n .contact-us {\n- padding: 4rem 2rem;\n- background-color: var(--red);\n- color: var(--white);\n- text-align: center;\n+ background: var(--gradient);\n+ padding: 6rem 2rem;\n+ clip-path: polygon(0 15%, 100% 0, 100% 100%, 0 100%);\n }\n \n h1,\n p {\n@@ -734,45 +748,38 @@\n /*column-gap: 3em;*/\n }\n \n .contact-us input {\n- padding: 0.4em 1em;\n- /*border: 0.2em solid var(--white);*/\n- border-radius: 10px;\n+ padding: 1rem 2rem;\n+ border-radius: 30px;\n border: none;\n- height: 3em;\n- background-color: var(--white);\n- border: 2px solid var(--gray);\n- /*margin: 0 2em;*/\n+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n+ font-size: 1rem;\n+ width: 300px;\n }\n \n .contact-us button {\n- padding: 0.4em 1em;\n- background-color: var(--dark-red);\n- color: var(--white);\n- /*border: 0.2em solid var(--white);*/\n- border-radius: 10px;\n- border: none;\n- height: 3em;\n- font-weight: bold;\n+ padding: 1rem 3rem;\n+ border-radius: 30px;\n+ background: var(--dark-red);\n+ font-weight: 600;\n+ text-transform: uppercase;\n+ letter-spacing: 1px;\n transition: all 0.3s ease;\n }\n \n .contact-us button:hover {\n- background-color: var(--grey);\n transform: translateY(-2px);\n+ box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n }\n \n /***************************/\n /********** FOOTER *********/\n /***************************/\n footer {\n- padding: 1em;\n- background-color: var(--dark-green);\n+ background: var(--dark-red);\n+ padding: 4rem 2rem;\n color: var(--white);\n- text-align: center;\n- display: flex;\n- flex-direction: column;\n }\n \n footer nav {\n display: flex;\n@@ -781,12 +788,23 @@\n }\n \n footer nav ul {\n display: flex;\n- gap: 3em;\n+ gap: 4rem;\n margin: 0 auto;\n }\n \n+footer nav ul a {\n+ color: var(--white);\n+ text-decoration: none;\n+ font-weight: 500;\n+ transition: color 0.3s ease;\n+}\n+\n+footer nav ul a:hover {\n+ color: var(--gray);\n+}\n+\n /***************************/\n /********** Project *********/\n /***************************/\n .project-card {\n" + }, + { + "date": 1743098219047, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -280,12 +280,16 @@\n /********** HEADER *********/\n /***************************/\n header {\n background: var(--gradient);\n- padding: 1rem 4rem;\n+ padding: 1rem 2rem;\n+ width: 100%;\n+ display: flex;\n+ justify-content: space-between;\n+ align-items: center;\n position: fixed;\n- width: 100%;\n top: 0;\n+ left: 0;\n z-index: 1000;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n }\n \n@@ -295,39 +299,64 @@\n \n .nav-logo {\n height: 60px;\n width: auto;\n- filter: brightness(0) invert(1);\n+ display: block;\n+ object-fit: contain;\n }\n \n .primary-navigation {\n- position: absolute;\n- left: 50%;\n- transform: translateX(-50%);\n+ flex-grow: 1;\n+ display: flex;\n+ justify-content: center;\n }\n \n .primary-navigation ul {\n display: flex;\n gap: 2rem;\n list-style: none;\n align-items: center;\n+ margin: 0;\n+ padding: 0;\n }\n \n .primary-navigation ul li a {\n color: var(--white);\n- font-weight: 500;\n+ font-weight: 600;\n text-transform: uppercase;\n- font-size: 0.9rem;\n+ font-size: 1rem;\n letter-spacing: 0.5px;\n padding: 0.5rem 1rem;\n transition: all 0.3s ease;\n+ text-decoration: none;\n+ display: block;\n+ text-shadow: 1px 1px 2px rgba(0,0,0,0.1);\n }\n \n .primary-navigation ul li a:hover {\n color: var(--gray);\n transform: translateY(-2px);\n }\n \n+/* Responsive adjustments */\n+@media (max-width: 768px) {\n+ header {\n+ flex-direction: column;\n+ padding: 1rem;\n+ gap: 1rem;\n+ }\n+\n+ .nav-logo {\n+ height: 50px;\n+ }\n+\n+ .primary-navigation ul {\n+ flex-wrap: wrap;\n+ justify-content: center;\n+ gap: 1rem;\n+ }\n+}\n+\n /***************************/\n /********** HERO *********/\n /***************************/\n .hero {\n" + }, + { + "date": 1743098375567, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -319,22 +319,21 @@\n padding: 0;\n }\n \n .primary-navigation ul li a {\n- color: var(--white);\n- font-weight: 600;\n+ color: var(--gray);\n+ font-weight: 700;\n text-transform: uppercase;\n- font-size: 1rem;\n+ font-size: 1.1rem;\n letter-spacing: 0.5px;\n padding: 0.5rem 1rem;\n transition: all 0.3s ease;\n text-decoration: none;\n display: block;\n- text-shadow: 1px 1px 2px rgba(0,0,0,0.1);\n }\n \n .primary-navigation ul li a:hover {\n- color: var(--gray);\n+ color: var(--white);\n transform: translateY(-2px);\n }\n \n /* Responsive adjustments */\n" + }, + { + "date": 1743098452848, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -280,9 +280,9 @@\n /********** HEADER *********/\n /***************************/\n header {\n background: var(--gradient);\n- padding: 1rem 2rem;\n+ padding: 0.5rem 2rem;\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n@@ -290,16 +290,17 @@\n top: 0;\n left: 0;\n z-index: 1000;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n+ min-height: 120px;\n }\n \n .logo-wrapper {\n flex-shrink: 0;\n }\n \n .nav-logo {\n- height: 60px;\n+ height: 100px;\n width: auto;\n display: block;\n object-fit: contain;\n }\n@@ -331,9 +332,9 @@\n display: block;\n }\n \n .primary-navigation ul li a:hover {\n- color: var(--white);\n+ color: var(--grey);\n transform: translateY(-2px);\n }\n \n /* Responsive adjustments */\n@@ -344,9 +345,9 @@\n gap: 1rem;\n }\n \n .nav-logo {\n- height: 50px;\n+ height: 80px;\n }\n \n .primary-navigation ul {\n flex-wrap: wrap;\n@@ -1401,8 +1402,8 @@\n margin-top: 1rem;\n }\n \n .nav-logo {\n- height: 80px; /* Slightly smaller on mobile */\n+ height: 80px; /* Slightly smaller on mobile but still substantial */\n width: 80px;\n }\n }\n\\ No newline at end of file\n" + } + ], + "date": 1743095948996, + "name": "Commit-0", + "content": "/***************************/\n/********** BASE *********/\n/***************************/\n:root {\n --white: #fff;\n --black: #000;\n --light-green: #EBF5F3;\n --dark-green: #0C3245;\n --green: #08CF65;\n --dark-blue: #181F38;\n --gray: #EBEDF5;\n}\n\nbody {\n background-color: var(--white);\n font-family: Roboto, sans-serif\n}\n\nh1 {\n font-size: 2em;\n font-weight: bold;\n font-family: Poppins, Roboto, sans-serif;\n}\n\nh2 {\n font-size: 1.5em;\n font-weight: bold;\n}\n.logo-container {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n\n/***************************/\n/********** LAYOUT *********/\n/***************************/\n.drag-container {\n display: flex;\n gap: 20px;\n padding: 20px;\n overflow-x: auto;\n min-height: 500px;\n background: var(--light-green);\n border-radius: 8px;\n margin: 20px 0;\n}\n\n.dragColumn {\n min-width: 300px;\n width: 300px;\n background: white;\n border-radius: 8px;\n padding: 15px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n display: flex;\n flex-direction: column;\n margin: 0;\n position: relative;\n}\n\n/* Column Navigation */\n.columnNav {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-bottom: 10px;\n border-bottom: 2px solid var(--light-green);\n margin-bottom: 10px;\n}\n\n.columnNav h1 {\n flex-grow: 1;\n font-size: 1.1rem;\n font-weight: 600;\n color: var(--dark-green);\n margin: 0;\n}\n\n/* Handle and Action Buttons */\n.handle, .bar {\n width: 24px;\n height: 24px;\n border-radius: 4px;\n background-color: var(--light-green);\n cursor: move;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--dark-green);\n}\n\n.newDocPopupButton {\n width: 30px;\n height: 30px;\n border: none;\n border-radius: 4px;\n background: var(--green);\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n}\n\n.newDocPopupButton:hover {\n transform: translateY(-1px);\n background: #07b659;\n}\n\n.deleteButton {\n width: 30px;\n height: 30px;\n border: none;\n border-radius: 4px;\n background: #dc3545;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n}\n\n.deleteButton:hover {\n background: #c82333;\n}\n\n/* Draggable Documents */\n.dragDocument {\n background: white;\n border: 1px solid #eee;\n border-radius: 6px;\n padding: 12px;\n margin-bottom: 8px;\n cursor: move;\n transition: all 0.2s ease;\n display: flex;\n flex-direction: column;\n}\n\n.dragDocument:hover {\n box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n transform: translateY(-1px);\n}\n\n.dragDocument h2 {\n margin: 0 0 8px 0;\n font-size: 1rem;\n font-weight: 500;\n}\n\n.dragDocument p {\n margin: 0;\n font-size: 0.9rem;\n color: #666;\n}\n\n/* Create Document Form */\n#createDocumentForm {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: white;\n padding: 24px;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.2);\n width: 90%;\n max-width: 500px;\n z-index: 1000;\n max-height: 90vh;\n overflow-y: auto;\n}\n\n#createDocumentForm:not([hidden]) {\n display: block;\n}\n\n.form-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n}\n\n.form-header h2 {\n margin: 0;\n color: var(--dark-green);\n}\n\n.close-btn {\n font-size: 24px;\n cursor: pointer;\n color: #666;\n transition: color 0.2s ease;\n}\n\n.close-btn:hover {\n color: var(--dark-green);\n}\n\n#createDocumentForm .form-group {\n margin-bottom: 20px;\n}\n\n#createDocumentForm label {\n display: block;\n margin-bottom: 8px;\n color: var(--dark-green);\n font-weight: 500;\n}\n\n#createDocumentForm input[type=\"text\"],\n#createDocumentForm textarea {\n width: 100%;\n padding: 10px;\n margin-bottom: 15px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n}\n\n#createDocumentForm textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.form-buttons {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 10px;\n margin-top: 15px;\n}\n\n.btn-secondary {\n background: var(--light-green);\n color: var(--dark-green);\n border: none;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary:hover {\n background: var(--green);\n color: white;\n}\n\n/* Backdrop when form is visible */\n#createDocumentForm:not([hidden])::before {\n content: '';\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: -1;\n}\n\n/* Dragula Specific Styles */\n.gu-mirror {\n transform: rotate(0deg) !important;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n}\n\n.gu-transit {\n opacity: 0.3;\n background: var(--light-green);\n}\n\n/***************************/\n/********** HEADER *********/\n/***************************/\nheader {\n background-color: var(--light-green);\n height: 5em;\n padding: 1em;\n margin-bottom: 1em;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\nheader nav {\n text-align: center;\n display: flex;\n /*align-items: center;*/\n justify-content: space-between;\n /*align-self: center;*/\n}\n\nheader nav ul {\n justify-content: center;\n display: flex;\n gap: 3em;\n margin: 0 auto;\n}\n\n/***************************/\n/********** HERO *********/\n/***************************/\n.hero {\n max-width: 1200px;\n margin: 10px auto;\n padding: 0 15px;\n display: grid;\n grid-template-columns: 250px 1fr; /* Reduced sidebar width from 300px */\n gap: 20px;\n}\n\n/* Project Creation Form (Left Sidebar) */\n.hero form {\n position: sticky;\n top: 20px;\n background: var(--white);\n padding: 15px;\n border-radius: 12px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n height: fit-content;\n max-height: 90vh; /* Maximum height of viewport */\n overflow-y: auto; /* Makes form scrollable if too long */\n}\n\n/* Project List Container (Right Side) */\n.hero ul {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n\n/* Individual Project Card */\n.hero ul li {\n background: var(--white);\n padding: 15px;\n margin-bottom: 15px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n/* Project Title Link */\n.hero ul li a {\n color: var(--dark-green);\n text-decoration: none;\n font-weight: 500;\n flex-grow: 1;\n}\n\n/* Project Actions Container */\n.project-actions {\n display: flex;\n gap: 10px;\n}\n\n/* Document Section */\n.project-documents {\n margin-top: 10px;\n margin-bottom: 20px;\n background: var(--light-green);\n border-radius: 8px;\n padding: 15px;\n}\n\n.document-column {\n background: var(--white);\n border-radius: 8px;\n padding: 15px;\n}\n\n.document-list {\n max-height: 300px;\n overflow-y: auto;\n padding: 10px;\n margin: 10px 0;\n border: 1px solid #eee;\n border-radius: 6px;\n}\n\n/* Scrollbar Styling */\n.document-list::-webkit-scrollbar {\n width: 8px;\n}\n\n.document-list::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 4px;\n}\n\n.document-list::-webkit-scrollbar-thumb {\n background: var(--green);\n border-radius: 4px;\n}\n\n/* Document Cards */\n.document-card {\n background: white;\n padding: 12px;\n margin-bottom: 8px;\n border-radius: 6px;\n border: 1px solid #eee;\n}\n\n/* Modal Improvements */\n.modal {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0,0,0,0.5);\n z-index: 1000;\n overflow-y: auto;\n}\n\n.modal-content {\n position: relative;\n background: var(--white);\n margin: 50px auto;\n padding: 25px;\n width: 90%;\n max-width: 500px;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.2);\n}\n\n/* Form Group Spacing */\n.form-group {\n margin-bottom: 12px; /* Reduced from 20px */\n}\n\n.form-group label {\n display: block;\n margin-bottom: 4px; /* Reduced from 8px */\n color: var(--dark-green);\n font-weight: 500;\n font-size: 0.9rem; /* Slightly smaller font */\n}\n\n/* Form Controls */\n.form-control {\n width: 100%;\n padding: 8px; /* Reduced from 10px */\n border: 1px solid #ddd;\n border-radius: 6px;\n margin-bottom: 8px; /* Reduced from 10px */\n font-size: 0.9rem;\n}\n\n/* Textarea specific styling */\ntextarea.form-control {\n min-height: 60px; /* Reduced from 100px */\n max-height: 120px;\n resize: vertical;\n}\n\n/* Buttons */\n.btn-primary, .add-document-btn {\n padding: 8px 16px; /* Reduced padding */\n font-size: 0.9rem;\n width: 100%;\n background: var(--green);\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n.btn-primary:hover, .add-document-btn:hover {\n background: #07b659;\n transform: translateY(-1px);\n}\n\n/* Action Buttons */\n.delete-btn, .edit-btn {\n padding: 8px;\n border: none;\n background: none;\n cursor: pointer;\n transition: transform 0.2s ease;\n}\n\n.delete-btn i {\n color: #dc3545;\n font-size: 1.2rem;\n}\n\n.edit-btn i {\n color: #0056b3;\n font-size: 1.2rem;\n}\n\n.delete-btn:hover, .edit-btn:hover {\n transform: scale(1.1);\n}\n\n/* Document Actions */\n.document-actions {\n display: flex;\n gap: 8px;\n margin-top: 10px;\n}\n\n.document-actions button {\n padding: 6px 12px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.9rem;\n background: var(--green);\n color: white;\n}\n\n.document-actions button:last-child {\n background: #dc3545;\n}\n\n/* Header Styling */\nh1 {\n color: var(--dark-green);\n margin: 20px;\n text-align: center;\n}\n\n/* Navigation Link */\na[href=\"/\"] {\n display: inline-block;\n margin: 0 20px 20px;\n color: var(--dark-green);\n text-decoration: none;\n font-weight: 500;\n}\n\na[href=\"/\"]:hover {\n color: var(--green);\n}\n\n/***************************/\n/****** Google Button ******/\n/***************************/\n.btn i {\n font-size: 1.3rem;\n line-height: inherit;\n color: #fff;\n text-align: center;\n letter-spacing: .5px;\n cursor: pointer;\n text-transform: uppercase;\n -webkit-tap-highlight-color: transparent;\n}\n\n.fab {\n font-weight: 400;\n font-family: \"Font Awesome 6 Brands\";\n -webkit-font-smooColumn: antialiased;\n display: var(--fa-display, inline-block);\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n}\n\ni.left {\n float: left;\n margin-right: 15px;\n}\n\n.red.darken-1 {\n display: flex;\n align-items: center;\n padding: 10px 20px;\n background-color: #E53935 !important;\n color: #fff;\n border: none;\n border-radius: 2%;\n box-shadow: 1px 1px 1px #000;\n vertical-align: middle;\n margin: auto;\n}\n\n.googleAnchor {\n display: flex;\n justify-content: center;\n align-items: center;\n vertical-align: middle;\n align-self: center;\n}\n\n/***************************/\n/****** Testimonials *******/\n/***************************/\n.testimonials {\n /*display: flex;*/\n /*flex-flow: row wrap;*/\n text-align: center;\n background-color: var(--white);\n}\n\n.testimonial-card {\n display: flex;\n /*flex-flow: row wrap;*/\n padding: 1em;\n margin: 3em;\n background-color: var(--light-green);\n border-radius: 10px;\n}\n\n.testimonial-card>div {\n width: 50%;\n}\n\n/*.testimonials.card>div:first-child() {*/\n/* width: 70%;*/\n/*}*/\n/**/\n/*.testimonials.card>div:last-child() {*/\n/* width: 30%;*/\n/*}*/\n\n/***************************/\n/********** Features *********/\n/***************************/\n.features {\n background-color: var(--gray);\n text-align: center;\n padding: 2em;\n}\n\n.feature-card-container {\n display: flex;\n justify-content: space-around;\n width: 80%;\n margin: 0 auto;\n gap: 1.5em;\n}\n\n.feature-card {\n background-color: var(--white);\n text-align: left;\n padding: 1em;\n border-radius: 10px;\n}\n\n/*TODO: .feature-card hover and focus state */\n\n.feature-card a {\n color: var(--dark-green);\n}\n\n/***************************/\n/********** Contact Us *********/\n/***************************/\n.contact-us {\n padding: 1em;\n background-color: var(--dark-blue);\n color: var(--white);\n text-align: center;\n}\n\nh1,\np {\n margin-bottom: 0.5em;\n}\n\n.contact-us form {\n display: flex;\n flex-flow: row wrap;\n justify-content: center;\n gap: 1em;\n /*column-gap: 3em;*/\n}\n\n.contact-us input {\n padding: 0.4em 1em;\n /*border: 0.2em solid var(--white);*/\n border-radius: 10px;\n border: none;\n height: 3em;\n /*margin: 0 2em;*/\n}\n\n.contact-us button {\n padding: 0.4em 1em;\n background-color: var(--green);\n color: var(--white);\n /*border: 0.2em solid var(--white);*/\n border-radius: 10px;\n border: none;\n height: 3em;\n font-weight: bold;\n}\n\n/***************************/\n/********** FOOTER *********/\n/***************************/\nfooter {\n padding: 1em;\n background-color: var(--dark-green);\n color: var(--white);\n text-align: center;\n display: flex;\n flex-direction: column;\n}\n\nfooter nav {\n display: flex;\n text-align: center;\n margin-bottom: 2em;\n}\n\nfooter nav ul {\n display: flex;\n gap: 3em;\n margin: 0 auto;\n}\n\n/***************************/\n/********** Project *********/\n/***************************/\n.project-card {\n padding: 1em;\n border: 0.2em solid var(--black);\n border-radius: 10px;\n}\n\n/* Drag and Drop Visual Feedback */\n.document-card.dragging {\n opacity: 0.5;\n background: var(--light-green);\n}\n\n.document-column.drag-over {\n background: var(--light-green);\n border: 2px dashed var(--green);\n}\n\n/* Icons within documents */\n.document-card i {\n font-size: 1.1rem;\n margin-right: 5px;\n}\n\n.document-actions i {\n font-size: 1rem;\n}\n\n/* Custom scrollbar for the form */\n.hero form::-webkit-scrollbar {\n width: 6px;\n}\n\n.hero form::-webkit-scrollbar-track {\n background: #f1f1f1;\n}\n\n.hero form::-webkit-scrollbar-thumb {\n background: var(--green);\n border-radius: 3px;\n}\n\n/* Responsive adjustments */\n@media (max-width: 968px) {\n .hero {\n grid-template-columns: 1fr;\n }\n\n .hero form {\n position: relative;\n max-height: none;\n }\n}\n\n@media (max-height: 800px) {\n .form-group {\n margin-bottom: 8px;\n }\n \n .form-control {\n padding: 6px;\n }\n \n textarea.form-control {\n min-height: 50px;\n }\n}\n\n/* Update the add document button styling */\n.add-document-btn {\n width: 100%;\n padding: 10px 15px;\n background: var(--green);\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.add-document-btn i {\n font-size: 1.1rem;\n}\n\n.add-document-btn:hover {\n background: #07b659;\n transform: translateY(-1px);\n}\n\n/* Ensure the icon is vertically centered */\n.add-document-btn i {\n display: inline-flex;\n align-items: center;\n}\n\n/* Create Column Form Styling */\n.createColumnForm {\n background: var(--white);\n padding: 15px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n margin-bottom: 20px;\n max-width: 300px;\n}\n\n/* Form Header */\n.createColumnForm h3 {\n color: var(--dark-green);\n font-size: 1.1rem;\n margin-bottom: 12px;\n font-weight: 600;\n}\n\n/* Input Group */\n.createColumnForm .input-group {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n/* Input Field */\n.createColumnForm input {\n flex-grow: 1;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 0.9rem;\n transition: border-color 0.2s ease;\n}\n\n.createColumnForm input:focus {\n outline: none;\n border-color: var(--green);\n box-shadow: 0 0 0 2px rgba(8, 207, 101, 0.1);\n}\n\n/* Add Column Button */\n.createColumnForm button {\n padding: 8px 12px;\n background: var(--green);\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s ease;\n}\n\n.createColumnForm button i {\n font-size: 1rem;\n}\n\n.createColumnForm button:hover {\n background: #07b659;\n transform: translateY(-1px);\n}\n\n/* Error Message */\n.createColumnForm .error {\n color: #dc3545;\n font-size: 0.8rem;\n margin-top: 4px;\n display: none;\n}\n\n/* Success Message */\n.createColumnForm .success {\n color: var(--green);\n font-size: 0.8rem;\n margin-top: 4px;\n display: none;\n}\n\n/* Drag Parent Container */\n#dragparent {\n display: flex;\n gap: 20px;\n padding: 20px;\n overflow-x: auto;\n min-height: 500px;\n background: var(--light-green);\n border-radius: 8px;\n margin: 20px 0;\n}\n\n/* Column Styling */\n.dragColumn {\n min-width: 300px;\n width: 300px;\n background: white;\n border-radius: 8px;\n padding: 15px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n display: flex;\n flex-direction: column;\n max-height: 80vh;\n}\n\n/* Column Header */\n.dragColumn h3 {\n color: var(--dark-green);\n font-size: 1.1rem;\n font-weight: 600;\n padding-bottom: 12px;\n border-bottom: 2px solid var(--light-green);\n margin-bottom: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n/* Column Content Area */\n.dragColumn-content {\n flex-grow: 1;\n overflow-y: auto;\n padding: 8px;\n margin: -8px; /* Compensate for padding */\n}\n\n/* Scrollbar Styling */\n.dragColumn-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.dragColumn-content::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 3px;\n}\n\n.dragColumn-content::-webkit-scrollbar-thumb {\n background: var(--green);\n border-radius: 3px;\n}\n\n/* Draggable Items */\n.dragDocument {\n background: white;\n border: 1px solid #eee;\n border-radius: 6px;\n padding: 12px;\n margin-bottom: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n cursor: move;\n transition: all 0.2s ease;\n}\n\n.dragDocument:hover {\n box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n transform: translateY(-1px);\n}\n\n/* Drag States */\n.dragDocument.dragging {\n opacity: 0.5;\n background: var(--light-green);\n}\n\n.dragColumn.drag-over {\n background: var(--light-green);\n border: 2px dashed var(--green);\n}\n\n/* Add horizontal scrollbar styling for the container */\n#dragparent::-webkit-scrollbar {\n height: 8px;\n}\n\n#dragparent::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 4px;\n}\n\n#dragparent::-webkit-scrollbar-thumb {\n background: var(--green);\n border-radius: 4px;\n}\n\n/* Column Actions */\n.column-actions {\n display: flex;\n gap: 8px;\n margin-top: auto;\n padding-top: 12px;\n border-top: 1px solid #eee;\n}\n\n.column-actions button {\n padding: 8px;\n border: none;\n background: none;\n color: var(--dark-green);\n cursor: pointer;\n transition: color 0.2s ease;\n}\n\n.column-actions button:hover {\n color: var(--green);\n}\n\n/* Empty Column State */\n.dragColumn-empty {\n text-align: center;\n color: #999;\n padding: 20px;\n font-size: 0.9rem;\n}\n\n/* Responsive Adjustments */\n@media (max-width: 768px) {\n #dragparent {\n padding: 10px;\n gap: 15px;\n }\n\n .dragColumn {\n min-width: 280px;\n width: 280px;\n }\n}\n\n/* Add Document Button within Column */\n.add-document-btn {\n width: 100%;\n padding: 8px;\n background: var(--green);\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n margin-top: 8px;\n transition: all 0.2s ease;\n}\n\n.add-document-btn i {\n font-size: 1rem;\n}\n\n.add-document-btn:hover {\n background: #07b659;\n transform: translateY(-1px);\n}\n\n/* Document Count Badge */\n.document-count {\n background: var(--light-green);\n color: var(--dark-green);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 0.8rem;\n font-weight: 500;\n}\n\n/* Updated Button Primary Styling */\n.btn-primary {\n background: var(--green);\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(8, 207, 101, 0.2);\n}\n\n.btn-primary:hover {\n background: #07b659;\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(8, 207, 101, 0.3);\n}\n\n.btn-primary:active {\n transform: translateY(0);\n box-shadow: 0 2px 4px rgba(8, 207, 101, 0.2);\n}\n\n/* Add icon support for buttons */\n.btn-primary i {\n font-size: 1rem;\n}\n\n/* Form positioning container */\n.form-container {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n/* Add backdrop */\n.backdrop {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n z-index: 999;\n display: none;\n}\n\n/* Show backdrop when form is visible */\n#createDocumentForm:not([hidden]) + .backdrop {\n display: block;\n}\n\n/* Make sure the form is visible when not hidden */\n#createDocumentForm:not([hidden]) {\n display: block;\n}\n\n/* Add a semi-transparent overlay when form is visible */\n#createDocumentForm:not([hidden])::before {\n content: '';\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: -1;\n}" + } + ] +} \ No newline at end of file diff --git a/.lh/routes/profile.js.json b/.lh/routes/profile.js.json new file mode 100644 index 0000000..4040cb7 --- /dev/null +++ b/.lh/routes/profile.js.json @@ -0,0 +1,18 @@ +{ + "sourceFile": "routes/profile.js", + "activeCommit": 0, + "commits": [ + { + "activePatchIndex": 0, + "patches": [ + { + "date": 1741911427334, + "content": "Index: \n===================================================================\n--- \n+++ \n" + } + ], + "date": 1741911427334, + "name": "Commit-0", + "content": "router.get('/', ensureAuth, async (req, res) => {\n try {\n // Get all projects with their columns and documents\n const projectList = await Project.find({ adminId: req.user._id })\n .populate({\n path: 'columns',\n populate: {\n path: 'documents',\n options: { sort: { 'position': 1 } }\n }\n })\n .lean();\n\n res.render('profile', {\n projectList,\n user: req.user\n });\n } catch (err) {\n console.error(err);\n res.render('error/500');\n }\n});\n\n// Add a route to get project data\nrouter.get('/project/:id/data', ensureAuth, async (req, res) => {\n try {\n const project = await Project.findById(req.params.id)\n .populate({\n path: 'columns',\n populate: {\n path: 'documents',\n options: { sort: { 'position': 1 } }\n }\n });\n res.json(project);\n } catch (err) {\n res.status(500).json({ error: err.message });\n }\n});\n\n// Update project route\nrouter.put('/project/:id', async (req, res) => {\n try {\n // Only select the fields we want to update\n const updateData = {\n name: req.body.name,\n description: req.body.description,\n startDate: req.body.startDate,\n endDate: req.body.endDate,\n status: req.body.status\n };\n\n // Use findByIdAndUpdate with specific options\n const updatedProject = await Project.findByIdAndUpdate(\n req.params.id,\n { $set: updateData },\n { \n new: true, // Return the updated document\n runValidators: true, // Run model validations\n select: 'name description startDate endDate status' // Only return these fields\n }\n );\n\n if (!updatedProject) {\n return res.status(404).json({ error: 'Project not found' });\n }\n\n res.json(updatedProject);\n } catch (error) {\n console.error('Error updating project:', error);\n res.status(500).json({ error: 'Error updating project' });\n }\n}); " + } + ] +} \ No newline at end of file diff --git a/.lh/routes/projects.js.json b/.lh/routes/projects.js.json new file mode 100644 index 0000000..7f2b84b --- /dev/null +++ b/.lh/routes/projects.js.json @@ -0,0 +1,22 @@ +{ + "sourceFile": "routes/projects.js", + "activeCommit": 0, + "commits": [ + { + "activePatchIndex": 1, + "patches": [ + { + "date": 1741898938050, + "content": "Index: \n===================================================================\n--- \n+++ \n" + }, + { + "date": 1741899752532, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -8,13 +8,9 @@\n // Get project with all its data\n router.get('/:id', async (req, res) => {\n try {\n const project = await Project.findById(req.params.id);\n- res.render('project_template', { \n- project: project,\n- title: project.name,\n- user: req.user // if you're using authentication\n- });\n+ res.render('project_template', { project: project });\n } catch (err) {\n console.error(err);\n res.status(500).send('Server Error');\n }\n" + } + ], + "date": 1741898938050, + "name": "Commit-0", + "content": "const express = require('express');\nconst router = express.Router();\nconst Project = require('../models/Project');\nconst Column = require('../models/Column');\nconst Document = require('../models/Document');\nconst { ensureAuth } = require('../config/auth');\n\n// Get project with all its data\nrouter.get('/:id', async (req, res) => {\n try {\n const project = await Project.findById(req.params.id);\n res.render('project_template', { \n project: project,\n title: project.name,\n user: req.user // if you're using authentication\n });\n } catch (err) {\n console.error(err);\n res.status(500).send('Server Error');\n }\n});\n\n// Create new column\nrouter.post('/:projectId/columns', async (req, res) => {\n try {\n const count = await Column.countDocuments({ projectId: req.params.projectId });\n const column = new Column({\n title: req.body.title,\n backgroundColor: req.body.backgroundColor,\n position: count,\n projectId: req.params.projectId\n });\n \n const savedColumn = await column.save();\n await Project.findByIdAndUpdate(req.params.projectId, {\n $push: { columns: savedColumn._id }\n });\n \n res.json(savedColumn);\n } catch (err) {\n res.status(500).json({ error: err.message });\n }\n});\n\n// Update column\nrouter.put('/columns/:id', async (req, res) => {\n try {\n const column = await Column.findByIdAndUpdate(req.params.id, {\n backgroundColor: req.body.backgroundColor,\n position: req.body.position\n }, { new: true });\n res.json(column);\n } catch (err) {\n res.status(500).json({ error: err.message });\n }\n});\n\n// Create document\nrouter.post('/columns/:columnId/documents', async (req, res) => {\n try {\n const count = await Document.countDocuments({ columnId: req.params.columnId });\n const document = new Document({\n title: req.body.title,\n content: req.body.content,\n columnId: req.params.columnId,\n position: count,\n createdBy: req.user._id\n });\n \n const savedDocument = await document.save();\n await Column.findByIdAndUpdate(req.params.columnId, {\n $push: { documents: savedDocument._id }\n });\n \n res.json(savedDocument);\n } catch (err) {\n res.status(500).json({ error: err.message });\n }\n});\n\n// Update document position\nrouter.put('/documents/:id', async (req, res) => {\n try {\n const document = await Document.findByIdAndUpdate(req.params.id, {\n columnId: req.body.columnId,\n position: req.body.position\n }, { new: true });\n res.json(document);\n } catch (err) {\n res.status(500).json({ error: err.message });\n }\n});\n\n// Move document between columns\nrouter.put('/documents/:id/move', async (req, res) => {\n try {\n const { newColumnId, oldColumnId, position } = req.body;\n \n // Update document's column and position\n const document = await Document.findByIdAndUpdate(req.params.id, {\n columnId: newColumnId,\n position: position\n }, { new: true });\n\n // Remove document from old column\n await Column.findByIdAndUpdate(oldColumnId, {\n $pull: { documents: req.params.id }\n });\n\n // Add document to new column\n await Column.findByIdAndUpdate(newColumnId, {\n $push: { documents: req.params.id }\n });\n\n res.json(document);\n } catch (err) {\n console.error('Error moving document:', err);\n res.status(500).json({ error: err.message });\n }\n});\n\n// Update document position within same column\nrouter.put('/documents/:id/position', async (req, res) => {\n try {\n const document = await Document.findByIdAndUpdate(req.params.id, {\n position: req.body.position\n }, { new: true });\n \n res.json(document);\n } catch (err) {\n console.error('Error updating document position:', err);\n res.status(500).json({ error: err.message });\n }\n});\n\nrouter.post('/createProject', ensureAuth, async (req, res) => {\n}); " + } + ] +} \ No newline at end of file diff --git a/.lh/views/index.ejs.json b/.lh/views/index.ejs.json new file mode 100644 index 0000000..1fbdd27 --- /dev/null +++ b/.lh/views/index.ejs.json @@ -0,0 +1,42 @@ +{ + "sourceFile": "views/index.ejs", + "activeCommit": 0, + "commits": [ + { + "activePatchIndex": 6, + "patches": [ + { + "date": 1743095762163, + "content": "Index: \n===================================================================\n--- \n+++ \n" + }, + { + "date": 1743095803587, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -25,14 +25,14 @@\n
\n

The Platform to manage your project

\n

Futures made of virtual insanity, now. Always seem to be governed by this love we have. For useless twisting of our new technology. Oh, now there is no sound. For we all live underground, whoa

\n
\n- \"user\n+ \"user\n Jamiroquai\n
\n
\n
\n- \"screen\n+ \"screen\n
\n \n \n
\n" + }, + { + "date": 1743095880277, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -29,9 +29,9 @@\n \"user\n Jamiroquai\n
\n \n-
\n+
\n \"screen\n
\n \n \n" + }, + { + "date": 1743096169384, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -11,9 +11,9 @@\n \n \n \n \n- Index Page of Project Manager\n+ DevSync | A Project Management Tool\n \n \n \n \n" + }, + { + "date": 1743097171231, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -11,60 +11,47 @@\n \n \n \n \n- DevSync | A Project Management Tool\n+ DevSync - Project Management Tool\n \n \n \n \n \n \n <%- include('partials/header') %>\n- \n-
\n-
\n-

The Platform to manage your project

\n-

Futures made of virtual insanity, now. Always seem to be governed by this love we have. For useless twisting of our new technology. Oh, now there is no sound. For we all live underground, whoa

\n-
\n- \"user\n- Jamiroquai\n+\n+
\n+
\n+
\n+ \"DevSync\n
\n-
\n-
\n- \"screen\n-
\n-
\n- \n-
\n-
\n-

Features

\n-

Massa velit viverra, tristique ac metus donec ligula aliquam dictumst. Vitae lacus congue pulvinar maecenas gravida dui, sagittis dapibus posuere. Consectetur, dis purus praesent ultricies aliquam nec est, id ultrices.

\n-
\n-
\n+

Welcome to DevSync

\n+

Streamline Your Development Workflow

\n+ <% if (!user) { %>\n+ Get Started\n+ <% } else { %>\n+ View Your Projects\n+ <% } %>\n+
\n+\n+
\n
\n- \"feature\"\n-

Enterprise-grade security

\n-

Pretium ac metus ultrices posuere mus imperdiet praesent enim, aenean. Ante suscipit semper, imperdiet nibh nisl vel tortor nullam condimentum.

\n- \n- \n+

Project Management

\n+

Organize and track your development projects with ease using our intuitive kanban board system.

\n
\n
\n- \"feature\"\n-

24/7 global support

\n-

Tempor eu laoreet nullam arcu, faucibus porta massa laoreet molestie. A lectus morbi nulla elementum etiam vitae eu quam ut.

\n- \n- \n+

Team Collaboration

\n+

Work seamlessly with your team members, share updates, and track progress in real-time.

\n
\n
\n- \"feature\"\n-

Easy onboarding

\n-

Sed fusce adipiscing placerat dapibus dapibus hac consectetur nec, vulputate. Odio, ornare dictumst, fringilla dignissim quis nunc eget vitae porttitor.

\n- \n- \n+

Task Tracking

\n+

Keep track of tasks, set priorities, and monitor deadlines to ensure project success.

\n
\n-
\n- \n+ \n+ \n+\n \n
\n

Testimonials from our customer

\n
\n" + }, + { + "date": 1743097233722, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -27,12 +27,12 @@\n \"DevSync\n
\n

Welcome to DevSync

\n

Streamline Your Development Workflow

\n- <% if (!user) { %>\n+ <% if (typeof user !== 'undefined' && user) { %>\n+ View Your Projects\n+ <% } else { %>\n Get Started\n- <% } else { %>\n- View Your Projects\n <% } %>\n
\n \n
\n" + }, + { + "date": 1743097357890, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -23,9 +23,9 @@\n \n
\n
\n
\n- \"DevSync\n+ \"\"\n
\n

Welcome to DevSync

\n

Streamline Your Development Workflow

\n <% if (typeof user !== 'undefined' && user) { %>\n" + } + ], + "date": 1743095762163, + "name": "Commit-0", + "content": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n Index Page of Project Manager\n \n\n \n \n \n \n <%- include('partials/header') %>\n \n
\n
\n

The Platform to manage your project

\n

Futures made of virtual insanity, now. Always seem to be governed by this love we have. For useless twisting of our new technology. Oh, now there is no sound. For we all live underground, whoa

\n
\n \"user\n Jamiroquai\n
\n
\n
\n \"screen\n
\n
\n \n
\n
\n

Features

\n

Massa velit viverra, tristique ac metus donec ligula aliquam dictumst. Vitae lacus congue pulvinar maecenas gravida dui, sagittis dapibus posuere. Consectetur, dis purus praesent ultricies aliquam nec est, id ultrices.

\n
\n
\n
\n \"feature\"\n

Enterprise-grade security

\n

Pretium ac metus ultrices posuere mus imperdiet praesent enim, aenean. Ante suscipit semper, imperdiet nibh nisl vel tortor nullam condimentum.

\n \n \n
\n
\n \"feature\"\n

24/7 global support

\n

Tempor eu laoreet nullam arcu, faucibus porta massa laoreet molestie. A lectus morbi nulla elementum etiam vitae eu quam ut.

\n \n \n
\n
\n \"feature\"\n

Easy onboarding

\n

Sed fusce adipiscing placerat dapibus dapibus hac consectetur nec, vulputate. Odio, ornare dictumst, fringilla dignissim quis nunc eget vitae porttitor.

\n \n \n
\n
\n
\n \n
\n

Testimonials from our customer

\n
\n
\n
\n

\"Somebody once told me, The world is gonna roll me, I ain't the sharpest tool in the shed, She was looking kind of dumb, With her finger and her thumb, In the shape of an \"L\" on her forehead\"

\n Author\n
\n
\n \"\"\n
\n
\n
\n
\n \n
\n

Contact Us

\n

Try our powerful project management software for free

\n
\n \n \n
\n
\n \n <%- include('partials/footer') %>\n \n\n" + } + ] +} \ No newline at end of file diff --git a/.lh/views/partials/header.ejs.json b/.lh/views/partials/header.ejs.json new file mode 100644 index 0000000..1b9b217 --- /dev/null +++ b/.lh/views/partials/header.ejs.json @@ -0,0 +1,38 @@ +{ + "sourceFile": "views/partials/header.ejs", + "activeCommit": 0, + "commits": [ + { + "activePatchIndex": 5, + "patches": [ + { + "date": 1743096225018, + "content": "Index: \n===================================================================\n--- \n+++ \n" + }, + { + "date": 1743096245908, + "content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,7 +1,7 @@\n
\n \n- \n+ \n
+
+ +

Testimonials from our customer

diff --git a/views/partials/header.ejs b/views/partials/header.ejs index 4953541..cceb2ce 100644 --- a/views/partials/header.ejs +++ b/views/partials/header.ejs @@ -1,6 +1,9 @@
- - +
+ + + +
\n \n
\n" - }, - { - "date": 1743095880277, - "content": "Index: \n===================================================================\n--- \n+++ \n@@ -29,9 +29,9 @@\n \"user\n Jamiroquai\n \n \n-
\n+
\n \"screen\n
\n
\n \n" - }, - { - "date": 1743096169384, - "content": "Index: \n===================================================================\n--- \n+++ \n@@ -11,9 +11,9 @@\n \n \n \n \n- Index Page of Project Manager\n+ DevSync | A Project Management Tool\n \n \n \n \n" - }, - { - "date": 1743097171231, - "content": "Index: \n===================================================================\n--- \n+++ \n@@ -11,60 +11,47 @@\n \n \n \n \n- DevSync | A Project Management Tool\n+ DevSync - Project Management Tool\n \n \n \n \n \n \n <%- include('partials/header') %>\n- \n-
\n-
\n-

The Platform to manage your project

\n-

Futures made of virtual insanity, now. Always seem to be governed by this love we have. For useless twisting of our new technology. Oh, now there is no sound. For we all live underground, whoa

\n-
\n- \"user\n- Jamiroquai\n+\n+
\n+
\n+
\n+ \"DevSync\n
\n-
\n-
\n- \"screen\n-
\n-
\n- \n-
\n-
\n-

Features

\n-

Massa velit viverra, tristique ac metus donec ligula aliquam dictumst. Vitae lacus congue pulvinar maecenas gravida dui, sagittis dapibus posuere. Consectetur, dis purus praesent ultricies aliquam nec est, id ultrices.

\n-
\n-
\n+

Welcome to DevSync

\n+

Streamline Your Development Workflow

\n+ <% if (!user) { %>\n+ Get Started\n+ <% } else { %>\n+ View Your Projects\n+ <% } %>\n+
\n+\n+
\n
\n- \"feature\"\n-

Enterprise-grade security

\n-

Pretium ac metus ultrices posuere mus imperdiet praesent enim, aenean. Ante suscipit semper, imperdiet nibh nisl vel tortor nullam condimentum.

\n- \n- \n+

Project Management

\n+

Organize and track your development projects with ease using our intuitive kanban board system.

\n
\n
\n- \"feature\"\n-

24/7 global support

\n-

Tempor eu laoreet nullam arcu, faucibus porta massa laoreet molestie. A lectus morbi nulla elementum etiam vitae eu quam ut.

\n- \n- \n+

Team Collaboration

\n+

Work seamlessly with your team members, share updates, and track progress in real-time.

\n
\n
\n- \"feature\"\n-

Easy onboarding

\n-

Sed fusce adipiscing placerat dapibus dapibus hac consectetur nec, vulputate. Odio, ornare dictumst, fringilla dignissim quis nunc eget vitae porttitor.

\n- \n- \n+

Task Tracking

\n+

Keep track of tasks, set priorities, and monitor deadlines to ensure project success.

\n
\n- \n-
\n+ \n+ \n+\n \n
\n

Testimonials from our customer

\n
\n" - }, - { - "date": 1743097233722, - "content": "Index: \n===================================================================\n--- \n+++ \n@@ -27,12 +27,12 @@\n \"DevSync\n
\n

Welcome to DevSync

\n

Streamline Your Development Workflow

\n- <% if (!user) { %>\n+ <% if (typeof user !== 'undefined' && user) { %>\n+ View Your Projects\n+ <% } else { %>\n Get Started\n- <% } else { %>\n- View Your Projects\n <% } %>\n
\n \n
\n" - }, - { - "date": 1743097357890, - "content": "Index: \n===================================================================\n--- \n+++ \n@@ -23,9 +23,9 @@\n \n
\n
\n
\n- \"DevSync\n+ \"\"\n
\n

Welcome to DevSync

\n

Streamline Your Development Workflow

\n <% if (typeof user !== 'undefined' && user) { %>\n" - } - ], - "date": 1743095762163, - "name": "Commit-0", - "content": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n Index Page of Project Manager\n \n\n \n \n \n \n <%- include('partials/header') %>\n \n
\n
\n

The Platform to manage your project

\n

Futures made of virtual insanity, now. Always seem to be governed by this love we have. For useless twisting of our new technology. Oh, now there is no sound. For we all live underground, whoa

\n
\n \"user\n Jamiroquai\n
\n
\n
\n \"screen\n
\n
\n \n
\n
\n

Features

\n

Massa velit viverra, tristique ac metus donec ligula aliquam dictumst. Vitae lacus congue pulvinar maecenas gravida dui, sagittis dapibus posuere. Consectetur, dis purus praesent ultricies aliquam nec est, id ultrices.

\n
\n
\n
\n \"feature\"\n

Enterprise-grade security

\n

Pretium ac metus ultrices posuere mus imperdiet praesent enim, aenean. Ante suscipit semper, imperdiet nibh nisl vel tortor nullam condimentum.

\n \n \n
\n
\n \"feature\"\n

24/7 global support

\n

Tempor eu laoreet nullam arcu, faucibus porta massa laoreet molestie. A lectus morbi nulla elementum etiam vitae eu quam ut.

\n \n \n
\n
\n \"feature\"\n

Easy onboarding

\n

Sed fusce adipiscing placerat dapibus dapibus hac consectetur nec, vulputate. Odio, ornare dictumst, fringilla dignissim quis nunc eget vitae porttitor.

\n \n \n
\n
\n
\n \n
\n

Testimonials from our customer

\n
\n
\n
\n

\"Somebody once told me, The world is gonna roll me, I ain't the sharpest tool in the shed, She was looking kind of dumb, With her finger and her thumb, In the shape of an \"L\" on her forehead\"

\n Author\n
\n
\n \"\"\n
\n
\n
\n
\n \n
\n

Contact Us

\n

Try our powerful project management software for free

\n
\n \n \n
\n
\n \n <%- include('partials/footer') %>\n \n\n" - } - ] -} \ No newline at end of file diff --git a/.lh/views/partials/header.ejs.json b/.lh/views/partials/header.ejs.json deleted file mode 100644 index 1b9b217..0000000 --- a/.lh/views/partials/header.ejs.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "sourceFile": "views/partials/header.ejs", - "activeCommit": 0, - "commits": [ - { - "activePatchIndex": 5, - "patches": [ - { - "date": 1743096225018, - "content": "Index: \n===================================================================\n--- \n+++ \n" - }, - { - "date": 1743096245908, - "content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,7 +1,7 @@\n
\n \n- \n+ \n
From 62060747d9d22a56d758826935964dfdcbb0e139 Mon Sep 17 00:00:00 2001 From: James Jahner Date: Mon, 14 Apr 2025 00:07:30 -0500 Subject: [PATCH 43/87] added a modal to add users to the the project page --- controllers/projectController.js | 29 +++++- models/Project.js | 1 + routes/projectRoutes.js | 2 +- views/partials/addUserModal.ejs | 165 +++++++++++++++++++++++++++---- views/project_template.ejs | 13 ++- 5 files changed, 184 insertions(+), 26 deletions(-) diff --git a/controllers/projectController.js b/controllers/projectController.js index 1f870e2..5eb4297 100644 --- a/controllers/projectController.js +++ b/controllers/projectController.js @@ -170,13 +170,34 @@ module.exports = { } }, addUser: async (req, res) => { + console.log("req",req) try{ - getUser = await Profile.find({ - googleId: req.user.googleId, - }) - console.log('hi',getUser) + const { userName, userType, projectId} = req.body; + const projectObjectId = new mongoose.Types.ObjectId(projectId); + + console.log("userName, userType",userName, userType) + const getUser = await Profile.findOne( + {displayName: userName} + ) + console.log("getUser",getUser) + if (!getUser) { + return res.status(404).json({ error: "User not found" }); + } + const updateField = userType === "adminId" ? { $addToSet: { adminId: getUser._id } } : { $addToSet: { userId: getUser._id } }; + const updatedProjectUsers = await Project.findOneAndUpdate( + {_id: projectObjectId}, + updateField, + {new: true, upsert: false} + ) + if (!updatedProjectUsers) { + return res.status(404).json({ error: "Project not found" }); + } + console.log ('Updated Project',updatedProjectUsers) + res.status(200).json({ message: `User added as ${userType}`, project: updatedProjectUsers }); + }catch (err) { console.error(` ${err} I Can't connect to find users.`) + res.status(500).json({ error: "Server error. Unable to add user to project." }); } } }; diff --git a/models/Project.js b/models/Project.js index 90fcd0c..50b5849 100644 --- a/models/Project.js +++ b/models/Project.js @@ -38,6 +38,7 @@ const ProjectSchema = new mongoose.Schema({ }], adminId: [{ type: mongoose.Schema.Types.ObjectId, + ref:'Profile', required: true, }], }); diff --git a/routes/projectRoutes.js b/routes/projectRoutes.js index 37230c7..00804ae 100644 --- a/routes/projectRoutes.js +++ b/routes/projectRoutes.js @@ -11,7 +11,7 @@ router.put("/kanban:id", projectController.updateKanban); // router.get("/new", projectController.newProject); router.post("/createProject", projectController.createProject); router.get("/:id", projectController.getProject); -router.get("/addUser", projectController.addUser); +router.put("/addUser", projectController.addUser); router.get("/:id/edit", async (req, res) => { try { const project = await Project.findById(req.params.id); diff --git a/views/partials/addUserModal.ejs b/views/partials/addUserModal.ejs index a49506b..9755194 100644 --- a/views/partials/addUserModal.ejs +++ b/views/partials/addUserModal.ejs @@ -1,27 +1,156 @@ + -
hidden> - + \ No newline at end of file diff --git a/views/project_template.ejs b/views/project_template.ejs index 87a13c1..caa325d 100644 --- a/views/project_template.ejs +++ b/views/project_template.ejs @@ -171,9 +171,10 @@
-
- + +
+ <%- include('partials/chat') %> @@ -183,13 +184,19 @@ <%- include('partials/footer') %> From 8c1b058f70a3fc22666e5f3d910197e3fbca946e Mon Sep 17 00:00:00 2001 From: James Jahner Date: Wed, 16 Apr 2025 02:58:22 -0500 Subject: [PATCH 47/87] setup a reusable modal structure. --- package-lock.json | 11 +++---- package.json | 38 +---------------------- public/css/style.css | 2 +- public/js/modal.js | 28 +++++++++++++++++ routes/profileRoutes.js | 10 +++--- views/partials/addUserModal.ejs | 52 -------------------------------- views/partials/createProject.ejs | 32 ++++++++++++++++++++ views/partials/notifications.ejs | 14 +++++++++ views/profile.ejs | 38 ++++++----------------- 9 files changed, 95 insertions(+), 130 deletions(-) create mode 100644 public/js/modal.js create mode 100644 views/partials/createProject.ejs create mode 100644 views/partials/notifications.ejs diff --git a/package-lock.json b/package-lock.json index f6ec903..47acacf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,9 +26,9 @@ "passport-local": "^1.0.0", "socket.io": "^4.8.1", "socket.io-client": "^4.8.1" - }, "devDependencies": { + "@types/node": "^22.14.1", "cross-env": "^7.0.3", "nodemon": "^3.1.9" } @@ -53,7 +53,6 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -147,9 +146,9 @@ } }, "node_modules/@types/node": { - "version": "22.14.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", - "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -1240,7 +1239,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.2.tgz", "integrity": "sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ==", - "deprecated": "This package is no longer supported.", "license": "ISC", "dependencies": { @@ -1592,7 +1590,6 @@ "node": "20 || >=22" } }, - "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", diff --git a/package.json b/package.json index 52a1016..b441ffa 100644 --- a/package.json +++ b/package.json @@ -1,37 +1 @@ - -{"dependencies": { - "are-we-there-yet": "^4.0.2", - "bcrypt": "^5.1.1", - "gauge": "^5.0.2", - "lru-cache": "^11.1.0", - "npmlog": "^7.0.1", - "passport-local": "^1.0.0", - "connect-flash": "^0.1.1", - "connect-mongo": "^5.1.0", - "dotenv": "^16.4.7", - "dragula": "^3.7.3", - "ejs": "^3.1.10", - "express": "^4.21.2", - "express-session": "^1.18.1", - "method-override": "^3.0.0", - "mongoose": "^8.9.5", - "morgan": "^1.10.0", - "multer": "^1.4.5-lts.1", - "passport": "^0.7.0", - "passport-google-oauth20": "^2.0.0", - "passport-local": "^1.0.0", - "socket.io": "^4.8.1", - "socket.io-client": "^4.8.1" - }, - "devDependencies": { - "cross-env": "^7.0.3", - "nodemon": "^3.1.9" - }, - "main": "server.js", - "scripts": { - "build": "npm install", - "test": "echo \"Error: no test specified\" && exit 1", - "start": "cross-env node server.js", - "dev": "cross-env NODE_ENV=development nodemon -e js,css,ejs server.js" - } -} +{"dependencies":{"are-we-there-yet":"^4.0.2","bcrypt":"^5.1.1","connect-flash":"^0.1.1","connect-mongo":"^5.1.0","dotenv":"^16.4.7","dragula":"^3.7.3","ejs":"^3.1.10","express":"^4.21.2","express-session":"^1.18.1","gauge":"^5.0.2","lru-cache":"^11.1.0","method-override":"^3.0.0","mongoose":"^8.9.5","morgan":"^1.10.0","multer":"^1.4.5-lts.1","npmlog":"^7.0.1","passport":"^0.7.0","passport-google-oauth20":"^2.0.0","passport-local":"^1.0.0","socket.io":"^4.8.1","socket.io-client":"^4.8.1"},"devDependencies":{"@types/node":"^22.14.1","cross-env":"^7.0.3","nodemon":"^3.1.9"},"main":"server.js","scripts":{"build":"npm install","test":"echo \"Error: no test specified\" && exit 1","start":"cross-env node server.js","dev":"cross-env NODE_ENV=development nodemon -e js,css,ejs server.js"}} \ No newline at end of file diff --git a/public/css/style.css b/public/css/style.css index 43a7e3c..2eada4e 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -415,7 +415,7 @@ header { /* Profile Layout */ .profile-layout { display: flex; - justify-content: space-between; + justify-content:left; gap: 2rem; margin: 120px 2rem 0; /* Account for header height and add horizontal padding */ } diff --git a/public/js/modal.js b/public/js/modal.js new file mode 100644 index 0000000..aa18d88 --- /dev/null +++ b/public/js/modal.js @@ -0,0 +1,28 @@ + //Functions to handle general modal behavior +const span = document.getElementsByClassName('close')[0]; +let openedModal = null; +function openModal(event){ + openedModal = event.target; + let toggledElement = event.target.nextElementSibling; + let theForm =toggledElement.firstElementChild; + toggledElement.addEventListener("click", function (event) { + console.log('click') + if (!theForm.contains(event.target)) { + toggledElement.style.display ='none' + } + }) + if( toggledElement.style.display === 'block'){ + toggledElement.style.display = 'none'; + }else{ + toggledElement.style.display = 'block'; + } +} +span.onclick = function () { + modal.style.display = 'none'; +} +//Create project modal specific +const openCPbutton = document.getElementById('openCPModalButton'); +openCPbutton.addEventListener('click', openModal) +//Notification modal specific +const Notificationbutton = document.getElementById('openNotiModalButton'); +openNotibutton.addEventListener('click', openModal) \ No newline at end of file diff --git a/routes/profileRoutes.js b/routes/profileRoutes.js index 732ba53..930776c 100644 --- a/routes/profileRoutes.js +++ b/routes/profileRoutes.js @@ -13,10 +13,12 @@ router.put('/project/:id', ensureAuth, profileController.updateProject); router.delete('/project/:id/delete', ensureAuth, profileController.deleteProject); router.get('/project/:id/data', ensureAuth, profileController.getProjectData); +//routes for profile control +// router.get('/openNotifications', ensureAuth, profileController.getProfile); // Document routes -router.post('/project/:id/document', ensureAuth, profileController.createDocument); -router.put('/document/:id', ensureAuth, profileController.updateDocument); -router.delete('/document/:id', ensureAuth, profileController.deleteDocument); -router.put('/document/:id/order', ensureAuth, profileController.updateDocumentOrder); +// router.post('/project/:id/document', ensureAuth, profileController.createDocument); +// router.put('/document/:id', ensureAuth, profileController.updateDocument); +// router.delete('/document/:id', ensureAuth, profileController.deleteDocument); +// router.put('/document/:id/order', ensureAuth, profileController.updateDocumentOrder); module.exports = router; \ No newline at end of file diff --git a/views/partials/addUserModal.ejs b/views/partials/addUserModal.ejs index 9755194..51abd7d 100644 --- a/views/partials/addUserModal.ejs +++ b/views/partials/addUserModal.ejs @@ -1,4 +1,3 @@ - - + +