{"_id":"@andymcloid/trakk","_rev":"6-cfdc39903b2f0b2131ab25929838d93a","name":"@andymcloid/trakk","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"@andymcloid/trakk","version":"1.0.0","keywords":["timeline","timeline-editor","editor","web-component","animation","video","video-editor","audio","sequencer","keyframe","track","clip","gantt","time","range","vanilla-js","no-dependencies","zero-dependencies","lightweight"],"author":"","license":"MIT","_id":"@andymcloid/trakk@1.0.0","maintainers":[{"name":"andymcloid","email":"andreas@sidcom.se"}],"homepage":"https://github.com/Sidcom-AB/trakk#readme","bugs":{"url":"https://github.com/Sidcom-AB/trakk/issues"},"dist":{"shasum":"5fdd0f388a3ae1f27991db79dae96a8efa575b2e","tarball":"https://registry.npmjs.org/@andymcloid/trakk/-/trakk-1.0.0.tgz","fileCount":12,"integrity":"sha512-UmfPZwQrLw5oBkH4CvBz+Cixd1KPZkK6ADodYpe4VhomLU9ycUhO3NPWmnbieO/P3eQhHM6BYBfEz4McyEeGGw==","signatures":[{"sig":"MEQCIBAvpwSg9ZsgN4QHBBbg5eybeR4mNfNf4B40quRy66vqAiBVolCDRAtqTluuVuY0721SrQGbWl0tALMKtkMu0u+E1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@andymcloid%2ftrakk@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":362221},"main":"dist/trakk.js","type":"module","style":"dist/trakk.css","module":"dist/trakk.esm.js","exports":{".":{"import":"./dist/trakk.esm.js","require":"./dist/trakk.js"},"./css":"./dist/trakk.css"},"gitHead":"63dda2f0360f488d350bb4f91c35eeb77cb8fc09","scripts":{"dev":"rollup -c -w","build":"npm run build:js && npm run build:css","build:js":"rollup -c","build:css":"node scripts/build-css.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"andymcloid","email":"andreas@sidcom.se"},"repository":{"url":"git+https://github.com/Sidcom-AB/trakk.git","type":"git"},"_npmVersion":"10.8.2","description":"Lightweight timeline editor web component for animations, video editing, and sequencing. Zero dependencies.","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.9.0","clean-css":"^5.3.3","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/trakk_1.0.0_1768567983970_0.7053490086951719","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@andymcloid/trakk","version":"1.0.1","keywords":["timeline","timeline-editor","editor","web-component","animation","video","video-editor","audio","sequencer","keyframe","track","clip","gantt","time","range","vanilla-js","no-dependencies","zero-dependencies","lightweight"],"author":"","license":"MIT","_id":"@andymcloid/trakk@1.0.1","maintainers":[{"name":"andymcloid","email":"andreas@sidcom.se"}],"homepage":"https://github.com/Sidcom-AB/trakk#readme","bugs":{"url":"https://github.com/Sidcom-AB/trakk/issues"},"dist":{"shasum":"a802e91bcbb6ff1ef47ca8f20723fc900cf1bd04","tarball":"https://registry.npmjs.org/@andymcloid/trakk/-/trakk-1.0.1.tgz","fileCount":12,"integrity":"sha512-D32dLP9+9/lRXZikKnKV75CIYvm/cSeZBCADZtCqGX9n2hqiSuhS51zmIbPYklPM/SUdAwxonLyvAghctqZvqg==","signatures":[{"sig":"MEUCIBKfejVRI1y+z/WgVvH4OAqFvd8Wxobp+imhS+T8RdKyAiEA7i5JBbfCVKEhPBW7BeJeadTN+yqDr5XLNF1b7yRscfA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@andymcloid%2ftrakk@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":362358},"main":"dist/trakk.js","type":"module","style":"dist/trakk.css","module":"dist/trakk.esm.js","exports":{".":{"import":"./dist/trakk.esm.js","require":"./dist/trakk.js"},"./css":"./dist/trakk.css"},"gitHead":"f0d8cef21ec3a8a452bbce035a190031b31d7709","scripts":{"dev":"rollup -c -w","build":"npm run build:js && npm run build:css","build:js":"rollup -c","build:css":"node scripts/build-css.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"andymcloid","email":"andreas@sidcom.se"},"repository":{"url":"git+https://github.com/Sidcom-AB/trakk.git","type":"git"},"_npmVersion":"10.8.2","description":"Lightweight timeline editor web component for animations, video editing, and sequencing. Zero dependencies.","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.9.0","clean-css":"^5.3.3","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/trakk_1.0.1_1768575370242_0.5110141246153193","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@andymcloid/trakk","version":"1.0.2","keywords":["timeline","timeline-editor","editor","web-component","animation","video","video-editor","audio","sequencer","keyframe","track","clip","gantt","time","range","vanilla-js","no-dependencies","zero-dependencies","lightweight"],"author":"","license":"MIT","_id":"@andymcloid/trakk@1.0.2","maintainers":[{"name":"andymcloid","email":"andreas@sidcom.se"}],"homepage":"https://github.com/Sidcom-AB/trakk#readme","bugs":{"url":"https://github.com/Sidcom-AB/trakk/issues"},"dist":{"shasum":"320752ff28cc8b9d976c5529dec1fdd8a5284a28","tarball":"https://registry.npmjs.org/@andymcloid/trakk/-/trakk-1.0.2.tgz","fileCount":12,"integrity":"sha512-ygcK7+lAsqa/A7rMeS1SZEL02uos2OiMjNAW/VwDOcyx2cO1VKrP1sLQq99UptWyawRGM4NEiCeWitTalhUiGg==","signatures":[{"sig":"MEQCIFnzdYuDcq+Z//G/Hee+sSdz5dpag721JQN/xwmla1XGAiAymEQ4FTrRbxoVegmxYp/3fN2oTZ9BHqVsorWw1OcAXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@andymcloid%2ftrakk@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":393443},"main":"dist/trakk.js","type":"module","style":"dist/trakk.css","module":"dist/trakk.esm.js","exports":{".":{"import":"./dist/trakk.esm.js","require":"./dist/trakk.js"},"./css":"./dist/trakk.css"},"gitHead":"5a0fefc0352730f38462f824df171623f3929deb","scripts":{"dev":"rollup -c -w","build":"npm run build:js && npm run build:css","build:js":"rollup -c","build:css":"node scripts/build-css.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"andymcloid","email":"andreas@sidcom.se"},"repository":{"url":"git+https://github.com/Sidcom-AB/trakk.git","type":"git"},"_npmVersion":"10.8.2","description":"Lightweight timeline editor web component for animations, video editing, and sequencing. Zero dependencies.","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.9.0","clean-css":"^5.3.3","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/trakk_1.0.2_1768580082228_0.3966366119057616","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@andymcloid/trakk","version":"1.0.3","keywords":["timeline","timeline-editor","editor","web-component","animation","video","video-editor","audio","sequencer","keyframe","track","clip","gantt","time","range","vanilla-js","no-dependencies","zero-dependencies","lightweight"],"author":"","license":"MIT","_id":"@andymcloid/trakk@1.0.3","maintainers":[{"name":"andymcloid","email":"andreas@sidcom.se"}],"homepage":"https://github.com/Sidcom-AB/trakk#readme","bugs":{"url":"https://github.com/Sidcom-AB/trakk/issues"},"dist":{"shasum":"9a7e44e4f2cd5336bc09716081208ac542d9a5e8","tarball":"https://registry.npmjs.org/@andymcloid/trakk/-/trakk-1.0.3.tgz","fileCount":12,"integrity":"sha512-ere/ycVoD0UZL16/rVZnzwM6vMOs3FB85BMiWWlgdr+0lMyRU4/g0DIUkc2I2BfppYPd69l1fC8CLmve6K3QGA==","signatures":[{"sig":"MEQCIG/FBgdFb3ysV867VQEptZHVNZ1x4mOoP1EsUPH+oOutAiAwsgALIKQHjnWLO5PuVeFNy8dvO8sWHO4UA7nUzOdjyw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@andymcloid%2ftrakk@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":393914},"main":"dist/trakk.js","type":"module","style":"dist/trakk.css","module":"dist/trakk.esm.js","exports":{".":{"import":"./dist/trakk.esm.js","require":"./dist/trakk.js"},"./css":"./dist/trakk.css"},"gitHead":"320d1f7a3f93719c885d64b656f1b5cd1f71c491","scripts":{"dev":"rollup -c -w","build":"npm run build:js && npm run build:css","build:js":"rollup -c","build:css":"node scripts/build-css.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"andymcloid","email":"andreas@sidcom.se"},"repository":{"url":"git+https://github.com/Sidcom-AB/trakk.git","type":"git"},"_npmVersion":"10.8.2","description":"Lightweight timeline editor web component for animations, video editing, and sequencing. Zero dependencies.","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.9.0","clean-css":"^5.3.3","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/trakk_1.0.3_1768769530471_0.09315681039022894","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@andymcloid/trakk","version":"1.0.4","keywords":["timeline","timeline-editor","editor","web-component","animation","video","video-editor","audio","sequencer","keyframe","track","clip","gantt","time","range","vanilla-js","no-dependencies","zero-dependencies","lightweight"],"author":"","license":"MIT","_id":"@andymcloid/trakk@1.0.4","maintainers":[{"name":"andymcloid","email":"andreas@sidcom.se"}],"homepage":"https://github.com/Sidcom-AB/trakk#readme","bugs":{"url":"https://github.com/Sidcom-AB/trakk/issues"},"dist":{"shasum":"ce3a389af8ce7ca10de4887ddf0a153894dd4dbe","tarball":"https://registry.npmjs.org/@andymcloid/trakk/-/trakk-1.0.4.tgz","fileCount":12,"integrity":"sha512-JEJO29SSAMi8rIBPdD82LEd6TdhprH1R+xJm/hqOWaQ9yFIKt+no9OkcDbzbGTB26COhmqWN2+1Z56+JrXvFxw==","signatures":[{"sig":"MEQCIBcKH1HryoJzqwXEJryL30OmgUFz107pLD1ncSTSDND4AiBDG7hUBEcquXCs5hBLHN7fucS37bYB37uiMtHU/nXhKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@andymcloid%2ftrakk@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":396985},"main":"dist/trakk.js","type":"module","style":"dist/trakk.css","module":"dist/trakk.esm.js","exports":{".":{"import":"./dist/trakk.esm.js","require":"./dist/trakk.js"},"./css":"./dist/trakk.css"},"gitHead":"2787a54aabedb883bab0c559dd42be85af0b22e7","scripts":{"dev":"rollup -c -w","build":"npm run build:js && npm run build:css","build:js":"rollup -c","build:css":"node scripts/build-css.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"andymcloid","email":"andreas@sidcom.se"},"repository":{"url":"git+https://github.com/Sidcom-AB/trakk.git","type":"git"},"_npmVersion":"10.8.2","description":"Lightweight timeline editor web component for animations, video editing, and sequencing. Zero dependencies.","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.9.0","clean-css":"^5.3.3","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/trakk_1.0.4_1768781803192_0.09027919802866835","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@andymcloid/trakk","version":"1.0.5","description":"Lightweight timeline editor web component for animations, video editing, and sequencing. Zero dependencies.","type":"module","main":"dist/trakk.js","module":"dist/trakk.esm.js","style":"dist/trakk.css","exports":{".":{"import":"./dist/trakk.esm.js","require":"./dist/trakk.js"},"./css":"./dist/trakk.css"},"scripts":{"build":"npm run build:js && npm run build:css","build:js":"rollup -c","build:css":"node scripts/build-css.js","dev":"rollup -c -w","prepublishOnly":"npm run build"},"keywords":["timeline","timeline-editor","editor","web-component","animation","video","video-editor","audio","sequencer","keyframe","track","clip","gantt","time","range","vanilla-js","no-dependencies","zero-dependencies","lightweight"],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/Sidcom-AB/trakk.git"},"bugs":{"url":"https://github.com/Sidcom-AB/trakk/issues"},"homepage":"https://github.com/Sidcom-AB/trakk#readme","devDependencies":{"@rollup/plugin-terser":"^0.4.4","clean-css":"^5.3.3","rollup":"^4.9.0"},"_id":"@andymcloid/trakk@1.0.5","gitHead":"7f94bb974681562ccb0be18848cc4641a55a895e","_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-E1U7PI5UQhOjJcU/nmFJFLsOM/35woRbzHq3C0+ssCKPkViNPu5D2u6Qfv9nEW0x3/Y22syPzFyaPsVMQ29uDw==","shasum":"aa86c636c7c08447fa6df3e7faaf3e86fa409c64","tarball":"https://registry.npmjs.org/@andymcloid/trakk/-/trakk-1.0.5.tgz","fileCount":12,"unpackedSize":389126,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@andymcloid%2ftrakk@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBJJK1eUYzHdVuxkNuOwSSHRLrbwpff/PP8sUXgQFssCAiBqotC0Kqw7CEn0rcTJKhaZExFjRztmTOX34lFTq4/Enw=="}]},"_npmUser":{"name":"andymcloid","email":"andreas@sidcom.se"},"directories":{},"maintainers":[{"name":"andymcloid","email":"andreas@sidcom.se"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/trakk_1.0.5_1768782250672_0.7889286765914918"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-16T12:53:03.899Z","modified":"2026-01-19T00:24:11.428Z","1.0.0":"2026-01-16T12:53:04.113Z","1.0.1":"2026-01-16T14:56:10.436Z","1.0.2":"2026-01-16T16:14:42.381Z","1.0.3":"2026-01-18T20:52:10.667Z","1.0.4":"2026-01-19T00:16:43.345Z","1.0.5":"2026-01-19T00:24:10.853Z"},"bugs":{"url":"https://github.com/Sidcom-AB/trakk/issues"},"license":"MIT","homepage":"https://github.com/Sidcom-AB/trakk#readme","keywords":["timeline","timeline-editor","editor","web-component","animation","video","video-editor","audio","sequencer","keyframe","track","clip","gantt","time","range","vanilla-js","no-dependencies","zero-dependencies","lightweight"],"repository":{"type":"git","url":"git+https://github.com/Sidcom-AB/trakk.git"},"description":"Lightweight timeline editor web component for animations, video editing, and sequencing. Zero dependencies.","maintainers":[{"name":"andymcloid","email":"andreas@sidcom.se"}],"readme":"<p align=\"center\">\n  <img src=\"assets/logo.svg\" alt=\"trakk\" width=\"320\">\n</p>\n\n<p align=\"center\">\n  <strong>Lightweight timeline editor web component</strong><br>\n  Zero dependencies. Works everywhere.\n</p>\n\n<p align=\"center\">\n  <a href=\"#installation\">Installation</a> •\n  <a href=\"#usage\">Usage</a> •\n  <a href=\"#api\">API</a> •\n  <a href=\"#events\">Events</a> •\n  <a href=\"#styling\">Styling</a> •\n  <a href=\"#demo\">Demo</a>\n</p>\n\n<p align=\"center\">\n  <img src=\"assets/demo.gif\" alt=\"trakk demo\" width=\"700\">\n</p>\n\n---\n\n## What is it?\n\nA timeline editor for building animation tools, video editors, audio sequencers, or anything that needs time-based sequencing. Built as a native Web Component with zero dependencies.\n\n## Installation\n\n```bash\nnpm install @andymcloid/trakk\n```\n\nOr use directly via CDN:\n\n```html\n<script type=\"module\" src=\"https://unpkg.com/@andymcloid/trakk/dist/trakk.esm.js\"></script>\n<link rel=\"stylesheet\" href=\"https://unpkg.com/@andymcloid/trakk/dist/trakk.css\">\n```\n\n## Usage\n\n```html\n<trakk-editor id=\"timeline\"></trakk-editor>\n\n<script type=\"module\">\n  import { Trakk } from '@andymcloid/trakk';\n  import '@andymcloid/trakk/css';\n\n  const timeline = document.getElementById('timeline');\n\n  timeline.setData([\n    {\n      id: 'track-1',\n      name: 'Audio',\n      blocks: [\n        { id: 'block-1', name: 'Intro', start: 0, end: 5 },\n        { id: 'block-2', name: 'Main', start: 6, end: 15 }\n      ]\n    },\n    {\n      id: 'track-2',\n      name: 'Video',\n      blocks: [\n        { id: 'block-3', name: 'Scene 1', start: 0, end: 10 }\n      ]\n    }\n  ]);\n\n  // Play/pause\n  timeline.play({ autoEnd: true });\n  timeline.pause();\n\n  // Listen for changes\n  timeline.addEventListener('change', (e) => {\n    console.log('Updated:', e.detail.tracks);\n  });\n</script>\n```\n\n## API\n\n### Methods\n\n| Method | Description |\n|--------|-------------|\n| `setData(tracks)` | Set timeline data |\n| `play(options?)` | Start playback. Options: `{ autoEnd: boolean, toTime: number }` |\n| `pause()` | Pause playback |\n| `setTime(time)` | Set current time position |\n| `getTime()` | Get current time |\n| `getTotalTime()` | Get total duration (end of last block) |\n| `setConfig(config)` | Update configuration |\n| `selectAction(action, row?)` | Select a block programmatically |\n| `deselectAction()` | Clear the current selection |\n| `getSelectedAction()` | Get currently selected block `{ action, row }` or `null` |\n| `saveToLocalStorage(key?)` | Save to localStorage |\n| `loadFromLocalStorage(key?)` | Load from localStorage |\n\n### Configuration\n\n```javascript\ntimeline.setConfig({\n  scale: 1,              // Seconds per scale unit\n  scaleWidth: 160,       // Pixels per scale unit\n  scaleCount: 20,        // Number of scale units\n  startLeft: 100,        // Left margin (label column width)\n  rowHeight: 32,         // Track height in pixels\n  autoScroll: true,      // Auto-scroll during playback\n  hideCursor: false,     // Hide playhead cursor\n  disableDrag: false,    // Disable all dragging\n  allowOverlap: false    // Allow blocks to overlap (default: false)\n});\n```\n\n### Data Structure\n\n```typescript\ninterface Track {\n  id: string;\n  name?: string;\n  locked?: boolean;      // Prevent editing\n  blocks: Block[];\n}\n\ninterface Block {\n  id: string;\n  name?: string;\n  start: number;         // Start time in seconds\n  end: number;           // End time in seconds\n  locked?: boolean;      // Prevent editing this block\n}\n```\n\n## Events\n\n```javascript\n// Data changed (drag, resize, create, delete)\ntimeline.addEventListener('change', (e) => {\n  console.log(e.detail.tracks);\n});\n\n// New block created via drag\ntimeline.addEventListener('itemcreated', (e) => {\n  console.log(e.detail.item, e.detail.row);\n});\n\n// Block deleted\ntimeline.addEventListener('blockdeleted', (e) => {\n  console.log(e.detail.block, e.detail.track);\n});\n\n// Track deleted\ntimeline.addEventListener('trackdeleted', (e) => {\n  console.log(e.detail.track);\n});\n\n// Block selected/deselected\ntimeline.addEventListener('select', (e) => {\n  if (e.detail) {\n    console.log('Selected:', e.detail.action, 'in track:', e.detail.row);\n  } else {\n    console.log('Selection cleared');\n  }\n});\n\n// Track/block renamed (double-click to edit)\ntimeline.addEventListener('trackrenamed', (e) => {\n  console.log(e.detail.track, e.detail.name);\n});\n\ntimeline.addEventListener('blockrenamed', (e) => {\n  console.log(e.detail.block, e.detail.name);\n});\n```\n\n### Engine Events\n\nAccess the playback engine directly:\n\n```javascript\ntimeline.engine.on('play', () => console.log('Playing'));\ntimeline.engine.on('paused', () => console.log('Paused'));\ntimeline.engine.on('ended', () => console.log('Ended'));\n\ntimeline.engine.on('setTimeByTick', ({ time }) => {\n  // Called every frame during playback\n  console.log('Current time:', time);\n});\n```\n\n## Callbacks\n\nFor advanced control over interactions:\n\n```javascript\ntimeline.setCallbacks({\n  // Custom rendering\n  getActionRender: (block, track) => `<b>${block.name}</b>`,\n  getScaleRender: (time) => `${time.toFixed(1)}s`,\n\n  // Interaction hooks (return false to cancel)\n  onActionMoving: ({ action, start, end }) => {\n    if (start < 0) return false; // Prevent moving before 0\n  },\n  onActionResizing: ({ action, start, end }) => {\n    if (end - start < 0.5) return false; // Minimum 0.5s duration\n  },\n\n  // Click handlers (button: 0=left, 1=middle, 2=right)\n  onClickAction: (e, { action, row, time, button }) => {},\n  onDoubleClickAction: (e, { action, row, time }) => {},\n  onContextMenuAction: (e, { action, row, time, button }) => {\n    // Right-click on block - show custom context menu\n  },\n  onClickRow: (e, { row, time }) => {},\n  onClickTimeArea: (e, { time }) => {}\n});\n```\n\n## Styling\n\nCustomize Trakk's appearance using CSS custom properties:\n\n```css\ntrakk-editor {\n  /* Core colors */\n  --trakk-bg: #191b1d;           /* Background color */\n  --trakk-text: #ffffff;         /* Text color */\n  --trakk-accent: #5297FF;       /* Accent color (cursor, selection border) */\n\n  /* Block colors */\n  --trakk-block-bg: #2f3134;           /* Block background */\n  --trakk-block-bg-hover: #3a3d40;     /* Block hover state */\n  --trakk-block-bg-selected: #4a7ba7;  /* Selected block background */\n\n  /* Borders */\n  --trakk-border: rgba(255, 255, 255, 0.1);        /* Subtle borders */\n  --trakk-border-strong: rgba(255, 255, 255, 0.3); /* Prominent borders */\n\n  /* Text variations */\n  --trakk-text-muted: rgba(255, 255, 255, 0.6);  /* Secondary text */\n  --trakk-text-subtle: rgba(255, 255, 255, 0.4); /* Subtle text/icons */\n\n  /* State */\n  --trakk-danger: #ff6464;       /* Delete button hover */\n  --trakk-disabled-opacity: 0.6; /* Disabled elements */\n  --trakk-locked-opacity: 0.7;   /* Locked elements */\n}\n```\n\n### Light Theme Example\n\n```css\ntrakk-editor.light {\n  --trakk-bg: #f5f5f5;\n  --trakk-text: #1a1a1a;\n  --trakk-accent: #0066cc;\n  --trakk-block-bg: #e0e0e0;\n  --trakk-block-bg-hover: #d0d0d0;\n  --trakk-block-bg-selected: #b3d4fc;\n  --trakk-border: rgba(0, 0, 0, 0.1);\n  --trakk-border-strong: rgba(0, 0, 0, 0.2);\n  --trakk-text-muted: rgba(0, 0, 0, 0.6);\n  --trakk-text-subtle: rgba(0, 0, 0, 0.4);\n}\n```\n\n## Demo\n\nOpen `demo.html` in a browser or check out the [live demo](https://sidcom-ab.github.io/trakk).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}