← Back to Kontasks
๐ง Fixed: Interactive JS Demo v2
Working interactive tabs and counter with window-scoped functions
Output
๐ง Fixed: Interactive JavaScript Demo
What Was Wrong
Functions defined with function foo() inside new Function() aren't accessible to onclick handlers which look in the global (window) scope.
The Fix
Scripts must assign functions to window explicitly:
window.myFunc = function() { ... }
๐ฎ Live Demo: Working Tabs
Click these tabs - they work now!
โ It Works!
These tabs are powered by inline JavaScript. Click the other tabs to see different content.
๐งฎ Live Counter v2
0
โ Now Working
Both the tabs and counter should work now. Try clicking them! The key is using window.funcName = function() {} so onclick handlers can find them.
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
kontasksuijavascriptfix
Created
7 Jan 2026, 9:33 am
Updated
7 Jan 2026, 9:33 am
Created By
claude
Raw Data
{
"id": "ee03ce87-6285-4fac-8709-83761585b361",
"type": "general",
"status": "completed",
"title": "๐ง Fixed: Interactive JS Demo v2",
"description": "Working interactive tabs and counter with window-scoped functions",
"context": {
"output": "<div style=\"background:#030712;color:#e5e7eb;padding:24px;border-radius:12px;font-family:system-ui,-apple-system,sans-serif;\">\n<h2 style=\"margin:0 0 20px 0;color:#fff;\">๐ง Fixed: Interactive JavaScript Demo</h2>\n\n<div style=\"background:#f59e0b20;border:1px solid #f59e0b;padding:16px;border-radius:8px;margin-bottom:20px;\">\n<h3 style=\"margin:0 0 8px 0;color:#f59e0b;\">What Was Wrong</h3>\n<p style=\"margin:0;color:#e5e7eb;\">Functions defined with <code style=\"background:#0f172a;padding:2px 6px;border-radius:4px;\">function foo()</code> inside <code style=\"background:#0f172a;padding:2px 6px;border-radius:4px;\">new Function()</code> aren't accessible to <code style=\"background:#0f172a;padding:2px 6px;border-radius:4px;\">onclick</code> handlers which look in the global (window) scope.</p>\n</div>\n\n<div style=\"background:#22c55e20;border:1px solid #22c55e;padding:16px;border-radius:8px;margin-bottom:20px;\">\n<h3 style=\"margin:0 0 8px 0;color:#22c55e;\">The Fix</h3>\n<p style=\"margin:0;color:#e5e7eb;\">Scripts must assign functions to <code style=\"background:#0f172a;padding:2px 6px;border-radius:4px;\">window</code> explicitly:</p>\n<pre style=\"margin:8px 0 0 0;background:#0f172a;padding:8px;border-radius:4px;color:#a5b4fc;font-size:0.85rem;\">window.myFunc = function() { ... }</pre>\n</div>\n\n<div style=\"background:#1e293b;padding:16px;border-radius:8px;margin-bottom:20px;\">\n<h3 style=\"margin:0 0 12px 0;color:#3b82f6;\">๐ฎ Live Demo: Working Tabs</h3>\n<p style=\"margin:0 0 12px 0;color:#9ca3af;\">Click these tabs - they work now!</p>\n\n<div id=\"demo-tabs-v2\" style=\"margin-bottom:12px;\">\n<button onclick=\"showTab2('info')\" id=\"btn-info\" style=\"padding:8px 16px;background:#3b82f6;color:#fff;border:none;border-radius:4px 4px 0 0;cursor:pointer;margin-right:2px;\">Info</button>\n<button onclick=\"showTab2('fix')\" id=\"btn-fix\" style=\"padding:8px 16px;background:#374151;color:#9ca3af;border:none;border-radius:4px 4px 0 0;cursor:pointer;margin-right:2px;\">The Fix</button>\n<button onclick=\"showTab2('pattern')\" id=\"btn-pattern\" style=\"padding:8px 16px;background:#374151;color:#9ca3af;border:none;border-radius:4px 4px 0 0;cursor:pointer;\">Pattern</button>\n</div>\n\n<div id=\"panel-info\" style=\"background:#0f172a;padding:16px;border-radius:0 8px 8px 8px;\">\n<h4 style=\"margin:0 0 8px 0;color:#fff;\">โ
It Works!</h4>\n<p style=\"margin:0;color:#9ca3af;\">These tabs are powered by inline JavaScript. Click the other tabs to see different content.</p>\n</div>\n\n<div id=\"panel-fix\" style=\"background:#0f172a;padding:16px;border-radius:0 8px 8px 8px;display:none;\">\n<h4 style=\"margin:0 0 8px 0;color:#fff;\">Code Pattern</h4>\n<pre style=\"margin:0;color:#a5b4fc;font-size:0.8rem;line-height:1.5;\">// OLD (broken) - function not in global scope\nfunction showTab(tab) { ... }\n\n// NEW (works) - assign to window\nwindow.showTab = function(tab) { ... }</pre>\n</div>\n\n<div id=\"panel-pattern\" style=\"background:#0f172a;padding:16px;border-radius:0 8px 8px 8px;display:none;\">\n<h4 style=\"margin:0 0 8px 0;color:#fff;\">Best Practice</h4>\n<ul style=\"margin:0;padding-left:20px;color:#9ca3af;line-height:1.8;\">\n<li>Use <code style=\"background:#1e293b;padding:2px 4px;border-radius:3px;\">window.funcName = function() {}</code></li>\n<li>Access container elements via <code style=\"background:#1e293b;padding:2px 4px;border-radius:3px;\">container.querySelector()</code></li>\n<li>Variables can be regular <code style=\"background:#1e293b;padding:2px 4px;border-radius:3px;\">var</code> or <code style=\"background:#1e293b;padding:2px 4px;border-radius:3px;\">let</code></li>\n</ul>\n</div>\n</div>\n\n<script>\n// Tab switching - must assign to window for onclick access\nwindow.showTab2 = function(tab) {\n ['info', 'fix', 'pattern'].forEach(function(t) {\n var panel = container.querySelector('#panel-' + t);\n var btn = container.querySelector('#btn-' + t);\n if (panel) panel.style.display = 'none';\n if (btn) {\n btn.style.background = '#374151';\n btn.style.color = '#9ca3af';\n }\n });\n var selectedPanel = container.querySelector('#panel-' + tab);\n var selectedBtn = container.querySelector('#btn-' + tab);\n if (selectedPanel) selectedPanel.style.display = 'block';\n if (selectedBtn) {\n selectedBtn.style.background = '#3b82f6';\n selectedBtn.style.color = '#fff';\n }\n};\n</script>\n\n<div style=\"background:#1e293b;padding:16px;border-radius:8px;margin-bottom:20px;\">\n<h3 style=\"margin:0 0 12px 0;color:#ec4899;\">๐งฎ Live Counter v2</h3>\n<div style=\"display:flex;align-items:center;gap:12px;\">\n<button onclick=\"decrement2()\" style=\"width:40px;height:40px;font-size:1.2rem;background:#ef4444;color:#fff;border:none;border-radius:6px;cursor:pointer;\">โ</button>\n<span id=\"counter-v2\" style=\"font-size:2rem;font-weight:bold;color:#fff;min-width:60px;text-align:center;\">0</span>\n<button onclick=\"increment2()\" style=\"width:40px;height:40px;font-size:1.2rem;background:#22c55e;color:#fff;border:none;border-radius:6px;cursor:pointer;\">+</button>\n</div>\n</div>\n\n<script>\nvar count2 = 0;\nwindow.increment2 = function() {\n count2++;\n container.querySelector('#counter-v2').textContent = count2;\n};\nwindow.decrement2 = function() {\n count2--;\n container.querySelector('#counter-v2').textContent = count2;\n};\n</script>\n\n<div style=\"background:#0f172a;padding:16px;border-radius:8px;border:1px solid #22c55e;\">\n<h4 style=\"margin:0 0 8px 0;color:#22c55e;\">โ
Now Working</h4>\n<p style=\"margin:0;color:#9ca3af;font-size:0.9rem;\">Both the tabs and counter should work now. Try clicking them! The key is using <code style=\"background:#1e293b;padding:2px 4px;border-radius:3px;\">window.funcName = function() {}</code> so onclick handlers can find them.</p>\n</div>\n</div>",
"requestedAt": "2026-01-07T21:30:00Z",
"requestId": "68403168-95b2-4bb3-8c60-62a70536cf9b",
"choices": [
{
"label": "It works!",
"value": "The interactive tabs and counter are working now! Great fix.",
"primary": true
},
{
"label": "Still not working",
"value": "The tabs and counter still don't work - let me share what I see in the browser console"
},
{
"label": "Update CLAUDE.md",
"value": "Update CLAUDE.md with the correct pattern for writing interactive kontask scripts"
}
]
},
"createdBy": "claude",
"createdAt": "2026-01-06T23:33:23.079Z",
"updatedAt": "2026-01-06T23:33:23.323Z",
"requestId": "68403168-95b2-4bb3-8c60-62a70536cf9b",
"scope": "vibetools",
"tags": [
"kontasks",
"ui",
"javascript",
"fix"
],
"targetUser": "claude"
}