The Fantastic Four: First Steps

Fantastic Four: First Steps is a messy but likable Marvel reboot carried by its cast chemistry and surprisingly sincere family dynamic.
119694
Starring
Pedro Pascal, Vanessa Kirby, Joseph Quinn
Director
Matt Shakman
Rating
PG-13
Genre
Action, Adventure, Sci-Fi, Superhero
Release date
July 25, 2025
Overall Score
Rating Overview
Story/Plot/Script
Visuals/Cinematography
Performance
Direction
Non-Wokeness
Rating Summary
A strong first act, a fun retro aesthetic, and one of the MCU's best ensembles, period, hold together second and third acts reshot, sliced up, and pieced together in the editing bay.

The Fantastic Four: First Steps isn't the best thing that Marvel's ever done, but it's one of the best things they've done in a long while— Easily the best comic book film of the year.

In “Fantastic Four: First Steps,” set against a vibrant 1960s-inspired retro-futuristic world, Reed Richards, Sue Storm, Johnny Storm, and Ben Grimm—known as Mister Fantastic, Invisible Woman, Human Torch, and The Thing—face their greatest challenge yet. As a tight-knit family with extraordinary powers, they must defend Earth from the planet-devouring Galactus and his enigmatic Herald, Silver Surfer. The stakes become deeply personal when Galactus threatens their newborn child, forcing the team to balance their heroic duties with their familial bonds to save both their family and the world.

The Fantastic Four: First Steps REVIEW

The Fantastic Four: First Steps Review:

Marvel's first family has had a rocky cinematic journey, to say the least. 2005's attempt was met with mixed reviews and, quite frankly, succeeded almost entirely thanks to Chris Evans' fun portrayal of Johnny Storm and Jessica Alba's Jessica Alba-ness. Objectively, it was a mediocre film, and its sequel was inarguably a mess. A decade later, the dark and brooding patchworked narrative nightmare that was then up-and-coming director Josh Trank's undoing would shelve the quartet for another ten years.

In a score spanning cinematic landscape that consists almost entirely of overmined legacy IPs that once brought joy but now evoke groans of disappointment to the masses, one could be excused for assuming that The Fantastic Four: First Steps would be another muddled misfire. I know that I did. But, surprise of surprises, we were both wrong. Oh, the movie is most definitely muddled, but it manages to mostly hold things together through its vibrant and hopeful tone, as well as one of, if not the best, and most unified and likable MCU ensembles.

Like Jules Winnfield once said, "personality goes a long way." The Fantastic Four: First Steps might not be the proverbial pig of which that particular Samuel L. Jackson character was speaking, but it is far from perfect, and its ensemble is what holds it together despite its warts. Unlike a lot of recent MCU projects, this film's core cast is a vastly more cohesive team `than we've ever seen in the MCU, one that deeply loves one another. That three-fourths of the team is an actual family rather than one of modern Hollywood's Frankenstein-like, self-built monstrosities that they keep trying to push as the moral equivalent of a genuine family is no small factor in the film's success. It "feels" right, because it is right, and what is a movie if not a vehicle for manufacturing feelings?

Likewise, unlike any other film in the MCU, this core cast respects one another. When Johnny ribs Ben or Reed, it's not to denigrate and lacks the Whedon-esque sarcasm that has marked every Marvel film since the first Avengers. In fact, this film is a near-complete departure from the Whedonisms that began as charming but have become grating over the years. Emotional throughlines aren't interrupted every few minutes with tone-deaf tension-deflating quips, and characters don't spend 90% of the runtime sniping at one another like middle school children. For a fairly comic bookie film that isn't trying to be Nolan's Batman, it's relatively tonally mature, and the team's dynamic is the lynchpin that holds together its rather messy and rushed plot.

Undeniably, The Fantastic Four: First Steps' first act is strong, if you can forgive its overreliance on expositional tropes like news programs that deliver years' worth of backstory in minutes. But what it does right is to firmly establish, not only the team dynamic, but just as importantly, this film's reality as being apart from the rest of the MCU. It's a terrific decision that eases the tension of not having seen every second of the hundreds of hours of theatrical and streaming content that now burdens every other piece of Marvel cinematic product. It's a fresh start that even novice audiences can enjoy.

galactus the space cloud consuming the earth in fantastic four: rise of the silver surfer
Galactus the Space Cloud in 2007's Fantastic Four: Rise of The Silver Surfer

The strength of its first act is vitally important because by the time The Fantastic Four: First Steps' second act rolls around, the evidence of rumored extensive last-minute reshoots (as recent as May of this year) pretty quickly rears its head. Notably, there is a scene in which Johnny and Reed are talking with one another, and when Johnny's back is to the camera, it's clear that Joseph Quinn, who plays The Human Torch, was saying something much different than the ADR that we hear. Like old and poorly dubbed Godzilla movies, his jaw movements are entirely out of whack with the lines heard. From there, everything begins to feel rushed and uncomfortably stitched together.

The much-talked-about chick Silver Surfer is nothing more than a plot device that any number of cinematic tricks could have replaced, and Galactus, while blessedly no longer a space fart, is reduced solely to justifying the plot's ticking clock. Nearly every conflict is almost comically solved with ease via Reed's character becoming a contrivance fabrication machine (think Tony solving time travel in minutes in Endgame,  meets Tony Stark's magic fabrication device in No Way Home).

Galactus, the towering cosmic entity with glowing blue eyes, dominates the skyline in a dramatic scene from The Fantastic Four: First Steps, featuring the iconic Fantastic Four logo building, highlighting the Marvel film's epic villain confrontation
Galactus in The Fantastic Four: First Steps (2025)

The various dropped arcs and patched-together story almost entirely neuter First Steps' pacing, giving the audience only a vague sense of how long the super team has or needs to prepare for Galactus. We know that he's coming and that there's not a lot of time, but little more. For example, it takes the giant planet-eating entity a mere month (it might have been up to four) to travel thousands of light years from whence he is introduced to our solar system. Yet, it takes him hours, days, or weeks (it's impossible to tell) to travel the distance from the moon to Earth (it took the Apollo 11 team three days). This disjointed timeline, along with Reed's ease at problem-solving, undermines the sense of anticipation and impending doom that the film was aiming for.

It is worth mentioning that the film's digital effects are somewhat inconsistent. While it does a pretty good job of displaying the team's powers, Johnny, when fully engulfed, rarely feels real. However, although there was much online hullabaloo over the Silver Surfer's appearance when she was first shown in the trailers, it either translates better on the big screen or the FXs team touched her up, because she looks fine. That said, Galactus's comic-accurate design notwithstanding, he looks like utter trash in every scene. There's not one moment in which he doesn't appear to be a digital cartoon. Likewise, Reed and Sue's baby was barfed up by the Uncanny Valley. Even the American Sniper baby raised its anamatronic eyebrows at Franklin Richards.

Were it not for the primal feelings of ownership that they established early on and a load of goodwill earned from its first act, there'd be little reason for the audience to be invested in The Fantastic Four: First Steps, and it'd be just another forgettable Marvel mistep. Happily, the filmmakers get enough right that this doesn't happen. Its sleek and fun aesthetic, lovable characters, and generally positive vibe hold it together. It's not quite good enough for us to formally endorse it as Worth it, but I liked it and think that most of you will as well.

 

Role Models:
Flame On?
  • It's been a while since we've added this section to a review, and I certainly didn't think that Fantastic Four: First Steps was going to change that, but here we are.
    • Johnny is a smart and hardworking man who knows when it's time to play and when it's time to get down to business. He's a good friend and a loving brother, and he never once hesitates to do the right thing, even when that right thing might mean his death. This Johnny might not be as much fun as Chris Evans' take on the character twenty years ago, but he's a much better man than that one.
Suzy Homemaker
  • Sue is a loving and supportive wife who doesn't belittle her husband and has his back (with the exception of one brief and clunky scene that more or less fizzles out).
    • She's also a devoted mother who sees her child as her child from the moment that she learns about his conception, and she cannot be dissuaded from choosing life even if it means her death.
Woke Report

WOKE REPORT

You're Only Getting Half the Picture.

This section is our site's secret sauce, and what truly separates us from the rest. If you don't read it, you haven't read our review.

Have the filmmakers chosenradical progressive messaging over story?
Unlock the insightsthat could change your viewing experience and protect your family.

James Carrick

James Carrick is a passionate film enthusiast with a degree in theater and philosophy. James approaches dramatic criticism from a philosophic foundation grounded in aesthetics and ethics, offering insight and analysis that reveals layers of cinematic narrative with a touch of irreverence and a dash of snark.

Leave a Review
  1. 4WholeFriedChickensAndACoke July 25, 2025 at

    Thanks for the review! Seeing this on Monday.

  2. bowill01 July 25, 2025 at

    Well I did not expect this good of a review or woke score. No one in my family interested in it though so maybe I’ll rent it someday.

  3. Bigwig30 July 25, 2025 at

    I am shocked, but excited that I may be able to go to see two recent Super Hero movies in a row! 🙂 Perhaps the times they are a-changing?! Any post credit stuff?

  4. smajj03 July 25, 2025 at

    This is refreshing just to read. I’ll definitely be checking this movie out; it’s amazing that we finally got a good F4 movie, in 2025 of all years.

  5. Tdemaioj July 25, 2025 at

    I’m not going to lie, I was nervous for this review. I wanted to see this movie because of the 50/60s style. I love that era and its look. I also was hoping the would be a good super hero movie. So, thank you for putting my mind at ease. I’m glad Disney didn’t ruin this movie.

  6. gorilichis July 25, 2025 at

    Plot twist! I never saw this coming. I wish the actors would shut up. I wasn’t going to see this one because I assumed it was woke. I’ll say this again, how did I live so long without your website? 🙂

  7. healthguyfsu July 26, 2025 at

    More based than Superman is surprising. I might go see this one.

    1. James Carrick July 26, 2025 at

      No one was more surprised than I.

  8. Vredes August 6, 2025 at

    Most of people say it isn’t woke, but man, maybe not in the story, but you can clearly see the characters behavior and looks, they’re more likely to be the Fantastic Girls 4. Not to mention they used a leftist activist P. Pascal.

    1
    2
  9. ega August 23, 2025 at

    James, I think you missed the primary point of this movie…

    This was a powerful pro-life movie that emphasized the primacy of family. The most powerful scene is when Sue walks into the blood thirsty mob with her child and introduces him. Saying she won’t sacrifice her child for the world, but she also won’t sacrifice the world for her child. She choses life, period, at the ultimate sacrifice of her own.

    Galaticus is ultimate defeated by a mother’s love. We see the affirmation of family and community throughout the film. This is the true message. Not whether the Silver Surfer is a girl or a guy. I thought the female surfer was super-cool by the way. Loved the 60’s retro feel, staying out of the timeline altogether. This is along with the original Captain America my favorite Marvel movie.

    1. James Carrick August 23, 2025 at

      I agree with everything except that I missed it. I talked about this in the Woke Report.

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

No audience reviews yet. Be the first to leave one.

 

X Marks the Spot - Follow us Today!!

 

 

'; win.document.open(); win.document.write(html); win.document.close(); return true; } function escapeHtml(str){ return String(str || '').replace(/[&<>"']/g, function(ch){ return ({'&':'&','<':'<','>':'>','"':'"',"'":'''})[ch] || ch; }); } function renderShareOptionsWindow(win, landscapeUrl, squareUrl, shareUrl, heading){ if (!win || win.closed) return false; var safeHeading = escapeHtml(heading || 'Share options'); var safeLandscape = escapeHtml(landscapeUrl || ''); var safeSquare = escapeHtml(squareUrl || ''); var safeUrl = escapeHtml(shareUrl || ''); // Keep this HTML script-free. A nested script tag inside this inline footer script can break under Cloudflare Rocket Loader. var html = '' + safeHeading + '' + '' + '

' + safeHeading + '

'; win.document.open(); win.document.write(html); win.document.close(); try { var doc = win.document; var btn = doc.getElementById('copyLinkBtn'); var status = doc.getElementById('shareStatus'); var field = doc.getElementById('shareUrlField'); var urlToCopy = String(shareUrl || ''); function setCopied(){ if (status) status.textContent = 'Link copied.'; if (btn) { btn.textContent = 'Copied!'; win.setTimeout(function(){ btn.textContent = 'Copy link'; }, 1500); } } function focusField(){ if (!field) return; field.removeAttribute('readonly'); field.focus(); field.select(); field.setSelectionRange(0, field.value.length); field.setAttribute('readonly','readonly'); } function legacyCopy(text){ var ta = doc.createElement('textarea'); ta.value = text; ta.setAttribute('readonly','readonly'); ta.style.position='fixed'; ta.style.top='0'; ta.style.left='0'; ta.style.opacity='0.01'; ta.style.pointerEvents='none'; doc.body.appendChild(ta); ta.focus(); ta.select(); ta.setSelectionRange(0, ta.value.length); var ok=false; try{ ok=!!doc.execCommand('copy'); }catch(err){} doc.body.removeChild(ta); return ok; } win.__wiowCopyShareLink = async function(){ if (!urlToCopy) { if (status) status.textContent='No share URL available.'; return false; } focusField(); try { if (win.navigator && win.navigator.clipboard && typeof win.navigator.clipboard.writeText === 'function') { await win.navigator.clipboard.writeText(urlToCopy); setCopied(); return false; } } catch(err) {} if (legacyCopy(urlToCopy)) { setCopied(); return false; } if (status) status.textContent='Press Ctrl+C or Cmd+C to copy the selected link.'; focusField(); return false; }; if (btn) btn.addEventListener('click', function(e){ e.preventDefault(); win.__wiowCopyShareLink(); }); var nextBtn = doc.getElementById('nextComboBtn'); if (nextBtn) nextBtn.addEventListener('click', function(e){ e.preventDefault(); if (win.opener && win.opener.__wiowRefreshShareOptions) win.opener.__wiowRefreshShareOptions(win); }); var mainBtn = doc.getElementById('mainComboBtn'); if (mainBtn) mainBtn.addEventListener('click', function(e){ e.preventDefault(); if (win.opener && win.opener.__wiowResetShareOptions) win.opener.__wiowResetShareOptions(win); }); Array.prototype.slice.call(doc.querySelectorAll('.preview-frame img')).forEach(function(img){ img.addEventListener('click', function(){ var overlay=doc.createElement('div'); overlay.className='overlay'; var full=doc.createElement('img'); full.src=img.getAttribute('data-full') || img.src; full.alt='Preview'; overlay.appendChild(full); overlay.addEventListener('click', function(){ overlay.remove(); }); doc.body.appendChild(overlay); }); }); } catch(err) {} return true; } async function buildShareImage(container, options){ options = options || {}; var postId = container.getAttribute('data-post-id'); var sharePage = container.getAttribute('data-share-page'); var kind = (container.getAttribute('data-share-kind') || 'critics').toLowerCase(); var posterUrl = container.getAttribute('data-poster-url') || findPosterUrl(); if (!posterUrl){ posterUrl = ''; } var isRatings = (kind === 'ratings' || kind === 'ratings-admin' || kind === 'ratings-question'); var isAudience = (kind === 'audience' || kind === 'audience-teaser' || kind === 'audience-question'); var action = isRatings ? 'wiow_build_ratings_share_image' : (isAudience ? 'wiow_build_audience_share_image' : 'wiow_build_share_image'); var payload = new URLSearchParams(); payload.append('action', action); payload.append('post_id', String(postId)); payload.append('poster_url', posterUrl); payload.append('share_context', kind); if (options.force) { payload.append('force', '1'); } if (options.reset) { payload.append('reset_combo', '1'); } if (kind === 'ratings-admin') { payload.append('admin', '1'); } if (kind === 'ratings-question' || kind === 'audience-question' || kind === 'critics-question') { payload.append('questions', '1'); payload.append('mode', 'questions'); } if (kind === 'audience-teaser' || kind === 'critics-teaser') { payload.append('mode', 'teaser'); } var res = await fetch('https://worthitorwoke.com/wp-admin/admin-ajax.php', { method: 'POST', credentials: 'same-origin', headers: {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}, body: payload.toString() }); var data = await res.json(); if (!data || !data.success || !data.data){ throw new Error((data && data.data && data.data.message) ? data.data.message : 'Share build failed.'); } return { image_url: data.data.image_url, share_url: data.data.share_url || sharePage, cycle_image_url: data.data.cycle_image_url || '', poster_url: data.data.poster_url || posterUrl || '' }; } async function buildShareSquareImage(container, cycleImageUrl, posterUrl, options){ options = options || {}; var postId = container.getAttribute('data-post-id'); var sharePage = container.getAttribute('data-share-page'); var kind = (container.getAttribute('data-share-kind') || 'critics').toLowerCase(); var isRatings = (kind === 'ratings' || kind === 'ratings-admin' || kind === 'ratings-question'); var isAudience = (kind === 'audience' || kind === 'audience-teaser' || kind === 'audience-question'); var action = isRatings ? 'wiow_build_ratings_share_image_square' : (isAudience ? 'wiow_build_audience_share_image_square' : 'wiow_build_share_image_square'); var payload = new URLSearchParams(); payload.append('action', action); payload.append('post_id', String(postId)); payload.append('share_context', kind); if (kind === 'ratings-admin') { payload.append('admin', '1'); } if (kind === 'ratings-question' || kind === 'audience-question' || kind === 'critics-question') { payload.append('questions', '1'); payload.append('mode', 'questions'); } if (kind === 'audience-teaser' || kind === 'critics-teaser') { payload.append('mode', 'teaser'); } if (cycleImageUrl) { payload.append('cycle_image_url', cycleImageUrl); } if (posterUrl) { payload.append('poster_url', posterUrl); } if (options.force) { payload.append('force', '1'); } if (options.reset) { payload.append('reset_combo', '1'); } var res = await fetch('https://worthitorwoke.com/wp-admin/admin-ajax.php', { method: 'POST', credentials: 'same-origin', headers: {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}, body: payload.toString() }); var data = await res.json(); if (!data || !data.success || !data.data){ throw new Error((data && data.data && data.data.message) ? data.data.message : 'Square share build failed.'); } return { image_url: data.data.image_url, share_url: data.data.share_url || sharePage, cycle_image_url: data.data.cycle_image_url || cycleImageUrl || '', poster_url: data.data.poster_url || posterUrl || '' }; } window.__wiowRefreshShareOptions = async function(win){ if (!wiowCanAdminNext || !window.__wiowLastShareOptionsContext || !window.__wiowLastShareOptionsContext.row) return false; var ctx = window.__wiowLastShareOptionsContext; var row = ctx.row; var heading = ctx.heading || 'Share options'; var targetWin = win || ctx.win; try { renderShareOptionsLoadingWindow(targetWin, heading); var built = await buildShareImage(row, { force:true }); var builtSquare = await buildShareSquareImage(row, built.cycle_image_url || '', built.poster_url || '', { force:true }); if (!built || !built.image_url || !builtSquare || !builtSquare.image_url) throw new Error('Share build failed.'); window.__wiowLastShareOptionsContext = { row: row, heading: heading, win: targetWin }; renderShareOptionsWindow(targetWin, built.image_url, builtSquare.image_url, built.share_url || row.getAttribute('data-share-page') || '', heading); } catch(err) { if (targetWin && !targetWin.closed) { var msg = (err && err.message) ? err.message : 'Could not build next combo.'; targetWin.document.open(); targetWin.document.write('

Could not build next combo

' + escapeHtml(msg) + '

'); targetWin.document.close(); } } return false; }; window.__wiowResetShareOptions = async function(win){ if (!wiowCanAdminNext || !window.__wiowLastShareOptionsContext || !window.__wiowLastShareOptionsContext.row) return false; var ctx = window.__wiowLastShareOptionsContext; var row = ctx.row; var heading = ctx.heading || 'Share options'; var targetWin = win || ctx.win; try { renderShareOptionsLoadingWindow(targetWin, heading); var built = await buildShareImage(row, { force:true, reset:true }); var builtSquare = await buildShareSquareImage(row, built.cycle_image_url || '', built.poster_url || '', { force:true, reset:true }); if (!built || !built.image_url || !builtSquare || !builtSquare.image_url) throw new Error('Share build failed.'); window.__wiowLastShareOptionsContext = { row: row, heading: heading, win: targetWin }; renderShareOptionsWindow(targetWin, built.image_url, builtSquare.image_url, built.share_url || row.getAttribute('data-share-page') || '', heading); } catch(err) { if (targetWin && !targetWin.closed) { var msg = (err && err.message) ? err.message : 'Could not build main combo.'; targetWin.document.open(); targetWin.document.write('

Could not build main combo

' + escapeHtml(msg) + '

'); targetWin.document.close(); } } return false; }; // Unified capture-phase share handler. Chrome incognito can allow the visual // pointer animation while another script prevents the later bubbling click // handler from ever running. Handle all top-level share buttons here first. document.addEventListener('click', async function(e){ var targetEl = e.target && e.target.nodeType === 1 ? e.target : (e.target && e.target.parentElement ? e.target.parentElement : null); var btn = targetEl && targetEl.closest ? targetEl.closest('.wiow-share-btn') : null; if (!btn) return; // Ignore the Audience modal "Rate" button (it also has wiow-share-btn class in your CSS usage) if (btn.hasAttribute('data-wiow-audience-open')) return; var row = btn.closest('[data-wiow-share="1"], .wiow-share-row'); if (!row) return; var platform = btn.getAttribute('data-platform'); // Public top-level controls must work even when AJAX generation or membership-gated data is unavailable. // Options still uses the full image-builder path below. if (platform === 'x' || platform === 'link') { e.preventDefault(); e.stopPropagation(); var quickStatus = row.querySelector('.wiow-share-status'); var quickUrl = btn.getAttribute('data-copy-url') || row.getAttribute('data-share-page') || row.getAttribute('data-post-url') || wiowShareFallbackUrl(row); if (!quickUrl) { if (quickStatus) quickStatus.textContent = 'No share URL available.'; return; } if (platform === 'x') { openPopup(btn.getAttribute('href') || btn.getAttribute('data-wiow-x-intent') || wiowShareXIntentUrl(row)); if (quickStatus) quickStatus.textContent = ''; return; } if (quickStatus) quickStatus.textContent = 'Copying link…'; var copiedQuick = await wiowCopyShareText(quickUrl); var quickLabel = btn.querySelector('.wiow-share-btn__label'); var quickOriginal = quickLabel ? quickLabel.textContent : 'Copy link'; if (copiedQuick) { if (quickStatus) quickStatus.textContent = 'Link copied.'; if (quickLabel) { quickLabel.textContent = 'Copied!'; window.setTimeout(function(){ quickLabel.textContent = quickOriginal || 'Copy link'; }, 1500); } } else { if (quickStatus) quickStatus.textContent = 'Could not copy link.'; } return; } e.preventDefault(); var previewWin = null; if (platform === 'copy') { previewWin = openShareOptionsWindow(); var preloadKind = (row.getAttribute('data-share-kind') || 'critics').trim().toLowerCase(); var preloadHeading = (preloadKind === 'audience' || preloadKind === 'audience-teaser' || preloadKind === 'audience-question') ? 'Audience share options' : ((preloadKind === 'ratings' || preloadKind === 'ratings-admin' || preloadKind === 'ratings-question') ? 'Ratings share options' : 'Critic share options'); renderShareOptionsLoadingWindow(previewWin, preloadHeading); } var statusEl = row.querySelector('.wiow-share-status'); if (statusEl) statusEl.textContent = (platform === 'link') ? 'Copying link…' : 'Preparing share…'; try { var publicShareUrl = wiowShareFallbackUrl(row); var publicPostTitle = (row.getAttribute('data-post-title') || '').trim(); if (!publicPostTitle) publicPostTitle = 'this'; var publicShareKind = (row.getAttribute('data-share-kind') || 'critics').trim().toLowerCase(); var publicUpperTitle = publicPostTitle.toUpperCase(); var publicLineTwo = (publicShareKind === 'audience' || publicShareKind === 'audience-teaser' || publicShareKind === 'audience-question') ? 'See what the audience is saying.' : ((publicShareKind === 'ratings' || publicShareKind === 'ratings-admin' || publicShareKind === 'ratings-question') ? 'See the Worth it or Woke score.' : 'See what sane critics say.'); var publicBaseText = 'Is ' + publicUpperTitle + ' Worth it or Woke?\n\n' + publicLineTwo + '\n\nFollow @worthitorwoke for more.'; // Public top-level X and Copy Link controls should not depend on AJAX image generation. // The share URL itself carries the OG/Twitter metadata; scrapers can generate/fetch the image from that URL. if ((platform === 'x' || platform === 'link') && publicShareUrl) { if (platform === 'link') { var copiedPublicLink = await wiowCopyShareText(publicShareUrl); var publicLabel = btn.querySelector('.wiow-share-btn__label'); var publicOriginalLabel = publicLabel ? publicLabel.textContent : ''; if (copiedPublicLink) { if (statusEl) statusEl.textContent = 'Link copied.'; if (publicLabel) { publicLabel.textContent = 'Copied!'; window.setTimeout(function(){ publicLabel.textContent = publicOriginalLabel || 'Copy link'; }, 1500); } } else { if (statusEl) statusEl.textContent = 'Could not copy link.'; } return; } openPopup('https://twitter.com/intent/tweet?text=' + encodeURIComponent(publicBaseText) + '&url=' + encodeURIComponent(publicShareUrl)); if (statusEl) statusEl.textContent = ''; return; } var built; var builtSquare = null; if (platform === 'copy') { // Build the landscape first so it chooses exactly one featured/gallery cycle image, // then pass that same image to the square builder. This prevents two square // outputs or mismatched gallery states in the Share Options window. built = await buildShareImage(row, { force:true }); builtSquare = await buildShareSquareImage(row, built.cycle_image_url || '', built.poster_url || '', { force:true }); if (!built || !built.image_url) { throw new Error('Landscape share build failed.'); } if (!builtSquare || !builtSquare.image_url) { throw new Error('Square share build failed.'); } } else { built = await buildShareImage(row); } var shareUrl = built.share_url; var postUrl = (row.getAttribute('data-post-url') || '').trim() || shareUrl; var postTitle = (row.getAttribute('data-post-title') || '').trim(); if (!postTitle) postTitle = 'this'; var shareKind = (row.getAttribute('data-share-kind') || 'critics').trim().toLowerCase(); var upperTitle = postTitle.toUpperCase(); var lineTwo = (shareKind === 'audience' || shareKind === 'audience-teaser' || shareKind === 'audience-question') ? 'See what the audience is saying.' : ((shareKind === 'ratings' || shareKind === 'ratings-admin' || shareKind === 'ratings-question') ? 'See the Worth it or Woke score.' : 'See what sane critics say.'); var baseText = 'Is ' + upperTitle + ' Worth it or Woke?\n\n' + lineTwo + '\n\nFollow @worthitorwoke for more.'; var textWithUrl = baseText + '\n\n' + shareUrl; var postTextWithUrl = baseText + '\n\n' + postUrl; var encodedUrl = encodeURIComponent(shareUrl); var encodedBaseText = encodeURIComponent(baseText); var encodedTextWithUrl = encodeURIComponent(textWithUrl); if (platform === 'link') { var copiedLink = await wiowCopyShareText(shareUrl); var label = btn.querySelector('.wiow-share-btn__label'); var originalLabel = label ? label.textContent : ''; if (copiedLink) { if (statusEl) statusEl.textContent = 'Link copied.'; if (label) { label.textContent = 'Copied!'; window.setTimeout(function(){ label.textContent = originalLabel || 'Copy link'; }, 1500); } } else { if (statusEl) statusEl.textContent = 'Could not copy link.'; } return; } if (platform === 'x'){ // X gets the URL through the intent URL parameter, so do not also duplicate it in the tweet text. openPopup('https://twitter.com/intent/tweet?text=' + encodedBaseText + '&url=' + encodedUrl); } else if (platform === 'facebook'){ // Facebook sharing has been intentionally removed from this plugin flow. if (statusEl) statusEl.textContent = 'Facebook sharing is currently disabled.'; } else if (platform === 'copy'){ var heading = (shareKind === 'audience' || shareKind === 'audience-teaser' || shareKind === 'audience-question') ? 'Audience share options' : ((shareKind === 'ratings' || shareKind === 'ratings-admin' || shareKind === 'ratings-question') ? 'Ratings share options' : 'Critic share options'); window.__wiowLastShareOptionsContext = { row: row, heading: heading, win: previewWin }; var shown = renderShareOptionsWindow(previewWin, built.image_url, (builtSquare ? builtSquare.image_url : ''), shareUrl, heading); if (!shown) { var copied = false; if (navigator.clipboard && window.isSecureContext && navigator.clipboard.writeText){ try { await navigator.clipboard.writeText(shareUrl); copied = true; } catch (copyErr) {} } if (!copied) { var ta = document.createElement('textarea'); ta.value = shareUrl; ta.setAttribute('readonly', 'readonly'); ta.style.position = 'fixed'; ta.style.opacity = '0'; document.body.appendChild(ta); ta.focus(); ta.select(); ta.setSelectionRange(0, ta.value.length); copied = !!document.execCommand('copy'); ta.remove(); } } } if (statusEl) statusEl.textContent = (platform === 'copy') ? 'Ready.' : ''; } catch(err){ if (previewWin && !previewWin.closed) { previewWin.close(); } if (statusEl) statusEl.textContent = (err && err.message) ? err.message : 'Could not share.'; } }, true); })();