← Back to Kontasks
SortableList Touch Test v2
Another test of the touch-enabled SortableList component
Output
📱 SortableList Touch Test v2
Touch support with touch-action: none CSS to prevent scroll hijacking. Try dragging!
Backlog Priority
Drag to reorder (touch or mouse)
⋮⋮1
gvShell BootstrapGo binary replacing konsole
⋮⋮2
Hot Session PoolPre-warmed Claude sessions
⋮⋮3
FileTree ComponentInteractive file explorer
⋮⋮4
TabbedCard ComponentMulti-tab content display
⋮⋮5
StepWizard ComponentMulti-step form workflow
⋮⋮6
Metrics DashboardReal-time telemetry charts
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
kontaskscomponentsmobile
Created
7 Jan 2026, 3:56 pm
Updated
7 Jan 2026, 3:56 pm
Timing
⏱️ 50.6s
0 tools
● TTFE 2%
● Thinking 98%
● Tools 0%
Created By
claude
Raw Data
{
"id": "7ce81044-753e-47bf-8a3f-be63d64d7e84",
"type": "general",
"status": "completed",
"title": "SortableList Touch Test v2",
"description": "Another test of the touch-enabled SortableList component",
"context": {
"output": "<div style=\"background:#1e1e1e;color:#e0e0e0;padding:20px;border-radius:8px;font-family:sans-serif;\"><h2 style=\"color:#fff;margin:0 0 16px 0;\">📱 SortableList Touch Test v2</h2><p style=\"color:#7f848e;margin-bottom:16px;\">Touch support with <code>touch-action: none</code> CSS to prevent scroll hijacking. Try dragging!</p><div class=\"sortable-list-container\" id=\"backlog-priority\"><h4 class=\"sortable-title\">Backlog Priority</h4><p class=\"sortable-hint\">Drag to reorder (touch or mouse)</p><div class=\"sortable-list\" data-list-id=\"backlog-priority\"><div class=\"sortable-item\" data-id=\"gvshell\" draggable=\"true\"><span class=\"sortable-handle\">⋮⋮</span><span class=\"sortable-number\">1</span><div class=\"sortable-content\"><span class=\"sortable-label\">gvShell Bootstrap</span><span class=\"sortable-desc\">Go binary replacing konsole</span></div></div><div class=\"sortable-item\" data-id=\"hot-sessions\" draggable=\"true\"><span class=\"sortable-handle\">⋮⋮</span><span class=\"sortable-number\">2</span><div class=\"sortable-content\"><span class=\"sortable-label\">Hot Session Pool</span><span class=\"sortable-desc\">Pre-warmed Claude sessions</span></div></div><div class=\"sortable-item\" data-id=\"file-tree\" draggable=\"true\"><span class=\"sortable-handle\">⋮⋮</span><span class=\"sortable-number\">3</span><div class=\"sortable-content\"><span class=\"sortable-label\">FileTree Component</span><span class=\"sortable-desc\">Interactive file explorer</span></div></div><div class=\"sortable-item\" data-id=\"tabbed-card\" draggable=\"true\"><span class=\"sortable-handle\">⋮⋮</span><span class=\"sortable-number\">4</span><div class=\"sortable-content\"><span class=\"sortable-label\">TabbedCard Component</span><span class=\"sortable-desc\">Multi-tab content display</span></div></div><div class=\"sortable-item\" data-id=\"step-wizard\" draggable=\"true\"><span class=\"sortable-handle\">⋮⋮</span><span class=\"sortable-number\">5</span><div class=\"sortable-content\"><span class=\"sortable-label\">StepWizard Component</span><span class=\"sortable-desc\">Multi-step form workflow</span></div></div><div class=\"sortable-item\" data-id=\"metrics-dash\" draggable=\"true\"><span class=\"sortable-handle\">⋮⋮</span><span class=\"sortable-number\">6</span><div class=\"sortable-content\"><span class=\"sortable-label\">Metrics Dashboard</span><span class=\"sortable-desc\">Real-time telemetry charts</span></div></div></div><button class=\"sortable-submit-btn\" onclick=\"submitSortableOrder_backlog-priority()\">Apply Priority</button></div><script>(function() { const listId = 'backlog-priority'; const container = document.querySelector('#' + listId + ' .sortable-list'); if (!container) return; let draggedItem = null; let touchStartY = 0; let touchCurrentY = 0; container.querySelectorAll('.sortable-item').forEach(item => { item.addEventListener('dragstart', (e) => { draggedItem = item; item.classList.add('dragging'); e.dataTransfer.effectAllowed = 'move'; }); item.addEventListener('dragend', () => { item.classList.remove('dragging'); draggedItem = null; updateNumbers(); }); item.addEventListener('dragover', (e) => { e.preventDefault(); if (!draggedItem || draggedItem === item) return; const rect = item.getBoundingClientRect(); const midY = rect.top + rect.height / 2; if (e.clientY < midY) { container.insertBefore(draggedItem, item); } else { container.insertBefore(draggedItem, item.nextSibling); } }); item.addEventListener('touchstart', (e) => { if (e.touches.length !== 1) return; draggedItem = item; touchStartY = e.touches[0].clientY; touchCurrentY = touchStartY; item.classList.add('dragging'); e.preventDefault(); }, { passive: false }); item.addEventListener('touchmove', (e) => { if (!draggedItem || draggedItem !== item) return; if (e.touches.length !== 1) return; e.preventDefault(); touchCurrentY = e.touches[0].clientY; const items = Array.from(container.querySelectorAll('.sortable-item')); for (const targetItem of items) { if (targetItem === draggedItem) continue; const rect = targetItem.getBoundingClientRect(); const midY = rect.top + rect.height / 2; if (touchCurrentY >= rect.top && touchCurrentY <= rect.bottom) { if (touchCurrentY < midY) { container.insertBefore(draggedItem, targetItem); } else { container.insertBefore(draggedItem, targetItem.nextSibling); } break; } } }, { passive: false }); item.addEventListener('touchend', (e) => { if (!draggedItem) return; draggedItem.classList.remove('dragging'); draggedItem = null; touchStartY = 0; touchCurrentY = 0; updateNumbers(); }); item.addEventListener('touchcancel', (e) => { if (!draggedItem) return; draggedItem.classList.remove('dragging'); draggedItem = null; }); }); function updateNumbers() { container.querySelectorAll('.sortable-item').forEach((item, idx) => { item.querySelector('.sortable-number').textContent = idx + 1; }); } window['getSortableOrder_' + listId] = function() { return Array.from(container.querySelectorAll('.sortable-item')).map(item => item.getAttribute('data-id')); }; window['submitSortableOrder_' + listId] = function() { const order = window['getSortableOrder_' + listId](); const prompt = 'Backlog reprioritized: ' + order.join(', '); window.location.href = '/?prompt=' + encodeURIComponent(prompt); }; console.log('[SortableList] Initialized:', listId, '(touch enabled)'); })();</script><style>.sortable-list-container { background: #2d2d2d; padding: 16px; border-radius: 8px; margin: 12px 0; } .sortable-title { color: #fff; margin: 0 0 8px 0; font-size: 1rem; } .sortable-hint { color: #7f848e; font-size: 0.85rem; margin: 0 0 12px 0; } .sortable-list { display: flex; flex-direction: column; gap: 8px; } .sortable-item { display: flex; align-items: center; gap: 12px; background: #3d3d3d; padding: 12px; border-radius: 6px; cursor: grab; transition: background 0.2s, transform 0.2s; user-select: none; touch-action: none; -webkit-touch-callout: none; } .sortable-item:hover { background: #4d4d4d; } .sortable-item.dragging { opacity: 0.5; background: #5d5d5d; cursor: grabbing; } .sortable-handle { color: #7f848e; font-size: 1.2rem; cursor: grab; } .sortable-number { background: #c99542; color: #000; width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 0.85rem; } .sortable-content { flex: 1; display: flex; flex-direction: column; gap: 4px; } .sortable-label { color: #e0e0e0; font-weight: 500; } .sortable-desc { color: #7f848e; font-size: 0.85rem; } .sortable-submit-btn { margin-top: 16px; background: linear-gradient(135deg, #c99542 0%, #e3af5b 100%); color: #000; border: none; padding: 12px 24px; border-radius: 6px; font-weight: bold; cursor: pointer; transition: transform 0.2s, box-shadow 0.2s; } .sortable-submit-btn:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(201, 149, 66, 0.4); }</style></div>",
"requestedAt": "2026-01-07T10:15:00Z",
"requestId": "c1b6db32-d79a-400b-b200-03fd2e839437",
"choices": [
{
"label": "Works!",
"value": "SortableList touch support works! Continue to Step 4 (TabbedCard component)",
"primary": true
},
{
"label": "Still broken",
"value": "SortableList still not working on mobile - page scrolls instead of items dragging"
}
],
"turnTiming": {
"totalMs": 50572,
"ttfeMs": 861,
"thinkingMs": 49710,
"toolExecutionMs": 0,
"toolCallCount": 0,
"thinkingPct": 98,
"toolsPct": 0,
"ttfePct": 2
}
},
"createdBy": "claude",
"createdAt": "2026-01-07T05:56:36.849Z",
"updatedAt": "2026-01-07T05:56:43.513Z",
"requestId": "c1b6db32-d79a-400b-b200-03fd2e839437",
"scope": "vibetools",
"tags": [
"kontasks",
"components",
"mobile"
],
"targetUser": "claude"
}