annotask 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -0
- package/dist/chunk-2TUWBFQG.js +882 -0
- package/dist/chunk-2TUWBFQG.js.map +1 -0
- package/dist/chunk-3VLTLTEO.js +53 -0
- package/dist/chunk-3VLTLTEO.js.map +1 -0
- package/dist/chunk-53D2PE43.js +105 -0
- package/dist/chunk-53D2PE43.js.map +1 -0
- package/dist/chunk-6UQW2W7S.js +358 -0
- package/dist/chunk-6UQW2W7S.js.map +1 -0
- package/dist/chunk-6VYCY34B.js +848 -0
- package/dist/chunk-6VYCY34B.js.map +1 -0
- package/dist/chunk-B7IKW7UB.js +792 -0
- package/dist/chunk-B7IKW7UB.js.map +1 -0
- package/dist/chunk-BDMOC2BG.js +794 -0
- package/dist/chunk-BDMOC2BG.js.map +1 -0
- package/dist/chunk-CFBRU3DQ.js +332 -0
- package/dist/chunk-CFBRU3DQ.js.map +1 -0
- package/dist/chunk-CWA33RDQ.js +21 -0
- package/dist/chunk-CWA33RDQ.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-EAT6V4LF.js +358 -0
- package/dist/chunk-EAT6V4LF.js.map +1 -0
- package/dist/chunk-FBXNRXMY.js +849 -0
- package/dist/chunk-FBXNRXMY.js.map +1 -0
- package/dist/chunk-LKRKKLOT.js +61 -0
- package/dist/chunk-LKRKKLOT.js.map +1 -0
- package/dist/chunk-STOP7QF3.js +61 -0
- package/dist/chunk-STOP7QF3.js.map +1 -0
- package/dist/chunk-T6TKVAAA.js +332 -0
- package/dist/chunk-T6TKVAAA.js.map +1 -0
- package/dist/chunk-VCC7UV6G.js +291 -0
- package/dist/chunk-VCC7UV6G.js.map +1 -0
- package/dist/chunk-XR26XVHT.js +21 -0
- package/dist/chunk-XR26XVHT.js.map +1 -0
- package/dist/chunk-XZNNRBUW.js +311 -0
- package/dist/chunk-XZNNRBUW.js.map +1 -0
- package/dist/cli.js +248 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +50 -0
- package/dist/server.js +15 -0
- package/dist/server.js.map +1 -0
- package/dist/shell/assets/index-BD3nZNWX.js +59 -0
- package/dist/shell/assets/index-DwbhEo-C.css +1 -0
- package/dist/shell/index.html +13 -0
- package/dist/standalone.d.ts +10 -0
- package/dist/standalone.js +9 -0
- package/dist/standalone.js.map +1 -0
- package/dist/webpack-loader.d.ts +3 -0
- package/dist/webpack-loader.js +59 -0
- package/dist/webpack-loader.js.map +1 -0
- package/dist/webpack.d.ts +11 -0
- package/dist/webpack.js +63 -0
- package/dist/webpack.js.map +1 -0
- package/package.json +78 -0
- package/skills/annotask-apply/SKILL.md +133 -0
- package/skills/annotask-init/SKILL.md +230 -0
- package/skills/annotask-watch/SKILL.md +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.control-row[data-v-548da941]{margin-bottom:10px}.control-label[data-v-548da941]{display:block;font-size:11px;color:var(--text-muted);margin-bottom:4px;text-transform:uppercase;letter-spacing:.04em}.button-group[data-v-548da941]{display:flex;gap:2px}.seg-btn[data-v-548da941]{flex:1;padding:4px 6px;font-size:10px;background:var(--bg);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all .1s;white-space:nowrap}.seg-btn[data-v-548da941]:first-child{border-radius:5px 0 0 5px}.seg-btn[data-v-548da941]:last-child{border-radius:0 5px 5px 0}.seg-btn[data-v-548da941]:hover{background:var(--surface-2);color:var(--text)}.seg-btn.active[data-v-548da941]{background:var(--accent);border-color:var(--accent);color:#fff}.icon-btn[data-v-548da941]{font-size:14px;padding:4px 8px}.num-input-group[data-v-548da941]{display:flex;align-items:center;gap:8px}.range-input[data-v-548da941]{flex:1;accent-color:var(--accent);height:4px}.num-value[data-v-548da941]{font-size:11px;color:var(--text);font-variant-numeric:tabular-nums;min-width:36px;text-align:right}.box-model[data-v-e06fb04c]{display:flex;justify-content:center}.margin-box[data-v-e06fb04c],.padding-box[data-v-e06fb04c]{position:relative;display:flex;align-items:center;justify-content:center}.margin-box[data-v-e06fb04c]{padding:20px 28px;background:#f9731614;border:1px dashed rgba(249,115,22,.3);border-radius:6px;min-width:220px}.padding-box[data-v-e06fb04c]{padding:18px 24px;background:#22c55e14;border:1px dashed rgba(34,197,94,.3);border-radius:4px;width:100%}.content-box[data-v-e06fb04c]{padding:8px 12px;background:var(--accent);border-radius:3px;color:#fff;font-size:10px;font-weight:600;text-align:center;white-space:nowrap}.box-label[data-v-e06fb04c]{position:absolute;font-size:9px;text-transform:uppercase;letter-spacing:.05em;opacity:.6}.margin-label[data-v-e06fb04c]{top:3px;left:6px;color:#f97316}.padding-label[data-v-e06fb04c]{top:2px;left:5px;color:#22c55e}.side-input[data-v-e06fb04c]{position:absolute;width:28px;padding:1px 2px;font-size:10px;text-align:center;background:transparent;border:1px solid transparent;border-radius:3px;color:var(--text);font-variant-numeric:tabular-nums;outline:none}.side-input[data-v-e06fb04c]:hover{border-color:var(--border);background:var(--bg)}.side-input[data-v-e06fb04c]:focus{border-color:var(--accent);background:var(--bg)}.margin-box>.side-input.top[data-v-e06fb04c]{top:2px;left:50%;transform:translate(-50%)}.margin-box>.side-input.bottom[data-v-e06fb04c]{bottom:2px;left:50%;transform:translate(-50%)}.margin-box>.side-input.left[data-v-e06fb04c]{left:2px;top:50%;transform:translateY(-50%)}.margin-box>.side-input.right[data-v-e06fb04c]{right:2px;top:50%;transform:translateY(-50%)}.padding-box>.side-input.top[data-v-e06fb04c]{top:1px;left:50%;transform:translate(-50%)}.padding-box>.side-input.bottom[data-v-e06fb04c]{bottom:1px;left:50%;transform:translate(-50%)}.padding-box>.side-input.left[data-v-e06fb04c]{left:2px;top:50%;transform:translateY(-50%)}.padding-box>.side-input.right[data-v-e06fb04c]{right:2px;top:50%;transform:translateY(-50%)}.size-row[data-v-c3ca7e31]{display:flex;gap:8px;margin-bottom:10px}.size-field[data-v-c3ca7e31]{flex:1}.control-row[data-v-c3ca7e31]{margin-bottom:10px}.control-label[data-v-c3ca7e31]{display:block;font-size:11px;color:var(--text-muted);margin-bottom:4px;text-transform:uppercase;letter-spacing:.04em}.size-input-group[data-v-c3ca7e31]{display:flex;align-items:center}.size-input[data-v-c3ca7e31]{width:100%;padding:5px 6px;background:var(--bg);border:1px solid var(--border);border-radius:5px 0 0 5px;color:var(--text);font-size:12px;font-variant-numeric:tabular-nums;outline:none}.size-input[data-v-c3ca7e31]:focus{border-color:var(--accent)}.size-unit[data-v-c3ca7e31]{padding:5px 6px;background:var(--surface-2);border:1px solid var(--border);border-left:none;border-radius:0 5px 5px 0;font-size:10px;color:var(--text-muted)}.button-group[data-v-c3ca7e31]{display:flex;gap:2px}.seg-btn[data-v-c3ca7e31]{flex:1;padding:4px;font-size:10px;background:var(--bg);border:1px solid var(--border);color:var(--text-muted);cursor:pointer}.seg-btn[data-v-c3ca7e31]:first-child{border-radius:5px 0 0 5px}.seg-btn[data-v-c3ca7e31]:last-child{border-radius:0 5px 5px 0}.seg-btn[data-v-c3ca7e31]:hover{background:var(--surface-2);color:var(--text)}.seg-btn.active[data-v-c3ca7e31]{background:var(--accent);border-color:var(--accent);color:#fff}.color-palette-picker[data-v-b0ade670]{position:relative}.picker-trigger[data-v-b0ade670]{display:flex;align-items:center;gap:6px}.color-swatch[data-v-b0ade670]{width:28px;height:28px;border:2px solid var(--border);border-radius:6px;cursor:pointer;padding:0;background:none}.color-swatch[data-v-b0ade670]::-webkit-color-swatch-wrapper{padding:0}.color-swatch[data-v-b0ade670]::-webkit-color-swatch{border:none;border-radius:4px}.palette-btn[data-v-b0ade670]{width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:var(--surface-2);border:1px solid var(--border);border-radius:5px;color:var(--text-muted);cursor:pointer;transition:all .1s}.palette-btn[data-v-b0ade670]:hover,.palette-btn.active[data-v-b0ade670]{background:var(--border);color:var(--text)}.color-match[data-v-b0ade670]{font-size:9px;color:var(--accent);font-family:SF Mono,Fira Code,monospace}.palette-popover[data-v-b0ade670]{position:absolute;top:100%;left:0;margin-top:6px;width:280px;background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #00000080;z-index:200;overflow:hidden}.palette-tabs[data-v-b0ade670]{display:flex;border-bottom:1px solid var(--border)}.ptab[data-v-b0ade670]{flex:1;padding:6px 4px;font-size:10px;font-weight:500;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;transition:all .15s}.ptab[data-v-b0ade670]:hover{color:var(--text)}.ptab.active[data-v-b0ade670]{color:var(--accent);border-bottom-color:var(--accent)}.palette-body[data-v-b0ade670]{max-height:320px;overflow-y:auto;padding:8px}.color-family[data-v-b0ade670]{display:flex;align-items:center;gap:6px;margin-bottom:3px}.family-label[data-v-b0ade670]{font-size:8px;color:var(--text-muted);width:40px;flex-shrink:0;text-align:right;text-transform:lowercase}.swatch-row[data-v-b0ade670]{display:flex;gap:2px}.swatch[data-v-b0ade670]{width:18px;height:18px;border:1px solid rgba(255,255,255,.08);border-radius:3px;cursor:pointer;padding:0;transition:transform .1s}.swatch[data-v-b0ade670]:hover{transform:scale(1.25);z-index:1;border-color:var(--text)}.swatch.selected[data-v-b0ade670]{outline:2px solid var(--accent);outline-offset:1px}.swatch.large[data-v-b0ade670]{width:24px;height:24px;border-radius:4px}.var-grid[data-v-b0ade670]{display:flex;flex-direction:column;gap:2px}.var-swatch[data-v-b0ade670]{display:flex;align-items:center;gap:8px;padding:5px 6px;background:none;border:1px solid transparent;border-radius:6px;cursor:pointer;transition:all .1s}.var-swatch[data-v-b0ade670]:hover{background:var(--surface-2);border-color:var(--border)}.var-swatch.selected[data-v-b0ade670]{border-color:var(--accent)}.var-color[data-v-b0ade670]{width:18px;height:18px;border-radius:4px;flex-shrink:0;border:1px solid rgba(255,255,255,.08)}.var-name[data-v-b0ade670]{font-size:11px;color:var(--text);font-family:SF Mono,Fira Code,monospace;flex:1;text-align:left}.var-hex[data-v-b0ade670]{font-size:9px;color:var(--text-muted);font-family:SF Mono,Fira Code,monospace}.swatch-grid[data-v-b0ade670]{display:flex;flex-wrap:wrap;gap:4px}.empty-msg[data-v-b0ade670]{font-size:11px;color:var(--text-muted);text-align:center;padding:20px 0}.control-row[data-v-47449e0a]{margin-bottom:10px}.control-label[data-v-47449e0a]{display:block;font-size:11px;color:var(--text-muted);margin-bottom:4px;text-transform:uppercase;letter-spacing:.04em}.color-input-group[data-v-47449e0a]{display:flex;align-items:center;gap:8px}.color-value[data-v-47449e0a]{font-size:10px;color:var(--text-muted);font-family:SF Mono,Fira Code,monospace;overflow:hidden;text-overflow:ellipsis}.num-input-group[data-v-47449e0a]{display:flex;align-items:center;gap:8px}.range-input[data-v-47449e0a]{flex:1;accent-color:var(--accent);height:4px}.num-value[data-v-47449e0a]{font-size:11px;color:var(--text);font-variant-numeric:tabular-nums;min-width:36px;text-align:right}.button-group[data-v-47449e0a]{display:flex;gap:1px}.seg-btn[data-v-47449e0a]{flex:1;padding:4px 2px;font-size:9px;background:var(--bg);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all .1s}.seg-btn[data-v-47449e0a]:first-child{border-radius:5px 0 0 5px}.seg-btn[data-v-47449e0a]:last-child{border-radius:0 5px 5px 0}.seg-btn[data-v-47449e0a]:hover{background:var(--surface-2);color:var(--text)}.seg-btn.active[data-v-47449e0a]{background:var(--accent);border-color:var(--accent);color:#fff}.mode-toolbar[data-v-00eaacd4]{display:flex;gap:2px;margin-left:4px;align-items:center}.mode-btn[data-v-00eaacd4]{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:5px;background:var(--surface-2);color:var(--text-muted);cursor:pointer;transition:all .1s}.mode-btn[data-v-00eaacd4]:hover{background:var(--border);color:var(--text)}.mode-btn.active[data-v-00eaacd4]{background:var(--accent);border-color:var(--accent);color:#fff}.mode-btn.mode-interact.active[data-v-00eaacd4]{background:#6366f1;border-color:#6366f1}.mode-btn.arrow.active[data-v-00eaacd4]{background:#ef4444;border-color:#ef4444}.mode-btn.draw.active[data-v-00eaacd4]{background:#22c55e;border-color:#22c55e}.mode-btn.mode-highlight.active[data-v-00eaacd4]{background:#f59e0b;border-color:#f59e0b}.mode-sep[data-v-00eaacd4]{width:1px;height:18px;background:var(--border);margin:0 2px;align-self:center}.context-menu[data-v-b4795b28]{position:fixed;z-index:20000;min-width:160px;background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #00000080;padding:4px;overflow:hidden}.menu-item[data-v-b4795b28]{display:flex;align-items:center;justify-content:space-between;width:100%;padding:6px 12px;background:none;border:none;border-radius:5px;color:var(--text);font-size:12px;cursor:pointer;transition:background .1s}.menu-item[data-v-b4795b28]:hover:not(.disabled){background:var(--surface-2)}.menu-item.disabled[data-v-b4795b28]{color:var(--text-muted);cursor:not-allowed;opacity:.5}.item-shortcut[data-v-b4795b28]{font-size:10px;color:var(--text-muted);font-family:SF Mono,monospace}.separator[data-v-b4795b28]{height:1px;background:var(--border);margin:4px 8px}.pin[data-v-006ef709]{position:fixed;z-index:10003;width:22px;height:22px;border-radius:50%;background:#3b82f6;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transform:translate(-11px,-11px);box-shadow:0 2px 6px #0000004d;transition:all .15s;border:2px solid white}.pin[data-v-006ef709]:hover{transform:translate(-11px,-11px) scale(1.2)}.pin.selected[data-v-006ef709]{background:#2563eb;box-shadow:0 0 0 3px #3b82f64d,0 2px 6px #0000004d}.pin.has-action[data-v-006ef709]{background:#a855f7}.pin.has-note.has-action[data-v-006ef709]{background:#7c3aed}.pin-number[data-v-006ef709]{font-size:10px;font-weight:700}.pin-remove[data-v-006ef709]{position:absolute;top:-6px;right:-6px;width:14px;height:14px;border-radius:50%;background:var(--danger, #ef4444);color:#fff;border:1px solid white;font-size:10px;line-height:1;cursor:pointer;display:none;align-items:center;justify-content:center;padding:0}.pin:hover .pin-remove[data-v-006ef709]{display:flex}.arrow-svg[data-v-1d2c9ec9]{position:fixed;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:10003;pointer-events:none}.arrow-path[data-v-1d2c9ec9]{pointer-events:stroke;cursor:pointer}.arrow-label[data-v-1d2c9ec9]{font-size:10px;font-weight:600;fill:#ef4444;pointer-events:none;paint-order:stroke;stroke:#00000080;stroke-width:3px}.arrow-delete[data-v-1d2c9ec9]{cursor:pointer;pointer-events:auto}.section-preview[data-v-d10f1f9f]{position:fixed;z-index:10003;border:2px dashed #22c55e;background:#22c55e0f;border-radius:6px;pointer-events:none}.drawn-section[data-v-d10f1f9f]{position:fixed;z-index:10003;border:2px dashed #22c55e;background:#22c55e0a;border-radius:6px;display:flex;flex-direction:column;overflow:hidden;cursor:pointer;transition:border-color .15s}.drawn-section.selected[data-v-d10f1f9f]{border-color:#16a34a;box-shadow:0 0 0 2px #22c55e4d}.section-header[data-v-d10f1f9f]{display:flex;align-items:center;gap:6px;padding:4px 8px;background:#22c55e1a;border-bottom:1px solid rgba(34,197,94,.15)}.section-badge[data-v-d10f1f9f]{font-size:9px;font-weight:700;color:#16a34a}.section-placement[data-v-d10f1f9f]{font-size:8px;color:#22c55e;background:#22c55e1a;padding:1px 4px;border-radius:3px}.section-delete[data-v-d10f1f9f]{margin-left:auto;width:16px;height:16px;border:none;background:none;color:#22c55e;font-size:14px;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}.section-delete[data-v-d10f1f9f]:hover{color:#ef4444}.section-prompt[data-v-d10f1f9f]{flex:1;padding:6px 8px;border:none;background:transparent;color:#166534;font-size:11px;line-height:1.4;resize:none;outline:none;font-family:inherit;min-height:40px}.section-prompt[data-v-d10f1f9f]::placeholder{color:#16653466}.section-dims[data-v-d10f1f9f]{padding:2px 8px 4px;font-size:8px;color:#16653466;text-align:right}.notes-tab[data-v-66881614]{display:flex;flex-direction:column;gap:14px}.section-label[data-v-66881614]{display:block;font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);margin-bottom:6px}.action-grid[data-v-66881614]{display:flex;flex-wrap:wrap;gap:4px}.action-btn[data-v-66881614]{padding:4px 10px;font-size:11px;font-weight:500;background:var(--surface-2);border:1px solid var(--border);border-radius:5px;color:var(--text);cursor:pointer;transition:all .1s}.action-btn[data-v-66881614]:hover{background:var(--border);color:var(--accent);border-color:var(--accent)}.note-input[data-v-66881614]{width:100%;padding:8px;font-size:12px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);resize:vertical;outline:none;font-family:inherit}.note-input[data-v-66881614]:focus{border-color:var(--accent)}.submit-btn[data-v-66881614]{margin-top:4px;padding:5px 12px;font-size:11px;font-weight:600;background:var(--accent);color:#fff;border:none;border-radius:5px;cursor:pointer;transition:opacity .1s}.submit-btn[data-v-66881614]:disabled{opacity:.4;cursor:not-allowed}.submit-btn[data-v-66881614]:hover:not(:disabled){opacity:.9}.pin-item[data-v-66881614]{display:flex;align-items:flex-start;gap:8px;padding:6px 8px;border-radius:5px;cursor:pointer;transition:background .1s}.pin-item[data-v-66881614]:hover{background:var(--surface-2)}.pin-item.selected[data-v-66881614]{background:var(--surface-2);border:1px solid var(--accent)}.pin-badge[data-v-66881614]{width:18px;height:18px;border-radius:50%;background:#3b82f6;color:#fff;font-size:9px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}.pin-badge.action[data-v-66881614]{background:#a855f7}.pin-content[data-v-66881614]{flex:1;min-width:0}.pin-file[data-v-66881614]{font-size:10px;color:var(--accent);display:block;margin-bottom:2px}.pin-action[data-v-66881614]{font-size:10px;color:#a855f7;font-weight:600;display:block}.pin-note[data-v-66881614]{font-size:11px;color:var(--text);display:block;word-break:break-word}.pin-empty[data-v-66881614]{font-size:10px;color:var(--text-muted);font-style:italic}.pin-delete[data-v-66881614]{width:16px;height:16px;border-radius:50%;background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:12px;display:none;align-items:center;justify-content:center;padding:0}.pin-item:hover .pin-delete[data-v-66881614]{display:flex}.pin-delete[data-v-66881614]:hover{color:var(--danger, #ef4444)}.empty-hint[data-v-66881614]{font-size:11px;color:var(--text-muted);text-align:center;padding:12px 0}.task-review[data-v-66881614]{border-top:1px solid var(--border, #2a2a2a);padding-top:10px}.task-item[data-v-66881614]{padding:6px 8px;border-radius:5px;margin-bottom:4px;border:1px solid var(--border, #2a2a2a)}.task-item.review[data-v-66881614]{border-color:#f59e0b;background:#f59e0b0d}.task-item.denied[data-v-66881614]{border-color:#ef4444;background:#ef44440d}.task-item.pending[data-v-66881614]{border-color:var(--border, #2a2a2a)}.task-header[data-v-66881614]{display:flex;align-items:center;gap:6px;margin-bottom:3px}.task-status-badge[data-v-66881614]{font-size:8px;font-weight:700;padding:1px 5px;border-radius:3px;text-transform:uppercase}.task-status-badge.pending[data-v-66881614]{background:#71717a33;color:#71717a}.task-status-badge.review[data-v-66881614]{background:#f59e0b33;color:#f59e0b}.task-status-badge.denied[data-v-66881614]{background:#ef444433;color:#ef4444}.task-desc[data-v-66881614]{font-size:11px;color:var(--text, #e4e4e7)}.task-file[data-v-66881614]{font-size:9px;color:var(--text-muted, #71717a);display:block;margin-bottom:3px}.task-feedback[data-v-66881614]{font-size:10px;color:#ef4444;font-style:italic;margin-bottom:3px}.task-actions[data-v-66881614]{display:flex;gap:4px;align-items:center;margin-top:4px}.task-accept[data-v-66881614]{padding:4px 10px;font-size:10px;font-weight:600;background:#22c55e26;color:#22c55e;border:none;border-radius:4px;cursor:pointer;transition:all .12s}.task-accept[data-v-66881614]:hover{background:#22c55e;color:#fff}.task-deny[data-v-66881614]{padding:4px 10px;font-size:10px;font-weight:600;background:#ef44441f;color:#ef4444;border:none;border-radius:4px;cursor:pointer;transition:all .12s}.task-deny[data-v-66881614]:hover{background:#ef4444;color:#fff}.deny-input[data-v-66881614]{flex:1;padding:2px 6px;font-size:10px;background:var(--bg, #0a0a0a);border:1px solid var(--border);border-radius:4px;color:var(--text);outline:none}.task-cancel[data-v-66881614]{width:18px;height:18px;border:none;background:none;color:var(--text-muted, #71717a);font-size:14px;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;margin-left:auto;border-radius:3px}.task-cancel[data-v-66881614]:hover{color:#ef4444;background:#ef44441a}.highlight-prompt[data-v-b4a28a2c]{position:fixed;z-index:10005;background:var(--surface, #141414);border:1px solid #f59e0b;border-radius:8px;box-shadow:0 8px 24px #00000080;padding:8px;width:280px}.prompt-header[data-v-b4a28a2c]{margin-bottom:6px}.prompt-text-preview[data-v-b4a28a2c]{font-size:11px;color:#f59e0b;font-style:italic;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.prompt-input[data-v-b4a28a2c]{width:100%;padding:6px 8px;background:var(--bg, #0a0a0a);border:1px solid var(--border, #2a2a2a);border-radius:5px;color:var(--text, #e4e4e7);font-size:12px;outline:none}.prompt-input[data-v-b4a28a2c]:focus{border-color:#f59e0b}.prompt-hint[data-v-b4a28a2c]{font-size:9px;color:var(--text-muted, #71717a);margin-top:4px}.text-highlight-card[data-v-b4a28a2c]{position:relative;margin:4px 0;padding:6px 8px;background:#f59e0b14;border:1px solid rgba(245,158,11,.2);border-radius:6px;cursor:pointer}.text-highlight-card.selected[data-v-b4a28a2c]{border-color:#f59e0b}.hl-header[data-v-b4a28a2c]{display:flex;align-items:center;gap:6px;margin-bottom:3px}.hl-badge[data-v-b4a28a2c]{font-size:9px;font-weight:700;color:#f59e0b}.hl-file[data-v-b4a28a2c]{font-size:9px;color:var(--text-muted, #71717a)}.hl-delete[data-v-b4a28a2c]{margin-left:auto;width:14px;height:14px;border:none;background:none;color:var(--text-muted);font-size:12px;cursor:pointer;padding:0;display:none}.text-highlight-card:hover .hl-delete[data-v-b4a28a2c]{display:block}.hl-text[data-v-b4a28a2c]{font-size:11px;color:#f59e0b;font-style:italic;margin-bottom:2px}.hl-prompt[data-v-b4a28a2c]{font-size:11px;color:var(--text, #e4e4e7)}.hl-prompt-edit[data-v-b4a28a2c]{width:100%;margin-top:4px;padding:4px 6px;background:var(--bg, #0a0a0a);border:1px solid var(--border, #2a2a2a);border-radius:4px;color:var(--text);font-size:11px;outline:none}.hl-prompt-edit[data-v-b4a28a2c]:focus{border-color:#f59e0b}.layout-outline[data-v-ed4fb8a3]{position:fixed;pointer-events:none;z-index:9998;border-radius:3px}.layout-outline.flex[data-v-ed4fb8a3]{border:1.5px dashed rgba(168,85,247,.4);background:#a855f708}.layout-outline.grid[data-v-ed4fb8a3]{border:1.5px dashed rgba(34,197,94,.4);background:#22c55e08}.layout-label[data-v-ed4fb8a3]{position:absolute;top:-16px;left:4px;font-size:9px;font-weight:600;padding:1px 5px;border-radius:3px;white-space:nowrap;letter-spacing:.03em}.flex .layout-label[data-v-ed4fb8a3]{background:#a855f726;color:#a855f7}.grid .layout-label[data-v-ed4fb8a3]{background:#22c55e26;color:#22c55e}.grid-line[data-v-ed4fb8a3]{position:fixed;z-index:9999;pointer-events:auto}.grid-line.col[data-v-ed4fb8a3]{width:6px;margin-left:-3px;cursor:col-resize;background:transparent}.grid-line.col[data-v-ed4fb8a3]:hover,.grid-line.col[data-v-ed4fb8a3]:active{background:#22c55e4d}.grid-line.row[data-v-ed4fb8a3]{height:6px;margin-top:-3px;cursor:row-resize;background:transparent}.grid-line.row[data-v-ed4fb8a3]:hover,.grid-line.row[data-v-ed4fb8a3]:active{background:#22c55e4d}.add-track-btn[data-v-ed4fb8a3],.add-child-btn[data-v-ed4fb8a3]{position:fixed;z-index:9999;pointer-events:auto;border:none;border-radius:4px;font-size:9px;font-weight:700;padding:3px 6px;cursor:pointer;opacity:.7;transition:all .15s;white-space:nowrap}.add-track-btn[data-v-ed4fb8a3]:hover,.add-child-btn[data-v-ed4fb8a3]:hover{opacity:1;transform:scale(1.1)}.add-track-btn[data-v-ed4fb8a3]{background:#22c55e26;color:#22c55e;border:1px solid rgba(34,197,94,.3)}.add-track-btn[data-v-ed4fb8a3]:hover{background:#22c55e4d}.add-child-btn[data-v-ed4fb8a3]{background:#a855f726;color:#a855f7;border:1px solid rgba(168,85,247,.3);width:22px;height:22px;display:flex;align-items:center;justify-content:center;font-size:14px;padding:0}.add-child-btn[data-v-ed4fb8a3]:hover{background:#a855f74d}.theme-page[data-v-67b64182]{display:flex;flex-direction:column;height:100%;overflow:hidden}.theme-header[data-v-67b64182]{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid var(--border);flex-shrink:0}.theme-title[data-v-67b64182]{font-size:13px;font-weight:600;color:var(--text)}.theme-actions[data-v-67b64182]{display:flex;align-items:center;gap:8px}.theme-change-count[data-v-67b64182]{font-size:11px;color:var(--text-muted)}.theme-btn[data-v-67b64182]{padding:4px 12px;font-size:11px;font-weight:600;border:none;border-radius:5px;cursor:pointer}.theme-btn.commit[data-v-67b64182]{background:var(--accent);color:#fff}.theme-btn.commit[data-v-67b64182]:hover{opacity:.9}.theme-btn.commit[data-v-67b64182]:disabled{opacity:.4;cursor:not-allowed}.theme-btn.discard[data-v-67b64182]{background:var(--surface-2);color:var(--text-muted);border:1px solid var(--border)}.theme-btn.discard[data-v-67b64182]:hover{color:var(--text);background:var(--border)}.theme-btn.small[data-v-67b64182]{padding:3px 10px;font-size:10px}.theme-empty[data-v-67b64182]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--text-muted);text-align:center;padding:24px}.theme-empty p[data-v-67b64182]{font-size:13px}.theme-empty-hint[data-v-67b64182]{font-size:11px;opacity:.7}.theme-empty code[data-v-67b64182]{background:#3b82f626;padding:1px 6px;border-radius:3px;font-weight:600;color:#60a5fa}.theme-tabs[data-v-67b64182]{display:flex;border-bottom:1px solid var(--border);flex-shrink:0}.theme-tab[data-v-67b64182]{flex:1;padding:8px 4px;font-size:11px;font-weight:500;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;transition:all .15s}.theme-tab[data-v-67b64182]:hover{color:var(--text)}.theme-tab.active[data-v-67b64182]{color:var(--accent);border-bottom-color:var(--accent)}.theme-tab-badge[data-v-67b64182]{display:inline-flex;align-items:center;justify-content:center;min-width:14px;height:14px;padding:0 3px;font-size:9px;font-weight:700;background:var(--accent);color:#fff;border-radius:7px;margin-left:3px}.theme-content[data-v-67b64182]{flex:1;overflow-y:auto;padding:12px}.theme-section[data-v-67b64182]{display:flex;flex-direction:column;gap:2px}.theme-section-empty[data-v-67b64182]{padding:16px 0;text-align:center;font-size:11px;color:var(--text-muted);opacity:.6}.section-subtitle[data-v-67b64182]{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);padding:6px 0 4px}.token-row[data-v-67b64182]{display:flex;align-items:center;justify-content:space-between;padding:6px 8px;border-radius:6px;gap:8px;transition:background .1s}.token-row[data-v-67b64182]:hover{background:var(--surface-2)}.token-row.new[data-v-67b64182]{background:#3b82f60f}.token-info[data-v-67b64182]{display:flex;flex-direction:column;gap:1px;min-width:0;flex-shrink:1}.token-role[data-v-67b64182]{font-size:12px;font-weight:500;color:var(--text);white-space:nowrap}.token-role.edited[data-v-67b64182]{color:var(--accent)}.token-role.new-badge[data-v-67b64182]{color:#22c55e;font-weight:600}.token-source[data-v-67b64182]{font-size:9px;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:160px}.token-controls[data-v-67b64182]{display:flex;align-items:center;gap:6px;flex-shrink:0}.token-value-input[data-v-67b64182]{width:80px;padding:3px 6px;font-size:11px;font-family:monospace;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--text);outline:none}.token-value-input[data-v-67b64182]:focus{border-color:var(--accent)}.token-value-input.wide[data-v-67b64182]{width:160px}.token-value-input.color-hex[data-v-67b64182]{width:72px}.token-value-ro[data-v-67b64182]{font-size:11px;color:var(--text-muted)}.token-remove[data-v-67b64182]{width:18px;height:18px;border:none;background:none;color:var(--text-muted);font-size:14px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:3px}.token-remove[data-v-67b64182]:hover{color:#ef4444;background:#ef44441a}.no-preview-badge[data-v-67b64182]{font-size:8px;color:var(--text-muted);opacity:.6;white-space:nowrap}.color-swatch-wrapper[data-v-67b64182]{flex-shrink:0}.color-swatch-inline[data-v-67b64182]{width:20px;height:20px;border-radius:4px;border:1px solid var(--border);flex-shrink:0}.font-size-preview[data-v-67b64182]{color:var(--text);line-height:1;white-space:nowrap}.weight-chips[data-v-67b64182]{display:flex;flex-wrap:wrap;gap:4px;padding:4px 0}.weight-chip[data-v-67b64182]{font-size:10px;padding:2px 8px;background:var(--surface-2);border:1px solid var(--border);border-radius:4px;color:var(--text-muted)}.spacing-preview[data-v-67b64182]{width:60px;height:12px;background:var(--surface-2);border-radius:2px;overflow:hidden}.spacing-bar[data-v-67b64182]{height:100%;background:var(--accent);border-radius:2px;max-width:100%;transition:width .15s}.radius-preview[data-v-67b64182]{width:24px;height:24px;background:var(--accent);transition:border-radius .15s}.add-token-btn[data-v-67b64182]{padding:6px;margin-top:4px;font-size:11px;color:var(--text-muted);background:none;border:1px dashed var(--border);border-radius:6px;cursor:pointer;transition:all .1s}.add-token-btn[data-v-67b64182]:hover{color:var(--accent);border-color:var(--accent)}.add-token-form[data-v-67b64182]{display:flex;flex-direction:column;gap:4px;padding:8px;margin-top:4px;background:var(--surface-2);border:1px solid var(--border);border-radius:6px}.add-input[data-v-67b64182]{padding:4px 8px;font-size:11px;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--text);outline:none;font-family:inherit}.add-input[data-v-67b64182]:focus{border-color:var(--accent)}.add-actions[data-v-67b64182]{display:flex;gap:4px;margin-top:2px}.library-card[data-v-67b64182]{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--surface-2);border:1px solid var(--border);border-radius:6px}.library-name[data-v-67b64182]{font-size:12px;font-weight:600;color:var(--text)}.library-version[data-v-67b64182]{font-size:10px;color:var(--text-muted)}.styling-chip[data-v-67b64182]{font-size:9px;padding:1px 6px;background:#3b82f61f;color:#60a5fa;border-radius:3px;font-weight:600}.library-components[data-v-67b64182]{display:flex;flex-wrap:wrap;gap:4px;padding:6px 0}.component-chip[data-v-67b64182]{font-size:10px;padding:2px 8px;background:var(--surface-2);border:1px solid var(--border);border-radius:4px;color:var(--text-muted);font-family:monospace}.report-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50000;display:flex;justify-content:flex-end}.report-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;background:#0006}.report-drawer{position:relative;width:min(720px,80vw);height:100%;background:#0d0d0d;border-left:1px solid var(--border);display:flex;flex-direction:column;animation:slide-in .15s ease-out}@keyframes slide-in{0%{transform:translate(100%)}to{transform:translate(0)}}.report-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0}.report-title{display:flex;align-items:center;gap:10px;font-size:14px;font-weight:600;color:var(--text)}.report-badge{font-size:11px;font-weight:500;color:var(--text-muted);background:var(--surface-2);padding:2px 8px;border-radius:4px;border:1px solid var(--border)}.report-controls{display:flex;align-items:center;gap:8px}.format-toggle{display:flex;border:1px solid var(--border);border-radius:6px;overflow:hidden}.fmt-btn{padding:4px 12px;font-size:11px;font-weight:600;color:var(--text-muted);background:transparent;border:none;cursor:pointer;transition:all .1s}.fmt-btn.active{background:var(--surface-2);color:var(--text)}.fmt-btn:hover:not(.active){color:var(--text)}.copy-btn{display:flex;align-items:center;gap:5px;padding:5px 12px;font-size:12px;font-weight:500;color:var(--text);background:var(--surface-2);border:1px solid var(--border);border-radius:6px;cursor:pointer;transition:all .1s}.copy-btn:hover{background:var(--border)}.copy-btn:disabled{opacity:.4;cursor:default}.close-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;color:var(--text-muted);background:transparent;border:none;border-radius:6px;cursor:pointer;transition:all .1s}.close-btn:hover{background:var(--surface-2);color:var(--text)}.report-body{flex:1;overflow:auto}.report-code{margin:0;padding:20px;font-size:12px;line-height:1.6;-moz-tab-size:2;tab-size:2;overflow:auto;background:transparent}.report-code code{font-family:SF Mono,Fira Code,Cascadia Code,JetBrains Mono,Consolas,monospace}.report-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--text-muted);font-size:14px}.report-empty-hint{font-size:12px;margin-top:8px;opacity:.6}.report-code .token.property{color:#7dd3fc}.report-code .token.string{color:#86efac}.report-code .token.number{color:#fbbf24}.report-code .token.boolean{color:#c084fc}.report-code .token.null{color:#f87171}.report-code .token.operator{color:#71717a}.report-code .token.punctuation{color:#52525b}.report-code .token.key,.report-code .token.atrule,.report-code .token.tag{color:#7dd3fc}.report-code .token.scalar{color:#86efac}.report-code .token.important{color:#fbbf24}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--bg: #0a0a0a;--surface: #141414;--surface-2: #1e1e1e;--border: #2a2a2a;--text: #e4e4e7;--text-muted: #71717a;--accent: #3b82f6;--danger: #ef4444}html,body,#app{height:100%;overflow:hidden;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:13px}.annotask-shell{display:flex;flex-direction:column;height:100%}.toolbar{display:flex;align-items:center;justify-content:space-between;height:40px;padding:0 12px;background:var(--surface);border-bottom:1px solid var(--border);flex-shrink:0}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:8px}.logo{height:20px;width:auto;margin-right:12px;color:var(--accent)}.tool-btn{display:flex;align-items:center;gap:4px;padding:4px 10px;border:1px solid var(--border);border-radius:6px;background:var(--surface-2);color:var(--text);font-size:12px;cursor:pointer}.tool-btn:hover{background:var(--border)}.tool-btn:disabled{opacity:.4;cursor:not-allowed}.tool-btn.active{background:var(--accent);border-color:var(--accent);color:#fff}.tool-btn.danger{color:var(--danger)}.panel-toggle{display:flex;border:1px solid var(--border);border-radius:6px;overflow:hidden}.toggle-btn{display:flex;align-items:center;gap:3px;padding:3px 8px;border:none;background:var(--surface-2);color:var(--text-muted);font-size:11px;cursor:pointer;transition:all .1s}.toggle-btn:first-child{border-right:1px solid var(--border)}.toggle-btn:hover{background:var(--border);color:var(--text)}.toggle-btn.active{background:var(--accent);color:#fff}.toggle-badge{display:inline-flex;align-items:center;justify-content:center;min-width:14px;height:14px;padding:0 3px;font-size:8px;font-weight:700;background:#ffffff40;color:#fff;border-radius:7px}.toggle-btn:not(.active) .toggle-badge{background:var(--accent);color:#fff}.view-toggle{display:flex;border:1px solid var(--border);border-radius:6px;overflow:hidden;margin-right:8px}.theme-panel{width:440px;background:var(--surface);border-left:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}.visibility-toggles{display:flex;gap:1px;margin-right:4px}.vis-btn{width:20px;height:20px;border:none;border-radius:3px;background:var(--surface-2);color:var(--text-muted);font-size:9px;font-weight:700;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .1s}.vis-btn:hover{background:var(--border);color:var(--text)}.vis-btn.off{opacity:.3;text-decoration:line-through}.change-count{font-size:11px;color:var(--text-muted)}.warning-banner{padding:8px 16px;background:#eab3081a;border-bottom:1px solid rgba(234,179,8,.3);color:#eab308;font-size:12px}.warning-banner code{background:#eab30826;padding:1px 4px;border-radius:3px}.setup-banner{padding:8px 16px;background:#3b82f614;border-bottom:1px solid rgba(59,130,246,.2);color:#60a5fa;font-size:12px}.setup-banner code{background:#3b82f626;padding:1px 6px;border-radius:3px;font-weight:600}.main{display:flex;flex:1;overflow:hidden}.toolbar-center{display:flex;align-items:center;gap:8px}.route-indicator{font-size:11px;color:var(--text-muted);background:var(--surface-2);padding:2px 8px;border-radius:4px;border:1px solid var(--border)}.canvas-area{flex:1;position:relative;overflow:hidden}.app-iframe{width:100%;height:100%;border:none}.drawing-shield{position:absolute;top:0;right:0;bottom:0;left:0;z-index:9999}.drawing-shield.arrow,.drawing-shield.draw{cursor:crosshair}.highlight{position:fixed;pointer-events:none;z-index:10000;border-radius:2px}.highlight.hover{background:#3b82f61a;border:1.5px solid rgba(59,130,246,.5)}.highlight.group{background:#a855f714;border:1.5px dashed rgba(168,85,247,.4)}.highlight.select{background:#3b82f614;border:2px solid var(--accent)}.hover-label,.select-label{position:absolute;bottom:100%;left:-1px;display:flex;align-items:center;gap:6px;padding:2px 8px;font-size:11px;font-weight:500;white-space:nowrap;border-radius:4px 4px 0 0}.hover-label{background:var(--accent);color:#fff}.hover-tag{font-family:monospace}.hover-comp{opacity:.7}.select-label{background:var(--accent);color:#fff;font-family:monospace;font-size:10px}.panel{width:320px;background:var(--surface);border-left:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}.panel.empty{justify-content:center;align-items:center}.panel-source{padding:10px 14px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px;flex-wrap:wrap}.source-path{font-size:12px;color:var(--accent);word-break:break-all;font-family:monospace}.component-badge{font-size:10px;padding:2px 6px;background:var(--surface-2);border:1px solid var(--border);border-radius:4px;color:var(--text-muted);white-space:nowrap}.role-badge{font-size:9px;padding:1px 5px;border-radius:3px;font-weight:600;text-transform:uppercase;letter-spacing:.03em}.role-badge.container{background:#22c55e26;color:#22c55e}.role-badge.content{background:#3b82f626;color:#3b82f6}.role-badge.component{background:#a855f726;color:#a855f7}.panel-group-bar{display:flex;align-items:center;justify-content:space-between;padding:6px 14px;border-bottom:1px solid var(--border);background:#a855f70f}.group-summary{font-size:11px;color:#a855f7}.group-toggle{display:flex;align-items:center;gap:5px;cursor:pointer}.group-toggle input{accent-color:#a855f7;width:14px;height:14px;cursor:pointer}.toggle-label{font-size:11px;color:var(--text-muted)}.panel-tabs{display:flex;border-bottom:1px solid var(--border);flex-shrink:0}.tab{flex:1;padding:8px 4px;font-size:11px;font-weight:500;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;transition:all .15s}.tab:hover{color:var(--text)}.tab.active{color:var(--accent);border-bottom-color:var(--accent)}.tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:14px;height:14px;padding:0 3px;font-size:9px;font-weight:700;background:var(--accent);color:#fff;border-radius:7px;margin-left:3px}.tab-content{flex:1;overflow-y:auto;padding:14px}.class-editor{width:100%;padding:8px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-family:monospace;font-size:12px;resize:vertical;outline:none}.class-editor:focus{border-color:var(--accent)}.hint{font-size:10px;color:var(--text-muted);margin-top:4px}.empty-content{text-align:center;color:var(--text-muted)}.empty-content p{margin-top:8px}.empty-hint{font-size:11px;opacity:.6}.changes-footer{border-top:1px solid var(--border);flex-shrink:0}.changes-summary{padding:8px 14px;font-size:11px;color:var(--text-muted);cursor:pointer;list-style:none}.changes-summary::-webkit-details-marker{display:none}.changes-summary:before{content:"▸ "}details[open]>.changes-summary:before{content:"▾ "}.changes-list{max-height:200px;overflow-y:auto;padding:0 14px 10px}.change-item{display:flex;align-items:center;gap:6px;padding:3px 0;font-size:11px}.change-prop{color:var(--text-muted);font-family:monospace}.change-arrow{color:var(--text-muted);font-size:10px}.change-val{color:#22c55e;font-family:monospace}.task-card{padding:8px;border:1px solid var(--border);border-radius:6px;margin-bottom:6px}.task-card.review{border-color:#f59e0b}.task-card.denied{border-color:#ef4444}.task-card-header{display:flex;align-items:center;gap:6px;margin-bottom:3px}.task-status-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.task-status-dot.pending{background:#71717a}.task-status-dot.review{background:#f59e0b}.task-status-dot.denied{background:#ef4444}.task-card-desc{font-size:11px;color:var(--text);flex:1}.task-card-close{width:16px;height:16px;border:none;background:none;color:var(--text-muted);font-size:13px;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;border-radius:3px}.task-card-close:hover{color:#ef4444;background:#ef44441a}.task-card-meta{display:flex;align-items:center;gap:6px}.task-card-file{font-size:9px;color:var(--text-muted)}.task-route-badge{font-size:8px;padding:1px 5px;background:#3b82f61f;color:#60a5fa;border-radius:3px;font-weight:600}.task-card-feedback{font-size:10px;color:#ef4444;font-style:italic;margin-top:3px}.new-task-toggle{margin-left:auto;padding:2px 8px;font-size:10px;font-weight:600;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer}.new-task-toggle:hover{opacity:.9}.new-task-form{padding:8px 14px;border-bottom:1px solid var(--border)}.new-task-input{width:100%;padding:6px 8px;font-size:12px;background:var(--bg);border:1px solid var(--border);border-radius:5px;color:var(--text);resize:none;outline:none;font-family:inherit}.new-task-input:focus{border-color:var(--accent)}.new-task-actions{display:flex;gap:4px;margin-top:4px}.submit-btn{padding:4px 12px;font-size:11px;font-weight:600;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer}.submit-btn:disabled{opacity:.4;cursor:not-allowed}.cancel-btn{padding:4px 12px;font-size:11px;background:var(--surface-2);color:var(--text-muted);border:1px solid var(--border);border-radius:4px;cursor:pointer}.task-card-actions{display:flex;gap:4px;margin-top:6px;align-items:center}.deny-feedback-input{flex:1;padding:4px 8px;font-size:10px;background:var(--bg);border:1px solid #ef4444;border-radius:4px;color:var(--text);outline:none}.deny-feedback-input:focus{box-shadow:0 0 0 2px #ef444433}.task-card-actions .task-accept,.task-card-actions .task-deny{flex:1;padding:5px 0;font-size:11px;font-weight:600;border:none;border-radius:5px;cursor:pointer;transition:all .12s;display:flex;align-items:center;justify-content:center;gap:4px}.task-card-actions .task-accept{background:#22c55e26;color:#22c55e}.task-card-actions .task-accept:hover{background:#22c55e;color:#fff}.task-card-actions .task-deny{background:#ef44441f;color:#ef4444}.task-card-actions .task-deny:hover{background:#ef4444;color:#fff}.pending-task-panel{padding:14px;display:flex;flex-direction:column;gap:12px}.pending-task-context{display:flex;flex-direction:column;gap:6px}.pending-task-kind{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--text)}.pending-task-kind.pin{color:var(--accent)}.pending-task-kind.pin svg{stroke:var(--accent)}.pending-task-kind.arrow{color:#ef4444}.pending-task-kind.arrow svg{stroke:#ef4444}.pending-task-file{font-size:11px;color:var(--text-muted);font-family:monospace}.pending-task-input{width:100%;padding:8px 10px;font-size:12px;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:6px;resize:vertical;font-family:inherit;line-height:1.4}.pending-task-input:focus{border-color:var(--accent);outline:none}.pending-task-actions{display:flex;gap:6px}.pending-task-actions .submit-btn{flex:1;padding:6px 12px;font-size:11px;font-weight:600;background:var(--accent);color:#fff;border:none;border-radius:5px;cursor:pointer}.pending-task-actions .submit-btn:disabled{opacity:.4;cursor:default}.pending-task-actions .cancel-btn{padding:6px 12px;font-size:11px;background:var(--surface-2);color:var(--text-muted);border:1px solid var(--border);border-radius:5px;cursor:pointer}.pending-task-actions .cancel-btn:hover{background:var(--border);color:var(--text)}.shortcuts-panel{padding:14px;overflow-y:auto;flex:1}.shortcut-group{margin-bottom:16px}.shortcut-group-title{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid var(--border)}.shortcut-row{display:flex;align-items:center;gap:6px;padding:4px 0;font-size:12px;color:var(--text)}.shortcut-row span{margin-left:auto;color:var(--text-muted);font-size:11px}.shortcut-row kbd{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:20px;padding:0 5px;background:var(--surface-2);border:1px solid var(--border);border-radius:4px;font-family:inherit;font-size:11px;font-weight:600;color:var(--text);box-shadow:0 1px 0 var(--border)}.shortcut-row kbd.mod{font-size:10px;color:var(--text-muted)}.shortcut-hint{font-size:11px;color:var(--text-muted);padding-top:8px;border-top:1px solid var(--border);display:flex;align-items:center;gap:4px;flex-wrap:wrap}.shortcut-hint kbd{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:16px;padding:0 4px;background:var(--surface-2);border:1px solid var(--border);border-radius:3px;font-family:inherit;font-size:10px;font-weight:600;color:var(--text-muted)}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Annotask</title>
|
|
7
|
+
<script type="module" crossorigin src="/__annotask/assets/index-BD3nZNWX.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/__annotask/assets/index-DwbhEo-C.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="app"></div>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface StandaloneServerOptions {
|
|
2
|
+
projectRoot: string;
|
|
3
|
+
port?: number;
|
|
4
|
+
}
|
|
5
|
+
declare function startStandaloneServer(options: StandaloneServerOptions): Promise<{
|
|
6
|
+
port: number;
|
|
7
|
+
close: () => void;
|
|
8
|
+
}>;
|
|
9
|
+
|
|
10
|
+
export { type StandaloneServerOptions, startStandaloneServer };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import {
|
|
2
|
+
transformFile
|
|
3
|
+
} from "./chunk-6UQW2W7S.js";
|
|
4
|
+
|
|
5
|
+
// src/webpack/loader.ts
|
|
6
|
+
function annotaskLoader(source) {
|
|
7
|
+
const options = this.getOptions?.() || {};
|
|
8
|
+
const filePath = this.resourcePath;
|
|
9
|
+
const projectRoot = options.projectRoot || process.cwd();
|
|
10
|
+
if (filePath.endsWith("/main.ts") || filePath.endsWith("/main.js") || filePath.endsWith("/main.tsx") || filePath.endsWith("/main.jsx")) {
|
|
11
|
+
if (source.includes("from 'vue'") || source.includes('from "vue"')) {
|
|
12
|
+
return source + `
|
|
13
|
+
;import { createApp as __uf_createApp, h as __uf_h } from 'vue';
|
|
14
|
+
window.__ANNOTASK_VUE__ = { createApp: __uf_createApp, h: __uf_h };
|
|
15
|
+
`;
|
|
16
|
+
}
|
|
17
|
+
if (source.includes("from 'react'") || source.includes('from "react"')) {
|
|
18
|
+
return source + `
|
|
19
|
+
;import { createElement as __uf_createElement } from 'react';
|
|
20
|
+
import { createRoot as __uf_createRoot } from 'react-dom/client';
|
|
21
|
+
window.__ANNOTASK_REACT__ = { createElement: __uf_createElement, createRoot: __uf_createRoot };
|
|
22
|
+
`;
|
|
23
|
+
}
|
|
24
|
+
if (source.includes("from 'svelte'") || source.includes('from "svelte"')) {
|
|
25
|
+
return source + `
|
|
26
|
+
;import { mount as __uf_mount, unmount as __uf_unmount } from 'svelte';
|
|
27
|
+
window.__ANNOTASK_SVELTE__ = { mount: __uf_mount, unmount: __uf_unmount };
|
|
28
|
+
`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!filePath.endsWith(".vue") && !filePath.endsWith(".svelte") && !/\.[jt]sx$/.test(filePath)) return source;
|
|
32
|
+
const result = transformFile(source, filePath, projectRoot);
|
|
33
|
+
if (!result) return source;
|
|
34
|
+
let output = result;
|
|
35
|
+
const importRegex = /import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g;
|
|
36
|
+
let match;
|
|
37
|
+
const registrations = [];
|
|
38
|
+
while ((match = importRegex.exec(result)) !== null) {
|
|
39
|
+
const [, name, src] = match;
|
|
40
|
+
if (name[0] === name[0].toUpperCase() && name[0] !== name[0].toLowerCase() && !src.startsWith(".")) {
|
|
41
|
+
registrations.push(`window.__ANNOTASK_COMPONENTS__['${name}'] = ${name}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (registrations.length > 0) {
|
|
45
|
+
const regCode = `
|
|
46
|
+
if (typeof window !== 'undefined') { window.__ANNOTASK_COMPONENTS__ = window.__ANNOTASK_COMPONENTS__ || {}; ${registrations.join("; ")} }
|
|
47
|
+
`;
|
|
48
|
+
if (filePath.endsWith(".vue") && output.includes("</script>")) {
|
|
49
|
+
output = output.replace(/<\/script>/, regCode + "</script>");
|
|
50
|
+
} else {
|
|
51
|
+
output += regCode;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return output;
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
annotaskLoader as default
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=webpack-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/webpack/loader.ts"],"sourcesContent":["/**\n * Webpack loader for Annotask source file transform.\n * Injects data-annotask-* attributes into Vue, React, and Svelte templates.\n * Must run BEFORE framework-specific loaders (enforce: 'pre').\n */\nimport { transformFile } from '../plugin/transform.js'\n\nexport default function annotaskLoader(this: any, source: string): string {\n const options = this.getOptions?.() || {}\n const filePath = this.resourcePath\n const projectRoot = options.projectRoot || process.cwd()\n\n // Expose framework runtime on main entry files\n if (filePath.endsWith('/main.ts') || filePath.endsWith('/main.js') || filePath.endsWith('/main.tsx') || filePath.endsWith('/main.jsx')) {\n if (source.includes(\"from 'vue'\") || source.includes('from \"vue\"')) {\n return source + `\\n;import { createApp as __uf_createApp, h as __uf_h } from 'vue';\\nwindow.__ANNOTASK_VUE__ = { createApp: __uf_createApp, h: __uf_h };\\n`\n }\n if (source.includes(\"from 'react'\") || source.includes('from \"react\"')) {\n return source + `\\n;import { createElement as __uf_createElement } from 'react';\\nimport { createRoot as __uf_createRoot } from 'react-dom/client';\\nwindow.__ANNOTASK_REACT__ = { createElement: __uf_createElement, createRoot: __uf_createRoot };\\n`\n }\n if (source.includes(\"from 'svelte'\") || source.includes('from \"svelte\"')) {\n return source + `\\n;import { mount as __uf_mount, unmount as __uf_unmount } from 'svelte';\\nwindow.__ANNOTASK_SVELTE__ = { mount: __uf_mount, unmount: __uf_unmount };\\n`\n }\n }\n\n // Transform source files\n if (!filePath.endsWith('.vue') && !filePath.endsWith('.svelte') && !/\\.[jt]sx$/.test(filePath)) return source\n\n const result = transformFile(source, filePath, projectRoot)\n if (!result) return source\n\n // Register imported PascalCase components globally\n let output = result\n const importRegex = /import\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g\n let match\n const registrations: string[] = []\n while ((match = importRegex.exec(result)) !== null) {\n const [, name, src] = match\n if (name[0] === name[0].toUpperCase() && name[0] !== name[0].toLowerCase() && !src.startsWith('.')) {\n registrations.push(`window.__ANNOTASK_COMPONENTS__['${name}'] = ${name}`)\n }\n }\n if (registrations.length > 0) {\n const regCode = `\\nif (typeof window !== 'undefined') { window.__ANNOTASK_COMPONENTS__ = window.__ANNOTASK_COMPONENTS__ || {}; ${registrations.join('; ')} }\\n`\n if (filePath.endsWith('.vue') && output.includes('</script>')) {\n output = output.replace(/<\\/script>/, regCode + '</script>')\n } else {\n output += regCode\n }\n }\n\n return output\n}\n"],"mappings":";;;;;AAOe,SAAR,eAA2C,QAAwB;AACxE,QAAM,UAAU,KAAK,aAAa,KAAK,CAAC;AACxC,QAAM,WAAW,KAAK;AACtB,QAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI;AAGvD,MAAI,SAAS,SAAS,UAAU,KAAK,SAAS,SAAS,UAAU,KAAK,SAAS,SAAS,WAAW,KAAK,SAAS,SAAS,WAAW,GAAG;AACtI,QAAI,OAAO,SAAS,YAAY,KAAK,OAAO,SAAS,YAAY,GAAG;AAClE,aAAO,SAAS;AAAA;AAAA;AAAA;AAAA,IAClB;AACA,QAAI,OAAO,SAAS,cAAc,KAAK,OAAO,SAAS,cAAc,GAAG;AACtE,aAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAClB;AACA,QAAI,OAAO,SAAS,eAAe,KAAK,OAAO,SAAS,eAAe,GAAG;AACxE,aAAO,SAAS;AAAA;AAAA;AAAA;AAAA,IAClB;AAAA,EACF;AAGA,MAAI,CAAC,SAAS,SAAS,MAAM,KAAK,CAAC,SAAS,SAAS,SAAS,KAAK,CAAC,YAAY,KAAK,QAAQ,EAAG,QAAO;AAEvG,QAAM,SAAS,cAAc,QAAQ,UAAU,WAAW;AAC1D,MAAI,CAAC,OAAQ,QAAO;AAGpB,MAAI,SAAS;AACb,QAAM,cAAc;AACpB,MAAI;AACJ,QAAM,gBAA0B,CAAC;AACjC,UAAQ,QAAQ,YAAY,KAAK,MAAM,OAAO,MAAM;AAClD,UAAM,CAAC,EAAE,MAAM,GAAG,IAAI;AACtB,QAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,YAAY,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,YAAY,KAAK,CAAC,IAAI,WAAW,GAAG,GAAG;AAClG,oBAAc,KAAK,mCAAmC,IAAI,QAAQ,IAAI,EAAE;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,UAAU;AAAA,8GAAiH,cAAc,KAAK,IAAI,CAAC;AAAA;AACzJ,QAAI,SAAS,SAAS,MAAM,KAAK,OAAO,SAAS,WAAW,GAAG;AAC7D,eAAS,OAAO,QAAQ,cAAc,UAAU,WAAW;AAAA,IAC7D,OAAO;AACL,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface AnnotaskWebpackOptions {
|
|
2
|
+
port?: number;
|
|
3
|
+
}
|
|
4
|
+
declare class AnnotaskWebpackPlugin {
|
|
5
|
+
private options;
|
|
6
|
+
private serverUrl;
|
|
7
|
+
constructor(options?: AnnotaskWebpackOptions);
|
|
8
|
+
apply(compiler: any): void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { type AnnotaskWebpackOptions, AnnotaskWebpackPlugin };
|
package/dist/webpack.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {
|
|
2
|
+
bridgeClientScript,
|
|
3
|
+
toggleButtonScript
|
|
4
|
+
} from "./chunk-2TUWBFQG.js";
|
|
5
|
+
import {
|
|
6
|
+
startStandaloneServer
|
|
7
|
+
} from "./chunk-LKRKKLOT.js";
|
|
8
|
+
import "./chunk-XR26XVHT.js";
|
|
9
|
+
import "./chunk-T6TKVAAA.js";
|
|
10
|
+
|
|
11
|
+
// src/webpack/plugin.ts
|
|
12
|
+
import path from "path";
|
|
13
|
+
import { fileURLToPath } from "url";
|
|
14
|
+
var __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
var AnnotaskWebpackPlugin = class {
|
|
16
|
+
options;
|
|
17
|
+
serverUrl = "";
|
|
18
|
+
constructor(options = {}) {
|
|
19
|
+
this.options = options;
|
|
20
|
+
}
|
|
21
|
+
apply(compiler) {
|
|
22
|
+
if (compiler.options.mode !== "development") return;
|
|
23
|
+
const projectRoot = compiler.context;
|
|
24
|
+
const loaderPath = path.resolve(__dirname, "webpack-loader.js");
|
|
25
|
+
compiler.options.module.rules.unshift({
|
|
26
|
+
test: /\.(vue|svelte|[jt]sx?|ts|js)$/,
|
|
27
|
+
enforce: "pre",
|
|
28
|
+
exclude: /node_modules/,
|
|
29
|
+
use: [{
|
|
30
|
+
loader: loaderPath,
|
|
31
|
+
options: { projectRoot }
|
|
32
|
+
}]
|
|
33
|
+
});
|
|
34
|
+
let serverStarted = false;
|
|
35
|
+
compiler.hooks.beforeCompile.tapPromise("AnnotaskWebpackPlugin", async () => {
|
|
36
|
+
if (serverStarted) return;
|
|
37
|
+
serverStarted = true;
|
|
38
|
+
try {
|
|
39
|
+
const { port } = await startStandaloneServer({ projectRoot, port: this.options.port });
|
|
40
|
+
this.serverUrl = `http://localhost:${port}`;
|
|
41
|
+
console.log(`[Annotask] Server running at ${this.serverUrl}/__annotask/`);
|
|
42
|
+
} catch (err) {
|
|
43
|
+
console.error("[Annotask] Failed to start server:", err);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
compiler.hooks.compilation.tap("AnnotaskWebpackPlugin", (compilation) => {
|
|
47
|
+
const htmlPluginConstructor = compiler.options.plugins?.map((p) => p.constructor).find((c) => c && typeof c.getHooks === "function");
|
|
48
|
+
if (!htmlPluginConstructor) return;
|
|
49
|
+
const hooks = htmlPluginConstructor.getHooks(compilation);
|
|
50
|
+
hooks.beforeEmit.tapAsync("AnnotaskWebpackPlugin", (data, cb) => {
|
|
51
|
+
const scripts = `
|
|
52
|
+
<script>${bridgeClientScript()}</script>
|
|
53
|
+
<script type="module">${toggleButtonScript(this.serverUrl)}</script>`;
|
|
54
|
+
data.html = data.html.replace("</body>", scripts + "\n</body>");
|
|
55
|
+
cb(null, data);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
export {
|
|
61
|
+
AnnotaskWebpackPlugin
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=webpack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/webpack/plugin.ts"],"sourcesContent":["/**\n * Webpack plugin for Annotask.\n * Starts a standalone server, adds the SFC transform loader,\n * and injects bridge + toggle scripts into HTML.\n */\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { startStandaloneServer } from '../server/standalone.js'\nimport { toggleButtonScript } from '../plugin/toggle-button.js'\nimport { bridgeClientScript } from '../plugin/bridge-client.js'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport interface AnnotaskWebpackOptions {\n port?: number\n}\n\nexport class AnnotaskWebpackPlugin {\n private options: AnnotaskWebpackOptions\n private serverUrl: string = ''\n\n constructor(options: AnnotaskWebpackOptions = {}) {\n this.options = options\n }\n\n apply(compiler: any) {\n // Only activate in development\n if (compiler.options.mode !== 'development') return\n\n const projectRoot = compiler.context\n const loaderPath = path.resolve(__dirname, 'webpack-loader.js')\n\n // Add the SFC transform loader (enforce: pre, before vue-loader)\n compiler.options.module.rules.unshift({\n test: /\\.(vue|svelte|[jt]sx?|ts|js)$/,\n enforce: 'pre',\n exclude: /node_modules/,\n use: [{\n loader: loaderPath,\n options: { projectRoot },\n }],\n })\n\n // Start standalone server\n let serverStarted = false\n compiler.hooks.beforeCompile.tapPromise('AnnotaskWebpackPlugin', async () => {\n if (serverStarted) return\n serverStarted = true\n try {\n const { port } = await startStandaloneServer({ projectRoot, port: this.options.port })\n this.serverUrl = `http://localhost:${port}`\n console.log(`[Annotask] Server running at ${this.serverUrl}/__annotask/`)\n } catch (err) {\n console.error('[Annotask] Failed to start server:', err)\n }\n })\n\n // Inject scripts into HTML (works with html-webpack-plugin)\n compiler.hooks.compilation.tap('AnnotaskWebpackPlugin', (compilation: any) => {\n // Find HtmlWebpackPlugin from registered plugins\n const htmlPluginConstructor = compiler.options.plugins\n ?.map((p: any) => p.constructor)\n .find((c: any) => c && typeof c.getHooks === 'function')\n\n if (!htmlPluginConstructor) return\n\n const hooks = htmlPluginConstructor.getHooks(compilation)\n hooks.beforeEmit.tapAsync('AnnotaskWebpackPlugin', (data: any, cb: any) => {\n const scripts = `\n<script>${bridgeClientScript()}</script>\n<script type=\"module\">${toggleButtonScript(this.serverUrl)}</script>`\n data.html = data.html.replace('</body>', scripts + '\\n</body>')\n cb(null, data)\n })\n })\n }\n}\n"],"mappings":";;;;;;;;;;;AAKA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAK9B,IAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAMtD,IAAM,wBAAN,MAA4B;AAAA,EACzB;AAAA,EACA,YAAoB;AAAA,EAE5B,YAAY,UAAkC,CAAC,GAAG;AAChD,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,UAAe;AAEnB,QAAI,SAAS,QAAQ,SAAS,cAAe;AAE7C,UAAM,cAAc,SAAS;AAC7B,UAAM,aAAa,KAAK,QAAQ,WAAW,mBAAmB;AAG9D,aAAS,QAAQ,OAAO,MAAM,QAAQ;AAAA,MACpC,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,KAAK,CAAC;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,EAAE,YAAY;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAGD,QAAI,gBAAgB;AACpB,aAAS,MAAM,cAAc,WAAW,yBAAyB,YAAY;AAC3E,UAAI,cAAe;AACnB,sBAAgB;AAChB,UAAI;AACF,cAAM,EAAE,KAAK,IAAI,MAAM,sBAAsB,EAAE,aAAa,MAAM,KAAK,QAAQ,KAAK,CAAC;AACrF,aAAK,YAAY,oBAAoB,IAAI;AACzC,gBAAQ,IAAI,gCAAgC,KAAK,SAAS,cAAc;AAAA,MAC1E,SAAS,KAAK;AACZ,gBAAQ,MAAM,sCAAsC,GAAG;AAAA,MACzD;AAAA,IACF,CAAC;AAGD,aAAS,MAAM,YAAY,IAAI,yBAAyB,CAAC,gBAAqB;AAE5E,YAAM,wBAAwB,SAAS,QAAQ,SAC3C,IAAI,CAAC,MAAW,EAAE,WAAW,EAC9B,KAAK,CAAC,MAAW,KAAK,OAAO,EAAE,aAAa,UAAU;AAEzD,UAAI,CAAC,sBAAuB;AAE5B,YAAM,QAAQ,sBAAsB,SAAS,WAAW;AACxD,YAAM,WAAW,SAAS,yBAAyB,CAAC,MAAW,OAAY;AACzE,cAAM,UAAU;AAAA,UACd,mBAAmB,CAAC;AAAA,wBACN,mBAAmB,KAAK,SAAS,CAAC;AAClD,aAAK,OAAO,KAAK,KAAK,QAAQ,WAAW,UAAU,WAAW;AAC9D,WAAG,MAAM,IAAI;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "annotask",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"module": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./webpack": {
|
|
13
|
+
"types": "./dist/webpack.d.ts",
|
|
14
|
+
"import": "./dist/webpack.js"
|
|
15
|
+
},
|
|
16
|
+
"./server": {
|
|
17
|
+
"types": "./dist/server.d.ts",
|
|
18
|
+
"import": "./dist/server.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"bin": {
|
|
22
|
+
"annotask": "./dist/cli.js"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"skills"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "pnpm build:shell && pnpm build:plugin",
|
|
30
|
+
"build:shell": "vite build --config vite.config.shell.ts",
|
|
31
|
+
"build:plugin": "tsup",
|
|
32
|
+
"dev:shell": "vite --config vite.config.shell.ts",
|
|
33
|
+
"dev:vue-vite": "pnpm --filter @annotask/playground-vue-vite dev",
|
|
34
|
+
"dev:vue-webpack": "pnpm --filter @annotask/playground-vue-webpack dev",
|
|
35
|
+
"dev:react-vite": "pnpm --filter @annotask/playground-react-vite dev",
|
|
36
|
+
"dev:svelte-vite": "pnpm --filter @annotask/playground-svelte-vite dev",
|
|
37
|
+
"dev:html-vite": "pnpm --filter @annotask/playground-html-vite dev",
|
|
38
|
+
"dev:astro": "pnpm --filter @annotask/playground-astro dev",
|
|
39
|
+
"dev:htmx-vite": "pnpm --filter @annotask/playground-htmx-vite dev",
|
|
40
|
+
"test": "vitest run",
|
|
41
|
+
"test:watch": "vitest",
|
|
42
|
+
"test:e2e": "playwright test"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"vite": ">=4.0.0",
|
|
49
|
+
"webpack": ">=5.0.0"
|
|
50
|
+
},
|
|
51
|
+
"peerDependenciesMeta": {
|
|
52
|
+
"vite": {
|
|
53
|
+
"optional": true
|
|
54
|
+
},
|
|
55
|
+
"webpack": {
|
|
56
|
+
"optional": true
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"ws": "^8.20.0"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@playwright/test": "^1.58.2",
|
|
64
|
+
"@types/js-yaml": "^4.0.9",
|
|
65
|
+
"@types/node": "^25.5.0",
|
|
66
|
+
"@types/prismjs": "^1.26.6",
|
|
67
|
+
"@types/ws": "^8.18.1",
|
|
68
|
+
"@vitejs/plugin-vue": "^5.0.0",
|
|
69
|
+
"js-yaml": "^4.1.1",
|
|
70
|
+
"jsdom": "^29.0.1",
|
|
71
|
+
"prismjs": "^1.30.0",
|
|
72
|
+
"tsup": "^8.0.0",
|
|
73
|
+
"typescript": "^5.5.0",
|
|
74
|
+
"vite": "^6.0.0",
|
|
75
|
+
"vitest": "^4.1.2",
|
|
76
|
+
"vue": "^3.5.0"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# annotask-apply
|
|
2
|
+
|
|
3
|
+
Apply pending Annotask design tasks to the source code.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
Use this skill when the user says:
|
|
8
|
+
- "apply the Annotask changes"
|
|
9
|
+
- "apply my design changes"
|
|
10
|
+
- "sync Annotask"
|
|
11
|
+
- `/annotask-apply`
|
|
12
|
+
|
|
13
|
+
## How it works
|
|
14
|
+
|
|
15
|
+
Annotask is a visual markup tool that integrates with Vite and Webpack. The user annotates the page with pins, sticky notes, arrows, text highlights, and drawn sections. These become **tasks** stored in `.annotask/tasks.json` and served via API. This skill fetches pending tasks, applies them, and marks them for review.
|
|
16
|
+
|
|
17
|
+
## Steps
|
|
18
|
+
|
|
19
|
+
### 0. Discover server URL
|
|
20
|
+
|
|
21
|
+
Read `.annotask/server.json` in the **current working directory only** (never search parent directories):
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
cat .annotask/server.json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
This returns `{ "url": "http://localhost:PORT", "port": PORT }`. Use the `url` value as `BASE_URL` for all API calls below.
|
|
28
|
+
|
|
29
|
+
If the file does not exist, probe for a running server:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
curl -s http://localhost:24678/__annotask/api/status
|
|
33
|
+
curl -s http://localhost:5173/__annotask/api/status
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Use whichever responds with `{"status":"ok"}`. **IMPORTANT: Do NOT read server.json from parent or sibling directories — it belongs to a different project.**
|
|
37
|
+
|
|
38
|
+
### 1. Fetch pending tasks
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
curl -s $BASE_URL/__annotask/api/tasks
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Response:
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"version": "1.0",
|
|
48
|
+
"tasks": [
|
|
49
|
+
{
|
|
50
|
+
"id": "task-123",
|
|
51
|
+
"type": "annotation",
|
|
52
|
+
"status": "pending",
|
|
53
|
+
"description": "Change the header background to match the new brand colors",
|
|
54
|
+
"file": "src/components/Header.vue",
|
|
55
|
+
"line": 5,
|
|
56
|
+
"action": "text_edit",
|
|
57
|
+
"context": { "element_tag": "header" }
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Each task has: `id`, `type`, `status`, `description` (what to do), `file`, `line`, `component`, and optionally `action` and `context` with element details.
|
|
64
|
+
|
|
65
|
+
### 2. Process each pending task
|
|
66
|
+
|
|
67
|
+
Filter for `status: "pending"` tasks. For each:
|
|
68
|
+
|
|
69
|
+
- **`annotation` with `action: "text_edit"`**: The `description` field says what text to change. Find the text in the source file and apply the edit.
|
|
70
|
+
|
|
71
|
+
- **`annotation` with other actions** (`add_column`, `add_row`, `wrap_container`, `delete`, `duplicate`, `move_up`, `move_down`): Apply the structural change described in `description`.
|
|
72
|
+
|
|
73
|
+
- **`annotation` with no action**: This is a free-text note. Read `description` and apply your best judgment to the source code. If `context.to_element` is present, this is an arrow annotation referencing two elements.
|
|
74
|
+
|
|
75
|
+
- **`style_update`**: Apply CSS property change. `property` and `after` values tell you what to set. Use scoped styles, inline styles, or Tailwind classes based on project patterns.
|
|
76
|
+
|
|
77
|
+
- **`section_request`**: Create a new section in the template near the referenced element. The `description` field describes what content to create. `placement` gives spatial hints.
|
|
78
|
+
|
|
79
|
+
- **`theme_update`**: A design token value change from the Theme page. The `context` object contains:
|
|
80
|
+
- `category`: which token category (`colors`, `typography.families`, `typography.scale`, `spacing`, `borders.radius`)
|
|
81
|
+
- `role`: semantic role name (e.g., `primary`, `background`, `heading`)
|
|
82
|
+
- `before`: old value (`null` if this is a new token)
|
|
83
|
+
- `after`: new value
|
|
84
|
+
- `cssVar`: CSS variable name if backed by one (e.g., `--color-primary`)
|
|
85
|
+
- `sourceFile` / `sourceLine`: where the current value is defined
|
|
86
|
+
- `styling`: array of project styling methods (e.g., `["tailwind", "scoped-css"]`)
|
|
87
|
+
- `isNew`: `true` if this is a brand-new token being added
|
|
88
|
+
|
|
89
|
+
**How to apply:**
|
|
90
|
+
- If `cssVar` is set and `sourceFile` is provided: find the CSS variable declaration in the source file and update its value.
|
|
91
|
+
- If the source references a Tailwind config: update the corresponding key in `tailwind.config.*`.
|
|
92
|
+
- If `isNew` is true: add the new variable/config entry in the most appropriate location (`:root` block in the main CSS file, or Tailwind config `theme.extend`).
|
|
93
|
+
- After applying, update `.annotask/design-spec.json` to reflect the new value so the Theme page stays in sync.
|
|
94
|
+
|
|
95
|
+
### 3. Mark tasks as ready for review
|
|
96
|
+
|
|
97
|
+
After applying each task, mark it:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
curl -s -X PATCH $BASE_URL/__annotask/api/tasks/TASK_ID \
|
|
101
|
+
-H "Content-Type: application/json" \
|
|
102
|
+
-d '{"status": "review"}'
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 4. Report to the user
|
|
106
|
+
|
|
107
|
+
Tell the user:
|
|
108
|
+
- Which tasks were applied
|
|
109
|
+
- Which files were modified
|
|
110
|
+
- Any tasks that couldn't be applied (and why)
|
|
111
|
+
|
|
112
|
+
The user will review changes in Annotask and either **accept** (task removed) or **deny with notes** (task goes back to pending with feedback for next apply).
|
|
113
|
+
|
|
114
|
+
### 5. Handle denied tasks
|
|
115
|
+
|
|
116
|
+
If there are tasks with `status: "denied"` and a `feedback` field, the user rejected a previous change. Read the `feedback` to understand what went wrong and re-apply with corrections.
|
|
117
|
+
|
|
118
|
+
## Also check the live report
|
|
119
|
+
|
|
120
|
+
The real-time report at `$BASE_URL/__annotask/api/report` contains the current session's markup. Use this as additional context — it shows what's on the user's screen right now. But tasks are the source of truth for what to apply.
|
|
121
|
+
|
|
122
|
+
## Task lifecycle
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
pending → applied (by agent) → review (user checks) → accepted (removed) or denied (with feedback → back to pending)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Important notes
|
|
129
|
+
|
|
130
|
+
- Always fetch tasks, not just the report — tasks persist across sessions
|
|
131
|
+
- The `feedback` field on denied tasks is critical — it tells you what the user didn't like
|
|
132
|
+
- Tasks with `status: "review"` are waiting for user review — don't re-apply them
|
|
133
|
+
- After applying, the user's page will hot-reload via Vite HMR showing the changes immediately
|