diff --git a/AGENTS.md b/AGENTS.md
index c0ece2d1f..f1d6f32f6 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -273,6 +273,7 @@ Self-review checklist:
- Use reka-ui for UI components (Splitter, ContextMenu, DropdownMenu, etc.)
- Vue UI styling APIs follow the Nuxt UI architecture: static Tailwind Variants themes live under `src/theme/**` with `slots`, `variants`, `compoundVariants`, and `defaultVariants`; components resolve the theme with `tv()` and merge per-instance `ui` overrides at each rendered slot. Single-root components expose `class` rather than a one-slot `ui` object. Do not add one-off `fooClass`, `barClass`, `emptyActionClass`, etc. props. Use `UI` casing in type names (`SelectUI`, not `SelectUi`).
+- Steiger parses Vue templates and rejects visual-state Tailwind utility branches, template-time `use*UI()` calls, and raw SVG app icons. Bind semantic state through `data-*` attributes and resolve typed theme variants in script instead of bypassing the rule.
- Storybook is the internal component-state workshop (`bun run storybook`, `bun run build-storybook`), while VitePress is the canonical public SDK documentation. Colocate `*.stories.ts` with app UI components and use toolbar themes for light/dark states instead of adding test-only routes or showcase pages to the app.
- Reuse colocated Vue demo components between Storybook and VitePress rather than maintaining separate examples. Style shared demos with Tailwind; the docs theme scans Vue SDK primitive demos through its dedicated Tailwind source.
- Public component API tables are generated from Vue source and JSDoc with `vue-component-meta`; do not manually duplicate props, events, slots, or exposed APIs in Markdown. SDK examples are processed by VitePress Twoslash and must resolve against the public `@open-pencil/vue` API.
diff --git a/src/app.css b/src/app.css
index a24ecec14..da781610b 100644
--- a/src/app.css
+++ b/src/app.css
@@ -57,6 +57,7 @@
--color-warning-text: #fde68a;
--color-warning-action: #fcd34d;
--color-success: #4ade80;
+ --color-error: #f87171;
--color-success-bg: #16a34a;
--color-success-bg-hover: #15803d;
--color-code-tag: #7dd3fc;
@@ -93,6 +94,7 @@ html[data-theme='light'] {
--color-warning-text: #92400e;
--color-warning-action: #78350f;
--color-success: #15803d;
+ --color-error: #b91c1c;
--color-success-bg: #16a34a;
--color-success-bg-hover: #15803d;
--color-code-tag: #0369a1;
diff --git a/src/components/CollabPanel/CollabAvatarStack.vue b/src/components/CollabPanel/CollabAvatarStack.vue
index c5f3491d1..48847126a 100644
--- a/src/components/CollabPanel/CollabAvatarStack.vue
+++ b/src/components/CollabPanel/CollabAvatarStack.vue
@@ -1,13 +1,22 @@
@@ -15,7 +24,7 @@ const { dialogs } = useI18n()