From 357189e12e76e3676d709d80d51c315fadd5b1f6 Mon Sep 17 00:00:00 2001 From: Harly Date: Wed, 7 Jan 2026 05:45:05 -0500 Subject: [PATCH] Added some WIP assets for the Local/World/UI views and the cover art. --- package.json | 20 + src/Marketing/PSD/game_cover.psd | 3 + src/Marketing/game_cover.png | 3 + src/UI/gem.psd | 3 + src/UI/item_pickaxe.psd | 3 + src/UI/item_wand_01.psd | 3 + src/UI/moon.psd | 3 + src/UI/resource_wood.aseprite | Bin 0 -> 991 bytes src/UI/terrain_forest.psd | 3 + src/UI/terrain_mountain.psd | 3 + src/WorldView/campfire_unlit.vox | Bin 0 -> 27654 bytes src/WorldView/forest.vox | Bin 0 -> 92246 bytes src/WorldView/graveyard.vox | Bin 0 -> 38324 bytes src/WorldView/nine-tile-track.vox | Bin 0 -> 39034 bytes tools/kanban/kanban.html | 217 +++++++ tools/kanban/src/SimpleKanban.js | 916 ++++++++++++++++++++++++++++++ tools/kanban/src/kanban.ico | Bin 0 -> 173541 bytes tools/kanban/src/styles.css | 162 ++++++ 18 files changed, 1339 insertions(+) create mode 100644 package.json create mode 100644 src/Marketing/PSD/game_cover.psd create mode 100644 src/Marketing/game_cover.png create mode 100644 src/UI/gem.psd create mode 100644 src/UI/item_pickaxe.psd create mode 100644 src/UI/item_wand_01.psd create mode 100644 src/UI/moon.psd create mode 100644 src/UI/resource_wood.aseprite create mode 100644 src/UI/terrain_forest.psd create mode 100644 src/UI/terrain_mountain.psd create mode 100644 src/WorldView/campfire_unlit.vox create mode 100644 src/WorldView/forest.vox create mode 100644 src/WorldView/graveyard.vox create mode 100644 src/WorldView/nine-tile-track.vox create mode 100644 tools/kanban/kanban.html create mode 100644 tools/kanban/src/SimpleKanban.js create mode 100644 tools/kanban/src/kanban.ico create mode 100644 tools/kanban/src/styles.css diff --git a/package.json b/package.json new file mode 100644 index 0000000..4b331ee --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "assets-vor", + "version": "1.0.0", + "description": "A repo used for tracking and containg the assets for the game Visions Of Reality", + "repository": { + "type": "git", + "url": "prospera:assets-vor.git" + }, + "license": "ISC", + "author": "", + "type": "commonjs", + "main": "index.js", + "scripts": { + "kanban": "serve tools/kanban/ -p 5173" + }, + "keywords": [], + "devDependencies": { + "serve": "^14.2.5" + } +} diff --git a/src/Marketing/PSD/game_cover.psd b/src/Marketing/PSD/game_cover.psd new file mode 100644 index 0000000..505e917 --- /dev/null +++ b/src/Marketing/PSD/game_cover.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:743124bc57aa865b85a8eef158b37bf6be3cb3b618542539ea074fa37d2727ca +size 1889040 diff --git a/src/Marketing/game_cover.png b/src/Marketing/game_cover.png new file mode 100644 index 0000000..399d897 --- /dev/null +++ b/src/Marketing/game_cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d45edae4c905c1a02d630e93f860a7f7aabb68cfcb1ad493b646a64b0ea5e87d +size 464392 diff --git a/src/UI/gem.psd b/src/UI/gem.psd new file mode 100644 index 0000000..8a170ca --- /dev/null +++ b/src/UI/gem.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6920b37ed4a03c5d529de815c74383b9190acb7367f433f25766e2006327ebc +size 4396 diff --git a/src/UI/item_pickaxe.psd b/src/UI/item_pickaxe.psd new file mode 100644 index 0000000..dcf095f --- /dev/null +++ b/src/UI/item_pickaxe.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84d580342c8cc0d72e470dadf43e2d4d352dcbd3f49c8832a71899ceeb69add3 +size 4176 diff --git a/src/UI/item_wand_01.psd b/src/UI/item_wand_01.psd new file mode 100644 index 0000000..8b5b43d --- /dev/null +++ b/src/UI/item_wand_01.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bb20f9dfdcbb5f95899f10ab456d0144022b2dcbe7c5a7a13772c2c6315a282 +size 5048 diff --git a/src/UI/moon.psd b/src/UI/moon.psd new file mode 100644 index 0000000..8c9cfbf --- /dev/null +++ b/src/UI/moon.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3c83ffcc23dbaa86220f93b27a33a8c4b6f24977ce37d9739d4d18dc12b9286 +size 4724 diff --git a/src/UI/resource_wood.aseprite b/src/UI/resource_wood.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..7c91070380e35d743cde73551f56dbe4d8589c24 GIT binary patch literal 991 zcmcc5%)szqDI`^fRGj-9%%oskDPE@#ekNuD}b#;vhEg; zEvcXY6_H1hVPM$jrT?FS;d+@fkbHGz6_9+gtO!W%$PWOL#delJ(oWqFNG?({29i&# zU4Z2GG9@7SZ=DHb&?0B>w{e z1H*yScYtK~>@7etDzgJfTDhbFNi}Vd`4S?kK=MBWh@D}P10=TwfYf{|tpbuSwoe0+ zhgviLgF;n80pTHeAd^J_7$|T6RLH>2;FDOHTBKlzU)mVIw22fjTv-($CjV!G*#L_A ziaB?$81fx5;9AFn;Wak^n!`pVB~=}V1V%65nQsU2Sb zC+vsso61H1J9%E*EZ_bwc~6^Uf&a1%?bnw_Upro&YP%?DfBlx3{pYV%hwh*J_IyqB z%ztHjuQ&hHVLrEcj?Q8G-xp)H`2WPd&2)e z(GXz#F#BGc+wAZ)d!JwGlHN1-?)I?M+q<_Ehivn`y8iB;=Zj?-7*3Qjl!0x41UkA6 z$q5pyixWfwq&+%T{A*8i%38_mQ08^(#$SKCcihLmlrf*M+bXe~v7Grt+yv=_cM=@t r4Tl(0%sZBC|Es{@-MnFg!jgGm2?~GgxZDnEfQ{;D3N+v{U}OLQd*MML literal 0 HcmV?d00001 diff --git a/src/UI/terrain_forest.psd b/src/UI/terrain_forest.psd new file mode 100644 index 0000000..6498dd4 --- /dev/null +++ b/src/UI/terrain_forest.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df28dc2aa3b48c40ed8ac8bd556763c97c8fbc6e690fd2806c9cbf098f01ef34 +size 9151 diff --git a/src/UI/terrain_mountain.psd b/src/UI/terrain_mountain.psd new file mode 100644 index 0000000..6b745b0 --- /dev/null +++ b/src/UI/terrain_mountain.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0dc980378268a66ef1c0f0ccff728984b6066d29bc3652311821d4fa94107771 +size 7488 diff --git a/src/WorldView/campfire_unlit.vox b/src/WorldView/campfire_unlit.vox new file mode 100644 index 0000000000000000000000000000000000000000..6a176fc4e91ce2d168e507853080535c6b14fb51 GIT binary patch literal 27654 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 literal 0 HcmV?d00001 diff --git a/src/WorldView/graveyard.vox b/src/WorldView/graveyard.vox new file mode 100644 index 0000000000000000000000000000000000000000..bf86ce5c75405632bed0b0f5561709752357c317 GIT binary patch literal 38324 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 Zd;|OGqxElb;^?cD=#>zSDWBTc{{lnZQmOy| literal 0 HcmV?d00001 diff --git a/tools/kanban/kanban.html b/tools/kanban/kanban.html new file mode 100644 index 0000000..a01432a --- /dev/null +++ b/tools/kanban/kanban.html @@ -0,0 +1,217 @@ + + + + + + Simple Kanban Board + + + + + + + + +

+ +
+ +
+
+

Kanban Board

+

Drag and drop tasks to organize your workflow.

+
+ +
+
+ + +
+
+ + +
+
+ + +
+ + +
+
+

To Do

+ +
+
+ +
+
+ + +
+
+

In Progress

+ +
+
+ +
+
+ + +
+
+

Completed

+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + diff --git a/tools/kanban/src/SimpleKanban.js b/tools/kanban/src/SimpleKanban.js new file mode 100644 index 0000000..db5df30 --- /dev/null +++ b/tools/kanban/src/SimpleKanban.js @@ -0,0 +1,916 @@ +// Tag delete confirmation modal logic + let tagToDelete = null; + let tagDeleteModal = document.getElementById('tag-delete-modal'); + let tagDeleteNameSpan = null; + let tagDeleteConfirmBtn = null; + let tagDeleteCancelBtn = null; + function ensureTagDeleteModal() { + tagDeleteModal = document.getElementById('tag-delete-modal'); + if (!tagDeleteModal) { + tagDeleteModal = document.createElement('div'); + tagDeleteModal.id = 'tag-delete-modal'; + tagDeleteModal.className = 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center hidden'; + tagDeleteModal.innerHTML = ` +
+

Delete Tag

+

Are you sure you want to delete the tag ? This will remove the tag from all tasks.

+
+ + +
+
+ `; + document.body.appendChild(tagDeleteModal); + } + tagDeleteNameSpan = tagDeleteModal.querySelector('#tag-delete-name'); + tagDeleteConfirmBtn = tagDeleteModal.querySelector('#confirm-tag-delete'); + tagDeleteCancelBtn = tagDeleteModal.querySelector('#cancel-tag-delete'); + } + ensureTagDeleteModal(); + function showTagDeleteModal(tagName) { + tagToDelete = tagName; + ensureTagDeleteModal(); + tagDeleteNameSpan.textContent = tagName; + tagDeleteModal.classList.remove('hidden'); + tagDeleteCancelBtn.onclick = hideTagDeleteModal; + tagDeleteConfirmBtn.onclick = function() { + if (tagToDelete) { + // Remove tag from global tags + delete tags[tagToDelete]; + // Remove tag from all tasks + document.querySelectorAll('.task').forEach(task => { + if (task.dataset.tagName === tagToDelete) { + delete task.dataset.tagName; + delete task.dataset.tagColor; + const tagCircle = task.querySelector('.tag-circle'); + if (tagCircle) { + tagCircle.style.backgroundColor = 'transparent'; + tagCircle.classList.add('border-2', 'border-gray-400'); + } + const tooltipOverlay = task.querySelector('.task-tooltip-overlay'); + if (tooltipOverlay) { + tooltipOverlay.textContent = ''; + } + } + }); + openTagModal(); + hideTagDeleteModal(); + } + }; + } + function hideTagDeleteModal() { + tagDeleteModal.classList.add('hidden'); + tagToDelete = null; + } +document.addEventListener('DOMContentLoaded', () => { + let draggedTask = null; + let targetColumn = null; + let taskToDelete = null; + let currentTaskForTagging = null; + + // Global tags object + let tags = { + // Example: "UI/UX": "#3b82f6", + }; + + // Tag delete confirmation modal logic (move inside DOMContentLoaded for correct tags reference) + let tagToDelete = null; + let tagDeleteModal = document.getElementById('tag-delete-modal'); + let tagDeleteNameSpan = null; + let tagDeleteConfirmBtn = null; + let tagDeleteCancelBtn = null; + function ensureTagDeleteModal() { + tagDeleteModal = document.getElementById('tag-delete-modal'); + if (!tagDeleteModal) { + tagDeleteModal = document.createElement('div'); + tagDeleteModal.id = 'tag-delete-modal'; + tagDeleteModal.className = 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center hidden'; + tagDeleteModal.innerHTML = ` +
+

Delete Tag

+

Are you sure you want to delete the tag ? This will remove the tag from all tasks.

+
+ + +
+
+ `; + document.body.appendChild(tagDeleteModal); + } + tagDeleteNameSpan = tagDeleteModal.querySelector('#tag-delete-name'); + tagDeleteConfirmBtn = tagDeleteModal.querySelector('#confirm-tag-delete'); + tagDeleteCancelBtn = tagDeleteModal.querySelector('#cancel-tag-delete'); + } + ensureTagDeleteModal(); + function showTagDeleteModal(tagName) { + tagToDelete = tagName; + ensureTagDeleteModal(); + tagDeleteNameSpan.textContent = tagName; + tagDeleteModal.classList.remove('hidden'); + tagDeleteCancelBtn.onclick = hideTagDeleteModal; + tagDeleteConfirmBtn.onclick = function() { + if (tagToDelete) { + // Remove tag from global tags + delete tags[tagToDelete]; + // Remove tag from all tasks + document.querySelectorAll('.task').forEach(task => { + if (task.dataset.tagName === tagToDelete) { + delete task.dataset.tagName; + delete task.dataset.tagColor; + const tagCircle = task.querySelector('.tag-circle'); + if (tagCircle) { + tagCircle.style.backgroundColor = 'transparent'; + tagCircle.classList.add('border-2', 'border-gray-400'); + } + const tooltipOverlay = task.querySelector('.task-tooltip-overlay'); + if (tooltipOverlay) { + tooltipOverlay.textContent = ''; + } + } + }); + openTagModal(); + hideTagDeleteModal(); + } + }; + } + function hideTagDeleteModal() { + tagDeleteModal.classList.add('hidden'); + tagToDelete = null; + } + + const tagModal = document.getElementById('tag-modal'); + const cancelTagBtn = document.getElementById('cancel-tag'); + const saveTagBtn = document.getElementById('save-tag'); + const removeTagBtn = document.getElementById('remove-tag'); + const newTagNameInput = document.getElementById('new-tag-name'); + const newTagColorInput = document.getElementById('new-tag-color'); + const tagsListContainer = document.getElementById('tags-list'); + + // Function to initialize event listeners for a task + function initializeTaskEvents(task) { + task.addEventListener('dragstart', () => { + draggedTask = task; + setTimeout(() => { + task.classList.add('dragging'); + }, 0); + }); + + task.addEventListener('dragend', () => { + task.classList.remove('dragging'); + draggedTask = null; + }); + + // Double-click to open details modal + task.addEventListener('dblclick', (e) => { + e.stopPropagation(); + openTaskDetailsModal(task); + }); + + const deleteBtn = task.querySelector('.delete-task-btn'); + if (deleteBtn) { + deleteBtn.addEventListener('click', (e) => { + e.stopPropagation(); + taskToDelete = task; + deleteModal.classList.remove('hidden'); + }); + } + + const tagCircle = task.querySelector('.tag-circle'); + const tooltipOverlay = task.querySelector('.task-tooltip-overlay'); + + if (tagCircle && tooltipOverlay) { + tagCircle.addEventListener('mouseenter', () => { + if (task.dataset.tagName) { + tooltipOverlay.classList.remove('hidden'); + } + }); + tagCircle.addEventListener('mouseleave', () => { + tooltipOverlay.classList.add('hidden'); + }); + + tagCircle.addEventListener('click', (e) => { + e.stopPropagation(); + currentTaskForTagging = task; + openTagModal(); + }); + } + } + + // Function to open and populate the tag modal + function openTagModal() { + tagsListContainer.innerHTML = ''; + Object.entries(tags).forEach(([name, color]) => { + const tagChip = document.createElement('div'); + tagChip.className = 'px-3 py-1 rounded-full text-sm font-medium cursor-pointer flex items-center gap-2'; + tagChip.style.backgroundColor = color; + tagChip.style.color = getContrastYIQ(color); + tagChip.textContent = name; + tagChip.dataset.tagName = name; + tagChip.dataset.tagColor = color; + tagChip.addEventListener('click', () => { + applyTagToTask(name, color); + closeTagModal(); + }); + // Add delete button for tag + const deleteBtn = document.createElement('button'); + deleteBtn.className = 'ml-2 text-xs text-white bg-red-600 rounded-full w-5 h-5 flex items-center justify-center hover:bg-red-800'; + deleteBtn.innerHTML = '×'; + deleteBtn.title = 'Delete Tag'; + deleteBtn.addEventListener('click', (e) => { + e.stopPropagation(); + showTagDeleteModal(name); + }); + tagChip.appendChild(deleteBtn); + tagsListContainer.appendChild(tagChip); + }); + newTagNameInput.value = ''; + tagModal.classList.remove('hidden'); + } + + function closeTagModal() { + tagModal.classList.add('hidden'); + currentTaskForTagging = null; + } + + function applyTagToTask(name, color) { + if (!currentTaskForTagging) return; + const tagCircle = currentTaskForTagging.querySelector('.tag-circle'); + currentTaskForTagging.dataset.tagName = name; + currentTaskForTagging.dataset.tagColor = color; + tagCircle.style.backgroundColor = color; + tagCircle.classList.remove('border-2', 'border-gray-400'); + // Add or update tooltip + const tooltipOverlay = currentTaskForTagging.querySelector('.task-tooltip-overlay'); + if (tooltipOverlay) { + tooltipOverlay.textContent = name; + } + } + + function removeTagFromTask() { + if (!currentTaskForTagging) return; + const tagCircle = currentTaskForTagging.querySelector('.tag-circle'); + delete currentTaskForTagging.dataset.tagName; + delete currentTaskForTagging.dataset.tagColor; + tagCircle.style.backgroundColor = 'transparent'; + tagCircle.classList.add('border-2', 'border-gray-400'); + const tooltipOverlay = currentTaskForTagging.querySelector('.task-tooltip-overlay'); + if (tooltipOverlay) { + tooltipOverlay.textContent = ''; + } + } + + saveTagBtn.addEventListener('click', () => { + const newName = newTagNameInput.value.trim(); + const newColor = newTagColorInput.value; + if (!newName) { + newTagNameInput.focus(); + return; // Do not close modal if name is empty + } + // Add to global tags if it's new + if (!tags[newName]) { + tags[newName] = newColor; + } + applyTagToTask(newName, newColor); + closeTagModal(); + }); + + removeTagBtn.addEventListener('click', () => { + removeTagFromTask(); + closeTagModal(); + }); + + cancelTagBtn.addEventListener('click', closeTagModal); + + // Linkify function for emails and URLs + function linkifyText(text) { + if (!text) return ''; + // Linkify emails + text = text.replace(/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/g, '$1'); + // Linkify URLs + text = text.replace(/(https?:\/\/[^\s]+)/g, '$1'); + text = text.replace(/(www\.[^\s]+)/g, '$1'); + return text; + } + + // Task Details Modal logic + const taskDetailsModal = document.getElementById('task-details-modal'); + const closeTaskDetailsBtn = document.getElementById('close-task-details'); + const saveTaskChangesBtn = document.getElementById('save-task-changes'); + const editFieldBtns = document.querySelectorAll('.edit-field-btn'); + let currentEditingTask = null; + + function openTaskDetailsModal(task) { + currentEditingTask = task; + // Populate display fields with linkified data + document.getElementById('display-description').innerHTML = linkifyText(task.querySelector('p').textContent); + document.getElementById('display-stakeholders').innerHTML = linkifyText(task.dataset.stakeholders || ''); + document.getElementById('display-notes').innerHTML = linkifyText(task.dataset.notes || ''); + // Populate edit fields with current values + document.getElementById('edit-description').value = task.querySelector('p').textContent; + document.getElementById('edit-due-date').value = task.dataset.dueDate || ''; + document.getElementById('edit-started-date').value = task.dataset.startedDate || ''; + document.getElementById('edit-stakeholders').value = task.dataset.stakeholders || ''; + document.getElementById('edit-notes').value = task.dataset.notes || ''; + // Hide all edit fields initially (except dates which are always visible) + document.querySelectorAll('[id^="edit-"]:not(#edit-due-date):not(#edit-started-date)').forEach(el => el.classList.add('hidden')); + document.querySelectorAll('[id^="display-"]').forEach(el => el.classList.remove('hidden')); + taskDetailsModal.classList.remove('hidden'); + } + + function closeTaskDetailsModal() { + taskDetailsModal.classList.add('hidden'); + currentEditingTask = null; + } + + function toggleEditMode(field) { + const displayEl = document.getElementById(`display-${field}`); + const editEl = document.getElementById(`edit-${field}`); + if (editEl.classList.contains('hidden')) { + // Switch to edit mode + editEl.classList.remove('hidden'); + displayEl.classList.add('hidden'); + if (field === 'description') { + editEl.value = currentEditingTask.querySelector('p').textContent; + } else if (field === 'stakeholders') { + editEl.value = currentEditingTask.dataset.stakeholders || ''; + } else if (field === 'notes') { + editEl.value = currentEditingTask.dataset.notes || ''; + } + editEl.focus(); + } else { + // Switch back to display mode + editEl.classList.add('hidden'); + displayEl.classList.remove('hidden'); + // Update display with the edited value + if (field === 'description') { + displayEl.innerHTML = linkifyText(editEl.value); + } else if (field === 'stakeholders') { + displayEl.innerHTML = linkifyText(editEl.value); + } else if (field === 'notes') { + displayEl.innerHTML = linkifyText(editEl.value); + } + } + } + + function saveTaskChanges() { + if (!currentEditingTask) return; + // Update task data from edit fields + const newDescription = document.getElementById('edit-description').value.trim(); + const newDueDate = document.getElementById('edit-due-date').value; + const newStartedDate = document.getElementById('edit-started-date').value; + const newStakeholders = document.getElementById('edit-stakeholders').value.trim(); + const newNotes = document.getElementById('edit-notes').value.trim(); + + // Update task element + currentEditingTask.querySelector('p').innerHTML = linkifyText(newDescription); + currentEditingTask.dataset.dueDate = newDueDate; + currentEditingTask.dataset.startedDate = newStartedDate; + currentEditingTask.dataset.stakeholders = newStakeholders; + currentEditingTask.dataset.notes = newNotes; + + // Update display spans on task card + const dueDateSpan = currentEditingTask.querySelector('.due-date-display'); + if (dueDateSpan) { + if (newDueDate) { + const date = new Date(newDueDate); + dueDateSpan.textContent = `Due: ${date.toLocaleDateString(undefined, { timeZone: 'UTC' })}`; + dueDateSpan.classList.remove('hidden'); + } else { + dueDateSpan.classList.add('hidden'); + } + } + + const startedDateSpan = currentEditingTask.querySelector('.started-date-display'); + if (startedDateSpan) { + if (newStartedDate) { + const date = new Date(newStartedDate); + startedDateSpan.textContent = `Started: ${date.toLocaleDateString(undefined, { timeZone: 'UTC' })}`; + startedDateSpan.classList.remove('hidden'); + } else { + startedDateSpan.classList.add('hidden'); + } + } + + saveBoardState(); + closeTaskDetailsModal(); + } + + if (closeTaskDetailsBtn) { + closeTaskDetailsBtn.addEventListener('click', closeTaskDetailsModal); + } + if (saveTaskChangesBtn) { + saveTaskChangesBtn.addEventListener('click', saveTaskChanges); + } + editFieldBtns.forEach(btn => { + btn.addEventListener('click', (e) => { + const field = e.target.dataset.field; + toggleEditMode(field); + }); + }); + + // Close modal on Escape key + window.addEventListener('keydown', (e) => { + if (e.key === 'Escape' && !taskDetailsModal.classList.contains('hidden')) { + closeTaskDetailsModal(); + } + }); + + // Function to create a new task element + function createNewTask(text, dueDate, stakeholders, notes) { + const task = document.createElement('div'); + task.className = 'task p-4 bg-gray-50 rounded-lg shadow cursor-grab active:cursor-grabbing relative'; + task.draggable = true; + const p = document.createElement('p'); + p.textContent = text; + task.appendChild(p); + // Due Date + const dueDateSpan = document.createElement('span'); + dueDateSpan.className = 'due-date-display text-xs text-gray-500 mt-2 block'; + if (dueDate) { + task.dataset.dueDate = dueDate; // Store date for sorting + const dateParts = dueDate.split('-'); + const date = new Date(Date.UTC(dateParts[0], dateParts[1] - 1, dateParts[2])); + dueDateSpan.textContent = `Due: ${date.toLocaleDateString(undefined, { timeZone: 'UTC' })}`; + } else { + dueDateSpan.classList.add('hidden'); + dueDateSpan.textContent = 'Due: --'; + } + task.appendChild(dueDateSpan); + // Store stakeholders and notes in dataset + if (stakeholders) task.dataset.stakeholders = stakeholders; + if (notes) task.dataset.notes = notes; + // Started Date + const startedDateSpan = document.createElement('span'); + startedDateSpan.className = 'started-date-display text-xs text-gray-500 mt-1 block hidden'; + startedDateSpan.textContent = 'Started: --'; + task.appendChild(startedDateSpan); + // Completed Date + const completedDateSpan = document.createElement('span'); + completedDateSpan.className = 'completed-date-display text-xs text-gray-500 mt-1 block hidden'; + completedDateSpan.textContent = 'Completed: --'; + task.appendChild(completedDateSpan); + const deleteBtn = document.createElement('button'); + deleteBtn.className = 'delete-task-btn absolute top-2 right-2 text-red-500 hover:text-red-700 hidden'; + deleteBtn.innerHTML = ``; + task.appendChild(deleteBtn); + const tagCircle = document.createElement('div'); + tagCircle.className = 'tag-circle absolute bottom-2 right-2 w-4 h-4 rounded-full border-2 border-gray-400 cursor-pointer'; + task.appendChild(tagCircle); + const tooltipOverlay = document.createElement('div'); + tooltipOverlay.className = 'task-tooltip-overlay absolute inset-0 bg-black bg-opacity-60 rounded-lg flex items-center justify-center text-white font-bold hidden pointer-events-none'; + task.appendChild(tooltipOverlay); + initializeTaskEvents(task); + return task; + } + + // Initialize existing tasks + const tasks = document.querySelectorAll('.task'); + tasks.forEach(initializeTaskEvents); + // Event listeners for drop zones (task containers) + const taskContainers = document.querySelectorAll('.tasks'); + const todayDisplayString = new Date().toLocaleDateString(undefined, { timeZone: 'UTC' }); + const todayDataString = new Date().toISOString().split('T')[0]; + taskContainers.forEach(container => { + container.addEventListener('dragover', e => { + e.preventDefault(); + const afterElement = getDragAfterElement(container, e.clientY); + const currentlyDragged = document.querySelector('.dragging'); + if (afterElement == null) { + container.appendChild(currentlyDragged); + } else { + container.insertBefore(currentlyDragged, afterElement); + } + }); + container.addEventListener('drop', e => { + e.preventDefault(); + if (!draggedTask) return; + const columnId = container.dataset.columnId; + const startedDateDisplay = draggedTask.querySelector('.started-date-display'); + const completedDateDisplay = draggedTask.querySelector('.completed-date-display'); + const deleteBtn = draggedTask.querySelector('.delete-task-btn'); + switch (columnId) { + case 'inprogress': + // Set started date only if it's not already set + if (!draggedTask.dataset.startedDate) { + draggedTask.dataset.startedDate = todayDataString; + if(startedDateDisplay) { + startedDateDisplay.textContent = `Started: ${todayDisplayString}`; + startedDateDisplay.classList.remove('hidden'); + } + } + // Clear completed date + draggedTask.removeAttribute('data-completed-date'); + if(completedDateDisplay) { + completedDateDisplay.textContent = 'Completed: --'; + completedDateDisplay.classList.add('hidden'); + } + if (deleteBtn) deleteBtn.classList.add('hidden'); + break; + case 'completed': + // Set started date if it's not already set + if (!draggedTask.dataset.startedDate) { + draggedTask.dataset.startedDate = todayDataString; + if(startedDateDisplay) { + startedDateDisplay.textContent = `Started: ${todayDisplayString}`; + startedDateDisplay.classList.remove('hidden'); + } + } + // Set completed date + draggedTask.dataset.completedDate = todayDataString; + if(completedDateDisplay) { + completedDateDisplay.textContent = `Completed: ${todayDisplayString}`; + completedDateDisplay.classList.remove('hidden'); + } + if (deleteBtn) deleteBtn.classList.remove('hidden'); + break; + case 'todo': + // Clear both dates + draggedTask.removeAttribute('data-started-date'); + draggedTask.removeAttribute('data-completed-date'); + if(startedDateDisplay) { + startedDateDisplay.textContent = 'Started: --'; + startedDateDisplay.classList.add('hidden'); + } + if(completedDateDisplay) { + completedDateDisplay.textContent = 'Completed: --'; + completedDateDisplay.classList.add('hidden'); + } + if (deleteBtn) deleteBtn.classList.add('hidden'); + break; + } + draggedTask.dataset.columnId = columnId; // Persist new column for this task + saveBoardState(); // Persist after drop + }); + }); + + // Helper function to determine where to drop the element + function getDragAfterElement(container, y) { + const draggableElements = [...container.querySelectorAll('.task:not(.dragging)')]; + return draggableElements.reduce((closest, child) => { + const box = child.getBoundingClientRect(); + const offset = y - box.top - box.height / 2; + if (offset < 0 && offset > closest.offset) { + return { offset: offset, element: child }; + } else { + return closest; + } + }, { offset: Number.NEGATIVE_INFINITY }).element; + } + // Modal functionality + const modal = document.getElementById('task-modal'); + const addTaskButtons = document.querySelectorAll('.add-task-btn'); + const cancelTaskButton = document.getElementById('cancel-task'); + const saveTaskButton = document.getElementById('save-task'); + const taskInput = document.getElementById('task-input'); + const dueDateInput = document.getElementById('task-due-date'); + const stakeholdersInput = document.getElementById('stakeholders-input'); + const notesInput = document.getElementById('notes-input'); + const deleteModal = document.getElementById('delete-modal'); + const cancelDeleteBtn = document.getElementById('cancel-delete'); + const confirmDeleteBtn = document.getElementById('confirm-delete'); + addTaskButtons.forEach(button => { + button.addEventListener('click', () => { + targetColumn = document.querySelector(`#${button.dataset.column} .tasks`); + modal.classList.remove('hidden'); + taskInput.focus(); + }); + }); + function closeModal() { + modal.classList.add('hidden'); + taskInput.value = ''; + dueDateInput.value = ''; + if (stakeholdersInput) stakeholdersInput.value = ''; + if (notesInput) notesInput.value = ''; + targetColumn = null; + } + cancelTaskButton.addEventListener('click', closeModal); + saveTaskButton.addEventListener('click', () => { + const taskText = taskInput.value.trim(); + const dueDate = dueDateInput.value; + const stakeholders = stakeholdersInput ? stakeholdersInput.value.trim() : ''; + const notes = notesInput ? notesInput.value.trim() : ''; + if (taskText && targetColumn) { + const newTask = createNewTask(taskText, dueDate, stakeholders, notes); + targetColumn.appendChild(newTask); + saveBoardState(); // Persist new task + closeModal(); + } + }); + // Close modal on Escape key + window.addEventListener('keydown', (e) => { + if (e.key === 'Escape') { + if (!modal.classList.contains('hidden')) { + closeModal(); + } + if (!tagModal.classList.contains('hidden')) { + closeTagModal(); + } + if (!deleteModal.classList.contains('hidden')) { + deleteModal.classList.add('hidden'); + taskToDelete = null; + } + } + }); + // Delete modal functionality + cancelDeleteBtn.addEventListener('click', () => { + deleteModal.classList.add('hidden'); + taskToDelete = null; + }); + confirmDeleteBtn.addEventListener('click', () => { + if (taskToDelete) { + taskToDelete.remove(); + saveBoardState(); // Ensure localStorage is updated after deletion + } + deleteModal.classList.add('hidden'); + taskToDelete = null; + }); + // Sort functionality + const sortButtons = document.querySelectorAll('.sort-btn'); + sortButtons.forEach(button => { + button.addEventListener('click', () => { + const columnId = button.dataset.columnId; + const column = document.getElementById(columnId); + const taskContainer = column.querySelector('.tasks'); + const tasks = Array.from(taskContainer.querySelectorAll('.task')); + tasks.sort((a, b) => { + const dateA = a.dataset.dueDate ? new Date(a.dataset.dueDate) : null; + const dateB = b.dataset.dueDate ? new Date(b.dataset.dueDate) : null; + if (dateA && dateB) { + return dateA - dateB; // Sort by date ascending + } + if (dateA) { + return -1; // A has a date, B doesn't, so A comes first + } + if (dateB) { + return 1; // B has a date, A doesn't, so B comes first + } + return 0; // Both have no date, keep original order + }); + // Re-append tasks in sorted order + tasks.forEach(task => taskContainer.appendChild(task)); + }); + }); + // Helper to determine text color based on background + function getContrastYIQ(hexcolor){ + hexcolor = hexcolor.replace("#", ""); + var r = parseInt(hexcolor.substr(0,2),16); + var g = parseInt(hexcolor.substr(2,2),16); + var b = parseInt(hexcolor.substr(4,2),16); + var yiq = ((r*299)+(g*587)+(b*114))/1000; + return (yiq >= 128) ? 'black' : 'white'; + } + + // Tag filter dropdown logic + const tagFilter = document.getElementById('tag-filter'); + const tasksContainers = document.querySelectorAll('.tasks'); + function getAllTags() { + const tags = new Set(); + document.querySelectorAll('.task').forEach(task => { + if (task.dataset.tagName) { + tags.add(task.dataset.tagName); + } + }); + return Array.from(tags); + } + function updateTagOptions() { + const select = tagFilter; + const currentValue = select.value; // Save current selection + // Remove all except All and Unassigned + select.querySelectorAll('option:not([value="all"]):not([value="unassigned"])').forEach(opt => opt.remove()); + getAllTags().forEach(tag => { + if (!select.querySelector('option[value="' + tag + '"]')) { + const opt = document.createElement('option'); + opt.value = tag; + opt.textContent = tag; + select.appendChild(opt); + } + }); + select.value = currentValue; // Restore selection + } + function filterTasks() { + const value = tagFilter.value; + document.querySelectorAll('.task').forEach(task => { + if (value === 'all') { + task.style.display = ''; + } else if (value === 'unassigned') { + if (!task.dataset.tagName) { + task.style.display = ''; + } else { + task.style.display = 'none'; + } + } else { + if (task.dataset.tagName === value) { + task.style.display = ''; + } else { + task.style.display = 'none'; + } + } + }); + } + tagFilter.addEventListener('change', filterTasks); + // Update tag options on DOM changes + setInterval(updateTagOptions, 1000); + + // Save board locally and remotely + function saveBoardState() { + const save_json = convertBoardToJSON(); + saveBoardToLocalStorage(save_json); + saveBoardToRemoteStorage(save_json); + } + + // Convert current board state to JSON + function convertBoardToJSON() { + const boardData = { + tasks: [], + tags: {...tags} + }; + document.querySelectorAll('.tasks').forEach(container => { + const columnId = container.dataset.columnId; + Array.from(container.querySelectorAll('.task')).forEach(task => { + boardData.tasks.push({ + text: task.querySelector('p').textContent, + dueDate: task.dataset.dueDate || '', + startedDate: task.dataset.startedDate || '', + completedDate: task.dataset.completedDate || '', + tagName: task.dataset.tagName || '', + tagColor: task.dataset.tagColor || '', + stakeholders: task.dataset.stakeholders || '', + notes: task.dataset.notes || '', + column: columnId + }); + }); + }); + return JSON.stringify(boardData); + } + + // Local Storage Persistence + function saveBoardToLocalStorage(save_json) { + localStorage.setItem('kanbanBoard', save_json); + } + + // RemoteStorage Persistence + function saveBoardToRemoteStorage(save_json) { + // Placeholder for Post to RESTFUL endpoint, etc... + console.log('Saving board to remote storage not yet implemented:', save_json); + } + + // Load Board From Remote Storage + function loadBoardFromRemoteStorage(input_json) { + convertJSONToBoard(input_json); + } + + // Load board state from local storage + function loadBoardFromLocalStorage() { + const data = localStorage.getItem('kanbanBoard'); + if (!data) return; + convertJSONToBoard(data); + } + + // Convert JSON back to board state + function convertJSONToBoard(json) { + let boardData; + try { + boardData = JSON.parse(json); + } catch (e) { + console.error('Failed to parse kanbanBoard JSON:', e); + return; + } + // Clear all columns + document.querySelectorAll('.tasks').forEach(container => container.innerHTML = ''); + // Restore tags + Object.keys(tags).forEach(k => delete tags[k]); + Object.assign(tags, boardData.tags); + // Restore tasks + boardData.tasks.forEach(taskData => { + const task = createNewTask(taskData.text, taskData.dueDate, taskData.stakeholders, taskData.notes); + if (taskData.startedDate) task.dataset.startedDate = taskData.startedDate; + if (taskData.completedDate) task.dataset.completedDate = taskData.completedDate; + if (taskData.tagName) { + task.dataset.tagName = taskData.tagName; + task.dataset.tagColor = taskData.tagColor; + const tagCircle = task.querySelector('.tag-circle'); + if (tagCircle) { + tagCircle.style.backgroundColor = taskData.tagColor; + tagCircle.classList.remove('border-2', 'border-gray-400'); + } + const tooltipOverlay = task.querySelector('.task-tooltip-overlay'); + if (tooltipOverlay) { + tooltipOverlay.textContent = taskData.tagName; + } + } + // Set started/completed date display + const startedDateDisplay = task.querySelector('.started-date-display'); + if (startedDateDisplay && taskData.startedDate) { + startedDateDisplay.textContent = `Started: ${new Date(taskData.startedDate).toLocaleDateString(undefined, { timeZone: 'UTC' })}`; + startedDateDisplay.classList.remove('hidden'); + } + const completedDateDisplay = task.querySelector('.completed-date-display'); + if (completedDateDisplay && taskData.completedDate) { + completedDateDisplay.textContent = `Completed: ${new Date(taskData.completedDate).toLocaleDateString(undefined, { timeZone: 'UTC' })}`; + completedDateDisplay.classList.remove('hidden'); + } + // Show/hide delete button + const deleteBtn = task.querySelector('.delete-task-btn'); + if (deleteBtn) { + if (taskData.column === 'completed') { + deleteBtn.classList.remove('hidden'); + } else { + deleteBtn.classList.add('hidden'); + } + } + // Append to correct column + const column = document.querySelector(`.tasks[data-column-id="${taskData.column}"]`); + if (column) column.appendChild(task); + }); + } + + // Call load on startup + loadBoardFromLocalStorage(); + + // Save after every UI change + function saveAfter(fn) { + return function(...args) { + const result = fn.apply(this, args); + saveBoardState(); + return result; + }; + } + // Patch UI actions to save + const originalCreateNewTask = createNewTask; + createNewTask = function(...args) { + const task = originalCreateNewTask.apply(this, args); + saveBoardState(); + return task; + }; + const originalApplyTagToTask = applyTagToTask; + applyTagToTask = function(...args) { + originalApplyTagToTask.apply(this, args); + saveBoardState(); + }; + const originalRemoveTagFromTask = removeTagFromTask; + removeTagFromTask = function(...args) { + originalRemoveTagFromTask.apply(this, args); + saveBoardState(); + }; + const originalOpenTagModal = openTagModal; + openTagModal = function(...args) { + originalOpenTagModal.apply(this, args); + saveBoardState(); + }; + + // Dark mode toggle logic + function setupDarkModeToggle() { + const darkToggle = document.getElementById('dark-mode-toggle'); + const dot = document.querySelector('.dot'); + const mainBody = document.getElementById('main-body'); + + // Check for saved preference or system preference + const savedMode = localStorage.getItem('darkMode'); + const systemPrefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; + + // Set initial state + if (savedMode === 'true' || (!savedMode && systemPrefersDark)) { + darkToggle.checked = true; + mainBody.classList.add('dark'); + if (dot) dot.style.transform = 'translateX(16px)'; + } else { + darkToggle.checked = false; + mainBody.classList.remove('dark'); + if (dot) dot.style.transform = 'translateX(0)'; + } + + // Handle toggle changes + darkToggle.addEventListener('change', function() { + if (darkToggle.checked) { + mainBody.classList.add('dark'); + localStorage.setItem('darkMode', 'true'); + if (dot) dot.style.transform = 'translateX(16px)'; + } else { + mainBody.classList.remove('dark'); + localStorage.setItem('darkMode', 'false'); + if (dot) dot.style.transform = 'translateX(0)'; + } + }); + + // Listen for system preference changes + if (window.matchMedia) { + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) { + // Only auto-switch if user hasn't manually set a preference + if (!localStorage.getItem('darkMode')) { + if (e.matches) { + darkToggle.checked = true; + mainBody.classList.add('dark'); + if (dot) dot.style.transform = 'translateX(16px)'; + } else { + darkToggle.checked = false; + mainBody.classList.remove('dark'); + if (dot) dot.style.transform = 'translateX(0)'; + } + } + }); + } + } + + // Initialize dark mode + setupDarkModeToggle(); +}); diff --git a/tools/kanban/src/kanban.ico b/tools/kanban/src/kanban.ico new file mode 100644 index 0000000000000000000000000000000000000000..3ea33f8bc31bf7aa3c453c2e589646c25ae3e2f5 GIT binary patch literal 173541 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 HBcJ~RP~T`n literal 0 HcmV?d00001 diff --git a/tools/kanban/src/styles.css b/tools/kanban/src/styles.css new file mode 100644 index 0000000..64a8fdb --- /dev/null +++ b/tools/kanban/src/styles.css @@ -0,0 +1,162 @@ +body { + font-family: 'Inter', sans-serif; +} +body.dark { + background-color: #18181b; + color: #e5e7eb; +} +.kanban-column { + user-select: none; + background-color: #fff; +} +body.dark .kanban-column { + background-color: #23232a; + color: #e5e7eb; +} +.task { + background-color: #f9fafb; + color: #222; + word-break: break-word; + white-space: pre-line; + overflow-wrap: anywhere; +} +body.dark .task { + background-color: #262632; + color: #e5e7eb; +} +.tasks::-webkit-scrollbar { + width: 8px; +} +.tasks::-webkit-scrollbar-track { + background: #f1f5f9; + border-radius: 10px; +} +body.dark .tasks::-webkit-scrollbar-track { + background: #23232a; +} +.tasks::-webkit-scrollbar-thumb { + background: #94a3b8; + border-radius: 10px; +} +body.dark .tasks::-webkit-scrollbar-thumb { + background: #444459; +} +.tasks::-webkit-scrollbar-thumb:hover { + background: #64748b; +} +body.dark .tasks::-webkit-scrollbar-thumb:hover { + background: #6366f1; +} +.tag-tooltip { + visibility: hidden; + width: 120px; + background-color: #555; + color: #fff; + text-align: center; + border-radius: 6px; + padding: 5px 0; + position: absolute; + z-index: 1; + bottom: 125%; + left: 50%; + margin-left: -60px; + opacity: 0; + transition: opacity 0.3s; +} +body.dark .tag-tooltip { + background-color: #222; + color: #e5e7eb; +} +.tag-tooltip::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: #555 transparent transparent transparent; +} +body.dark .tag-tooltip::after { + border-color: #222 transparent transparent transparent; +} +.tag-circle:hover .tag-tooltip { + visibility: visible; + opacity: 1; +} +.dot { + transition: transform 0.2s; +} +#dark-mode-toggle:checked + span .dot { + transform: translateX(16px); +} +#dark-mode-toggle:not(:checked) + span .dot { + transform: translateX(0); +} +body.dark h1, +body.dark h2, +body.dark h3, +body.dark h4, +body.dark h5, +body.dark h6, +body.dark p, +body.dark .text-gray-700, +body.dark .text-gray-900, +body.dark .text-gray-600, +body.dark .font-medium, +body.dark .font-bold { + color: #e5e7eb !important; +} +body.dark .bg-white { + background-color: #23232a !important; +} +body.dark .bg-gray-50 { + background-color: #262632 !important; +} +body.dark .border-gray-400 { + border-color: #6366f1 !important; +} +body.dark select#tag-filter { + background-color: #23232a !important; + color: #e5e7eb !important; + border-color: #6366f1 !important; +} +body.dark select#tag-filter option { + background-color: #23232a !important; + color: #e5e7eb !important; +} +body.dark .modal, +body.dark #delete-modal > div, +body.dark #tag-delete-modal > div { + background-color: #23232a !important; + color: #e5e7eb !important; +} +body.dark #delete-modal h3, +body.dark #tag-delete-modal h3, +body.dark #delete-modal p, +body.dark #tag-delete-modal p { + color: #e5e7eb !important; +} +body.dark #delete-modal button, +body.dark #tag-delete-modal button { + background-color: #444459 !important; + color: #e5e7eb !important; + border-color: #6366f1 !important; +} +body.dark #delete-modal button:hover, +body.dark #tag-delete-modal button:hover { + background-color: #6366f1 !important; + color: #fff !important; +} +body.dark input[type="text"], +body.dark input[type="date"], +body.dark textarea { + background-color: #23232a !important; + color: #e5e7eb !important; + border-color: #6366f1 !important; +} +body.dark input[type="text"]::placeholder, +body.dark input[type="date"]::placeholder, +body.dark textarea::placeholder { + color: #a1a1aa !important; +}