Changes to taskflow.scroll.pub

root
root
25 days ago
Initial commit
body.html
Changed around line 1
+
+
+

TaskFlow

+
+
+
+
+
+
+
+

To Do

+
+
+
+
+
+
+
+

In Progress

+
+
+
+
+
+
+
+

Done

+
+
+
+
+
+
+
+
+
+

TaskFlow - Organize your work with ease

+
index.scroll
Changed around line 1
+ buildHtml
+ baseUrl https://taskflow.scroll.pub
+ metaTags
+ editButton /edit.html
+ title TaskFlow - Simple Kanban Board
+ style.css
+ body.html
+ script.js
prompt.json
Changed around line 1
+ {
+ "id": "msg_015TC7EAqBYqxCcBg85SM38t",
+ "type": "message",
+ "role": "assistant",
+ "model": "claude-3-5-sonnet-20241022",
+ "content": [
+ {
+ "type": "text",
+ "text": "I'll create a Trello clone called \"TaskFlow\" - a simple but powerful kanban board system.\n\n---domain---\ntaskflow.scroll.pub\n\n---index.scroll---\nbuildHtml\nbaseUrl https://taskflow.scroll.pub\nmetaTags\neditButton /edit.html\ntitle TaskFlow - Simple Kanban Board\nstyle.css\nbody.html\nscript.js\n\n---body.html---\n
\n \n
\n\n
\n
\n
\n

To Do

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

In Progress

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

Done

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

TaskFlow - Organize your work with ease

\n
\n\n---style.css---\n:root {\n --primary-color: #2c3e50;\n --secondary-color: #3498db;\n --background-color: #ecf0f1;\n --card-color: #ffffff;\n --shadow-color: rgba(0, 0, 0, 0.1);\n}\n\n* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: var(--background-color);\n color: var(--primary-color);\n line-height: 1.6;\n}\n\nheader {\n background: var(--primary-color);\n color: white;\n padding: 1rem;\n box-shadow: 0 2px 5px var(--shadow-color);\n}\n\nnav {\n max-width: 1200px;\n margin: 0 auto;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\nh1 {\n font-size: 1.8rem;\n font-weight: 700;\n}\n\n#addBoardBtn {\n background: var(--secondary-color);\n color: white;\n border: none;\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n cursor: pointer;\n font-size: 1.5rem;\n transition: transform 0.2s;\n}\n\n#addBoardBtn:hover {\n transform: scale(1.1);\n}\n\nmain {\n display: flex;\n gap: 2rem;\n padding: 2rem;\n overflow-x: auto;\n min-height: calc(100vh - 120px);\n}\n\n.board {\n background: rgba(255, 255, 255, 0.8);\n border-radius: 10px;\n min-width: 300px;\n max-width: 300px;\n height: fit-content;\n box-shadow: 0 2px 10px var(--shadow-color);\n backdrop-filter: blur(10px);\n}\n\n.board-header {\n padding: 1rem;\n background: var(--secondary-color);\n color: white;\n border-radius: 10px 10px 0 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.cards-container {\n padding: 1rem;\n min-height: 50px;\n}\n\n.card {\n background: var(--card-color);\n border-radius: 5px;\n padding: 1rem;\n margin-bottom: 0.8rem;\n box-shadow: 0 2px 5px var(--shadow-color);\n cursor: move;\n transition: transform 0.2s;\n}\n\n.card:hover {\n transform: translateY(-2px);\n}\n\n.card-actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.5rem;\n}\n\n.card button {\n background: none;\n border: none;\n cursor: pointer;\n opacity: 0.6;\n transition: opacity 0.2s;\n}\n\n.card button:hover {\n opacity: 1;\n}\n\n.add-card {\n background: none;\n border: none;\n color: white;\n cursor: pointer;\n font-size: 1.2rem;\n transition: transform 0.2s;\n}\n\n.add-card:hover {\n transform: scale(1.2);\n}\n\nfooter {\n text-align: center;\n padding: 1rem;\n background: var(--primary-color);\n color: white;\n}\n\n@media (max-width: 768px) {\n main {\n flex-direction: column;\n align-items: center;\n }\n\n .board {\n width: 100%;\n max-width: 100%;\n }\n}\n\n.dragging {\n opacity: 0.5;\n}\n\n.drag-over {\n border: 2px dashed var(--secondary-color);\n}\n\n---script.js---\ndocument.addEventListener('DOMContentLoaded', () => {\n loadCards();\n setupEventListeners();\n});\n\nfunction setupEventListeners() {\n document.querySelectorAll('.add-card').forEach(button => {\n button.addEventListener('click', addCard);\n });\n\n document.querySelectorAll('.cards-container').forEach(container => {\n container.addEventListener('dragover', dragOver);\n container.addEventListener('drop', drop);\n });\n}\n\nfunction addCard(e) {\n const board = e.target.closest('.board');\n const container = board.querySelector('.cards-container');\n const cardText = prompt('Enter card content:');\n \n if (cardText) {\n const card = createCard(cardText);\n container.appendChild(card);\n saveCards();\n }\n}\n\nfunction createCard(text) {\n const template = document.getElementById('cardTemplate');\n const card = template.content.cloneNode(true).children[0];\n \n card.querySelector('.card-content').textContent = text;\n card.addEventListener('dragstart', dragStart);\n card.addEventListener('dragend', dragEnd);\n \n card.querySelector('.edit-card').addEventListener('click', () => editCard(card));\n card.querySelector('.delete-card').addEventListener('click', () => deleteCard(card));\n \n return card;\n}\n\nfunction editCard(card) {\n const content = card.querySelector('.card-content');\n const newText = prompt('Edit card:', content.textContent);\n \n if (newText) {\n content.textContent = newText;\n saveCards();\n }\n}\n\nfunction deleteCard(card) {\n if (confirm('Delete this card?')) {\n card.remove();\n saveCards();\n }\n}\n\nfunction dragStart(e) {\n e.target.classList.add('dragging');\n}\n\nfunction dragEnd(e) {\n e.target.classList.remove('dragging');\n saveCards();\n}\n\nfunction dragOver(e) {\n e.preventDefault();\n const container = e.target.closest('.cards-container');\n container.classList.add('drag-over');\n}\n\nfunction drop(e) {\n e.preventDefault();\n const container = e.target.closest('.cards-container');\n const card = document.querySelector('.dragging');\n \n container.classList.remove('drag-over');\n container.appendChild(card);\n}\n\nfunction saveCards() {\n const boards = {};\n document.querySelectorAll('.cards-container').forEach(container => {\n const boardId = container.dataset.board;\n boards[boardId] = Array.from(container.children).map(card => \n card.querySelector('.card-content').textContent\n );\n });\n localStorage.setItem('taskflowBoards', JSON.stringify(boards));\n}\n\nfunction loadCards() {\n const boards = JSON.parse(localStorage.getItem('taskflowBoards') || '{}');\n Object.entries(boards).forEach(([boardId, cards]) => {\n const container = document.querySelector(`[data-board=\"${boardId}\"]`);\n cards.forEach(cardText => {\n container.appendChild(createCard(cardText));\n });\n });\n}\n\n---end---\n\nThis implementation creates a responsive Trello-like kanban board with the following features:\n\n1. Three default boards (To Do, In Progress, Done)\n2. Drag and drop functionality\n3. Add, edit, and delete cards\n4. Persistent storage using localStorage\n5. Modern glass-morphism design\n6. Smooth animations and transitions\n7. Mobile-responsive layout\n8. Accessible buttons and interactions\n9. Clean, semantic HTML structure\n\nThe design uses a modern glass-morphism effect with a professional color scheme and subtle animations. It's fully functional on both desktop and mobile devices, with all data persisting between sessions using localStorage."
+ }
+ ],
+ "stop_reason": "end_turn",
+ "stop_sequence": null,
+ "usage": {
+ "input_tokens": 274,
+ "cache_creation_input_tokens": 0,
+ "cache_read_input_tokens": 0,
+ "output_tokens": 2568
+ }
+ }
readme.scroll
Changed around line 1
+ # taskflow.scroll.pub
+ Website generated by Claude from prompt: Trello clone
script.js
Changed around line 1
+ document.addEventListener('DOMContentLoaded', () => {
+ loadCards();
+ setupEventListeners();
+ });
+
+ function setupEventListeners() {
+ document.querySelectorAll('.add-card').forEach(button => {
+ button.addEventListener('click', addCard);
+ });
+
+ document.querySelectorAll('.cards-container').forEach(container => {
+ container.addEventListener('dragover', dragOver);
+ container.addEventListener('drop', drop);
+ });
+ }
+
+ function addCard(e) {
+ const board = e.target.closest('.board');
+ const container = board.querySelector('.cards-container');
+ const cardText = prompt('Enter card content:');
+
+ if (cardText) {
+ const card = createCard(cardText);
+ container.appendChild(card);
+ saveCards();
+ }
+ }
+
+ function createCard(text) {
+ const template = document.getElementById('cardTemplate');
+ const card = template.content.cloneNode(true).children[0];
+
+ card.querySelector('.card-content').textContent = text;
+ card.addEventListener('dragstart', dragStart);
+ card.addEventListener('dragend', dragEnd);
+
+ card.querySelector('.edit-card').addEventListener('click', () => editCard(card));
+ card.querySelector('.delete-card').addEventListener('click', () => deleteCard(card));
+
+ return card;
+ }
+
+ function editCard(card) {
+ const content = card.querySelector('.card-content');
+ const newText = prompt('Edit card:', content.textContent);
+
+ if (newText) {
+ content.textContent = newText;
+ saveCards();
+ }
+ }
+
+ function deleteCard(card) {
+ if (confirm('Delete this card?')) {
+ card.remove();
+ saveCards();
+ }
+ }
+
+ function dragStart(e) {
+ e.target.classList.add('dragging');
+ }
+
+ function dragEnd(e) {
+ e.target.classList.remove('dragging');
+ saveCards();
+ }
+
+ function dragOver(e) {
+ e.preventDefault();
+ const container = e.target.closest('.cards-container');
+ container.classList.add('drag-over');
+ }
+
+ function drop(e) {
+ e.preventDefault();
+ const container = e.target.closest('.cards-container');
+ const card = document.querySelector('.dragging');
+
+ container.classList.remove('drag-over');
+ container.appendChild(card);
+ }
+
+ function saveCards() {
+ const boards = {};
+ document.querySelectorAll('.cards-container').forEach(container => {
+ const boardId = container.dataset.board;
+ boards[boardId] = Array.from(container.children).map(card =>
+ card.querySelector('.card-content').textContent
+ );
+ });
+ localStorage.setItem('taskflowBoards', JSON.stringify(boards));
+ }
+
+ function loadCards() {
+ const boards = JSON.parse(localStorage.getItem('taskflowBoards') || '{}');
+ Object.entries(boards).forEach(([boardId, cards]) => {
+ const container = document.querySelector(`[data-board="${boardId}"]`);
+ cards.forEach(cardText => {
+ container.appendChild(createCard(cardText));
+ });
+ });
+ }
style.css
Changed around line 1
+ :root {
+ --primary-color: #2c3e50;
+ --secondary-color: #3498db;
+ --background-color: #ecf0f1;
+ --card-color: #ffffff;
+ --shadow-color: rgba(0, 0, 0, 0.1);
+ }
+
+ * {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+ body {
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+ background: var(--background-color);
+ color: var(--primary-color);
+ line-height: 1.6;
+ }
+
+ header {
+ background: var(--primary-color);
+ color: white;
+ padding: 1rem;
+ box-shadow: 0 2px 5px var(--shadow-color);
+ }
+
+ nav {
+ max-width: 1200px;
+ margin: 0 auto;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ h1 {
+ font-size: 1.8rem;
+ font-weight: 700;
+ }
+
+ #addBoardBtn {
+ background: var(--secondary-color);
+ color: white;
+ border: none;
+ width: 2rem;
+ height: 2rem;
+ border-radius: 50%;
+ cursor: pointer;
+ font-size: 1.5rem;
+ transition: transform 0.2s;
+ }
+
+ #addBoardBtn:hover {
+ transform: scale(1.1);
+ }
+
+ main {
+ display: flex;
+ gap: 2rem;
+ padding: 2rem;
+ overflow-x: auto;
+ min-height: calc(100vh - 120px);
+ }
+
+ .board {
+ background: rgba(255, 255, 255, 0.8);
+ border-radius: 10px;
+ min-width: 300px;
+ max-width: 300px;
+ height: fit-content;
+ box-shadow: 0 2px 10px var(--shadow-color);
+ backdrop-filter: blur(10px);
+ }
+
+ .board-header {
+ padding: 1rem;
+ background: var(--secondary-color);
+ color: white;
+ border-radius: 10px 10px 0 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .cards-container {
+ padding: 1rem;
+ min-height: 50px;
+ }
+
+ .card {
+ background: var(--card-color);
+ border-radius: 5px;
+ padding: 1rem;
+ margin-bottom: 0.8rem;
+ box-shadow: 0 2px 5px var(--shadow-color);
+ cursor: move;
+ transition: transform 0.2s;
+ }
+
+ .card:hover {
+ transform: translateY(-2px);
+ }
+
+ .card-actions {
+ display: flex;
+ gap: 0.5rem;
+ margin-top: 0.5rem;
+ }
+
+ .card button {
+ background: none;
+ border: none;
+ cursor: pointer;
+ opacity: 0.6;
+ transition: opacity 0.2s;
+ }
+
+ .card button:hover {
+ opacity: 1;
+ }
+
+ .add-card {
+ background: none;
+ border: none;
+ color: white;
+ cursor: pointer;
+ font-size: 1.2rem;
+ transition: transform 0.2s;
+ }
+
+ .add-card:hover {
+ transform: scale(1.2);
+ }
+
+ footer {
+ text-align: center;
+ padding: 1rem;
+ background: var(--primary-color);
+ color: white;
+ }
+
+ @media (max-width: 768px) {
+ main {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .board {
+ width: 100%;
+ max-width: 100%;
+ }
+ }
+
+ .dragging {
+ opacity: 0.5;
+ }
+
+ .drag-over {
+ border: 2px dashed var(--secondary-color);
+ }