chore: release v1.2.6 with Next.js LCP, Hydration and Prod-Visibility fixes
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 42s
Build & Deploy / 🧪 QA (push) Successful in 5m17s
Build & Deploy / 🏗️ Build (push) Successful in 8m36s
Build & Deploy / 🚀 Deploy (push) Successful in 17s
Build & Deploy / 🧪 Smoke Test (push) Successful in 53s
Build & Deploy / ⚡ Lighthouse (push) Successful in 7m38s
Build & Deploy / 🔔 Notify (push) Successful in 2s

This commit is contained in:
2026-02-21 13:26:14 +01:00
parent 85bc03b9d2
commit 927ce977f2
16 changed files with 372 additions and 627 deletions

View File

@@ -1,7 +1,7 @@
'use client';
import React, { useEffect, useState } from 'react';
import { m, LazyMotion, domAnimation, AnimatePresence } from 'framer-motion';
import { m, LazyMotion, AnimatePresence } from 'framer-motion';
import { useRecordMode } from './RecordModeContext';
export function PlaybackCursor() {
@@ -24,7 +24,7 @@ export function PlaybackCursor() {
if (!isPlaying) return null;
return (
<LazyMotion strict features={domAnimation}>
<LazyMotion strict features={() => import('@/lib/framer-features').then(res => res.default)}>
<m.div
className="fixed z-[10000] pointer-events-none"
animate={{

View File

@@ -2,7 +2,7 @@
import React, { useState, useEffect } from 'react';
import { useRecordMode } from './RecordModeContext';
import { Reorder, AnimatePresence, LazyMotion, domAnimation } from 'framer-motion';
import { Reorder, AnimatePresence, LazyMotion } from 'framer-motion';
import {
Play,
Square,
@@ -146,7 +146,7 @@ export function RecordModeOverlay() {
}
return (
<LazyMotion strict features={domAnimation}>
<LazyMotion strict features={() => import('@/lib/framer-features').then(res => res.default)}>
<div className="fixed inset-0 z-[9998] pointer-events-none font-sans">
{/* 1. Global Toolbar - Slim Industrial Bar */}
<div className="fixed bottom-6 left-1/2 -translate-x-1/2 z-[10000] pointer-events-auto">

View File

@@ -10,7 +10,6 @@ export function RecordModeVisuals({ children }: { children: React.ReactNode }) {
const [iframeUrl, setIframeUrl] = React.useState<string | null>(null);
React.useEffect(() => {
setMounted(true);
// Explicit non-magical detection
const embedded =
window.location.search.includes('embedded=true') || window.name === 'record-mode-iframe';
@@ -21,13 +20,12 @@ export function RecordModeVisuals({ children }: { children: React.ReactNode }) {
url.searchParams.set('embedded', 'true');
setIframeUrl(url.toString());
}
}, [isEmbedded]);
// Hydration Guard: Match server on first render
if (!mounted) return <>{children}</>;
}, []);
// Recursion Guard: If we are already in an embedded iframe,
// strictly return just the children to prevent Inception.
// Note: This causes a hydration mismatch remount ONLY when actually embedded (e.g. inside Directus).
// Standard users and Lighthouse bots will NOT suffer a remount.
if (isEmbedded) {
return (
<>