as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
Ring
AWS
ドキュメント
Support
Contact Us
My Cases

as

開発
テスト
公開
収益化
ユーザーエンゲージメント
デバイスの仕様
リソース

Fire OSの概要

Fire OSの概要

Fire OSは、AmazonのFire TVやFireタブレットで動作するオペレーティングシステムです。Fire OSはAndroidをベースにしているため、Androidで動くアプリであれば、ほぼ確実にAmazonのFireデバイスでも動作します。アプリのAndroidコードを調整しなくても、AmazonのOSで公開できる場合もあります。

Fire OSのバージョン

Fire OS には複数のバージョンがあります。

各種Fire TVデバイスとOSバージョンの対応関係を以下の表に示します。

Fire TVデバイス ビルドモデル Androidレベル OSのバージョン
Onida 4K Smart Fire TV(2026、日本未対応) AFTAR04B9A Androidレベル34(Android 14) Fire OS 14
Amazon Fire TV Omni QLEDシリーズ(2025、日本未対応) AFTPOC9BD3/AFTPO9D4D7 Androidレベル30(Android 11) Fire OS 8
Amazon Fire TV 2シリーズ(2025、日本未対応) AFTCU864A2/AFTCUD6595 Androidレベル30(Android 11) Fire OS 8
Amazon Fire TV 4シリーズ(2025、日本未対応) AFTNA1322D/AFTNA67200 Androidレベル30(Android 11) Fire OS 8
Fire TV Stick 4K Plus(2025) AFTMA08C15 Androidレベル30(Android 11) Fire OS 8
Fire TV Stick 4K Select(2025) AFTCA002 なし Vega OSのバージョン: OS 1.1
Fire TV JVC - 4K UHD液晶TV(2025) AFTWYM01 Androidレベル30(Android 11) Fire OS 8
Fire TV Panasonic - W95B/W90B/W80B 4K UHD液晶TV(2025) AFTWYM01 Androidレベル30(Android 11) Fire OS 8
Fire TV Panasonic - Z95B/Z90Bシリーズ4K UHD HDR有機EL TV(2025) AFTTOR001 Androidレベル30(Android 11) Fire OS 8
Xiaomi TV 4K HDR TV(2026、日本未対応) AFTBR92D74 Androidレベル30(Android 11) Fire OS 8
TCL 4K Smart Fire TV QLEDパネル(2025、日本未対応) AFTMA475B1 Androidレベル30(Android 11) Fire OS 8
Echo Show 21(2024) AEOSY Androidレベル28(Android 9) Fire OS 7
Echo Show 15 - 第2世代(2024) AEOCY Androidレベル28(Android 9) Fire OS 7
Regal 4K LED Fire TV(2025) AFTSH3F7EF Androidレベル30(Android 11) Fire OS 8
4K Fire TV QLEDスマートTV(2024、日本未対応) AFTSH3F7EF Androidレベル30(Android 11) Fire OS 8
4K Ultra HDスマートTV(2024、日本未対応) AFTPOF46A5 Androidレベル30(Android 11) Fire OS 8
Fire TV Stick HD(Alexa対応音声認識リモコン付き)(2024) AFTSS Androidレベル28(Android 9) Fire OS 7
FUNAI 4K - Fire TV(2024) UF560 Androidレベル28(Android 9) Fire OS 7
Fire TV Panasonic - W95A/W90A/W80A 4K UHD液晶TV(2024) AFTWYM01 Androidレベル30(Android 11) Fire OS 8
Fire TV Panasonic - Z85Aシリーズ4K UHD HDR有機EL TV(2024) AFTWYM01 Androidレベル30(Android 11) Fire OS 8
Fire TV Panasonic - Z95A/Z93A/Z90Aシリーズ4K UHD HDR有機EL TV(2024) AFTTOR001 Androidレベル30(Android 11) Fire OS 8
Panasonic 4K MX800シリーズ(Fire TV搭載)(2023、日本未対応) AFTBOXE1 Androidレベル28(Android 9) Fire OS 7
Redmi 108cm(43インチ)4K Ultra HD smart LED Fire TV(2023、日本未対応) AFTBTX4 Androidレベル28(Android 9) Fire OS 7
TCL Class S3 1080p LEDスマートTV(Fire TV搭載)(2023、日本未対応) AFTMD002 Androidレベル28(Android 9) Fire OS 7
Fire TV Stick 4K Max - 第2世代(2023)- 16GB AFTKRT Androidレベル30(Android 11) Fire OS 8
Fire TV Stick 4K - 第2世代(2023)- 8GB AFTKM Androidレベル30(Android 11) Fire OS 8
TCL 32インチFHD、40インチFHD Fire TV(2023、日本未対応) AFTSHN02 Androidレベル28(Android 9) Fire OS 7
Fire TV - TCL S4シリーズ4K UHD HDR LED(2023、日本未対応) AFTMD001 Androidレベル28(Android 9) Fire OS 7
Fire TV - TCL Q6 4K QLED HDR(2023、日本未対応) AFTMD001 Androidレベル28(Android 9) Fire OS 7
Fire TV 2-Series(2023、日本未対応) AFTKA002/AFTKAUK002 Androidレベル28(Android 9) Fire OS 7
Fire TV - Hisense 4K UHD(2022、日本未対応) AFTHA004 Androidレベル28(Android 9) Fire OS 7
Toshiba 4K UHD - Fire TV(2022、日本未対応) AFTHA004 Androidレベル28(Android 9) Fire OS 7
BMW(2022) AFTLBT962E2 Androidレベル28(Android 9) Fire OS 7
Echo Show 15(2021) AEOHY Androidレベル28(Android 9) Fire OS 7
Fire TV Omni QLED Series(2022、日本未対応) AFTTIFF43 Androidレベル28(Android 9) Fire OS 7
Fire TV Cube - 第3世代(2022) AFTGAZL Androidレベル28(Android 9) Fire OS 7
Xiaomi F2 4K - Fire TV(2022、日本未対応) AFTANNA0 Androidレベル28(Android 9) Fire OS 7
Hisense U6 4K UHD - Fire TV(2022、日本未対応) AFTHA001 Androidレベル28(Android 9) Fire OS 7
フナイ4K - Fire TV(2022) AFTMON001、AFTMON002 Androidレベル28(Android 9) Fire OS 7
JVC 4K - Fire TV with Freeview Play(2021、日本未対応) AFTJULI1 Androidレベル28(Android 9) Fire OS 7
ok 4K - Fire TV(2021、日本未対応) AFTANNA0 Androidレベル28(Android 9) Fire OS 7
Toshiba 4KファーフィールドUHD - Fire TV(2021、日本未対応) AFTHA003 Androidレベル28(Android 9) Fire OS 7
Fire TV Stick 4K Max - 第1世代(2021) AFTKA Androidレベル28(Android 9) Fire OS 7
Stellantis(Jeep)- Wagoneer/Grand Wagoneer(日本未対応) AFTLFT962X3 Androidレベル28(Android 9) Fire OS 7
Fire TV Omni Series(2021、日本未対応) AFTTIFF43 Androidレベル28(Android 9) Fire OS 7
Toshiba V35 Series LED FHD/HD - Fire TV(2021、日本未対応) AFTHA002 Androidレベル28(Android 9) Fire OS 7
Fire TV 4-Series(2021、日本未対応) AFTTI43 Androidレベル28(Android 9) Fire OS 7
Toshiba 4K UHD - Fire TV(2021、日本未対応) AFTHA001 Androidレベル28(Android 9) Fire OS 7
AmazonBasics 4K - Fire TV(2020、日本未対応) AFTPR001 Androidレベル28(Android 9) Fire OS 7
AmazonBasics HD/FHD - Fire TV(2020、日本未対応) AFTBU001 APIレベル25(Android 7.1) Fire OS 6
Technika 4K - Fire TV(2020、日本未対応) `` Androidレベル28(Android 9) Fire OS 7
JVC 2K - Fire TV(2020、日本未対応) AFTWMST22 Androidレベル28(Android 9) Fire OS 7
Onida HD/FHD - Fire TV(2020、日本未対応)<2サイズ展開> AFTTIFF55 APIレベル25(Android 7.1) Fire OS 6
ok 4K - Fire TV(2020、日本未対応) AFTWI001 Androidレベル28(Android 9) Fire OS 7
Fire TV Stick - 第3世代(2020) AFTSSS Androidレベル28(Android 9) Fire OS 7
Fire TV Stick Lite(日本未対応)- 第1世代(2020) AFTSS Androidレベル28(Android 9) Fire OS 7
Toshiba 4K UHD - Fire TV(2020、日本未対応) AFTDCT31 Androidレベル28(Android 9) Fire OS 7
Insignia 4K UHD - Fire TV(2020、日本未対応) AFTDCT31 Androidレベル28(Android 9) Fire OS 7
Fire TV Stick - 第2世代(2016~2019) AFTT Androidレベル22(Android 5.1) Fire OS 5
Toshiba HD - Fire TV(2018~2020、日本未対応) AFTBAMR311 APIレベル25(Android 7.1) Fire OS 6
Insignia HD - Fire TV(2018~2020、日本未対応) AFTEAMR311 APIレベル25(Android 7.1) Fire OS 6
Toshiba 4K - Fire TV(2018~2019、日本未対応) AFTKMST12 APIレベル25(Android 7.1) Fire OS 6
Onida HD - Fire TV(2019、日本未対応) AFTLE APIレベル25(Android 7.1) Fire OS 6
Fire TV Cube - 第2世代(2019) AFTR Androidレベル28(Android 9) Fire OS 7
Grundig OLED 4K - Fire TV(2019、日本未対応) AFTEUFF014 Androidレベル28(Android 9) Fire OS 7
Grundig Vision 7, 4K - Fire TV(2019、日本未対応) AFTEU014 Androidレベル28(Android 9) Fire OS 7
JVC 4K - Fire TV(2019、日本未対応) AFTSO001 Androidレベル28(Android 9) Fire OS 7
Nebulaサウンドバー - Fire TV Edition(2019、日本未対応) AFTMM APIレベル25(Android 7.1) Fire OS 6
TCLサブウーファー内蔵サウンドバー - Fire TV Edition(2019、日本未対応) AFTMM APIレベル25(Android 7.1) Fire OS 6
Grundig Vision 6 HD - Fire TV(2019、日本未対応) AFTEU011 Androidレベル28(Android 9) Fire OS 7
Insignia 4K - Fire TV(2018、日本未対応) AFTJMST12 APIレベル25(Android 7.1) Fire OS 6
Fire TV Cube - 第1世代(2018、日本未対応) AFTA APIレベル25(Android 7.1) Fire OS 6
Fire TV Stick 4K - 第1世代(2018) AFTMM APIレベル25(Android 7.1) Fire OS 6
Fire TV Stick - Basic Edition(日本未対応、2017) AFTT Androidレベル22(Android 5.1) Fire OS 5
Element 4K - Fire TV(2017、日本未対応) AFTRS Androidレベル22(Android 5.1) Fire OS 5
Fire TV - 第3世代(2017) AFTN APIレベル25(Android 7.1) Fire OS 6
Fire TV - 第2世代(2015) AFTS Androidレベル22(Android 5.1) Fire OS 5
Fire TV Stick - 第1世代(2014) AFTM Androidレベル22(Android 5.1) Fire OS 5
Fire TV - 第1世代(2014) AFTB Androidレベル22(Android 5.1) Fire OS 5

仕様の詳細については、Fire TVのデバイス仕様を参照してください。

ほとんどのFireデバイスは、無線でアップデートを受信し、Fire OSを自動更新します。すべてのFireデバイスが、同じFire OSバージョンのプッシュ配信を同時に受け取るわけではありません。多くの場合、デバイスごとに異なるタイミングでアップデートがロールアウトされます。

Fire OSバージョンを確認するには、[設定] > [端末] > [Fire TV] の順にクリックし、「ソフトウェアバージョン」の詳細を確認します。Fire OSのバージョンの詳細は、エンドユーザー向けドキュメントのFire TV端末ソフトウェアアップデートで確認できます。

デバッグログと詳細ログ(デフォルトでは無効)

最新のソフトウェアリリースでは、デバッグログと詳細ログはデフォルトで無効になっています。これは、デバイスとバックエンドストレージサービスを最適化して、ユーザーに優れたデバイス体験を提供するためです。開発やQAでは、次のコマンドを使用してデバッグログと詳細ログを含めることができます。

デバッグログと詳細ログを有効にする手順

以下のadbコマンドを使用して、関連するシステムプロパティをリセットします。

adb shell setprop persist.log.tag V/D/I/W/E
注:Fire OS 5では「adb shell setprop persist.log.level 2/3/4/5/6」となり、変更を反映させるために「adb reboot」も必要となります

その後、ログを収集するには、以下のコマンドを実行します。

adb logcat -c
adb logcat
  • アプリのデバッグログが出力されるようにするには、目的のログタグのプロパティをオーバーライドします。これは、既存のAndroid APIを通じて、アプリのタグ名を持つlog.tag.<タグ>プロパティを設定することで行います。
  • たとえば、log.tag.ActivityManager=Dというプロパティを設定すると、タグ固有のログをオーバーライドできます。logdはこれを理解し、指定されたTAGを持つデバッグログをすべて出力します。

サービスの違い

コアの部分では、Fire OSとAndroidは同じ基盤を使用しています。両者の主な違いはサービスにあります。Fire OSでは、ブラウズ、位置情報、メッセージング、支払いなどのアクティビティにGoogleのサービスではなくAmazonのサービスが使用されることがあります。最も大きな違いは、アプリを公開するために、GoogleではGoogle Playストアを利用するのに対し、AmazonではAmazonアプリストアを利用する点です。

AndroidアプリでGoogleのサービスに接続している場合、AndroidアプリをFire OSに移植する際に、Amazonのサービスの利用が必要になる可能性があります。

アプリを開発する際は、標準のAndroidドキュメントに従ってください。AmazonのFire OSで考慮すべき相違点がある場合は、このサイトのドキュメントで説明しています。

Fire OSでは、可能な限りAndroidと同等のサービス(Googleのサービスを除く)を提供し、開発者が別の開発テクニックについて学習したり、既存のAndroidアプリを変更したりする必要がないように配慮しています。

下表でGoogleのサービスとAmazonのサービスの対比をご確認ください。

Google Android Fire OSに関する質問
Firebase Cloud Messaging A3L Messaging
またはAmazon Device Messaging
Google Playアプリ内課金 Appstore請求サービス対応SDK
またはAmazonアプリ内課金(IAP)API
Cast SDK Matterキャスト
Google Mobile Ads SDK Amazon Publisher Services
Google Sign-In A3L Authentication
またはLogin with Amazon
Google Play Developer API アプリ申請API

Last updated: 2026年3月9日

").insertBefore(this); } }); }); $(document).ready(function() { if ($("#jumpoffset").length) { var scrollhash = document.getElementById('jumpoffset'); scrollhash.scrollIntoView(true); if (location.hash) { location.href = location.hash; } else { var scrollbody = document.querySelector('.mainColumn'); scrollbody.scrollIntoView(true); window.scroll(0, -500); } } }); $(document).ready(function() { if ($("#jump").length) { var scrollold = document.getElementById('jump'); scrollold.scrollIntoView(true); window.scroll(0, -100); if (location.hash) { location.href = location.hash; } } }); //resize container on local builds $(document).ready(function() { if (window.location.href.indexOf("/127.0.0.1:4000/") > -1) { document.querySelector('.container-fluid').style.position = 'fixed'; } }); //add underline to headers $(document).ready(function() { if ($(".productTitle").is(':contains("Alexa Skills Kit")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Skills Kit")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($(".productTitle").is(':contains("Alexa Presentation Language (APL)")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Skills Kit")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($(".productTitle").is(':contains("Alexa Connect Kit")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Connect Kit")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($(".productTitle").is(':contains("A/B Testing")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Skills Kit")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($(".productTitle").is(':contains("Alexa Smart Properties")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Smart Properties")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($(".productTitle").is(':contains("Alexa Conversations Developer Guide")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Skills Kit")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($(".productTitle").is(':contains("Alexa Design Guide")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Design Guide")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Design Guide")')) { $(this).css("padding", "0"); } }); } if ($(".productTitle").is(':contains("Alexa Gadgets Toolkit")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Gadgets Toolkit")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Gadgets Toolkit")')) { $(this).css("padding", "0"); } }); } if ($(".productTitle").is(':contains("Alexa Voice Service")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Alexa Voice Service")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($("h1").is(':contains("Alexa Reference Content")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Reference")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($("h1").is(':contains("Alexa Videos")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Videos")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($("h1").is(':contains("Alexa Code Samples")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Code Samples")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } if ($("h1").is(':contains("Documentation Home")')) { $(".dppnItem a").each(function() { if ($(this).is(':contains("Home")')) { $(this).css("border-bottom", "1.3px solid #FFFFFF"); } }); } }); $(document).ready(function () { const myScrollspy = $("#myScrollspy"); if (myScrollspy.length) { const containsList2orList3 = myScrollspy.find(".list2, .list3").length > 0; if (containsList2orList3) { myScrollspy.css("display", "block"); $(".fa.fa-info-circle").show(); } else { myScrollspy.css("display", "none"); $(".fa.fa-info-circle").hide(); } } }); /** * This function moves the 'page-not-translated' section from its original position * to a new position after the 'atd-categories-header' and ensures it is displayed * only in the new location. This is achieved by hiding the section initially, * moving it, and then displaying it again once it is in the correct position. */ $(document).ready(function() { const $pageNotTranslatedMessage = $('#page-not-translated'); const $desktopCategoriesHeader = $('.navigation-header.atd-categories-header'); const $mobileToggleHeader = $('.mobile-toggle'); if ($pageNotTranslatedMessage.length) { if ($mobileToggleHeader.length) { $pageNotTranslatedMessage.insertAfter($mobileToggleHeader); } else if ($desktopCategoriesHeader.length) { $pageNotTranslatedMessage.insertAfter($desktopCategoriesHeader); } $pageNotTranslatedMessage.show(); } }); // Function to handle smooth scrolling to target elements when links are clicked $(document).ready(function () { $('.customspy a, .mainColumn a').on('click', function (event) { const targetId = $(this).attr('href'); if (targetId && targetId.startsWith('#')) { event.preventDefault(); const targetElement = document.querySelector(`[id="${targetId.replace('#', '')}"]`); if (targetElement) { const hash = targetId.substring(1); window.history.pushState(null, '', `#${hash}`); targetElement.scrollIntoView(true); window.scroll(0, -500); } } }); }); window.addEventListener('DOMContentLoaded', function () { const targetId = window.location.hash; if (targetId) { const targetElement = document.querySelector(targetId); if (targetElement) { setTimeout(() => { targetElement.scrollIntoView(true); window.scrollBy(0, -500); }, 10); } } }); function activateContentBasedOnHash() { const currentHash = window.location.hash.substring(1); if (currentHash) { const contentElement = document.getElementById(currentHash); if (contentElement) { activateTabAndContent(contentElement); } } } function activateTabAndContent(contentElement) { const tabSection = contentElement.closest('.tab-pane'); if (tabSection) { const parentTabLink = document.querySelector(`a[href='#${tabSection.id}']`); if (parentTabLink) { const parentNavTabs = parentTabLink.closest('.nav-tabs'); if (parentNavTabs) { parentNavTabs.querySelectorAll('.nav-link').forEach(link => { link.classList.remove('active', 'show'); }); parentTabLink.classList.add('active', 'show'); } const parentTabContent = tabSection.closest('.tab-content'); if (parentTabContent) { parentTabContent.querySelectorAll('.tab-pane').forEach(tab => { tab.classList.remove('active', 'show'); }); tabSection.classList.add('active', 'show'); } } } } function scrollToHashWithOffset() { const tabHash = window.location.hash; const targetTabLink = document.querySelector(`.nav-tabs a[href="${tabHash}"]`); const mainContentColumn = document.querySelector('.inline'); if (targetTabLink && mainContentColumn) { const totalHeaderHeight = getTotalHeaderHeight() + 40; targetTabLink.scrollIntoView({behavior: 'smooth', block: 'start'}); setTimeout(() => { mainContentColumn.scrollBy(0, -totalHeaderHeight); }, 20); } } function getTotalHeaderHeight() { return [...document.querySelectorAll('.atd-services-header, .atd-categories-header')] .reduce((total, header) => total + (header ? header.offsetHeight : 0), 0); } function handleClick(event) { event.preventDefault(); const link = event.currentTarget; const hash = link.getAttribute('href').substring(1); const contentElement = document.getElementById(hash); if (contentElement) { activateTabAndContent(contentElement); scrollToHashWithOffset(); } } function handleBackToTopClick(event) { event.preventDefault(); const mainContentColumn = document.querySelector('.inline'); if (mainContentColumn) { mainContentColumn.scrollTo({top: 0, behavior: 'smooth'}); } window.scrollTo({top: 0, behavior: 'smooth'}); } document.addEventListener('DOMContentLoaded', () => { activateContentBasedOnHash(); scrollToHashWithOffset(); const myScrollspy = document.getElementById('myScrollspy'); if (myScrollspy) { myScrollspy.querySelectorAll('a[href^="#"]').forEach(link => { link.addEventListener('click', handleClick); }); } document.querySelectorAll('.dpfBackToTopLink, .backToTop').forEach(link => { link.addEventListener('click', handleBackToTopClick); }); }); // Show tab link as selected when clicked $(document).ready(function() { $('.nav-tabs > li > a').on('click', function(e) { e.preventDefault(); $(this).tab('show'); $(this).addClass('active show'); }); }); // Fix for when version dropdown is on the same page as nav tab dropdown // closes other dropdown menu to avoid overlap/usability issues $(document).ready(function() { // Version selector dropdown $('.versionsButton').click(function(e) { // Close the nav tab dropdown if open $('.nav-link.dropdown-toggle').siblings('.dropdown-menu').removeClass('show'); }); // Nav tab selector dropdown $('.nav-link.dropdown-toggle').click(function(e) { // Close the version dropdown if open $('.versionsButton').siblings('.dropdown-menu').removeClass('show'); }); }); // Handle active state management for dropdown menu in nav-tabs // Fixes edge case issues for when version selector dropdown and // nav-tab dropdown appear on the same page $(document).ready(function() { // Function to deactivate all tab panes and reset dropdown items function deactivateAllTabs() { $('.position .nav-item.dropdown .dropdown-menu .dropdown-item').each(function() { const targetId = $(this).attr('href'); $(targetId).removeClass('active show'); $(this).removeClass('active show'); }); } // Store the original pushState function const originalPushState = history.pushState; // Create a custom event for pushState const pushStateEvent = new Event('pushState'); // Override pushState history.pushState = function() { originalPushState.apply(this, arguments); // Dispatch the custom event window.dispatchEvent(pushStateEvent); }; // Add pushState listener window.addEventListener('pushState', function() { const params = new URLSearchParams(window.location.search); const vValue = params.get('v'); // Handle query parameter change from version selector if (vValue) { // Remove active classes from all tabs deactivateAllTabs(); $('.position').each(function() { var firstTabPane = $(this).find('.tab-pane').first(); if (firstTabPane.length > 0) { var tabId = firstTabPane.attr('id'); var dropdownItem = $('.dropdown-menu .dropdown-item[href="#' + tabId + '"]'); // Make first tab in each version active dropdownItem.addClass('active show'); firstTabPane.addClass('active show'); } }); } }); // Handle dropdown item clicks $('.position .nav-item.dropdown .dropdown-menu .dropdown-item').click(function(e) { e.preventDefault(); // Remove active classes from all tabs deactivateAllTabs(); // Add active class to clicked item $(this).addClass('active show'); // Show corresponding tab content const targetId = $(this).attr('href'); $(targetId).addClass('active show'); }); // Handle initial load from URL hash if (window.location.hash) { const tabId = window.location.hash; if ($(tabId).length) { // Deactivate all tabs first deactivateAllTabs(); // Activate the correct tab and content $(`.position .nav-item.dropdown .dropdown-menu .dropdown-item[href="${tabId}"]`).addClass('active show'); $(tabId).addClass('active show'); } } }); // Fix issue when anchor linking into a tab with a dropdown menu $(document).ready(function() { // Handle initial load from URL hash if (window.location.hash) { const tabId = window.location.hash; if ($(tabId).length) { // Deactivate active links in dropdown $('.nav-item.dropdown .dropdown-menu .dropdown-item').each(function() { $(this).removeClass('active show'); }); } } }); // Remove show class from caption elements to preserve table-caption display // (fixes issue where the show class, which forces the display style to block, // caused the table caption to appear inside the table, rather than above it) $(document).ready(function() { if (window.location.hash) { const anchorId = window.location.hash.substring(1); const targetElement = document.getElementById(anchorId); if (targetElement) { const captionParent = $(targetElement).closest('caption'); if (captionParent.length) { captionParent.removeClass('show'); } } } });