30332cca99
The user font-size preference applies CSS `zoom` on `<html>` (see `composables/useFont.ts`). This breaks every popover that anchors itself with `getBoundingClientRect()` + `position: fixed/absolute`, because the rect is in visual pixels while CSS lengths are then multiplied by zoom again — shifting popovers toward the lower-right and miscomputing maxHeight / width / viewport-edge clamping. PR #1459 patched only `AgentSelector.vue` (and left its width/maxHeight unfixed). This PR introduces a shared helper `frontend/src/utils/zoom.ts` (`getRootZoom`, `rectToCssPx`, `cssViewportSize`) and applies it to every affected popover: - `AgentSelector.vue` — refactored to use the helper; also normalizes `width` and `maxHeight` (previously still in visual px). - `Input-field.vue` — model dropdown, mention popup (typed @ and button- triggered), and agent-mode dropdown. - `KnowledgeBaseSelector.vue` — primary anchor path and fallback path. - `UserMenu.vue` — tenant and IM floating submenus + viewport clamp. - `FAQTagTooltip.vue` — fixed tooltip positioning + edge clamp. - `AgentEditorModal.vue` — placeholder popups for system_prompt, context_template, and rewrite/fallback prompts. - `AgentStreamDisplay.vue` — `kb-float-popup` (absolute under body, also under the zoom containing block). Verified with `npm --prefix frontend run build`.