コンテンツへスキップ
商品 · 読了時間 6 分

WITHMIA v1.0.6 — 完璧なトランジション

ログイン後の二重読み込みを廃止し、インラインのオーバーレイによる洗練された画面遷移へ。オンボーディングのダークモード完全対応と、認証のリダイレクトループの根本修正もお届けします。

W

WITHMIAチーム

WITHMIA

v1.0.5では、テスト、CI/CD、請求まわりを固めて基盤を安定させました。v1.0.6が向き合うのは、実際に目に見え、肌で感じる部分です。途切れず、白い一瞬のちらつきもなく、再読み込みも見えないログイン体験。アプリケーションの読み込みを丸ごとひとつ減らし、なめらかな画面遷移に置き換えるアーキテクチャの変更です。

問題:ログインのたびに二度読み込まれていた

v1.0.5までのGoogle認証は、次のように動いていました。

  1. ユーザーが「Googleでログイン」をクリックする
  2. Googleが認証し、/auth/googleへ戻す
  3. サーバーがauth-loading.blade.phpを表示する(トランジション動画を映す中間ページ)
  4. そのページがiframeの中でReactアプリを読み込み、トークンを保存する
  5. その後top.location.replace()でダッシュボードへ移動する
  6. ブラウザがアプリ全体を二度目に読み込む

結果として、遷移からダッシュボードに移る瞬間に白いちらつきが見えていました。ログインのたびにアプリが二回読み込まれていたのです。

解決策:直接リダイレクト + インラインオーバーレイ

v1.0.6ではauth-loading.blade.phpを完全に廃止し、読み込み一回で完結する設計に置き換えました。

新しい流れ

  1. ユーザーが「Googleでログイン」をクリックする
  2. Googleが認証し、/auth/googleへ戻す
  3. サーバーが?transition=1&auth_token=...を付けて、ダッシュボードへ**redirect()**で直行する
  4. app.blade.php?transition=1を検知し、<div id="app">の上にトランジション用オーバーレイをインラインで描画する
  5. Reactはオーバーレイの下でマウントされる
  6. Reactの準備が整うと、オーバーレイがなめらかにフェードアウトする(最低1.5秒表示 + 0.6秒のアニメーション)

ページの読み込みは一回だけ。白いちらつきはゼロ。洗練された画面遷移です。

技術的に変わったこと

コンポーネント以前(v1.0.5)現在(v1.0.6)
GoogleAuthControllerreturn view('auth-loading', ...)return redirect($url . '&transition=1')
OnboardingControllerreturn view('auth-loading', ...)return redirect($url . '&transition=1')
routes/web.phpauth-loadingをビューとして描画?transition=1付きの直接リダイレクト
オーバーレイ独立したページ(auth-loading.blade.php)app.blade.php内にCSSでインライン
ページ読み込み回数2回(iframe + replace)1回(直接リダイレクト)

オンボーディングのダークモード完全対応

オンボーディングの画面が、OSのダークモードを完全に尊重するようになりました。

  • 自動検知 — OSのprefers-color-scheme: darkを読み取ります
  • 設定の保持 — localStorageに保存された好みがあれば、そちらを優先します
  • 背景と文字 — オンボーディング画面全体が適応します。背景は#0F0F0F、文字は明るく、入力欄の枠線は控えめに
  • 白いちらつきなし — Reactが描画する前に、<html>data-theme="dark"を付与します

認証のリダイレクトループを修正

一部のユーザーで発生していたリダイレクトループについて、複数の原因を特定して修正しました。

特定・修正した原因

  1. HandleInertiaRequestsの遅延クロージャ — 未認証のときにも評価されてしまい、エラーがリダイレクトを誘発していました
  2. 302を返すAuthenticationException — Inertiaが処理できないレスポンスではなく、素直なリダイレクトを返すように変更しました
  3. auth.cleanミドルウェアの削除 — Railwayのトークン処理と干渉していました
  4. APIルートのRailway認証 — API側のユーザールートにrailway.authを追加し、トークンが正しく機能するようにしました
  5. URL内のauth_tokenを保持 — URLからauth_tokenを早すぎるタイミングで消すのをやめ、アプリが確実に受け取れるようにしました

トランジションのオーバーレイ:仕上がりにこだわる

app.blade.phpのインラインオーバーレイは、以前のauth-loadingのデザインをそのまま再現しています。

  • 背景動画 — 同じコーポレートMP4を、muted + autoplay + loopで
  • 適応するグラデーション — ライトとダークで切り替わるlinear-gradient
  • 「WITH YOU, WITHMIA」の一文 — 広めの字間、セミボールド、不透明度のグラデーション付き
  • 賢いタイミング制御 — 最低1.5秒の表示(window.__loadingStartが計測する時間)、そして0.6秒のフェードアウト。pointer-events: noneで操作を妨げません
  • URLの後片付け — マウント後にhistory.replaceState()transitionauth_tokenをURLから取り除きます

オーバーレイのダークモード対応

/* Light mode */
background: linear-gradient(135deg, #f8f9fa 0%, #e8f4f8 50%, #f0f7ff 100%);

/* Dark mode (prefers-color-scheme: dark または data-theme="dark") */
background: linear-gradient(135deg, #0a0a0a 0%, #111827 50%, #0f172a 100%);
color: white;

修正:テーマの「正解」をひとつに

<html>darkクラスをめぐって、2つのテーマ管理が競合していたことが分かりました。

  1. WITHMIA ThemeContext — localStorageのwithmia_theme_modeを読む(データベースと同期している本来の仕組み)
  2. Laravel starter kit(initializeTheme)— localStorageのappearanceを読む。既定値は'system'

WITHMIAのテーマがlightでも、OSがダークモードなら、オーバーレイがライトで描画された後にinitializeTheme()<html>darkクラスを付けてしまう。結果として明るい画面の上に暗い色が一瞬走るわけです。

解決策

initializeTheme()withmia_theme_modeを第一の判断基準として読み、次にappearance、最後に'light'へフォールバックするようになりました。handleSystemThemeChangeのハンドラも同様に更新しています。

// 以前
const savedAppearance = (localStorage.getItem('appearance') as Appearance) || 'system';

// 現在
const savedAppearance = (localStorage.getItem('withmia_theme_mode') as Appearance)
    || (localStorage.getItem('appearance') as Appearance)
    || 'light';

整理:auth-loadingを削除

auth-loading.blade.php(216行)をコードベースから削除しました。もはやどのコントローラー、ルート、ビューからも参照されていません。

/auth-loadingのルートは互換性のためのリダイレクトとして残しています。URLをキャッシュしている人がいても、&transition=1を付けて目的地へ送るだけです。

技術まとめ

変更ファイル効果
二重読み込みの廃止GoogleAuthController、OnboardingController、routes/web.phpview()redirect()
インラインオーバーレイapp.blade.php?transition=1の検知、動画付きCSSオーバーレイ
Reactでのフェードアウトapp.tsx最低1.5秒 + 0.6秒のアニメーション、URLの後片付け
オンボーディングのダークモードonboarding.tsxprefers-color-schemeとlocalStorageを尊重
リダイレクトループの修正HandleInertiaRequests、routes/web.php、GoogleAuthController独立した5件の修正
戻り値の型GoogleAuthController、OnboardingController戻り値の型をRedirectResponse
テーマの判断基準use-appearance.tsxwithmia_theme_modeを第一の基準に
整理auth-loading.blade.phpファイル削除(-216行)

この先の予定

ログイン体験を磨き終えたので、私たちの視点はふたたびプロダクトの機能へ戻ります。

  • PWA / モバイルアプリ — モバイル中心のラテンアメリカに向けた最優先事項
  • CSATアンケート — 会話の中に組み込まれた顧客満足度調査
  • AI resolution analytics — AIによる解決率の指標
  • WhatsAppのブロードキャスト — 一斉配信キャンペーン

WITHMIA v1.0.6は、体験の最初の3秒を完璧にするバージョンです。ログインは一度、読み込みも一度、中断はゼロ。

WITHMIAを開く → app.withmia.comで無料で試す →

ラベル

アップデート v1.0.6 プロダクト UX ダークモード 認証 トランジション パフォーマンス テーマ

シェア

Twitter LinkedIn WhatsApp

コメント

敬意をもってご記入ください。メールアドレスは公開されません。

関連記事

これをあなたのビジネスでも実現しませんか?

14日間無料でお試しください。クレジットカードは不要です。

14日間無料で試す