PWA のタブ形式アプリケーション モード

プログレッシブ ウェブアプリでタブを使用して、一度に複数のドキュメントで作業する

コンピューティングの世界では、デスクトップ メタファーは、ユーザーがコンピュータをより簡単に操作できるように、グラフィカル ユーザー インターフェース(GUI)で使用される一連のコンセプトを統合したインターフェースのメタファーです。デスクトップのメタファーに合わせて、GUI タブは、書籍、紙ファイル、カード インデックスに挿入された従来のカードタブをモデル化したものです。タブ形式ドキュメント インターフェース(TDI)またはタブは、複数のドキュメントまたはパネルを 1 つのウィンドウ内に収めることができるグラフィカル コントロール要素です。タブをドキュメント セット間のナビゲーション ウィジェットとして使用します。

プログレッシブ ウェブアプリは、ウェブアプリ マニフェストの display プロパティで指定されたさまざまな表示モードで実行できます。例: fullscreenstandaloneminimal-uibrowser。これらの表示モードは、明確に定義されたフォールバック チェーン"fullscreen""standalone""minimal-ui""browser")に従います。ブラウザが特定のモードをサポートしていない場合は、チェーン内の次の表示モードにフォールバックします。デベロッパーは、"display_override" プロパティを使用して、必要に応じて独自のフォールバック チェーンを指定できます。

タブ形式アプリケーション モードとは

これまでプラットフォームに欠けていたのは、PWA デベロッパーがタブ付きドキュメント インターフェースをユーザーに提供する方法です。たとえば、同じ PWA ウィンドウで異なるファイルを編集できるようになります。タブ付きアプリケーション モードでは、このギャップを埋めることができます。

タブ形式アプリケーション モードで推奨されるユースケース

タブ付きアプリケーション モードを使用できるサイトの例としては、以下のものがあります。

  • ユーザーが複数のドキュメント(またはファイル)を同時に編集できる生産性向上アプリ。
  • タブごとに異なるチャットルームで会話できるコミュニケーション アプリ。
  • 新しいアプリ内タブで記事のリンクを開くアプリを読む。

デベロッパーが作成したタブとの違い

ドキュメントを別々のブラウザタブに表示する場合は、無料でリソースを分離できます。これは現在ウェブでは不可能です。デベロッパーが作成したタブは、ブラウザタブのように数百ものタブにまでスケーリングできません。ナビゲーション履歴、「このページの URL をコピー」、「このタブをキャスト」、「このページをウェブブラウザで開く」などのブラウザ アフォーダンスは、デベロッパーが作成したタブインターフェース ページに適用されますが、現在選択されているドキュメント ページには適用されません。

"display": "browser" との違い

現在の "display": "browser" には、すでに特定の意味があります。

ユーザー エージェントでハイパーリンクを開くためのプラットフォーム固有の規則(ブラウザタブや新しいウィンドウなど)を使用して、ウェブ アプリケーションを開きます。

ブラウザは UI に関してどのようなことができますが、"display": "browser" が突然、タブ形式のドキュメント インターフェースではなく、ブラウザ アフォーダンスのない別のアプリケーション固有のウィンドウで実行することを意味する場合、デベロッパーの期待を大きく覆します。

"display": "browser" を設定すると、アプリ ウィンドウへの表示を実質的にオプトアウトできます。

現在のステータス

ステップ ステータス
1. 説明を作成 完了
2. 仕様の最初のドラフトを作成する 未対応
3.フィードバックを収集し、設計を反復する 作成中
4. オリジン トライアル 作成中
5. リリース 未対応

タブ付きアプリケーション モードの使用

タブ形式アプリ モードを使用するには、デベロッパーはウェブアプリ マニフェストで特定の "display_override" モード値を設定して、アプリをオプトインする必要があります。

{
  "display": "standalone",
  "display_override": ["tabbed"]
}

次に、必要に応じてプロパティ "tab_strip" を使用して、タブの動作を微調整できます。"home_tab""new_tab_button" という 2 つのサブプロパティが許可されています。"tab_strip" プロパティが存在しない場合は、特定のプロパティの "auto" 値が使用されます。"auto" に使用する値はブラウザによって決まります。

[ホーム] タブ

ホームタブは固定タブです。アプリで有効になっている場合は、アプリが開いているときに常に表示される必要があります。このタブには移動しません。このタブでクリックしたリンクは、新しいアプリタブで開きます。アプリは、このタブのロック先の URL とタブに表示されるアイコンをカスタマイズできます。

"home_tab" に指定できる値は次のとおりです。

  • "auto": ブラウザによる処理の決定を委ねます。
  • "absent": ホームタブを表示しないようにブラウザに指示します。
  • 次の 2 つのサブプロパティを持つオブジェクト:
    • "url" は、許可された値 "auto" またはホームタブをロックする URL に置き換えます。
    • "icons": 使用可能な値 "auto" またはメインの "icons" プロパティのようなアイコンの配列。

新しいタブボタン

新しいタブボタンが存在する場合は、アプリのスコープ内にある URL で新しいタブを開きます。アプリは、このボタンにカスタム URL とアイコンを設定できます。ブラウザでは、これらのタブをドラッグして新しいウィンドウを作成する方法や、ブラウザタブと組み合わせる方法を決定できます。

"new_tab_button" に指定できる値は次のとおりです。

  • "auto": ブラウザによる処理の決定を委ねます。
  • "absent": 新しいタブボタンを表示しないようにブラウザに指示します。
  • 次の 2 つのサブプロパティを持つオブジェクト:
    • "url" は、許可された値 "auto" または新しいタブを開く対象範囲内の URL に置き換えます。
    • "icons": 使用可能な値 "auto" またはメインの "icons" プロパティのようなアイコンの配列。

完全なサンプルコード

タブ付きインターフェースを使用してアプリの動作を構成する完全な例を以下に示します。

{
  "display_override": ["tabbed"],
  "tab_strip": {
    "home_tab": {
      "url": "./home/",
      "icons": [
        {
          "src": "./home.svg",
          "sizes": "any",
          "type": "image/svg+xml"
        }
      ]
    },
    "new_tab_button": {
      "url": "./new-tab/",
      "icons": [
        {
          "src": "./new-tab.svg",
          "sizes": "any",
          "type": "image/svg+xml"
        }
      ]
    }
  }
}

タブ付きアプリケーション モードの検出

アプリがタブ付きアプリケーション モードで実行されているかどうかは、CSS または JavaScript の display-mode CSS メディア機能を確認することで検出できます。

@media (display-mode: tabbed) {
  /* Styles to apply in tabbed application mode. */
}
const tabbedApplicationModeEnabled = window.matchMedia('(display-mode: tabbed)').matches;

Launch Handler API とのやり取り

Launch Handler API を使用すると、アプリは既存のアプリ ウィンドウにリダイレクトして、重複するウィンドウが開かれることを防止できます。タブ付きのアプリで "client_mode": "navigate-new" を設定すると、アプリの起動時に既存のアプリ ウィンドウに新しいタブが開きます。

デモ

ブラウザフラグを設定すると、タブ形式のアプリケーション モードを試すことができます。

  1. #enable-desktop-pwas-tab-strip フラグを設定します。
  2. アプリ tabbed-application-mode.glitch.meソースコード)をインストールします。
  3. 各タブでそれぞれのリンクをクリックします。

tabbed-application-mode.glitch.me のタブ形式アプリケーション モードのデモのスクリーンショット。

フィードバック

Chrome チームでは、タブ形式アプリケーション モードの使用経験をお伺いしたいと存じます。

API の設計についてお聞かせください

タブ形式のアプリケーション モードについて、期待したとおりに動作しない点はありますか。作成したウェブアプリ マニフェストの問題にコメントします。

実装に関する問題を報告する

Chrome の実装にバグが見つかりましたか?new.crbug.com でバグを報告します。できる限り詳細な情報と再現手順を記載し、[Components] ボックスに「UI>Browser>WebAppInstalls」と入力します。Glitch は、すばやく簡単に再現するケースの共有に最適です。

API のサポートを表示する

タブ形式アプリケーション モードを使用する予定はありますか?一般公開のサポートにより、Chrome チームが機能に優先順位を付け、他のブラウザ ベンダーをサポートすることがいかに重要であるかを示します。

ハッシュタグ #TabbedApplicationMode を使用して @ChromiumDev 宛てにツイートを送信し、使用場所と使用方法をお知らせください。

謝辞

タブ付きアプリケーション モードについては、Matt Giuca が検討しました。Chrome での試験運用版の実装は、Alan Cutter 氏によるものです。この記事は Joe Medley によってレビューされました。ヒーロー画像(作成者: Till NiermannWikimedia Commons)。