annotask 0.0.4 → 0.0.6

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.
@@ -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-90efa075]{display:flex;gap:2px;margin-left:4px;align-items:center}.mode-btn[data-v-90efa075]{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-90efa075]:hover{background:var(--border);color:var(--text)}.mode-btn.active[data-v-90efa075]{background:var(--accent);border-color:var(--accent);color:#fff}.mode-btn.mode-interact.active[data-v-90efa075]{background:#6366f1;border-color:#6366f1}.mode-btn.arrow.active[data-v-90efa075]{background:#ef4444;border-color:#ef4444}.mode-btn.draw.active[data-v-90efa075]{background:#22c55e;border-color:#22c55e}.mode-btn.mode-highlight.active[data-v-90efa075]{background:#f59e0b;border-color:#f59e0b}.mode-sep[data-v-90efa075]{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-0b4424b4]{display:flex;flex-direction:column;gap:14px}.section-label[data-v-0b4424b4]{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-0b4424b4]{display:flex;flex-wrap:wrap;gap:4px}.action-btn[data-v-0b4424b4]{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-0b4424b4]:hover{background:var(--border);color:var(--accent);border-color:var(--accent)}.note-input[data-v-0b4424b4]{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-0b4424b4]:focus{border-color:var(--accent)}.submit-btn[data-v-0b4424b4]{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-0b4424b4]:disabled{opacity:.4;cursor:not-allowed}.submit-btn[data-v-0b4424b4]:hover:not(:disabled){opacity:.9}.task-toggles[data-v-0b4424b4]{display:flex;gap:10px;margin-top:4px}.note-actions[data-v-0b4424b4]{display:flex;align-items:center;gap:8px;margin-top:4px}.history-toggle[data-v-0b4424b4]{display:flex;align-items:center;gap:4px;font-size:10px;color:var(--text-muted);cursor:pointer;white-space:nowrap}.history-toggle input[data-v-0b4424b4]{margin:0}.history-toggle span[data-v-0b4424b4]{-webkit-user-select:none;user-select:none}.screenshot-btn[data-v-0b4424b4]{width:100%;padding:5px;margin-top:4px;font-size:10px;font-weight:600;background:var(--surface-2);color:var(--text-muted);border:1px dashed var(--border);border-radius:5px;cursor:pointer}.screenshot-btn[data-v-0b4424b4]:hover{border-color:var(--accent);color:var(--accent)}.screenshot-preview[data-v-0b4424b4]{position:relative;margin-top:4px}.screenshot-thumb[data-v-0b4424b4]{width:100%;border-radius:4px;border:1px solid var(--border)}.screenshot-remove[data-v-0b4424b4]{position:absolute;top:4px;right:4px;width:18px;height:18px;border:none;border-radius:50%;background:#0009;color:#fff;font-size:14px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.screenshot-remove[data-v-0b4424b4]:hover{background:#ef4444}.pin-item[data-v-0b4424b4]{display:flex;align-items:flex-start;gap:8px;padding:6px 8px;border-radius:5px;cursor:pointer;transition:background .1s}.pin-item[data-v-0b4424b4]:hover{background:var(--surface-2)}.pin-item.selected[data-v-0b4424b4]{background:var(--surface-2);border:1px solid var(--accent)}.pin-badge[data-v-0b4424b4]{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-0b4424b4]{background:#a855f7}.pin-content[data-v-0b4424b4]{flex:1;min-width:0}.pin-file[data-v-0b4424b4]{font-size:10px;color:var(--accent);display:block;margin-bottom:2px}.pin-action[data-v-0b4424b4]{font-size:10px;color:#a855f7;font-weight:600;display:block}.pin-note[data-v-0b4424b4]{font-size:11px;color:var(--text);display:block;word-break:break-word}.pin-empty[data-v-0b4424b4]{font-size:10px;color:var(--text-muted);font-style:italic}.pin-delete[data-v-0b4424b4]{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-0b4424b4]{display:flex}.pin-delete[data-v-0b4424b4]:hover{color:var(--danger, #ef4444)}.empty-hint[data-v-0b4424b4]{font-size:11px;color:var(--text-muted);text-align:center;padding:12px 0}.task-review[data-v-0b4424b4]{border-top:1px solid var(--border, #2a2a2a);padding-top:10px}.task-item[data-v-0b4424b4]{padding:6px 8px;border-radius:5px;margin-bottom:4px;border:1px solid var(--border, #2a2a2a)}.task-item.review[data-v-0b4424b4]{border-color:#f59e0b;background:#f59e0b0d}.task-item.denied[data-v-0b4424b4]{border-color:#ef4444;background:#ef44440d}.task-item.pending[data-v-0b4424b4]{border-color:var(--border, #2a2a2a)}.task-header[data-v-0b4424b4]{display:flex;align-items:center;gap:6px;margin-bottom:3px}.task-status-badge[data-v-0b4424b4]{font-size:8px;font-weight:700;padding:1px 5px;border-radius:3px;text-transform:uppercase}.task-status-badge.pending[data-v-0b4424b4]{background:#71717a33;color:#71717a}.task-status-badge.review[data-v-0b4424b4]{background:#f59e0b33;color:#f59e0b}.task-status-badge.denied[data-v-0b4424b4]{background:#ef444433;color:#ef4444}.task-desc[data-v-0b4424b4]{font-size:11px;color:var(--text, #e4e4e7)}.task-file[data-v-0b4424b4]{font-size:9px;color:var(--text-muted, #71717a);display:block;margin-bottom:3px}.task-feedback[data-v-0b4424b4]{font-size:10px;color:#ef4444;font-style:italic;margin-bottom:3px}.task-actions[data-v-0b4424b4]{display:flex;gap:4px;align-items:center;margin-top:4px}.task-accept[data-v-0b4424b4]{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-0b4424b4]:hover{background:#22c55e;color:#fff}.task-deny[data-v-0b4424b4]{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-0b4424b4]:hover{background:#ef4444;color:#fff}.deny-input[data-v-0b4424b4]{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-0b4424b4]{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-0b4424b4]: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}.viewport-selector[data-v-0f350755]{position:relative}.vp-trigger[data-v-0f350755]{display:flex;align-items:center;gap:4px;padding:3px 8px;border:1px solid var(--border);border-radius:5px;background:var(--surface-2);color:var(--text-muted);font-size:11px;cursor:pointer;transition:all .1s;white-space:nowrap}.vp-trigger[data-v-0f350755]:hover{background:var(--border);color:var(--text)}.vp-label[data-v-0f350755]{font-family:monospace;font-size:11px}.vp-dropdown[data-v-0f350755]{position:absolute;top:100%;left:50%;transform:translate(-50%);margin-top:4px;min-width:220px;background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #0006;padding:4px;z-index:100;max-height:400px;overflow-y:auto}.vp-group[data-v-0f350755]{margin-top:2px}.vp-group-title[data-v-0f350755]{padding:4px 8px 2px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);opacity:.6}.vp-item[data-v-0f350755]{display:flex;align-items:center;justify-content:space-between;width:100%;padding:5px 8px;border:none;border-radius:4px;background:transparent;color:var(--text);font-size:11px;cursor:pointer;transition:background .1s}.vp-item[data-v-0f350755]:hover{background:var(--surface-2)}.vp-item.active[data-v-0f350755]{background:var(--accent);color:#fff}.vp-item-label[data-v-0f350755]{flex:1;text-align:left}.vp-item-dim[data-v-0f350755]{font-family:monospace;font-size:10px;color:var(--text-muted)}.vp-item.active .vp-item-dim[data-v-0f350755]{color:#ffffffb3}.vp-custom[data-v-0f350755]{margin-top:2px;border-top:1px solid var(--border);padding-top:4px}.vp-custom-row[data-v-0f350755]{display:flex;align-items:center;gap:4px;padding:4px 8px}.vp-input[data-v-0f350755]{width:56px;padding:3px 6px;border:1px solid var(--border);border-radius:4px;background:var(--surface-2);color:var(--text);font-size:11px;font-family:monospace;text-align:center}.vp-input[data-v-0f350755]:focus{outline:none;border-color:var(--accent)}.vp-x[data-v-0f350755]{color:var(--text-muted);font-size:10px}.vp-apply[data-v-0f350755]{padding:3px 8px;border:1px solid var(--accent);border-radius:4px;background:var(--accent);color:#fff;font-size:10px;font-weight:600;cursor:pointer}.vp-apply[data-v-0f350755]:hover{opacity:.9}.vp-rotate[data-v-0f350755]{margin-top:2px;border-top:1px solid var(--border);padding-top:4px;gap:6px}*,*: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}.canvas-area.viewport-active{display:flex;align-items:flex-start;justify-content:center;overflow:auto;background:#0a0a0a;padding:16px}.app-iframe{width:100%;height:100%;border:none}.canvas-area.viewport-active .app-iframe{flex-shrink:0;border-radius:6px;box-shadow:0 0 0 1px var(--border),0 4px 24px #00000080}.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;padding:8px 14px}.changes-list{max-height:120px;overflow-y:auto;margin-bottom:6px}.change-item{display:flex;align-items:center;gap:6px;padding:2px 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}.changes-actions{display:flex;align-items:center;gap:6px}.changes-count{font-size:10px;color:var(--text-muted);flex:1}.changes-commit{padding:4px 12px;font-size:11px;font-weight:600;background:var(--accent);color:#fff;border:none;border-radius:5px;cursor:pointer}.changes-commit:hover{opacity:.9}.changes-discard{padding:4px 12px;font-size:11px;background:var(--surface-2);color:var(--text-muted);border:1px solid var(--border);border-radius:5px;cursor:pointer}.changes-discard:hover{background:var(--border);color:var(--text)}.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)}.task-toggles{display:flex;gap:10px;margin-bottom:4px}.scan-btn{padding:3px 10px;font-size:10px;font-weight:600;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer}.scan-btn:disabled{opacity:.5;cursor:default}.scan-btn:hover:not(:disabled){opacity:.9}.a11y-error{font-size:11px;color:#ef4444;padding:6px 8px;background:#ef44441a;border-radius:5px;margin-bottom:6px}.a11y-pass{display:flex;align-items:center;gap:6px;padding:8px 10px;border-radius:6px;font-size:11px;font-weight:600;background:#22c55e1f;color:#22c55e;border:1px solid rgba(34,197,94,.25)}.a11y-empty{font-size:11px;color:var(--text-muted);padding:20px 0;text-align:center}.a11y-summary{font-size:11px;font-weight:600;color:#ef4444;padding:6px 8px;border-radius:5px;margin-bottom:4px;background:#ef444414;border:1px solid rgba(239,68,68,.2)}.a11y-card{padding:8px;border-radius:6px;margin-bottom:6px;background:var(--surface-2);border-left:3px solid var(--border)}.a11y-card.critical{border-left-color:#dc2626}.a11y-card.serious{border-left-color:#ef4444}.a11y-card.moderate{border-left-color:#f59e0b}.a11y-card.minor{border-left-color:#6b7280}.a11y-card-header{display:flex;align-items:center;gap:6px;font-size:11px}.a11y-impact{font-size:9px;font-weight:700;text-transform:uppercase;padding:1px 5px;border-radius:3px;color:#fff}.a11y-impact.critical{background:#dc2626}.a11y-impact.serious{background:#ef4444}.a11y-impact.moderate{background:#f59e0b}.a11y-impact.minor{background:#6b7280}.a11y-rule{font-weight:600;color:var(--text)}.a11y-count{margin-left:auto;color:var(--text-muted);font-size:10px}.a11y-help{margin:4px 0 6px;font-size:11px;color:var(--text-muted);line-height:1.4}.a11y-fix-btn{padding:3px 10px;font-size:10px;font-weight:600;background:#3b82f61f;color:#3b82f6;border:1px solid rgba(59,130,246,.25);border-radius:4px;cursor:pointer}.a11y-fix-btn:hover{background:#3b82f6;color:#fff}.a11y-tasked{font-size:10px;color:#22c55e;font-weight:600}.screenshot-btn{width:100%;padding:5px;margin-top:4px;font-size:10px;font-weight:600;background:var(--surface-2);color:var(--text-muted);border:1px dashed var(--border);border-radius:5px;cursor:pointer}.screenshot-btn:hover{border-color:var(--accent);color:var(--accent)}.screenshot-preview{position:relative;margin-top:4px}.screenshot-thumb{width:100%;border-radius:4px;border:1px solid var(--border)}.screenshot-remove{position:absolute;top:4px;right:4px;width:18px;height:18px;border:none;border-radius:50%;background:#0009;color:#fff;font-size:14px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.screenshot-remove:hover{background:#ef4444}.snip-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20000;background:#0000004d;cursor:crosshair}.snip-hint{position:absolute;top:16px;left:50%;transform:translate(-50%);padding:6px 14px;border-radius:6px;font-size:12px;font-weight:600;background:#000000b3;color:#fff;pointer-events:none}.snip-selection{position:fixed;z-index:20001;pointer-events:none;border:2px dashed #06b6d4;background:#06b6d414;border-radius:4px}.task-screenshot-thumb{width:100%;border-radius:4px;margin-top:6px;border:1px solid var(--border)}.history-toggle{display:flex;align-items:center;gap:4px;font-size:10px;color:var(--text-muted);cursor:pointer;white-space:nowrap}.history-toggle input{margin:0}.history-toggle span{-webkit-user-select:none;user-select:none}.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)}
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <link rel="icon" href="/__annotask/favicon.ico" />
7
7
  <title>Annotask</title>
8
- <script type="module" crossorigin src="/__annotask/assets/index-DuKNjQaz.js"></script>
9
- <link rel="stylesheet" crossorigin href="/__annotask/assets/index-2wHGkDAz.css">
8
+ <script type="module" crossorigin src="/__annotask/assets/index-Dko9s8T0.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/__annotask/assets/index-En0AXNAK.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="app"></div>
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  startStandaloneServer
3
- } from "./chunk-JPNMDGZN.js";
3
+ } from "./chunk-4IZECCVO.js";
4
4
  import "./chunk-XLNGAH3S.js";
5
- import "./chunk-JLOSPIJ4.js";
5
+ import "./chunk-KB74TUGE.js";
6
6
  export {
7
7
  startStandaloneServer
8
8
  };
package/dist/webpack.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  bridgeClientScript
3
- } from "./chunk-O73PGHAA.js";
3
+ } from "./chunk-YZ7UIZNB.js";
4
4
  import {
5
5
  startStandaloneServer
6
- } from "./chunk-JPNMDGZN.js";
6
+ } from "./chunk-4IZECCVO.js";
7
7
  import {
8
8
  writeMfeServerInfo
9
9
  } from "./chunk-XLNGAH3S.js";
10
- import "./chunk-JLOSPIJ4.js";
10
+ import "./chunk-KB74TUGE.js";
11
11
 
12
12
  // src/webpack/plugin.ts
13
13
  import path from "path";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "annotask",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",
@@ -16,37 +16,18 @@ Annotask is a visual markup tool that integrates with Vite and Webpack. The user
16
16
 
17
17
  ## Steps
18
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 contains a `"mfe"` field (e.g. `"mfe": "@myorg/my-mfe"`), this project is a **micro-frontend** and the server is running on a remote root shell. Save the `mfe` value as `MFE_FILTER` — you will use it to filter tasks in step 1.
30
-
31
- If the file does not exist, probe for a running server:
19
+ ### 0. Check server status
32
20
 
33
21
  ```bash
34
- curl -s http://localhost:24678/__annotask/api/status
35
- curl -s http://localhost:5173/__annotask/api/status
22
+ annotask status
36
23
  ```
37
24
 
38
- Use whichever responds with `{"status":"ok"}`. **IMPORTANT: Do NOT read server.json from parent or sibling directories it belongs to a different project.**
25
+ If this fails, the Annotask dev server isn't running. Ask the user to start it.
39
26
 
40
27
  ### 1. Fetch pending tasks
41
28
 
42
- If `MFE_FILTER` is set (from step 0), append it as a query parameter to filter tasks for this project:
43
-
44
29
  ```bash
45
- # Without MFE filter (standard single-project setup):
46
- curl -s $BASE_URL/__annotask/api/tasks
47
-
48
- # With MFE filter (micro-frontend setup):
49
- curl -s $BASE_URL/__annotask/api/tasks?mfe=$MFE_FILTER
30
+ annotask tasks
50
31
  ```
51
32
 
52
33
  Response:
@@ -62,13 +43,24 @@ Response:
62
43
  "file": "src/components/Header.vue",
63
44
  "line": 5,
64
45
  "action": "text_edit",
65
- "context": { "element_tag": "header" }
46
+ "context": { "element_tag": "header" },
47
+ "screenshot": "screenshot-1711800000-ab3kf.png"
66
48
  }
67
49
  ]
68
50
  }
69
51
  ```
70
52
 
71
- Each task has: `id`, `type`, `status`, `description` (what to do), `file`, `line`, `component`, and optionally `action` and `context` with element details.
53
+ Each task has: `id`, `type`, `status`, `description` (what to do), `file`, `line`, `component`, and optionally `action`, `context` with element details, and `screenshot` with a filename.
54
+
55
+ ### Screenshot reference
56
+
57
+ Some tasks include a `screenshot` field. The screenshot shows exactly what the user sees in the browser. To view it:
58
+
59
+ ```bash
60
+ annotask screenshot TASK_ID
61
+ ```
62
+
63
+ This downloads the PNG to `.annotask/screenshots/`. Use it as visual context alongside the task description and source code.
72
64
 
73
65
  ### 2. Process each pending task
74
66
 
@@ -80,10 +72,12 @@ Filter for `status: "pending"` tasks. For each:
80
72
 
81
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.
82
74
 
83
- - **`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.
75
+ - **`style_update`**: Apply CSS property changes. The `context.changes` array contains each change with `property`, `before`, and `after` values. Use scoped styles, inline styles, or Tailwind classes based on project patterns.
84
76
 
85
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.
86
78
 
79
+ - **`a11y_fix`**: Fix an accessibility violation. The `context` contains `rule` (axe rule ID), `impact`, `help` (what to fix), `helpUrl` (WCAG reference), and `elements` array with `html` snippets, `selector`, `fix` suggestions, and source `file`/`line`/`component`.
80
+
87
81
  - **`theme_update`**: A design token value change from the Theme page. The `context` object contains:
88
82
  - `category`: which token category (`colors`, `typography.families`, `typography.scale`, `spacing`, `borders.radius`)
89
83
  - `role`: semantic role name (e.g., `primary`, `background`, `heading`)
@@ -102,12 +96,10 @@ Filter for `status: "pending"` tasks. For each:
102
96
 
103
97
  ### 3. Mark tasks as ready for review
104
98
 
105
- After applying each task, mark it:
99
+ After applying each task:
106
100
 
107
101
  ```bash
108
- curl -s -X PATCH $BASE_URL/__annotask/api/tasks/TASK_ID \
109
- -H "Content-Type: application/json" \
110
- -d '{"status": "review"}'
102
+ annotask update-task TASK_ID --status=review
111
103
  ```
112
104
 
113
105
  ### 4. Report to the user
@@ -125,7 +117,11 @@ If there are tasks with `status: "denied"` and a `feedback` field, the user reje
125
117
 
126
118
  ## Also check the live report
127
119
 
128
- 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.
120
+ ```bash
121
+ annotask report
122
+ ```
123
+
124
+ This returns both the live report (current session markup) and tasks. Use it 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.
129
125
 
130
126
  ## Task lifecycle
131
127
 
@@ -122,7 +122,36 @@ Search for:
122
122
 
123
123
  Use roles: `sm`, `md`, `lg`, `xl`, `full` (match by name or ascending size).
124
124
 
125
- ### 6. Detect icon library
125
+ ### 6. Scan breakpoints
126
+
127
+ Detect responsive breakpoints from whatever styling system the project uses. Output as a flat object mapping name → min-width value.
128
+
129
+ **Sources (check in order):**
130
+
131
+ 1. **Tailwind v4** (>= 4): Look in CSS files for `@theme` blocks defining `--breakpoint-*` custom properties, or `@custom-media` rules.
132
+
133
+ 2. **Tailwind v3** (< 4): Read `tailwind.config.{js,ts,mjs}`. Extract `theme.screens` or `theme.extend.screens`. Default Tailwind screens: `{ "sm": "640px", "md": "768px", "lg": "1024px", "xl": "1280px", "2xl": "1536px" }` — use these as fallback if Tailwind is detected but no custom screens are defined.
134
+
135
+ 3. **Bootstrap**: Check for `bootstrap` in package.json. Default Bootstrap breakpoints: `{ "sm": "576px", "md": "768px", "lg": "992px", "xl": "1200px", "xxl": "1400px" }`.
136
+
137
+ 4. **CSS custom properties**: Search `:root` for variables containing `breakpoint`, `screen`, `bp` in the name (e.g., `--bp-mobile: 480px`).
138
+
139
+ 5. **CSS `@media` patterns**: Scan `.css`, `.scss`, `.vue` files for `@media` queries with `min-width` or `max-width`. Extract the 3–6 most common breakpoint values and assign roles by ascending size: `sm`, `md`, `lg`, `xl`, `2xl`.
140
+
141
+ **Output example:**
142
+ ```json
143
+ "breakpoints": {
144
+ "sm": "640px",
145
+ "md": "768px",
146
+ "lg": "1024px",
147
+ "xl": "1280px",
148
+ "2xl": "1536px"
149
+ }
150
+ ```
151
+
152
+ If no breakpoints are detected, omit the `breakpoints` field (don't include an empty object).
153
+
154
+ ### 7. Detect icon library
126
155
 
127
156
  Check `package.json` dependencies for:
128
157
 
@@ -136,7 +165,7 @@ Check `package.json` dependencies for:
136
165
 
137
166
  Read the version from package.json.
138
167
 
139
- ### 7. Detect component library
168
+ ### 8. Detect component library
140
169
 
141
170
  Check `package.json` dependencies for:
142
171
 
@@ -157,7 +186,7 @@ grep -rh "from '${package}" --include='*.vue' --include='*.ts' --include='*.js'
157
186
 
158
187
  Extract component names from the imports. Read the version from package.json.
159
188
 
160
- ### 8. Write design spec
189
+ ### 9. Write design spec
161
190
 
162
191
  Create `.annotask/design-spec.json`:
163
192
 
@@ -190,6 +219,13 @@ Create `.annotask/design-spec.json`:
190
219
  { "role": "md", "value": "8px", "cssVar": "--radius-md", "source": "var(--radius-md)", "sourceFile": "src/assets/main.css", "sourceLine": 25 }
191
220
  ]
192
221
  },
222
+ "breakpoints": {
223
+ "sm": "640px",
224
+ "md": "768px",
225
+ "lg": "1024px",
226
+ "xl": "1280px",
227
+ "2xl": "1536px"
228
+ },
193
229
  "icons": {
194
230
  "library": "lucide",
195
231
  "version": "0.300.0"
@@ -202,11 +238,11 @@ Create `.annotask/design-spec.json`:
202
238
  }
203
239
  ```
204
240
 
205
- ### 9. Clean up old config
241
+ ### 10. Clean up old config
206
242
 
207
243
  If `.annotask/config.json` exists, delete it — it's been replaced by `design-spec.json`.
208
244
 
209
- ### 10. Update .gitignore
245
+ ### 11. Update .gitignore
210
246
 
211
247
  Check if `.gitignore` contains `.annotask/`. If not, append:
212
248
  ```
@@ -214,7 +250,7 @@ Check if `.gitignore` contains `.annotask/`. If not, append:
214
250
  .annotask/
215
251
  ```
216
252
 
217
- ### 11. Report to user
253
+ ### 12. Report to user
218
254
 
219
255
  Tell the user:
220
256
  - What was detected (framework, number of color/typography/spacing tokens, libraries)
@@ -16,19 +16,21 @@ Connect to the Annotask WebSocket and stream changes as the user makes them visu
16
16
 
17
17
  ## Steps
18
18
 
19
- 0. **Discover server URL** — read `.annotask/server.json` in the current working directory only (never parent directories):
19
+ 0. **Check server status**:
20
20
  ```bash
21
- cat .annotask/server.json
21
+ annotask status
22
22
  ```
23
- Use the `url` value as the server URL. If the file contains a `"mfe"` field, this is a micro-frontend setup — the server is running on a remote root shell. Save the `mfe` value for filtering. If not found, probe `curl -s http://localhost:24678/__annotask/api/status` then `curl -s http://localhost:5173/__annotask/api/status`. **Do NOT read server.json from parent or sibling directories.**
23
+ If this fails, the Annotask dev server isn't running. Ask the user to start it.
24
24
 
25
- 1. **Start watching** by running in the background:
25
+ 1. **Start watching**:
26
26
  ```bash
27
- npx @annotask/cli watch --port=PORT
27
+ annotask watch
28
28
  ```
29
- Or if the CLI isn't installed, poll the HTTP API:
29
+ This connects to the Annotask WebSocket and streams changes in real-time. If the CLI isn't installed globally, use `npx annotask watch`.
30
+
31
+ For a one-time snapshot instead of live streaming:
30
32
  ```bash
31
- curl -s $BASE_URL/__annotask/api/report
33
+ annotask report
32
34
  ```
33
35
 
34
36
  2. **Describe what you see** — as changes come in, summarize them in plain language:
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/api.ts","../src/server/ws-server.ts","../src/server/serve-shell.ts","../src/server/state.ts","../src/server/index.ts"],"sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\n\nexport interface APIOptions {\n getReport: () => unknown\n getConfig: () => unknown\n getDesignSpec: () => unknown\n getTasks: () => { version: string; tasks: any[] }\n updateTask: (id: string, updates: Record<string, unknown>) => unknown\n addTask: (task: Record<string, unknown>) => unknown\n}\n\nconst MAX_BODY_SIZE = 1_048_576\nconst VALID_TASK_STATUSES = new Set(['pending', 'applied', 'review', 'accepted', 'denied'])\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = ''\n let size = 0\n req.on('data', (chunk: Buffer) => {\n size += chunk.length\n if (size > MAX_BODY_SIZE) { req.destroy(); reject(new Error('Request body too large')); return }\n body += chunk.toString()\n })\n req.on('end', () => resolve(body))\n req.on('error', reject)\n })\n}\n\nfunction parseJSON(raw: string): { ok: true; data: unknown } | { ok: false } {\n try { return { ok: true, data: JSON.parse(raw) } } catch { return { ok: false } }\n}\n\nfunction sendError(res: ServerResponse, status: number, message: string) {\n res.statusCode = status\n res.end(JSON.stringify({ error: message }))\n}\n\nexport function createAPIMiddleware(options: APIOptions) {\n return async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n if (!req.url?.startsWith('/__annotask/api/')) return next()\n\n const path = req.url.replace('/__annotask/api/', '')\n\n res.setHeader('Content-Type', 'application/json')\n res.setHeader('Access-Control-Allow-Origin', '*')\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, OPTIONS')\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type')\n res.setHeader('Cache-Control', 'no-cache')\n\n if (req.method === 'OPTIONS') { res.statusCode = 200; res.end(); return }\n\n if (path === 'report' && req.method === 'GET') {\n res.end(JSON.stringify(options.getReport() ?? { version: '1.0', changes: [] }, null, 2))\n return\n }\n\n if (path === 'config' && req.method === 'GET') {\n res.end(JSON.stringify(options.getConfig(), null, 2))\n return\n }\n\n if (path === 'design-spec' && req.method === 'GET') {\n res.end(JSON.stringify(options.getDesignSpec(), null, 2))\n return\n }\n\n if (path.startsWith('tasks') && !path.startsWith('tasks/') && req.method === 'GET') {\n const urlObj = new URL(req.url!, `http://${req.headers.host || 'localhost'}`)\n const mfeFilter = urlObj.searchParams.get('mfe')\n const taskData = options.getTasks()\n if (mfeFilter) {\n const filtered = { ...taskData, tasks: taskData.tasks.filter((t: any) => t.mfe === mfeFilter) }\n res.end(JSON.stringify(filtered, null, 2))\n } else {\n res.end(JSON.stringify(taskData, null, 2))\n }\n return\n }\n\n if (path === 'tasks' && req.method === 'POST') {\n let raw: string\n try { raw = await readBody(req) } catch { return sendError(res, 413, 'Request body too large') }\n const parsed = parseJSON(raw)\n if (!parsed.ok) return sendError(res, 400, 'Invalid JSON body')\n const body = parsed.data as Record<string, unknown>\n if (!body || typeof body !== 'object' || Array.isArray(body)) return sendError(res, 400, 'Request body must be a JSON object')\n if (typeof body.type !== 'string' || !body.type) return sendError(res, 400, 'Missing required field: type (string)')\n if (typeof body.description !== 'string') return sendError(res, 400, 'Missing required field: description (string)')\n res.end(JSON.stringify(options.addTask(body), null, 2))\n return\n }\n\n if (path.startsWith('tasks/') && req.method === 'PATCH') {\n const id = path.replace('tasks/', '')\n let raw: string\n try { raw = await readBody(req) } catch { return sendError(res, 413, 'Request body too large') }\n const parsed = parseJSON(raw)\n if (!parsed.ok) return sendError(res, 400, 'Invalid JSON body')\n const body = parsed.data as Record<string, unknown>\n if (!body || typeof body !== 'object' || Array.isArray(body)) return sendError(res, 400, 'Request body must be a JSON object')\n if (body.status !== undefined && !VALID_TASK_STATUSES.has(body.status as string)) {\n return sendError(res, 400, `Invalid status. Must be one of: ${[...VALID_TASK_STATUSES].join(', ')}`)\n }\n res.end(JSON.stringify(options.updateTask(id, body), null, 2))\n return\n }\n\n if (path === 'status' && req.method === 'GET') {\n res.end(JSON.stringify({ status: 'ok', tool: 'annotask' }))\n return\n }\n\n res.statusCode = 404\n res.end(JSON.stringify({ error: 'Not found' }))\n }\n}\n","import { WebSocketServer, WebSocket } from 'ws'\nimport type { IncomingMessage } from 'node:http'\nimport type { Duplex } from 'node:stream'\n\nexport interface AnnotaskWSServer {\n handleUpgrade: (req: IncomingMessage, socket: Duplex, head: Buffer) => void\n broadcast: (event: string, data: unknown) => void\n getReport: () => unknown\n clients: Set<WebSocket>\n}\n\nexport function createWSServer(): AnnotaskWSServer {\n let currentReport: unknown = null\n const clients = new Set<WebSocket>()\n const wss = new WebSocketServer({ noServer: true })\n\n wss.on('connection', (ws) => {\n clients.add(ws)\n if (currentReport) {\n ws.send(JSON.stringify({ event: 'report:current', data: currentReport, timestamp: Date.now() }))\n }\n\n ws.on('message', (raw) => {\n try {\n const msg = JSON.parse(raw.toString())\n if (msg.event === 'report:updated') {\n currentReport = msg.data\n for (const client of clients) {\n if (client !== ws && client.readyState === WebSocket.OPEN) {\n client.send(JSON.stringify({ event: 'report:updated', data: msg.data, timestamp: Date.now() }))\n }\n }\n }\n if (msg.event === 'changes:cleared') {\n currentReport = null\n for (const client of clients) {\n if (client !== ws && client.readyState === WebSocket.OPEN) {\n client.send(JSON.stringify({ event: 'changes:cleared', data: null, timestamp: Date.now() }))\n }\n }\n }\n if (msg.event === 'get:report') {\n ws.send(JSON.stringify({ event: 'report:current', data: currentReport, timestamp: Date.now() }))\n }\n } catch {}\n })\n\n ws.on('close', () => { clients.delete(ws) })\n })\n\n return {\n handleUpgrade(req, socket, head) {\n wss.handleUpgrade(req, socket, head, (ws) => { wss.emit('connection', ws, req) })\n },\n broadcast(event, data) {\n const msg = JSON.stringify({ event, data, timestamp: Date.now() })\n for (const client of clients) {\n if (client.readyState === WebSocket.OPEN) client.send(msg)\n }\n },\n getReport() { return currentReport },\n clients,\n }\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nfunction findShellDist(): string {\n return path.resolve(__dirname, 'shell')\n}\n\nexport function createShellMiddleware() {\n const shellDist = findShellDist()\n\n return (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n if (!req.url?.startsWith('/__annotask')) return next()\n\n // CORS for cross-port access (Webpack standalone server)\n res.setHeader('Access-Control-Allow-Origin', '*')\n\n let filePath = req.url.replace('/__annotask', '') || '/'\n const queryIndex = filePath.indexOf('?')\n if (queryIndex !== -1) filePath = filePath.slice(0, queryIndex)\n if (filePath === '/' || filePath === '') filePath = '/index.html'\n\n // Skip API and WS paths\n if (filePath.startsWith('/api/') || filePath === '/ws') return next()\n\n const fullPath = path.join(shellDist, filePath)\n\n if (!fullPath.startsWith(shellDist)) {\n res.statusCode = 403\n res.end('Forbidden')\n return\n }\n\n if (!fs.existsSync(fullPath) || !fs.statSync(fullPath).isFile()) {\n const indexPath = path.join(shellDist, 'index.html')\n if (fs.existsSync(indexPath)) {\n res.setHeader('Content-Type', 'text/html')\n res.end(fs.readFileSync(indexPath, 'utf-8'))\n return\n }\n res.statusCode = 404\n res.end('Annotask shell not built. Run: pnpm build:shell')\n return\n }\n\n const ext = path.extname(fullPath)\n const contentTypes: Record<string, string> = {\n '.html': 'text/html', '.js': 'application/javascript', '.css': 'text/css',\n '.json': 'application/json', '.svg': 'image/svg+xml', '.png': 'image/png', '.ico': 'image/x-icon',\n }\n res.setHeader('Content-Type', contentTypes[ext] || 'application/octet-stream')\n res.end(fs.readFileSync(fullPath))\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nconst DEFAULT_DESIGN_SPEC = {\n initialized: false,\n version: '1.0' as const,\n framework: null,\n colors: [],\n typography: { families: [], scale: [], weights: [] },\n spacing: [],\n borders: { radius: [] },\n icons: null,\n components: null,\n}\n\nexport interface ProjectState {\n getDesignSpec: () => unknown\n getConfig: () => unknown\n getTasks: () => { version: string; tasks: any[] }\n addTask: (task: Record<string, unknown>) => unknown\n updateTask: (id: string, updates: Record<string, unknown>) => unknown\n dispose: () => void\n}\n\nexport function createProjectState(projectRoot: string, broadcast: (event: string, data: unknown) => void): ProjectState {\n let cachedDesignSpec: unknown = null\n let specWatcher: fs.FSWatcher | null = null\n const tasksPath = path.join(projectRoot, '.annotask', 'tasks.json')\n\n function getDesignSpec(): unknown {\n if (cachedDesignSpec !== null) return cachedDesignSpec\n const specPath = path.join(projectRoot, '.annotask', 'design-spec.json')\n try {\n cachedDesignSpec = { initialized: true, ...JSON.parse(fs.readFileSync(specPath, 'utf-8')) }\n } catch {\n cachedDesignSpec = DEFAULT_DESIGN_SPEC\n }\n if (!specWatcher) {\n const configDir = path.join(projectRoot, '.annotask')\n try {\n if (!fs.existsSync(configDir)) fs.mkdirSync(configDir, { recursive: true })\n specWatcher = fs.watch(configDir, (_, filename) => {\n cachedDesignSpec = null\n if (filename === 'design-spec.json') broadcast('designspec:updated', null)\n })\n } catch { cachedDesignSpec = null }\n }\n return cachedDesignSpec ?? DEFAULT_DESIGN_SPEC\n }\n\n function getConfig(): unknown {\n const spec = getDesignSpec() as any\n return { initialized: !!spec?.initialized, ...spec }\n }\n\n function readTasks(): { version: string; tasks: any[] } {\n try { return JSON.parse(fs.readFileSync(tasksPath, 'utf-8')) } catch { return { version: '1.0', tasks: [] } }\n }\n\n function writeTasks(data: { version: string; tasks: any[] }) {\n const dir = path.dirname(tasksPath)\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n fs.writeFileSync(tasksPath, JSON.stringify(data, null, 2))\n }\n\n function addTask(task: Record<string, unknown>) {\n const data = readTasks()\n const id = `task-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`\n const newTask = { id, status: 'pending', createdAt: Date.now(), updatedAt: Date.now(), ...task }\n data.tasks.push(newTask)\n writeTasks(data)\n broadcast('tasks:updated', data)\n return newTask\n }\n\n function updateTask(id: string, updates: Record<string, unknown>) {\n const data = readTasks()\n const task = data.tasks.find((t: any) => t.id === id)\n if (!task) return { error: 'Task not found' }\n Object.assign(task, updates, { updatedAt: Date.now() })\n if (updates.status === 'accepted') data.tasks = data.tasks.filter((t: any) => t.id !== id)\n writeTasks(data)\n broadcast('tasks:updated', data)\n return task\n }\n\n function dispose() {\n if (specWatcher) { specWatcher.close(); specWatcher = null }\n }\n\n return { getDesignSpec, getConfig, getTasks: readTasks, addTask, updateTask, dispose }\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { Duplex } from 'node:stream'\nimport { createAPIMiddleware } from './api.js'\nimport { createWSServer, type AnnotaskWSServer } from './ws-server.js'\nimport { createShellMiddleware } from './serve-shell.js'\nimport { createProjectState, type ProjectState } from './state.js'\n\nexport interface AnnotaskServer {\n middleware: (req: IncomingMessage, res: ServerResponse, next: () => void) => void\n handleUpgrade: (req: IncomingMessage, socket: Duplex, head: Buffer) => void\n broadcast: (event: string, data: unknown) => void\n getReport: () => unknown\n dispose: () => void\n}\n\nexport interface AnnotaskServerOptions {\n projectRoot: string\n}\n\nexport function createAnnotaskServer(options: AnnotaskServerOptions): AnnotaskServer {\n const wsServer = createWSServer()\n const state = createProjectState(options.projectRoot, wsServer.broadcast)\n\n const apiMiddleware = createAPIMiddleware({\n getReport: () => wsServer.getReport(),\n getConfig: () => state.getConfig(),\n getDesignSpec: () => state.getDesignSpec(),\n getTasks: () => state.getTasks(),\n addTask: (task) => state.addTask(task),\n updateTask: (id, updates) => state.updateTask(id, updates),\n })\n\n const shellMiddleware = createShellMiddleware()\n\n const middleware = (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n // API first, then shell (shell is SPA fallback)\n apiMiddleware(req, res, () => {\n shellMiddleware(req, res, next)\n })\n }\n\n return {\n middleware,\n handleUpgrade: (req, socket, head) => wsServer.handleUpgrade(req, socket, head),\n broadcast: (event, data) => wsServer.broadcast(event, data),\n getReport: () => wsServer.getReport(),\n dispose: () => state.dispose(),\n }\n}\n\nexport { createProjectState, type ProjectState } from './state.js'\nexport { createWSServer, type AnnotaskWSServer } from './ws-server.js'\nexport { createAPIMiddleware, type APIOptions } from './api.js'\nexport { createShellMiddleware } from './serve-shell.js'\n"],"mappings":"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","names":["path","fs","path"]}
@@ -1 +0,0 @@
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-90efa075]{display:flex;gap:2px;margin-left:4px;align-items:center}.mode-btn[data-v-90efa075]{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-90efa075]:hover{background:var(--border);color:var(--text)}.mode-btn.active[data-v-90efa075]{background:var(--accent);border-color:var(--accent);color:#fff}.mode-btn.mode-interact.active[data-v-90efa075]{background:#6366f1;border-color:#6366f1}.mode-btn.arrow.active[data-v-90efa075]{background:#ef4444;border-color:#ef4444}.mode-btn.draw.active[data-v-90efa075]{background:#22c55e;border-color:#22c55e}.mode-btn.mode-highlight.active[data-v-90efa075]{background:#f59e0b;border-color:#f59e0b}.mode-sep[data-v-90efa075]{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-f9630085]{display:flex;flex-direction:column;gap:14px}.section-label[data-v-f9630085]{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-f9630085]{display:flex;flex-wrap:wrap;gap:4px}.action-btn[data-v-f9630085]{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-f9630085]:hover{background:var(--border);color:var(--accent);border-color:var(--accent)}.note-input[data-v-f9630085]{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-f9630085]:focus{border-color:var(--accent)}.submit-btn[data-v-f9630085]{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-f9630085]:disabled{opacity:.4;cursor:not-allowed}.submit-btn[data-v-f9630085]:hover:not(:disabled){opacity:.9}.task-toggles[data-v-f9630085]{display:flex;gap:10px;margin-top:4px}.note-actions[data-v-f9630085]{display:flex;align-items:center;gap:8px;margin-top:4px}.history-toggle[data-v-f9630085]{display:flex;align-items:center;gap:4px;font-size:10px;color:var(--text-muted);cursor:pointer;white-space:nowrap}.history-toggle input[data-v-f9630085]{margin:0}.history-toggle span[data-v-f9630085]{-webkit-user-select:none;user-select:none}.pin-item[data-v-f9630085]{display:flex;align-items:flex-start;gap:8px;padding:6px 8px;border-radius:5px;cursor:pointer;transition:background .1s}.pin-item[data-v-f9630085]:hover{background:var(--surface-2)}.pin-item.selected[data-v-f9630085]{background:var(--surface-2);border:1px solid var(--accent)}.pin-badge[data-v-f9630085]{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-f9630085]{background:#a855f7}.pin-content[data-v-f9630085]{flex:1;min-width:0}.pin-file[data-v-f9630085]{font-size:10px;color:var(--accent);display:block;margin-bottom:2px}.pin-action[data-v-f9630085]{font-size:10px;color:#a855f7;font-weight:600;display:block}.pin-note[data-v-f9630085]{font-size:11px;color:var(--text);display:block;word-break:break-word}.pin-empty[data-v-f9630085]{font-size:10px;color:var(--text-muted);font-style:italic}.pin-delete[data-v-f9630085]{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-f9630085]{display:flex}.pin-delete[data-v-f9630085]:hover{color:var(--danger, #ef4444)}.empty-hint[data-v-f9630085]{font-size:11px;color:var(--text-muted);text-align:center;padding:12px 0}.task-review[data-v-f9630085]{border-top:1px solid var(--border, #2a2a2a);padding-top:10px}.task-item[data-v-f9630085]{padding:6px 8px;border-radius:5px;margin-bottom:4px;border:1px solid var(--border, #2a2a2a)}.task-item.review[data-v-f9630085]{border-color:#f59e0b;background:#f59e0b0d}.task-item.denied[data-v-f9630085]{border-color:#ef4444;background:#ef44440d}.task-item.pending[data-v-f9630085]{border-color:var(--border, #2a2a2a)}.task-header[data-v-f9630085]{display:flex;align-items:center;gap:6px;margin-bottom:3px}.task-status-badge[data-v-f9630085]{font-size:8px;font-weight:700;padding:1px 5px;border-radius:3px;text-transform:uppercase}.task-status-badge.pending[data-v-f9630085]{background:#71717a33;color:#71717a}.task-status-badge.review[data-v-f9630085]{background:#f59e0b33;color:#f59e0b}.task-status-badge.denied[data-v-f9630085]{background:#ef444433;color:#ef4444}.task-desc[data-v-f9630085]{font-size:11px;color:var(--text, #e4e4e7)}.task-file[data-v-f9630085]{font-size:9px;color:var(--text-muted, #71717a);display:block;margin-bottom:3px}.task-feedback[data-v-f9630085]{font-size:10px;color:#ef4444;font-style:italic;margin-bottom:3px}.task-actions[data-v-f9630085]{display:flex;gap:4px;align-items:center;margin-top:4px}.task-accept[data-v-f9630085]{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-f9630085]:hover{background:#22c55e;color:#fff}.task-deny[data-v-f9630085]{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-f9630085]:hover{background:#ef4444;color:#fff}.deny-input[data-v-f9630085]{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-f9630085]{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-f9630085]: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}.viewport-selector[data-v-0f350755]{position:relative}.vp-trigger[data-v-0f350755]{display:flex;align-items:center;gap:4px;padding:3px 8px;border:1px solid var(--border);border-radius:5px;background:var(--surface-2);color:var(--text-muted);font-size:11px;cursor:pointer;transition:all .1s;white-space:nowrap}.vp-trigger[data-v-0f350755]:hover{background:var(--border);color:var(--text)}.vp-label[data-v-0f350755]{font-family:monospace;font-size:11px}.vp-dropdown[data-v-0f350755]{position:absolute;top:100%;left:50%;transform:translate(-50%);margin-top:4px;min-width:220px;background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #0006;padding:4px;z-index:100;max-height:400px;overflow-y:auto}.vp-group[data-v-0f350755]{margin-top:2px}.vp-group-title[data-v-0f350755]{padding:4px 8px 2px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);opacity:.6}.vp-item[data-v-0f350755]{display:flex;align-items:center;justify-content:space-between;width:100%;padding:5px 8px;border:none;border-radius:4px;background:transparent;color:var(--text);font-size:11px;cursor:pointer;transition:background .1s}.vp-item[data-v-0f350755]:hover{background:var(--surface-2)}.vp-item.active[data-v-0f350755]{background:var(--accent);color:#fff}.vp-item-label[data-v-0f350755]{flex:1;text-align:left}.vp-item-dim[data-v-0f350755]{font-family:monospace;font-size:10px;color:var(--text-muted)}.vp-item.active .vp-item-dim[data-v-0f350755]{color:#ffffffb3}.vp-custom[data-v-0f350755]{margin-top:2px;border-top:1px solid var(--border);padding-top:4px}.vp-custom-row[data-v-0f350755]{display:flex;align-items:center;gap:4px;padding:4px 8px}.vp-input[data-v-0f350755]{width:56px;padding:3px 6px;border:1px solid var(--border);border-radius:4px;background:var(--surface-2);color:var(--text);font-size:11px;font-family:monospace;text-align:center}.vp-input[data-v-0f350755]:focus{outline:none;border-color:var(--accent)}.vp-x[data-v-0f350755]{color:var(--text-muted);font-size:10px}.vp-apply[data-v-0f350755]{padding:3px 8px;border:1px solid var(--accent);border-radius:4px;background:var(--accent);color:#fff;font-size:10px;font-weight:600;cursor:pointer}.vp-apply[data-v-0f350755]:hover{opacity:.9}.vp-rotate[data-v-0f350755]{margin-top:2px;border-top:1px solid var(--border);padding-top:4px;gap:6px}*,*: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}.canvas-area.viewport-active{display:flex;align-items:flex-start;justify-content:center;overflow:auto;background:#0a0a0a;padding:16px}.app-iframe{width:100%;height:100%;border:none}.canvas-area.viewport-active .app-iframe{flex-shrink:0;border-radius:6px;box-shadow:0 0 0 1px var(--border),0 4px 24px #00000080}.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;padding:8px 14px}.changes-list{max-height:120px;overflow-y:auto;margin-bottom:6px}.change-item{display:flex;align-items:center;gap:6px;padding:2px 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}.changes-actions{display:flex;align-items:center;gap:6px}.changes-count{font-size:10px;color:var(--text-muted);flex:1}.changes-commit{padding:4px 12px;font-size:11px;font-weight:600;background:var(--accent);color:#fff;border:none;border-radius:5px;cursor:pointer}.changes-commit:hover{opacity:.9}.changes-discard{padding:4px 12px;font-size:11px;background:var(--surface-2);color:var(--text-muted);border:1px solid var(--border);border-radius:5px;cursor:pointer}.changes-discard:hover{background:var(--border);color:var(--text)}.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)}.task-toggles{display:flex;gap:10px;margin-bottom:4px}.scan-btn{padding:3px 10px;font-size:10px;font-weight:600;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer}.scan-btn:disabled{opacity:.5;cursor:default}.scan-btn:hover:not(:disabled){opacity:.9}.a11y-error{font-size:11px;color:#ef4444;padding:6px 8px;background:#ef44441a;border-radius:5px;margin-bottom:6px}.a11y-pass{display:flex;align-items:center;gap:6px;padding:8px 10px;border-radius:6px;font-size:11px;font-weight:600;background:#22c55e1f;color:#22c55e;border:1px solid rgba(34,197,94,.25)}.a11y-empty{font-size:11px;color:var(--text-muted);padding:20px 0;text-align:center}.a11y-summary{font-size:11px;font-weight:600;color:#ef4444;padding:6px 8px;border-radius:5px;margin-bottom:4px;background:#ef444414;border:1px solid rgba(239,68,68,.2)}.a11y-card{padding:8px;border-radius:6px;margin-bottom:6px;background:var(--surface-2);border-left:3px solid var(--border)}.a11y-card.critical{border-left-color:#dc2626}.a11y-card.serious{border-left-color:#ef4444}.a11y-card.moderate{border-left-color:#f59e0b}.a11y-card.minor{border-left-color:#6b7280}.a11y-card-header{display:flex;align-items:center;gap:6px;font-size:11px}.a11y-impact{font-size:9px;font-weight:700;text-transform:uppercase;padding:1px 5px;border-radius:3px;color:#fff}.a11y-impact.critical{background:#dc2626}.a11y-impact.serious{background:#ef4444}.a11y-impact.moderate{background:#f59e0b}.a11y-impact.minor{background:#6b7280}.a11y-rule{font-weight:600;color:var(--text)}.a11y-count{margin-left:auto;color:var(--text-muted);font-size:10px}.a11y-help{margin:4px 0 6px;font-size:11px;color:var(--text-muted);line-height:1.4}.a11y-fix-btn{padding:3px 10px;font-size:10px;font-weight:600;background:#3b82f61f;color:#3b82f6;border:1px solid rgba(59,130,246,.25);border-radius:4px;cursor:pointer}.a11y-fix-btn:hover{background:#3b82f6;color:#fff}.a11y-tasked{font-size:10px;color:#22c55e;font-weight:600}.history-toggle{display:flex;align-items:center;gap:4px;font-size:10px;color:var(--text-muted);cursor:pointer;white-space:nowrap}.history-toggle input{margin:0}.history-toggle span{-webkit-user-select:none;user-select:none}.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)}