veza/apps/web/src/utils/fixDisplayIssues.ts

751 lines
38 KiB
TypeScript
Raw Normal View History

/**
* Utility to fix display issues in development
* - Removes grid overlay if accidentally enabled
* - Clears offline queue if needed
*
* NOTE: Les fixes pour "lignes verticales" ont é supprimés car le problème réel
* était le style de focus des inputs, maintenant corrigé dans les composants Input.
* Ce fichier est conservé pour les outils de diagnostic uniquement.
*/
export function fixDisplayIssues(): void {
if (typeof window === 'undefined') return;
// #region agent log
const logData = {location:'fixDisplayIssues.ts:8',message:'fixDisplayIssues called',data:{readyState:document.readyState},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'};
console.log('[DEBUG]', logData);
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(logData)}).catch((e)=>console.error('[DEBUG] Log fetch failed:',e));
// #endregion
// FIX: Supprimer complètement la scrollbar visible en dev si elle cause des problèmes
// Ajouter un style global pour masquer ou réduire la scrollbar
const scrollbarFixId = 'fix-scrollbar-visibility';
let scrollbarFix = document.getElementById(scrollbarFixId) as HTMLStyleElement | null;
if (!scrollbarFix) {
scrollbarFix = document.createElement('style');
scrollbarFix.id = scrollbarFixId;
scrollbarFix.textContent = `
/* FIX: Réduire la visibilité de la scrollbar pour éviter les distractions visuelles */
::-webkit-scrollbar {
width: 4px !important;
height: 4px !important;
}
::-webkit-scrollbar-track {
background: transparent !important;
}
::-webkit-scrollbar-thumb {
background: rgba(0, 255, 247, 0.1) !important;
border-radius: 2px !important;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(0, 255, 247, 0.2) !important;
}
/* Firefox */
* {
scrollbar-width: thin !important;
scrollbar-color: rgba(0, 255, 247, 0.1) transparent !important;
}
`;
// Ajouter le fix au début du head pour priorité maximale
document.head.insertBefore(scrollbarFix, document.head.firstChild);
}
// FIX: Add a "clean mode" that disables ALL visual effects
if (import.meta.env.DEV) {
(window as any).__enableCleanMode = () => {
console.log('[FixDisplay] Enabling CLEAN MODE - disabling all visual effects');
const cleanStyle = document.createElement('style');
cleanStyle.id = 'fix-display-clean-mode';
cleanStyle.textContent = `
/* CLEAN MODE: Disable all visual effects */
body::before,
body::after {
display: none !important;
}
*::before,
*::after {
display: none !important;
}
/* Remove all borders */
* {
border-left: none !important;
border-right: none !important;
}
/* Keep only essential borders for inputs */
input, textarea, select {
border: 1px solid rgba(255, 255, 255, 0.2) !important;
}
`;
document.head.appendChild(cleanStyle);
console.log('[FixDisplay] Clean mode enabled. All visual effects disabled.');
};
(window as any).__disableCleanMode = () => {
const cleanStyle = document.getElementById('fix-display-clean-mode');
if (cleanStyle) {
cleanStyle.remove();
console.log('[FixDisplay] Clean mode disabled.');
}
};
// FIX: Add visual inspection helper to identify the source of vertical line
// This will help us find the exact element causing the issue
// Helper to find and highlight all suspicious vertical elements
(window as any).__findVerticalLines = () => {
console.log('[FixDisplay] Scanning for vertical lines...');
const allElements = document.querySelectorAll('*');
const suspicious: Array<{element: HTMLElement, reason: string, styles: any}> = [];
allElements.forEach((el) => {
const htmlEl = el as HTMLElement;
const computed = window.getComputedStyle(htmlEl);
const rect = htmlEl.getBoundingClientRect();
// Check for narrow vertical elements
if (rect.width > 0 && rect.width < 10 && rect.height > window.innerHeight * 0.3) {
suspicious.push({
element: htmlEl,
reason: `Narrow vertical element: ${rect.width}px x ${rect.height}px`,
styles: {
position: computed.position,
zIndex: computed.zIndex,
borderLeft: computed.borderLeftWidth,
borderRight: computed.borderRightWidth,
background: computed.background,
backgroundImage: computed.backgroundImage?.substring(0, 100),
}
});
}
// Check for vertical borders
const borderLeft = parseInt(computed.borderLeftWidth);
const borderRight = parseInt(computed.borderRightWidth);
if ((borderLeft > 0 || borderRight > 0) && rect.height > window.innerHeight * 0.5) {
suspicious.push({
element: htmlEl,
reason: `Vertical border: left=${borderLeft}px, right=${borderRight}px`,
styles: {
position: computed.position,
zIndex: computed.zIndex,
width: rect.width,
height: rect.height,
}
});
}
});
console.log(`[FixDisplay] Found ${suspicious.length} suspicious elements:`, suspicious);
suspicious.forEach((s, i) => {
s.element.style.outline = `3px solid ${i % 2 === 0 ? 'red' : 'yellow'}`;
s.element.style.outlineOffset = '2px';
console.log(`[FixDisplay] ${i + 1}. ${s.reason}`, s.styles);
});
return suspicious;
};
(window as any).__inspectVerticalLine = () => {
console.log('[FixDisplay] Inspecting all elements for vertical line source...');
const allElements = document.querySelectorAll('*');
const candidates: Array<{
element: HTMLElement;
tag: string;
id: string;
className: string;
rect: DOMRect;
styles: {
position: string;
zIndex: string;
background: string;
backgroundImage: string;
borderLeft: string;
borderRight: string;
left: string;
width: string;
};
}> = [];
allElements.forEach((el) => {
const htmlEl = el as HTMLElement;
const computed = window.getComputedStyle(htmlEl);
const rect = htmlEl.getBoundingClientRect();
// Look for elements that could create a vertical line:
// 1. Fixed/absolute positioned elements
// 2. Elements with narrow width (< 20px) and full height
// 3. Elements with vertical borders
// 4. Elements with vertical gradients
const isFixedOrAbsolute = computed.position === 'fixed' || computed.position === 'absolute';
const isNarrowAndTall = rect.width < 20 && rect.width > 0 && rect.height > window.innerHeight * 0.5;
const hasVerticalBorder = parseInt(computed.borderLeftWidth) > 0 || parseInt(computed.borderRightWidth) > 0;
const hasVerticalGradient = (computed.backgroundImage || '').includes('90deg');
const isCentered = Math.abs(rect.left + rect.width / 2 - window.innerWidth / 2) < 50;
if ((isFixedOrAbsolute || isNarrowAndTall) && (hasVerticalBorder || hasVerticalGradient || isCentered)) {
candidates.push({
element: htmlEl,
tag: el.tagName,
id: el.id || '',
className: el.className?.toString().substring(0, 100) || '',
rect,
styles: {
position: computed.position,
zIndex: computed.zIndex,
background: computed.background.substring(0, 100),
backgroundImage: computed.backgroundImage.substring(0, 100),
borderLeft: computed.borderLeft,
borderRight: computed.borderRight,
left: computed.left,
width: computed.width,
},
});
}
});
// Sort by z-index (highest first) and log top candidates
candidates.sort((a, b) => parseInt(a.styles.zIndex) - parseInt(b.styles.zIndex));
console.log(`[FixDisplay] Found ${candidates.length} potential sources of vertical line:`, candidates.slice(0, 10));
// Highlight top 5 candidates
candidates.slice(0, 5).forEach((candidate, i) => {
candidate.element.style.outline = `3px solid ${['red', 'orange', 'yellow', 'green', 'blue'][i]}`;
candidate.element.style.outlineOffset = '2px';
console.log(`[FixDisplay] Candidate ${i + 1} (${['red', 'orange', 'yellow', 'green', 'blue'][i]} outline):`, {
tag: candidate.tag,
id: candidate.id,
className: candidate.className,
position: candidate.styles.position,
zIndex: candidate.styles.zIndex,
rect: { left: candidate.rect.left, top: candidate.rect.top, width: candidate.rect.width, height: candidate.rect.height },
styles: candidate.styles,
});
});
return candidates;
};
console.log('[FixDisplay] Visual inspection helper available. Run __inspectVerticalLine() in console to find the source.');
}
// 1. Remove grid overlay if present
const gridOverlay = document.getElementById('grid-overlay');
// #region agent log
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'fixDisplayIssues.ts:12',message:'Grid overlay check',data:{found:!!gridOverlay,exists:gridOverlay!==null},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});
// #endregion
if (gridOverlay) {
gridOverlay.remove();
console.log('[FixDisplay] Grid overlay removed');
// #region agent log
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'fixDisplayIssues.ts:16',message:'Grid overlay removed',data:{},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});
// #endregion
}
// 1.5. Force remove repeating-linear-gradient from body::before (CSS cache issue)
// HYPOTHESIS A: CSS gradient still present due to browser cache
// HYPOTHESIS B: Another CSS file loads after and reapplies gradient
// HYPOTHESIS C: body::after has a gradient that creates vertical line
// HYPOTHESIS D: An element DOM with inline style creates the line
if (typeof document !== 'undefined' && document.head) {
const styleId = 'fix-display-override';
let overrideStyle = document.getElementById(styleId) as HTMLStyleElement | null;
// #region agent log
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'fixDisplayIssues.ts:checkOverride',message:'Checking CSS override',data:{overrideExists:!!overrideStyle,headExists:!!document.head},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});
// #endregion
// Check computed style of body::before to see if gradient is still present
try {
const bodyBefore = window.getComputedStyle(document.body, '::before');
const bgImage = bodyBefore.backgroundImage || bodyBefore.background || '';
const bg = bodyBefore.background || '';
// #region agent log
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'fixDisplayIssues.ts:checkBodyBefore',message:'Checking body::before computed style',data:{backgroundImage:bgImage.substring(0,150),background:bg.substring(0,150),hasGradient:bgImage.includes('repeating-linear-gradient')||bgImage.includes('linear-gradient')||bg.includes('repeating-linear-gradient')||bg.includes('linear-gradient'),display:bodyBefore.display,opacity:bodyBefore.opacity},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});
// #endregion
} catch (e) {
// #region agent log
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'fixDisplayIssues.ts:checkBodyBeforeError',message:'Error checking body::before',data:{error:String(e)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});
// #endregion
}
// Check body::after for vertical gradient (HYPOTHESIS C)
try {
const bodyAfter = window.getComputedStyle(document.body, '::after');
const bgImageAfter = bodyAfter.backgroundImage || bodyAfter.background || '';
// #region agent log
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'fixDisplayIssues.ts:checkBodyAfter',message:'Checking body::after computed style',data:{backgroundImage:bgImageAfter.substring(0,150),hasGradient:bgImageAfter.includes('repeating-linear-gradient')||bgImageAfter.includes('linear-gradient'),display:bodyAfter.display,opacity:bodyAfter.opacity,zIndex:bodyAfter.zIndex},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C'})}).catch(()=>{});
// #endregion
} catch (e) {
// #region agent log
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'fixDisplayIssues.ts:checkBodyAfterError',message:'Error checking body::after',data:{error:String(e)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C'})}).catch(()=>{});
// #endregion
}
// Check for DOM elements with inline styles or computed styles that could create vertical line (HYPOTHESIS D, E)
try {
const allElements = document.querySelectorAll('*');
const elementsWithVerticalGradients: Array<{tag:string,id:string,className:string,computedBg:string,inlineStyle:string}> = [];
allElements.forEach((el) => {
const htmlEl = el as HTMLElement;
const inlineStyle = htmlEl.style.cssText || '';
const computedStyle = window.getComputedStyle(htmlEl);
const computedBg = computedStyle.backgroundImage || computedStyle.background || '';
// Check for vertical gradients (90deg) in both inline styles and computed styles
const hasVerticalGradient =
(inlineStyle.includes('90deg') && (inlineStyle.includes('linear-gradient') || inlineStyle.includes('repeating-linear-gradient'))) ||
(computedBg.includes('90deg') && (computedBg.includes('linear-gradient') || computedBg.includes('repeating-linear-gradient')));
if (hasVerticalGradient) {
elementsWithVerticalGradients.push({
tag: el.tagName,
id: el.id || '',
className: el.className?.toString().substring(0,50) || '',
computedBg: computedBg.substring(0,150),
inlineStyle: inlineStyle.substring(0,100)
});
}
});
if (elementsWithVerticalGradients.length > 0) {
// #region agent log
const logData = {location:'fixDisplayIssues.ts:checkVerticalGradients',message:'Found elements with vertical gradients',data:{count:elementsWithVerticalGradients.length,elements:elementsWithVerticalGradients.slice(0,10)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'};
console.log('[DEBUG] Vertical gradients found:', logData);
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(logData)}).catch((e)=>console.error('[DEBUG] Log fetch failed:',e));
// #endregion
// FIX: Remove vertical gradients from found elements
elementsWithVerticalGradients.forEach(({tag, id, className}) => {
const element = id ? document.getElementById(id) :
className ? document.querySelector(`.${className.split(' ')[0]}`) : null;
if (element) {
const htmlEl = element as HTMLElement;
const currentBg = htmlEl.style.backgroundImage || '';
if (currentBg.includes('90deg')) {
// Remove vertical gradient, keep only horizontal
const newBg = currentBg.replace(/linear-gradient\(90deg[^)]+\)/g, '').replace(/,\s*,/g, ',').replace(/^,\s*|,\s*$/g, '');
htmlEl.style.backgroundImage = newBg || 'none';
console.log(`[FixDisplay] Removed vertical gradient from ${tag}${id ? '#' + id : ''}${className ? '.' + className.split(' ')[0] : ''}`);
}
}
});
}
} catch (e) {
// #region agent log
const logData = {location:'fixDisplayIssues.ts:checkVerticalGradientsError',message:'Error checking vertical gradients',data:{error:String(e)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'};
console.error('[DEBUG]', logData);
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(logData)}).catch(()=>{});
// #endregion
}
// Always recreate the override to ensure it's applied (in case CSS loads after)
if (overrideStyle) {
overrideStyle.remove();
}
overrideStyle = document.createElement('style');
overrideStyle.id = styleId;
// FIX: Aggressively remove ALL gradients from body::before and body::after
// This ensures no vertical lines appear even if CSS is cached or loads after
// Remove any repeating-linear-gradient with 90deg (vertical) from body::before
overrideStyle.textContent = `
/* FIX: Aggressively remove ALL vertical lines and gradients */
body::before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E") !important;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E") !important;
border-left: none !important;
border-right: none !important;
left: 0 !important;
right: 0 !important;
width: 100% !important;
margin: 0 !important;
padding: 0 !important;
}
body::after {
display: none !important;
border-left: none !important;
border-right: none !important;
}
/* FIX: Remove any element on the right edge that could create a line */
body > *:last-child {
border-right: none !important;
}
html {
border-right: none !important;
overflow-x: hidden !important;
}
/* FIX: Hide .btn-premium::before shine effect that uses 90deg gradient */
.btn-premium::before {
display: none !important;
}
/* FIX: Remove ALL vertical gradients (90deg) from ALL elements and pseudo-elements */
*,
*::before,
*::after {
background-image: var(--bg-image-fixed, none) !important;
}
/* FIX: Remove vertical borders that could create lines */
*[style*="border-left"],
*[style*="border-right"] {
border-left: none !important;
border-right: none !important;
}
/* FIX: Hide any element that is very narrow and full height (likely a vertical line) */
*[style*="width: 1px"],
*[style*="width: 2px"],
*[style*="width: 3px"],
*[style*="width: 4px"] {
display: none !important;
}
`;
// FIX: Add a global style that filters out vertical gradients using CSS custom properties
// We'll use JavaScript to process and remove 90deg gradients from computed styles
const processBackgroundImage = (bgImage: string): string => {
if (!bgImage || bgImage === 'none') return 'none';
// Remove all linear-gradient and repeating-linear-gradient with 90deg
let processed = bgImage;
// Remove linear-gradient(90deg ...)
processed = processed.replace(/linear-gradient\(90deg[^)]+\)/g, '');
// Remove repeating-linear-gradient(90deg ...)
processed = processed.replace(/repeating-linear-gradient\(90deg[^)]+\)/g, '');
// Clean up commas
processed = processed.replace(/,\s*,/g, ',').replace(/^,\s*|,\s*$/g, '');
return processed || 'none';
};
// Apply fix to all existing elements
const fixAllElements = () => {
const allElements = document.querySelectorAll('*');
let fixedCount = 0;
allElements.forEach((el) => {
const htmlEl = el as HTMLElement;
const computed = window.getComputedStyle(htmlEl);
const bgImage = computed.backgroundImage || '';
const inlineBg = htmlEl.style.backgroundImage || '';
const rect = htmlEl.getBoundingClientRect();
// FIX: Remove elements that are very narrow and full height (vertical lines)
// Also check if element is on the right edge of the screen
const isOnRightEdge = rect.right >= window.innerWidth - 5 && rect.right <= window.innerWidth + 5;
if (((computed.position === 'fixed' || computed.position === 'absolute') &&
rect.width > 0 && rect.width < 5 &&
rect.height > window.innerHeight * 0.5) ||
(isOnRightEdge && rect.width < 10 && rect.height > window.innerHeight * 0.3)) {
htmlEl.style.setProperty('display', 'none', 'important');
fixedCount++;
console.log(`[FixDisplay] Hidden narrow vertical element: ${el.tagName}${el.id ? '#' + el.id : ''} (${rect.width}px x ${rect.height}px, right: ${rect.right}px)`);
}
// FIX: Remove vertical borders that could create lines
const borderLeft = computed.borderLeftWidth;
const borderRight = computed.borderRightWidth;
if (parseInt(borderLeft) > 0 && rect.width < 10 && rect.height > window.innerHeight * 0.5) {
htmlEl.style.setProperty('border-left', 'none', 'important');
fixedCount++;
}
if (parseInt(borderRight) > 0 && rect.width < 10 && rect.height > window.innerHeight * 0.5) {
htmlEl.style.setProperty('border-right', 'none', 'important');
fixedCount++;
}
// Check both computed and inline styles for vertical gradients
if ((bgImage.includes('90deg') || inlineBg.includes('90deg')) &&
(bgImage.includes('linear-gradient') || inlineBg.includes('linear-gradient') ||
bgImage.includes('repeating-linear-gradient') || inlineBg.includes('repeating-linear-gradient'))) {
const processed = processBackgroundImage(bgImage || inlineBg);
htmlEl.style.setProperty('background-image', processed, 'important');
fixedCount++;
}
// Also check pseudo-elements by trying to access them
try {
const beforeStyle = window.getComputedStyle(htmlEl, '::before');
const afterStyle = window.getComputedStyle(htmlEl, '::after');
if (beforeStyle.backgroundImage && beforeStyle.backgroundImage.includes('90deg')) {
// We can't directly modify pseudo-elements, but we can add a class to hide them
htmlEl.classList.add('fix-display-no-vertical-gradient');
}
if (afterStyle.backgroundImage && afterStyle.backgroundImage.includes('90deg')) {
htmlEl.classList.add('fix-display-no-vertical-gradient');
}
} catch (e) {
// Ignore errors accessing pseudo-elements
}
});
if (fixedCount > 0) {
console.log(`[FixDisplay] Fixed ${fixedCount} elements with vertical lines/gradients`);
}
};
// Add CSS rule to hide elements with problematic pseudo-elements and narrow vertical elements
const hideRuleId = 'fix-display-hide-pseudo';
let hideRule = document.getElementById(hideRuleId) as HTMLStyleElement | null;
if (!hideRule) {
hideRule = document.createElement('style');
hideRule.id = hideRuleId;
hideRule.textContent = `
.fix-display-no-vertical-gradient::before,
.fix-display-no-vertical-gradient::after {
display: none !important;
}
/* FIX: Hide any narrow vertical elements that could be lines */
*[style*="width: 1px"]:not(script):not(style),
*[style*="width: 2px"]:not(script):not(style),
*[style*="width: 3px"]:not(script):not(style),
*[style*="width: 4px"]:not(script):not(style),
*[style*="width: 5px"]:not(script):not(style) {
display: none !important;
}
/* FIX: Remove vertical borders from all elements EXCEPT form inputs */
*:not(input):not(textarea):not(select):not(button):not([class*="input"]):not([class*="Input"]) {
border-left: none !important;
border-right: none !important;
}
/* FIX: Remove vertical borders from pseudo-elements */
*::before,
*::after {
border-left: none !important;
border-right: none !important;
}
/* FIX: Ensure body and html don't have right borders */
body, html {
border-right: none !important;
margin-right: 0 !important;
padding-right: 0 !important;
overflow-x: hidden !important;
}
/* FIX: Hide any element positioned on the right edge with narrow width */
* {
box-sizing: border-box !important;
}
`;
document.head.appendChild(hideRule);
}
// Run immediately and after delays
fixAllElements();
setTimeout(fixAllElements, 100);
setTimeout(fixAllElements, 500);
setTimeout(fixAllElements, 1000);
// Insert at the beginning of head to ensure highest priority
document.head.insertBefore(overrideStyle, document.head.firstChild);
// #region agent log
const logDataOverride = {location:'fixDisplayIssues.ts:overrideStyle',message:'Added CSS override to remove gradient',data:{styleId,textContentLength:overrideStyle.textContent.length,appended:!!overrideStyle.parentNode},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'};
console.log('[DEBUG]', logDataOverride);
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(logDataOverride)}).catch((e)=>console.error('[DEBUG] Log fetch failed:',e));
// #endregion
}
// 2. Check offline queue status
if (typeof localStorage !== 'undefined') {
try {
const queue = localStorage.getItem('veza_offline_queue');
if (queue) {
const parsed = JSON.parse(queue);
if (parsed && Array.isArray(parsed) && parsed.length > 0) {
console.log(`[FixDisplay] Offline queue has ${parsed.length} requests`);
// Optionally clear the queue if it's stale (older than 5 minutes)
const now = Date.now();
const staleRequests = parsed.filter((req: any) => {
if (!req.timestamp) return true;
return now - req.timestamp > 5 * 60 * 1000; // 5 minutes
});
if (staleRequests.length > 0) {
console.log(`[FixDisplay] Found ${staleRequests.length} stale requests`);
}
}
}
} catch (e) {
console.error('[FixDisplay] Error checking offline queue:', e);
}
}
}
// Auto-fix on import in development
if (import.meta.env.DEV) {
if (typeof window !== 'undefined') {
// Function to apply fix with delay to ensure CSS is loaded
const applyFixWithDelay = () => {
// Run immediately
fixDisplayIssues();
// Also run after a short delay to catch any CSS that loads asynchronously
setTimeout(() => {
fixDisplayIssues();
console.log('[FixDisplay] Applied CSS override (delayed)');
}, 100);
// Run again after stylesheets are loaded
setTimeout(() => {
fixDisplayIssues();
console.log('[FixDisplay] Applied CSS override (after stylesheets)');
}, 500);
};
// Run after DOM is ready
if (document.readyState === 'loading') {
// #region agent log
const logData = {location:'fixDisplayIssues.ts:DOM loading',message:'DOM loading, adding listener',data:{readyState:document.readyState},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'};
console.log('[DEBUG]', logData);
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(logData)}).catch((e)=>console.error('[DEBUG] Log fetch failed:',e));
// #endregion
document.addEventListener('DOMContentLoaded', applyFixWithDelay);
} else {
// #region agent log
const logData = {location:'fixDisplayIssues.ts:DOM ready',message:'DOM ready, calling immediately',data:{readyState:document.readyState},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'};
console.log('[DEBUG]', logData);
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(logData)}).catch((e)=>console.error('[DEBUG] Log fetch failed:',e));
// #endregion
applyFixWithDelay();
}
// FIX: Use MutationObserver to detect and fix new elements with vertical gradients as they're added
const removeVerticalGradients = (element: HTMLElement) => {
const computed = window.getComputedStyle(element);
const bgImage = computed.backgroundImage || '';
const inlineBg = element.style.backgroundImage || '';
if ((bgImage.includes('90deg') || inlineBg.includes('90deg')) &&
(bgImage.includes('linear-gradient') || inlineBg.includes('linear-gradient') ||
bgImage.includes('repeating-linear-gradient') || inlineBg.includes('repeating-linear-gradient'))) {
// Remove vertical gradient
if (inlineBg.includes('90deg')) {
const newBg = inlineBg.replace(/linear-gradient\(90deg[^)]+\)/g, '').replace(/repeating-linear-gradient\(90deg[^)]+\)/g, '').replace(/,\s*,/g, ',').replace(/^,\s*|,\s*$/g, '');
element.style.backgroundImage = newBg || 'none';
}
// Force remove via inline style
element.style.setProperty('background-image', element.style.backgroundImage?.replace(/linear-gradient\(90deg[^)]+\)/g, '').replace(/repeating-linear-gradient\(90deg[^)]+\)/g, '') || 'none', 'important');
console.log(`[FixDisplay] Removed vertical gradient from newly added element: ${element.tagName}${element.id ? '#' + element.id : ''}`);
}
};
// Observe DOM changes and fix new elements
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === Node.ELEMENT_NODE) {
const element = node as HTMLElement;
removeVerticalGradients(element);
// Also check children
element.querySelectorAll('*').forEach((child) => {
removeVerticalGradients(child as HTMLElement);
});
}
});
});
});
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['style', 'class'],
});
// Also check periodically in case overlay is added later or CSS is reloaded
setInterval(() => {
const overlay = document.getElementById('grid-overlay');
if (overlay) {
// #region agent log
fetch('http://127.0.0.1:7242/ingest/09c5ea5e-2380-4cc3-92aa-d26f3b3d26f6',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'fixDisplayIssues.ts:interval',message:'Grid overlay found in interval check',data:{},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});
// #endregion
overlay.remove();
}
// Reapply CSS fix periodically to ensure it's not overridden
const overrideStyle = document.getElementById('fix-display-override');
if (!overrideStyle || !overrideStyle.parentNode) {
fixDisplayIssues();
}
// FIX: Periodically scan and remove all vertical gradients from all elements
// Also check for other sources of vertical lines (borders, pseudo-elements, etc.)
try {
const allElements = document.querySelectorAll('*');
let fixedCount = 0;
const suspiciousElements: Array<{tag:string,id:string,className:string,reason:string}> = [];
allElements.forEach((el) => {
const htmlEl = el as HTMLElement;
const computedStyle = window.getComputedStyle(htmlEl);
const bgImage = computedStyle.backgroundImage || '';
const inlineBg = htmlEl.style.backgroundImage || '';
const position = computedStyle.position;
const zIndex = parseInt(computedStyle.zIndex) || 0;
const rect = htmlEl.getBoundingClientRect();
// Check for vertical gradients (90deg) in computed or inline styles
if ((bgImage.includes('90deg') || inlineBg.includes('90deg')) &&
(bgImage.includes('linear-gradient') || inlineBg.includes('linear-gradient') ||
bgImage.includes('repeating-linear-gradient') || inlineBg.includes('repeating-linear-gradient'))) {
// AGGRESSIVE FIX: Remove vertical gradient from both inline and force via CSS
if (inlineBg.includes('90deg')) {
const newBg = inlineBg.replace(/linear-gradient\(90deg[^)]+\)/g, '').replace(/repeating-linear-gradient\(90deg[^)]+\)/g, '').replace(/,\s*,/g, ',').replace(/^,\s*|,\s*$/g, '');
htmlEl.style.backgroundImage = newBg || 'none';
// Also set a data attribute to mark it for CSS override
htmlEl.setAttribute('data-vertical-gradient-removed', 'true');
}
// Force remove via inline style override
htmlEl.style.setProperty('background-image', htmlEl.style.backgroundImage?.replace(/linear-gradient\(90deg[^)]+\)/g, '').replace(/repeating-linear-gradient\(90deg[^)]+\)/g, '') || 'none', 'important');
fixedCount++;
suspiciousElements.push({
tag: el.tagName,
id: el.id || '',
className: el.className?.toString().substring(0,50) || '',
reason: 'vertical-gradient-90deg'
});
console.log(`[FixDisplay] Removed vertical gradient from ${el.tagName}${el.id ? '#' + el.id : ''}${el.className ? '.' + el.className.toString().split(' ')[0] : ''} (z-index: ${zIndex})`);
}
// Check for suspicious elements that could create vertical lines
// Elements that are fixed/absolute, cover full height, and have narrow width
if ((position === 'fixed' || position === 'absolute') &&
rect.height > window.innerHeight * 0.8 &&
rect.width < 10 && rect.width > 0) {
const borderLeft = computedStyle.borderLeftWidth;
const borderRight = computedStyle.borderRightWidth;
if (parseInt(borderLeft) > 0 || parseInt(borderRight) > 0) {
suspiciousElements.push({
tag: el.tagName,
id: el.id || '',
className: el.className?.toString().substring(0,50) || '',
reason: `narrow-vertical-element (${rect.width}px wide, ${rect.height}px tall, border: ${borderLeft}/${borderRight})`
});
}
}
// Check pseudo-elements for vertical gradients
try {
const beforeStyle = window.getComputedStyle(htmlEl, '::before');
const afterStyle = window.getComputedStyle(htmlEl, '::after');
const beforeBg = beforeStyle.backgroundImage || '';
const afterBg = afterStyle.backgroundImage || '';
if (beforeBg.includes('90deg') && (beforeBg.includes('linear-gradient') || beforeBg.includes('repeating-linear-gradient'))) {
suspiciousElements.push({
tag: el.tagName + '::before',
id: el.id || '',
className: el.className?.toString().substring(0,50) || '',
reason: 'vertical-gradient-in-before'
});
}
if (afterBg.includes('90deg') && (afterBg.includes('linear-gradient') || afterBg.includes('repeating-linear-gradient'))) {
suspiciousElements.push({
tag: el.tagName + '::after',
id: el.id || '',
className: el.className?.toString().substring(0,50) || '',
reason: 'vertical-gradient-in-after'
});
}
} catch (e) {
// Ignore errors accessing pseudo-elements
}
});
if (suspiciousElements.length > 0) {
console.log(`[FixDisplay] Found ${suspiciousElements.length} suspicious elements:`, suspiciousElements.slice(0, 10));
}
if (fixedCount > 0) {
console.log(`[FixDisplay] Fixed ${fixedCount} elements with vertical gradients`);
}
} catch (e) {
console.error('[FixDisplay] Error scanning for vertical gradients:', e);
}
}, 1000);
}
}