From d36845897ba7f146eeb343e665291beca165613f Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Sat, 22 Nov 2025 22:40:13 +0700 Subject: [PATCH] feat: Better At-a-Glance perceptive wallpaper colour luminance detection --- .github/renovate.json5 | 13 + .gitmodules | 4 +- Android.bp | 161 +- AndroidManifest-common.xml | 13 +- AndroidManifest.xml | 17 - GITHUB_CHANGELOG.md | 102 +- OWNERS | 1 + PREUPLOAD.cfg | 2 +- TELEGRAM_CHANGELOG.txt | 210 +- aconfig/launcher.aconfig | 194 +- aconfig/launcher_overview.aconfig | 76 +- aconfig/launcher_search.aconfig | 22 +- build.gradle | 22 +- flags/README.md | 26 +- .../android/launcher3/CustomFeatureFlags.java | 314 +- .../com/android/launcher3/FeatureFlags.java | 166 +- .../android/launcher3/FeatureFlagsImpl.java | 245 +- flags/src/com/android/launcher3/Flags.java | 264 +- .../android/systemui/CustomFeatureFlags.java | 987 +- .../com/android/systemui/FeatureFlags.java | 465 +- .../android/systemui/FeatureFlagsImpl.java | 709 +- flags/src/com/android/systemui/Flags.java | 1129 +- .../systemui/shared/CustomFeatureFlags.java | 47 +- .../android/systemui/shared/FeatureFlags.java | 19 +- .../systemui/shared/FeatureFlagsImpl.java | 47 +- .../com/android/systemui/shared/Flags.java | 57 +- .../window/flags2/CustomFeatureFlags.java | 1014 +- .../android/window/flags2/FeatureFlags.java | 414 +- .../window/flags2/FeatureFlagsImpl.java | 708 +- .../src/com/android/window/flags2/Flags.java | 1045 +- .../android/wm/shell/CustomFeatureFlags.java | 66 +- .../com/android/wm/shell/FeatureFlags.java | 29 +- .../android/wm/shell/FeatureFlagsImpl.java | 54 +- flags/src/com/android/wm/shell/Flags.java | 78 +- .../com/android/launcher3/BuildConfig.java | 5 + .../launcher3/Launcher3QuickStepGo.java | 4 +- gradle/libs.versions.toml | 41 +- lawnchair/assets/google_fonts.json | 94128 ++++++++-------- lawnchair/res/values-cs-rCZ/strings.xml | 2 +- lawnchair/res/values-fr-rFR/strings.xml | 2 +- lawnchair/res/values-ru-rRU/strings.xml | 2 +- lawnchair/res/values/strings.xml | 5 +- lawnchair/res/values/styles.xml | 1 + lawnchair/res/xml/device_profiles.xml | 3 +- .../src/app/lawnchair/LawnchairLauncher.kt | 10 +- .../allapps/views/SearchResultIcon.kt | 2 +- .../backup/ui/CreateBackupViewModel.kt | 4 +- .../lawnchair/deck/AddFoldersWithItemsTask.kt | 9 +- lawnchair/src/app/lawnchair/font/FontCache.kt | 93 +- .../app/lawnchair/icons/shape/IconShape.kt | 2 +- .../nexuslauncher/SmartSpaceHostView.kt | 7 +- .../preferences/PreferenceManager.kt | 3 +- .../algorithms/LawnchairSearchAlgorithm.kt | 4 - .../lawnchair/smartspace/BcSmartSpaceUtil.kt | 14 +- .../theme/drawable/DrawableTokens.kt | 3 +- .../ui/popup/LauncherOptionsPopup.kt | 5 +- .../ui/popup/WallpaperCarouselView.kt | 3 +- .../ui/preferences/about/AboutViewModel.kt | 8 +- .../preferences/components/LauncherPreview.kt | 2 +- .../destinations/HomeScreenPreferences.kt | 5 + .../ui/theme/ExtendedFontVariation.kt | 19 + .../app/lawnchair/ui/theme/GoogleSansFlex.kt | 276 + lawnchair/src/app/lawnchair/ui/theme/Shape.kt | 5 + lawnchair/src/app/lawnchair/ui/theme/Type.kt | 102 +- .../util/LawnchairWindowManagerProxy.kt | 38 +- .../lawnchair/views/LauncherPreviewView.kt | 84 +- .../views/LawnchairFloatingSurfaceView.kt | 6 +- prebuilts/libs/README.md | 8 +- prebuilts/libs/SystemUI-core-16.jar | Bin 12835474 -> 12415927 bytes prebuilts/libs/SystemUI-statsd-16.jar | Bin 12957 -> 12510 bytes prebuilts/libs/WindowManager-Shell-16.jar | Bin 2997695 -> 2825836 bytes prebuilts/libs/framework-16.jar | Bin 20875091 -> 20342081 bytes protos/launcher_atom.proto | 3 +- quickstep/Android.bp | 53 +- quickstep/AndroidManifest.xml | 8 +- .../facade/core/QuickstepComposeFeatures.kt | 14 +- .../facade/disabled/QuickstepComposeFacade.kt | 16 - .../facade/enabled/QuickstepComposeFacade.kt | 17 - .../res/color/app_chip_state_color_fg.xml | 1 - .../res/drawable/app_chip_menu_item_bg.xml | 54 +- .../keyboard_quick_switch_view_background.xml | 2 +- .../res/drawable/task_thumbnail_header_bg.xml | 2 +- .../gesture_tutorial_step_menu.xml | 5 +- .../res/layout/gesture_tutorial_fragment.xml | 14 + .../res/layout/gesture_tutorial_step_menu.xml | 5 +- quickstep/res/layout/icon_app_chip_view.xml | 26 +- .../res/layout/keyboard_quick_switch_view.xml | 1 + .../res/layout/overview_actions_container.xml | 16 +- .../layout/overview_add_desktop_button.xml | 4 +- .../res/layout/overview_clear_all_button.xml | 4 +- .../redesigned_gesture_tutorial_fragment.xml | 18 +- quickstep/res/layout/task.xml | 10 +- quickstep/res/layout/task_grouped.xml | 20 +- quickstep/res/layout/task_thumbnail.xml | 4 +- .../res/layout/task_view_menu_option.xml | 4 +- quickstep/res/layout/taskbar.xml | 11 - .../res/layout/taskbar_divider_popup_menu.xml | 2 +- quickstep/res/layout/taskbar_nav_button.xml | 1 - quickstep/res/values-af/strings.xml | 27 +- quickstep/res/values-am/strings.xml | 27 +- quickstep/res/values-ar/strings.xml | 27 +- quickstep/res/values-as/strings.xml | 27 +- quickstep/res/values-az/strings.xml | 27 +- quickstep/res/values-b+sr+Latn/strings.xml | 27 +- quickstep/res/values-be/strings.xml | 27 +- quickstep/res/values-bg/strings.xml | 27 +- quickstep/res/values-bn/strings.xml | 31 +- quickstep/res/values-bs/strings.xml | 27 +- quickstep/res/values-ca/strings.xml | 29 +- quickstep/res/values-cs/strings.xml | 27 +- quickstep/res/values-da/strings.xml | 27 +- quickstep/res/values-de/strings.xml | 39 +- quickstep/res/values-el/strings.xml | 27 +- quickstep/res/values-en-rAU/strings.xml | 27 +- quickstep/res/values-en-rCA/strings.xml | 27 +- quickstep/res/values-en-rGB/strings.xml | 27 +- quickstep/res/values-en-rIN/strings.xml | 27 +- quickstep/res/values-es-rUS/strings.xml | 29 +- quickstep/res/values-es/strings.xml | 27 +- quickstep/res/values-et/strings.xml | 27 +- quickstep/res/values-eu/strings.xml | 27 +- quickstep/res/values-fa/strings.xml | 27 +- quickstep/res/values-fi/strings.xml | 27 +- quickstep/res/values-fr-rCA/strings.xml | 35 +- quickstep/res/values-fr/strings.xml | 41 +- quickstep/res/values-gl/strings.xml | 27 +- quickstep/res/values-gu/strings.xml | 27 +- quickstep/res/values-hi/strings.xml | 33 +- quickstep/res/values-hr/strings.xml | 27 +- quickstep/res/values-hu/strings.xml | 27 +- quickstep/res/values-hy/strings.xml | 27 +- quickstep/res/values-in/strings.xml | 27 +- quickstep/res/values-is/strings.xml | 29 +- quickstep/res/values-it/strings.xml | 29 +- quickstep/res/values-iw/strings.xml | 31 +- quickstep/res/values-ja/strings.xml | 35 +- quickstep/res/values-ka/strings.xml | 27 +- quickstep/res/values-kk/strings.xml | 27 +- quickstep/res/values-km/strings.xml | 29 +- quickstep/res/values-kn/strings.xml | 29 +- quickstep/res/values-ko/strings.xml | 37 +- quickstep/res/values-ky/strings.xml | 27 +- quickstep/res/values-land/dimens.xml | 6 +- quickstep/res/values-lo/strings.xml | 27 +- quickstep/res/values-lt/strings.xml | 29 +- quickstep/res/values-lv/strings.xml | 27 +- quickstep/res/values-mk/strings.xml | 27 +- quickstep/res/values-ml/strings.xml | 27 +- quickstep/res/values-mn/strings.xml | 27 +- quickstep/res/values-mr/strings.xml | 27 +- quickstep/res/values-ms/strings.xml | 27 +- quickstep/res/values-my/strings.xml | 29 +- quickstep/res/values-nb/strings.xml | 29 +- quickstep/res/values-ne/strings.xml | 27 +- quickstep/res/values-night/colors.xml | 1 + quickstep/res/values-nl/strings.xml | 29 +- quickstep/res/values-or/strings.xml | 27 +- quickstep/res/values-pa/strings.xml | 27 +- quickstep/res/values-pl/strings.xml | 31 +- quickstep/res/values-pt-rPT/strings.xml | 31 +- quickstep/res/values-pt/strings.xml | 29 +- quickstep/res/values-ro/strings.xml | 27 +- quickstep/res/values-ru/strings.xml | 27 +- quickstep/res/values-si/strings.xml | 27 +- quickstep/res/values-sk/strings.xml | 35 +- quickstep/res/values-sl/strings.xml | 29 +- quickstep/res/values-sq/strings.xml | 27 +- quickstep/res/values-sr/strings.xml | 27 +- quickstep/res/values-sv/strings.xml | 27 +- quickstep/res/values-sw/strings.xml | 27 +- quickstep/res/values-sw600dp/config.xml | 4 - quickstep/res/values-sw600dp/dimens.xml | 1 - quickstep/res/values-sw720dp/dimens.xml | 1 - quickstep/res/values-ta/strings.xml | 27 +- quickstep/res/values-te/strings.xml | 31 +- quickstep/res/values-th/strings.xml | 27 +- quickstep/res/values-tl/strings.xml | 27 +- quickstep/res/values-tr/strings.xml | 27 +- quickstep/res/values-uk/strings.xml | 27 +- quickstep/res/values-ur/strings.xml | 27 +- quickstep/res/values-uz/strings.xml | 27 +- quickstep/res/values-vi/strings.xml | 35 +- quickstep/res/values-zh-rCN/strings.xml | 29 +- quickstep/res/values-zh-rHK/strings.xml | 27 +- quickstep/res/values-zh-rTW/strings.xml | 29 +- quickstep/res/values-zu/strings.xml | 27 +- quickstep/res/values/attrs.xml | 14 - quickstep/res/values/colors.xml | 9 +- quickstep/res/values/config.xml | 19 +- quickstep/res/values/dimens.xml | 78 +- quickstep/res/values/ids.xml | 2 - quickstep/res/values/strings.xml | 57 +- quickstep/res/values/styles.xml | 115 +- .../res/xml/indexable_launcher_prefs.xml | 7 - .../launcher3/QuickstepTransitionManager.java | 220 +- .../appprediction/AppsDividerView.java | 12 +- .../appprediction/PredictionRowView.java | 13 +- .../com/android/launcher3/dagger/Modules.kt | 34 +- .../desktop/DesktopAppLaunchTransition.kt | 6 +- .../DesktopAppLaunchTransitionManager.kt | 5 +- .../DesktopRecentsTransitionController.kt | 16 +- .../hybridhotseat/HotseatEduController.java | 16 +- .../hybridhotseat/HotseatEduDialog.java | 15 +- .../HotseatPredictionController.java | 60 +- .../launcher3/model/AppEventProducer.java | 84 +- .../launcher3/model/PredictionUpdateTask.java | 20 +- .../model/QuickstepModelDelegate.java | 411 +- .../launcher3/model/WellbeingModel.java | 8 +- .../model/WidgetsPredictionUpdateTask.java | 11 +- .../statehandlers/DepthController.java | 19 +- .../DesktopVisibilityController.kt | 72 +- .../launcher3/taskbar/BaseTaskbarContext.java | 43 +- .../taskbar/FallbackTaskbarUIController.java | 4 + .../KeyboardQuickSwitchController.java | 154 +- .../taskbar/KeyboardQuickSwitchTaskView.java | 2 +- .../taskbar/KeyboardQuickSwitchView.java | 71 - .../KeyboardQuickSwitchViewController.java | 101 +- .../taskbar/LauncherTaskbarUIController.java | 54 +- .../taskbar/ManageWindowsTaskbarShortcut.kt | 9 +- .../taskbar/NavbarButtonsViewController.java | 104 +- .../launcher3/taskbar/PinToTaskbarShortcut.kt | 24 +- .../taskbar/StashedHandleViewController.java | 39 +- .../taskbar/TaskbarActivityContext.java | 341 +- .../TaskbarAutohideSuspendController.java | 5 - .../taskbar/TaskbarBackgroundRenderer.kt | 15 +- .../launcher3/taskbar/TaskbarControllers.java | 14 +- .../taskbar/TaskbarDesktopModeController.kt | 17 +- .../taskbar/TaskbarDividerPopupView.kt | 25 +- .../taskbar/TaskbarDragController.java | 10 +- .../launcher3/taskbar/TaskbarDragLayer.java | 1 - .../taskbar/TaskbarDragLayerController.java | 15 +- .../launcher3/taskbar/TaskbarEduTooltip.kt | 4 +- .../taskbar/TaskbarEduTooltipController.kt | 18 +- .../TaskbarHoverToolTipController.java | 37 +- .../taskbar/TaskbarInsetsController.kt | 230 +- .../TaskbarLauncherStateController.java | 115 +- .../taskbar/TaskbarModelCallbacks.java | 98 +- .../taskbar/TaskbarModelCallbacksFactory.kt | 13 +- .../taskbar/TaskbarNavButtonController.java | 55 +- .../taskbar/TaskbarOverflowView.java | 12 - .../taskbar/TaskbarPinningController.kt | 30 +- .../taskbar/TaskbarPopupController.java | 47 +- .../taskbar/TaskbarRecentAppsController.kt | 138 +- .../launcher3/taskbar/TaskbarSharedState.java | 22 - .../taskbar/TaskbarStashController.java | 125 +- .../taskbar/TaskbarStashViaTouchController.kt | 14 +- .../taskbar/TaskbarThresholdUtils.java | 2 +- .../taskbar/TaskbarUIController.java | 21 - .../launcher3/taskbar/TaskbarView.java | 244 +- .../taskbar/TaskbarViewCallbacks.java | 4 +- .../taskbar/TaskbarViewCallbacksFactory.kt | 15 +- .../taskbar/TaskbarViewController.java | 186 +- .../android/launcher3/taskbar/Utilities.java | 26 +- .../VoiceInteractionWindowController.kt | 1 - .../allapps/TaskbarAllAppsController.java | 1 - .../allapps/TaskbarAllAppsSlideInView.java | 41 +- .../taskbar/bubbles/BubbleBarController.java | 106 +- .../bubbles/BubbleBarLocationDropTarget.kt | 59 +- .../bubbles/BubbleBarSwipeController.kt | 3 +- .../taskbar/bubbles/BubbleBarView.java | 119 +- .../bubbles/BubbleBarViewController.java | 195 +- .../taskbar/bubbles/BubbleControllers.java | 25 +- .../taskbar/bubbles/BubbleDismissViewExt.kt | 3 +- .../taskbar/bubbles/BubbleDragController.java | 62 +- .../BubbleStashedHandleViewController.java | 5 +- .../animation/BubbleBarViewAnimator.kt | 2 +- .../flyout/BubbleBarFlyoutController.kt | 1 - .../bubbles/stashing/BubbleStashController.kt | 10 +- .../DeviceProfileDimensionsProviderAdapter.kt | 4 +- .../PersistentBubbleStashController.kt | 12 +- .../TransientBubbleStashController.kt | 16 +- .../TaskbarAllAppsButtonContainer.kt | 38 +- .../customization/TaskbarDividerContainer.kt | 18 +- .../customization/TaskbarFeatureEvaluator.kt | 8 +- .../customization/TaskbarSpecsEvaluator.kt | 2 +- .../taskbar/growth/NudgeController.kt | 189 +- .../launcher3/taskbar/growth/NudgePayload.kt | 2 + .../navbutton/AbstractNavButtonLayoutter.kt | 2 +- .../navbutton/NavButtonLayoutFactory.kt | 2 +- .../navbutton/PhoneLandscapeNavLayoutter.kt | 25 +- .../navbutton/PhonePortraitNavLayoutter.kt | 12 +- .../navbutton/PhoneSeascapeNavLayoutter.kt | 21 +- .../taskbar/navbutton/SetupNavLayoutter.kt | 12 +- .../taskbar/navbutton/TaskbarNavLayoutter.kt | 12 +- .../overlay/TaskbarOverlayContext.java | 38 +- .../overlay/TaskbarOverlayController.java | 74 +- .../overlay/TaskbarOverlayDragLayer.java | 1 - .../uioverrides/PredictedAppIcon.java | 31 +- .../uioverrides/QuickstepLauncher.java | 184 +- .../uioverrides/QuickstepWidgetHolder.java | 26 - .../uioverrides/RecentsViewStateController.kt | 7 +- .../launcher3/uioverrides/SystemApiWrapper.kt | 38 +- .../uioverrides/states/AllAppsState.java | 40 +- .../states/BackgroundAppState.java | 18 +- .../states/OverviewModalTaskState.java | 2 +- .../uioverrides/states/OverviewState.java | 32 +- .../uioverrides/states/QuickSwitchState.java | 23 +- .../QuickstepAtomicAnimationFactory.java | 2 +- .../states/SplitScreenSelectState.java | 2 +- .../NavBarToHomeTouchController.java | 18 +- ...ButtonNavbarToOverviewTouchController.java | 19 +- .../NoButtonQuickSwitchTouchController.java | 14 +- .../PortraitStatesTouchController.java | 9 +- .../QuickSwitchTouchController.java | 2 +- .../StatusBarTouchController.java | 28 +- .../TaskViewDismissTouchController.kt | 251 +- .../TaskViewLaunchTouchController.kt | 14 +- .../TaskViewTouchControllerDeprecated.java | 2 +- .../TransposedQuickSwitchTouchController.java | 2 +- .../android/quickstep/AbsSwipeUpHandler.java | 156 +- .../android/quickstep/AllAppsActionManager.kt | 10 +- .../quickstep/AspectRatioSystemShortcut.kt | 7 +- .../quickstep/BaseActivityInterface.java | 43 + .../quickstep/BaseContainerInterface.java | 122 +- .../quickstep/BaseWindowInterface.java | 25 +- .../quickstep/DesktopFullscreenDrawParams.kt | 2 +- .../quickstep/DesktopSystemShortcut.kt | 25 +- .../src/com/android/quickstep/DisplayModel.kt | 37 +- .../ExternalDisplaySystemShortcut.kt | 5 +- .../quickstep/FallbackActivityInterface.java | 12 +- .../quickstep/FallbackSwipeHandler.java | 19 +- .../quickstep/FallbackWindowInterface.java | 56 +- .../com/android/quickstep/GestureState.java | 9 +- .../android/quickstep/HighResLoadingState.kt | 5 +- .../android/quickstep/HomeVisibilityState.kt | 28 +- .../android/quickstep/InputConsumerUtils.kt | 87 +- .../quickstep/InstantAppResolverImpl.java | 7 +- .../quickstep/LauncherActivityInterface.java | 40 +- .../LauncherBackAnimationController.java | 25 +- .../LauncherRestoreEventLoggerImpl.kt | 14 +- .../quickstep/LauncherSwipeHandlerV2.java | 29 +- quickstep/src/com/android/quickstep/OWNERS | 1 + .../quickstep/OverviewCommandHelper.kt | 409 +- .../quickstep/OverviewComponentObserver.java | 95 +- .../QuickstepTestInformationHandler.java | 269 +- .../android/quickstep/RecentTasksList.java | 82 +- .../android/quickstep/RecentsActivity.java | 28 +- .../quickstep/RecentsAnimationCallbacks.java | 11 +- .../quickstep/RecentsAnimationController.java | 27 +- .../RecentsAnimationDeviceState.java | 172 +- .../quickstep/RecentsAnimationTargets.java | 5 +- .../android/quickstep/RecentsFilterState.java | 19 +- .../com/android/quickstep/RecentsModel.java | 51 +- .../quickstep/RemoteAnimationTargets.java | 6 - .../android/quickstep/RemoteTargetGluer.java | 247 +- .../quickstep/RotationTouchHelper.java | 48 +- .../quickstep/SwipeUpAnimationLogic.java | 49 +- .../SystemDecorationChangeObserver.kt | 9 +- .../com/android/quickstep/SystemUiProxy.kt | 126 +- .../quickstep/TaskAnimationManager.java | 124 +- .../com/android/quickstep/TaskIconCache.kt | 42 +- .../android/quickstep/TaskOverlayFactory.java | 25 +- .../quickstep/TaskShortcutFactory.java | 106 +- .../android/quickstep/TaskThumbnailCache.kt | 52 +- .../com/android/quickstep/TaskViewUtils.java | 24 +- .../com/android/quickstep/TopTaskTracker.java | 113 +- .../quickstep/TouchInteractionService.java | 562 +- .../dagger/QuickstepBaseAppComponent.java | 43 +- .../FallbackRecentsStateController.java | 4 +- .../fallback/FallbackRecentsView.java | 72 +- .../quickstep/fallback/RecentsDragLayer.java | 4 +- .../quickstep/fallback/RecentsState.java | 47 +- .../quickstep/fallback/RecentsStateUtils.kt | 11 - .../fallback/window/RecentsWindowFlags.kt | 40 +- .../fallback/window/RecentsWindowManager.kt | 249 +- .../window/RecentsWindowSwipeHandler.java | 85 +- .../AccessibilityInputConsumer.java | 5 +- .../DeviceLockedInputConsumer.java | 7 +- .../NavHandleLongPressHandler.java | 43 +- .../OtherActivityInputConsumer.java | 12 +- .../inputconsumers/OverviewInputConsumer.java | 14 +- .../ProgressDelegateInputConsumer.java | 2 +- .../TaskbarUnstashInputConsumer.java | 71 +- .../quickstep/interaction/AllSetActivity.java | 175 +- .../interaction/EdgeBackGestureHandler.java | 2 +- .../interaction/GestureSandboxActivity.java | 4 +- .../quickstep/interaction/MenuFragment.java | 14 - .../interaction/NavBarGestureHandler.java | 2 +- .../SwipeUpGestureTutorialController.java | 11 +- .../interaction/TutorialController.java | 94 +- .../interaction/TutorialFragment.java | 4 +- .../logging/SettingsChangeLogger.java | 77 +- .../logging/StatsLogCompatManager.java | 931 + .../orientation/LandscapePagedViewHandler.kt | 75 +- .../orientation/PortraitPagedViewHandler.kt | 127 +- .../RecentsPagedOrientationHandler.kt | 24 +- .../orientation/SeascapePagedViewHandler.kt | 43 +- .../recents/data/RecentTasksRepository.kt | 4 +- .../RecentsDeviceProfileRepositoryImpl.kt | 2 +- .../quickstep/recents/data/TasksRepository.kt | 132 +- .../recents/di/RecentsDependencies.kt | 58 +- .../recents/domain/model/TaskModel.kt | 7 - .../recents/domain/usecase/GetTaskUseCase.kt | 50 +- .../usecase/OrganizeDesktopTasksUseCase.kt | 128 +- .../recents/ui/mapper/TaskUiStateMapper.kt | 123 +- .../ui/viewmodel/DesktopTaskViewModel.kt | 11 +- .../recents/ui/viewmodel/TaskTileUiState.kt | 8 +- .../recents/ui/viewmodel/TaskViewModel.kt | 105 +- .../recents/viewmodel/RecentsViewModel.kt | 13 +- .../task/thumbnail/TaskThumbnailUiState.kt | 36 +- .../task/thumbnail/TaskThumbnailView.kt | 73 +- .../quickstep/util/ActivityPreloadUtil.kt | 5 +- .../AnimatorControllerWithResistance.java | 4 +- .../quickstep/util/AppPairsController.java | 51 +- .../android/quickstep/util/BackAnimState.kt | 12 +- .../quickstep/util/BaseDepthController.java | 280 +- .../android/quickstep/util/BorderAnimator.kt | 2 +- .../quickstep/util/ContextualSearchInvoker.kt | 33 +- .../com/android/quickstep/util/DesktopTask.kt | 4 +- .../quickstep/util/ExternalDisplays.kt | 6 +- .../com/android/quickstep/util/GroupTask.kt | 36 +- .../LauncherUnfoldAnimationController.java | 8 +- .../android/quickstep/util/LayoutUtils.java | 3 +- .../util/QuickstepOnboardingPrefs.java | 2 +- .../quickstep/util/RecentsOrientedState.java | 26 +- .../quickstep/util/RectFSpringAnim.java | 8 +- .../util/ScalingWorkspaceRevealAnim.kt | 153 +- .../quickstep/util/SlideInRemoteTransition.kt | 6 +- .../util/SplitAnimationController.kt | 158 +- .../quickstep/util/SplitScreenUtils.kt | 37 +- .../util/SplitSelectStateController.java | 101 +- .../util/SplitToWorkspaceController.java | 2 +- .../SplitWithKeyboardShortcutController.java | 12 +- .../quickstep/util/SurfaceTransaction.java | 30 - .../util/SystemWindowManagerProxy.java | 40 +- .../quickstep/util/TaskGridNavHelper.kt | 4 - .../quickstep/util/TaskViewSimulator.java | 97 +- .../quickstep/util/TransformParams.java | 4 +- .../LauncherUnfoldTransitionController.kt | 12 +- .../quickstep/views/AddDesktopButton.kt | 42 - .../quickstep/views/AllAppsEduView.java | 4 +- .../com/android/quickstep/views/BlurUtils.kt | 70 +- .../android/quickstep/views/ClearAllButton.kt | 10 +- .../quickstep/views/DesktopTaskContentView.kt | 1 - .../quickstep/views/DesktopTaskView.kt | 441 +- .../quickstep/views/DigitalWellBeingToast.kt | 53 +- .../views/FloatingAppPairBackground.kt | 61 +- .../quickstep/views/FloatingAppPairView.kt | 30 +- .../quickstep/views/FloatingTaskView.java | 6 +- .../quickstep/views/FloatingWidgetView.java | 13 +- .../quickstep/views/GroupedTaskView.kt | 57 +- .../quickstep/views/IconAppChipView.kt | 373 +- .../com/android/quickstep/views/IconView.kt | 14 +- .../quickstep/views/LauncherRecentsView.java | 16 +- .../quickstep/views/OverviewActionsView.java | 48 +- .../quickstep/views/RecentsDismissUtils.kt | 1595 +- .../android/quickstep/views/RecentsView.java | 1238 +- .../quickstep/views/RecentsViewContainer.java | 14 +- .../quickstep/views/RecentsViewModelHelper.kt | 5 +- .../quickstep/views/RecentsViewUtils.kt | 325 +- .../android/quickstep/views/TaskContainer.kt | 85 +- .../android/quickstep/views/TaskMenuView.kt | 295 +- .../quickstep/views/TaskMenuViewWithArrow.kt | 4 +- .../views/TaskThumbnailViewDeprecated.java | 2 +- .../com/android/quickstep/views/TaskView.kt | 361 +- .../android/quickstep/views/TaskViewIcon.java | 50 + .../util/StateManagerProtoLogProxy.java | 6 - .../util/ActiveGestureErrorDetector.java | 28 +- .../util/ActiveGestureProtoLogProxy.java | 136 +- .../util/QuickstepProtoLogGroup.java | 5 +- .../util/RecentsWindowProtoLogProxy.java | 16 +- .../bubbles/BubbleBarViewScreenshotTest.kt | 33 +- .../bubbles/BubbleViewScreenshotTest.kt | 1 + .../TaskThumbnailViewScreenshotTest.kt | 72 +- .../DesktopAppLaunchTransitionManagerTest.kt | 32 +- .../model/QuickstepModelDelegateTest.kt | 55 +- .../model/data/TaskViewItemInfoTest.kt | 7 +- .../launcher3/taskbar/TaskbarBaseTestCase.kt | 2 - .../TaskbarHoverToolTipControllerTest.kt | 9 - .../TaskbarNavButtonControllerTest.java | 19 +- .../launcher3/taskbar/TaskbarOverflowTest.kt | 300 +- .../taskbar/TaskbarPopupControllerTest.kt | 65 +- .../TaskbarRecentAppsControllerTest.kt | 383 +- .../taskbar/TaskbarStashControllerTest.kt | 92 +- .../launcher3/taskbar/TaskbarViewTest.kt | 2 +- .../launcher3/taskbar/TaskbarViewTestUtil.kt | 79 +- .../TaskbarViewWithLayoutTransitionTest.kt | 17 +- .../bubbles/BubbleBarInputConsumerTest.kt | 2 - .../bubbles/BubbleBarSwipeControllerTest.kt | 2 - .../PersistentBubbleStashControllerTest.kt | 27 +- .../TransientBubbleStashControllerTest.kt | 29 +- .../navbutton/NavButtonLayoutFactoryTest.kt | 26 +- .../taskbar/rules/MockedRecentsModelHelper.kt | 19 +- .../taskbar/rules/TaskbarModeRuleTest.kt | 12 +- .../taskbar/rules/TaskbarUnitTestRule.kt | 54 +- .../rules/TaskbarWindowSandboxContext.kt | 95 +- .../quickstep/AbsSwipeUpHandlerTestCase.java | 158 +- .../quickstep/AllAppsActionManagerTest.kt | 34 +- .../com/android/quickstep/DisplayModelTest.kt | 15 +- .../FallbackSwipeHandlerTestCase.java | 8 - .../quickstep/HotseatWidthCalculationTest.kt | 14 +- .../LauncherRestoreEventLoggerImplTest.kt | 19 +- .../quickstep/LauncherSwipeHandlerV2Test.kt | 31 +- .../LauncherSwipeHandlerV2TestCase.java | 8 - .../quickstep/OverviewCommandHelperTest.kt | 232 +- .../quickstep/RecentTasksListTest.java | 51 +- .../RecentsAnimationDeviceStateTest.kt | 50 +- .../android/quickstep/RecentsModelTest.java | 55 +- .../RecentsWindowSwipeHandlerTestCase.java | 33 +- .../quickstep/TaskAnimationManagerTest.java | 111 +- .../NavHandleLongPressHandlerTest.java | 23 +- .../logging/SettingsChangeLoggerTest.kt | 30 +- .../recents/data/FakeTaskIconDataSource.kt | 5 +- .../data/FakeTaskThumbnailDataSource.kt | 9 +- .../recents/data/FakeTasksRepository.kt | 23 +- .../recents/data/TasksRepositoryTest.kt | 240 +- .../domain/usecase/GetTaskUseCaseTest.kt | 124 +- .../ui/mapper/TaskUiStateMapperTest.kt | 285 +- .../recents/ui/viewmodel/TaskViewModelTest.kt | 96 +- .../recents/viewmodel/RecentsViewModelTest.kt | 6 +- .../TaskbarPinningControllerTest.kt | 30 +- .../util/ContextualSearchInvokerTest.java | 11 + .../util/GestureExclusionManagerTest.kt | 4 +- .../android/quickstep/util/GroupTaskTest.kt | 91 +- .../util/SplitSelectStateControllerTest.kt | 5 +- .../quickstep/util/TaskGridNavHelperTest.kt | 11 - .../quickstep/util/TaskViewSimulatorTest.java | 129 +- .../quickstep/util/TransformParamsTest.kt | 2 +- .../WidgetsPredicationUpdateTaskTest.java | 64 +- .../statehandlers/DepthControllerTest.kt | 105 +- .../animation/BubbleBarViewAnimatorTest.kt | 17 - .../quickstep/AbstractQuickStepTest.java | 96 +- .../quickstep/AbstractTaplTestsTaskbar.java | 2 +- .../AspectRatioSystemShortcutTests.kt | 51 +- .../quickstep/DesktopSystemShortcutTest.kt | 169 +- .../quickstep/DigitalWellBeingToastTest.java | 67 +- .../ExternalDisplaySystemShortcutTest.kt | 37 +- .../quickstep/FallbackRecentsTest.java | 43 +- .../quickstep/InputConsumerUtilsTest.java | 26 +- .../quickstep/NavigationModeSwitchRule.java | 12 +- .../OrientationTouchTransformerTest.java | 3 +- .../quickstep/TaplOverviewIconTest.java | 4 +- .../TaplTestsKeyboardQuickSwitch.java | 8 +- .../quickstep/TaplTestsLockedTaskbar.java | 4 +- .../quickstep/TaplTestsOverviewDesktop.kt | 11 +- .../android/quickstep/TaplTestsQuickstep.java | 370 +- .../android/quickstep/TaplTestsTaskbar.java | 2 +- .../android/quickstep/TaplTestsTrackpad.java | 2 +- .../quickstep/TaplTestsTransientTaskbar.java | 36 +- .../com/android/quickstep/TaskViewTest.java | 18 - .../quickstep/TaskbarModeSwitchRule.java | 2 +- .../DesktopAppLaunchAnimatorHelperTest.kt | 2 +- .../quickstep/util/SplitScreenTestUtils.kt | 2 +- .../util/SplitSelectDataHolderTest.kt | 49 +- .../all_apps_tabs_background_unselected.xml | 2 +- ...pps_tabs_background_unselected_focused.xml | 2 +- res/drawable/bg_ps_mask_left_corner.xml | 2 +- res/drawable/bg_ps_mask_right_corner.xml | 2 +- .../bg_rounded_corner_bottom_sheet_handle.xml | 2 +- res/drawable/ic_bubble_button.xml | 14 +- ...ll_apps_search_button_expressive_theme.xml | 2 +- res/drawable/inset_rounded_action_button.xml | 4 +- res/drawable/private_space_app_divider.xml | 2 +- res/drawable/ps_settings_background.xml | 2 +- res/drawable/work_card.xml | 2 +- res/layout/add_item_confirmation_activity.xml | 2 +- res/layout/all_apps_personal_work_tabs.xml | 4 +- res/layout/launcher_preview_layout.xml | 2 +- .../launcher_preview_two_panel_layout.xml | 2 +- res/layout/private_space_header.xml | 26 +- res/layout/private_space_mask_view.xml | 2 +- res/layout/user_folder_icon_normalized.xml | 22 - res/layout/widget_recommendations.xml | 1 - res/layout/widgets_bottom_sheet_content.xml | 1 - res/layout/widgets_full_sheet_paged_view.xml | 1 - .../widgets_full_sheet_recyclerview.xml | 1 - res/layout/widgets_two_pane_sheet.xml | 1 - res/layout/work_apps_paused.xml | 6 +- res/layout/work_mode_fab.xml | 2 +- res/values-af/strings.xml | 10 +- res/values-am/strings.xml | 10 +- res/values-ar/strings.xml | 10 +- res/values-as/strings.xml | 12 +- res/values-az/strings.xml | 10 +- res/values-b+sr+Latn/strings.xml | 10 +- res/values-be/strings.xml | 10 +- res/values-bg/strings.xml | 10 +- res/values-bn/strings.xml | 10 +- res/values-bs/strings.xml | 10 +- res/values-ca/strings.xml | 12 +- res/values-cs/strings.xml | 12 +- res/values-da/strings.xml | 12 +- res/values-de/strings.xml | 10 +- res/values-el/strings.xml | 10 +- res/values-en-rAU/strings.xml | 12 +- res/values-en-rCA/strings.xml | 12 +- res/values-en-rGB/strings.xml | 12 +- res/values-en-rIN/strings.xml | 12 +- res/values-es-rUS/strings.xml | 10 +- res/values-es/strings.xml | 14 +- res/values-et/strings.xml | 10 +- res/values-eu/strings.xml | 12 +- res/values-fa/strings.xml | 14 +- res/values-fi/strings.xml | 10 +- res/values-fr-rCA/strings.xml | 18 +- res/values-fr/strings.xml | 12 +- res/values-gl/strings.xml | 14 +- res/values-gu/strings.xml | 12 +- res/values-hi/strings.xml | 14 +- res/values-hr/strings.xml | 12 +- res/values-hu/strings.xml | 10 +- res/values-hy/strings.xml | 12 +- res/values-in/strings.xml | 10 +- res/values-is/strings.xml | 10 +- res/values-it/strings.xml | 10 +- res/values-iw/strings.xml | 14 +- res/values-ja/strings.xml | 10 +- res/values-ka/strings.xml | 10 +- res/values-kk/strings.xml | 10 +- res/values-km/strings.xml | 10 +- res/values-kn/strings.xml | 14 +- res/values-ko/strings.xml | 10 +- res/values-ky/strings.xml | 10 +- res/values-lo/strings.xml | 10 +- res/values-lt/strings.xml | 12 +- res/values-lv/strings.xml | 10 +- res/values-mk/strings.xml | 10 +- res/values-ml/strings.xml | 10 +- res/values-mn/strings.xml | 12 +- res/values-mr/strings.xml | 10 +- res/values-ms/strings.xml | 10 +- res/values-my/strings.xml | 14 +- res/values-nb/strings.xml | 12 +- res/values-ne/strings.xml | 14 +- res/values-night/colors.xml | 101 +- res/values-night/styles.xml | 10 +- res/values-nl/strings.xml | 10 +- res/values-or/strings.xml | 10 +- res/values-pa/strings.xml | 12 +- res/values-pl/strings.xml | 10 +- res/values-pt-rPT/strings.xml | 14 +- res/values-pt/strings.xml | 12 +- res/values-ro/strings.xml | 10 +- res/values-ru/strings.xml | 12 +- res/values-si/strings.xml | 10 +- res/values-sk/strings.xml | 12 +- res/values-sl/strings.xml | 10 +- res/values-sq/strings.xml | 10 +- res/values-sr/strings.xml | 10 +- res/values-sv/strings.xml | 14 +- res/values-sw/strings.xml | 12 +- res/values-sw600dp-land/dimens.xml | 1 - res/values-sw600dp/dimens.xml | 1 - res/values-ta/strings.xml | 10 +- res/values-te/strings.xml | 10 +- res/values-th/strings.xml | 12 +- res/values-tl/strings.xml | 10 +- res/values-tr/strings.xml | 10 +- res/values-uk/strings.xml | 12 +- res/values-ur/strings.xml | 10 +- res/values-uz/strings.xml | 10 +- res/values-v31/colors.xml | 2 + res/values-v34/colors.xml | 166 +- res/values-vi/strings.xml | 10 +- res/values-zh-rCN/strings.xml | 16 +- res/values-zh-rHK/strings.xml | 10 +- res/values-zh-rTW/strings.xml | 10 +- res/values-zu/strings.xml | 10 +- res/values/attrs.xml | 41 +- res/values/colors.xml | 418 +- res/values/config.xml | 23 +- res/values/dimens.xml | 11 +- res/values/id.xml | 4 - res/values/strings.xml | 19 +- res/values/styles.xml | 107 +- res/xml/paddings_6x5.xml | 21 +- settings.gradle | 23 +- .../testing/shared/TestProtocol.java | 17 +- .../launcher3/AbstractFloatingView.java | 11 +- .../launcher3/AppWidgetResizeFrame.java | 23 +- .../android/launcher3/AutoInstallsLayout.java | 17 +- src/com/android/launcher3/BaseActivity.java | 16 +- src/com/android/launcher3/BubbleTextView.java | 211 +- .../android/launcher3/ButtonDropTarget.java | 11 +- src/com/android/launcher3/CellLayout.java | 14 +- .../launcher3/CheckLongPressHelper.java | 10 +- .../android/launcher3/DeleteDropTarget.java | 17 +- src/com/android/launcher3/DeviceProfile.java | 1078 +- src/com/android/launcher3/DropTarget.java | 26 +- src/com/android/launcher3/DropTargetBar.java | 100 +- .../android/launcher3/DropTargetHandler.kt | 4 +- .../android/launcher3/GestureNavContract.java | 27 +- src/com/android/launcher3/Hotseat.java | 26 +- .../launcher3/InvariantDeviceProfile.java | 244 +- src/com/android/launcher3/Launcher.java | 442 +- .../android/launcher3/LauncherAnimUtils.java | 16 - .../android/launcher3/LauncherConstants.java | 11 +- src/com/android/launcher3/LauncherModel.kt | 44 +- src/com/android/launcher3/LauncherPrefs.kt | 11 +- .../android/launcher3/LauncherProvider.java | 70 +- .../android/launcher3/LauncherRootView.java | 11 +- .../android/launcher3/LauncherSettings.java | 144 +- src/com/android/launcher3/LauncherState.java | 39 +- .../launcher3/MainProcessInitializer.java | 70 +- src/com/android/launcher3/ModelCallbacks.kt | 392 +- src/com/android/launcher3/PagedView.java | 34 +- .../launcher3/SecondaryDropTarget.java | 30 +- .../launcher3/SessionCommitReceiver.java | 5 - src/com/android/launcher3/Utilities.java | 61 +- src/com/android/launcher3/Workspace.java | 100 +- .../launcher3/WorkspaceLayoutManager.java | 2 + .../WorkspaceStateTransitionAnimation.java | 2 +- .../LauncherAccessibilityDelegate.java | 17 +- .../ShortcutMenuAccessibilityDelegate.java | 3 +- .../allapps/ActivityAllAppsContainerView.java | 165 +- .../launcher3/allapps/AllAppsStore.java | 50 +- .../allapps/AllAppsTransitionController.java | 30 +- .../allapps/AlphabeticalAppsList.java | 34 +- .../launcher3/allapps/BaseAllAppsAdapter.java | 11 +- .../launcher3/allapps/FloatingHeaderView.java | 12 +- .../launcher3/allapps/FloatingMaskView.java | 20 - .../allapps/LauncherAllAppsContainerView.java | 4 +- .../allapps/PrivateProfileManager.java | 89 +- .../RecyclerViewAnimationController.java | 1 + .../allapps/SectionDecorationHandler.java | 36 +- .../allapps/SectionDecorationInfo.java | 7 +- .../launcher3/allapps/WorkProfileManager.java | 8 +- .../launcher3/allapps/WorkUtilityView.java | 6 +- .../anim/AnimatedPropertySetter.java | 22 +- .../anim/KeyboardInsetAnimationCallback.java | 2 +- .../launcher3/anim/PropertySetter.java | 12 +- .../anim/SpringAnimationBuilder.java | 10 +- .../launcher3/apppairs/AppPairIconGraphic.kt | 4 +- .../LauncherRestoreEventLogger.kt | 14 +- .../android/launcher3/celllayout/CellInfo.kt | 41 +- .../launcher3/config/FeatureFlags.java | 8 + .../launcher3/dagger/LauncherAppModule.java | 27 +- .../dagger/LauncherBaseAppComponent.java | 20 +- .../launcher3/deviceprofile/HotseatProfile.kt | 125 - .../launcher3/dragndrop/DragController.java | 8 +- .../launcher3/dragndrop/DragLayer.java | 1 - .../android/launcher3/dragndrop/DragView.java | 14 +- .../dragndrop/LauncherDragController.java | 27 +- .../launcher3/dragndrop/SimpleDragLayer.java | 1 - .../folder/ClippedFolderIconLayoutRule.java | 140 +- src/com/android/launcher3/folder/Folder.java | 355 +- .../folder/FolderAnimationManager.java | 19 +- .../launcher3/folder/FolderGridOrganizer.java | 14 +- .../android/launcher3/folder/FolderIcon.java | 26 +- .../launcher3/folder/FolderNameProvider.java | 50 +- .../launcher3/folder/FolderPagedView.java | 16 +- .../launcher3/folder/LauncherDelegate.java | 43 +- .../launcher3/folder/PreviewBackground.java | 3 +- .../launcher3/folder/PreviewItemManager.java | 13 +- .../graphics/DragPreviewProvider.java | 16 +- .../graphics/FragmentWithPreview.java | 3 +- .../graphics/GridCustomizationsProxy.java | 226 +- .../graphics/LauncherCustomizationProvider.kt | 42 +- .../graphics/LauncherPreviewRenderer.java | 744 + .../graphics/PreloadIconDrawable.java | 94 +- .../graphics/PreviewSurfaceRenderer.java | 496 + .../launcher3/graphics/ShapeDelegate.kt | 81 +- .../launcher3/graphics/SysUiScrim.java | 2 +- .../launcher3/graphics/ThemeManager.kt | 32 +- .../android/launcher3/icons/IconCache.java | 288 +- .../launcher3/icons/LauncherIconProvider.java | 48 +- .../android/launcher3/icons/LauncherIcons.kt | 31 + .../logging/ColdRebootStartupLatencyLogger.kt | 192 + .../launcher3/logging/StartupLatencyLogger.kt | 128 +- .../model/AddWorkspaceItemsTask.java | 38 +- .../android/launcher3/model/AllAppsList.java | 48 +- .../launcher3/model/BaseLauncherBinder.java | 258 +- .../android/launcher3/model/BgDataModel.java | 477 + .../launcher3/model/CacheDataUpdatedTask.java | 46 +- .../launcher3/model/DatabaseHelper.java | 83 +- .../launcher3/model/FirstScreenBroadcast.java | 2 +- .../model/FirstScreenBroadcastHelper.kt | 2 +- .../model/GridSizeMigrationDBController.java | 14 +- .../launcher3/model/GridSizeMigrationLogic.kt | 14 +- .../launcher3/model/ItemInstallQueue.java | 29 +- .../launcher3/model/LayoutParserFactory.kt | 3 +- .../android/launcher3/model/LoaderCursor.java | 26 +- .../android/launcher3/model/LoaderTask.java | 433 +- .../launcher3/model/ModelDbController.java | 43 +- .../launcher3/model/ModelDelegate.java | 39 +- .../launcher3/model/ModelInitializer.kt | 62 +- .../launcher3/model/ModelTaskController.kt | 34 +- .../android/launcher3/model/ModelWriter.java | 49 +- ...PackageIncrementalDownloadUpdatedTask.java | 23 +- .../model/PackageInstallStateChangedTask.java | 51 +- .../launcher3/model/PackageUpdatedTask.java | 60 +- .../model/ReloadStringCacheTask.java | 9 +- .../launcher3/model/SessionFailureTask.kt | 20 +- .../launcher3/model/ShortcutsChangedTask.kt | 82 +- .../model/UserLockStateChangedTask.java | 15 +- .../launcher3/model/WorkspaceItemProcessor.kt | 102 +- .../model/WorkspaceItemSpaceFinder.java | 24 +- .../launcher3/model/data/AppPairInfo.kt | 18 +- .../launcher3/model/data/CollectionInfo.kt | 6 +- .../launcher3/model/data/IconRequestInfo.java | 11 +- .../launcher3/model/data/ItemInfo.java | 7 +- .../model/data/ItemInfoWithIcon.java | 2 +- .../pageindicators/PageIndicator.java | 10 + .../pageindicators/PageIndicatorDots.java | 192 +- .../launcher3/pm/InstallSessionHelper.java | 10 +- .../pm/ShortcutConfigActivityInfo.java | 2 +- .../android/launcher3/popup/ArrowPopup.java | 4 +- .../popup/PopupContainerWithArrow.java | 74 +- .../launcher3/popup/RemoteActionShortcut.java | 24 +- .../launcher3/popup/SystemShortcut.java | 81 +- .../launcher3/provider/RestoreDbTask.java | 34 +- .../launcher3/qsb/QsbContainerView.java | 51 +- .../responsive/ResponsiveCellSpecsProvider.kt | 55 +- .../launcher3/responsive/ResponsiveSpec.kt | 24 +- .../responsive/ResponsiveSpecsParser.kt | 8 +- .../SecondaryDisplayLauncher.java | 48 +- .../secondarydisplay/SecondaryDragLayer.java | 29 +- .../launcher3/settings/SettingsActivity.java | 3 +- .../launcher3/shapes/IconShapeModel.kt | 15 +- .../launcher3/shapes/ShapesProvider.kt | 57 +- .../launcher3/statemanager/BaseState.java | 2 +- .../launcher3/statemanager/StateManager.java | 21 - .../statemanager/StatefulContainer.java | 8 - .../launcher3/states/RotationHelper.java | 2 +- .../testing/TestInformationHandler.java | 8 +- .../testing/shared/TestProtocol.java | 45 +- .../AbstractStateChangeTouchController.java | 16 +- .../touch/AllAppsSwipeController.java | 33 +- .../launcher3/touch/ItemClickHandler.java | 16 +- .../touch/WorkspaceTouchListener.java | 42 +- .../android/launcher3/util/ApiWrapper.java | 31 +- src/com/android/launcher3/util/BaseContext.kt | 9 - .../launcher3/util/CellContentDimensions.kt | 19 +- .../android/launcher3/util/DimensionUtils.kt | 12 +- .../launcher3/util/DisplayController.java | 160 +- src/com/android/launcher3/util/Executors.java | 6 - .../launcher3/util/InstantAppResolver.java | 15 +- .../android/launcher3/util/ItemInflater.kt | 41 +- .../util/KeyboardShortcutsDelegate.java | 3 +- .../util/LauncherBindableItemsContainer.kt | 45 +- .../launcher3/util/LauncherLayoutBuilder.kt | 5 - .../android/launcher3/util/LooperExecutor.kt | 8 +- .../launcher3/util/MSDLPlayerWrapper.java | 9 +- .../util/MultiTranslateDelegate.java | 3 +- .../launcher3/util/ResourceBasedOverride.java | 3 - .../util/SplitConfigurationOptions.java | 119 + .../launcher3/util/TouchController.java | 13 +- .../launcher3/util/WallpaperThemeManager.kt | 8 +- .../util/coroutines/DispatcherProvider.kt | 65 +- .../util/window/WindowManagerProxy.java | 61 +- .../launcher3/views/AbstractSlideInView.java | 133 +- .../launcher3/views/ActivityContext.java | 52 +- .../android/launcher3/views/ArrowTipView.java | 60 +- .../launcher3/views/BaseDragLayer.java | 38 +- .../android/launcher3/views/ClipIconView.java | 46 +- .../launcher3/views/FloatingIconView.java | 12 +- .../launcher3/views/IconButtonView.java | 2 +- .../launcher3/views/OptionsPopupView.java | 31 +- .../android/launcher3/views/ScrimView.java | 29 - src/com/android/launcher3/views/Snackbar.java | 2 +- .../widget/AddItemWidgetsBottomSheet.java | 5 +- .../launcher3/widget/BaseWidgetSheet.java | 61 +- .../widget/DatabaseWidgetPreviewLoader.java | 14 +- .../widget/LauncherAppWidgetProviderInfo.java | 2 +- .../widget/PendingAppWidgetHostView.java | 5 +- .../widget/PendingItemDragHelper.java | 106 +- .../android/launcher3/widget/WidgetCell.java | 7 +- .../launcher3/widget/WidgetInflater.kt | 7 - .../launcher3/widget/WidgetManagerHelper.java | 8 +- .../widget/custom/CustomWidgetManager.java | 20 + .../WidgetRecommendationCategoryProvider.java | 7 +- .../picker/WidgetRecommendationsView.java | 2 +- .../widget/picker/WidgetsFullSheet.java | 32 +- .../widget/picker/WidgetsListHeader.java | 4 +- .../widget/picker/WidgetsTwoPaneSheet.java | 9 +- .../picker/model/WidgetPickerDataProvider.kt | 34 +- .../picker/util/WidgetPreviewContainerSize.kt | 16 +- .../util/WidgetPreviewContainerSizes.kt | 60 - .../launcher3/widget/util/WidgetSizes.java | 39 +- .../PersonalWorkSlidingTabStrip.java | 14 +- .../com/android/launcher3/BuildConfig.java | 5 + .../com/android/launcher3/dagger/Modules.kt | 4 - .../uioverrides/states/AllAppsState.java | 14 +- .../uioverrides/states/OverviewState.java | 8 +- .../util/StateManagerProtoLogProxy.java | 2 - systemUI/common/build.gradle | 4 - .../common/coroutine/ConflatedCallbackFlow.kt | 25 - systemUI/log/Android.bp | 22 +- systemUI/log/build.gradle | 1 + .../android/systemui/log/LogMessageImpl.kt | 6 +- .../com/android/systemui/log/core/LogLevel.kt | 18 +- systemUI/plugin/Android.bp | 1 - .../plugins/BcSmartspaceDataPlugin.java | 41 +- systemUI/plugin/build.gradle | 3 +- .../systemui/plugins/ActivityStarter.java | 7 - .../plugins/NavigationEdgeBackPlugin.java | 5 +- .../plugins/VolumeDialogController.java | 4 +- .../com/android/systemui/plugins/qs/QS.java | 12 - .../statusbar/NotificationMenuRowPlugin.java | 16 +- systemUI/plugin_core/Android.bp | 5 +- systemUI/plugin_core/build.gradle | 4 - .../processor/ProtectedPluginProcessor.kt | 11 +- .../plugins/PluginLifecycleManager.java | 5 + .../systemui/plugins/PluginListener.java | 10 +- .../com/android/systemui/biometrics/Utils.kt | 77 +- .../shared/model/FingerprintSensorType.kt | 4 - .../biometrics/shared/model/PromptKind.kt | 10 +- systemUI/shared/build.gradle | 1 - .../DisableSubpixelTextTransitionListener.kt | 11 - .../shared/navigationbar/KeyButtonRipple.java | 9 +- .../shared/plugins/PluginActionManager.java | 94 +- .../shared/plugins/PluginInstance.java | 65 +- .../shared/recents/ILauncherProxy.aidl | 8 +- .../shared/recents/ISystemUiProxy.aidl | 7 +- .../shared/recents/model/ThumbnailData.kt | 11 +- .../utilities/PreviewPositionHelper.java | 48 +- .../shared/regionsampling/RegionSampler.kt | 8 +- .../rotation/FloatingRotationButton.java | 53 +- .../shared/rotation/RotationButton.java | 8 +- .../rotation/RotationButtonController.java | 79 +- .../shared/system/ActivityManagerWrapper.java | 47 +- .../system/InputConsumerController.java | 37 +- .../system/InteractionJankMonitorWrapper.java | 12 +- .../shared/system/QuickStepContract.java | 4 +- .../RecentsAnimationControllerCompat.java | 22 +- .../UncaughtExceptionPreHandlerManager.kt | 9 +- .../unfold/system/SystemUnfoldSharedModule.kt | 37 +- systemUI/utils/build.gradle | 2 +- tests/Android.bp | 20 +- tests/AndroidManifest.xml | 1 - .../DeviceProfileDumpTest/phonePortrait.txt | 1 + .../phonePortrait3Button.txt | 1 + .../phoneVerticalBar.txt | 1 + .../phoneVerticalBar3Button.txt | 1 + .../DeviceProfileDumpTest/tabletLandscape.txt | 1 + .../tabletLandscape3Button.txt | 1 + .../DeviceProfileDumpTest/tabletPortrait.txt | 1 + .../tabletPortrait3Button.txt | 1 + .../twoPanelLandscape.txt | 1 + .../twoPanelLandscape3Button.txt | 1 + ...twoPanelLandscape3Button_decoupleDepth.txt | 1 + .../twoPanelLandscape_decoupleDepth.txt | 1 + .../twoPanelPortrait.txt | 1 + .../twoPanelPortrait3Button.txt | 1 + .../twoPanelPortrait3Button_decoupleDepth.txt | 1 + .../twoPanelPortrait_decoupleDepth.txt | 1 + .../launcher3/AbstractDeviceProfileTest.kt | 34 +- .../launcher3/AutoInstallsLayoutTest.kt | 62 +- .../FakeInvariantDeviceProfileTest.kt | 7 - .../allapps/FloatingHeaderViewTest.kt | 16 +- .../allapps/PrivateProfileManagerTest.java | 9 +- .../celllayout/board/TestWorkspaceBuilder.kt | 4 +- .../dagger/LauncherComponentProviderTest.kt | 13 +- .../android/launcher3/folder/FolderTest.kt | 15 +- .../icons/FastBitmapDrawableTest.java | 92 +- .../launcher3/icons/IconCacheTest.java | 60 - .../icons/cache/CacheLookupFlagTest.kt | 21 - .../icons/mono/MonoIconThemeControllerTest.kt | 29 +- .../logging/StartupLatencyLoggerTest.kt | 347 +- .../model/AbstractWorkspaceModelTest.kt | 32 +- .../model/AddWorkspaceItemsTaskTest.kt | 64 +- .../launcher3/model/AsyncBindingTest.kt | 161 +- .../model/CacheDataUpdatedTaskTest.java | 46 +- .../model/DefaultLayoutProviderTest.java | 35 +- .../launcher3/model/FolderIconLoadTest.kt | 43 +- .../launcher3/model/GridSizeMigrationTest.kt | 11 +- .../launcher3/model/LoaderCursorTest.java | 33 +- .../PackageInstallStateChangedTaskTest.java | 45 +- .../launcher3/model/PackageUpdatedTaskTest.kt | 34 +- .../model/ShortcutsChangedTaskTest.kt | 66 +- .../model/WorkspaceItemProcessorTest.kt | 47 +- .../model/WorkspaceItemSpaceFinderTest.kt | 48 +- .../model/data/ItemInfoWithIconTest.kt | 11 +- .../launcher3/pm/InstallSessionTrackerTest.kt | 12 +- .../com/android/launcher3/pm/UserCacheTest.kt | 19 +- .../launcher3/provider/RestoreDbTaskTest.java | 12 +- .../AllAppsRecyclerViewPoolTest.kt | 2 +- .../ResponsiveCellSpecsProviderTest.kt | 226 +- .../launcher3/shapes/ShapesProviderTest.kt | 45 + .../launcher3/ui/BubbleTextViewTest.java | 11 +- .../util/ActivityContextWrapper.java | 1 - .../util/CellContentDimensionsTest.kt | 117 +- .../android/launcher3/util/DaggerGraphs.kt | 43 +- .../util/DaggerSingletonDeadlockTest.kt | 10 +- .../launcher3/util/DisplayControllerTest.kt | 78 +- .../launcher3/util/LauncherModelHelper.java | 283 + .../launcher3/util/ModelTestExtensions.kt | 22 - .../launcher3/util/SandboxApplication.kt | 103 +- .../util/SimpleBroadcastReceiverTest.kt | 2 +- .../launcher3/util/TestDispatcherProvider.kt | 3 +- .../launcher3/util/TestResourceHelper.kt | 19 +- .../util/TestSandboxModelContextWrapper.java | 3 +- .../launcher3/util/VibratorWrapperTest.kt | 6 +- .../launcher3/util/rule/BackAndRestoreRule.kt | 10 +- .../launcher3/widget/GeneratedPreviewTest.kt | 17 +- .../widget/custom/CustomWidgetManagerTest.kt | 4 +- .../model/WidgetPickerDataProviderTest.kt | 38 +- .../util/WidgetPreviewContainerSizesTest.kt | 2 +- .../picker/util/WidgetsTableUtilsTest.java | 4 +- tests/res/values/attrs.xml | 7 - tests/res/xml/appwidget_no_config_large.xml | 2 +- .../android/launcher3/LauncherIntentTest.java | 26 +- .../launcher3/allapps/KeyboardFocusTest.java | 33 +- .../allapps/TaplAllAppsIconsWorkingTest.java | 8 +- .../allapps/TaplOpenCloseAllAppsTest.java | 7 +- .../appiconmenu/TaplAppIconMenuTest.java | 7 +- .../BackupAndRestoreDBSelectionTest.kt | 53 +- .../launcher3/compat/PromiseIconUiTest.java | 3 +- .../launcher3/dragging/TaplDragTest.java | 7 +- .../dragging/TaplUninstallRemoveTest.java | 12 +- .../folder/PreviewItemManagerTest.kt | 74 +- .../android/launcher3/model/LoaderTaskTest.kt | 44 +- .../model/ModelMultiCallbacksTest.java | 113 +- .../model/WorkspaceItemProcessorExtraTest.kt | 18 +- .../HotseatWidthCalculationTest.kt | 14 +- .../launcher3/pm/InstallSessionHelperTest.kt | 8 +- .../launcher3/popup/SystemShortcutTest.java | 17 +- .../testcomponent/TestLauncherActivity.java | 18 - .../launcher3/ui/TaplTestsLauncher3Test.java | 8 +- .../util/BaseLauncherActivityTest.kt | 110 +- .../launcher3/util/ItemInflaterTest.kt | 67 +- .../util/WallpaperThemeManagerTest.kt | 6 - .../launcher3/util/rule/FailureWatcher.java | 28 +- .../launcher3/util/rule/SamplerRule.java | 19 +- .../util/rule/TestIsolationRule.java | 2 +- .../android/launcher3/tapl/BaseOverview.java | 29 +- .../launcher3/tapl/LaunchedAppState.java | 59 +- .../tapl/LauncherInstrumentation.java | 281 +- .../android/launcher3/tapl/OverviewTask.java | 101 +- .../launcher3/tapl/OverviewTaskMenu.java | 46 +- .../launcher3/tapl/PrivateSpaceContainer.java | 5 +- .../tapl/SearchResultFromTaskbarQsb.java | 8 +- .../com/android/launcher3/tapl/Taskbar.java | 16 +- .../launcher3/tapl/TaskbarAllApps.java | 10 +- .../launcher3/tapl/TaskbarAllAppsQsb.java | 8 +- .../launcher3/tapl/TaskbarAppIcon.java | 16 +- .../com/android/launcher3/tapl/Widgets.java | 10 - .../com/android/launcher3/tapl/Workspace.java | 15 +- .../launcher3/tapl/WorkspaceDragSource.java | 2 +- wmshell/Android.bp | 147 +- wmshell/OWNERS | 6 +- wmshell/aconfig/Android.bp | 1 - wmshell/aconfig/OWNERS | 3 +- wmshell/aconfig/multitasking.aconfig | 186 +- wmshell/multivalentTests/Android.bp | 27 +- wmshell/multivalentTests/AndroidManifest.xml | 15 - .../AndroidManifestRobolectric.xml | 7 - .../robolectric/config/robolectric.properties | 1 - .../wm/shell/bubbles/BubblePositionerTest.kt | 151 +- .../wm/shell/bubbles/BubbleStackViewTest.kt | 562 +- .../wm/shell/bubbles/BubbleTaskViewTest.kt | 85 +- .../BubbleExpandedViewPinControllerTest.kt | 46 +- wmshell/multivalentTestsForDevice | 0 wmshell/multivalentTestsForDevice/Android.bp | 99 + .../AndroidManifest.xml | 13 + .../AndroidManifestRobolectric.xml | 3 + .../multivalentTestsForDevice/AndroidTest.xml | 31 + wmshell/multivalentTestsForDevice/OWNERS | 4 + .../robolectric/config/robolectric.properties | 2 + .../wm/shell/bubbles/BubblePositionerTest.kt | 670 + .../wm/shell/bubbles/BubbleStackViewTest.kt | 462 + .../wm/shell/bubbles/BubbleTaskViewTest.kt | 92 + .../BubbleExpandedViewPinControllerTest.kt | 459 + wmshell/multivalentTestsForDeviceless | 0 .../multivalentTestsForDeviceless/Android.bp | 99 + .../AndroidManifest.xml | 13 + .../AndroidManifestRobolectric.xml | 3 + .../AndroidTest.xml | 31 + wmshell/multivalentTestsForDeviceless/OWNERS | 4 + .../robolectric/config/robolectric.properties | 2 + .../wm/shell/bubbles/BubblePositionerTest.kt | 670 + .../wm/shell/bubbles/BubbleStackViewTest.kt | 462 + .../wm/shell/bubbles/BubbleTaskViewTest.kt | 92 + .../BubbleExpandedViewPinControllerTest.kt | 459 + .../res/drawable/bubble_ic_create_bubble.xml | 12 +- .../res/drawable/bubble_ic_stop_bubble.xml | 12 +- .../res/layout/desktop_mode_app_header.xml | 14 - .../desktop_mode_window_decor_handle_menu.xml | 34 +- ...esktop_mode_window_decor_maximize_menu.xml | 13 +- .../letterbox_restart_dialog_layout.xml | 1 - wmshell/res/layout/split_divider.xml | 8 - wmshell/res/values-af/strings.xml | 7 - wmshell/res/values-am/strings.xml | 7 - wmshell/res/values-ar/strings.xml | 7 - wmshell/res/values-as/strings.xml | 7 - wmshell/res/values-az/strings.xml | 7 - wmshell/res/values-b+sr+Latn/strings.xml | 11 +- wmshell/res/values-be/strings.xml | 7 - wmshell/res/values-bg/strings.xml | 7 - wmshell/res/values-bn/strings.xml | 7 - wmshell/res/values-bs/strings.xml | 7 - wmshell/res/values-ca/strings.xml | 7 - wmshell/res/values-cs/strings.xml | 7 - wmshell/res/values-da/strings.xml | 7 - wmshell/res/values-de/strings.xml | 7 - wmshell/res/values-el/strings.xml | 7 - wmshell/res/values-en-rAU/strings.xml | 7 - wmshell/res/values-en-rCA/strings.xml | 7 - wmshell/res/values-en-rGB/strings.xml | 7 - wmshell/res/values-en-rIN/strings.xml | 7 - wmshell/res/values-es-rUS/strings.xml | 7 - wmshell/res/values-es/strings.xml | 7 - wmshell/res/values-et/strings.xml | 7 - wmshell/res/values-eu/strings.xml | 7 - wmshell/res/values-fa/strings.xml | 7 - wmshell/res/values-fi/strings.xml | 7 - wmshell/res/values-fr-rCA/strings.xml | 7 - wmshell/res/values-fr/strings.xml | 9 +- wmshell/res/values-gl/strings.xml | 7 - wmshell/res/values-gu/strings.xml | 7 - wmshell/res/values-hi/strings.xml | 7 - wmshell/res/values-hr/strings.xml | 7 - wmshell/res/values-hu/strings.xml | 7 - wmshell/res/values-hy/strings.xml | 7 - wmshell/res/values-in/strings.xml | 7 - wmshell/res/values-is/strings.xml | 7 - wmshell/res/values-it/strings.xml | 7 - wmshell/res/values-iw/strings.xml | 7 - wmshell/res/values-ja/strings.xml | 7 - wmshell/res/values-ka/strings.xml | 7 - wmshell/res/values-kk/strings.xml | 7 - wmshell/res/values-km/strings.xml | 7 - wmshell/res/values-kn/strings.xml | 7 - wmshell/res/values-kn/strings_tv.xml | 2 +- wmshell/res/values-ko/strings.xml | 7 - wmshell/res/values-ky/strings.xml | 7 - wmshell/res/values-lo/strings.xml | 7 - wmshell/res/values-lt/strings.xml | 7 - wmshell/res/values-lv/strings.xml | 7 - wmshell/res/values-mk/strings.xml | 7 - wmshell/res/values-ml/strings.xml | 7 - wmshell/res/values-mn/strings.xml | 7 - wmshell/res/values-mr/strings.xml | 7 - wmshell/res/values-ms/strings.xml | 7 - wmshell/res/values-my/strings.xml | 7 - wmshell/res/values-nb/strings.xml | 7 - wmshell/res/values-ne/strings.xml | 7 - wmshell/res/values-nl/strings.xml | 7 - wmshell/res/values-or/strings.xml | 7 - wmshell/res/values-pa/strings.xml | 7 - wmshell/res/values-pl/strings.xml | 7 - wmshell/res/values-pt-rBR/strings.xml | 7 - wmshell/res/values-pt-rPT/strings.xml | 7 - wmshell/res/values-pt/strings.xml | 7 - wmshell/res/values-ro/strings.xml | 7 - wmshell/res/values-ru/strings.xml | 13 +- wmshell/res/values-si/strings.xml | 7 - wmshell/res/values-sk/strings.xml | 7 - wmshell/res/values-sl/strings.xml | 7 - wmshell/res/values-sq/strings.xml | 7 - wmshell/res/values-sr/strings.xml | 11 +- wmshell/res/values-sv/strings.xml | 11 +- wmshell/res/values-sw/strings.xml | 7 - wmshell/res/values-ta/strings.xml | 9 +- wmshell/res/values-te/strings.xml | 7 - wmshell/res/values-th/strings.xml | 7 - wmshell/res/values-tl/strings.xml | 7 - wmshell/res/values-tr/strings.xml | 7 - wmshell/res/values-uk/strings.xml | 7 - wmshell/res/values-ur/strings.xml | 7 - wmshell/res/values-uz/strings.xml | 7 - wmshell/res/values-vi/strings.xml | 7 - wmshell/res/values-zh-rCN/strings.xml | 7 - wmshell/res/values-zh-rHK/strings.xml | 7 - wmshell/res/values-zh-rTW/strings.xml | 7 - wmshell/res/values-zu/strings.xml | 7 - wmshell/res/values/attrs.xml | 14 - wmshell/res/values/config.xml | 8 +- wmshell/res/values/dimen.xml | 12 +- wmshell/res/values/strings.xml | 16 - wmshell/res/values/styles.xml | 110 +- wmshell/shared/Android.bp | 2 - wmshell/shared/res/values/config.xml | 2 - wmshell/shared/res/values/dimen.xml | 13 +- .../wm/shell/shared/DesktopModeStatus.java | 2 +- .../shell/shared/FocusTransitionListener.java | 6 +- .../wm/shell/shared/GroupedTaskInfo.java | 7 +- .../wm/shell/shared/TransitionUtil.java | 14 +- .../shared/animation/MinimizeAnimator.kt | 16 - .../shell/shared/animation/PhysicsAnimator.kt | 47 +- .../shell/shared/animation/WindowAnimator.kt | 15 +- .../bubbles/BubbleAnythingFlagHelper.java | 31 - .../shell/shared/bubbles/BubbleBarLocation.kt | 12 - .../wm/shell/shared/bubbles/ContextUtils.kt | 3 +- .../wm/shell/shared/bubbles/DismissView.kt | 46 +- .../wm/shell/shared/bubbles/DragZone.kt | 71 +- .../shell/shared/bubbles/DragZoneFactory.kt | 532 +- .../wm/shell/shared/bubbles/DraggedObject.kt | 17 +- .../shell/shared/bubbles/DropTargetManager.kt | 179 +- .../wm/shell/shared/bubbles/DropTargetView.kt | 39 +- .../android/wm/shell/shared/bubbles/OWNERS | 1 + .../desktopmode/DesktopModeCompatPolicy.kt | 81 +- .../shared/desktopmode/DesktopModeStatus.java | 327 +- .../DesktopModeTransitionSource.kt | 2 - .../ManageWindowsViewContainer.kt | 1 - .../wm/shell/shared/split/SplitBounds.java | 128 +- .../shared/split/SplitScreenConstants.java | 39 +- .../android/wm/shell/ProtoLogController.java | 42 +- .../wm/shell/RootDisplayAreaOrganizer.java | 9 +- .../shell/RootTaskDisplayAreaOrganizer.java | 23 +- .../android/wm/shell/ShellTaskOrganizer.java | 499 +- .../ActivityEmbeddingAnimationAdapter.java | 13 +- .../ActivityEmbeddingAnimationRunner.java | 120 +- .../ActivityEmbeddingAnimationSpec.java | 62 +- .../ActivityEmbeddingController.java | 11 +- .../shell/animation/FlingAnimationUtils.java | 2 - .../android/wm/shell/back/BackAnimation.java | 27 +- .../shell/back/BackAnimationBackground.java | 31 +- .../shell/back/BackAnimationController.java | 1086 +- .../wm/shell/back/BackAnimationRunner.java | 118 +- .../shell/back/CrossActivityBackAnimation.kt | 78 +- .../wm/shell/back/CrossTaskBackAnimation.java | 72 +- .../back/CustomCrossActivityBackAnimation.kt | 16 +- .../back/DefaultCrossActivityBackAnimation.kt | 10 +- .../back/ShellBackAnimationRegistry.java | 25 +- .../com/android/wm/shell/back/TEST_MAPPING | 26 +- .../wm/shell/bubbles/BadgedImageView.java | 11 +- .../com/android/wm/shell/bubbles/Bubble.java | 435 +- .../wm/shell/bubbles/BubbleController.java | 1335 +- .../android/wm/shell/bubbles/BubbleData.java | 363 +- .../wm/shell/bubbles/BubbleDataRepository.kt | 10 +- .../bubbles/BubbleEducationController.kt | 2 +- .../wm/shell/bubbles/BubbleExpandedView.java | 214 +- .../bubbles/BubbleExpandedViewManager.kt | 31 +- .../wm/shell/bubbles/BubbleFlyoutView.java | 44 +- .../wm/shell/bubbles/BubbleLogger.java | 140 +- .../wm/shell/bubbles/BubbleOverflow.kt | 70 +- .../bubbles/BubbleOverflowContainerView.java | 20 +- .../wm/shell/bubbles/BubblePopupViewExt.kt | 10 +- .../wm/shell/bubbles/BubblePositioner.java | 170 +- .../wm/shell/bubbles/BubbleStackView.java | 439 +- .../shell/bubbles/BubbleStackViewManager.kt | 13 +- .../wm/shell/bubbles/BubbleTaskView.kt | 46 +- .../wm/shell/bubbles/BubbleViewInfoTask.java | 265 +- .../com/android/wm/shell/bubbles/Bubbles.java | 81 +- .../bubbles/BubblesNavBarGestureTracker.java | 2 +- .../BubblesNavBarMotionEventHandler.java | 2 +- .../bubbles/BubblesTransitionObserver.java | 154 +- .../wm/shell/bubbles/DismissViewExt.kt | 39 +- .../android/wm/shell/bubbles/IBubbles.aidl | 25 +- .../wm/shell/bubbles/IBubblesListener.aidl | 8 +- .../wm/shell/bubbles/ManageEducationView.kt | 9 +- .../src/com/android/wm/shell/bubbles/OWNERS | 1 + .../wm/shell/bubbles/StackEducationView.kt | 6 +- .../animation/AnimatableScaleMatrix.java | 6 - .../ExpandedAnimationController.java | 5 +- .../ExpandedViewAnimationControllerImpl.java | 4 +- .../animation/StackAnimationController.java | 2 +- .../bubbles/bar/BubbleBarAnimationHelper.java | 554 +- .../bubbles/bar/BubbleBarExpandedView.java | 618 +- .../BubbleBarExpandedViewDragController.kt | 72 +- .../bubbles/bar/BubbleBarHandleView.java | 147 +- .../shell/bubbles/bar/BubbleBarLayerView.java | 396 +- .../bubbles/bar/BubbleBarMenuItemView.java | 8 +- .../shell/bubbles/bar/BubbleBarMenuView.java | 67 - .../bar/BubbleBarMenuViewController.java | 174 +- .../bar/BubbleEducationViewController.kt | 40 +- .../bar/BubbleExpandedViewPinController.kt | 4 +- .../shortcut/CreateBubbleShortcutActivity.kt | 4 +- .../bubbles/shortcut/ShowBubblesActivity.kt | 4 +- .../shell/common/DisplayChangeController.java | 23 +- .../wm/shell/common/DisplayController.java | 190 +- .../wm/shell/common/DisplayImeController.java | 418 +- .../shell/common/DisplayInsetsController.java | 83 +- .../wm/shell/common/DisplayLayout.java | 118 +- .../wm/shell/common/HandlerExecutor.java | 87 - .../shell/common/LaunchAdjacentController.kt | 12 +- .../wm/shell/common/MultiInstanceHelper.kt | 106 +- .../wm/shell/common/ScreenshotUtils.java | 4 - .../wm/shell/common/ShellExecutor.java | 13 +- .../android/wm/shell/common/SurfaceUtils.java | 10 +- .../wm/shell/common/SyncTransactionQueue.java | 61 +- .../wm/shell/common/SystemWindows.java | 19 +- .../shell/common/TabletopModeController.java | 2 +- .../common/TaskStackListenerCallback.java | 3 - .../shell/common/TaskStackListenerImpl.java | 13 - .../com/android/wm/shell/common/pip/IPip.aidl | 6 +- .../shell/common/pip/LegacySizeSpecSource.kt | 10 +- .../pip/PhonePipKeepClearAlgorithm.java | 20 +- .../shell/common/pip/PhoneSizeSpecSource.kt | 10 +- .../wm/shell/common/pip/PipAppOpsListener.kt | 23 +- .../shell/common/pip/PipBoundsAlgorithm.java | 72 +- .../wm/shell/common/pip/PipBoundsState.java | 184 +- .../common/pip/PipDisplayLayoutState.java | 97 +- .../shell/common/pip/PipDoubleTapHelper.java | 50 +- .../wm/shell/common/pip/PipMediaController.kt | 7 - .../shell/common/pip/PipMenuController.java | 3 +- .../common/pip/PipPerfHintController.java | 2 +- .../android/wm/shell/common/pip/PipUtils.kt | 209 +- .../shell/common/split/DividerHandleView.java | 21 +- .../common/split/DividerRoundedCorner.java | 46 +- .../common/split/DividerSnapAlgorithm.java | 344 +- .../wm/shell/common/split/DividerView.java | 241 +- .../common/split/DockedDividerUtils.java | 10 +- .../shell/common/split/SplitDecorManager.java | 311 +- .../wm/shell/common/split/SplitLayout.java | 1087 +- .../shell/common/split/SplitScreenUtils.java | 104 +- .../common/split/SplitWindowManager.java | 21 +- .../wm/shell/compatui/CompatUIController.java | 222 +- .../wm/shell/compatui/CompatUILayout.java | 50 + .../compatui/CompatUIShellCommandHandler.java | 3 +- .../shell/compatui/CompatUIWindowManager.java | 159 +- .../CompatUIWindowManagerAbstract.java | 28 +- .../compatui/DialogAnimationController.java | 5 +- .../compatui/LetterboxEduWindowManager.java | 21 +- .../ReachabilityEduWindowManager.java | 6 +- .../compatui/RestartDialogWindowManager.java | 21 +- .../UserAspectRatioSettingsLayout.java | 2 - .../UserAspectRatioSettingsWindowManager.java | 55 +- .../wm/shell/dagger/TvWMShellModule.java | 20 +- .../wm/shell/dagger/WMShellBaseModule.java | 345 +- .../dagger/WMShellConcurrencyModule.java | 62 +- .../wm/shell/dagger/WMShellModule.java | 1555 +- .../wm/shell/dagger/pip/Pip1Module.java | 58 +- .../wm/shell/dagger/pip/Pip2Module.java | 204 +- .../wm/shell/dagger/pip/PipModule.java | 21 +- .../wm/shell/dagger/pip/TvPipModule.java | 18 +- .../wm/shell/desktopmode/DesktopMode.java | 17 +- .../desktopmode/DesktopModeEventLogger.kt | 631 +- .../DesktopModeLoggerTransitionObserver.kt | 408 +- .../DesktopModeShellCommandHandler.kt | 280 +- .../desktopmode/DesktopModeTransitionTypes.kt | 34 +- .../desktopmode/DesktopModeUiEventLogger.kt | 174 +- .../wm/shell/desktopmode/DesktopModeUtils.kt | 311 +- .../DesktopModeVisualIndicator.java | 716 +- .../desktopmode/DesktopTasksController.kt | 5103 +- .../shell/desktopmode/DesktopTasksLimiter.kt | 501 +- .../DesktopTasksTransitionObserver.kt | 218 +- .../desktopmode/DesktopWallpaperActivity.kt | 44 +- .../DragToDesktopTransitionHandler.kt | 1307 +- .../EnterDesktopTaskTransitionHandler.java | 38 +- .../ExitDesktopTaskTransitionHandler.java | 50 +- .../wm/shell/desktopmode/IDesktopMode.aidl | 68 +- .../desktopmode/IDesktopTaskListener.aidl | 50 +- .../com/android/wm/shell/desktopmode/OWNERS | 9 +- ...oggleResizeDesktopTaskTransitionHandler.kt | 63 +- .../src/com/android/wm/shell/docs/README.md | 3 - .../src/com/android/wm/shell/docs/changes.md | 8 +- .../src/com/android/wm/shell/docs/dagger.md | 67 +- .../com/android/wm/shell/docs/debugging.md | 133 +- .../com/android/wm/shell/docs/extending.md | 1 - .../src/com/android/wm/shell/docs/overview.md | 1 - .../src/com/android/wm/shell/docs/sysui.md | 14 +- .../src/com/android/wm/shell/docs/testing.md | 1 - .../com/android/wm/shell/docs/threading.md | 4 +- .../draganddrop/DragAndDropController.java | 136 +- .../wm/shell/draganddrop/DragLayout.java | 377 +- .../wm/shell/draganddrop/DragSession.java | 60 +- .../wm/shell/draganddrop/DragUtils.java | 66 +- .../wm/shell/draganddrop/DropZoneView.java | 69 +- .../shell/draganddrop/GlobalDragListener.kt | 2 +- .../wm/shell/freeform/FreeformComponents.java | 21 +- .../shell/freeform/FreeformTaskListener.java | 165 +- .../FreeformTaskTransitionHandler.java | 136 +- .../FreeformTaskTransitionObserver.java | 255 +- .../FreeformTaskTransitionStarter.java | 21 +- .../src/com/android/wm/shell/freeform/OWNERS | 8 +- .../fullscreen/FullscreenTaskListener.java | 72 +- .../keyguard/KeyguardTransitionHandler.java | 84 +- .../shell/keyguard/KeyguardTransitions.java | 7 - .../onehanded/BackgroundWindowManager.java | 3 +- .../shell/onehanded/OneHandedController.java | 8 +- .../OneHandedDisplayAreaOrganizer.java | 10 +- .../shell/performance/PerfHintController.kt | 12 +- .../pip/PinnedStackListenerForwarder.java | 16 + wmshell/src/com/android/wm/shell/pip/Pip.java | 24 +- .../wm/shell/pip/PipAnimationController.java | 242 +- .../pip/PipSurfaceTransactionHelper.java | 206 +- .../wm/shell/pip/PipTaskOrganizer.java | 434 +- .../android/wm/shell/pip/PipTransition.java | 219 +- .../wm/shell/pip/PipTransitionController.java | 168 +- .../pip/phone/PhonePipMenuController.java | 27 +- ...PipAccessibilityInteractionConnection.java | 10 +- .../wm/shell/pip/phone/PipController.java | 180 +- .../pip/phone/PipDismissTargetHandler.java | 6 +- .../wm/shell/pip/phone/PipInputConsumer.java | 2 +- .../wm/shell/pip/phone/PipMenuActionView.java | 5 - .../wm/shell/pip/phone/PipMenuView.java | 40 +- .../wm/shell/pip/phone/PipMotionHelper.java | 43 +- .../pip/phone/PipResizeGestureHandler.java | 218 +- .../wm/shell/pip/phone/PipTouchHandler.java | 13 +- .../wm/shell/pip/phone/PipTouchState.java | 2 +- .../src/com/android/wm/shell/pip/tv/OWNERS | 1 + .../wm/shell/pip/tv/TvPipActionsProvider.java | 2 +- .../wm/shell/pip/tv/TvPipBackgroundView.java | 2 +- .../wm/shell/pip/tv/TvPipBoundsAlgorithm.java | 2 +- .../shell/pip/tv/TvPipBoundsController.java | 2 +- .../wm/shell/pip/tv/TvPipController.java | 7 +- .../wm/shell/pip/tv/TvPipCustomAction.java | 2 +- .../wm/shell/pip/tv/TvPipMenuController.java | 17 +- .../shell/pip/tv/TvPipMenuEduTextDrawer.java | 2 +- .../wm/shell/pip/tv/TvPipMenuView.java | 2 +- .../pip/tv/TvPipNotificationController.java | 2 +- .../wm/shell/pip/tv/TvPipTaskOrganizer.java | 11 +- .../wm/shell/pip/tv/TvPipTransition.java | 20 +- .../pip2/PipSurfaceTransactionHelper.java | 206 +- .../pip2/animation/PipAlphaAnimator.java | 109 +- .../pip2/animation/PipResizeAnimator.java | 119 +- .../pip2/phone/PhonePipMenuController.java | 115 +- .../wm/shell/pip2/phone/PipController.java | 503 +- .../pip2/phone/PipDismissTargetHandler.java | 51 +- .../wm/shell/pip2/phone/PipInputConsumer.java | 23 +- .../shell/pip2/phone/PipMenuActionView.java | 5 - .../wm/shell/pip2/phone/PipMenuView.java | 50 +- .../wm/shell/pip2/phone/PipMotionHelper.java | 304 +- .../pip2/phone/PipResizeGestureHandler.java | 304 +- .../wm/shell/pip2/phone/PipScheduler.java | 427 +- .../wm/shell/pip2/phone/PipTouchHandler.java | 436 +- .../wm/shell/pip2/phone/PipTouchState.java | 12 +- .../wm/shell/pip2/phone/PipTransition.java | 1012 +- .../shell/pip2/phone/PipTransitionState.java | 203 +- .../wm/shell/protolog/ShellProtoLogGroup.java | 27 +- .../wm/shell/recents/IRecentTasks.aidl | 10 +- .../shell/recents/IRecentTasksListener.aidl | 15 +- .../android/wm/shell/recents/RecentTasks.java | 4 +- .../shell/recents/RecentTasksController.java | 746 +- .../recents/RecentsTransitionHandler.java | 917 +- .../RecentsTransitionStateListener.java | 42 +- .../recents/TaskStackTransitionObserver.kt | 270 +- .../wm/shell/splitscreen/ISplitScreen.aidl | 48 + .../splitscreen/ISplitSelectListener.aidl | 14 +- .../wm/shell/splitscreen/SplitScreen.java | 44 +- .../splitscreen/SplitScreenController.java | 553 +- .../SplitScreenShellCommandHandler.java | 17 +- .../splitscreen/SplitScreenTransitions.java | 74 +- .../splitscreen/SplitscreenEventLogger.java | 55 +- .../shell/splitscreen/StageCoordinator.java | 3347 +- .../shell/splitscreen/StageTaskListener.java | 334 +- .../android/wm/shell/splitscreen/tv/OWNERS | 1 + .../splitscreen/tv/TvSplitMenuController.java | 4 +- .../shell/splitscreen/tv/TvSplitMenuView.java | 6 +- .../tv/TvSplitScreenController.java | 35 +- .../splitscreen/tv/TvStageCoordinator.java | 20 +- .../SplashScreenExitAnimation.java | 3 +- .../SplashscreenContentDrawer.java | 45 +- .../SplashscreenWindowCreator.java | 19 +- .../StartingSurfaceDrawer.java | 13 +- .../StartingWindowController.java | 247 +- .../startingsurface/TaskSnapshotWindow.java | 52 +- .../WindowlessSnapshotWindowCreator.java | 24 +- .../WindowlessSplashWindowCreator.java | 20 +- .../PhoneStartingWindowTypeAlgorithm.java | 2 +- .../wm/shell/sysui/ShellCommandHandler.java | 6 +- .../wm/shell/sysui/ShellController.java | 107 +- .../com/android/wm/shell/sysui/ShellInit.java | 4 +- .../android/wm/shell/taskview/TaskView.java | 106 +- .../taskview/TaskViewFactoryController.java | 12 +- .../taskview/TaskViewTaskController.java | 479 +- .../shell/taskview/TaskViewTransitions.java | 846 +- .../transition/CounterRotatorHelper.java | 5 - .../shell/transition/DefaultMixedHandler.java | 276 +- .../transition/DefaultMixedTransition.java | 411 +- .../transition/DefaultTransitionHandler.java | 449 +- .../transition/HomeTransitionObserver.java | 111 +- .../transition/MixedTransitionHelper.java | 35 +- .../transition/OneShotRemoteHandler.java | 15 +- .../transition/RecentsMixedTransition.java | 69 +- .../transition/RemoteTransitionHandler.java | 16 +- .../transition/ScreenRotationAnimation.java | 155 +- .../transition/TransitionAnimationHelper.java | 250 +- .../wm/shell/transition/Transitions.java | 594 +- .../wm/shell/transition/WindowThumbnail.java | 5 +- .../tracing/PerfettoTransitionTracer.java | 13 +- .../unfold/UnfoldAnimationController.java | 2 +- .../shell/unfold/UnfoldTransitionHandler.java | 151 +- .../FullscreenUnfoldTaskAnimator.java | 3 +- .../animation/SplitTaskUnfoldAnimator.java | 12 +- .../CaptionWindowDecorViewModel.java | 214 +- .../windowdecor/CaptionWindowDecoration.java | 239 +- .../DesktopModeWindowDecorViewModel.java | 1773 +- .../DesktopModeWindowDecoration.java | 1694 +- .../wm/shell/windowdecor/DragDetector.java | 119 +- .../windowdecor/DragPositioningCallback.java | 11 +- .../DragPositioningCallbackUtility.java | 180 +- .../windowdecor/DragResizeInputListener.java | 399 +- .../windowdecor/DragResizeWindowGeometry.java | 162 +- .../FluidResizeTaskPositioner.java | 59 +- .../wm/shell/windowdecor/HandleImageButton.kt | 41 +- .../wm/shell/windowdecor/HandleMenu.java | 2 +- .../shell/windowdecor/HandleMenuAnimator.kt | 111 +- .../windowdecor/HandleMenuImageButton.kt | 7 +- .../shell/windowdecor/MaximizeButtonView.kt | 65 +- .../wm/shell/windowdecor/MaximizeMenu.kt | 866 +- .../windowdecor/MoveToDesktopAnimator.kt | 20 +- .../com/android/wm/shell/windowdecor/OWNERS | 3 +- .../wm/shell/windowdecor/ResizeVeil.kt | 160 +- .../wm/shell/windowdecor/TaskDragResizer.java | 23 +- .../windowdecor/TaskFocusStateConsumer.java | 2 +- .../wm/shell/windowdecor/TaskOperations.java | 39 +- .../VeiledResizeTaskPositioner.java | 111 +- .../windowdecor/WindowDecorViewModel.java | 3 +- .../shell/windowdecor/WindowDecoration.java | 725 +- .../AdditionalSystemViewContainer.kt | 114 +- .../wm/shell/windowdecor/common/ThemeUtils.kt | 4 - .../shell/windowdecor/extension/TaskInfo.kt | 19 - .../viewholder/AppHandleViewHolder.kt | 284 +- .../viewholder/AppHeaderViewHolder.kt | 687 +- .../viewholder/WindowDecorationViewHolder.kt | 28 +- wmshell/tests/OWNERS | 12 +- wmshell/tests/flicker/Android.bp | 20 +- wmshell/tests/flicker/appcompat/Android.bp | 74 +- .../flicker/appcompat/AndroidTestTemplate.xml | 8 - .../appcompat/OpenAppInSizeCompatModeTest.kt | 2 +- .../appcompat/OpenTransparentActivityTest.kt | 7 +- .../QuickSwitchLauncherToLetterboxAppTest.kt | 6 +- .../RepositionFixedPortraitAppTest.kt | 7 +- .../RestartAppInSizeCompatModeTest.kt | 2 +- .../RotateImmersiveAppInFullscreenTest.kt | 2 +- wmshell/tests/flicker/bubble/Android.bp | 55 - .../flicker/bubble/AndroidTestTemplate.xml | 10 - .../OpenActivityFromBubbleOnLocksreenTest.kt | 6 +- wmshell/tests/flicker/pip/Android.bp | 330 +- .../tests/flicker/pip/AndroidTestTemplate.xml | 15 - .../flicker/pip/csuiteDefaultTemplate.xml | 6 - .../flicker/pip/AutoEnterPipOnGoToHomeTest.kt | 47 +- .../pip/AutoEnterPipWithSourceRectHintTest.kt | 8 +- .../flicker/pip/ClosePipBySwipingDownTest.kt | 7 +- .../pip/ClosePipWithDismissButtonTest.kt | 8 +- .../pip/EnterPipOnUserLeaveHintTest.kt | 8 +- .../flicker/pip/EnterPipToOtherOrientation.kt | 76 +- .../flicker/pip/EnterPipViaAppUiButtonTest.kt | 8 +- .../pip/ExitPipToAppViaExpandButtonTest.kt | 10 +- .../flicker/pip/ExitPipToAppViaIntentTest.kt | 10 +- .../flicker/pip/ExpandPipOnDoubleClickTest.kt | 5 +- .../flicker/pip/ExpandPipOnPinchOpenTest.kt | 3 - ...omSplitScreenAutoEnterPipOnGoToHomeTest.kt | 10 +- ...mSplitScreenEnterPipOnUserLeaveHintTest.kt | 19 +- .../pip/MovePipDownOnShelfHeightChange.kt | 7 +- .../pip/MovePipOnImeVisibilityChangeTest.kt | 3 - .../pip/MovePipUpOnShelfHeightChangeTest.kt | 10 +- .../flicker/pip/PipAspectRatioChangeTest.kt | 8 +- .../wm/shell/flicker/pip/PipDragTest.kt | 6 +- .../shell/flicker/pip/PipDragThenSnapTest.kt | 17 +- .../wm/shell/flicker/pip/PipPinchInTest.kt | 8 +- .../pip/SetRequestedOrientationWhilePinned.kt | 39 +- .../flicker/pip/ShowPipAndRotateDisplay.kt | 5 +- .../pip/apps/AppsEnterPipTransition.kt | 35 +- .../flicker/pip/apps/MapsEnterPipTest.kt | 37 +- .../flicker/pip/apps/NetflixEnterPipTest.kt | 16 +- .../flicker/pip/apps/YouTubeEnterPipTest.kt | 12 +- .../YouTubeEnterPipToOtherOrientationTest.kt | 18 +- .../flicker/pip/common/ClosePipTransition.kt | 5 - .../flicker/pip/common/EnterPipTransition.kt | 8 +- .../pip/common/ExitPipToAppTransition.kt | 7 - .../shell/flicker/pip/common/PipTransition.kt | 23 +- .../wm/shell/flicker/pip/tv/TvPipBasicTest.kt | 2 +- .../wm/shell/flicker/pip/tv/TvPipMenuTests.kt | 2 +- .../CloseAllAppsWithAppHeaderExit.kt | 2 +- .../scenarios/EnterDesktopWithDrag.kt | 2 +- .../scenarios/ResizeAppWithCornerResize.kt | 2 +- .../wm/shell/flicker/BaseBenchmarkTest.kt | 6 - .../shell/flicker/utils/CommonAssertions.kt | 56 +- .../wm/shell/flicker/utils/CommonConstants.kt | 1 - .../shell/flicker/utils/ICommonAssertions.kt | 14 +- .../shell/flicker/utils/SplitScreenUtils.kt | 83 +- wmshell/tests/unittest/Android.bp | 48 +- wmshell/tests/unittest/AndroidTest.xml | 2 - wmshell/tests/unittest/res/values/dimen.xml | 2 - .../wm/shell/ShellTaskOrganizerTests.java | 403 +- .../com/android/wm/shell/ShellTestCase.java | 32 +- .../wm/shell/TestRunningTaskInfoBuilder.java | 87 +- .../android/wm/shell/TestShellExecutor.java | 6 - ...ActivityEmbeddingAnimationRunnerTests.java | 158 +- .../ActivityEmbeddingAnimationTestBase.java | 22 +- .../ActivityEmbeddingControllerTests.java | 47 +- .../back/BackAnimationControllerTest.java | 376 +- .../shell/back/BackProgressAnimatorTest.java | 34 +- .../CustomCrossActivityBackAnimationTest.kt | 8 +- .../shell/bubbles/BubbleDataRepositoryTest.kt | 4 +- .../wm/shell/bubbles/BubbleDataTest.java | 208 +- .../android/wm/shell/bubbles/BubbleTest.java | 175 +- .../wm/shell/bubbles/BubbleViewInfoTest.kt | 56 +- .../BubblesNavBarMotionEventHandlerTest.java | 13 +- .../ExpandedAnimationControllerTest.java | 1 - .../bubbles/bar/BubbleBarHandleViewTest.java | 34 +- .../common/DevicePostureControllerTest.java | 7 +- .../common/DisplayChangeControllerTests.java | 103 +- .../shell/common/DisplayControllerTests.java | 224 +- .../common/DisplayImeControllerTest.java | 66 +- .../common/DisplayInsetsControllerTest.java | 30 +- .../wm/shell/common/DisplayLayoutTest.java | 36 - .../shell/common/MultiInstanceHelperTest.kt | 77 +- .../common/TabletopModeControllerTest.java | 4 +- .../shell/common/split/DividerViewTest.java | 33 +- .../shell/common/split/SplitLayoutTests.java | 39 +- .../common/split/SplitWindowManagerTests.java | 6 +- .../compatui/CompatUIControllerTest.java | 308 +- .../wm/shell/compatui/CompatUILayoutTest.java | 109 +- .../compatui/CompatUIWindowManagerTest.java | 191 +- .../LetterboxEduDialogLayoutTest.java | 8 - .../LetterboxEduWindowManagerTest.java | 103 +- .../compatui/ReachabilityEduLayoutTest.java | 7 - .../ReachabilityEduWindowManagerTest.java | 6 - .../compatui/RestartDialogLayoutTest.java | 13 +- .../RestartDialogWindowManagerTest.java | 5 - .../UserAspectRatioSettingsLayoutTest.java | 17 +- ...rAspectRatioSettingsWindowManagerTest.java | 24 +- .../desktopmode/DesktopModeEventLoggerTest.kt | 838 +- ...DesktopModeLoggerTransitionObserverTest.kt | 1452 +- .../DesktopModeTransitionTypesTest.kt | 21 +- .../DesktopModeUiEventLoggerTest.kt | 38 +- .../DesktopModeVisualIndicatorTest.kt | 602 +- .../desktopmode/DesktopTasksControllerTest.kt | 12602 +-- .../desktopmode/DesktopTasksLimiterTest.kt | 917 +- .../shell/desktopmode/DesktopTestHelpers.kt | 141 +- .../DragToDesktopTransitionHandlerTest.kt | 1148 +- .../ExitDesktopTaskTransitionHandlerTest.java | 48 +- .../DragAndDropControllerTest.java | 47 +- .../draganddrop/GlobalDragListenerTest.kt | 6 +- .../freeform/FreeformTaskListenerTests.java | 307 +- .../FreeformTaskTransitionObserverTest.java | 416 +- .../onehanded/OneHandedControllerTest.java | 3 +- .../OneHandedDisplayAreaOrganizerTest.java | 9 +- .../shell/pip/PipAnimationControllerTest.java | 189 +- .../wm/shell/pip/PipTaskOrganizerTest.java | 61 +- .../wm/shell/pip/phone/PipControllerTest.java | 53 +- .../phone/PipResizeGestureHandlerTest.java | 19 +- .../shell/pip/phone/PipTouchHandlerTest.java | 20 +- .../src/com/android/wm/shell/pip/tv/OWNERS | 3 +- .../wm/shell/pip/tv/TvPipGravityTest.java | 19 +- .../recents/RecentTasksControllerTest.java | 677 +- .../wm/shell/recents/SplitBoundsTest.java | 59 +- .../TaskStackTransitionObserverTest.kt | 609 +- .../shared/animation/PhysicsAnimatorTest.kt | 43 - .../SplitScreenControllerTests.java | 130 +- .../wm/shell/splitscreen/SplitTestUtils.java | 64 +- .../splitscreen/SplitTransitionTests.java | 158 +- .../splitscreen/StageCoordinatorTests.java | 409 +- .../splitscreen/StageTaskListenerTests.java | 142 +- .../StartingSurfaceDrawerTests.java | 33 +- .../StartingWindowControllerTests.java | 91 +- .../wm/shell/sysui/ShellControllerTest.java | 97 +- .../wm/shell/taskview/TaskViewTest.java | 428 +- .../taskview/TaskViewTransitionsTest.java | 271 +- .../HomeTransitionObserverTest.java | 185 +- .../transition/ShellTransitionTests.java | 268 +- .../unfold/UnfoldAnimationControllerTest.java | 2 +- .../unfold/UnfoldTransitionHandlerTest.java | 118 +- .../DesktopModeWindowDecorViewModelTests.kt | 1735 +- .../DesktopModeWindowDecorationTests.java | 1823 +- .../wm/shell/windowdecor/DragDetectorTest.kt | 308 +- .../DragPositioningCallbackUtilityTest.kt | 511 +- .../DragResizeWindowGeometryTests.java | 164 +- .../FluidResizeTaskPositionerTest.kt | 87 +- .../wm/shell/windowdecor/HandleMenuTest.kt | 253 +- .../wm/shell/windowdecor/ResizeVeilTest.kt | 62 +- .../VeiledResizeTaskPositionerTest.kt | 99 +- .../windowdecor/WindowDecorationTests.java | 831 +- .../AdditionalSystemViewContainerTest.kt | 18 +- 1639 files changed, 93907 insertions(+), 146742 deletions(-) create mode 100644 lawnchair/src/app/lawnchair/ui/theme/ExtendedFontVariation.kt create mode 100644 lawnchair/src/app/lawnchair/ui/theme/GoogleSansFlex.kt delete mode 100644 wmshell/multivalentTestsForDevice create mode 100644 wmshell/multivalentTestsForDevice/Android.bp create mode 100644 wmshell/multivalentTestsForDevice/AndroidManifest.xml create mode 100644 wmshell/multivalentTestsForDevice/AndroidManifestRobolectric.xml create mode 100644 wmshell/multivalentTestsForDevice/AndroidTest.xml create mode 100644 wmshell/multivalentTestsForDevice/OWNERS create mode 100644 wmshell/multivalentTestsForDevice/robolectric/config/robolectric.properties create mode 100644 wmshell/multivalentTestsForDevice/src/com/android/wm/shell/bubbles/BubblePositionerTest.kt create mode 100644 wmshell/multivalentTestsForDevice/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt create mode 100644 wmshell/multivalentTestsForDevice/src/com/android/wm/shell/bubbles/BubbleTaskViewTest.kt create mode 100644 wmshell/multivalentTestsForDevice/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinControllerTest.kt delete mode 100644 wmshell/multivalentTestsForDeviceless create mode 100644 wmshell/multivalentTestsForDeviceless/Android.bp create mode 100644 wmshell/multivalentTestsForDeviceless/AndroidManifest.xml create mode 100644 wmshell/multivalentTestsForDeviceless/AndroidManifestRobolectric.xml create mode 100644 wmshell/multivalentTestsForDeviceless/AndroidTest.xml create mode 100644 wmshell/multivalentTestsForDeviceless/OWNERS create mode 100644 wmshell/multivalentTestsForDeviceless/robolectric/config/robolectric.properties create mode 100644 wmshell/multivalentTestsForDeviceless/src/com/android/wm/shell/bubbles/BubblePositionerTest.kt create mode 100644 wmshell/multivalentTestsForDeviceless/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt create mode 100644 wmshell/multivalentTestsForDeviceless/src/com/android/wm/shell/bubbles/BubbleTaskViewTest.kt create mode 100644 wmshell/multivalentTestsForDeviceless/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinControllerTest.kt diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 51645b7e00..5cef531408 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -6,4 +6,17 @@ labels: [ 'dependencies', ], + packageRules: [ + // Enable auto-merge for minor/patch updates. + { + matchUpdateTypes: [ + 'minor', + 'patch', + ], + automerge: true, + matchPackageNames: [ + '/.*/', + ], + }, + ], } diff --git a/.gitmodules b/.gitmodules index 4cdffc19cd..f2284aca65 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "platform_frameworks_libs_systemui"] path = platform_frameworks_libs_systemui - url = https://github.com/BoringExperiments/platform_frameworks_libs_systemui - branch = 16-dev-qpr1 + url = https://github.com/LawnchairLauncher/platform_frameworks_libs_systemui + branch = 16-dev diff --git a/Android.bp b/Android.bp index 07db82b10e..2c4fb37908 100644 --- a/Android.bp +++ b/Android.bp @@ -47,8 +47,8 @@ filegroup { filegroup { name: "launcher-compose-enabled-src", srcs: [ - "compose/facade/enabled/**/*.kt", - "compose/facade/core/**/*.kt", + "compose/facade/enabled/*.kt", + "compose/facade/core/*.kt", "compose/features/**/*.kt", ], } @@ -56,36 +56,8 @@ filegroup { filegroup { name: "launcher-compose-disabled-src", srcs: [ - "compose/facade/core/**/*.kt", - "compose/facade/disabled/**/*.kt", - ], -} - -filegroup { - name: "launcher-compose-test-helpers-src", - srcs: [ - "compose/tests/com/android/launcher3/helper/TestHelper.kt", - ], -} - -filegroup { - name: "launcher-compose-ui-tests-src", - srcs: [], // Placeholder for compose/tests/com/android/launcher3/ui/.. tests. -} - -// Tests for features that are enabled only when compose dependency is enabled & run as part of -// Launcher3Tests -filegroup { - name: "launcher-compose-unit-tests-src", - srcs: [ - "compose/tests/com/android/launcher3/widget/AddWidgetConfigTest.kt", - ], -} - -filegroup { - name: "launcher-compose-tests-src", - srcs: [ - "compose/tests/**/*.kt", + "compose/facade/core/*.kt", + "compose/facade/disabled/*.kt", ], } @@ -101,13 +73,6 @@ filegroup { ], } -filegroup { - name: "quickstep-compose-tests-src", - srcs: [ - "quickstep/compose/tests/**/*.kt", - ], -} - // Launcher ProtoLog support filegroup { name: "launcher-quickstep-unprocessed-protolog-src", @@ -157,6 +122,7 @@ java_genrule { "--protolog-class com.android.internal.protolog.common.ProtoLog " + "--loggroups-class com.android.quickstep.util.QuickstepProtoLogGroup " + "--loggroups-jar $(location :launcher-quickstep_protolog-groups) " + + "--viewer-config-type proto " + "--viewer-config $(out) " + "$(locations :launcher-quickstep-unprocessed-protolog-src)", out: ["launcher.quickstep.protolog.pb"], @@ -219,10 +185,6 @@ filegroup { srcs: ["proguard.flags"], } -soong_config_bool_variable { - name: "release_enable_compose_in_launcher", -} - // Opt-in configuration for Launcher3 code depending on Jetpack Compose. soong_config_module_type { name: "launcher_compose_java_defaults", @@ -235,6 +197,32 @@ soong_config_module_type { ], } +// Opt-in configuration for Launcher Quickstep code depending on Jetpack Compose. +soong_config_bool_variable { + name: "release_enable_compose_in_launcher", +} + +soong_config_module_type { + name: "quickstep_compose_java_defaults", + module_type: "java_defaults", + config_namespace: "ANDROID", + bool_variables: ["release_enable_compose_in_launcher"], + properties: [ + "srcs", + "static_libs", + ], +} + +soong_config_module_type { + name: "launcher_compose_tests_java_defaults", + module_type: "java_defaults", + config_namespace: "ANDROID", + bool_variables: ["release_enable_compose_in_launcher"], + properties: [ + "static_libs", + ], +} + launcher_compose_java_defaults { name: "launcher_compose_defaults", soong_config_variables: { @@ -243,13 +231,10 @@ launcher_compose_java_defaults { ":launcher-compose-enabled-src", ], + // Compose dependencies static_libs: [ - "widget_picker_component", - // Compose dependencies "androidx.compose.runtime_runtime", "androidx.compose.material3_material3", - "androidx.compose.ui_ui-tooling-preview", - "androidx.compose.ui_ui-tooling", ], // By default, Compose is disabled and we compile the ComposeFacade @@ -264,53 +249,6 @@ launcher_compose_java_defaults { }, } -soong_config_module_type { - name: "launcher_compose_tests_java_defaults", - module_type: "java_defaults", - config_namespace: "ANDROID", - bool_variables: ["release_enable_compose_in_launcher"], - properties: [ - "srcs", - "static_libs", - ], -} - -launcher_compose_tests_java_defaults { - name: "launcher_compose_tests_defaults", - soong_config_variables: { - release_enable_compose_in_launcher: { - srcs: [ - ":launcher-compose-test-helpers-src", - ":launcher-compose-unit-tests-src", - ], - // Compose dependencies - static_libs: [ - "widget_picker_component", - "androidx.compose.runtime_runtime", - "androidx.compose.ui_ui-test-junit4", - "androidx.compose.ui_ui-test-manifest", - ], - - conditions_default: { - srcs: [], - static_libs: [], - }, - }, - }, -} - -// Opt-in configuration for Launcher Quickstep code depending on Jetpack Compose. -soong_config_module_type { - name: "quickstep_compose_java_defaults", - module_type: "java_defaults", - config_namespace: "ANDROID", - bool_variables: ["release_enable_compose_in_launcher"], - properties: [ - "srcs", - "static_libs", - ], -} - quickstep_compose_java_defaults { name: "quickstep_compose_defaults", soong_config_variables: { @@ -323,8 +261,6 @@ quickstep_compose_java_defaults { static_libs: [ "androidx.compose.runtime_runtime", "androidx.compose.material3_material3", - "androidx.compose.ui_ui-tooling-preview", - "androidx.compose.ui_ui-tooling", ], // By default, Compose is disabled and we compile the ComposeFacade @@ -339,6 +275,24 @@ quickstep_compose_java_defaults { }, } +launcher_compose_tests_java_defaults { + name: "launcher_compose_tests_defaults", + soong_config_variables: { + release_enable_compose_in_launcher: { + // Compose dependencies + static_libs: [ + "androidx.compose.runtime_runtime", + "androidx.compose.ui_ui-test-junit4", + "androidx.compose.ui_ui-test-manifest", + ], + + conditions_default: { + static_libs: [], + }, + }, + }, +} + android_library { name: "launcher-aosp-tapl", libs: [ @@ -358,8 +312,6 @@ android_library { srcs: [ "tests/tapl/**/*.java", "tests/tapl/**/*.kt", - "tests/src_tapl_build_config/**/*.java", - "tests/src_tapl_build_config/**/*.kt", ], resource_dirs: [], manifest: "tests/tapl/AndroidManifest.xml", @@ -415,6 +367,9 @@ java_library { // Library with all the dependencies for building Launcher3 android_library { name: "Launcher3ResLib", + defaults: [ + "launcher_compose_defaults", + ], srcs: [], resource_dirs: ["res"], static_libs: [ @@ -433,7 +388,6 @@ android_library { "//frameworks/libs/systemui:view_capture", "//frameworks/libs/systemui:animationlib", "//frameworks/libs/systemui:contextualeducationlib", - "//frameworks/libs/systemui:mechanics", "//frameworks/libs/systemui:msdl", "SystemUI-statsd", "WindowManager-Shell-shared-AOSP", @@ -448,9 +402,6 @@ android_library { "dagger2", "jsr330", "com_android_systemui_shared_flags_lib", - "launcher-dagger-qualifiers", - "launcher-executor-qualifiers", - "launcher-executors-module", ], manifest: "AndroidManifest-common.xml", sdk_version: "current", @@ -468,10 +419,7 @@ android_library { // android_app { name: "Launcher3", - defaults: [ - "launcher-non-platform-apis-defaults", - "launcher_compose_defaults", - ], + defaults: ["launcher-non-platform-apis-defaults"], static_libs: [ "Launcher3ResLib", @@ -533,7 +481,6 @@ android_library { "SettingsLibSettingsTheme", "dagger2", "protolog-group", - "displaylib", ], manifest: "quickstep/AndroidManifest.xml", min_sdk_version: "current", diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index efaca3a83b..da43ea0bc6 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -65,14 +65,9 @@ android:protectionLevel="signatureOrSystem" android:label="@string/permlab_write_settings" android:description="@string/permdesc_write_settings"/> - - - + - - - - - - - - - diff --git a/GITHUB_CHANGELOG.md b/GITHUB_CHANGELOG.md index 0f1dc540ad..f34c951104 100644 --- a/GITHUB_CHANGELOG.md +++ b/GITHUB_CHANGELOG.md @@ -1,82 +1,31 @@ -# Bubble Tea - -## Bubble Tea [QPR1] - -### 🏗️ Snapshot 10 (Development 4 Release 1) - -Bug fixes only - -Build: BS10.2111 (latest), BS10.2011 - -This is a developer-focused change log: -* Fix a lot of internal basic functionality -* Re-added some Lawnchair-specific code -* Fix workspace navigation -* Fix allapps navigation -* Fix folder navigation -* Enable Material Expressive Folder Expansion animation flag -* Move to Google Sans Flex font (TODO) -* Material 3 Expressive Settings (Phase 2, TODO) -* Better At-a-Glance perceptive wallpaper colour luminance detection - * Big word that means Lawnchair will take system default hint bright/dark theme and fallback to luminosity detection for bright/dark mode detection in At a Glance. -* Variable font for Launcher3 (????????) -* Dynamically get app widget popup icon -* Foldable support (for real) - -### 🥞 Snapshot 9 (Development 4 Release 1) - -This snapshot marks the first time Bubble Tea QPR1 is able to assemble the APK without errors, -all that's left is bug bash testing. Limited visibility closed testing is available. - -Build: BS9.2011 - -This is a developer-focused change log: -* Re-added searchuilib -* SearchUiLib updated to latest commits before being private -* Exclude disabled variant of Compose launcher3 features -* Fix all errors in Lawnchair side - -### Snapshot 8 (Development 4 Release 1) - -Build: BS8.1811 - -This snapshot marks the first time Bubble Tea QPR1 is able to compile ALL of the Launcher3 code -without errors, that leaves Lawnchair code as the remaining task before successfully compiling -Bubble Tea QPR1 - -This is a developer-focused change log: -* Migrate some functions to new changes -* WM-Shell (and WM-Shell Shared) updated to Android 16-0.0_r3 (Android 16.0.0 Release 3) -* Add Mechanics (SystemUI Platform Library) -* Some unresolved reference in Lawnchair code - -### Snapshot 7 (Development 4 Release 1) - -Build: BS7.1711 - -This snapshot marks the first time Bubble Tea QPR1 is able to pass KSP build stage without any -hiccups, the next 1 or 2 snapshots will be focusing on compilation stage, which should be the last -stage before we can get started on pE Development 4. - -This is a developer-focused change log: -* Codebase updated to Android 16-0.0_r3 (Android 16.0.0 Release 3) -* Prebuilt updated to Android 16-0.0_r3 (Android 16.0.0 Release 3) -* Platform libs updated to Android 16-0.0_r3 (Android 16.0.0 Release 3) - * Move ViewCapture to platform lib - * Add Displaylib -* Flags updated to Android 16-0.0_r3 (Android 16.0.0 Release 3) -* Pull concurrent, dagger (the launcher3) as module - * TODO? We might need to migrate it to build source like compose instead -* Lots of prebuilt documentations update -* Add compose as part of launcher3 build source - * Removed test because I hate configuration gradle - * cc: @validcube fix me, cc: too bad - -## Bubble Tea [r2] - Lawnchair 16 pE Development 3 is here! Contributors are encouraged to target this branch instead of older (i.e., Lawnchair `15-dev`). +### 🏗️ Development 3 Release 3 + +Build: BD3.0712 + +Compatibility list: + +| 🏗️ Crash | 💫 Limited features | 🥞 Fully supported | +|-------------|---------------------|--------------------| +| Android 8.1 | | Android 12.0 | +| Android 9 | | Android 12.1 | +| Android 10 | | Android 13 | +| Android 11 | | Android 14 | +| | | Android 15 | +| | | Android 16 | + +#### Features +* [Lawnchair] Features from Lawnchair 15-dev 07122025 +* [Launcher] Google Sans Flex font uses almost the exact same configuration as Pixel +* [Launcher] Enable bulk loading by default +* [Launcher] Tablet support (ish) + +#### Fixes +* [Launcher3] Widget preview crash for no reason at all on compatible Android version + + ### 🥞 Development 3 Release 2 Build: BD3.2211 @@ -95,6 +44,7 @@ Compatibility list: #### Features * [Lawnchair] Updated screenshots compressions and fastlane screenshot * [Lawnchair] Features from Lawnchair 15-dev +* [Launcher3] Widget preview crash for no reason at all on compatible Android version #### Fixes * [Lawnchair] Conflict from Lawnchair 15-dev diff --git a/OWNERS b/OWNERS index 65a5cf0841..3f7a780edc 100644 --- a/OWNERS +++ b/OWNERS @@ -51,6 +51,7 @@ jonmiranda@google.com jagrutdesai@google.com randypfohl@google.com saumyaprakash@google.com +sukeshram@google.com twickham@google.com victortulias@google.com diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg index f99e9ca556..768ba652de 100644 --- a/PREUPLOAD.cfg +++ b/PREUPLOAD.cfg @@ -11,4 +11,4 @@ ktfmt = ${REPO_ROOT}/external/ktfmt/ktfmt.sh [Hook Scripts] checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --config_xml tools/checkstyle.xml --sha ${PREUPLOAD_COMMIT} -alint_hook = ${REPO_ROOT}/vendor/google/tools/alint + diff --git a/TELEGRAM_CHANGELOG.txt b/TELEGRAM_CHANGELOG.txt index 08aeb77135..104b91b32e 100644 --- a/TELEGRAM_CHANGELOG.txt +++ b/TELEGRAM_CHANGELOG.txt @@ -1,25 +1,197 @@ -# Bubble Tea +Lawnchair 16 pE Development 2 is here! Contributors are encouraged to target this branch instead of +older (i.e., Lawnchair `15-dev`). -## Bubble Tea [QPR1] +### Development 2 -### 🥞 Snapshot 7 (Development 4 Release 1) +Originally going to launch D2 if comestic bug fixes have been resolved, but hit a +stability milestone instead. -Build: BS7.1711 +This release includes 15 new features, and 20 bug fixes, +Lawnchair settings now takes shape of initial material 3 expressive redesign, [(but by no mean finish!)](https://www.google.com/teapot) +launcher should now render icons better than D1 milestone, with auto-adaptive icons feature reimplemented. -This snapshot marks the first time Bubble Tea QPR1 is able to pass KSP build stage without any -hiccups, the next 1 or 2 snapshots will be focusing on compilation stage, which should be the last -stage before we can get started on pE Development 4. +This release have been tested with: +* ☁️ Pixel 6 (Android 12.0) - Build: Ad-hoc +* ☁️ Pixel 6a (Android 12.1) - Build: Ad-hoc +* ☁️ Pixel 7 (Android 13) - Build: Ad-hoc +* ☁️ Pixel 9 (Android 15, Android 16.0) - Build: Ad-hoc +* ☁️ Pixel 9 Pro Fold (Android 14, Android 15) - Build: Ad-hoc +* ☁️ Vivo V40 (Android 15) - Build: Ad-hoc +* ☁️ Xiaomi MIX (Android 15) - Build: Ad-hoc +* 📱 Nothing (3a)-series (Android 15) - Build: pE-`15102025` +* 📱 Pixel 9 Pro XL (Android 16.0 QPR2 Beta 2) - Build: pE-`02102025` +* 📱 BLU View 5 Pro (Android 14) - Build: pE-`02102025` +* 📱🔥 Vivo Y21 (Android 12.0) - Build: pE-`08102025` + +> [!NOTE] +> QuickSwitch compatibility have not been tested at any time during the development of Bubble Tea! + +Compatibility list: + +| 🏗️ Crash | 💫 Limited features | 🥞 Fully supported | +|-------------|---------------------|--------------------| +| Android 8.1 | Android 12.0 | Android 12.1 | +| Android 9 | | Android 13 | +| Android 10 | | Android 14 | +| Android 11 | | Android 15 | +| | | Android 16 | + +#### Features + +* Enable All Apps Blur Flags on Phone (oops, forgot about the allAppsSheetForHandheld flag) +* Make Safe Mode check more reliable +* Smartspace Battery now reports battery charging status of Fast (more than 90% of 20 W) and Slow (less than 90% of 5 W) charging +* Show pseudonym version to Settings +* Resizing workspace calculate items position more accurately +* Update Lawnchair default grid size to 4×7 (or 4×6 with smartspace widget) +* Reimplement Hotseat background customisation +* Make haptic on a locked workspace use Google MSDL vibration +* Make Launcher3 colour more accurate to upstream Android 16 +* ProvideComposeSheetHandler now have expressive blur +* Lawnchair Settings now uses Material 3 Expressive +* Animate keyboard on/off state on app drawer search (Try enabling automatically show keyboard in app drawer settings and swipe up and down or directly tap “Apps list” in popup menu) -> (Backport not possible) +* Add LeakCanary check to all debug variant of the application +* [DEBUG] Launcher3 feature status diagnostic check in debug menu +* [Documentation] Add more visibility into both app certificate and SLSA verification for app authenticity check [VERIFICATION.md](VERIFICATION.md) +* [Documentation] Initial drafting of Improve documentation v6 (pave-path) +* [Launcher] Widget animations during resize +* [Iconloaderlib] Enable second hand for the clock app + +#### Fixes + +* Fix unable to access preview for icon style +* Popup's Arrow Theme now has the correct theme +* Widget should open normally after a workaround (C7evQZDJ) +* Fix (1) Search bar and Dock, (2) Folders and App Drawer settings didn't open due to init problems +* Lawnchair should hopefully remember what grid they should be using +* Most if not all of Lawnchair settings should be usable without crashes +* Correct Baseline Profile from old `market` to `play` variant, and now should calculate profile for `nightly` +* Fix Private Space crash when Lawnchair is set as Launcher due to flags only available on A16 +* Fix crash on a device with strict export receiver requirements on A14 +* Interactable widget crashing due to App Transition Manager being null (C7evQZDJ) +* Icon not responding to mouse cursor -> (Backported to Lawnchair 15) +* Rare NoSuchMethodError crash on IMS canImeRenderGesturalNavButtons +* [Lawnchair] Reimplement Bulk icons toggle +* SettingsCache crashing with SecurityException with unreadable keys (@hide) in Android 12 and newer (assume false) +* Assume flags `enableMovingContentIntoPrivateSpace` is false when ClassNotFoundException on Android 16 devices +* Rare NoSuchMethodError crash on SurfaceControl setEarlyWakeupStart and setEarlyWakeupEnd +* Properly align built-in smartspace in workspace +* Use WM Proxy from Lawnchair instead of System, fix Android 8.1/9/10/11/12.0/12.1 regarding SE, NSME like SystemBarUtils -> (dWkyIGw9), (reworked CllOXHJv) + * LawnchairWindowManagerProxy have been migrated to Dagger + * SystemWindowManagerProxy have been left unused +* [Lawnchair/Iconloaderlib] Update CustomAdaptiveIconDrawable to latest AOSP 13 +* [Iconloaderlib] Reset most of the changes to favour more AOSP 16_r02 code then Lawnchair (need rewrite) + * fix icon loaded in monochrome and always monochrome when it is not supposed to + * fix notification dots being twice the size with notification count +* [Lawnchair/Iconloaderlib] Reimplement Lawnchair Iconloaderlib (adaptive icons, monochrome, regular icon) + +#### Known Bugs +* Preview can't show device wallpaper -> (lIxkAYGg) +* IDP Preview doesn't refresh on settings change -> workaround is to hit apply and re-open the preview -> (ZbLX3438) +* Workspace theme doesn't refresh until restart -> (ZbLX3438) -> Fixed as part of (31lLEflf, 1MevNrzp) +* Lawnchair Colour can't handle restart causing default colour to be used instead -> Fixed? -> Properly fixed as part of (31lLEflf, 1MevNrzp) +* (Investigating) Work profile switch on widget selector *may* have reverted to Lawnchair 15 style +* Full lists: https://trello.com/b/8IdvO81K/pe-lawnchair + +### 🥞 Development 1 + +First development milestone! Basic launcher functionality should be stable enough. + +* Make Lawnchair Launcher launchable in Android 12.1, 13, 14, 15, 16 +* Remove two deprecated features (Use Material U Popup, and Use dot pagination) +* Add pseudonym version in debug settings +* Adapt Lawnchair code to Launcher3 16 +* Make basic features of Launcher work (App Drawer, Home Screen, Search, Folders, Widgets) +* Enable Material Expressive Flags (Try swiping through launcher page) +* Enable All Apps Blur Flags (Try opening All Apps on supported devices) +* Enable MSDL Haptics Feedback Flags (Try gliding widget or icons across the homescreen) +* Make Predictive Back Gesture work on Android 13, 14, 15, 16 (Try swiping left or right on gesture-based navigational) +* Programmatically set Safe Mode status + +#### Known Bugs + +* App Icon may sometimes render with less than 0 in height/width causing blank icon to be rendered and crashing ISE on customising icons -> (31lLEflf) +* Any Lawnchair settings using IDP will crash the launcher -> Fixed in Lawnchair 16 pE Development 2 +* Icon pack isn't usable -> (DXo69Qzd) +* Dynamic icons will not be themed by launcher +* Full lists: https://trello.com/b/8IdvO81K/pe-lawnchair + +### Snapshot 6 This is a developer-focused change log: -* Codebase updated to Android 16-0.0_r3 (Android 16.0.0 Release 3) -* Prebuilt updated to Android 16-0.0_r3 (Android 16.0.0 Release 3) -* Platform libs updated to Android 16-0.0_r3 (Android 16.0.0 Release 3) - * Move ViewCapture to platform lib - * Add Displaylib -* Flags updated to Android 16-0.0_r3 (Android 16.0.0 Release 3) -* Pull concurrent, dagger (the launcher3) as module - * TODO? We might need to migrate it to build source like compose instead -* Lots of prebuilt documentations update -* Add compose as part of launcher3 build source - * Removed test because I hate configuration gradle - * cc: @validcube fix me, cc: too bad + +This snapshot marks the first time Lawnchair 16 is able to compile and build an APK! + +* Fix all issues with Java files in both `lawn` and `src` +* Make Lawnchair compilable (with instant crash) +* Move to KSP for Dagger code generation + +### Snapshot 5 + +This is a developer-focused change log: + +This snapshot now able to compile all sources (Kotlin files only) + +* Fix MORE MORE MORE `lawn` issues +* Use Gradle Version Catalog for consistent dependency version across all modules (Full implementation @ LawnchairLauncher/Lawnchair#5753) +* Magically fix ASM Instrumentation issues (I didn't do anything, it just works now) +* Fix ALL the issues in kotlin stage (`compileLawnWithQuickstepNightlyDebugKotlin`) +* Reintroduce some features from Lawnchair +* Add compatibility checks and workarounds for them +* Fix most issues with Java files in both `lawn` and `src` + +### Snapshot 4 + +This is a developer-focused change log: + +This snapshot marks the first time Lawnchair 16 is able to compile all Launcher3 sources! + +* Add `MSDLLib` to `platform_frameworks_libs_systemui` +* Add `contextualeducationlib` to `platform_frameworks_libs_systemui` +* Fix issues in both `lawn` and `src` modules +* Fix AIDL sources +* Resolve Lawnchair/LC-TODO lists +* Merge `wmshell.shared` res with res from `wmshell` +* Consistent build reproducibility by specifying dependencies in `build.gradle` +* Some ASM Instrumentation issues (and re-add some…) +* Update documentations + +### Snapshot 3 + +This is a developer-focused change log: + +Not a lot of errors left to go! + +* Finish correctly implementing all Dagger functions (?) +* Merge Lawnchair 15 Beta 1 into Bubble Tea + * Support for 16-kb page size devices +* Repository rebased and dropped commit + * Switch back from turbine-combined variant to javac variant for prebuilt SystemUI-core-16 because issues with LFS + * MORE MORE fixes regarding turbine-combined to javac +* Publish `platform_frameworks_libs_systemui` to pe 16-dev branch +* ATLEAST check to almost every launcher3 source file +* `Utils` module (stripped) +* Fix Dagger duplicated classes (because of Dagger dependency ksp/kapt mixing) +* Build reproducibility improvements by specifying dependencies in `build.gradle` files +* Fix some of the issues in both `lawn` and `src` modules + +### Snapshot 2 + +This is a developer-focused change log: + +This snapshot milestone marked the first time Lawnchair now able to compile all supplementary +modules, `src` + `lawn` will be in Snapshot 5 or Development 1 milestone. + +* Merge flags +* Fix some issues with launcher3 sources. +* A temporary workaround with framworks.jar not adding in anim module. +* Shared not having access to animationlib. +* **Switch from javac variant to turbine-combined variant for prebuilt SystemUI-core-16**. + +### From Initial snapshot 0 and 1 + +This is a developer-focused change log: +* Prebuilt updated to Android 16-0.0_r2 (Android 16.0.0 Release 2) +* Submodule have also been refreshed to A16r2 +* Baklava Compatlib (QuickSwitch compatibility not guaranteed) +* Refreshed internal documentation like prebuilt, systemUI diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig index 7c8e5fdbd2..b083390b06 100644 --- a/aconfig/launcher.aconfig +++ b/aconfig/launcher.aconfig @@ -71,6 +71,13 @@ flag { bug: "347281365" } +flag { + name: "enable_unfolded_two_pane_picker" + namespace: "launcher" + description: "Enables two pane widget picker for unfolded foldables" + bug: "313922374" +} + flag { name: "enable_tablet_two_pane_picker_v2" namespace: "launcher" @@ -92,6 +99,13 @@ flag { bug: "238475505" } +flag { + name: "enable_shortcut_dont_suggest_app" + namespace: "launcher" + description: "Enables don't suggest app shortcut for suggested apps" + bug: "319250810" +} + flag { name: "enable_support_for_archiving" namespace: "launcher" @@ -166,6 +180,24 @@ flag { } } +flag { + name: "use_activity_overlay" + namespace: "launcher" + description: "Use an activity for home screen overlay" + bug: "273828110" +} + +flag { + name: "enable_grid_migration_fix" + namespace: "launcher" + description: "Keep items in place when migrating to a bigger grid" + bug: "325286145" + is_fixed_read_only: true + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "enable_narrow_grid_restore" namespace: "launcher" @@ -191,6 +223,16 @@ flag { bug: "323886237" } +flag { + name: "enable_handle_delayed_gesture_callbacks" + namespace: "launcher" + description: "Enables additional handling for delayed mid-gesture callbacks" + bug: "285636175" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "enable_fallback_overview_in_window" namespace: "lse_desktop_experience" @@ -198,6 +240,30 @@ flag { bug: "292269949" } +flag { + name: "enable_smartspace_as_a_widget" + namespace: "launcher" + description: "Enables smartspace as a widget" + bug: "300140279" +} + +flag { + name: "enable_smartspace_removal_toggle" + namespace: "launcher" + description: "Enables smartspace removal toggle" + bug: "303471576" +} + +flag { + name: "enable_additional_home_animations" + namespace: "launcher" + description: "Enables custom home animations for non-running tasks" + bug: "237638627" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "enabled_folders_in_all_apps" namespace: "launcher" @@ -251,6 +317,13 @@ flag { bug: "400827727" } +flag { + name: "multiline_search_bar" + namespace: "launcher" + description: "Search bar can wrap to multi-line" + bug: "341795751" +} + flag { name: "enable_multi_instance_menu_taskbar" namespace: "launcher" @@ -258,6 +331,13 @@ flag { bug: "355237285" } +flag { + name: "navigate_to_child_preference" + namespace: "launcher" + description: "Settings screen supports navigating to child preference if the key is not on the screen" + bug: "293390881" +} + flag { name: "use_new_icon_for_archived_apps" namespace: "launcher" @@ -275,6 +355,16 @@ flag { bug: "358673724" } +flag { + name: "enable_desktop_task_alpha_animation" + namespace: "launcher" + description: "Enables the animation of the desktop task's background view" + bug: "320307666" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "ignore_three_finger_trackpad_for_nav_handle_long_press" namespace: "launcher" @@ -351,6 +441,20 @@ flag { bug: "345760034" } +flag { + name: "taskbar_overflow" + namespace: "launcher" + description: "Show recent apps in the taskbar overflow." + bug: "368119679" +} + +flag { + name: "enable_active_gesture_proto_log" + namespace: "launcher" + description: "Enables tracking active gesture logs in ProtoLog" + bug: "293182501" +} + flag { name: "enable_recents_window_proto_log" namespace: "lse_desktop_experience" @@ -365,6 +469,16 @@ flag { bug: "292269949" } +flag { + name: "coordinate_workspace_scale" + namespace: "launcher" + description: "Ensure that the workspace and hotseat scale doesn't conflict and transitions smoothly between launching and closing apps" + bug: "366403487" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "enable_tiered_widgets_by_default_in_picker" namespace: "launcher" @@ -410,6 +524,13 @@ flag { bug: "377496684" } +flag { + name: "enable_pinning_app_with_context_menu" + namespace: "launcher" + description: "Add options to pin/unpin to taskbar to app context menus." + bug: "375648361" +} + flag { name: "enable_launcher_icon_shapes" namespace: "launcher" @@ -444,17 +565,6 @@ flag { bug: "395145453" } -flag { - name: "external_data_access" - namespace: "launcher" - description: "For LauncherProvider bug fixes and new static permissions as part of the cross oem backup / restore effort." - bug: "395145453" - is_fixed_read_only: true - metadata { - purpose: PURPOSE_BUGFIX - } -} - flag { name: "gsf_res" namespace: "launcher" @@ -517,6 +627,13 @@ flag { bug: "394651876" } +flag { + name: "extendible_theme_manager" + namespace: "launcher" + description: "Enables custom theme manager in Launcher" + bug: "381897614" +} + flag { name: "enable_alt_tab_kqs_flatenning" namespace: "lse_desktop_experience" @@ -587,58 +704,3 @@ flag { purpose: PURPOSE_BUGFIX } } - -flag { - name: "enable_taskbar_ui_thread" - namespace: "launcher" - description: "Enable per-window thread for taskbar" - bug: "404636836" -} - -flag { - name: "enable_expressive_folder_expansion" - namespace: "launcher" - description: "Enables expressive folder expansion motion" - bug: "348708061" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { - name: "model_repository" - namespace: "launcher" - description: "Adds various data repositories for the model" - bug: "390572144" -} - -flag { - name: "home_screen_edit_improvements" - namespace: "launcher" - description: "Improves item removal and resizing within home screen" - bug: "416087474" -} - -flag { - name: "enable_widget_picker_refactor" - namespace: "launcher" - description: "Enables the refactored code for widget picker using separate activity and module" - bug: "370950552" -} - -flag { - name: "enable_reversible_home_action_corner" - namespace: "launcher" - description: "Enables home action corner to be reversible" - bug: "416664984" -} - -flag { - name: "enable_long_press_remove_shortcut" - namespace: "launcher" - description: "Enables remove app shortcut on long press menu" - bug: "419289205" - metadata { - purpose: PURPOSE_BUGFIX - } -} diff --git a/aconfig/launcher_overview.aconfig b/aconfig/launcher_overview.aconfig index c6fb8bfc7f..d27a2143e1 100644 --- a/aconfig/launcher_overview.aconfig +++ b/aconfig/launcher_overview.aconfig @@ -19,16 +19,16 @@ flag { name: "enable_refactor_task_thumbnail" namespace: "launcher_overview" description: "Enables rewritten version of TaskThumbnailViews in Overview" - bug: "331754864" + bug: "331753115" } flag { - name: "enable_coroutine_threading_improvements" + name: "enable_hover_of_child_elements_in_taskview" namespace: "launcher_overview" - description: "Enables changes to the threading model of Launcher's coroutines implementation" - bug: "416206104" + description: "Enables child elements to receive hover events in TaskView and respond visually to those hover events." + bug: "342594235" metadata { - purpose: PURPOSE_BUGFIX + purpose: PURPOSE_BUGFIX } } @@ -39,6 +39,23 @@ flag { bug: "357860832" } +flag { + name: "enable_overview_command_helper_timeout" + namespace: "launcher_overview" + description: "Enables OverviewCommandHelper new version with a timeout to prevent the queue to be unresponsive." + bug: "351122926" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { + name: "enable_desktop_windowing_carousel_detach" + namespace: "launcher_overview" + description: "Makes the desktop windowing task carousel detaches from fullscreen task carousel during quickswitch." + bug: "353947917" +} + flag { name: "enable_desktop_exploded_view" namespace: "launcher_overview" @@ -46,6 +63,16 @@ flag { bug: "378011776" } +flag { + name: "enable_use_top_visible_activity_for_exclude_from_recent_task" + namespace: "launcher_overview" + description: "Enables using the top visible activity for exclude from recent task instead of the activity indicies." + bug: "342627272" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "enable_expressive_dismiss_task_motion" namespace: "launcher_overview" @@ -53,6 +80,16 @@ flag { bug: "381239462" } +flag { + name: "enable_separate_external_display_tasks" + namespace: "launcher_overview" + description: "Enables separating external display tasks in Overview." + bug: "391311008" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "enable_overview_on_connected_displays" namespace: "launcher_overview" @@ -64,7 +101,7 @@ flag { name: "enable_overview_background_wallpaper_blur" namespace: "launcher_overview" description: "Enable wallpaper blur in overview." - bug: "360297985" + bug: "369975912" } flag { @@ -75,32 +112,11 @@ flag { } flag { - name: "enable_refactor_digital_wellbeing_toast" + name: "enable_show_enabled_shortcuts_in_accessibility_menu" namespace: "launcher_overview" - description: "Enables rewritten version of digital wellbeing toast in overview." - bug: "404838605" -} - -flag { - name: "enable_refactor_task_content_view" - namespace: "launcher_overview" - description: "Enables refactor wrapping TaskThumbnailView in a TaskContentView." - bug: "408971730" -} - -flag { - name: "enable_desktop_menu_on_secondary_display_bugfix" - namespace: "launcher_overview" - description: "Enable the 'Desktop' menu entry on full screen tiles on secondary display." - bug: "418822736" + description: "Enables showing the same shortcuts in the Task menu as well as the accessibility actions menu" + bug: "383662632" metadata { purpose: PURPOSE_BUGFIX } } - -flag { - name: "enable_simultaneous_overview_trigger_on_extended_desktop" - namespace: "launcher_overview" - description: "Enable Overview to launch and exit simultaneously on default and external displays wherever it was triggered or quit from" - bug: "421128035" -} diff --git a/aconfig/launcher_search.aconfig b/aconfig/launcher_search.aconfig index 15ea9580d6..b98eee6e32 100644 --- a/aconfig/launcher_search.aconfig +++ b/aconfig/launcher_search.aconfig @@ -22,6 +22,13 @@ flag { bug: "308054233" } +flag { + name: "private_space_app_installer_button" + namespace: "launcher_search" + description: "This flag enables addition of App Installer button in Private Space container." + bug: "308064949" +} + flag { name: "private_space_restrict_accessibility_drag" namespace: "launcher_search" @@ -36,15 +43,6 @@ flag { bug: "289223923" } -flag { - name: "nudge_pill" - namespace: "launcher_search" - description: "This flag enables change the nav or 3 button to nudge related edu (pill or icon) for CtS." - bug: "409121556" - metadata { - purpose: PURPOSE_BUGFIX - } -} flag { name: "private_space_add_floating_mask_view" @@ -55,9 +53,3 @@ flag { purpose: PURPOSE_BUGFIX } } -flag { - name: "enable_qsb_on_hotseat" - namespace: "launcher_search" - description: "Enable Search App's widget on hotseat" - bug: "405226308" -} diff --git a/build.gradle b/build.gradle index 2e486e1ad7..77b90f3894 100644 --- a/build.gradle +++ b/build.gradle @@ -155,7 +155,7 @@ final def ciRunNumber = System.getenv("GITHUB_RUN_NUMBER") ?: "" final def isReleaseBuild = ciBuild && ciRef.contains("beta") final def devReleaseName = ciBuild ? "Dev.(#${ciRunNumber})" : "Dev.(${buildCommit})" final def version = "16" -final def releaseName = "Development 4 Release 1" +final def releaseName = "Development 3 Release 2" final def versionDisplayName = "${version}.${isReleaseBuild ? releaseName : devReleaseName}" final def majorVersion = versionDisplayName.split("\\.")[0] @@ -166,10 +166,10 @@ android { namespace "com.android.launcher3" defaultConfig { /* - * Lawnchair Launcher 16.0 Development 4 Release 1 + * Lawnchair Launcher 16.0 Development 3 Release 2 * see CONTRIBUTING.md#versioning-scheme */ - versionCode 16_00_01_04_01 + versionCode 16_00_01_03_02 versionName "${versionDisplayName}" buildConfigField "String", "VERSION_DISPLAY_NAME", "\"${versionDisplayName}\"" buildConfigField "String", "MAJOR_VERSION", "\"${majorVersion}\"" @@ -319,7 +319,7 @@ android { sourceSets { main { res.srcDirs = ['res'] - java.srcDirs = ['src', 'src_plugins', 'compose/facade/core', 'compose/facade/enabled', 'compose/features'] // Lawnchair-TODO: Don't include Compose Disabled, but there's has to be another way of making this NOT long + java.srcDirs = ['src', 'src_plugins'] manifest.srcFile 'AndroidManifest-common.xml' proto { srcDirs = ['protos/', 'quickstep/protos_overrides/'] @@ -382,15 +382,13 @@ dependencies { implementation projects.animationlib implementation projects.msdllib implementation projects.contextualeducationlib - implementation projects.viewcapturelib - implementation projects.displaylib - implementation projects.mechanics // Recents lib dependency withQuickstepCompileOnly projects.hiddenApi withQuickstepImplementation projects.shared - withQuickstepImplementation projects.animation + withQuickstepImplementation projects.anim withQuickstepImplementation projects.unfold + withQuickstepImplementation projects.viewcapture withQuickstepImplementation projects.log withQuickstepCompileOnly projects.plugin withQuickstepImplementation projects.plugincore @@ -408,10 +406,6 @@ dependencies { withQuickstepImplementation projects.compatLib.compatLibVBaklava withQuickstepImplementation projects.wmshell withQuickstepImplementation projects.flags - withQuickstepImplementation projects.dagger - withQuickstepImplementation projects.concurrent -// withQuickstepImplementation projects.compose - withQuickstepImplementation projects.modules.widgetpicker implementation libs.androidx.dynamicanimation implementation fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'SystemUI-statsd-16.jar') @@ -495,8 +489,6 @@ dependencies { implementation libs.dagger.hilt.android ksp libs.dagger.hilt.compiler - implementation libs.google.guava - debugImplementation libs.leakcanary.android } @@ -515,7 +507,7 @@ spotless { kotlin { target("lawnchair/src/**/*.kt") ktlint("1.8.0").customRuleSets([ - "io.nlopez.compose.rules:ktlint:0.4.28", + "io.nlopez.compose.rules:ktlint:0.5.1", ]).editorConfigOverride([ "ktlint_compose_compositionlocal-allowlist": "disabled", "ktlint_compose_lambda-param-event-trailing": "disabled", diff --git a/flags/README.md b/flags/README.md index 123bc1905d..96d0d9e0ee 100644 --- a/flags/README.md +++ b/flags/README.md @@ -1,27 +1,9 @@ -# Flags +# Launcher3 Flags -Turn SRCJAR into JAR and paste the launcher3 contents into the current Launcher3 flags. +Run -Remove all aconfig flags - -## Launcher3 Flags +m Launcher3 out\soong\.intermediates\packages\apps\Launcher3\aconfig\com_android_launcher3_flags_lib\android_common\gen\com_android_launcher3_flags_lib.srcjar -## SystemUI - -out\soong\.intermediates\frameworks\base\packages\SystemUI\aconfig\com_android_systemui_flags_lib\android_common\gen\com_android_systemui_flags_lib.srcjar - -### SystemUI Shared - -out\soong\.intermediates\frameworks\libs\systemui\aconfig\com_android_systemui_shared_flags_lib\android_common\gen\com_android_systemui_shared_flags_lib.srcjar - -## Windows.flags2 - -out\soong\.intermediates\frameworks\base\com.android.window.flags.window-aconfig-java\android_common\gen\com.android.window.flags.window-aconfig-java.srcjar - -Change from windows.flag to windows.flags2 - -## WM Shell - -out\soong\.intermediates\frameworks\base\libs\WindowManager\Shell\aconfig\com_android_wm_shell_flags_lib\android_common\gen\com_android_wm_shell_flags_lib.srcjar +Turn it into JAR and paste the contents into the current Launcher3 flags. diff --git a/flags/src/com/android/launcher3/CustomFeatureFlags.java b/flags/src/com/android/launcher3/CustomFeatureFlags.java index 5d97ad7e92..2db6820c48 100644 --- a/flags/src/com/android/launcher3/CustomFeatureFlags.java +++ b/flags/src/com/android/launcher3/CustomFeatureFlags.java @@ -1,6 +1,6 @@ package com.android.launcher3; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -38,6 +38,20 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean coordinateWorkspaceScale() { + return getValue(Flags.FLAG_COORDINATE_WORKSPACE_SCALE, + FeatureFlags::coordinateWorkspaceScale); + } + + @Override + + public boolean enableActiveGestureProtoLog() { + return getValue(Flags.FLAG_ENABLE_ACTIVE_GESTURE_PROTO_LOG, + FeatureFlags::enableActiveGestureProtoLog); + } + + @Override + public boolean enableAddAppWidgetViaConfigActivityV2() { return getValue(Flags.FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2, FeatureFlags::enableAddAppWidgetViaConfigActivityV2); @@ -45,6 +59,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean enableAdditionalHomeAnimations() { + return getValue(Flags.FLAG_ENABLE_ADDITIONAL_HOME_ANIMATIONS, + FeatureFlags::enableAdditionalHomeAnimations); + } + + @Override + public boolean enableAllAppsButtonInHotseat() { return getValue(Flags.FLAG_ENABLE_ALL_APPS_BUTTON_IN_HOTSEAT, FeatureFlags::enableAllAppsButtonInHotseat); @@ -87,13 +108,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableCoroutineThreadingImprovements() { - return getValue(Flags.FLAG_ENABLE_COROUTINE_THREADING_IMPROVEMENTS, - FeatureFlags::enableCoroutineThreadingImprovements); - } - - @Override - public boolean enableCursorHoverStates() { return getValue(Flags.FLAG_ENABLE_CURSOR_HOVER_STATES, FeatureFlags::enableCursorHoverStates); @@ -108,9 +122,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDesktopMenuOnSecondaryDisplayBugfix() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_MENU_ON_SECONDARY_DISPLAY_BUGFIX, - FeatureFlags::enableDesktopMenuOnSecondaryDisplayBugfix); + public boolean enableDesktopTaskAlphaAnimation() { + return getValue(Flags.FLAG_ENABLE_DESKTOP_TASK_ALPHA_ANIMATION, + FeatureFlags::enableDesktopTaskAlphaAnimation); + } + + @Override + + public boolean enableDesktopWindowingCarouselDetach() { + return getValue(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_CAROUSEL_DETACH, + FeatureFlags::enableDesktopWindowingCarouselDetach); } @Override @@ -136,13 +157,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableExpressiveFolderExpansion() { - return getValue(Flags.FLAG_ENABLE_EXPRESSIVE_FOLDER_EXPANSION, - FeatureFlags::enableExpressiveFolderExpansion); - } - - @Override - public boolean enableFallbackOverviewInWindow() { return getValue(Flags.FLAG_ENABLE_FALLBACK_OVERVIEW_IN_WINDOW, FeatureFlags::enableFallbackOverviewInWindow); @@ -185,6 +199,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean enableGridMigrationFix() { + return getValue(Flags.FLAG_ENABLE_GRID_MIGRATION_FIX, + FeatureFlags::enableGridMigrationFix); + } + + @Override + public boolean enableGridOnlyOverview() { return getValue(Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW, FeatureFlags::enableGridOnlyOverview); @@ -199,6 +220,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean enableHandleDelayedGestureCallbacks() { + return getValue(Flags.FLAG_ENABLE_HANDLE_DELAYED_GESTURE_CALLBACKS, + FeatureFlags::enableHandleDelayedGestureCallbacks); + } + + @Override + public boolean enableHomeTransitionListener() { return getValue(Flags.FLAG_ENABLE_HOME_TRANSITION_LISTENER, FeatureFlags::enableHomeTransitionListener); @@ -206,6 +234,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean enableHoverOfChildElementsInTaskview() { + return getValue(Flags.FLAG_ENABLE_HOVER_OF_CHILD_ELEMENTS_IN_TASKVIEW, + FeatureFlags::enableHoverOfChildElementsInTaskview); + } + + @Override + public boolean enableLargeDesktopWindowingTile() { return getValue(Flags.FLAG_ENABLE_LARGE_DESKTOP_WINDOWING_TILE, FeatureFlags::enableLargeDesktopWindowingTile); @@ -241,13 +276,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableLongPressRemoveShortcut() { - return getValue(Flags.FLAG_ENABLE_LONG_PRESS_REMOVE_SHORTCUT, - FeatureFlags::enableLongPressRemoveShortcut); - } - - @Override - public boolean enableMouseInteractionChanges() { return getValue(Flags.FLAG_ENABLE_MOUSE_INTERACTION_CHANGES, FeatureFlags::enableMouseInteractionChanges); @@ -276,6 +304,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean enableOverviewCommandHelperTimeout() { + return getValue(Flags.FLAG_ENABLE_OVERVIEW_COMMAND_HELPER_TIMEOUT, + FeatureFlags::enableOverviewCommandHelperTimeout); + } + + @Override + public boolean enableOverviewDesktopTileWallpaperBackground() { return getValue(Flags.FLAG_ENABLE_OVERVIEW_DESKTOP_TILE_WALLPAPER_BACKGROUND, FeatureFlags::enableOverviewDesktopTileWallpaperBackground); @@ -297,6 +332,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean enablePinningAppWithContextMenu() { + return getValue(Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU, + FeatureFlags::enablePinningAppWithContextMenu); + } + + @Override + public boolean enablePredictiveBackGesture() { return getValue(Flags.FLAG_ENABLE_PREDICTIVE_BACK_GESTURE, FeatureFlags::enablePredictiveBackGesture); @@ -318,13 +360,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableQsbOnHotseat() { - return getValue(Flags.FLAG_ENABLE_QSB_ON_HOTSEAT, - FeatureFlags::enableQsbOnHotseat); - } - - @Override - public boolean enableRebootUnlockAnimation() { return getValue(Flags.FLAG_ENABLE_REBOOT_UNLOCK_ANIMATION, FeatureFlags::enableRebootUnlockAnimation); @@ -346,20 +381,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableRefactorDigitalWellbeingToast() { - return getValue(Flags.FLAG_ENABLE_REFACTOR_DIGITAL_WELLBEING_TOAST, - FeatureFlags::enableRefactorDigitalWellbeingToast); - } - - @Override - - public boolean enableRefactorTaskContentView() { - return getValue(Flags.FLAG_ENABLE_REFACTOR_TASK_CONTENT_VIEW, - FeatureFlags::enableRefactorTaskContentView); - } - - @Override - public boolean enableRefactorTaskThumbnail() { return getValue(Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL, FeatureFlags::enableRefactorTaskThumbnail); @@ -374,13 +395,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableReversibleHomeActionCorner() { - return getValue(Flags.FLAG_ENABLE_REVERSIBLE_HOME_ACTION_CORNER, - FeatureFlags::enableReversibleHomeActionCorner); - } - - @Override - public boolean enableScalabilityForDesktopExperience() { return getValue(Flags.FLAG_ENABLE_SCALABILITY_FOR_DESKTOP_EXPERIENCE, FeatureFlags::enableScalabilityForDesktopExperience); @@ -395,9 +409,37 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableSimultaneousOverviewTriggerOnExtendedDesktop() { - return getValue(Flags.FLAG_ENABLE_SIMULTANEOUS_OVERVIEW_TRIGGER_ON_EXTENDED_DESKTOP, - FeatureFlags::enableSimultaneousOverviewTriggerOnExtendedDesktop); + public boolean enableSeparateExternalDisplayTasks() { + return getValue(Flags.FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS, + FeatureFlags::enableSeparateExternalDisplayTasks); + } + + @Override + + public boolean enableShortcutDontSuggestApp() { + return getValue(Flags.FLAG_ENABLE_SHORTCUT_DONT_SUGGEST_APP, + FeatureFlags::enableShortcutDontSuggestApp); + } + + @Override + + public boolean enableShowEnabledShortcutsInAccessibilityMenu() { + return getValue(Flags.FLAG_ENABLE_SHOW_ENABLED_SHORTCUTS_IN_ACCESSIBILITY_MENU, + FeatureFlags::enableShowEnabledShortcutsInAccessibilityMenu); + } + + @Override + + public boolean enableSmartspaceAsAWidget() { + return getValue(Flags.FLAG_ENABLE_SMARTSPACE_AS_A_WIDGET, + FeatureFlags::enableSmartspaceAsAWidget); + } + + @Override + + public boolean enableSmartspaceRemovalToggle() { + return getValue(Flags.FLAG_ENABLE_SMARTSPACE_REMOVAL_TOGGLE, + FeatureFlags::enableSmartspaceRemovalToggle); } @Override @@ -465,13 +507,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableTaskbarUiThread() { - return getValue(Flags.FLAG_ENABLE_TASKBAR_UI_THREAD, - FeatureFlags::enableTaskbarUiThread); - } - - @Override - public boolean enableTieredWidgetsByDefaultInPicker() { return getValue(Flags.FLAG_ENABLE_TIERED_WIDGETS_BY_DEFAULT_IN_PICKER, FeatureFlags::enableTieredWidgetsByDefaultInPicker); @@ -507,9 +542,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableWidgetPickerRefactor() { - return getValue(Flags.FLAG_ENABLE_WIDGET_PICKER_REFACTOR, - FeatureFlags::enableWidgetPickerRefactor); + public boolean enableUnfoldedTwoPanePicker() { + return getValue(Flags.FLAG_ENABLE_UNFOLDED_TWO_PANE_PICKER, + FeatureFlags::enableUnfoldedTwoPanePicker); + } + + @Override + + public boolean enableUseTopVisibleActivityForExcludeFromRecentTask() { + return getValue(Flags.FLAG_ENABLE_USE_TOP_VISIBLE_ACTIVITY_FOR_EXCLUDE_FROM_RECENT_TASK, + FeatureFlags::enableUseTopVisibleActivityForExcludeFromRecentTask); } @Override @@ -542,9 +584,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean externalDataAccess() { - return getValue(Flags.FLAG_EXTERNAL_DATA_ACCESS, - FeatureFlags::externalDataAccess); + public boolean extendibleThemeManager() { + return getValue(Flags.FLAG_EXTENDIBLE_THEME_MANAGER, + FeatureFlags::extendibleThemeManager); } @Override @@ -577,13 +619,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean homeScreenEditImprovements() { - return getValue(Flags.FLAG_HOME_SCREEN_EDIT_IMPROVEMENTS, - FeatureFlags::homeScreenEditImprovements); - } - - @Override - public boolean ignoreThreeFingerTrackpadForNavHandleLongPress() { return getValue(Flags.FLAG_IGNORE_THREE_FINGER_TRACKPAD_FOR_NAV_HANDLE_LONG_PRESS, FeatureFlags::ignoreThreeFingerTrackpadForNavHandleLongPress); @@ -598,13 +633,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean modelRepository() { - return getValue(Flags.FLAG_MODEL_REPOSITORY, - FeatureFlags::modelRepository); - } - - @Override - public boolean msdlFeedback() { return getValue(Flags.FLAG_MSDL_FEEDBACK, FeatureFlags::msdlFeedback); @@ -612,9 +640,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean nudgePill() { - return getValue(Flags.FLAG_NUDGE_PILL, - FeatureFlags::nudgePill); + public boolean multilineSearchBar() { + return getValue(Flags.FLAG_MULTILINE_SEARCH_BAR, + FeatureFlags::multilineSearchBar); + } + + @Override + + public boolean navigateToChildPreference() { + return getValue(Flags.FLAG_NAVIGATE_TO_CHILD_PREFERENCE, + FeatureFlags::navigateToChildPreference); } @Override @@ -668,6 +703,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean privateSpaceAppInstallerButton() { + return getValue(Flags.FLAG_PRIVATE_SPACE_APP_INSTALLER_BUTTON, + FeatureFlags::privateSpaceAppInstallerButton); + } + + @Override + public boolean privateSpaceRestrictAccessibilityDrag() { return getValue(Flags.FLAG_PRIVATE_SPACE_RESTRICT_ACCESSIBILITY_DRAG, FeatureFlags::privateSpaceRestrictAccessibilityDrag); @@ -696,6 +738,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean removeExcludeFromScreenMagnificationFlagUsage() { + return getValue(Flags.FLAG_REMOVE_EXCLUDE_FROM_SCREEN_MAGNIFICATION_FLAG_USAGE, + FeatureFlags::removeExcludeFromScreenMagnificationFlagUsage); + } + + @Override + public boolean restoreArchivedAppIconsFromDb() { return getValue(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB, FeatureFlags::restoreArchivedAppIconsFromDb); @@ -724,6 +773,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean taskbarOverflow() { + return getValue(Flags.FLAG_TASKBAR_OVERFLOW, + FeatureFlags::taskbarOverflow); + } + + @Override + public boolean taskbarQuietModeChangeSupport() { return getValue(Flags.FLAG_TASKBAR_QUIET_MODE_CHANGE_SUPPORT, FeatureFlags::taskbarQuietModeChangeSupport); @@ -731,6 +787,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean useActivityOverlay() { + return getValue(Flags.FLAG_USE_ACTIVITY_OVERLAY, + FeatureFlags::useActivityOverlay); + } + + @Override + public boolean useNewIconForArchivedApps() { return getValue(Flags.FLAG_USE_NEW_ICON_FOR_ARCHIVED_APPS, FeatureFlags::useNewIconForArchivedApps); @@ -758,7 +821,6 @@ public class CustomFeatureFlags implements FeatureFlags { return false; } - private boolean isOptimizationEnabled() { return false; } @@ -772,58 +834,64 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ACCESSIBILITY_SCROLL_ON_ALLAPPS, Flags.FLAG_ALL_APPS_BLUR, Flags.FLAG_ALL_APPS_SHEET_FOR_HANDHELD, + Flags.FLAG_COORDINATE_WORKSPACE_SCALE, + Flags.FLAG_ENABLE_ACTIVE_GESTURE_PROTO_LOG, Flags.FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2, + Flags.FLAG_ENABLE_ADDITIONAL_HOME_ANIMATIONS, Flags.FLAG_ENABLE_ALL_APPS_BUTTON_IN_HOTSEAT, Flags.FLAG_ENABLE_ALT_TAB_KQS_FLATENNING, Flags.FLAG_ENABLE_ALT_TAB_KQS_ON_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_CATEGORIZED_WIDGET_SUGGESTIONS, Flags.FLAG_ENABLE_CONTAINER_RETURN_ANIMATIONS, Flags.FLAG_ENABLE_CONTRAST_TILES, - Flags.FLAG_ENABLE_COROUTINE_THREADING_IMPROVEMENTS, Flags.FLAG_ENABLE_CURSOR_HOVER_STATES, Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW, - Flags.FLAG_ENABLE_DESKTOP_MENU_ON_SECONDARY_DISPLAY_BUGFIX, + Flags.FLAG_ENABLE_DESKTOP_TASK_ALPHA_ANIMATION, + Flags.FLAG_ENABLE_DESKTOP_WINDOWING_CAROUSEL_DETACH, Flags.FLAG_ENABLE_DISMISS_PREDICTION_UNDO, Flags.FLAG_ENABLE_EXPANDING_PAUSE_WORK_BUTTON, Flags.FLAG_ENABLE_EXPRESSIVE_DISMISS_TASK_MOTION, - Flags.FLAG_ENABLE_EXPRESSIVE_FOLDER_EXPANSION, Flags.FLAG_ENABLE_FALLBACK_OVERVIEW_IN_WINDOW, Flags.FLAG_ENABLE_FIRST_SCREEN_BROADCAST_ARCHIVING_EXTRAS, Flags.FLAG_ENABLE_FOCUS_OUTLINE, Flags.FLAG_ENABLE_GENERATED_PREVIEWS, Flags.FLAG_ENABLE_GESTURE_NAV_HORIZONTAL_TOUCH_SLOP, Flags.FLAG_ENABLE_GESTURE_NAV_ON_CONNECTED_DISPLAYS, + Flags.FLAG_ENABLE_GRID_MIGRATION_FIX, Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW, Flags.FLAG_ENABLE_GROWTH_NUDGE, + Flags.FLAG_ENABLE_HANDLE_DELAYED_GESTURE_CALLBACKS, Flags.FLAG_ENABLE_HOME_TRANSITION_LISTENER, + Flags.FLAG_ENABLE_HOVER_OF_CHILD_ELEMENTS_IN_TASKVIEW, Flags.FLAG_ENABLE_LARGE_DESKTOP_WINDOWING_TILE, Flags.FLAG_ENABLE_LAUNCHER_BR_METRICS_FIXED, Flags.FLAG_ENABLE_LAUNCHER_ICON_SHAPES, Flags.FLAG_ENABLE_LAUNCHER_OVERVIEW_IN_WINDOW, Flags.FLAG_ENABLE_LAUNCHER_VISUAL_REFRESH, - Flags.FLAG_ENABLE_LONG_PRESS_REMOVE_SHORTCUT, Flags.FLAG_ENABLE_MOUSE_INTERACTION_CHANGES, Flags.FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR, Flags.FLAG_ENABLE_NARROW_GRID_RESTORE, Flags.FLAG_ENABLE_OVERVIEW_BACKGROUND_WALLPAPER_BLUR, + Flags.FLAG_ENABLE_OVERVIEW_COMMAND_HELPER_TIMEOUT, Flags.FLAG_ENABLE_OVERVIEW_DESKTOP_TILE_WALLPAPER_BACKGROUND, Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU, Flags.FLAG_ENABLE_OVERVIEW_ON_CONNECTED_DISPLAYS, + Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU, Flags.FLAG_ENABLE_PREDICTIVE_BACK_GESTURE, Flags.FLAG_ENABLE_PRIVATE_SPACE, Flags.FLAG_ENABLE_PRIVATE_SPACE_INSTALL_SHORTCUT, - Flags.FLAG_ENABLE_QSB_ON_HOTSEAT, Flags.FLAG_ENABLE_REBOOT_UNLOCK_ANIMATION, Flags.FLAG_ENABLE_RECENTS_IN_TASKBAR, Flags.FLAG_ENABLE_RECENTS_WINDOW_PROTO_LOG, - Flags.FLAG_ENABLE_REFACTOR_DIGITAL_WELLBEING_TOAST, - Flags.FLAG_ENABLE_REFACTOR_TASK_CONTENT_VIEW, Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL, Flags.FLAG_ENABLE_RESPONSIVE_WORKSPACE, - Flags.FLAG_ENABLE_REVERSIBLE_HOME_ACTION_CORNER, Flags.FLAG_ENABLE_SCALABILITY_FOR_DESKTOP_EXPERIENCE, Flags.FLAG_ENABLE_SCALING_REVEAL_HOME_ANIMATION, - Flags.FLAG_ENABLE_SIMULTANEOUS_OVERVIEW_TRIGGER_ON_EXTENDED_DESKTOP, + Flags.FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS, + Flags.FLAG_ENABLE_SHORTCUT_DONT_SUGGEST_APP, + Flags.FLAG_ENABLE_SHOW_ENABLED_SHORTCUTS_IN_ACCESSIBILITY_MENU, + Flags.FLAG_ENABLE_SMARTSPACE_AS_A_WIDGET, + Flags.FLAG_ENABLE_SMARTSPACE_REMOVAL_TOGGLE, Flags.FLAG_ENABLE_STATE_MANAGER_PROTO_LOG, Flags.FLAG_ENABLE_STRICT_MODE, Flags.FLAG_ENABLE_SUPPORT_FOR_ARCHIVING, @@ -833,28 +901,27 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_TASKBAR_FOR_DIRECT_BOOT, Flags.FLAG_ENABLE_TASKBAR_NO_RECREATE, Flags.FLAG_ENABLE_TASKBAR_PINNING, - Flags.FLAG_ENABLE_TASKBAR_UI_THREAD, Flags.FLAG_ENABLE_TIERED_WIDGETS_BY_DEFAULT_IN_PICKER, Flags.FLAG_ENABLE_TWO_PANE_LAUNCHER_SETTINGS, Flags.FLAG_ENABLE_TWOLINE_ALLAPPS, Flags.FLAG_ENABLE_TWOLINE_TOGGLE, Flags.FLAG_ENABLE_UNFOLD_STATE_ANIMATION, - Flags.FLAG_ENABLE_WIDGET_PICKER_REFACTOR, + Flags.FLAG_ENABLE_UNFOLDED_TWO_PANE_PICKER, + Flags.FLAG_ENABLE_USE_TOP_VISIBLE_ACTIVITY_FOR_EXCLUDE_FROM_RECENT_TASK, Flags.FLAG_ENABLE_WIDGET_TAP_TO_ADD, Flags.FLAG_ENABLE_WORKSPACE_INFLATION, Flags.FLAG_ENABLED_FOLDERS_IN_ALL_APPS, Flags.FLAG_EXPRESSIVE_THEME_IN_TASKBAR_AND_NAVIGATION, - Flags.FLAG_EXTERNAL_DATA_ACCESS, + Flags.FLAG_EXTENDIBLE_THEME_MANAGER, Flags.FLAG_FLOATING_SEARCH_BAR, Flags.FLAG_FORCE_MONOCHROME_APP_ICONS, Flags.FLAG_GRID_MIGRATION_REFACTOR, Flags.FLAG_GSF_RES, - Flags.FLAG_HOME_SCREEN_EDIT_IMPROVEMENTS, Flags.FLAG_IGNORE_THREE_FINGER_TRACKPAD_FOR_NAV_HANDLE_LONG_PRESS, Flags.FLAG_LETTER_FAST_SCROLLER, - Flags.FLAG_MODEL_REPOSITORY, Flags.FLAG_MSDL_FEEDBACK, - Flags.FLAG_NUDGE_PILL, + Flags.FLAG_MULTILINE_SEARCH_BAR, + Flags.FLAG_NAVIGATE_TO_CHILD_PREFERENCE, Flags.FLAG_ONE_GRID_MOUNTED_MODE, Flags.FLAG_ONE_GRID_ROTATION_HANDLING, Flags.FLAG_ONE_GRID_SPECS, @@ -862,15 +929,19 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_PREDICTIVE_BACK_TO_HOME_POLISH, Flags.FLAG_PRIVATE_SPACE_ADD_FLOATING_MASK_VIEW, Flags.FLAG_PRIVATE_SPACE_ANIMATION, + Flags.FLAG_PRIVATE_SPACE_APP_INSTALLER_BUTTON, Flags.FLAG_PRIVATE_SPACE_RESTRICT_ACCESSIBILITY_DRAG, Flags.FLAG_PRIVATE_SPACE_RESTRICT_ITEM_DRAG, Flags.FLAG_PRIVATE_SPACE_SYS_APPS_SEPARATION, Flags.FLAG_REMOVE_APPS_REFRESH_ON_RIGHT_CLICK, + Flags.FLAG_REMOVE_EXCLUDE_FROM_SCREEN_MAGNIFICATION_FLAG_USAGE, Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB, Flags.FLAG_RESTORE_ARCHIVED_SHORTCUTS, Flags.FLAG_SHOW_TASKBAR_PINNING_POPUP_FROM_ANYWHERE, Flags.FLAG_SYNC_APP_LAUNCH_WITH_TASKBAR_STASH, + Flags.FLAG_TASKBAR_OVERFLOW, Flags.FLAG_TASKBAR_QUIET_MODE_CHANGE_SUPPORT, + Flags.FLAG_USE_ACTIVITY_OVERLAY, Flags.FLAG_USE_NEW_ICON_FOR_ARCHIVED_APPS, Flags.FLAG_USE_SYSTEM_RADIUS_FOR_APP_WIDGETS, Flags.FLAG_WORK_SCHEDULER_IN_WORK_PROFILE @@ -882,58 +953,64 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ACCESSIBILITY_SCROLL_ON_ALLAPPS, Flags.FLAG_ALL_APPS_BLUR, Flags.FLAG_ALL_APPS_SHEET_FOR_HANDHELD, + Flags.FLAG_COORDINATE_WORKSPACE_SCALE, + Flags.FLAG_ENABLE_ACTIVE_GESTURE_PROTO_LOG, Flags.FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2, + Flags.FLAG_ENABLE_ADDITIONAL_HOME_ANIMATIONS, Flags.FLAG_ENABLE_ALL_APPS_BUTTON_IN_HOTSEAT, Flags.FLAG_ENABLE_ALT_TAB_KQS_FLATENNING, Flags.FLAG_ENABLE_ALT_TAB_KQS_ON_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_CATEGORIZED_WIDGET_SUGGESTIONS, Flags.FLAG_ENABLE_CONTAINER_RETURN_ANIMATIONS, Flags.FLAG_ENABLE_CONTRAST_TILES, - Flags.FLAG_ENABLE_COROUTINE_THREADING_IMPROVEMENTS, Flags.FLAG_ENABLE_CURSOR_HOVER_STATES, Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW, - Flags.FLAG_ENABLE_DESKTOP_MENU_ON_SECONDARY_DISPLAY_BUGFIX, + Flags.FLAG_ENABLE_DESKTOP_TASK_ALPHA_ANIMATION, + Flags.FLAG_ENABLE_DESKTOP_WINDOWING_CAROUSEL_DETACH, Flags.FLAG_ENABLE_DISMISS_PREDICTION_UNDO, Flags.FLAG_ENABLE_EXPANDING_PAUSE_WORK_BUTTON, Flags.FLAG_ENABLE_EXPRESSIVE_DISMISS_TASK_MOTION, - Flags.FLAG_ENABLE_EXPRESSIVE_FOLDER_EXPANSION, Flags.FLAG_ENABLE_FALLBACK_OVERVIEW_IN_WINDOW, Flags.FLAG_ENABLE_FIRST_SCREEN_BROADCAST_ARCHIVING_EXTRAS, Flags.FLAG_ENABLE_FOCUS_OUTLINE, Flags.FLAG_ENABLE_GENERATED_PREVIEWS, Flags.FLAG_ENABLE_GESTURE_NAV_HORIZONTAL_TOUCH_SLOP, Flags.FLAG_ENABLE_GESTURE_NAV_ON_CONNECTED_DISPLAYS, + Flags.FLAG_ENABLE_GRID_MIGRATION_FIX, Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW, Flags.FLAG_ENABLE_GROWTH_NUDGE, + Flags.FLAG_ENABLE_HANDLE_DELAYED_GESTURE_CALLBACKS, Flags.FLAG_ENABLE_HOME_TRANSITION_LISTENER, + Flags.FLAG_ENABLE_HOVER_OF_CHILD_ELEMENTS_IN_TASKVIEW, Flags.FLAG_ENABLE_LARGE_DESKTOP_WINDOWING_TILE, Flags.FLAG_ENABLE_LAUNCHER_BR_METRICS_FIXED, Flags.FLAG_ENABLE_LAUNCHER_ICON_SHAPES, Flags.FLAG_ENABLE_LAUNCHER_OVERVIEW_IN_WINDOW, Flags.FLAG_ENABLE_LAUNCHER_VISUAL_REFRESH, - Flags.FLAG_ENABLE_LONG_PRESS_REMOVE_SHORTCUT, Flags.FLAG_ENABLE_MOUSE_INTERACTION_CHANGES, Flags.FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR, Flags.FLAG_ENABLE_NARROW_GRID_RESTORE, Flags.FLAG_ENABLE_OVERVIEW_BACKGROUND_WALLPAPER_BLUR, + Flags.FLAG_ENABLE_OVERVIEW_COMMAND_HELPER_TIMEOUT, Flags.FLAG_ENABLE_OVERVIEW_DESKTOP_TILE_WALLPAPER_BACKGROUND, Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU, Flags.FLAG_ENABLE_OVERVIEW_ON_CONNECTED_DISPLAYS, + Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU, Flags.FLAG_ENABLE_PREDICTIVE_BACK_GESTURE, Flags.FLAG_ENABLE_PRIVATE_SPACE, Flags.FLAG_ENABLE_PRIVATE_SPACE_INSTALL_SHORTCUT, - Flags.FLAG_ENABLE_QSB_ON_HOTSEAT, Flags.FLAG_ENABLE_REBOOT_UNLOCK_ANIMATION, Flags.FLAG_ENABLE_RECENTS_IN_TASKBAR, Flags.FLAG_ENABLE_RECENTS_WINDOW_PROTO_LOG, - Flags.FLAG_ENABLE_REFACTOR_DIGITAL_WELLBEING_TOAST, - Flags.FLAG_ENABLE_REFACTOR_TASK_CONTENT_VIEW, Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL, Flags.FLAG_ENABLE_RESPONSIVE_WORKSPACE, - Flags.FLAG_ENABLE_REVERSIBLE_HOME_ACTION_CORNER, Flags.FLAG_ENABLE_SCALABILITY_FOR_DESKTOP_EXPERIENCE, Flags.FLAG_ENABLE_SCALING_REVEAL_HOME_ANIMATION, - Flags.FLAG_ENABLE_SIMULTANEOUS_OVERVIEW_TRIGGER_ON_EXTENDED_DESKTOP, + Flags.FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS, + Flags.FLAG_ENABLE_SHORTCUT_DONT_SUGGEST_APP, + Flags.FLAG_ENABLE_SHOW_ENABLED_SHORTCUTS_IN_ACCESSIBILITY_MENU, + Flags.FLAG_ENABLE_SMARTSPACE_AS_A_WIDGET, + Flags.FLAG_ENABLE_SMARTSPACE_REMOVAL_TOGGLE, Flags.FLAG_ENABLE_STATE_MANAGER_PROTO_LOG, Flags.FLAG_ENABLE_STRICT_MODE, Flags.FLAG_ENABLE_SUPPORT_FOR_ARCHIVING, @@ -943,28 +1020,27 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_TASKBAR_FOR_DIRECT_BOOT, Flags.FLAG_ENABLE_TASKBAR_NO_RECREATE, Flags.FLAG_ENABLE_TASKBAR_PINNING, - Flags.FLAG_ENABLE_TASKBAR_UI_THREAD, Flags.FLAG_ENABLE_TIERED_WIDGETS_BY_DEFAULT_IN_PICKER, Flags.FLAG_ENABLE_TWO_PANE_LAUNCHER_SETTINGS, Flags.FLAG_ENABLE_TWOLINE_ALLAPPS, Flags.FLAG_ENABLE_TWOLINE_TOGGLE, Flags.FLAG_ENABLE_UNFOLD_STATE_ANIMATION, - Flags.FLAG_ENABLE_WIDGET_PICKER_REFACTOR, + Flags.FLAG_ENABLE_UNFOLDED_TWO_PANE_PICKER, + Flags.FLAG_ENABLE_USE_TOP_VISIBLE_ACTIVITY_FOR_EXCLUDE_FROM_RECENT_TASK, Flags.FLAG_ENABLE_WIDGET_TAP_TO_ADD, Flags.FLAG_ENABLE_WORKSPACE_INFLATION, Flags.FLAG_ENABLED_FOLDERS_IN_ALL_APPS, Flags.FLAG_EXPRESSIVE_THEME_IN_TASKBAR_AND_NAVIGATION, - Flags.FLAG_EXTERNAL_DATA_ACCESS, + Flags.FLAG_EXTENDIBLE_THEME_MANAGER, Flags.FLAG_FLOATING_SEARCH_BAR, Flags.FLAG_FORCE_MONOCHROME_APP_ICONS, Flags.FLAG_GRID_MIGRATION_REFACTOR, Flags.FLAG_GSF_RES, - Flags.FLAG_HOME_SCREEN_EDIT_IMPROVEMENTS, Flags.FLAG_IGNORE_THREE_FINGER_TRACKPAD_FOR_NAV_HANDLE_LONG_PRESS, Flags.FLAG_LETTER_FAST_SCROLLER, - Flags.FLAG_MODEL_REPOSITORY, Flags.FLAG_MSDL_FEEDBACK, - Flags.FLAG_NUDGE_PILL, + Flags.FLAG_MULTILINE_SEARCH_BAR, + Flags.FLAG_NAVIGATE_TO_CHILD_PREFERENCE, Flags.FLAG_ONE_GRID_MOUNTED_MODE, Flags.FLAG_ONE_GRID_ROTATION_HANDLING, Flags.FLAG_ONE_GRID_SPECS, @@ -972,15 +1048,19 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_PREDICTIVE_BACK_TO_HOME_POLISH, Flags.FLAG_PRIVATE_SPACE_ADD_FLOATING_MASK_VIEW, Flags.FLAG_PRIVATE_SPACE_ANIMATION, + Flags.FLAG_PRIVATE_SPACE_APP_INSTALLER_BUTTON, Flags.FLAG_PRIVATE_SPACE_RESTRICT_ACCESSIBILITY_DRAG, Flags.FLAG_PRIVATE_SPACE_RESTRICT_ITEM_DRAG, Flags.FLAG_PRIVATE_SPACE_SYS_APPS_SEPARATION, Flags.FLAG_REMOVE_APPS_REFRESH_ON_RIGHT_CLICK, + Flags.FLAG_REMOVE_EXCLUDE_FROM_SCREEN_MAGNIFICATION_FLAG_USAGE, Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB, Flags.FLAG_RESTORE_ARCHIVED_SHORTCUTS, Flags.FLAG_SHOW_TASKBAR_PINNING_POPUP_FROM_ANYWHERE, Flags.FLAG_SYNC_APP_LAUNCH_WITH_TASKBAR_STASH, + Flags.FLAG_TASKBAR_OVERFLOW, Flags.FLAG_TASKBAR_QUIET_MODE_CHANGE_SUPPORT, + Flags.FLAG_USE_ACTIVITY_OVERLAY, Flags.FLAG_USE_NEW_ICON_FOR_ARCHIVED_APPS, Flags.FLAG_USE_SYSTEM_RADIUS_FOR_APP_WIDGETS, Flags.FLAG_WORK_SCHEDULER_IN_WORK_PROFILE, diff --git a/flags/src/com/android/launcher3/FeatureFlags.java b/flags/src/com/android/launcher3/FeatureFlags.java index bb25d39664..6c7a84557f 100644 --- a/flags/src/com/android/launcher3/FeatureFlags.java +++ b/flags/src/com/android/launcher3/FeatureFlags.java @@ -1,426 +1,348 @@ package com.android.launcher3; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public interface FeatureFlags { - boolean accessibilityScrollOnAllapps(); - boolean allAppsBlur(); - boolean allAppsSheetForHandheld(); + boolean coordinateWorkspaceScale(); + + + boolean enableActiveGestureProtoLog(); + boolean enableAddAppWidgetViaConfigActivityV2(); + boolean enableAdditionalHomeAnimations(); + boolean enableAllAppsButtonInHotseat(); - boolean enableAltTabKqsFlatenning(); - boolean enableAltTabKqsOnConnectedDisplays(); - boolean enableCategorizedWidgetSuggestions(); - boolean enableContainerReturnAnimations(); - boolean enableContrastTiles(); - - boolean enableCoroutineThreadingImprovements(); - - - boolean enableCursorHoverStates(); - boolean enableDesktopExplodedView(); + boolean enableDesktopTaskAlphaAnimation(); - boolean enableDesktopMenuOnSecondaryDisplayBugfix(); + boolean enableDesktopWindowingCarouselDetach(); boolean enableDismissPredictionUndo(); - boolean enableExpandingPauseWorkButton(); - boolean enableExpressiveDismissTaskMotion(); - - boolean enableExpressiveFolderExpansion(); - - - boolean enableFallbackOverviewInWindow(); - boolean enableFirstScreenBroadcastArchivingExtras(); - boolean enableFocusOutline(); - boolean enableGeneratedPreviews(); - boolean enableGestureNavHorizontalTouchSlop(); - boolean enableGestureNavOnConnectedDisplays(); + boolean enableGridMigrationFix(); + boolean enableGridOnlyOverview(); - boolean enableGrowthNudge(); + boolean enableHandleDelayedGestureCallbacks(); + boolean enableHomeTransitionListener(); + boolean enableHoverOfChildElementsInTaskview(); + boolean enableLargeDesktopWindowingTile(); - boolean enableLauncherBrMetricsFixed(); - boolean enableLauncherIconShapes(); - boolean enableLauncherOverviewInWindow(); - boolean enableLauncherVisualRefresh(); - - boolean enableLongPressRemoveShortcut(); - - - boolean enableMouseInteractionChanges(); - boolean enableMultiInstanceMenuTaskbar(); - boolean enableNarrowGridRestore(); - boolean enableOverviewBackgroundWallpaperBlur(); + boolean enableOverviewCommandHelperTimeout(); + boolean enableOverviewDesktopTileWallpaperBackground(); - boolean enableOverviewIconMenu(); - boolean enableOverviewOnConnectedDisplays(); + boolean enablePinningAppWithContextMenu(); + boolean enablePredictiveBackGesture(); - boolean enablePrivateSpace(); - boolean enablePrivateSpaceInstallShortcut(); - - boolean enableQsbOnHotseat(); - - - boolean enableRebootUnlockAnimation(); - boolean enableRecentsInTaskbar(); - boolean enableRecentsWindowProtoLog(); - - boolean enableRefactorDigitalWellbeingToast(); - - - - boolean enableRefactorTaskContentView(); - - - boolean enableRefactorTaskThumbnail(); - boolean enableResponsiveWorkspace(); - - boolean enableReversibleHomeActionCorner(); - - - boolean enableScalabilityForDesktopExperience(); - boolean enableScalingRevealHomeAnimation(); + boolean enableSeparateExternalDisplayTasks(); - boolean enableSimultaneousOverviewTriggerOnExtendedDesktop(); + boolean enableShortcutDontSuggestApp(); + + + boolean enableShowEnabledShortcutsInAccessibilityMenu(); + + + boolean enableSmartspaceAsAWidget(); + + + boolean enableSmartspaceRemovalToggle(); boolean enableStateManagerProtoLog(); - boolean enableStrictMode(); - boolean enableSupportForArchiving(); - boolean enableTabletTwoPanePickerV2(); - boolean enableTaskbarBehindShade(); - boolean enableTaskbarCustomization(); - boolean enableTaskbarForDirectBoot(); - boolean enableTaskbarNoRecreate(); - boolean enableTaskbarPinning(); - - boolean enableTaskbarUiThread(); - - - boolean enableTieredWidgetsByDefaultInPicker(); - boolean enableTwoPaneLauncherSettings(); - boolean enableTwolineAllapps(); - boolean enableTwolineToggle(); - boolean enableUnfoldStateAnimation(); + boolean enableUnfoldedTwoPanePicker(); - boolean enableWidgetPickerRefactor(); + boolean enableUseTopVisibleActivityForExcludeFromRecentTask(); boolean enableWidgetTapToAdd(); - boolean enableWorkspaceInflation(); - boolean enabledFoldersInAllApps(); - boolean expressiveThemeInTaskbarAndNavigation(); - - boolean externalDataAccess(); - + boolean extendibleThemeManager(); boolean floatingSearchBar(); - boolean forceMonochromeAppIcons(); - boolean gridMigrationRefactor(); - boolean gsfRes(); - - boolean homeScreenEditImprovements(); - - - boolean ignoreThreeFingerTrackpadForNavHandleLongPress(); - boolean letterFastScroller(); - - boolean modelRepository(); - - - boolean msdlFeedback(); + boolean multilineSearchBar(); - boolean nudgePill(); + boolean navigateToChildPreference(); boolean oneGridMountedMode(); - boolean oneGridRotationHandling(); - boolean oneGridSpecs(); - boolean predictiveBackToHomeBlur(); - boolean predictiveBackToHomePolish(); - boolean privateSpaceAddFloatingMaskView(); - boolean privateSpaceAnimation(); + boolean privateSpaceAppInstallerButton(); + boolean privateSpaceRestrictAccessibilityDrag(); - boolean privateSpaceRestrictItemDrag(); - boolean privateSpaceSysAppsSeparation(); - boolean removeAppsRefreshOnRightClick(); + boolean removeExcludeFromScreenMagnificationFlagUsage(); + boolean restoreArchivedAppIconsFromDb(); - boolean restoreArchivedShortcuts(); - boolean showTaskbarPinningPopupFromAnywhere(); - boolean syncAppLaunchWithTaskbarStash(); + boolean taskbarOverflow(); + boolean taskbarQuietModeChangeSupport(); + boolean useActivityOverlay(); + boolean useNewIconForArchivedApps(); - boolean useSystemRadiusForAppWidgets(); - boolean workSchedulerInWorkProfile(); } diff --git a/flags/src/com/android/launcher3/FeatureFlagsImpl.java b/flags/src/com/android/launcher3/FeatureFlagsImpl.java index 37e81a7aed..1fd17137d9 100644 --- a/flags/src/com/android/launcher3/FeatureFlagsImpl.java +++ b/flags/src/com/android/launcher3/FeatureFlagsImpl.java @@ -1,5 +1,5 @@ package com.android.launcher3; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags { @Override @@ -26,6 +26,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean coordinateWorkspaceScale() { + return true; + } + + @Override + + + public boolean enableActiveGestureProtoLog() { + return true; + } + + @Override + + public boolean enableAddAppWidgetViaConfigActivityV2() { return true; } @@ -33,6 +47,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean enableAdditionalHomeAnimations() { + return true; + } + + @Override + + public boolean enableAllAppsButtonInHotseat() { return false; } @@ -75,13 +96,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableCoroutineThreadingImprovements() { - return true; - } - - @Override - - public boolean enableCursorHoverStates() { return true; } @@ -96,7 +110,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDesktopMenuOnSecondaryDisplayBugfix() { + public boolean enableDesktopTaskAlphaAnimation() { + return true; + } + + @Override + + + public boolean enableDesktopWindowingCarouselDetach() { return false; } @@ -124,13 +145,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableExpressiveFolderExpansion() { - return true; - } - - @Override - - public boolean enableFallbackOverviewInWindow() { return false; } @@ -173,13 +187,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableGridOnlyOverview() { + public boolean enableGridMigrationFix() { return true; } @Override + public boolean enableGridOnlyOverview() { + return false; + } + + @Override + + public boolean enableGrowthNudge() { return false; } @@ -187,6 +208,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean enableHandleDelayedGestureCallbacks() { + return true; + } + + @Override + + public boolean enableHomeTransitionListener() { return true; } @@ -194,6 +222,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean enableHoverOfChildElementsInTaskview() { + return true; + } + + @Override + + public boolean enableLargeDesktopWindowingTile() { return true; } @@ -229,15 +264,8 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableLongPressRemoveShortcut() { - return false; - } - - @Override - - public boolean enableMouseInteractionChanges() { - return false; + return true; } @Override @@ -264,6 +292,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean enableOverviewCommandHelperTimeout() { + return true; + } + + @Override + + public boolean enableOverviewDesktopTileWallpaperBackground() { return false; } @@ -272,7 +307,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean enableOverviewIconMenu() { - return true; + return false; } @Override @@ -285,6 +320,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean enablePinningAppWithContextMenu() { + return false; + } + + @Override + + public boolean enablePredictiveBackGesture() { return true; } @@ -306,13 +348,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableQsbOnHotseat() { - return false; - } - - @Override - - public boolean enableRebootUnlockAnimation() { return false; } @@ -334,22 +369,8 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableRefactorDigitalWellbeingToast() { - return false; - } - - @Override - - - public boolean enableRefactorTaskContentView() { - return false; - } - - @Override - - public boolean enableRefactorTaskThumbnail() { - return true; + return false; } @Override @@ -362,13 +383,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableReversibleHomeActionCorner() { - return false; - } - - @Override - - public boolean enableScalabilityForDesktopExperience() { return false; } @@ -383,7 +397,35 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableSimultaneousOverviewTriggerOnExtendedDesktop() { + public boolean enableSeparateExternalDisplayTasks() { + return true; + } + + @Override + + + public boolean enableShortcutDontSuggestApp() { + return true; + } + + @Override + + + public boolean enableShowEnabledShortcutsInAccessibilityMenu() { + return true; + } + + @Override + + + public boolean enableSmartspaceAsAWidget() { + return false; + } + + @Override + + + public boolean enableSmartspaceRemovalToggle() { return false; } @@ -453,22 +495,15 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableTaskbarUiThread() { - return false; - } - - @Override - - public boolean enableTieredWidgetsByDefaultInPicker() { - return true; + return false; } @Override public boolean enableTwoPaneLauncherSettings() { - return false; + return true; } @Override @@ -489,14 +524,21 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean enableUnfoldStateAnimation() { - return false; + return true; } @Override - public boolean enableWidgetPickerRefactor() { - return false; + public boolean enableUnfoldedTwoPanePicker() { + return true; + } + + @Override + + + public boolean enableUseTopVisibleActivityForExcludeFromRecentTask() { + return true; } @Override @@ -524,13 +566,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean expressiveThemeInTaskbarAndNavigation() { - return false; + return true; } @Override - public boolean externalDataAccess() { + public boolean extendibleThemeManager() { return true; } @@ -559,13 +601,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean gsfRes() { - return true; - } - - @Override - - - public boolean homeScreenEditImprovements() { return false; } @@ -586,13 +621,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean modelRepository() { - return false; - } - - @Override - - public boolean msdlFeedback() { return true; } @@ -600,8 +628,15 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean nudgePill() { - return false; + public boolean multilineSearchBar() { + return true; + } + + @Override + + + public boolean navigateToChildPreference() { + return true; } @Override @@ -622,7 +657,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean oneGridSpecs() { - return true; + return false; } @Override @@ -656,6 +691,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean privateSpaceAppInstallerButton() { + return true; + } + + @Override + + public boolean privateSpaceRestrictAccessibilityDrag() { return true; } @@ -684,28 +726,42 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean restoreArchivedAppIconsFromDb() { + public boolean removeExcludeFromScreenMagnificationFlagUsage() { return true; } @Override + public boolean restoreArchivedAppIconsFromDb() { + return false; + } + + @Override + + public boolean restoreArchivedShortcuts() { - return true; + return false; } @Override public boolean showTaskbarPinningPopupFromAnywhere() { - return true; + return false; } @Override public boolean syncAppLaunchWithTaskbarStash() { + return false; + } + + @Override + + + public boolean taskbarOverflow() { return true; } @@ -719,6 +775,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean useActivityOverlay() { + return true; + } + + @Override + + public boolean useNewIconForArchivedApps() { return true; } @@ -734,7 +797,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean workSchedulerInWorkProfile() { - return true; + return false; } } diff --git a/flags/src/com/android/launcher3/Flags.java b/flags/src/com/android/launcher3/Flags.java index a89d80fe1d..68ce0509a9 100644 --- a/flags/src/com/android/launcher3/Flags.java +++ b/flags/src/com/android/launcher3/Flags.java @@ -1,5 +1,5 @@ package com.android.launcher3; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public final class Flags { @@ -10,8 +10,14 @@ public final class Flags { /** @hide */ public static final String FLAG_ALL_APPS_SHEET_FOR_HANDHELD = "com.android.launcher3.all_apps_sheet_for_handheld"; /** @hide */ + public static final String FLAG_COORDINATE_WORKSPACE_SCALE = "com.android.launcher3.coordinate_workspace_scale"; + /** @hide */ + public static final String FLAG_ENABLE_ACTIVE_GESTURE_PROTO_LOG = "com.android.launcher3.enable_active_gesture_proto_log"; + /** @hide */ public static final String FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2 = "com.android.launcher3.enable_add_app_widget_via_config_activity_v2"; /** @hide */ + public static final String FLAG_ENABLE_ADDITIONAL_HOME_ANIMATIONS = "com.android.launcher3.enable_additional_home_animations"; + /** @hide */ public static final String FLAG_ENABLE_ALL_APPS_BUTTON_IN_HOTSEAT = "com.android.launcher3.enable_all_apps_button_in_hotseat"; /** @hide */ public static final String FLAG_ENABLE_ALT_TAB_KQS_FLATENNING = "com.android.launcher3.enable_alt_tab_kqs_flatenning"; @@ -24,13 +30,13 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_CONTRAST_TILES = "com.android.launcher3.enable_contrast_tiles"; /** @hide */ - public static final String FLAG_ENABLE_COROUTINE_THREADING_IMPROVEMENTS = "com.android.launcher3.enable_coroutine_threading_improvements"; - /** @hide */ public static final String FLAG_ENABLE_CURSOR_HOVER_STATES = "com.android.launcher3.enable_cursor_hover_states"; /** @hide */ public static final String FLAG_ENABLE_DESKTOP_EXPLODED_VIEW = "com.android.launcher3.enable_desktop_exploded_view"; /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_MENU_ON_SECONDARY_DISPLAY_BUGFIX = "com.android.launcher3.enable_desktop_menu_on_secondary_display_bugfix"; + public static final String FLAG_ENABLE_DESKTOP_TASK_ALPHA_ANIMATION = "com.android.launcher3.enable_desktop_task_alpha_animation"; + /** @hide */ + public static final String FLAG_ENABLE_DESKTOP_WINDOWING_CAROUSEL_DETACH = "com.android.launcher3.enable_desktop_windowing_carousel_detach"; /** @hide */ public static final String FLAG_ENABLE_DISMISS_PREDICTION_UNDO = "com.android.launcher3.enable_dismiss_prediction_undo"; /** @hide */ @@ -38,8 +44,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_EXPRESSIVE_DISMISS_TASK_MOTION = "com.android.launcher3.enable_expressive_dismiss_task_motion"; /** @hide */ - public static final String FLAG_ENABLE_EXPRESSIVE_FOLDER_EXPANSION = "com.android.launcher3.enable_expressive_folder_expansion"; - /** @hide */ public static final String FLAG_ENABLE_FALLBACK_OVERVIEW_IN_WINDOW = "com.android.launcher3.enable_fallback_overview_in_window"; /** @hide */ public static final String FLAG_ENABLE_FIRST_SCREEN_BROADCAST_ARCHIVING_EXTRAS = "com.android.launcher3.enable_first_screen_broadcast_archiving_extras"; @@ -52,12 +56,18 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_GESTURE_NAV_ON_CONNECTED_DISPLAYS = "com.android.launcher3.enable_gesture_nav_on_connected_displays"; /** @hide */ + public static final String FLAG_ENABLE_GRID_MIGRATION_FIX = "com.android.launcher3.enable_grid_migration_fix"; + /** @hide */ public static final String FLAG_ENABLE_GRID_ONLY_OVERVIEW = "com.android.launcher3.enable_grid_only_overview"; /** @hide */ public static final String FLAG_ENABLE_GROWTH_NUDGE = "com.android.launcher3.enable_growth_nudge"; /** @hide */ + public static final String FLAG_ENABLE_HANDLE_DELAYED_GESTURE_CALLBACKS = "com.android.launcher3.enable_handle_delayed_gesture_callbacks"; + /** @hide */ public static final String FLAG_ENABLE_HOME_TRANSITION_LISTENER = "com.android.launcher3.enable_home_transition_listener"; /** @hide */ + public static final String FLAG_ENABLE_HOVER_OF_CHILD_ELEMENTS_IN_TASKVIEW = "com.android.launcher3.enable_hover_of_child_elements_in_taskview"; + /** @hide */ public static final String FLAG_ENABLE_LARGE_DESKTOP_WINDOWING_TILE = "com.android.launcher3.enable_large_desktop_windowing_tile"; /** @hide */ public static final String FLAG_ENABLE_LAUNCHER_BR_METRICS_FIXED = "com.android.launcher3.enable_launcher_br_metrics_fixed"; @@ -68,8 +78,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_LAUNCHER_VISUAL_REFRESH = "com.android.launcher3.enable_launcher_visual_refresh"; /** @hide */ - public static final String FLAG_ENABLE_LONG_PRESS_REMOVE_SHORTCUT = "com.android.launcher3.enable_long_press_remove_shortcut"; - /** @hide */ public static final String FLAG_ENABLE_MOUSE_INTERACTION_CHANGES = "com.android.launcher3.enable_mouse_interaction_changes"; /** @hide */ public static final String FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR = "com.android.launcher3.enable_multi_instance_menu_taskbar"; @@ -78,41 +86,45 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_OVERVIEW_BACKGROUND_WALLPAPER_BLUR = "com.android.launcher3.enable_overview_background_wallpaper_blur"; /** @hide */ + public static final String FLAG_ENABLE_OVERVIEW_COMMAND_HELPER_TIMEOUT = "com.android.launcher3.enable_overview_command_helper_timeout"; + /** @hide */ public static final String FLAG_ENABLE_OVERVIEW_DESKTOP_TILE_WALLPAPER_BACKGROUND = "com.android.launcher3.enable_overview_desktop_tile_wallpaper_background"; /** @hide */ public static final String FLAG_ENABLE_OVERVIEW_ICON_MENU = "com.android.launcher3.enable_overview_icon_menu"; /** @hide */ public static final String FLAG_ENABLE_OVERVIEW_ON_CONNECTED_DISPLAYS = "com.android.launcher3.enable_overview_on_connected_displays"; /** @hide */ + public static final String FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU = "com.android.launcher3.enable_pinning_app_with_context_menu"; + /** @hide */ public static final String FLAG_ENABLE_PREDICTIVE_BACK_GESTURE = "com.android.launcher3.enable_predictive_back_gesture"; /** @hide */ public static final String FLAG_ENABLE_PRIVATE_SPACE = "com.android.launcher3.enable_private_space"; /** @hide */ public static final String FLAG_ENABLE_PRIVATE_SPACE_INSTALL_SHORTCUT = "com.android.launcher3.enable_private_space_install_shortcut"; /** @hide */ - public static final String FLAG_ENABLE_QSB_ON_HOTSEAT = "com.android.launcher3.enable_qsb_on_hotseat"; - /** @hide */ public static final String FLAG_ENABLE_REBOOT_UNLOCK_ANIMATION = "com.android.launcher3.enable_reboot_unlock_animation"; /** @hide */ public static final String FLAG_ENABLE_RECENTS_IN_TASKBAR = "com.android.launcher3.enable_recents_in_taskbar"; /** @hide */ public static final String FLAG_ENABLE_RECENTS_WINDOW_PROTO_LOG = "com.android.launcher3.enable_recents_window_proto_log"; /** @hide */ - public static final String FLAG_ENABLE_REFACTOR_DIGITAL_WELLBEING_TOAST = "com.android.launcher3.enable_refactor_digital_wellbeing_toast"; - /** @hide */ - public static final String FLAG_ENABLE_REFACTOR_TASK_CONTENT_VIEW = "com.android.launcher3.enable_refactor_task_content_view"; - /** @hide */ public static final String FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL = "com.android.launcher3.enable_refactor_task_thumbnail"; /** @hide */ public static final String FLAG_ENABLE_RESPONSIVE_WORKSPACE = "com.android.launcher3.enable_responsive_workspace"; /** @hide */ - public static final String FLAG_ENABLE_REVERSIBLE_HOME_ACTION_CORNER = "com.android.launcher3.enable_reversible_home_action_corner"; - /** @hide */ public static final String FLAG_ENABLE_SCALABILITY_FOR_DESKTOP_EXPERIENCE = "com.android.launcher3.enable_scalability_for_desktop_experience"; /** @hide */ public static final String FLAG_ENABLE_SCALING_REVEAL_HOME_ANIMATION = "com.android.launcher3.enable_scaling_reveal_home_animation"; /** @hide */ - public static final String FLAG_ENABLE_SIMULTANEOUS_OVERVIEW_TRIGGER_ON_EXTENDED_DESKTOP = "com.android.launcher3.enable_simultaneous_overview_trigger_on_extended_desktop"; + public static final String FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS = "com.android.launcher3.enable_separate_external_display_tasks"; + /** @hide */ + public static final String FLAG_ENABLE_SHORTCUT_DONT_SUGGEST_APP = "com.android.launcher3.enable_shortcut_dont_suggest_app"; + /** @hide */ + public static final String FLAG_ENABLE_SHOW_ENABLED_SHORTCUTS_IN_ACCESSIBILITY_MENU = "com.android.launcher3.enable_show_enabled_shortcuts_in_accessibility_menu"; + /** @hide */ + public static final String FLAG_ENABLE_SMARTSPACE_AS_A_WIDGET = "com.android.launcher3.enable_smartspace_as_a_widget"; + /** @hide */ + public static final String FLAG_ENABLE_SMARTSPACE_REMOVAL_TOGGLE = "com.android.launcher3.enable_smartspace_removal_toggle"; /** @hide */ public static final String FLAG_ENABLE_STATE_MANAGER_PROTO_LOG = "com.android.launcher3.enable_state_manager_proto_log"; /** @hide */ @@ -132,8 +144,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_TASKBAR_PINNING = "com.android.launcher3.enable_taskbar_pinning"; /** @hide */ - public static final String FLAG_ENABLE_TASKBAR_UI_THREAD = "com.android.launcher3.enable_taskbar_ui_thread"; - /** @hide */ public static final String FLAG_ENABLE_TIERED_WIDGETS_BY_DEFAULT_IN_PICKER = "com.android.launcher3.enable_tiered_widgets_by_default_in_picker"; /** @hide */ public static final String FLAG_ENABLE_TWO_PANE_LAUNCHER_SETTINGS = "com.android.launcher3.enable_two_pane_launcher_settings"; @@ -144,7 +154,9 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_UNFOLD_STATE_ANIMATION = "com.android.launcher3.enable_unfold_state_animation"; /** @hide */ - public static final String FLAG_ENABLE_WIDGET_PICKER_REFACTOR = "com.android.launcher3.enable_widget_picker_refactor"; + public static final String FLAG_ENABLE_UNFOLDED_TWO_PANE_PICKER = "com.android.launcher3.enable_unfolded_two_pane_picker"; + /** @hide */ + public static final String FLAG_ENABLE_USE_TOP_VISIBLE_ACTIVITY_FOR_EXCLUDE_FROM_RECENT_TASK = "com.android.launcher3.enable_use_top_visible_activity_for_exclude_from_recent_task"; /** @hide */ public static final String FLAG_ENABLE_WIDGET_TAP_TO_ADD = "com.android.launcher3.enable_widget_tap_to_add"; /** @hide */ @@ -154,7 +166,7 @@ public final class Flags { /** @hide */ public static final String FLAG_EXPRESSIVE_THEME_IN_TASKBAR_AND_NAVIGATION = "com.android.launcher3.expressive_theme_in_taskbar_and_navigation"; /** @hide */ - public static final String FLAG_EXTERNAL_DATA_ACCESS = "com.android.launcher3.external_data_access"; + public static final String FLAG_EXTENDIBLE_THEME_MANAGER = "com.android.launcher3.extendible_theme_manager"; /** @hide */ public static final String FLAG_FLOATING_SEARCH_BAR = "com.android.launcher3.floating_search_bar"; /** @hide */ @@ -164,17 +176,15 @@ public final class Flags { /** @hide */ public static final String FLAG_GSF_RES = "com.android.launcher3.gsf_res"; /** @hide */ - public static final String FLAG_HOME_SCREEN_EDIT_IMPROVEMENTS = "com.android.launcher3.home_screen_edit_improvements"; - /** @hide */ public static final String FLAG_IGNORE_THREE_FINGER_TRACKPAD_FOR_NAV_HANDLE_LONG_PRESS = "com.android.launcher3.ignore_three_finger_trackpad_for_nav_handle_long_press"; /** @hide */ public static final String FLAG_LETTER_FAST_SCROLLER = "com.android.launcher3.letter_fast_scroller"; /** @hide */ - public static final String FLAG_MODEL_REPOSITORY = "com.android.launcher3.model_repository"; - /** @hide */ public static final String FLAG_MSDL_FEEDBACK = "com.android.launcher3.msdl_feedback"; /** @hide */ - public static final String FLAG_NUDGE_PILL = "com.android.launcher3.nudge_pill"; + public static final String FLAG_MULTILINE_SEARCH_BAR = "com.android.launcher3.multiline_search_bar"; + /** @hide */ + public static final String FLAG_NAVIGATE_TO_CHILD_PREFERENCE = "com.android.launcher3.navigate_to_child_preference"; /** @hide */ public static final String FLAG_ONE_GRID_MOUNTED_MODE = "com.android.launcher3.one_grid_mounted_mode"; /** @hide */ @@ -190,6 +200,8 @@ public final class Flags { /** @hide */ public static final String FLAG_PRIVATE_SPACE_ANIMATION = "com.android.launcher3.private_space_animation"; /** @hide */ + public static final String FLAG_PRIVATE_SPACE_APP_INSTALLER_BUTTON = "com.android.launcher3.private_space_app_installer_button"; + /** @hide */ public static final String FLAG_PRIVATE_SPACE_RESTRICT_ACCESSIBILITY_DRAG = "com.android.launcher3.private_space_restrict_accessibility_drag"; /** @hide */ public static final String FLAG_PRIVATE_SPACE_RESTRICT_ITEM_DRAG = "com.android.launcher3.private_space_restrict_item_drag"; @@ -198,6 +210,8 @@ public final class Flags { /** @hide */ public static final String FLAG_REMOVE_APPS_REFRESH_ON_RIGHT_CLICK = "com.android.launcher3.remove_apps_refresh_on_right_click"; /** @hide */ + public static final String FLAG_REMOVE_EXCLUDE_FROM_SCREEN_MAGNIFICATION_FLAG_USAGE = "com.android.launcher3.remove_exclude_from_screen_magnification_flag_usage"; + /** @hide */ public static final String FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB = "com.android.launcher3.restore_archived_app_icons_from_db"; /** @hide */ public static final String FLAG_RESTORE_ARCHIVED_SHORTCUTS = "com.android.launcher3.restore_archived_shortcuts"; @@ -206,8 +220,12 @@ public final class Flags { /** @hide */ public static final String FLAG_SYNC_APP_LAUNCH_WITH_TASKBAR_STASH = "com.android.launcher3.sync_app_launch_with_taskbar_stash"; /** @hide */ + public static final String FLAG_TASKBAR_OVERFLOW = "com.android.launcher3.taskbar_overflow"; + /** @hide */ public static final String FLAG_TASKBAR_QUIET_MODE_CHANGE_SUPPORT = "com.android.launcher3.taskbar_quiet_mode_change_support"; /** @hide */ + public static final String FLAG_USE_ACTIVITY_OVERLAY = "com.android.launcher3.use_activity_overlay"; + /** @hide */ public static final String FLAG_USE_NEW_ICON_FOR_ARCHIVED_APPS = "com.android.launcher3.use_new_icon_for_archived_apps"; /** @hide */ public static final String FLAG_USE_SYSTEM_RADIUS_FOR_APP_WIDGETS = "com.android.launcher3.use_system_radius_for_app_widgets"; @@ -233,12 +251,30 @@ public final class Flags { } + public static boolean coordinateWorkspaceScale() { + + return FEATURE_FLAGS.coordinateWorkspaceScale(); + } + + + public static boolean enableActiveGestureProtoLog() { + + return FEATURE_FLAGS.enableActiveGestureProtoLog(); + } + + public static boolean enableAddAppWidgetViaConfigActivityV2() { return FEATURE_FLAGS.enableAddAppWidgetViaConfigActivityV2(); } + public static boolean enableAdditionalHomeAnimations() { + + return FEATURE_FLAGS.enableAdditionalHomeAnimations(); + } + + public static boolean enableAllAppsButtonInHotseat() { return FEATURE_FLAGS.enableAllAppsButtonInHotseat(); @@ -275,12 +311,6 @@ public final class Flags { } - public static boolean enableCoroutineThreadingImprovements() { - - return FEATURE_FLAGS.enableCoroutineThreadingImprovements(); - } - - public static boolean enableCursorHoverStates() { return FEATURE_FLAGS.enableCursorHoverStates(); @@ -293,9 +323,15 @@ public final class Flags { } - public static boolean enableDesktopMenuOnSecondaryDisplayBugfix() { + public static boolean enableDesktopTaskAlphaAnimation() { - return FEATURE_FLAGS.enableDesktopMenuOnSecondaryDisplayBugfix(); + return FEATURE_FLAGS.enableDesktopTaskAlphaAnimation(); + } + + + public static boolean enableDesktopWindowingCarouselDetach() { + + return FEATURE_FLAGS.enableDesktopWindowingCarouselDetach(); } @@ -317,12 +353,6 @@ public final class Flags { } - public static boolean enableExpressiveFolderExpansion() { - - return FEATURE_FLAGS.enableExpressiveFolderExpansion(); - } - - public static boolean enableFallbackOverviewInWindow() { return FEATURE_FLAGS.enableFallbackOverviewInWindow(); @@ -359,6 +389,12 @@ public final class Flags { } + public static boolean enableGridMigrationFix() { + + return FEATURE_FLAGS.enableGridMigrationFix(); + } + + public static boolean enableGridOnlyOverview() { return FEATURE_FLAGS.enableGridOnlyOverview(); @@ -371,12 +407,24 @@ public final class Flags { } + public static boolean enableHandleDelayedGestureCallbacks() { + + return FEATURE_FLAGS.enableHandleDelayedGestureCallbacks(); + } + + public static boolean enableHomeTransitionListener() { return FEATURE_FLAGS.enableHomeTransitionListener(); } + public static boolean enableHoverOfChildElementsInTaskview() { + + return FEATURE_FLAGS.enableHoverOfChildElementsInTaskview(); + } + + public static boolean enableLargeDesktopWindowingTile() { return FEATURE_FLAGS.enableLargeDesktopWindowingTile(); @@ -407,12 +455,6 @@ public final class Flags { } - public static boolean enableLongPressRemoveShortcut() { - - return FEATURE_FLAGS.enableLongPressRemoveShortcut(); - } - - public static boolean enableMouseInteractionChanges() { return FEATURE_FLAGS.enableMouseInteractionChanges(); @@ -437,6 +479,12 @@ public final class Flags { } + public static boolean enableOverviewCommandHelperTimeout() { + + return FEATURE_FLAGS.enableOverviewCommandHelperTimeout(); + } + + public static boolean enableOverviewDesktopTileWallpaperBackground() { return FEATURE_FLAGS.enableOverviewDesktopTileWallpaperBackground(); @@ -455,6 +503,12 @@ public final class Flags { } + public static boolean enablePinningAppWithContextMenu() { + + return FEATURE_FLAGS.enablePinningAppWithContextMenu(); + } + + public static boolean enablePredictiveBackGesture() { return FEATURE_FLAGS.enablePredictiveBackGesture(); @@ -473,12 +527,6 @@ public final class Flags { } - public static boolean enableQsbOnHotseat() { - - return FEATURE_FLAGS.enableQsbOnHotseat(); - } - - public static boolean enableRebootUnlockAnimation() { return FEATURE_FLAGS.enableRebootUnlockAnimation(); @@ -497,18 +545,6 @@ public final class Flags { } - public static boolean enableRefactorDigitalWellbeingToast() { - - return FEATURE_FLAGS.enableRefactorDigitalWellbeingToast(); - } - - - public static boolean enableRefactorTaskContentView() { - - return FEATURE_FLAGS.enableRefactorTaskContentView(); - } - - public static boolean enableRefactorTaskThumbnail() { return FEATURE_FLAGS.enableRefactorTaskThumbnail(); @@ -521,12 +557,6 @@ public final class Flags { } - public static boolean enableReversibleHomeActionCorner() { - - return FEATURE_FLAGS.enableReversibleHomeActionCorner(); - } - - public static boolean enableScalabilityForDesktopExperience() { return FEATURE_FLAGS.enableScalabilityForDesktopExperience(); @@ -539,9 +569,33 @@ public final class Flags { } - public static boolean enableSimultaneousOverviewTriggerOnExtendedDesktop() { + public static boolean enableSeparateExternalDisplayTasks() { - return FEATURE_FLAGS.enableSimultaneousOverviewTriggerOnExtendedDesktop(); + return FEATURE_FLAGS.enableSeparateExternalDisplayTasks(); + } + + + public static boolean enableShortcutDontSuggestApp() { + + return FEATURE_FLAGS.enableShortcutDontSuggestApp(); + } + + + public static boolean enableShowEnabledShortcutsInAccessibilityMenu() { + + return FEATURE_FLAGS.enableShowEnabledShortcutsInAccessibilityMenu(); + } + + + public static boolean enableSmartspaceAsAWidget() { + + return FEATURE_FLAGS.enableSmartspaceAsAWidget(); + } + + + public static boolean enableSmartspaceRemovalToggle() { + + return FEATURE_FLAGS.enableSmartspaceRemovalToggle(); } @@ -599,12 +653,6 @@ public final class Flags { } - public static boolean enableTaskbarUiThread() { - - return FEATURE_FLAGS.enableTaskbarUiThread(); - } - - public static boolean enableTieredWidgetsByDefaultInPicker() { return FEATURE_FLAGS.enableTieredWidgetsByDefaultInPicker(); @@ -635,9 +683,15 @@ public final class Flags { } - public static boolean enableWidgetPickerRefactor() { + public static boolean enableUnfoldedTwoPanePicker() { - return FEATURE_FLAGS.enableWidgetPickerRefactor(); + return FEATURE_FLAGS.enableUnfoldedTwoPanePicker(); + } + + + public static boolean enableUseTopVisibleActivityForExcludeFromRecentTask() { + + return FEATURE_FLAGS.enableUseTopVisibleActivityForExcludeFromRecentTask(); } @@ -665,9 +719,9 @@ public final class Flags { } - public static boolean externalDataAccess() { + public static boolean extendibleThemeManager() { - return FEATURE_FLAGS.externalDataAccess(); + return FEATURE_FLAGS.extendibleThemeManager(); } @@ -695,12 +749,6 @@ public final class Flags { } - public static boolean homeScreenEditImprovements() { - - return FEATURE_FLAGS.homeScreenEditImprovements(); - } - - public static boolean ignoreThreeFingerTrackpadForNavHandleLongPress() { return FEATURE_FLAGS.ignoreThreeFingerTrackpadForNavHandleLongPress(); @@ -713,21 +761,21 @@ public final class Flags { } - public static boolean modelRepository() { - - return FEATURE_FLAGS.modelRepository(); - } - - public static boolean msdlFeedback() { return FEATURE_FLAGS.msdlFeedback(); } - public static boolean nudgePill() { + public static boolean multilineSearchBar() { - return FEATURE_FLAGS.nudgePill(); + return FEATURE_FLAGS.multilineSearchBar(); + } + + + public static boolean navigateToChildPreference() { + + return FEATURE_FLAGS.navigateToChildPreference(); } @@ -773,6 +821,12 @@ public final class Flags { } + public static boolean privateSpaceAppInstallerButton() { + + return FEATURE_FLAGS.privateSpaceAppInstallerButton(); + } + + public static boolean privateSpaceRestrictAccessibilityDrag() { return FEATURE_FLAGS.privateSpaceRestrictAccessibilityDrag(); @@ -797,6 +851,12 @@ public final class Flags { } + public static boolean removeExcludeFromScreenMagnificationFlagUsage() { + + return FEATURE_FLAGS.removeExcludeFromScreenMagnificationFlagUsage(); + } + + public static boolean restoreArchivedAppIconsFromDb() { return FEATURE_FLAGS.restoreArchivedAppIconsFromDb(); @@ -821,12 +881,24 @@ public final class Flags { } + public static boolean taskbarOverflow() { + + return FEATURE_FLAGS.taskbarOverflow(); + } + + public static boolean taskbarQuietModeChangeSupport() { return FEATURE_FLAGS.taskbarQuietModeChangeSupport(); } + public static boolean useActivityOverlay() { + + return FEATURE_FLAGS.useActivityOverlay(); + } + + public static boolean useNewIconForArchivedApps() { return FEATURE_FLAGS.useNewIconForArchivedApps(); diff --git a/flags/src/com/android/systemui/CustomFeatureFlags.java b/flags/src/com/android/systemui/CustomFeatureFlags.java index b83c30b9ef..8dbbac2755 100644 --- a/flags/src/com/android/systemui/CustomFeatureFlags.java +++ b/flags/src/com/android/systemui/CustomFeatureFlags.java @@ -1,6 +1,6 @@ package com.android.systemui; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -24,6 +24,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean addBlackBackgroundForWindowMagnifier() { + return getValue(Flags.FLAG_ADD_BLACK_BACKGROUND_FOR_WINDOW_MAGNIFIER, + FeatureFlags::addBlackBackgroundForWindowMagnifier); + } + + @Override + public boolean alwaysComposeQsUiFragment() { return getValue(Flags.FLAG_ALWAYS_COMPOSE_QS_UI_FRAGMENT, FeatureFlags::alwaysComposeQsUiFragment); @@ -38,16 +45,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean animationLibraryDelayLeashCleanup() { - return getValue(Flags.FLAG_ANIMATION_LIBRARY_DELAY_LEASH_CLEANUP, - FeatureFlags::animationLibraryDelayLeashCleanup); + public boolean appClipsBacklinks() { + return getValue(Flags.FLAG_APP_CLIPS_BACKLINKS, + FeatureFlags::appClipsBacklinks); } @Override - public boolean appClipsBacklinks() { - return getValue(Flags.FLAG_APP_CLIPS_BACKLINKS, - FeatureFlags::appClipsBacklinks); + public boolean appShortcutRemovalFix() { + return getValue(Flags.FLAG_APP_SHORTCUT_REMOVAL_FIX, + FeatureFlags::appShortcutRemovalFix); } @Override @@ -59,16 +66,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean backButtonOnBouncer() { - return getValue(Flags.FLAG_BACK_BUTTON_ON_BOUNCER, - FeatureFlags::backButtonOnBouncer); - } - - @Override - - public boolean bouncerLifecycleFix() { - return getValue(Flags.FLAG_BOUNCER_LIFECYCLE_FIX, - FeatureFlags::bouncerLifecycleFix); + public boolean bindKeyguardMediaVisibility() { + return getValue(Flags.FLAG_BIND_KEYGUARD_MEDIA_VISIBILITY, + FeatureFlags::bindKeyguardMediaVisibility); } @Override @@ -101,6 +101,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean checkLockscreenGoneTransition() { + return getValue(Flags.FLAG_CHECK_LOCKSCREEN_GONE_TRANSITION, + FeatureFlags::checkLockscreenGoneTransition); + } + + @Override + public boolean classicFlagsMultiUser() { return getValue(Flags.FLAG_CLASSIC_FLAGS_MULTI_USER, FeatureFlags::classicFlagsMultiUser); @@ -108,9 +115,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean clipboardAnnounceLiveRegion() { - return getValue(Flags.FLAG_CLIPBOARD_ANNOUNCE_LIVE_REGION, - FeatureFlags::clipboardAnnounceLiveRegion); + public boolean clipboardImageTimeout() { + return getValue(Flags.FLAG_CLIPBOARD_IMAGE_TIMEOUT, + FeatureFlags::clipboardImageTimeout); + } + + @Override + + public boolean clipboardNoninteractiveOnLockscreen() { + return getValue(Flags.FLAG_CLIPBOARD_NONINTERACTIVE_ON_LOCKSCREEN, + FeatureFlags::clipboardNoninteractiveOnLockscreen); } @Override @@ -122,6 +136,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean clipboardSharedTransitions() { + return getValue(Flags.FLAG_CLIPBOARD_SHARED_TRANSITIONS, + FeatureFlags::clipboardSharedTransitions); + } + + @Override + public boolean clipboardUseDescriptionMimetype() { return getValue(Flags.FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE, FeatureFlags::clipboardUseDescriptionMimetype); @@ -136,13 +157,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean clockModernization() { - return getValue(Flags.FLAG_CLOCK_MODERNIZATION, - FeatureFlags::clockModernization); - } - - @Override - public boolean communalBouncerDoNotModifyPluginOpen() { return getValue(Flags.FLAG_COMMUNAL_BOUNCER_DO_NOT_MODIFY_PLUGIN_OPEN, FeatureFlags::communalBouncerDoNotModifyPluginOpen); @@ -178,9 +192,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean communalShadeTouchHandlingFixes() { - return getValue(Flags.FLAG_COMMUNAL_SHADE_TOUCH_HANDLING_FIXES, - FeatureFlags::communalShadeTouchHandlingFixes); + public boolean communalSceneKtfRefactor() { + return getValue(Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR, + FeatureFlags::communalSceneKtfRefactor); } @Override @@ -248,6 +262,20 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean createWindowlessWindowMagnifier() { + return getValue(Flags.FLAG_CREATE_WINDOWLESS_WINDOW_MAGNIFIER, + FeatureFlags::createWindowlessWindowMagnifier); + } + + @Override + + public boolean debugLiveUpdatesPromoteAll() { + return getValue(Flags.FLAG_DEBUG_LIVE_UPDATES_PROMOTE_ALL, + FeatureFlags::debugLiveUpdatesPromoteAll); + } + + @Override + public boolean decoupleViewControllerInAnimlib() { return getValue(Flags.FLAG_DECOUPLE_VIEW_CONTROLLER_IN_ANIMLIB, FeatureFlags::decoupleViewControllerInAnimlib); @@ -255,6 +283,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean delayShowMagnificationButton() { + return getValue(Flags.FLAG_DELAY_SHOW_MAGNIFICATION_BUTTON, + FeatureFlags::delayShowMagnificationButton); + } + + @Override + public boolean desktopEffectsQsTile() { return getValue(Flags.FLAG_DESKTOP_EFFECTS_QS_TILE, FeatureFlags::desktopEffectsQsTile); @@ -262,9 +297,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean desktopScreenCapture() { - return getValue(Flags.FLAG_DESKTOP_SCREEN_CAPTURE, - FeatureFlags::desktopScreenCapture); + public boolean deviceEntryUdfpsRefactor() { + return getValue(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR, + FeatureFlags::deviceEntryUdfpsRefactor); + } + + @Override + + public boolean disableBlurredShadeVisible() { + return getValue(Flags.FLAG_DISABLE_BLURRED_SHADE_VISIBLE, + FeatureFlags::disableBlurredShadeVisible); } @Override @@ -283,16 +325,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean disableDoubleClickSwapOnBouncer() { - return getValue(Flags.FLAG_DISABLE_DOUBLE_CLICK_SWAP_ON_BOUNCER, - FeatureFlags::disableDoubleClickSwapOnBouncer); - } - - @Override - - public boolean doNotUseImmediateCoroutineDispatcher() { - return getValue(Flags.FLAG_DO_NOT_USE_IMMEDIATE_COROUTINE_DISPATCHER, - FeatureFlags::doNotUseImmediateCoroutineDispatcher); + public boolean disableShadeTrackpadTwoFingerSwipe() { + return getValue(Flags.FLAG_DISABLE_SHADE_TRACKPAD_TWO_FINGER_SWIPE, + FeatureFlags::disableShadeTrackpadTwoFingerSwipe); } @Override @@ -304,13 +339,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean dreamBiometricPromptFixes() { - return getValue(Flags.FLAG_DREAM_BIOMETRIC_PROMPT_FIXES, - FeatureFlags::dreamBiometricPromptFixes); - } - - @Override - public boolean dreamInputSessionPilferOnce() { return getValue(Flags.FLAG_DREAM_INPUT_SESSION_PILFER_ONCE, FeatureFlags::dreamInputSessionPilferOnce); @@ -325,23 +353,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean dreamOverlayUpdatedUi() { - return getValue(Flags.FLAG_DREAM_OVERLAY_UPDATED_UI, - FeatureFlags::dreamOverlayUpdatedUi); - } - - @Override - - public boolean dreamPreviewTapDismiss() { - return getValue(Flags.FLAG_DREAM_PREVIEW_TAP_DISMISS, - FeatureFlags::dreamPreviewTapDismiss); - } - - @Override - - public boolean dreamTransitionFixes() { - return getValue(Flags.FLAG_DREAM_TRANSITION_FIXES, - FeatureFlags::dreamTransitionFixes); + public boolean dreamOverlayUpdatedFont() { + return getValue(Flags.FLAG_DREAM_OVERLAY_UPDATED_FONT, + FeatureFlags::dreamOverlayUpdatedFont); } @Override @@ -367,13 +381,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableConstraintLayoutLockscreenOnExternalDisplay() { - return getValue(Flags.FLAG_ENABLE_CONSTRAINT_LAYOUT_LOCKSCREEN_ON_EXTERNAL_DISPLAY, - FeatureFlags::enableConstraintLayoutLockscreenOnExternalDisplay); - } - - @Override - public boolean enableContextualTipForMuteVolume() { return getValue(Flags.FLAG_ENABLE_CONTEXTUAL_TIP_FOR_MUTE_VOLUME, FeatureFlags::enableContextualTipForMuteVolume); @@ -402,13 +409,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDesktopGrowth() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_GROWTH, - FeatureFlags::enableDesktopGrowth); - } - - @Override - public boolean enableEfficientDisplayRepository() { return getValue(Flags.FLAG_ENABLE_EFFICIENT_DISPLAY_REPOSITORY, FeatureFlags::enableEfficientDisplayRepository); @@ -423,27 +423,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableMinmode() { - return getValue(Flags.FLAG_ENABLE_MINMODE, - FeatureFlags::enableMinmode); - } - - @Override - - public boolean enableSuggestedDeviceUi() { - return getValue(Flags.FLAG_ENABLE_SUGGESTED_DEVICE_UI, - FeatureFlags::enableSuggestedDeviceUi); - } - - @Override - - public boolean enableTopUiController() { - return getValue(Flags.FLAG_ENABLE_TOP_UI_CONTROLLER, - FeatureFlags::enableTopUiController); - } - - @Override - public boolean enableUnderlay() { return getValue(Flags.FLAG_ENABLE_UNDERLAY, FeatureFlags::enableUnderlay); @@ -500,6 +479,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean faceMessageDeferUpdate() { + return getValue(Flags.FLAG_FACE_MESSAGE_DEFER_UPDATE, + FeatureFlags::faceMessageDeferUpdate); + } + + @Override + public boolean faceScanningAnimationNpeFix() { return getValue(Flags.FLAG_FACE_SCANNING_ANIMATION_NPE_FIX, FeatureFlags::faceScanningAnimationNpeFix); @@ -507,6 +493,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean fasterUnlockTransition() { + return getValue(Flags.FLAG_FASTER_UNLOCK_TRANSITION, + FeatureFlags::fasterUnlockTransition); + } + + @Override + public boolean fetchBookmarksXmlKeyboardShortcuts() { return getValue(Flags.FLAG_FETCH_BOOKMARKS_XML_KEYBOARD_SHORTCUTS, FeatureFlags::fetchBookmarksXmlKeyboardShortcuts); @@ -514,9 +507,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean fixDialogLaunchAnimationJankLogging() { - return getValue(Flags.FLAG_FIX_DIALOG_LAUNCH_ANIMATION_JANK_LOGGING, - FeatureFlags::fixDialogLaunchAnimationJankLogging); + public boolean fixImageWallpaperCrashSurfaceAlreadyReleased() { + return getValue(Flags.FLAG_FIX_IMAGE_WALLPAPER_CRASH_SURFACE_ALREADY_RELEASED, + FeatureFlags::fixImageWallpaperCrashSurfaceAlreadyReleased); } @Override @@ -528,16 +521,23 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean flashlightStrength() { - return getValue(Flags.FLAG_FLASHLIGHT_STRENGTH, - FeatureFlags::flashlightStrength); + public boolean floatingMenuAnimatedTuck() { + return getValue(Flags.FLAG_FLOATING_MENU_ANIMATED_TUCK, + FeatureFlags::floatingMenuAnimatedTuck); } @Override - public boolean floatingMenuAnimatedTuck() { - return getValue(Flags.FLAG_FLOATING_MENU_ANIMATED_TUCK, - FeatureFlags::floatingMenuAnimatedTuck); + public boolean floatingMenuDisplayCutoutSupport() { + return getValue(Flags.FLAG_FLOATING_MENU_DISPLAY_CUTOUT_SUPPORT, + FeatureFlags::floatingMenuDisplayCutoutSupport); + } + + @Override + + public boolean floatingMenuDragToEdit() { + return getValue(Flags.FLAG_FLOATING_MENU_DRAG_TO_EDIT, + FeatureFlags::floatingMenuDragToEdit); } @Override @@ -563,6 +563,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean floatingMenuNarrowTargetContentObserver() { + return getValue(Flags.FLAG_FLOATING_MENU_NARROW_TARGET_CONTENT_OBSERVER, + FeatureFlags::floatingMenuNarrowTargetContentObserver); + } + + @Override + public boolean floatingMenuNotifyTargetsChangedOnStrictDiff() { return getValue(Flags.FLAG_FLOATING_MENU_NOTIFY_TARGETS_CHANGED_ON_STRICT_DIFF, FeatureFlags::floatingMenuNotifyTargetsChangedOnStrictDiff); @@ -584,13 +591,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean floatingMenuRemoveFullscreenTaps() { - return getValue(Flags.FLAG_FLOATING_MENU_REMOVE_FULLSCREEN_TAPS, - FeatureFlags::floatingMenuRemoveFullscreenTaps); - } - - @Override - public boolean getConnectedDeviceNameUnsynchronized() { return getValue(Flags.FLAG_GET_CONNECTED_DEVICE_NAME_UNSYNCHRONIZED, FeatureFlags::getConnectedDeviceNameUnsynchronized); @@ -633,6 +633,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean hapticsForComposeSliders() { + return getValue(Flags.FLAG_HAPTICS_FOR_COMPOSE_SLIDERS, + FeatureFlags::hapticsForComposeSliders); + } + + @Override + public boolean hardwareColorStyles() { return getValue(Flags.FLAG_HARDWARE_COLOR_STYLES, FeatureFlags::hardwareColorStyles); @@ -668,20 +675,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean hsuBehaviorChanges() { - return getValue(Flags.FLAG_HSU_BEHAVIOR_CHANGES, - FeatureFlags::hsuBehaviorChanges); - } - - @Override - - public boolean hubBlurredByShadeFix() { - return getValue(Flags.FLAG_HUB_BLURRED_BY_SHADE_FIX, - FeatureFlags::hubBlurredByShadeFix); - } - - @Override - public boolean hubEditModeTouchAdjustments() { return getValue(Flags.FLAG_HUB_EDIT_MODE_TOUCH_ADJUSTMENTS, FeatureFlags::hubEditModeTouchAdjustments); @@ -689,9 +682,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean hubEditModeTransition() { - return getValue(Flags.FLAG_HUB_EDIT_MODE_TRANSITION, - FeatureFlags::hubEditModeTransition); + public boolean hubmodeFullscreenVerticalSwipe() { + return getValue(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE, + FeatureFlags::hubmodeFullscreenVerticalSwipe); + } + + @Override + + public boolean hubmodeFullscreenVerticalSwipeFix() { + return getValue(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX, + FeatureFlags::hubmodeFullscreenVerticalSwipeFix); } @Override @@ -703,16 +703,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean indicationTextA11yFix() { - return getValue(Flags.FLAG_INDICATION_TEXT_A11Y_FIX, - FeatureFlags::indicationTextA11yFix); + public boolean ignoreTouchesNextToNotificationShelf() { + return getValue(Flags.FLAG_IGNORE_TOUCHES_NEXT_TO_NOTIFICATION_SHELF, + FeatureFlags::ignoreTouchesNextToNotificationShelf); } @Override - public boolean instantHideShade() { - return getValue(Flags.FLAG_INSTANT_HIDE_SHADE, - FeatureFlags::instantHideShade); + public boolean indicationTextA11yFix() { + return getValue(Flags.FLAG_INDICATION_TEXT_A11Y_FIX, + FeatureFlags::indicationTextA11yFix); } @Override @@ -752,6 +752,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean keyguardWmReorderAtmsCalls() { + return getValue(Flags.FLAG_KEYGUARD_WM_REORDER_ATMS_CALLS, + FeatureFlags::keyguardWmReorderAtmsCalls); + } + + @Override + public boolean keyguardWmStateRefactor() { return getValue(Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR, FeatureFlags::keyguardWmStateRefactor); @@ -773,20 +780,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean lowlightClockSetBrightness() { - return getValue(Flags.FLAG_LOWLIGHT_CLOCK_SET_BRIGHTNESS, - FeatureFlags::lowlightClockSetBrightness); - } - - @Override - - public boolean lowlightClockUsesKeyguardChargingStatus() { - return getValue(Flags.FLAG_LOWLIGHT_CLOCK_USES_KEYGUARD_CHARGING_STATUS, - FeatureFlags::lowlightClockUsesKeyguardChargingStatus); - } - - @Override - public boolean magneticNotificationSwipes() { return getValue(Flags.FLAG_MAGNETIC_NOTIFICATION_SWIPES, FeatureFlags::magneticNotificationSwipes); @@ -794,6 +787,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean mediaControlsA11yColors() { + return getValue(Flags.FLAG_MEDIA_CONTROLS_A11Y_COLORS, + FeatureFlags::mediaControlsA11yColors); + } + + @Override + public boolean mediaControlsButtonMedia3() { return getValue(Flags.FLAG_MEDIA_CONTROLS_BUTTON_MEDIA3, FeatureFlags::mediaControlsButtonMedia3); @@ -808,9 +808,23 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean mediaControlsInCompose() { - return getValue(Flags.FLAG_MEDIA_CONTROLS_IN_COMPOSE, - FeatureFlags::mediaControlsInCompose); + public boolean mediaControlsDeviceManagerBackgroundExecution() { + return getValue(Flags.FLAG_MEDIA_CONTROLS_DEVICE_MANAGER_BACKGROUND_EXECUTION, + FeatureFlags::mediaControlsDeviceManagerBackgroundExecution); + } + + @Override + + public boolean mediaControlsDrawablesReuseBugfix() { + return getValue(Flags.FLAG_MEDIA_CONTROLS_DRAWABLES_REUSE_BUGFIX, + FeatureFlags::mediaControlsDrawablesReuseBugfix); + } + + @Override + + public boolean mediaControlsLockscreenShadeBugFix() { + return getValue(Flags.FLAG_MEDIA_CONTROLS_LOCKSCREEN_SHADE_BUG_FIX, + FeatureFlags::mediaControlsLockscreenShadeBugFix); } @Override @@ -822,6 +836,34 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean mediaControlsUmoInflationInBackground() { + return getValue(Flags.FLAG_MEDIA_CONTROLS_UMO_INFLATION_IN_BACKGROUND, + FeatureFlags::mediaControlsUmoInflationInBackground); + } + + @Override + + public boolean mediaControlsUserInitiatedDeleteintent() { + return getValue(Flags.FLAG_MEDIA_CONTROLS_USER_INITIATED_DELETEINTENT, + FeatureFlags::mediaControlsUserInitiatedDeleteintent); + } + + @Override + + public boolean mediaLoadMetadataViaMediaDataLoader() { + return getValue(Flags.FLAG_MEDIA_LOAD_METADATA_VIA_MEDIA_DATA_LOADER, + FeatureFlags::mediaLoadMetadataViaMediaDataLoader); + } + + @Override + + public boolean mediaLockscreenLaunchAnimation() { + return getValue(Flags.FLAG_MEDIA_LOCKSCREEN_LAUNCH_ANIMATION, + FeatureFlags::mediaLockscreenLaunchAnimation); + } + + @Override + public boolean mediaProjectionDialogBehindLockscreen() { return getValue(Flags.FLAG_MEDIA_PROJECTION_DIALOG_BEHIND_LOCKSCREEN, FeatureFlags::mediaProjectionDialogBehindLockscreen); @@ -878,13 +920,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean newDozingKeyguardStates() { - return getValue(Flags.FLAG_NEW_DOZING_KEYGUARD_STATES, - FeatureFlags::newDozingKeyguardStates); - } - - @Override - public boolean newVolumePanel() { return getValue(Flags.FLAG_NEW_VOLUME_PANEL, FeatureFlags::newVolumePanel); @@ -997,6 +1032,20 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean notificationOverExpansionClippingFix() { + return getValue(Flags.FLAG_NOTIFICATION_OVER_EXPANSION_CLIPPING_FIX, + FeatureFlags::notificationOverExpansionClippingFix); + } + + @Override + + public boolean notificationReentrantDismiss() { + return getValue(Flags.FLAG_NOTIFICATION_REENTRANT_DISMISS, + FeatureFlags::notificationReentrantDismiss); + } + + @Override + public boolean notificationRowAccessibilityExpanded() { return getValue(Flags.FLAG_NOTIFICATION_ROW_ACCESSIBILITY_EXPANDED, FeatureFlags::notificationRowAccessibilityExpanded); @@ -1018,16 +1067,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean notificationShadeBlur() { - return getValue(Flags.FLAG_NOTIFICATION_SHADE_BLUR, - FeatureFlags::notificationShadeBlur); + public boolean notificationRowUserContext() { + return getValue(Flags.FLAG_NOTIFICATION_ROW_USER_CONTEXT, + FeatureFlags::notificationRowUserContext); } @Override - public boolean notificationShadeCloseWaitsForChildAnimations() { - return getValue(Flags.FLAG_NOTIFICATION_SHADE_CLOSE_WAITS_FOR_CHILD_ANIMATIONS, - FeatureFlags::notificationShadeCloseWaitsForChildAnimations); + public boolean notificationShadeBlur() { + return getValue(Flags.FLAG_NOTIFICATION_SHADE_BLUR, + FeatureFlags::notificationShadeBlur); } @Override @@ -1053,6 +1102,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean notificationViewFlipperPausingV2() { + return getValue(Flags.FLAG_NOTIFICATION_VIEW_FLIPPER_PAUSING_V2, + FeatureFlags::notificationViewFlipperPausingV2); + } + + @Override + public boolean notificationsBackgroundIcons() { return getValue(Flags.FLAG_NOTIFICATIONS_BACKGROUND_ICONS, FeatureFlags::notificationsBackgroundIcons); @@ -1074,13 +1130,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean notificationsHunAccessibilityRefactor() { - return getValue(Flags.FLAG_NOTIFICATIONS_HUN_ACCESSIBILITY_REFACTOR, - FeatureFlags::notificationsHunAccessibilityRefactor); - } - - @Override - public boolean notificationsHunSharedAnimationValues() { return getValue(Flags.FLAG_NOTIFICATIONS_HUN_SHARED_ANIMATION_VALUES, FeatureFlags::notificationsHunSharedAnimationValues); @@ -1123,6 +1172,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean notificationsRedesignGuts() { + return getValue(Flags.FLAG_NOTIFICATIONS_REDESIGN_GUTS, + FeatureFlags::notificationsRedesignGuts); + } + + @Override + public boolean notifyPasswordTextViewUserActivityInBackground() { return getValue(Flags.FLAG_NOTIFY_PASSWORD_TEXT_VIEW_USER_ACTIVITY_IN_BACKGROUND, FeatureFlags::notifyPasswordTextViewUserActivityInBackground); @@ -1137,9 +1193,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean ongoingActivityChipsOnDream() { - return getValue(Flags.FLAG_ONGOING_ACTIVITY_CHIPS_ON_DREAM, - FeatureFlags::ongoingActivityChipsOnDream); + public boolean onlyShowMediaStreamSliderInSingleVolumeMode() { + return getValue(Flags.FLAG_ONLY_SHOW_MEDIA_STREAM_SLIDER_IN_SINGLE_VOLUME_MODE, + FeatureFlags::onlyShowMediaStreamSliderInSingleVolumeMode); + } + + @Override + + public boolean outputSwitcherRedesign() { + return getValue(Flags.FLAG_OUTPUT_SWITCHER_REDESIGN, + FeatureFlags::outputSwitcherRedesign); } @Override @@ -1193,9 +1256,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean privacyDotLiveRegion() { - return getValue(Flags.FLAG_PRIVACY_DOT_LIVE_REGION, - FeatureFlags::privacyDotLiveRegion); + public boolean priorityPeopleSection() { + return getValue(Flags.FLAG_PRIORITY_PEOPLE_SECTION, + FeatureFlags::priorityPeopleSection); } @Override @@ -1207,6 +1270,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean pssAppSelectorRecentsSplitScreen() { + return getValue(Flags.FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN, + FeatureFlags::pssAppSelectorRecentsSplitScreen); + } + + @Override + public boolean pssTaskSwitcher() { return getValue(Flags.FLAG_PSS_TASK_SWITCHER, FeatureFlags::pssTaskSwitcher); @@ -1214,23 +1284,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean qsComposeFragmentEarlyExpansion() { - return getValue(Flags.FLAG_QS_COMPOSE_FRAGMENT_EARLY_EXPANSION, - FeatureFlags::qsComposeFragmentEarlyExpansion); - } - - @Override - - public boolean qsEditModeTabs() { - return getValue(Flags.FLAG_QS_EDIT_MODE_TABS, - FeatureFlags::qsEditModeTabs); - } - - @Override - - public boolean qsEditModeTooltip() { - return getValue(Flags.FLAG_QS_EDIT_MODE_TOOLTIP, - FeatureFlags::qsEditModeTooltip); + public boolean qsCustomTileClickGuaranteedBugFix() { + return getValue(Flags.FLAG_QS_CUSTOM_TILE_CLICK_GUARANTEED_BUG_FIX, + FeatureFlags::qsCustomTileClickGuaranteedBugFix); } @Override @@ -1249,6 +1305,20 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean qsQuickRebindActiveTiles() { + return getValue(Flags.FLAG_QS_QUICK_REBIND_ACTIVE_TILES, + FeatureFlags::qsQuickRebindActiveTiles); + } + + @Override + + public boolean qsRegisterSettingObserverOnBgThread() { + return getValue(Flags.FLAG_QS_REGISTER_SETTING_OBSERVER_ON_BG_THREAD, + FeatureFlags::qsRegisterSettingObserverOnBgThread); + } + + @Override + public boolean qsTileDetailedView() { return getValue(Flags.FLAG_QS_TILE_DETAILED_VIEW, FeatureFlags::qsTileDetailedView); @@ -1263,13 +1333,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean qsTileTransitionInteractionRefinement() { - return getValue(Flags.FLAG_QS_TILE_TRANSITION_INTERACTION_REFINEMENT, - FeatureFlags::qsTileTransitionInteractionRefinement); - } - - @Override - public boolean qsUiRefactor() { return getValue(Flags.FLAG_QS_UI_REFACTOR, FeatureFlags::qsUiRefactor); @@ -1284,13 +1347,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean qsWifiConfig() { - return getValue(Flags.FLAG_QS_WIFI_CONFIG, - FeatureFlags::qsWifiConfig); - } - - @Override - public boolean recordIssueQsTile() { return getValue(Flags.FLAG_RECORD_ISSUE_QS_TILE, FeatureFlags::recordIssueQsTile); @@ -1305,6 +1361,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean refactorGetCurrentUser() { + return getValue(Flags.FLAG_REFACTOR_GET_CURRENT_USER, + FeatureFlags::refactorGetCurrentUser); + } + + @Override + public boolean registerBatteryControllerReceiversInCorestartable() { return getValue(Flags.FLAG_REGISTER_BATTERY_CONTROLLER_RECEIVERS_IN_CORESTARTABLE, FeatureFlags::registerBatteryControllerReceiversInCorestartable); @@ -1333,16 +1396,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean rememberViewModelOffMainThread() { - return getValue(Flags.FLAG_REMEMBER_VIEW_MODEL_OFF_MAIN_THREAD, - FeatureFlags::rememberViewModelOffMainThread); - } - - @Override - - public boolean removeAodCarMode() { - return getValue(Flags.FLAG_REMOVE_AOD_CAR_MODE, - FeatureFlags::removeAodCarMode); + public boolean relockWithPowerButtonImmediately() { + return getValue(Flags.FLAG_RELOCK_WITH_POWER_BUTTON_IMMEDIATELY, + FeatureFlags::relockWithPowerButtonImmediately); } @Override @@ -1354,13 +1410,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean removeNearbyShareTileAnimation() { - return getValue(Flags.FLAG_REMOVE_NEARBY_SHARE_TILE_ANIMATION, - FeatureFlags::removeNearbyShareTileAnimation); - } - - @Override - public boolean removeUpdateListenerInQsIconViewImpl() { return getValue(Flags.FLAG_REMOVE_UPDATE_LISTENER_IN_QS_ICON_VIEW_IMPL, FeatureFlags::removeUpdateListenerInQsIconViewImpl); @@ -1382,13 +1431,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean restrictCommunalAppWidgetHostListening() { - return getValue(Flags.FLAG_RESTRICT_COMMUNAL_APP_WIDGET_HOST_LISTENING, - FeatureFlags::restrictCommunalAppWidgetHostListening); - } - - @Override - public boolean revampedBouncerMessages() { return getValue(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES, FeatureFlags::revampedBouncerMessages); @@ -1417,13 +1459,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean screenReactions() { - return getValue(Flags.FLAG_SCREEN_REACTIONS, - FeatureFlags::screenReactions); - } - - @Override - public boolean screenshareNotificationHidingBugFix() { return getValue(Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX, FeatureFlags::screenshareNotificationHidingBugFix); @@ -1438,13 +1473,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean screenshotAnnounceLiveRegion() { - return getValue(Flags.FLAG_SCREENSHOT_ANNOUNCE_LIVE_REGION, - FeatureFlags::screenshotAnnounceLiveRegion); - } - - @Override - public boolean screenshotMultidisplayFocusChange() { return getValue(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE, FeatureFlags::screenshotMultidisplayFocusChange); @@ -1466,6 +1494,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean screenshotUiControllerRefactor() { + return getValue(Flags.FLAG_SCREENSHOT_UI_CONTROLLER_REFACTOR, + FeatureFlags::screenshotUiControllerRefactor); + } + + @Override + public boolean secondaryUserWidgetHost() { return getValue(Flags.FLAG_SECONDARY_USER_WIDGET_HOST, FeatureFlags::secondaryUserWidgetHost); @@ -1487,13 +1522,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean shadeHeaderBlurFontColor() { - return getValue(Flags.FLAG_SHADE_HEADER_BLUR_FONT_COLOR, - FeatureFlags::shadeHeaderBlurFontColor); - } - - @Override - public boolean shadeHeaderFontUpdate() { return getValue(Flags.FLAG_SHADE_HEADER_FONT_UPDATE, FeatureFlags::shadeHeaderFontUpdate); @@ -1501,9 +1529,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean shadeQsvisibleLogic() { - return getValue(Flags.FLAG_SHADE_QSVISIBLE_LOGIC, - FeatureFlags::shadeQsvisibleLogic); + public boolean shadeLaunchAccessibility() { + return getValue(Flags.FLAG_SHADE_LAUNCH_ACCESSIBILITY, + FeatureFlags::shadeLaunchAccessibility); } @Override @@ -1550,6 +1578,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean showToastWhenAppControlBrightness() { + return getValue(Flags.FLAG_SHOW_TOAST_WHEN_APP_CONTROL_BRIGHTNESS, + FeatureFlags::showToastWhenAppControlBrightness); + } + + @Override + public boolean simPinBouncerReset() { return getValue(Flags.FLAG_SIM_PIN_BOUNCER_RESET, FeatureFlags::simPinBouncerReset); @@ -1557,6 +1592,20 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean simPinRaceConditionOnRestart() { + return getValue(Flags.FLAG_SIM_PIN_RACE_CONDITION_ON_RESTART, + FeatureFlags::simPinRaceConditionOnRestart); + } + + @Override + + public boolean simPinUseSlotId() { + return getValue(Flags.FLAG_SIM_PIN_USE_SLOT_ID, + FeatureFlags::simPinUseSlotId); + } + + @Override + public boolean skipHideSensitiveNotifAnimation() { return getValue(Flags.FLAG_SKIP_HIDE_SENSITIVE_NOTIF_ANIMATION, FeatureFlags::skipHideSensitiveNotifAnimation); @@ -1564,6 +1613,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean sliceBroadcastRelayInBackground() { + return getValue(Flags.FLAG_SLICE_BROADCAST_RELAY_IN_BACKGROUND, + FeatureFlags::sliceBroadcastRelayInBackground); + } + + @Override + public boolean sliceManagerBinderCallBackground() { return getValue(Flags.FLAG_SLICE_MANAGER_BINDER_CALL_BACKGROUND, FeatureFlags::sliceManagerBinderCallBackground); @@ -1571,6 +1627,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean smartspaceLockscreenViewmodel() { + return getValue(Flags.FLAG_SMARTSPACE_LOCKSCREEN_VIEWMODEL, + FeatureFlags::smartspaceLockscreenViewmodel); + } + + @Override + public boolean smartspaceRelocateToBottom() { return getValue(Flags.FLAG_SMARTSPACE_RELOCATE_TO_BOTTOM, FeatureFlags::smartspaceRelocateToBottom); @@ -1578,6 +1641,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean smartspaceRemoteviewsRenderingFix() { + return getValue(Flags.FLAG_SMARTSPACE_REMOTEVIEWS_RENDERING_FIX, + FeatureFlags::smartspaceRemoteviewsRenderingFix); + } + + @Override + public boolean smartspaceSwipeEventLoggingFix() { return getValue(Flags.FLAG_SMARTSPACE_SWIPE_EVENT_LOGGING_FIX, FeatureFlags::smartspaceSwipeEventLoggingFix); @@ -1606,20 +1676,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean spatialModelBouncerPushback() { - return getValue(Flags.FLAG_SPATIAL_MODEL_BOUNCER_PUSHBACK, - FeatureFlags::spatialModelBouncerPushback); - } - - @Override - - public boolean spatialModelPushbackInShader() { - return getValue(Flags.FLAG_SPATIAL_MODEL_PUSHBACK_IN_SHADER, - FeatureFlags::spatialModelPushbackInShader); - } - - @Override - public boolean stabilizeHeadsUpGroupV2() { return getValue(Flags.FLAG_STABILIZE_HEADS_UP_GROUP_V2, FeatureFlags::stabilizeHeadsUpGroupV2); @@ -1634,16 +1690,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean statusBarAppHandleTracking() { - return getValue(Flags.FLAG_STATUS_BAR_APP_HANDLE_TRACKING, - FeatureFlags::statusBarAppHandleTracking); - } - - @Override - - public boolean statusBarChipToHunAnimation() { - return getValue(Flags.FLAG_STATUS_BAR_CHIP_TO_HUN_ANIMATION, - FeatureFlags::statusBarChipToHunAnimation); + public boolean statusBarAutoStartScreenRecordChip() { + return getValue(Flags.FLAG_STATUS_BAR_AUTO_START_SCREEN_RECORD_CHIP, + FeatureFlags::statusBarAutoStartScreenRecordChip); } @Override @@ -1676,6 +1725,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean statusBarMonochromeIconsFix() { + return getValue(Flags.FLAG_STATUS_BAR_MONOCHROME_ICONS_FIX, + FeatureFlags::statusBarMonochromeIconsFix); + } + + @Override + public boolean statusBarNoHunBehavior() { return getValue(Flags.FLAG_STATUS_BAR_NO_HUN_BEHAVIOR, FeatureFlags::statusBarNoHunBehavior); @@ -1690,13 +1746,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean statusBarPrivacyChipAnimationExemption() { - return getValue(Flags.FLAG_STATUS_BAR_PRIVACY_CHIP_ANIMATION_EXEMPTION, - FeatureFlags::statusBarPrivacyChipAnimationExemption); - } - - @Override - public boolean statusBarRootModernization() { return getValue(Flags.FLAG_STATUS_BAR_ROOT_MODERNIZATION, FeatureFlags::statusBarRootModernization); @@ -1704,9 +1753,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean statusBarRudimentaryBattery() { - return getValue(Flags.FLAG_STATUS_BAR_RUDIMENTARY_BATTERY, - FeatureFlags::statusBarRudimentaryBattery); + public boolean statusBarShowAudioOnlyProjectionChip() { + return getValue(Flags.FLAG_STATUS_BAR_SHOW_AUDIO_ONLY_PROJECTION_CHIP, + FeatureFlags::statusBarShowAudioOnlyProjectionChip); } @Override @@ -1732,6 +1781,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean statusBarStopUpdatingWindowHeight() { + return getValue(Flags.FLAG_STATUS_BAR_STOP_UPDATING_WINDOW_HEIGHT, + FeatureFlags::statusBarStopUpdatingWindowHeight); + } + + @Override + public boolean statusBarSwipeOverChip() { return getValue(Flags.FLAG_STATUS_BAR_SWIPE_OVER_CHIP, FeatureFlags::statusBarSwipeOverChip); @@ -1746,13 +1802,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean statusBarSystemStatusIconsInCompose() { - return getValue(Flags.FLAG_STATUS_BAR_SYSTEM_STATUS_ICONS_IN_COMPOSE, - FeatureFlags::statusBarSystemStatusIconsInCompose); - } - - @Override - public boolean statusBarUiThread() { return getValue(Flags.FLAG_STATUS_BAR_UI_THREAD, FeatureFlags::statusBarUiThread); @@ -1767,9 +1816,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean stuckHearingDevicesQsTileFix() { - return getValue(Flags.FLAG_STUCK_HEARING_DEVICES_QS_TILE_FIX, - FeatureFlags::stuckHearingDevicesQsTileFix); + public boolean stoppableFgsSystemApp() { + return getValue(Flags.FLAG_STOPPABLE_FGS_SYSTEM_APP, + FeatureFlags::stoppableFgsSystemApp); } @Override @@ -1795,16 +1844,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean thinScreenRecordingService() { - return getValue(Flags.FLAG_THIN_SCREEN_RECORDING_SERVICE, - FeatureFlags::thinScreenRecordingService); + public boolean transitionRaceCondition() { + return getValue(Flags.FLAG_TRANSITION_RACE_CONDITION, + FeatureFlags::transitionRaceCondition); } @Override - public boolean transitionRaceConditionPart2() { - return getValue(Flags.FLAG_TRANSITION_RACE_CONDITION_PART2, - FeatureFlags::transitionRaceConditionPart2); + public boolean translucentOccludingActivityFix() { + return getValue(Flags.FLAG_TRANSLUCENT_OCCLUDING_ACTIVITY_FIX, + FeatureFlags::translucentOccludingActivityFix); } @Override @@ -1816,16 +1865,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean udfpsScreenOffUnlockFlicker() { - return getValue(Flags.FLAG_UDFPS_SCREEN_OFF_UNLOCK_FLICKER, - FeatureFlags::udfpsScreenOffUnlockFlicker); - } - - @Override - - public boolean uiRichOngoingAodSkeletonBgInflation() { - return getValue(Flags.FLAG_UI_RICH_ONGOING_AOD_SKELETON_BG_INFLATION, - FeatureFlags::uiRichOngoingAodSkeletonBgInflation); + public boolean udfpsViewPerformance() { + return getValue(Flags.FLAG_UDFPS_VIEW_PERFORMANCE, + FeatureFlags::udfpsViewPerformance); } @Override @@ -1837,6 +1879,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean unfoldLatencyTrackingFix() { + return getValue(Flags.FLAG_UNFOLD_LATENCY_TRACKING_FIX, + FeatureFlags::unfoldLatencyTrackingFix); + } + + @Override + public boolean updateCornerRadiusOnDisplayChanged() { return getValue(Flags.FLAG_UPDATE_CORNER_RADIUS_ON_DISPLAY_CHANGED, FeatureFlags::updateCornerRadiusOnDisplayChanged); @@ -1858,9 +1907,37 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean useAadProxSensorIfPresent() { - return getValue(Flags.FLAG_USE_AAD_PROX_SENSOR_IF_PRESENT, - FeatureFlags::useAadProxSensorIfPresent); + public boolean useAadProxSensor() { + return getValue(Flags.FLAG_USE_AAD_PROX_SENSOR, + FeatureFlags::useAadProxSensor); + } + + @Override + + public boolean useNotifInflationThreadForFooter() { + return getValue(Flags.FLAG_USE_NOTIF_INFLATION_THREAD_FOR_FOOTER, + FeatureFlags::useNotifInflationThreadForFooter); + } + + @Override + + public boolean useNotifInflationThreadForRow() { + return getValue(Flags.FLAG_USE_NOTIF_INFLATION_THREAD_FOR_ROW, + FeatureFlags::useNotifInflationThreadForRow); + } + + @Override + + public boolean useTransitionsForKeyguardOccluded() { + return getValue(Flags.FLAG_USE_TRANSITIONS_FOR_KEYGUARD_OCCLUDED, + FeatureFlags::useTransitionsForKeyguardOccluded); + } + + @Override + + public boolean useVolumeController() { + return getValue(Flags.FLAG_USE_VOLUME_CONTROLLER, + FeatureFlags::useVolumeController); } @Override @@ -1918,29 +1995,31 @@ public class CustomFeatureFlags implements FeatureFlags { public List getFlagNames() { return Arrays.asList( Flags.FLAG_ACTIVITY_TRANSITION_USE_LARGEST_WINDOW, + Flags.FLAG_ADD_BLACK_BACKGROUND_FOR_WINDOW_MAGNIFIER, Flags.FLAG_ALWAYS_COMPOSE_QS_UI_FRAGMENT, Flags.FLAG_AMBIENT_TOUCH_MONITOR_LISTEN_TO_DISPLAY_CHANGES, - Flags.FLAG_ANIMATION_LIBRARY_DELAY_LEASH_CLEANUP, Flags.FLAG_APP_CLIPS_BACKLINKS, + Flags.FLAG_APP_SHORTCUT_REMOVAL_FIX, Flags.FLAG_AVALANCHE_REPLACE_HUN_WHEN_CRITICAL, - Flags.FLAG_BACK_BUTTON_ON_BOUNCER, - Flags.FLAG_BOUNCER_LIFECYCLE_FIX, + Flags.FLAG_BIND_KEYGUARD_MEDIA_VISIBILITY, Flags.FLAG_BOUNCER_UI_REVAMP, Flags.FLAG_BOUNCER_UI_REVAMP_2, Flags.FLAG_BP_COLORS, Flags.FLAG_BRIGHTNESS_SLIDER_FOCUS_STATE, + Flags.FLAG_CHECK_LOCKSCREEN_GONE_TRANSITION, Flags.FLAG_CLASSIC_FLAGS_MULTI_USER, - Flags.FLAG_CLIPBOARD_ANNOUNCE_LIVE_REGION, + Flags.FLAG_CLIPBOARD_IMAGE_TIMEOUT, + Flags.FLAG_CLIPBOARD_NONINTERACTIVE_ON_LOCKSCREEN, Flags.FLAG_CLIPBOARD_OVERLAY_MULTIUSER, + Flags.FLAG_CLIPBOARD_SHARED_TRANSITIONS, Flags.FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE, Flags.FLAG_CLOCK_FIDGET_ANIMATION, - Flags.FLAG_CLOCK_MODERNIZATION, Flags.FLAG_COMMUNAL_BOUNCER_DO_NOT_MODIFY_PLUGIN_OPEN, Flags.FLAG_COMMUNAL_EDIT_WIDGETS_ACTIVITY_FINISH_FIX, Flags.FLAG_COMMUNAL_HUB, Flags.FLAG_COMMUNAL_HUB_USE_THREAD_POOL_FOR_WIDGETS, Flags.FLAG_COMMUNAL_RESPONSIVE_GRID, - Flags.FLAG_COMMUNAL_SHADE_TOUCH_HANDLING_FIXES, + Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR, Flags.FLAG_COMMUNAL_STANDALONE_SUPPORT, Flags.FLAG_COMMUNAL_TIMER_FLICKER_FIX, Flags.FLAG_COMMUNAL_WIDGET_RESIZING, @@ -1950,34 +2029,29 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_CONT_AUTH_PLUGIN, Flags.FLAG_CONTEXTUAL_TIPS_ASSISTANT_DISMISS_FIX, Flags.FLAG_COROUTINE_TRACING, + Flags.FLAG_CREATE_WINDOWLESS_WINDOW_MAGNIFIER, + Flags.FLAG_DEBUG_LIVE_UPDATES_PROMOTE_ALL, Flags.FLAG_DECOUPLE_VIEW_CONTROLLER_IN_ANIMLIB, + Flags.FLAG_DELAY_SHOW_MAGNIFICATION_BUTTON, Flags.FLAG_DESKTOP_EFFECTS_QS_TILE, - Flags.FLAG_DESKTOP_SCREEN_CAPTURE, + Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR, + Flags.FLAG_DISABLE_BLURRED_SHADE_VISIBLE, Flags.FLAG_DISABLE_CONTEXTUAL_TIPS_FREQUENCY_CHECK, Flags.FLAG_DISABLE_CONTEXTUAL_TIPS_IOS_SWITCHER_CHECK, - Flags.FLAG_DISABLE_DOUBLE_CLICK_SWAP_ON_BOUNCER, - Flags.FLAG_DO_NOT_USE_IMMEDIATE_COROUTINE_DISPATCHER, + Flags.FLAG_DISABLE_SHADE_TRACKPAD_TWO_FINGER_SWIPE, Flags.FLAG_DOUBLE_TAP_TO_SLEEP, - Flags.FLAG_DREAM_BIOMETRIC_PROMPT_FIXES, Flags.FLAG_DREAM_INPUT_SESSION_PILFER_ONCE, Flags.FLAG_DREAM_OVERLAY_BOUNCER_SWIPE_DIRECTION_FILTERING, - Flags.FLAG_DREAM_OVERLAY_UPDATED_UI, - Flags.FLAG_DREAM_PREVIEW_TAP_DISMISS, - Flags.FLAG_DREAM_TRANSITION_FIXES, + Flags.FLAG_DREAM_OVERLAY_UPDATED_FONT, Flags.FLAG_EDGE_BACK_GESTURE_HANDLER_THREAD, Flags.FLAG_EDGEBACK_GESTURE_HANDLER_GET_RUNNING_TASKS_BACKGROUND, Flags.FLAG_ENABLE_BACKGROUND_KEYGUARD_ONDRAWN_CALLBACK, - Flags.FLAG_ENABLE_CONSTRAINT_LAYOUT_LOCKSCREEN_ON_EXTERNAL_DISPLAY, Flags.FLAG_ENABLE_CONTEXTUAL_TIP_FOR_MUTE_VOLUME, Flags.FLAG_ENABLE_CONTEXTUAL_TIP_FOR_POWER_OFF, Flags.FLAG_ENABLE_CONTEXTUAL_TIP_FOR_TAKE_SCREENSHOT, Flags.FLAG_ENABLE_CONTEXTUAL_TIPS, - Flags.FLAG_ENABLE_DESKTOP_GROWTH, Flags.FLAG_ENABLE_EFFICIENT_DISPLAY_REPOSITORY, Flags.FLAG_ENABLE_LAYOUT_TRACING, - Flags.FLAG_ENABLE_MINMODE, - Flags.FLAG_ENABLE_SUGGESTED_DEVICE_UI, - Flags.FLAG_ENABLE_TOP_UI_CONTROLLER, Flags.FLAG_ENABLE_UNDERLAY, Flags.FLAG_ENABLE_VIEW_CAPTURE_TRACING, Flags.FLAG_ENFORCE_BRIGHTNESS_BASE_USER_RESTRICTION, @@ -1986,52 +2060,61 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_EXPAND_HEADS_UP_ON_INLINE_REPLY, Flags.FLAG_EXPANDED_PRIVACY_INDICATORS_ON_LARGE_SCREEN, Flags.FLAG_EXTENDED_APPS_SHORTCUT_CATEGORY, + Flags.FLAG_FACE_MESSAGE_DEFER_UPDATE, Flags.FLAG_FACE_SCANNING_ANIMATION_NPE_FIX, + Flags.FLAG_FASTER_UNLOCK_TRANSITION, Flags.FLAG_FETCH_BOOKMARKS_XML_KEYBOARD_SHORTCUTS, - Flags.FLAG_FIX_DIALOG_LAUNCH_ANIMATION_JANK_LOGGING, + Flags.FLAG_FIX_IMAGE_WALLPAPER_CRASH_SURFACE_ALREADY_RELEASED, Flags.FLAG_FIX_SCREENSHOT_ACTION_DISMISS_SYSTEM_WINDOWS, - Flags.FLAG_FLASHLIGHT_STRENGTH, Flags.FLAG_FLOATING_MENU_ANIMATED_TUCK, + Flags.FLAG_FLOATING_MENU_DISPLAY_CUTOUT_SUPPORT, + Flags.FLAG_FLOATING_MENU_DRAG_TO_EDIT, Flags.FLAG_FLOATING_MENU_DRAG_TO_HIDE, Flags.FLAG_FLOATING_MENU_HEARING_DEVICE_STATUS_ICON, Flags.FLAG_FLOATING_MENU_IME_DISPLACEMENT_ANIMATION, + Flags.FLAG_FLOATING_MENU_NARROW_TARGET_CONTENT_OBSERVER, Flags.FLAG_FLOATING_MENU_NOTIFY_TARGETS_CHANGED_ON_STRICT_DIFF, Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG, Flags.FLAG_FLOATING_MENU_RADII_ANIMATION, - Flags.FLAG_FLOATING_MENU_REMOVE_FULLSCREEN_TAPS, Flags.FLAG_GET_CONNECTED_DEVICE_NAME_UNSYNCHRONIZED, Flags.FLAG_GLANCEABLE_HUB_ALLOW_KEYGUARD_WHEN_DREAMING, Flags.FLAG_GLANCEABLE_HUB_BLURRED_BACKGROUND, Flags.FLAG_GLANCEABLE_HUB_DIRECT_EDIT_MODE, Flags.FLAG_GLANCEABLE_HUB_V2, Flags.FLAG_GLANCEABLE_HUB_V2_RESOURCES, + Flags.FLAG_HAPTICS_FOR_COMPOSE_SLIDERS, Flags.FLAG_HARDWARE_COLOR_STYLES, Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG, Flags.FLAG_HEARING_DEVICES_DIALOG_RELATED_TOOLS, Flags.FLAG_HIDE_RINGER_BUTTON_IN_SINGLE_VOLUME_MODE, Flags.FLAG_HOME_CONTROLS_DREAM_HSUM, - Flags.FLAG_HSU_BEHAVIOR_CHANGES, - Flags.FLAG_HUB_BLURRED_BY_SHADE_FIX, Flags.FLAG_HUB_EDIT_MODE_TOUCH_ADJUSTMENTS, - Flags.FLAG_HUB_EDIT_MODE_TRANSITION, + Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE, + Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX, Flags.FLAG_ICON_REFRESH_2025, + Flags.FLAG_IGNORE_TOUCHES_NEXT_TO_NOTIFICATION_SHELF, Flags.FLAG_INDICATION_TEXT_A11Y_FIX, - Flags.FLAG_INSTANT_HIDE_SHADE, Flags.FLAG_KEYBOARD_DOCKING_INDICATOR, Flags.FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE, Flags.FLAG_KEYBOARD_SHORTCUT_HELPER_SHORTCUT_CUSTOMIZER, Flags.FLAG_KEYBOARD_TOUCHPAD_CONTEXTUAL_EDUCATION, Flags.FLAG_KEYGUARD_TRANSITION_FORCE_FINISH_ON_SCREEN_OFF, + Flags.FLAG_KEYGUARD_WM_REORDER_ATMS_CALLS, Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR, Flags.FLAG_LOCKSCREEN_FONT, Flags.FLAG_LOW_LIGHT_CLOCK_DREAM, - Flags.FLAG_LOWLIGHT_CLOCK_SET_BRIGHTNESS, - Flags.FLAG_LOWLIGHT_CLOCK_USES_KEYGUARD_CHARGING_STATUS, Flags.FLAG_MAGNETIC_NOTIFICATION_SWIPES, + Flags.FLAG_MEDIA_CONTROLS_A11Y_COLORS, Flags.FLAG_MEDIA_CONTROLS_BUTTON_MEDIA3, Flags.FLAG_MEDIA_CONTROLS_BUTTON_MEDIA3_PLACEMENT, - Flags.FLAG_MEDIA_CONTROLS_IN_COMPOSE, + Flags.FLAG_MEDIA_CONTROLS_DEVICE_MANAGER_BACKGROUND_EXECUTION, + Flags.FLAG_MEDIA_CONTROLS_DRAWABLES_REUSE_BUGFIX, + Flags.FLAG_MEDIA_CONTROLS_LOCKSCREEN_SHADE_BUG_FIX, Flags.FLAG_MEDIA_CONTROLS_UI_UPDATE, + Flags.FLAG_MEDIA_CONTROLS_UMO_INFLATION_IN_BACKGROUND, + Flags.FLAG_MEDIA_CONTROLS_USER_INITIATED_DELETEINTENT, + Flags.FLAG_MEDIA_LOAD_METADATA_VIA_MEDIA_DATA_LOADER, + Flags.FLAG_MEDIA_LOCKSCREEN_LAUNCH_ANIMATION, Flags.FLAG_MEDIA_PROJECTION_DIALOG_BEHIND_LOCKSCREEN, Flags.FLAG_MEDIA_PROJECTION_GREY_ERROR_TEXT, Flags.FLAG_MEDIA_PROJECTION_REQUEST_ATTRIBUTION_FIX, @@ -2040,7 +2123,6 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_MSDL_FEEDBACK, Flags.FLAG_MULTIUSER_WIFI_PICKER_TRACKER_SUPPORT, Flags.FLAG_NEW_AOD_TRANSITION, - Flags.FLAG_NEW_DOZING_KEYGUARD_STATES, Flags.FLAG_NEW_VOLUME_PANEL, Flags.FLAG_NON_TOUCHSCREEN_DEVICES_BYPASS_FALSING, Flags.FLAG_NOTES_ROLE_QS_TILE, @@ -2057,27 +2139,31 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_NOTIFICATION_COLOR_UPDATE_LOGGER, Flags.FLAG_NOTIFICATION_CONTENT_ALPHA_OPTIMIZATION, Flags.FLAG_NOTIFICATION_FOOTER_BACKGROUND_TINT_OPTIMIZATION, + Flags.FLAG_NOTIFICATION_OVER_EXPANSION_CLIPPING_FIX, + Flags.FLAG_NOTIFICATION_REENTRANT_DISMISS, Flags.FLAG_NOTIFICATION_ROW_ACCESSIBILITY_EXPANDED, Flags.FLAG_NOTIFICATION_ROW_CONTENT_BINDER_REFACTOR, Flags.FLAG_NOTIFICATION_ROW_TRANSPARENCY, + Flags.FLAG_NOTIFICATION_ROW_USER_CONTEXT, Flags.FLAG_NOTIFICATION_SHADE_BLUR, - Flags.FLAG_NOTIFICATION_SHADE_CLOSE_WAITS_FOR_CHILD_ANIMATIONS, Flags.FLAG_NOTIFICATION_SHADE_UI_THREAD, Flags.FLAG_NOTIFICATION_SKIP_SILENT_UPDATES, Flags.FLAG_NOTIFICATION_TRANSPARENT_HEADER_FIX, + Flags.FLAG_NOTIFICATION_VIEW_FLIPPER_PAUSING_V2, Flags.FLAG_NOTIFICATIONS_BACKGROUND_ICONS, Flags.FLAG_NOTIFICATIONS_FOOTER_VISIBILITY_FIX, Flags.FLAG_NOTIFICATIONS_HIDE_ON_DISPLAY_SWITCH, - Flags.FLAG_NOTIFICATIONS_HUN_ACCESSIBILITY_REFACTOR, Flags.FLAG_NOTIFICATIONS_HUN_SHARED_ANIMATION_VALUES, Flags.FLAG_NOTIFICATIONS_ICON_CONTAINER_REFACTOR, Flags.FLAG_NOTIFICATIONS_LAUNCH_RADIUS, Flags.FLAG_NOTIFICATIONS_LIVE_DATA_STORE_REFACTOR, Flags.FLAG_NOTIFICATIONS_PINNED_HUN_IN_SHADE, Flags.FLAG_NOTIFICATIONS_REDESIGN_FOOTER_VIEW, + Flags.FLAG_NOTIFICATIONS_REDESIGN_GUTS, Flags.FLAG_NOTIFY_PASSWORD_TEXT_VIEW_USER_ACTIVITY_IN_BACKGROUND, Flags.FLAG_NOTIFY_POWER_MANAGER_USER_ACTIVITY_BACKGROUND, - Flags.FLAG_ONGOING_ACTIVITY_CHIPS_ON_DREAM, + Flags.FLAG_ONLY_SHOW_MEDIA_STREAM_SLIDER_IN_SINGLE_VOLUME_MODE, + Flags.FLAG_OUTPUT_SWITCHER_REDESIGN, Flags.FLAG_OVERRIDE_SUPPRESS_OVERLAY_CONDITION, Flags.FLAG_PERMISSION_HELPER_INLINE_UI_RICH_ONGOING, Flags.FLAG_PERMISSION_HELPER_UI_RICH_ONGOING, @@ -2085,102 +2171,104 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_PIN_INPUT_FIELD_STYLED_FOCUS_STATE, Flags.FLAG_PREDICTIVE_BACK_ANIMATE_SHADE, Flags.FLAG_PREDICTIVE_BACK_DELAY_WM_TRANSITION, - Flags.FLAG_PRIVACY_DOT_LIVE_REGION, + Flags.FLAG_PRIORITY_PEOPLE_SECTION, Flags.FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY, + Flags.FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN, Flags.FLAG_PSS_TASK_SWITCHER, - Flags.FLAG_QS_COMPOSE_FRAGMENT_EARLY_EXPANSION, - Flags.FLAG_QS_EDIT_MODE_TABS, - Flags.FLAG_QS_EDIT_MODE_TOOLTIP, + Flags.FLAG_QS_CUSTOM_TILE_CLICK_GUARANTEED_BUG_FIX, Flags.FLAG_QS_NEW_TILES, Flags.FLAG_QS_NEW_TILES_FUTURE, + Flags.FLAG_QS_QUICK_REBIND_ACTIVE_TILES, + Flags.FLAG_QS_REGISTER_SETTING_OBSERVER_ON_BG_THREAD, Flags.FLAG_QS_TILE_DETAILED_VIEW, Flags.FLAG_QS_TILE_FOCUS_STATE, - Flags.FLAG_QS_TILE_TRANSITION_INTERACTION_REFINEMENT, Flags.FLAG_QS_UI_REFACTOR, Flags.FLAG_QS_UI_REFACTOR_COMPOSE_FRAGMENT, - Flags.FLAG_QS_WIFI_CONFIG, Flags.FLAG_RECORD_ISSUE_QS_TILE, Flags.FLAG_REDESIGN_MAGNIFICATION_WINDOW_SIZE, + Flags.FLAG_REFACTOR_GET_CURRENT_USER, Flags.FLAG_REGISTER_BATTERY_CONTROLLER_RECEIVERS_IN_CORESTARTABLE, Flags.FLAG_REGISTER_CONTENT_OBSERVERS_ASYNC, Flags.FLAG_REGISTER_NEW_WALLET_CARD_IN_BACKGROUND, Flags.FLAG_REGISTER_WALLPAPER_NOTIFIER_BACKGROUND, - Flags.FLAG_REMEMBER_VIEW_MODEL_OFF_MAIN_THREAD, - Flags.FLAG_REMOVE_AOD_CAR_MODE, + Flags.FLAG_RELOCK_WITH_POWER_BUTTON_IMMEDIATELY, Flags.FLAG_REMOVE_DREAM_OVERLAY_HIDE_ON_TOUCH, - Flags.FLAG_REMOVE_NEARBY_SHARE_TILE_ANIMATION, Flags.FLAG_REMOVE_UPDATE_LISTENER_IN_QS_ICON_VIEW_IMPL, Flags.FLAG_REST_TO_UNLOCK, Flags.FLAG_RESTART_DREAM_ON_UNOCCLUDE, - Flags.FLAG_RESTRICT_COMMUNAL_APP_WIDGET_HOST_LISTENING, Flags.FLAG_REVAMPED_BOUNCER_MESSAGES, Flags.FLAG_RUN_FINGERPRINT_DETECT_ON_DISMISSIBLE_KEYGUARD, Flags.FLAG_SAVE_AND_RESTORE_MAGNIFICATION_SETTINGS_BUTTONS, Flags.FLAG_SCENE_CONTAINER, - Flags.FLAG_SCREEN_REACTIONS, Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX, Flags.FLAG_SCREENSHOT_ACTION_DISMISS_SYSTEM_WINDOWS, - Flags.FLAG_SCREENSHOT_ANNOUNCE_LIVE_REGION, Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE, Flags.FLAG_SCREENSHOT_POLICY_SPLIT_AND_DESKTOP_MODE, Flags.FLAG_SCREENSHOT_SCROLL_CROP_VIEW_CRASH_FIX, + Flags.FLAG_SCREENSHOT_UI_CONTROLLER_REFACTOR, Flags.FLAG_SECONDARY_USER_WIDGET_HOST, Flags.FLAG_SETTINGS_EXT_REGISTER_CONTENT_OBSERVER_ON_BG_THREAD, Flags.FLAG_SHADE_EXPANDS_ON_STATUS_BAR_LONG_PRESS, - Flags.FLAG_SHADE_HEADER_BLUR_FONT_COLOR, Flags.FLAG_SHADE_HEADER_FONT_UPDATE, - Flags.FLAG_SHADE_QSVISIBLE_LOGIC, + Flags.FLAG_SHADE_LAUNCH_ACCESSIBILITY, Flags.FLAG_SHADE_WINDOW_GOES_AROUND, Flags.FLAG_SHADERLIB_LOADING_EFFECT_REFACTOR, Flags.FLAG_SHORTCUT_HELPER_KEY_GLYPH, Flags.FLAG_SHOW_AUDIO_SHARING_SLIDER_IN_VOLUME_PANEL, Flags.FLAG_SHOW_CLIPBOARD_INDICATION, Flags.FLAG_SHOW_LOCKED_BY_YOUR_WATCH_KEYGUARD_INDICATOR, + Flags.FLAG_SHOW_TOAST_WHEN_APP_CONTROL_BRIGHTNESS, Flags.FLAG_SIM_PIN_BOUNCER_RESET, + Flags.FLAG_SIM_PIN_RACE_CONDITION_ON_RESTART, + Flags.FLAG_SIM_PIN_USE_SLOT_ID, Flags.FLAG_SKIP_HIDE_SENSITIVE_NOTIF_ANIMATION, + Flags.FLAG_SLICE_BROADCAST_RELAY_IN_BACKGROUND, Flags.FLAG_SLICE_MANAGER_BINDER_CALL_BACKGROUND, + Flags.FLAG_SMARTSPACE_LOCKSCREEN_VIEWMODEL, Flags.FLAG_SMARTSPACE_RELOCATE_TO_BOTTOM, + Flags.FLAG_SMARTSPACE_REMOTEVIEWS_RENDERING_FIX, Flags.FLAG_SMARTSPACE_SWIPE_EVENT_LOGGING_FIX, Flags.FLAG_SMARTSPACE_VIEWPAGER2, Flags.FLAG_SOUNDDOSE_CUSTOMIZATION, Flags.FLAG_SPATIAL_MODEL_APP_PUSHBACK, - Flags.FLAG_SPATIAL_MODEL_BOUNCER_PUSHBACK, - Flags.FLAG_SPATIAL_MODEL_PUSHBACK_IN_SHADER, Flags.FLAG_STABILIZE_HEADS_UP_GROUP_V2, Flags.FLAG_STATUS_BAR_ALWAYS_CHECK_UNDERLYING_NETWORKS, - Flags.FLAG_STATUS_BAR_APP_HANDLE_TRACKING, - Flags.FLAG_STATUS_BAR_CHIP_TO_HUN_ANIMATION, + Flags.FLAG_STATUS_BAR_AUTO_START_SCREEN_RECORD_CHIP, Flags.FLAG_STATUS_BAR_CHIPS_MODERNIZATION, Flags.FLAG_STATUS_BAR_CHIPS_RETURN_ANIMATIONS, Flags.FLAG_STATUS_BAR_FONT_UPDATES, Flags.FLAG_STATUS_BAR_MOBILE_ICON_KAIROS, + Flags.FLAG_STATUS_BAR_MONOCHROME_ICONS_FIX, Flags.FLAG_STATUS_BAR_NO_HUN_BEHAVIOR, Flags.FLAG_STATUS_BAR_POPUP_CHIPS, - Flags.FLAG_STATUS_BAR_PRIVACY_CHIP_ANIMATION_EXEMPTION, Flags.FLAG_STATUS_BAR_ROOT_MODERNIZATION, - Flags.FLAG_STATUS_BAR_RUDIMENTARY_BATTERY, + Flags.FLAG_STATUS_BAR_SHOW_AUDIO_ONLY_PROJECTION_CHIP, Flags.FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR, Flags.FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR_ETHERNET, Flags.FLAG_STATUS_BAR_STATIC_INOUT_INDICATORS, + Flags.FLAG_STATUS_BAR_STOP_UPDATING_WINDOW_HEIGHT, Flags.FLAG_STATUS_BAR_SWIPE_OVER_CHIP, Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN, - Flags.FLAG_STATUS_BAR_SYSTEM_STATUS_ICONS_IN_COMPOSE, Flags.FLAG_STATUS_BAR_UI_THREAD, Flags.FLAG_STATUS_BAR_WINDOW_NO_CUSTOM_TOUCH, - Flags.FLAG_STUCK_HEARING_DEVICES_QS_TILE_FIX, + Flags.FLAG_STOPPABLE_FGS_SYSTEM_APP, Flags.FLAG_SWITCH_USER_ON_BG, Flags.FLAG_SYSUI_TEAMFOOD, Flags.FLAG_THEME_OVERLAY_CONTROLLER_WAKEFULNESS_DEPRECATION, - Flags.FLAG_THIN_SCREEN_RECORDING_SERVICE, - Flags.FLAG_TRANSITION_RACE_CONDITION_PART2, + Flags.FLAG_TRANSITION_RACE_CONDITION, + Flags.FLAG_TRANSLUCENT_OCCLUDING_ACTIVITY_FIX, Flags.FLAG_TV_GLOBAL_ACTIONS_FOCUS, - Flags.FLAG_UDFPS_SCREEN_OFF_UNLOCK_FLICKER, - Flags.FLAG_UI_RICH_ONGOING_AOD_SKELETON_BG_INFLATION, + Flags.FLAG_UDFPS_VIEW_PERFORMANCE, Flags.FLAG_UNFOLD_ANIMATION_BACKGROUND_PROGRESS, + Flags.FLAG_UNFOLD_LATENCY_TRACKING_FIX, Flags.FLAG_UPDATE_CORNER_RADIUS_ON_DISPLAY_CHANGED, Flags.FLAG_UPDATE_USER_SWITCHER_BACKGROUND, Flags.FLAG_UPDATE_WINDOW_MAGNIFIER_BOTTOM_BOUNDARY, - Flags.FLAG_USE_AAD_PROX_SENSOR_IF_PRESENT, + Flags.FLAG_USE_AAD_PROX_SENSOR, + Flags.FLAG_USE_NOTIF_INFLATION_THREAD_FOR_FOOTER, + Flags.FLAG_USE_NOTIF_INFLATION_THREAD_FOR_ROW, + Flags.FLAG_USE_TRANSITIONS_FOR_KEYGUARD_OCCLUDED, + Flags.FLAG_USE_VOLUME_CONTROLLER, Flags.FLAG_USER_AWARE_SETTINGS_REPOSITORIES, Flags.FLAG_USER_ENCRYPTED_SOURCE, Flags.FLAG_USER_SWITCHER_ADD_SIGN_OUT_OPTION, @@ -2192,29 +2280,31 @@ public class CustomFeatureFlags implements FeatureFlags { private Set mReadOnlyFlagsSet = new HashSet<>( Arrays.asList( Flags.FLAG_ACTIVITY_TRANSITION_USE_LARGEST_WINDOW, + Flags.FLAG_ADD_BLACK_BACKGROUND_FOR_WINDOW_MAGNIFIER, Flags.FLAG_ALWAYS_COMPOSE_QS_UI_FRAGMENT, Flags.FLAG_AMBIENT_TOUCH_MONITOR_LISTEN_TO_DISPLAY_CHANGES, - Flags.FLAG_ANIMATION_LIBRARY_DELAY_LEASH_CLEANUP, Flags.FLAG_APP_CLIPS_BACKLINKS, + Flags.FLAG_APP_SHORTCUT_REMOVAL_FIX, Flags.FLAG_AVALANCHE_REPLACE_HUN_WHEN_CRITICAL, - Flags.FLAG_BACK_BUTTON_ON_BOUNCER, - Flags.FLAG_BOUNCER_LIFECYCLE_FIX, + Flags.FLAG_BIND_KEYGUARD_MEDIA_VISIBILITY, Flags.FLAG_BOUNCER_UI_REVAMP, Flags.FLAG_BOUNCER_UI_REVAMP_2, Flags.FLAG_BP_COLORS, Flags.FLAG_BRIGHTNESS_SLIDER_FOCUS_STATE, + Flags.FLAG_CHECK_LOCKSCREEN_GONE_TRANSITION, Flags.FLAG_CLASSIC_FLAGS_MULTI_USER, - Flags.FLAG_CLIPBOARD_ANNOUNCE_LIVE_REGION, + Flags.FLAG_CLIPBOARD_IMAGE_TIMEOUT, + Flags.FLAG_CLIPBOARD_NONINTERACTIVE_ON_LOCKSCREEN, Flags.FLAG_CLIPBOARD_OVERLAY_MULTIUSER, + Flags.FLAG_CLIPBOARD_SHARED_TRANSITIONS, Flags.FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE, Flags.FLAG_CLOCK_FIDGET_ANIMATION, - Flags.FLAG_CLOCK_MODERNIZATION, Flags.FLAG_COMMUNAL_BOUNCER_DO_NOT_MODIFY_PLUGIN_OPEN, Flags.FLAG_COMMUNAL_EDIT_WIDGETS_ACTIVITY_FINISH_FIX, Flags.FLAG_COMMUNAL_HUB, Flags.FLAG_COMMUNAL_HUB_USE_THREAD_POOL_FOR_WIDGETS, Flags.FLAG_COMMUNAL_RESPONSIVE_GRID, - Flags.FLAG_COMMUNAL_SHADE_TOUCH_HANDLING_FIXES, + Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR, Flags.FLAG_COMMUNAL_STANDALONE_SUPPORT, Flags.FLAG_COMMUNAL_TIMER_FLICKER_FIX, Flags.FLAG_COMMUNAL_WIDGET_RESIZING, @@ -2224,34 +2314,29 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_CONT_AUTH_PLUGIN, Flags.FLAG_CONTEXTUAL_TIPS_ASSISTANT_DISMISS_FIX, Flags.FLAG_COROUTINE_TRACING, + Flags.FLAG_CREATE_WINDOWLESS_WINDOW_MAGNIFIER, + Flags.FLAG_DEBUG_LIVE_UPDATES_PROMOTE_ALL, Flags.FLAG_DECOUPLE_VIEW_CONTROLLER_IN_ANIMLIB, + Flags.FLAG_DELAY_SHOW_MAGNIFICATION_BUTTON, Flags.FLAG_DESKTOP_EFFECTS_QS_TILE, - Flags.FLAG_DESKTOP_SCREEN_CAPTURE, + Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR, + Flags.FLAG_DISABLE_BLURRED_SHADE_VISIBLE, Flags.FLAG_DISABLE_CONTEXTUAL_TIPS_FREQUENCY_CHECK, Flags.FLAG_DISABLE_CONTEXTUAL_TIPS_IOS_SWITCHER_CHECK, - Flags.FLAG_DISABLE_DOUBLE_CLICK_SWAP_ON_BOUNCER, - Flags.FLAG_DO_NOT_USE_IMMEDIATE_COROUTINE_DISPATCHER, + Flags.FLAG_DISABLE_SHADE_TRACKPAD_TWO_FINGER_SWIPE, Flags.FLAG_DOUBLE_TAP_TO_SLEEP, - Flags.FLAG_DREAM_BIOMETRIC_PROMPT_FIXES, Flags.FLAG_DREAM_INPUT_SESSION_PILFER_ONCE, Flags.FLAG_DREAM_OVERLAY_BOUNCER_SWIPE_DIRECTION_FILTERING, - Flags.FLAG_DREAM_OVERLAY_UPDATED_UI, - Flags.FLAG_DREAM_PREVIEW_TAP_DISMISS, - Flags.FLAG_DREAM_TRANSITION_FIXES, + Flags.FLAG_DREAM_OVERLAY_UPDATED_FONT, Flags.FLAG_EDGE_BACK_GESTURE_HANDLER_THREAD, Flags.FLAG_EDGEBACK_GESTURE_HANDLER_GET_RUNNING_TASKS_BACKGROUND, Flags.FLAG_ENABLE_BACKGROUND_KEYGUARD_ONDRAWN_CALLBACK, - Flags.FLAG_ENABLE_CONSTRAINT_LAYOUT_LOCKSCREEN_ON_EXTERNAL_DISPLAY, Flags.FLAG_ENABLE_CONTEXTUAL_TIP_FOR_MUTE_VOLUME, Flags.FLAG_ENABLE_CONTEXTUAL_TIP_FOR_POWER_OFF, Flags.FLAG_ENABLE_CONTEXTUAL_TIP_FOR_TAKE_SCREENSHOT, Flags.FLAG_ENABLE_CONTEXTUAL_TIPS, - Flags.FLAG_ENABLE_DESKTOP_GROWTH, Flags.FLAG_ENABLE_EFFICIENT_DISPLAY_REPOSITORY, Flags.FLAG_ENABLE_LAYOUT_TRACING, - Flags.FLAG_ENABLE_MINMODE, - Flags.FLAG_ENABLE_SUGGESTED_DEVICE_UI, - Flags.FLAG_ENABLE_TOP_UI_CONTROLLER, Flags.FLAG_ENABLE_UNDERLAY, Flags.FLAG_ENABLE_VIEW_CAPTURE_TRACING, Flags.FLAG_ENFORCE_BRIGHTNESS_BASE_USER_RESTRICTION, @@ -2260,52 +2345,61 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_EXPAND_HEADS_UP_ON_INLINE_REPLY, Flags.FLAG_EXPANDED_PRIVACY_INDICATORS_ON_LARGE_SCREEN, Flags.FLAG_EXTENDED_APPS_SHORTCUT_CATEGORY, + Flags.FLAG_FACE_MESSAGE_DEFER_UPDATE, Flags.FLAG_FACE_SCANNING_ANIMATION_NPE_FIX, + Flags.FLAG_FASTER_UNLOCK_TRANSITION, Flags.FLAG_FETCH_BOOKMARKS_XML_KEYBOARD_SHORTCUTS, - Flags.FLAG_FIX_DIALOG_LAUNCH_ANIMATION_JANK_LOGGING, + Flags.FLAG_FIX_IMAGE_WALLPAPER_CRASH_SURFACE_ALREADY_RELEASED, Flags.FLAG_FIX_SCREENSHOT_ACTION_DISMISS_SYSTEM_WINDOWS, - Flags.FLAG_FLASHLIGHT_STRENGTH, Flags.FLAG_FLOATING_MENU_ANIMATED_TUCK, + Flags.FLAG_FLOATING_MENU_DISPLAY_CUTOUT_SUPPORT, + Flags.FLAG_FLOATING_MENU_DRAG_TO_EDIT, Flags.FLAG_FLOATING_MENU_DRAG_TO_HIDE, Flags.FLAG_FLOATING_MENU_HEARING_DEVICE_STATUS_ICON, Flags.FLAG_FLOATING_MENU_IME_DISPLACEMENT_ANIMATION, + Flags.FLAG_FLOATING_MENU_NARROW_TARGET_CONTENT_OBSERVER, Flags.FLAG_FLOATING_MENU_NOTIFY_TARGETS_CHANGED_ON_STRICT_DIFF, Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG, Flags.FLAG_FLOATING_MENU_RADII_ANIMATION, - Flags.FLAG_FLOATING_MENU_REMOVE_FULLSCREEN_TAPS, Flags.FLAG_GET_CONNECTED_DEVICE_NAME_UNSYNCHRONIZED, Flags.FLAG_GLANCEABLE_HUB_ALLOW_KEYGUARD_WHEN_DREAMING, Flags.FLAG_GLANCEABLE_HUB_BLURRED_BACKGROUND, Flags.FLAG_GLANCEABLE_HUB_DIRECT_EDIT_MODE, Flags.FLAG_GLANCEABLE_HUB_V2, Flags.FLAG_GLANCEABLE_HUB_V2_RESOURCES, + Flags.FLAG_HAPTICS_FOR_COMPOSE_SLIDERS, Flags.FLAG_HARDWARE_COLOR_STYLES, Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG, Flags.FLAG_HEARING_DEVICES_DIALOG_RELATED_TOOLS, Flags.FLAG_HIDE_RINGER_BUTTON_IN_SINGLE_VOLUME_MODE, Flags.FLAG_HOME_CONTROLS_DREAM_HSUM, - Flags.FLAG_HSU_BEHAVIOR_CHANGES, - Flags.FLAG_HUB_BLURRED_BY_SHADE_FIX, Flags.FLAG_HUB_EDIT_MODE_TOUCH_ADJUSTMENTS, - Flags.FLAG_HUB_EDIT_MODE_TRANSITION, + Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE, + Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX, Flags.FLAG_ICON_REFRESH_2025, + Flags.FLAG_IGNORE_TOUCHES_NEXT_TO_NOTIFICATION_SHELF, Flags.FLAG_INDICATION_TEXT_A11Y_FIX, - Flags.FLAG_INSTANT_HIDE_SHADE, Flags.FLAG_KEYBOARD_DOCKING_INDICATOR, Flags.FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE, Flags.FLAG_KEYBOARD_SHORTCUT_HELPER_SHORTCUT_CUSTOMIZER, Flags.FLAG_KEYBOARD_TOUCHPAD_CONTEXTUAL_EDUCATION, Flags.FLAG_KEYGUARD_TRANSITION_FORCE_FINISH_ON_SCREEN_OFF, + Flags.FLAG_KEYGUARD_WM_REORDER_ATMS_CALLS, Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR, Flags.FLAG_LOCKSCREEN_FONT, Flags.FLAG_LOW_LIGHT_CLOCK_DREAM, - Flags.FLAG_LOWLIGHT_CLOCK_SET_BRIGHTNESS, - Flags.FLAG_LOWLIGHT_CLOCK_USES_KEYGUARD_CHARGING_STATUS, Flags.FLAG_MAGNETIC_NOTIFICATION_SWIPES, + Flags.FLAG_MEDIA_CONTROLS_A11Y_COLORS, Flags.FLAG_MEDIA_CONTROLS_BUTTON_MEDIA3, Flags.FLAG_MEDIA_CONTROLS_BUTTON_MEDIA3_PLACEMENT, - Flags.FLAG_MEDIA_CONTROLS_IN_COMPOSE, + Flags.FLAG_MEDIA_CONTROLS_DEVICE_MANAGER_BACKGROUND_EXECUTION, + Flags.FLAG_MEDIA_CONTROLS_DRAWABLES_REUSE_BUGFIX, + Flags.FLAG_MEDIA_CONTROLS_LOCKSCREEN_SHADE_BUG_FIX, Flags.FLAG_MEDIA_CONTROLS_UI_UPDATE, + Flags.FLAG_MEDIA_CONTROLS_UMO_INFLATION_IN_BACKGROUND, + Flags.FLAG_MEDIA_CONTROLS_USER_INITIATED_DELETEINTENT, + Flags.FLAG_MEDIA_LOAD_METADATA_VIA_MEDIA_DATA_LOADER, + Flags.FLAG_MEDIA_LOCKSCREEN_LAUNCH_ANIMATION, Flags.FLAG_MEDIA_PROJECTION_DIALOG_BEHIND_LOCKSCREEN, Flags.FLAG_MEDIA_PROJECTION_GREY_ERROR_TEXT, Flags.FLAG_MEDIA_PROJECTION_REQUEST_ATTRIBUTION_FIX, @@ -2314,7 +2408,6 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_MSDL_FEEDBACK, Flags.FLAG_MULTIUSER_WIFI_PICKER_TRACKER_SUPPORT, Flags.FLAG_NEW_AOD_TRANSITION, - Flags.FLAG_NEW_DOZING_KEYGUARD_STATES, Flags.FLAG_NEW_VOLUME_PANEL, Flags.FLAG_NON_TOUCHSCREEN_DEVICES_BYPASS_FALSING, Flags.FLAG_NOTES_ROLE_QS_TILE, @@ -2331,27 +2424,31 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_NOTIFICATION_COLOR_UPDATE_LOGGER, Flags.FLAG_NOTIFICATION_CONTENT_ALPHA_OPTIMIZATION, Flags.FLAG_NOTIFICATION_FOOTER_BACKGROUND_TINT_OPTIMIZATION, + Flags.FLAG_NOTIFICATION_OVER_EXPANSION_CLIPPING_FIX, + Flags.FLAG_NOTIFICATION_REENTRANT_DISMISS, Flags.FLAG_NOTIFICATION_ROW_ACCESSIBILITY_EXPANDED, Flags.FLAG_NOTIFICATION_ROW_CONTENT_BINDER_REFACTOR, Flags.FLAG_NOTIFICATION_ROW_TRANSPARENCY, + Flags.FLAG_NOTIFICATION_ROW_USER_CONTEXT, Flags.FLAG_NOTIFICATION_SHADE_BLUR, - Flags.FLAG_NOTIFICATION_SHADE_CLOSE_WAITS_FOR_CHILD_ANIMATIONS, Flags.FLAG_NOTIFICATION_SHADE_UI_THREAD, Flags.FLAG_NOTIFICATION_SKIP_SILENT_UPDATES, Flags.FLAG_NOTIFICATION_TRANSPARENT_HEADER_FIX, + Flags.FLAG_NOTIFICATION_VIEW_FLIPPER_PAUSING_V2, Flags.FLAG_NOTIFICATIONS_BACKGROUND_ICONS, Flags.FLAG_NOTIFICATIONS_FOOTER_VISIBILITY_FIX, Flags.FLAG_NOTIFICATIONS_HIDE_ON_DISPLAY_SWITCH, - Flags.FLAG_NOTIFICATIONS_HUN_ACCESSIBILITY_REFACTOR, Flags.FLAG_NOTIFICATIONS_HUN_SHARED_ANIMATION_VALUES, Flags.FLAG_NOTIFICATIONS_ICON_CONTAINER_REFACTOR, Flags.FLAG_NOTIFICATIONS_LAUNCH_RADIUS, Flags.FLAG_NOTIFICATIONS_LIVE_DATA_STORE_REFACTOR, Flags.FLAG_NOTIFICATIONS_PINNED_HUN_IN_SHADE, Flags.FLAG_NOTIFICATIONS_REDESIGN_FOOTER_VIEW, + Flags.FLAG_NOTIFICATIONS_REDESIGN_GUTS, Flags.FLAG_NOTIFY_PASSWORD_TEXT_VIEW_USER_ACTIVITY_IN_BACKGROUND, Flags.FLAG_NOTIFY_POWER_MANAGER_USER_ACTIVITY_BACKGROUND, - Flags.FLAG_ONGOING_ACTIVITY_CHIPS_ON_DREAM, + Flags.FLAG_ONLY_SHOW_MEDIA_STREAM_SLIDER_IN_SINGLE_VOLUME_MODE, + Flags.FLAG_OUTPUT_SWITCHER_REDESIGN, Flags.FLAG_OVERRIDE_SUPPRESS_OVERLAY_CONDITION, Flags.FLAG_PERMISSION_HELPER_INLINE_UI_RICH_ONGOING, Flags.FLAG_PERMISSION_HELPER_UI_RICH_ONGOING, @@ -2359,102 +2456,104 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_PIN_INPUT_FIELD_STYLED_FOCUS_STATE, Flags.FLAG_PREDICTIVE_BACK_ANIMATE_SHADE, Flags.FLAG_PREDICTIVE_BACK_DELAY_WM_TRANSITION, - Flags.FLAG_PRIVACY_DOT_LIVE_REGION, + Flags.FLAG_PRIORITY_PEOPLE_SECTION, Flags.FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY, + Flags.FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN, Flags.FLAG_PSS_TASK_SWITCHER, - Flags.FLAG_QS_COMPOSE_FRAGMENT_EARLY_EXPANSION, - Flags.FLAG_QS_EDIT_MODE_TABS, - Flags.FLAG_QS_EDIT_MODE_TOOLTIP, + Flags.FLAG_QS_CUSTOM_TILE_CLICK_GUARANTEED_BUG_FIX, Flags.FLAG_QS_NEW_TILES, Flags.FLAG_QS_NEW_TILES_FUTURE, + Flags.FLAG_QS_QUICK_REBIND_ACTIVE_TILES, + Flags.FLAG_QS_REGISTER_SETTING_OBSERVER_ON_BG_THREAD, Flags.FLAG_QS_TILE_DETAILED_VIEW, Flags.FLAG_QS_TILE_FOCUS_STATE, - Flags.FLAG_QS_TILE_TRANSITION_INTERACTION_REFINEMENT, Flags.FLAG_QS_UI_REFACTOR, Flags.FLAG_QS_UI_REFACTOR_COMPOSE_FRAGMENT, - Flags.FLAG_QS_WIFI_CONFIG, Flags.FLAG_RECORD_ISSUE_QS_TILE, Flags.FLAG_REDESIGN_MAGNIFICATION_WINDOW_SIZE, + Flags.FLAG_REFACTOR_GET_CURRENT_USER, Flags.FLAG_REGISTER_BATTERY_CONTROLLER_RECEIVERS_IN_CORESTARTABLE, Flags.FLAG_REGISTER_CONTENT_OBSERVERS_ASYNC, Flags.FLAG_REGISTER_NEW_WALLET_CARD_IN_BACKGROUND, Flags.FLAG_REGISTER_WALLPAPER_NOTIFIER_BACKGROUND, - Flags.FLAG_REMEMBER_VIEW_MODEL_OFF_MAIN_THREAD, - Flags.FLAG_REMOVE_AOD_CAR_MODE, + Flags.FLAG_RELOCK_WITH_POWER_BUTTON_IMMEDIATELY, Flags.FLAG_REMOVE_DREAM_OVERLAY_HIDE_ON_TOUCH, - Flags.FLAG_REMOVE_NEARBY_SHARE_TILE_ANIMATION, Flags.FLAG_REMOVE_UPDATE_LISTENER_IN_QS_ICON_VIEW_IMPL, Flags.FLAG_REST_TO_UNLOCK, Flags.FLAG_RESTART_DREAM_ON_UNOCCLUDE, - Flags.FLAG_RESTRICT_COMMUNAL_APP_WIDGET_HOST_LISTENING, Flags.FLAG_REVAMPED_BOUNCER_MESSAGES, Flags.FLAG_RUN_FINGERPRINT_DETECT_ON_DISMISSIBLE_KEYGUARD, Flags.FLAG_SAVE_AND_RESTORE_MAGNIFICATION_SETTINGS_BUTTONS, Flags.FLAG_SCENE_CONTAINER, - Flags.FLAG_SCREEN_REACTIONS, Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX, Flags.FLAG_SCREENSHOT_ACTION_DISMISS_SYSTEM_WINDOWS, - Flags.FLAG_SCREENSHOT_ANNOUNCE_LIVE_REGION, Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE, Flags.FLAG_SCREENSHOT_POLICY_SPLIT_AND_DESKTOP_MODE, Flags.FLAG_SCREENSHOT_SCROLL_CROP_VIEW_CRASH_FIX, + Flags.FLAG_SCREENSHOT_UI_CONTROLLER_REFACTOR, Flags.FLAG_SECONDARY_USER_WIDGET_HOST, Flags.FLAG_SETTINGS_EXT_REGISTER_CONTENT_OBSERVER_ON_BG_THREAD, Flags.FLAG_SHADE_EXPANDS_ON_STATUS_BAR_LONG_PRESS, - Flags.FLAG_SHADE_HEADER_BLUR_FONT_COLOR, Flags.FLAG_SHADE_HEADER_FONT_UPDATE, - Flags.FLAG_SHADE_QSVISIBLE_LOGIC, + Flags.FLAG_SHADE_LAUNCH_ACCESSIBILITY, Flags.FLAG_SHADE_WINDOW_GOES_AROUND, Flags.FLAG_SHADERLIB_LOADING_EFFECT_REFACTOR, Flags.FLAG_SHORTCUT_HELPER_KEY_GLYPH, Flags.FLAG_SHOW_AUDIO_SHARING_SLIDER_IN_VOLUME_PANEL, Flags.FLAG_SHOW_CLIPBOARD_INDICATION, Flags.FLAG_SHOW_LOCKED_BY_YOUR_WATCH_KEYGUARD_INDICATOR, + Flags.FLAG_SHOW_TOAST_WHEN_APP_CONTROL_BRIGHTNESS, Flags.FLAG_SIM_PIN_BOUNCER_RESET, + Flags.FLAG_SIM_PIN_RACE_CONDITION_ON_RESTART, + Flags.FLAG_SIM_PIN_USE_SLOT_ID, Flags.FLAG_SKIP_HIDE_SENSITIVE_NOTIF_ANIMATION, + Flags.FLAG_SLICE_BROADCAST_RELAY_IN_BACKGROUND, Flags.FLAG_SLICE_MANAGER_BINDER_CALL_BACKGROUND, + Flags.FLAG_SMARTSPACE_LOCKSCREEN_VIEWMODEL, Flags.FLAG_SMARTSPACE_RELOCATE_TO_BOTTOM, + Flags.FLAG_SMARTSPACE_REMOTEVIEWS_RENDERING_FIX, Flags.FLAG_SMARTSPACE_SWIPE_EVENT_LOGGING_FIX, Flags.FLAG_SMARTSPACE_VIEWPAGER2, Flags.FLAG_SOUNDDOSE_CUSTOMIZATION, Flags.FLAG_SPATIAL_MODEL_APP_PUSHBACK, - Flags.FLAG_SPATIAL_MODEL_BOUNCER_PUSHBACK, - Flags.FLAG_SPATIAL_MODEL_PUSHBACK_IN_SHADER, Flags.FLAG_STABILIZE_HEADS_UP_GROUP_V2, Flags.FLAG_STATUS_BAR_ALWAYS_CHECK_UNDERLYING_NETWORKS, - Flags.FLAG_STATUS_BAR_APP_HANDLE_TRACKING, - Flags.FLAG_STATUS_BAR_CHIP_TO_HUN_ANIMATION, + Flags.FLAG_STATUS_BAR_AUTO_START_SCREEN_RECORD_CHIP, Flags.FLAG_STATUS_BAR_CHIPS_MODERNIZATION, Flags.FLAG_STATUS_BAR_CHIPS_RETURN_ANIMATIONS, Flags.FLAG_STATUS_BAR_FONT_UPDATES, Flags.FLAG_STATUS_BAR_MOBILE_ICON_KAIROS, + Flags.FLAG_STATUS_BAR_MONOCHROME_ICONS_FIX, Flags.FLAG_STATUS_BAR_NO_HUN_BEHAVIOR, Flags.FLAG_STATUS_BAR_POPUP_CHIPS, - Flags.FLAG_STATUS_BAR_PRIVACY_CHIP_ANIMATION_EXEMPTION, Flags.FLAG_STATUS_BAR_ROOT_MODERNIZATION, - Flags.FLAG_STATUS_BAR_RUDIMENTARY_BATTERY, + Flags.FLAG_STATUS_BAR_SHOW_AUDIO_ONLY_PROJECTION_CHIP, Flags.FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR, Flags.FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR_ETHERNET, Flags.FLAG_STATUS_BAR_STATIC_INOUT_INDICATORS, + Flags.FLAG_STATUS_BAR_STOP_UPDATING_WINDOW_HEIGHT, Flags.FLAG_STATUS_BAR_SWIPE_OVER_CHIP, Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN, - Flags.FLAG_STATUS_BAR_SYSTEM_STATUS_ICONS_IN_COMPOSE, Flags.FLAG_STATUS_BAR_UI_THREAD, Flags.FLAG_STATUS_BAR_WINDOW_NO_CUSTOM_TOUCH, - Flags.FLAG_STUCK_HEARING_DEVICES_QS_TILE_FIX, + Flags.FLAG_STOPPABLE_FGS_SYSTEM_APP, Flags.FLAG_SWITCH_USER_ON_BG, Flags.FLAG_SYSUI_TEAMFOOD, Flags.FLAG_THEME_OVERLAY_CONTROLLER_WAKEFULNESS_DEPRECATION, - Flags.FLAG_THIN_SCREEN_RECORDING_SERVICE, - Flags.FLAG_TRANSITION_RACE_CONDITION_PART2, + Flags.FLAG_TRANSITION_RACE_CONDITION, + Flags.FLAG_TRANSLUCENT_OCCLUDING_ACTIVITY_FIX, Flags.FLAG_TV_GLOBAL_ACTIONS_FOCUS, - Flags.FLAG_UDFPS_SCREEN_OFF_UNLOCK_FLICKER, - Flags.FLAG_UI_RICH_ONGOING_AOD_SKELETON_BG_INFLATION, + Flags.FLAG_UDFPS_VIEW_PERFORMANCE, Flags.FLAG_UNFOLD_ANIMATION_BACKGROUND_PROGRESS, + Flags.FLAG_UNFOLD_LATENCY_TRACKING_FIX, Flags.FLAG_UPDATE_CORNER_RADIUS_ON_DISPLAY_CHANGED, Flags.FLAG_UPDATE_USER_SWITCHER_BACKGROUND, Flags.FLAG_UPDATE_WINDOW_MAGNIFIER_BOTTOM_BOUNDARY, - Flags.FLAG_USE_AAD_PROX_SENSOR_IF_PRESENT, + Flags.FLAG_USE_AAD_PROX_SENSOR, + Flags.FLAG_USE_NOTIF_INFLATION_THREAD_FOR_FOOTER, + Flags.FLAG_USE_NOTIF_INFLATION_THREAD_FOR_ROW, + Flags.FLAG_USE_TRANSITIONS_FOR_KEYGUARD_OCCLUDED, + Flags.FLAG_USE_VOLUME_CONTROLLER, Flags.FLAG_USER_AWARE_SETTINGS_REPOSITORIES, Flags.FLAG_USER_ENCRYPTED_SOURCE, Flags.FLAG_USER_SWITCHER_ADD_SIGN_OUT_OPTION, diff --git a/flags/src/com/android/systemui/FeatureFlags.java b/flags/src/com/android/systemui/FeatureFlags.java index 6fe1e4c4ac..681e59c0eb 100644 --- a/flags/src/com/android/systemui/FeatureFlags.java +++ b/flags/src/com/android/systemui/FeatureFlags.java @@ -1,42 +1,51 @@ package com.android.systemui; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public interface FeatureFlags { + boolean activityTransitionUseLargestWindow(); + + boolean addBlackBackgroundForWindowMagnifier(); + + + boolean alwaysComposeQsUiFragment(); + boolean ambientTouchMonitorListenToDisplayChanges(); - boolean animationLibraryDelayLeashCleanup(); - boolean appClipsBacklinks(); + + boolean appShortcutRemovalFix(); + + + boolean avalancheReplaceHunWhenCritical(); - boolean backButtonOnBouncer(); + boolean bindKeyguardMediaVisibility(); - boolean bouncerLifecycleFix(); - - boolean bouncerUiRevamp(); + boolean bouncerUiRevamp2(); + boolean bpColors(); @@ -44,16 +53,31 @@ public interface FeatureFlags { boolean brightnessSliderFocusState(); + + boolean checkLockscreenGoneTransition(); + + + boolean classicFlagsMultiUser(); - boolean clipboardAnnounceLiveRegion(); + + boolean clipboardImageTimeout(); + + + + boolean clipboardNoninteractiveOnLockscreen(); boolean clipboardOverlayMultiuser(); + + boolean clipboardSharedTransitions(); + + + boolean clipboardUseDescriptionMimetype(); @@ -62,18 +86,18 @@ public interface FeatureFlags { - boolean clockModernization(); - - boolean communalBouncerDoNotModifyPluginOpen(); + boolean communalEditWidgetsActivityFinishFix(); + boolean communalHub(); + boolean communalHubUseThreadPoolForWidgets(); @@ -81,19 +105,23 @@ public interface FeatureFlags { boolean communalResponsiveGrid(); - boolean communalShadeTouchHandlingFixes(); + + boolean communalSceneKtfRefactor(); boolean communalStandaloneSupport(); + boolean communalTimerFlickerFix(); + boolean communalWidgetResizing(); + boolean communalWidgetTrampolineFix(); @@ -105,9 +133,11 @@ public interface FeatureFlags { boolean confineNotificationTouchToViewWidth(); + boolean contAuthPlugin(); + boolean contextualTipsAssistantDismissFix(); @@ -116,15 +146,31 @@ public interface FeatureFlags { + boolean createWindowlessWindowMagnifier(); + + + + boolean debugLiveUpdatesPromoteAll(); + + + boolean decoupleViewControllerInAnimlib(); + boolean delayShowMagnificationButton(); + + + boolean desktopEffectsQsTile(); - boolean desktopScreenCapture(); + boolean deviceEntryUdfpsRefactor(); + + + + boolean disableBlurredShadeVisible(); @@ -136,66 +182,54 @@ public interface FeatureFlags { - boolean disableDoubleClickSwapOnBouncer(); - - - - boolean doNotUseImmediateCoroutineDispatcher(); + boolean disableShadeTrackpadTwoFingerSwipe(); boolean doubleTapToSleep(); - boolean dreamBiometricPromptFixes(); - boolean dreamInputSessionPilferOnce(); + boolean dreamOverlayBouncerSwipeDirectionFiltering(); - boolean dreamOverlayUpdatedUi(); - - boolean dreamPreviewTapDismiss(); - - - - boolean dreamTransitionFixes(); + boolean dreamOverlayUpdatedFont(); boolean edgeBackGestureHandlerThread(); + boolean edgebackGestureHandlerGetRunningTasksBackground(); + boolean enableBackgroundKeyguardOndrawnCallback(); - boolean enableConstraintLayoutLockscreenOnExternalDisplay(); - - boolean enableContextualTipForMuteVolume(); + boolean enableContextualTipForPowerOff(); + boolean enableContextualTipForTakeScreenshot(); + boolean enableContextualTips(); - boolean enableDesktopGrowth(); - - boolean enableEfficientDisplayRepository(); @@ -204,17 +238,6 @@ public interface FeatureFlags { - boolean enableMinmode(); - - - - boolean enableSuggestedDeviceUi(); - - - boolean enableTopUiController(); - - - boolean enableUnderlay(); @@ -222,6 +245,7 @@ public interface FeatureFlags { boolean enableViewCaptureTracing(); + boolean enforceBrightnessBaseUserRestriction(); @@ -229,9 +253,11 @@ public interface FeatureFlags { boolean exampleFlag(); + boolean expandCollapsePrivacyDialog(); + boolean expandHeadsUpOnInlineReply(); @@ -243,27 +269,43 @@ public interface FeatureFlags { boolean extendedAppsShortcutCategory(); + + boolean faceMessageDeferUpdate(); + + + boolean faceScanningAnimationNpeFix(); + + boolean fasterUnlockTransition(); + + + boolean fetchBookmarksXmlKeyboardShortcuts(); - boolean fixDialogLaunchAnimationJankLogging(); + + boolean fixImageWallpaperCrashSurfaceAlreadyReleased(); + boolean fixScreenshotActionDismissSystemWindows(); - boolean flashlightStrength(); - - - boolean floatingMenuAnimatedTuck(); + boolean floatingMenuDisplayCutoutSupport(); + + + + boolean floatingMenuDragToEdit(); + + + boolean floatingMenuDragToHide(); @@ -275,6 +317,11 @@ public interface FeatureFlags { boolean floatingMenuImeDisplacementAnimation(); + + boolean floatingMenuNarrowTargetContentObserver(); + + + boolean floatingMenuNotifyTargetsChangedOnStrictDiff(); @@ -287,9 +334,6 @@ public interface FeatureFlags { - boolean floatingMenuRemoveFullscreenTaps(); - - boolean getConnectedDeviceNameUnsynchronized(); @@ -313,12 +357,19 @@ public interface FeatureFlags { boolean glanceableHubV2Resources(); + + boolean hapticsForComposeSliders(); + + + boolean hardwareColorStyles(); + boolean hearingAidsQsTileDialog(); + boolean hearingDevicesDialogRelatedTools(); @@ -326,43 +377,47 @@ public interface FeatureFlags { boolean hideRingerButtonInSingleVolumeMode(); + boolean homeControlsDreamHsum(); - boolean hsuBehaviorChanges(); - - - boolean hubBlurredByShadeFix(); - - - boolean hubEditModeTouchAdjustments(); - boolean hubEditModeTransition(); + boolean hubmodeFullscreenVerticalSwipe(); + + + + boolean hubmodeFullscreenVerticalSwipeFix(); + boolean iconRefresh2025(); + + boolean ignoreTouchesNextToNotificationShelf(); + + + boolean indicationTextA11yFix(); - boolean instantHideShade(); - - boolean keyboardDockingIndicator(); + boolean keyboardShortcutHelperRewrite(); + boolean keyboardShortcutHelperShortcutCustomizer(); + boolean keyboardTouchpadContextualEducation(); @@ -371,9 +426,14 @@ public interface FeatureFlags { + boolean keyguardWmReorderAtmsCalls(); + + + boolean keyguardWmStateRefactor(); + boolean lockscreenFont(); @@ -381,16 +441,15 @@ public interface FeatureFlags { boolean lowLightClockDream(); - boolean lowlightClockSetBrightness(); - - - boolean lowlightClockUsesKeyguardChargingStatus(); - boolean magneticNotificationSwipes(); + boolean mediaControlsA11yColors(); + + + boolean mediaControlsButtonMedia3(); @@ -399,15 +458,42 @@ public interface FeatureFlags { - boolean mediaControlsInCompose(); + boolean mediaControlsDeviceManagerBackgroundExecution(); + + + + boolean mediaControlsDrawablesReuseBugfix(); + + + + boolean mediaControlsLockscreenShadeBugFix(); + boolean mediaControlsUiUpdate(); + + boolean mediaControlsUmoInflationInBackground(); + + + + boolean mediaControlsUserInitiatedDeleteintent(); + + + + boolean mediaLoadMetadataViaMediaDataLoader(); + + + + boolean mediaLockscreenLaunchAnimation(); + + + boolean mediaProjectionDialogBehindLockscreen(); + boolean mediaProjectionGreyErrorText(); @@ -419,9 +505,11 @@ public interface FeatureFlags { boolean modesUiDialogPaging(); + boolean moveTransitionAnimationLayer(); + boolean msdlFeedback(); @@ -429,13 +517,11 @@ public interface FeatureFlags { boolean multiuserWifiPickerTrackerSupport(); + boolean newAodTransition(); - boolean newDozingKeyguardStates(); - - boolean newVolumePanel(); @@ -455,21 +541,27 @@ public interface FeatureFlags { boolean notificationAmbientSuppressionAfterInflation(); + boolean notificationAnimatedActionsTreatment(); + boolean notificationAppearNonlinear(); + boolean notificationAsyncGroupHeaderInflation(); + boolean notificationAsyncHybridViewInflation(); + boolean notificationAvalancheSuppression(); + boolean notificationAvalancheThrottleHun(); @@ -485,6 +577,7 @@ public interface FeatureFlags { boolean notificationColorUpdateLogger(); + boolean notificationContentAlphaOptimization(); @@ -492,21 +585,34 @@ public interface FeatureFlags { boolean notificationFooterBackgroundTintOptimization(); + + boolean notificationOverExpansionClippingFix(); + + + + boolean notificationReentrantDismiss(); + + + boolean notificationRowAccessibilityExpanded(); + boolean notificationRowContentBinderRefactor(); + boolean notificationRowTransparency(); + + boolean notificationRowUserContext(); + + + boolean notificationShadeBlur(); - boolean notificationShadeCloseWaitsForChildAnimations(); - - boolean notificationShadeUiThread(); @@ -515,12 +621,19 @@ public interface FeatureFlags { boolean notificationSkipSilentUpdates(); + boolean notificationTransparentHeaderFix(); + + boolean notificationViewFlipperPausingV2(); + + + boolean notificationsBackgroundIcons(); + boolean notificationsFooterVisibilityFix(); @@ -529,35 +642,47 @@ public interface FeatureFlags { - boolean notificationsHunAccessibilityRefactor(); - - boolean notificationsHunSharedAnimationValues(); + boolean notificationsIconContainerRefactor(); + boolean notificationsLaunchRadius(); + boolean notificationsLiveDataStoreRefactor(); + boolean notificationsPinnedHunInShade(); + boolean notificationsRedesignFooterView(); + + boolean notificationsRedesignGuts(); + + + boolean notifyPasswordTextViewUserActivityInBackground(); + boolean notifyPowerManagerUserActivityBackground(); - boolean ongoingActivityChipsOnDream(); + boolean onlyShowMediaStreamSliderInSingleVolumeMode(); + + + + boolean outputSwitcherRedesign(); @@ -568,12 +693,15 @@ public interface FeatureFlags { boolean permissionHelperInlineUiRichOngoing(); + boolean permissionHelperUiRichOngoing(); + boolean physicalNotificationMovement(); + boolean pinInputFieldStyledFocusState(); @@ -586,7 +714,7 @@ public interface FeatureFlags { - boolean privacyDotLiveRegion(); + boolean priorityPeopleSection(); @@ -594,18 +722,15 @@ public interface FeatureFlags { + boolean pssAppSelectorRecentsSplitScreen(); + + + boolean pssTaskSwitcher(); - boolean qsComposeFragmentEarlyExpansion(); - - - - boolean qsEditModeTabs(); - - - boolean qsEditModeTooltip(); + boolean qsCustomTileClickGuaranteedBugFix(); @@ -617,27 +742,30 @@ public interface FeatureFlags { + boolean qsQuickRebindActiveTiles(); + + + + boolean qsRegisterSettingObserverOnBgThread(); + + + boolean qsTileDetailedView(); + boolean qsTileFocusState(); - boolean qsTileTransitionInteractionRefinement(); - - - boolean qsUiRefactor(); + boolean qsUiRefactorComposeFragment(); - boolean qsWifiConfig(); - - boolean recordIssueQsTile(); @@ -646,33 +774,34 @@ public interface FeatureFlags { + boolean refactorGetCurrentUser(); + + + boolean registerBatteryControllerReceiversInCorestartable(); + boolean registerContentObserversAsync(); + boolean registerNewWalletCardInBackground(); + boolean registerWallpaperNotifierBackground(); - boolean rememberViewModelOffMainThread(); + boolean relockWithPowerButtonImmediately(); - boolean removeAodCarMode(); - - boolean removeDreamOverlayHideOnTouch(); - boolean removeNearbyShareTileAnimation(); - - boolean removeUpdateListenerInQsIconViewImpl(); @@ -684,8 +813,6 @@ public interface FeatureFlags { boolean restartDreamOnUnocclude(); - boolean restrictCommunalAppWidgetHostListening(); - boolean revampedBouncerMessages(); @@ -694,6 +821,7 @@ public interface FeatureFlags { boolean runFingerprintDetectOnDismissibleKeyguard(); + boolean saveAndRestoreMagnificationSettingsButtons(); @@ -702,9 +830,6 @@ public interface FeatureFlags { - boolean screenReactions(); - - boolean screenshareNotificationHidingBugFix(); @@ -712,49 +837,55 @@ public interface FeatureFlags { boolean screenshotActionDismissSystemWindows(); - boolean screenshotAnnounceLiveRegion(); - - boolean screenshotMultidisplayFocusChange(); + boolean screenshotPolicySplitAndDesktopMode(); + boolean screenshotScrollCropViewCrashFix(); + boolean screenshotUiControllerRefactor(); + + + boolean secondaryUserWidgetHost(); + boolean settingsExtRegisterContentObserverOnBgThread(); + boolean shadeExpandsOnStatusBarLongPress(); - boolean shadeHeaderBlurFontColor(); - boolean shadeHeaderFontUpdate(); - boolean shadeQsvisibleLogic(); + boolean shadeLaunchAccessibility(); boolean shadeWindowGoesAround(); + boolean shaderlibLoadingEffectRefactor(); + boolean shortcutHelperKeyGlyph(); + boolean showAudioSharingSliderInVolumePanel(); @@ -766,52 +897,75 @@ public interface FeatureFlags { boolean showLockedByYourWatchKeyguardIndicator(); + + boolean showToastWhenAppControlBrightness(); + + + boolean simPinBouncerReset(); + + boolean simPinRaceConditionOnRestart(); + + + + boolean simPinUseSlotId(); + + + boolean skipHideSensitiveNotifAnimation(); + + boolean sliceBroadcastRelayInBackground(); + + + boolean sliceManagerBinderCallBackground(); + boolean smartspaceLockscreenViewmodel(); + + + boolean smartspaceRelocateToBottom(); + + boolean smartspaceRemoteviewsRenderingFix(); + + + boolean smartspaceSwipeEventLoggingFix(); + boolean smartspaceViewpager2(); + boolean sounddoseCustomization(); + boolean spatialModelAppPushback(); - boolean spatialModelBouncerPushback(); - - - boolean spatialModelPushbackInShader(); - - boolean stabilizeHeadsUpGroupV2(); + boolean statusBarAlwaysCheckUnderlyingNetworks(); - boolean statusBarAppHandleTracking(); + boolean statusBarAutoStartScreenRecordChip(); - boolean statusBarChipToHunAnimation(); - - boolean statusBarChipsModernization(); @@ -819,6 +973,7 @@ public interface FeatureFlags { boolean statusBarChipsReturnAnimations(); + boolean statusBarFontUpdates(); @@ -826,6 +981,11 @@ public interface FeatureFlags { boolean statusBarMobileIconKairos(); + + boolean statusBarMonochromeIconsFix(); + + + boolean statusBarNoHunBehavior(); @@ -833,19 +993,19 @@ public interface FeatureFlags { boolean statusBarPopupChips(); - boolean statusBarPrivacyChipAnimationExemption(); - boolean statusBarRootModernization(); - boolean statusBarRudimentaryBattery(); + boolean statusBarShowAudioOnlyProjectionChip(); + boolean statusBarSignalPolicyRefactor(); + boolean statusBarSignalPolicyRefactorEthernet(); @@ -853,24 +1013,29 @@ public interface FeatureFlags { boolean statusBarStaticInoutIndicators(); + + boolean statusBarStopUpdatingWindowHeight(); + + + boolean statusBarSwipeOverChip(); + boolean statusBarSwitchToSpnFromDataSpn(); - boolean statusBarSystemStatusIconsInCompose(); - - - boolean statusBarUiThread(); + boolean statusBarWindowNoCustomTouch(); - boolean stuckHearingDevicesQsTileFix(); + + boolean stoppableFgsSystemApp(); + boolean switchUserOnBg(); @@ -885,40 +1050,66 @@ public interface FeatureFlags { - boolean thinScreenRecordingService(); + boolean transitionRaceCondition(); - boolean transitionRaceConditionPart2(); + + boolean translucentOccludingActivityFix(); + boolean tvGlobalActionsFocus(); - boolean udfpsScreenOffUnlockFlicker(); + boolean udfpsViewPerformance(); - boolean uiRichOngoingAodSkeletonBgInflation(); boolean unfoldAnimationBackgroundProgress(); + + boolean unfoldLatencyTrackingFix(); + + + boolean updateCornerRadiusOnDisplayChanged(); + boolean updateUserSwitcherBackground(); + boolean updateWindowMagnifierBottomBoundary(); - boolean useAadProxSensorIfPresent(); + boolean useAadProxSensor(); + + + + boolean useNotifInflationThreadForFooter(); + + + + boolean useNotifInflationThreadForRow(); + + + + boolean useTransitionsForKeyguardOccluded(); + + + + boolean useVolumeController(); + boolean userAwareSettingsRepositories(); + boolean userEncryptedSource(); @@ -926,8 +1117,10 @@ public interface FeatureFlags { boolean userSwitcherAddSignOutOption(); + boolean visualInterruptionsRefactor(); + boolean volumeRedesign(); } diff --git a/flags/src/com/android/systemui/FeatureFlagsImpl.java b/flags/src/com/android/systemui/FeatureFlagsImpl.java index 2707adb4c3..7dbc6b650e 100644 --- a/flags/src/com/android/systemui/FeatureFlagsImpl.java +++ b/flags/src/com/android/systemui/FeatureFlagsImpl.java @@ -1,5 +1,5 @@ package com.android.systemui; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags { @Override @@ -12,13 +12,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean alwaysComposeQsUiFragment() { + public boolean addBlackBackgroundForWindowMagnifier() { return true; } @Override + public boolean alwaysComposeQsUiFragment() { + return false; + } + + @Override + + public boolean ambientTouchMonitorListenToDisplayChanges() { return true; } @@ -26,13 +33,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean animationLibraryDelayLeashCleanup() { - return true; - } - - @Override - - public boolean appClipsBacklinks() { return true; } @@ -40,43 +40,43 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean avalancheReplaceHunWhenCritical() { + public boolean appShortcutRemovalFix() { return true; } @Override - public boolean backButtonOnBouncer() { + public boolean avalancheReplaceHunWhenCritical() { return false; } @Override - public boolean bouncerLifecycleFix() { - return false; + public boolean bindKeyguardMediaVisibility() { + return true; } @Override public boolean bouncerUiRevamp() { - return true; + return false; } @Override public boolean bouncerUiRevamp2() { - return true; + return false; } @Override public boolean bpColors() { - return true; + return false; } @Override @@ -89,6 +89,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean checkLockscreenGoneTransition() { + return true; + } + + @Override + + public boolean classicFlagsMultiUser() { return true; } @@ -96,7 +103,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean clipboardAnnounceLiveRegion() { + public boolean clipboardImageTimeout() { + return true; + } + + @Override + + + public boolean clipboardNoninteractiveOnLockscreen() { return true; } @@ -110,6 +124,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean clipboardSharedTransitions() { + return true; + } + + @Override + + public boolean clipboardUseDescriptionMimetype() { return true; } @@ -124,13 +145,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean clockModernization() { - return false; - } - - @Override - - public boolean communalBouncerDoNotModifyPluginOpen() { return true; } @@ -166,7 +180,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean communalShadeTouchHandlingFixes() { + public boolean communalSceneKtfRefactor() { return true; } @@ -216,7 +230,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean contAuthPlugin() { - return true; + return false; } @Override @@ -236,6 +250,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean createWindowlessWindowMagnifier() { + return true; + } + + @Override + + + public boolean debugLiveUpdatesPromoteAll() { + return false; + } + + @Override + + public boolean decoupleViewControllerInAnimlib() { return false; } @@ -243,6 +271,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean delayShowMagnificationButton() { + return true; + } + + @Override + + public boolean desktopEffectsQsTile() { return false; } @@ -250,7 +285,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean desktopScreenCapture() { + public boolean deviceEntryUdfpsRefactor() { + return true; + } + + @Override + + + public boolean disableBlurredShadeVisible() { return false; } @@ -271,14 +313,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean disableDoubleClickSwapOnBouncer() { - return false; - } - - @Override - - - public boolean doNotUseImmediateCoroutineDispatcher() { + public boolean disableShadeTrackpadTwoFingerSwipe() { return false; } @@ -292,13 +327,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean dreamBiometricPromptFixes() { - return true; - } - - @Override - - public boolean dreamInputSessionPilferOnce() { return true; } @@ -313,21 +341,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean dreamOverlayUpdatedUi() { - return true; - } - - @Override - - - public boolean dreamPreviewTapDismiss() { - return true; - } - - @Override - - - public boolean dreamTransitionFixes() { + public boolean dreamOverlayUpdatedFont() { return false; } @@ -355,13 +369,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableConstraintLayoutLockscreenOnExternalDisplay() { - return false; - } - - @Override - - public boolean enableContextualTipForMuteVolume() { return true; } @@ -390,13 +397,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDesktopGrowth() { - return false; - } - - @Override - - public boolean enableEfficientDisplayRepository() { return true; } @@ -411,27 +411,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableMinmode() { - return false; - } - - @Override - - - public boolean enableSuggestedDeviceUi() { - return false; - } - - @Override - - - public boolean enableTopUiController() { - return true; - } - - @Override - - public boolean enableUnderlay() { return false; } @@ -488,6 +467,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean faceMessageDeferUpdate() { + return true; + } + + @Override + + public boolean faceScanningAnimationNpeFix() { return true; } @@ -495,6 +481,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean fasterUnlockTransition() { + return true; + } + + @Override + + public boolean fetchBookmarksXmlKeyboardShortcuts() { return true; } @@ -502,7 +495,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean fixDialogLaunchAnimationJankLogging() { + public boolean fixImageWallpaperCrashSurfaceAlreadyReleased() { return true; } @@ -516,15 +509,22 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean flashlightStrength() { + public boolean floatingMenuAnimatedTuck() { return false; } @Override - public boolean floatingMenuAnimatedTuck() { - return false; + public boolean floatingMenuDisplayCutoutSupport() { + return true; + } + + @Override + + + public boolean floatingMenuDragToEdit() { + return true; } @Override @@ -551,6 +551,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean floatingMenuNarrowTargetContentObserver() { + return true; + } + + @Override + + public boolean floatingMenuNotifyTargetsChangedOnStrictDiff() { return true; } @@ -572,13 +579,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean floatingMenuRemoveFullscreenTaps() { - return false; - } - - @Override - - public boolean getConnectedDeviceNameUnsynchronized() { return true; } @@ -621,13 +621,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean hardwareColorStyles() { + public boolean hapticsForComposeSliders() { return true; } @Override + public boolean hardwareColorStyles() { + return false; + } + + @Override + + public boolean hearingAidsQsTileDialog() { return true; } @@ -656,20 +663,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean hsuBehaviorChanges() { - return false; - } - - @Override - - - public boolean hubBlurredByShadeFix() { - return true; - } - - @Override - - public boolean hubEditModeTouchAdjustments() { return false; } @@ -677,14 +670,28 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean hubEditModeTransition() { + public boolean hubmodeFullscreenVerticalSwipe() { return false; } @Override + public boolean hubmodeFullscreenVerticalSwipeFix() { + return true; + } + + @Override + + public boolean iconRefresh2025() { + return false; + } + + @Override + + + public boolean ignoreTouchesNextToNotificationShelf() { return true; } @@ -698,13 +705,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean instantHideShade() { - return true; - } - - @Override - - public boolean keyboardDockingIndicator() { return false; } @@ -740,6 +740,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean keyguardWmReorderAtmsCalls() { + return true; + } + + @Override + + public boolean keyguardWmStateRefactor() { return false; } @@ -748,7 +755,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean lockscreenFont() { - return true; + return false; } @Override @@ -761,21 +768,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean lowlightClockSetBrightness() { - return true; - } - - @Override - - - public boolean lowlightClockUsesKeyguardChargingStatus() { - return true; - } - - @Override - - public boolean magneticNotificationSwipes() { + return false; + } + + @Override + + + public boolean mediaControlsA11yColors() { return true; } @@ -796,14 +796,56 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean mediaControlsInCompose() { + public boolean mediaControlsDeviceManagerBackgroundExecution() { return false; } @Override + public boolean mediaControlsDrawablesReuseBugfix() { + return true; + } + + @Override + + + public boolean mediaControlsLockscreenShadeBugFix() { + return true; + } + + @Override + + public boolean mediaControlsUiUpdate() { + return false; + } + + @Override + + + public boolean mediaControlsUmoInflationInBackground() { + return true; + } + + @Override + + + public boolean mediaControlsUserInitiatedDeleteintent() { + return true; + } + + @Override + + + public boolean mediaLoadMetadataViaMediaDataLoader() { + return true; + } + + @Override + + + public boolean mediaLockscreenLaunchAnimation() { return true; } @@ -839,14 +881,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean moveTransitionAnimationLayer() { - return true; + return false; } @Override public boolean msdlFeedback() { - return true; + return false; } @Override @@ -866,13 +908,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean newDozingKeyguardStates() { - return false; - } - - @Override - - public boolean newVolumePanel() { return true; } @@ -909,7 +944,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean notificationAnimatedActionsTreatment() { - return true; + return false; } @Override @@ -951,7 +986,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean notificationBackgroundTintOptimization() { - return false; + return true; } @Override @@ -972,7 +1007,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean notificationContentAlphaOptimization() { - return true; + return false; } @Override @@ -985,6 +1020,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean notificationOverExpansionClippingFix() { + return true; + } + + @Override + + + public boolean notificationReentrantDismiss() { + return true; + } + + @Override + + public boolean notificationRowAccessibilityExpanded() { return true; } @@ -1000,6 +1049,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean notificationRowTransparency() { + return false; + } + + @Override + + + public boolean notificationRowUserContext() { return true; } @@ -1007,14 +1063,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean notificationShadeBlur() { - return true; - } - - @Override - - - public boolean notificationShadeCloseWaitsForChildAnimations() { - return true; + return false; } @Override @@ -1041,6 +1090,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean notificationViewFlipperPausingV2() { + return true; + } + + @Override + + public boolean notificationsBackgroundIcons() { return true; } @@ -1062,15 +1118,8 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean notificationsHunAccessibilityRefactor() { - return false; - } - - @Override - - public boolean notificationsHunSharedAnimationValues() { - return true; + return false; } @Override @@ -1084,7 +1133,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean notificationsLaunchRadius() { - return true; + return false; } @Override @@ -1105,7 +1154,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean notificationsRedesignFooterView() { - return true; + return false; + } + + @Override + + + public boolean notificationsRedesignGuts() { + return false; } @Override @@ -1125,7 +1181,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean ongoingActivityChipsOnDream() { + public boolean onlyShowMediaStreamSliderInSingleVolumeMode() { + return true; + } + + @Override + + + public boolean outputSwitcherRedesign() { return false; } @@ -1147,14 +1210,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean permissionHelperUiRichOngoing() { - return true; + return false; } @Override public boolean physicalNotificationMovement() { - return true; + return false; } @Override @@ -1181,8 +1244,8 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean privacyDotLiveRegion() { - return false; + public boolean priorityPeopleSection() { + return true; } @Override @@ -1195,6 +1258,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean pssAppSelectorRecentsSplitScreen() { + return true; + } + + @Override + + public boolean pssTaskSwitcher() { return false; } @@ -1202,21 +1272,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean qsComposeFragmentEarlyExpansion() { - return false; - } - - @Override - - - public boolean qsEditModeTabs() { - return false; - } - - @Override - - - public boolean qsEditModeTooltip() { + public boolean qsCustomTileClickGuaranteedBugFix() { return true; } @@ -1237,6 +1293,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean qsQuickRebindActiveTiles() { + return false; + } + + @Override + + + public boolean qsRegisterSettingObserverOnBgThread() { + return true; + } + + @Override + + public boolean qsTileDetailedView() { return false; } @@ -1251,13 +1321,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean qsTileTransitionInteractionRefinement() { - return false; - } - - @Override - - public boolean qsUiRefactor() { return false; } @@ -1266,13 +1329,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean qsUiRefactorComposeFragment() { - return true; - } - - @Override - - - public boolean qsWifiConfig() { return false; } @@ -1293,6 +1349,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean refactorGetCurrentUser() { + return true; + } + + @Override + + public boolean registerBatteryControllerReceiversInCorestartable() { return false; } @@ -1321,15 +1384,8 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean rememberViewModelOffMainThread() { - return false; - } - - @Override - - - public boolean removeAodCarMode() { - return false; + public boolean relockWithPowerButtonImmediately() { + return true; } @Override @@ -1342,13 +1398,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean removeNearbyShareTileAnimation() { - return false; - } - - @Override - - public boolean removeUpdateListenerInQsIconViewImpl() { return true; } @@ -1370,13 +1419,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean restrictCommunalAppWidgetHostListening() { - return true; - } - - @Override - - public boolean revampedBouncerMessages() { return true; } @@ -1405,13 +1447,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean screenReactions() { - return false; - } - - @Override - - public boolean screenshareNotificationHidingBugFix() { return true; } @@ -1426,13 +1461,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean screenshotAnnounceLiveRegion() { - return true; - } - - @Override - - public boolean screenshotMultidisplayFocusChange() { return false; } @@ -1454,6 +1482,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean screenshotUiControllerRefactor() { + return true; + } + + @Override + + public boolean secondaryUserWidgetHost() { return false; } @@ -1475,22 +1510,15 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean shadeHeaderBlurFontColor() { - return true; - } - - @Override - - public boolean shadeHeaderFontUpdate() { - return true; + return false; } @Override - public boolean shadeQsvisibleLogic() { - return false; + public boolean shadeLaunchAccessibility() { + return true; } @Override @@ -1518,7 +1546,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean showAudioSharingSliderInVolumePanel() { - return true; + return false; } @Override @@ -1538,6 +1566,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean showToastWhenAppControlBrightness() { + return true; + } + + @Override + + public boolean simPinBouncerReset() { return true; } @@ -1545,6 +1580,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean simPinRaceConditionOnRestart() { + return true; + } + + @Override + + + public boolean simPinUseSlotId() { + return true; + } + + @Override + + public boolean skipHideSensitiveNotifAnimation() { return true; } @@ -1552,6 +1601,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean sliceBroadcastRelayInBackground() { + return true; + } + + @Override + + public boolean sliceManagerBinderCallBackground() { return true; } @@ -1559,6 +1615,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean smartspaceLockscreenViewmodel() { + return true; + } + + @Override + + public boolean smartspaceRelocateToBottom() { return false; } @@ -1566,6 +1629,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean smartspaceRemoteviewsRenderingFix() { + return true; + } + + @Override + + public boolean smartspaceSwipeEventLoggingFix() { return true; } @@ -1574,7 +1644,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean smartspaceViewpager2() { - return true; + return false; } @Override @@ -1588,26 +1658,12 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean spatialModelAppPushback() { - return true; - } - - @Override - - - public boolean spatialModelBouncerPushback() { return false; } @Override - public boolean spatialModelPushbackInShader() { - return true; - } - - @Override - - public boolean stabilizeHeadsUpGroupV2() { return true; } @@ -1622,22 +1678,15 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean statusBarAppHandleTracking() { - return false; - } - - @Override - - - public boolean statusBarChipToHunAnimation() { - return false; + public boolean statusBarAutoStartScreenRecordChip() { + return true; } @Override public boolean statusBarChipsModernization() { - return true; + return false; } @Override @@ -1651,7 +1700,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean statusBarFontUpdates() { - return true; + return false; } @Override @@ -1664,13 +1713,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean statusBarNoHunBehavior() { + public boolean statusBarMonochromeIconsFix() { return true; } @Override + public boolean statusBarNoHunBehavior() { + return false; + } + + @Override + + public boolean statusBarPopupChips() { return false; } @@ -1678,22 +1734,15 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean statusBarPrivacyChipAnimationExemption() { - return true; - } - - @Override - - public boolean statusBarRootModernization() { - return true; + return false; } @Override - public boolean statusBarRudimentaryBattery() { - return false; + public boolean statusBarShowAudioOnlyProjectionChip() { + return true; } @Override @@ -1720,8 +1769,15 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean statusBarStopUpdatingWindowHeight() { + return false; + } + + @Override + + public boolean statusBarSwipeOverChip() { - return true; + return false; } @Override @@ -1734,13 +1790,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean statusBarSystemStatusIconsInCompose() { - return false; - } - - @Override - - public boolean statusBarUiThread() { return false; } @@ -1749,13 +1798,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean statusBarWindowNoCustomTouch() { - return true; + return false; } @Override - public boolean stuckHearingDevicesQsTileFix() { + public boolean stoppableFgsSystemApp() { return true; } @@ -1783,14 +1832,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean thinScreenRecordingService() { - return false; + public boolean transitionRaceCondition() { + return true; } @Override - public boolean transitionRaceConditionPart2() { + public boolean translucentOccludingActivityFix() { return true; } @@ -1798,20 +1847,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean tvGlobalActionsFocus() { - return true; + return false; } @Override - public boolean udfpsScreenOffUnlockFlicker() { - return true; - } - - @Override - - - public boolean uiRichOngoingAodSkeletonBgInflation() { + public boolean udfpsViewPerformance() { return true; } @@ -1825,6 +1867,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean unfoldLatencyTrackingFix() { + return false; + } + + @Override + + public boolean updateCornerRadiusOnDisplayChanged() { return true; } @@ -1840,14 +1889,42 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean updateWindowMagnifierBottomBoundary() { + return false; + } + + @Override + + + public boolean useAadProxSensor() { + return false; + } + + @Override + + + public boolean useNotifInflationThreadForFooter() { return true; } @Override - public boolean useAadProxSensorIfPresent() { - return false; + public boolean useNotifInflationThreadForRow() { + return true; + } + + @Override + + + public boolean useTransitionsForKeyguardOccluded() { + return true; + } + + @Override + + + public boolean useVolumeController() { + return true; } @Override @@ -1882,7 +1959,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean volumeRedesign() { - return true; + return false; } } diff --git a/flags/src/com/android/systemui/Flags.java b/flags/src/com/android/systemui/Flags.java index ec7e96af9f..ca51b086d1 100644 --- a/flags/src/com/android/systemui/Flags.java +++ b/flags/src/com/android/systemui/Flags.java @@ -1,24 +1,24 @@ package com.android.systemui; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public final class Flags { /** @hide */ public static final String FLAG_ACTIVITY_TRANSITION_USE_LARGEST_WINDOW = "com.android.systemui.activity_transition_use_largest_window"; /** @hide */ + public static final String FLAG_ADD_BLACK_BACKGROUND_FOR_WINDOW_MAGNIFIER = "com.android.systemui.add_black_background_for_window_magnifier"; + /** @hide */ public static final String FLAG_ALWAYS_COMPOSE_QS_UI_FRAGMENT = "com.android.systemui.always_compose_qs_ui_fragment"; /** @hide */ public static final String FLAG_AMBIENT_TOUCH_MONITOR_LISTEN_TO_DISPLAY_CHANGES = "com.android.systemui.ambient_touch_monitor_listen_to_display_changes"; /** @hide */ - public static final String FLAG_ANIMATION_LIBRARY_DELAY_LEASH_CLEANUP = "com.android.systemui.animation_library_delay_leash_cleanup"; - /** @hide */ public static final String FLAG_APP_CLIPS_BACKLINKS = "com.android.systemui.app_clips_backlinks"; /** @hide */ + public static final String FLAG_APP_SHORTCUT_REMOVAL_FIX = "com.android.systemui.app_shortcut_removal_fix"; + /** @hide */ public static final String FLAG_AVALANCHE_REPLACE_HUN_WHEN_CRITICAL = "com.android.systemui.avalanche_replace_hun_when_critical"; /** @hide */ - public static final String FLAG_BACK_BUTTON_ON_BOUNCER = "com.android.systemui.back_button_on_bouncer"; - /** @hide */ - public static final String FLAG_BOUNCER_LIFECYCLE_FIX = "com.android.systemui.bouncer_lifecycle_fix"; + public static final String FLAG_BIND_KEYGUARD_MEDIA_VISIBILITY = "com.android.systemui.bind_keyguard_media_visibility"; /** @hide */ public static final String FLAG_BOUNCER_UI_REVAMP = "com.android.systemui.bouncer_ui_revamp"; /** @hide */ @@ -28,18 +28,22 @@ public final class Flags { /** @hide */ public static final String FLAG_BRIGHTNESS_SLIDER_FOCUS_STATE = "com.android.systemui.brightness_slider_focus_state"; /** @hide */ + public static final String FLAG_CHECK_LOCKSCREEN_GONE_TRANSITION = "com.android.systemui.check_lockscreen_gone_transition"; + /** @hide */ public static final String FLAG_CLASSIC_FLAGS_MULTI_USER = "com.android.systemui.classic_flags_multi_user"; /** @hide */ - public static final String FLAG_CLIPBOARD_ANNOUNCE_LIVE_REGION = "com.android.systemui.clipboard_announce_live_region"; + public static final String FLAG_CLIPBOARD_IMAGE_TIMEOUT = "com.android.systemui.clipboard_image_timeout"; + /** @hide */ + public static final String FLAG_CLIPBOARD_NONINTERACTIVE_ON_LOCKSCREEN = "com.android.systemui.clipboard_noninteractive_on_lockscreen"; /** @hide */ public static final String FLAG_CLIPBOARD_OVERLAY_MULTIUSER = "com.android.systemui.clipboard_overlay_multiuser"; /** @hide */ + public static final String FLAG_CLIPBOARD_SHARED_TRANSITIONS = "com.android.systemui.clipboard_shared_transitions"; + /** @hide */ public static final String FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE = "com.android.systemui.clipboard_use_description_mimetype"; /** @hide */ public static final String FLAG_CLOCK_FIDGET_ANIMATION = "com.android.systemui.clock_fidget_animation"; /** @hide */ - public static final String FLAG_CLOCK_MODERNIZATION = "com.android.systemui.clock_modernization"; - /** @hide */ public static final String FLAG_COMMUNAL_BOUNCER_DO_NOT_MODIFY_PLUGIN_OPEN = "com.android.systemui.communal_bouncer_do_not_modify_plugin_open"; /** @hide */ public static final String FLAG_COMMUNAL_EDIT_WIDGETS_ACTIVITY_FINISH_FIX = "com.android.systemui.communal_edit_widgets_activity_finish_fix"; @@ -50,7 +54,7 @@ public final class Flags { /** @hide */ public static final String FLAG_COMMUNAL_RESPONSIVE_GRID = "com.android.systemui.communal_responsive_grid"; /** @hide */ - public static final String FLAG_COMMUNAL_SHADE_TOUCH_HANDLING_FIXES = "com.android.systemui.communal_shade_touch_handling_fixes"; + public static final String FLAG_COMMUNAL_SCENE_KTF_REFACTOR = "com.android.systemui.communal_scene_ktf_refactor"; /** @hide */ public static final String FLAG_COMMUNAL_STANDALONE_SUPPORT = "com.android.systemui.communal_standalone_support"; /** @hide */ @@ -70,33 +74,33 @@ public final class Flags { /** @hide */ public static final String FLAG_COROUTINE_TRACING = "com.android.systemui.coroutine_tracing"; /** @hide */ + public static final String FLAG_CREATE_WINDOWLESS_WINDOW_MAGNIFIER = "com.android.systemui.create_windowless_window_magnifier"; + /** @hide */ + public static final String FLAG_DEBUG_LIVE_UPDATES_PROMOTE_ALL = "com.android.systemui.debug_live_updates_promote_all"; + /** @hide */ public static final String FLAG_DECOUPLE_VIEW_CONTROLLER_IN_ANIMLIB = "com.android.systemui.decouple_view_controller_in_animlib"; /** @hide */ + public static final String FLAG_DELAY_SHOW_MAGNIFICATION_BUTTON = "com.android.systemui.delay_show_magnification_button"; + /** @hide */ public static final String FLAG_DESKTOP_EFFECTS_QS_TILE = "com.android.systemui.desktop_effects_qs_tile"; /** @hide */ - public static final String FLAG_DESKTOP_SCREEN_CAPTURE = "com.android.systemui.desktop_screen_capture"; + public static final String FLAG_DEVICE_ENTRY_UDFPS_REFACTOR = "com.android.systemui.device_entry_udfps_refactor"; + /** @hide */ + public static final String FLAG_DISABLE_BLURRED_SHADE_VISIBLE = "com.android.systemui.disable_blurred_shade_visible"; /** @hide */ public static final String FLAG_DISABLE_CONTEXTUAL_TIPS_FREQUENCY_CHECK = "com.android.systemui.disable_contextual_tips_frequency_check"; /** @hide */ public static final String FLAG_DISABLE_CONTEXTUAL_TIPS_IOS_SWITCHER_CHECK = "com.android.systemui.disable_contextual_tips_ios_switcher_check"; /** @hide */ - public static final String FLAG_DISABLE_DOUBLE_CLICK_SWAP_ON_BOUNCER = "com.android.systemui.disable_double_click_swap_on_bouncer"; - /** @hide */ - public static final String FLAG_DO_NOT_USE_IMMEDIATE_COROUTINE_DISPATCHER = "com.android.systemui.do_not_use_immediate_coroutine_dispatcher"; + public static final String FLAG_DISABLE_SHADE_TRACKPAD_TWO_FINGER_SWIPE = "com.android.systemui.disable_shade_trackpad_two_finger_swipe"; /** @hide */ public static final String FLAG_DOUBLE_TAP_TO_SLEEP = "com.android.systemui.double_tap_to_sleep"; /** @hide */ - public static final String FLAG_DREAM_BIOMETRIC_PROMPT_FIXES = "com.android.systemui.dream_biometric_prompt_fixes"; - /** @hide */ public static final String FLAG_DREAM_INPUT_SESSION_PILFER_ONCE = "com.android.systemui.dream_input_session_pilfer_once"; /** @hide */ public static final String FLAG_DREAM_OVERLAY_BOUNCER_SWIPE_DIRECTION_FILTERING = "com.android.systemui.dream_overlay_bouncer_swipe_direction_filtering"; /** @hide */ - public static final String FLAG_DREAM_OVERLAY_UPDATED_UI = "com.android.systemui.dream_overlay_updated_ui"; - /** @hide */ - public static final String FLAG_DREAM_PREVIEW_TAP_DISMISS = "com.android.systemui.dream_preview_tap_dismiss"; - /** @hide */ - public static final String FLAG_DREAM_TRANSITION_FIXES = "com.android.systemui.dream_transition_fixes"; + public static final String FLAG_DREAM_OVERLAY_UPDATED_FONT = "com.android.systemui.dream_overlay_updated_font"; /** @hide */ public static final String FLAG_EDGE_BACK_GESTURE_HANDLER_THREAD = "com.android.systemui.edge_back_gesture_handler_thread"; /** @hide */ @@ -104,8 +108,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_BACKGROUND_KEYGUARD_ONDRAWN_CALLBACK = "com.android.systemui.enable_background_keyguard_ondrawn_callback"; /** @hide */ - public static final String FLAG_ENABLE_CONSTRAINT_LAYOUT_LOCKSCREEN_ON_EXTERNAL_DISPLAY = "com.android.systemui.enable_constraint_layout_lockscreen_on_external_display"; - /** @hide */ public static final String FLAG_ENABLE_CONTEXTUAL_TIP_FOR_MUTE_VOLUME = "com.android.systemui.enable_contextual_tip_for_mute_volume"; /** @hide */ public static final String FLAG_ENABLE_CONTEXTUAL_TIP_FOR_POWER_OFF = "com.android.systemui.enable_contextual_tip_for_power_off"; @@ -114,18 +116,10 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_CONTEXTUAL_TIPS = "com.android.systemui.enable_contextual_tips"; /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_GROWTH = "com.android.systemui.enable_desktop_growth"; - /** @hide */ public static final String FLAG_ENABLE_EFFICIENT_DISPLAY_REPOSITORY = "com.android.systemui.enable_efficient_display_repository"; /** @hide */ public static final String FLAG_ENABLE_LAYOUT_TRACING = "com.android.systemui.enable_layout_tracing"; /** @hide */ - public static final String FLAG_ENABLE_MINMODE = "com.android.systemui.enable_minmode"; - /** @hide */ - public static final String FLAG_ENABLE_SUGGESTED_DEVICE_UI = "com.android.systemui.enable_suggested_device_ui"; - /** @hide */ - public static final String FLAG_ENABLE_TOP_UI_CONTROLLER = "com.android.systemui.enable_top_ui_controller"; - /** @hide */ public static final String FLAG_ENABLE_UNDERLAY = "com.android.systemui.enable_underlay"; /** @hide */ public static final String FLAG_ENABLE_VIEW_CAPTURE_TRACING = "com.android.systemui.enable_view_capture_tracing"; @@ -142,32 +136,38 @@ public final class Flags { /** @hide */ public static final String FLAG_EXTENDED_APPS_SHORTCUT_CATEGORY = "com.android.systemui.extended_apps_shortcut_category"; /** @hide */ + public static final String FLAG_FACE_MESSAGE_DEFER_UPDATE = "com.android.systemui.face_message_defer_update"; + /** @hide */ public static final String FLAG_FACE_SCANNING_ANIMATION_NPE_FIX = "com.android.systemui.face_scanning_animation_npe_fix"; /** @hide */ + public static final String FLAG_FASTER_UNLOCK_TRANSITION = "com.android.systemui.faster_unlock_transition"; + /** @hide */ public static final String FLAG_FETCH_BOOKMARKS_XML_KEYBOARD_SHORTCUTS = "com.android.systemui.fetch_bookmarks_xml_keyboard_shortcuts"; /** @hide */ - public static final String FLAG_FIX_DIALOG_LAUNCH_ANIMATION_JANK_LOGGING = "com.android.systemui.fix_dialog_launch_animation_jank_logging"; + public static final String FLAG_FIX_IMAGE_WALLPAPER_CRASH_SURFACE_ALREADY_RELEASED = "com.android.systemui.fix_image_wallpaper_crash_surface_already_released"; /** @hide */ public static final String FLAG_FIX_SCREENSHOT_ACTION_DISMISS_SYSTEM_WINDOWS = "com.android.systemui.fix_screenshot_action_dismiss_system_windows"; /** @hide */ - public static final String FLAG_FLASHLIGHT_STRENGTH = "com.android.systemui.flashlight_strength"; - /** @hide */ public static final String FLAG_FLOATING_MENU_ANIMATED_TUCK = "com.android.systemui.floating_menu_animated_tuck"; /** @hide */ + public static final String FLAG_FLOATING_MENU_DISPLAY_CUTOUT_SUPPORT = "com.android.systemui.floating_menu_display_cutout_support"; + /** @hide */ + public static final String FLAG_FLOATING_MENU_DRAG_TO_EDIT = "com.android.systemui.floating_menu_drag_to_edit"; + /** @hide */ public static final String FLAG_FLOATING_MENU_DRAG_TO_HIDE = "com.android.systemui.floating_menu_drag_to_hide"; /** @hide */ public static final String FLAG_FLOATING_MENU_HEARING_DEVICE_STATUS_ICON = "com.android.systemui.floating_menu_hearing_device_status_icon"; /** @hide */ public static final String FLAG_FLOATING_MENU_IME_DISPLACEMENT_ANIMATION = "com.android.systemui.floating_menu_ime_displacement_animation"; /** @hide */ + public static final String FLAG_FLOATING_MENU_NARROW_TARGET_CONTENT_OBSERVER = "com.android.systemui.floating_menu_narrow_target_content_observer"; + /** @hide */ public static final String FLAG_FLOATING_MENU_NOTIFY_TARGETS_CHANGED_ON_STRICT_DIFF = "com.android.systemui.floating_menu_notify_targets_changed_on_strict_diff"; /** @hide */ public static final String FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG = "com.android.systemui.floating_menu_overlaps_nav_bars_flag"; /** @hide */ public static final String FLAG_FLOATING_MENU_RADII_ANIMATION = "com.android.systemui.floating_menu_radii_animation"; /** @hide */ - public static final String FLAG_FLOATING_MENU_REMOVE_FULLSCREEN_TAPS = "com.android.systemui.floating_menu_remove_fullscreen_taps"; - /** @hide */ public static final String FLAG_GET_CONNECTED_DEVICE_NAME_UNSYNCHRONIZED = "com.android.systemui.get_connected_device_name_unsynchronized"; /** @hide */ public static final String FLAG_GLANCEABLE_HUB_ALLOW_KEYGUARD_WHEN_DREAMING = "com.android.systemui.glanceable_hub_allow_keyguard_when_dreaming"; @@ -180,6 +180,8 @@ public final class Flags { /** @hide */ public static final String FLAG_GLANCEABLE_HUB_V2_RESOURCES = "com.android.systemui.glanceable_hub_v2_resources"; /** @hide */ + public static final String FLAG_HAPTICS_FOR_COMPOSE_SLIDERS = "com.android.systemui.haptics_for_compose_sliders"; + /** @hide */ public static final String FLAG_HARDWARE_COLOR_STYLES = "com.android.systemui.hardware_color_styles"; /** @hide */ public static final String FLAG_HEARING_AIDS_QS_TILE_DIALOG = "com.android.systemui.hearing_aids_qs_tile_dialog"; @@ -190,19 +192,17 @@ public final class Flags { /** @hide */ public static final String FLAG_HOME_CONTROLS_DREAM_HSUM = "com.android.systemui.home_controls_dream_hsum"; /** @hide */ - public static final String FLAG_HSU_BEHAVIOR_CHANGES = "com.android.systemui.hsu_behavior_changes"; - /** @hide */ - public static final String FLAG_HUB_BLURRED_BY_SHADE_FIX = "com.android.systemui.hub_blurred_by_shade_fix"; - /** @hide */ public static final String FLAG_HUB_EDIT_MODE_TOUCH_ADJUSTMENTS = "com.android.systemui.hub_edit_mode_touch_adjustments"; /** @hide */ - public static final String FLAG_HUB_EDIT_MODE_TRANSITION = "com.android.systemui.hub_edit_mode_transition"; + public static final String FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE = "com.android.systemui.hubmode_fullscreen_vertical_swipe"; + /** @hide */ + public static final String FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX = "com.android.systemui.hubmode_fullscreen_vertical_swipe_fix"; /** @hide */ public static final String FLAG_ICON_REFRESH_2025 = "com.android.systemui.icon_refresh_2025"; /** @hide */ - public static final String FLAG_INDICATION_TEXT_A11Y_FIX = "com.android.systemui.indication_text_a11y_fix"; + public static final String FLAG_IGNORE_TOUCHES_NEXT_TO_NOTIFICATION_SHELF = "com.android.systemui.ignore_touches_next_to_notification_shelf"; /** @hide */ - public static final String FLAG_INSTANT_HIDE_SHADE = "com.android.systemui.instant_hide_shade"; + public static final String FLAG_INDICATION_TEXT_A11Y_FIX = "com.android.systemui.indication_text_a11y_fix"; /** @hide */ public static final String FLAG_KEYBOARD_DOCKING_INDICATOR = "com.android.systemui.keyboard_docking_indicator"; /** @hide */ @@ -214,26 +214,38 @@ public final class Flags { /** @hide */ public static final String FLAG_KEYGUARD_TRANSITION_FORCE_FINISH_ON_SCREEN_OFF = "com.android.systemui.keyguard_transition_force_finish_on_screen_off"; /** @hide */ + public static final String FLAG_KEYGUARD_WM_REORDER_ATMS_CALLS = "com.android.systemui.keyguard_wm_reorder_atms_calls"; + /** @hide */ public static final String FLAG_KEYGUARD_WM_STATE_REFACTOR = "com.android.systemui.keyguard_wm_state_refactor"; /** @hide */ public static final String FLAG_LOCKSCREEN_FONT = "com.android.systemui.lockscreen_font"; /** @hide */ public static final String FLAG_LOW_LIGHT_CLOCK_DREAM = "com.android.systemui.low_light_clock_dream"; /** @hide */ - public static final String FLAG_LOWLIGHT_CLOCK_SET_BRIGHTNESS = "com.android.systemui.lowlight_clock_set_brightness"; - /** @hide */ - public static final String FLAG_LOWLIGHT_CLOCK_USES_KEYGUARD_CHARGING_STATUS = "com.android.systemui.lowlight_clock_uses_keyguard_charging_status"; - /** @hide */ public static final String FLAG_MAGNETIC_NOTIFICATION_SWIPES = "com.android.systemui.magnetic_notification_swipes"; /** @hide */ + public static final String FLAG_MEDIA_CONTROLS_A11Y_COLORS = "com.android.systemui.media_controls_a11y_colors"; + /** @hide */ public static final String FLAG_MEDIA_CONTROLS_BUTTON_MEDIA3 = "com.android.systemui.media_controls_button_media3"; /** @hide */ public static final String FLAG_MEDIA_CONTROLS_BUTTON_MEDIA3_PLACEMENT = "com.android.systemui.media_controls_button_media3_placement"; /** @hide */ - public static final String FLAG_MEDIA_CONTROLS_IN_COMPOSE = "com.android.systemui.media_controls_in_compose"; + public static final String FLAG_MEDIA_CONTROLS_DEVICE_MANAGER_BACKGROUND_EXECUTION = "com.android.systemui.media_controls_device_manager_background_execution"; + /** @hide */ + public static final String FLAG_MEDIA_CONTROLS_DRAWABLES_REUSE_BUGFIX = "com.android.systemui.media_controls_drawables_reuse_bugfix"; + /** @hide */ + public static final String FLAG_MEDIA_CONTROLS_LOCKSCREEN_SHADE_BUG_FIX = "com.android.systemui.media_controls_lockscreen_shade_bug_fix"; /** @hide */ public static final String FLAG_MEDIA_CONTROLS_UI_UPDATE = "com.android.systemui.media_controls_ui_update"; /** @hide */ + public static final String FLAG_MEDIA_CONTROLS_UMO_INFLATION_IN_BACKGROUND = "com.android.systemui.media_controls_umo_inflation_in_background"; + /** @hide */ + public static final String FLAG_MEDIA_CONTROLS_USER_INITIATED_DELETEINTENT = "com.android.systemui.media_controls_user_initiated_deleteintent"; + /** @hide */ + public static final String FLAG_MEDIA_LOAD_METADATA_VIA_MEDIA_DATA_LOADER = "com.android.systemui.media_load_metadata_via_media_data_loader"; + /** @hide */ + public static final String FLAG_MEDIA_LOCKSCREEN_LAUNCH_ANIMATION = "com.android.systemui.media_lockscreen_launch_animation"; + /** @hide */ public static final String FLAG_MEDIA_PROJECTION_DIALOG_BEHIND_LOCKSCREEN = "com.android.systemui.media_projection_dialog_behind_lockscreen"; /** @hide */ public static final String FLAG_MEDIA_PROJECTION_GREY_ERROR_TEXT = "com.android.systemui.media_projection_grey_error_text"; @@ -250,8 +262,6 @@ public final class Flags { /** @hide */ public static final String FLAG_NEW_AOD_TRANSITION = "com.android.systemui.new_aod_transition"; /** @hide */ - public static final String FLAG_NEW_DOZING_KEYGUARD_STATES = "com.android.systemui.new_dozing_keyguard_states"; - /** @hide */ public static final String FLAG_NEW_VOLUME_PANEL = "com.android.systemui.new_volume_panel"; /** @hide */ public static final String FLAG_NON_TOUCHSCREEN_DEVICES_BYPASS_FALSING = "com.android.systemui.non_touchscreen_devices_bypass_falsing"; @@ -284,15 +294,19 @@ public final class Flags { /** @hide */ public static final String FLAG_NOTIFICATION_FOOTER_BACKGROUND_TINT_OPTIMIZATION = "com.android.systemui.notification_footer_background_tint_optimization"; /** @hide */ + public static final String FLAG_NOTIFICATION_OVER_EXPANSION_CLIPPING_FIX = "com.android.systemui.notification_over_expansion_clipping_fix"; + /** @hide */ + public static final String FLAG_NOTIFICATION_REENTRANT_DISMISS = "com.android.systemui.notification_reentrant_dismiss"; + /** @hide */ public static final String FLAG_NOTIFICATION_ROW_ACCESSIBILITY_EXPANDED = "com.android.systemui.notification_row_accessibility_expanded"; /** @hide */ public static final String FLAG_NOTIFICATION_ROW_CONTENT_BINDER_REFACTOR = "com.android.systemui.notification_row_content_binder_refactor"; /** @hide */ public static final String FLAG_NOTIFICATION_ROW_TRANSPARENCY = "com.android.systemui.notification_row_transparency"; /** @hide */ - public static final String FLAG_NOTIFICATION_SHADE_BLUR = "com.android.systemui.notification_shade_blur"; + public static final String FLAG_NOTIFICATION_ROW_USER_CONTEXT = "com.android.systemui.notification_row_user_context"; /** @hide */ - public static final String FLAG_NOTIFICATION_SHADE_CLOSE_WAITS_FOR_CHILD_ANIMATIONS = "com.android.systemui.notification_shade_close_waits_for_child_animations"; + public static final String FLAG_NOTIFICATION_SHADE_BLUR = "com.android.systemui.notification_shade_blur"; /** @hide */ public static final String FLAG_NOTIFICATION_SHADE_UI_THREAD = "com.android.systemui.notification_shade_ui_thread"; /** @hide */ @@ -300,14 +314,14 @@ public final class Flags { /** @hide */ public static final String FLAG_NOTIFICATION_TRANSPARENT_HEADER_FIX = "com.android.systemui.notification_transparent_header_fix"; /** @hide */ + public static final String FLAG_NOTIFICATION_VIEW_FLIPPER_PAUSING_V2 = "com.android.systemui.notification_view_flipper_pausing_v2"; + /** @hide */ public static final String FLAG_NOTIFICATIONS_BACKGROUND_ICONS = "com.android.systemui.notifications_background_icons"; /** @hide */ public static final String FLAG_NOTIFICATIONS_FOOTER_VISIBILITY_FIX = "com.android.systemui.notifications_footer_visibility_fix"; /** @hide */ public static final String FLAG_NOTIFICATIONS_HIDE_ON_DISPLAY_SWITCH = "com.android.systemui.notifications_hide_on_display_switch"; /** @hide */ - public static final String FLAG_NOTIFICATIONS_HUN_ACCESSIBILITY_REFACTOR = "com.android.systemui.notifications_hun_accessibility_refactor"; - /** @hide */ public static final String FLAG_NOTIFICATIONS_HUN_SHARED_ANIMATION_VALUES = "com.android.systemui.notifications_hun_shared_animation_values"; /** @hide */ public static final String FLAG_NOTIFICATIONS_ICON_CONTAINER_REFACTOR = "com.android.systemui.notifications_icon_container_refactor"; @@ -320,11 +334,15 @@ public final class Flags { /** @hide */ public static final String FLAG_NOTIFICATIONS_REDESIGN_FOOTER_VIEW = "com.android.systemui.notifications_redesign_footer_view"; /** @hide */ + public static final String FLAG_NOTIFICATIONS_REDESIGN_GUTS = "com.android.systemui.notifications_redesign_guts"; + /** @hide */ public static final String FLAG_NOTIFY_PASSWORD_TEXT_VIEW_USER_ACTIVITY_IN_BACKGROUND = "com.android.systemui.notify_password_text_view_user_activity_in_background"; /** @hide */ public static final String FLAG_NOTIFY_POWER_MANAGER_USER_ACTIVITY_BACKGROUND = "com.android.systemui.notify_power_manager_user_activity_background"; /** @hide */ - public static final String FLAG_ONGOING_ACTIVITY_CHIPS_ON_DREAM = "com.android.systemui.ongoing_activity_chips_on_dream"; + public static final String FLAG_ONLY_SHOW_MEDIA_STREAM_SLIDER_IN_SINGLE_VOLUME_MODE = "com.android.systemui.only_show_media_stream_slider_in_single_volume_mode"; + /** @hide */ + public static final String FLAG_OUTPUT_SWITCHER_REDESIGN = "com.android.systemui.output_switcher_redesign"; /** @hide */ public static final String FLAG_OVERRIDE_SUPPRESS_OVERLAY_CONDITION = "com.android.systemui.override_suppress_overlay_condition"; /** @hide */ @@ -340,38 +358,38 @@ public final class Flags { /** @hide */ public static final String FLAG_PREDICTIVE_BACK_DELAY_WM_TRANSITION = "com.android.systemui.predictive_back_delay_wm_transition"; /** @hide */ - public static final String FLAG_PRIVACY_DOT_LIVE_REGION = "com.android.systemui.privacy_dot_live_region"; + public static final String FLAG_PRIORITY_PEOPLE_SECTION = "com.android.systemui.priority_people_section"; /** @hide */ public static final String FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY = "com.android.systemui.promote_notifications_automatically"; /** @hide */ + public static final String FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN = "com.android.systemui.pss_app_selector_recents_split_screen"; + /** @hide */ public static final String FLAG_PSS_TASK_SWITCHER = "com.android.systemui.pss_task_switcher"; /** @hide */ - public static final String FLAG_QS_COMPOSE_FRAGMENT_EARLY_EXPANSION = "com.android.systemui.qs_compose_fragment_early_expansion"; - /** @hide */ - public static final String FLAG_QS_EDIT_MODE_TABS = "com.android.systemui.qs_edit_mode_tabs"; - /** @hide */ - public static final String FLAG_QS_EDIT_MODE_TOOLTIP = "com.android.systemui.qs_edit_mode_tooltip"; + public static final String FLAG_QS_CUSTOM_TILE_CLICK_GUARANTEED_BUG_FIX = "com.android.systemui.qs_custom_tile_click_guaranteed_bug_fix"; /** @hide */ public static final String FLAG_QS_NEW_TILES = "com.android.systemui.qs_new_tiles"; /** @hide */ public static final String FLAG_QS_NEW_TILES_FUTURE = "com.android.systemui.qs_new_tiles_future"; /** @hide */ + public static final String FLAG_QS_QUICK_REBIND_ACTIVE_TILES = "com.android.systemui.qs_quick_rebind_active_tiles"; + /** @hide */ + public static final String FLAG_QS_REGISTER_SETTING_OBSERVER_ON_BG_THREAD = "com.android.systemui.qs_register_setting_observer_on_bg_thread"; + /** @hide */ public static final String FLAG_QS_TILE_DETAILED_VIEW = "com.android.systemui.qs_tile_detailed_view"; /** @hide */ public static final String FLAG_QS_TILE_FOCUS_STATE = "com.android.systemui.qs_tile_focus_state"; /** @hide */ - public static final String FLAG_QS_TILE_TRANSITION_INTERACTION_REFINEMENT = "com.android.systemui.qs_tile_transition_interaction_refinement"; - /** @hide */ public static final String FLAG_QS_UI_REFACTOR = "com.android.systemui.qs_ui_refactor"; /** @hide */ public static final String FLAG_QS_UI_REFACTOR_COMPOSE_FRAGMENT = "com.android.systemui.qs_ui_refactor_compose_fragment"; /** @hide */ - public static final String FLAG_QS_WIFI_CONFIG = "com.android.systemui.qs_wifi_config"; - /** @hide */ public static final String FLAG_RECORD_ISSUE_QS_TILE = "com.android.systemui.record_issue_qs_tile"; /** @hide */ public static final String FLAG_REDESIGN_MAGNIFICATION_WINDOW_SIZE = "com.android.systemui.redesign_magnification_window_size"; /** @hide */ + public static final String FLAG_REFACTOR_GET_CURRENT_USER = "com.android.systemui.refactor_get_current_user"; + /** @hide */ public static final String FLAG_REGISTER_BATTERY_CONTROLLER_RECEIVERS_IN_CORESTARTABLE = "com.android.systemui.register_battery_controller_receivers_in_corestartable"; /** @hide */ public static final String FLAG_REGISTER_CONTENT_OBSERVERS_ASYNC = "com.android.systemui.register_content_observers_async"; @@ -380,22 +398,16 @@ public final class Flags { /** @hide */ public static final String FLAG_REGISTER_WALLPAPER_NOTIFIER_BACKGROUND = "com.android.systemui.register_wallpaper_notifier_background"; /** @hide */ - public static final String FLAG_REMEMBER_VIEW_MODEL_OFF_MAIN_THREAD = "com.android.systemui.remember_view_model_off_main_thread"; - /** @hide */ - public static final String FLAG_REMOVE_AOD_CAR_MODE = "com.android.systemui.remove_aod_car_mode"; + public static final String FLAG_RELOCK_WITH_POWER_BUTTON_IMMEDIATELY = "com.android.systemui.relock_with_power_button_immediately"; /** @hide */ public static final String FLAG_REMOVE_DREAM_OVERLAY_HIDE_ON_TOUCH = "com.android.systemui.remove_dream_overlay_hide_on_touch"; /** @hide */ - public static final String FLAG_REMOVE_NEARBY_SHARE_TILE_ANIMATION = "com.android.systemui.remove_nearby_share_tile_animation"; - /** @hide */ public static final String FLAG_REMOVE_UPDATE_LISTENER_IN_QS_ICON_VIEW_IMPL = "com.android.systemui.remove_update_listener_in_qs_icon_view_impl"; /** @hide */ public static final String FLAG_REST_TO_UNLOCK = "com.android.systemui.rest_to_unlock"; /** @hide */ public static final String FLAG_RESTART_DREAM_ON_UNOCCLUDE = "com.android.systemui.restart_dream_on_unocclude"; /** @hide */ - public static final String FLAG_RESTRICT_COMMUNAL_APP_WIDGET_HOST_LISTENING = "com.android.systemui.restrict_communal_app_widget_host_listening"; - /** @hide */ public static final String FLAG_REVAMPED_BOUNCER_MESSAGES = "com.android.systemui.revamped_bouncer_messages"; /** @hide */ public static final String FLAG_RUN_FINGERPRINT_DETECT_ON_DISMISSIBLE_KEYGUARD = "com.android.systemui.run_fingerprint_detect_on_dismissible_keyguard"; @@ -404,31 +416,27 @@ public final class Flags { /** @hide */ public static final String FLAG_SCENE_CONTAINER = "com.android.systemui.scene_container"; /** @hide */ - public static final String FLAG_SCREEN_REACTIONS = "com.android.systemui.screen_reactions"; - /** @hide */ public static final String FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX = "com.android.systemui.screenshare_notification_hiding_bug_fix"; /** @hide */ public static final String FLAG_SCREENSHOT_ACTION_DISMISS_SYSTEM_WINDOWS = "com.android.systemui.screenshot_action_dismiss_system_windows"; /** @hide */ - public static final String FLAG_SCREENSHOT_ANNOUNCE_LIVE_REGION = "com.android.systemui.screenshot_announce_live_region"; - /** @hide */ public static final String FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE = "com.android.systemui.screenshot_multidisplay_focus_change"; /** @hide */ public static final String FLAG_SCREENSHOT_POLICY_SPLIT_AND_DESKTOP_MODE = "com.android.systemui.screenshot_policy_split_and_desktop_mode"; /** @hide */ public static final String FLAG_SCREENSHOT_SCROLL_CROP_VIEW_CRASH_FIX = "com.android.systemui.screenshot_scroll_crop_view_crash_fix"; /** @hide */ + public static final String FLAG_SCREENSHOT_UI_CONTROLLER_REFACTOR = "com.android.systemui.screenshot_ui_controller_refactor"; + /** @hide */ public static final String FLAG_SECONDARY_USER_WIDGET_HOST = "com.android.systemui.secondary_user_widget_host"; /** @hide */ public static final String FLAG_SETTINGS_EXT_REGISTER_CONTENT_OBSERVER_ON_BG_THREAD = "com.android.systemui.settings_ext_register_content_observer_on_bg_thread"; /** @hide */ public static final String FLAG_SHADE_EXPANDS_ON_STATUS_BAR_LONG_PRESS = "com.android.systemui.shade_expands_on_status_bar_long_press"; /** @hide */ - public static final String FLAG_SHADE_HEADER_BLUR_FONT_COLOR = "com.android.systemui.shade_header_blur_font_color"; - /** @hide */ public static final String FLAG_SHADE_HEADER_FONT_UPDATE = "com.android.systemui.shade_header_font_update"; /** @hide */ - public static final String FLAG_SHADE_QSVISIBLE_LOGIC = "com.android.systemui.shade_qsvisible_logic"; + public static final String FLAG_SHADE_LAUNCH_ACCESSIBILITY = "com.android.systemui.shade_launch_accessibility"; /** @hide */ public static final String FLAG_SHADE_WINDOW_GOES_AROUND = "com.android.systemui.shade_window_goes_around"; /** @hide */ @@ -442,14 +450,26 @@ public final class Flags { /** @hide */ public static final String FLAG_SHOW_LOCKED_BY_YOUR_WATCH_KEYGUARD_INDICATOR = "com.android.systemui.show_locked_by_your_watch_keyguard_indicator"; /** @hide */ + public static final String FLAG_SHOW_TOAST_WHEN_APP_CONTROL_BRIGHTNESS = "com.android.systemui.show_toast_when_app_control_brightness"; + /** @hide */ public static final String FLAG_SIM_PIN_BOUNCER_RESET = "com.android.systemui.sim_pin_bouncer_reset"; /** @hide */ + public static final String FLAG_SIM_PIN_RACE_CONDITION_ON_RESTART = "com.android.systemui.sim_pin_race_condition_on_restart"; + /** @hide */ + public static final String FLAG_SIM_PIN_USE_SLOT_ID = "com.android.systemui.sim_pin_use_slot_id"; + /** @hide */ public static final String FLAG_SKIP_HIDE_SENSITIVE_NOTIF_ANIMATION = "com.android.systemui.skip_hide_sensitive_notif_animation"; /** @hide */ + public static final String FLAG_SLICE_BROADCAST_RELAY_IN_BACKGROUND = "com.android.systemui.slice_broadcast_relay_in_background"; + /** @hide */ public static final String FLAG_SLICE_MANAGER_BINDER_CALL_BACKGROUND = "com.android.systemui.slice_manager_binder_call_background"; /** @hide */ + public static final String FLAG_SMARTSPACE_LOCKSCREEN_VIEWMODEL = "com.android.systemui.smartspace_lockscreen_viewmodel"; + /** @hide */ public static final String FLAG_SMARTSPACE_RELOCATE_TO_BOTTOM = "com.android.systemui.smartspace_relocate_to_bottom"; /** @hide */ + public static final String FLAG_SMARTSPACE_REMOTEVIEWS_RENDERING_FIX = "com.android.systemui.smartspace_remoteviews_rendering_fix"; + /** @hide */ public static final String FLAG_SMARTSPACE_SWIPE_EVENT_LOGGING_FIX = "com.android.systemui.smartspace_swipe_event_logging_fix"; /** @hide */ public static final String FLAG_SMARTSPACE_VIEWPAGER2 = "com.android.systemui.smartspace_viewpager2"; @@ -458,17 +478,11 @@ public final class Flags { /** @hide */ public static final String FLAG_SPATIAL_MODEL_APP_PUSHBACK = "com.android.systemui.spatial_model_app_pushback"; /** @hide */ - public static final String FLAG_SPATIAL_MODEL_BOUNCER_PUSHBACK = "com.android.systemui.spatial_model_bouncer_pushback"; - /** @hide */ - public static final String FLAG_SPATIAL_MODEL_PUSHBACK_IN_SHADER = "com.android.systemui.spatial_model_pushback_in_shader"; - /** @hide */ public static final String FLAG_STABILIZE_HEADS_UP_GROUP_V2 = "com.android.systemui.stabilize_heads_up_group_v2"; /** @hide */ public static final String FLAG_STATUS_BAR_ALWAYS_CHECK_UNDERLYING_NETWORKS = "com.android.systemui.status_bar_always_check_underlying_networks"; /** @hide */ - public static final String FLAG_STATUS_BAR_APP_HANDLE_TRACKING = "com.android.systemui.status_bar_app_handle_tracking"; - /** @hide */ - public static final String FLAG_STATUS_BAR_CHIP_TO_HUN_ANIMATION = "com.android.systemui.status_bar_chip_to_hun_animation"; + public static final String FLAG_STATUS_BAR_AUTO_START_SCREEN_RECORD_CHIP = "com.android.systemui.status_bar_auto_start_screen_record_chip"; /** @hide */ public static final String FLAG_STATUS_BAR_CHIPS_MODERNIZATION = "com.android.systemui.status_bar_chips_modernization"; /** @hide */ @@ -478,15 +492,15 @@ public final class Flags { /** @hide */ public static final String FLAG_STATUS_BAR_MOBILE_ICON_KAIROS = "com.android.systemui.status_bar_mobile_icon_kairos"; /** @hide */ + public static final String FLAG_STATUS_BAR_MONOCHROME_ICONS_FIX = "com.android.systemui.status_bar_monochrome_icons_fix"; + /** @hide */ public static final String FLAG_STATUS_BAR_NO_HUN_BEHAVIOR = "com.android.systemui.status_bar_no_hun_behavior"; /** @hide */ public static final String FLAG_STATUS_BAR_POPUP_CHIPS = "com.android.systemui.status_bar_popup_chips"; /** @hide */ - public static final String FLAG_STATUS_BAR_PRIVACY_CHIP_ANIMATION_EXEMPTION = "com.android.systemui.status_bar_privacy_chip_animation_exemption"; - /** @hide */ public static final String FLAG_STATUS_BAR_ROOT_MODERNIZATION = "com.android.systemui.status_bar_root_modernization"; /** @hide */ - public static final String FLAG_STATUS_BAR_RUDIMENTARY_BATTERY = "com.android.systemui.status_bar_rudimentary_battery"; + public static final String FLAG_STATUS_BAR_SHOW_AUDIO_ONLY_PROJECTION_CHIP = "com.android.systemui.status_bar_show_audio_only_projection_chip"; /** @hide */ public static final String FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR = "com.android.systemui.status_bar_signal_policy_refactor"; /** @hide */ @@ -494,17 +508,17 @@ public final class Flags { /** @hide */ public static final String FLAG_STATUS_BAR_STATIC_INOUT_INDICATORS = "com.android.systemui.status_bar_static_inout_indicators"; /** @hide */ + public static final String FLAG_STATUS_BAR_STOP_UPDATING_WINDOW_HEIGHT = "com.android.systemui.status_bar_stop_updating_window_height"; + /** @hide */ public static final String FLAG_STATUS_BAR_SWIPE_OVER_CHIP = "com.android.systemui.status_bar_swipe_over_chip"; /** @hide */ public static final String FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN = "com.android.systemui.status_bar_switch_to_spn_from_data_spn"; /** @hide */ - public static final String FLAG_STATUS_BAR_SYSTEM_STATUS_ICONS_IN_COMPOSE = "com.android.systemui.status_bar_system_status_icons_in_compose"; - /** @hide */ public static final String FLAG_STATUS_BAR_UI_THREAD = "com.android.systemui.status_bar_ui_thread"; /** @hide */ public static final String FLAG_STATUS_BAR_WINDOW_NO_CUSTOM_TOUCH = "com.android.systemui.status_bar_window_no_custom_touch"; /** @hide */ - public static final String FLAG_STUCK_HEARING_DEVICES_QS_TILE_FIX = "com.android.systemui.stuck_hearing_devices_qs_tile_fix"; + public static final String FLAG_STOPPABLE_FGS_SYSTEM_APP = "com.android.systemui.stoppable_fgs_system_app"; /** @hide */ public static final String FLAG_SWITCH_USER_ON_BG = "com.android.systemui.switch_user_on_bg"; /** @hide */ @@ -512,25 +526,33 @@ public final class Flags { /** @hide */ public static final String FLAG_THEME_OVERLAY_CONTROLLER_WAKEFULNESS_DEPRECATION = "com.android.systemui.theme_overlay_controller_wakefulness_deprecation"; /** @hide */ - public static final String FLAG_THIN_SCREEN_RECORDING_SERVICE = "com.android.systemui.thin_screen_recording_service"; + public static final String FLAG_TRANSITION_RACE_CONDITION = "com.android.systemui.transition_race_condition"; /** @hide */ - public static final String FLAG_TRANSITION_RACE_CONDITION_PART2 = "com.android.systemui.transition_race_condition_part2"; + public static final String FLAG_TRANSLUCENT_OCCLUDING_ACTIVITY_FIX = "com.android.systemui.translucent_occluding_activity_fix"; /** @hide */ public static final String FLAG_TV_GLOBAL_ACTIONS_FOCUS = "com.android.systemui.tv_global_actions_focus"; /** @hide */ - public static final String FLAG_UDFPS_SCREEN_OFF_UNLOCK_FLICKER = "com.android.systemui.udfps_screen_off_unlock_flicker"; - /** @hide */ - public static final String FLAG_UI_RICH_ONGOING_AOD_SKELETON_BG_INFLATION = "com.android.systemui.ui_rich_ongoing_aod_skeleton_bg_inflation"; + public static final String FLAG_UDFPS_VIEW_PERFORMANCE = "com.android.systemui.udfps_view_performance"; /** @hide */ public static final String FLAG_UNFOLD_ANIMATION_BACKGROUND_PROGRESS = "com.android.systemui.unfold_animation_background_progress"; /** @hide */ + public static final String FLAG_UNFOLD_LATENCY_TRACKING_FIX = "com.android.systemui.unfold_latency_tracking_fix"; + /** @hide */ public static final String FLAG_UPDATE_CORNER_RADIUS_ON_DISPLAY_CHANGED = "com.android.systemui.update_corner_radius_on_display_changed"; /** @hide */ public static final String FLAG_UPDATE_USER_SWITCHER_BACKGROUND = "com.android.systemui.update_user_switcher_background"; /** @hide */ public static final String FLAG_UPDATE_WINDOW_MAGNIFIER_BOTTOM_BOUNDARY = "com.android.systemui.update_window_magnifier_bottom_boundary"; /** @hide */ - public static final String FLAG_USE_AAD_PROX_SENSOR_IF_PRESENT = "com.android.systemui.use_aad_prox_sensor_if_present"; + public static final String FLAG_USE_AAD_PROX_SENSOR = "com.android.systemui.use_aad_prox_sensor"; + /** @hide */ + public static final String FLAG_USE_NOTIF_INFLATION_THREAD_FOR_FOOTER = "com.android.systemui.use_notif_inflation_thread_for_footer"; + /** @hide */ + public static final String FLAG_USE_NOTIF_INFLATION_THREAD_FOR_ROW = "com.android.systemui.use_notif_inflation_thread_for_row"; + /** @hide */ + public static final String FLAG_USE_TRANSITIONS_FOR_KEYGUARD_OCCLUDED = "com.android.systemui.use_transitions_for_keyguard_occluded"; + /** @hide */ + public static final String FLAG_USE_VOLUME_CONTROLLER = "com.android.systemui.use_volume_controller"; /** @hide */ public static final String FLAG_USER_AWARE_SETTINGS_REPOSITORIES = "com.android.systemui.user_aware_settings_repositories"; /** @hide */ @@ -542,308 +564,399 @@ public final class Flags { /** @hide */ public static final String FLAG_VOLUME_REDESIGN = "com.android.systemui.volume_redesign"; + + public static boolean activityTransitionUseLargestWindow() { return FEATURE_FLAGS.activityTransitionUseLargestWindow(); } + + + public static boolean addBlackBackgroundForWindowMagnifier() { + + return FEATURE_FLAGS.addBlackBackgroundForWindowMagnifier(); + } + + + public static boolean alwaysComposeQsUiFragment() { return FEATURE_FLAGS.alwaysComposeQsUiFragment(); } + + public static boolean ambientTouchMonitorListenToDisplayChanges() { return FEATURE_FLAGS.ambientTouchMonitorListenToDisplayChanges(); } - public static boolean animationLibraryDelayLeashCleanup() { - - return FEATURE_FLAGS.animationLibraryDelayLeashCleanup(); - } + public static boolean appClipsBacklinks() { return FEATURE_FLAGS.appClipsBacklinks(); } + + + public static boolean appShortcutRemovalFix() { + + return FEATURE_FLAGS.appShortcutRemovalFix(); + } + + + public static boolean avalancheReplaceHunWhenCritical() { return FEATURE_FLAGS.avalancheReplaceHunWhenCritical(); } - public static boolean backButtonOnBouncer() { + + public static boolean bindKeyguardMediaVisibility() { - return FEATURE_FLAGS.backButtonOnBouncer(); + return FEATURE_FLAGS.bindKeyguardMediaVisibility(); } - public static boolean bouncerLifecycleFix() { - - return FEATURE_FLAGS.bouncerLifecycleFix(); - } public static boolean bouncerUiRevamp() { return FEATURE_FLAGS.bouncerUiRevamp(); } + + public static boolean bouncerUiRevamp2() { return FEATURE_FLAGS.bouncerUiRevamp2(); } + + public static boolean bpColors() { return FEATURE_FLAGS.bpColors(); } + public static boolean brightnessSliderFocusState() { return FEATURE_FLAGS.brightnessSliderFocusState(); } + + + public static boolean checkLockscreenGoneTransition() { + + return FEATURE_FLAGS.checkLockscreenGoneTransition(); + } + + + public static boolean classicFlagsMultiUser() { return FEATURE_FLAGS.classicFlagsMultiUser(); } - public static boolean clipboardAnnounceLiveRegion() { + + + public static boolean clipboardImageTimeout() { - return FEATURE_FLAGS.clipboardAnnounceLiveRegion(); + return FEATURE_FLAGS.clipboardImageTimeout(); } + + public static boolean clipboardNoninteractiveOnLockscreen() { + + return FEATURE_FLAGS.clipboardNoninteractiveOnLockscreen(); + } + + + public static boolean clipboardOverlayMultiuser() { return FEATURE_FLAGS.clipboardOverlayMultiuser(); } + + + public static boolean clipboardSharedTransitions() { + + return FEATURE_FLAGS.clipboardSharedTransitions(); + } + + + public static boolean clipboardUseDescriptionMimetype() { return FEATURE_FLAGS.clipboardUseDescriptionMimetype(); } + public static boolean clockFidgetAnimation() { return FEATURE_FLAGS.clockFidgetAnimation(); } - public static boolean clockModernization() { - - return FEATURE_FLAGS.clockModernization(); - } public static boolean communalBouncerDoNotModifyPluginOpen() { return FEATURE_FLAGS.communalBouncerDoNotModifyPluginOpen(); } + + public static boolean communalEditWidgetsActivityFinishFix() { return FEATURE_FLAGS.communalEditWidgetsActivityFinishFix(); } + + public static boolean communalHub() { return FEATURE_FLAGS.communalHub(); } + + public static boolean communalHubUseThreadPoolForWidgets() { return FEATURE_FLAGS.communalHubUseThreadPoolForWidgets(); } + public static boolean communalResponsiveGrid() { return FEATURE_FLAGS.communalResponsiveGrid(); } - public static boolean communalShadeTouchHandlingFixes() { + + + public static boolean communalSceneKtfRefactor() { - return FEATURE_FLAGS.communalShadeTouchHandlingFixes(); + return FEATURE_FLAGS.communalSceneKtfRefactor(); } + public static boolean communalStandaloneSupport() { return FEATURE_FLAGS.communalStandaloneSupport(); } + + public static boolean communalTimerFlickerFix() { return FEATURE_FLAGS.communalTimerFlickerFix(); } + + public static boolean communalWidgetResizing() { return FEATURE_FLAGS.communalWidgetResizing(); } + + public static boolean communalWidgetTrampolineFix() { return FEATURE_FLAGS.communalWidgetTrampolineFix(); } + public static boolean composeBouncer() { return FEATURE_FLAGS.composeBouncer(); } + public static boolean confineNotificationTouchToViewWidth() { return FEATURE_FLAGS.confineNotificationTouchToViewWidth(); } + + public static boolean contAuthPlugin() { return FEATURE_FLAGS.contAuthPlugin(); } + + public static boolean contextualTipsAssistantDismissFix() { return FEATURE_FLAGS.contextualTipsAssistantDismissFix(); } + public static boolean coroutineTracing() { return FEATURE_FLAGS.coroutineTracing(); } + + public static boolean createWindowlessWindowMagnifier() { + + return FEATURE_FLAGS.createWindowlessWindowMagnifier(); + } + + + + public static boolean debugLiveUpdatesPromoteAll() { + + return FEATURE_FLAGS.debugLiveUpdatesPromoteAll(); + } + + + public static boolean decoupleViewControllerInAnimlib() { return FEATURE_FLAGS.decoupleViewControllerInAnimlib(); } + + public static boolean delayShowMagnificationButton() { + + return FEATURE_FLAGS.delayShowMagnificationButton(); + } + + + public static boolean desktopEffectsQsTile() { return FEATURE_FLAGS.desktopEffectsQsTile(); } - public static boolean desktopScreenCapture() { + + public static boolean deviceEntryUdfpsRefactor() { - return FEATURE_FLAGS.desktopScreenCapture(); + return FEATURE_FLAGS.deviceEntryUdfpsRefactor(); } + + public static boolean disableBlurredShadeVisible() { + + return FEATURE_FLAGS.disableBlurredShadeVisible(); + } + + + public static boolean disableContextualTipsFrequencyCheck() { return FEATURE_FLAGS.disableContextualTipsFrequencyCheck(); } + public static boolean disableContextualTipsIosSwitcherCheck() { return FEATURE_FLAGS.disableContextualTipsIosSwitcherCheck(); } - public static boolean disableDoubleClickSwapOnBouncer() { + + public static boolean disableShadeTrackpadTwoFingerSwipe() { - return FEATURE_FLAGS.disableDoubleClickSwapOnBouncer(); + return FEATURE_FLAGS.disableShadeTrackpadTwoFingerSwipe(); } - public static boolean doNotUseImmediateCoroutineDispatcher() { - - return FEATURE_FLAGS.doNotUseImmediateCoroutineDispatcher(); - } - public static boolean doubleTapToSleep() { return FEATURE_FLAGS.doubleTapToSleep(); } - public static boolean dreamBiometricPromptFixes() { - - return FEATURE_FLAGS.dreamBiometricPromptFixes(); - } + public static boolean dreamInputSessionPilferOnce() { return FEATURE_FLAGS.dreamInputSessionPilferOnce(); } + + public static boolean dreamOverlayBouncerSwipeDirectionFiltering() { return FEATURE_FLAGS.dreamOverlayBouncerSwipeDirectionFiltering(); } - public static boolean dreamOverlayUpdatedUi() { - - return FEATURE_FLAGS.dreamOverlayUpdatedUi(); - } - - public static boolean dreamPreviewTapDismiss() { - - return FEATURE_FLAGS.dreamPreviewTapDismiss(); - } - public static boolean dreamTransitionFixes() { + public static boolean dreamOverlayUpdatedFont() { - return FEATURE_FLAGS.dreamTransitionFixes(); + return FEATURE_FLAGS.dreamOverlayUpdatedFont(); } + public static boolean edgeBackGestureHandlerThread() { return FEATURE_FLAGS.edgeBackGestureHandlerThread(); } + + public static boolean edgebackGestureHandlerGetRunningTasksBackground() { return FEATURE_FLAGS.edgebackGestureHandlerGetRunningTasksBackground(); } + + public static boolean enableBackgroundKeyguardOndrawnCallback() { return FEATURE_FLAGS.enableBackgroundKeyguardOndrawnCallback(); } - public static boolean enableConstraintLayoutLockscreenOnExternalDisplay() { - - return FEATURE_FLAGS.enableConstraintLayoutLockscreenOnExternalDisplay(); - } public static boolean enableContextualTipForMuteVolume() { return FEATURE_FLAGS.enableContextualTipForMuteVolume(); } + + public static boolean enableContextualTipForPowerOff() { return FEATURE_FLAGS.enableContextualTipForPowerOff(); } + + public static boolean enableContextualTipForTakeScreenshot() { return FEATURE_FLAGS.enableContextualTipForTakeScreenshot(); } + + public static boolean enableContextualTips() { return FEATURE_FLAGS.enableContextualTips(); } - public static boolean enableDesktopGrowth() { - - return FEATURE_FLAGS.enableDesktopGrowth(); - } public static boolean enableEfficientDisplayRepository() { @@ -851,28 +964,13 @@ public final class Flags { } + public static boolean enableLayoutTracing() { return FEATURE_FLAGS.enableLayoutTracing(); } - public static boolean enableMinmode() { - - return FEATURE_FLAGS.enableMinmode(); - } - - - public static boolean enableSuggestedDeviceUi() { - - return FEATURE_FLAGS.enableSuggestedDeviceUi(); - } - - public static boolean enableTopUiController() { - - return FEATURE_FLAGS.enableTopUiController(); - } - public static boolean enableUnderlay() { @@ -880,70 +978,97 @@ public final class Flags { } + public static boolean enableViewCaptureTracing() { return FEATURE_FLAGS.enableViewCaptureTracing(); } + + public static boolean enforceBrightnessBaseUserRestriction() { return FEATURE_FLAGS.enforceBrightnessBaseUserRestriction(); } + public static boolean exampleFlag() { return FEATURE_FLAGS.exampleFlag(); } + + public static boolean expandCollapsePrivacyDialog() { return FEATURE_FLAGS.expandCollapsePrivacyDialog(); } + + public static boolean expandHeadsUpOnInlineReply() { return FEATURE_FLAGS.expandHeadsUpOnInlineReply(); } + public static boolean expandedPrivacyIndicatorsOnLargeScreen() { return FEATURE_FLAGS.expandedPrivacyIndicatorsOnLargeScreen(); } + public static boolean extendedAppsShortcutCategory() { return FEATURE_FLAGS.extendedAppsShortcutCategory(); } + + + public static boolean faceMessageDeferUpdate() { + + return FEATURE_FLAGS.faceMessageDeferUpdate(); + } + + + public static boolean faceScanningAnimationNpeFix() { return FEATURE_FLAGS.faceScanningAnimationNpeFix(); } + + + public static boolean fasterUnlockTransition() { + + return FEATURE_FLAGS.fasterUnlockTransition(); + } + + + public static boolean fetchBookmarksXmlKeyboardShortcuts() { return FEATURE_FLAGS.fetchBookmarksXmlKeyboardShortcuts(); } - public static boolean fixDialogLaunchAnimationJankLogging() { + + + public static boolean fixImageWallpaperCrashSurfaceAlreadyReleased() { - return FEATURE_FLAGS.fixDialogLaunchAnimationJankLogging(); + return FEATURE_FLAGS.fixImageWallpaperCrashSurfaceAlreadyReleased(); } + + public static boolean fixScreenshotActionDismissSystemWindows() { return FEATURE_FLAGS.fixScreenshotActionDismissSystemWindows(); } - public static boolean flashlightStrength() { - - return FEATURE_FLAGS.flashlightStrength(); - } - public static boolean floatingMenuAnimatedTuck() { @@ -951,45 +1076,69 @@ public final class Flags { } + + public static boolean floatingMenuDisplayCutoutSupport() { + + return FEATURE_FLAGS.floatingMenuDisplayCutoutSupport(); + } + + + + public static boolean floatingMenuDragToEdit() { + + return FEATURE_FLAGS.floatingMenuDragToEdit(); + } + + + public static boolean floatingMenuDragToHide() { return FEATURE_FLAGS.floatingMenuDragToHide(); } + public static boolean floatingMenuHearingDeviceStatusIcon() { return FEATURE_FLAGS.floatingMenuHearingDeviceStatusIcon(); } + public static boolean floatingMenuImeDisplacementAnimation() { return FEATURE_FLAGS.floatingMenuImeDisplacementAnimation(); } + + + public static boolean floatingMenuNarrowTargetContentObserver() { + + return FEATURE_FLAGS.floatingMenuNarrowTargetContentObserver(); + } + + + public static boolean floatingMenuNotifyTargetsChangedOnStrictDiff() { return FEATURE_FLAGS.floatingMenuNotifyTargetsChangedOnStrictDiff(); } + public static boolean floatingMenuOverlapsNavBarsFlag() { return FEATURE_FLAGS.floatingMenuOverlapsNavBarsFlag(); } + public static boolean floatingMenuRadiiAnimation() { return FEATURE_FLAGS.floatingMenuRadiiAnimation(); } - public static boolean floatingMenuRemoveFullscreenTaps() { - - return FEATURE_FLAGS.floatingMenuRemoveFullscreenTaps(); - } public static boolean getConnectedDeviceNameUnsynchronized() { @@ -997,72 +1146,83 @@ public final class Flags { } + public static boolean glanceableHubAllowKeyguardWhenDreaming() { return FEATURE_FLAGS.glanceableHubAllowKeyguardWhenDreaming(); } + public static boolean glanceableHubBlurredBackground() { return FEATURE_FLAGS.glanceableHubBlurredBackground(); } + public static boolean glanceableHubDirectEditMode() { return FEATURE_FLAGS.glanceableHubDirectEditMode(); } + public static boolean glanceableHubV2() { return FEATURE_FLAGS.glanceableHubV2(); } + public static boolean glanceableHubV2Resources() { return FEATURE_FLAGS.glanceableHubV2Resources(); } + + + public static boolean hapticsForComposeSliders() { + + return FEATURE_FLAGS.hapticsForComposeSliders(); + } + + + public static boolean hardwareColorStyles() { return FEATURE_FLAGS.hardwareColorStyles(); } + + public static boolean hearingAidsQsTileDialog() { return FEATURE_FLAGS.hearingAidsQsTileDialog(); } + + public static boolean hearingDevicesDialogRelatedTools() { return FEATURE_FLAGS.hearingDevicesDialogRelatedTools(); } + public static boolean hideRingerButtonInSingleVolumeMode() { return FEATURE_FLAGS.hideRingerButtonInSingleVolumeMode(); } + + public static boolean homeControlsDreamHsum() { return FEATURE_FLAGS.homeControlsDreamHsum(); } - public static boolean hsuBehaviorChanges() { - - return FEATURE_FLAGS.hsuBehaviorChanges(); - } - - public static boolean hubBlurredByShadeFix() { - - return FEATURE_FLAGS.hubBlurredByShadeFix(); - } - public static boolean hubEditModeTouchAdjustments() { @@ -1070,25 +1230,40 @@ public final class Flags { } - public static boolean hubEditModeTransition() { + + public static boolean hubmodeFullscreenVerticalSwipe() { - return FEATURE_FLAGS.hubEditModeTransition(); + return FEATURE_FLAGS.hubmodeFullscreenVerticalSwipe(); } + + + public static boolean hubmodeFullscreenVerticalSwipeFix() { + + return FEATURE_FLAGS.hubmodeFullscreenVerticalSwipeFix(); + } + + + public static boolean iconRefresh2025() { return FEATURE_FLAGS.iconRefresh2025(); } + + + public static boolean ignoreTouchesNextToNotificationShelf() { + + return FEATURE_FLAGS.ignoreTouchesNextToNotificationShelf(); + } + + + public static boolean indicationTextA11yFix() { return FEATURE_FLAGS.indicationTextA11yFix(); } - public static boolean instantHideShade() { - - return FEATURE_FLAGS.instantHideShade(); - } public static boolean keyboardDockingIndicator() { @@ -1096,53 +1271,63 @@ public final class Flags { return FEATURE_FLAGS.keyboardDockingIndicator(); } + + public static boolean keyboardShortcutHelperRewrite() { return FEATURE_FLAGS.keyboardShortcutHelperRewrite(); } + + public static boolean keyboardShortcutHelperShortcutCustomizer() { return FEATURE_FLAGS.keyboardShortcutHelperShortcutCustomizer(); } + + public static boolean keyboardTouchpadContextualEducation() { return FEATURE_FLAGS.keyboardTouchpadContextualEducation(); } + public static boolean keyguardTransitionForceFinishOnScreenOff() { return FEATURE_FLAGS.keyguardTransitionForceFinishOnScreenOff(); } + + public static boolean keyguardWmReorderAtmsCalls() { + + return FEATURE_FLAGS.keyguardWmReorderAtmsCalls(); + } + + + public static boolean keyguardWmStateRefactor() { return FEATURE_FLAGS.keyguardWmStateRefactor(); } + + public static boolean lockscreenFont() { return FEATURE_FLAGS.lockscreenFont(); } + public static boolean lowLightClockDream() { return FEATURE_FLAGS.lowLightClockDream(); } - public static boolean lowlightClockSetBrightness() { - - return FEATURE_FLAGS.lowlightClockSetBrightness(); - } - public static boolean lowlightClockUsesKeyguardChargingStatus() { - - return FEATURE_FLAGS.lowlightClockUsesKeyguardChargingStatus(); - } public static boolean magneticNotificationSwipes() { @@ -1150,76 +1335,139 @@ public final class Flags { } + + public static boolean mediaControlsA11yColors() { + + return FEATURE_FLAGS.mediaControlsA11yColors(); + } + + + public static boolean mediaControlsButtonMedia3() { return FEATURE_FLAGS.mediaControlsButtonMedia3(); } + public static boolean mediaControlsButtonMedia3Placement() { return FEATURE_FLAGS.mediaControlsButtonMedia3Placement(); } - public static boolean mediaControlsInCompose() { + + public static boolean mediaControlsDeviceManagerBackgroundExecution() { - return FEATURE_FLAGS.mediaControlsInCompose(); + return FEATURE_FLAGS.mediaControlsDeviceManagerBackgroundExecution(); } + + + public static boolean mediaControlsDrawablesReuseBugfix() { + + return FEATURE_FLAGS.mediaControlsDrawablesReuseBugfix(); + } + + + + public static boolean mediaControlsLockscreenShadeBugFix() { + + return FEATURE_FLAGS.mediaControlsLockscreenShadeBugFix(); + } + + + public static boolean mediaControlsUiUpdate() { return FEATURE_FLAGS.mediaControlsUiUpdate(); } + + + public static boolean mediaControlsUmoInflationInBackground() { + + return FEATURE_FLAGS.mediaControlsUmoInflationInBackground(); + } + + + + public static boolean mediaControlsUserInitiatedDeleteintent() { + + return FEATURE_FLAGS.mediaControlsUserInitiatedDeleteintent(); + } + + + + public static boolean mediaLoadMetadataViaMediaDataLoader() { + + return FEATURE_FLAGS.mediaLoadMetadataViaMediaDataLoader(); + } + + + + public static boolean mediaLockscreenLaunchAnimation() { + + return FEATURE_FLAGS.mediaLockscreenLaunchAnimation(); + } + + + public static boolean mediaProjectionDialogBehindLockscreen() { return FEATURE_FLAGS.mediaProjectionDialogBehindLockscreen(); } + + public static boolean mediaProjectionGreyErrorText() { return FEATURE_FLAGS.mediaProjectionGreyErrorText(); } + public static boolean mediaProjectionRequestAttributionFix() { return FEATURE_FLAGS.mediaProjectionRequestAttributionFix(); } + public static boolean modesUiDialogPaging() { return FEATURE_FLAGS.modesUiDialogPaging(); } + + public static boolean moveTransitionAnimationLayer() { return FEATURE_FLAGS.moveTransitionAnimationLayer(); } + + public static boolean msdlFeedback() { return FEATURE_FLAGS.msdlFeedback(); } + public static boolean multiuserWifiPickerTrackerSupport() { return FEATURE_FLAGS.multiuserWifiPickerTrackerSupport(); } + + public static boolean newAodTransition() { return FEATURE_FLAGS.newAodTransition(); } - public static boolean newDozingKeyguardStates() { - - return FEATURE_FLAGS.newDozingKeyguardStates(); - } public static boolean newVolumePanel() { @@ -1227,112 +1475,159 @@ public final class Flags { } + public static boolean nonTouchscreenDevicesBypassFalsing() { return FEATURE_FLAGS.nonTouchscreenDevicesBypassFalsing(); } + public static boolean notesRoleQsTile() { return FEATURE_FLAGS.notesRoleQsTile(); } + public static boolean notificationAddXOnHoverToDismiss() { return FEATURE_FLAGS.notificationAddXOnHoverToDismiss(); } + public static boolean notificationAmbientSuppressionAfterInflation() { return FEATURE_FLAGS.notificationAmbientSuppressionAfterInflation(); } + + public static boolean notificationAnimatedActionsTreatment() { return FEATURE_FLAGS.notificationAnimatedActionsTreatment(); } + + public static boolean notificationAppearNonlinear() { return FEATURE_FLAGS.notificationAppearNonlinear(); } + + public static boolean notificationAsyncGroupHeaderInflation() { return FEATURE_FLAGS.notificationAsyncGroupHeaderInflation(); } + + public static boolean notificationAsyncHybridViewInflation() { return FEATURE_FLAGS.notificationAsyncHybridViewInflation(); } + + public static boolean notificationAvalancheSuppression() { return FEATURE_FLAGS.notificationAvalancheSuppression(); } + + public static boolean notificationAvalancheThrottleHun() { return FEATURE_FLAGS.notificationAvalancheThrottleHun(); } + public static boolean notificationBackgroundTintOptimization() { return FEATURE_FLAGS.notificationBackgroundTintOptimization(); } + public static boolean notificationBundleUi() { return FEATURE_FLAGS.notificationBundleUi(); } + public static boolean notificationColorUpdateLogger() { return FEATURE_FLAGS.notificationColorUpdateLogger(); } + + public static boolean notificationContentAlphaOptimization() { return FEATURE_FLAGS.notificationContentAlphaOptimization(); } + public static boolean notificationFooterBackgroundTintOptimization() { return FEATURE_FLAGS.notificationFooterBackgroundTintOptimization(); } + + + public static boolean notificationOverExpansionClippingFix() { + + return FEATURE_FLAGS.notificationOverExpansionClippingFix(); + } + + + + public static boolean notificationReentrantDismiss() { + + return FEATURE_FLAGS.notificationReentrantDismiss(); + } + + + public static boolean notificationRowAccessibilityExpanded() { return FEATURE_FLAGS.notificationRowAccessibilityExpanded(); } + + public static boolean notificationRowContentBinderRefactor() { return FEATURE_FLAGS.notificationRowContentBinderRefactor(); } + + public static boolean notificationRowTransparency() { return FEATURE_FLAGS.notificationRowTransparency(); } + + + public static boolean notificationRowUserContext() { + + return FEATURE_FLAGS.notificationRowUserContext(); + } + + + public static boolean notificationShadeBlur() { return FEATURE_FLAGS.notificationShadeBlur(); } - public static boolean notificationShadeCloseWaitsForChildAnimations() { - - return FEATURE_FLAGS.notificationShadeCloseWaitsForChildAnimations(); - } public static boolean notificationShadeUiThread() { @@ -1341,158 +1636,209 @@ public final class Flags { } + public static boolean notificationSkipSilentUpdates() { return FEATURE_FLAGS.notificationSkipSilentUpdates(); } + + public static boolean notificationTransparentHeaderFix() { return FEATURE_FLAGS.notificationTransparentHeaderFix(); } + + + public static boolean notificationViewFlipperPausingV2() { + + return FEATURE_FLAGS.notificationViewFlipperPausingV2(); + } + + + public static boolean notificationsBackgroundIcons() { return FEATURE_FLAGS.notificationsBackgroundIcons(); } + + public static boolean notificationsFooterVisibilityFix() { return FEATURE_FLAGS.notificationsFooterVisibilityFix(); } + public static boolean notificationsHideOnDisplaySwitch() { return FEATURE_FLAGS.notificationsHideOnDisplaySwitch(); } - public static boolean notificationsHunAccessibilityRefactor() { - - return FEATURE_FLAGS.notificationsHunAccessibilityRefactor(); - } public static boolean notificationsHunSharedAnimationValues() { return FEATURE_FLAGS.notificationsHunSharedAnimationValues(); } + + public static boolean notificationsIconContainerRefactor() { return FEATURE_FLAGS.notificationsIconContainerRefactor(); } + + public static boolean notificationsLaunchRadius() { return FEATURE_FLAGS.notificationsLaunchRadius(); } + + public static boolean notificationsLiveDataStoreRefactor() { return FEATURE_FLAGS.notificationsLiveDataStoreRefactor(); } + + public static boolean notificationsPinnedHunInShade() { return FEATURE_FLAGS.notificationsPinnedHunInShade(); } + + public static boolean notificationsRedesignFooterView() { return FEATURE_FLAGS.notificationsRedesignFooterView(); } + + + public static boolean notificationsRedesignGuts() { + + return FEATURE_FLAGS.notificationsRedesignGuts(); + } + + + public static boolean notifyPasswordTextViewUserActivityInBackground() { return FEATURE_FLAGS.notifyPasswordTextViewUserActivityInBackground(); } + + public static boolean notifyPowerManagerUserActivityBackground() { return FEATURE_FLAGS.notifyPowerManagerUserActivityBackground(); } - public static boolean ongoingActivityChipsOnDream() { + + public static boolean onlyShowMediaStreamSliderInSingleVolumeMode() { - return FEATURE_FLAGS.ongoingActivityChipsOnDream(); + return FEATURE_FLAGS.onlyShowMediaStreamSliderInSingleVolumeMode(); } + + public static boolean outputSwitcherRedesign() { + + return FEATURE_FLAGS.outputSwitcherRedesign(); + } + + + public static boolean overrideSuppressOverlayCondition() { return FEATURE_FLAGS.overrideSuppressOverlayCondition(); } + public static boolean permissionHelperInlineUiRichOngoing() { return FEATURE_FLAGS.permissionHelperInlineUiRichOngoing(); } + + public static boolean permissionHelperUiRichOngoing() { return FEATURE_FLAGS.permissionHelperUiRichOngoing(); } + + public static boolean physicalNotificationMovement() { return FEATURE_FLAGS.physicalNotificationMovement(); } + + public static boolean pinInputFieldStyledFocusState() { return FEATURE_FLAGS.pinInputFieldStyledFocusState(); } + public static boolean predictiveBackAnimateShade() { return FEATURE_FLAGS.predictiveBackAnimateShade(); } + public static boolean predictiveBackDelayWmTransition() { return FEATURE_FLAGS.predictiveBackDelayWmTransition(); } - public static boolean privacyDotLiveRegion() { + + public static boolean priorityPeopleSection() { - return FEATURE_FLAGS.privacyDotLiveRegion(); + return FEATURE_FLAGS.priorityPeopleSection(); } + public static boolean promoteNotificationsAutomatically() { return FEATURE_FLAGS.promoteNotificationsAutomatically(); } + + public static boolean pssAppSelectorRecentsSplitScreen() { + + return FEATURE_FLAGS.pssAppSelectorRecentsSplitScreen(); + } + + + public static boolean pssTaskSwitcher() { return FEATURE_FLAGS.pssTaskSwitcher(); } - public static boolean qsComposeFragmentEarlyExpansion() { + + public static boolean qsCustomTileClickGuaranteedBugFix() { - return FEATURE_FLAGS.qsComposeFragmentEarlyExpansion(); + return FEATURE_FLAGS.qsCustomTileClickGuaranteedBugFix(); } - public static boolean qsEditModeTabs() { - - return FEATURE_FLAGS.qsEditModeTabs(); - } - - public static boolean qsEditModeTooltip() { - - return FEATURE_FLAGS.qsEditModeTooltip(); - } - public static boolean qsNewTiles() { @@ -1500,44 +1846,55 @@ public final class Flags { } + public static boolean qsNewTilesFuture() { return FEATURE_FLAGS.qsNewTilesFuture(); } + + public static boolean qsQuickRebindActiveTiles() { + + return FEATURE_FLAGS.qsQuickRebindActiveTiles(); + } + + + + public static boolean qsRegisterSettingObserverOnBgThread() { + + return FEATURE_FLAGS.qsRegisterSettingObserverOnBgThread(); + } + + + public static boolean qsTileDetailedView() { return FEATURE_FLAGS.qsTileDetailedView(); } + + public static boolean qsTileFocusState() { return FEATURE_FLAGS.qsTileFocusState(); } - public static boolean qsTileTransitionInteractionRefinement() { - - return FEATURE_FLAGS.qsTileTransitionInteractionRefinement(); - } - public static boolean qsUiRefactor() { return FEATURE_FLAGS.qsUiRefactor(); } + + public static boolean qsUiRefactorComposeFragment() { return FEATURE_FLAGS.qsUiRefactorComposeFragment(); } - public static boolean qsWifiConfig() { - - return FEATURE_FLAGS.qsWifiConfig(); - } public static boolean recordIssueQsTile() { @@ -1545,43 +1902,55 @@ public final class Flags { } + public static boolean redesignMagnificationWindowSize() { return FEATURE_FLAGS.redesignMagnificationWindowSize(); } + + public static boolean refactorGetCurrentUser() { + + return FEATURE_FLAGS.refactorGetCurrentUser(); + } + + + public static boolean registerBatteryControllerReceiversInCorestartable() { return FEATURE_FLAGS.registerBatteryControllerReceiversInCorestartable(); } + + public static boolean registerContentObserversAsync() { return FEATURE_FLAGS.registerContentObserversAsync(); } + + public static boolean registerNewWalletCardInBackground() { return FEATURE_FLAGS.registerNewWalletCardInBackground(); } + + public static boolean registerWallpaperNotifierBackground() { return FEATURE_FLAGS.registerWallpaperNotifierBackground(); } - public static boolean rememberViewModelOffMainThread() { + + public static boolean relockWithPowerButtonImmediately() { - return FEATURE_FLAGS.rememberViewModelOffMainThread(); + return FEATURE_FLAGS.relockWithPowerButtonImmediately(); } - public static boolean removeAodCarMode() { - - return FEATURE_FLAGS.removeAodCarMode(); - } public static boolean removeDreamOverlayHideOnTouch() { @@ -1589,10 +1958,6 @@ public final class Flags { } - public static boolean removeNearbyShareTileAnimation() { - - return FEATURE_FLAGS.removeNearbyShareTileAnimation(); - } public static boolean removeUpdateListenerInQsIconViewImpl() { @@ -1600,21 +1965,20 @@ public final class Flags { } + public static boolean restToUnlock() { return FEATURE_FLAGS.restToUnlock(); } + public static boolean restartDreamOnUnocclude() { return FEATURE_FLAGS.restartDreamOnUnocclude(); } - public static boolean restrictCommunalAppWidgetHostListening() { - - return FEATURE_FLAGS.restrictCommunalAppWidgetHostListening(); - } + public static boolean revampedBouncerMessages() { @@ -1622,27 +1986,27 @@ public final class Flags { } + public static boolean runFingerprintDetectOnDismissibleKeyguard() { return FEATURE_FLAGS.runFingerprintDetectOnDismissibleKeyguard(); } + + public static boolean saveAndRestoreMagnificationSettingsButtons() { return FEATURE_FLAGS.saveAndRestoreMagnificationSettingsButtons(); } + public static boolean sceneContainer() { return FEATURE_FLAGS.sceneContainer(); } - public static boolean screenReactions() { - - return FEATURE_FLAGS.screenReactions(); - } public static boolean screenshareNotificationHidingBugFix() { @@ -1650,15 +2014,12 @@ public final class Flags { } + public static boolean screenshotActionDismissSystemWindows() { return FEATURE_FLAGS.screenshotActionDismissSystemWindows(); } - public static boolean screenshotAnnounceLiveRegion() { - - return FEATURE_FLAGS.screenshotAnnounceLiveRegion(); - } public static boolean screenshotMultidisplayFocusChange() { @@ -1666,36 +2027,49 @@ public final class Flags { return FEATURE_FLAGS.screenshotMultidisplayFocusChange(); } + + public static boolean screenshotPolicySplitAndDesktopMode() { return FEATURE_FLAGS.screenshotPolicySplitAndDesktopMode(); } + + public static boolean screenshotScrollCropViewCrashFix() { return FEATURE_FLAGS.screenshotScrollCropViewCrashFix(); } + + public static boolean screenshotUiControllerRefactor() { + + return FEATURE_FLAGS.screenshotUiControllerRefactor(); + } + + + public static boolean secondaryUserWidgetHost() { return FEATURE_FLAGS.secondaryUserWidgetHost(); } + + public static boolean settingsExtRegisterContentObserverOnBgThread() { return FEATURE_FLAGS.settingsExtRegisterContentObserverOnBgThread(); } + + public static boolean shadeExpandsOnStatusBarLongPress() { return FEATURE_FLAGS.shadeExpandsOnStatusBarLongPress(); } - public static boolean shadeHeaderBlurFontColor() { - - return FEATURE_FLAGS.shadeHeaderBlurFontColor(); - } + public static boolean shadeHeaderFontUpdate() { @@ -1703,117 +2077,174 @@ public final class Flags { } - public static boolean shadeQsvisibleLogic() { + + public static boolean shadeLaunchAccessibility() { - return FEATURE_FLAGS.shadeQsvisibleLogic(); + return FEATURE_FLAGS.shadeLaunchAccessibility(); } + public static boolean shadeWindowGoesAround() { return FEATURE_FLAGS.shadeWindowGoesAround(); } + + public static boolean shaderlibLoadingEffectRefactor() { return FEATURE_FLAGS.shaderlibLoadingEffectRefactor(); } + + public static boolean shortcutHelperKeyGlyph() { return FEATURE_FLAGS.shortcutHelperKeyGlyph(); } + + public static boolean showAudioSharingSliderInVolumePanel() { return FEATURE_FLAGS.showAudioSharingSliderInVolumePanel(); } + public static boolean showClipboardIndication() { return FEATURE_FLAGS.showClipboardIndication(); } + public static boolean showLockedByYourWatchKeyguardIndicator() { return FEATURE_FLAGS.showLockedByYourWatchKeyguardIndicator(); } + + + public static boolean showToastWhenAppControlBrightness() { + + return FEATURE_FLAGS.showToastWhenAppControlBrightness(); + } + + + public static boolean simPinBouncerReset() { return FEATURE_FLAGS.simPinBouncerReset(); } + + + public static boolean simPinRaceConditionOnRestart() { + + return FEATURE_FLAGS.simPinRaceConditionOnRestart(); + } + + + + public static boolean simPinUseSlotId() { + + return FEATURE_FLAGS.simPinUseSlotId(); + } + + + public static boolean skipHideSensitiveNotifAnimation() { return FEATURE_FLAGS.skipHideSensitiveNotifAnimation(); } + + + public static boolean sliceBroadcastRelayInBackground() { + + return FEATURE_FLAGS.sliceBroadcastRelayInBackground(); + } + + + public static boolean sliceManagerBinderCallBackground() { return FEATURE_FLAGS.sliceManagerBinderCallBackground(); } + + public static boolean smartspaceLockscreenViewmodel() { + + return FEATURE_FLAGS.smartspaceLockscreenViewmodel(); + } + + + public static boolean smartspaceRelocateToBottom() { return FEATURE_FLAGS.smartspaceRelocateToBottom(); } + + + public static boolean smartspaceRemoteviewsRenderingFix() { + + return FEATURE_FLAGS.smartspaceRemoteviewsRenderingFix(); + } + + + public static boolean smartspaceSwipeEventLoggingFix() { return FEATURE_FLAGS.smartspaceSwipeEventLoggingFix(); } + + public static boolean smartspaceViewpager2() { return FEATURE_FLAGS.smartspaceViewpager2(); } + + public static boolean sounddoseCustomization() { return FEATURE_FLAGS.sounddoseCustomization(); } + + public static boolean spatialModelAppPushback() { return FEATURE_FLAGS.spatialModelAppPushback(); } - public static boolean spatialModelBouncerPushback() { - - return FEATURE_FLAGS.spatialModelBouncerPushback(); - } - - public static boolean spatialModelPushbackInShader() { - - return FEATURE_FLAGS.spatialModelPushbackInShader(); - } public static boolean stabilizeHeadsUpGroupV2() { return FEATURE_FLAGS.stabilizeHeadsUpGroupV2(); } + + public static boolean statusBarAlwaysCheckUnderlyingNetworks() { return FEATURE_FLAGS.statusBarAlwaysCheckUnderlyingNetworks(); } - public static boolean statusBarAppHandleTracking() { + + public static boolean statusBarAutoStartScreenRecordChip() { - return FEATURE_FLAGS.statusBarAppHandleTracking(); + return FEATURE_FLAGS.statusBarAutoStartScreenRecordChip(); } - public static boolean statusBarChipToHunAnimation() { - - return FEATURE_FLAGS.statusBarChipToHunAnimation(); - } public static boolean statusBarChipsModernization() { @@ -1821,37 +2252,48 @@ public final class Flags { } + public static boolean statusBarChipsReturnAnimations() { return FEATURE_FLAGS.statusBarChipsReturnAnimations(); } + + public static boolean statusBarFontUpdates() { return FEATURE_FLAGS.statusBarFontUpdates(); } + public static boolean statusBarMobileIconKairos() { return FEATURE_FLAGS.statusBarMobileIconKairos(); } + + + public static boolean statusBarMonochromeIconsFix() { + + return FEATURE_FLAGS.statusBarMonochromeIconsFix(); + } + + + public static boolean statusBarNoHunBehavior() { return FEATURE_FLAGS.statusBarNoHunBehavior(); } + public static boolean statusBarPopupChips() { return FEATURE_FLAGS.statusBarPopupChips(); } - public static boolean statusBarPrivacyChipAnimationExemption() { - - return FEATURE_FLAGS.statusBarPrivacyChipAnimationExemption(); - } + public static boolean statusBarRootModernization() { @@ -1859,149 +2301,224 @@ public final class Flags { } - public static boolean statusBarRudimentaryBattery() { + + public static boolean statusBarShowAudioOnlyProjectionChip() { - return FEATURE_FLAGS.statusBarRudimentaryBattery(); + return FEATURE_FLAGS.statusBarShowAudioOnlyProjectionChip(); } + + public static boolean statusBarSignalPolicyRefactor() { return FEATURE_FLAGS.statusBarSignalPolicyRefactor(); } + + public static boolean statusBarSignalPolicyRefactorEthernet() { return FEATURE_FLAGS.statusBarSignalPolicyRefactorEthernet(); } + public static boolean statusBarStaticInoutIndicators() { return FEATURE_FLAGS.statusBarStaticInoutIndicators(); } + + + public static boolean statusBarStopUpdatingWindowHeight() { + + return FEATURE_FLAGS.statusBarStopUpdatingWindowHeight(); + } + + + public static boolean statusBarSwipeOverChip() { return FEATURE_FLAGS.statusBarSwipeOverChip(); } + + public static boolean statusBarSwitchToSpnFromDataSpn() { return FEATURE_FLAGS.statusBarSwitchToSpnFromDataSpn(); } - public static boolean statusBarSystemStatusIconsInCompose() { - - return FEATURE_FLAGS.statusBarSystemStatusIconsInCompose(); - } - public static boolean statusBarUiThread() { return FEATURE_FLAGS.statusBarUiThread(); } + + public static boolean statusBarWindowNoCustomTouch() { return FEATURE_FLAGS.statusBarWindowNoCustomTouch(); } - public static boolean stuckHearingDevicesQsTileFix() { + + + public static boolean stoppableFgsSystemApp() { - return FEATURE_FLAGS.stuckHearingDevicesQsTileFix(); + return FEATURE_FLAGS.stoppableFgsSystemApp(); } + + public static boolean switchUserOnBg() { return FEATURE_FLAGS.switchUserOnBg(); } + public static boolean sysuiTeamfood() { return FEATURE_FLAGS.sysuiTeamfood(); } + public static boolean themeOverlayControllerWakefulnessDeprecation() { return FEATURE_FLAGS.themeOverlayControllerWakefulnessDeprecation(); } - public static boolean thinScreenRecordingService() { + + public static boolean transitionRaceCondition() { - return FEATURE_FLAGS.thinScreenRecordingService(); + return FEATURE_FLAGS.transitionRaceCondition(); } - public static boolean transitionRaceConditionPart2() { + + + public static boolean translucentOccludingActivityFix() { - return FEATURE_FLAGS.transitionRaceConditionPart2(); + return FEATURE_FLAGS.translucentOccludingActivityFix(); } + + public static boolean tvGlobalActionsFocus() { return FEATURE_FLAGS.tvGlobalActionsFocus(); } - public static boolean udfpsScreenOffUnlockFlicker() { + + + public static boolean udfpsViewPerformance() { - return FEATURE_FLAGS.udfpsScreenOffUnlockFlicker(); + return FEATURE_FLAGS.udfpsViewPerformance(); } - public static boolean uiRichOngoingAodSkeletonBgInflation() { - - return FEATURE_FLAGS.uiRichOngoingAodSkeletonBgInflation(); - } + public static boolean unfoldAnimationBackgroundProgress() { return FEATURE_FLAGS.unfoldAnimationBackgroundProgress(); } + + + public static boolean unfoldLatencyTrackingFix() { + + return FEATURE_FLAGS.unfoldLatencyTrackingFix(); + } + + + public static boolean updateCornerRadiusOnDisplayChanged() { return FEATURE_FLAGS.updateCornerRadiusOnDisplayChanged(); } + + public static boolean updateUserSwitcherBackground() { return FEATURE_FLAGS.updateUserSwitcherBackground(); } + + public static boolean updateWindowMagnifierBottomBoundary() { return FEATURE_FLAGS.updateWindowMagnifierBottomBoundary(); } - public static boolean useAadProxSensorIfPresent() { + + public static boolean useAadProxSensor() { - return FEATURE_FLAGS.useAadProxSensorIfPresent(); + return FEATURE_FLAGS.useAadProxSensor(); } + + + public static boolean useNotifInflationThreadForFooter() { + + return FEATURE_FLAGS.useNotifInflationThreadForFooter(); + } + + + + public static boolean useNotifInflationThreadForRow() { + + return FEATURE_FLAGS.useNotifInflationThreadForRow(); + } + + + + public static boolean useTransitionsForKeyguardOccluded() { + + return FEATURE_FLAGS.useTransitionsForKeyguardOccluded(); + } + + + + public static boolean useVolumeController() { + + return FEATURE_FLAGS.useVolumeController(); + } + + + public static boolean userAwareSettingsRepositories() { return FEATURE_FLAGS.userAwareSettingsRepositories(); } + + public static boolean userEncryptedSource() { return FEATURE_FLAGS.userEncryptedSource(); } + public static boolean userSwitcherAddSignOutOption() { return FEATURE_FLAGS.userSwitcherAddSignOutOption(); } + + public static boolean visualInterruptionsRefactor() { return FEATURE_FLAGS.visualInterruptionsRefactor(); } + + public static boolean volumeRedesign() { return FEATURE_FLAGS.volumeRedesign(); diff --git a/flags/src/com/android/systemui/shared/CustomFeatureFlags.java b/flags/src/com/android/systemui/shared/CustomFeatureFlags.java index 8b4f34cd12..18f1f2b21d 100644 --- a/flags/src/com/android/systemui/shared/CustomFeatureFlags.java +++ b/flags/src/com/android/systemui/shared/CustomFeatureFlags.java @@ -1,5 +1,6 @@ package com.android.systemui.shared; +// TODO(b/303773055): Remove the annotation after access issue is resolved. import java.util.Arrays; import java.util.HashSet; @@ -59,16 +60,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableLppAssistInvocationEffect() { - return getValue(Flags.FLAG_ENABLE_LPP_ASSIST_INVOCATION_EFFECT, - FeatureFlags::enableLppAssistInvocationEffect); - } - - @Override - - public boolean enableLppAssistInvocationHapticEffect() { - return getValue(Flags.FLAG_ENABLE_LPP_ASSIST_INVOCATION_HAPTIC_EFFECT, - FeatureFlags::enableLppAssistInvocationHapticEffect); + public boolean enableLppSqueezeEffect() { + return getValue(Flags.FLAG_ENABLE_LPP_SQUEEZE_EFFECT, + FeatureFlags::enableLppSqueezeEffect); } @Override @@ -87,13 +81,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean extendibleThemeManager() { - return getValue(Flags.FLAG_EXTENDIBLE_THEME_MANAGER, - FeatureFlags::extendibleThemeManager); - } - - @Override - public boolean lockscreenCustomClocks() { return getValue(Flags.FLAG_LOCKSCREEN_CUSTOM_CLOCKS, FeatureFlags::lockscreenCustomClocks); @@ -150,6 +137,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean smartspaceRemoteviewsIntentHandler() { + return getValue(Flags.FLAG_SMARTSPACE_REMOTEVIEWS_INTENT_HANDLER, + FeatureFlags::smartspaceRemoteviewsIntentHandler); + } + + @Override + public boolean smartspaceSportsCardBackground() { return getValue(Flags.FLAG_SMARTSPACE_SPORTS_CARD_BACKGROUND, FeatureFlags::smartspaceSportsCardBackground); @@ -171,13 +165,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean smartspaceWeatherUseMonochromeFontIcons() { - return getValue(Flags.FLAG_SMARTSPACE_WEATHER_USE_MONOCHROME_FONT_ICONS, - FeatureFlags::smartspaceWeatherUseMonochromeFontIcons); - } - - @Override - public boolean statusBarConnectedDisplays() { return getValue(Flags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS, FeatureFlags::statusBarConnectedDisplays); @@ -222,11 +209,9 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_CLOCK_REACTIVE_VARIANTS, Flags.FLAG_CURSOR_HOT_CORNER, Flags.FLAG_ENABLE_HOME_DELAY, - Flags.FLAG_ENABLE_LPP_ASSIST_INVOCATION_EFFECT, - Flags.FLAG_ENABLE_LPP_ASSIST_INVOCATION_HAPTIC_EFFECT, + Flags.FLAG_ENABLE_LPP_SQUEEZE_EFFECT, Flags.FLAG_EXAMPLE_SHARED_FLAG, Flags.FLAG_EXTENDED_WALLPAPER_EFFECTS, - Flags.FLAG_EXTENDIBLE_THEME_MANAGER, Flags.FLAG_LOCKSCREEN_CUSTOM_CLOCKS, Flags.FLAG_NEW_CUSTOMIZATION_PICKER_UI, Flags.FLAG_NEW_TOUCHPAD_GESTURES_TUTORIAL, @@ -235,10 +220,10 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_SCREENSHOT_CONTEXT_URL, Flags.FLAG_SHADE_ALLOW_BACK_GESTURE, Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR, + Flags.FLAG_SMARTSPACE_REMOTEVIEWS_INTENT_HANDLER, Flags.FLAG_SMARTSPACE_SPORTS_CARD_BACKGROUND, Flags.FLAG_SMARTSPACE_UI_UPDATE, Flags.FLAG_SMARTSPACE_UI_UPDATE_RESOURCES, - Flags.FLAG_SMARTSPACE_WEATHER_USE_MONOCHROME_FONT_ICONS, Flags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS, Flags.FLAG_THREE_BUTTON_CORNER_SWIPE, Flags.FLAG_USE_PREFERRED_IMAGE_EDITOR @@ -253,11 +238,9 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_CLOCK_REACTIVE_VARIANTS, Flags.FLAG_CURSOR_HOT_CORNER, Flags.FLAG_ENABLE_HOME_DELAY, - Flags.FLAG_ENABLE_LPP_ASSIST_INVOCATION_EFFECT, - Flags.FLAG_ENABLE_LPP_ASSIST_INVOCATION_HAPTIC_EFFECT, + Flags.FLAG_ENABLE_LPP_SQUEEZE_EFFECT, Flags.FLAG_EXAMPLE_SHARED_FLAG, Flags.FLAG_EXTENDED_WALLPAPER_EFFECTS, - Flags.FLAG_EXTENDIBLE_THEME_MANAGER, Flags.FLAG_LOCKSCREEN_CUSTOM_CLOCKS, Flags.FLAG_NEW_CUSTOMIZATION_PICKER_UI, Flags.FLAG_NEW_TOUCHPAD_GESTURES_TUTORIAL, @@ -266,10 +249,10 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_SCREENSHOT_CONTEXT_URL, Flags.FLAG_SHADE_ALLOW_BACK_GESTURE, Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR, + Flags.FLAG_SMARTSPACE_REMOTEVIEWS_INTENT_HANDLER, Flags.FLAG_SMARTSPACE_SPORTS_CARD_BACKGROUND, Flags.FLAG_SMARTSPACE_UI_UPDATE, Flags.FLAG_SMARTSPACE_UI_UPDATE_RESOURCES, - Flags.FLAG_SMARTSPACE_WEATHER_USE_MONOCHROME_FONT_ICONS, Flags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS, Flags.FLAG_THREE_BUTTON_CORNER_SWIPE, Flags.FLAG_USE_PREFERRED_IMAGE_EDITOR, diff --git a/flags/src/com/android/systemui/shared/FeatureFlags.java b/flags/src/com/android/systemui/shared/FeatureFlags.java index 5ccd2004c7..7f14ce4149 100644 --- a/flags/src/com/android/systemui/shared/FeatureFlags.java +++ b/flags/src/com/android/systemui/shared/FeatureFlags.java @@ -1,4 +1,5 @@ package com.android.systemui.shared; +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public interface FeatureFlags { @@ -30,11 +31,7 @@ public interface FeatureFlags { - boolean enableLppAssistInvocationEffect(); - - - - boolean enableLppAssistInvocationHapticEffect(); + boolean enableLppSqueezeEffect(); @@ -46,10 +43,6 @@ public interface FeatureFlags { - boolean extendibleThemeManager(); - - - boolean lockscreenCustomClocks(); @@ -82,6 +75,10 @@ public interface FeatureFlags { + boolean smartspaceRemoteviewsIntentHandler(); + + + boolean smartspaceSportsCardBackground(); @@ -94,10 +91,6 @@ public interface FeatureFlags { - boolean smartspaceWeatherUseMonochromeFontIcons(); - - - boolean statusBarConnectedDisplays(); diff --git a/flags/src/com/android/systemui/shared/FeatureFlagsImpl.java b/flags/src/com/android/systemui/shared/FeatureFlagsImpl.java index e51672c690..27cc82cf05 100644 --- a/flags/src/com/android/systemui/shared/FeatureFlagsImpl.java +++ b/flags/src/com/android/systemui/shared/FeatureFlagsImpl.java @@ -1,4 +1,5 @@ package com.android.systemui.shared; +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags { @@ -6,7 +7,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean ambientAod() { - return true; + return false; } @Override @@ -20,14 +21,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean clockReactiveSmartspaceLayout() { - return true; + return false; } @Override public boolean clockReactiveVariants() { - return true; + return false; } @Override @@ -47,15 +48,8 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableLppAssistInvocationEffect() { - return true; - } - - @Override - - - public boolean enableLppAssistInvocationHapticEffect() { - return true; + public boolean enableLppSqueezeEffect() { + return false; } @Override @@ -69,13 +63,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean extendedWallpaperEffects() { - return true; - } - - @Override - - - public boolean extendibleThemeManager() { return false; } @@ -83,14 +70,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean lockscreenCustomClocks() { - return true; + return false; } @Override public boolean newCustomizationPickerUi() { - return true; + return false; } @Override @@ -138,6 +125,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean smartspaceRemoteviewsIntentHandler() { + return true; + } + + @Override + + public boolean smartspaceSportsCardBackground() { return false; } @@ -146,20 +140,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean smartspaceUiUpdate() { - return true; + return false; } @Override public boolean smartspaceUiUpdateResources() { - return true; - } - - @Override - - - public boolean smartspaceWeatherUseMonochromeFontIcons() { return false; } @@ -181,7 +168,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean usePreferredImageEditor() { - return true; + return false; } } diff --git a/flags/src/com/android/systemui/shared/Flags.java b/flags/src/com/android/systemui/shared/Flags.java index 50edb698cf..26a3ca3f47 100644 --- a/flags/src/com/android/systemui/shared/Flags.java +++ b/flags/src/com/android/systemui/shared/Flags.java @@ -1,4 +1,5 @@ package com.android.systemui.shared; +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ @@ -16,16 +17,12 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_HOME_DELAY = "com.android.systemui.shared.enable_home_delay"; /** @hide */ - public static final String FLAG_ENABLE_LPP_ASSIST_INVOCATION_EFFECT = "com.android.systemui.shared.enable_lpp_assist_invocation_effect"; - /** @hide */ - public static final String FLAG_ENABLE_LPP_ASSIST_INVOCATION_HAPTIC_EFFECT = "com.android.systemui.shared.enable_lpp_assist_invocation_haptic_effect"; + public static final String FLAG_ENABLE_LPP_SQUEEZE_EFFECT = "com.android.systemui.shared.enable_lpp_squeeze_effect"; /** @hide */ public static final String FLAG_EXAMPLE_SHARED_FLAG = "com.android.systemui.shared.example_shared_flag"; /** @hide */ public static final String FLAG_EXTENDED_WALLPAPER_EFFECTS = "com.android.systemui.shared.extended_wallpaper_effects"; /** @hide */ - public static final String FLAG_EXTENDIBLE_THEME_MANAGER = "com.android.systemui.shared.extendible_theme_manager"; - /** @hide */ public static final String FLAG_LOCKSCREEN_CUSTOM_CLOCKS = "com.android.systemui.shared.lockscreen_custom_clocks"; /** @hide */ public static final String FLAG_NEW_CUSTOMIZATION_PICKER_UI = "com.android.systemui.shared.new_customization_picker_ui"; @@ -42,14 +39,14 @@ public final class Flags { /** @hide */ public static final String FLAG_SIDEFPS_CONTROLLER_REFACTOR = "com.android.systemui.shared.sidefps_controller_refactor"; /** @hide */ + public static final String FLAG_SMARTSPACE_REMOTEVIEWS_INTENT_HANDLER = "com.android.systemui.shared.smartspace_remoteviews_intent_handler"; + /** @hide */ public static final String FLAG_SMARTSPACE_SPORTS_CARD_BACKGROUND = "com.android.systemui.shared.smartspace_sports_card_background"; /** @hide */ public static final String FLAG_SMARTSPACE_UI_UPDATE = "com.android.systemui.shared.smartspace_ui_update"; /** @hide */ public static final String FLAG_SMARTSPACE_UI_UPDATE_RESOURCES = "com.android.systemui.shared.smartspace_ui_update_resources"; /** @hide */ - public static final String FLAG_SMARTSPACE_WEATHER_USE_MONOCHROME_FONT_ICONS = "com.android.systemui.shared.smartspace_weather_use_monochrome_font_icons"; - /** @hide */ public static final String FLAG_STATUS_BAR_CONNECTED_DISPLAYS = "com.android.systemui.shared.status_bar_connected_displays"; /** @hide */ public static final String FLAG_THREE_BUTTON_CORNER_SWIPE = "com.android.systemui.shared.three_button_corner_swipe"; @@ -57,53 +54,55 @@ public final class Flags { public static final String FLAG_USE_PREFERRED_IMAGE_EDITOR = "com.android.systemui.shared.use_preferred_image_editor"; + public static boolean ambientAod() { return FEATURE_FLAGS.ambientAod(); } + public static boolean bouncerAreaExclusion() { return FEATURE_FLAGS.bouncerAreaExclusion(); } + public static boolean clockReactiveSmartspaceLayout() { return FEATURE_FLAGS.clockReactiveSmartspaceLayout(); } + public static boolean clockReactiveVariants() { return FEATURE_FLAGS.clockReactiveVariants(); } + public static boolean cursorHotCorner() { return FEATURE_FLAGS.cursorHotCorner(); } + public static boolean enableHomeDelay() { return FEATURE_FLAGS.enableHomeDelay(); } - public static boolean enableLppAssistInvocationEffect() { + + public static boolean enableLppSqueezeEffect() { - return FEATURE_FLAGS.enableLppAssistInvocationEffect(); + return FEATURE_FLAGS.enableLppSqueezeEffect(); } - public static boolean enableLppAssistInvocationHapticEffect() { - - return FEATURE_FLAGS.enableLppAssistInvocationHapticEffect(); - } - public static boolean exampleSharedFlag() { @@ -111,17 +110,13 @@ public final class Flags { } + public static boolean extendedWallpaperEffects() { return FEATURE_FLAGS.extendedWallpaperEffects(); } - public static boolean extendibleThemeManager() { - - return FEATURE_FLAGS.extendibleThemeManager(); - } - public static boolean lockscreenCustomClocks() { @@ -129,71 +124,83 @@ public final class Flags { } + public static boolean newCustomizationPickerUi() { return FEATURE_FLAGS.newCustomizationPickerUi(); } + public static boolean newTouchpadGesturesTutorial() { return FEATURE_FLAGS.newTouchpadGesturesTutorial(); } + public static boolean returnAnimationFrameworkLibrary() { return FEATURE_FLAGS.returnAnimationFrameworkLibrary(); } + public static boolean returnAnimationFrameworkLongLived() { return FEATURE_FLAGS.returnAnimationFrameworkLongLived(); } + public static boolean screenshotContextUrl() { return FEATURE_FLAGS.screenshotContextUrl(); } + public static boolean shadeAllowBackGesture() { return FEATURE_FLAGS.shadeAllowBackGesture(); } + public static boolean sidefpsControllerRefactor() { return FEATURE_FLAGS.sidefpsControllerRefactor(); } + + public static boolean smartspaceRemoteviewsIntentHandler() { + + return FEATURE_FLAGS.smartspaceRemoteviewsIntentHandler(); + } + + + public static boolean smartspaceSportsCardBackground() { return FEATURE_FLAGS.smartspaceSportsCardBackground(); } + public static boolean smartspaceUiUpdate() { return FEATURE_FLAGS.smartspaceUiUpdate(); } + public static boolean smartspaceUiUpdateResources() { return FEATURE_FLAGS.smartspaceUiUpdateResources(); } - public static boolean smartspaceWeatherUseMonochromeFontIcons() { - - return FEATURE_FLAGS.smartspaceWeatherUseMonochromeFontIcons(); - } - public static boolean statusBarConnectedDisplays() { @@ -201,12 +208,14 @@ public final class Flags { } + public static boolean threeButtonCornerSwipe() { return FEATURE_FLAGS.threeButtonCornerSwipe(); } + public static boolean usePreferredImageEditor() { return FEATURE_FLAGS.usePreferredImageEditor(); diff --git a/flags/src/com/android/window/flags2/CustomFeatureFlags.java b/flags/src/com/android/window/flags2/CustomFeatureFlags.java index 2877bf901e..3591e0549a 100644 --- a/flags/src/com/android/window/flags2/CustomFeatureFlags.java +++ b/flags/src/com/android/window/flags2/CustomFeatureFlags.java @@ -1,6 +1,6 @@ package com.android.window.flags2; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -24,6 +24,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean activityEmbeddingAnimationCustomizationFlag() { + return getValue(Flags.FLAG_ACTIVITY_EMBEDDING_ANIMATION_CUSTOMIZATION_FLAG, + FeatureFlags::activityEmbeddingAnimationCustomizationFlag); + } + + @Override + public boolean activityEmbeddingDelayTaskFragmentFinishForActivityLaunch() { return getValue(Flags.FLAG_ACTIVITY_EMBEDDING_DELAY_TASK_FRAGMENT_FINISH_FOR_ACTIVITY_LAUNCH, FeatureFlags::activityEmbeddingDelayTaskFragmentFinishForActivityLaunch); @@ -59,6 +66,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean allowHideScmButton() { + return getValue(Flags.FLAG_ALLOW_HIDE_SCM_BUTTON, + FeatureFlags::allowHideScmButton); + } + + @Override + public boolean allowsScreenSizeDecoupledFromStatusBarAndCutout() { return getValue(Flags.FLAG_ALLOWS_SCREEN_SIZE_DECOUPLED_FROM_STATUS_BAR_AND_CUTOUT, FeatureFlags::allowsScreenSizeDecoupledFromStatusBarAndCutout); @@ -73,13 +87,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean alwaysSeqIdLayout() { - return getValue(Flags.FLAG_ALWAYS_SEQ_ID_LAYOUT, - FeatureFlags::alwaysSeqIdLayout); - } - - @Override - public boolean alwaysUpdateWallpaperPermission() { return getValue(Flags.FLAG_ALWAYS_UPDATE_WALLPAPER_PERMISSION, FeatureFlags::alwaysUpdateWallpaperPermission); @@ -115,13 +122,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean appCompatRefactoringRoundedCorners() { - return getValue(Flags.FLAG_APP_COMPAT_REFACTORING_ROUNDED_CORNERS, - FeatureFlags::appCompatRefactoringRoundedCorners); - } - - @Override - public boolean appCompatUiFramework() { return getValue(Flags.FLAG_APP_COMPAT_UI_FRAMEWORK, FeatureFlags::appCompatUiFramework); @@ -178,13 +178,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean balCoverIntentSender() { - return getValue(Flags.FLAG_BAL_COVER_INTENT_SENDER, - FeatureFlags::balCoverIntentSender); - } - - @Override - public boolean balDontBringExistingBackgroundTaskStackToFg() { return getValue(Flags.FLAG_BAL_DONT_BRING_EXISTING_BACKGROUND_TASK_STACK_TO_FG, FeatureFlags::balDontBringExistingBackgroundTaskStackToFg); @@ -192,6 +185,20 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean balImproveRealCallerVisibilityCheck() { + return getValue(Flags.FLAG_BAL_IMPROVE_REAL_CALLER_VISIBILITY_CHECK, + FeatureFlags::balImproveRealCallerVisibilityCheck); + } + + @Override + + public boolean balImprovedMetrics() { + return getValue(Flags.FLAG_BAL_IMPROVED_METRICS, + FeatureFlags::balImprovedMetrics); + } + + @Override + public boolean balReduceGracePeriod() { return getValue(Flags.FLAG_BAL_REDUCE_GRACE_PERIOD, FeatureFlags::balReduceGracePeriod); @@ -199,6 +206,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean balRequireOptInByPendingIntentCreator() { + return getValue(Flags.FLAG_BAL_REQUIRE_OPT_IN_BY_PENDING_INTENT_CREATOR, + FeatureFlags::balRequireOptInByPendingIntentCreator); + } + + @Override + public boolean balRespectAppSwitchStateWhenCheckBoundByForegroundUid() { return getValue(Flags.FLAG_BAL_RESPECT_APP_SWITCH_STATE_WHEN_CHECK_BOUND_BY_FOREGROUND_UID, FeatureFlags::balRespectAppSwitchStateWhenCheckBoundByForegroundUid); @@ -241,6 +255,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean cacheWindowStyle() { + return getValue(Flags.FLAG_CACHE_WINDOW_STYLE, + FeatureFlags::cacheWindowStyle); + } + + @Override + public boolean cameraCompatForFreeform() { return getValue(Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM, FeatureFlags::cameraCompatForFreeform); @@ -255,6 +276,27 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean checkDisabledSnapshotsInTaskPersister() { + return getValue(Flags.FLAG_CHECK_DISABLED_SNAPSHOTS_IN_TASK_PERSISTER, + FeatureFlags::checkDisabledSnapshotsInTaskPersister); + } + + @Override + + public boolean cleanupDispatchPendingTransactionsRemoteException() { + return getValue(Flags.FLAG_CLEANUP_DISPATCH_PENDING_TRANSACTIONS_REMOTE_EXCEPTION, + FeatureFlags::cleanupDispatchPendingTransactionsRemoteException); + } + + @Override + + public boolean clearSystemVibrator() { + return getValue(Flags.FLAG_CLEAR_SYSTEM_VIBRATOR, + FeatureFlags::clearSystemVibrator); + } + + @Override + public boolean closeToSquareConfigIncludesStatusBar() { return getValue(Flags.FLAG_CLOSE_TO_SQUARE_CONFIG_INCLUDES_STATUS_BAR, FeatureFlags::closeToSquareConfigIncludesStatusBar); @@ -262,6 +304,20 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean condenseConfigurationChangeForSimpleMode() { + return getValue(Flags.FLAG_CONDENSE_CONFIGURATION_CHANGE_FOR_SIMPLE_MODE, + FeatureFlags::condenseConfigurationChangeForSimpleMode); + } + + @Override + + public boolean configurableFontScaleDefault() { + return getValue(Flags.FLAG_CONFIGURABLE_FONT_SCALE_DEFAULT, + FeatureFlags::configurableFontScaleDefault); + } + + @Override + public boolean coverDisplayOptIn() { return getValue(Flags.FLAG_COVER_DISPLAY_OPT_IN, FeatureFlags::coverDisplayOptIn); @@ -269,16 +325,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean currentAnimatorScaleUsesSharedMemory() { - return getValue(Flags.FLAG_CURRENT_ANIMATOR_SCALE_USES_SHARED_MEMORY, - FeatureFlags::currentAnimatorScaleUsesSharedMemory); + public boolean delayNotificationToMagnificationWhenRecentsWindowToFrontTransition() { + return getValue(Flags.FLAG_DELAY_NOTIFICATION_TO_MAGNIFICATION_WHEN_RECENTS_WINDOW_TO_FRONT_TRANSITION, + FeatureFlags::delayNotificationToMagnificationWhenRecentsWindowToFrontTransition); } @Override - public boolean defaultDeskWithoutWarmupMigration() { - return getValue(Flags.FLAG_DEFAULT_DESK_WITHOUT_WARMUP_MIGRATION, - FeatureFlags::defaultDeskWithoutWarmupMigration); + public boolean delegateBackGestureToShell() { + return getValue(Flags.FLAG_DELEGATE_BACK_GESTURE_TO_SHELL, + FeatureFlags::delegateBackGestureToShell); } @Override @@ -290,6 +346,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean deleteCaptureDisplay() { + return getValue(Flags.FLAG_DELETE_CAPTURE_DISPLAY, + FeatureFlags::deleteCaptureDisplay); + } + + @Override + public boolean density390Api() { return getValue(Flags.FLAG_DENSITY_390_API, FeatureFlags::density390Api); @@ -318,9 +381,23 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean dispatchFirstKeyguardLockedState() { - return getValue(Flags.FLAG_DISPATCH_FIRST_KEYGUARD_LOCKED_STATE, - FeatureFlags::dispatchFirstKeyguardLockedState); + public boolean doNotCheckIntersectionWhenNonMagnifiableWindowTransitions() { + return getValue(Flags.FLAG_DO_NOT_CHECK_INTERSECTION_WHEN_NON_MAGNIFIABLE_WINDOW_TRANSITIONS, + FeatureFlags::doNotCheckIntersectionWhenNonMagnifiableWindowTransitions); + } + + @Override + + public boolean earlyLaunchHint() { + return getValue(Flags.FLAG_EARLY_LAUNCH_HINT, + FeatureFlags::earlyLaunchHint); + } + + @Override + + public boolean edgeToEdgeByDefault() { + return getValue(Flags.FLAG_EDGE_TO_EDGE_BY_DEFAULT, + FeatureFlags::edgeToEdgeByDefault); } @Override @@ -339,13 +416,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableAppHandlePositionReporting() { - return getValue(Flags.FLAG_ENABLE_APP_HANDLE_POSITION_REPORTING, - FeatureFlags::enableAppHandlePositionReporting); - } - - @Override - public boolean enableAppHeaderWithTaskDensity() { return getValue(Flags.FLAG_ENABLE_APP_HEADER_WITH_TASK_DENSITY, FeatureFlags::enableAppHeaderWithTaskDensity); @@ -353,13 +423,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableBlockNonDesktopDisplayWindowDragBugfix() { - return getValue(Flags.FLAG_ENABLE_BLOCK_NON_DESKTOP_DISPLAY_WINDOW_DRAG_BUGFIX, - FeatureFlags::enableBlockNonDesktopDisplayWindowDragBugfix); - } - - @Override - public boolean enableBorderSettings() { return getValue(Flags.FLAG_ENABLE_BORDER_SETTINGS, FeatureFlags::enableBorderSettings); @@ -367,9 +430,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableBoxShadowSettings() { - return getValue(Flags.FLAG_ENABLE_BOX_SHADOW_SETTINGS, - FeatureFlags::enableBoxShadowSettings); + public boolean enableBufferTransformHintFromDisplay() { + return getValue(Flags.FLAG_ENABLE_BUFFER_TRANSFORM_HINT_FROM_DISPLAY, + FeatureFlags::enableBufferTransformHintFromDisplay); } @Override @@ -381,13 +444,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableCameraCompatCheckDeviceRotationBugfix() { - return getValue(Flags.FLAG_ENABLE_CAMERA_COMPAT_CHECK_DEVICE_ROTATION_BUGFIX, - FeatureFlags::enableCameraCompatCheckDeviceRotationBugfix); - } - - @Override - public boolean enableCameraCompatForDesktopWindowing() { return getValue(Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING, FeatureFlags::enableCameraCompatForDesktopWindowing); @@ -444,13 +500,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableCloseLidInteraction() { - return getValue(Flags.FLAG_ENABLE_CLOSE_LID_INTERACTION, - FeatureFlags::enableCloseLidInteraction); - } - - @Override - public boolean enableCompatUiVisibilityStatus() { return getValue(Flags.FLAG_ENABLE_COMPAT_UI_VISIBILITY_STATUS, FeatureFlags::enableCompatUiVisibilityStatus); @@ -493,13 +542,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDesktopAppHeaderStateChangeAnnouncements() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS, - FeatureFlags::enableDesktopAppHeaderStateChangeAnnouncements); - } - - @Override - public boolean enableDesktopAppLaunchAlttabTransitions() { return getValue(Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS, FeatureFlags::enableDesktopAppLaunchAlttabTransitions); @@ -514,13 +556,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDesktopAppLaunchBugfix() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_BUGFIX, - FeatureFlags::enableDesktopAppLaunchBugfix); - } - - @Override - public boolean enableDesktopAppLaunchTransitions() { return getValue(Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS, FeatureFlags::enableDesktopAppLaunchTransitions); @@ -549,34 +584,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDesktopFirstBasedDefaultToDesktopBugfix() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_FIRST_BASED_DEFAULT_TO_DESKTOP_BUGFIX, - FeatureFlags::enableDesktopFirstBasedDefaultToDesktopBugfix); - } - - @Override - - public boolean enableDesktopFirstBasedDragToMaximize() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_FIRST_BASED_DRAG_TO_MAXIMIZE, - FeatureFlags::enableDesktopFirstBasedDragToMaximize); - } - - @Override - - public boolean enableDesktopFirstFullscreenRefocusBugfix() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX, - FeatureFlags::enableDesktopFirstFullscreenRefocusBugfix); - } - - @Override - - public boolean enableDesktopFirstListener() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_FIRST_LISTENER, - FeatureFlags::enableDesktopFirstListener); - } - - @Override - public boolean enableDesktopImeBugfix() { return getValue(Flags.FLAG_ENABLE_DESKTOP_IME_BUGFIX, FeatureFlags::enableDesktopImeBugfix); @@ -619,9 +626,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDesktopSplitscreenTransitionBugfix() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_SPLITSCREEN_TRANSITION_BUGFIX, - FeatureFlags::enableDesktopSplitscreenTransitionBugfix); + public boolean enableDesktopSwipeBackMinimizeAnimationBugfix() { + return getValue(Flags.FLAG_ENABLE_DESKTOP_SWIPE_BACK_MINIMIZE_ANIMATION_BUGFIX, + FeatureFlags::enableDesktopSwipeBackMinimizeAnimationBugfix); } @Override @@ -633,13 +640,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDesktopTabTearingLaunchAnimation() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_LAUNCH_ANIMATION, - FeatureFlags::enableDesktopTabTearingLaunchAnimation); - } - - @Override - public boolean enableDesktopTabTearingMinimizeAnimationBugfix() { return getValue(Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_MINIMIZE_ANIMATION_BUGFIX, FeatureFlags::enableDesktopTabTearingMinimizeAnimationBugfix); @@ -647,13 +647,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDesktopTaskLimitSeparateTransition() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_TASK_LIMIT_SEPARATE_TRANSITION, - FeatureFlags::enableDesktopTaskLimitSeparateTransition); - } - - @Override - public boolean enableDesktopTaskbarOnFreeformDisplays() { return getValue(Flags.FLAG_ENABLE_DESKTOP_TASKBAR_ON_FREEFORM_DISPLAYS, FeatureFlags::enableDesktopTaskbarOnFreeformDisplays); @@ -794,13 +787,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDesktopWindowingPipInOverviewBugfix() { - return getValue(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PIP_IN_OVERVIEW_BUGFIX, - FeatureFlags::enableDesktopWindowingPipInOverviewBugfix); - } - - @Override - public boolean enableDesktopWindowingQuickSwitch() { return getValue(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_QUICK_SWITCH, FeatureFlags::enableDesktopWindowingQuickSwitch); @@ -864,13 +850,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDisplayCompatMode() { - return getValue(Flags.FLAG_ENABLE_DISPLAY_COMPAT_MODE, - FeatureFlags::enableDisplayCompatMode); - } - - @Override - public boolean enableDisplayDisconnectInteraction() { return getValue(Flags.FLAG_ENABLE_DISPLAY_DISCONNECT_INTERACTION, FeatureFlags::enableDisplayDisconnectInteraction); @@ -920,13 +899,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableDraggingPipAcrossDisplays() { - return getValue(Flags.FLAG_ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS, - FeatureFlags::enableDraggingPipAcrossDisplays); - } - - @Override - public boolean enableDynamicRadiusComputationBugfix() { return getValue(Flags.FLAG_ENABLE_DYNAMIC_RADIUS_COMPUTATION_BUGFIX, FeatureFlags::enableDynamicRadiusComputationBugfix); @@ -934,34 +906,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableEmptyDeskOnMinimize() { - return getValue(Flags.FLAG_ENABLE_EMPTY_DESK_ON_MINIMIZE, - FeatureFlags::enableEmptyDeskOnMinimize); - } - - @Override - - public boolean enableExperimentalBubblesController() { - return getValue(Flags.FLAG_ENABLE_EXPERIMENTAL_BUBBLES_CONTROLLER, - FeatureFlags::enableExperimentalBubblesController); - } - - @Override - - public boolean enableFreeformBoxShadows() { - return getValue(Flags.FLAG_ENABLE_FREEFORM_BOX_SHADOWS, - FeatureFlags::enableFreeformBoxShadows); - } - - @Override - - public boolean enableFreeformDisplayLaunchParams() { - return getValue(Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, - FeatureFlags::enableFreeformDisplayLaunchParams); - } - - @Override - public boolean enableFullScreenWindowOnRemovingSplitScreenStageBugfix() { return getValue(Flags.FLAG_ENABLE_FULL_SCREEN_WINDOW_ON_REMOVING_SPLIT_SCREEN_STAGE_BUGFIX, FeatureFlags::enableFullScreenWindowOnRemovingSplitScreenStageBugfix); @@ -969,13 +913,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableFullscreenWindowControls() { - return getValue(Flags.FLAG_ENABLE_FULLSCREEN_WINDOW_CONTROLS, - FeatureFlags::enableFullscreenWindowControls); - } - - @Override - public boolean enableFullyImmersiveInDesktop() { return getValue(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP, FeatureFlags::enableFullyImmersiveInDesktop); @@ -990,13 +927,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableHandlersDebuggingMode() { - return getValue(Flags.FLAG_ENABLE_HANDLERS_DEBUGGING_MODE, - FeatureFlags::enableHandlersDebuggingMode); - } - - @Override - public boolean enableHoldToDragAppHandle() { return getValue(Flags.FLAG_ENABLE_HOLD_TO_DRAG_APP_HANDLE, FeatureFlags::enableHoldToDragAppHandle); @@ -1004,20 +934,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableIndependentBackInProjected() { - return getValue(Flags.FLAG_ENABLE_INDEPENDENT_BACK_IN_PROJECTED, - FeatureFlags::enableIndependentBackInProjected); - } - - @Override - - public boolean enableInorderTransitionCallbacksForDesktop() { - return getValue(Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP, - FeatureFlags::enableInorderTransitionCallbacksForDesktop); - } - - @Override - public boolean enableInputLayerTransitionFix() { return getValue(Flags.FLAG_ENABLE_INPUT_LAYER_TRANSITION_FIX, FeatureFlags::enableInputLayerTransitionFix); @@ -1025,13 +941,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableKeyGestureHandlerForSysui() { - return getValue(Flags.FLAG_ENABLE_KEY_GESTURE_HANDLER_FOR_SYSUI, - FeatureFlags::enableKeyGestureHandlerForSysui); - } - - @Override - public boolean enableMinimizeButton() { return getValue(Flags.FLAG_ENABLE_MINIMIZE_BUTTON, FeatureFlags::enableMinimizeButton); @@ -1046,13 +955,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableModalsFullscreenWithPlatformSignature() { - return getValue(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE, - FeatureFlags::enableModalsFullscreenWithPlatformSignature); - } - - @Override - public boolean enableMoveToNextDisplayShortcut() { return getValue(Flags.FLAG_ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT, FeatureFlags::enableMoveToNextDisplayShortcut); @@ -1081,13 +983,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableMultipleDesktopsDefaultActivationInDesktopFirstDisplays() { - return getValue(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_DEFAULT_ACTIVATION_IN_DESKTOP_FIRST_DISPLAYS, - FeatureFlags::enableMultipleDesktopsDefaultActivationInDesktopFirstDisplays); - } - - @Override - public boolean enableMultipleDesktopsFrontend() { return getValue(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_FRONTEND, FeatureFlags::enableMultipleDesktopsFrontend); @@ -1095,13 +990,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableNoWindowDecorationForDesks() { - return getValue(Flags.FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS, - FeatureFlags::enableNoWindowDecorationForDesks); - } - - @Override - public boolean enableNonDefaultDisplaySplit() { return getValue(Flags.FLAG_ENABLE_NON_DEFAULT_DISPLAY_SPLIT, FeatureFlags::enableNonDefaultDisplaySplit); @@ -1109,13 +997,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableOmitAccelerometerRotationRestore() { - return getValue(Flags.FLAG_ENABLE_OMIT_ACCELEROMETER_ROTATION_RESTORE, - FeatureFlags::enableOmitAccelerometerRotationRestore); - } - - @Override - public boolean enableOpaqueBackgroundForTransparentWindows() { return getValue(Flags.FLAG_ENABLE_OPAQUE_BACKGROUND_FOR_TRANSPARENT_WINDOWS, FeatureFlags::enableOpaqueBackgroundForTransparentWindows); @@ -1123,13 +1004,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableOverflowButtonForTaskbarPinnedItems() { - return getValue(Flags.FLAG_ENABLE_OVERFLOW_BUTTON_FOR_TASKBAR_PINNED_ITEMS, - FeatureFlags::enableOverflowButtonForTaskbarPinnedItems); - } - - @Override - public boolean enablePerDisplayDesktopWallpaperActivity() { return getValue(Flags.FLAG_ENABLE_PER_DISPLAY_DESKTOP_WALLPAPER_ACTIVITY, FeatureFlags::enablePerDisplayDesktopWallpaperActivity); @@ -1151,13 +1025,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enablePinningAppWithContextMenu() { - return getValue(Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU, - FeatureFlags::enablePinningAppWithContextMenu); - } - - @Override - public boolean enablePresentationForConnectedDisplays() { return getValue(Flags.FLAG_ENABLE_PRESENTATION_FOR_CONNECTED_DISPLAYS, FeatureFlags::enablePresentationForConnectedDisplays); @@ -1179,13 +1046,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableRejectHomeTransition() { - return getValue(Flags.FLAG_ENABLE_REJECT_HOME_TRANSITION, - FeatureFlags::enableRejectHomeTransition); - } - - @Override - public boolean enableRequestFullscreenBugfix() { return getValue(Flags.FLAG_ENABLE_REQUEST_FULLSCREEN_BUGFIX, FeatureFlags::enableRequestFullscreenBugfix); @@ -1193,13 +1053,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableRequestFullscreenRefactor() { - return getValue(Flags.FLAG_ENABLE_REQUEST_FULLSCREEN_REFACTOR, - FeatureFlags::enableRequestFullscreenRefactor); - } - - @Override - public boolean enableResizingMetrics() { return getValue(Flags.FLAG_ENABLE_RESIZING_METRICS, FeatureFlags::enableResizingMetrics); @@ -1221,13 +1074,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableSeeThroughTaskFragments() { - return getValue(Flags.FLAG_ENABLE_SEE_THROUGH_TASK_FRAGMENTS, - FeatureFlags::enableSeeThroughTaskFragments); - } - - @Override - public boolean enableShellInitialBoundsRegressionBugFix() { return getValue(Flags.FLAG_ENABLE_SHELL_INITIAL_BOUNDS_REGRESSION_BUG_FIX, FeatureFlags::enableShellInitialBoundsRegressionBugFix); @@ -1249,20 +1095,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableSysDecorsCallbacksViaWm() { - return getValue(Flags.FLAG_ENABLE_SYS_DECORS_CALLBACKS_VIA_WM, - FeatureFlags::enableSysDecorsCallbacksViaWm); - } - - @Override - - public boolean enableTallAppHeaders() { - return getValue(Flags.FLAG_ENABLE_TALL_APP_HEADERS, - FeatureFlags::enableTallAppHeaders); - } - - @Override - public boolean enableTaskResizingKeyboardShortcuts() { return getValue(Flags.FLAG_ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS, FeatureFlags::enableTaskResizingKeyboardShortcuts); @@ -1291,13 +1123,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableTaskbarRecentTasksThrottleBugfix() { - return getValue(Flags.FLAG_ENABLE_TASKBAR_RECENT_TASKS_THROTTLE_BUGFIX, - FeatureFlags::enableTaskbarRecentTasksThrottleBugfix); - } - - @Override - public boolean enableTaskbarRecentsLayoutTransition() { return getValue(Flags.FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION, FeatureFlags::enableTaskbarRecentsLayoutTransition); @@ -1326,13 +1151,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableTransitionOnActivitySetRequestedOrientation() { - return getValue(Flags.FLAG_ENABLE_TRANSITION_ON_ACTIVITY_SET_REQUESTED_ORIENTATION, - FeatureFlags::enableTransitionOnActivitySetRequestedOrientation); - } - - @Override - public boolean enableVisualIndicatorInTransitionBugfix() { return getValue(Flags.FLAG_ENABLE_VISUAL_INDICATOR_IN_TRANSITION_BUGFIX, FeatureFlags::enableVisualIndicatorInTransitionBugfix); @@ -1340,13 +1158,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableWindowContextOverrideType() { - return getValue(Flags.FLAG_ENABLE_WINDOW_CONTEXT_OVERRIDE_TYPE, - FeatureFlags::enableWindowContextOverrideType); - } - - @Override - public boolean enableWindowContextResourcesUpdateOnConfigChange() { return getValue(Flags.FLAG_ENABLE_WINDOW_CONTEXT_RESOURCES_UPDATE_ON_CONFIG_CHANGE, FeatureFlags::enableWindowContextResourcesUpdateOnConfigChange); @@ -1354,20 +1165,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableWindowDecorationRefactor() { - return getValue(Flags.FLAG_ENABLE_WINDOW_DECORATION_REFACTOR, - FeatureFlags::enableWindowDecorationRefactor); - } - - @Override - - public boolean enableWindowRepositioningApi() { - return getValue(Flags.FLAG_ENABLE_WINDOW_REPOSITIONING_API, - FeatureFlags::enableWindowRepositioningApi); - } - - @Override - public boolean enableWindowingDynamicInitialBounds() { return getValue(Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS, FeatureFlags::enableWindowingDynamicInitialBounds); @@ -1389,13 +1186,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableWindowingTaskStackOrderBugfix() { - return getValue(Flags.FLAG_ENABLE_WINDOWING_TASK_STACK_ORDER_BUGFIX, - FeatureFlags::enableWindowingTaskStackOrderBugfix); - } - - @Override - public boolean enableWindowingTransitionHandlersObservers() { return getValue(Flags.FLAG_ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS, FeatureFlags::enableWindowingTransitionHandlersObservers); @@ -1417,6 +1207,20 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean ensureWallpaperInTransitions() { + return getValue(Flags.FLAG_ENSURE_WALLPAPER_IN_TRANSITIONS, + FeatureFlags::ensureWallpaperInTransitions); + } + + @Override + + public boolean ensureWallpaperInWearTransitions() { + return getValue(Flags.FLAG_ENSURE_WALLPAPER_IN_WEAR_TRANSITIONS, + FeatureFlags::ensureWallpaperInWearTransitions); + } + + @Override + public boolean enterDesktopByDefaultOnFreeformDisplays() { return getValue(Flags.FLAG_ENTER_DESKTOP_BY_DEFAULT_ON_FREEFORM_DISPLAYS, FeatureFlags::enterDesktopByDefaultOnFreeformDisplays); @@ -1431,16 +1235,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean excludeDeskRootsFromDesktopTasks() { - return getValue(Flags.FLAG_EXCLUDE_DESK_ROOTS_FROM_DESKTOP_TASKS, - FeatureFlags::excludeDeskRootsFromDesktopTasks); - } - - @Override - - public boolean excludeNonMainWindowFromSnapshot() { - return getValue(Flags.FLAG_EXCLUDE_NON_MAIN_WINDOW_FROM_SNAPSHOT, - FeatureFlags::excludeNonMainWindowFromSnapshot); + public boolean excludeDrawingAppThemeSnapshotFromLock() { + return getValue(Flags.FLAG_EXCLUDE_DRAWING_APP_THEME_SNAPSHOT_FROM_LOCK, + FeatureFlags::excludeDrawingAppThemeSnapshotFromLock); } @Override @@ -1452,20 +1249,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean extendingPersistenceSnapshotQueueDepth() { - return getValue(Flags.FLAG_EXTENDING_PERSISTENCE_SNAPSHOT_QUEUE_DEPTH, - FeatureFlags::extendingPersistenceSnapshotQueueDepth); - } - - @Override - - public boolean fallbackToFocusedDisplay() { - return getValue(Flags.FLAG_FALLBACK_TO_FOCUSED_DISPLAY, - FeatureFlags::fallbackToFocusedDisplay); - } - - @Override - public boolean fifoPriorityForMajorUiProcesses() { return getValue(Flags.FLAG_FIFO_PRIORITY_FOR_MAJOR_UI_PROCESSES, FeatureFlags::fifoPriorityForMajorUiProcesses); @@ -1473,13 +1256,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean fixFullscreenInMultiWindow() { - return getValue(Flags.FLAG_FIX_FULLSCREEN_IN_MULTI_WINDOW, - FeatureFlags::fixFullscreenInMultiWindow); - } - - @Override - public boolean fixHideOverlayApi() { return getValue(Flags.FLAG_FIX_HIDE_OVERLAY_API, FeatureFlags::fixHideOverlayApi); @@ -1487,30 +1263,16 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean fixLayoutRestoredTask() { - return getValue(Flags.FLAG_FIX_LAYOUT_RESTORED_TASK, - FeatureFlags::fixLayoutRestoredTask); + public boolean fixLayoutExistingTask() { + return getValue(Flags.FLAG_FIX_LAYOUT_EXISTING_TASK, + FeatureFlags::fixLayoutExistingTask); } @Override - public boolean fixMovingUnfocusedTask() { - return getValue(Flags.FLAG_FIX_MOVING_UNFOCUSED_TASK, - FeatureFlags::fixMovingUnfocusedTask); - } - - @Override - - public boolean fixSetAdjacentTaskFragmentsWithParams() { - return getValue(Flags.FLAG_FIX_SET_ADJACENT_TASK_FRAGMENTS_WITH_PARAMS, - FeatureFlags::fixSetAdjacentTaskFragmentsWithParams); - } - - @Override - - public boolean fixShowWhenLockedSyncTimeout() { - return getValue(Flags.FLAG_FIX_SHOW_WHEN_LOCKED_SYNC_TIMEOUT, - FeatureFlags::fixShowWhenLockedSyncTimeout); + public boolean fixViewRootCallTrace() { + return getValue(Flags.FLAG_FIX_VIEW_ROOT_CALL_TRACE, + FeatureFlags::fixViewRootCallTrace); } @Override @@ -1522,13 +1284,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean forceShowSystemBarForBubble() { - return getValue(Flags.FLAG_FORCE_SHOW_SYSTEM_BAR_FOR_BUBBLE, - FeatureFlags::forceShowSystemBarForBubble); - } - - @Override - public boolean formFactorBasedDesktopFirstSwitch() { return getValue(Flags.FLAG_FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH, FeatureFlags::formFactorBasedDesktopFirstSwitch); @@ -1543,13 +1298,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean grantManageKeyGesturesToRecents() { - return getValue(Flags.FLAG_GRANT_MANAGE_KEY_GESTURES_TO_RECENTS, - FeatureFlags::grantManageKeyGesturesToRecents); - } - - @Override - public boolean ignoreAspectRatioRestrictionsForResizeableFreeformActivities() { return getValue(Flags.FLAG_IGNORE_ASPECT_RATIO_RESTRICTIONS_FOR_RESIZEABLE_FREEFORM_ACTIVITIES, FeatureFlags::ignoreAspectRatioRestrictionsForResizeableFreeformActivities); @@ -1585,13 +1333,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean interceptMotionFromMoveToCancel() { - return getValue(Flags.FLAG_INTERCEPT_MOTION_FROM_MOVE_TO_CANCEL, - FeatureFlags::interceptMotionFromMoveToCancel); - } - - @Override - public boolean jankApi() { return getValue(Flags.FLAG_JANK_API, FeatureFlags::jankApi); @@ -1599,6 +1340,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean keepAppWindowHideWhileLocked() { + return getValue(Flags.FLAG_KEEP_APP_WINDOW_HIDE_WHILE_LOCKED, + FeatureFlags::keepAppWindowHideWhileLocked); + } + + @Override + public boolean keyboardShortcutsToSwitchDesks() { return getValue(Flags.FLAG_KEYBOARD_SHORTCUTS_TO_SWITCH_DESKS, FeatureFlags::keyboardShortcutsToSwitchDesks); @@ -1606,6 +1354,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean keyguardGoingAwayTimeout() { + return getValue(Flags.FLAG_KEYGUARD_GOING_AWAY_TIMEOUT, + FeatureFlags::keyguardGoingAwayTimeout); + } + + @Override + public boolean letterboxBackgroundWallpaper() { return getValue(Flags.FLAG_LETTERBOX_BACKGROUND_WALLPAPER, FeatureFlags::letterboxBackgroundWallpaper); @@ -1641,9 +1396,30 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean nestedTasksWithIndependentBoundsBugfix() { - return getValue(Flags.FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS_BUGFIX, - FeatureFlags::nestedTasksWithIndependentBoundsBugfix); + public boolean nestedTasksWithIndependentBounds() { + return getValue(Flags.FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS, + FeatureFlags::nestedTasksWithIndependentBounds); + } + + @Override + + public boolean noConsecutiveVisibilityEvents() { + return getValue(Flags.FLAG_NO_CONSECUTIVE_VISIBILITY_EVENTS, + FeatureFlags::noConsecutiveVisibilityEvents); + } + + @Override + + public boolean noDuplicateSurfaceDestroyedEvents() { + return getValue(Flags.FLAG_NO_DUPLICATE_SURFACE_DESTROYED_EVENTS, + FeatureFlags::noDuplicateSurfaceDestroyedEvents); + } + + @Override + + public boolean noVisibilityEventOnDisplayStateChange() { + return getValue(Flags.FLAG_NO_VISIBILITY_EVENT_ON_DISPLAY_STATE_CHANGE, + FeatureFlags::noVisibilityEventOnDisplayStateChange); } @Override @@ -1655,13 +1431,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean parallelCdTransitionsDuringRecents() { - return getValue(Flags.FLAG_PARALLEL_CD_TRANSITIONS_DURING_RECENTS, - FeatureFlags::parallelCdTransitionsDuringRecents); - } - - @Override - public boolean portWindowSizeAnimation() { return getValue(Flags.FLAG_PORT_WINDOW_SIZE_ANIMATION, FeatureFlags::portWindowSizeAnimation); @@ -1711,9 +1480,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean preserveRecentsTaskConfigurationOnRelaunch() { - return getValue(Flags.FLAG_PRESERVE_RECENTS_TASK_CONFIGURATION_ON_RELAUNCH, - FeatureFlags::preserveRecentsTaskConfigurationOnRelaunch); + public boolean processPriorityPolicyForMultiWindowMode() { + return getValue(Flags.FLAG_PROCESS_PRIORITY_POLICY_FOR_MULTI_WINDOW_MODE, + FeatureFlags::processPriorityPolicyForMultiWindowMode); } @Override @@ -1725,6 +1494,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean recordTaskSnapshotsBeforeShutdown() { + return getValue(Flags.FLAG_RECORD_TASK_SNAPSHOTS_BEFORE_SHUTDOWN, + FeatureFlags::recordTaskSnapshotsBeforeShutdown); + } + + @Override + public boolean reduceChangedExclusionRectsMsgs() { return getValue(Flags.FLAG_REDUCE_CHANGED_EXCLUSION_RECTS_MSGS, FeatureFlags::reduceChangedExclusionRectsMsgs); @@ -1732,6 +1508,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean reduceKeyguardTransitions() { + return getValue(Flags.FLAG_REDUCE_KEYGUARD_TRANSITIONS, + FeatureFlags::reduceKeyguardTransitions); + } + + @Override + public boolean reduceTaskSnapshotMemoryUsage() { return getValue(Flags.FLAG_REDUCE_TASK_SNAPSHOT_MEMORY_USAGE, FeatureFlags::reduceTaskSnapshotMemoryUsage); @@ -1739,6 +1522,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean reduceUnnecessaryMeasure() { + return getValue(Flags.FLAG_REDUCE_UNNECESSARY_MEASURE, + FeatureFlags::reduceUnnecessaryMeasure); + } + + @Override + public boolean relativeInsets() { return getValue(Flags.FLAG_RELATIVE_INSETS, FeatureFlags::relativeInsets); @@ -1753,9 +1543,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean releaseSurfaceOnTransitionFinish() { - return getValue(Flags.FLAG_RELEASE_SURFACE_ON_TRANSITION_FINISH, - FeatureFlags::releaseSurfaceOnTransitionFinish); + public boolean releaseUserAspectRatioWm() { + return getValue(Flags.FLAG_RELEASE_USER_ASPECT_RATIO_WM, + FeatureFlags::releaseUserAspectRatioWm); } @Override @@ -1767,6 +1557,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean removeDeferHidingClient() { + return getValue(Flags.FLAG_REMOVE_DEFER_HIDING_CLIENT, + FeatureFlags::removeDeferHidingClient); + } + + @Override + public boolean removeDepartTargetFromMotion() { return getValue(Flags.FLAG_REMOVE_DEPART_TARGET_FROM_MOTION, FeatureFlags::removeDepartTargetFromMotion); @@ -1774,20 +1571,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean removeStartingInTransition() { - return getValue(Flags.FLAG_REMOVE_STARTING_IN_TRANSITION, - FeatureFlags::removeStartingInTransition); - } - - @Override - - public boolean reparentToDefaultWithDisplayRemoval() { - return getValue(Flags.FLAG_REPARENT_TO_DEFAULT_WITH_DISPLAY_REMOVAL, - FeatureFlags::reparentToDefaultWithDisplayRemoval); - } - - @Override - public boolean reparentWindowTokenApi() { return getValue(Flags.FLAG_REPARENT_WINDOW_TOKEN_API, FeatureFlags::reparentWindowTokenApi); @@ -1795,23 +1578,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean respectFullscreenActivityOptionInDesktopLaunchParams() { - return getValue(Flags.FLAG_RESPECT_FULLSCREEN_ACTIVITY_OPTION_IN_DESKTOP_LAUNCH_PARAMS, - FeatureFlags::respectFullscreenActivityOptionInDesktopLaunchParams); - } - - @Override - - public boolean respectHierarchySurfaceVisibility() { - return getValue(Flags.FLAG_RESPECT_HIERARCHY_SURFACE_VISIBILITY, - FeatureFlags::respectHierarchySurfaceVisibility); - } - - @Override - - public boolean respectLeafTaskBounds() { - return getValue(Flags.FLAG_RESPECT_LEAF_TASK_BOUNDS, - FeatureFlags::respectLeafTaskBounds); + public boolean respectNonTopVisibleFixedOrientation() { + return getValue(Flags.FLAG_RESPECT_NON_TOP_VISIBLE_FIXED_ORIENTATION, + FeatureFlags::respectNonTopVisibleFixedOrientation); } @Override @@ -1823,27 +1592,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean restoreUserAspectRatioSettingsUsingService() { - return getValue(Flags.FLAG_RESTORE_USER_ASPECT_RATIO_SETTINGS_USING_SERVICE, - FeatureFlags::restoreUserAspectRatioSettingsUsingService); - } - - @Override - - public boolean restrictFreeformHiddenSystemBarsToFillingTasks() { - return getValue(Flags.FLAG_RESTRICT_FREEFORM_HIDDEN_SYSTEM_BARS_TO_FILLING_TASKS, - FeatureFlags::restrictFreeformHiddenSystemBarsToFillingTasks); - } - - @Override - - public boolean rootTaskForBubble() { - return getValue(Flags.FLAG_ROOT_TASK_FOR_BUBBLE, - FeatureFlags::rootTaskForBubble); - } - - @Override - public boolean safeRegionLetterboxing() { return getValue(Flags.FLAG_SAFE_REGION_LETTERBOXING, FeatureFlags::safeRegionLetterboxing); @@ -1872,13 +1620,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean screenBrightnessDimOnEmulator() { - return getValue(Flags.FLAG_SCREEN_BRIGHTNESS_DIM_ON_EMULATOR, - FeatureFlags::screenBrightnessDimOnEmulator); - } - - @Override - public boolean screenRecordingCallbacks() { return getValue(Flags.FLAG_SCREEN_RECORDING_CALLBACKS, FeatureFlags::screenRecordingCallbacks); @@ -1893,13 +1634,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean scvhSurfaceControlLifetimeFix() { - return getValue(Flags.FLAG_SCVH_SURFACE_CONTROL_LIFETIME_FIX, - FeatureFlags::scvhSurfaceControlLifetimeFix); - } - - @Override - public boolean sdkDesiredPresentTime() { return getValue(Flags.FLAG_SDK_DESIRED_PRESENT_TIME, FeatureFlags::sdkDesiredPresentTime); @@ -1949,13 +1683,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean skipDeactivationOfDeskWithNothingInFront() { - return getValue(Flags.FLAG_SKIP_DEACTIVATION_OF_DESK_WITH_NOTHING_IN_FRONT, - FeatureFlags::skipDeactivationOfDeskWithNothingInFront); - } - - @Override - public boolean skipDecorViewRelayoutWhenClosingBugfix() { return getValue(Flags.FLAG_SKIP_DECOR_VIEW_RELAYOUT_WHEN_CLOSING_BUGFIX, FeatureFlags::skipDecorViewRelayoutWhenClosingBugfix); @@ -1963,9 +1690,9 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean splashScreenViewSyncTransaction() { - return getValue(Flags.FLAG_SPLASH_SCREEN_VIEW_SYNC_TRANSACTION, - FeatureFlags::splashScreenViewSyncTransaction); + public boolean supportWidgetIntentsOnConnectedDisplay() { + return getValue(Flags.FLAG_SUPPORT_WIDGET_INTENTS_ON_CONNECTED_DISPLAY, + FeatureFlags::supportWidgetIntentsOnConnectedDisplay); } @Override @@ -2012,6 +1739,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean taskFragmentSystemOrganizerFlag() { + return getValue(Flags.FLAG_TASK_FRAGMENT_SYSTEM_ORGANIZER_FLAG, + FeatureFlags::taskFragmentSystemOrganizerFlag); + } + + @Override + public boolean touchPassThroughOptIn() { return getValue(Flags.FLAG_TOUCH_PASS_THROUGH_OPT_IN, FeatureFlags::touchPassThroughOptIn); @@ -2019,6 +1753,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean trackSystemUiContextBeforeWms() { + return getValue(Flags.FLAG_TRACK_SYSTEM_UI_CONTEXT_BEFORE_WMS, + FeatureFlags::trackSystemUiContextBeforeWms); + } + + @Override + public boolean transitReadyTracking() { return getValue(Flags.FLAG_TRANSIT_READY_TRACKING, FeatureFlags::transitReadyTracking); @@ -2033,13 +1774,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean transitionHandlerCujTags() { - return getValue(Flags.FLAG_TRANSITION_HANDLER_CUJ_TAGS, - FeatureFlags::transitionHandlerCujTags); - } - - @Override - public boolean trustedPresentationListenerForWindow() { return getValue(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW, FeatureFlags::trustedPresentationListenerForWindow); @@ -2054,13 +1788,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean unifyShellBinders() { - return getValue(Flags.FLAG_UNIFY_SHELL_BINDERS, - FeatureFlags::unifyShellBinders); - } - - @Override - public boolean universalResizableByDefault() { return getValue(Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT, FeatureFlags::universalResizableByDefault); @@ -2089,20 +1816,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean updateHostInputTransferToken() { - return getValue(Flags.FLAG_UPDATE_HOST_INPUT_TRANSFER_TOKEN, - FeatureFlags::updateHostInputTransferToken); - } - - @Override - - public boolean updateTaskMinDimensionsWithRootActivity() { - return getValue(Flags.FLAG_UPDATE_TASK_MIN_DIMENSIONS_WITH_ROOT_ACTIVITY, - FeatureFlags::updateTaskMinDimensionsWithRootActivity); - } - - @Override - public boolean useCachedInsetsForDisplaySwitch() { return getValue(Flags.FLAG_USE_CACHED_INSETS_FOR_DISPLAY_SWITCH, FeatureFlags::useCachedInsetsForDisplaySwitch); @@ -2110,6 +1823,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean useRtFrameCallbackForSplashScreenTransfer() { + return getValue(Flags.FLAG_USE_RT_FRAME_CALLBACK_FOR_SPLASH_SCREEN_TRANSFER, + FeatureFlags::useRtFrameCallbackForSplashScreenTransfer); + } + + @Override + public boolean useTasksDimOnly() { return getValue(Flags.FLAG_USE_TASKS_DIM_ONLY, FeatureFlags::useTasksDimOnly); @@ -2117,6 +1837,20 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean useVisibleRequestedForProcessTracker() { + return getValue(Flags.FLAG_USE_VISIBLE_REQUESTED_FOR_PROCESS_TRACKER, + FeatureFlags::useVisibleRequestedForProcessTracker); + } + + @Override + + public boolean useWindowOriginalTouchableRegionWhenMagnificationRecomputeBounds() { + return getValue(Flags.FLAG_USE_WINDOW_ORIGINAL_TOUCHABLE_REGION_WHEN_MAGNIFICATION_RECOMPUTE_BOUNDS, + FeatureFlags::useWindowOriginalTouchableRegionWhenMagnificationRecomputeBounds); + } + + @Override + public boolean vdmForceAppUniversalResizableApi() { return getValue(Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API, FeatureFlags::vdmForceAppUniversalResizableApi); @@ -2156,20 +1890,20 @@ public class CustomFeatureFlags implements FeatureFlags { public List getFlagNames() { return Arrays.asList( Flags.FLAG_ACTION_MODE_EDGE_TO_EDGE, + Flags.FLAG_ACTIVITY_EMBEDDING_ANIMATION_CUSTOMIZATION_FLAG, Flags.FLAG_ACTIVITY_EMBEDDING_DELAY_TASK_FRAGMENT_FINISH_FOR_ACTIVITY_LAUNCH, Flags.FLAG_ACTIVITY_EMBEDDING_INTERACTIVE_DIVIDER_FLAG, Flags.FLAG_ACTIVITY_EMBEDDING_METRICS, Flags.FLAG_ACTIVITY_EMBEDDING_SUPPORT_FOR_CONNECTED_DISPLAYS, Flags.FLAG_ALLOW_DISABLE_ACTIVITY_RECORD_INPUT_SINK, + Flags.FLAG_ALLOW_HIDE_SCM_BUTTON, Flags.FLAG_ALLOWS_SCREEN_SIZE_DECOUPLED_FROM_STATUS_BAR_AND_CUTOUT, Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER, - Flags.FLAG_ALWAYS_SEQ_ID_LAYOUT, Flags.FLAG_ALWAYS_UPDATE_WALLPAPER_PERMISSION, Flags.FLAG_AOD_TRANSITION, Flags.FLAG_APP_COMPAT_ASYNC_RELAYOUT, Flags.FLAG_APP_COMPAT_PROPERTIES_API, Flags.FLAG_APP_COMPAT_REFACTORING, - Flags.FLAG_APP_COMPAT_REFACTORING_ROUNDED_CORNERS, Flags.FLAG_APP_COMPAT_UI_FRAMEWORK, Flags.FLAG_APP_HANDLE_NO_RELAYOUT_ON_EXCLUSION_CHANGE, Flags.FLAG_APPLY_LIFECYCLE_ON_PIP_CHANGE, @@ -2178,36 +1912,44 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_BAL_ADDITIONAL_LOGGING, Flags.FLAG_BAL_ADDITIONAL_START_MODES, Flags.FLAG_BAL_CLEAR_ALLOWLIST_DURATION, - Flags.FLAG_BAL_COVER_INTENT_SENDER, Flags.FLAG_BAL_DONT_BRING_EXISTING_BACKGROUND_TASK_STACK_TO_FG, + Flags.FLAG_BAL_IMPROVE_REAL_CALLER_VISIBILITY_CHECK, + Flags.FLAG_BAL_IMPROVED_METRICS, Flags.FLAG_BAL_REDUCE_GRACE_PERIOD, + Flags.FLAG_BAL_REQUIRE_OPT_IN_BY_PENDING_INTENT_CREATOR, Flags.FLAG_BAL_RESPECT_APP_SWITCH_STATE_WHEN_CHECK_BOUND_BY_FOREGROUND_UID, Flags.FLAG_BAL_SEND_INTENT_WITH_OPTIONS, Flags.FLAG_BAL_SHOW_TOASTS_BLOCKED, Flags.FLAG_BAL_STRICT_MODE_GRACE_PERIOD, Flags.FLAG_BAL_STRICT_MODE_RO, Flags.FLAG_BETTER_SUPPORT_NON_MATCH_PARENT_ACTIVITY, + Flags.FLAG_CACHE_WINDOW_STYLE, Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM, Flags.FLAG_CAMERA_COMPAT_FULLSCREEN_PICK_SAME_TASK_ACTIVITY, + Flags.FLAG_CHECK_DISABLED_SNAPSHOTS_IN_TASK_PERSISTER, + Flags.FLAG_CLEANUP_DISPATCH_PENDING_TRANSACTIONS_REMOTE_EXCEPTION, + Flags.FLAG_CLEAR_SYSTEM_VIBRATOR, Flags.FLAG_CLOSE_TO_SQUARE_CONFIG_INCLUDES_STATUS_BAR, + Flags.FLAG_CONDENSE_CONFIGURATION_CHANGE_FOR_SIMPLE_MODE, + Flags.FLAG_CONFIGURABLE_FONT_SCALE_DEFAULT, Flags.FLAG_COVER_DISPLAY_OPT_IN, - Flags.FLAG_CURRENT_ANIMATOR_SCALE_USES_SHARED_MEMORY, - Flags.FLAG_DEFAULT_DESK_WITHOUT_WARMUP_MIGRATION, + Flags.FLAG_DELAY_NOTIFICATION_TO_MAGNIFICATION_WHEN_RECENTS_WINDOW_TO_FRONT_TRANSITION, + Flags.FLAG_DELEGATE_BACK_GESTURE_TO_SHELL, Flags.FLAG_DELEGATE_UNHANDLED_DRAGS, + Flags.FLAG_DELETE_CAPTURE_DISPLAY, Flags.FLAG_DENSITY_390_API, Flags.FLAG_DISABLE_DESKTOP_LAUNCH_PARAMS_OUTSIDE_DESKTOP_BUG_FIX, Flags.FLAG_DISABLE_NON_RESIZABLE_APP_SNAP_RESIZING, Flags.FLAG_DISABLE_OPT_OUT_EDGE_TO_EDGE, - Flags.FLAG_DISPATCH_FIRST_KEYGUARD_LOCKED_STATE, + Flags.FLAG_DO_NOT_CHECK_INTERSECTION_WHEN_NON_MAGNIFIABLE_WINDOW_TRANSITIONS, + Flags.FLAG_EARLY_LAUNCH_HINT, + Flags.FLAG_EDGE_TO_EDGE_BY_DEFAULT, Flags.FLAG_ENABLE_ACCESSIBLE_CUSTOM_HEADERS, Flags.FLAG_ENABLE_ACTIVITY_EMBEDDING_SUPPORT_FOR_CONNECTED_DISPLAYS, - Flags.FLAG_ENABLE_APP_HANDLE_POSITION_REPORTING, Flags.FLAG_ENABLE_APP_HEADER_WITH_TASK_DENSITY, - Flags.FLAG_ENABLE_BLOCK_NON_DESKTOP_DISPLAY_WINDOW_DRAG_BUGFIX, Flags.FLAG_ENABLE_BORDER_SETTINGS, - Flags.FLAG_ENABLE_BOX_SHADOW_SETTINGS, + Flags.FLAG_ENABLE_BUFFER_TRANSFORM_HINT_FROM_DISPLAY, Flags.FLAG_ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY, - Flags.FLAG_ENABLE_CAMERA_COMPAT_CHECK_DEVICE_ROTATION_BUGFIX, Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING, Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING_OPT_OUT, Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING_OPT_OUT_API, @@ -2216,36 +1958,27 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION, Flags.FLAG_ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION_ALWAYS, Flags.FLAG_ENABLE_CASCADING_WINDOWS, - Flags.FLAG_ENABLE_CLOSE_LID_INTERACTION, Flags.FLAG_ENABLE_COMPAT_UI_VISIBILITY_STATUS, Flags.FLAG_ENABLE_COMPATUI_SYSUI_LAUNCHER, Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_DND, Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_PIP, Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG, Flags.FLAG_ENABLE_DESKTOP_APP_HANDLE_ANIMATION, - Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS, Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS, Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS, Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_CLOSE_SHORTCUT_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_CLOSE_TASK_ANIMATION_IN_DTC_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_FIRST_BASED_DEFAULT_TO_DESKTOP_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_FIRST_BASED_DRAG_TO_MAXIMIZE, - Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_FIRST_LISTENER, Flags.FLAG_ENABLE_DESKTOP_IME_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_IMMERSIVE_DRAG_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_INDICATOR_IN_SEPARATE_THREAD_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_DESKTOP_OPENING_DEEPLINK_MINIMIZE_ANIMATION_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_RECENTS_TRANSITIONS_CORNERS_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_SPLITSCREEN_TRANSITION_BUGFIX, + Flags.FLAG_ENABLE_DESKTOP_SWIPE_BACK_MINIMIZE_ANIMATION_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_SYSTEM_DIALOGS_TRANSITIONS, - Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_LAUNCH_ANIMATION, Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_MINIMIZE_ANIMATION_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_TASK_LIMIT_SEPARATE_TRANSITION, Flags.FLAG_ENABLE_DESKTOP_TASKBAR_ON_FREEFORM_DISPLAYS, Flags.FLAG_ENABLE_DESKTOP_TRAMPOLINE_CLOSE_ANIMATION_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_WALLPAPER_ACTIVITY_FOR_SYSTEM_USER, @@ -2266,7 +1999,6 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PIP, - Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PIP_IN_OVERVIEW_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_QUICK_SWITCH, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_SCVH_CACHE_BUG_FIX, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_SIZE_CONSTRAINTS, @@ -2276,7 +2008,6 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY, Flags.FLAG_ENABLE_DEVICE_STATE_AUTO_ROTATE_SETTING_LOGGING, Flags.FLAG_ENABLE_DEVICE_STATE_AUTO_ROTATE_SETTING_REFACTOR, - Flags.FLAG_ENABLE_DISPLAY_COMPAT_MODE, Flags.FLAG_ENABLE_DISPLAY_DISCONNECT_INTERACTION, Flags.FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS, Flags.FLAG_ENABLE_DISPLAY_RECONNECT_INTERACTION, @@ -2284,112 +2015,82 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_DRAG_RESIZE_SET_UP_IN_BG_THREAD, Flags.FLAG_ENABLE_DRAG_TO_DESKTOP_INCOMING_TRANSITIONS_BUGFIX, Flags.FLAG_ENABLE_DRAG_TO_MAXIMIZE, - Flags.FLAG_ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS, Flags.FLAG_ENABLE_DYNAMIC_RADIUS_COMPUTATION_BUGFIX, - Flags.FLAG_ENABLE_EMPTY_DESK_ON_MINIMIZE, - Flags.FLAG_ENABLE_EXPERIMENTAL_BUBBLES_CONTROLLER, - Flags.FLAG_ENABLE_FREEFORM_BOX_SHADOWS, - Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_FULL_SCREEN_WINDOW_ON_REMOVING_SPLIT_SCREEN_STAGE_BUGFIX, - Flags.FLAG_ENABLE_FULLSCREEN_WINDOW_CONTROLS, Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP, Flags.FLAG_ENABLE_HANDLE_INPUT_FIX, - Flags.FLAG_ENABLE_HANDLERS_DEBUGGING_MODE, Flags.FLAG_ENABLE_HOLD_TO_DRAG_APP_HANDLE, - Flags.FLAG_ENABLE_INDEPENDENT_BACK_IN_PROJECTED, - Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP, Flags.FLAG_ENABLE_INPUT_LAYER_TRANSITION_FIX, - Flags.FLAG_ENABLE_KEY_GESTURE_HANDLER_FOR_SYSUI, Flags.FLAG_ENABLE_MINIMIZE_BUTTON, Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION, - Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE, Flags.FLAG_ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT, Flags.FLAG_ENABLE_MULTI_DISPLAY_SPLIT, Flags.FLAG_ENABLE_MULTIDISPLAY_TRACKPAD_BACK_GESTURE, Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND, - Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_DEFAULT_ACTIVATION_IN_DESKTOP_FIRST_DISPLAYS, Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_FRONTEND, - Flags.FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS, Flags.FLAG_ENABLE_NON_DEFAULT_DISPLAY_SPLIT, - Flags.FLAG_ENABLE_OMIT_ACCELEROMETER_ROTATION_RESTORE, Flags.FLAG_ENABLE_OPAQUE_BACKGROUND_FOR_TRANSPARENT_WINDOWS, - Flags.FLAG_ENABLE_OVERFLOW_BUTTON_FOR_TASKBAR_PINNED_ITEMS, Flags.FLAG_ENABLE_PER_DISPLAY_DESKTOP_WALLPAPER_ACTIVITY, Flags.FLAG_ENABLE_PER_DISPLAY_PACKAGE_CONTEXT_CACHE_IN_STATUSBAR_NOTIF, Flags.FLAG_ENABLE_PERSISTING_DISPLAY_SIZE_FOR_CONNECTED_DISPLAYS, - Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU, Flags.FLAG_ENABLE_PRESENTATION_FOR_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE, Flags.FLAG_ENABLE_QUICKSWITCH_DESKTOP_SPLIT_BUGFIX, - Flags.FLAG_ENABLE_REJECT_HOME_TRANSITION, Flags.FLAG_ENABLE_REQUEST_FULLSCREEN_BUGFIX, - Flags.FLAG_ENABLE_REQUEST_FULLSCREEN_REFACTOR, Flags.FLAG_ENABLE_RESIZING_METRICS, Flags.FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_RESTORE_TO_PREVIOUS_SIZE_FROM_DESKTOP_IMMERSIVE, - Flags.FLAG_ENABLE_SEE_THROUGH_TASK_FRAGMENTS, Flags.FLAG_ENABLE_SHELL_INITIAL_BOUNDS_REGRESSION_BUG_FIX, Flags.FLAG_ENABLE_SIZE_COMPAT_MODE_IMPROVEMENTS_FOR_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_START_LAUNCH_TRANSITION_FROM_TASKBAR_BUGFIX, - Flags.FLAG_ENABLE_SYS_DECORS_CALLBACKS_VIA_WM, - Flags.FLAG_ENABLE_TALL_APP_HEADERS, Flags.FLAG_ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS, Flags.FLAG_ENABLE_TASK_STACK_OBSERVER_IN_SHELL, Flags.FLAG_ENABLE_TASKBAR_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_TASKBAR_OVERFLOW, - Flags.FLAG_ENABLE_TASKBAR_RECENT_TASKS_THROTTLE_BUGFIX, Flags.FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION, Flags.FLAG_ENABLE_THEMED_APP_HEADERS, Flags.FLAG_ENABLE_TILE_RESIZING, Flags.FLAG_ENABLE_TOP_VISIBLE_ROOT_TASK_PER_USER_TRACKING, - Flags.FLAG_ENABLE_TRANSITION_ON_ACTIVITY_SET_REQUESTED_ORIENTATION, Flags.FLAG_ENABLE_VISUAL_INDICATOR_IN_TRANSITION_BUGFIX, - Flags.FLAG_ENABLE_WINDOW_CONTEXT_OVERRIDE_TYPE, Flags.FLAG_ENABLE_WINDOW_CONTEXT_RESOURCES_UPDATE_ON_CONFIG_CHANGE, - Flags.FLAG_ENABLE_WINDOW_DECORATION_REFACTOR, - Flags.FLAG_ENABLE_WINDOW_REPOSITIONING_API, Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS, Flags.FLAG_ENABLE_WINDOWING_EDGE_DRAG_RESIZE, Flags.FLAG_ENABLE_WINDOWING_SCALED_RESIZING, - Flags.FLAG_ENABLE_WINDOWING_TASK_STACK_ORDER_BUGFIX, Flags.FLAG_ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS, Flags.FLAG_ENFORCE_EDGE_TO_EDGE, Flags.FLAG_ENSURE_KEYGUARD_DOES_TRANSITION_STARTING, + Flags.FLAG_ENSURE_WALLPAPER_IN_TRANSITIONS, + Flags.FLAG_ENSURE_WALLPAPER_IN_WEAR_TRANSITIONS, Flags.FLAG_ENTER_DESKTOP_BY_DEFAULT_ON_FREEFORM_DISPLAYS, Flags.FLAG_EXCLUDE_CAPTION_FROM_APP_BOUNDS, - Flags.FLAG_EXCLUDE_DESK_ROOTS_FROM_DESKTOP_TASKS, - Flags.FLAG_EXCLUDE_NON_MAIN_WINDOW_FROM_SNAPSHOT, + Flags.FLAG_EXCLUDE_DRAWING_APP_THEME_SNAPSHOT_FROM_LOCK, Flags.FLAG_EXCLUDE_TASK_FROM_RECENTS, - Flags.FLAG_EXTENDING_PERSISTENCE_SNAPSHOT_QUEUE_DEPTH, - Flags.FLAG_FALLBACK_TO_FOCUSED_DISPLAY, Flags.FLAG_FIFO_PRIORITY_FOR_MAJOR_UI_PROCESSES, - Flags.FLAG_FIX_FULLSCREEN_IN_MULTI_WINDOW, Flags.FLAG_FIX_HIDE_OVERLAY_API, - Flags.FLAG_FIX_LAYOUT_RESTORED_TASK, - Flags.FLAG_FIX_MOVING_UNFOCUSED_TASK, - Flags.FLAG_FIX_SET_ADJACENT_TASK_FRAGMENTS_WITH_PARAMS, - Flags.FLAG_FIX_SHOW_WHEN_LOCKED_SYNC_TIMEOUT, + Flags.FLAG_FIX_LAYOUT_EXISTING_TASK, + Flags.FLAG_FIX_VIEW_ROOT_CALL_TRACE, Flags.FLAG_FORCE_CLOSE_TOP_TRANSPARENT_FULLSCREEN_TASK, - Flags.FLAG_FORCE_SHOW_SYSTEM_BAR_FOR_BUBBLE, Flags.FLAG_FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH, Flags.FLAG_GET_DIMMER_ON_CLOSING, - Flags.FLAG_GRANT_MANAGE_KEY_GESTURES_TO_RECENTS, Flags.FLAG_IGNORE_ASPECT_RATIO_RESTRICTIONS_FOR_RESIZEABLE_FREEFORM_ACTIVITIES, Flags.FLAG_IGNORE_CORNER_RADIUS_AND_SHADOWS, Flags.FLAG_INCLUDE_TOP_TRANSPARENT_FULLSCREEN_TASK_IN_DESKTOP_HEURISTIC, Flags.FLAG_INHERIT_TASK_BOUNDS_FOR_TRAMPOLINE_TASK_LAUNCHES, Flags.FLAG_INSETS_DECOUPLED_CONFIGURATION, - Flags.FLAG_INTERCEPT_MOTION_FROM_MOVE_TO_CANCEL, Flags.FLAG_JANK_API, + Flags.FLAG_KEEP_APP_WINDOW_HIDE_WHILE_LOCKED, Flags.FLAG_KEYBOARD_SHORTCUTS_TO_SWITCH_DESKS, + Flags.FLAG_KEYGUARD_GOING_AWAY_TIMEOUT, Flags.FLAG_LETTERBOX_BACKGROUND_WALLPAPER, Flags.FLAG_MOVABLE_CUTOUT_CONFIGURATION, Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT, Flags.FLAG_MULTI_CROP, Flags.FLAG_NAV_BAR_TRANSPARENT_BY_DEFAULT, - Flags.FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS_BUGFIX, + Flags.FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS, + Flags.FLAG_NO_CONSECUTIVE_VISIBILITY_EVENTS, + Flags.FLAG_NO_DUPLICATE_SURFACE_DESTROYED_EVENTS, + Flags.FLAG_NO_VISIBILITY_EVENT_ON_DISPLAY_STATE_CHANGE, Flags.FLAG_OFFLOAD_COLOR_EXTRACTION, - Flags.FLAG_PARALLEL_CD_TRANSITIONS_DURING_RECENTS, Flags.FLAG_PORT_WINDOW_SIZE_ANIMATION, Flags.FLAG_PREDICTIVE_BACK_DEFAULT_ENABLE_SDK_36, Flags.FLAG_PREDICTIVE_BACK_PRIORITY_SYSTEM_NAVIGATION_OBSERVER, @@ -2397,33 +2098,28 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_PREDICTIVE_BACK_SYSTEM_OVERRIDE_CALLBACK, Flags.FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV, Flags.FLAG_PREDICTIVE_BACK_TIMESTAMP_API, - Flags.FLAG_PRESERVE_RECENTS_TASK_CONFIGURATION_ON_RELAUNCH, + Flags.FLAG_PROCESS_PRIORITY_POLICY_FOR_MULTI_WINDOW_MODE, Flags.FLAG_REAR_DISPLAY_DISABLE_FORCE_DESKTOP_SYSTEM_DECORATIONS, + Flags.FLAG_RECORD_TASK_SNAPSHOTS_BEFORE_SHUTDOWN, Flags.FLAG_REDUCE_CHANGED_EXCLUSION_RECTS_MSGS, + Flags.FLAG_REDUCE_KEYGUARD_TRANSITIONS, Flags.FLAG_REDUCE_TASK_SNAPSHOT_MEMORY_USAGE, + Flags.FLAG_REDUCE_UNNECESSARY_MEASURE, Flags.FLAG_RELATIVE_INSETS, Flags.FLAG_RELEASE_SNAPSHOT_AGGRESSIVELY, - Flags.FLAG_RELEASE_SURFACE_ON_TRANSITION_FINISH, + Flags.FLAG_RELEASE_USER_ASPECT_RATIO_WM, Flags.FLAG_REMOVE_ACTIVITY_STARTER_DREAM_CALLBACK, + Flags.FLAG_REMOVE_DEFER_HIDING_CLIENT, Flags.FLAG_REMOVE_DEPART_TARGET_FROM_MOTION, - Flags.FLAG_REMOVE_STARTING_IN_TRANSITION, - Flags.FLAG_REPARENT_TO_DEFAULT_WITH_DISPLAY_REMOVAL, Flags.FLAG_REPARENT_WINDOW_TOKEN_API, - Flags.FLAG_RESPECT_FULLSCREEN_ACTIVITY_OPTION_IN_DESKTOP_LAUNCH_PARAMS, - Flags.FLAG_RESPECT_HIERARCHY_SURFACE_VISIBILITY, - Flags.FLAG_RESPECT_LEAF_TASK_BOUNDS, + Flags.FLAG_RESPECT_NON_TOP_VISIBLE_FIXED_ORIENTATION, Flags.FLAG_RESPECT_ORIENTATION_CHANGE_FOR_UNRESIZEABLE, - Flags.FLAG_RESTORE_USER_ASPECT_RATIO_SETTINGS_USING_SERVICE, - Flags.FLAG_RESTRICT_FREEFORM_HIDDEN_SYSTEM_BARS_TO_FILLING_TASKS, - Flags.FLAG_ROOT_TASK_FOR_BUBBLE, Flags.FLAG_SAFE_REGION_LETTERBOXING, Flags.FLAG_SAFE_RELEASE_SNAPSHOT_AGGRESSIVELY, Flags.FLAG_SCHEDULING_FOR_NOTIFICATION_SHADE, Flags.FLAG_SCRAMBLE_SNAPSHOT_FILE_NAME, - Flags.FLAG_SCREEN_BRIGHTNESS_DIM_ON_EMULATOR, Flags.FLAG_SCREEN_RECORDING_CALLBACKS, Flags.FLAG_SCROLLING_FROM_LETTERBOX, - Flags.FLAG_SCVH_SURFACE_CONTROL_LIFETIME_FIX, Flags.FLAG_SDK_DESIRED_PRESENT_TIME, Flags.FLAG_SET_SC_PROPERTIES_IN_CLIENT, Flags.FLAG_SHOW_APP_HANDLE_LARGE_SCREENS, @@ -2431,30 +2127,30 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, Flags.FLAG_SHOW_HOME_BEHIND_DESKTOP, Flags.FLAG_SKIP_COMPAT_UI_EDUCATION_IN_DESKTOP_MODE, - Flags.FLAG_SKIP_DEACTIVATION_OF_DESK_WITH_NOTHING_IN_FRONT, Flags.FLAG_SKIP_DECOR_VIEW_RELAYOUT_WHEN_CLOSING_BUGFIX, - Flags.FLAG_SPLASH_SCREEN_VIEW_SYNC_TRANSACTION, + Flags.FLAG_SUPPORT_WIDGET_INTENTS_ON_CONNECTED_DISPLAY, Flags.FLAG_SUPPORTS_DRAG_ASSISTANT_TO_MULTIWINDOW, Flags.FLAG_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI, Flags.FLAG_SURFACE_CONTROL_INPUT_RECEIVER, Flags.FLAG_SURFACE_TRUSTED_OVERLAY, Flags.FLAG_SYNC_SCREEN_CAPTURE, Flags.FLAG_SYSTEM_UI_POST_ANIMATION_END, + Flags.FLAG_TASK_FRAGMENT_SYSTEM_ORGANIZER_FLAG, Flags.FLAG_TOUCH_PASS_THROUGH_OPT_IN, + Flags.FLAG_TRACK_SYSTEM_UI_CONTEXT_BEFORE_WMS, Flags.FLAG_TRANSIT_READY_TRACKING, Flags.FLAG_TRANSIT_TRACKER_PLUMBING, - Flags.FLAG_TRANSITION_HANDLER_CUJ_TAGS, Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW, Flags.FLAG_UNIFY_BACK_NAVIGATION_TRANSITION, - Flags.FLAG_UNIFY_SHELL_BINDERS, Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT, Flags.FLAG_UNTRUSTED_EMBEDDING_ANY_APP_PERMISSION, Flags.FLAG_UNTRUSTED_EMBEDDING_STATE_SHARING, Flags.FLAG_UPDATE_DIMS_WHEN_WINDOW_SHOWN, - Flags.FLAG_UPDATE_HOST_INPUT_TRANSFER_TOKEN, - Flags.FLAG_UPDATE_TASK_MIN_DIMENSIONS_WITH_ROOT_ACTIVITY, Flags.FLAG_USE_CACHED_INSETS_FOR_DISPLAY_SWITCH, + Flags.FLAG_USE_RT_FRAME_CALLBACK_FOR_SPLASH_SCREEN_TRANSFER, Flags.FLAG_USE_TASKS_DIM_ONLY, + Flags.FLAG_USE_VISIBLE_REQUESTED_FOR_PROCESS_TRACKER, + Flags.FLAG_USE_WINDOW_ORIGINAL_TOUCHABLE_REGION_WHEN_MAGNIFICATION_RECOMPUTE_BOUNDS, Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API, Flags.FLAG_WALLPAPER_OFFSET_ASYNC, Flags.FLAG_WLINFO_ONCREATE @@ -2464,20 +2160,20 @@ public class CustomFeatureFlags implements FeatureFlags { private Set mReadOnlyFlagsSet = new HashSet<>( Arrays.asList( Flags.FLAG_ACTION_MODE_EDGE_TO_EDGE, + Flags.FLAG_ACTIVITY_EMBEDDING_ANIMATION_CUSTOMIZATION_FLAG, Flags.FLAG_ACTIVITY_EMBEDDING_DELAY_TASK_FRAGMENT_FINISH_FOR_ACTIVITY_LAUNCH, Flags.FLAG_ACTIVITY_EMBEDDING_INTERACTIVE_DIVIDER_FLAG, Flags.FLAG_ACTIVITY_EMBEDDING_METRICS, Flags.FLAG_ACTIVITY_EMBEDDING_SUPPORT_FOR_CONNECTED_DISPLAYS, Flags.FLAG_ALLOW_DISABLE_ACTIVITY_RECORD_INPUT_SINK, + Flags.FLAG_ALLOW_HIDE_SCM_BUTTON, Flags.FLAG_ALLOWS_SCREEN_SIZE_DECOUPLED_FROM_STATUS_BAR_AND_CUTOUT, Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER, - Flags.FLAG_ALWAYS_SEQ_ID_LAYOUT, Flags.FLAG_ALWAYS_UPDATE_WALLPAPER_PERMISSION, Flags.FLAG_AOD_TRANSITION, Flags.FLAG_APP_COMPAT_ASYNC_RELAYOUT, Flags.FLAG_APP_COMPAT_PROPERTIES_API, Flags.FLAG_APP_COMPAT_REFACTORING, - Flags.FLAG_APP_COMPAT_REFACTORING_ROUNDED_CORNERS, Flags.FLAG_APP_COMPAT_UI_FRAMEWORK, Flags.FLAG_APP_HANDLE_NO_RELAYOUT_ON_EXCLUSION_CHANGE, Flags.FLAG_APPLY_LIFECYCLE_ON_PIP_CHANGE, @@ -2486,36 +2182,44 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_BAL_ADDITIONAL_LOGGING, Flags.FLAG_BAL_ADDITIONAL_START_MODES, Flags.FLAG_BAL_CLEAR_ALLOWLIST_DURATION, - Flags.FLAG_BAL_COVER_INTENT_SENDER, Flags.FLAG_BAL_DONT_BRING_EXISTING_BACKGROUND_TASK_STACK_TO_FG, + Flags.FLAG_BAL_IMPROVE_REAL_CALLER_VISIBILITY_CHECK, + Flags.FLAG_BAL_IMPROVED_METRICS, Flags.FLAG_BAL_REDUCE_GRACE_PERIOD, + Flags.FLAG_BAL_REQUIRE_OPT_IN_BY_PENDING_INTENT_CREATOR, Flags.FLAG_BAL_RESPECT_APP_SWITCH_STATE_WHEN_CHECK_BOUND_BY_FOREGROUND_UID, Flags.FLAG_BAL_SEND_INTENT_WITH_OPTIONS, Flags.FLAG_BAL_SHOW_TOASTS_BLOCKED, Flags.FLAG_BAL_STRICT_MODE_GRACE_PERIOD, Flags.FLAG_BAL_STRICT_MODE_RO, Flags.FLAG_BETTER_SUPPORT_NON_MATCH_PARENT_ACTIVITY, + Flags.FLAG_CACHE_WINDOW_STYLE, Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM, Flags.FLAG_CAMERA_COMPAT_FULLSCREEN_PICK_SAME_TASK_ACTIVITY, + Flags.FLAG_CHECK_DISABLED_SNAPSHOTS_IN_TASK_PERSISTER, + Flags.FLAG_CLEANUP_DISPATCH_PENDING_TRANSACTIONS_REMOTE_EXCEPTION, + Flags.FLAG_CLEAR_SYSTEM_VIBRATOR, Flags.FLAG_CLOSE_TO_SQUARE_CONFIG_INCLUDES_STATUS_BAR, + Flags.FLAG_CONDENSE_CONFIGURATION_CHANGE_FOR_SIMPLE_MODE, + Flags.FLAG_CONFIGURABLE_FONT_SCALE_DEFAULT, Flags.FLAG_COVER_DISPLAY_OPT_IN, - Flags.FLAG_CURRENT_ANIMATOR_SCALE_USES_SHARED_MEMORY, - Flags.FLAG_DEFAULT_DESK_WITHOUT_WARMUP_MIGRATION, + Flags.FLAG_DELAY_NOTIFICATION_TO_MAGNIFICATION_WHEN_RECENTS_WINDOW_TO_FRONT_TRANSITION, + Flags.FLAG_DELEGATE_BACK_GESTURE_TO_SHELL, Flags.FLAG_DELEGATE_UNHANDLED_DRAGS, + Flags.FLAG_DELETE_CAPTURE_DISPLAY, Flags.FLAG_DENSITY_390_API, Flags.FLAG_DISABLE_DESKTOP_LAUNCH_PARAMS_OUTSIDE_DESKTOP_BUG_FIX, Flags.FLAG_DISABLE_NON_RESIZABLE_APP_SNAP_RESIZING, Flags.FLAG_DISABLE_OPT_OUT_EDGE_TO_EDGE, - Flags.FLAG_DISPATCH_FIRST_KEYGUARD_LOCKED_STATE, + Flags.FLAG_DO_NOT_CHECK_INTERSECTION_WHEN_NON_MAGNIFIABLE_WINDOW_TRANSITIONS, + Flags.FLAG_EARLY_LAUNCH_HINT, + Flags.FLAG_EDGE_TO_EDGE_BY_DEFAULT, Flags.FLAG_ENABLE_ACCESSIBLE_CUSTOM_HEADERS, Flags.FLAG_ENABLE_ACTIVITY_EMBEDDING_SUPPORT_FOR_CONNECTED_DISPLAYS, - Flags.FLAG_ENABLE_APP_HANDLE_POSITION_REPORTING, Flags.FLAG_ENABLE_APP_HEADER_WITH_TASK_DENSITY, - Flags.FLAG_ENABLE_BLOCK_NON_DESKTOP_DISPLAY_WINDOW_DRAG_BUGFIX, Flags.FLAG_ENABLE_BORDER_SETTINGS, - Flags.FLAG_ENABLE_BOX_SHADOW_SETTINGS, + Flags.FLAG_ENABLE_BUFFER_TRANSFORM_HINT_FROM_DISPLAY, Flags.FLAG_ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY, - Flags.FLAG_ENABLE_CAMERA_COMPAT_CHECK_DEVICE_ROTATION_BUGFIX, Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING, Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING_OPT_OUT, Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING_OPT_OUT_API, @@ -2524,36 +2228,27 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION, Flags.FLAG_ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION_ALWAYS, Flags.FLAG_ENABLE_CASCADING_WINDOWS, - Flags.FLAG_ENABLE_CLOSE_LID_INTERACTION, Flags.FLAG_ENABLE_COMPAT_UI_VISIBILITY_STATUS, Flags.FLAG_ENABLE_COMPATUI_SYSUI_LAUNCHER, Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_DND, Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_PIP, Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG, Flags.FLAG_ENABLE_DESKTOP_APP_HANDLE_ANIMATION, - Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS, Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS, Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS, Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_CLOSE_SHORTCUT_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_CLOSE_TASK_ANIMATION_IN_DTC_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_FIRST_BASED_DEFAULT_TO_DESKTOP_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_FIRST_BASED_DRAG_TO_MAXIMIZE, - Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_FIRST_LISTENER, Flags.FLAG_ENABLE_DESKTOP_IME_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_IMMERSIVE_DRAG_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_INDICATOR_IN_SEPARATE_THREAD_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_DESKTOP_OPENING_DEEPLINK_MINIMIZE_ANIMATION_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_RECENTS_TRANSITIONS_CORNERS_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_SPLITSCREEN_TRANSITION_BUGFIX, + Flags.FLAG_ENABLE_DESKTOP_SWIPE_BACK_MINIMIZE_ANIMATION_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_SYSTEM_DIALOGS_TRANSITIONS, - Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_LAUNCH_ANIMATION, Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_MINIMIZE_ANIMATION_BUGFIX, - Flags.FLAG_ENABLE_DESKTOP_TASK_LIMIT_SEPARATE_TRANSITION, Flags.FLAG_ENABLE_DESKTOP_TASKBAR_ON_FREEFORM_DISPLAYS, Flags.FLAG_ENABLE_DESKTOP_TRAMPOLINE_CLOSE_ANIMATION_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_WALLPAPER_ACTIVITY_FOR_SYSTEM_USER, @@ -2574,7 +2269,6 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PIP, - Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PIP_IN_OVERVIEW_BUGFIX, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_QUICK_SWITCH, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_SCVH_CACHE_BUG_FIX, Flags.FLAG_ENABLE_DESKTOP_WINDOWING_SIZE_CONSTRAINTS, @@ -2584,7 +2278,6 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY, Flags.FLAG_ENABLE_DEVICE_STATE_AUTO_ROTATE_SETTING_LOGGING, Flags.FLAG_ENABLE_DEVICE_STATE_AUTO_ROTATE_SETTING_REFACTOR, - Flags.FLAG_ENABLE_DISPLAY_COMPAT_MODE, Flags.FLAG_ENABLE_DISPLAY_DISCONNECT_INTERACTION, Flags.FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS, Flags.FLAG_ENABLE_DISPLAY_RECONNECT_INTERACTION, @@ -2592,112 +2285,82 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_DRAG_RESIZE_SET_UP_IN_BG_THREAD, Flags.FLAG_ENABLE_DRAG_TO_DESKTOP_INCOMING_TRANSITIONS_BUGFIX, Flags.FLAG_ENABLE_DRAG_TO_MAXIMIZE, - Flags.FLAG_ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS, Flags.FLAG_ENABLE_DYNAMIC_RADIUS_COMPUTATION_BUGFIX, - Flags.FLAG_ENABLE_EMPTY_DESK_ON_MINIMIZE, - Flags.FLAG_ENABLE_EXPERIMENTAL_BUBBLES_CONTROLLER, - Flags.FLAG_ENABLE_FREEFORM_BOX_SHADOWS, - Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_FULL_SCREEN_WINDOW_ON_REMOVING_SPLIT_SCREEN_STAGE_BUGFIX, - Flags.FLAG_ENABLE_FULLSCREEN_WINDOW_CONTROLS, Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP, Flags.FLAG_ENABLE_HANDLE_INPUT_FIX, - Flags.FLAG_ENABLE_HANDLERS_DEBUGGING_MODE, Flags.FLAG_ENABLE_HOLD_TO_DRAG_APP_HANDLE, - Flags.FLAG_ENABLE_INDEPENDENT_BACK_IN_PROJECTED, - Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP, Flags.FLAG_ENABLE_INPUT_LAYER_TRANSITION_FIX, - Flags.FLAG_ENABLE_KEY_GESTURE_HANDLER_FOR_SYSUI, Flags.FLAG_ENABLE_MINIMIZE_BUTTON, Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION, - Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE, Flags.FLAG_ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT, Flags.FLAG_ENABLE_MULTI_DISPLAY_SPLIT, Flags.FLAG_ENABLE_MULTIDISPLAY_TRACKPAD_BACK_GESTURE, Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND, - Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_DEFAULT_ACTIVATION_IN_DESKTOP_FIRST_DISPLAYS, Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_FRONTEND, - Flags.FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS, Flags.FLAG_ENABLE_NON_DEFAULT_DISPLAY_SPLIT, - Flags.FLAG_ENABLE_OMIT_ACCELEROMETER_ROTATION_RESTORE, Flags.FLAG_ENABLE_OPAQUE_BACKGROUND_FOR_TRANSPARENT_WINDOWS, - Flags.FLAG_ENABLE_OVERFLOW_BUTTON_FOR_TASKBAR_PINNED_ITEMS, Flags.FLAG_ENABLE_PER_DISPLAY_DESKTOP_WALLPAPER_ACTIVITY, Flags.FLAG_ENABLE_PER_DISPLAY_PACKAGE_CONTEXT_CACHE_IN_STATUSBAR_NOTIF, Flags.FLAG_ENABLE_PERSISTING_DISPLAY_SIZE_FOR_CONNECTED_DISPLAYS, - Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU, Flags.FLAG_ENABLE_PRESENTATION_FOR_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE, Flags.FLAG_ENABLE_QUICKSWITCH_DESKTOP_SPLIT_BUGFIX, - Flags.FLAG_ENABLE_REJECT_HOME_TRANSITION, Flags.FLAG_ENABLE_REQUEST_FULLSCREEN_BUGFIX, - Flags.FLAG_ENABLE_REQUEST_FULLSCREEN_REFACTOR, Flags.FLAG_ENABLE_RESIZING_METRICS, Flags.FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_RESTORE_TO_PREVIOUS_SIZE_FROM_DESKTOP_IMMERSIVE, - Flags.FLAG_ENABLE_SEE_THROUGH_TASK_FRAGMENTS, Flags.FLAG_ENABLE_SHELL_INITIAL_BOUNDS_REGRESSION_BUG_FIX, Flags.FLAG_ENABLE_SIZE_COMPAT_MODE_IMPROVEMENTS_FOR_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_START_LAUNCH_TRANSITION_FROM_TASKBAR_BUGFIX, - Flags.FLAG_ENABLE_SYS_DECORS_CALLBACKS_VIA_WM, - Flags.FLAG_ENABLE_TALL_APP_HEADERS, Flags.FLAG_ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS, Flags.FLAG_ENABLE_TASK_STACK_OBSERVER_IN_SHELL, Flags.FLAG_ENABLE_TASKBAR_CONNECTED_DISPLAYS, Flags.FLAG_ENABLE_TASKBAR_OVERFLOW, - Flags.FLAG_ENABLE_TASKBAR_RECENT_TASKS_THROTTLE_BUGFIX, Flags.FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION, Flags.FLAG_ENABLE_THEMED_APP_HEADERS, Flags.FLAG_ENABLE_TILE_RESIZING, Flags.FLAG_ENABLE_TOP_VISIBLE_ROOT_TASK_PER_USER_TRACKING, - Flags.FLAG_ENABLE_TRANSITION_ON_ACTIVITY_SET_REQUESTED_ORIENTATION, Flags.FLAG_ENABLE_VISUAL_INDICATOR_IN_TRANSITION_BUGFIX, - Flags.FLAG_ENABLE_WINDOW_CONTEXT_OVERRIDE_TYPE, Flags.FLAG_ENABLE_WINDOW_CONTEXT_RESOURCES_UPDATE_ON_CONFIG_CHANGE, - Flags.FLAG_ENABLE_WINDOW_DECORATION_REFACTOR, - Flags.FLAG_ENABLE_WINDOW_REPOSITIONING_API, Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS, Flags.FLAG_ENABLE_WINDOWING_EDGE_DRAG_RESIZE, Flags.FLAG_ENABLE_WINDOWING_SCALED_RESIZING, - Flags.FLAG_ENABLE_WINDOWING_TASK_STACK_ORDER_BUGFIX, Flags.FLAG_ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS, Flags.FLAG_ENFORCE_EDGE_TO_EDGE, Flags.FLAG_ENSURE_KEYGUARD_DOES_TRANSITION_STARTING, + Flags.FLAG_ENSURE_WALLPAPER_IN_TRANSITIONS, + Flags.FLAG_ENSURE_WALLPAPER_IN_WEAR_TRANSITIONS, Flags.FLAG_ENTER_DESKTOP_BY_DEFAULT_ON_FREEFORM_DISPLAYS, Flags.FLAG_EXCLUDE_CAPTION_FROM_APP_BOUNDS, - Flags.FLAG_EXCLUDE_DESK_ROOTS_FROM_DESKTOP_TASKS, - Flags.FLAG_EXCLUDE_NON_MAIN_WINDOW_FROM_SNAPSHOT, + Flags.FLAG_EXCLUDE_DRAWING_APP_THEME_SNAPSHOT_FROM_LOCK, Flags.FLAG_EXCLUDE_TASK_FROM_RECENTS, - Flags.FLAG_EXTENDING_PERSISTENCE_SNAPSHOT_QUEUE_DEPTH, - Flags.FLAG_FALLBACK_TO_FOCUSED_DISPLAY, Flags.FLAG_FIFO_PRIORITY_FOR_MAJOR_UI_PROCESSES, - Flags.FLAG_FIX_FULLSCREEN_IN_MULTI_WINDOW, Flags.FLAG_FIX_HIDE_OVERLAY_API, - Flags.FLAG_FIX_LAYOUT_RESTORED_TASK, - Flags.FLAG_FIX_MOVING_UNFOCUSED_TASK, - Flags.FLAG_FIX_SET_ADJACENT_TASK_FRAGMENTS_WITH_PARAMS, - Flags.FLAG_FIX_SHOW_WHEN_LOCKED_SYNC_TIMEOUT, + Flags.FLAG_FIX_LAYOUT_EXISTING_TASK, + Flags.FLAG_FIX_VIEW_ROOT_CALL_TRACE, Flags.FLAG_FORCE_CLOSE_TOP_TRANSPARENT_FULLSCREEN_TASK, - Flags.FLAG_FORCE_SHOW_SYSTEM_BAR_FOR_BUBBLE, Flags.FLAG_FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH, Flags.FLAG_GET_DIMMER_ON_CLOSING, - Flags.FLAG_GRANT_MANAGE_KEY_GESTURES_TO_RECENTS, Flags.FLAG_IGNORE_ASPECT_RATIO_RESTRICTIONS_FOR_RESIZEABLE_FREEFORM_ACTIVITIES, Flags.FLAG_IGNORE_CORNER_RADIUS_AND_SHADOWS, Flags.FLAG_INCLUDE_TOP_TRANSPARENT_FULLSCREEN_TASK_IN_DESKTOP_HEURISTIC, Flags.FLAG_INHERIT_TASK_BOUNDS_FOR_TRAMPOLINE_TASK_LAUNCHES, Flags.FLAG_INSETS_DECOUPLED_CONFIGURATION, - Flags.FLAG_INTERCEPT_MOTION_FROM_MOVE_TO_CANCEL, Flags.FLAG_JANK_API, + Flags.FLAG_KEEP_APP_WINDOW_HIDE_WHILE_LOCKED, Flags.FLAG_KEYBOARD_SHORTCUTS_TO_SWITCH_DESKS, + Flags.FLAG_KEYGUARD_GOING_AWAY_TIMEOUT, Flags.FLAG_LETTERBOX_BACKGROUND_WALLPAPER, Flags.FLAG_MOVABLE_CUTOUT_CONFIGURATION, Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT, Flags.FLAG_MULTI_CROP, Flags.FLAG_NAV_BAR_TRANSPARENT_BY_DEFAULT, - Flags.FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS_BUGFIX, + Flags.FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS, + Flags.FLAG_NO_CONSECUTIVE_VISIBILITY_EVENTS, + Flags.FLAG_NO_DUPLICATE_SURFACE_DESTROYED_EVENTS, + Flags.FLAG_NO_VISIBILITY_EVENT_ON_DISPLAY_STATE_CHANGE, Flags.FLAG_OFFLOAD_COLOR_EXTRACTION, - Flags.FLAG_PARALLEL_CD_TRANSITIONS_DURING_RECENTS, Flags.FLAG_PORT_WINDOW_SIZE_ANIMATION, Flags.FLAG_PREDICTIVE_BACK_DEFAULT_ENABLE_SDK_36, Flags.FLAG_PREDICTIVE_BACK_PRIORITY_SYSTEM_NAVIGATION_OBSERVER, @@ -2705,33 +2368,28 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_PREDICTIVE_BACK_SYSTEM_OVERRIDE_CALLBACK, Flags.FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV, Flags.FLAG_PREDICTIVE_BACK_TIMESTAMP_API, - Flags.FLAG_PRESERVE_RECENTS_TASK_CONFIGURATION_ON_RELAUNCH, + Flags.FLAG_PROCESS_PRIORITY_POLICY_FOR_MULTI_WINDOW_MODE, Flags.FLAG_REAR_DISPLAY_DISABLE_FORCE_DESKTOP_SYSTEM_DECORATIONS, + Flags.FLAG_RECORD_TASK_SNAPSHOTS_BEFORE_SHUTDOWN, Flags.FLAG_REDUCE_CHANGED_EXCLUSION_RECTS_MSGS, + Flags.FLAG_REDUCE_KEYGUARD_TRANSITIONS, Flags.FLAG_REDUCE_TASK_SNAPSHOT_MEMORY_USAGE, + Flags.FLAG_REDUCE_UNNECESSARY_MEASURE, Flags.FLAG_RELATIVE_INSETS, Flags.FLAG_RELEASE_SNAPSHOT_AGGRESSIVELY, - Flags.FLAG_RELEASE_SURFACE_ON_TRANSITION_FINISH, + Flags.FLAG_RELEASE_USER_ASPECT_RATIO_WM, Flags.FLAG_REMOVE_ACTIVITY_STARTER_DREAM_CALLBACK, + Flags.FLAG_REMOVE_DEFER_HIDING_CLIENT, Flags.FLAG_REMOVE_DEPART_TARGET_FROM_MOTION, - Flags.FLAG_REMOVE_STARTING_IN_TRANSITION, - Flags.FLAG_REPARENT_TO_DEFAULT_WITH_DISPLAY_REMOVAL, Flags.FLAG_REPARENT_WINDOW_TOKEN_API, - Flags.FLAG_RESPECT_FULLSCREEN_ACTIVITY_OPTION_IN_DESKTOP_LAUNCH_PARAMS, - Flags.FLAG_RESPECT_HIERARCHY_SURFACE_VISIBILITY, - Flags.FLAG_RESPECT_LEAF_TASK_BOUNDS, + Flags.FLAG_RESPECT_NON_TOP_VISIBLE_FIXED_ORIENTATION, Flags.FLAG_RESPECT_ORIENTATION_CHANGE_FOR_UNRESIZEABLE, - Flags.FLAG_RESTORE_USER_ASPECT_RATIO_SETTINGS_USING_SERVICE, - Flags.FLAG_RESTRICT_FREEFORM_HIDDEN_SYSTEM_BARS_TO_FILLING_TASKS, - Flags.FLAG_ROOT_TASK_FOR_BUBBLE, Flags.FLAG_SAFE_REGION_LETTERBOXING, Flags.FLAG_SAFE_RELEASE_SNAPSHOT_AGGRESSIVELY, Flags.FLAG_SCHEDULING_FOR_NOTIFICATION_SHADE, Flags.FLAG_SCRAMBLE_SNAPSHOT_FILE_NAME, - Flags.FLAG_SCREEN_BRIGHTNESS_DIM_ON_EMULATOR, Flags.FLAG_SCREEN_RECORDING_CALLBACKS, Flags.FLAG_SCROLLING_FROM_LETTERBOX, - Flags.FLAG_SCVH_SURFACE_CONTROL_LIFETIME_FIX, Flags.FLAG_SDK_DESIRED_PRESENT_TIME, Flags.FLAG_SET_SC_PROPERTIES_IN_CLIENT, Flags.FLAG_SHOW_APP_HANDLE_LARGE_SCREENS, @@ -2739,30 +2397,30 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, Flags.FLAG_SHOW_HOME_BEHIND_DESKTOP, Flags.FLAG_SKIP_COMPAT_UI_EDUCATION_IN_DESKTOP_MODE, - Flags.FLAG_SKIP_DEACTIVATION_OF_DESK_WITH_NOTHING_IN_FRONT, Flags.FLAG_SKIP_DECOR_VIEW_RELAYOUT_WHEN_CLOSING_BUGFIX, - Flags.FLAG_SPLASH_SCREEN_VIEW_SYNC_TRANSACTION, + Flags.FLAG_SUPPORT_WIDGET_INTENTS_ON_CONNECTED_DISPLAY, Flags.FLAG_SUPPORTS_DRAG_ASSISTANT_TO_MULTIWINDOW, Flags.FLAG_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI, Flags.FLAG_SURFACE_CONTROL_INPUT_RECEIVER, Flags.FLAG_SURFACE_TRUSTED_OVERLAY, Flags.FLAG_SYNC_SCREEN_CAPTURE, Flags.FLAG_SYSTEM_UI_POST_ANIMATION_END, + Flags.FLAG_TASK_FRAGMENT_SYSTEM_ORGANIZER_FLAG, Flags.FLAG_TOUCH_PASS_THROUGH_OPT_IN, + Flags.FLAG_TRACK_SYSTEM_UI_CONTEXT_BEFORE_WMS, Flags.FLAG_TRANSIT_READY_TRACKING, Flags.FLAG_TRANSIT_TRACKER_PLUMBING, - Flags.FLAG_TRANSITION_HANDLER_CUJ_TAGS, Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW, Flags.FLAG_UNIFY_BACK_NAVIGATION_TRANSITION, - Flags.FLAG_UNIFY_SHELL_BINDERS, Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT, Flags.FLAG_UNTRUSTED_EMBEDDING_ANY_APP_PERMISSION, Flags.FLAG_UNTRUSTED_EMBEDDING_STATE_SHARING, Flags.FLAG_UPDATE_DIMS_WHEN_WINDOW_SHOWN, - Flags.FLAG_UPDATE_HOST_INPUT_TRANSFER_TOKEN, - Flags.FLAG_UPDATE_TASK_MIN_DIMENSIONS_WITH_ROOT_ACTIVITY, Flags.FLAG_USE_CACHED_INSETS_FOR_DISPLAY_SWITCH, + Flags.FLAG_USE_RT_FRAME_CALLBACK_FOR_SPLASH_SCREEN_TRANSFER, Flags.FLAG_USE_TASKS_DIM_ONLY, + Flags.FLAG_USE_VISIBLE_REQUESTED_FOR_PROCESS_TRACKER, + Flags.FLAG_USE_WINDOW_ORIGINAL_TOUCHABLE_REGION_WHEN_MAGNIFICATION_RECOMPUTE_BOUNDS, Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API, Flags.FLAG_WALLPAPER_OFFSET_ASYNC, Flags.FLAG_WLINFO_ONCREATE, diff --git a/flags/src/com/android/window/flags2/FeatureFlags.java b/flags/src/com/android/window/flags2/FeatureFlags.java index fb17f04704..d8c9510e77 100644 --- a/flags/src/com/android/window/flags2/FeatureFlags.java +++ b/flags/src/com/android/window/flags2/FeatureFlags.java @@ -1,5 +1,5 @@ package com.android.window.flags2; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public interface FeatureFlags { @@ -9,6 +9,11 @@ public interface FeatureFlags { boolean actionModeEdgeToEdge(); + + boolean activityEmbeddingAnimationCustomizationFlag(); + + + boolean activityEmbeddingDelayTaskFragmentFinishForActivityLaunch(); @@ -16,9 +21,11 @@ public interface FeatureFlags { boolean activityEmbeddingInteractiveDividerFlag(); + boolean activityEmbeddingMetrics(); + boolean activityEmbeddingSupportForConnectedDisplays(); @@ -27,6 +34,10 @@ public interface FeatureFlags { + boolean allowHideScmButton(); + + + boolean allowsScreenSizeDecoupledFromStatusBarAndCutout(); @@ -34,16 +45,15 @@ public interface FeatureFlags { boolean alwaysDrawMagnificationFullscreenBorder(); - boolean alwaysSeqIdLayout(); - - boolean alwaysUpdateWallpaperPermission(); + boolean aodTransition(); + boolean appCompatAsyncRelayout(); @@ -51,18 +61,19 @@ public interface FeatureFlags { boolean appCompatPropertiesApi(); + boolean appCompatRefactoring(); - boolean appCompatRefactoringRoundedCorners(); - boolean appCompatUiFramework(); + boolean appHandleNoRelayoutOnExclusionChange(); + boolean applyLifecycleOnPipChange(); @@ -74,6 +85,7 @@ public interface FeatureFlags { boolean backupAndRestoreForUserAspectRatioSettings(); + boolean balAdditionalLogging(); @@ -81,20 +93,31 @@ public interface FeatureFlags { boolean balAdditionalStartModes(); + boolean balClearAllowlistDuration(); - boolean balCoverIntentSender(); - - boolean balDontBringExistingBackgroundTaskStackToFg(); + + boolean balImproveRealCallerVisibilityCheck(); + + + + boolean balImprovedMetrics(); + + + boolean balReduceGracePeriod(); + boolean balRequireOptInByPendingIntentCreator(); + + + boolean balRespectAppSwitchStateWhenCheckBoundByForegroundUid(); @@ -102,6 +125,7 @@ public interface FeatureFlags { boolean balSendIntentWithOptions(); + boolean balShowToastsBlocked(); @@ -117,23 +141,52 @@ public interface FeatureFlags { boolean betterSupportNonMatchParentActivity(); + + boolean cacheWindowStyle(); + + + boolean cameraCompatForFreeform(); + boolean cameraCompatFullscreenPickSameTaskActivity(); + + boolean checkDisabledSnapshotsInTaskPersister(); + + + + boolean cleanupDispatchPendingTransactionsRemoteException(); + + + + boolean clearSystemVibrator(); + + + boolean closeToSquareConfigIncludesStatusBar(); + boolean condenseConfigurationChangeForSimpleMode(); + + + + boolean configurableFontScaleDefault(); + + + boolean coverDisplayOptIn(); - boolean currentAnimatorScaleUsesSharedMemory(); + + boolean delayNotificationToMagnificationWhenRecentsWindowToFrontTransition(); - boolean defaultDeskWithoutWarmupMigration(); + + boolean delegateBackGestureToShell(); @@ -141,6 +194,10 @@ public interface FeatureFlags { + boolean deleteCaptureDisplay(); + + + boolean density390Api(); @@ -157,38 +214,41 @@ public interface FeatureFlags { - boolean dispatchFirstKeyguardLockedState(); + boolean doNotCheckIntersectionWhenNonMagnifiableWindowTransitions(); + + + + boolean earlyLaunchHint(); + + + + boolean edgeToEdgeByDefault(); boolean enableAccessibleCustomHeaders(); + boolean enableActivityEmbeddingSupportForConnectedDisplays(); - boolean enableAppHandlePositionReporting(); - - boolean enableAppHeaderWithTaskDensity(); - boolean enableBlockNonDesktopDisplayWindowDragBugfix(); - boolean enableBorderSettings(); - boolean enableBoxShadowSettings(); + + boolean enableBufferTransformHintFromDisplay(); + boolean enableBugFixesForSecondaryDisplay(); - boolean enableCameraCompatCheckDeviceRotationBugfix(); - - boolean enableCameraCompatForDesktopWindowing(); @@ -197,12 +257,15 @@ public interface FeatureFlags { boolean enableCameraCompatForDesktopWindowingOptOut(); + boolean enableCameraCompatForDesktopWindowingOptOutApi(); + boolean enableCameraCompatTrackTaskAndAppBugfix(); + boolean enableCaptionCompatInsetConversion(); @@ -218,22 +281,23 @@ public interface FeatureFlags { boolean enableCascadingWindows(); - boolean enableCloseLidInteraction(); - - boolean enableCompatUiVisibilityStatus(); + boolean enableCompatuiSysuiLauncher(); + boolean enableConnectedDisplaysDnd(); + boolean enableConnectedDisplaysPip(); + boolean enableConnectedDisplaysWindowDrag(); @@ -241,8 +305,6 @@ public interface FeatureFlags { boolean enableDesktopAppHandleAnimation(); - boolean enableDesktopAppHeaderStateChangeAnnouncements(); - boolean enableDesktopAppLaunchAlttabTransitions(); @@ -251,8 +313,6 @@ public interface FeatureFlags { boolean enableDesktopAppLaunchAlttabTransitionsBugfix(); - boolean enableDesktopAppLaunchBugfix(); - boolean enableDesktopAppLaunchTransitions(); @@ -261,23 +321,14 @@ public interface FeatureFlags { boolean enableDesktopAppLaunchTransitionsBugfix(); + boolean enableDesktopCloseShortcutBugfix(); + boolean enableDesktopCloseTaskAnimationInDtcBugfix(); - boolean enableDesktopFirstBasedDefaultToDesktopBugfix(); - - - boolean enableDesktopFirstBasedDragToMaximize(); - - - boolean enableDesktopFirstFullscreenRefocusBugfix(); - - - boolean enableDesktopFirstListener(); - boolean enableDesktopImeBugfix(); @@ -290,6 +341,7 @@ public interface FeatureFlags { boolean enableDesktopIndicatorInSeparateThreadBugfix(); + boolean enableDesktopModeThroughDevOption(); @@ -301,22 +353,18 @@ public interface FeatureFlags { boolean enableDesktopRecentsTransitionsCornersBugfix(); - boolean enableDesktopSplitscreenTransitionBugfix(); + + boolean enableDesktopSwipeBackMinimizeAnimationBugfix(); boolean enableDesktopSystemDialogsTransitions(); - boolean enableDesktopTabTearingLaunchAnimation(); - - boolean enableDesktopTabTearingMinimizeAnimationBugfix(); - boolean enableDesktopTaskLimitSeparateTransition(); - boolean enableDesktopTaskbarOnFreeformDisplays(); @@ -329,6 +377,7 @@ public interface FeatureFlags { boolean enableDesktopWallpaperActivityForSystemUser(); + boolean enableDesktopWindowingAppHandleEducation(); @@ -340,6 +389,7 @@ public interface FeatureFlags { boolean enableDesktopWindowingAppToWebEducation(); + boolean enableDesktopWindowingAppToWebEducationIntegration(); @@ -351,6 +401,7 @@ public interface FeatureFlags { boolean enableDesktopWindowingEnterTransitionBugfix(); + boolean enableDesktopWindowingEnterTransitions(); @@ -358,6 +409,7 @@ public interface FeatureFlags { boolean enableDesktopWindowingExitByMinimizeTransitionBugfix(); + boolean enableDesktopWindowingExitTransitions(); @@ -389,12 +441,10 @@ public interface FeatureFlags { boolean enableDesktopWindowingPersistence(); + boolean enableDesktopWindowingPip(); - boolean enableDesktopWindowingPipInOverviewBugfix(); - - boolean enableDesktopWindowingQuickSwitch(); @@ -415,6 +465,7 @@ public interface FeatureFlags { boolean enableDesktopWindowingTaskbarRunningApps(); + boolean enableDesktopWindowingTransitions(); @@ -422,6 +473,7 @@ public interface FeatureFlags { boolean enableDesktopWindowingWallpaperActivity(); + boolean enableDeviceStateAutoRotateSettingLogging(); @@ -429,18 +481,19 @@ public interface FeatureFlags { boolean enableDeviceStateAutoRotateSettingRefactor(); - boolean enableDisplayCompatMode(); - boolean enableDisplayDisconnectInteraction(); + boolean enableDisplayFocusInShellTransitions(); + boolean enableDisplayReconnectInteraction(); + boolean enableDisplayWindowingModeSwitching(); @@ -452,34 +505,18 @@ public interface FeatureFlags { boolean enableDragToDesktopIncomingTransitionsBugfix(); + boolean enableDragToMaximize(); - boolean enableDraggingPipAcrossDisplays(); - boolean enableDynamicRadiusComputationBugfix(); - boolean enableEmptyDeskOnMinimize(); - - - boolean enableExperimentalBubblesController(); - - - boolean enableFreeformBoxShadows(); - - - boolean enableFreeformDisplayLaunchParams(); - - boolean enableFullScreenWindowOnRemovingSplitScreenStageBugfix(); - boolean enableFullscreenWindowControls(); - - boolean enableFullyImmersiveInDesktop(); @@ -488,26 +525,14 @@ public interface FeatureFlags { boolean enableHandleInputFix(); - boolean enableHandlersDebuggingMode(); - - boolean enableHoldToDragAppHandle(); - boolean enableIndependentBackInProjected(); - - - boolean enableInorderTransitionCallbacksForDesktop(); - - boolean enableInputLayerTransitionFix(); - boolean enableKeyGestureHandlerForSysui(); - - boolean enableMinimizeButton(); @@ -517,44 +542,33 @@ public interface FeatureFlags { - boolean enableModalsFullscreenWithPlatformSignature(); - - boolean enableMoveToNextDisplayShortcut(); + boolean enableMultiDisplaySplit(); + boolean enableMultidisplayTrackpadBackGesture(); + boolean enableMultipleDesktopsBackend(); - boolean enableMultipleDesktopsDefaultActivationInDesktopFirstDisplays(); - boolean enableMultipleDesktopsFrontend(); - boolean enableNoWindowDecorationForDesks(); - - boolean enableNonDefaultDisplaySplit(); - boolean enableOmitAccelerometerRotationRestore(); - - - boolean enableOpaqueBackgroundForTransparentWindows(); - boolean enableOverflowButtonForTaskbarPinnedItems(); - boolean enablePerDisplayDesktopWallpaperActivity(); @@ -563,15 +577,15 @@ public interface FeatureFlags { boolean enablePerDisplayPackageContextCacheInStatusbarNotif(); + boolean enablePersistingDisplaySizeForConnectedDisplays(); - boolean enablePinningAppWithContextMenu(); - boolean enablePresentationForConnectedDisplays(); + boolean enableProjectedDisplayDesktopMode(); @@ -579,20 +593,15 @@ public interface FeatureFlags { boolean enableQuickswitchDesktopSplitBugfix(); - boolean enableRejectHomeTransition(); - - boolean enableRequestFullscreenBugfix(); - boolean enableRequestFullscreenRefactor(); - - boolean enableResizingMetrics(); + boolean enableRestartMenuForConnectedDisplays(); @@ -600,13 +609,11 @@ public interface FeatureFlags { boolean enableRestoreToPreviousSizeFromDesktopImmersive(); - boolean enableSeeThroughTaskFragments(); - - boolean enableShellInitialBoundsRegressionBugFix(); + boolean enableSizeCompatModeImprovementsForConnectedDisplays(); @@ -614,12 +621,6 @@ public interface FeatureFlags { boolean enableStartLaunchTransitionFromTaskbarBugfix(); - boolean enableSysDecorsCallbacksViaWm(); - - - boolean enableTallAppHeaders(); - - boolean enableTaskResizingKeyboardShortcuts(); @@ -628,6 +629,7 @@ public interface FeatureFlags { boolean enableTaskStackObserverInShell(); + boolean enableTaskbarConnectedDisplays(); @@ -635,9 +637,6 @@ public interface FeatureFlags { boolean enableTaskbarOverflow(); - boolean enableTaskbarRecentTasksThrottleBugfix(); - - boolean enableTaskbarRecentsLayoutTransition(); @@ -646,6 +645,7 @@ public interface FeatureFlags { boolean enableThemedAppHeaders(); + boolean enableTileResizing(); @@ -653,27 +653,14 @@ public interface FeatureFlags { boolean enableTopVisibleRootTaskPerUserTracking(); - boolean enableTransitionOnActivitySetRequestedOrientation(); - - boolean enableVisualIndicatorInTransitionBugfix(); - boolean enableWindowContextOverrideType(); - - - boolean enableWindowContextResourcesUpdateOnConfigChange(); - boolean enableWindowDecorationRefactor(); - - - boolean enableWindowRepositioningApi(); - - boolean enableWindowingDynamicInitialBounds(); @@ -686,8 +673,6 @@ public interface FeatureFlags { boolean enableWindowingScaledResizing(); - boolean enableWindowingTaskStackOrderBugfix(); - boolean enableWindowingTransitionHandlersObservers(); @@ -696,9 +681,19 @@ public interface FeatureFlags { boolean enforceEdgeToEdge(); + boolean ensureKeyguardDoesTransitionStarting(); + + boolean ensureWallpaperInTransitions(); + + + + boolean ensureWallpaperInWearTransitions(); + + + boolean enterDesktopByDefaultOnFreeformDisplays(); @@ -706,51 +701,35 @@ public interface FeatureFlags { boolean excludeCaptionFromAppBounds(); - boolean excludeDeskRootsFromDesktopTasks(); - - boolean excludeNonMainWindowFromSnapshot(); + boolean excludeDrawingAppThemeSnapshotFromLock(); boolean excludeTaskFromRecents(); - boolean extendingPersistenceSnapshotQueueDepth(); - - - boolean fallbackToFocusedDisplay(); - boolean fifoPriorityForMajorUiProcesses(); - boolean fixFullscreenInMultiWindow(); - - boolean fixHideOverlayApi(); - boolean fixLayoutRestoredTask(); + + boolean fixLayoutExistingTask(); - boolean fixMovingUnfocusedTask(); + boolean fixViewRootCallTrace(); - boolean fixSetAdjacentTaskFragmentsWithParams(); - - - boolean fixShowWhenLockedSyncTimeout(); boolean forceCloseTopTransparentFullscreenTask(); - boolean forceShowSystemBarForBubble(); - - boolean formFactorBasedDesktopFirstSwitch(); @@ -758,13 +737,11 @@ public interface FeatureFlags { boolean getDimmerOnClosing(); - boolean grantManageKeyGesturesToRecents(); - - boolean ignoreAspectRatioRestrictionsForResizeableFreeformActivities(); + boolean ignoreCornerRadiusAndShadows(); @@ -781,16 +758,22 @@ public interface FeatureFlags { - boolean interceptMotionFromMoveToCancel(); - - - boolean jankApi(); + + boolean keepAppWindowHideWhileLocked(); + + + boolean keyboardShortcutsToSwitchDesks(); + + boolean keyguardGoingAwayTimeout(); + + + boolean letterboxBackgroundWallpaper(); @@ -798,6 +781,7 @@ public interface FeatureFlags { boolean movableCutoutConfiguration(); + boolean moveToExternalDisplayShortcut(); @@ -805,19 +789,30 @@ public interface FeatureFlags { boolean multiCrop(); + boolean navBarTransparentByDefault(); - boolean nestedTasksWithIndependentBoundsBugfix(); + boolean nestedTasksWithIndependentBounds(); + + + + boolean noConsecutiveVisibilityEvents(); + + + + boolean noDuplicateSurfaceDestroyedEvents(); + + + + boolean noVisibilityEventOnDisplayStateChange(); boolean offloadColorExtraction(); - boolean parallelCdTransitionsDuringRecents(); - boolean portWindowSizeAnimation(); @@ -846,19 +841,35 @@ public interface FeatureFlags { boolean predictiveBackTimestampApi(); - boolean preserveRecentsTaskConfigurationOnRelaunch(); + + boolean processPriorityPolicyForMultiWindowMode(); boolean rearDisplayDisableForceDesktopSystemDecorations(); + + boolean recordTaskSnapshotsBeforeShutdown(); + + + boolean reduceChangedExclusionRectsMsgs(); + + boolean reduceKeyguardTransitions(); + + + boolean reduceTaskSnapshotMemoryUsage(); + + boolean reduceUnnecessaryMeasure(); + + + boolean relativeInsets(); @@ -867,36 +878,27 @@ public interface FeatureFlags { - boolean releaseSurfaceOnTransitionFinish(); + boolean releaseUserAspectRatioWm(); + boolean removeActivityStarterDreamCallback(); + boolean removeDeferHidingClient(); + + + boolean removeDepartTargetFromMotion(); - boolean removeStartingInTransition(); - - - - boolean reparentToDefaultWithDisplayRemoval(); - - - boolean reparentWindowTokenApi(); - boolean respectFullscreenActivityOptionInDesktopLaunchParams(); - - - boolean respectHierarchySurfaceVisibility(); - - - boolean respectLeafTaskBounds(); + boolean respectNonTopVisibleFixedOrientation(); @@ -904,15 +906,6 @@ public interface FeatureFlags { - boolean restoreUserAspectRatioSettingsUsingService(); - - - boolean restrictFreeformHiddenSystemBarsToFillingTasks(); - - - boolean rootTaskForBubble(); - - boolean safeRegionLetterboxing(); @@ -924,29 +917,27 @@ public interface FeatureFlags { boolean schedulingForNotificationShade(); + boolean scrambleSnapshotFileName(); - boolean screenBrightnessDimOnEmulator(); - - boolean screenRecordingCallbacks(); + boolean scrollingFromLetterbox(); - boolean scvhSurfaceControlLifetimeFix(); - - boolean sdkDesiredPresentTime(); + boolean setScPropertiesInClient(); + boolean showAppHandleLargeScreens(); @@ -958,6 +949,7 @@ public interface FeatureFlags { boolean showDesktopWindowingDevOption(); + boolean showHomeBehindDesktop(); @@ -965,15 +957,12 @@ public interface FeatureFlags { boolean skipCompatUiEducationInDesktopMode(); - boolean skipDeactivationOfDeskWithNothingInFront(); - - boolean skipDecorViewRelayoutWhenClosingBugfix(); - boolean splashScreenViewSyncTransaction(); + boolean supportWidgetIntentsOnConnectedDisplay(); @@ -1001,18 +990,25 @@ public interface FeatureFlags { + boolean taskFragmentSystemOrganizerFlag(); + + + boolean touchPassThroughOptIn(); + + boolean trackSystemUiContextBeforeWms(); + + + boolean transitReadyTracking(); + boolean transitTrackerPlumbing(); - boolean transitionHandlerCujTags(); - - boolean trustedPresentationListenerForWindow(); @@ -1021,13 +1017,11 @@ public interface FeatureFlags { boolean unifyBackNavigationTransition(); - boolean unifyShellBinders(); - - boolean universalResizableByDefault(); + boolean untrustedEmbeddingAnyAppPermission(); @@ -1035,25 +1029,31 @@ public interface FeatureFlags { boolean untrustedEmbeddingStateSharing(); + boolean updateDimsWhenWindowShown(); - boolean updateHostInputTransferToken(); - - - boolean updateTaskMinDimensionsWithRootActivity(); - - - boolean useCachedInsetsForDisplaySwitch(); + boolean useRtFrameCallbackForSplashScreenTransfer(); + + + boolean useTasksDimOnly(); + boolean useVisibleRequestedForProcessTracker(); + + + + boolean useWindowOriginalTouchableRegionWhenMagnificationRecomputeBounds(); + + + boolean vdmForceAppUniversalResizableApi(); diff --git a/flags/src/com/android/window/flags2/FeatureFlagsImpl.java b/flags/src/com/android/window/flags2/FeatureFlagsImpl.java index 69d0017591..142a639298 100644 --- a/flags/src/com/android/window/flags2/FeatureFlagsImpl.java +++ b/flags/src/com/android/window/flags2/FeatureFlagsImpl.java @@ -1,11 +1,18 @@ package com.android.window.flags2; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags { @Override public boolean actionModeEdgeToEdge() { + return false; + } + + @Override + + + public boolean activityEmbeddingAnimationCustomizationFlag() { return true; } @@ -47,6 +54,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean allowHideScmButton() { + return true; + } + + @Override + + public boolean allowsScreenSizeDecoupledFromStatusBarAndCutout() { return true; } @@ -61,13 +75,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean alwaysSeqIdLayout() { - return false; - } - - @Override - - public boolean alwaysUpdateWallpaperPermission() { return true; } @@ -103,13 +110,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean appCompatRefactoringRoundedCorners() { - return false; - } - - @Override - - public boolean appCompatUiFramework() { return false; } @@ -139,7 +139,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean backupAndRestoreForUserAspectRatioSettings() { - return true; + return false; } @Override @@ -166,14 +166,21 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean balCoverIntentSender() { - return false; + public boolean balDontBringExistingBackgroundTaskStackToFg() { + return true; } @Override - public boolean balDontBringExistingBackgroundTaskStackToFg() { + public boolean balImproveRealCallerVisibilityCheck() { + return true; + } + + @Override + + + public boolean balImprovedMetrics() { return true; } @@ -187,6 +194,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean balRequireOptInByPendingIntentCreator() { + return true; + } + + @Override + + public boolean balRespectAppSwitchStateWhenCheckBoundByForegroundUid() { return true; } @@ -229,6 +243,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean cacheWindowStyle() { + return true; + } + + @Override + + public boolean cameraCompatForFreeform() { return false; } @@ -243,6 +264,27 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean checkDisabledSnapshotsInTaskPersister() { + return true; + } + + @Override + + + public boolean cleanupDispatchPendingTransactionsRemoteException() { + return false; + } + + @Override + + + public boolean clearSystemVibrator() { + return true; + } + + @Override + + public boolean closeToSquareConfigIncludesStatusBar() { return false; } @@ -250,6 +292,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean condenseConfigurationChangeForSimpleMode() { + return true; + } + + @Override + + + public boolean configurableFontScaleDefault() { + return true; + } + + @Override + + public boolean coverDisplayOptIn() { return true; } @@ -257,14 +313,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean currentAnimatorScaleUsesSharedMemory() { - return false; + public boolean delayNotificationToMagnificationWhenRecentsWindowToFrontTransition() { + return true; } @Override - public boolean defaultDeskWithoutWarmupMigration() { + public boolean delegateBackGestureToShell() { return false; } @@ -278,6 +334,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean deleteCaptureDisplay() { + return true; + } + + @Override + + public boolean density390Api() { return true; } @@ -306,13 +369,27 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean dispatchFirstKeyguardLockedState() { + public boolean doNotCheckIntersectionWhenNonMagnifiableWindowTransitions() { + return false; + } + + @Override + + + public boolean earlyLaunchHint() { return true; } @Override + public boolean edgeToEdgeByDefault() { + return false; + } + + @Override + + public boolean enableAccessibleCustomHeaders() { return true; } @@ -327,13 +404,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableAppHandlePositionReporting() { - return false; - } - - @Override - - public boolean enableAppHeaderWithTaskDensity() { return true; } @@ -341,13 +411,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableBlockNonDesktopDisplayWindowDragBugfix() { - return false; - } - - @Override - - public boolean enableBorderSettings() { return false; } @@ -355,8 +418,8 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableBoxShadowSettings() { - return false; + public boolean enableBufferTransformHintFromDisplay() { + return true; } @Override @@ -369,13 +432,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableCameraCompatCheckDeviceRotationBugfix() { - return false; - } - - @Override - - public boolean enableCameraCompatForDesktopWindowing() { return true; } @@ -432,13 +488,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableCloseLidInteraction() { - return false; - } - - @Override - - public boolean enableCompatUiVisibilityStatus() { return true; } @@ -481,13 +530,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDesktopAppHeaderStateChangeAnnouncements() { - return false; - } - - @Override - - public boolean enableDesktopAppLaunchAlttabTransitions() { return false; } @@ -502,13 +544,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDesktopAppLaunchBugfix() { - return false; - } - - @Override - - public boolean enableDesktopAppLaunchTransitions() { return false; } @@ -537,34 +572,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDesktopFirstBasedDefaultToDesktopBugfix() { - return false; - } - - @Override - - - public boolean enableDesktopFirstBasedDragToMaximize() { - return false; - } - - @Override - - - public boolean enableDesktopFirstFullscreenRefocusBugfix() { - return false; - } - - @Override - - - public boolean enableDesktopFirstListener() { - return false; - } - - @Override - - public boolean enableDesktopImeBugfix() { return false; } @@ -607,7 +614,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDesktopSplitscreenTransitionBugfix() { + public boolean enableDesktopSwipeBackMinimizeAnimationBugfix() { return false; } @@ -621,13 +628,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDesktopTabTearingLaunchAnimation() { - return false; - } - - @Override - - public boolean enableDesktopTabTearingMinimizeAnimationBugfix() { return true; } @@ -635,13 +635,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDesktopTaskLimitSeparateTransition() { - return false; - } - - @Override - - public boolean enableDesktopTaskbarOnFreeformDisplays() { return false; } @@ -782,13 +775,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDesktopWindowingPipInOverviewBugfix() { - return false; - } - - @Override - - public boolean enableDesktopWindowingQuickSwitch() { return true; } @@ -846,13 +832,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean enableDeviceStateAutoRotateSettingRefactor() { - return true; - } - - @Override - - - public boolean enableDisplayCompatMode() { return false; } @@ -908,13 +887,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableDraggingPipAcrossDisplays() { - return false; - } - - @Override - - public boolean enableDynamicRadiusComputationBugfix() { return false; } @@ -922,34 +894,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableEmptyDeskOnMinimize() { - return false; - } - - @Override - - - public boolean enableExperimentalBubblesController() { - return false; - } - - @Override - - - public boolean enableFreeformBoxShadows() { - return false; - } - - @Override - - - public boolean enableFreeformDisplayLaunchParams() { - return false; - } - - @Override - - public boolean enableFullScreenWindowOnRemovingSplitScreenStageBugfix() { return true; } @@ -957,13 +901,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableFullscreenWindowControls() { - return false; - } - - @Override - - public boolean enableFullyImmersiveInDesktop() { return true; } @@ -978,13 +915,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableHandlersDebuggingMode() { - return false; - } - - @Override - - public boolean enableHoldToDragAppHandle() { return true; } @@ -992,20 +922,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableIndependentBackInProjected() { - return false; - } - - @Override - - - public boolean enableInorderTransitionCallbacksForDesktop() { - return false; - } - - @Override - - public boolean enableInputLayerTransitionFix() { return true; } @@ -1013,13 +929,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableKeyGestureHandlerForSysui() { - return false; - } - - @Override - - public boolean enableMinimizeButton() { return true; } @@ -1034,13 +943,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableModalsFullscreenWithPlatformSignature() { - return true; - } - - @Override - - public boolean enableMoveToNextDisplayShortcut() { return false; } @@ -1069,13 +971,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableMultipleDesktopsDefaultActivationInDesktopFirstDisplays() { - return false; - } - - @Override - - public boolean enableMultipleDesktopsFrontend() { return false; } @@ -1083,13 +978,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableNoWindowDecorationForDesks() { - return true; - } - - @Override - - public boolean enableNonDefaultDisplaySplit() { return false; } @@ -1097,13 +985,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableOmitAccelerometerRotationRestore() { - return true; - } - - @Override - - public boolean enableOpaqueBackgroundForTransparentWindows() { return true; } @@ -1111,13 +992,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableOverflowButtonForTaskbarPinnedItems() { - return false; - } - - @Override - - public boolean enablePerDisplayDesktopWallpaperActivity() { return false; } @@ -1126,20 +1000,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean enablePerDisplayPackageContextCacheInStatusbarNotif() { - return true; - } - - @Override - - - public boolean enablePersistingDisplaySizeForConnectedDisplays() { return false; } @Override - public boolean enablePinningAppWithContextMenu() { + public boolean enablePersistingDisplaySizeForConnectedDisplays() { return false; } @@ -1167,13 +1034,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableRejectHomeTransition() { - return false; - } - - @Override - - public boolean enableRequestFullscreenBugfix() { return true; } @@ -1181,13 +1041,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableRequestFullscreenRefactor() { - return false; - } - - @Override - - public boolean enableResizingMetrics() { return true; } @@ -1209,13 +1062,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableSeeThroughTaskFragments() { - return false; - } - - @Override - - public boolean enableShellInitialBoundsRegressionBugFix() { return true; } @@ -1237,20 +1083,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableSysDecorsCallbacksViaWm() { - return false; - } - - @Override - - - public boolean enableTallAppHeaders() { - return false; - } - - @Override - - public boolean enableTaskResizingKeyboardShortcuts() { return true; } @@ -1273,13 +1105,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean enableTaskbarOverflow() { - return true; - } - - @Override - - - public boolean enableTaskbarRecentTasksThrottleBugfix() { return false; } @@ -1314,13 +1139,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableTransitionOnActivitySetRequestedOrientation() { - return false; - } - - @Override - - public boolean enableVisualIndicatorInTransitionBugfix() { return true; } @@ -1328,13 +1146,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableWindowContextOverrideType() { - return true; - } - - @Override - - public boolean enableWindowContextResourcesUpdateOnConfigChange() { return true; } @@ -1342,20 +1153,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableWindowDecorationRefactor() { - return false; - } - - @Override - - - public boolean enableWindowRepositioningApi() { - return false; - } - - @Override - - public boolean enableWindowingDynamicInitialBounds() { return true; } @@ -1377,13 +1174,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableWindowingTaskStackOrderBugfix() { - return false; - } - - @Override - - public boolean enableWindowingTransitionHandlersObservers() { return false; } @@ -1405,6 +1195,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean ensureWallpaperInTransitions() { + return true; + } + + @Override + + + public boolean ensureWallpaperInWearTransitions() { + return true; + } + + @Override + + public boolean enterDesktopByDefaultOnFreeformDisplays() { return false; } @@ -1419,35 +1223,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean excludeDeskRootsFromDesktopTasks() { - return false; - } - - @Override - - - public boolean excludeNonMainWindowFromSnapshot() { - return false; - } - - @Override - - - public boolean excludeTaskFromRecents() { + public boolean excludeDrawingAppThemeSnapshotFromLock() { return true; } @Override - public boolean extendingPersistenceSnapshotQueueDepth() { - return false; - } - - @Override - - - public boolean fallbackToFocusedDisplay() { + public boolean excludeTaskFromRecents() { return false; } @@ -1461,13 +1244,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean fixFullscreenInMultiWindow() { - return false; - } - - @Override - - public boolean fixHideOverlayApi() { return true; } @@ -1475,28 +1251,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean fixLayoutRestoredTask() { - return false; + public boolean fixLayoutExistingTask() { + return true; } @Override - public boolean fixMovingUnfocusedTask() { - return false; - } - - @Override - - - public boolean fixSetAdjacentTaskFragmentsWithParams() { - return false; - } - - @Override - - - public boolean fixShowWhenLockedSyncTimeout() { + public boolean fixViewRootCallTrace() { return false; } @@ -1510,13 +1272,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean forceShowSystemBarForBubble() { - return true; - } - - @Override - - public boolean formFactorBasedDesktopFirstSwitch() { return false; } @@ -1531,13 +1286,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean grantManageKeyGesturesToRecents() { - return false; - } - - @Override - - public boolean ignoreAspectRatioRestrictionsForResizeableFreeformActivities() { return true; } @@ -1573,14 +1321,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean interceptMotionFromMoveToCancel() { + public boolean jankApi() { return true; } @Override - public boolean jankApi() { + public boolean keepAppWindowHideWhileLocked() { return true; } @@ -1594,6 +1342,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean keyguardGoingAwayTimeout() { + return true; + } + + @Override + + public boolean letterboxBackgroundWallpaper() { return false; } @@ -1629,7 +1384,28 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean nestedTasksWithIndependentBoundsBugfix() { + public boolean nestedTasksWithIndependentBounds() { + return false; + } + + @Override + + + public boolean noConsecutiveVisibilityEvents() { + return true; + } + + @Override + + + public boolean noDuplicateSurfaceDestroyedEvents() { + return true; + } + + @Override + + + public boolean noVisibilityEventOnDisplayStateChange() { return true; } @@ -1637,13 +1413,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean offloadColorExtraction() { - return true; - } - - @Override - - - public boolean parallelCdTransitionsDuringRecents() { return false; } @@ -1699,8 +1468,8 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean preserveRecentsTaskConfigurationOnRelaunch() { - return false; + public boolean processPriorityPolicyForMultiWindowMode() { + return true; } @Override @@ -1713,6 +1482,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean recordTaskSnapshotsBeforeShutdown() { + return true; + } + + @Override + + public boolean reduceChangedExclusionRectsMsgs() { return false; } @@ -1720,6 +1496,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean reduceKeyguardTransitions() { + return true; + } + + @Override + + public boolean reduceTaskSnapshotMemoryUsage() { return false; } @@ -1727,6 +1510,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean reduceUnnecessaryMeasure() { + return false; + } + + @Override + + public boolean relativeInsets() { return false; } @@ -1741,7 +1531,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean releaseSurfaceOnTransitionFinish() { + public boolean releaseUserAspectRatioWm() { return true; } @@ -1755,22 +1545,15 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean removeDeferHidingClient() { + return true; + } + + @Override + + public boolean removeDepartTargetFromMotion() { - return true; - } - - @Override - - - public boolean removeStartingInTransition() { - return true; - } - - @Override - - - public boolean reparentToDefaultWithDisplayRemoval() { - return true; + return false; } @Override @@ -1783,27 +1566,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean respectFullscreenActivityOptionInDesktopLaunchParams() { - return false; - } - - @Override - - - public boolean respectHierarchySurfaceVisibility() { + public boolean respectNonTopVisibleFixedOrientation() { return true; } @Override - public boolean respectLeafTaskBounds() { - return false; - } - - @Override - - public boolean respectOrientationChangeForUnresizeable() { return true; } @@ -1811,27 +1580,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean restoreUserAspectRatioSettingsUsingService() { - return true; - } - - @Override - - - public boolean restrictFreeformHiddenSystemBarsToFillingTasks() { - return false; - } - - @Override - - - public boolean rootTaskForBubble() { - return false; - } - - @Override - - public boolean safeRegionLetterboxing() { return false; } @@ -1840,7 +1588,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean safeReleaseSnapshotAggressively() { - return true; + return false; } @Override @@ -1860,13 +1608,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean screenBrightnessDimOnEmulator() { - return false; - } - - @Override - - public boolean screenRecordingCallbacks() { return true; } @@ -1881,13 +1622,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean scvhSurfaceControlLifetimeFix() { - return false; - } - - @Override - - public boolean sdkDesiredPresentTime() { return true; } @@ -1910,7 +1644,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean showDesktopExperienceDevOption() { - return true; + return false; } @Override @@ -1937,13 +1671,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean skipDeactivationOfDeskWithNothingInFront() { - return false; - } - - @Override - - public boolean skipDecorViewRelayoutWhenClosingBugfix() { return true; } @@ -1951,8 +1678,8 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean splashScreenViewSyncTransaction() { - return true; + public boolean supportWidgetIntentsOnConnectedDisplay() { + return false; } @Override @@ -1994,6 +1721,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean systemUiPostAnimationEnd() { + return false; + } + + @Override + + + public boolean taskFragmentSystemOrganizerFlag() { return true; } @@ -2007,6 +1741,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean trackSystemUiContextBeforeWms() { + return true; + } + + @Override + + public boolean transitReadyTracking() { return false; } @@ -2021,13 +1762,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean transitionHandlerCujTags() { - return false; - } - - @Override - - public boolean trustedPresentationListenerForWindow() { return true; } @@ -2042,13 +1776,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean unifyShellBinders() { - return false; - } - - @Override - - public boolean universalResizableByDefault() { return true; } @@ -2077,21 +1804,14 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean updateHostInputTransferToken() { - return true; - } - - @Override - - - public boolean updateTaskMinDimensionsWithRootActivity() { + public boolean useCachedInsetsForDisplaySwitch() { return false; } @Override - public boolean useCachedInsetsForDisplaySwitch() { + public boolean useRtFrameCallbackForSplashScreenTransfer() { return true; } @@ -2105,6 +1825,20 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean useVisibleRequestedForProcessTracker() { + return false; + } + + @Override + + + public boolean useWindowOriginalTouchableRegionWhenMagnificationRecomputeBounds() { + return false; + } + + @Override + + public boolean vdmForceAppUniversalResizableApi() { return true; } diff --git a/flags/src/com/android/window/flags2/Flags.java b/flags/src/com/android/window/flags2/Flags.java index 9fd05aed69..5ad83f821d 100644 --- a/flags/src/com/android/window/flags2/Flags.java +++ b/flags/src/com/android/window/flags2/Flags.java @@ -1,11 +1,13 @@ package com.android.window.flags2; - +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public final class Flags { /** @hide */ public static final String FLAG_ACTION_MODE_EDGE_TO_EDGE = "com.android.window.flags.action_mode_edge_to_edge"; /** @hide */ + public static final String FLAG_ACTIVITY_EMBEDDING_ANIMATION_CUSTOMIZATION_FLAG = "com.android.window.flags.activity_embedding_animation_customization_flag"; + /** @hide */ public static final String FLAG_ACTIVITY_EMBEDDING_DELAY_TASK_FRAGMENT_FINISH_FOR_ACTIVITY_LAUNCH = "com.android.window.flags.activity_embedding_delay_task_fragment_finish_for_activity_launch"; /** @hide */ public static final String FLAG_ACTIVITY_EMBEDDING_INTERACTIVE_DIVIDER_FLAG = "com.android.window.flags.activity_embedding_interactive_divider_flag"; @@ -16,12 +18,12 @@ public final class Flags { /** @hide */ public static final String FLAG_ALLOW_DISABLE_ACTIVITY_RECORD_INPUT_SINK = "com.android.window.flags.allow_disable_activity_record_input_sink"; /** @hide */ + public static final String FLAG_ALLOW_HIDE_SCM_BUTTON = "com.android.window.flags.allow_hide_scm_button"; + /** @hide */ public static final String FLAG_ALLOWS_SCREEN_SIZE_DECOUPLED_FROM_STATUS_BAR_AND_CUTOUT = "com.android.window.flags.allows_screen_size_decoupled_from_status_bar_and_cutout"; /** @hide */ public static final String FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER = "com.android.window.flags.always_draw_magnification_fullscreen_border"; /** @hide */ - public static final String FLAG_ALWAYS_SEQ_ID_LAYOUT = "com.android.window.flags.always_seq_id_layout"; - /** @hide */ public static final String FLAG_ALWAYS_UPDATE_WALLPAPER_PERMISSION = "com.android.window.flags.always_update_wallpaper_permission"; /** @hide */ public static final String FLAG_AOD_TRANSITION = "com.android.window.flags.aod_transition"; @@ -32,8 +34,6 @@ public final class Flags { /** @hide */ public static final String FLAG_APP_COMPAT_REFACTORING = "com.android.window.flags.app_compat_refactoring"; /** @hide */ - public static final String FLAG_APP_COMPAT_REFACTORING_ROUNDED_CORNERS = "com.android.window.flags.app_compat_refactoring_rounded_corners"; - /** @hide */ public static final String FLAG_APP_COMPAT_UI_FRAMEWORK = "com.android.window.flags.app_compat_ui_framework"; /** @hide */ public static final String FLAG_APP_HANDLE_NO_RELAYOUT_ON_EXCLUSION_CHANGE = "com.android.window.flags.app_handle_no_relayout_on_exclusion_change"; @@ -50,12 +50,16 @@ public final class Flags { /** @hide */ public static final String FLAG_BAL_CLEAR_ALLOWLIST_DURATION = "com.android.window.flags.bal_clear_allowlist_duration"; /** @hide */ - public static final String FLAG_BAL_COVER_INTENT_SENDER = "com.android.window.flags.bal_cover_intent_sender"; - /** @hide */ public static final String FLAG_BAL_DONT_BRING_EXISTING_BACKGROUND_TASK_STACK_TO_FG = "com.android.window.flags.bal_dont_bring_existing_background_task_stack_to_fg"; /** @hide */ + public static final String FLAG_BAL_IMPROVE_REAL_CALLER_VISIBILITY_CHECK = "com.android.window.flags.bal_improve_real_caller_visibility_check"; + /** @hide */ + public static final String FLAG_BAL_IMPROVED_METRICS = "com.android.window.flags.bal_improved_metrics"; + /** @hide */ public static final String FLAG_BAL_REDUCE_GRACE_PERIOD = "com.android.window.flags.bal_reduce_grace_period"; /** @hide */ + public static final String FLAG_BAL_REQUIRE_OPT_IN_BY_PENDING_INTENT_CREATOR = "com.android.window.flags.bal_require_opt_in_by_pending_intent_creator"; + /** @hide */ public static final String FLAG_BAL_RESPECT_APP_SWITCH_STATE_WHEN_CHECK_BOUND_BY_FOREGROUND_UID = "com.android.window.flags.bal_respect_app_switch_state_when_check_bound_by_foreground_uid"; /** @hide */ public static final String FLAG_BAL_SEND_INTENT_WITH_OPTIONS = "com.android.window.flags.bal_send_intent_with_options"; @@ -68,20 +72,34 @@ public final class Flags { /** @hide */ public static final String FLAG_BETTER_SUPPORT_NON_MATCH_PARENT_ACTIVITY = "com.android.window.flags.better_support_non_match_parent_activity"; /** @hide */ + public static final String FLAG_CACHE_WINDOW_STYLE = "com.android.window.flags.cache_window_style"; + /** @hide */ public static final String FLAG_CAMERA_COMPAT_FOR_FREEFORM = "com.android.window.flags.camera_compat_for_freeform"; /** @hide */ public static final String FLAG_CAMERA_COMPAT_FULLSCREEN_PICK_SAME_TASK_ACTIVITY = "com.android.window.flags.camera_compat_fullscreen_pick_same_task_activity"; /** @hide */ + public static final String FLAG_CHECK_DISABLED_SNAPSHOTS_IN_TASK_PERSISTER = "com.android.window.flags.check_disabled_snapshots_in_task_persister"; + /** @hide */ + public static final String FLAG_CLEANUP_DISPATCH_PENDING_TRANSACTIONS_REMOTE_EXCEPTION = "com.android.window.flags.cleanup_dispatch_pending_transactions_remote_exception"; + /** @hide */ + public static final String FLAG_CLEAR_SYSTEM_VIBRATOR = "com.android.window.flags.clear_system_vibrator"; + /** @hide */ public static final String FLAG_CLOSE_TO_SQUARE_CONFIG_INCLUDES_STATUS_BAR = "com.android.window.flags.close_to_square_config_includes_status_bar"; /** @hide */ + public static final String FLAG_CONDENSE_CONFIGURATION_CHANGE_FOR_SIMPLE_MODE = "com.android.window.flags.condense_configuration_change_for_simple_mode"; + /** @hide */ + public static final String FLAG_CONFIGURABLE_FONT_SCALE_DEFAULT = "com.android.window.flags.configurable_font_scale_default"; + /** @hide */ public static final String FLAG_COVER_DISPLAY_OPT_IN = "com.android.window.flags.cover_display_opt_in"; /** @hide */ - public static final String FLAG_CURRENT_ANIMATOR_SCALE_USES_SHARED_MEMORY = "com.android.window.flags.current_animator_scale_uses_shared_memory"; + public static final String FLAG_DELAY_NOTIFICATION_TO_MAGNIFICATION_WHEN_RECENTS_WINDOW_TO_FRONT_TRANSITION = "com.android.window.flags.delay_notification_to_magnification_when_recents_window_to_front_transition"; /** @hide */ - public static final String FLAG_DEFAULT_DESK_WITHOUT_WARMUP_MIGRATION = "com.android.window.flags.default_desk_without_warmup_migration"; + public static final String FLAG_DELEGATE_BACK_GESTURE_TO_SHELL = "com.android.window.flags.delegate_back_gesture_to_shell"; /** @hide */ public static final String FLAG_DELEGATE_UNHANDLED_DRAGS = "com.android.window.flags.delegate_unhandled_drags"; /** @hide */ + public static final String FLAG_DELETE_CAPTURE_DISPLAY = "com.android.window.flags.delete_capture_display"; + /** @hide */ public static final String FLAG_DENSITY_390_API = "com.android.window.flags.density_390_api"; /** @hide */ public static final String FLAG_DISABLE_DESKTOP_LAUNCH_PARAMS_OUTSIDE_DESKTOP_BUG_FIX = "com.android.window.flags.disable_desktop_launch_params_outside_desktop_bug_fix"; @@ -90,26 +108,24 @@ public final class Flags { /** @hide */ public static final String FLAG_DISABLE_OPT_OUT_EDGE_TO_EDGE = "com.android.window.flags.disable_opt_out_edge_to_edge"; /** @hide */ - public static final String FLAG_DISPATCH_FIRST_KEYGUARD_LOCKED_STATE = "com.android.window.flags.dispatch_first_keyguard_locked_state"; + public static final String FLAG_DO_NOT_CHECK_INTERSECTION_WHEN_NON_MAGNIFIABLE_WINDOW_TRANSITIONS = "com.android.window.flags.do_not_check_intersection_when_non_magnifiable_window_transitions"; + /** @hide */ + public static final String FLAG_EARLY_LAUNCH_HINT = "com.android.window.flags.early_launch_hint"; + /** @hide */ + public static final String FLAG_EDGE_TO_EDGE_BY_DEFAULT = "com.android.window.flags.edge_to_edge_by_default"; /** @hide */ public static final String FLAG_ENABLE_ACCESSIBLE_CUSTOM_HEADERS = "com.android.window.flags.enable_accessible_custom_headers"; /** @hide */ public static final String FLAG_ENABLE_ACTIVITY_EMBEDDING_SUPPORT_FOR_CONNECTED_DISPLAYS = "com.android.window.flags.enable_activity_embedding_support_for_connected_displays"; /** @hide */ - public static final String FLAG_ENABLE_APP_HANDLE_POSITION_REPORTING = "com.android.window.flags.enable_app_handle_position_reporting"; - /** @hide */ public static final String FLAG_ENABLE_APP_HEADER_WITH_TASK_DENSITY = "com.android.window.flags.enable_app_header_with_task_density"; /** @hide */ - public static final String FLAG_ENABLE_BLOCK_NON_DESKTOP_DISPLAY_WINDOW_DRAG_BUGFIX = "com.android.window.flags.enable_block_non_desktop_display_window_drag_bugfix"; - /** @hide */ public static final String FLAG_ENABLE_BORDER_SETTINGS = "com.android.window.flags.enable_border_settings"; /** @hide */ - public static final String FLAG_ENABLE_BOX_SHADOW_SETTINGS = "com.android.window.flags.enable_box_shadow_settings"; + public static final String FLAG_ENABLE_BUFFER_TRANSFORM_HINT_FROM_DISPLAY = "com.android.window.flags.enable_buffer_transform_hint_from_display"; /** @hide */ public static final String FLAG_ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY = "com.android.window.flags.enable_bug_fixes_for_secondary_display"; /** @hide */ - public static final String FLAG_ENABLE_CAMERA_COMPAT_CHECK_DEVICE_ROTATION_BUGFIX = "com.android.window.flags.enable_camera_compat_check_device_rotation_bugfix"; - /** @hide */ public static final String FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING = "com.android.window.flags.enable_camera_compat_for_desktop_windowing"; /** @hide */ public static final String FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING_OPT_OUT = "com.android.window.flags.enable_camera_compat_for_desktop_windowing_opt_out"; @@ -126,8 +142,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_CASCADING_WINDOWS = "com.android.window.flags.enable_cascading_windows"; /** @hide */ - public static final String FLAG_ENABLE_CLOSE_LID_INTERACTION = "com.android.window.flags.enable_close_lid_interaction"; - /** @hide */ public static final String FLAG_ENABLE_COMPAT_UI_VISIBILITY_STATUS = "com.android.window.flags.enable_compat_ui_visibility_status"; /** @hide */ public static final String FLAG_ENABLE_COMPATUI_SYSUI_LAUNCHER = "com.android.window.flags.enable_compatui_sysui_launcher"; @@ -140,14 +154,10 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_DESKTOP_APP_HANDLE_ANIMATION = "com.android.window.flags.enable_desktop_app_handle_animation"; /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS = "com.android.window.flags.enable_desktop_app_header_state_change_announcements"; - /** @hide */ public static final String FLAG_ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS = "com.android.window.flags.enable_desktop_app_launch_alttab_transitions"; /** @hide */ public static final String FLAG_ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS_BUGFIX = "com.android.window.flags.enable_desktop_app_launch_alttab_transitions_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_APP_LAUNCH_BUGFIX = "com.android.window.flags.enable_desktop_app_launch_bugfix"; - /** @hide */ public static final String FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS = "com.android.window.flags.enable_desktop_app_launch_transitions"; /** @hide */ public static final String FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX = "com.android.window.flags.enable_desktop_app_launch_transitions_bugfix"; @@ -156,14 +166,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_DESKTOP_CLOSE_TASK_ANIMATION_IN_DTC_BUGFIX = "com.android.window.flags.enable_desktop_close_task_animation_in_dtc_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_FIRST_BASED_DEFAULT_TO_DESKTOP_BUGFIX = "com.android.window.flags.enable_desktop_first_based_default_to_desktop_bugfix"; - /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_FIRST_BASED_DRAG_TO_MAXIMIZE = "com.android.window.flags.enable_desktop_first_based_drag_to_maximize"; - /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX = "com.android.window.flags.enable_desktop_first_fullscreen_refocus_bugfix"; - /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_FIRST_LISTENER = "com.android.window.flags.enable_desktop_first_listener"; - /** @hide */ public static final String FLAG_ENABLE_DESKTOP_IME_BUGFIX = "com.android.window.flags.enable_desktop_ime_bugfix"; /** @hide */ public static final String FLAG_ENABLE_DESKTOP_IMMERSIVE_DRAG_BUGFIX = "com.android.window.flags.enable_desktop_immersive_drag_bugfix"; @@ -176,16 +178,12 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_DESKTOP_RECENTS_TRANSITIONS_CORNERS_BUGFIX = "com.android.window.flags.enable_desktop_recents_transitions_corners_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_SPLITSCREEN_TRANSITION_BUGFIX = "com.android.window.flags.enable_desktop_splitscreen_transition_bugfix"; + public static final String FLAG_ENABLE_DESKTOP_SWIPE_BACK_MINIMIZE_ANIMATION_BUGFIX = "com.android.window.flags.enable_desktop_swipe_back_minimize_animation_bugfix"; /** @hide */ public static final String FLAG_ENABLE_DESKTOP_SYSTEM_DIALOGS_TRANSITIONS = "com.android.window.flags.enable_desktop_system_dialogs_transitions"; /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_TAB_TEARING_LAUNCH_ANIMATION = "com.android.window.flags.enable_desktop_tab_tearing_launch_animation"; - /** @hide */ public static final String FLAG_ENABLE_DESKTOP_TAB_TEARING_MINIMIZE_ANIMATION_BUGFIX = "com.android.window.flags.enable_desktop_tab_tearing_minimize_animation_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_TASK_LIMIT_SEPARATE_TRANSITION = "com.android.window.flags.enable_desktop_task_limit_separate_transition"; - /** @hide */ public static final String FLAG_ENABLE_DESKTOP_TASKBAR_ON_FREEFORM_DISPLAYS = "com.android.window.flags.enable_desktop_taskbar_on_freeform_displays"; /** @hide */ public static final String FLAG_ENABLE_DESKTOP_TRAMPOLINE_CLOSE_ANIMATION_BUGFIX = "com.android.window.flags.enable_desktop_trampoline_close_animation_bugfix"; @@ -226,8 +224,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_DESKTOP_WINDOWING_PIP = "com.android.window.flags.enable_desktop_windowing_pip"; /** @hide */ - public static final String FLAG_ENABLE_DESKTOP_WINDOWING_PIP_IN_OVERVIEW_BUGFIX = "com.android.window.flags.enable_desktop_windowing_pip_in_overview_bugfix"; - /** @hide */ public static final String FLAG_ENABLE_DESKTOP_WINDOWING_QUICK_SWITCH = "com.android.window.flags.enable_desktop_windowing_quick_switch"; /** @hide */ public static final String FLAG_ENABLE_DESKTOP_WINDOWING_SCVH_CACHE_BUG_FIX = "com.android.window.flags.enable_desktop_windowing_scvh_cache_bug_fix"; @@ -246,8 +242,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_DEVICE_STATE_AUTO_ROTATE_SETTING_REFACTOR = "com.android.window.flags.enable_device_state_auto_rotate_setting_refactor"; /** @hide */ - public static final String FLAG_ENABLE_DISPLAY_COMPAT_MODE = "com.android.window.flags.enable_display_compat_mode"; - /** @hide */ public static final String FLAG_ENABLE_DISPLAY_DISCONNECT_INTERACTION = "com.android.window.flags.enable_display_disconnect_interaction"; /** @hide */ public static final String FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS = "com.android.window.flags.enable_display_focus_in_shell_transitions"; @@ -262,44 +256,22 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_DRAG_TO_MAXIMIZE = "com.android.window.flags.enable_drag_to_maximize"; /** @hide */ - public static final String FLAG_ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS = "com.android.window.flags.enable_dragging_pip_across_displays"; - /** @hide */ public static final String FLAG_ENABLE_DYNAMIC_RADIUS_COMPUTATION_BUGFIX = "com.android.window.flags.enable_dynamic_radius_computation_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_EMPTY_DESK_ON_MINIMIZE = "com.android.window.flags.enable_empty_desk_on_minimize"; - /** @hide */ - public static final String FLAG_ENABLE_EXPERIMENTAL_BUBBLES_CONTROLLER = "com.android.window.flags.enable_experimental_bubbles_controller"; - /** @hide */ - public static final String FLAG_ENABLE_FREEFORM_BOX_SHADOWS = "com.android.window.flags.enable_freeform_box_shadows"; - /** @hide */ - public static final String FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS = "com.android.window.flags.enable_freeform_display_launch_params"; - /** @hide */ public static final String FLAG_ENABLE_FULL_SCREEN_WINDOW_ON_REMOVING_SPLIT_SCREEN_STAGE_BUGFIX = "com.android.window.flags.enable_full_screen_window_on_removing_split_screen_stage_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_FULLSCREEN_WINDOW_CONTROLS = "com.android.window.flags.enable_fullscreen_window_controls"; - /** @hide */ public static final String FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP = "com.android.window.flags.enable_fully_immersive_in_desktop"; /** @hide */ public static final String FLAG_ENABLE_HANDLE_INPUT_FIX = "com.android.window.flags.enable_handle_input_fix"; /** @hide */ - public static final String FLAG_ENABLE_HANDLERS_DEBUGGING_MODE = "com.android.window.flags.enable_handlers_debugging_mode"; - /** @hide */ public static final String FLAG_ENABLE_HOLD_TO_DRAG_APP_HANDLE = "com.android.window.flags.enable_hold_to_drag_app_handle"; /** @hide */ - public static final String FLAG_ENABLE_INDEPENDENT_BACK_IN_PROJECTED = "com.android.window.flags.enable_independent_back_in_projected"; - /** @hide */ - public static final String FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP = "com.android.window.flags.enable_inorder_transition_callbacks_for_desktop"; - /** @hide */ public static final String FLAG_ENABLE_INPUT_LAYER_TRANSITION_FIX = "com.android.window.flags.enable_input_layer_transition_fix"; /** @hide */ - public static final String FLAG_ENABLE_KEY_GESTURE_HANDLER_FOR_SYSUI = "com.android.window.flags.enable_key_gesture_handler_for_sysui"; - /** @hide */ public static final String FLAG_ENABLE_MINIMIZE_BUTTON = "com.android.window.flags.enable_minimize_button"; /** @hide */ public static final String FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION = "com.android.window.flags.enable_modals_fullscreen_with_permission"; /** @hide */ - public static final String FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE = "com.android.window.flags.enable_modals_fullscreen_with_platform_signature"; - /** @hide */ public static final String FLAG_ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT = "com.android.window.flags.enable_move_to_next_display_shortcut"; /** @hide */ public static final String FLAG_ENABLE_MULTI_DISPLAY_SPLIT = "com.android.window.flags.enable_multi_display_split"; @@ -308,58 +280,38 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND = "com.android.window.flags.enable_multiple_desktops_backend"; /** @hide */ - public static final String FLAG_ENABLE_MULTIPLE_DESKTOPS_DEFAULT_ACTIVATION_IN_DESKTOP_FIRST_DISPLAYS = "com.android.window.flags.enable_multiple_desktops_default_activation_in_desktop_first_displays"; - /** @hide */ public static final String FLAG_ENABLE_MULTIPLE_DESKTOPS_FRONTEND = "com.android.window.flags.enable_multiple_desktops_frontend"; /** @hide */ - public static final String FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS = "com.android.window.flags.enable_no_window_decoration_for_desks"; - /** @hide */ public static final String FLAG_ENABLE_NON_DEFAULT_DISPLAY_SPLIT = "com.android.window.flags.enable_non_default_display_split"; /** @hide */ - public static final String FLAG_ENABLE_OMIT_ACCELEROMETER_ROTATION_RESTORE = "com.android.window.flags.enable_omit_accelerometer_rotation_restore"; - /** @hide */ public static final String FLAG_ENABLE_OPAQUE_BACKGROUND_FOR_TRANSPARENT_WINDOWS = "com.android.window.flags.enable_opaque_background_for_transparent_windows"; /** @hide */ - public static final String FLAG_ENABLE_OVERFLOW_BUTTON_FOR_TASKBAR_PINNED_ITEMS = "com.android.window.flags.enable_overflow_button_for_taskbar_pinned_items"; - /** @hide */ public static final String FLAG_ENABLE_PER_DISPLAY_DESKTOP_WALLPAPER_ACTIVITY = "com.android.window.flags.enable_per_display_desktop_wallpaper_activity"; /** @hide */ public static final String FLAG_ENABLE_PER_DISPLAY_PACKAGE_CONTEXT_CACHE_IN_STATUSBAR_NOTIF = "com.android.window.flags.enable_per_display_package_context_cache_in_statusbar_notif"; /** @hide */ public static final String FLAG_ENABLE_PERSISTING_DISPLAY_SIZE_FOR_CONNECTED_DISPLAYS = "com.android.window.flags.enable_persisting_display_size_for_connected_displays"; /** @hide */ - public static final String FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU = "com.android.window.flags.enable_pinning_app_with_context_menu"; - /** @hide */ public static final String FLAG_ENABLE_PRESENTATION_FOR_CONNECTED_DISPLAYS = "com.android.window.flags.enable_presentation_for_connected_displays"; /** @hide */ public static final String FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE = "com.android.window.flags.enable_projected_display_desktop_mode"; /** @hide */ public static final String FLAG_ENABLE_QUICKSWITCH_DESKTOP_SPLIT_BUGFIX = "com.android.window.flags.enable_quickswitch_desktop_split_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_REJECT_HOME_TRANSITION = "com.android.window.flags.enable_reject_home_transition"; - /** @hide */ public static final String FLAG_ENABLE_REQUEST_FULLSCREEN_BUGFIX = "com.android.window.flags.enable_request_fullscreen_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_REQUEST_FULLSCREEN_REFACTOR = "com.android.window.flags.enable_request_fullscreen_refactor"; - /** @hide */ public static final String FLAG_ENABLE_RESIZING_METRICS = "com.android.window.flags.enable_resizing_metrics"; /** @hide */ public static final String FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS = "com.android.window.flags.enable_restart_menu_for_connected_displays"; /** @hide */ public static final String FLAG_ENABLE_RESTORE_TO_PREVIOUS_SIZE_FROM_DESKTOP_IMMERSIVE = "com.android.window.flags.enable_restore_to_previous_size_from_desktop_immersive"; /** @hide */ - public static final String FLAG_ENABLE_SEE_THROUGH_TASK_FRAGMENTS = "com.android.window.flags.enable_see_through_task_fragments"; - /** @hide */ public static final String FLAG_ENABLE_SHELL_INITIAL_BOUNDS_REGRESSION_BUG_FIX = "com.android.window.flags.enable_shell_initial_bounds_regression_bug_fix"; /** @hide */ public static final String FLAG_ENABLE_SIZE_COMPAT_MODE_IMPROVEMENTS_FOR_CONNECTED_DISPLAYS = "com.android.window.flags.enable_size_compat_mode_improvements_for_connected_displays"; /** @hide */ public static final String FLAG_ENABLE_START_LAUNCH_TRANSITION_FROM_TASKBAR_BUGFIX = "com.android.window.flags.enable_start_launch_transition_from_taskbar_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_SYS_DECORS_CALLBACKS_VIA_WM = "com.android.window.flags.enable_sys_decors_callbacks_via_wm"; - /** @hide */ - public static final String FLAG_ENABLE_TALL_APP_HEADERS = "com.android.window.flags.enable_tall_app_headers"; - /** @hide */ public static final String FLAG_ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS = "com.android.window.flags.enable_task_resizing_keyboard_shortcuts"; /** @hide */ public static final String FLAG_ENABLE_TASK_STACK_OBSERVER_IN_SHELL = "com.android.window.flags.enable_task_stack_observer_in_shell"; @@ -368,8 +320,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_TASKBAR_OVERFLOW = "com.android.window.flags.enable_taskbar_overflow"; /** @hide */ - public static final String FLAG_ENABLE_TASKBAR_RECENT_TASKS_THROTTLE_BUGFIX = "com.android.window.flags.enable_taskbar_recent_tasks_throttle_bugfix"; - /** @hide */ public static final String FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION = "com.android.window.flags.enable_taskbar_recents_layout_transition"; /** @hide */ public static final String FLAG_ENABLE_THEMED_APP_HEADERS = "com.android.window.flags.enable_themed_app_headers"; @@ -378,70 +328,48 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_TOP_VISIBLE_ROOT_TASK_PER_USER_TRACKING = "com.android.window.flags.enable_top_visible_root_task_per_user_tracking"; /** @hide */ - public static final String FLAG_ENABLE_TRANSITION_ON_ACTIVITY_SET_REQUESTED_ORIENTATION = "com.android.window.flags.enable_transition_on_activity_set_requested_orientation"; - /** @hide */ public static final String FLAG_ENABLE_VISUAL_INDICATOR_IN_TRANSITION_BUGFIX = "com.android.window.flags.enable_visual_indicator_in_transition_bugfix"; /** @hide */ - public static final String FLAG_ENABLE_WINDOW_CONTEXT_OVERRIDE_TYPE = "com.android.window.flags.enable_window_context_override_type"; - /** @hide */ public static final String FLAG_ENABLE_WINDOW_CONTEXT_RESOURCES_UPDATE_ON_CONFIG_CHANGE = "com.android.window.flags.enable_window_context_resources_update_on_config_change"; /** @hide */ - public static final String FLAG_ENABLE_WINDOW_DECORATION_REFACTOR = "com.android.window.flags.enable_window_decoration_refactor"; - /** @hide */ - public static final String FLAG_ENABLE_WINDOW_REPOSITIONING_API = "com.android.window.flags.enable_window_repositioning_api"; - /** @hide */ public static final String FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS = "com.android.window.flags.enable_windowing_dynamic_initial_bounds"; /** @hide */ public static final String FLAG_ENABLE_WINDOWING_EDGE_DRAG_RESIZE = "com.android.window.flags.enable_windowing_edge_drag_resize"; /** @hide */ public static final String FLAG_ENABLE_WINDOWING_SCALED_RESIZING = "com.android.window.flags.enable_windowing_scaled_resizing"; /** @hide */ - public static final String FLAG_ENABLE_WINDOWING_TASK_STACK_ORDER_BUGFIX = "com.android.window.flags.enable_windowing_task_stack_order_bugfix"; - /** @hide */ public static final String FLAG_ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS = "com.android.window.flags.enable_windowing_transition_handlers_observers"; /** @hide */ public static final String FLAG_ENFORCE_EDGE_TO_EDGE = "com.android.window.flags.enforce_edge_to_edge"; /** @hide */ public static final String FLAG_ENSURE_KEYGUARD_DOES_TRANSITION_STARTING = "com.android.window.flags.ensure_keyguard_does_transition_starting"; /** @hide */ + public static final String FLAG_ENSURE_WALLPAPER_IN_TRANSITIONS = "com.android.window.flags.ensure_wallpaper_in_transitions"; + /** @hide */ + public static final String FLAG_ENSURE_WALLPAPER_IN_WEAR_TRANSITIONS = "com.android.window.flags.ensure_wallpaper_in_wear_transitions"; + /** @hide */ public static final String FLAG_ENTER_DESKTOP_BY_DEFAULT_ON_FREEFORM_DISPLAYS = "com.android.window.flags.enter_desktop_by_default_on_freeform_displays"; /** @hide */ public static final String FLAG_EXCLUDE_CAPTION_FROM_APP_BOUNDS = "com.android.window.flags.exclude_caption_from_app_bounds"; /** @hide */ - public static final String FLAG_EXCLUDE_DESK_ROOTS_FROM_DESKTOP_TASKS = "com.android.window.flags.exclude_desk_roots_from_desktop_tasks"; - /** @hide */ - public static final String FLAG_EXCLUDE_NON_MAIN_WINDOW_FROM_SNAPSHOT = "com.android.window.flags.exclude_non_main_window_from_snapshot"; + public static final String FLAG_EXCLUDE_DRAWING_APP_THEME_SNAPSHOT_FROM_LOCK = "com.android.window.flags.exclude_drawing_app_theme_snapshot_from_lock"; /** @hide */ public static final String FLAG_EXCLUDE_TASK_FROM_RECENTS = "com.android.window.flags.exclude_task_from_recents"; /** @hide */ - public static final String FLAG_EXTENDING_PERSISTENCE_SNAPSHOT_QUEUE_DEPTH = "com.android.window.flags.extending_persistence_snapshot_queue_depth"; - /** @hide */ - public static final String FLAG_FALLBACK_TO_FOCUSED_DISPLAY = "com.android.window.flags.fallback_to_focused_display"; - /** @hide */ public static final String FLAG_FIFO_PRIORITY_FOR_MAJOR_UI_PROCESSES = "com.android.window.flags.fifo_priority_for_major_ui_processes"; /** @hide */ - public static final String FLAG_FIX_FULLSCREEN_IN_MULTI_WINDOW = "com.android.window.flags.fix_fullscreen_in_multi_window"; - /** @hide */ public static final String FLAG_FIX_HIDE_OVERLAY_API = "com.android.window.flags.fix_hide_overlay_api"; /** @hide */ - public static final String FLAG_FIX_LAYOUT_RESTORED_TASK = "com.android.window.flags.fix_layout_restored_task"; + public static final String FLAG_FIX_LAYOUT_EXISTING_TASK = "com.android.window.flags.fix_layout_existing_task"; /** @hide */ - public static final String FLAG_FIX_MOVING_UNFOCUSED_TASK = "com.android.window.flags.fix_moving_unfocused_task"; - /** @hide */ - public static final String FLAG_FIX_SET_ADJACENT_TASK_FRAGMENTS_WITH_PARAMS = "com.android.window.flags.fix_set_adjacent_task_fragments_with_params"; - /** @hide */ - public static final String FLAG_FIX_SHOW_WHEN_LOCKED_SYNC_TIMEOUT = "com.android.window.flags.fix_show_when_locked_sync_timeout"; + public static final String FLAG_FIX_VIEW_ROOT_CALL_TRACE = "com.android.window.flags.fix_view_root_call_trace"; /** @hide */ public static final String FLAG_FORCE_CLOSE_TOP_TRANSPARENT_FULLSCREEN_TASK = "com.android.window.flags.force_close_top_transparent_fullscreen_task"; /** @hide */ - public static final String FLAG_FORCE_SHOW_SYSTEM_BAR_FOR_BUBBLE = "com.android.window.flags.force_show_system_bar_for_bubble"; - /** @hide */ public static final String FLAG_FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH = "com.android.window.flags.form_factor_based_desktop_first_switch"; /** @hide */ public static final String FLAG_GET_DIMMER_ON_CLOSING = "com.android.window.flags.get_dimmer_on_closing"; /** @hide */ - public static final String FLAG_GRANT_MANAGE_KEY_GESTURES_TO_RECENTS = "com.android.window.flags.grant_manage_key_gestures_to_recents"; - /** @hide */ public static final String FLAG_IGNORE_ASPECT_RATIO_RESTRICTIONS_FOR_RESIZEABLE_FREEFORM_ACTIVITIES = "com.android.window.flags.ignore_aspect_ratio_restrictions_for_resizeable_freeform_activities"; /** @hide */ public static final String FLAG_IGNORE_CORNER_RADIUS_AND_SHADOWS = "com.android.window.flags.ignore_corner_radius_and_shadows"; @@ -452,12 +380,14 @@ public final class Flags { /** @hide */ public static final String FLAG_INSETS_DECOUPLED_CONFIGURATION = "com.android.window.flags.insets_decoupled_configuration"; /** @hide */ - public static final String FLAG_INTERCEPT_MOTION_FROM_MOVE_TO_CANCEL = "com.android.window.flags.intercept_motion_from_move_to_cancel"; - /** @hide */ public static final String FLAG_JANK_API = "com.android.window.flags.jank_api"; /** @hide */ + public static final String FLAG_KEEP_APP_WINDOW_HIDE_WHILE_LOCKED = "com.android.window.flags.keep_app_window_hide_while_locked"; + /** @hide */ public static final String FLAG_KEYBOARD_SHORTCUTS_TO_SWITCH_DESKS = "com.android.window.flags.keyboard_shortcuts_to_switch_desks"; /** @hide */ + public static final String FLAG_KEYGUARD_GOING_AWAY_TIMEOUT = "com.android.window.flags.keyguard_going_away_timeout"; + /** @hide */ public static final String FLAG_LETTERBOX_BACKGROUND_WALLPAPER = "com.android.window.flags.letterbox_background_wallpaper"; /** @hide */ public static final String FLAG_MOVABLE_CUTOUT_CONFIGURATION = "com.android.window.flags.movable_cutout_configuration"; @@ -468,12 +398,16 @@ public final class Flags { /** @hide */ public static final String FLAG_NAV_BAR_TRANSPARENT_BY_DEFAULT = "com.android.window.flags.nav_bar_transparent_by_default"; /** @hide */ - public static final String FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS_BUGFIX = "com.android.window.flags.nested_tasks_with_independent_bounds_bugfix"; + public static final String FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS = "com.android.window.flags.nested_tasks_with_independent_bounds"; + /** @hide */ + public static final String FLAG_NO_CONSECUTIVE_VISIBILITY_EVENTS = "com.android.window.flags.no_consecutive_visibility_events"; + /** @hide */ + public static final String FLAG_NO_DUPLICATE_SURFACE_DESTROYED_EVENTS = "com.android.window.flags.no_duplicate_surface_destroyed_events"; + /** @hide */ + public static final String FLAG_NO_VISIBILITY_EVENT_ON_DISPLAY_STATE_CHANGE = "com.android.window.flags.no_visibility_event_on_display_state_change"; /** @hide */ public static final String FLAG_OFFLOAD_COLOR_EXTRACTION = "com.android.window.flags.offload_color_extraction"; /** @hide */ - public static final String FLAG_PARALLEL_CD_TRANSITIONS_DURING_RECENTS = "com.android.window.flags.parallel_cd_transitions_during_recents"; - /** @hide */ public static final String FLAG_PORT_WINDOW_SIZE_ANIMATION = "com.android.window.flags.port_window_size_animation"; /** @hide */ public static final String FLAG_PREDICTIVE_BACK_DEFAULT_ENABLE_SDK_36 = "com.android.window.flags.predictive_back_default_enable_sdk_36"; @@ -488,44 +422,38 @@ public final class Flags { /** @hide */ public static final String FLAG_PREDICTIVE_BACK_TIMESTAMP_API = "com.android.window.flags.predictive_back_timestamp_api"; /** @hide */ - public static final String FLAG_PRESERVE_RECENTS_TASK_CONFIGURATION_ON_RELAUNCH = "com.android.window.flags.preserve_recents_task_configuration_on_relaunch"; + public static final String FLAG_PROCESS_PRIORITY_POLICY_FOR_MULTI_WINDOW_MODE = "com.android.window.flags.process_priority_policy_for_multi_window_mode"; /** @hide */ public static final String FLAG_REAR_DISPLAY_DISABLE_FORCE_DESKTOP_SYSTEM_DECORATIONS = "com.android.window.flags.rear_display_disable_force_desktop_system_decorations"; /** @hide */ + public static final String FLAG_RECORD_TASK_SNAPSHOTS_BEFORE_SHUTDOWN = "com.android.window.flags.record_task_snapshots_before_shutdown"; + /** @hide */ public static final String FLAG_REDUCE_CHANGED_EXCLUSION_RECTS_MSGS = "com.android.window.flags.reduce_changed_exclusion_rects_msgs"; /** @hide */ + public static final String FLAG_REDUCE_KEYGUARD_TRANSITIONS = "com.android.window.flags.reduce_keyguard_transitions"; + /** @hide */ public static final String FLAG_REDUCE_TASK_SNAPSHOT_MEMORY_USAGE = "com.android.window.flags.reduce_task_snapshot_memory_usage"; /** @hide */ + public static final String FLAG_REDUCE_UNNECESSARY_MEASURE = "com.android.window.flags.reduce_unnecessary_measure"; + /** @hide */ public static final String FLAG_RELATIVE_INSETS = "com.android.window.flags.relative_insets"; /** @hide */ public static final String FLAG_RELEASE_SNAPSHOT_AGGRESSIVELY = "com.android.window.flags.release_snapshot_aggressively"; /** @hide */ - public static final String FLAG_RELEASE_SURFACE_ON_TRANSITION_FINISH = "com.android.window.flags.release_surface_on_transition_finish"; + public static final String FLAG_RELEASE_USER_ASPECT_RATIO_WM = "com.android.window.flags.release_user_aspect_ratio_wm"; /** @hide */ public static final String FLAG_REMOVE_ACTIVITY_STARTER_DREAM_CALLBACK = "com.android.window.flags.remove_activity_starter_dream_callback"; /** @hide */ + public static final String FLAG_REMOVE_DEFER_HIDING_CLIENT = "com.android.window.flags.remove_defer_hiding_client"; + /** @hide */ public static final String FLAG_REMOVE_DEPART_TARGET_FROM_MOTION = "com.android.window.flags.remove_depart_target_from_motion"; /** @hide */ - public static final String FLAG_REMOVE_STARTING_IN_TRANSITION = "com.android.window.flags.remove_starting_in_transition"; - /** @hide */ - public static final String FLAG_REPARENT_TO_DEFAULT_WITH_DISPLAY_REMOVAL = "com.android.window.flags.reparent_to_default_with_display_removal"; - /** @hide */ public static final String FLAG_REPARENT_WINDOW_TOKEN_API = "com.android.window.flags.reparent_window_token_api"; /** @hide */ - public static final String FLAG_RESPECT_FULLSCREEN_ACTIVITY_OPTION_IN_DESKTOP_LAUNCH_PARAMS = "com.android.window.flags.respect_fullscreen_activity_option_in_desktop_launch_params"; - /** @hide */ - public static final String FLAG_RESPECT_HIERARCHY_SURFACE_VISIBILITY = "com.android.window.flags.respect_hierarchy_surface_visibility"; - /** @hide */ - public static final String FLAG_RESPECT_LEAF_TASK_BOUNDS = "com.android.window.flags.respect_leaf_task_bounds"; + public static final String FLAG_RESPECT_NON_TOP_VISIBLE_FIXED_ORIENTATION = "com.android.window.flags.respect_non_top_visible_fixed_orientation"; /** @hide */ public static final String FLAG_RESPECT_ORIENTATION_CHANGE_FOR_UNRESIZEABLE = "com.android.window.flags.respect_orientation_change_for_unresizeable"; /** @hide */ - public static final String FLAG_RESTORE_USER_ASPECT_RATIO_SETTINGS_USING_SERVICE = "com.android.window.flags.restore_user_aspect_ratio_settings_using_service"; - /** @hide */ - public static final String FLAG_RESTRICT_FREEFORM_HIDDEN_SYSTEM_BARS_TO_FILLING_TASKS = "com.android.window.flags.restrict_freeform_hidden_system_bars_to_filling_tasks"; - /** @hide */ - public static final String FLAG_ROOT_TASK_FOR_BUBBLE = "com.android.window.flags.root_task_for_bubble"; - /** @hide */ public static final String FLAG_SAFE_REGION_LETTERBOXING = "com.android.window.flags.safe_region_letterboxing"; /** @hide */ public static final String FLAG_SAFE_RELEASE_SNAPSHOT_AGGRESSIVELY = "com.android.window.flags.safe_release_snapshot_aggressively"; @@ -534,14 +462,10 @@ public final class Flags { /** @hide */ public static final String FLAG_SCRAMBLE_SNAPSHOT_FILE_NAME = "com.android.window.flags.scramble_snapshot_file_name"; /** @hide */ - public static final String FLAG_SCREEN_BRIGHTNESS_DIM_ON_EMULATOR = "com.android.window.flags.screen_brightness_dim_on_emulator"; - /** @hide */ public static final String FLAG_SCREEN_RECORDING_CALLBACKS = "com.android.window.flags.screen_recording_callbacks"; /** @hide */ public static final String FLAG_SCROLLING_FROM_LETTERBOX = "com.android.window.flags.scrolling_from_letterbox"; /** @hide */ - public static final String FLAG_SCVH_SURFACE_CONTROL_LIFETIME_FIX = "com.android.window.flags.scvh_surface_control_lifetime_fix"; - /** @hide */ public static final String FLAG_SDK_DESIRED_PRESENT_TIME = "com.android.window.flags.sdk_desired_present_time"; /** @hide */ public static final String FLAG_SET_SC_PROPERTIES_IN_CLIENT = "com.android.window.flags.set_sc_properties_in_client"; @@ -556,11 +480,9 @@ public final class Flags { /** @hide */ public static final String FLAG_SKIP_COMPAT_UI_EDUCATION_IN_DESKTOP_MODE = "com.android.window.flags.skip_compat_ui_education_in_desktop_mode"; /** @hide */ - public static final String FLAG_SKIP_DEACTIVATION_OF_DESK_WITH_NOTHING_IN_FRONT = "com.android.window.flags.skip_deactivation_of_desk_with_nothing_in_front"; - /** @hide */ public static final String FLAG_SKIP_DECOR_VIEW_RELAYOUT_WHEN_CLOSING_BUGFIX = "com.android.window.flags.skip_decor_view_relayout_when_closing_bugfix"; /** @hide */ - public static final String FLAG_SPLASH_SCREEN_VIEW_SYNC_TRANSACTION = "com.android.window.flags.splash_screen_view_sync_transaction"; + public static final String FLAG_SUPPORT_WIDGET_INTENTS_ON_CONNECTED_DISPLAY = "com.android.window.flags.support_widget_intents_on_connected_display"; /** @hide */ public static final String FLAG_SUPPORTS_DRAG_ASSISTANT_TO_MULTIWINDOW = "com.android.window.flags.supports_drag_assistant_to_multiwindow"; /** @hide */ @@ -574,20 +496,20 @@ public final class Flags { /** @hide */ public static final String FLAG_SYSTEM_UI_POST_ANIMATION_END = "com.android.window.flags.system_ui_post_animation_end"; /** @hide */ + public static final String FLAG_TASK_FRAGMENT_SYSTEM_ORGANIZER_FLAG = "com.android.window.flags.task_fragment_system_organizer_flag"; + /** @hide */ public static final String FLAG_TOUCH_PASS_THROUGH_OPT_IN = "com.android.window.flags.touch_pass_through_opt_in"; /** @hide */ + public static final String FLAG_TRACK_SYSTEM_UI_CONTEXT_BEFORE_WMS = "com.android.window.flags.track_system_ui_context_before_wms"; + /** @hide */ public static final String FLAG_TRANSIT_READY_TRACKING = "com.android.window.flags.transit_ready_tracking"; /** @hide */ public static final String FLAG_TRANSIT_TRACKER_PLUMBING = "com.android.window.flags.transit_tracker_plumbing"; /** @hide */ - public static final String FLAG_TRANSITION_HANDLER_CUJ_TAGS = "com.android.window.flags.transition_handler_cuj_tags"; - /** @hide */ public static final String FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW = "com.android.window.flags.trusted_presentation_listener_for_window"; /** @hide */ public static final String FLAG_UNIFY_BACK_NAVIGATION_TRANSITION = "com.android.window.flags.unify_back_navigation_transition"; /** @hide */ - public static final String FLAG_UNIFY_SHELL_BINDERS = "com.android.window.flags.unify_shell_binders"; - /** @hide */ public static final String FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT = "com.android.window.flags.universal_resizable_by_default"; /** @hide */ public static final String FLAG_UNTRUSTED_EMBEDDING_ANY_APP_PERMISSION = "com.android.window.flags.untrusted_embedding_any_app_permission"; @@ -596,14 +518,16 @@ public final class Flags { /** @hide */ public static final String FLAG_UPDATE_DIMS_WHEN_WINDOW_SHOWN = "com.android.window.flags.update_dims_when_window_shown"; /** @hide */ - public static final String FLAG_UPDATE_HOST_INPUT_TRANSFER_TOKEN = "com.android.window.flags.update_host_input_transfer_token"; - /** @hide */ - public static final String FLAG_UPDATE_TASK_MIN_DIMENSIONS_WITH_ROOT_ACTIVITY = "com.android.window.flags.update_task_min_dimensions_with_root_activity"; - /** @hide */ public static final String FLAG_USE_CACHED_INSETS_FOR_DISPLAY_SWITCH = "com.android.window.flags.use_cached_insets_for_display_switch"; /** @hide */ + public static final String FLAG_USE_RT_FRAME_CALLBACK_FOR_SPLASH_SCREEN_TRANSFER = "com.android.window.flags.use_rt_frame_callback_for_splash_screen_transfer"; + /** @hide */ public static final String FLAG_USE_TASKS_DIM_ONLY = "com.android.window.flags.use_tasks_dim_only"; /** @hide */ + public static final String FLAG_USE_VISIBLE_REQUESTED_FOR_PROCESS_TRACKER = "com.android.window.flags.use_visible_requested_for_process_tracker"; + /** @hide */ + public static final String FLAG_USE_WINDOW_ORIGINAL_TOUCHABLE_REGION_WHEN_MAGNIFICATION_RECOMPUTE_BOUNDS = "com.android.window.flags.use_window_original_touchable_region_when_magnification_recompute_bounds"; + /** @hide */ public static final String FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API = "com.android.window.flags.vdm_force_app_universal_resizable_api"; /** @hide */ public static final String FLAG_WALLPAPER_OFFSET_ASYNC = "com.android.window.flags.wallpaper_offset_async"; @@ -611,54 +535,75 @@ public final class Flags { public static final String FLAG_WLINFO_ONCREATE = "com.android.window.flags.wlinfo_oncreate"; + public static boolean actionModeEdgeToEdge() { return FEATURE_FLAGS.actionModeEdgeToEdge(); } + + + public static boolean activityEmbeddingAnimationCustomizationFlag() { + + return FEATURE_FLAGS.activityEmbeddingAnimationCustomizationFlag(); + } + + + public static boolean activityEmbeddingDelayTaskFragmentFinishForActivityLaunch() { return FEATURE_FLAGS.activityEmbeddingDelayTaskFragmentFinishForActivityLaunch(); } + public static boolean activityEmbeddingInteractiveDividerFlag() { return FEATURE_FLAGS.activityEmbeddingInteractiveDividerFlag(); } + + public static boolean activityEmbeddingMetrics() { return FEATURE_FLAGS.activityEmbeddingMetrics(); } + + public static boolean activityEmbeddingSupportForConnectedDisplays() { return FEATURE_FLAGS.activityEmbeddingSupportForConnectedDisplays(); } + public static boolean allowDisableActivityRecordInputSink() { return FEATURE_FLAGS.allowDisableActivityRecordInputSink(); } + + public static boolean allowHideScmButton() { + + return FEATURE_FLAGS.allowHideScmButton(); + } + + + public static boolean allowsScreenSizeDecoupledFromStatusBarAndCutout() { return FEATURE_FLAGS.allowsScreenSizeDecoupledFromStatusBarAndCutout(); } + public static boolean alwaysDrawMagnificationFullscreenBorder() { return FEATURE_FLAGS.alwaysDrawMagnificationFullscreenBorder(); } - public static boolean alwaysSeqIdLayout() { - - return FEATURE_FLAGS.alwaysSeqIdLayout(); - } public static boolean alwaysUpdateWallpaperPermission() { @@ -666,79 +611,90 @@ public final class Flags { return FEATURE_FLAGS.alwaysUpdateWallpaperPermission(); } + + public static boolean aodTransition() { return FEATURE_FLAGS.aodTransition(); } + + public static boolean appCompatAsyncRelayout() { return FEATURE_FLAGS.appCompatAsyncRelayout(); } + public static boolean appCompatPropertiesApi() { return FEATURE_FLAGS.appCompatPropertiesApi(); } + + public static boolean appCompatRefactoring() { return FEATURE_FLAGS.appCompatRefactoring(); } - public static boolean appCompatRefactoringRoundedCorners() { - - return FEATURE_FLAGS.appCompatRefactoringRoundedCorners(); - } + public static boolean appCompatUiFramework() { return FEATURE_FLAGS.appCompatUiFramework(); } + + public static boolean appHandleNoRelayoutOnExclusionChange() { return FEATURE_FLAGS.appHandleNoRelayoutOnExclusionChange(); } + + public static boolean applyLifecycleOnPipChange() { return FEATURE_FLAGS.applyLifecycleOnPipChange(); } + public static boolean avoidRebindingIntentionallyDisconnectedWallpaper() { return FEATURE_FLAGS.avoidRebindingIntentionallyDisconnectedWallpaper(); } + public static boolean backupAndRestoreForUserAspectRatioSettings() { return FEATURE_FLAGS.backupAndRestoreForUserAspectRatioSettings(); } + + public static boolean balAdditionalLogging() { return FEATURE_FLAGS.balAdditionalLogging(); } + public static boolean balAdditionalStartModes() { return FEATURE_FLAGS.balAdditionalStartModes(); } + + public static boolean balClearAllowlistDuration() { return FEATURE_FLAGS.balClearAllowlistDuration(); } - public static boolean balCoverIntentSender() { - - return FEATURE_FLAGS.balCoverIntentSender(); - } public static boolean balDontBringExistingBackgroundTaskStackToFg() { @@ -746,128 +702,237 @@ public final class Flags { return FEATURE_FLAGS.balDontBringExistingBackgroundTaskStackToFg(); } + + + public static boolean balImproveRealCallerVisibilityCheck() { + + return FEATURE_FLAGS.balImproveRealCallerVisibilityCheck(); + } + + + + public static boolean balImprovedMetrics() { + + return FEATURE_FLAGS.balImprovedMetrics(); + } + + + public static boolean balReduceGracePeriod() { return FEATURE_FLAGS.balReduceGracePeriod(); } + + public static boolean balRequireOptInByPendingIntentCreator() { + + return FEATURE_FLAGS.balRequireOptInByPendingIntentCreator(); + } + + + public static boolean balRespectAppSwitchStateWhenCheckBoundByForegroundUid() { return FEATURE_FLAGS.balRespectAppSwitchStateWhenCheckBoundByForegroundUid(); } + public static boolean balSendIntentWithOptions() { return FEATURE_FLAGS.balSendIntentWithOptions(); } + + public static boolean balShowToastsBlocked() { return FEATURE_FLAGS.balShowToastsBlocked(); } + public static boolean balStrictModeGracePeriod() { return FEATURE_FLAGS.balStrictModeGracePeriod(); } + public static boolean balStrictModeRo() { return FEATURE_FLAGS.balStrictModeRo(); } + public static boolean betterSupportNonMatchParentActivity() { return FEATURE_FLAGS.betterSupportNonMatchParentActivity(); } + + + public static boolean cacheWindowStyle() { + + return FEATURE_FLAGS.cacheWindowStyle(); + } + + + public static boolean cameraCompatForFreeform() { return FEATURE_FLAGS.cameraCompatForFreeform(); } + + public static boolean cameraCompatFullscreenPickSameTaskActivity() { return FEATURE_FLAGS.cameraCompatFullscreenPickSameTaskActivity(); } + + + public static boolean checkDisabledSnapshotsInTaskPersister() { + + return FEATURE_FLAGS.checkDisabledSnapshotsInTaskPersister(); + } + + + + public static boolean cleanupDispatchPendingTransactionsRemoteException() { + + return FEATURE_FLAGS.cleanupDispatchPendingTransactionsRemoteException(); + } + + + + public static boolean clearSystemVibrator() { + + return FEATURE_FLAGS.clearSystemVibrator(); + } + + + public static boolean closeToSquareConfigIncludesStatusBar() { return FEATURE_FLAGS.closeToSquareConfigIncludesStatusBar(); } + + public static boolean condenseConfigurationChangeForSimpleMode() { + + return FEATURE_FLAGS.condenseConfigurationChangeForSimpleMode(); + } + + + + public static boolean configurableFontScaleDefault() { + + return FEATURE_FLAGS.configurableFontScaleDefault(); + } + + + public static boolean coverDisplayOptIn() { return FEATURE_FLAGS.coverDisplayOptIn(); } - public static boolean currentAnimatorScaleUsesSharedMemory() { + + + public static boolean delayNotificationToMagnificationWhenRecentsWindowToFrontTransition() { - return FEATURE_FLAGS.currentAnimatorScaleUsesSharedMemory(); + return FEATURE_FLAGS.delayNotificationToMagnificationWhenRecentsWindowToFrontTransition(); } - public static boolean defaultDeskWithoutWarmupMigration() { + + + public static boolean delegateBackGestureToShell() { - return FEATURE_FLAGS.defaultDeskWithoutWarmupMigration(); + return FEATURE_FLAGS.delegateBackGestureToShell(); } + public static boolean delegateUnhandledDrags() { return FEATURE_FLAGS.delegateUnhandledDrags(); } + + public static boolean deleteCaptureDisplay() { + + return FEATURE_FLAGS.deleteCaptureDisplay(); + } + + + public static boolean density390Api() { return FEATURE_FLAGS.density390Api(); } + public static boolean disableDesktopLaunchParamsOutsideDesktopBugFix() { return FEATURE_FLAGS.disableDesktopLaunchParamsOutsideDesktopBugFix(); } + public static boolean disableNonResizableAppSnapResizing() { return FEATURE_FLAGS.disableNonResizableAppSnapResizing(); } + public static boolean disableOptOutEdgeToEdge() { return FEATURE_FLAGS.disableOptOutEdgeToEdge(); } - public static boolean dispatchFirstKeyguardLockedState() { + + public static boolean doNotCheckIntersectionWhenNonMagnifiableWindowTransitions() { - return FEATURE_FLAGS.dispatchFirstKeyguardLockedState(); + return FEATURE_FLAGS.doNotCheckIntersectionWhenNonMagnifiableWindowTransitions(); } + + public static boolean earlyLaunchHint() { + + return FEATURE_FLAGS.earlyLaunchHint(); + } + + + + public static boolean edgeToEdgeByDefault() { + + return FEATURE_FLAGS.edgeToEdgeByDefault(); + } + + + public static boolean enableAccessibleCustomHeaders() { return FEATURE_FLAGS.enableAccessibleCustomHeaders(); } + + public static boolean enableActivityEmbeddingSupportForConnectedDisplays() { return FEATURE_FLAGS.enableActivityEmbeddingSupportForConnectedDisplays(); } - public static boolean enableAppHandlePositionReporting() { - - return FEATURE_FLAGS.enableAppHandlePositionReporting(); - } public static boolean enableAppHeaderWithTaskDensity() { @@ -875,30 +940,27 @@ public final class Flags { return FEATURE_FLAGS.enableAppHeaderWithTaskDensity(); } - public static boolean enableBlockNonDesktopDisplayWindowDragBugfix() { - - return FEATURE_FLAGS.enableBlockNonDesktopDisplayWindowDragBugfix(); - } + public static boolean enableBorderSettings() { return FEATURE_FLAGS.enableBorderSettings(); } - public static boolean enableBoxShadowSettings() { + + + public static boolean enableBufferTransformHintFromDisplay() { - return FEATURE_FLAGS.enableBoxShadowSettings(); + return FEATURE_FLAGS.enableBufferTransformHintFromDisplay(); } + + public static boolean enableBugFixesForSecondaryDisplay() { return FEATURE_FLAGS.enableBugFixesForSecondaryDisplay(); } - public static boolean enableCameraCompatCheckDeviceRotationBugfix() { - - return FEATURE_FLAGS.enableCameraCompatCheckDeviceRotationBugfix(); - } public static boolean enableCameraCompatForDesktopWindowing() { @@ -907,48 +969,54 @@ public final class Flags { } + public static boolean enableCameraCompatForDesktopWindowingOptOut() { return FEATURE_FLAGS.enableCameraCompatForDesktopWindowingOptOut(); } + + public static boolean enableCameraCompatForDesktopWindowingOptOutApi() { return FEATURE_FLAGS.enableCameraCompatForDesktopWindowingOptOutApi(); } + + public static boolean enableCameraCompatTrackTaskAndAppBugfix() { return FEATURE_FLAGS.enableCameraCompatTrackTaskAndAppBugfix(); } + + public static boolean enableCaptionCompatInsetConversion() { return FEATURE_FLAGS.enableCaptionCompatInsetConversion(); } + public static boolean enableCaptionCompatInsetForceConsumption() { return FEATURE_FLAGS.enableCaptionCompatInsetForceConsumption(); } + public static boolean enableCaptionCompatInsetForceConsumptionAlways() { return FEATURE_FLAGS.enableCaptionCompatInsetForceConsumptionAlways(); } + public static boolean enableCascadingWindows() { return FEATURE_FLAGS.enableCascadingWindows(); } - public static boolean enableCloseLidInteraction() { - - return FEATURE_FLAGS.enableCloseLidInteraction(); - } public static boolean enableCompatUiVisibilityStatus() { @@ -956,36 +1024,42 @@ public final class Flags { return FEATURE_FLAGS.enableCompatUiVisibilityStatus(); } + + public static boolean enableCompatuiSysuiLauncher() { return FEATURE_FLAGS.enableCompatuiSysuiLauncher(); } + + public static boolean enableConnectedDisplaysDnd() { return FEATURE_FLAGS.enableConnectedDisplaysDnd(); } + + public static boolean enableConnectedDisplaysPip() { return FEATURE_FLAGS.enableConnectedDisplaysPip(); } + + public static boolean enableConnectedDisplaysWindowDrag() { return FEATURE_FLAGS.enableConnectedDisplaysWindowDrag(); } + public static boolean enableDesktopAppHandleAnimation() { return FEATURE_FLAGS.enableDesktopAppHandleAnimation(); } - public static boolean enableDesktopAppHeaderStateChangeAnnouncements() { - - return FEATURE_FLAGS.enableDesktopAppHeaderStateChangeAnnouncements(); - } + public static boolean enableDesktopAppLaunchAlttabTransitions() { @@ -993,15 +1067,13 @@ public final class Flags { } + public static boolean enableDesktopAppLaunchAlttabTransitionsBugfix() { return FEATURE_FLAGS.enableDesktopAppLaunchAlttabTransitionsBugfix(); } - public static boolean enableDesktopAppLaunchBugfix() { - - return FEATURE_FLAGS.enableDesktopAppLaunchBugfix(); - } + public static boolean enableDesktopAppLaunchTransitions() { @@ -1009,40 +1081,27 @@ public final class Flags { } + public static boolean enableDesktopAppLaunchTransitionsBugfix() { return FEATURE_FLAGS.enableDesktopAppLaunchTransitionsBugfix(); } + + public static boolean enableDesktopCloseShortcutBugfix() { return FEATURE_FLAGS.enableDesktopCloseShortcutBugfix(); } + + public static boolean enableDesktopCloseTaskAnimationInDtcBugfix() { return FEATURE_FLAGS.enableDesktopCloseTaskAnimationInDtcBugfix(); } - public static boolean enableDesktopFirstBasedDefaultToDesktopBugfix() { - - return FEATURE_FLAGS.enableDesktopFirstBasedDefaultToDesktopBugfix(); - } - public static boolean enableDesktopFirstBasedDragToMaximize() { - - return FEATURE_FLAGS.enableDesktopFirstBasedDragToMaximize(); - } - - public static boolean enableDesktopFirstFullscreenRefocusBugfix() { - - return FEATURE_FLAGS.enableDesktopFirstFullscreenRefocusBugfix(); - } - - public static boolean enableDesktopFirstListener() { - - return FEATURE_FLAGS.enableDesktopFirstListener(); - } public static boolean enableDesktopImeBugfix() { @@ -1050,49 +1109,54 @@ public final class Flags { } + public static boolean enableDesktopImmersiveDragBugfix() { return FEATURE_FLAGS.enableDesktopImmersiveDragBugfix(); } + public static boolean enableDesktopIndicatorInSeparateThreadBugfix() { return FEATURE_FLAGS.enableDesktopIndicatorInSeparateThreadBugfix(); } + + public static boolean enableDesktopModeThroughDevOption() { return FEATURE_FLAGS.enableDesktopModeThroughDevOption(); } + public static boolean enableDesktopOpeningDeeplinkMinimizeAnimationBugfix() { return FEATURE_FLAGS.enableDesktopOpeningDeeplinkMinimizeAnimationBugfix(); } + public static boolean enableDesktopRecentsTransitionsCornersBugfix() { return FEATURE_FLAGS.enableDesktopRecentsTransitionsCornersBugfix(); } - public static boolean enableDesktopSplitscreenTransitionBugfix() { + + + public static boolean enableDesktopSwipeBackMinimizeAnimationBugfix() { - return FEATURE_FLAGS.enableDesktopSplitscreenTransitionBugfix(); + return FEATURE_FLAGS.enableDesktopSwipeBackMinimizeAnimationBugfix(); } + public static boolean enableDesktopSystemDialogsTransitions() { return FEATURE_FLAGS.enableDesktopSystemDialogsTransitions(); } - public static boolean enableDesktopTabTearingLaunchAnimation() { - - return FEATURE_FLAGS.enableDesktopTabTearingLaunchAnimation(); - } public static boolean enableDesktopTabTearingMinimizeAnimationBugfix() { @@ -1100,10 +1164,7 @@ public final class Flags { return FEATURE_FLAGS.enableDesktopTabTearingMinimizeAnimationBugfix(); } - public static boolean enableDesktopTaskLimitSeparateTransition() { - - return FEATURE_FLAGS.enableDesktopTaskLimitSeparateTransition(); - } + public static boolean enableDesktopTaskbarOnFreeformDisplays() { @@ -1111,118 +1172,138 @@ public final class Flags { } + public static boolean enableDesktopTrampolineCloseAnimationBugfix() { return FEATURE_FLAGS.enableDesktopTrampolineCloseAnimationBugfix(); } + public static boolean enableDesktopWallpaperActivityForSystemUser() { return FEATURE_FLAGS.enableDesktopWallpaperActivityForSystemUser(); } + + public static boolean enableDesktopWindowingAppHandleEducation() { return FEATURE_FLAGS.enableDesktopWindowingAppHandleEducation(); } + public static boolean enableDesktopWindowingAppToWeb() { return FEATURE_FLAGS.enableDesktopWindowingAppToWeb(); } + public static boolean enableDesktopWindowingAppToWebEducation() { return FEATURE_FLAGS.enableDesktopWindowingAppToWebEducation(); } + + public static boolean enableDesktopWindowingAppToWebEducationIntegration() { return FEATURE_FLAGS.enableDesktopWindowingAppToWebEducationIntegration(); } + public static boolean enableDesktopWindowingBackNavigation() { return FEATURE_FLAGS.enableDesktopWindowingBackNavigation(); } + public static boolean enableDesktopWindowingEnterTransitionBugfix() { return FEATURE_FLAGS.enableDesktopWindowingEnterTransitionBugfix(); } + + public static boolean enableDesktopWindowingEnterTransitions() { return FEATURE_FLAGS.enableDesktopWindowingEnterTransitions(); } + public static boolean enableDesktopWindowingExitByMinimizeTransitionBugfix() { return FEATURE_FLAGS.enableDesktopWindowingExitByMinimizeTransitionBugfix(); } + + public static boolean enableDesktopWindowingExitTransitions() { return FEATURE_FLAGS.enableDesktopWindowingExitTransitions(); } + public static boolean enableDesktopWindowingExitTransitionsBugfix() { return FEATURE_FLAGS.enableDesktopWindowingExitTransitionsBugfix(); } + public static boolean enableDesktopWindowingHsum() { return FEATURE_FLAGS.enableDesktopWindowingHsum(); } + public static boolean enableDesktopWindowingImmersiveHandleHiding() { return FEATURE_FLAGS.enableDesktopWindowingImmersiveHandleHiding(); } + public static boolean enableDesktopWindowingModalsPolicy() { return FEATURE_FLAGS.enableDesktopWindowingModalsPolicy(); } + public static boolean enableDesktopWindowingMode() { return FEATURE_FLAGS.enableDesktopWindowingMode(); } + public static boolean enableDesktopWindowingMultiInstanceFeatures() { return FEATURE_FLAGS.enableDesktopWindowingMultiInstanceFeatures(); } + public static boolean enableDesktopWindowingPersistence() { return FEATURE_FLAGS.enableDesktopWindowingPersistence(); } + + public static boolean enableDesktopWindowingPip() { return FEATURE_FLAGS.enableDesktopWindowingPip(); } - public static boolean enableDesktopWindowingPipInOverviewBugfix() { - - return FEATURE_FLAGS.enableDesktopWindowingPipInOverviewBugfix(); - } public static boolean enableDesktopWindowingQuickSwitch() { @@ -1231,122 +1312,117 @@ public final class Flags { } + public static boolean enableDesktopWindowingScvhCacheBugFix() { return FEATURE_FLAGS.enableDesktopWindowingScvhCacheBugFix(); } + public static boolean enableDesktopWindowingSizeConstraints() { return FEATURE_FLAGS.enableDesktopWindowingSizeConstraints(); } + public static boolean enableDesktopWindowingTaskLimit() { return FEATURE_FLAGS.enableDesktopWindowingTaskLimit(); } + public static boolean enableDesktopWindowingTaskbarRunningApps() { return FEATURE_FLAGS.enableDesktopWindowingTaskbarRunningApps(); } + + public static boolean enableDesktopWindowingTransitions() { return FEATURE_FLAGS.enableDesktopWindowingTransitions(); } + public static boolean enableDesktopWindowingWallpaperActivity() { return FEATURE_FLAGS.enableDesktopWindowingWallpaperActivity(); } + + public static boolean enableDeviceStateAutoRotateSettingLogging() { return FEATURE_FLAGS.enableDeviceStateAutoRotateSettingLogging(); } + public static boolean enableDeviceStateAutoRotateSettingRefactor() { return FEATURE_FLAGS.enableDeviceStateAutoRotateSettingRefactor(); } - public static boolean enableDisplayCompatMode() { - - return FEATURE_FLAGS.enableDisplayCompatMode(); - } + public static boolean enableDisplayDisconnectInteraction() { return FEATURE_FLAGS.enableDisplayDisconnectInteraction(); } + + public static boolean enableDisplayFocusInShellTransitions() { return FEATURE_FLAGS.enableDisplayFocusInShellTransitions(); } + + public static boolean enableDisplayReconnectInteraction() { return FEATURE_FLAGS.enableDisplayReconnectInteraction(); } + + public static boolean enableDisplayWindowingModeSwitching() { return FEATURE_FLAGS.enableDisplayWindowingModeSwitching(); } + public static boolean enableDragResizeSetUpInBgThread() { return FEATURE_FLAGS.enableDragResizeSetUpInBgThread(); } + public static boolean enableDragToDesktopIncomingTransitionsBugfix() { return FEATURE_FLAGS.enableDragToDesktopIncomingTransitionsBugfix(); } + + public static boolean enableDragToMaximize() { return FEATURE_FLAGS.enableDragToMaximize(); } - public static boolean enableDraggingPipAcrossDisplays() { - - return FEATURE_FLAGS.enableDraggingPipAcrossDisplays(); - } + public static boolean enableDynamicRadiusComputationBugfix() { return FEATURE_FLAGS.enableDynamicRadiusComputationBugfix(); } - public static boolean enableEmptyDeskOnMinimize() { - - return FEATURE_FLAGS.enableEmptyDeskOnMinimize(); - } - - public static boolean enableExperimentalBubblesController() { - - return FEATURE_FLAGS.enableExperimentalBubblesController(); - } - - public static boolean enableFreeformBoxShadows() { - - return FEATURE_FLAGS.enableFreeformBoxShadows(); - } - - public static boolean enableFreeformDisplayLaunchParams() { - - return FEATURE_FLAGS.enableFreeformDisplayLaunchParams(); - } public static boolean enableFullScreenWindowOnRemovingSplitScreenStageBugfix() { @@ -1354,10 +1430,6 @@ public final class Flags { return FEATURE_FLAGS.enableFullScreenWindowOnRemovingSplitScreenStageBugfix(); } - public static boolean enableFullscreenWindowControls() { - - return FEATURE_FLAGS.enableFullscreenWindowControls(); - } public static boolean enableFullyImmersiveInDesktop() { @@ -1366,15 +1438,12 @@ public final class Flags { } + public static boolean enableHandleInputFix() { return FEATURE_FLAGS.enableHandleInputFix(); } - public static boolean enableHandlersDebuggingMode() { - - return FEATURE_FLAGS.enableHandlersDebuggingMode(); - } public static boolean enableHoldToDragAppHandle() { @@ -1382,15 +1451,6 @@ public final class Flags { return FEATURE_FLAGS.enableHoldToDragAppHandle(); } - public static boolean enableIndependentBackInProjected() { - - return FEATURE_FLAGS.enableIndependentBackInProjected(); - } - - public static boolean enableInorderTransitionCallbacksForDesktop() { - - return FEATURE_FLAGS.enableInorderTransitionCallbacksForDesktop(); - } public static boolean enableInputLayerTransitionFix() { @@ -1398,10 +1458,6 @@ public final class Flags { return FEATURE_FLAGS.enableInputLayerTransitionFix(); } - public static boolean enableKeyGestureHandlerForSysui() { - - return FEATURE_FLAGS.enableKeyGestureHandlerForSysui(); - } public static boolean enableMinimizeButton() { @@ -1410,41 +1466,41 @@ public final class Flags { } + public static boolean enableModalsFullscreenWithPermission() { return FEATURE_FLAGS.enableModalsFullscreenWithPermission(); } - public static boolean enableModalsFullscreenWithPlatformSignature() { - - return FEATURE_FLAGS.enableModalsFullscreenWithPlatformSignature(); - } public static boolean enableMoveToNextDisplayShortcut() { return FEATURE_FLAGS.enableMoveToNextDisplayShortcut(); } + + public static boolean enableMultiDisplaySplit() { return FEATURE_FLAGS.enableMultiDisplaySplit(); } + + public static boolean enableMultidisplayTrackpadBackGesture() { return FEATURE_FLAGS.enableMultidisplayTrackpadBackGesture(); } + + public static boolean enableMultipleDesktopsBackend() { return FEATURE_FLAGS.enableMultipleDesktopsBackend(); } - public static boolean enableMultipleDesktopsDefaultActivationInDesktopFirstDisplays() { - - return FEATURE_FLAGS.enableMultipleDesktopsDefaultActivationInDesktopFirstDisplays(); - } + public static boolean enableMultipleDesktopsFrontend() { @@ -1452,10 +1508,6 @@ public final class Flags { } - public static boolean enableNoWindowDecorationForDesks() { - - return FEATURE_FLAGS.enableNoWindowDecorationForDesks(); - } public static boolean enableNonDefaultDisplaySplit() { @@ -1463,21 +1515,13 @@ public final class Flags { } - public static boolean enableOmitAccelerometerRotationRestore() { - - return FEATURE_FLAGS.enableOmitAccelerometerRotationRestore(); - } - public static boolean enableOpaqueBackgroundForTransparentWindows() { return FEATURE_FLAGS.enableOpaqueBackgroundForTransparentWindows(); } - public static boolean enableOverflowButtonForTaskbarPinnedItems() { - - return FEATURE_FLAGS.enableOverflowButtonForTaskbarPinnedItems(); - } + public static boolean enablePerDisplayDesktopWallpaperActivity() { @@ -1485,41 +1529,40 @@ public final class Flags { } + public static boolean enablePerDisplayPackageContextCacheInStatusbarNotif() { return FEATURE_FLAGS.enablePerDisplayPackageContextCacheInStatusbarNotif(); } + + public static boolean enablePersistingDisplaySizeForConnectedDisplays() { return FEATURE_FLAGS.enablePersistingDisplaySizeForConnectedDisplays(); } - public static boolean enablePinningAppWithContextMenu() { - - return FEATURE_FLAGS.enablePinningAppWithContextMenu(); - } + public static boolean enablePresentationForConnectedDisplays() { return FEATURE_FLAGS.enablePresentationForConnectedDisplays(); } + + public static boolean enableProjectedDisplayDesktopMode() { return FEATURE_FLAGS.enableProjectedDisplayDesktopMode(); } + public static boolean enableQuickswitchDesktopSplitBugfix() { return FEATURE_FLAGS.enableQuickswitchDesktopSplitBugfix(); } - public static boolean enableRejectHomeTransition() { - - return FEATURE_FLAGS.enableRejectHomeTransition(); - } public static boolean enableRequestFullscreenBugfix() { @@ -1527,10 +1570,6 @@ public final class Flags { return FEATURE_FLAGS.enableRequestFullscreenBugfix(); } - public static boolean enableRequestFullscreenRefactor() { - - return FEATURE_FLAGS.enableRequestFullscreenRefactor(); - } public static boolean enableResizingMetrics() { @@ -1538,21 +1577,20 @@ public final class Flags { return FEATURE_FLAGS.enableResizingMetrics(); } + + public static boolean enableRestartMenuForConnectedDisplays() { return FEATURE_FLAGS.enableRestartMenuForConnectedDisplays(); } + public static boolean enableRestoreToPreviousSizeFromDesktopImmersive() { return FEATURE_FLAGS.enableRestoreToPreviousSizeFromDesktopImmersive(); } - public static boolean enableSeeThroughTaskFragments() { - - return FEATURE_FLAGS.enableSeeThroughTaskFragments(); - } public static boolean enableShellInitialBoundsRegressionBugFix() { @@ -1560,26 +1598,20 @@ public final class Flags { return FEATURE_FLAGS.enableShellInitialBoundsRegressionBugFix(); } + + public static boolean enableSizeCompatModeImprovementsForConnectedDisplays() { return FEATURE_FLAGS.enableSizeCompatModeImprovementsForConnectedDisplays(); } + public static boolean enableStartLaunchTransitionFromTaskbarBugfix() { return FEATURE_FLAGS.enableStartLaunchTransitionFromTaskbarBugfix(); } - public static boolean enableSysDecorsCallbacksViaWm() { - - return FEATURE_FLAGS.enableSysDecorsCallbacksViaWm(); - } - - public static boolean enableTallAppHeaders() { - - return FEATURE_FLAGS.enableTallAppHeaders(); - } public static boolean enableTaskResizingKeyboardShortcuts() { @@ -1588,26 +1620,26 @@ public final class Flags { } + public static boolean enableTaskStackObserverInShell() { return FEATURE_FLAGS.enableTaskStackObserverInShell(); } + + public static boolean enableTaskbarConnectedDisplays() { return FEATURE_FLAGS.enableTaskbarConnectedDisplays(); } + public static boolean enableTaskbarOverflow() { return FEATURE_FLAGS.enableTaskbarOverflow(); } - public static boolean enableTaskbarRecentTasksThrottleBugfix() { - - return FEATURE_FLAGS.enableTaskbarRecentTasksThrottleBugfix(); - } public static boolean enableTaskbarRecentsLayoutTransition() { @@ -1616,26 +1648,26 @@ public final class Flags { } + public static boolean enableThemedAppHeaders() { return FEATURE_FLAGS.enableThemedAppHeaders(); } + + public static boolean enableTileResizing() { return FEATURE_FLAGS.enableTileResizing(); } + public static boolean enableTopVisibleRootTaskPerUserTracking() { return FEATURE_FLAGS.enableTopVisibleRootTaskPerUserTracking(); } - public static boolean enableTransitionOnActivitySetRequestedOrientation() { - - return FEATURE_FLAGS.enableTransitionOnActivitySetRequestedOrientation(); - } public static boolean enableVisualIndicatorInTransitionBugfix() { @@ -1644,26 +1676,12 @@ public final class Flags { } - public static boolean enableWindowContextOverrideType() { - - return FEATURE_FLAGS.enableWindowContextOverrideType(); - } - public static boolean enableWindowContextResourcesUpdateOnConfigChange() { return FEATURE_FLAGS.enableWindowContextResourcesUpdateOnConfigChange(); } - public static boolean enableWindowDecorationRefactor() { - - return FEATURE_FLAGS.enableWindowDecorationRefactor(); - } - - public static boolean enableWindowRepositioningApi() { - - return FEATURE_FLAGS.enableWindowRepositioningApi(); - } public static boolean enableWindowingDynamicInitialBounds() { @@ -1672,21 +1690,20 @@ public final class Flags { } + public static boolean enableWindowingEdgeDragResize() { return FEATURE_FLAGS.enableWindowingEdgeDragResize(); } + public static boolean enableWindowingScaledResizing() { return FEATURE_FLAGS.enableWindowingScaledResizing(); } - public static boolean enableWindowingTaskStackOrderBugfix() { - - return FEATURE_FLAGS.enableWindowingTaskStackOrderBugfix(); - } + public static boolean enableWindowingTransitionHandlersObservers() { @@ -1694,36 +1711,54 @@ public final class Flags { } + public static boolean enforceEdgeToEdge() { return FEATURE_FLAGS.enforceEdgeToEdge(); } + + public static boolean ensureKeyguardDoesTransitionStarting() { return FEATURE_FLAGS.ensureKeyguardDoesTransitionStarting(); } + + + public static boolean ensureWallpaperInTransitions() { + + return FEATURE_FLAGS.ensureWallpaperInTransitions(); + } + + + + public static boolean ensureWallpaperInWearTransitions() { + + return FEATURE_FLAGS.ensureWallpaperInWearTransitions(); + } + + + public static boolean enterDesktopByDefaultOnFreeformDisplays() { return FEATURE_FLAGS.enterDesktopByDefaultOnFreeformDisplays(); } + public static boolean excludeCaptionFromAppBounds() { return FEATURE_FLAGS.excludeCaptionFromAppBounds(); } - public static boolean excludeDeskRootsFromDesktopTasks() { + + + public static boolean excludeDrawingAppThemeSnapshotFromLock() { - return FEATURE_FLAGS.excludeDeskRootsFromDesktopTasks(); + return FEATURE_FLAGS.excludeDrawingAppThemeSnapshotFromLock(); } - public static boolean excludeNonMainWindowFromSnapshot() { - - return FEATURE_FLAGS.excludeNonMainWindowFromSnapshot(); - } public static boolean excludeTaskFromRecents() { @@ -1731,25 +1766,13 @@ public final class Flags { return FEATURE_FLAGS.excludeTaskFromRecents(); } - public static boolean extendingPersistenceSnapshotQueueDepth() { - - return FEATURE_FLAGS.extendingPersistenceSnapshotQueueDepth(); - } - public static boolean fallbackToFocusedDisplay() { - - return FEATURE_FLAGS.fallbackToFocusedDisplay(); - } public static boolean fifoPriorityForMajorUiProcesses() { return FEATURE_FLAGS.fifoPriorityForMajorUiProcesses(); } - public static boolean fixFullscreenInMultiWindow() { - - return FEATURE_FLAGS.fixFullscreenInMultiWindow(); - } public static boolean fixHideOverlayApi() { @@ -1757,25 +1780,21 @@ public final class Flags { return FEATURE_FLAGS.fixHideOverlayApi(); } - public static boolean fixLayoutRestoredTask() { + + + public static boolean fixLayoutExistingTask() { - return FEATURE_FLAGS.fixLayoutRestoredTask(); + return FEATURE_FLAGS.fixLayoutExistingTask(); } - public static boolean fixMovingUnfocusedTask() { + + + public static boolean fixViewRootCallTrace() { - return FEATURE_FLAGS.fixMovingUnfocusedTask(); + return FEATURE_FLAGS.fixViewRootCallTrace(); } - public static boolean fixSetAdjacentTaskFragmentsWithParams() { - - return FEATURE_FLAGS.fixSetAdjacentTaskFragmentsWithParams(); - } - public static boolean fixShowWhenLockedSyncTimeout() { - - return FEATURE_FLAGS.fixShowWhenLockedSyncTimeout(); - } public static boolean forceCloseTopTransparentFullscreenTask() { @@ -1783,10 +1802,6 @@ public final class Flags { } - public static boolean forceShowSystemBarForBubble() { - - return FEATURE_FLAGS.forceShowSystemBarForBubble(); - } public static boolean formFactorBasedDesktopFirstSwitch() { @@ -1794,15 +1809,12 @@ public final class Flags { } + public static boolean getDimmerOnClosing() { return FEATURE_FLAGS.getDimmerOnClosing(); } - public static boolean grantManageKeyGesturesToRecents() { - - return FEATURE_FLAGS.grantManageKeyGesturesToRecents(); - } public static boolean ignoreAspectRatioRestrictionsForResizeableFreeformActivities() { @@ -1810,89 +1822,133 @@ public final class Flags { return FEATURE_FLAGS.ignoreAspectRatioRestrictionsForResizeableFreeformActivities(); } + + public static boolean ignoreCornerRadiusAndShadows() { return FEATURE_FLAGS.ignoreCornerRadiusAndShadows(); } + public static boolean includeTopTransparentFullscreenTaskInDesktopHeuristic() { return FEATURE_FLAGS.includeTopTransparentFullscreenTaskInDesktopHeuristic(); } + public static boolean inheritTaskBoundsForTrampolineTaskLaunches() { return FEATURE_FLAGS.inheritTaskBoundsForTrampolineTaskLaunches(); } + public static boolean insetsDecoupledConfiguration() { return FEATURE_FLAGS.insetsDecoupledConfiguration(); } - public static boolean interceptMotionFromMoveToCancel() { - - return FEATURE_FLAGS.interceptMotionFromMoveToCancel(); - } - public static boolean jankApi() { return FEATURE_FLAGS.jankApi(); } + + + public static boolean keepAppWindowHideWhileLocked() { + + return FEATURE_FLAGS.keepAppWindowHideWhileLocked(); + } + + + public static boolean keyboardShortcutsToSwitchDesks() { return FEATURE_FLAGS.keyboardShortcutsToSwitchDesks(); } + + + public static boolean keyguardGoingAwayTimeout() { + + return FEATURE_FLAGS.keyguardGoingAwayTimeout(); + } + + + public static boolean letterboxBackgroundWallpaper() { return FEATURE_FLAGS.letterboxBackgroundWallpaper(); } + public static boolean movableCutoutConfiguration() { return FEATURE_FLAGS.movableCutoutConfiguration(); } + + public static boolean moveToExternalDisplayShortcut() { return FEATURE_FLAGS.moveToExternalDisplayShortcut(); } + public static boolean multiCrop() { return FEATURE_FLAGS.multiCrop(); } + + public static boolean navBarTransparentByDefault() { return FEATURE_FLAGS.navBarTransparentByDefault(); } - public static boolean nestedTasksWithIndependentBoundsBugfix() { + + public static boolean nestedTasksWithIndependentBounds() { - return FEATURE_FLAGS.nestedTasksWithIndependentBoundsBugfix(); + return FEATURE_FLAGS.nestedTasksWithIndependentBounds(); } + + public static boolean noConsecutiveVisibilityEvents() { + + return FEATURE_FLAGS.noConsecutiveVisibilityEvents(); + } + + + + public static boolean noDuplicateSurfaceDestroyedEvents() { + + return FEATURE_FLAGS.noDuplicateSurfaceDestroyedEvents(); + } + + + + public static boolean noVisibilityEventOnDisplayStateChange() { + + return FEATURE_FLAGS.noVisibilityEventOnDisplayStateChange(); + } + + + public static boolean offloadColorExtraction() { return FEATURE_FLAGS.offloadColorExtraction(); } - public static boolean parallelCdTransitionsDuringRecents() { - - return FEATURE_FLAGS.parallelCdTransitionsDuringRecents(); - } + public static boolean portWindowSizeAnimation() { @@ -1900,123 +1956,152 @@ public final class Flags { } + public static boolean predictiveBackDefaultEnableSdk36() { return FEATURE_FLAGS.predictiveBackDefaultEnableSdk36(); } + public static boolean predictiveBackPrioritySystemNavigationObserver() { return FEATURE_FLAGS.predictiveBackPrioritySystemNavigationObserver(); } + public static boolean predictiveBackSwipeEdgeNoneApi() { return FEATURE_FLAGS.predictiveBackSwipeEdgeNoneApi(); } + public static boolean predictiveBackSystemOverrideCallback() { return FEATURE_FLAGS.predictiveBackSystemOverrideCallback(); } + public static boolean predictiveBackThreeButtonNav() { return FEATURE_FLAGS.predictiveBackThreeButtonNav(); } + public static boolean predictiveBackTimestampApi() { return FEATURE_FLAGS.predictiveBackTimestampApi(); } - public static boolean preserveRecentsTaskConfigurationOnRelaunch() { + + + public static boolean processPriorityPolicyForMultiWindowMode() { - return FEATURE_FLAGS.preserveRecentsTaskConfigurationOnRelaunch(); + return FEATURE_FLAGS.processPriorityPolicyForMultiWindowMode(); } + public static boolean rearDisplayDisableForceDesktopSystemDecorations() { return FEATURE_FLAGS.rearDisplayDisableForceDesktopSystemDecorations(); } + + + public static boolean recordTaskSnapshotsBeforeShutdown() { + + return FEATURE_FLAGS.recordTaskSnapshotsBeforeShutdown(); + } + + + public static boolean reduceChangedExclusionRectsMsgs() { return FEATURE_FLAGS.reduceChangedExclusionRectsMsgs(); } + + + public static boolean reduceKeyguardTransitions() { + + return FEATURE_FLAGS.reduceKeyguardTransitions(); + } + + + public static boolean reduceTaskSnapshotMemoryUsage() { return FEATURE_FLAGS.reduceTaskSnapshotMemoryUsage(); } + + + public static boolean reduceUnnecessaryMeasure() { + + return FEATURE_FLAGS.reduceUnnecessaryMeasure(); + } + + + public static boolean relativeInsets() { return FEATURE_FLAGS.relativeInsets(); } + public static boolean releaseSnapshotAggressively() { return FEATURE_FLAGS.releaseSnapshotAggressively(); } - public static boolean releaseSurfaceOnTransitionFinish() { + + public static boolean releaseUserAspectRatioWm() { - return FEATURE_FLAGS.releaseSurfaceOnTransitionFinish(); + return FEATURE_FLAGS.releaseUserAspectRatioWm(); } + + public static boolean removeActivityStarterDreamCallback() { return FEATURE_FLAGS.removeActivityStarterDreamCallback(); } + + public static boolean removeDeferHidingClient() { + + return FEATURE_FLAGS.removeDeferHidingClient(); + } + + + public static boolean removeDepartTargetFromMotion() { return FEATURE_FLAGS.removeDepartTargetFromMotion(); } - public static boolean removeStartingInTransition() { - - return FEATURE_FLAGS.removeStartingInTransition(); - } - - - public static boolean reparentToDefaultWithDisplayRemoval() { - - return FEATURE_FLAGS.reparentToDefaultWithDisplayRemoval(); - } - public static boolean reparentWindowTokenApi() { return FEATURE_FLAGS.reparentWindowTokenApi(); } - public static boolean respectFullscreenActivityOptionInDesktopLaunchParams() { - - return FEATURE_FLAGS.respectFullscreenActivityOptionInDesktopLaunchParams(); - } - public static boolean respectHierarchySurfaceVisibility() { + public static boolean respectNonTopVisibleFixedOrientation() { - return FEATURE_FLAGS.respectHierarchySurfaceVisibility(); + return FEATURE_FLAGS.respectNonTopVisibleFixedOrientation(); } - public static boolean respectLeafTaskBounds() { - - return FEATURE_FLAGS.respectLeafTaskBounds(); - } public static boolean respectOrientationChangeForUnresizeable() { @@ -2025,20 +2110,6 @@ public final class Flags { } - public static boolean restoreUserAspectRatioSettingsUsingService() { - - return FEATURE_FLAGS.restoreUserAspectRatioSettingsUsingService(); - } - - public static boolean restrictFreeformHiddenSystemBarsToFillingTasks() { - - return FEATURE_FLAGS.restrictFreeformHiddenSystemBarsToFillingTasks(); - } - - public static boolean rootTaskForBubble() { - - return FEATURE_FLAGS.rootTaskForBubble(); - } public static boolean safeRegionLetterboxing() { @@ -2046,26 +2117,26 @@ public final class Flags { } + public static boolean safeReleaseSnapshotAggressively() { return FEATURE_FLAGS.safeReleaseSnapshotAggressively(); } + public static boolean schedulingForNotificationShade() { return FEATURE_FLAGS.schedulingForNotificationShade(); } + + public static boolean scrambleSnapshotFileName() { return FEATURE_FLAGS.scrambleSnapshotFileName(); } - public static boolean screenBrightnessDimOnEmulator() { - - return FEATURE_FLAGS.screenBrightnessDimOnEmulator(); - } public static boolean screenRecordingCallbacks() { @@ -2073,15 +2144,13 @@ public final class Flags { return FEATURE_FLAGS.screenRecordingCallbacks(); } + + public static boolean scrollingFromLetterbox() { return FEATURE_FLAGS.scrollingFromLetterbox(); } - public static boolean scvhSurfaceControlLifetimeFix() { - - return FEATURE_FLAGS.scvhSurfaceControlLifetimeFix(); - } public static boolean sdkDesiredPresentTime() { @@ -2089,43 +2158,48 @@ public final class Flags { return FEATURE_FLAGS.sdkDesiredPresentTime(); } + + public static boolean setScPropertiesInClient() { return FEATURE_FLAGS.setScPropertiesInClient(); } + + public static boolean showAppHandleLargeScreens() { return FEATURE_FLAGS.showAppHandleLargeScreens(); } + public static boolean showDesktopExperienceDevOption() { return FEATURE_FLAGS.showDesktopExperienceDevOption(); } + public static boolean showDesktopWindowingDevOption() { return FEATURE_FLAGS.showDesktopWindowingDevOption(); } + + public static boolean showHomeBehindDesktop() { return FEATURE_FLAGS.showHomeBehindDesktop(); } + public static boolean skipCompatUiEducationInDesktopMode() { return FEATURE_FLAGS.skipCompatUiEducationInDesktopMode(); } - public static boolean skipDeactivationOfDeskWithNothingInFront() { - - return FEATURE_FLAGS.skipDeactivationOfDeskWithNothingInFront(); - } public static boolean skipDecorViewRelayoutWhenClosingBugfix() { @@ -2134,67 +2208,89 @@ public final class Flags { } - public static boolean splashScreenViewSyncTransaction() { + + public static boolean supportWidgetIntentsOnConnectedDisplay() { - return FEATURE_FLAGS.splashScreenViewSyncTransaction(); + return FEATURE_FLAGS.supportWidgetIntentsOnConnectedDisplay(); } + public static boolean supportsDragAssistantToMultiwindow() { return FEATURE_FLAGS.supportsDragAssistantToMultiwindow(); } + public static boolean supportsMultiInstanceSystemUi() { return FEATURE_FLAGS.supportsMultiInstanceSystemUi(); } + public static boolean surfaceControlInputReceiver() { return FEATURE_FLAGS.surfaceControlInputReceiver(); } + public static boolean surfaceTrustedOverlay() { return FEATURE_FLAGS.surfaceTrustedOverlay(); } + public static boolean syncScreenCapture() { return FEATURE_FLAGS.syncScreenCapture(); } + public static boolean systemUiPostAnimationEnd() { return FEATURE_FLAGS.systemUiPostAnimationEnd(); } + + public static boolean taskFragmentSystemOrganizerFlag() { + + return FEATURE_FLAGS.taskFragmentSystemOrganizerFlag(); + } + + + public static boolean touchPassThroughOptIn() { return FEATURE_FLAGS.touchPassThroughOptIn(); } + + + public static boolean trackSystemUiContextBeforeWms() { + + return FEATURE_FLAGS.trackSystemUiContextBeforeWms(); + } + + + public static boolean transitReadyTracking() { return FEATURE_FLAGS.transitReadyTracking(); } + + public static boolean transitTrackerPlumbing() { return FEATURE_FLAGS.transitTrackerPlumbing(); } - public static boolean transitionHandlerCujTags() { - - return FEATURE_FLAGS.transitionHandlerCujTags(); - } public static boolean trustedPresentationListenerForWindow() { @@ -2203,15 +2299,12 @@ public final class Flags { } + public static boolean unifyBackNavigationTransition() { return FEATURE_FLAGS.unifyBackNavigationTransition(); } - public static boolean unifyShellBinders() { - - return FEATURE_FLAGS.unifyShellBinders(); - } public static boolean universalResizableByDefault() { @@ -2219,33 +2312,28 @@ public final class Flags { return FEATURE_FLAGS.universalResizableByDefault(); } + + public static boolean untrustedEmbeddingAnyAppPermission() { return FEATURE_FLAGS.untrustedEmbeddingAnyAppPermission(); } + public static boolean untrustedEmbeddingStateSharing() { return FEATURE_FLAGS.untrustedEmbeddingStateSharing(); } + + public static boolean updateDimsWhenWindowShown() { return FEATURE_FLAGS.updateDimsWhenWindowShown(); } - public static boolean updateHostInputTransferToken() { - - return FEATURE_FLAGS.updateHostInputTransferToken(); - } - - public static boolean updateTaskMinDimensionsWithRootActivity() { - - return FEATURE_FLAGS.updateTaskMinDimensionsWithRootActivity(); - } - public static boolean useCachedInsetsForDisplaySwitch() { @@ -2253,24 +2341,49 @@ public final class Flags { } + + public static boolean useRtFrameCallbackForSplashScreenTransfer() { + + return FEATURE_FLAGS.useRtFrameCallbackForSplashScreenTransfer(); + } + + + public static boolean useTasksDimOnly() { return FEATURE_FLAGS.useTasksDimOnly(); } + + public static boolean useVisibleRequestedForProcessTracker() { + + return FEATURE_FLAGS.useVisibleRequestedForProcessTracker(); + } + + + + public static boolean useWindowOriginalTouchableRegionWhenMagnificationRecomputeBounds() { + + return FEATURE_FLAGS.useWindowOriginalTouchableRegionWhenMagnificationRecomputeBounds(); + } + + + public static boolean vdmForceAppUniversalResizableApi() { return FEATURE_FLAGS.vdmForceAppUniversalResizableApi(); } + public static boolean wallpaperOffsetAsync() { return FEATURE_FLAGS.wallpaperOffsetAsync(); } + public static boolean wlinfoOncreate() { return FEATURE_FLAGS.wlinfoOncreate(); diff --git a/flags/src/com/android/wm/shell/CustomFeatureFlags.java b/flags/src/com/android/wm/shell/CustomFeatureFlags.java index f93318fb70..ce1e21d693 100644 --- a/flags/src/com/android/wm/shell/CustomFeatureFlags.java +++ b/flags/src/com/android/wm/shell/CustomFeatureFlags.java @@ -1,5 +1,6 @@ package com.android.wm.shell; +// TODO(b/303773055): Remove the annotation after access issue is resolved. import java.util.Arrays; import java.util.HashSet; @@ -17,6 +18,13 @@ public class CustomFeatureFlags implements FeatureFlags { } @Override + public boolean bubbleViewInfoExecutors() { + return getValue(Flags.FLAG_BUBBLE_VIEW_INFO_EXECUTORS, + FeatureFlags::bubbleViewInfoExecutors); + } + + @Override + public boolean enableAutoTaskStackController() { return getValue(Flags.FLAG_ENABLE_AUTO_TASK_STACK_CONTROLLER, FeatureFlags::enableAutoTaskStackController); @@ -31,13 +39,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableBubbleAppCompatFixes() { - return getValue(Flags.FLAG_ENABLE_BUBBLE_APP_COMPAT_FIXES, - FeatureFlags::enableBubbleAppCompatFixes); - } - - @Override - public boolean enableBubbleBar() { return getValue(Flags.FLAG_ENABLE_BUBBLE_BAR, FeatureFlags::enableBubbleBar); @@ -59,13 +60,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableBubbleSwipeUpCleanup() { - return getValue(Flags.FLAG_ENABLE_BUBBLE_SWIPE_UP_CLEANUP, - FeatureFlags::enableBubbleSwipeUpCleanup); - } - - @Override - public boolean enableBubbleTaskViewListener() { return getValue(Flags.FLAG_ENABLE_BUBBLE_TASK_VIEW_LISTENER, FeatureFlags::enableBubbleTaskViewListener); @@ -101,13 +95,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enableEnterSplitRemoveBubble() { - return getValue(Flags.FLAG_ENABLE_ENTER_SPLIT_REMOVE_BUBBLE, - FeatureFlags::enableEnterSplitRemoveBubble); - } - - @Override - public boolean enableFlexibleSplit() { return getValue(Flags.FLAG_ENABLE_FLEXIBLE_SPLIT, FeatureFlags::enableFlexibleSplit); @@ -157,13 +144,6 @@ public class CustomFeatureFlags implements FeatureFlags { @Override - public boolean enablePipBoxShadows() { - return getValue(Flags.FLAG_ENABLE_PIP_BOX_SHADOWS, - FeatureFlags::enablePipBoxShadows); - } - - @Override - public boolean enablePipUmoExperience() { return getValue(Flags.FLAG_ENABLE_PIP_UMO_EXPERIENCE, FeatureFlags::enablePipUmoExperience); @@ -192,6 +172,13 @@ public class CustomFeatureFlags implements FeatureFlags { @Override + public boolean enableTaskViewControllerCleanup() { + return getValue(Flags.FLAG_ENABLE_TASK_VIEW_CONTROLLER_CLEANUP, + FeatureFlags::enableTaskViewControllerCleanup); + } + + @Override + public boolean enableTaskbarNavbarUnification() { return getValue(Flags.FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION, FeatureFlags::enableTaskbarNavbarUnification); @@ -232,13 +219,6 @@ public class CustomFeatureFlags implements FeatureFlags { FeatureFlags::taskViewRepository); } - @Override - - public boolean taskViewTransitionsRefactor() { - return getValue(Flags.FLAG_TASK_VIEW_TRANSITIONS_REFACTOR, - FeatureFlags::taskViewTransitionsRefactor); - } - public boolean isFlagReadOnlyOptimized(String flagName) { if (mReadOnlyFlagsSet.contains(flagName) && isOptimizationEnabled()) { @@ -258,19 +238,17 @@ public class CustomFeatureFlags implements FeatureFlags { public List getFlagNames() { return Arrays.asList( + Flags.FLAG_BUBBLE_VIEW_INFO_EXECUTORS, Flags.FLAG_ENABLE_AUTO_TASK_STACK_CONTROLLER, Flags.FLAG_ENABLE_BUBBLE_ANYTHING, - Flags.FLAG_ENABLE_BUBBLE_APP_COMPAT_FIXES, Flags.FLAG_ENABLE_BUBBLE_BAR, Flags.FLAG_ENABLE_BUBBLE_BAR_ON_PHONES, Flags.FLAG_ENABLE_BUBBLE_STASHING, - Flags.FLAG_ENABLE_BUBBLE_SWIPE_UP_CLEANUP, Flags.FLAG_ENABLE_BUBBLE_TASK_VIEW_LISTENER, Flags.FLAG_ENABLE_BUBBLE_TO_FULLSCREEN, Flags.FLAG_ENABLE_BUBBLES_LONG_PRESS_NAV_HANDLE, Flags.FLAG_ENABLE_CREATE_ANY_BUBBLE, Flags.FLAG_ENABLE_DYNAMIC_INSETS_FOR_APP_LAUNCH, - Flags.FLAG_ENABLE_ENTER_SPLIT_REMOVE_BUBBLE, Flags.FLAG_ENABLE_FLEXIBLE_SPLIT, Flags.FLAG_ENABLE_FLEXIBLE_TWO_APP_SPLIT, Flags.FLAG_ENABLE_GSF, @@ -278,36 +256,33 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_NEW_BUBBLE_ANIMATIONS, Flags.FLAG_ENABLE_OPTIONAL_BUBBLE_OVERFLOW, Flags.FLAG_ENABLE_PIP2, - Flags.FLAG_ENABLE_PIP_BOX_SHADOWS, Flags.FLAG_ENABLE_PIP_UMO_EXPERIENCE, Flags.FLAG_ENABLE_RECENTS_BOOKEND_TRANSITION, Flags.FLAG_ENABLE_RETRIEVABLE_BUBBLES, Flags.FLAG_ENABLE_SHELL_TOP_TASK_TRACKING, + Flags.FLAG_ENABLE_TASK_VIEW_CONTROLLER_CLEANUP, Flags.FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION, Flags.FLAG_ENABLE_TASKBAR_ON_PHONES, Flags.FLAG_ENABLE_TINY_TASKBAR, Flags.FLAG_FIX_MISSING_USER_CHANGE_CALLBACKS, Flags.FLAG_ONLY_REUSE_BUBBLED_TASK_WHEN_LAUNCHED_FROM_BUBBLE, - Flags.FLAG_TASK_VIEW_REPOSITORY, - Flags.FLAG_TASK_VIEW_TRANSITIONS_REFACTOR + Flags.FLAG_TASK_VIEW_REPOSITORY ); } private Set mReadOnlyFlagsSet = new HashSet<>( Arrays.asList( + Flags.FLAG_BUBBLE_VIEW_INFO_EXECUTORS, Flags.FLAG_ENABLE_AUTO_TASK_STACK_CONTROLLER, Flags.FLAG_ENABLE_BUBBLE_ANYTHING, - Flags.FLAG_ENABLE_BUBBLE_APP_COMPAT_FIXES, Flags.FLAG_ENABLE_BUBBLE_BAR, Flags.FLAG_ENABLE_BUBBLE_BAR_ON_PHONES, Flags.FLAG_ENABLE_BUBBLE_STASHING, - Flags.FLAG_ENABLE_BUBBLE_SWIPE_UP_CLEANUP, Flags.FLAG_ENABLE_BUBBLE_TASK_VIEW_LISTENER, Flags.FLAG_ENABLE_BUBBLE_TO_FULLSCREEN, Flags.FLAG_ENABLE_BUBBLES_LONG_PRESS_NAV_HANDLE, Flags.FLAG_ENABLE_CREATE_ANY_BUBBLE, Flags.FLAG_ENABLE_DYNAMIC_INSETS_FOR_APP_LAUNCH, - Flags.FLAG_ENABLE_ENTER_SPLIT_REMOVE_BUBBLE, Flags.FLAG_ENABLE_FLEXIBLE_SPLIT, Flags.FLAG_ENABLE_FLEXIBLE_TWO_APP_SPLIT, Flags.FLAG_ENABLE_GSF, @@ -315,18 +290,17 @@ public class CustomFeatureFlags implements FeatureFlags { Flags.FLAG_ENABLE_NEW_BUBBLE_ANIMATIONS, Flags.FLAG_ENABLE_OPTIONAL_BUBBLE_OVERFLOW, Flags.FLAG_ENABLE_PIP2, - Flags.FLAG_ENABLE_PIP_BOX_SHADOWS, Flags.FLAG_ENABLE_PIP_UMO_EXPERIENCE, Flags.FLAG_ENABLE_RECENTS_BOOKEND_TRANSITION, Flags.FLAG_ENABLE_RETRIEVABLE_BUBBLES, Flags.FLAG_ENABLE_SHELL_TOP_TASK_TRACKING, + Flags.FLAG_ENABLE_TASK_VIEW_CONTROLLER_CLEANUP, Flags.FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION, Flags.FLAG_ENABLE_TASKBAR_ON_PHONES, Flags.FLAG_ENABLE_TINY_TASKBAR, Flags.FLAG_FIX_MISSING_USER_CHANGE_CALLBACKS, Flags.FLAG_ONLY_REUSE_BUBBLED_TASK_WHEN_LAUNCHED_FROM_BUBBLE, Flags.FLAG_TASK_VIEW_REPOSITORY, - Flags.FLAG_TASK_VIEW_TRANSITIONS_REFACTOR, "" ) ); diff --git a/flags/src/com/android/wm/shell/FeatureFlags.java b/flags/src/com/android/wm/shell/FeatureFlags.java index b71360b9d4..5441eaed38 100644 --- a/flags/src/com/android/wm/shell/FeatureFlags.java +++ b/flags/src/com/android/wm/shell/FeatureFlags.java @@ -1,4 +1,5 @@ package com.android.wm.shell; +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public interface FeatureFlags { @@ -6,6 +7,10 @@ public interface FeatureFlags { + boolean bubbleViewInfoExecutors(); + + + boolean enableAutoTaskStackController(); @@ -14,10 +19,6 @@ public interface FeatureFlags { - boolean enableBubbleAppCompatFixes(); - - - boolean enableBubbleBar(); @@ -30,10 +31,6 @@ public interface FeatureFlags { - boolean enableBubbleSwipeUpCleanup(); - - - boolean enableBubbleTaskViewListener(); @@ -54,10 +51,6 @@ public interface FeatureFlags { - boolean enableEnterSplitRemoveBubble(); - - - boolean enableFlexibleSplit(); @@ -86,10 +79,6 @@ public interface FeatureFlags { - boolean enablePipBoxShadows(); - - - boolean enablePipUmoExperience(); @@ -106,6 +95,10 @@ public interface FeatureFlags { + boolean enableTaskViewControllerCleanup(); + + + boolean enableTaskbarNavbarUnification(); @@ -127,8 +120,4 @@ public interface FeatureFlags { boolean taskViewRepository(); - - - - boolean taskViewTransitionsRefactor(); } diff --git a/flags/src/com/android/wm/shell/FeatureFlagsImpl.java b/flags/src/com/android/wm/shell/FeatureFlagsImpl.java index fb9eeda960..8620fce733 100644 --- a/flags/src/com/android/wm/shell/FeatureFlagsImpl.java +++ b/flags/src/com/android/wm/shell/FeatureFlagsImpl.java @@ -1,10 +1,18 @@ package com.android.wm.shell; +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean bubbleViewInfoExecutors() { + return true; + } + + @Override + + public boolean enableAutoTaskStackController() { return false; } @@ -19,13 +27,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableBubbleAppCompatFixes() { - return true; - } - - @Override - - public boolean enableBubbleBar() { return false; } @@ -47,13 +48,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enableBubbleSwipeUpCleanup() { - return true; - } - - @Override - - public boolean enableBubbleTaskViewListener() { return false; } @@ -83,13 +77,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean enableDynamicInsetsForAppLaunch() { - return true; - } - - @Override - - - public boolean enableEnterSplitRemoveBubble() { return false; } @@ -145,13 +132,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override - public boolean enablePipBoxShadows() { - return false; - } - - @Override - - public boolean enablePipUmoExperience() { return false; } @@ -160,7 +140,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean enableRecentsBookendTransition() { - return true; + return false; } @Override @@ -180,6 +160,13 @@ public final class FeatureFlagsImpl implements FeatureFlags { @Override + public boolean enableTaskViewControllerCleanup() { + return true; + } + + @Override + + public boolean enableTaskbarNavbarUnification() { return true; } @@ -202,7 +189,7 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean fixMissingUserChangeCallbacks() { - return true; + return false; } @Override @@ -216,13 +203,6 @@ public final class FeatureFlagsImpl implements FeatureFlags { public boolean taskViewRepository() { - return true; - } - - @Override - - - public boolean taskViewTransitionsRefactor() { return false; } diff --git a/flags/src/com/android/wm/shell/Flags.java b/flags/src/com/android/wm/shell/Flags.java index b39d79b781..d5dbf382c4 100644 --- a/flags/src/com/android/wm/shell/Flags.java +++ b/flags/src/com/android/wm/shell/Flags.java @@ -1,23 +1,22 @@ package com.android.wm.shell; +// TODO(b/303773055): Remove the annotation after access issue is resolved. /** @hide */ public final class Flags { + /** @hide */ + public static final String FLAG_BUBBLE_VIEW_INFO_EXECUTORS = "com.android.wm.shell.bubble_view_info_executors"; /** @hide */ public static final String FLAG_ENABLE_AUTO_TASK_STACK_CONTROLLER = "com.android.wm.shell.enable_auto_task_stack_controller"; /** @hide */ public static final String FLAG_ENABLE_BUBBLE_ANYTHING = "com.android.wm.shell.enable_bubble_anything"; /** @hide */ - public static final String FLAG_ENABLE_BUBBLE_APP_COMPAT_FIXES = "com.android.wm.shell.enable_bubble_app_compat_fixes"; - /** @hide */ public static final String FLAG_ENABLE_BUBBLE_BAR = "com.android.wm.shell.enable_bubble_bar"; /** @hide */ public static final String FLAG_ENABLE_BUBBLE_BAR_ON_PHONES = "com.android.wm.shell.enable_bubble_bar_on_phones"; /** @hide */ public static final String FLAG_ENABLE_BUBBLE_STASHING = "com.android.wm.shell.enable_bubble_stashing"; /** @hide */ - public static final String FLAG_ENABLE_BUBBLE_SWIPE_UP_CLEANUP = "com.android.wm.shell.enable_bubble_swipe_up_cleanup"; - /** @hide */ public static final String FLAG_ENABLE_BUBBLE_TASK_VIEW_LISTENER = "com.android.wm.shell.enable_bubble_task_view_listener"; /** @hide */ public static final String FLAG_ENABLE_BUBBLE_TO_FULLSCREEN = "com.android.wm.shell.enable_bubble_to_fullscreen"; @@ -28,8 +27,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_DYNAMIC_INSETS_FOR_APP_LAUNCH = "com.android.wm.shell.enable_dynamic_insets_for_app_launch"; /** @hide */ - public static final String FLAG_ENABLE_ENTER_SPLIT_REMOVE_BUBBLE = "com.android.wm.shell.enable_enter_split_remove_bubble"; - /** @hide */ public static final String FLAG_ENABLE_FLEXIBLE_SPLIT = "com.android.wm.shell.enable_flexible_split"; /** @hide */ public static final String FLAG_ENABLE_FLEXIBLE_TWO_APP_SPLIT = "com.android.wm.shell.enable_flexible_two_app_split"; @@ -44,8 +41,6 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_PIP2 = "com.android.wm.shell.enable_pip2"; /** @hide */ - public static final String FLAG_ENABLE_PIP_BOX_SHADOWS = "com.android.wm.shell.enable_pip_box_shadows"; - /** @hide */ public static final String FLAG_ENABLE_PIP_UMO_EXPERIENCE = "com.android.wm.shell.enable_pip_umo_experience"; /** @hide */ public static final String FLAG_ENABLE_RECENTS_BOOKEND_TRANSITION = "com.android.wm.shell.enable_recents_bookend_transition"; @@ -54,6 +49,8 @@ public final class Flags { /** @hide */ public static final String FLAG_ENABLE_SHELL_TOP_TASK_TRACKING = "com.android.wm.shell.enable_shell_top_task_tracking"; /** @hide */ + public static final String FLAG_ENABLE_TASK_VIEW_CONTROLLER_CLEANUP = "com.android.wm.shell.enable_task_view_controller_cleanup"; + /** @hide */ public static final String FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION = "com.android.wm.shell.enable_taskbar_navbar_unification"; /** @hide */ public static final String FLAG_ENABLE_TASKBAR_ON_PHONES = "com.android.wm.shell.enable_taskbar_on_phones"; @@ -65,8 +62,14 @@ public final class Flags { public static final String FLAG_ONLY_REUSE_BUBBLED_TASK_WHEN_LAUNCHED_FROM_BUBBLE = "com.android.wm.shell.only_reuse_bubbled_task_when_launched_from_bubble"; /** @hide */ public static final String FLAG_TASK_VIEW_REPOSITORY = "com.android.wm.shell.task_view_repository"; - /** @hide */ - public static final String FLAG_TASK_VIEW_TRANSITIONS_REFACTOR = "com.android.wm.shell.task_view_transitions_refactor"; + + + + public static boolean bubbleViewInfoExecutors() { + + return FEATURE_FLAGS.bubbleViewInfoExecutors(); + } + public static boolean enableAutoTaskStackController() { @@ -75,17 +78,13 @@ public final class Flags { } + public static boolean enableBubbleAnything() { return FEATURE_FLAGS.enableBubbleAnything(); } - public static boolean enableBubbleAppCompatFixes() { - - return FEATURE_FLAGS.enableBubbleAppCompatFixes(); - } - public static boolean enableBubbleBar() { @@ -93,23 +92,20 @@ public final class Flags { } + public static boolean enableBubbleBarOnPhones() { return FEATURE_FLAGS.enableBubbleBarOnPhones(); } + public static boolean enableBubbleStashing() { return FEATURE_FLAGS.enableBubbleStashing(); } - public static boolean enableBubbleSwipeUpCleanup() { - - return FEATURE_FLAGS.enableBubbleSwipeUpCleanup(); - } - public static boolean enableBubbleTaskViewListener() { @@ -117,35 +113,34 @@ public final class Flags { } + public static boolean enableBubbleToFullscreen() { return FEATURE_FLAGS.enableBubbleToFullscreen(); } + public static boolean enableBubblesLongPressNavHandle() { return FEATURE_FLAGS.enableBubblesLongPressNavHandle(); } + public static boolean enableCreateAnyBubble() { return FEATURE_FLAGS.enableCreateAnyBubble(); } + public static boolean enableDynamicInsetsForAppLaunch() { return FEATURE_FLAGS.enableDynamicInsetsForAppLaunch(); } - public static boolean enableEnterSplitRemoveBubble() { - - return FEATURE_FLAGS.enableEnterSplitRemoveBubble(); - } - public static boolean enableFlexibleSplit() { @@ -153,47 +148,48 @@ public final class Flags { } + public static boolean enableFlexibleTwoAppSplit() { return FEATURE_FLAGS.enableFlexibleTwoAppSplit(); } + public static boolean enableGsf() { return FEATURE_FLAGS.enableGsf(); } + public static boolean enableMagneticSplitDivider() { return FEATURE_FLAGS.enableMagneticSplitDivider(); } + public static boolean enableNewBubbleAnimations() { return FEATURE_FLAGS.enableNewBubbleAnimations(); } + public static boolean enableOptionalBubbleOverflow() { return FEATURE_FLAGS.enableOptionalBubbleOverflow(); } + public static boolean enablePip2() { return FEATURE_FLAGS.enablePip2(); } - public static boolean enablePipBoxShadows() { - - return FEATURE_FLAGS.enablePipBoxShadows(); - } - public static boolean enablePipUmoExperience() { @@ -201,65 +197,75 @@ public final class Flags { } + public static boolean enableRecentsBookendTransition() { return FEATURE_FLAGS.enableRecentsBookendTransition(); } + public static boolean enableRetrievableBubbles() { return FEATURE_FLAGS.enableRetrievableBubbles(); } + public static boolean enableShellTopTaskTracking() { return FEATURE_FLAGS.enableShellTopTaskTracking(); } + + public static boolean enableTaskViewControllerCleanup() { + + return FEATURE_FLAGS.enableTaskViewControllerCleanup(); + } + + + public static boolean enableTaskbarNavbarUnification() { return FEATURE_FLAGS.enableTaskbarNavbarUnification(); } + public static boolean enableTaskbarOnPhones() { return FEATURE_FLAGS.enableTaskbarOnPhones(); } + public static boolean enableTinyTaskbar() { return FEATURE_FLAGS.enableTinyTaskbar(); } + public static boolean fixMissingUserChangeCallbacks() { return FEATURE_FLAGS.fixMissingUserChangeCallbacks(); } + public static boolean onlyReuseBubbledTaskWhenLaunchedFromBubble() { return FEATURE_FLAGS.onlyReuseBubbledTaskWhenLaunchedFromBubble(); } + public static boolean taskViewRepository() { return FEATURE_FLAGS.taskViewRepository(); } - - public static boolean taskViewTransitionsRefactor() { - - return FEATURE_FLAGS.taskViewTransitionsRefactor(); - } - private static FeatureFlags FEATURE_FLAGS = new FeatureFlagsImpl(); } diff --git a/go/quickstep/src/com/android/launcher3/BuildConfig.java b/go/quickstep/src/com/android/launcher3/BuildConfig.java index 53ccbd30c7..cfcda39e01 100644 --- a/go/quickstep/src/com/android/launcher3/BuildConfig.java +++ b/go/quickstep/src/com/android/launcher3/BuildConfig.java @@ -26,6 +26,11 @@ public final class BuildConfig { */ public static final boolean QSB_ON_FIRST_SCREEN = true; + /** + * Flag to state if the widget on the top of the first screen should be shown. + */ + public static final boolean WIDGET_ON_FIRST_SCREEN = false; + /** * Flag to control various developer centric features */ diff --git a/go/quickstep/src/com/android/launcher3/Launcher3QuickStepGo.java b/go/quickstep/src/com/android/launcher3/Launcher3QuickStepGo.java index bb406a2dd9..8bd0fec2de 100644 --- a/go/quickstep/src/com/android/launcher3/Launcher3QuickStepGo.java +++ b/go/quickstep/src/com/android/launcher3/Launcher3QuickStepGo.java @@ -28,8 +28,8 @@ public class Launcher3QuickStepGo extends QuickstepLauncher { private static final String TAG = "Launcher3QuickStepGo"; @Override - public Stream getSupportedShortcuts(int container) { - Stream shortcuts = super.getSupportedShortcuts(container); + public Stream getSupportedShortcuts() { + Stream shortcuts = super.getSupportedShortcuts(); if (AppSharing.ENABLE_APP_SHARING) { shortcuts = Stream.concat(shortcuts, Stream.of(AppSharing.SHORTCUT_FACTORY)); diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9ea9b284f1..4fdb682ea3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,4 @@ [versions] -core = "1.17.0" jdkRelease = "21" accompanist = "0.37.3" @@ -7,30 +6,23 @@ benchmarkMacroJunit4 = "1.4.1" concurrentFutures = "1.3.0" coreAnimation = "1.0.0" coreKtx = "1.17.0" -error_prone_annotations = "2.44.0" +error_prone_annotations = "2.45.0" espressoCore = "3.7.0" junit = "1.3.0" -junitVersion = "4.13.2" -mockito = "5.14.2" -mockitoKotlin = "5.4.0" opto = "1.0.18" protocVersion = "4.33.1" retrofit = "3.0.0" room = "2.8.4" -testRules = "1.7.0" -testRunner = "1.7.0" -truth = "1.4.5" -activityCompose = "1.12.0" +activityCompose = "1.12.1" airbnbLottie = "6.7.1" androidDesugar = "2.1.5" coil = "2.7.0" -composeBom = "2025.11.01" -compose = "1.10.0-rc01" -composeMaterial = "1.10.0-rc01" -composeMaterial3 = "1.5.0-alpha09" +composeBom = "2025.12.00" +compose = "1.10.0" +composeMaterial = "1.10.0" +composeMaterial3 = "1.5.0-alpha07" composeMaterialIcons = "1.7.8" -composeCompiler = "1.5.15" constraintlayout = "2.2.1" dagger = "2.57.2" datastore = "1.2.0" @@ -71,8 +63,6 @@ licensee = "1.14.1" refine = "4.4.0" spotless = "8.1.0" -guava = "33.5.0-android" - [plugins] android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } @@ -95,7 +85,6 @@ androidx-activity-compose = { group = "androidx.activity", name = "activity-comp androidx-benchmark-macro-junit4 = { module = "androidx.benchmark:benchmark-macro-junit4", version.ref = "benchmarkMacroJunit4" } androidx-concurrent-futures = { module = "androidx.concurrent:concurrent-futures", version.ref = "concurrentFutures" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } -androidx-core = { module = "androidx.core:core", version.ref = "core" } androidx-core-animation = { module = "androidx.core:core-animation", version.ref = "coreAnimation" } androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "coreKtx" } androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastore" } @@ -113,35 +102,26 @@ androidx-preference-ktx = { group = "androidx.preference", name = "preference-kt androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "profileinstaller" } androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } androidx-slice-core = { group = "androidx.slice", name = "slice-core", version.ref = "slice" } -androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "testRules" } -androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "testRunner" } androidx-uiautomator = { module = "androidx.test.uiautomator:uiautomator", version.ref = "uiautomator" } androidx-window = { group = "androidx.window", name = "window", version.ref = "window" } # Compose compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } compose-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "compose" } -compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout", version.ref = "compose" } compose-material = { group = "androidx.compose.material", name = "material", version.ref = "composeMaterial" } compose-material-icons = { group = "androidx.compose.material", name = "material-icons-extended", version.ref = "composeMaterialIcons" } compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "composeMaterial3" } compose-material3-windowSizeClass = { group = "androidx.compose.material3", name = "material3-window-size-class", version.ref = "composeMaterial3" } -compose-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref = "compose" } compose-runtime-livedata = { group = "androidx.compose.runtime", name = "runtime-livedata", version.ref = "compose" } compose-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "compose" } compose-ui-google-fonts = { group = "androidx.compose.ui", name = "ui-text-google-fonts", version.ref = "compose" } compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics", version.ref = "compose"} -compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4", version.ref = "compose" } -compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version.ref = "compose" } compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "compose" } compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "compose" } compose-ui-util = { group = "androidx.compose.ui", name = "ui-util", version.ref = "compose" } -compose-compiler = { group = "androidx.compose.compiler", name = "compose-compiler", version.ref = "composeCompiler"} # Dagger & Hilt -dagger = { group = "com.google.dagger", name = "dagger", version.ref = "dagger" } dagger-compiler = { group = "com.google.dagger", name = "dagger-compiler", version.ref = "dagger" } -dagger-android-processor = { group = "com.google.dagger", name = "dagger-android-processor", version.ref = "dagger" } dagger-hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "dagger" } dagger-hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "dagger" } @@ -172,7 +152,6 @@ kotlin-parcelizeRuntime = { module = "org.jetbrains.kotlin:kotlin-parcelize-runt kotlin-stdlib-jdk7 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin" } # KotlinX kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" } -kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" } kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" } # Other @@ -182,14 +161,7 @@ chickenhook-restrictionbypass = { group = "com.github.ChickenHook", name = "Rest coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } google-errorprone-annotations = { module = "com.google.errorprone:error_prone_annotations", version.ref = "error_prone_annotations" } google-material = { group = "com.google.android.material", name = "material", version.ref = "googleMaterial" } -google-truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } hoko-blur = { group = "io.github.hokofly", name = "hoko-blur", version.ref = "hokoBlur" } -junit = { group = "junit", name = "junit", version.ref = "junitVersion" } -mockito-android = { group = "org.mockito", name = "mockito-android", version.ref = "mockito" } -mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockitoKotlin" } -mockito-robolectric = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } -mockito-robolectric-bytebuddy = { group = "net.bytebuddy", name = "byte-buddy", version = "1.15.11" } -mockito-robolectric-bytebuddy-agent = { group = "net.bytebuddy", name = "byte-buddy-agent", version = "1.15.11" } javax-inject = { group = "javax.inject", name = "javax.inject", version.ref = "javaxInject" } kdrag0n-colorkt = { group = "dev.kdrag0n", name = "colorkt", version.ref = "kdrag0nColorkt" } leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanaryAndroid" } @@ -203,7 +175,6 @@ rikka-annotation-processor = { module = "dev.rikka.tools.refine:annotation-proce rikka-refine-runtime = { group = "dev.rikka.tools.refine", name = "runtime", version.ref = "refine" } smartspacer-sdk = { group = "com.kieronquinn.smartspacer", name = "sdk-client", version.ref = "smartspacer" } xdrop-fuzzywuzzy = { group = "me.xdrop", name = "fuzzywuzzy", version.ref = "fuzzywuzzy" } -google-guava = { group = "com.google.guava", name = "guava", version.ref = "guava" } [bundles] accompanist = ["accompanist-adaptive", "accompanist-drawablepainter", "accompanist-permissions"] diff --git a/lawnchair/assets/google_fonts.json b/lawnchair/assets/google_fonts.json index 0d6589bc1d..4bacfc20cc 100644 --- a/lawnchair/assets/google_fonts.json +++ b/lawnchair/assets/google_fonts.json @@ -1,46894 +1,47236 @@ { - "kind": "webfonts#webfontList", - "items": [ - { - "family": "ABeeZee", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/abeezee/v23/esDR31xSG-6AGleN6tKukbcHCpE.ttf", - "italic": "https://fonts.gstatic.com/s/abeezee/v23/esDT31xSG-6AGleN2tCklZUCGpG-GQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/abeezee/v23/esDR31xSG-6AGleN2tOklQ.ttf" - }, - { - "family": "ADLaM Display", - "variants": [ - "regular" - ], - "subsets": [ - "adlam", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/adlamdisplay/v1/KFOhCnGXkPOLlhx6jD8_b1ZECsHYkYBPY3o.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/adlamdisplay/v1/KFOhCnGXkPOLlhx6jD8_b1ZEOsDSlQ.ttf" - }, - { - "family": "AR One Sans", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWn_9DW03no5mBF4.ttf", - "500": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWk39DW03no5mBF4.ttf", - "600": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWqH6DW03no5mBF4.ttf", - "700": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWpj6DW03no5mBF4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWn_9PWw9mg.ttf" - }, - { - "family": "Abel", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE6VhLPJp6qGI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE2VlBOA.ttf" - }, - { - "family": "Abhaya Libre", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "sinhala" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/abhayalibre/v18/e3tmeuGtX-Co5MNzeAOqinEge0PWovdU4w.ttf", - "500": "https://fonts.gstatic.com/s/abhayalibre/v18/e3t5euGtX-Co5MNzeAOqinEYj2ryqtxI6oYtBA.ttf", - "600": "https://fonts.gstatic.com/s/abhayalibre/v18/e3t5euGtX-Co5MNzeAOqinEYo23yqtxI6oYtBA.ttf", - "700": "https://fonts.gstatic.com/s/abhayalibre/v18/e3t5euGtX-Co5MNzeAOqinEYx2zyqtxI6oYtBA.ttf", - "800": "https://fonts.gstatic.com/s/abhayalibre/v18/e3t5euGtX-Co5MNzeAOqinEY22_yqtxI6oYtBA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/abhayalibre/v18/e3tmeuGtX-Co5MNzeAOqinEQeknS.ttf" - }, - { - "family": "Aboreto", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/aboreto/v2/5DCXAKLhwDDQ4N8blKTeA2yuxSY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aboreto/v2/5DCXAKLhwDDQ4N8bpKXUBw.ttf" - }, - { - "family": "Abril Fatface", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/abrilfatface/v25/zOL64pLDlL1D99S8g8PtiKchm-BsjOLhZBY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/abrilfatface/v25/zOL64pLDlL1D99S8g8PtiKchq-FmiA.ttf" - }, - { - "family": "Abyssinica SIL", - "variants": [ - "regular" - ], - "subsets": [ - "ethiopic", - "latin", - "latin-ext" - ], - "version": "v9", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/abyssinicasil/v9/oY1H8ezOqK7iI3rK_45WKoc8J6UZBFOVAXuI.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/abyssinicasil/v9/oY1H8ezOqK7iI3rK_45WKoc8J5UYDlc.ttf" - }, - { - "family": "Aclonica", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/aclonica/v25/K2FyfZJVlfNNSEBXGb7TCI6oBjLz.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aclonica/v25/K2FyfZJVlfNNSEBXGY7SAoo.ttf" - }, - { - "family": "Acme", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/acme/v27/RrQfboBx-C5_bx3Lb23lzLk.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/acme/v27/RrQfboBx-C5_XxzBaw.ttf" - }, - { - "family": "Actor", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/actor/v18/wEOzEBbCkc5cO3ekXygtUMIO.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/actor/v18/wEOzEBbCkc5cO0elVSw.ttf" - }, - { - "family": "Adamina", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/adamina/v22/j8_r6-DH1bjoc-dwu-reETl4Bno.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/adamina/v22/j8_r6-DH1bjoc-dwi-vUFQ.ttf" - }, - { - "family": "Advent Pro", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext" - ], - "version": "v33", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLQyJPTJoonw1aBA.ttf", - "200": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLwyNPTJoonw1aBA.ttf", - "300": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLHSNPTJoonw1aBA.ttf", - "regular": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLQyNPTJoonw1aBA.ttf", - "500": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLcSNPTJoonw1aBA.ttf", - "600": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLnSRPTJoonw1aBA.ttf", - "700": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLpCRPTJoonw1aBA.ttf", - "800": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLwyRPTJoonw1aBA.ttf", - "900": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpL6iRPTJoonw1aBA.ttf", - "100italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2CnDpAsvQhKBH4C.ttf", - "200italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2AnD5AsvQhKBH4C.ttf", - "300italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2D5D5AsvQhKBH4C.ttf", - "italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2CnD5AsvQhKBH4C.ttf", - "500italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2CVD5AsvQhKBH4C.ttf", - "600italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2B5CJAsvQhKBH4C.ttf", - "700italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2BACJAsvQhKBH4C.ttf", - "800italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2AnCJAsvQhKBH4C.ttf", - "900italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2AOCJAsvQhKBH4C.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLQyN_TZAs.ttf" - }, - { - "family": "Afacad", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfhXtWmA08mCgdfM.ttf", - "500": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfiftWmA08mCgdfM.ttf", - "600": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfsvqWmA08mCgdfM.ttf", - "700": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfvLqWmA08mCgdfM.ttf", - "italic": "https://fonts.gstatic.com/s/afacad/v3/6NUI8FKMIQOGaw6ahLYEvBjUVG5Ga92usiM-9kKlZfNfuw.ttf", - "500italic": "https://fonts.gstatic.com/s/afacad/v3/6NUI8FKMIQOGaw6ahLYEvBjUVG5Ga92ugCM-9kKlZfNfuw.ttf", - "600italic": "https://fonts.gstatic.com/s/afacad/v3/6NUI8FKMIQOGaw6ahLYEvBjUVG5Ga92ubCQ-9kKlZfNfuw.ttf", - "700italic": "https://fonts.gstatic.com/s/afacad/v3/6NUI8FKMIQOGaw6ahLYEvBjUVG5Ga92uVSQ-9kKlZfNfuw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfhXtamE-9g.ttf" - }, - { - "family": "Afacad Flux", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsUwWZaRqQsJr67E.ttf", - "200": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edscwXZaRqQsJr67E.ttf", - "300": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsRIXZaRqQsJr67E.ttf", - "regular": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsUwXZaRqQsJr67E.ttf", - "500": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsX4XZaRqQsJr67E.ttf", - "600": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsZIQZaRqQsJr67E.ttf", - "700": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsasQZaRqQsJr67E.ttf", - "800": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edscwQZaRqQsJr67E.ttf", - "900": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edseUQZaRqQsJr67E.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsUwXVaVgRg.ttf" - }, - { - "family": "Agbalumo", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "ethiopic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/agbalumo/v6/55xvey5uMdT2N37KZcMFirl08KDJ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/agbalumo/v6/55xvey5uMdT2N37KZfMEgL0.ttf" - }, - { - "family": "Agdasima", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/agdasima/v5/PN_zRfyxp2f1fUCgAMg6rzjb_-Da.ttf", - "700": "https://fonts.gstatic.com/s/agdasima/v5/PN_0Rfyxp2f1fUCgAPCGgBzT1PzTz2Mi.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/agdasima/v5/PN_zRfyxp2f1fUCgAPg7pTw.ttf" - }, - { - "family": "Agu Display", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/agudisplay/v3/iJWXBXKbbi6BeMC1_RX7qF_V5E7aciGRRWUwX4ftka9LM6y8Zg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/agudisplay/v3/iJWXBXKbbi6BeMC1_RX7qF_V5E7aciGRRWUwX4fdkKVP.ttf" - }, - { - "family": "Aguafina Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/aguafinascript/v24/If2QXTv_ZzSxGIO30LemWEOmt1bHqs4pgicOrg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aguafinascript/v24/If2QXTv_ZzSxGIO30LemWEOmt1b3q8Qt.ttf" - }, - { - "family": "Akatab", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "tifinagh" - ], - "version": "v9", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/akatab/v9/VuJwdNrK3Z7gqJEPWIz5NIh-YA.ttf", - "500": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE3rKXdPKNiaRpFvg.ttf", - "600": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE3gKLdPKNiaRpFvg.ttf", - "700": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE35KPdPKNiaRpFvg.ttf", - "800": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE3-KDdPKNiaRpFvg.ttf", - "900": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE33KHdPKNiaRpFvg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/akatab/v9/VuJwdNrK3Z7gqJE_WYb9.ttf" - }, - { - "family": "Akaya Kanadaka", - "variants": [ - "regular" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/akayakanadaka/v18/N0bM2S5CPO5oOQqvazoRRb-8-PfRS5VBBSSF.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/akayakanadaka/v18/N0bM2S5CPO5oOQqvazoRRb-8-MfQQZE.ttf" - }, - { - "family": "Akaya Telivigala", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "telugu" - ], - "version": "v28", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/akayatelivigala/v28/lJwc-oo_iG9wXqU3rCTD395tp0uifdLdsIH0YH8.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/akayatelivigala/v28/lJwc-oo_iG9wXqU3rCTD395tp0uiTdPXtA.ttf" - }, - { - "family": "Akronim", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/akronim/v23/fdN-9sqWtWZZlHRp-gBxkFYN-a8.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/akronim/v23/fdN-9sqWtWZZlHRpygF7lA.ttf" - }, - { - "family": "Akshar", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSSgFy9CY94XsnPc.ttf", - "regular": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSXYFy9CY94XsnPc.ttf", - "500": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSUQFy9CY94XsnPc.ttf", - "600": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSagCy9CY94XsnPc.ttf", - "700": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSZECy9CY94XsnPc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSXYF-9GS8w.ttf" - }, - { - "family": "Aladin", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/aladin/v26/ZgNSjPJFPrvJV5f16Sf4pGT2Ng.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aladin/v26/ZgNSjPJFPrvJV5fF6C38.ttf" - }, - { - "family": "Alan Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-09-18", - "files": { - "300": "https://fonts.gstatic.com/s/alansans/v1/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfIHoxyB1jBwiRr0.ttf", - "regular": "https://fonts.gstatic.com/s/alansans/v1/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfN_oxyB1jBwiRr0.ttf", - "500": "https://fonts.gstatic.com/s/alansans/v1/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfO3oxyB1jBwiRr0.ttf", - "600": "https://fonts.gstatic.com/s/alansans/v1/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfAHvxyB1jBwiRr0.ttf", - "700": "https://fonts.gstatic.com/s/alansans/v1/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfDjvxyB1jBwiRr0.ttf", - "800": "https://fonts.gstatic.com/s/alansans/v1/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfF_vxyB1jBwiRr0.ttf", - "900": "https://fonts.gstatic.com/s/alansans/v1/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfHbvxyB1jBwiRr0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alansans/v1/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfN_o9yF_iA.ttf" - }, - { - "family": "Alata", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/alata/v12/PbytFmztEwbIofe6xKcRQEOX.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alata/v12/PbytFmztEwbIoce7zqM.ttf" - }, - { - "family": "Alatsi", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/alatsi/v14/TK3iWkUJAxQ2nLNGHjUHte5fKg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alatsi/v14/TK3iWkUJAxQ2nLN2Hz8D.ttf" - }, - { - "family": "Albert Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHq5L_rI32TxAj1g.ttf", - "200": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHK5P_rI32TxAj1g.ttf", - "300": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSH9ZP_rI32TxAj1g.ttf", - "regular": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHq5P_rI32TxAj1g.ttf", - "500": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHmZP_rI32TxAj1g.ttf", - "600": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHdZT_rI32TxAj1g.ttf", - "700": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHTJT_rI32TxAj1g.ttf", - "800": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHK5T_rI32TxAj1g.ttf", - "900": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHApT_rI32TxAj1g.ttf", - "100italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9AX7ofybRUz1r5t.ttf", - "200italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9CX74fybRUz1r5t.ttf", - "300italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9BJ74fybRUz1r5t.ttf", - "italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9AX74fybRUz1r5t.ttf", - "500italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9Al74fybRUz1r5t.ttf", - "600italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9DJ6IfybRUz1r5t.ttf", - "700italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9Dw6IfybRUz1r5t.ttf", - "800italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9CX6IfybRUz1r5t.ttf", - "900italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9C-6IfybRUz1r5t.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHq5PPrYfy.ttf" - }, - { - "family": "Aldrich", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/aldrich/v22/MCoTzAn-1s3IGyJMZaAS3pP5H_E.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aldrich/v22/MCoTzAn-1s3IGyJMVaEY2g.ttf" - }, - { - "family": "Alef", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "hebrew", - "latin" - ], - "version": "v24", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/alef/v24/FeVfS0NQpLYgrjJbC5FxxbU.ttf", - "700": "https://fonts.gstatic.com/s/alef/v24/FeVQS0NQpLYglo50L5la2bxii28.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alef/v24/FeVfS0NQpLYgnjNRDw.ttf" - }, - { - "family": "Alegreya", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v39", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNG9hUI_KCisSGVrw.ttf", - "500": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGxBUI_KCisSGVrw.ttf", - "600": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGKBII_KCisSGVrw.ttf", - "700": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGERII_KCisSGVrw.ttf", - "800": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGdhII_KCisSGVrw.ttf", - "900": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGXxII_KCisSGVrw.ttf", - "italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlbgv6qmkySFr9V9.ttf", - "500italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlbSv6qmkySFr9V9.ttf", - "600italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlY-uKqmkySFr9V9.ttf", - "700italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlYHuKqmkySFr9V9.ttf", - "800italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlZguKqmkySFr9V9.ttf", - "900italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlZJuKqmkySFr9V9.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNG9hU4_aqm.ttf" - }, - { - "family": "Alegreya SC", - "variants": [ - "regular", - "italic", - "500", - "500italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/alegreyasc/v26/taiOGmRtCJ62-O0HhNEa-a6o05E5abe_.ttf", - "italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiMGmRtCJ62-O0HhNEa-Z6q2ZUbbKe_DGs.ttf", - "500": "https://fonts.gstatic.com/s/alegreyasc/v26/taiTGmRtCJ62-O0HhNEa-ZZc-rUxQqu2FXKD.ttf", - "500italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiRGmRtCJ62-O0HhNEa-Z6q4WEySK-UEGKDBz4.ttf", - "700": "https://fonts.gstatic.com/s/alegreyasc/v26/taiTGmRtCJ62-O0HhNEa-ZYU_LUxQqu2FXKD.ttf", - "700italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiRGmRtCJ62-O0HhNEa-Z6q4Sk0SK-UEGKDBz4.ttf", - "800": "https://fonts.gstatic.com/s/alegreyasc/v26/taiTGmRtCJ62-O0HhNEa-ZYI_7UxQqu2FXKD.ttf", - "800italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiRGmRtCJ62-O0HhNEa-Z6q4TU3SK-UEGKDBz4.ttf", - "900": "https://fonts.gstatic.com/s/alegreyasc/v26/taiTGmRtCJ62-O0HhNEa-ZYs_rUxQqu2FXKD.ttf", - "900italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiRGmRtCJ62-O0HhNEa-Z6q4RE2SK-UEGKDBz4.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alegreyasc/v26/taiOGmRtCJ62-O0HhNEa-Z6p2ZU.ttf" - }, - { - "family": "Alegreya Sans", - "variants": [ - "100", - "100italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUt9_-1phKLFgshYDvh6Vwt5TltuGdShm5bsg.ttf", - "100italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUv9_-1phKLFgshYDvh6Vwt7V9V3G1WpGtLsgu7.ttf", - "300": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5fFPmE18imdCqxI.ttf", - "300italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VFE92jkVHuxKiBA.ttf", - "regular": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUz9_-1phKLFgshYDvh6Vwt3V1nvEVXlm4.ttf", - "italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUt9_-1phKLFgshYDvh6Vwt7V9tuGdShm5bsg.ttf", - "500": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5alOmE18imdCqxI.ttf", - "500italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VTE52jkVHuxKiBA.ttf", - "700": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5eFImE18imdCqxI.ttf", - "700italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VBEh2jkVHuxKiBA.ttf", - "800": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5f1LmE18imdCqxI.ttf", - "800italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VGEt2jkVHuxKiBA.ttf", - "900": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5dlKmE18imdCqxI.ttf", - "900italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VPEp2jkVHuxKiBA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUz9_-1phKLFgshYDvh6Vwt7VxtuA.ttf" - }, - { - "family": "Alegreya Sans SC", - "variants": [ - "100", - "100italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGn4-RGJqfMvt7P8FUr0Q1j-Hf1Dipl8g5FPYtmMg.ttf", - "100italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGl4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdlgRBH452Mvds.ttf", - "300": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1DuJH0iRrMYJ_K-4.ttf", - "300italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdXiZhNaB6O-51OA.ttf", - "regular": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGh4-RGJqfMvt7P8FUr0Q1j-Hf1Nk5v9ixALYs.ttf", - "italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGn4-RGJqfMvt7P8FUr0Q1j-Hf1Bkxl8g5FPYtmMg.ttf", - "500": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1DrpG0iRrMYJ_K-4.ttf", - "500italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdBidhNaB6O-51OA.ttf", - "700": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1DvJA0iRrMYJ_K-4.ttf", - "700italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdTiFhNaB6O-51OA.ttf", - "800": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1Du5D0iRrMYJ_K-4.ttf", - "800italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdUiJhNaB6O-51OA.ttf", - "900": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1DspC0iRrMYJ_K-4.ttf", - "900italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxddiNhNaB6O-51OA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGh4-RGJqfMvt7P8FUr0Q1j-Hf1Bk9l8g.ttf" - }, - { - "family": "Aleo", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KJ3G2P9HI4qCBtJ.ttf", - "200": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KL3GmP9HI4qCBtJ.ttf", - "300": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KIpGmP9HI4qCBtJ.ttf", - "regular": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KJ3GmP9HI4qCBtJ.ttf", - "500": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KJFGmP9HI4qCBtJ.ttf", - "600": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KKpHWP9HI4qCBtJ.ttf", - "700": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KKQHWP9HI4qCBtJ.ttf", - "800": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KL3HWP9HI4qCBtJ.ttf", - "900": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KLeHWP9HI4qCBtJ.ttf", - "100italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WYu_FooIDQtJbok.ttf", - "200italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WQu-FooIDQtJbok.ttf", - "300italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WdW-FooIDQtJbok.ttf", - "italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WYu-FooIDQtJbok.ttf", - "500italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_Wbm-FooIDQtJbok.ttf", - "600italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WVW5FooIDQtJbok.ttf", - "700italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WWy5FooIDQtJbok.ttf", - "800italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WQu5FooIDQtJbok.ttf", - "900italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WSK5FooIDQtJbok.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KJ3GlP8Foo.ttf" - }, - { - "family": "Alex Brush", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/alexbrush/v23/SZc83FzrJKuqFbwMKk6EtUL57DtOmCc.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alexbrush/v23/SZc83FzrJKuqFbwMKk6EhUPz6A.ttf" - }, - { - "family": "Alexandria", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9r7T6bHHJ8BRq0b.ttf", - "200": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9p7TqbHHJ8BRq0b.ttf", - "300": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9qlTqbHHJ8BRq0b.ttf", - "regular": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9r7TqbHHJ8BRq0b.ttf", - "500": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9rJTqbHHJ8BRq0b.ttf", - "600": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9olSabHHJ8BRq0b.ttf", - "700": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9ocSabHHJ8BRq0b.ttf", - "800": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9p7SabHHJ8BRq0b.ttf", - "900": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9pSSabHHJ8BRq0b.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9r7TpbGFps.ttf" - }, - { - "family": "Alfa Slab One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/alfaslabone/v21/6NUQ8FmMKwSEKjnm5-4v-4Jh6dVretWvYmE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alfaslabone/v21/6NUQ8FmMKwSEKjnm5-4v-4Jh2dRhfg.ttf" - }, - { - "family": "Alice", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/alice/v21/OpNCnoEEmtHa6FcJpA_chzJ0.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alice/v21/OpNCnoEEmtHa6GcIrgs.ttf" - }, - { - "family": "Alike", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/alike/v22/HI_EiYEYI6BIoEjBSZXAQ4-d.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alike/v22/HI_EiYEYI6BIoHjAQ5E.ttf" - }, - { - "family": "Alike Angular", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v27", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/alikeangular/v27/3qTrojWunjGQtEBlIcwMbSoI3kM6bB7FKjE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alikeangular/v27/3qTrojWunjGQtEBlIcwMbSoI7kIwaA.ttf" - }, - { - "family": "Alkalami", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/alkalami/v8/zOL_4pfDmqRL95WXi5eLw8BMuvhH.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alkalami/v8/zOL_4pfDmqRL95WXi6eKycQ.ttf" - }, - { - "family": "Alkatra", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "bengali", - "devanagari", - "latin", - "latin-ext", - "oriya" - ], - "version": "v5", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48Medzngmu7cPrNDVemxE.ttf", - "500": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48MedzngUu7cPrNDVemxE.ttf", - "600": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48Medznj4vLcPrNDVemxE.ttf", - "700": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48MedznjBvLcPrNDVemxE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48Medzngmu4cOptQ.ttf" - }, - { - "family": "Allan", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/allan/v26/ea8XadU7WuTxEtb2P9SF8nZE.ttf", - "700": "https://fonts.gstatic.com/s/allan/v26/ea8aadU7WuTxEu5KEPCN2WpNgEKU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/allan/v26/ea8XadU7WuTxEub3NdA.ttf" - }, - { - "family": "Allerta", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/allerta/v19/TwMO-IAHRlkbx940UnEdSQqO5uY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/allerta/v19/TwMO-IAHRlkbx940YnAXTQ.ttf" - }, - { - "family": "Allerta Stencil", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/allertastencil/v24/HTx0L209KT-LmIE9N7OR6eiycOeF-zz313DuvQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/allertastencil/v24/HTx0L209KT-LmIE9N7OR6eiycOe1-jbz.ttf" - }, - { - "family": "Allison", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/allison/v13/X7nl4b88AP2nkbvZOCaQ4MTgAgk.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/allison/v13/X7nl4b88AP2nkbvZCCea5A.ttf" - }, - { - "family": "Allura", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/allura/v23/9oRPNYsQpS4zjuAPjAIXPtrrGA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/allura/v23/9oRPNYsQpS4zjuA_jQgT.ttf" - }, - { - "family": "Almarai", - "variants": [ - "300", - "regular", - "700", - "800" - ], - "subsets": [ - "arabic", - "latin" - ], - "version": "v19", - "lastModified": "2025-09-02", - "files": { - "300": "https://fonts.gstatic.com/s/almarai/v19/tssoApxBaigK_hnnS_anhnicoq72sXg.ttf", - "regular": "https://fonts.gstatic.com/s/almarai/v19/tsstApxBaigK_hnnc1qPonC3vqc.ttf", - "700": "https://fonts.gstatic.com/s/almarai/v19/tssoApxBaigK_hnnS-aghnicoq72sXg.ttf", - "800": "https://fonts.gstatic.com/s/almarai/v19/tssoApxBaigK_hnnS_qjhnicoq72sXg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/almarai/v19/tsstApxBaigK_hnnQ1uFpg.ttf" - }, - { - "family": "Almendra", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/almendra/v28/H4ckBXKAlMnTn0CskyY6wr-wg763.ttf", - "italic": "https://fonts.gstatic.com/s/almendra/v28/H4ciBXKAlMnTn0CskxY4yLuShq63czE.ttf", - "700": "https://fonts.gstatic.com/s/almendra/v28/H4cjBXKAlMnTn0Cskx6G7Zu4qKK-aihq.ttf", - "700italic": "https://fonts.gstatic.com/s/almendra/v28/H4chBXKAlMnTn0CskxY48Ae9oqacbzhqDtg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/almendra/v28/H4ckBXKAlMnTn0CskxY7yLs.ttf" - }, - { - "family": "Almendra Display", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v33", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/almendradisplay/v33/0FlPVOGWl1Sb4O3tETtADHRRlZhzXS_eTyer338.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/almendradisplay/v33/0FlPVOGWl1Sb4O3tETtADHRRlZhzbS7USw.ttf" - }, - { - "family": "Almendra SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v31", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/almendrasc/v31/Iure6Yx284eebowr7hbyTZZJprVA4XQ0.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/almendrasc/v31/Iure6Yx284eebowr7hbyTaZIrLE.ttf" - }, - { - "family": "Alumni Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9OO5QqFsJ3C8qng.ttf", - "200": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9uO9QqFsJ3C8qng.ttf", - "300": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9Zu9QqFsJ3C8qng.ttf", - "regular": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9OO9QqFsJ3C8qng.ttf", - "500": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9Cu9QqFsJ3C8qng.ttf", - "600": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd95uhQqFsJ3C8qng.ttf", - "700": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd93-hQqFsJ3C8qng.ttf", - "800": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9uOhQqFsJ3C8qng.ttf", - "900": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9kehQqFsJ3C8qng.ttf", - "100italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Ky46lEN_io6npfB.ttf", - "200italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kw461EN_io6npfB.ttf", - "300italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kzm61EN_io6npfB.ttf", - "italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Ky461EN_io6npfB.ttf", - "500italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8KyK61EN_io6npfB.ttf", - "600italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kxm7FEN_io6npfB.ttf", - "700italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kxf7FEN_io6npfB.ttf", - "800italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kw47FEN_io6npfB.ttf", - "900italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8KwR7FEN_io6npfB.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9OO9gqVEN.ttf" - }, - { - "family": "Alumni Sans Collegiate One", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/alumnisanscollegiateone/v7/MQpB-XChK8G5CtmK_AuGxQrdNvPSXkn0RM-XqjWWhjdayDiPw2ta.ttf", - "italic": "https://fonts.gstatic.com/s/alumnisanscollegiateone/v7/MQpD-XChK8G5CtmK_AuGxQrdNvPSXkn0RM-XqjWWhgdYwjytxntaDFU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alumnisanscollegiateone/v7/MQpB-XChK8G5CtmK_AuGxQrdNvPSXkn0RM-XqjWWhgdbwjw.ttf" - }, - { - "family": "Alumni Sans Inline One", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/alumnisansinlineone/v7/RrQBbpJx9zZ3IXTBOASKp5gJAetBdaihcjbpD3AZcr7xbYw.ttf", - "italic": "https://fonts.gstatic.com/s/alumnisansinlineone/v7/RrQDbpJx9zZ3IXTBOASKp5gJAetBdaihcjbpP3ITdpz0fYxcrQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alumnisansinlineone/v7/RrQBbpJx9zZ3IXTBOASKp5gJAetBdaihcjbpP3ETdg.ttf" - }, - { - "family": "Alumni Sans Pinstripe", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/alumnisanspinstripe/v8/ZgNNjOFFPq_AUJD1umyS30W-Xub8zD1ObhezYrVIpcDA5w.ttf", - "italic": "https://fonts.gstatic.com/s/alumnisanspinstripe/v8/ZgNDjOFFPq_AUJD1umyS30W-Xub8zD1ObheDYL9Mh8XQ5_cY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alumnisanspinstripe/v8/ZgNNjOFFPq_AUJD1umyS30W-Xub8zD1ObheDY79M.ttf" - }, - { - "family": "Alumni Sans SC", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteaLxWgMKfbBlLNQ.ttf", - "200": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIte6L1WgMKfbBlLNQ.ttf", - "300": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteNr1WgMKfbBlLNQ.ttf", - "regular": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteaL1WgMKfbBlLNQ.ttf", - "500": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteWr1WgMKfbBlLNQ.ttf", - "600": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdItetrpWgMKfbBlLNQ.ttf", - "700": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdItej7pWgMKfbBlLNQ.ttf", - "800": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIte6LpWgMKfbBlLNQ.ttf", - "900": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdItewbpWgMKfbBlLNQ.ttf", - "100italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP6-wsibThxbNRJQ.ttf", - "200italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP4-w8ibThxbNRJQ.ttf", - "300italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP7gw8ibThxbNRJQ.ttf", - "italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP6-w8ibThxbNRJQ.ttf", - "500italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP6Mw8ibThxbNRJQ.ttf", - "600italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP5gxMibThxbNRJQ.ttf", - "700italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP5ZxMibThxbNRJQ.ttf", - "800italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP4-xMibThxbNRJQ.ttf", - "900italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP4XxMibThxbNRJQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteaL1mgcib.ttf" - }, - { - "family": "Amarante", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/amarante/v30/xMQXuF1KTa6EvGx9bq-3C3rAmD-b.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/amarante/v30/xMQXuF1KTa6EvGx9bp-2AX4.ttf" - }, - { - "family": "Amaranth", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/amaranth/v19/KtkuALODe433f0j1zPnCF9GqwnzW.ttf", - "italic": "https://fonts.gstatic.com/s/amaranth/v19/KtkoALODe433f0j1zMnAHdWIx2zWD4I.ttf", - "700": "https://fonts.gstatic.com/s/amaranth/v19/KtkpALODe433f0j1zMF-OPWi6WDfFpuc.ttf", - "700italic": "https://fonts.gstatic.com/s/amaranth/v19/KtkrALODe433f0j1zMnAJWmn42T9E4ucRY8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/amaranth/v19/KtkuALODe433f0j1zMnDHdU.ttf" - }, - { - "family": "Amatic SC", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/amaticsc/v28/TUZyzwprpvBS1izr_vO0De6ecZQf1A.ttf", - "700": "https://fonts.gstatic.com/s/amaticsc/v28/TUZ3zwprpvBS1izr_vOMscG6eb8D3WTy-A.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/amaticsc/v28/TUZyzwprpvBS1izr_vOEDOSa.ttf" - }, - { - "family": "Amethysta", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/amethysta/v17/rP2Fp2K15kgb_F3ibfWIGDWCBl0O8Q.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/amethysta/v17/rP2Fp2K15kgb_F3ibfW4GT-G.ttf" - }, - { - "family": "Amiko", - "variants": [ - "regular", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/amiko/v15/WwkQxPq1DFK04tqlc17MMZgJ.ttf", - "600": "https://fonts.gstatic.com/s/amiko/v15/WwkdxPq1DFK04uJ9XXrEGoQAUco5.ttf", - "700": "https://fonts.gstatic.com/s/amiko/v15/WwkdxPq1DFK04uIZXHrEGoQAUco5.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/amiko/v15/WwkQxPq1DFK04uqkeVo.ttf" - }, - { - "family": "Amiri", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/amiri/v30/J7aRnpd8CGxBHqUpvrIw74NL.ttf", - "italic": "https://fonts.gstatic.com/s/amiri/v30/J7afnpd8CGxBHpUrtLYS6pNLAjk.ttf", - "700": "https://fonts.gstatic.com/s/amiri/v30/J7acnpd8CGxBHp2VkZY4xJ9CGyAa.ttf", - "700italic": "https://fonts.gstatic.com/s/amiri/v30/J7aanpd8CGxBHpUrjAo9zptgHjAavCA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/amiri/v30/J7aRnpd8CGxBHpUotLY.ttf" - }, - { - "family": "Amiri Quran", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin" - ], - "version": "v19", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/amiriquran/v19/_Xmo-Hk0rD6DbUL4_vH8Zq5t7Cycsu-2.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/amiriquran/v19/_Xmo-Hk0rD6DbUL4_vH8Zp5s5ig.ttf" - }, - { - "family": "Amita", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/amita/v20/HhyaU5si9Om7PQlvAfSKEZZL.ttf", - "700": "https://fonts.gstatic.com/s/amita/v20/HhyXU5si9Om7PTHTLtCCOopCTKkI.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/amita/v20/HhyaU5si9Om7PTluC_A.ttf" - }, - { - "family": "Anaheim", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h5sLqrFIkJQb7zU.ttf", - "500": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h5eLqrFIkJQb7zU.ttf", - "600": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h6yKarFIkJQb7zU.ttf", - "700": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h6LKarFIkJQb7zU.ttf", - "800": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h7sKarFIkJQb7zU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h5sLprEKEY.ttf" - }, - { - "family": "Ancizar Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "greek", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMyzipBpIu30AZbUY.ttf", - "200": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy7ioBpIu30AZbUY.ttf", - "300": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy2aoBpIu30AZbUY.ttf", - "regular": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMyzioBpIu30AZbUY.ttf", - "500": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMywqoBpIu30AZbUY.ttf", - "600": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy-avBpIu30AZbUY.ttf", - "700": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy9-vBpIu30AZbUY.ttf", - "800": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy7ivBpIu30AZbUY.ttf", - "900": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy5GvBpIu30AZbUY.ttf", - "100italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDr7tAk22IcfUZgBQ.ttf", - "200italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrbtEk22IcfUZgBQ.ttf", - "300italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrsNEk22IcfUZgBQ.ttf", - "italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDr7tEk22IcfUZgBQ.ttf", - "500italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDr3NEk22IcfUZgBQ.ttf", - "600italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrMNYk22IcfUZgBQ.ttf", - "700italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrCdYk22IcfUZgBQ.ttf", - "800italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrbtYk22IcfUZgBQ.ttf", - "900italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrR9Yk22IcfUZgBQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMyzioNpMk2w.ttf" - }, - { - "family": "Ancizar Serif", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "greek", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN2H_fAQtYfaQ_ao.ttf", - "regular": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN3Z_fAQtYfaQ_ao.ttf", - "500": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN3r_fAQtYfaQ_ao.ttf", - "600": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN0H-vAQtYfaQ_ao.ttf", - "700": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN0--vAQtYfaQ_ao.ttf", - "800": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN1Z-vAQtYfaQ_ao.ttf", - "900": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN1w-vAQtYfaQ_ao.ttf", - "300italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvkZTv4P4Ruao7Y0.ttf", - "italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvhhTv4P4Ruao7Y0.ttf", - "500italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvipTv4P4Ruao7Y0.ttf", - "600italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvsZUv4P4Ruao7Y0.ttf", - "700italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvv9Uv4P4Ruao7Y0.ttf", - "800italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvphUv4P4Ruao7Y0.ttf", - "900italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvrFUv4P4Ruao7Y0.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN3Z_cARv4M.ttf" - }, - { - "family": "Andada Pro", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DPJBY8cFLzvIt2S.ttf", - "500": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DP7BY8cFLzvIt2S.ttf", - "600": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DMXAo8cFLzvIt2S.ttf", - "700": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DMuAo8cFLzvIt2S.ttf", - "800": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DNJAo8cFLzvIt2S.ttf", - "italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRmdfHrjNJ82Stjw.ttf", - "500italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRlVfHrjNJ82Stjw.ttf", - "600italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRrlYHrjNJ82Stjw.ttf", - "700italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRoBYHrjNJ82Stjw.ttf", - "800italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRudYHrjNJ82Stjw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DPJBb8dHrg.ttf" - }, - { - "family": "Andika", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/andika/v27/mem_Ya6iyW-LwqgAbbwRWrwGVA.ttf", - "italic": "https://fonts.gstatic.com/s/andika/v27/mem9Ya6iyW-Lwqgwb7YVeLkWVNBt.ttf", - "700": "https://fonts.gstatic.com/s/andika/v27/mem8Ya6iyW-Lwqg40ZM1UpcaXcl0Aw.ttf", - "700italic": "https://fonts.gstatic.com/s/andika/v27/mem6Ya6iyW-Lwqgwb46pV50ef8xkA76a.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/andika/v27/mem_Ya6iyW-LwqgwbLYV.ttf" - }, - { - "family": "Anek Bangla", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "bengali", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofm9YIocg56yyvt0.ttf", - "200": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofu9ZIocg56yyvt0.ttf", - "300": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3OfjFZIocg56yyvt0.ttf", - "regular": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofm9ZIocg56yyvt0.ttf", - "500": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofl1ZIocg56yyvt0.ttf", - "600": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3OfrFeIocg56yyvt0.ttf", - "700": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3OfoheIocg56yyvt0.ttf", - "800": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofu9eIocg56yyvt0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofm9ZEoYq4w.ttf" - }, - { - "family": "Anek Devanagari", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLDtk-9nFk0LjZ7E.ttf", - "200": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLBtku9nFk0LjZ7E.ttf", - "300": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLCzku9nFk0LjZ7E.ttf", - "regular": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLDtku9nFk0LjZ7E.ttf", - "500": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLDfku9nFk0LjZ7E.ttf", - "600": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLAzle9nFk0LjZ7E.ttf", - "700": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLAKle9nFk0LjZ7E.ttf", - "800": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLBtle9nFk0LjZ7E.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLDtkt9mHEk.ttf" - }, - { - "family": "Anek Gujarati", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0F5G7w0KgB7Lm7g.ttf", - "200": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0l5C7w0KgB7Lm7g.ttf", - "300": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0SZC7w0KgB7Lm7g.ttf", - "regular": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0F5C7w0KgB7Lm7g.ttf", - "500": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0JZC7w0KgB7Lm7g.ttf", - "600": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0yZe7w0KgB7Lm7g.ttf", - "700": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-08Je7w0KgB7Lm7g.ttf", - "800": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0l5e7w0KgB7Lm7g.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0F5CLwkik.ttf" - }, - { - "family": "Anek Gurmukhi", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "gurmukhi", - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbd5ppXK41H6DjbA.ttf", - "200": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkb95tpXK41H6DjbA.ttf", - "300": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbKZtpXK41H6DjbA.ttf", - "regular": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbd5tpXK41H6DjbA.ttf", - "500": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbRZtpXK41H6DjbA.ttf", - "600": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbqZxpXK41H6DjbA.ttf", - "700": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbkJxpXK41H6DjbA.ttf", - "800": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkb95xpXK41H6DjbA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbd5tZXaQx.ttf" - }, - { - "family": "Anek Kannada", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dFDEAukVReA1oef.ttf", - "200": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dHDEQukVReA1oef.ttf", - "300": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dEdEQukVReA1oef.ttf", - "regular": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dFDEQukVReA1oef.ttf", - "500": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dFxEQukVReA1oef.ttf", - "600": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dGdFgukVReA1oef.ttf", - "700": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dGkFgukVReA1oef.ttf", - "800": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dHDFgukVReA1oef.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dFDETulXxM.ttf" - }, - { - "family": "Anek Latin", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuR7EZKdClWL3kgw.ttf", - "200": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3Pux7AZKdClWL3kgw.ttf", - "300": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuGbAZKdClWL3kgw.ttf", - "regular": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuR7AZKdClWL3kgw.ttf", - "500": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PudbAZKdClWL3kgw.ttf", - "600": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PumbcZKdClWL3kgw.ttf", - "700": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuoLcZKdClWL3kgw.ttf", - "800": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3Pux7cZKdClWL3kgw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuR7ApKNqh.ttf" - }, - { - "family": "Anek Malayalam", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "malayalam" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUZu_HMr5PDO71Qs.ttf", - "200": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTURu-HMr5PDO71Qs.ttf", - "300": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUcW-HMr5PDO71Qs.ttf", - "regular": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUZu-HMr5PDO71Qs.ttf", - "500": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUam-HMr5PDO71Qs.ttf", - "600": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUUW5HMr5PDO71Qs.ttf", - "700": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUXy5HMr5PDO71Qs.ttf", - "800": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTURu5HMr5PDO71Qs.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUZu-LMvzOA.ttf" - }, - { - "family": "Anek Odia", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "oriya" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnmZf63mXZAtm_es.ttf", - "200": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnkZfq3mXZAtm_es.ttf", - "300": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnnHfq3mXZAtm_es.ttf", - "regular": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnmZfq3mXZAtm_es.ttf", - "500": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnmrfq3mXZAtm_es.ttf", - "600": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnlHea3mXZAtm_es.ttf", - "700": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnl-ea3mXZAtm_es.ttf", - "800": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnkZea3mXZAtm_es.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnmZfp3nV5Q.ttf" - }, - { - "family": "Anek Tamil", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNQiZ6q4v4oegjOQ.ttf", - "200": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNwid6q4v4oegjOQ.ttf", - "300": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNHCd6q4v4oegjOQ.ttf", - "regular": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNQid6q4v4oegjOQ.ttf", - "500": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNcCd6q4v4oegjOQ.ttf", - "600": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNnCB6q4v4oegjOQ.ttf", - "700": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNpSB6q4v4oegjOQ.ttf", - "800": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNwiB6q4v4oegjOQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNQidKqoH8.ttf" - }, - { - "family": "Anek Telugu", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "telugu" - ], - "version": "v13", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13y-_oE2G2ep10_8.ttf", - "200": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i136--oE2G2ep10_8.ttf", - "300": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i133G-oE2G2ep10_8.ttf", - "regular": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13y--oE2G2ep10_8.ttf", - "500": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13x2-oE2G2ep10_8.ttf", - "600": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13_G5oE2G2ep10_8.ttf", - "700": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i138i5oE2G2ep10_8.ttf", - "800": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i136-5oE2G2ep10_8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13y--kEyM3Q.ttf" - }, - { - "family": "Angkor", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v35", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/angkor/v35/H4cmBXyAlsPdnlb-8iw-4Lqggw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/angkor/v35/H4cmBXyAlsPdnlbO8yY6.ttf" - }, - { - "family": "Annapurna SIL", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/annapurnasil/v2/yYLv0hDY0f2iu9tPmRWtllid8NN9dZT_PZs.ttf", - "700": "https://fonts.gstatic.com/s/annapurnasil/v2/yYLy0hDY0f2iu9tPmRWtllidyG9SUZzUIZJ008A.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/annapurnasil/v2/yYLv0hDY0f2iu9tPmRWtllidwNJ3cQ.ttf" - }, - { - "family": "Annie Use Your Telescope", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/annieuseyourtelescope/v20/daaLSS4tI2qYYl3Jq9s_Hu74xwktnlKxH6osGVGjlDfB3UUVZA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/annieuseyourtelescope/v20/daaLSS4tI2qYYl3Jq9s_Hu74xwktnlKxH6osGVGTlT3F.ttf" - }, - { - "family": "Anonymous Pro", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "greek", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2Bp2a15UIB7Un-bOeISG3pLlw89CH98Ko.ttf", - "italic": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2fp2a15UIB7Un-bOeISG3pHl428AP44Kqr2Q.ttf", - "700": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2cp2a15UIB7Un-bOeISG3pFuAT0CnW7KOywKo.ttf", - "700italic": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2ap2a15UIB7Un-bOeISG3pHl4OTCzc6IG30KqB9Q.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2Bp2a15UIB7Un-bOeISG3pHl028A.ttf" - }, - { - "family": "Anta", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/anta/v1/gyBzhwQ3KsIyZFwxPFimIo0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anta/v1/gyBzhwQ3KsIyVF07OA.ttf" - }, - { - "family": "Antic", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/antic/v20/TuGfUVB8XY5DRaZLodgzydtk.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/antic/v20/TuGfUVB8XY5DRZZKq9w.ttf" - }, - { - "family": "Antic Didone", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/anticdidone/v17/RWmPoKKX6u8sp8fIWdnDKqDiqYsGBGBzCw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anticdidone/v17/RWmPoKKX6u8sp8fIWdnDKqDSqIEC.ttf" - }, - { - "family": "Antic Slab", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/anticslab/v17/bWt97fPFfRzkCa9Jlp6IWcJWXW5p5Qo.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anticslab/v17/bWt97fPFfRzkCa9Jlp6IacNcWQ.ttf" - }, - { - "family": "Anton", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/anton/v27/1Ptgg87LROyAm0K08i4gS7lu.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anton/v27/1Ptgg87LROyAm3K1-Co.ttf" - }, - { - "family": "Anton SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/antonsc/v1/4UaBrEBBsgltGn71sxLmzanB44N1.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/antonsc/v1/4UaBrEBBsgltGn71syLnx60.ttf" - }, - { - "family": "Antonio", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVxx8BtIY2DwSXlM.ttf", - "200": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVzx8RtIY2DwSXlM.ttf", - "300": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVwv8RtIY2DwSXlM.ttf", - "regular": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVxx8RtIY2DwSXlM.ttf", - "500": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVxD8RtIY2DwSXlM.ttf", - "600": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVyv9htIY2DwSXlM.ttf", - "700": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVyW9htIY2DwSXlM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVxx8StJaWQ.ttf" - }, - { - "family": "Anuphan", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCkY9A4kGmW927Gu.ttf", - "200": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCmY9Q4kGmW927Gu.ttf", - "300": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZClG9Q4kGmW927Gu.ttf", - "regular": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCkY9Q4kGmW927Gu.ttf", - "500": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCkq9Q4kGmW927Gu.ttf", - "600": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCnG8g4kGmW927Gu.ttf", - "700": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCn_8g4kGmW927Gu.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCkY9T4lEGE.ttf" - }, - { - "family": "Anybody", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4J12HPrsXD_nBPpQ.ttf", - "200": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JV2DPrsXD_nBPpQ.ttf", - "300": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JiWDPrsXD_nBPpQ.ttf", - "regular": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4J12DPrsXD_nBPpQ.ttf", - "500": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4J5WDPrsXD_nBPpQ.ttf", - "600": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JCWfPrsXD_nBPpQ.ttf", - "700": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JMGfPrsXD_nBPpQ.ttf", - "800": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JV2fPrsXD_nBPpQ.ttf", - "900": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JfmfPrsXD_nBPpQ.ttf", - "100italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyMn7M_H3HVfpcHY.ttf", - "200italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyOn7c_H3HVfpcHY.ttf", - "300italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyN57c_H3HVfpcHY.ttf", - "italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyMn7c_H3HVfpcHY.ttf", - "500italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyMV7c_H3HVfpcHY.ttf", - "600italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyP56s_H3HVfpcHY.ttf", - "700italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyPA6s_H3HVfpcHY.ttf", - "800italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyOn6s_H3HVfpcHY.ttf", - "900italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyOO6s_H3HVfpcHY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4J12D_r8_H.ttf" - }, - { - "family": "Aoboshi One", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/aoboshione/v13/Gg8xN5kXaAXtHQrFxwl10ysLBmZX_UEg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aoboshione/v13/Gg8xN5kXaAXtHQrFxwl10xsKDGI.ttf" - }, - { - "family": "Arapey", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/arapey/v17/-W__XJn-UDDA2RC6Z9AcZkIzeg.ttf", - "italic": "https://fonts.gstatic.com/s/arapey/v17/-W_9XJn-UDDA2RCKZdoYREcjeo0k.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arapey/v17/-W__XJn-UDDA2RCKZtoY.ttf" - }, - { - "family": "Arbutus", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/arbutus/v30/NaPYcZ7dG_5J3poob9JtryO8fMU.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arbutus/v30/NaPYcZ7dG_5J3pooX9Nnqw.ttf" - }, - { - "family": "Arbutus Slab", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/arbutusslab/v17/oY1Z8e7OuLXkJGbXtr5ba7ZVa68dJlaFAQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arbutusslab/v17/oY1Z8e7OuLXkJGbXtr5ba7ZlaqUZ.ttf" - }, - { - "family": "Architects Daughter", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/architectsdaughter/v20/KtkxAKiDZI_td1Lkx62xHZHDtgO_Y-bvfY5q4szgE-Q.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/architectsdaughter/v20/KtkxAKiDZI_td1Lkx62xHZHDtgO_Y-bvTY9g5g.ttf" - }, - { - "family": "Archivo", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTNDJp8B1oJ0vyVQ.ttf", - "200": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTtDNp8B1oJ0vyVQ.ttf", - "300": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTajNp8B1oJ0vyVQ.ttf", - "regular": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTNDNp8B1oJ0vyVQ.ttf", - "500": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTBjNp8B1oJ0vyVQ.ttf", - "600": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTT6jRp8B1oJ0vyVQ.ttf", - "700": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTT0zRp8B1oJ0vyVQ.ttf", - "800": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTtDRp8B1oJ0vyVQ.ttf", - "900": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTnTRp8B1oJ0vyVQ.ttf", - "100italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HCBshdsBU7iVdxQ.ttf", - "200italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HABsxdsBU7iVdxQ.ttf", - "300italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HDfsxdsBU7iVdxQ.ttf", - "italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HCBsxdsBU7iVdxQ.ttf", - "500italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HCzsxdsBU7iVdxQ.ttf", - "600italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HBftBdsBU7iVdxQ.ttf", - "700italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HBmtBdsBU7iVdxQ.ttf", - "800italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HABtBdsBU7iVdxQ.ttf", - "900italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HAotBdsBU7iVdxQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTNDNZ8Rds.ttf" - }, - { - "family": "Archivo Black", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/archivoblack/v23/HTxqL289NzCGg4MzN6KJ7eW6OYuP_x7yx3A.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/archivoblack/v23/HTxqL289NzCGg4MzN6KJ7eW6CYqF-w.ttf" - }, - { - "family": "Archivo Narrow", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v35", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvLFGKpHOtFCQ76Q.ttf", - "500": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvHlGKpHOtFCQ76Q.ttf", - "600": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhv8laKpHOtFCQ76Q.ttf", - "700": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvy1aKpHOtFCQ76Q.ttf", - "italic": "https://fonts.gstatic.com/s/archivonarrow/v35/tss7ApVBdCYD5Q7hcxTE1ArZ0bb1k3JSLwe1hB965BJi53mpNiEr6T6Y.ttf", - "500italic": "https://fonts.gstatic.com/s/archivonarrow/v35/tss7ApVBdCYD5Q7hcxTE1ArZ0bb1k3JSLwe1hB965BJQ53mpNiEr6T6Y.ttf", - "600italic": "https://fonts.gstatic.com/s/archivonarrow/v35/tss7ApVBdCYD5Q7hcxTE1ArZ0bb1k3JSLwe1hB965BK84HmpNiEr6T6Y.ttf", - "700italic": "https://fonts.gstatic.com/s/archivonarrow/v35/tss7ApVBdCYD5Q7hcxTE1ArZ0bb1k3JSLwe1hB965BKF4HmpNiEr6T6Y.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvLFG6pXmp.ttf" - }, - { - "family": "Are You Serious", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/areyouserious/v14/ll8kK2GVSSr-PtjQ5nONVcNn4306hT9nCGRayg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/areyouserious/v14/ll8kK2GVSSr-PtjQ5nONVcNn430KhDVj.ttf" - }, - { - "family": "Aref Ruqaa", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/arefruqaa/v26/WwkbxPW1E165rajQKDulEIAiVNo5xNY.ttf", - "700": "https://fonts.gstatic.com/s/arefruqaa/v26/WwkYxPW1E165rajQKDulKDwNcNIS2N_7Bdk.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arefruqaa/v26/WwkbxPW1E165rajQKDulIIEoUA.ttf" - }, - { - "family": "Aref Ruqaa Ink", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/arefruqaaink/v11/1q2fY5WOGUFlt84GTOkP6Kdx72ThVIGpgnxL.ttf", - "700": "https://fonts.gstatic.com/s/arefruqaaink/v11/1q2cY5WOGUFlt84GTOkP6Kdx71xde6WhqWBCyxWn.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arefruqaaink/v11/1q2fY5WOGUFlt84GTOkP6Kdx71TgXoU.ttf", - "colorCapabilities": [ - "COLRv1", - "SVG" - ] - }, - { - "family": "Arima", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "greek", - "greek-ext", - "latin", - "latin-ext", - "malayalam", - "tamil", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1YTE-pQGOyYw2fw.ttf", - "200": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX14TA-pQGOyYw2fw.ttf", - "300": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1PzA-pQGOyYw2fw.ttf", - "regular": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1YTA-pQGOyYw2fw.ttf", - "500": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1UzA-pQGOyYw2fw.ttf", - "600": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1vzc-pQGOyYw2fw.ttf", - "700": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1hjc-pQGOyYw2fw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1YTAOpAuK.ttf" - }, - { - "family": "Arimo", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v35", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk37cxsBxDAVQI4aA.ttf", - "500": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk338xsBxDAVQI4aA.ttf", - "600": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk3M8tsBxDAVQI4aA.ttf", - "700": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk3CstsBxDAVQI4aA.ttf", - "italic": "https://fonts.gstatic.com/s/arimo/v35/P5sdzZCDf9_T_10c3i9MeUcyat4iJY-ERBrEdwcoaKww.ttf", - "500italic": "https://fonts.gstatic.com/s/arimo/v35/P5sdzZCDf9_T_10c3i9MeUcyat4iJY-2RBrEdwcoaKww.ttf", - "600italic": "https://fonts.gstatic.com/s/arimo/v35/P5sdzZCDf9_T_10c3i9MeUcyat4iJY9aQxrEdwcoaKww.ttf", - "700italic": "https://fonts.gstatic.com/s/arimo/v35/P5sdzZCDf9_T_10c3i9MeUcyat4iJY9jQxrEdwcoaKww.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk37cxcBhrE.ttf" - }, - { - "family": "Arizonia", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/arizonia/v23/neIIzCemt4A5qa7mv6WGHK06UY30.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arizonia/v23/neIIzCemt4A5qa7mv5WHFqk.ttf" - }, - { - "family": "Armata", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/armata/v21/gokvH63_HV5jQ-E9lD53Q2u_mQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/armata/v21/gokvH63_HV5jQ-ENlTRz.ttf" - }, - { - "family": "Arsenal", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/arsenal/v13/wXKrE3kQtZQ4pF3D11_WAewrhXY.ttf", - "italic": "https://fonts.gstatic.com/s/arsenal/v13/wXKpE3kQtZQ4pF3D513cBc4ulXYrtA.ttf", - "700": "https://fonts.gstatic.com/s/arsenal/v13/wXKuE3kQtZQ4pF3D7-P5JeQAmX8yrdk.ttf", - "700italic": "https://fonts.gstatic.com/s/arsenal/v13/wXKsE3kQtZQ4pF3D513kueEKnV03vdnKjw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arsenal/v13/wXKrE3kQtZQ4pF3D517cBQ.ttf" - }, - { - "family": "Arsenal SC", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/arsenalsc/v1/x3dlckLHea6e5BEtsfxiXNossybsHQI.ttf", - "italic": "https://fonts.gstatic.com/s/arsenalsc/v1/x3dnckLHea6e5BEtsfxibNgmtwTpDQIrGg.ttf", - "700": "https://fonts.gstatic.com/s/arsenalsc/v1/x3dmckLHea6e5BEtsfxiZGYDly7HAQsyA2Y.ttf", - "700italic": "https://fonts.gstatic.com/s/arsenalsc/v1/x3d4ckLHea6e5BEtsfxibNgeCyvNBSk3E2YljQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arsenalsc/v1/x3dlckLHea6e5BEtsfxibNsmtw.ttf" - }, - { - "family": "Artifika", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/artifika/v22/VEMyRoxzronptCuxu6Wt5jDtreOL.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/artifika/v22/VEMyRoxzronptCuxu5Ws7DQ.ttf" - }, - { - "family": "Arvo", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/arvo/v23/tDbD2oWUg0MKmSAa7Lzr7vs.ttf", - "italic": "https://fonts.gstatic.com/s/arvo/v23/tDbN2oWUg0MKqSIQ6J7u_vvijQ.ttf", - "700": "https://fonts.gstatic.com/s/arvo/v23/tDbM2oWUg0MKoZw1yLTA8vL7lAE.ttf", - "700italic": "https://fonts.gstatic.com/s/arvo/v23/tDbO2oWUg0MKqSIoVLHK9tD-hAHkGg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arvo/v23/tDbD2oWUg0MKqSEQ6A.ttf" - }, - { - "family": "Arya", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/arya/v21/ga6CawNG-HJd9Ub1-beqdFE.ttf", - "700": "https://fonts.gstatic.com/s/arya/v21/ga6NawNG-HJdzfra3b-BaFg3dRE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/arya/v21/ga6CawNG-HJdxUf__Q.ttf" - }, - { - "family": "Asap", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v34", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYkqQsLmOXoA7Glw.ttf", - "200": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYEqUsLmOXoA7Glw.ttf", - "300": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYzKUsLmOXoA7Glw.ttf", - "regular": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYkqUsLmOXoA7Glw.ttf", - "500": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYoKUsLmOXoA7Glw.ttf", - "600": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYTKIsLmOXoA7Glw.ttf", - "700": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYdaIsLmOXoA7Glw.ttf", - "800": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYEqIsLmOXoA7Glw.ttf", - "900": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYO6IsLmOXoA7Glw.ttf", - "100italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWubEbGmTggvWl0Qn.ttf", - "200italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuZEbWmTggvWl0Qn.ttf", - "300italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuaabWmTggvWl0Qn.ttf", - "italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWubEbWmTggvWl0Qn.ttf", - "500italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWub2bWmTggvWl0Qn.ttf", - "600italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuYaammTggvWl0Qn.ttf", - "700italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuYjammTggvWl0Qn.ttf", - "800italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuZEammTggvWl0Qn.ttf", - "900italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuZtammTggvWl0Qn.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYkqUcL2mT.ttf" - }, - { - "family": "Asap Condensed", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-02", - "files": { - "200": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO9DSWlEgGqgp-pO.ttf", - "200italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUIFFim6CovpOkXA.ttf", - "300": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO8nSmlEgGqgp-pO.ttf", - "300italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUOVGim6CovpOkXA.ttf", - "regular": "https://fonts.gstatic.com/s/asapcondensed/v18/pxidypY1o9NHyXh3WvSbGSggdNeLYk1Mq3ap.ttf", - "italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxifypY1o9NHyXh3WvSbGSggdOeJaElurmapvvM.ttf", - "500": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO9_S2lEgGqgp-pO.ttf", - "500italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUL1Him6CovpOkXA.ttf", - "600": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO9TTGlEgGqgp-pO.ttf", - "600italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUJFAim6CovpOkXA.ttf", - "700": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO83TWlEgGqgp-pO.ttf", - "700italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUPVBim6CovpOkXA.ttf", - "800": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO8rTmlEgGqgp-pO.ttf", - "800italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUOlCim6CovpOkXA.ttf", - "900": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO8PT2lEgGqgp-pO.ttf", - "900italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUM1Dim6CovpOkXA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/asapcondensed/v18/pxidypY1o9NHyXh3WvSbGSggdOeKaEk.ttf" - }, - { - "family": "Asar", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/asar/v24/sZlLdRyI6TBIXkYQDLlTW6E.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/asar/v24/sZlLdRyI6TBIbkcaCA.ttf" - }, - { - "family": "Asimovian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/asimovian/v2/oY1c8evOub78P2XN94MXCv5xY4QBLw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/asimovian/v2/oY1c8evOub78P2XN94MnC_R1.ttf" - }, - { - "family": "Asset", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v30", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/asset/v30/SLXGc1na-mM4cWImRJqExst1.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/asset/v30/SLXGc1na-mM4cVInTp4.ttf" - }, - { - "family": "Assistant", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtmZnEGGf3qGuvM4.ttf", - "300": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtrhnEGGf3qGuvM4.ttf", - "regular": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtuZnEGGf3qGuvM4.ttf", - "500": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQttRnEGGf3qGuvM4.ttf", - "600": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtjhgEGGf3qGuvM4.ttf", - "700": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtgFgEGGf3qGuvM4.ttf", - "800": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtmZgEGGf3qGuvM4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtuZnIGCV2g.ttf" - }, - { - "family": "Asta Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v3", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo6r_mVnvqYRoVr0.ttf", - "regular": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo_T_mVnvqYRoVr0.ttf", - "500": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo8b_mVnvqYRoVr0.ttf", - "600": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveoyr4mVnvqYRoVr0.ttf", - "700": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveoxP4mVnvqYRoVr0.ttf", - "800": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo3T4mVnvqYRoVr0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo_T_qVjlrQ.ttf" - }, - { - "family": "Astloch", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/astloch/v27/TuGRUVJ8QI5GSeUjq9wRzMtkH1Q.ttf", - "700": "https://fonts.gstatic.com/s/astloch/v27/TuGUUVJ8QI5GSeUjk2A-6MNPA10xLMQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/astloch/v27/TuGRUVJ8QI5GSeUjm90byA.ttf" - }, - { - "family": "Asul", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/asul/v22/VuJ-dNjKxYr46fMFXK78JIg.ttf", - "700": "https://fonts.gstatic.com/s/asul/v22/VuJxdNjKxYr40U8qeKbXOIFneRo.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/asul/v22/VuJ-dNjKxYr42fIPWA.ttf" - }, - { - "family": "Athiti", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wAxDNyAv2-C99ycg.ttf", - "300": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wAoDByAv2-C99ycg.ttf", - "regular": "https://fonts.gstatic.com/s/athiti/v14/pe0vMISdLIZIv1w4DBhWCtaiAg.ttf", - "500": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wA-DFyAv2-C99ycg.ttf", - "600": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wA1DZyAv2-C99ycg.ttf", - "700": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wAsDdyAv2-C99ycg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/athiti/v14/pe0vMISdLIZIv1wIDRJS.ttf" - }, - { - "family": "Atkinson Hyperlegible", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt23C1KxNDXMspQ1lPyU89-1h6ONRlW45GE5ZgpewSSbQ.ttf", - "italic": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt43C1KxNDXMspQ1lPyU89-1h6ONRlW45G055ItWQGCbUWn.ttf", - "700": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt73C1KxNDXMspQ1lPyU89-1h6ONRlW45G8WbcNcy-OZFy-FA.ttf", - "700italic": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt93C1KxNDXMspQ1lPyU89-1h6ONRlW45G056qRdiWKRlmuFH24.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt23C1KxNDXMspQ1lPyU89-1h6ONRlW45G05JIt.ttf" - }, - { - "family": "Atkinson Hyperlegible Mono", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZnNeiDSkb2qzelw.ttf", - "300": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZQteiDSkb2qzelw.ttf", - "regular": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZHNeiDSkb2qzelw.ttf", - "500": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZLteiDSkb2qzelw.ttf", - "600": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZwtCiDSkb2qzelw.ttf", - "700": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZ-9CiDSkb2qzelw.ttf", - "800": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZnNCiDSkb2qzelw.ttf", - "200italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JTKTiMf-KnOlxYs.ttf", - "300italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JQUTiMf-KnOlxYs.ttf", - "italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JRKTiMf-KnOlxYs.ttf", - "500italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JR4TiMf-KnOlxYs.ttf", - "600italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JSUSSMf-KnOlxYs.ttf", - "700italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JStSSMf-KnOlxYs.ttf", - "800italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JTKSSMf-KnOlxYs.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZHNeSDCMf.ttf" - }, - { - "family": "Atkinson Hyperlegible Next", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3bLQhtNl93TwPEQ.ttf", - "300": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3srQhtNl93TwPEQ.ttf", - "regular": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW37LQhtNl93TwPEQ.ttf", - "500": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW33rQhtNl93TwPEQ.ttf", - "600": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3MrMhtNl93TwPEQ.ttf", - "700": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3C7MhtNl93TwPEQ.ttf", - "800": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3bLMhtNl93TwPEQ.ttf", - "200italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPdJ99N5_zkfEYNP.ttf", - "300italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPeX99N5_zkfEYNP.ttf", - "italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPfJ99N5_zkfEYNP.ttf", - "500italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPf799N5_zkfEYNP.ttf", - "600italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPcX8NN5_zkfEYNP.ttf", - "700italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPcu8NN5_zkfEYNP.ttf", - "800italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPdJ8NN5_zkfEYNP.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW37LQRtdN5.ttf" - }, - { - "family": "Atma", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "bengali", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/atma/v19/uK_z4rqWc-Eoo8JzKjc9PvedRkM.ttf", - "regular": "https://fonts.gstatic.com/s/atma/v19/uK_84rqWc-Eom25bDj8WIv4.ttf", - "500": "https://fonts.gstatic.com/s/atma/v19/uK_z4rqWc-Eoo5pyKjc9PvedRkM.ttf", - "600": "https://fonts.gstatic.com/s/atma/v19/uK_z4rqWc-Eoo7Z1Kjc9PvedRkM.ttf", - "700": "https://fonts.gstatic.com/s/atma/v19/uK_z4rqWc-Eoo9J0Kjc9PvedRkM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/atma/v19/uK_84rqWc-Eoq29RCg.ttf" - }, - { - "family": "Atomic Age", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/atomicage/v29/f0Xz0eug6sdmRFkYZZGL58Ht9a8GYeA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/atomicage/v29/f0Xz0eug6sdmRFkYZZGL18Dn8Q.ttf" - }, - { - "family": "Aubrey", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v29", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/aubrey/v29/q5uGsou7NPBw-p7vugNsCxVEgA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/aubrey/v29/q5uGsou7NPBw-p7fuwlo.ttf" - }, - { - "family": "Audiowide", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/audiowide/v22/l7gdbjpo0cum0ckerWCtkQXPExpQBw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/audiowide/v22/l7gdbjpo0cum0ckerWCdkA_L.ttf" - }, - { - "family": "Autour One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/autourone/v25/UqyVK80cP25l3fJgbdfbk5lWVscxdKE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/autourone/v25/UqyVK80cP25l3fJgbdfbo5hcUg.ttf" - }, - { - "family": "Average", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/average/v19/fC1hPYBHe23MxA7rIeJwVWytTyk.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/average/v19/fC1hPYBHe23MxA7rEeN6UQ.ttf" - }, - { - "family": "Average Sans", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/averagesans/v17/1Ptpg8fLXP2dlAXR-HlJJNJPBdqazVoK4A.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/averagesans/v17/1Ptpg8fLXP2dlAXR-HlJJNJ_BNCe.ttf" - }, - { - "family": "Averia Gruesa Libre", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/averiagruesalibre/v22/NGSov4nEGEktOaDRKsY-1dhh8eEtIx3ZUmmJw0SLRA8.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/averiagruesalibre/v22/NGSov4nEGEktOaDRKsY-1dhh8eEtIx3ZYmiDxw.ttf" - }, - { - "family": "Averia Libre", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-05-30", - "files": { - "300": "https://fonts.gstatic.com/s/averialibre/v16/2V0FKIcMGZEnV6xygz7eNjEarovtb07t-pQgTw.ttf", - "300italic": "https://fonts.gstatic.com/s/averialibre/v16/2V0HKIcMGZEnV6xygz7eNjESAJFhbUTp2JEwT4Sk.ttf", - "regular": "https://fonts.gstatic.com/s/averialibre/v16/2V0aKIcMGZEnV6xygz7eNjEiAqPJZ2Xx8w.ttf", - "italic": "https://fonts.gstatic.com/s/averialibre/v16/2V0EKIcMGZEnV6xygz7eNjESAKnNRWDh8405.ttf", - "700": "https://fonts.gstatic.com/s/averialibre/v16/2V0FKIcMGZEnV6xygz7eNjEavoztb07t-pQgTw.ttf", - "700italic": "https://fonts.gstatic.com/s/averialibre/v16/2V0HKIcMGZEnV6xygz7eNjESAJFxakTp2JEwT4Sk.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/averialibre/v16/2V0aKIcMGZEnV6xygz7eNjESA6nN.ttf" - }, - { - "family": "Averia Sans Libre", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-06-02", - "files": { - "300": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6SaxZG_G5OvCf_rt7FH3B6BHLMEd3lMKcQJZP1LmD9.ttf", - "300italic": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6caxZG_G5OvCf_rt7FH3B6BHLMEdVLKisSL5fXK3D9qtg.ttf", - "regular": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6XaxZG_G5OvCf_rt7FH3B6BHLMEeVJGIMYDo_8.ttf", - "italic": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6RaxZG_G5OvCf_rt7FH3B6BHLMEdVLEoc6C5_8N3k.ttf", - "700": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6SaxZG_G5OvCf_rt7FH3B6BHLMEd31N6cQJZP1LmD9.ttf", - "700italic": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6caxZG_G5OvCf_rt7FH3B6BHLMEdVLKjsVL5fXK3D9qtg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6XaxZG_G5OvCf_rt7FH3B6BHLMEdVIEoc.ttf" - }, - { - "family": "Averia Serif Libre", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-06-02", - "files": { - "300": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIVzD2ms4wxr6GvjeD0X88SHPyX2xYGCSmqwacqdrKvbQ.ttf", - "300italic": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIbzD2ms4wxr6GvjeD0X88SHPyX2xYOpzMmw60uVLe_bXHq.ttf", - "regular": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIWzD2ms4wxr6GvjeD0X88SHPyX2xY-pQGOyYw2fw.ttf", - "italic": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIUzD2ms4wxr6GvjeD0X88SHPyX2xYOpwuK64kmf6u2.ttf", - "700": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIVzD2ms4wxr6GvjeD0X88SHPyX2xYGGS6qwacqdrKvbQ.ttf", - "700italic": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIbzD2ms4wxr6GvjeD0X88SHPyX2xYOpzM2xK0uVLe_bXHq.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIWzD2ms4wxr6GvjeD0X88SHPyX2xYOpAuK.ttf" - }, - { - "family": "Azeret Mono", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfnPRh0raa-5s3AA.ttf", - "200": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfHPVh0raa-5s3AA.ttf", - "300": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfwvVh0raa-5s3AA.ttf", - "regular": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfnPVh0raa-5s3AA.ttf", - "500": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfrvVh0raa-5s3AA.ttf", - "600": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfQvJh0raa-5s3AA.ttf", - "700": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfe_Jh0raa-5s3AA.ttf", - "800": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfHPJh0raa-5s3AA.ttf", - "900": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfNfJh0raa-5s3AA.ttf", - "100italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLaJkLye2Z4nAN7J.ttf", - "200italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLYJkbye2Z4nAN7J.ttf", - "300italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLbXkbye2Z4nAN7J.ttf", - "italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLaJkbye2Z4nAN7J.ttf", - "500italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLa7kbye2Z4nAN7J.ttf", - "600italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLZXlrye2Z4nAN7J.ttf", - "700italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLZulrye2Z4nAN7J.ttf", - "800italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLYJlrye2Z4nAN7J.ttf", - "900italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLYglrye2Z4nAN7J.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfnPVR07ye.ttf" - }, - { - "family": "B612", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/b612/v13/3JnySDDxiSz32jm4GDigUXw.ttf", - "italic": "https://fonts.gstatic.com/s/b612/v13/3Jn8SDDxiSz36juyHBqlQXwdVw.ttf", - "700": "https://fonts.gstatic.com/s/b612/v13/3Jn9SDDxiSz34oWXPDCLTXUETuE.ttf", - "700italic": "https://fonts.gstatic.com/s/b612/v13/3Jn_SDDxiSz36juKoDWBSVcBXuFb0Q.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/b612/v13/3JnySDDxiSz36jiyHA.ttf" - }, - { - "family": "B612 Mono", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/b612mono/v16/kmK_Zq85QVWbN1eW6lJl1wTcquRTtg.ttf", - "italic": "https://fonts.gstatic.com/s/b612mono/v16/kmK5Zq85QVWbN1eW6lJV1Q7YiOFDtqtf.ttf", - "700": "https://fonts.gstatic.com/s/b612mono/v16/kmK6Zq85QVWbN1eW6lJdayv4os9Pv7JGSg.ttf", - "700italic": "https://fonts.gstatic.com/s/b612mono/v16/kmKkZq85QVWbN1eW6lJV1TZkp8VLnbdWSg4x.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/b612mono/v16/kmK_Zq85QVWbN1eW6lJV1g7Y.ttf" - }, - { - "family": "BBH Sans Bartle", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-10-06", - "files": { - "regular": "https://fonts.gstatic.com/s/bbhsansbartle/v1/eLGEP-v-CSnwOk_evJ1qrrCJCQTJ9eYh0tfR-Q.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bbhsansbartle/v1/eLGEP-v-CSnwOk_evJ1qrrCJCQT59Owl.ttf" - }, - { - "family": "BBH Sans Bogle", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-10-06", - "files": { - "regular": "https://fonts.gstatic.com/s/bbhsansbogle/v1/LYjbdGTyv25vPsUz0wMCwj1DMf_fcpC69i6N.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bbhsansbogle/v1/LYjbdGTyv25vPsUz0wMCwj1DMc_eeJQ.ttf" - }, - { - "family": "BBH Sans Hegarty", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-10-06", - "files": { - "regular": "https://fonts.gstatic.com/s/bbhsanshegarty/v1/UqyLK9cfCFIq--EuUZn21v4dILtJTKAJduj91zQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bbhsanshegarty/v1/UqyLK9cfCFIq--EuUZn21v4dILtJfKEDcg.ttf" - }, - { - "family": "BIZ UDGothic", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "greek-ext", - "japanese", - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/bizudgothic/v12/daafSTouBF7RUjnbt8p3LuKttQN98z_MbQ.ttf", - "700": "https://fonts.gstatic.com/s/bizudgothic/v12/daaASTouBF7RUjnbt8p3LuKVCSxZ-xTQZMhbaA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bizudgothic/v12/daafSTouBF7RUjnbt8p3LuKdtAl5.ttf" - }, - { - "family": "BIZ UDMincho", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "greek-ext", - "japanese", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/bizudmincho/v11/EJRRQgI6eOxFjBdKs38yhtW1dwT7rcpY8Q.ttf", - "700": "https://fonts.gstatic.com/s/bizudmincho/v11/EJROQgI6eOxFjBdKs38yhtWNyyvfpeFE-IyCrw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bizudmincho/v11/EJRRQgI6eOxFjBdKs38yhtWFdg7_.ttf" - }, - { - "family": "BIZ UDPGothic", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "greek-ext", - "japanese", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/bizudpgothic/v15/hES36X5pHAIBjmS84VL0Bue83nUMQWkMUAk.ttf", - "700": "https://fonts.gstatic.com/s/bizudpgothic/v15/hESq6X5pHAIBjmS84VL0Bue85skjZWEnTABCSQo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bizudpgothic/v15/hES36X5pHAIBjmS84VL0Bue87nQGRQ.ttf" - }, - { - "family": "BIZ UDPMincho", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "greek-ext", - "japanese", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/bizudpmincho/v11/ypvfbXOBrmYppy7oWWTg1_58nhhYtUb0gZk.ttf", - "700": "https://fonts.gstatic.com/s/bizudpmincho/v11/ypvCbXOBrmYppy7oWWTg1_58pqR3kU7fnZAy57k.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bizudpmincho/v11/ypvfbXOBrmYppy7oWWTg1_58rhlSsQ.ttf" - }, - { - "family": "Babylonica", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/babylonica/v7/5aUw9_i2qxWVCAE2aHjTqDJ0-VVMoEw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/babylonica/v7/5aUw9_i2qxWVCAE2aHjTmDN-_Q.ttf" - }, - { - "family": "Bacasime Antique", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/bacasimeantique/v1/tDbX2pGXkFYEykldjZSrmI6T_XWZOwStSUrV_BE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bacasimeantique/v1/tDbX2pGXkFYEykldjZSrmI6T_XWZCwWnTQ.ttf" - }, - { - "family": "Bad Script", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/badscript/v18/6NUT8F6PJgbFWQn47_x7lOwuzd1AZtw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/badscript/v18/6NUT8F6PJgbFWQn47_x7pO0kyQ.ttf" - }, - { - "family": "Badeen Display", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/badeendisplay/v1/pxidypY2sdZSjFU4cPmNBzckadeLYk1Mq3ap.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/badeendisplay/v1/pxidypY2sdZSjFU4cPmNBzckaeeKaEk.ttf" - }, - { - "family": "Bagel Fat One", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/bagelfatone/v2/hYkPPucsQOr5dy02WmQr5Zkd0B5mvv0dSbM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bagelfatone/v2/hYkPPucsQOr5dy02WmQr5Zkd4B9sug.ttf" - }, - { - "family": "Bahiana", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/bahiana/v25/uU9PCBUV4YenPWJU7xPb3vyHmlI.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bahiana/v25/uU9PCBUV4YenPWJU3xLR2g.ttf" - }, - { - "family": "Bahianita", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/bahianita/v23/yYLr0hTb3vuqqsBUgxWtxTvV2NJPcA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bahianita/v23/yYLr0hTb3vuqqsBUgxWdxDHR.ttf" - }, - { - "family": "Bai Jamjuree", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa0kePuk5A1-yiSgA.ttf", - "200italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_oGkpox2S2CgOva.ttf", - "300": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa09eDuk5A1-yiSgA.ttf", - "300italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_pikZox2S2CgOva.ttf", - "regular": "https://fonts.gstatic.com/s/baijamjuree/v13/LDI1apSCOBt_aeQQ7ftydoaMWcjKm7sp8g.ttf", - "italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIrapSCOBt_aeQQ7ftydoa8W8LOub458jGL.ttf", - "500": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa0reHuk5A1-yiSgA.ttf", - "500italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_o6kJox2S2CgOva.ttf", - "600": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa0gebuk5A1-yiSgA.ttf", - "600italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_oWl5ox2S2CgOva.ttf", - "700": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa05efuk5A1-yiSgA.ttf", - "700italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_pylpox2S2CgOva.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baijamjuree/v13/LDI1apSCOBt_aeQQ7ftydoa8WMLO.ttf" - }, - { - "family": "Bakbak One", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/bakbakone/v11/zOL54pXAl6RI-p_ardnuycRuv-hHkOs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bakbakone/v11/zOL54pXAl6RI-p_ardnu-cVkuw.ttf" - }, - { - "family": "Ballet", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/ballet/v30/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3C4G-EiAou6Y.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ballet/v30/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4C0Fg.ttf" - }, - { - "family": "Baloo 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdgazapv9Fat7WcN.ttf", - "500": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdgozapv9Fat7WcN.ttf", - "600": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdjEyqpv9Fat7WcN.ttf", - "700": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdj9yqpv9Fat7WcN.ttf", - "800": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdiayqpv9Fat7WcN.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdgazZpu_lI.ttf" - }, - { - "family": "Baloo Bhai 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v30", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNighMXeCo-jsZzo.ttf", - "500": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNhohMXeCo-jsZzo.ttf", - "600": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNvYmMXeCo-jsZzo.ttf", - "700": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNs8mMXeCo-jsZzo.ttf", - "800": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNqgmMXeCo-jsZzo.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNighAXaIpw.ttf" - }, - { - "family": "Baloo Bhaijaan 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TyRSqP4L4ppfcyC.ttf", - "500": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TyjSqP4L4ppfcyC.ttf", - "600": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TxPTaP4L4ppfcyC.ttf", - "700": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8Tx2TaP4L4ppfcyC.ttf", - "800": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TwRTaP4L4ppfcyC.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TyRSpP5JY4.ttf" - }, - { - "family": "Baloo Bhaina 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "oriya", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEssPvRfRLYWmZSA.ttf", - "500": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEgMPvRfRLYWmZSA.ttf", - "600": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEbMTvRfRLYWmZSA.ttf", - "700": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEVcTvRfRLYWmZSA.ttf", - "800": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEMsTvRfRLYWmZSA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEssPfRP5P.ttf" - }, - { - "family": "Baloo Chettan 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "malayalam", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CeKTO1oeH9xI2gc.ttf", - "500": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CdCTO1oeH9xI2gc.ttf", - "600": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CTyUO1oeH9xI2gc.ttf", - "700": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CQWUO1oeH9xI2gc.ttf", - "800": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CWKUO1oeH9xI2gc.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CeKTC1sUGw.ttf" - }, - { - "family": "Baloo Da 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "bengali", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjALsTNe55aRa7UE.ttf", - "500": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjA5sTNe55aRa7UE.ttf", - "600": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjDVtjNe55aRa7UE.ttf", - "700": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjDstjNe55aRa7UE.ttf", - "800": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjCLtjNe55aRa7UE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjALsQNf7ZI.ttf" - }, - { - "family": "Baloo Paaji 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "gurmukhi", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9AX74fybRUz1r5t.ttf", - "500": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9Al74fybRUz1r5t.ttf", - "600": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9DJ6IfybRUz1r5t.ttf", - "700": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9Dw6IfybRUz1r5t.ttf", - "800": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9CX6IfybRUz1r5t.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9AX77fzZxE.ttf" - }, - { - "family": "Baloo Tamma 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMscPp-0IF71SGC5.ttf", - "500": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMsuPp-0IF71SGC5.ttf", - "600": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMvCOZ-0IF71SGC5.ttf", - "700": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMv7OZ-0IF71SGC5.ttf", - "800": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMucOZ-0IF71SGC5.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMscPq-1Klo.ttf" - }, - { - "family": "Baloo Tammudu 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "telugu", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_Jf8e4c6PZSlGmAA.ttf", - "500": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_Jc0e4c6PZSlGmAA.ttf", - "600": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_JSEZ4c6PZSlGmAA.ttf", - "700": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_JRgZ4c6PZSlGmAA.ttf", - "800": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_JX8Z4c6PZSlGmAA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_Jf8e0c-FYQ.ttf" - }, - { - "family": "Baloo Thambi 2", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKzcIzaQRG_n4osQ.ttf", - "500": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbK_8IzaQRG_n4osQ.ttf", - "600": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKE8UzaQRG_n4osQ.ttf", - "700": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKKsUzaQRG_n4osQ.ttf", - "800": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKTcUzaQRG_n4osQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKzcIDaA5C.ttf" - }, - { - "family": "Balsamiq Sans", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sEzZiAbNrN8SB3lQQX7Pnc8dkdIYdNHzs.ttf", - "italic": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sazZiAbNrN8SB3lQQX7PncwdsXJaVIDzvcXA.ttf", - "700": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sZzZiAbNrN8SB3lQQX7PncyWUyBY9mAzLFRQI.ttf", - "700italic": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sfzZiAbNrN8SB3lQQX7PncwdsvmYpsBxDAVQI4aA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sEzZiAbNrN8SB3lQQX7PncwdgXJQ.ttf" - }, - { - "family": "Balthazar", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/balthazar/v18/d6lKkaajS8Gm4CVQjFEvyRTo39l8hw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/balthazar/v18/d6lKkaajS8Gm4CVQjFEfyB7s.ttf" - }, - { - "family": "Bangers", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/bangers/v25/FeVQS0BTqb0h60ACL5la2bxii28.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bangers/v25/FeVQS0BTqb0h60ACH5hQ3Q.ttf" - }, - { - "family": "Barlow", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/barlow/v13/7cHrv4kjgoGqM7E3b8s8yn4hnCci.ttf", - "100italic": "https://fonts.gstatic.com/s/barlow/v13/7cHtv4kjgoGqM7E_CfNYwHoDmTcibrA.ttf", - "200": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3w-oc4FAtlT47dw.ttf", - "200italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfP04Voptzsrd6m9.ttf", - "300": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3p-kc4FAtlT47dw.ttf", - "300italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfOQ4loptzsrd6m9.ttf", - "regular": "https://fonts.gstatic.com/s/barlow/v13/7cHpv4kjgoGqM7EPC8E46HsxnA.ttf", - "italic": "https://fonts.gstatic.com/s/barlow/v13/7cHrv4kjgoGqM7E_Ccs8yn4hnCci.ttf", - "500": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3_-gc4FAtlT47dw.ttf", - "500italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfPI41optzsrd6m9.ttf", - "600": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E30-8c4FAtlT47dw.ttf", - "600italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfPk5Foptzsrd6m9.ttf", - "700": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3t-4c4FAtlT47dw.ttf", - "700italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfOA5Voptzsrd6m9.ttf", - "800": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3q-0c4FAtlT47dw.ttf", - "800italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfOc5loptzsrd6m9.ttf", - "900": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3j-wc4FAtlT47dw.ttf", - "900italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfO451optzsrd6m9.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/barlow/v13/7cHpv4kjgoGqM7E_Css8.ttf" - }, - { - "family": "Barlow Condensed", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxxL3I-JCGChYJ8VI-L6OO_au7B43LT31vytKgbaw.ttf", - "100italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxzL3I-JCGChYJ8VI-L6OO_au7B6xTru1H2lq0La6JN.ttf", - "200": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B497y_3HcuKECcrs.ttf", - "200italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrF3DWvIMHYrtUxg.ttf", - "300": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B47rx_3HcuKECcrs.ttf", - "300italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrc3PWvIMHYrtUxg.ttf", - "regular": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTx3L3I-JCGChYJ8VI-L6OO_au7B2xbZ23n3pKg.ttf", - "italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxxL3I-JCGChYJ8VI-L6OO_au7B6xTT31vytKgbaw.ttf", - "500": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B4-Lw_3HcuKECcrs.ttf", - "500italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrK3LWvIMHYrtUxg.ttf", - "600": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B4873_3HcuKECcrs.ttf", - "600italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrB3XWvIMHYrtUxg.ttf", - "700": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B46r2_3HcuKECcrs.ttf", - "700italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrY3TWvIMHYrtUxg.ttf", - "800": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B47b1_3HcuKECcrs.ttf", - "800italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrf3fWvIMHYrtUxg.ttf", - "900": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B45L0_3HcuKECcrs.ttf", - "900italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrW3bWvIMHYrtUxg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTx3L3I-JCGChYJ8VI-L6OO_au7B6xfT3w.ttf" - }, - { - "family": "Barlow Semi Condensed", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlphgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfG4qvKk8ogoSP.ttf", - "100italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpjgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbLLIEsKh5SPZWs.ttf", - "200": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRft6uPAGEki52WfA.ttf", - "200italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbJnAWsgqZiGfHK5.ttf", - "300": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRf06iPAGEki52WfA.ttf", - "300italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbIDAmsgqZiGfHK5.ttf", - "regular": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpvgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRnf4CrCEo4gg.ttf", - "italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlphgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfYqvKk8ogoSP.ttf", - "500": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfi6mPAGEki52WfA.ttf", - "500italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbJbA2sgqZiGfHK5.ttf", - "600": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfp66PAGEki52WfA.ttf", - "600italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbJ3BGsgqZiGfHK5.ttf", - "700": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfw6-PAGEki52WfA.ttf", - "700italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbITBWsgqZiGfHK5.ttf", - "800": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRf36yPAGEki52WfA.ttf", - "800italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbIPBmsgqZiGfHK5.ttf", - "900": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRf-62PAGEki52WfA.ttf", - "900italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbIrB2sgqZiGfHK5.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpvgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfoqv.ttf" - }, - { - "family": "Barriecito", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/barriecito/v18/WWXXlj-CbBOSLY2QTuY_KdUiYwTO0MU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/barriecito/v18/WWXXlj-CbBOSLY2QTuY_GdQoZw.ttf" - }, - { - "family": "Barrio", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/barrio/v20/wEO8EBXBk8hBIDiEdQYhWdsX1Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/barrio/v20/wEO8EBXBk8hBIDi0dAwl.ttf" - }, - { - "family": "Basic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/basic/v18/xfu_0WLxV2_XKQN34lDVyR7D.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/basic/v18/xfu_0WLxV2_XKTN26FQ.ttf" - }, - { - "family": "Baskervville", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYuDrugOydR1FLkw.ttf", - "500": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYtLrugOydR1FLkw.ttf", - "600": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYj7sugOydR1FLkw.ttf", - "700": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYgfsugOydR1FLkw.ttf", - "italic": "https://fonts.gstatic.com/s/baskervville/v20/YA9Hr0yU4l_XOrogbkun3kQQtYOnhgMBaGprdyioUkC4cT9APkyagA.ttf", - "500italic": "https://fonts.gstatic.com/s/baskervville/v20/YA9Hr0yU4l_XOrogbkun3kQQtYOnhgMBaGprdyioYEC4cT9APkyagA.ttf", - "600italic": "https://fonts.gstatic.com/s/baskervville/v20/YA9Hr0yU4l_XOrogbkun3kQQtYOnhgMBaGprdyiojEe4cT9APkyagA.ttf", - "700italic": "https://fonts.gstatic.com/s/baskervville/v20/YA9Hr0yU4l_XOrogbkun3kQQtYOnhgMBaGprdyiotUe4cT9APkyagA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYuDrigK4cQ.ttf" - }, - { - "family": "Baskervville SC", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHjziXM3kPWntDsg.ttf", - "500": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHg7iXM3kPWntDsg.ttf", - "600": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHuLlXM3kPWntDsg.ttf", - "700": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHtvlXM3kPWntDsg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHjzibMzuOQ.ttf" - }, - { - "family": "Battambang", - "variants": [ - "100", - "300", - "regular", - "700", - "900" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/battambang/v26/uk-kEGe7raEw-HjkzZabNhGp5w50_o9T7Q.ttf", - "300": "https://fonts.gstatic.com/s/battambang/v26/uk-lEGe7raEw-HjkzZabNtmLxyRa8oZK9I0.ttf", - "regular": "https://fonts.gstatic.com/s/battambang/v26/uk-mEGe7raEw-HjkzZabDnWj4yxx7o8.ttf", - "700": "https://fonts.gstatic.com/s/battambang/v26/uk-lEGe7raEw-HjkzZabNsmMxyRa8oZK9I0.ttf", - "900": "https://fonts.gstatic.com/s/battambang/v26/uk-lEGe7raEw-HjkzZabNvGOxyRa8oZK9I0.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/battambang/v26/uk-mEGe7raEw-HjkzZabPnSp5w.ttf" - }, - { - "family": "Baumans", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/baumans/v18/-W_-XJj9QyTd3QfpR_oyaksqY5Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/baumans/v18/-W_-XJj9QyTd3Qfpd_s4bg.ttf" - }, - { - "family": "Bayon", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v36", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/bayon/v36/9XUrlJNmn0LPFl-pOhYEd2NJ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bayon/v36/9XUrlJNmn0LPFm-oMBI.ttf" - }, - { - "family": "Be Vietnam Pro", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVNSTAyLFyeg_IDWvOJmVES_HRUBX8YYbAiah8.ttf", - "100italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVLSTAyLFyeg_IDWvOJmVES_HwyPRsSZZIneh-waA.ttf", - "200": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HT4JF8yT7wrcwap.ttf", - "200italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPbczRbgJdhapcUU.ttf", - "300": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HScJ18yT7wrcwap.ttf", - "300italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPdMwRbgJdhapcUU.ttf", - "regular": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVPSTAyLFyeg_IDWvOJmVES_EwwD3s6ZKAi.ttf", - "italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVNSTAyLFyeg_IDWvOJmVES_HwyBX8YYbAiah8.ttf", - "500": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HTEJl8yT7wrcwap.ttf", - "500italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPYsxRbgJdhapcUU.ttf", - "600": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HToIV8yT7wrcwap.ttf", - "600italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPac2RbgJdhapcUU.ttf", - "700": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HSMIF8yT7wrcwap.ttf", - "700italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPcM3RbgJdhapcUU.ttf", - "800": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HSQI18yT7wrcwap.ttf", - "800italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPd80RbgJdhapcUU.ttf", - "900": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HS0Il8yT7wrcwap.ttf", - "900italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPfs1RbgJdhapcUU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVPSTAyLFyeg_IDWvOJmVES_HwxBX8.ttf" - }, - { - "family": "Beau Rivage", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/beaurivage/v2/UcCi3FIgIG2bH4mMNWJUlmg3NZp8K2sL.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/beaurivage/v2/UcCi3FIgIG2bH4mMNWJUllg2P54.ttf" - }, - { - "family": "Bebas Neue", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/bebasneue/v16/JTUSjIg69CK48gW7PXooxW5rygbi49c.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bebasneue/v16/JTUSjIg69CK48gW7PXoo9W9hzg.ttf" - }, - { - "family": "Beiruti", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9Y95wujgWg2SGdV.ttf", - "300": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9bj5wujgWg2SGdV.ttf", - "regular": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9a95wujgWg2SGdV.ttf", - "500": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9aP5wujgWg2SGdV.ttf", - "600": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9Zj4AujgWg2SGdV.ttf", - "700": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9Za4AujgWg2SGdV.ttf", - "800": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9Y94AujgWg2SGdV.ttf", - "900": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9YU4AujgWg2SGdV.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9a95zuii2w.ttf" - }, - { - "family": "Belanosima", - "variants": [ - "regular", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/belanosima/v4/3y9k6bI8ejDo_3MfCDSLxABbF3JBg54.ttf", - "600": "https://fonts.gstatic.com/s/belanosima/v4/3y9n6bI8ejDo_3MfCDSL_Nh1M3pqn5cdJ-4.ttf", - "700": "https://fonts.gstatic.com/s/belanosima/v4/3y9n6bI8ejDo_3MfCDSL_Lx0M3pqn5cdJ-4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/belanosima/v4/3y9k6bI8ejDo_3MfCDSL9AFREw.ttf" - }, - { - "family": "Belgrano", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/belgrano/v19/55xvey5tM9rwKWrJZcMFirl08KDJ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/belgrano/v19/55xvey5tM9rwKWrJZfMEgL0.ttf" - }, - { - "family": "Bellefair", - "variants": [ - "regular" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/bellefair/v15/kJExBuYY6AAuhiXUxG19__A2pOdvDA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bellefair/v15/kJExBuYY6AAuhiXUxG1N_voy.ttf" - }, - { - "family": "Belleza", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/belleza/v18/0nkoC9_pNeMfhX4BtcbyawzruP8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/belleza/v18/0nkoC9_pNeMfhX4Bhcf4bw.ttf" - }, - { - "family": "Bellota", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/bellota/v17/MwQzbhXl3_qEpiwAID55kGMViblPtXs.ttf", - "300italic": "https://fonts.gstatic.com/s/bellota/v17/MwQxbhXl3_qEpiwAKJBjHGEfjZtKpXulTQ.ttf", - "regular": "https://fonts.gstatic.com/s/bellota/v17/MwQ2bhXl3_qEpiwAGJJRtGs-lbA.ttf", - "italic": "https://fonts.gstatic.com/s/bellota/v17/MwQ0bhXl3_qEpiwAKJBbsEk7hbBWrA.ttf", - "700": "https://fonts.gstatic.com/s/bellota/v17/MwQzbhXl3_qEpiwAIC5-kGMViblPtXs.ttf", - "700italic": "https://fonts.gstatic.com/s/bellota/v17/MwQxbhXl3_qEpiwAKJBjDGYfjZtKpXulTQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bellota/v17/MwQ2bhXl3_qEpiwAKJNbsA.ttf" - }, - { - "family": "Bellota Text", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/bellotatext/v20/0FlMVP2VnlWS4f3-UE9hHXM5VfsqfQXwQy6yxg.ttf", - "300italic": "https://fonts.gstatic.com/s/bellotatext/v20/0FlOVP2VnlWS4f3-UE9hHXMx--Gmfw_0YSuixmYK.ttf", - "regular": "https://fonts.gstatic.com/s/bellotatext/v20/0FlTVP2VnlWS4f3-UE9hHXMB-dMOdS7sSg.ttf", - "italic": "https://fonts.gstatic.com/s/bellotatext/v20/0FlNVP2VnlWS4f3-UE9hHXMx-9kKVyv8Sjer.ttf", - "700": "https://fonts.gstatic.com/s/bellotatext/v20/0FlMVP2VnlWS4f3-UE9hHXM5RfwqfQXwQy6yxg.ttf", - "700italic": "https://fonts.gstatic.com/s/bellotatext/v20/0FlOVP2VnlWS4f3-UE9hHXMx--G2eA_0YSuixmYK.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bellotatext/v20/0FlTVP2VnlWS4f3-UE9hHXMx-NkK.ttf" - }, - { - "family": "BenchNine", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/benchnine/v17/ahcev8612zF4jxrwMosT--tRhWa8q0v8ag.ttf", - "regular": "https://fonts.gstatic.com/s/benchnine/v17/ahcbv8612zF4jxrwMosrV8N1jU2gog.ttf", - "700": "https://fonts.gstatic.com/s/benchnine/v17/ahcev8612zF4jxrwMosT6-xRhWa8q0v8ag.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/benchnine/v17/ahcbv8612zF4jxrwMosbVslx.ttf" - }, - { - "family": "Benne", - "variants": [ - "regular" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/benne/v24/L0xzDFAhn18E6Vjxlt6qTDBN.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/benne/v24/L0xzDFAhn18E6WjwnNo.ttf" - }, - { - "family": "Bentham", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/bentham/v20/VdGeAZQPEpYfmHglKWw7CJaK_y4.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bentham/v20/VdGeAZQPEpYfmHglGW0xDA.ttf" - }, - { - "family": "Berkshire Swash", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/berkshireswash/v22/ptRRTi-cavZOGqCvnNJDl5m5XmNPrcQybX4pQA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/berkshireswash/v22/ptRRTi-cavZOGqCvnNJDl5m5XmN_rM42.ttf" - }, - { - "family": "Besley", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fbbBSdRoFPOl8-E.ttf", - "500": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fYTBSdRoFPOl8-E.ttf", - "600": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fWjGSdRoFPOl8-E.ttf", - "700": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fVHGSdRoFPOl8-E.ttf", - "800": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fTbGSdRoFPOl8-E.ttf", - "900": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fR_GSdRoFPOl8-E.ttf", - "italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6CoZdiENGg4-E04A.ttf", - "500italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6Ck5diENGg4-E04A.ttf", - "600italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6Cf5BiENGg4-E04A.ttf", - "700italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6CRpBiENGg4-E04A.ttf", - "800italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6CIZBiENGg4-E04A.ttf", - "900italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6CCJBiENGg4-E04A.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fbbBedViEA.ttf" - }, - { - "family": "Beth Ellen", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/bethellen/v22/WwkbxPW2BE-3rb_JNT-qEIAiVNo5xNY.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bethellen/v22/WwkbxPW2BE-3rb_JNT-qIIEoUA.ttf" - }, - { - "family": "Bevan", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/bevan/v26/4iCj6KZ0a9NXjF8aUir7tlSJ.ttf", - "italic": "https://fonts.gstatic.com/s/bevan/v26/4iCt6KZ0a9NXjG8YWC7Zs0SJD4U.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bevan/v26/4iCj6KZ0a9NXjG8bWC4.ttf" - }, - { - "family": "BhuTuka Expanded One", - "variants": [ - "regular" - ], - "subsets": [ - "gurmukhi", - "latin", - "latin-ext" - ], - "version": "v9", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/bhutukaexpandedone/v9/SLXXc0jZ4WUJcClHTtv0t7IaDRsBsWRiJCyX8pg_RVH1.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bhutukaexpandedone/v9/SLXXc0jZ4WUJcClHTtv0t7IaDRsBsWRiJByW-Jw.ttf" - }, - { - "family": "Big Shoulders", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9SOL9ANM1LlZAtA.ttf", - "200": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9yOP9ANM1LlZAtA.ttf", - "300": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9FuP9ANM1LlZAtA.ttf", - "regular": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9SOP9ANM1LlZAtA.ttf", - "500": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9euP9ANM1LlZAtA.ttf", - "600": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9luT9ANM1LlZAtA.ttf", - "700": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9r-T9ANM1LlZAtA.ttf", - "800": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9yOT9ANM1LlZAtA.ttf", - "900": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko94eT9ANM1LlZAtA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9SOPNAdkx.ttf" - }, - { - "family": "Big Shoulders Inline", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1nHb-oUTA-kSKkM.ttf", - "200": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1vHa-oUTA-kSKkM.ttf", - "300": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1i_a-oUTA-kSKkM.ttf", - "regular": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1nHa-oUTA-kSKkM.ttf", - "500": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1kPa-oUTA-kSKkM.ttf", - "600": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1q_d-oUTA-kSKkM.ttf", - "700": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1pbd-oUTA-kSKkM.ttf", - "800": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1vHd-oUTA-kSKkM.ttf", - "900": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1tjd-oUTA-kSKkM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1nHayoQZBw.ttf" - }, - { - "family": "Big Shoulders Stencil", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp2x5OZJnqtwIp4I.ttf", - "200": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp0x5eZJnqtwIp4I.ttf", - "300": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp3v5eZJnqtwIp4I.ttf", - "regular": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp2x5eZJnqtwIp4I.ttf", - "500": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp2D5eZJnqtwIp4I.ttf", - "600": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp1v4uZJnqtwIp4I.ttf", - "700": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp1W4uZJnqtwIp4I.ttf", - "800": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp0x4uZJnqtwIp4I.ttf", - "900": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp0Y4uZJnqtwIp4I.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp2x5dZIlK8.ttf" - }, - { - "family": "Bigelow Rules", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v31", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/bigelowrules/v31/RrQWboly8iR_I3KWSzeRuN0zT4cCH8WAJVk.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bigelowrules/v31/RrQWboly8iR_I3KWSzeRuN0zf4YIGw.ttf" - }, - { - "family": "Bigshot One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v31", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/bigshotone/v31/u-470qukhRkkO6BD_7cM_gxuUQJBXv_-.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bigshotone/v31/u-470qukhRkkO6BD_7cM_jxvWwY.ttf" - }, - { - "family": "Bilbo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/bilbo/v21/o-0EIpgpwWwZ210hpIRz4wxE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bilbo/v21/o-0EIpgpwWwZ220groA.ttf" - }, - { - "family": "Bilbo Swash Caps", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/bilboswashcaps/v23/zrf-0GXbz-H3Wb4XBsGrTgq2PVmdqAPopiRfKp8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bilboswashcaps/v23/zrf-0GXbz-H3Wb4XBsGrTgq2PVmdmALiog.ttf" - }, - { - "family": "BioRhyme", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OrIimiaki-gkRDE.ttf", - "300": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4Omwimiaki-gkRDE.ttf", - "regular": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OjIimiaki-gkRDE.ttf", - "500": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OgAimiaki-gkRDE.ttf", - "600": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4Ouwlmiaki-gkRDE.ttf", - "700": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OtUlmiaki-gkRDE.ttf", - "800": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OrIlmiaki-gkRDE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OjIiqieujw.ttf" - }, - { - "family": "BioRhyme Expanded", - "variants": [ - "200", - "300", - "regular", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dVIE1zZzytGswgU577CDY9LjbffxxcblSHSdTXrb_z.ttf", - "300": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dVIE1zZzytGswgU577CDY9Ljbffxw4bVSHSdTXrb_z.ttf", - "regular": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dQIE1zZzytGswgU577CDY9LjbffySURXCPYsje.ttf", - "700": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dVIE1zZzytGswgU577CDY9LjbffxwoalSHSdTXrb_z.ttf", - "800": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dVIE1zZzytGswgU577CDY9Ljbffxw0aVSHSdTXrb_z.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dQIE1zZzytGswgU577CDY9LjbffxSVT3Q.ttf" - }, - { - "family": "Birthstone", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/birthstone/v16/8AtsGs2xO4yLRhy87sv_HLn5jRfZHzM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/birthstone/v16/8AtsGs2xO4yLRhy87sv_LLjziQ.ttf" - }, - { - "family": "Birthstone Bounce", - "variants": [ - "regular", - "500" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/birthstonebounce/v13/ga6XaxZF43lIvTWrktHOTBJZGH7dEeVJGIMYDo_8.ttf", - "500": "https://fonts.gstatic.com/s/birthstonebounce/v13/ga6SaxZF43lIvTWrktHOTBJZGH7dEd29MacQJZP1LmD9.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/birthstonebounce/v13/ga6XaxZF43lIvTWrktHOTBJZGH7dEdVIEoc.ttf" - }, - { - "family": "Biryani", - "variants": [ - "200", - "300", - "regular", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84YddYQyGTBSU-J-RxQ.ttf", - "300": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84YddeAxGTBSU-J-RxQ.ttf", - "regular": "https://fonts.gstatic.com/s/biryani/v15/hv-WlzNxIFoO84YdTUwZPTh5T-s.ttf", - "600": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84YddZQ3GTBSU-J-RxQ.ttf", - "700": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84YddfA2GTBSU-J-RxQ.ttf", - "800": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84Yddew1GTBSU-J-RxQ.ttf", - "900": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84Yddcg0GTBSU-J-RxQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/biryani/v15/hv-WlzNxIFoO84YdfU0TOQ.ttf" - }, - { - "family": "Bitcount", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJVvr06JyZBdg54o.ttf", - "200": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJdvq06JyZBdg54o.ttf", - "300": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJQXq06JyZBdg54o.ttf", - "regular": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJVvq06JyZBdg54o.ttf", - "500": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJWnq06JyZBdg54o.ttf", - "600": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJYXt06JyZBdg54o.ttf", - "700": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJbzt06JyZBdg54o.ttf", - "800": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJdvt06JyZBdg54o.ttf", - "900": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJfLt06JyZBdg54o.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJVvq46N4YA.ttf" - }, - { - "family": "Bitcount Grid Double", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZDxleZEXi_Ul10k.ttf", - "200": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZLxkeZEXi_Ul10k.ttf", - "300": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZGJkeZEXi_Ul10k.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZDxkeZEXi_Ul10k.ttf", - "500": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZA5keZEXi_Ul10k.ttf", - "600": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZOJjeZEXi_Ul10k.ttf", - "700": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZNtjeZEXi_Ul10k.ttf", - "800": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZLxjeZEXi_Ul10k.ttf", - "900": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZJVjeZEXi_Ul10k.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZDxkSZAdjw.ttf" - }, - { - "family": "Bitcount Grid Double Ink", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzR07bFhBRdj-elg.ttf", - "200": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2Jhzx0_bFhBRdj-elg.ttf", - "300": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzGU_bFhBRdj-elg.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzR0_bFhBRdj-elg.ttf", - "500": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzdU_bFhBRdj-elg.ttf", - "600": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzmUjbFhBRdj-elg.ttf", - "700": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzoEjbFhBRdj-elg.ttf", - "800": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2Jhzx0jbFhBRdj-elg.ttf", - "900": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2Jhz7kjbFhBRdj-elg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzR0_rFxpV.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Bitcount Grid Single", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanohqZUINrmJ9z94.ttf", - "200": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanghrZUINrmJ9z94.ttf", - "300": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGantZrZUINrmJ9z94.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanohrZUINrmJ9z94.ttf", - "500": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanrprZUINrmJ9z94.ttf", - "600": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanlZsZUINrmJ9z94.ttf", - "700": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanm9sZUINrmJ9z94.ttf", - "800": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanghsZUINrmJ9z94.ttf", - "900": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGaniFsZUINrmJ9z94.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanohrVUMHqg.ttf" - }, - { - "family": "Bitcount Grid Single Ink", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavMl1GIY8dxef0jQ.ttf", - "200": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavslxGIY8dxef0jQ.ttf", - "300": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavbFxGIY8dxef0jQ.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavMlxGIY8dxef0jQ.ttf", - "500": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavAFxGIY8dxef0jQ.ttf", - "600": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKav7FtGIY8dxef0jQ.ttf", - "700": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKav1VtGIY8dxef0jQ.ttf", - "800": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavsltGIY8dxef0jQ.ttf", - "900": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavm1tGIY8dxef0jQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavMlx2IIUZ.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Bitcount Ink", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpjycCL3BeDtAVdA.ttf", - "200": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpDyYCL3BeDtAVdA.ttf", - "300": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-Lp0SYCL3BeDtAVdA.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpjyYCL3BeDtAVdA.ttf", - "500": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpvSYCL3BeDtAVdA.ttf", - "600": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpUSECL3BeDtAVdA.ttf", - "700": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpaCECL3BeDtAVdA.ttf", - "800": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpDyECL3BeDtAVdA.ttf", - "900": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpJiECL3BeDtAVdA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpjyYyLnpa.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Bitcount Prop Double", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWck5Kx91m1YFsiM.ttf", - "200": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWUk4Kx91m1YFsiM.ttf", - "300": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWZc4Kx91m1YFsiM.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWck4Kx91m1YFsiM.ttf", - "500": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWfs4Kx91m1YFsiM.ttf", - "600": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWRc_Kx91m1YFsiM.ttf", - "700": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWS4_Kx91m1YFsiM.ttf", - "800": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWUk_Kx91m1YFsiM.ttf", - "900": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWWA_Kx91m1YFsiM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWck4Gx5_nw.ttf" - }, - { - "family": "Bitcount Prop Double Ink", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAz5--C4pTNcOH4A.ttf", - "200": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAT56-C4pTNcOH4A.ttf", - "300": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAkZ6-C4pTNcOH4A.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAz56-C4pTNcOH4A.ttf", - "500": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUA_Z6-C4pTNcOH4A.ttf", - "600": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAEZm-C4pTNcOH4A.ttf", - "700": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAKJm-C4pTNcOH4A.ttf", - "800": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAT5m-C4pTNcOH4A.ttf", - "900": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAZpm-C4pTNcOH4A.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAz56OCoBX.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Bitcount Prop Single", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GXZkLGUYg0NjZiU.ttf", - "200": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GfZlLGUYg0NjZiU.ttf", - "300": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GShlLGUYg0NjZiU.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GXZlLGUYg0NjZiU.ttf", - "500": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GURlLGUYg0NjZiU.ttf", - "600": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GahiLGUYg0NjZiU.ttf", - "700": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GZFiLGUYg0NjZiU.ttf", - "800": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GfZiLGUYg0NjZiU.ttf", - "900": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921Gd9iLGUYg0NjZiU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GXZlHGQShw.ttf" - }, - { - "family": "Bitcount Prop Single Ink", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4u37HDRGOJzIi0xg.ttf", - "200": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4uX7DDRGOJzIi0xg.ttf", - "300": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4ugbDDRGOJzIi0xg.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4u37DDRGOJzIi0xg.ttf", - "500": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4u7bDDRGOJzIi0xg.ttf", - "600": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4uAbfDRGOJzIi0xg.ttf", - "700": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4uOLfDRGOJzIi0xg.ttf", - "800": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4uX7fDRGOJzIi0xg.ttf", - "900": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4udrfDRGOJzIi0xg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4u37DzRWmN.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Bitcount Single", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8jKC4tYzXjwevWm.ttf", - "200": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8hKCotYzXjwevWm.ttf", - "300": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8iUCotYzXjwevWm.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8jKCotYzXjwevWm.ttf", - "500": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8j4CotYzXjwevWm.ttf", - "600": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8gUDYtYzXjwevWm.ttf", - "700": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8gtDYtYzXjwevWm.ttf", - "800": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8hKDYtYzXjwevWm.ttf", - "900": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8hjDYtYzXjwevWm.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8jKCrtZx3w.ttf" - }, - { - "family": "Bitcount Single Ink", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN0T8ugz0rbvZS6k.ttf", - "200": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN8T9ugz0rbvZS6k.ttf", - "300": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QNxr9ugz0rbvZS6k.ttf", - "regular": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN0T9ugz0rbvZS6k.ttf", - "500": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN3b9ugz0rbvZS6k.ttf", - "600": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN5r6ugz0rbvZS6k.ttf", - "700": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN6P6ugz0rbvZS6k.ttf", - "800": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN8T6ugz0rbvZS6k.ttf", - "900": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN-36ugz0rbvZS6k.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN0T9ig3-qQ.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Bitter", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v40", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8fbeCL_EXFh2reU.ttf", - "200": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8XbfCL_EXFh2reU.ttf", - "300": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8ajfCL_EXFh2reU.ttf", - "regular": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8fbfCL_EXFh2reU.ttf", - "500": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8cTfCL_EXFh2reU.ttf", - "600": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8SjYCL_EXFh2reU.ttf", - "700": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8RHYCL_EXFh2reU.ttf", - "800": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8XbYCL_EXFh2reU.ttf", - "900": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8V_YCL_EXFh2reU.ttf", - "100italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6c4P3OWHpzveWxBw.ttf", - "200italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cYPzOWHpzveWxBw.ttf", - "300italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cvvzOWHpzveWxBw.ttf", - "italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6c4PzOWHpzveWxBw.ttf", - "500italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6c0vzOWHpzveWxBw.ttf", - "600italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cPvvOWHpzveWxBw.ttf", - "700italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cB_vOWHpzveWxBw.ttf", - "800italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cYPvOWHpzveWxBw.ttf", - "900italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cSfvOWHpzveWxBw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8fbfOL7OWA.ttf" - }, - { - "family": "Black And White Picture", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v30", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/blackandwhitepicture/v30/TwMe-JAERlQd3ooUHBUXGmrmioKjjnRSFO-NqI5HbcMi-yWY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/blackandwhitepicture/v30/TwMe-JAERlQd3ooUHBUXGmrmioKjjnRSFO-NqL5GZ8c.ttf" - }, - { - "family": "Black Han Sans", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/blackhansans/v24/ea8Aad44WunzF9a-dL6toA8r8nqVIXSkH-Hc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/blackhansans/v24/ea8Aad44WunzF9a-dL6toA8r8kqUK3A.ttf" - }, - { - "family": "Black Ops One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/blackopsone/v21/qWcsB6-ypo7xBdr6Xshe96H3WDzRtjkho4M.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/blackopsone/v21/qWcsB6-ypo7xBdr6Xshe96H3aD3bsg.ttf" - }, - { - "family": "Blaka", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/blaka/v8/8vIG7w8722p_6kdr20D2FV5e.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/blaka/v8/8vIG7w8722p_6ndq0UQ.ttf" - }, - { - "family": "Blaka Hollow", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/blakahollow/v8/MCoUzAL91sjRE2FsKsxUtezYB9oFyW_-oA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/blakahollow/v8/MCoUzAL91sjRE2FsKsxUtezoBtAB.ttf" - }, - { - "family": "Blaka Ink", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v10", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/blakaink/v10/AlZy_zVVtpj22Znag2chdXf4XB0Tow.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/blakaink/v10/AlZy_zVVtpj22Znag2cRdH38.ttf", - "colorCapabilities": [ - "COLRv1", - "SVG" - ] - }, - { - "family": "Blinker", - "variants": [ - "100", - "200", - "300", - "regular", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/blinker/v14/cIf_MaFatEE-VTaP_E2hZEsCkIt9QQ.ttf", - "200": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_OGARGEsnIJkWL4.ttf", - "300": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_IWDRGEsnIJkWL4.ttf", - "regular": "https://fonts.gstatic.com/s/blinker/v14/cIf9MaFatEE-VTaPxCmrYGkHgIs.ttf", - "600": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_PGFRGEsnIJkWL4.ttf", - "700": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_JWERGEsnIJkWL4.ttf", - "800": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_ImHRGEsnIJkWL4.ttf", - "900": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_K2GRGEsnIJkWL4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/blinker/v14/cIf9MaFatEE-VTaP9CihZA.ttf" - }, - { - "family": "Bodoni Moda", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oU7awIBytVjMYwE.ttf", - "500": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oXzawIBytVjMYwE.ttf", - "600": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oZDdwIBytVjMYwE.ttf", - "700": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oandwIBytVjMYwE.ttf", - "800": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oc7dwIBytVjMYwE.ttf", - "900": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oefdwIBytVjMYwE.ttf", - "italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZKMN4sXrJcwHqoQ.ttf", - "500italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZGsN4sXrJcwHqoQ.ttf", - "600italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZ9sR4sXrJcwHqoQ.ttf", - "700italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZz8R4sXrJcwHqoQ.ttf", - "800italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZqMR4sXrJcwHqoQ.ttf", - "900italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZgcR4sXrJcwHqoQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oU7a8IF4sQ.ttf" - }, - { - "family": "Bodoni Moda SC", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v3", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbA7uXJyb9N7yr8E.ttf", - "500": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbDzuXJyb9N7yr8E.ttf", - "600": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbNDpXJyb9N7yr8E.ttf", - "700": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbOnpXJyb9N7yr8E.ttf", - "800": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbI7pXJyb9N7yr8E.ttf", - "900": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbKfpXJyb9N7yr8E.ttf", - "italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecattN-R8Pz3v8Etew.ttf", - "500italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatht-R8Pz3v8Etew.ttf", - "600italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatatiR8Pz3v8Etew.ttf", - "700italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatU9iR8Pz3v8Etew.ttf", - "800italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatNNiR8Pz3v8Etew.ttf", - "900italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatHdiR8Pz3v8Etew.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbA7ubJ2R8A.ttf" - }, - { - "family": "Bokor", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v32", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/bokor/v32/m8JcjfpeeaqTiR2WdInbcaxE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bokor/v32/m8JcjfpeeaqTiS2Xfo0.ttf" - }, - { - "family": "Boldonse", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/boldonse/v1/ZgNQjPxGPbbJUZemjC38hmHmNpCO.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/boldonse/v1/ZgNQjPxGPbbJUZemjB39jGU.ttf" - }, - { - "family": "Bona Nova", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/bonanova/v12/B50NF7ZCpX7fcHfvIUBJi6hqHK-CLA.ttf", - "italic": "https://fonts.gstatic.com/s/bonanova/v12/B50LF7ZCpX7fcHfvIUB5iaJuPqqSLJYf.ttf", - "700": "https://fonts.gstatic.com/s/bonanova/v12/B50IF7ZCpX7fcHfvIUBxN4dOFISeJY8GgQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bonanova/v12/B50NF7ZCpX7fcHfvIUB5iqJu.ttf" - }, - { - "family": "Bona Nova SC", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/bonanovasc/v1/mem5YaShyGWDiYdPG_c1Af4-VeJoCqeDjg.ttf", - "italic": "https://fonts.gstatic.com/s/bonanovasc/v1/memnYaShyGWDiYdPG_c1Af4OV-hsKKKTjrPW.ttf", - "700": "https://fonts.gstatic.com/s/bonanovasc/v1/memmYaShyGWDiYdPG_c1Af4G6c1MAoyfh6rPXA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bonanovasc/v1/mem5YaShyGWDiYdPG_c1Af4OVOhs.ttf" - }, - { - "family": "Bonbon", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v32", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/bonbon/v32/0FlVVPeVlFec4ee_cDEAbQY5-A.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bonbon/v32/0FlVVPeVlFec4eePcTsE.ttf" - }, - { - "family": "Bonheur Royale", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/bonheurroyale/v15/c4m51nt_GMTrtX-b9GcG4-YRmYK_c0f1N5Ij.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bonheurroyale/v15/c4m51nt_GMTrtX-b9GcG4-YRmbK-eUM.ttf" - }, - { - "family": "Boogaloo", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v25", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/boogaloo/v25/kmK-Zq45GAvOdnaW6x1F_SrQo_1K.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/boogaloo/v25/kmK-Zq45GAvOdnaW6y1E9y4.ttf" - }, - { - "family": "Borel", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/borel/v3/6qLOKZsftAPisgshYyMnOjwE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/borel/v3/6qLOKZsftAPisjsgaSc.ttf" - }, - { - "family": "Bowlby One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v25", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/bowlbyone/v25/taiPGmVuC4y96PFeqp8smo6C_Z0wcK4.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bowlbyone/v25/taiPGmVuC4y96PFeqp8sqo-I-Q.ttf" - }, - { - "family": "Bowlby One SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/bowlbyonesc/v27/DtVlJxerQqQm37tzN3wMug9Pzgj8owhNjuE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bowlbyonesc/v27/DtVlJxerQqQm37tzN3wMug9P_gn2pw.ttf" - }, - { - "family": "Braah One", - "variants": [ - "regular" - ], - "subsets": [ - "gurmukhi", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/braahone/v8/KFOlCnWUpt6LsxxxiylvAx05IsDqlA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/braahone/v8/KFOlCnWUpt6LsxxxiylfAhc9.ttf" - }, - { - "family": "Brawler", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/brawler/v20/xn7gYHE3xXewAscGsgC7S9XdZN8.ttf", - "700": "https://fonts.gstatic.com/s/brawler/v20/xn7lYHE3xXewAscGiryUb932eNaPfk8.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/brawler/v20/xn7gYHE3xXewAscGggGxTw.ttf" - }, - { - "family": "Bree Serif", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/breeserif/v18/4UaHrEJCrhhnVA3DgluAx63j5pN1MwI.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/breeserif/v18/4UaHrEJCrhhnVA3DgluA96zp4g.ttf" - }, - { - "family": "Bricolage Grotesque", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvZviyM0vs-wJDtw.ttf", - "300": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvUXiyM0vs-wJDtw.ttf", - "regular": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvRviyM0vs-wJDtw.ttf", - "500": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvSniyM0vs-wJDtw.ttf", - "600": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvcXlyM0vs-wJDtw.ttf", - "700": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvfzlyM0vs-wJDtw.ttf", - "800": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvZvlyM0vs-wJDtw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvRvi-Mwltw.ttf" - }, - { - "family": "Bruno Ace", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/brunoace/v7/WwkcxPa2E06x4trkOj_kMKoMWNMg3Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/brunoace/v7/WwkcxPa2E06x4trkOj_UMaAI.ttf" - }, - { - "family": "Bruno Ace SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/brunoacesc/v7/ptROTiycffFLBuiHjdJDl634LSFrpe8uZA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/brunoacesc/v7/ptROTiycffFLBuiHjdJDl63ILCtv.ttf" - }, - { - "family": "Brygada 1918", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y2-f-V8Wu5O3gbo.ttf", - "500": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y12f-V8Wu5O3gbo.ttf", - "600": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y7GY-V8Wu5O3gbo.ttf", - "700": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y4iY-V8Wu5O3gbo.ttf", - "italic": "https://fonts.gstatic.com/s/brygada1918/v27/pe06MI6eKpdGqlF5LANrM--qAeRhe6D4yip43qfcERwcv7GykboaLg.ttf", - "500italic": "https://fonts.gstatic.com/s/brygada1918/v27/pe06MI6eKpdGqlF5LANrM--qAeRhe6D4yip43qfcIxwcv7GykboaLg.ttf", - "600italic": "https://fonts.gstatic.com/s/brygada1918/v27/pe06MI6eKpdGqlF5LANrM--qAeRhe6D4yip43qfczxscv7GykboaLg.ttf", - "700italic": "https://fonts.gstatic.com/s/brygada1918/v27/pe06MI6eKpdGqlF5LANrM--qAeRhe6D4yip43qfc9hscv7GykboaLg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y2-fyV4cvw.ttf" - }, - { - "family": "Bubblegum Sans", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/bubblegumsans/v22/AYCSpXb_Z9EORv1M5QTjEzMEtdaHzoPPb7R4.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bubblegumsans/v22/AYCSpXb_Z9EORv1M5QTjEzMEteaGxIc.ttf" - }, - { - "family": "Bubbler One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/bubblerone/v22/f0Xy0eqj68ppQV9KBLmAouHH26MPePkt.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bubblerone/v22/f0Xy0eqj68ppQV9KBLmAotHG0ac.ttf" - }, - { - "family": "Buda", - "variants": [ - "300" - ], - "subsets": [ - "latin" - ], - "version": "v31", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/buda/v31/GFDqWAN8mnyIJSSrG7UBr7pZKA0.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/buda/v31/GFDqWAN8mnyIJSSrK7QLqw.ttf" - }, - { - "family": "Buenard", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92sqpK0_3iBYVfsc4.ttf", - "500": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92sqbK0_3iBYVfsc4.ttf", - "600": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92sp3LE_3iBYVfsc4.ttf", - "700": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92spOLE_3iBYVfsc4.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92sqpK3_2ghI.ttf" - }, - { - "family": "Bungee", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/bungee/v17/N0bU2SZBIuF2PU_ECn50Kd_PmA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bungee/v17/N0bU2SZBIuF2PU_0C3Rw.ttf" - }, - { - "family": "Bungee Hairline", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/bungeehairline/v26/snfys0G548t04270a_ljTLUVrv-7YB2dQ5ZPqQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bungeehairline/v26/snfys0G548t04270a_ljTLUVrv-LYReZ.ttf" - }, - { - "family": "Bungee Inline", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/bungeeinline/v19/Gg8zN58UcgnlCweMrih332VuDGJ1-FEglsc.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bungeeinline/v19/Gg8zN58UcgnlCweMrih332VuPGN__A.ttf" - }, - { - "family": "Bungee Outline", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/bungeeoutline/v24/_6_mEDvmVP24UvU2MyiGDslL3Qg3YhJqPXxo.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bungeeoutline/v24/_6_mEDvmVP24UvU2MyiGDslL3Tg2aBY.ttf" - }, - { - "family": "Bungee Shade", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/bungeeshade/v17/DtVkJxarWL0t2KdzK3oI_jks7iLSrwFUlw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bungeeshade/v17/DtVkJxarWL0t2KdzK3oI_jkc7yjW.ttf" - }, - { - "family": "Bungee Spice", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/bungeespice/v15/nwpTtK2nIhxE0q-IwgSpZBqCzyI-aMPF7Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bungeespice/v15/nwpTtK2nIhxE0q-IwgSpZBqyzig6.ttf", - "colorCapabilities": [ - "COLRv1", - "SVG" - ] - }, - { - "family": "Bungee Tint", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/bungeetint/v3/J7abnpl_EGtUEuAJwN9WmrtKMDwTpTkB.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bungeetint/v3/J7abnpl_EGtUEuAJwN9WmotLOjg.ttf", - "colorCapabilities": [ - "COLRv0" - ] - }, - { - "family": "Butcherman", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/butcherman/v25/2EbiL-thF0loflXUBOdb1zWzq_5uT84.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/butcherman/v25/2EbiL-thF0loflXUBOdb5zS5rw.ttf" - }, - { - "family": "Butterfly Kids", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/butterflykids/v27/ll8lK2CWTjuqAsXDqlnIbMNs5S4arxFrAX1D.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/butterflykids/v27/ll8lK2CWTjuqAsXDqlnIbMNs5R4bpRU.ttf" - }, - { - "family": "Bytesized", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/bytesized/v1/goksH6L8FkdnROln8XBTS0CjkP1Yog.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/bytesized/v1/goksH6L8FkdnROln8XBjSkqn.ttf" - }, - { - "family": "Cabin", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v35", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkV2EL7Gvxm7rE_s.ttf", - "500": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkW-EL7Gvxm7rE_s.ttf", - "600": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkYODL7Gvxm7rE_s.ttf", - "700": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkbqDL7Gvxm7rE_s.ttf", - "italic": "https://fonts.gstatic.com/s/cabin/v35/u-4V0qWljRw-Pd815fNqc8T_wAFcX-c37MPiNYlWniJ2hJXHx_KlwkzuA_u1Bg.ttf", - "500italic": "https://fonts.gstatic.com/s/cabin/v35/u-4V0qWljRw-Pd815fNqc8T_wAFcX-c37MPiNYlWniJ2hJXH9fKlwkzuA_u1Bg.ttf", - "600italic": "https://fonts.gstatic.com/s/cabin/v35/u-4V0qWljRw-Pd815fNqc8T_wAFcX-c37MPiNYlWniJ2hJXHGfWlwkzuA_u1Bg.ttf", - "700italic": "https://fonts.gstatic.com/s/cabin/v35/u-4V0qWljRw-Pd815fNqc8T_wAFcX-c37MPiNYlWniJ2hJXHIPWlwkzuA_u1Bg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkV2EH7Clwg.ttf" - }, - { - "family": "Cabin Condensed", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpMtK6mNhBK2err_hqkYhHRqmwaYOjZ5HZl8Q.ttf", - "500": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpJtK6mNhBK2err_hqkYhHRqmwilMH97F15-K1oqQ.ttf", - "600": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpJtK6mNhBK2err_hqkYhHRqmwiuMb97F15-K1oqQ.ttf", - "700": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpJtK6mNhBK2err_hqkYhHRqmwi3Mf97F15-K1oqQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpMtK6mNhBK2err_hqkYhHRqmwqYeLd.ttf" - }, - { - "family": "Cabin Sketch", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/cabinsketch/v23/QGYpz_kZZAGCONcK2A4bGOjMn9JM6fnuKg.ttf", - "700": "https://fonts.gstatic.com/s/cabinsketch/v23/QGY2z_kZZAGCONcK2A4bGOj0I_1o4dLyI4CMFw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cabinsketch/v23/QGYpz_kZZAGCONcK2A4bGOj8nthI.ttf" - }, - { - "family": "Cactus Classical Serif", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-07-16", - "files": { - "regular": "https://fonts.gstatic.com/s/cactusclassicalserif/v13/sZlVdQ6K-zJOCzUaS90zMNN-Ep-OoC8dZr0JFuBIFX-pv-E.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cactusclassicalserif/v13/sZlVdQ6K-zJOCzUaS90zMNN-Ep-OoC8dZr0JJuFCEQ.ttf" - }, - { - "family": "Caesar Dressing", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/caesardressing/v22/yYLx0hLa3vawqtwdswbotmK4vrR3cbb6LZttyg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/caesardressing/v22/yYLx0hLa3vawqtwdswbotmK4vrRHcLz-.ttf" - }, - { - "family": "Cagliostro", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/cagliostro/v22/ZgNWjP5HM73BV5amnX-TjGXEM4COoE4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cagliostro/v22/ZgNWjP5HM73BV5amnX-TvGTONw.ttf" - }, - { - "family": "Cairo", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v31", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hGA-W1ToLQ-HmkA.ttf", - "300": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hL4-W1ToLQ-HmkA.ttf", - "regular": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hOA-W1ToLQ-HmkA.ttf", - "500": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hNI-W1ToLQ-HmkA.ttf", - "600": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hD45W1ToLQ-HmkA.ttf", - "700": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hAc5W1ToLQ-HmkA.ttf", - "800": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hGA5W1ToLQ-HmkA.ttf", - "900": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hEk5W1ToLQ-HmkA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hOA-a1XiKQ.ttf" - }, - { - "family": "Cairo Play", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1EnYq9yXa8GvzaA.ttf", - "300": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1zHYq9yXa8GvzaA.ttf", - "regular": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1knYq9yXa8GvzaA.ttf", - "500": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1oHYq9yXa8GvzaA.ttf", - "600": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1THEq9yXa8GvzaA.ttf", - "700": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1dXEq9yXa8GvzaA.ttf", - "800": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1EnEq9yXa8GvzaA.ttf", - "900": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1O3Eq9yXa8GvzaA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1knYa9i_e.ttf", - "colorCapabilities": [ - "COLRv0" - ] - }, - { - "family": "Cal Sans", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-06-09", - "files": { - "regular": "https://fonts.gstatic.com/s/calsans/v2/fdN99sWUv3gWqXxqqSBbvloE4LZx.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/calsans/v2/fdN99sWUv3gWqXxqqRBatF4.ttf" - }, - { - "family": "Caladea", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/caladea/v8/kJEzBugZ7AAjhybUjR93-9IztOc.ttf", - "italic": "https://fonts.gstatic.com/s/caladea/v8/kJExBugZ7AAjhybUvR19__A2pOdvDA.ttf", - "700": "https://fonts.gstatic.com/s/caladea/v8/kJE2BugZ7AAjhybUtaNY39oYqO52FZ0.ttf", - "700italic": "https://fonts.gstatic.com/s/caladea/v8/kJE0BugZ7AAjhybUvR1FQ98SrMxzBZ2lDA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/caladea/v8/kJEzBugZ7AAjhybUvR59_w.ttf" - }, - { - "family": "Calistoga", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/calistoga/v18/6NUU8F2OJg6MeR7l4e0vtMYAwdRZfw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/calistoga/v18/6NUU8F2OJg6MeR7l4e0ftcwE.ttf" - }, - { - "family": "Calligraffitti", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/calligraffitti/v20/46k2lbT3XjDVqJw3DCmCFjE0vnFZM5ZBpYN-.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/calligraffitti/v20/46k2lbT3XjDVqJw3DCmCFjE0vkFYOZI.ttf" - }, - { - "family": "Cambay", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/cambay/v14/SLXJc1rY6H0_ZDsGbrSIz9JsaA.ttf", - "italic": "https://fonts.gstatic.com/s/cambay/v14/SLXLc1rY6H0_ZDs2bL6M7dd8aGZk.ttf", - "700": "https://fonts.gstatic.com/s/cambay/v14/SLXKc1rY6H0_ZDs-0pusx_lwYX99kA.ttf", - "700italic": "https://fonts.gstatic.com/s/cambay/v14/SLXMc1rY6H0_ZDs2bIYwwvN0Q3ptkDMN.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cambay/v14/SLXJc1rY6H0_ZDs2b76M.ttf" - }, - { - "family": "Cambo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/cambo/v19/IFSqHeNEk8FJk416ok7xkPm8.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cambo/v19/IFSqHeNEk8FJk717qEo.ttf" - }, - { - "family": "Candal", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/candal/v16/XoHn2YH6T7-t_8cNAR4Jt9Yxlw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/candal/v16/XoHn2YH6T7-t_8c9ABQN.ttf" - }, - { - "family": "Cantarell", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/cantarell/v18/B50NF7ZDq37KMUvlO01Ji6hqHK-CLA.ttf", - "italic": "https://fonts.gstatic.com/s/cantarell/v18/B50LF7ZDq37KMUvlO015iaJuPqqSLJYf.ttf", - "700": "https://fonts.gstatic.com/s/cantarell/v18/B50IF7ZDq37KMUvlO01xN4dOFISeJY8GgQ.ttf", - "700italic": "https://fonts.gstatic.com/s/cantarell/v18/B50WF7ZDq37KMUvlO015iZrSEY6aB4oWgWHB.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cantarell/v18/B50NF7ZDq37KMUvlO015iqJu.ttf" - }, - { - "family": "Cantata One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/cantataone/v16/PlI5Fl60Nb5obNzNe2jslVxEt8CwfGaD.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cantataone/v16/PlI5Fl60Nb5obNzNe2jslWxFvcQ.ttf" - }, - { - "family": "Cantora One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/cantoraone/v20/gyB4hws1JdgnKy56GB_JX6zdZ4vZVbgZ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cantoraone/v20/gyB4hws1JdgnKy56GB_JX5zcbY8.ttf" - }, - { - "family": "Caprasimo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/caprasimo/v6/esDT31JQOPuXIUGBp72klZUCGpG-GQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/caprasimo/v6/esDT31JQOPuXIUGBp72UlJ8G.ttf" - }, - { - "family": "Capriola", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/capriola/v15/wXKoE3YSppcvo1PDln_8L-AinG8y.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/capriola/v15/wXKoE3YSppcvo1PDlk_9JeQ.ttf" - }, - { - "family": "Caramel", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/caramel/v8/P5sCzZKBbMTf_ShyxCRuiZ-uydg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/caramel/v8/P5sCzZKBbMTf_Shy9CVkjQ.ttf" - }, - { - "family": "Carattere", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/carattere/v8/4iCv6Kp1b9dXlgt_CkvTt2aMH4V_gg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/carattere/v8/4iCv6Kp1b9dXlgt_CkvjtmyI.ttf" - }, - { - "family": "Cardo", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "gothic", - "greek", - "greek-ext", - "hebrew", - "latin", - "latin-ext", - "old-italic", - "runic" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/cardo/v21/wlp_gwjKBV1pqiv_1oAZ2H5O.ttf", - "italic": "https://fonts.gstatic.com/s/cardo/v21/wlpxgwjKBV1pqhv93IQ73W5OcCk.ttf", - "700": "https://fonts.gstatic.com/s/cardo/v21/wlpygwjKBV1pqhND-aQR82JHaTBX.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cardo/v21/wlp_gwjKBV1pqhv-3IQ.ttf" - }, - { - "family": "Carlito", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/carlito/v4/3Jn9SDPw3m-pk039PDCLTXUETuE.ttf", - "italic": "https://fonts.gstatic.com/s/carlito/v4/3Jn_SDPw3m-pk039DDKBSVcBXuFb0Q.ttf", - "700": "https://fonts.gstatic.com/s/carlito/v4/3Jn4SDPw3m-pk039BIykaX0vUuhCyOo.ttf", - "700italic": "https://fonts.gstatic.com/s/carlito/v4/3Jn6SDPw3m-pk039DDK59XglVspH2OprMQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/carlito/v4/3Jn9SDPw3m-pk039DDGBSQ.ttf" - }, - { - "family": "Carme", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/carme/v17/ptRHTiWdbvZIDOjGxLNrxfbZ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/carme/v17/ptRHTiWdbvZIDNjHzrc.ttf" - }, - { - "family": "Carrois Gothic", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/carroisgothic/v17/Z9XPDmFATg-N1PLtLOOxvIHl9ZmD3i7ajcJ-.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/carroisgothic/v17/Z9XPDmFATg-N1PLtLOOxvIHl9amC1Co.ttf" - }, - { - "family": "Carrois Gothic SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/carroisgothicsc/v16/ZgNJjOVHM6jfUZCmyUqT2A2HVKjc-28nNHabY4dN.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/carroisgothicsc/v16/ZgNJjOVHM6jfUZCmyUqT2A2HVKjc-18mPnI.ttf" - }, - { - "family": "Carter One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/carterone/v18/q5uCsoe5IOB2-pXv9UcNIxR2hYxREMs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/carterone/v18/q5uCsoe5IOB2-pXv9UcNExV8gQ.ttf" - }, - { - "family": "Cascadia Code", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "arabic", - "braille", - "cyrillic", - "cyrillic-ext", - "greek", - "hebrew", - "latin", - "latin-ext", - "symbols2", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuWMOaDPb9pHaHCA.ttf", - "300": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuVSOaDPb9pHaHCA.ttf", - "regular": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuUMOaDPb9pHaHCA.ttf", - "500": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuU-OaDPb9pHaHCA.ttf", - "600": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuXSPqDPb9pHaHCA.ttf", - "700": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuXrPqDPb9pHaHCA.ttf", - "200italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEesiMZd5lbWCAUXU.ttf", - "300italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEehaMZd5lbWCAUXU.ttf", - "italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEekiMZd5lbWCAUXU.ttf", - "500italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEenqMZd5lbWCAUXU.ttf", - "600italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEepaLZd5lbWCAUXU.ttf", - "700italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEeq-LZd5lbWCAUXU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuUMOZDOZd4.ttf" - }, - { - "family": "Cascadia Mono", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "arabic", - "braille", - "cyrillic", - "cyrillic-ext", - "greek", - "hebrew", - "latin", - "latin-ext", - "symbols2", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTadsWVkNot27AYk.ttf", - "300": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTZDsWVkNot27AYk.ttf", - "regular": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTYdsWVkNot27AYk.ttf", - "500": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTYvsWVkNot27AYk.ttf", - "600": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTbDtmVkNot27AYk.ttf", - "700": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTb6tmVkNot27AYk.ttf", - "200italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8g0nPI9U6RYkQrY.ttf", - "300italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8tMnPI9U6RYkQrY.ttf", - "italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8o0nPI9U6RYkQrY.ttf", - "500italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8r8nPI9U6RYkQrY.ttf", - "600italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8lMgPI9U6RYkQrY.ttf", - "700italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8mogPI9U6RYkQrY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTYdsVVlPI8.ttf" - }, - { - "family": "Castoro", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/castoro/v20/1q2GY5yMCld3-O4cHYhEzOYenEU.ttf", - "italic": "https://fonts.gstatic.com/s/castoro/v20/1q2EY5yMCld3-O4cLYpOyMQbjEX5fw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/castoro/v20/1q2GY5yMCld3-O4cLYlOyA.ttf" - }, - { - "family": "Castoro Titling", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v10", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/castorotitling/v10/buEupouwccj03leTfjUAhEZWlrNqYgckeo9RMw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/castorotitling/v10/buEupouwccj03leTfjUAhEZWlrNaYw0g.ttf" - }, - { - "family": "Catamaran", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil" - ], - "version": "v28", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPHjc1anXuluiLyw.ttf", - "200": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPPjd1anXuluiLyw.ttf", - "300": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPCbd1anXuluiLyw.ttf", - "regular": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPHjd1anXuluiLyw.ttf", - "500": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPErd1anXuluiLyw.ttf", - "600": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPKba1anXuluiLyw.ttf", - "700": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPJ_a1anXuluiLyw.ttf", - "800": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPPja1anXuluiLyw.ttf", - "900": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPNHa1anXuluiLyw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPHjd5ajdvg.ttf" - }, - { - "family": "Caudex", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "greek", - "greek-ext", - "latin", - "latin-ext", - "runic", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/caudex/v19/esDQ311QOP6BJUrIyviAnb4eEw.ttf", - "italic": "https://fonts.gstatic.com/s/caudex/v19/esDS311QOP6BJUr4yPKEv7sOE4in.ttf", - "700": "https://fonts.gstatic.com/s/caudex/v19/esDT311QOP6BJUrwdteklZUCGpG-GQ.ttf", - "700italic": "https://fonts.gstatic.com/s/caudex/v19/esDV311QOP6BJUr4yMo4kJ8GOJSuGdLB.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/caudex/v19/esDQ311QOP6BJUr4y_KE.ttf" - }, - { - "family": "Caveat", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9SIKjYBxPigs.ttf", - "500": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjcB9SIKjYBxPigs.ttf", - "600": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjSx6SIKjYBxPigs.ttf", - "700": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjRV6SIKjYBxPigs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9eIOpZA.ttf" - }, - { - "family": "Caveat Brush", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/caveatbrush/v12/EYq0maZfwr9S9-ETZc3fKXtMW7mT03pdQw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/caveatbrush/v12/EYq0maZfwr9S9-ETZc3fKXt8WrOX.ttf" - }, - { - "family": "Cedarville Cursive", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/cedarvillecursive/v18/yYL00g_a2veiudhUmxjo5VKkoqA-B_neJbBxw8BeTg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cedarvillecursive/v18/yYL00g_a2veiudhUmxjo5VKkoqA-B_nuJLp1.ttf" - }, - { - "family": "Ceviche One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/cevicheone/v17/gyB4hws1IcA6JzR-GB_JX6zdZ4vZVbgZ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cevicheone/v17/gyB4hws1IcA6JzR-GB_JX5zcbY8.ttf" - }, - { - "family": "Chakra Petch", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/chakrapetch/v13/cIflMapbsEk7TDLdtEz1BwkeNIhFQJXE3AY00g.ttf", - "300italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfnMapbsEk7TDLdtEz1BwkWmpLJQp_A_gMk0izH.ttf", - "regular": "https://fonts.gstatic.com/s/chakrapetch/v13/cIf6MapbsEk7TDLdtEz1BwkmmKBhSL7Y1Q.ttf", - "italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfkMapbsEk7TDLdtEz1BwkWmqplarvI1R8t.ttf", - "500": "https://fonts.gstatic.com/s/chakrapetch/v13/cIflMapbsEk7TDLdtEz1BwkebIlFQJXE3AY00g.ttf", - "500italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfnMapbsEk7TDLdtEz1BwkWmpKRQ5_A_gMk0izH.ttf", - "600": "https://fonts.gstatic.com/s/chakrapetch/v13/cIflMapbsEk7TDLdtEz1BwkeQI5FQJXE3AY00g.ttf", - "600italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfnMapbsEk7TDLdtEz1BwkWmpK9RJ_A_gMk0izH.ttf", - "700": "https://fonts.gstatic.com/s/chakrapetch/v13/cIflMapbsEk7TDLdtEz1BwkeJI9FQJXE3AY00g.ttf", - "700italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfnMapbsEk7TDLdtEz1BwkWmpLZRZ_A_gMk0izH.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chakrapetch/v13/cIf6MapbsEk7TDLdtEz1BwkWmapl.ttf" - }, - { - "family": "Changa", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZy2xQjDp9htf1ZM.ttf", - "300": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ_OxQjDp9htf1ZM.ttf", - "regular": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ62xQjDp9htf1ZM.ttf", - "500": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ5-xQjDp9htf1ZM.ttf", - "600": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ3O2QjDp9htf1ZM.ttf", - "700": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ0q2QjDp9htf1ZM.ttf", - "800": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZy22QjDp9htf1ZM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ62xcjHj8g.ttf" - }, - { - "family": "Changa One", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/changaone/v22/xfu00W3wXn3QLUJXhzq46AbouLfbK64.ttf", - "italic": "https://fonts.gstatic.com/s/changaone/v22/xfu20W3wXn3QLUJXhzq42ATivJXeO67ISw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/changaone/v22/xfu00W3wXn3QLUJXhzq42AfivA.ttf" - }, - { - "family": "Chango", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/chango/v29/2V0cKI0OB5U7WaJyz324TFUaAw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chango/v29/2V0cKI0OB5U7WaJCzne8.ttf" - }, - { - "family": "Charis SIL", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/charissil/v2/oPWK_kV3l-s-Q8govXvKrPrmYjZ2Xn0.ttf", - "italic": "https://fonts.gstatic.com/s/charissil/v2/oPWI_kV3l-s-Q8govXvKnPjsZhRzTn2Ozw.ttf", - "700": "https://fonts.gstatic.com/s/charissil/v2/oPWJ_kV3l-s-Q8govXvKlEbJRj5dQnSX1ko.ttf", - "700italic": "https://fonts.gstatic.com/s/charissil/v2/oPWX_kV3l-s-Q8govXvKnPjU2jtXRlaSxkrMCQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/charissil/v2/oPWK_kV3l-s-Q8govXvKnPvsZg.ttf" - }, - { - "family": "Charm", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/charm/v14/7cHmv4oii5K0MeYvIe804WIo.ttf", - "700": "https://fonts.gstatic.com/s/charm/v14/7cHrv4oii5K0Md6TDss8yn4hnCci.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/charm/v14/7cHmv4oii5K0MdYuK-s.ttf" - }, - { - "family": "Charmonman", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/charmonman/v20/MjQDmiR3vP_nuxDv47jiWJGovLdh6OE.ttf", - "700": "https://fonts.gstatic.com/s/charmonman/v20/MjQAmiR3vP_nuxDv47jiYC2HmL9K9OhmGnY.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/charmonman/v20/MjQDmiR3vP_nuxDv47jiaJCiuA.ttf" - }, - { - "family": "Chathura", - "variants": [ - "100", - "300", - "regular", - "700", - "800" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/chathura/v22/_gP91R7-rzUuVjim42dEq0SbTvZyuDo.ttf", - "300": "https://fonts.gstatic.com/s/chathura/v22/_gP81R7-rzUuVjim42eMiWSxYPp7oSNy.ttf", - "regular": "https://fonts.gstatic.com/s/chathura/v22/_gP71R7-rzUuVjim418goUC5S-Zy.ttf", - "700": "https://fonts.gstatic.com/s/chathura/v22/_gP81R7-rzUuVjim42ecjmSxYPp7oSNy.ttf", - "800": "https://fonts.gstatic.com/s/chathura/v22/_gP81R7-rzUuVjim42eAjWSxYPp7oSNy.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chathura/v22/_gP71R7-rzUuVjim428hq0Q.ttf" - }, - { - "family": "Chau Philomene One", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/chauphilomeneone/v16/55xxezRsPtfie1vPY49qzdgSlJiHRQFsnIx7QMISdQ.ttf", - "italic": "https://fonts.gstatic.com/s/chauphilomeneone/v16/55xzezRsPtfie1vPY49qzdgSlJiHRQFcnoZ_YscCdXQB.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chauphilomeneone/v16/55xxezRsPtfie1vPY49qzdgSlJiHRQFcnYZ_.ttf" - }, - { - "family": "Chela One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/chelaone/v22/6ae-4KC7Uqgdz_JZdPIy31vWNTMwoQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chelaone/v22/6ae-4KC7Uqgdz_JZdPIC3lHS.ttf" - }, - { - "family": "Chelsea Market", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/chelseamarket/v14/BCawqZsHqfr89WNP_IApC8tzKBhlLA4uKkWk.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chelseamarket/v14/BCawqZsHqfr89WNP_IApC8tzKChkJgo.ttf" - }, - { - "family": "Chenla", - "variants": [ - "regular" - ], - "subsets": [ - "khmer" - ], - "version": "v25", - "lastModified": "2022-09-22", - "files": { - "regular": "https://fonts.gstatic.com/s/chenla/v25/SZc43FDpIKu8WZ9eXxfonUPL6Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chenla/v25/SZc43FDpIKu8WZ9uXh3s.ttf" - }, - { - "family": "Cherish", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/cherish/v9/ll88K2mXUyqsDsTN5iDCI6IJjg8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cherish/v9/ll88K2mXUyqsDsTN1iHIJw.ttf" - }, - { - "family": "Cherry Bomb One", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/cherrybombone/v11/y83DW4od1h6KlV3c6JJhRhGOdhrKDNpF41fr-w.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cherrybombone/v11/y83DW4od1h6KlV3c6JJhRhGOdhr6DdBB.ttf" - }, - { - "family": "Cherry Cream Soda", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/cherrycreamsoda/v21/UMBIrOxBrW6w2FFyi9paG0fdVdRciTd6Cd47DJ7G.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cherrycreamsoda/v21/UMBIrOxBrW6w2FFyi9paG0fdVdRciQd7A9o.ttf" - }, - { - "family": "Cherry Swash", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/cherryswash/v22/i7dNIFByZjaNAMxtZcnfAy58QHi-EwWMbg.ttf", - "700": "https://fonts.gstatic.com/s/cherryswash/v22/i7dSIFByZjaNAMxtZcnfAy5E_FeaGy6QZ3WfYg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cherryswash/v22/i7dNIFByZjaNAMxtZcnfAy5MQXK6.ttf" - }, - { - "family": "Chewy", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/chewy/v18/uK_94ruUb-k-wk5xIDMfO-ed.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chewy/v18/uK_94ruUb-k-wn5wKjc.ttf" - }, - { - "family": "Chicle", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/chicle/v27/lJwG-pw9i2dqU-BDyWKuobYSxw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chicle/v27/lJwG-pw9i2dqU-BzyGiq.ttf" - }, - { - "family": "Chilanka", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "malayalam" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/chilanka/v23/WWXRlj2DZQiMJYaYRrJQI9EAZhTO.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chilanka/v23/WWXRlj2DZQiMJYaYRoJRKdU.ttf" - }, - { - "family": "Chiron GoRound TC", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-08-26", - "files": { - "200": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKq7BqJHA8n4CeB1Q.ttf", - "300": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqMhqJHA8n4CeB1Q.ttf", - "regular": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqbBqJHA8n4CeB1Q.ttf", - "500": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqXhqJHA8n4CeB1Q.ttf", - "600": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqsh2JHA8n4CeB1Q.ttf", - "700": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqix2JHA8n4CeB1Q.ttf", - "800": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKq7B2JHA8n4CeB1Q.ttf", - "900": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqxR2JHA8n4CeB1Q.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqbBq5HQUj.ttf" - }, - { - "family": "Chiron Hei HK", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "symbols2", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-08-26", - "files": { - "200": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lLtr18MkTEyjPI0.ttf", - "300": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lIzr18MkTEyjPI0.ttf", - "regular": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lJtr18MkTEyjPI0.ttf", - "500": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lJfr18MkTEyjPI0.ttf", - "600": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lKzqF8MkTEyjPI0.ttf", - "700": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lKKqF8MkTEyjPI0.ttf", - "800": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lLtqF8MkTEyjPI0.ttf", - "900": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lLEqF8MkTEyjPI0.ttf", - "200italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7DdPmzUQieI0QjQ.ttf", - "300italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7OlPmzUQieI0QjQ.ttf", - "italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7LdPmzUQieI0QjQ.ttf", - "500italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7IVPmzUQieI0QjQ.ttf", - "600italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7GlImzUQieI0QjQ.ttf", - "700italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7FBImzUQieI0QjQ.ttf", - "800italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7DdImzUQieI0QjQ.ttf", - "900italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7B5ImzUQieI0QjQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lJtr28NmzU.ttf" - }, - { - "family": "Chiron Sung HK", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "chinese-hongkong", - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "symbols2", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-06-12", - "files": { - "200": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjdOSt_krURtf4_Q.ttf", - "300": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjquSt_krURtf4_Q.ttf", - "regular": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRj9OSt_krURtf4_Q.ttf", - "500": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjxuSt_krURtf4_Q.ttf", - "600": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjKuOt_krURtf4_Q.ttf", - "700": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjE-Ot_krURtf4_Q.ttf", - "800": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjdOOt_krURtf4_Q.ttf", - "900": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjXeOt_krURtf4_Q.ttf", - "200italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKfFvUDQZNLo_U2r.ttf", - "300italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKcbvUDQZNLo_U2r.ttf", - "italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKdFvUDQZNLo_U2r.ttf", - "500italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKd3vUDQZNLo_U2r.ttf", - "600italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKebukDQZNLo_U2r.ttf", - "700italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKeiukDQZNLo_U2r.ttf", - "800italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKfFukDQZNLo_U2r.ttf", - "900italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKfsukDQZNLo_U2r.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRj9OSd_0DQ.ttf" - }, - { - "family": "Chivo", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_vB7ul2DSFXjQiQ.ttf", - "200": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_PB_ul2DSFXjQiQ.ttf", - "300": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_4h_ul2DSFXjQiQ.ttf", - "regular": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_vB_ul2DSFXjQiQ.ttf", - "500": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_jh_ul2DSFXjQiQ.ttf", - "600": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_Yhjul2DSFXjQiQ.ttf", - "700": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_Wxjul2DSFXjQiQ.ttf", - "800": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_PBjul2DSFXjQiQ.ttf", - "900": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_FRjul2DSFXjQiQ.ttf", - "100italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFwG1WrWN33AiasJ.ttf", - "200italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFyG1GrWN33AiasJ.ttf", - "300italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFxY1GrWN33AiasJ.ttf", - "italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFwG1GrWN33AiasJ.ttf", - "500italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFw01GrWN33AiasJ.ttf", - "600italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFzY02rWN33AiasJ.ttf", - "700italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFzh02rWN33AiasJ.ttf", - "800italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFyG02rWN33AiasJ.ttf", - "900italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFyv02rWN33AiasJ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_vB_elmrW.ttf" - }, - { - "family": "Chivo Mono", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D7hrqfVKphL03l4.ttf", - "200": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D5hr6fVKphL03l4.ttf", - "300": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D6_r6fVKphL03l4.ttf", - "regular": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D7hr6fVKphL03l4.ttf", - "500": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D7Tr6fVKphL03l4.ttf", - "600": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D4_qKfVKphL03l4.ttf", - "700": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D4GqKfVKphL03l4.ttf", - "800": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D5hqKfVKphL03l4.ttf", - "900": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D5IqKfVKphL03l4.ttf", - "100italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7E-XIJxp1ml4imo.ttf", - "200italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7M-WIJxp1ml4imo.ttf", - "300italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7BGWIJxp1ml4imo.ttf", - "italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7E-WIJxp1ml4imo.ttf", - "500italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7H2WIJxp1ml4imo.ttf", - "600italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7JGRIJxp1ml4imo.ttf", - "700italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7KiRIJxp1ml4imo.ttf", - "800italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7M-RIJxp1ml4imo.ttf", - "900italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7OaRIJxp1ml4imo.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D7hr5fUIJw.ttf" - }, - { - "family": "Chocolate Classical Sans", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/chocolateclassicalsans/v14/nuFqD-PLTZX4XIgT-P2ToCDudWHHflqUpTpfjWdDPI2J9mHITw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chocolateclassicalsans/v14/nuFqD-PLTZX4XIgT-P2ToCDudWHHflqUpTpfjWdzPYeN.ttf" - }, - { - "family": "Chokokutai", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/chokokutai/v12/kmK4Zqw4HwvCeHGM8Fws9y7ypu1Kr7I.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chokokutai/v12/kmK4Zqw4HwvCeHGM8Fwsxy_4og.ttf" - }, - { - "family": "Chonburi", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/chonburi/v14/8AtqGs-wOpGRTBq66IWaFr3biAfZ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/chonburi/v14/8AtqGs-wOpGRTBq66LWbHLk.ttf" - }, - { - "family": "Cinzel", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-tbnTYrvDE5ZdqU.ttf", - "500": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-uTnTYrvDE5ZdqU.ttf", - "600": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-gjgTYrvDE5ZdqU.ttf", - "700": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-jHgTYrvDE5ZdqU.ttf", - "800": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-lbgTYrvDE5ZdqU.ttf", - "900": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-n_gTYrvDE5ZdqU.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-tbnfYvlCA.ttf" - }, - { - "family": "Cinzel Decorative", - "variants": [ - "regular", - "700", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/cinzeldecorative/v19/daaCSScvJGqLYhG8nNt8KPPswUAPnh7URs1LaCyC.ttf", - "700": "https://fonts.gstatic.com/s/cinzeldecorative/v19/daaHSScvJGqLYhG8nNt8KPPswUAPniZoaelDQzCLlQXE.ttf", - "900": "https://fonts.gstatic.com/s/cinzeldecorative/v19/daaHSScvJGqLYhG8nNt8KPPswUAPniZQa-lDQzCLlQXE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cinzeldecorative/v19/daaCSScvJGqLYhG8nNt8KPPswUAPni7VTMk.ttf" - }, - { - "family": "Clicker Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/clickerscript/v14/raxkHiKPvt8CMH6ZWP8PdlEq72rY2zqUKafv.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/clickerscript/v14/raxkHiKPvt8CMH6ZWP8PdlEq71rZ0T4.ttf" - }, - { - "family": "Climate Crisis", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/climatecrisis/v14/wEOpEB3AntNeKCPBVW9XOKlmp3AUgWFN1DvIvcM0gFp6jaUrGb7PsQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/climatecrisis/v14/wEOpEB3AntNeKCPBVW9XOKlmp3AUgWFN1DvIvcM0gFpKjK8v.ttf" - }, - { - "family": "Coda", - "variants": [ - "regular", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/coda/v22/SLXHc1jY5nQ8JUIMapaN39I.ttf", - "800": "https://fonts.gstatic.com/s/coda/v22/SLXIc1jY5nQ8HeIgTp6mw9t1cX8.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/coda/v22/SLXHc1jY5nQ8FUMGbg.ttf" - }, - { - "family": "Codystar", - "variants": [ - "300", - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/codystar/v19/FwZf7-Q1xVk-40qxOuYsyuyrj0e29bfC.ttf", - "regular": "https://fonts.gstatic.com/s/codystar/v19/FwZY7-Q1xVk-40qxOt6A4sijpFu_.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/codystar/v19/FwZY7-Q1xVk-40qxOu6B6Mw.ttf" - }, - { - "family": "Coiny", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/coiny/v17/gyByhwU1K989PXwbElSvO5Tc.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/coiny/v17/gyByhwU1K989PUwaGFA.ttf" - }, - { - "family": "Combo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/combo/v22/BXRlvF3Jh_fIhg0iBu9y8Hf0.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/combo/v22/BXRlvF3Jh_fIhj0jDOs.ttf" - }, - { - "family": "Comfortaa", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v47", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4TbMPrQVIT9c2c8.ttf", - "regular": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4WjMPrQVIT9c2c8.ttf", - "500": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4VrMPrQVIT9c2c8.ttf", - "600": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4bbLPrQVIT9c2c8.ttf", - "700": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4Y_LPrQVIT9c2c8.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4WjMDrUfJQ.ttf" - }, - { - "family": "Comforter", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/comforter/v9/H4clBXOCl8nQnlaql3Qa6JG8iqeuag.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/comforter/v9/H4clBXOCl8nQnlaql3Qq6Zu4.ttf" - }, - { - "family": "Comforter Brush", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/comforterbrush/v9/Y4GTYa1xVSggrfzZI5WMjxRaOz0jwLL9Th8YYA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/comforterbrush/v9/Y4GTYa1xVSggrfzZI5WMjxRaOz0Twbj5.ttf" - }, - { - "family": "Comic Neue", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v9", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/comicneue/v9/4UaErEJDsxBrF37olUeD_wHLwpteLwtHJlc.ttf", - "300italic": "https://fonts.gstatic.com/s/comicneue/v9/4UaarEJDsxBrF37olUeD96_RTplUKylCNlcw_Q.ttf", - "regular": "https://fonts.gstatic.com/s/comicneue/v9/4UaHrEJDsxBrF37olUeDx63j5pN1MwI.ttf", - "italic": "https://fonts.gstatic.com/s/comicneue/v9/4UaFrEJDsxBrF37olUeD96_p4rFwIwJePw.ttf", - "700": "https://fonts.gstatic.com/s/comicneue/v9/4UaErEJDsxBrF37olUeD_xHMwpteLwtHJlc.ttf", - "700italic": "https://fonts.gstatic.com/s/comicneue/v9/4UaarEJDsxBrF37olUeD96_RXp5UKylCNlcw_Q.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/comicneue/v9/4UaHrEJDsxBrF37olUeD96zp4g.ttf" - }, - { - "family": "Comic Relief", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "greek", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-04-23", - "files": { - "regular": "https://fonts.gstatic.com/s/comicrelief/v2/BCauqZkHrvL55SZ8uaEhHMY2XBJhDgs-Kg.ttf", - "700": "https://fonts.gstatic.com/s/comicrelief/v2/BCaxqZkHrvL55SZ8uaEhHMYO4D1FBiAiI1y92w.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/comicrelief/v2/BCauqZkHrvL55SZ8uaEhHMYGXRhl.ttf" - }, - { - "family": "Coming Soon", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/comingsoon/v20/qWcuB6mzpYL7AJ2VfdQR1u-SUjjzsykh.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/comingsoon/v20/qWcuB6mzpYL7AJ2VfdQR1t-TWDw.ttf" - }, - { - "family": "Comme", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1z5cBr644fWsRO9w.ttf", - "200": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zZcFr644fWsRO9w.ttf", - "300": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zu8Fr644fWsRO9w.ttf", - "regular": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1z5cFr644fWsRO9w.ttf", - "500": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1z18Fr644fWsRO9w.ttf", - "600": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zO8Zr644fWsRO9w.ttf", - "700": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zAsZr644fWsRO9w.ttf", - "800": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zZcZr644fWsRO9w.ttf", - "900": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zTMZr644fWsRO9w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1z5cFb6oQb.ttf" - }, - { - "family": "Commissioner", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTMNcGPe7Fu0jUdk.ttf", - "200": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTENdGPe7Fu0jUdk.ttf", - "300": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTJ1dGPe7Fu0jUdk.ttf", - "regular": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTMNdGPe7Fu0jUdk.ttf", - "500": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTPFdGPe7Fu0jUdk.ttf", - "600": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTB1aGPe7Fu0jUdk.ttf", - "700": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTCRaGPe7Fu0jUdk.ttf", - "800": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTENaGPe7Fu0jUdk.ttf", - "900": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTGpaGPe7Fu0jUdk.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTMNdKPaxEg.ttf" - }, - { - "family": "Concert One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/concertone/v24/VEM1Ro9xs5PjtzCu-srDqRTlhv-CuVAQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/concertone/v24/VEM1Ro9xs5PjtzCu-srDqSTkjPs.ttf" - }, - { - "family": "Condiment", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/condiment/v26/pONk1hggFNmwvXALyH6Sq4n4o1vyCQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/condiment/v26/pONk1hggFNmwvXALyH6iqoP8.ttf" - }, - { - "family": "Content", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "khmer" - ], - "version": "v27", - "lastModified": "2024-12-04", - "files": { - "regular": "https://fonts.gstatic.com/s/content/v27/zrfl0HLayePhU_AwUaDyIiL0RCg.ttf", - "700": "https://fonts.gstatic.com/s/content/v27/zrfg0HLayePhU_AwaRzdBirfWCHvkAI.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/content/v27/zrfl0HLayePhU_AwYaH4Jg.ttf" - }, - { - "family": "Contrail One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/contrailone/v21/eLGbP-j_JA-kG0_Zo51noafdZUvt_c092w.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/contrailone/v21/eLGbP-j_JA-kG0_Zo51noaftZEHp.ttf" - }, - { - "family": "Convergence", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/convergence/v16/rax5HiePvdgXPmmMHcIPYRhasU7Q8Cad.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/convergence/v16/rax5HiePvdgXPmmMHcIPYShbu0o.ttf" - }, - { - "family": "Cookie", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/cookie/v23/syky-y18lb0tSbfNlQCT9tPdpw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cookie/v23/syky-y18lb0tSbf9lAqX.ttf" - }, - { - "family": "Copse", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/copse/v16/11hPGpDKz1rGb0djHkihUb-A.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/copse/v16/11hPGpDKz1rGb3diFEw.ttf" - }, - { - "family": "Coral Pixels", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-04-23", - "files": { - "regular": "https://fonts.gstatic.com/s/coralpixels/v1/qWctB66zpZ3zAtrlR8Mb1LyyeBb_ujA4ug.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/coralpixels/v1/qWctB66zpZ3zAtrlR8Mb1LyCeRz7.ttf", - "colorCapabilities": [ - "COLRv0" - ] - }, - { - "family": "Corben", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/corben/v23/LYjDdGzzklQtCMp9oAlEpVs3VQ.ttf", - "700": "https://fonts.gstatic.com/s/corben/v23/LYjAdGzzklQtCMpFHCZgrXArXN7HWQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/corben/v23/LYjDdGzzklQtCMpNoQNA.ttf" - }, - { - "family": "Corinthia", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/corinthia/v13/wEO_EBrAnchaJyPMHE0FUfAL3EsHiA.ttf", - "700": "https://fonts.gstatic.com/s/corinthia/v13/wEO6EBrAnchaJyPMHE097d8v1GAbgbLXQA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/corinthia/v13/wEO_EBrAnchaJyPMHE01UPoP.ttf" - }, - { - "family": "Cormorant", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFk9TQ7Rg7A2uwYs.ttf", - "regular": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFhFTQ7Rg7A2uwYs.ttf", - "500": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFiNTQ7Rg7A2uwYs.ttf", - "600": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFs9UQ7Rg7A2uwYs.ttf", - "700": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFvZUQ7Rg7A2uwYs.ttf", - "300italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQ9fdq6C-r0YvxdA.ttf", - "italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQq_dq6C-r0YvxdA.ttf", - "500italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQmfdq6C-r0YvxdA.ttf", - "600italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQdfBq6C-r0YvxdA.ttf", - "700italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQTPBq6C-r0YvxdA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFhFTc7Vq6A.ttf" - }, - { - "family": "Cormorant Garamond", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_qE6GnPEi_s4Mfs.ttf", - "regular": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_v86GnPEi_s4Mfs.ttf", - "500": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_s06GnPEi_s4Mfs.ttf", - "600": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_iE9GnPEi_s4Mfs.ttf", - "700": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_hg9GnPEi_s4Mfs.ttf", - "300italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd5rDDOj9k9Ifu5UQ.ttf", - "italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd58jDOj9k9Ifu5UQ.ttf", - "500italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd5wDDOj9k9Ifu5UQ.ttf", - "600italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd5LDfOj9k9Ifu5UQ.ttf", - "700italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd5FTfOj9k9Ifu5UQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_v86KnLOjw.ttf" - }, - { - "family": "Cormorant Infant", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrhxYOWThDlDkWSy.ttf", - "regular": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrgvYOWThDlDkWSy.ttf", - "500": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrgdYOWThDlDkWSy.ttf", - "600": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrjxZ-WThDlDkWSy.ttf", - "700": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrjIZ-WThDlDkWSy.ttf", - "300italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nI1PQjj1hlHSyazs.ttf", - "italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nIw3Qjj1hlHSyazs.ttf", - "500italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nIz_Qjj1hlHSyazs.ttf", - "600italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nI9PXjj1hlHSyazs.ttf", - "700italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nI-rXjj1hlHSyazs.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrgvYNWSjj0.ttf" - }, - { - "family": "Cormorant SC", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/cormorantsc/v19/0ybmGD4kxqXBmOVLG30OGwsmABIU_R3y8DOWGA.ttf", - "regular": "https://fonts.gstatic.com/s/cormorantsc/v19/0yb5GD4kxqXBmOVLG30OGwserDow9Tbu-Q.ttf", - "500": "https://fonts.gstatic.com/s/cormorantsc/v19/0ybmGD4kxqXBmOVLG30OGwsmWBMU_R3y8DOWGA.ttf", - "600": "https://fonts.gstatic.com/s/cormorantsc/v19/0ybmGD4kxqXBmOVLG30OGwsmdBQU_R3y8DOWGA.ttf", - "700": "https://fonts.gstatic.com/s/cormorantsc/v19/0ybmGD4kxqXBmOVLG30OGwsmEBUU_R3y8DOWGA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cormorantsc/v19/0yb5GD4kxqXBmOVLG30OGwsurTA0.ttf" - }, - { - "family": "Cormorant Unicase", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_ViZUaILtOqhqgDeXoF_n1_fTGX9N_tucv7Gy0DRzS.ttf", - "regular": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_QiZUaILtOqhqgDeXoF_n1_fTGX-vTnsMnx3C9.ttf", - "500": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_ViZUaILtOqhqgDeXoF_n1_fTGX9Mnt-cv7Gy0DRzS.ttf", - "600": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_ViZUaILtOqhqgDeXoF_n1_fTGX9MLsOcv7Gy0DRzS.ttf", - "700": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_ViZUaILtOqhqgDeXoF_n1_fTGX9Nvsecv7Gy0DRzS.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_QiZUaILtOqhqgDeXoF_n1_fTGX9vSlMc.ttf" - }, - { - "family": "Cormorant Upright", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJudM3I2Y35poFONtLdafkUCHw1y1N5phDsU9X6RPzQ.ttf", - "regular": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJrdM3I2Y35poFONtLdafkUCHw1y2vVjjTkeMnz.ttf", - "500": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJudM3I2Y35poFONtLdafkUCHw1y1MhpxDsU9X6RPzQ.ttf", - "600": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJudM3I2Y35poFONtLdafkUCHw1y1MNoBDsU9X6RPzQ.ttf", - "700": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJudM3I2Y35poFONtLdafkUCHw1y1NpoRDsU9X6RPzQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJrdM3I2Y35poFONtLdafkUCHw1y1vUhDA.ttf" - }, - { - "family": "Cossette Texte", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/cossettetexte/v1/S6ukw4pDXzTb-m1kPi_7eV-ciP01xPBQ19bE.ttf", - "700": "https://fonts.gstatic.com/s/cossettetexte/v1/S6unw4pDXzTb-m1kPi_7eV-ciMWJ69RY_MrNDZes.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cossettetexte/v1/S6ukw4pDXzTb-m1kPi_7eV-ciM00zvQ.ttf" - }, - { - "family": "Cossette Titre", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/cossettetitre/v1/11hYGpvKz1nGbxMXUWz9OdPzuiEZrPeE8cA2.ttf", - "700": "https://fonts.gstatic.com/s/cossettetitre/v1/11hbGpvKz1nGbxMXUWz9OdPzuhmlg9OM2tw_RXR-.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cossettetitre/v1/11hYGpvKz1nGbxMXUWz9OdPzuhEYpvM.ttf" - }, - { - "family": "Courgette", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/courgette/v19/wEO_EBrAnc9BLjLQAUkFUfAL3EsHiA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/courgette/v19/wEO_EBrAnc9BLjLQAUk1UPoP.ttf" - }, - { - "family": "Courier Prime", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/courierprime/v11/u-450q2lgwslOqpF_6gQ8kELWwZjW-_-tvg.ttf", - "italic": "https://fonts.gstatic.com/s/courierprime/v11/u-4n0q2lgwslOqpF_6gQ8kELawRpX837pvjxPA.ttf", - "700": "https://fonts.gstatic.com/s/courierprime/v11/u-4k0q2lgwslOqpF_6gQ8kELY7pMf-fVqvHoJXw.ttf", - "700italic": "https://fonts.gstatic.com/s/courierprime/v11/u-4i0q2lgwslOqpF_6gQ8kELawRR4-LfrtPtNXyeAg.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/courierprime/v11/u-450q2lgwslOqpF_6gQ8kELawdpXw.ttf" - }, - { - "family": "Cousine", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/cousine/v29/d6lIkaiiRdih4SpPzSMlzTbtz9k.ttf", - "italic": "https://fonts.gstatic.com/s/cousine/v29/d6lKkaiiRdih4SpP_SEvyRTo39l8hw.ttf", - "700": "https://fonts.gstatic.com/s/cousine/v29/d6lNkaiiRdih4SpP9Z8K6T7G09BlnmQ.ttf", - "700italic": "https://fonts.gstatic.com/s/cousine/v29/d6lPkaiiRdih4SpP_SEXdTvM1_JgjmRpOA.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cousine/v29/d6lIkaiiRdih4SpP_SIvyQ.ttf" - }, - { - "family": "Coustard", - "variants": [ - "regular", - "900" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/coustard/v17/3XFpErgg3YsZ5fqUU9UPvWXuROTd.ttf", - "900": "https://fonts.gstatic.com/s/coustard/v17/3XFuErgg3YsZ5fqUU-2LkEHmb_jU3eRL.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/coustard/v17/3XFpErgg3YsZ5fqUU-UOt2E.ttf" - }, - { - "family": "Covered By Your Grace", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/coveredbyyourgrace/v17/QGYwz-AZahWOJJI9kykWW9mD6opopoqXSOS0FgItq6bFIg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/coveredbyyourgrace/v17/QGYwz-AZahWOJJI9kykWW9mD6opopoqXSOSEFwgp.ttf" - }, - { - "family": "Crafty Girls", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/craftygirls/v16/va9B4kXI39VaDdlPJo8N_NvuQR37fF3Wlg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/craftygirls/v16/va9B4kXI39VaDdlPJo8N_NveQBf_.ttf" - }, - { - "family": "Creepster", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v13", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/creepster/v13/AlZy_zVUqJz4yMrniH4hdXf4XB0Tow.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/creepster/v13/AlZy_zVUqJz4yMrniH4RdH38.ttf" - }, - { - "family": "Crete Round", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/creteround/v16/55xoey1sJNPjPiv1ZZZrxJ1827zAKnxN.ttf", - "italic": "https://fonts.gstatic.com/s/creteround/v16/55xqey1sJNPjPiv1ZZZrxK1-0bjiL2xNhKc.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/creteround/v16/55xoey1sJNPjPiv1ZZZrxK190bg.ttf" - }, - { - "family": "Crimson Pro", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v28", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZTm18OJE_VNWoyQ.ttf", - "300": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZkG18OJE_VNWoyQ.ttf", - "regular": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZzm18OJE_VNWoyQ.ttf", - "500": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZ_G18OJE_VNWoyQ.ttf", - "600": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZEGp8OJE_VNWoyQ.ttf", - "700": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZKWp8OJE_VNWoyQ.ttf", - "800": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZTmp8OJE_VNWoyQ.ttf", - "900": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZZ2p8OJE_VNWoyQ.ttf", - "200italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi4Ue5s7dtC4yZNE.ttf", - "300italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi7Ke5s7dtC4yZNE.ttf", - "italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi6Ue5s7dtC4yZNE.ttf", - "500italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi6me5s7dtC4yZNE.ttf", - "600italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi5KfJs7dtC4yZNE.ttf", - "700italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi5zfJs7dtC4yZNE.ttf", - "800italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi4UfJs7dtC4yZNE.ttf", - "900italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi49fJs7dtC4yZNE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZzm1MOZs7.ttf" - }, - { - "family": "Crimson Text", - "variants": [ - "regular", - "italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/crimsontext/v19/wlp2gwHKFkZgtmSR3NB0oRJvaAJSA_JN3Q.ttf", - "italic": "https://fonts.gstatic.com/s/crimsontext/v19/wlpogwHKFkZgtmSR3NB0oRJfaghWIfdd3ahG.ttf", - "600": "https://fonts.gstatic.com/s/crimsontext/v19/wlppgwHKFkZgtmSR3NB0oRJXsCx2C9lR1LFffg.ttf", - "600italic": "https://fonts.gstatic.com/s/crimsontext/v19/wlprgwHKFkZgtmSR3NB0oRJfajCOD9NV9rRPfrKu.ttf", - "700": "https://fonts.gstatic.com/s/crimsontext/v19/wlppgwHKFkZgtmSR3NB0oRJX1C12C9lR1LFffg.ttf", - "700italic": "https://fonts.gstatic.com/s/crimsontext/v19/wlprgwHKFkZgtmSR3NB0oRJfajDqDtNV9rRPfrKu.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/crimsontext/v19/wlp2gwHKFkZgtmSR3NB0oRJfaQhW.ttf" - }, - { - "family": "Croissant One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/croissantone/v28/3y9n6bU9bTPg4m8NDy3Kq24UM3pqn5cdJ-4.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/croissantone/v28/3y9n6bU9bTPg4m8NDy3Kq24UA3tgmw.ttf" - }, - { - "family": "Crushed", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v32", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/crushed/v32/U9Mc6dym6WXImTlFT1kfuIqyLzA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/crushed/v32/U9Mc6dym6WXImTlFf1gVvA.ttf" - }, - { - "family": "Cuprum", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6ZjzSJjQjgnU.ttf", - "500": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmg9f6ZjzSJjQjgnU.ttf", - "600": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmgzv9ZjzSJjQjgnU.ttf", - "700": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmgwL9ZjzSJjQjgnU.ttf", - "italic": "https://fonts.gstatic.com/s/cuprum/v29/dg47_pLmvrkcOkBNI_FMh0j91rkhli25jn_YIhYmknUPEA.ttf", - "500italic": "https://fonts.gstatic.com/s/cuprum/v29/dg47_pLmvrkcOkBNI_FMh0j91rkhli25vH_YIhYmknUPEA.ttf", - "600italic": "https://fonts.gstatic.com/s/cuprum/v29/dg47_pLmvrkcOkBNI_FMh0j91rkhli25UHjYIhYmknUPEA.ttf", - "700italic": "https://fonts.gstatic.com/s/cuprum/v29/dg47_pLmvrkcOkBNI_FMh0j91rkhli25aXjYIhYmknUPEA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6Vj3YIg.ttf" - }, - { - "family": "Cute Font", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v28", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/cutefont/v28/Noaw6Uny2oWPbSHMrY6vmJNVNC9hkw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cutefont/v28/Noaw6Uny2oWPbSHMrY6fmZlR.ttf" - }, - { - "family": "Cutive", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/cutive/v24/NaPZcZ_fHOhV3Ip7T_hDoyqlZQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cutive/v24/NaPZcZ_fHOhV3IpLTvJH.ttf" - }, - { - "family": "Cutive Mono", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/cutivemono/v23/m8JWjfRfY7WVjVi2E-K9H5RFRG-K3Mud.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/cutivemono/v23/m8JWjfRfY7WVjVi2E-K9H6RETms.ttf" - }, - { - "family": "DM Mono", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "500", - "500italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/dmmono/v16/aFTR7PB1QTsUX8KYvrGyIYSnbKX9Rlk.ttf", - "300italic": "https://fonts.gstatic.com/s/dmmono/v16/aFTT7PB1QTsUX8KYth-orYataIf4VllXuA.ttf", - "regular": "https://fonts.gstatic.com/s/dmmono/v16/aFTU7PB1QTsUX8KYhh2aBYyMcKw.ttf", - "italic": "https://fonts.gstatic.com/s/dmmono/v16/aFTW7PB1QTsUX8KYth-QAa6JYKzkXw.ttf", - "500": "https://fonts.gstatic.com/s/dmmono/v16/aFTR7PB1QTsUX8KYvumzIYSnbKX9Rlk.ttf", - "500italic": "https://fonts.gstatic.com/s/dmmono/v16/aFTT7PB1QTsUX8KYth-o9YetaIf4VllXuA.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dmmono/v16/aFTU7PB1QTsUX8KYthyQAQ.ttf" - }, - { - "family": "DM Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAop1hTmf3ZGMZpg.ttf", - "200": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpxhTmf3ZGMZpg.ttf", - "300": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwA_JxhTmf3ZGMZpg.ttf", - "regular": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxhTmf3ZGMZpg.ttf", - "500": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAkJxhTmf3ZGMZpg.ttf", - "600": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAfJthTmf3ZGMZpg.ttf", - "700": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwARZthTmf3ZGMZpg.ttf", - "800": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpthTmf3ZGMZpg.ttf", - "900": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAC5thTmf3ZGMZpg.ttf", - "100italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDG3zRmYJpso5.ttf", - "200italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JDW3zRmYJpso5.ttf", - "300italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat_XDW3zRmYJpso5.ttf", - "italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDW3zRmYJpso5.ttf", - "500italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-7DW3zRmYJpso5.ttf", - "600italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9XCm3zRmYJpso5.ttf", - "700italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9uCm3zRmYJpso5.ttf", - "800italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JCm3zRmYJpso5.ttf", - "900italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8gCm3zRmYJpso5.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxRT23z.ttf" - }, - { - "family": "DM Serif Display", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/dmserifdisplay/v17/-nFnOHM81r4j6k0gjAW3mujVU2B2K_d709jy92k.ttf", - "italic": "https://fonts.gstatic.com/s/dmserifdisplay/v17/-nFhOHM81r4j6k0gjAW3mujVU2B2G_Vx1_r352np3Q.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dmserifdisplay/v17/-nFnOHM81r4j6k0gjAW3mujVU2B2G_Zx1w.ttf" - }, - { - "family": "DM Serif Text", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/dmseriftext/v13/rnCu-xZa_krGokauCeNq1wWyafOPXHIJErY.ttf", - "italic": "https://fonts.gstatic.com/s/dmseriftext/v13/rnCw-xZa_krGokauCeNq1wWyWfGFWFAMArZKqQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dmseriftext/v13/rnCu-xZa_krGokauCeNq1wWyWfKFWA.ttf" - }, - { - "family": "Dai Banna SIL", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "new-tai-lue" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "300": "https://fonts.gstatic.com/s/daibannasil/v2/lW-lwj0AJWmpwGyJ2uEoA4I7tYKoDsrKOgMX95A.ttf", - "300italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-jwj0AJWmpwGyJ2uEoA4I7vSyygsjAPiES55D3Vg.ttf", - "regular": "https://fonts.gstatic.com/s/daibannasil/v2/lW-4wj0AJWmpwGyJ2uEoA4I7jS6AKsLhJgo.ttf", - "italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-mwj0AJWmpwGyJ2uEoA4I7vSyKLuDkNgoO7g.ttf", - "500": "https://fonts.gstatic.com/s/daibannasil/v2/lW-lwj0AJWmpwGyJ2uEoA4I7tdqpDsrKOgMX95A.ttf", - "500italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-jwj0AJWmpwGyJ2uEoA4I7vSyy2snAPiES55D3Vg.ttf", - "600": "https://fonts.gstatic.com/s/daibannasil/v2/lW-lwj0AJWmpwGyJ2uEoA4I7tfauDsrKOgMX95A.ttf", - "600italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-jwj0AJWmpwGyJ2uEoA4I7vSyy9s7APiES55D3Vg.ttf", - "700": "https://fonts.gstatic.com/s/daibannasil/v2/lW-lwj0AJWmpwGyJ2uEoA4I7tZKvDsrKOgMX95A.ttf", - "700italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-jwj0AJWmpwGyJ2uEoA4I7vSyyks_APiES55D3Vg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/daibannasil/v2/lW-4wj0AJWmpwGyJ2uEoA4I7vS-KLg.ttf" - }, - { - "family": "Damion", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/damion/v15/hv-XlzJ3KEUe_YZUbWY3MTFgVg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/damion/v15/hv-XlzJ3KEUe_YZkbGwz.ttf" - }, - { - "family": "Dancing Script", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7BMSoHTeB9ptDqpw.ttf", - "500": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7BAyoHTeB9ptDqpw.ttf", - "600": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7B7y0HTeB9ptDqpw.ttf", - "700": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7B1i0HTeB9ptDqpw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7BMSo3TOp5.ttf" - }, - { - "family": "Danfo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/danfo/v5/snf3s0u_98t16THfK1Csj3N41ZqbYDe5S71ToPrNKQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/danfo/v5/snf3s0u_98t16THfK1Csj3N41ZqbYDeJSrdX.ttf" - }, - { - "family": "Dangrek", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v33", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/dangrek/v33/LYjCdG30nEgoH8E2gCNqqVIuTN4.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dangrek/v33/LYjCdG30nEgoH8E2sCJgrQ.ttf" - }, - { - "family": "Darker Grotesque", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v10", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXxpqn7y-XFyZFUB.ttf", - "regular": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXw3qn7y-XFyZFUB.ttf", - "500": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXwFqn7y-XFyZFUB.ttf", - "600": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXzprX7y-XFyZFUB.ttf", - "700": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXzQrX7y-XFyZFUB.ttf", - "800": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXy3rX7y-XFyZFUB.ttf", - "900": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXyerX7y-XFyZFUB.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXw3qk7z83U.ttf" - }, - { - "family": "Darumadrop One", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/darumadropone/v14/cY9cfjeIW11dpCKgRLi675a87IhHBJOxZQPp.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/darumadropone/v14/cY9cfjeIW11dpCKgRLi675a87LhGDpc.ttf" - }, - { - "family": "David Libre", - "variants": [ - "regular", - "500", - "700" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/davidlibre/v17/snfus0W_99N64iuYSvp4W_l86p6TYS-Y.ttf", - "500": "https://fonts.gstatic.com/s/davidlibre/v17/snfzs0W_99N64iuYSvp4W8GIw7qbSjORSo9W.ttf", - "700": "https://fonts.gstatic.com/s/davidlibre/v17/snfzs0W_99N64iuYSvp4W8HAxbqbSjORSo9W.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/davidlibre/v17/snfus0W_99N64iuYSvp4W8l94Jo.ttf" - }, - { - "family": "Dawning of a New Day", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/dawningofanewday/v22/t5t_IQMbOp2SEwuncwLRjMfIg1yYit_nAz8bhWJGNoBE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dawningofanewday/v22/t5t_IQMbOp2SEwuncwLRjMfIg1yYit_nAw8aj2Y.ttf" - }, - { - "family": "Days One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin" - ], - "version": "v19", - "lastModified": "2025-04-23", - "files": { - "regular": "https://fonts.gstatic.com/s/daysone/v19/mem9YaCnxnKRiYZOCLYVeLkWVNBt.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/daysone/v19/mem9YaCnxnKRiYZOCIYUcr0.ttf" - }, - { - "family": "Dekko", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/dekko/v23/46khlb_wWjfSrttFR0vsfl1B.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dekko/v23/46khlb_wWjfSrutETU8.ttf" - }, - { - "family": "Dela Gothic One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "greek", - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/delagothicone/v19/hESp6XxvMDRA-2eD0lXpDa6QkBAGRUsJQAlbUA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/delagothicone/v19/hESp6XxvMDRA-2eD0lXpDa6QkBA2REEN.ttf" - }, - { - "family": "Delicious Handrawn", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v10", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/delicioushandrawn/v10/wlpsgx_NAUNkpmKQifcxkQchDFo3fJ113JpDd6u3AQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/delicioushandrawn/v10/wlpsgx_NAUNkpmKQifcxkQchDFo3fJ1F3ZBH.ttf" - }, - { - "family": "Delius", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/delius/v21/PN_xRfK0pW_9e1rtYcI-jT3L_w.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/delius/v21/PN_xRfK0pW_9e1rdYMg6.ttf" - }, - { - "family": "Delius Swash Caps", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/deliusswashcaps/v25/oY1E8fPLr7v4JWCExZpWebxVKORpXXedKmeBvEYs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/deliusswashcaps/v25/oY1E8fPLr7v4JWCExZpWebxVKORpXUecIGM.ttf" - }, - { - "family": "Delius Unicase", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v30", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/deliusunicase/v30/845BNMEwEIOVT8BmgfSzIr_6mmLHd-73LXWs.ttf", - "700": "https://fonts.gstatic.com/s/deliusunicase/v30/845CNMEwEIOVT8BmgfSzIr_6mlp7WMr_BmmlS5aw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/deliusunicase/v30/845BNMEwEIOVT8BmgfSzIr_6mlLGfeo.ttf" - }, - { - "family": "Della Respira", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/dellarespira/v24/RLp5K5v44KaueWI6iEJQBiGPRfkSu6EuTHo.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dellarespira/v24/RLp5K5v44KaueWI6iEJQBiGPdfgYvw.ttf" - }, - { - "family": "Denk One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/denkone/v21/dg4m_pzhrqcFb2IzROtHpbglShon.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/denkone/v21/dg4m_pzhrqcFb2IzRNtGr7w.ttf" - }, - { - "family": "Devonshire", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/devonshire/v29/46kqlbDwWirWr4gtBD2BX0Vq01lYAZM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/devonshire/v29/46kqlbDwWirWr4gtBD2Bb0Rg1w.ttf" - }, - { - "family": "Dhurjati", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/dhurjati/v27/_6_8ED3gSeatXfFiFX3ySKQtuTA2.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dhurjati/v27/_6_8ED3gSeatXfFiFU3zQqA.ttf" - }, - { - "family": "Didact Gothic", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/didactgothic/v21/ahcfv8qz1zt6hCC5G4F_P4ASpUySp0LlcyQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/didactgothic/v21/ahcfv8qz1zt6hCC5G4F_P4ASlU2Yow.ttf" - }, - { - "family": "Diphylleia", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/diphylleia/v2/DtVmJxCtRKMixK4_HXsIulwm6gDXvwE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/diphylleia/v2/DtVmJxCtRKMixK4_HXsIil0s7g.ttf" - }, - { - "family": "Diplomata", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v33", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/diplomata/v33/Cn-0JtiMXwhNwp-wKxyfYGxYrdM9Sg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/diplomata/v33/Cn-0JtiMXwhNwp-wKxyvYWZc.ttf" - }, - { - "family": "Diplomata SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/diplomatasc/v30/buExpoi3ecvs3kidKgBJo2kf-P5Oaiw4cw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/diplomatasc/v30/buExpoi3ecvs3kidKgBJo2kv-fRK.ttf" - }, - { - "family": "Do Hyeon", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/dohyeon/v21/TwMN-I8CRRU2zM86HFE3ZwaH__-C.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dohyeon/v21/TwMN-I8CRRU2zM86HGE2bQI.ttf" - }, - { - "family": "Dokdo", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/dokdo/v23/esDf315XNuCBLxLo4NaMlKcH.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dokdo/v23/esDf315XNuCBLyLp6tI.ttf" - }, - { - "family": "Domine", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X3LAI10VErGuW8Q.ttf", - "500": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X0DAI10VErGuW8Q.ttf", - "600": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X6zHI10VErGuW8Q.ttf", - "700": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X5XHI10VErGuW8Q.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X3LAE1wfFg.ttf" - }, - { - "family": "Donegal One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/donegalone/v22/m8JWjfRYea-ZnFz6fsK9FZRFRG-K3Mud.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/donegalone/v22/m8JWjfRYea-ZnFz6fsK9FaRETms.ttf" - }, - { - "family": "Dongle", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "korean", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/dongle/v16/sJoG3Ltdjt6VPkqeEcxrYjWNzXvVPA.ttf", - "regular": "https://fonts.gstatic.com/s/dongle/v16/sJoF3Ltdjt6VPkqmveRPah6RxA.ttf", - "700": "https://fonts.gstatic.com/s/dongle/v16/sJoG3Ltdjt6VPkqeActrYjWNzXvVPA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dongle/v16/sJoF3Ltdjt6VPkqWvO5L.ttf" - }, - { - "family": "Doppio One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/doppioone/v14/Gg8wN5gSaBfyBw2MqCh-lgshKGpe5Fg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/doppioone/v14/Gg8wN5gSaBfyBw2MqCh-pgorLA.ttf" - }, - { - "family": "Dorsa", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v29", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/dorsa/v29/yYLn0hjd0OGwqo493XCFxAnQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dorsa/v29/yYLn0hjd0OGwqr4813Q.ttf" - }, - { - "family": "Dosis", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v34", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJt7MV3BkFTq4EPw.ttf", - "300": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJabMV3BkFTq4EPw.ttf", - "regular": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJN7MV3BkFTq4EPw.ttf", - "500": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJBbMV3BkFTq4EPw.ttf", - "600": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJ6bQV3BkFTq4EPw.ttf", - "700": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJ0LQV3BkFTq4EPw.ttf", - "800": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJt7QV3BkFTq4EPw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJN7Ml3RMB.ttf" - }, - { - "family": "DotGothic16", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/dotgothic16/v21/v6-QGYjBJFKgyw5nSoDAGE7L435YPFrT.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dotgothic16/v21/v6-QGYjBJFKgyw5nSoDAGH7K6Xo.ttf" - }, - { - "family": "Doto", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFOOOez0WSvrlpgw.ttf", - "200": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFuOKez0WSvrlpgw.ttf", - "300": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFZuKez0WSvrlpgw.ttf", - "regular": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFOOKez0WSvrlpgw.ttf", - "500": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFCuKez0WSvrlpgw.ttf", - "600": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphF5uWez0WSvrlpgw.ttf", - "700": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphF3-Wez0WSvrlpgw.ttf", - "800": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFuOWez0WSvrlpgw.ttf", - "900": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFkeWez0WSvrlpgw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFOOKuzk-W.ttf" - }, - { - "family": "Dr Sugiyama", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/drsugiyama/v30/HTxoL2k4N3O9n5I1boGI7abRM4-t-g7y.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/drsugiyama/v30/HTxoL2k4N3O9n5I1boGI7ZbQOYs.ttf" - }, - { - "family": "Duru Sans", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/durusans/v21/xn7iYH8xwmSyTvEV_HOxT_fYdN-WZw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/durusans/v21/xn7iYH8xwmSyTvEV_HOBTv3c.ttf" - }, - { - "family": "DynaPuff", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v9", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RSxYu6YjrSRs4wn8.ttf", - "500": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RSyQu6YjrSRs4wn8.ttf", - "600": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RS8gp6YjrSRs4wn8.ttf", - "700": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RS_Ep6YjrSRs4wn8.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RSxYu2YnhTQ.ttf" - }, - { - "family": "Dynalight", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/dynalight/v24/1Ptsg8LOU_aOmQvTsF4ISotrDfGGxA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/dynalight/v24/1Ptsg8LOU_aOmQvTsF44S4Fv.ttf" - }, - { - "family": "EB Garamond", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v32", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RUA4V-e6yHgQ.ttf", - "500": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-2fRUA4V-e6yHgQ.ttf", - "600": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-NfNUA4V-e6yHgQ.ttf", - "700": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-DPNUA4V-e6yHgQ.ttf", - "800": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-a_NUA4V-e6yHgQ.ttf", - "italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7e8QI96WamXgXFI.ttf", - "500italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7eOQI96WamXgXFI.ttf", - "600italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7diR496WamXgXFI.ttf", - "700italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7dbR496WamXgXFI.ttf", - "800italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7c8R496WamXgXFI.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RkAo96.ttf" - }, - { - "family": "Eagle Lake", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/eaglelake/v26/ptRMTiqbbuNJDOiKj9wG5O7yKQNute8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eaglelake/v26/ptRMTiqbbuNJDOiKj9wG1O_4LQ.ttf" - }, - { - "family": "East Sea Dokdo", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v26", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/eastseadokdo/v26/xfuo0Wn2V2_KanASqXSZp22m05_aGavYS18y.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eastseadokdo/v26/xfuo0Wn2V2_KanASqXSZp22m06_bE68.ttf" - }, - { - "family": "Eater", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/eater/v27/mtG04_FCK7bOvpu2u3FwsXsR.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eater/v27/mtG04_FCK7bOvqu3sXU.ttf" - }, - { - "family": "Economica", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/economica/v17/Qw3fZQZaHCLgIWa29ZBrMcgAAl1lfQ.ttf", - "italic": "https://fonts.gstatic.com/s/economica/v17/Qw3ZZQZaHCLgIWa29ZBbM8IEIFh1fWUl.ttf", - "700": "https://fonts.gstatic.com/s/economica/v17/Qw3aZQZaHCLgIWa29ZBTjeckCnZ5dHw8iw.ttf", - "700italic": "https://fonts.gstatic.com/s/economica/v17/Qw3EZQZaHCLgIWa29ZBbM_q4D3x9Vnksi4M7.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/economica/v17/Qw3fZQZaHCLgIWa29ZBbMMIE.ttf" - }, - { - "family": "Eczar", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "devanagari", - "greek", - "greek-ext", - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXHd6WqTIVKWJKWg.ttf", - "500": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXL96WqTIVKWJKWg.ttf", - "600": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXw9mWqTIVKWJKWg.ttf", - "700": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDX-tmWqTIVKWJKWg.ttf", - "800": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXndmWqTIVKWJKWg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXHd6mqDgR.ttf" - }, - { - "family": "Edu AU VIC WA NT Arrows", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5tAcvhTTk90n91Vw.ttf", - "500": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5tM8vhTTk90n91Vw.ttf", - "600": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5t38zhTTk90n91Vw.ttf", - "700": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5t5szhTTk90n91Vw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5tAcvRTDM5.ttf" - }, - { - "family": "Edu AU VIC WA NT Dots", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLvtYEtmT2SB3_5U.ttf", - "500": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLslYEtmT2SB3_5U.ttf", - "600": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLiVfEtmT2SB3_5U.ttf", - "700": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLhxfEtmT2SB3_5U.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLvtYItiZ3Q.ttf" - }, - { - "family": "Edu AU VIC WA NT Guides", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPdK1ZazoF08FsYlA.ttf", - "500": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPdGVZazoF08FsYlA.ttf", - "600": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPd9VFazoF08FsYlA.ttf", - "700": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPdzFFazoF08FsYlA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPdK1Zqz4tw.ttf" - }, - { - "family": "Edu AU VIC WA NT Hand", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtCJ1lKtFbYfTEUU.ttf", - "500": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtBB1lKtFbYfTEUU.ttf", - "600": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtPxylKtFbYfTEUU.ttf", - "700": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtMVylKtFbYfTEUU.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtCJ1pKpPaQ.ttf" - }, - { - "family": "Edu AU VIC WA NT Pre", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIyJmkwr6MhKkg6nw.ttf", - "500": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIyFGkwr6MhKkg6nw.ttf", - "600": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIy-G4wr6MhKkg6nw.ttf", - "700": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIywW4wr6MhKkg6nw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIyJmkArqkl.ttf" - }, - { - "family": "Edu NSW ACT Cursive", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCrd5giiVjXBs6BMb.ttf", - "500": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCrdLgiiVjXBs6BMb.ttf", - "600": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCrenhSiVjXBs6BMb.ttf", - "700": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCreehSiVjXBs6BMb.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCrd5ghiUh3Q.ttf" - }, - { - "family": "Edu NSW ACT Foundation", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v5", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki9tovGLeC-sfguJ.ttf", - "500": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki9fovGLeC-sfguJ.ttf", - "600": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki-zpfGLeC-sfguJ.ttf", - "700": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki-KpfGLeC-sfguJ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki9tosGKcis.ttf" - }, - { - "family": "Edu NSW ACT Hand Pre", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0ywWBqtsjedKEHuQ.ttf", - "500": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0y82BqtsjedKEHuQ.ttf", - "600": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0yH2dqtsjedKEHuQ.ttf", - "700": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0yJmdqtsjedKEHuQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0ywWBat8La.ttf" - }, - { - "family": "Edu QLD Beginner", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v5", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE4E3oebi6vyVWCN.ttf", - "500": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE423oebi6vyVWCN.ttf", - "600": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE7a2Yebi6vyVWCN.ttf", - "700": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE7j2Yebi6vyVWCN.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE4E3reaga8.ttf" - }, - { - "family": "Edu QLD Hand", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjngAUeRt5gGCzkrs.ttf", - "500": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjnjIUeRt5gGCzkrs.ttf", - "600": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjnt4TeRt5gGCzkrs.ttf", - "700": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjnucTeRt5gGCzkrs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjngAUSRpzhA.ttf" - }, - { - "family": "Edu SA Beginner", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v5", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9989fo1yBydUEDs.ttf", - "500": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9-09fo1yBydUEDs.ttf", - "600": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9wE6fo1yBydUEDs.ttf", - "700": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9zg6fo1yBydUEDs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9989Tox4Aw.ttf" - }, - { - "family": "Edu SA Hand", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXlWumvkSE55OZgw.ttf", - "500": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXp2umvkSE55OZgw.ttf", - "600": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXS2ymvkSE55OZgw.ttf", - "700": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXcmymvkSE55OZgw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXlWuWv06A.ttf" - }, - { - "family": "Edu TAS Beginner", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v5", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_HwemkrBWRhvk02.ttf", - "500": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_HCemkrBWRhvk02.ttf", - "600": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_EufWkrBWRhvk02.ttf", - "700": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_EXfWkrBWRhvk02.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_HwelkqD2A.ttf" - }, - { - "family": "Edu VIC WA NT Beginner", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-OXlPmFXwnpkeGR.ttf", - "500": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-OllPmFXwnpkeGR.ttf", - "600": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-NJk_mFXwnpkeGR.ttf", - "700": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-Nwk_mFXwnpkeGR.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-OXlMmEVQ0.ttf" - }, - { - "family": "Edu VIC WA NT Hand", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuLyfMZhrib2Bg-4.ttf", - "500": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuI6fMZhrib2Bg-4.ttf", - "600": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuGKYMZhrib2Bg-4.ttf", - "700": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuFuYMZhrib2Bg-4.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuLyfAZlhjQ.ttf" - }, - { - "family": "Edu VIC WA NT Hand Pre", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLTo4dgUBS1Nzqn8.ttf", - "500": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLTa4dgUBS1Nzqn8.ttf", - "600": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLQ25tgUBS1Nzqn8.ttf", - "700": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLQP5tgUBS1Nzqn8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLTo4egVDyk.ttf" - }, - { - "family": "El Messiri", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuXwe65ghj3OoapG.ttf", - "500": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuXCe65ghj3OoapG.ttf", - "600": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuUufK5ghj3OoapG.ttf", - "700": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuUXfK5ghj3OoapG.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuXwe55hjDk.ttf" - }, - { - "family": "Electrolize", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/electrolize/v20/cIf5Ma1dtE0zSiGSiED7AUEGso5tQafB.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/electrolize/v20/cIf5Ma1dtE0zSiGSiED7AXEHuIo.ttf" - }, - { - "family": "Elsie", - "variants": [ - "regular", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/elsie/v26/BCanqZABrez54yYu9slAeLgX.ttf", - "900": "https://fonts.gstatic.com/s/elsie/v26/BCaqqZABrez54x6q2-1IU6QeXSBk.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/elsie/v26/BCanqZABrez54xYv_M0.ttf" - }, - { - "family": "Elsie Swash Caps", - "variants": [ - "regular", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/elsieswashcaps/v25/845DNN8xGZyVX5MVo_upKf7KnjK0ferVKGWsUo8.ttf", - "900": "https://fonts.gstatic.com/s/elsieswashcaps/v25/845ENN8xGZyVX5MVo_upKf7KnjK0RW74DG2HToawrdU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/elsieswashcaps/v25/845DNN8xGZyVX5MVo_upKf7KnjK0TevfLA.ttf" - }, - { - "family": "Emblema One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/emblemaone/v22/nKKT-GQ0F5dSY8vzG0rOEIRBHl57G_f_.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/emblemaone/v22/nKKT-GQ0F5dSY8vzG0rOELRAFFo.ttf" - }, - { - "family": "Emilys Candy", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/emilyscandy/v21/2EbgL-1mD1Rnb0OGKudbk0y5r9xrX84JjA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/emilyscandy/v21/2EbgL-1mD1Rnb0OGKudbk0yJrtZv.ttf" - }, - { - "family": "Encode Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGGHiZtWP7FJCt2c.ttf", - "200": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGOHjZtWP7FJCt2c.ttf", - "300": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGD_jZtWP7FJCt2c.ttf", - "regular": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGGHjZtWP7FJCt2c.ttf", - "500": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGFPjZtWP7FJCt2c.ttf", - "600": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGL_kZtWP7FJCt2c.ttf", - "700": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGIbkZtWP7FJCt2c.ttf", - "800": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGOHkZtWP7FJCt2c.ttf", - "900": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGMjkZtWP7FJCt2c.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGGHjVtSF6A.ttf" - }, - { - "family": "Encode Sans Condensed", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_76_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-5a-JLQoFI2KR.ttf", - "200": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-SY6pByQJKnuIFA.ttf", - "300": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-LY2pByQJKnuIFA.ttf", - "regular": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_16_LD37rqfuwxyIuaZhE6cRXOLtm2gfTGgaWNDw8VIw.ttf", - "500": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-dYypByQJKnuIFA.ttf", - "600": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-WYupByQJKnuIFA.ttf", - "700": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-PYqpByQJKnuIFA.ttf", - "800": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-IYmpByQJKnuIFA.ttf", - "900": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-BYipByQJKnuIFA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_16_LD37rqfuwxyIuaZhE6cRXOLtm2gfT2gK-J.ttf" - }, - { - "family": "Encode Sans Expanded", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mx1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpJGKQNicoAbJlw.ttf", - "200": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpLqCCNIXIwSP0XD.ttf", - "300": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpKOCyNIXIwSP0XD.ttf", - "regular": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4m_1mF4GcnstG_Jh1QH6ac4hNLeNyeYUqoiIwdAd5Ab.ttf", - "500": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpLWCiNIXIwSP0XD.ttf", - "600": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpL6DSNIXIwSP0XD.ttf", - "700": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpKeDCNIXIwSP0XD.ttf", - "800": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpKCDyNIXIwSP0XD.ttf", - "900": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpKmDiNIXIwSP0XD.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4m_1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpojKQM.ttf" - }, - { - "family": "Encode Sans SC", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HHhn8c9NOEEClIc.ttf", - "200": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HPhm8c9NOEEClIc.ttf", - "300": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HCZm8c9NOEEClIc.ttf", - "regular": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HHhm8c9NOEEClIc.ttf", - "500": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HEpm8c9NOEEClIc.ttf", - "600": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HKZh8c9NOEEClIc.ttf", - "700": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HJ9h8c9NOEEClIc.ttf", - "800": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HPhh8c9NOEEClIc.ttf", - "900": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HNFh8c9NOEEClIc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HHhmwc5HPA.ttf" - }, - { - "family": "Encode Sans Semi Condensed", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT6oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1T19MFtQ9jpVUA.ttf", - "200": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1RZ1eFHbdTgTFmr.ttf", - "300": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1Q91uFHbdTgTFmr.ttf", - "regular": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT4oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG2yR_sVPRsjp.ttf", - "500": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1Rl1-FHbdTgTFmr.ttf", - "600": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1RJ0OFHbdTgTFmr.ttf", - "700": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1Qt0eFHbdTgTFmr.ttf", - "800": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1Qx0uFHbdTgTFmr.ttf", - "900": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1QV0-FHbdTgTFmr.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT4oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1yQ9ME.ttf" - }, - { - "family": "Encode Sans Semi Expanded", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8xOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TM-41KwrlKXeOEA.ttf", - "200": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TM0IUCyDLJX6XCWU.ttf", - "300": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TMyYXCyDLJX6XCWU.ttf", - "regular": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke83OhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TC4o_LyjgOXc.ttf", - "500": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TM34WCyDLJX6XCWU.ttf", - "600": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TM1IRCyDLJX6XCWU.ttf", - "700": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TMzYQCyDLJX6XCWU.ttf", - "800": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TMyoTCyDLJX6XCWU.ttf", - "900": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TMw4SCyDLJX6XCWU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke83OhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TO4s1Kw.ttf" - }, - { - "family": "Engagement", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/engagement/v29/x3dlckLDZbqa7RUs9MFVXNossybsHQI.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/engagement/v29/x3dlckLDZbqa7RUs9MFVbNsmtw.ttf" - }, - { - "family": "Englebert", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/englebert/v24/xn7iYH8w2XGrC8AR4HSxT_fYdN-WZw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/englebert/v24/xn7iYH8w2XGrC8AR4HSBTv3c.ttf" - }, - { - "family": "Enriqueta", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/enriqueta/v19/goksH6L7AUFrRvV44HVTS0CjkP1Yog.ttf", - "500": "https://fonts.gstatic.com/s/enriqueta/v19/gokpH6L7AUFrRvV44HVrv2mHmNZEq6TTFw.ttf", - "600": "https://fonts.gstatic.com/s/enriqueta/v19/gokpH6L7AUFrRvV44HVrk26HmNZEq6TTFw.ttf", - "700": "https://fonts.gstatic.com/s/enriqueta/v19/gokpH6L7AUFrRvV44HVr92-HmNZEq6TTFw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/enriqueta/v19/goksH6L7AUFrRvV44HVjSkqn.ttf" - }, - { - "family": "Ephesis", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/ephesis/v11/uU9PCBUS8IerL2VG7xPb3vyHmlI.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ephesis/v11/uU9PCBUS8IerL2VG3xLR2g.ttf" - }, - { - "family": "Epilogue", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXMDLiDJXVigHPVA.ttf", - "200": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXsDPiDJXVigHPVA.ttf", - "300": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXbjPiDJXVigHPVA.ttf", - "regular": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXMDPiDJXVigHPVA.ttf", - "500": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXAjPiDJXVigHPVA.ttf", - "600": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OX7jTiDJXVigHPVA.ttf", - "700": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OX1zTiDJXVigHPVA.ttf", - "800": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXsDTiDJXVigHPVA.ttf", - "900": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXmTTiDJXVigHPVA.ttf", - "100italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HAKTp_RqATfVHNU.ttf", - "200italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HCKT5_RqATfVHNU.ttf", - "300italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HBUT5_RqATfVHNU.ttf", - "italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HAKT5_RqATfVHNU.ttf", - "500italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HA4T5_RqATfVHNU.ttf", - "600italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HDUSJ_RqATfVHNU.ttf", - "700italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HDtSJ_RqATfVHNU.ttf", - "800italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HCKSJ_RqATfVHNU.ttf", - "900italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HCjSJ_RqATfVHNU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXMDPSDZ_R.ttf" - }, - { - "family": "Epunda Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndMlT7Sb54PQAqcA.ttf", - "regular": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndbFT7Sb54PQAqcA.ttf", - "500": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndXlT7Sb54PQAqcA.ttf", - "600": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndslP7Sb54PQAqcA.ttf", - "700": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndi1P7Sb54PQAqcA.ttf", - "800": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_nd7FP7Sb54PQAqcA.ttf", - "900": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndxVP7Sb54PQAqcA.ttf", - "300italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBdNCrR8HwU6cADD.ttf", - "italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBcTCrR8HwU6cADD.ttf", - "500italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBchCrR8HwU6cADD.ttf", - "600italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBfNDbR8HwU6cADD.ttf", - "700italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBf0DbR8HwU6cADD.ttf", - "800italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBeTDbR8HwU6cADD.ttf", - "900italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBe6DbR8HwU6cADD.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndbFTLSLR8.ttf" - }, - { - "family": "Epunda Slab", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-08-26", - "files": { - "300": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_JjNVoU4Q_2eOpA.ttf", - "regular": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_eDNVoU4Q_2eOpA.ttf", - "500": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_SjNVoU4Q_2eOpA.ttf", - "600": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_pjRVoU4Q_2eOpA.ttf", - "700": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_nzRVoU4Q_2eOpA.ttf", - "800": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_-DRVoU4Q_2eOpA.ttf", - "900": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_0TRVoU4Q_2eOpA.ttf", - "300italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHDj4kQU3WKepN0B.ttf", - "italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHC94kQU3WKepN0B.ttf", - "500italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHCP4kQU3WKepN0B.ttf", - "600italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHBj5UQU3WKepN0B.ttf", - "700italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHBa5UQU3WKepN0B.ttf", - "800italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHA95UQU3WKepN0B.ttf", - "900italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHAU5UQU3WKepN0B.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_eDNloEQU.ttf" - }, - { - "family": "Erica One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/ericaone/v29/WBLnrEXccV9VGrOKmGD1W0_MJMGxiQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ericaone/v29/WBLnrEXccV9VGrOKmGDFWkXI.ttf" - }, - { - "family": "Esteban", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/esteban/v16/r05bGLZE-bdGdN-GdOuD5jokU8E.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/esteban/v16/r05bGLZE-bdGdN-GROqJ4g.ttf" - }, - { - "family": "Estonia", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/estonia/v13/7Au_p_4ijSecA1yHCCL8zkwMIFg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/estonia/v13/7Au_p_4ijSecA1yHOCP2yg.ttf" - }, - { - "family": "Euphoria Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/euphoriascript/v22/mFTpWb0X2bLb_cx6To2B8GpKoD5ak_ZT1D8x7Q.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/euphoriascript/v22/mFTpWb0X2bLb_cx6To2B8GpKoD5qkvxX.ttf" - }, - { - "family": "Ewert", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/ewert/v27/va9I4kzO2tFODYBvS-J3kbDP.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ewert/v27/va9I4kzO2tFODbBuQeY.ttf" - }, - { - "family": "Exile", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-13", - "files": { - "regular": "https://fonts.gstatic.com/s/exile/v1/pxiKyp0xqNtbjBsYHpT2dkNE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/exile/v1/pxiKyp0xqNtbjCsZFJA.ttf" - }, - { - "family": "Exo", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4lM2CwNsOl4p5Is.ttf", - "200": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4tM3CwNsOl4p5Is.ttf", - "300": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4g03CwNsOl4p5Is.ttf", - "regular": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4lM3CwNsOl4p5Is.ttf", - "500": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4mE3CwNsOl4p5Is.ttf", - "600": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4o0wCwNsOl4p5Is.ttf", - "700": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4rQwCwNsOl4p5Is.ttf", - "800": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4tMwCwNsOl4p5Is.ttf", - "900": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4vowCwNsOl4p5Is.ttf", - "100italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t040FmPnws9Iu-uA.ttf", - "200italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0Y0BmPnws9Iu-uA.ttf", - "300italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0vUBmPnws9Iu-uA.ttf", - "italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t040BmPnws9Iu-uA.ttf", - "500italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t00UBmPnws9Iu-uA.ttf", - "600italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0PUdmPnws9Iu-uA.ttf", - "700italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0BEdmPnws9Iu-uA.ttf", - "800italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0Y0dmPnws9Iu-uA.ttf", - "900italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0SkdmPnws9Iu-uA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4lM3OwJmPg.ttf" - }, - { - "family": "Exo 2", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jvvOcPtq-rpvLpQ.ttf", - "200": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jPvKcPtq-rpvLpQ.ttf", - "300": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8j4PKcPtq-rpvLpQ.ttf", - "regular": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jvvKcPtq-rpvLpQ.ttf", - "500": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jjPKcPtq-rpvLpQ.ttf", - "600": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jYPWcPtq-rpvLpQ.ttf", - "700": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jWfWcPtq-rpvLpQ.ttf", - "800": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jPvWcPtq-rpvLpQ.ttf", - "900": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jF_WcPtq-rpvLpQ.ttf", - "100italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drF0fNC6jJ7bpQBL.ttf", - "200italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drH0fdC6jJ7bpQBL.ttf", - "300italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drEqfdC6jJ7bpQBL.ttf", - "italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drF0fdC6jJ7bpQBL.ttf", - "500italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drFGfdC6jJ7bpQBL.ttf", - "600italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drGqetC6jJ7bpQBL.ttf", - "700italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drGTetC6jJ7bpQBL.ttf", - "800italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drH0etC6jJ7bpQBL.ttf", - "900italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drHdetC6jJ7bpQBL.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jvvKsP9C6.ttf" - }, - { - "family": "Expletus Sans", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v31", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaSY2s1oFQTcXfMm.ttf", - "500": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaSq2s1oFQTcXfMm.ttf", - "600": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaRG3c1oFQTcXfMm.ttf", - "700": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaR_3c1oFQTcXfMm.ttf", - "italic": "https://fonts.gstatic.com/s/expletussans/v31/RLpoK5v5_bqufTYdnhFzDj2ddfsCtKHbhOZyCrFQmSUrHwD-WOMmKKY.ttf", - "500italic": "https://fonts.gstatic.com/s/expletussans/v31/RLpoK5v5_bqufTYdnhFzDj2ddfsCtKHbhOZyCrFQmRcrHwD-WOMmKKY.ttf", - "600italic": "https://fonts.gstatic.com/s/expletussans/v31/RLpoK5v5_bqufTYdnhFzDj2ddfsCtKHbhOZyCrFQmfssHwD-WOMmKKY.ttf", - "700italic": "https://fonts.gstatic.com/s/expletussans/v31/RLpoK5v5_bqufTYdnhFzDj2ddfsCtKHbhOZyCrFQmcIsHwD-WOMmKKY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaSY2v1pHwA.ttf" - }, - { - "family": "Explora", - "variants": [ - "regular" - ], - "subsets": [ - "cherokee", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/explora/v11/tsstApxFfjUH4wrvc1qPonC3vqc.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/explora/v11/tsstApxFfjUH4wrvQ1uFpg.ttf" - }, - { - "family": "Faculty Glyphic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/facultyglyphic/v4/RrQIbot2-iBvI2mYSyKIrcgoBuQIG-eFNVmULg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/facultyglyphic/v4/RrQIbot2-iBvI2mYSyKIrcgoBuQ4Gu2B.ttf" - }, - { - "family": "Fahkwang", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOJHmZlRFipxkwjx.ttf", - "200italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgHFQHC5Tlhjxdw4.ttf", - "300": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOIjmplRFipxkwjx.ttf", - "300italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgBVTHC5Tlhjxdw4.ttf", - "regular": "https://fonts.gstatic.com/s/fahkwang/v18/Noax6Uj3zpmBOgbNpNqPsr1ZPTZ4.ttf", - "italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa36Uj3zpmBOgbNpOqNuLl7OCZ4ihE.ttf", - "500": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOJ7m5lRFipxkwjx.ttf", - "500italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgE1SHC5Tlhjxdw4.ttf", - "600": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOJXnJlRFipxkwjx.ttf", - "600italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgGFVHC5Tlhjxdw4.ttf", - "700": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOIznZlRFipxkwjx.ttf", - "700italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgAVUHC5Tlhjxdw4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fahkwang/v18/Noax6Uj3zpmBOgbNpOqOuLk.ttf" - }, - { - "family": "Familjen Grotesk", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMGJaSztc1jcEYq2.ttf", - "500": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMG7aSztc1jcEYq2.ttf", - "600": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMFXbiztc1jcEYq2.ttf", - "700": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMFubiztc1jcEYq2.ttf", - "italic": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw31ZR9ZHiDnImG6-NEMQ41wby8WbH8egZPOLG0oe9RBKsSueVz-FJq2Rv4.ttf", - "500italic": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw31ZR9ZHiDnImG6-NEMQ41wby8WbH8egZPOLG0oe9RBKvaueVz-FJq2Rv4.ttf", - "600italic": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw31ZR9ZHiDnImG6-NEMQ41wby8WbH8egZPOLG0oe9RBKhqpeVz-FJq2Rv4.ttf", - "700italic": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw31ZR9ZHiDnImG6-NEMQ41wby8WbH8egZPOLG0oe9RBKiOpeVz-FJq2Rv4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMGJaRzseVw.ttf" - }, - { - "family": "Fanwood Text", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/fanwoodtext/v17/3XFtErwl05Ad_vSCF6Fq7xXGRdbY1P1Sbg.ttf", - "italic": "https://fonts.gstatic.com/s/fanwoodtext/v17/3XFzErwl05Ad_vSCF6Fq7xX2R9zc9vhCblye.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fanwoodtext/v17/3XFtErwl05Ad_vSCF6Fq7xX2RNzc.ttf" - }, - { - "family": "Farro", - "variants": [ - "300", - "regular", - "500", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/farro/v15/i7dJIFl3byGNHa3hNJ6-WkJUQUq7.ttf", - "regular": "https://fonts.gstatic.com/s/farro/v15/i7dEIFl3byGNHZVNHLq2cV5d.ttf", - "500": "https://fonts.gstatic.com/s/farro/v15/i7dJIFl3byGNHa25NZ6-WkJUQUq7.ttf", - "700": "https://fonts.gstatic.com/s/farro/v15/i7dJIFl3byGNHa3xM56-WkJUQUq7.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/farro/v15/i7dEIFl3byGNHaVMFr4.ttf" - }, - { - "family": "Farsan", - "variants": [ - "regular" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/farsan/v24/VEMwRoJ0vY_zsyz62q-pxDX9rQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/farsan/v24/VEMwRoJ0vY_zsyzK26Wt.ttf" - }, - { - "family": "Fascinate", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/fascinate/v23/z7NWdRrufC8XJK0IIEli1LbQRPyNrw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fascinate/v23/z7NWdRrufC8XJK0IIElS1bzU.ttf" - }, - { - "family": "Fascinate Inline", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/fascinateinline/v24/jVyR7mzzB3zc-jp6QCAu60poNqIy1g3CfRXxWZQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fascinateinline/v24/jVyR7mzzB3zc-jp6QCAu60poNqIy5gzIeQ.ttf" - }, - { - "family": "Faster One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/fasterone/v20/H4ciBXCHmdfClFb-vWhfyLuShq63czE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fasterone/v20/H4ciBXCHmdfClFb-vWhf-LqYgg.ttf" - }, - { - "family": "Fasthand", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v33", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/fasthand/v33/0yb9GDohyKTYn_ZEESkuYkw2rQg1.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fasthand/v33/0yb9GDohyKTYn_ZEERkvaEg.ttf" - }, - { - "family": "Fauna One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/faunaone/v16/wlpzgwTPBVpjpCuwkuEx2UxLYClOCg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/faunaone/v16/wlpzgwTPBVpjpCuwkuEB2EZP.ttf" - }, - { - "family": "Faustina", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHls3IEvGVWWe8tbEg.ttf", - "regular": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsgoEvGVWWe8tbEg.ttf", - "500": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlssIEvGVWWe8tbEg.ttf", - "600": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsXIYvGVWWe8tbEg.ttf", - "700": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsZYYvGVWWe8tbEg.ttf", - "800": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsAoYvGVWWe8tbEg.ttf", - "300italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsKZWl-SWc5LEnoF.ttf", - "italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsLHWl-SWc5LEnoF.ttf", - "500italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsL1Wl-SWc5LEnoF.ttf", - "600italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsIZXV-SWc5LEnoF.ttf", - "700italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsIgXV-SWc5LEnoF.ttf", - "800italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsJHXV-SWc5LEnoF.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsgoEfGF-S.ttf" - }, - { - "family": "Federant", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v31", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/federant/v31/2sDdZGNfip_eirT0_U0jRUG0AqUc.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/federant/v31/2sDdZGNfip_eirT0_X0iT0U.ttf" - }, - { - "family": "Federo", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/federo/v20/iJWFBX-cbD_ETsbmjVOe2WTG7Q.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/federo/v20/iJWFBX-cbD_ETsbWjFma.ttf" - }, - { - "family": "Felipa", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/felipa/v27/FwZa7-owz1Eu4F_wSNSEwM2zpA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/felipa/v27/FwZa7-owz1Eu4F_ASd6A.ttf" - }, - { - "family": "Fenix", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/fenix/v21/XoHo2YL_S7-g5ostKzAFvs8o.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fenix/v21/XoHo2YL_S7-g5rssITQ.ttf" - }, - { - "family": "Festive", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/festive/v11/cY9Ffj6KX1xcoDWhFtfgy9HTkak.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/festive/v11/cY9Ffj6KX1xcoDWhJtbqzw.ttf" - }, - { - "family": "Figtree", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v9", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_chQF5ewkEU4HTy.ttf", - "regular": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_d_QF5ewkEU4HTy.ttf", - "500": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_dNQF5ewkEU4HTy.ttf", - "600": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_ehR15ewkEU4HTy.ttf", - "700": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_eYR15ewkEU4HTy.ttf", - "800": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_f_R15ewkEU4HTy.ttf", - "900": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_fWR15ewkEU4HTy.ttf", - "300italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A-gdyEU25WTybO8.ttf", - "italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A7YdyEU25WTybO8.ttf", - "500italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A4QdyEU25WTybO8.ttf", - "600italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A2gayEU25WTybO8.ttf", - "700italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A1EayEU25WTybO8.ttf", - "800italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3AzYayEU25WTybO8.ttf", - "900italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3Ax8ayEU25WTybO8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_d_QG5fyEU.ttf" - }, - { - "family": "Finger Paint", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/fingerpaint/v21/0QInMXVJ-o-oRn_7dron8YWO85bS8ANesw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fingerpaint/v21/0QInMXVJ-o-oRn_7dron8YW-8pzW.ttf" - }, - { - "family": "Finlandica", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v10", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19A7rEjx9i5ss3a3.ttf", - "500": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19AJrEjx9i5ss3a3.ttf", - "600": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19Dlq0jx9i5ss3a3.ttf", - "700": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19Dcq0jx9i5ss3a3.ttf", - "italic": "https://fonts.gstatic.com/s/finlandica/v10/-nFuOGk-8vAc7lEtg0aS45mfNAn722rq0MXz76Cy_CpOtma3uNQ.ttf", - "500italic": "https://fonts.gstatic.com/s/finlandica/v10/-nFuOGk-8vAc7lEtg0aS45mfNAn722rq0MXz75Ky_CpOtma3uNQ.ttf", - "600italic": "https://fonts.gstatic.com/s/finlandica/v10/-nFuOGk-8vAc7lEtg0aS45mfNAn722rq0MXz7361_CpOtma3uNQ.ttf", - "700italic": "https://fonts.gstatic.com/s/finlandica/v10/-nFuOGk-8vAc7lEtg0aS45mfNAn722rq0MXz70e1_CpOtma3uNQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19A7rHjw_Co.ttf" - }, - { - "family": "Fira Code", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "symbols2" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_GNsFVfxN87gsj0.ttf", - "regular": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_D1sFVfxN87gsj0.ttf", - "500": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_A9sFVfxN87gsj0.ttf", - "600": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_ONrFVfxN87gsj0.ttf", - "700": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_NprFVfxN87gsj0.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_D1sJVb7Mw.ttf" - }, - { - "family": "Fira Mono", - "variants": [ - "regular", - "500", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "symbols2" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/firamono/v16/N0bX2SlFPv1weGeLZDtQIfTTkdbJYA.ttf", - "500": "https://fonts.gstatic.com/s/firamono/v16/N0bS2SlFPv1weGeLZDto1d33mf3VaZBRBQ.ttf", - "700": "https://fonts.gstatic.com/s/firamono/v16/N0bS2SlFPv1weGeLZDtondv3mf3VaZBRBQ.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/firamono/v16/N0bX2SlFPv1weGeLZDtgIP7X.ttf" - }, - { - "family": "Fira Sans", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/firasans/v18/va9C4kDNxMZdWfMOD5Vn9IjOazP3dUTP.ttf", - "100italic": "https://fonts.gstatic.com/s/firasans/v18/va9A4kDNxMZdWfMOD5VvkrCqYTfVcFTPj0s.ttf", - "200": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnWKnuQR37fF3Wlg.ttf", - "200italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrAGQBf_XljGllLX.ttf", - "300": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnPKruQR37fF3Wlg.ttf", - "300italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrBiQxf_XljGllLX.ttf", - "regular": "https://fonts.gstatic.com/s/firasans/v18/va9E4kDNxMZdWfMOD5VfkILKSTbndQ.ttf", - "italic": "https://fonts.gstatic.com/s/firasans/v18/va9C4kDNxMZdWfMOD5VvkojOazP3dUTP.ttf", - "500": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnZKvuQR37fF3Wlg.ttf", - "500italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrA6Qhf_XljGllLX.ttf", - "600": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnSKzuQR37fF3Wlg.ttf", - "600italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrAWRRf_XljGllLX.ttf", - "700": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnLK3uQR37fF3Wlg.ttf", - "700italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrByRBf_XljGllLX.ttf", - "800": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnMK7uQR37fF3Wlg.ttf", - "800italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrBuRxf_XljGllLX.ttf", - "900": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnFK_uQR37fF3Wlg.ttf", - "900italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrBKRhf_XljGllLX.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/firasans/v18/va9E4kDNxMZdWfMOD5VvkYjO.ttf" - }, - { - "family": "Fira Sans Condensed", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOjEADFm8hSaQTFG18FErVhsC9x-tarWZXtqOlQfx9CjA.ttf", - "100italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOtEADFm8hSaQTFG18FErVhsC9x-tarUfPVzONUXRpSjJcu.ttf", - "200": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWTnMiMN-cxZblY4.ttf", - "200italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVYMJ0dzRehY43EA.ttf", - "300": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWV3PiMN-cxZblY4.ttf", - "300italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVBMF0dzRehY43EA.ttf", - "regular": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOhEADFm8hSaQTFG18FErVhsC9x-tarYfHnrMtVbx8.ttf", - "italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOjEADFm8hSaQTFG18FErVhsC9x-tarUfPtqOlQfx9CjA.ttf", - "500": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWQXOiMN-cxZblY4.ttf", - "500italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVXMB0dzRehY43EA.ttf", - "600": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWSnJiMN-cxZblY4.ttf", - "600italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVcMd0dzRehY43EA.ttf", - "700": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWU3IiMN-cxZblY4.ttf", - "700italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVFMZ0dzRehY43EA.ttf", - "800": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWVHLiMN-cxZblY4.ttf", - "800italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVCMV0dzRehY43EA.ttf", - "900": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWXXKiMN-cxZblY4.ttf", - "900italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVLMR0dzRehY43EA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfDtqA.ttf" - }, - { - "family": "Fira Sans Extra Condensed", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPMcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3Zyuv1WarE9ncg.ttf", - "100italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPOcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqW21-ejkp3cn22.ttf", - "200": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3TCPn3-0oEZ-a2Q.ttf", - "200italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWd36-pGR7e2SvJQ.ttf", - "300": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3VSMn3-0oEZ-a2Q.ttf", - "300italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWE32-pGR7e2SvJQ.ttf", - "regular": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPKcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda5fiku3efvE8.ttf", - "italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPMcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fquv1WarE9ncg.ttf", - "500": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3QyNn3-0oEZ-a2Q.ttf", - "500italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWS3y-pGR7e2SvJQ.ttf", - "600": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3SCKn3-0oEZ-a2Q.ttf", - "600italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWZ3u-pGR7e2SvJQ.ttf", - "700": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3USLn3-0oEZ-a2Q.ttf", - "700italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWA3q-pGR7e2SvJQ.ttf", - "800": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3ViIn3-0oEZ-a2Q.ttf", - "800italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWH3m-pGR7e2SvJQ.ttf", - "900": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3XyJn3-0oEZ-a2Q.ttf", - "900italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWO3i-pGR7e2SvJQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPKcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fmuvw.ttf" - }, - { - "family": "Fjalla One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/fjallaone/v16/Yq6R-LCAWCX3-6Ky7FAFnOZwkxgtUb8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fjallaone/v16/Yq6R-LCAWCX3-6Ky7FAFrOd6lw.ttf" - }, - { - "family": "Fjord One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/fjordone/v22/zOL-4pbEnKBY_9S1jNKr6e5As-FeiQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fjordone/v22/zOL-4pbEnKBY_9S1jNKb6ORE.ttf" - }, - { - "family": "Flamenco", - "variants": [ - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/flamenco/v19/neIPzCehqYguo67ssZ0qNIkyepH9qGsf.ttf", - "regular": "https://fonts.gstatic.com/s/flamenco/v19/neIIzCehqYguo67ssaWGHK06UY30.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/flamenco/v19/neIIzCehqYguo67ssZWHFqk.ttf" - }, - { - "family": "Flavors", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/flavors/v28/FBV2dDrhxqmveJTpbkzlNqkG9UY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/flavors/v28/FBV2dDrhxqmveJTpXk3vMg.ttf" - }, - { - "family": "Fleur De Leah", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/fleurdeleah/v11/AYCNpXX7ftYZWLhv9UmPJTMC5vat4I_Gdq0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fleurdeleah/v11/AYCNpXX7ftYZWLhv9UmPJTMC1ven5A.ttf" - }, - { - "family": "Flow Block", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/flowblock/v15/wlp0gwfPCEB65UmTk-d6-WZlbCBXE_I.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/flowblock/v15/wlp0gwfPCEB65UmTk-d6yWdvaA.ttf" - }, - { - "family": "Flow Circular", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/flowcircular/v15/lJwB-pc4j2F-H8YKuyvfxdZ45ifpWdr2rIg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/flowcircular/v15/lJwB-pc4j2F-H8YKuyvfxdZ41ibjXQ.ttf" - }, - { - "family": "Flow Rounded", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/flowrounded/v15/-zki91mtwsU9qlLiGwD4oQX3oZX-Xup87g.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/flowrounded/v15/-zki91mtwsU9qlLiGwD4oQXHoJ_6.ttf" - }, - { - "family": "Foldit", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XpANmapUYLHkN80.ttf", - "200": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XhAMmapUYLHkN80.ttf", - "300": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8Xs4MmapUYLHkN80.ttf", - "regular": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XpAMmapUYLHkN80.ttf", - "500": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XqIMmapUYLHkN80.ttf", - "600": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8Xk4LmapUYLHkN80.ttf", - "700": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XncLmapUYLHkN80.ttf", - "800": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XhALmapUYLHkN80.ttf", - "900": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XjkLmapUYLHkN80.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XpAMqateZA.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Fondamento", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/fondamento/v22/4UaHrEJGsxNmFTPDnkaJx63j5pN1MwI.ttf", - "italic": "https://fonts.gstatic.com/s/fondamento/v22/4UaFrEJGsxNmFTPDnkaJ96_p4rFwIwJePw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fondamento/v22/4UaHrEJGsxNmFTPDnkaJ96zp4g.ttf" - }, - { - "family": "Fontdiner Swanky", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/fontdinerswanky/v24/ijwOs4XgRNsiaI5-hcVb4hQgMvCD4uEfKiGvxts.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fontdinerswanky/v24/ijwOs4XgRNsiaI5-hcVb4hQgMvCD0uAVLg.ttf" - }, - { - "family": "Forum", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/forum/v19/6aey4Ky-Vb8Ew_IWMJMa3mnT.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/forum/v19/6aey4Ky-Vb8Ew8IXOpc.ttf" - }, - { - "family": "Fragment Mono", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/fragmentmono/v6/4iCr6K5wfMRRjxp0DA6-2CLnN4RNh4UI_1U.ttf", - "italic": "https://fonts.gstatic.com/s/fragmentmono/v6/4iC16K5wfMRRjxp0DA6-2CLnB4ZHg6cN71URtQ.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fragmentmono/v6/4iCr6K5wfMRRjxp0DA6-2CLnB4VHgw.ttf" - }, - { - "family": "Francois One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/francoisone/v22/_Xmr-H4zszafZw3A-KPSZutNxgKQu_avAg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/francoisone/v22/_Xmr-H4zszafZw3A-KPSZut9xwiU.ttf" - }, - { - "family": "Frank Ruhl Libre", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw6bYVqQPxR2EUR_.ttf", - "regular": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw7FYVqQPxR2EUR_.ttf", - "500": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw73YVqQPxR2EUR_.ttf", - "600": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw4bZlqQPxR2EUR_.ttf", - "700": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw4iZlqQPxR2EUR_.ttf", - "800": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw5FZlqQPxR2EUR_.ttf", - "900": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw5sZlqQPxR2EUR_.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw7FYWqRNRA.ttf" - }, - { - "family": "Fraunces", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v38", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxqjDvTShUtWNg.ttf", - "200": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcNxujDvTShUtWNg.ttf", - "300": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIc6RujDvTShUtWNg.ttf", - "regular": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxujDvTShUtWNg.ttf", - "500": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIchRujDvTShUtWNg.ttf", - "600": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcaRyjDvTShUtWNg.ttf", - "700": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcUByjDvTShUtWNg.ttf", - "800": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcNxyjDvTShUtWNg.ttf", - "900": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcHhyjDvTShUtWNg.ttf", - "100italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1hLTP7Wp05GNi3k.ttf", - "200italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1jLTf7Wp05GNi3k.ttf", - "300italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1gVTf7Wp05GNi3k.ttf", - "italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1hLTf7Wp05GNi3k.ttf", - "500italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1h5Tf7Wp05GNi3k.ttf", - "600italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1iVSv7Wp05GNi3k.ttf", - "700italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1isSv7Wp05GNi3k.ttf", - "800italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1jLSv7Wp05GNi3k.ttf", - "900italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1jiSv7Wp05GNi3k.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTD_7W.ttf" - }, - { - "family": "Freckle Face", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/freckleface/v16/AMOWz4SXrmKHCvXTohxY-YI0U1K2w9lb4g.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/freckleface/v16/AMOWz4SXrmKHCvXTohxY-YIEUliy.ttf" - }, - { - "family": "Fredericka the Great", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/frederickathegreat/v23/9Bt33CxNwt7aOctW2xjbCstzwVKsIBVV-9Skz7Ylch2L.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/frederickathegreat/v23/9Bt33CxNwt7aOctW2xjbCstzwVKsIBVV--SlxbI.ttf" - }, - { - "family": "Fredoka", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3OryLMFuOLlNldbw.ttf", - "regular": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3O8SLMFuOLlNldbw.ttf", - "500": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3OwyLMFuOLlNldbw.ttf", - "600": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3OLyXMFuOLlNldbw.ttf", - "700": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3OFiXMFuOLlNldbw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3O8SL8F-mP.ttf" - }, - { - "family": "Freehand", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v34", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/freehand/v34/cIf-Ma5eqk01VjKTgAmBTmUOmZJk.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/freehand/v34/cIf-Ma5eqk01VjKTgDmARGE.ttf" - }, - { - "family": "Freeman", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/freeman/v1/S6u9w4NGQiLN8nh-ew-FGC_p9dw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/freeman/v1/S6u9w4NGQiLN8nh-Sw6PHA.ttf" - }, - { - "family": "Fresca", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/fresca/v24/6ae94K--SKgCzbM2Gr0W13DKPA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fresca/v24/6ae94K--SKgCzbMGG7cS.ttf" - }, - { - "family": "Frijole", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v15", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/frijole/v15/uU9PCBUR8oakM2BQ7xPb3vyHmlI.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/frijole/v15/uU9PCBUR8oakM2BQ3xLR2g.ttf" - }, - { - "family": "Fruktur", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v28", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/fruktur/v28/SZc53FHsOru5QYsMfz3GkUrS8DI.ttf", - "italic": "https://fonts.gstatic.com/s/fruktur/v28/SZc73FHsOru5QYsMTz_MlWjX4DJXgQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fruktur/v28/SZc53FHsOru5QYsMTzzMlQ.ttf" - }, - { - "family": "Fugaz One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/fugazone/v21/rax_HiWKp9EAITukFslMBBJek0vA8A.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fugazone/v21/rax_HiWKp9EAITukFsl8BRha.ttf" - }, - { - "family": "Fuggles", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/fuggles/v14/k3kQo8UEJOlD1hpOTd7iL0nAMaM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fuggles/v14/k3kQo8UEJOlD1hpOfd_oKw.ttf" - }, - { - "family": "Funnel Display", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYxGPXWMVwIZDKFA.ttf", - "regular": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYmmPXWMVwIZDKFA.ttf", - "500": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYqGPXWMVwIZDKFA.ttf", - "600": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYRGTXWMVwIZDKFA.ttf", - "700": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYfWTXWMVwIZDKFA.ttf", - "800": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYGmTXWMVwIZDKFA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYmmPnWc90.ttf" - }, - { - "family": "Funnel Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAy3mEfm9NnDyL7w.ttf", - "regular": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAlXmEfm9NnDyL7w.ttf", - "500": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAp3mEfm9NnDyL7w.ttf", - "600": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAS36Efm9NnDyL7w.ttf", - "700": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAcn6Efm9NnDyL7w.ttf", - "800": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAFX6Efm9NnDyL7w.ttf", - "300italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXToyPWVJvjmb76XZ.ttf", - "italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTpsPWVJvjmb76XZ.ttf", - "500italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTpePWVJvjmb76XZ.ttf", - "600italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTqyOmVJvjmb76XZ.ttf", - "700italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTqLOmVJvjmb76XZ.ttf", - "800italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTrsOmVJvjmb76XZ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAlXm0f2VJ.ttf" - }, - { - "family": "Fustat", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCMQQRryztWo_3fk.ttf", - "300": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCBoQRryztWo_3fk.ttf", - "regular": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCEQQRryztWo_3fk.ttf", - "500": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCHYQRryztWo_3fk.ttf", - "600": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCJoXRryztWo_3fk.ttf", - "700": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCKMXRryztWo_3fk.ttf", - "800": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCMQXRryztWo_3fk.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCEQQdr25sQ.ttf" - }, - { - "family": "Fuzzy Bubbles", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/fuzzybubbles/v9/6qLGKZMbrgv9pwtjPEVNV0F2NnP5Zxsreko.ttf", - "700": "https://fonts.gstatic.com/s/fuzzybubbles/v9/6qLbKZMbrgv9pwtjPEVNV0F2Ds_WQxMAZkM1pn4.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/fuzzybubbles/v9/6qLGKZMbrgv9pwtjPEVNV0F2BnLzYw.ttf" - }, - { - "family": "GFS Didot", - "variants": [ - "regular" - ], - "subsets": [ - "greek", - "greek-ext", - "latin", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/gfsdidot/v18/Jqzh5TybZ9vZMWFssvwiF-fGFSCGAA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gfsdidot/v18/Jqzh5TybZ9vZMWFssvwSFu3C.ttf" - }, - { - "family": "GFS Neohellenic", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "greek", - "greek-ext", - "latin", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QIRdiDOrfiq0b7R8O1Iw9WLcY5TLahP46UDUw.ttf", - "italic": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QITdiDOrfiq0b7R8O1Iw9WLcY5jL6JLwaATU91X.ttf", - "700": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QIUdiDOrfiq0b7R8O1Iw9WLcY5rkYdr644fWsRO9w.ttf", - "700italic": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QIWdiDOrfiq0b7R8O1Iw9WLcY5jL5r37oQbeMFe985V.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QIRdiDOrfiq0b7R8O1Iw9WLcY5jLKJL.ttf" - }, - { - "family": "Ga Maamli", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/gamaamli/v3/uU9NCBsQ4c-DPW1Yo3rR2t6CilKOdQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gamaamli/v3/uU9NCBsQ4c-DPW1Yo3rh29SG.ttf" - }, - { - "family": "Gabarito", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v9", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj248K0FgItq6bFIg.ttf", - "500": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj20cK0FgItq6bFIg.ttf", - "600": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj2PcW0FgItq6bFIg.ttf", - "700": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj2BMW0FgItq6bFIg.ttf", - "800": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj2Y8W0FgItq6bFIg.ttf", - "900": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj2SsW0FgItq6bFIg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj248KEFwgp.ttf" - }, - { - "family": "Gabriela", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/gabriela/v23/qkBWXvsO6sreR8E-b_m-zrpHmRzC.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gabriela/v23/qkBWXvsO6sreR8E-b8m_xL4.ttf" - }, - { - "family": "Gaegu", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/gaegu/v23/TuGSUVB6Up9NU57nifw74sdtBk0x.ttf", - "regular": "https://fonts.gstatic.com/s/gaegu/v23/TuGfUVB6Up9NU6ZLodgzydtk.ttf", - "700": "https://fonts.gstatic.com/s/gaegu/v23/TuGSUVB6Up9NU573jvw74sdtBk0x.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gaegu/v23/TuGfUVB6Up9NU5ZKq9w.ttf" - }, - { - "family": "Gafata", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/gafata/v22/XRXV3I6Cn0VJKon4MuyAbsrVcA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gafata/v22/XRXV3I6Cn0VJKonIM-aE.ttf" - }, - { - "family": "Gajraj One", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/gajrajone/v7/1cX2aUDCDpXsuWVb1jIjr1GqhcitzeM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gajrajone/v7/1cX2aUDCDpXsuWVb1jIjn1CggQ.ttf" - }, - { - "family": "Galada", - "variants": [ - "regular" - ], - "subsets": [ - "bengali", - "latin" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/galada/v21/H4cmBXyGmcjXlUX-8iw-4Lqggw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/galada/v21/H4cmBXyGmcjXlUXO8yY6.ttf" - }, - { - "family": "Galdeano", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/galdeano/v23/uU9MCBoQ4YOqOW1boDPx8PCOg0uX.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/galdeano/v23/uU9MCBoQ4YOqOW1boAPw-vQ.ttf" - }, - { - "family": "Galindo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/galindo/v26/HI_KiYMeLqVKqwyuQ5HiRp-dhpQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/galindo/v26/HI_KiYMeLqVKqwyuc5DoQg.ttf" - }, - { - "family": "Gamja Flower", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/gamjaflower/v26/6NUR8FiKJg-Pa0rM6uN40Z4kyf9Fdty2ew.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gamjaflower/v26/6NUR8FiKJg-Pa0rM6uN40Z4UyPVB.ttf" - }, - { - "family": "Gantari", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g0gOz3wa5GD2qnm.ttf", - "200": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g2gOj3wa5GD2qnm.ttf", - "300": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g1-Oj3wa5GD2qnm.ttf", - "regular": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g0gOj3wa5GD2qnm.ttf", - "500": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g0SOj3wa5GD2qnm.ttf", - "600": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g3-PT3wa5GD2qnm.ttf", - "700": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g3HPT3wa5GD2qnm.ttf", - "800": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g2gPT3wa5GD2qnm.ttf", - "900": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g2JPT3wa5GD2qnm.ttf", - "100italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoedWyYZWh37nmpWc.ttf", - "200italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeVWzYZWh37nmpWc.ttf", - "300italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeYuzYZWh37nmpWc.ttf", - "italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoedWzYZWh37nmpWc.ttf", - "500italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeeezYZWh37nmpWc.ttf", - "600italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeQu0YZWh37nmpWc.ttf", - "700italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeTK0YZWh37nmpWc.ttf", - "800italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeVW0YZWh37nmpWc.ttf", - "900italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeXy0YZWh37nmpWc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g0gOg3xYZU.ttf" - }, - { - "family": "Gasoek One", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/gasoekone/v3/EJRTQgQ_UMUKvDgnlX80zrq_cyb-vco.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gasoekone/v3/EJRTQgQ_UMUKvDgnlX80_ru1dw.ttf" - }, - { - "family": "Gayathri", - "variants": [ - "100", - "regular", - "700" - ], - "subsets": [ - "latin", - "malayalam" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/gayathri/v20/MCoWzAb429DbBilWLLhc-pvSA_gA2W8.ttf", - "regular": "https://fonts.gstatic.com/s/gayathri/v20/MCoQzAb429DbBilWLIA48J_wBugA.ttf", - "700": "https://fonts.gstatic.com/s/gayathri/v20/MCoXzAb429DbBilWLLiE37v4LfQJwHbn.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gayathri/v20/MCoQzAb429DbBilWLLA5-ps.ttf" - }, - { - "family": "Geist", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RnOI4nZPby1QNtA.ttf", - "200": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RHOM4nZPby1QNtA.ttf", - "300": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RwuM4nZPby1QNtA.ttf", - "regular": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RnOM4nZPby1QNtA.ttf", - "500": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RruM4nZPby1QNtA.ttf", - "600": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RQuQ4nZPby1QNtA.ttf", - "700": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_Re-Q4nZPby1QNtA.ttf", - "800": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RHOQ4nZPby1QNtA.ttf", - "900": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RNeQ4nZPby1QNtA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RnOMInJnf.ttf" - }, - { - "family": "Geist Mono", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeE9KZ5T7ihaO_CS.ttf", - "200": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeG9KJ5T7ihaO_CS.ttf", - "300": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeFjKJ5T7ihaO_CS.ttf", - "regular": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeE9KJ5T7ihaO_CS.ttf", - "500": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeEPKJ5T7ihaO_CS.ttf", - "600": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeHjL55T7ihaO_CS.ttf", - "700": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeHaL55T7ihaO_CS.ttf", - "800": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeG9L55T7ihaO_CS.ttf", - "900": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeGUL55T7ihaO_CS.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeE9KK5S5Cw.ttf" - }, - { - "family": "Gelasio", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL8Ilycs-TDO8Aba.ttf", - "500": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL86lycs-TDO8Aba.ttf", - "600": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL_WkCcs-TDO8Aba.ttf", - "700": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL_vkCcs-TDO8Aba.ttf", - "italic": "https://fonts.gstatic.com/s/gelasio/v14/cIfsMaFfvUQxTTqS9Cu7b2nySBfeR6rA1M9v8zTs9RbanYs.ttf", - "500italic": "https://fonts.gstatic.com/s/gelasio/v14/cIfsMaFfvUQxTTqS9Cu7b2nySBfeR6rA1P1v8zTs9RbanYs.ttf", - "600italic": "https://fonts.gstatic.com/s/gelasio/v14/cIfsMaFfvUQxTTqS9Cu7b2nySBfeR6rA1BFo8zTs9RbanYs.ttf", - "700italic": "https://fonts.gstatic.com/s/gelasio/v14/cIfsMaFfvUQxTTqS9Cu7b2nySBfeR6rA1Cho8zTs9RbanYs.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL8Ilxct8zQ.ttf" - }, - { - "family": "Gemunu Libre", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "sinhala" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp05iJPvSLeMXPIWA.ttf", - "300": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp00aJPvSLeMXPIWA.ttf", - "regular": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp0xiJPvSLeMXPIWA.ttf", - "500": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp0yqJPvSLeMXPIWA.ttf", - "600": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp08aOPvSLeMXPIWA.ttf", - "700": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp0_-OPvSLeMXPIWA.ttf", - "800": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp05iOPvSLeMXPIWA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp0xiJDvWBfA.ttf" - }, - { - "family": "Genos", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cherokee", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVqknorUK6K7ZsAg.ttf", - "200": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVKkjorUK6K7ZsAg.ttf", - "300": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwV9EjorUK6K7ZsAg.ttf", - "regular": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVqkjorUK6K7ZsAg.ttf", - "500": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVmEjorUK6K7ZsAg.ttf", - "600": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVdE_orUK6K7ZsAg.ttf", - "700": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVTU_orUK6K7ZsAg.ttf", - "800": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVKk_orUK6K7ZsAg.ttf", - "900": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVA0_orUK6K7ZsAg.ttf", - "100italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgsA70i-CbN8Ard7.ttf", - "200italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYguA7ki-CbN8Ard7.ttf", - "300italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgte7ki-CbN8Ard7.ttf", - "italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgsA7ki-CbN8Ard7.ttf", - "500italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgsy7ki-CbN8Ard7.ttf", - "600italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgve6Ui-CbN8Ard7.ttf", - "700italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgvn6Ui-CbN8Ard7.ttf", - "800italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYguA6Ui-CbN8Ard7.ttf", - "900italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgup6Ui-CbN8Ard7.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVqkjYrEi-.ttf" - }, - { - "family": "Gentium Book Plus", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFL2-RHBgUK5fbjKxRpbBtJPyRpofKfdbLOrdPV.ttf", - "italic": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFN2-RHBgUK5fbjKxRpbBtJPyRpocKdf7bsqMPVZb4.ttf", - "700": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFO2-RHBgUK5fbjKxRpbBtJPyRpocojWpbGhs_cfKe1.ttf", - "700italic": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFA2-RHBgUK5fbjKxRpbBtJPyRpocKdRwrDjMv-ebe1Els.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFL2-RHBgUK5fbjKxRpbBtJPyRpocKef7Y.ttf" - }, - { - "family": "Gentium Plus", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/gentiumplus/v2/Iurd6Ytw-oSPaZ00r2bNe8VpjJtM6G0t9w.ttf", - "italic": "https://fonts.gstatic.com/s/gentiumplus/v2/IurD6Ytw-oSPaZ00r2bNe8VZjpFIymg9957e.ttf", - "700": "https://fonts.gstatic.com/s/gentiumplus/v2/IurC6Ytw-oSPaZ00r2bNe8VRMLRo4EYx_ofHsw.ttf", - "700italic": "https://fonts.gstatic.com/s/gentiumplus/v2/IurA6Ytw-oSPaZ00r2bNe8VZjqn05Uw13ILXs-h6.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gentiumplus/v2/Iurd6Ytw-oSPaZ00r2bNe8VZjZFI.ttf" - }, - { - "family": "Geo", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/geo/v23/CSRz4zRZlufVL3BmQjlCbQ.ttf", - "italic": "https://fonts.gstatic.com/s/geo/v23/CSRx4zRZluflLXpiYDxSbf8r.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/geo/v23/CSRz4zRZluflLnpi.ttf" - }, - { - "family": "Geologica", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqDx_qQ-MYAXWnqFs.ttf", - "200": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD5_rQ-MYAXWnqFs.ttf", - "300": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD0HrQ-MYAXWnqFs.ttf", - "regular": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqDx_rQ-MYAXWnqFs.ttf", - "500": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqDy3rQ-MYAXWnqFs.ttf", - "600": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD8HsQ-MYAXWnqFs.ttf", - "700": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD_jsQ-MYAXWnqFs.ttf", - "800": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD5_sQ-MYAXWnqFs.ttf", - "900": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD7bsQ-MYAXWnqFs.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqDx_rc-ISBQ.ttf" - }, - { - "family": "Georama", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5GvktmQsL5_tgbg.ttf", - "200": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5mvgtmQsL5_tgbg.ttf", - "300": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5RPgtmQsL5_tgbg.ttf", - "regular": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5GvgtmQsL5_tgbg.ttf", - "500": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5KPgtmQsL5_tgbg.ttf", - "600": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5xP8tmQsL5_tgbg.ttf", - "700": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5_f8tmQsL5_tgbg.ttf", - "800": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5mv8tmQsL5_tgbg.ttf", - "900": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5s_8tmQsL5_tgbg.ttf", - "100italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rvF2wEPxf5wbh3T.ttf", - "200italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rtF2gEPxf5wbh3T.ttf", - "300italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rub2gEPxf5wbh3T.ttf", - "italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rvF2gEPxf5wbh3T.ttf", - "500italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rv32gEPxf5wbh3T.ttf", - "600italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rsb3QEPxf5wbh3T.ttf", - "700italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rsi3QEPxf5wbh3T.ttf", - "800italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rtF3QEPxf5wbh3T.ttf", - "900italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rts3QEPxf5wbh3T.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5GvgdmAEP.ttf" - }, - { - "family": "Geostar", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/geostar/v27/sykz-yx4n701VLOftSq9-trEvlQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/geostar/v27/sykz-yx4n701VLOfhSu3_g.ttf" - }, - { - "family": "Geostar Fill", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/geostarfill/v27/AMOWz4SWuWiXFfjEohxQ9os0U1K2w9lb4g.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/geostarfill/v27/AMOWz4SWuWiXFfjEohxQ9osEUliy.ttf" - }, - { - "family": "Germania One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/germaniaone/v21/Fh4yPjrqIyv2ucM2qzBjeS3ezAJONau6ew.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/germaniaone/v21/Fh4yPjrqIyv2ucM2qzBjeS3uzQhK.ttf" - }, - { - "family": "Gideon Roman", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/gideonroman/v13/e3tmeuGrVOys8sxzZgWlmXoge0PWovdU4w.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gideonroman/v13/e3tmeuGrVOys8sxzZgWlmXoQeknS.ttf" - }, - { - "family": "Gidole", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/gidole/v24/sZlFdR6O8zVVEiMaCJtWS6EPcA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gidole/v24/sZlFdR6O8zVVEiMqCZFS.ttf" - }, - { - "family": "Gidugu", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "telugu" - ], - "version": "v28", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/gidugu/v28/L0x8DFMkk1Uf6w3RvPCmRSlUig.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gidugu/v28/L0x8DFMkk1Uf6w3hvfqi.ttf" - }, - { - "family": "Gilda Display", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/gildadisplay/v20/t5tmIRoYMoaYG0WEOh7HwMeR7TnFrpOHYh4.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gildadisplay/v20/t5tmIRoYMoaYG0WEOh7HwMeR3TjPqg.ttf" - }, - { - "family": "Girassol", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/girassol/v24/JTUUjIo_-DK48laaNC9Nz2pJzxbi.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/girassol/v24/JTUUjIo_-DK48laaNB9MxW4.ttf" - }, - { - "family": "Give You Glory", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/giveyouglory/v17/8QIQdiHOgt3vv4LR7ahjw9-XYc1zB4ZD6rwa.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/giveyouglory/v17/8QIQdiHOgt3vv4LR7ahjw9-XYf1yDYI.ttf" - }, - { - "family": "Glass Antiqua", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/glassantiqua/v26/xfu30Wr0Wn3NOQM2piC0uXOjnL_wN6fRUkY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/glassantiqua/v26/xfu30Wr0Wn3NOQM2piC0uXOjrL76Mw.ttf" - }, - { - "family": "Glegoo", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/glegoo/v17/_Xmt-HQyrTKWaw2Ji6mZAI91xw.ttf", - "700": "https://fonts.gstatic.com/s/glegoo/v17/_Xmu-HQyrTKWaw2xN4a9CKRpzimMsg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/glegoo/v17/_Xmt-HQyrTKWaw25iqOd.ttf" - }, - { - "family": "Gloock", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/gloock/v8/Iurb6YFw84WUY4N5jxylBrdRjQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gloock/v8/Iurb6YFw84WUY4NJjhah.ttf" - }, - { - "family": "Gloria Hallelujah", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/gloriahallelujah/v24/LYjYdHv3kUk9BMV96EIswT9DIbW-MLSy3TKEvkCF.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gloriahallelujah/v24/LYjYdHv3kUk9BMV96EIswT9DIbW-MISz1zY.ttf" - }, - { - "family": "Glory", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQwIiDpn-dDi9EOQ.ttf", - "200": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQQImDpn-dDi9EOQ.ttf", - "300": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQnomDpn-dDi9EOQ.ttf", - "regular": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQwImDpn-dDi9EOQ.ttf", - "500": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQ8omDpn-dDi9EOQ.ttf", - "600": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQHo6Dpn-dDi9EOQ.ttf", - "700": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQJ46Dpn-dDi9EOQ.ttf", - "800": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQQI6Dpn-dDi9EOQ.ttf", - "100italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMpr5HWZLCpUOaM6.ttf", - "200italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMrr5XWZLCpUOaM6.ttf", - "300italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMo15XWZLCpUOaM6.ttf", - "italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMpr5XWZLCpUOaM6.ttf", - "500italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMpZ5XWZLCpUOaM6.ttf", - "600italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMq14nWZLCpUOaM6.ttf", - "700italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMqM4nWZLCpUOaM6.ttf", - "800italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMrr4nWZLCpUOaM6.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQwImzp3WZ.ttf" - }, - { - "family": "Gluten", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Vb7B1Luni7ciJh.ttf", - "200": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Xb7R1Luni7ciJh.ttf", - "300": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8UF7R1Luni7ciJh.ttf", - "regular": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Vb7R1Luni7ciJh.ttf", - "500": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Vp7R1Luni7ciJh.ttf", - "600": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8WF6h1Luni7ciJh.ttf", - "700": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8W86h1Luni7ciJh.ttf", - "800": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Xb6h1Luni7ciJh.ttf", - "900": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Xy6h1Luni7ciJh.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Vb7S1KsHw.ttf" - }, - { - "family": "Goblin One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v28", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/goblinone/v28/CSR64z1ZnOqZRjRCBVY_TOcATNt_pOU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/goblinone/v28/CSR64z1ZnOqZRjRCBVY_fOYKSA.ttf" - }, - { - "family": "Gochi Hand", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/gochihand/v25/hES06XlsOjtJsgCkx1PkTo71-n0nXWA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gochihand/v25/hES06XlsOjtJsgCkx1Pkfo___g.ttf" - }, - { - "family": "Goldman", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/goldman/v21/pe0uMIWbN4JFplR2LDJ4Bt-7G98.ttf", - "700": "https://fonts.gstatic.com/s/goldman/v21/pe0rMIWbN4JFplR2FI5XIteQB9Zra1U.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/goldman/v21/pe0uMIWbN4JFplR2HDNyAg.ttf" - }, - { - "family": "Golos Text", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plVRRQ5cEr8zXcyx.ttf", - "500": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plVjRQ5cEr8zXcyx.ttf", - "600": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plWPQg5cEr8zXcyx.ttf", - "700": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plW2Qg5cEr8zXcyx.ttf", - "800": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plXRQg5cEr8zXcyx.ttf", - "900": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plX4Qg5cEr8zXcyx.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plVRRT5dGLs.ttf" - }, - { - "family": "Google Sans Code", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "adlam", - "canadian-aboriginal", - "cherokee", - "latin", - "latin-ext", - "math", - "old-permic", - "symbols", - "symbols2", - "syriac", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXE_ggF--rWcgmBz.ttf", - "regular": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXFhggF--rWcgmBz.ttf", - "500": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXFTggF--rWcgmBz.ttf", - "600": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXG_hQF--rWcgmBz.ttf", - "700": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXGGhQF--rWcgmBz.ttf", - "800": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXHhhQF--rWcgmBz.ttf", - "300italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwbc98LG-h3BzvSU.ttf", - "italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwek98LG-h3BzvSU.ttf", - "500italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwds98LG-h3BzvSU.ttf", - "600italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwTc68LG-h3BzvSU.ttf", - "700italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwQ468LG-h3BzvSU.ttf", - "800italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwWk68LG-h3BzvSU.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXFhgjF_8LE.ttf" - }, - { - "family": "Gorditas", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/gorditas/v24/ll8_K2aTVD26DsPEtQDoDa4AlxYb.ttf", - "700": "https://fonts.gstatic.com/s/gorditas/v24/ll84K2aTVD26DsPEtThUIooIvAoShA1i.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gorditas/v24/ll8_K2aTVD26DsPEtTDpB6o.ttf" - }, - { - "family": "Gothic A1", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "korean", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/gothica1/v18/CSR74z5ZnPydRjlCCwlCCMcqYtd2vfwk.ttf", - "200": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCpOYKSPl6tOU9Eg.ttf", - "300": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCwOUKSPl6tOU9Eg.ttf", - "regular": "https://fonts.gstatic.com/s/gothica1/v18/CSR94z5ZnPydRjlCCwl6bM0uQNJmvQ.ttf", - "500": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCmOQKSPl6tOU9Eg.ttf", - "600": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCtOMKSPl6tOU9Eg.ttf", - "700": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlC0OIKSPl6tOU9Eg.ttf", - "800": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCzOEKSPl6tOU9Eg.ttf", - "900": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlC6OAKSPl6tOU9Eg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gothica1/v18/CSR94z5ZnPydRjlCCwlKbccq.ttf" - }, - { - "family": "Gotu", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/gotu/v18/o-0FIpksx3QOlH0Lioh6-hU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gotu/v18/o-0FIpksx3QOpHwBjg.ttf" - }, - { - "family": "Goudy Bookletter 1911", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/goudybookletter1911/v21/sykt-z54laciWfKv-kX8krex0jDiD2HbY6I5tRbXZ4IXAA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/goudybookletter1911/v21/sykt-z54laciWfKv-kX8krex0jDiD2HbY6IJtBzT.ttf" - }, - { - "family": "Gowun Batang", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "korean", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/gowunbatang/v12/ijwSs5nhRMIjYsdSgcMa3wRhXLH-yuAtLw.ttf", - "700": "https://fonts.gstatic.com/s/gowunbatang/v12/ijwNs5nhRMIjYsdSgcMa3wRZ4J7awssxJii23w.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gowunbatang/v12/ijwSs5nhRMIjYsdSgcMa3wRRXbv6.ttf" - }, - { - "family": "Gowun Dodum", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/gowundodum/v12/3Jn5SD_00GqwlBnWc1TUJF0FfORL0fNy.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gowundodum/v12/3Jn5SD_00GqwlBnWc1TUJG0EduA.ttf" - }, - { - "family": "Graduate", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/graduate/v19/C8cg4cs3o2n15t_2YxgR6X2NZAn2.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/graduate/v19/C8cg4cs3o2n15t_2YygQ43k.ttf" - }, - { - "family": "Grand Hotel", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/grandhotel/v21/7Au7p_IgjDKdCRWuR1azpmQNEl0O0kEx.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/grandhotel/v21/7Au7p_IgjDKdCRWuR1azplQMGFk.ttf" - }, - { - "family": "Grandiflora One", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/grandifloraone/v3/0ybmGD0g27bCk_5MGWZcKWhxwnUU_R3y8DOWGA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/grandifloraone/v3/0ybmGD0g27bCk_5MGWZcKWhxwnUk_Bf2.ttf" - }, - { - "family": "Grandstander", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD1-_D3jWttFGmQk.ttf", - "200": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD9--D3jWttFGmQk.ttf", - "300": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQDwG-D3jWttFGmQk.ttf", - "regular": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD1--D3jWttFGmQk.ttf", - "500": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD22-D3jWttFGmQk.ttf", - "600": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD4G5D3jWttFGmQk.ttf", - "700": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD7i5D3jWttFGmQk.ttf", - "800": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD9-5D3jWttFGmQk.ttf", - "900": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD_a5D3jWttFGmQk.ttf", - "100italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf95zrcsvNDiQlBYQ.ttf", - "200italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9ZzvcsvNDiQlBYQ.ttf", - "300italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9uTvcsvNDiQlBYQ.ttf", - "italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf95zvcsvNDiQlBYQ.ttf", - "500italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf91TvcsvNDiQlBYQ.ttf", - "600italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9OTzcsvNDiQlBYQ.ttf", - "700italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9ADzcsvNDiQlBYQ.ttf", - "800italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9ZzzcsvNDiQlBYQ.ttf", - "900italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9TjzcsvNDiQlBYQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD1--P3ncsg.ttf" - }, - { - "family": "Grape Nuts", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/grapenuts/v7/syk2-yF4iLM2RfKj4F7k3tLvol2RN1E.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/grapenuts/v7/syk2-yF4iLM2RfKj4F7k7tPlpg.ttf" - }, - { - "family": "Gravitas One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/gravitasone/v21/5h1diZ4hJ3cblKy3LWakKQmaDWRNr3DzbQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gravitasone/v21/5h1diZ4hJ3cblKy3LWakKQmqDG5J.ttf" - }, - { - "family": "Great Vibes", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/greatvibes/v21/RWmMoKWR9v4ksMfaWd_JN-XCg6UKDXlq.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/greatvibes/v21/RWmMoKWR9v4ksMfaWd_JN9XDiaE.ttf" - }, - { - "family": "Grechen Fuemen", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/grechenfuemen/v11/vEFI2_tHEQ4d5ObgKxBzZh0MAWgc-NaXXq7H.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/grechenfuemen/v11/vEFI2_tHEQ4d5ObgKxBzZh0MAVgd8tI.ttf" - }, - { - "family": "Grenze", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/grenze/v16/O4ZRFGb7hR12BxqPm2IjuAkalnmd.ttf", - "100italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZXFGb7hR12BxqH_VpHsg04k2md0kI.ttf", - "200": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPN0MDkicWn2CEyw.ttf", - "200italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_Vrrky0SvWWUy1uW.ttf", - "300": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPU0ADkicWn2CEyw.ttf", - "300italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_VqPkC0SvWWUy1uW.ttf", - "regular": "https://fonts.gstatic.com/s/grenze/v16/O4ZTFGb7hR12Bxq3_2gnmgwKlg.ttf", - "italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZRFGb7hR12BxqH_WIjuAkalnmd.ttf", - "500": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPC0EDkicWn2CEyw.ttf", - "500italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_VrXkS0SvWWUy1uW.ttf", - "600": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPJ0YDkicWn2CEyw.ttf", - "600italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_Vr7li0SvWWUy1uW.ttf", - "700": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPQ0cDkicWn2CEyw.ttf", - "700italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_Vqfly0SvWWUy1uW.ttf", - "800": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPX0QDkicWn2CEyw.ttf", - "800italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_VqDlC0SvWWUy1uW.ttf", - "900": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPe0UDkicWn2CEyw.ttf", - "900italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_VqnlS0SvWWUy1uW.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/grenze/v16/O4ZTFGb7hR12BxqH_mIj.ttf" - }, - { - "family": "Grenze Gotisch", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5Lz5UcICdYPSd_w.ttf", - "200": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5rz9UcICdYPSd_w.ttf", - "300": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5cT9UcICdYPSd_w.ttf", - "regular": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5Lz9UcICdYPSd_w.ttf", - "500": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5HT9UcICdYPSd_w.ttf", - "600": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i58ThUcICdYPSd_w.ttf", - "700": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5yDhUcICdYPSd_w.ttf", - "800": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5rzhUcICdYPSd_w.ttf", - "900": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5hjhUcICdYPSd_w.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5Lz9kcYqZ.ttf" - }, - { - "family": "Grey Qo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/greyqo/v11/BXRrvF_Nmv_TyXxNDOtQ9Wf0QcE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/greyqo/v11/BXRrvF_Nmv_TyXxNPOpa8Q.ttf" - }, - { - "family": "Griffy", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/griffy/v23/FwZa7-ox2FQh9kfwSNSEwM2zpA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/griffy/v23/FwZa7-ox2FQh9kfASd6A.ttf" - }, - { - "family": "Gruppo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/gruppo/v23/WwkfxPmzE06v_ZWFWXDAOIEQUQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gruppo/v23/WwkfxPmzE06v_ZW1WHrE.ttf" - }, - { - "family": "Gudea", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/gudea/v16/neIFzCqgsI0mp-CP9IGON7Ez.ttf", - "italic": "https://fonts.gstatic.com/s/gudea/v16/neILzCqgsI0mp9CN_oWsMqEzSJQ.ttf", - "700": "https://fonts.gstatic.com/s/gudea/v16/neIIzCqgsI0mp9gz26WGHK06UY30.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gudea/v16/neIFzCqgsI0mp9CO_oU.ttf" - }, - { - "family": "Gugi", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/gugi/v21/A2BVn5dXywshVA6A9DEfgqM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gugi/v21/A2BVn5dXywshZA-K8A.ttf" - }, - { - "family": "Gulzar", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/gulzar/v14/Wnz6HAc9eB3HB2ILYTwZqg_MPQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gulzar/v14/Wnz6HAc9eB3HB2I7YDYd.ttf" - }, - { - "family": "Gupter", - "variants": [ - "regular", - "500", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/gupter/v18/2-cm9JNmxJqPO1QUYZa_Wu_lpA.ttf", - "500": "https://fonts.gstatic.com/s/gupter/v18/2-cl9JNmxJqPO1Qslb-bUsT5rZhaZg.ttf", - "700": "https://fonts.gstatic.com/s/gupter/v18/2-cl9JNmxJqPO1Qs3bmbUsT5rZhaZg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gupter/v18/2-cm9JNmxJqPO1QkYJy7.ttf" - }, - { - "family": "Gurajada", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "telugu" - ], - "version": "v22", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/gurajada/v22/FwZY7-Qx308m-l-0Kd6A4sijpFu_.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gurajada/v22/FwZY7-Qx308m-l-0Ke6B6Mw.ttf" - }, - { - "family": "Gwendolyn", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/gwendolyn/v9/qkBXXvoO_M3CSss-d7ee5JRLkAXbMQ.ttf", - "700": "https://fonts.gstatic.com/s/gwendolyn/v9/qkBSXvoO_M3CSss-d7emWLtvmC7HONiSFQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/gwendolyn/v9/qkBXXvoO_M3CSss-d7eu5Z5P.ttf" - }, - { - "family": "Habibi", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/habibi/v22/CSR-4zFWkuqcTTNCShJeZOYySQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/habibi/v22/CSR-4zFWkuqcTTNySxha.ttf" - }, - { - "family": "Hachi Maru Pop", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/hachimarupop/v23/HI_TiYoRLqpLrEiMAuO9Ysfz7rW1EM_btd8u.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hachimarupop/v23/HI_TiYoRLqpLrEiMAuO9Ysfz7oW0Gss.ttf" - }, - { - "family": "Hahmlet", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "korean", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RhKOdjobsO-aVxn.ttf", - "200": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RjKONjobsO-aVxn.ttf", - "300": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RgUONjobsO-aVxn.ttf", - "regular": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RhKONjobsO-aVxn.ttf", - "500": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4Rh4ONjobsO-aVxn.ttf", - "600": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RiUP9jobsO-aVxn.ttf", - "700": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RitP9jobsO-aVxn.ttf", - "800": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RjKP9jobsO-aVxn.ttf", - "900": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RjjP9jobsO-aVxn.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RhKOOjpZMc.ttf" - }, - { - "family": "Halant", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/halant/v17/u-490qaujRI2Pbsvc_pCmwZqcwdRXg.ttf", - "regular": "https://fonts.gstatic.com/s/halant/v17/u-4-0qaujRI2PbsX39Jmky12eg.ttf", - "500": "https://fonts.gstatic.com/s/halant/v17/u-490qaujRI2PbsvK_tCmwZqcwdRXg.ttf", - "600": "https://fonts.gstatic.com/s/halant/v17/u-490qaujRI2PbsvB_xCmwZqcwdRXg.ttf", - "700": "https://fonts.gstatic.com/s/halant/v17/u-490qaujRI2PbsvY_1CmwZqcwdRXg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/halant/v17/u-4-0qaujRI2Pbsn3thi.ttf" - }, - { - "family": "Hammersmith One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/hammersmithone/v18/qWcyB624q4L_C4jGQ9IK0O_dFlnbshsks4MRXw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hammersmithone/v18/qWcyB624q4L_C4jGQ9IK0O_dFlnrsxEg.ttf" - }, - { - "family": "Hanalei", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/hanalei/v24/E21n_dD8iufIjBRHXzgmVydREus.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hanalei/v24/E21n_dD8iufIjBRHbzksUw.ttf" - }, - { - "family": "Hanalei Fill", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/hanaleifill/v23/fC1mPYtObGbfyQznIaQzPQiMVwLBplm9aw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hanaleifill/v23/fC1mPYtObGbfyQznIaQzPQi8VgjF.ttf" - }, - { - "family": "Handjet", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "armenian", - "cyrillic", - "cyrillic-ext", - "greek", - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHTmbUkUsEHFAH2A.ttf", - "200": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHbmaUkUsEHFAH2A.ttf", - "300": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHWeaUkUsEHFAH2A.ttf", - "regular": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHTmaUkUsEHFAH2A.ttf", - "500": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHQuaUkUsEHFAH2A.ttf", - "600": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHeedUkUsEHFAH2A.ttf", - "700": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHd6dUkUsEHFAH2A.ttf", - "800": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHbmdUkUsEHFAH2A.ttf", - "900": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHZCdUkUsEHFAH2A.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHTmaYkQmFA.ttf" - }, - { - "family": "Handlee", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/handlee/v20/-F6xfjBsISg9aMakDmr6oilJ3ik.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/handlee/v20/-F6xfjBsISg9aMakPmvwpg.ttf" - }, - { - "family": "Hanken Grotesk", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_Ncs2da4fpNzXhRKA.ttf", - "200": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcM2Za4fpNzXhRKA.ttf", - "300": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_Nc7WZa4fpNzXhRKA.ttf", - "regular": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_Ncs2Za4fpNzXhRKA.ttf", - "500": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcgWZa4fpNzXhRKA.ttf", - "600": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcbWFa4fpNzXhRKA.ttf", - "700": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcVGFa4fpNzXhRKA.ttf", - "800": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcM2Fa4fpNzXhRKA.ttf", - "900": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcGmFa4fpNzXhRKA.ttf", - "100italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyWyo_BJ731BKMSK.ttf", - "200italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyUyovBJ731BKMSK.ttf", - "300italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyXsovBJ731BKMSK.ttf", - "italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyWyovBJ731BKMSK.ttf", - "500italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyWAovBJ731BKMSK.ttf", - "600italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyVspfBJ731BKMSK.ttf", - "700italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyVVpfBJ731BKMSK.ttf", - "800italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyUypfBJ731BKMSK.ttf", - "900italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyUbpfBJ731BKMSK.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_Ncs2Zq4PBJ.ttf" - }, - { - "family": "Hanuman", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v24", - "lastModified": "2025-06-12", - "files": { - "100": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0sd5hDsU9X6RPzQ.ttf", - "200": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0ud5xDsU9X6RPzQ.ttf", - "300": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0tD5xDsU9X6RPzQ.ttf", - "regular": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0sd5xDsU9X6RPzQ.ttf", - "500": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0sv5xDsU9X6RPzQ.ttf", - "600": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0vD4BDsU9X6RPzQ.ttf", - "700": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0v64BDsU9X6RPzQ.ttf", - "800": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0ud4BDsU9X6RPzQ.ttf", - "900": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0u04BDsU9X6RPzQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0sd5yDtWdE.ttf" - }, - { - "family": "Happy Monkey", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/happymonkey/v15/K2F2fZZcl-9SXwl5F_C4R_OABwD2bWqVjw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/happymonkey/v15/K2F2fZZcl-9SXwl5F_C4R_OwBgry.ttf" - }, - { - "family": "Harmattan", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/harmattan/v24/goksH6L2DkFvVvRp9XpTS0CjkP1Yog.ttf", - "500": "https://fonts.gstatic.com/s/harmattan/v24/gokpH6L2DkFvVvRp9Xprv2mHmNZEq6TTFw.ttf", - "600": "https://fonts.gstatic.com/s/harmattan/v24/gokpH6L2DkFvVvRp9Xprk26HmNZEq6TTFw.ttf", - "700": "https://fonts.gstatic.com/s/harmattan/v24/gokpH6L2DkFvVvRp9Xpr92-HmNZEq6TTFw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/harmattan/v24/goksH6L2DkFvVvRp9XpjSkqn.ttf" - }, - { - "family": "Headland One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/headlandone/v17/yYLu0hHR2vKnp89Tk1TCq3Tx0PlTeZ3mJA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/headlandone/v17/yYLu0hHR2vKnp89Tk1TCq3TB0fNX.ttf" - }, - { - "family": "Hedvig Letters Sans", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/hedvigletterssans/v2/CHy_V_PfGVjobSBkihHWDT98RVp37w8jQJ1N3Twgi1w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hedvigletterssans/v2/CHy_V_PfGVjobSBkihHWDT98RVp37w8jcJxH2Q.ttf" - }, - { - "family": "Hedvig Letters Serif", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v4", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/hedviglettersserif/v4/OD5puN2I2mekHmyoU1Kj2AXOd5_7v7gIDlX8quj7viQ_N1HixEAZf7fcvSGpZg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hedviglettersserif/v4/OD5puN2I2mekHmyoU1Kj2AXOd5_7v7gIDlX8quj7viQ_N1HixEApfr3Y.ttf" - }, - { - "family": "Heebo", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v28", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EiS2cckOnz02SXQ.ttf", - "200": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1ECSycckOnz02SXQ.ttf", - "300": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1E1yycckOnz02SXQ.ttf", - "regular": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EiSycckOnz02SXQ.ttf", - "500": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EuyycckOnz02SXQ.ttf", - "600": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EVyucckOnz02SXQ.ttf", - "700": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EbiucckOnz02SXQ.ttf", - "800": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1ECSucckOnz02SXQ.ttf", - "900": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EICucckOnz02SXQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EiSysc0mj.ttf" - }, - { - "family": "Henny Penny", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/hennypenny/v18/wXKvE3UZookzsxz_kjGSfMQqt3M7tMDT.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hennypenny/v18/wXKvE3UZookzsxz_kjGSfPQrvXc.ttf" - }, - { - "family": "Hepta Slab", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvkV5jfbY5B0NBkz.ttf", - "200": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvmV5zfbY5B0NBkz.ttf", - "300": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvlL5zfbY5B0NBkz.ttf", - "regular": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvkV5zfbY5B0NBkz.ttf", - "500": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5Hvkn5zfbY5B0NBkz.ttf", - "600": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvnL4DfbY5B0NBkz.ttf", - "700": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5Hvny4DfbY5B0NBkz.ttf", - "800": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvmV4DfbY5B0NBkz.ttf", - "900": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5Hvm84DfbY5B0NBkz.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvkV5wfaaZQ.ttf" - }, - { - "family": "Herr Von Muellerhoff", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/herrvonmuellerhoff/v23/WBL6rFjRZkREW8WqmCWYLgCkQKXb4CAft3c6_qJY3QPQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/herrvonmuellerhoff/v23/WBL6rFjRZkREW8WqmCWYLgCkQKXb4CAft0c79KY.ttf" - }, - { - "family": "Hi Melody", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/himelody/v19/46ktlbP8Vnz0pJcqCTbEf29E31BBGA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/himelody/v19/46ktlbP8Vnz0pJcqCTb0fmVA.ttf" - }, - { - "family": "Hina Mincho", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/hinamincho/v16/2sDaZGBRhpXa2Jjz5w5LAGW8KbkVZTHR.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hinamincho/v16/2sDaZGBRhpXa2Jjz5w5LAFW9I70.ttf" - }, - { - "family": "Hind", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/hind/v18/5aU19_a8oxmIfMJaIRuYjDpf5Vw.ttf", - "regular": "https://fonts.gstatic.com/s/hind/v18/5aU69_a8oxmIRG5yBROzkDM.ttf", - "500": "https://fonts.gstatic.com/s/hind/v18/5aU19_a8oxmIfJpbIRuYjDpf5Vw.ttf", - "600": "https://fonts.gstatic.com/s/hind/v18/5aU19_a8oxmIfLZcIRuYjDpf5Vw.ttf", - "700": "https://fonts.gstatic.com/s/hind/v18/5aU19_a8oxmIfNJdIRuYjDpf5Vw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hind/v18/5aU69_a8oxmIdG94AQ.ttf" - }, - { - "family": "Hind Guntur", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "telugu" - ], - "version": "v14", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/hindguntur/v14/wXKyE3UZrok56nvamSuJd_yGn1czn9zaj5Ju.ttf", - "regular": "https://fonts.gstatic.com/s/hindguntur/v14/wXKvE3UZrok56nvamSuJd8Qqt3M7tMDT.ttf", - "500": "https://fonts.gstatic.com/s/hindguntur/v14/wXKyE3UZrok56nvamSuJd_zenlczn9zaj5Ju.ttf", - "600": "https://fonts.gstatic.com/s/hindguntur/v14/wXKyE3UZrok56nvamSuJd_zymVczn9zaj5Ju.ttf", - "700": "https://fonts.gstatic.com/s/hindguntur/v14/wXKyE3UZrok56nvamSuJd_yWmFczn9zaj5Ju.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hindguntur/v14/wXKvE3UZrok56nvamSuJd_QrvXc.ttf" - }, - { - "family": "Hind Madurai", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil" - ], - "version": "v13", - "lastModified": "2025-09-02", - "files": { - "300": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xu0e2p98ZvDXdZQIOcpqjfXaUnecsoMJ0b_g.ttf", - "regular": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xx0e2p98ZvDXdZQIOcpqjn8Y0DceA0OQ.ttf", - "500": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xu0e2p98ZvDXdZQIOcpqjfBaQnecsoMJ0b_g.ttf", - "600": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xu0e2p98ZvDXdZQIOcpqjfKaMnecsoMJ0b_g.ttf", - "700": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xu0e2p98ZvDXdZQIOcpqjfTaInecsoMJ0b_g.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xx0e2p98ZvDXdZQIOcpqjX8IcH.ttf" - }, - { - "family": "Hind Mysuru", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "300": "https://fonts.gstatic.com/s/hindmysuru/v1/sykq-yB3k7wiAJ-U5l_li8pppHWQBVTqU4sY.ttf", - "regular": "https://fonts.gstatic.com/s/hindmysuru/v1/syk3-yB3k7wiAJ-U5l_li_LFjFGYLkjj.ttf", - "500": "https://fonts.gstatic.com/s/hindmysuru/v1/sykq-yB3k7wiAJ-U5l_li8oxpXWQBVTqU4sY.ttf", - "600": "https://fonts.gstatic.com/s/hindmysuru/v1/sykq-yB3k7wiAJ-U5l_li8odonWQBVTqU4sY.ttf", - "700": "https://fonts.gstatic.com/s/hindmysuru/v1/sykq-yB3k7wiAJ-U5l_li8p5o3WQBVTqU4sY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hindmysuru/v1/syk3-yB3k7wiAJ-U5l_li8LEhlU.ttf" - }, - { - "family": "Hind Siliguri", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "bengali", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwOs5juQtsyLLR5jN4cxBEoRDf44uEfKiGvxts.ttf", - "regular": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwTs5juQtsyLLR5jN4cxBEofJvQxuk0Nig.ttf", - "500": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwOs5juQtsyLLR5jN4cxBEoRG_54uEfKiGvxts.ttf", - "600": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwOs5juQtsyLLR5jN4cxBEoREP-4uEfKiGvxts.ttf", - "700": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwOs5juQtsyLLR5jN4cxBEoRCf_4uEfKiGvxts.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwTs5juQtsyLLR5jN4cxBEoTJrawg.ttf" - }, - { - "family": "Hind Vadodara", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/hindvadodara/v16/neIQzCKvrIcn5pbuuuriV9tTSDn3iXM0oSOL2Yw.ttf", - "regular": "https://fonts.gstatic.com/s/hindvadodara/v16/neINzCKvrIcn5pbuuuriV9tTcJXfrXsfvSo.ttf", - "500": "https://fonts.gstatic.com/s/hindvadodara/v16/neIQzCKvrIcn5pbuuuriV9tTSGH2iXM0oSOL2Yw.ttf", - "600": "https://fonts.gstatic.com/s/hindvadodara/v16/neIQzCKvrIcn5pbuuuriV9tTSE3xiXM0oSOL2Yw.ttf", - "700": "https://fonts.gstatic.com/s/hindvadodara/v16/neIQzCKvrIcn5pbuuuriV9tTSCnwiXM0oSOL2Yw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hindvadodara/v16/neINzCKvrIcn5pbuuuriV9tTQJTVqQ.ttf" - }, - { - "family": "Holtwood One SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/holtwoodonesc/v23/yYLx0hLR0P-3vMFSk1TCq3Txg5B3cbb6LZttyg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/holtwoodonesc/v23/yYLx0hLR0P-3vMFSk1TCq3Txg5BHcLz-.ttf" - }, - { - "family": "Homemade Apple", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/homemadeapple/v24/Qw3EZQFXECDrI2q789EKQZJob3x9Vnksi4M7.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/homemadeapple/v24/Qw3EZQFXECDrI2q789EKQZJob0x8XH0.ttf" - }, - { - "family": "Homenaje", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/homenaje/v17/FwZY7-Q-xVAi_l-6Ld6A4sijpFu_.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/homenaje/v17/FwZY7-Q-xVAi_l-6Le6B6Mw.ttf" - }, - { - "family": "Honk", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/honk/v6/m8J7jftUea-XwTaemClumrBQbmvynOmXBji9zFhHRr8WFgVLo7tNepQKvg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/honk/v6/m8J7jftUea-XwTaemClumrBQbmvynOmXBji9zFhHRr8WFgV7orFJ.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Host Grotesk", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PubnOzhap-j94InI.ttf", - "regular": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuefOzhap-j94InI.ttf", - "500": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PudXOzhap-j94InI.ttf", - "600": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuTnJzhap-j94InI.ttf", - "700": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuQDJzhap-j94InI.ttf", - "800": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuWfJzhap-j94InI.ttf", - "300italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NeFWj_h19MnL2jg.ttf", - "italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NJlWj_h19MnL2jg.ttf", - "500italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NFFWj_h19MnL2jg.ttf", - "600italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-N-FKj_h19MnL2jg.ttf", - "700italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NwVKj_h19MnL2jg.ttf", - "800italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NplKj_h19MnL2jg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuefO_hej_g.ttf" - }, - { - "family": "Hubballi", - "variants": [ - "regular" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext" - ], - "version": "v10", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/hubballi/v10/o-0JIpUj3WIZ1RFN56B7yBBNYuSF.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hubballi/v10/o-0JIpUj3WIZ1RFN55B6whQ.ttf" - }, - { - "family": "Hubot Sans", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCZ7ZdgLDVwVqcXQ.ttf", - "300": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCubZdgLDVwVqcXQ.ttf", - "regular": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsC57ZdgLDVwVqcXQ.ttf", - "500": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsC1bZdgLDVwVqcXQ.ttf", - "600": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCObFdgLDVwVqcXQ.ttf", - "700": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCALFdgLDVwVqcXQ.ttf", - "800": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCZ7FdgLDVwVqcXQ.ttf", - "900": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCTrFdgLDVwVqcXQ.ttf", - "200italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_U1w7rR41-MXUss.ttf", - "300italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_Xrw7rR41-MXUss.ttf", - "italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_W1w7rR41-MXUss.ttf", - "500italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_WHw7rR41-MXUss.ttf", - "600italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_VrxLrR41-MXUss.ttf", - "700italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_VSxLrR41-MXUss.ttf", - "800italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_U1xLrR41-MXUss.ttf", - "900italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_UcxLrR41-MXUss.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsC57ZtgbrR.ttf" - }, - { - "family": "Huninn", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-06-12", - "files": { - "regular": "https://fonts.gstatic.com/s/huninn/v2/OpNNnoINg9bQ4xkpjiHQjittXw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/huninn/v2/OpNNnoINg9bQ4xkZjyvU.ttf" - }, - { - "family": "Hurricane", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/hurricane/v9/pe0sMIuULZxTolZ5YldyAv2-C99ycg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/hurricane/v9/pe0sMIuULZxTolZ5YldCA_e6.ttf" - }, - { - "family": "IBM Plex Mono", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6pfjptAgt5VM-kVkqdyU8n3kwq0n1hj-sNFQ.ttf", - "100italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6rfjptAgt5VM-kVkqdyU8n1ioStndlre4dFcFh.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3uAL8ldPg-IUDNg.ttf", - "200italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSGlZFh8ARHNh4zg.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3oQI8ldPg-IUDNg.ttf", - "300italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSflVFh8ARHNh4zg.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n5igg1l9kn-s.ttf", - "italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6pfjptAgt5VM-kVkqdyU8n1ioq0n1hj-sNFQ.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJ8ldPg-IUDNg.ttf", - "500italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSJlRFh8ARHNh4zg.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAO8ldPg-IUDNg.ttf", - "600italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSClNFh8ARHNh4zg.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3pQP8ldPg-IUDNg.ttf", - "700italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSblJFh8ARHNh4zg.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1ikq0g.ttf" - }, - { - "family": "IBM Plex Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSD6lhzAKI5loa26g.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSDallzAKI5loa26g.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSDtFlzAKI5loa26g.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSD6llzAKI5loa26g.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSD2FlzAKI5loa26g.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSDNF5zAKI5loa26g.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSDDV5zAKI5loa26g.ttf", - "100italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhqbQqg9tIOm6vje.ttf", - "200italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhobQ6g9tIOm6vje.ttf", - "300italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhrFQ6g9tIOm6vje.ttf", - "italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhqbQ6g9tIOm6vje.ttf", - "500italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhqpQ6g9tIOm6vje.ttf", - "600italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhpFRKg9tIOm6vje.ttf", - "700italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhp8RKg9tIOm6vje.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSD6llDAag9.ttf" - }, - { - "family": "IBM Plex Sans Arabic", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe3PC5eMlAMg0.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_dCTVsVJKxTs.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_tCTVsVJKxTs.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6bs61vSbfdlA.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_9CTVsVJKxTs.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-NCTVsVJKxTs.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-dCTVsVJKxTs.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys73PA.ttf" - }, - { - "family": "IBM Plex Sans Condensed", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8nN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY7KyKvBgYsMDhM.ttf", - "100italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8hN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8M_LhakJHhOgBg.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY5m6Yvrr4cFFwq5.ttf", - "200italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8GPqpYMnEhq5H1w.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY4C6ovrr4cFFwq5.ttf", - "300italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8AfppYMnEhq5H1w.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8lN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHbauwq_jhJsM.ttf", - "italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8nN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYasyKvBgYsMDhM.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY5a64vrr4cFFwq5.ttf", - "500italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8F_opYMnEhq5H1w.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY527Ivrr4cFFwq5.ttf", - "600italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8HPvpYMnEhq5H1w.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY4S7Yvrr4cFFwq5.ttf", - "700italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8BfupYMnEhq5H1w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8lN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYavyKs.ttf" - }, - { - "family": "IBM Plex Sans Devanagari", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic-ext", - "devanagari", - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXB3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_HMUjwUcjwCEQq.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_HnWnQe-b8AV0z0w.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_H-WrQe-b8AV0z0w.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXH3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O__VUL0c83gCA.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_HoWvQe-b8AV0z0w.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_HjWzQe-b8AV0z0w.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_H6W3Qe-b8AV0z0w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXH3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_PVEjw.ttf" - }, - { - "family": "IBM Plex Sans Hebrew", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa4qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEXB-l0VqDaM7C4.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEVt230_hjqF9Tc2.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEUJ2H0_hjqF9Tc2.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa2qYENg9Kw1mpLpO0bGM5lfHAAZHhDXH2l8Fk3rSaM.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEVR2X0_hjqF9Tc2.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEV93n0_hjqF9Tc2.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEUZ330_hjqF9Tc2.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa2qYENg9Kw1mpLpO0bGM5lfHAAZHhDXE2k-l0.ttf" - }, - { - "family": "IBM Plex Sans JP", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XLDn9KbTDf6_f7dISNqYf_tvPT7E7yjPB7twdmHQ.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7OLTrNpVuw5_BAM.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7IbQrNpVuw5_BAM.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XNDn9KbTDf6_f7dISNqYf_tvPT1Cr4iNJ-pwc.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7N7RrNpVuw5_BAM.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7PLWrNpVuw5_BAM.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7JbXrNpVuw5_BAM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XNDn9KbTDf6_f7dISNqYf_tvPT5CvyjA.ttf" - }, - { - "family": "IBM Plex Sans KR", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "korean", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFM2-VJISZe3O_rc3ZVYh4aTwNOyra_X5zCpMrMfA.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOyhqef7bsqMPVZb4.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOyn6df7bsqMPVZb4.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFK2-VJISZe3O_rc3ZVYh4aTwNO8tK1W77HtMo.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOyiacf7bsqMPVZb4.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOygqbf7bsqMPVZb4.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOym6af7bsqMPVZb4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFK2-VJISZe3O_rc3ZVYh4aTwNOwtO_Xw.ttf" - }, - { - "family": "IBM Plex Sans Thai", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "thai" - ], - "version": "v11", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JNje1VVIzcq1HzJq2AEdo2Tj_qvLqEatYlR8ZKUqcX.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqExvcFbehGW74OXw.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqEovQFbehGW74OXw.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JPje1VVIzcq1HzJq2AEdo2Tj_qvLq8DtwhZcNaUg.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqE-vUFbehGW74OXw.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqE1vIFbehGW74OXw.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqEsvMFbehGW74OXw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JPje1VVIzcq1HzJq2AEdo2Tj_qvLqMD9Yl.ttf" - }, - { - "family": "IBM Plex Sans Thai Looped", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "thai" - ], - "version": "v12", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss5AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_HaKpHOtFCQ76Q.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_NqrhFmDGC0i8Cc.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_L6ohFmDGC0i8Cc.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss_AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30LxBKAoFGoBCQ.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_OaphFmDGC0i8Cc.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_MquhFmDGC0i8Cc.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_K6vhFmDGC0i8Cc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss_AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L9BOKpA.ttf" - }, - { - "family": "IBM Plex Serif", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizBREVNn1dOx-zrZ2X3pZvkTi182zIZj1bIkNo.ttf", - "100italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizHREVNn1dOx-zrZ2X3pZvkTiUa41YTi3TNgNq55w.ttf", - "200": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi3Q-hIzoVrBicOg.ttf", - "200italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa4_oyq17jjNOg_oc.ttf", - "300": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi20-RIzoVrBicOg.ttf", - "300italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa454xq17jjNOg_oc.ttf", - "regular": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizDREVNn1dOx-zrZ2X3pZvkThUY0TY7ikbI.ttf", - "italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizBREVNn1dOx-zrZ2X3pZvkTiUa2zIZj1bIkNo.ttf", - "500": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi3s-BIzoVrBicOg.ttf", - "500italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa48Ywq17jjNOg_oc.ttf", - "600": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi3A_xIzoVrBicOg.ttf", - "600italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa4-o3q17jjNOg_oc.ttf", - "700": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi2k_hIzoVrBicOg.ttf", - "700italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa4442q17jjNOg_oc.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizDREVNn1dOx-zrZ2X3pZvkTiUZ2zI.ttf" - }, - { - "family": "IM Fell DW Pica", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/imfelldwpica/v16/2sDGZGRQotv9nbn2qSl0TxXVYNw9ZAPUvi88MQ.ttf", - "italic": "https://fonts.gstatic.com/s/imfelldwpica/v16/2sDEZGRQotv9nbn2qSl0TxXVYNwNZgnQnCosMXm0.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfelldwpica/v16/2sDGZGRQotv9nbn2qSl0TxXVYNwNZQnQ.ttf" - }, - { - "family": "IM Fell DW Pica SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/imfelldwpicasc/v21/0ybjGCAu5PfqkvtGVU15aBhXz3EUrnTW-BiKEUiBGA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfelldwpicasc/v21/0ybjGCAu5PfqkvtGVU15aBhXz3EUrnTm-RKO.ttf" - }, - { - "family": "IM Fell Double Pica", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v14", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/imfelldoublepica/v14/3XF2EqMq_94s9PeKF7Fg4gOKINyMtZ8rT0S1UL5Ayp0.ttf", - "italic": "https://fonts.gstatic.com/s/imfelldoublepica/v14/3XF0EqMq_94s9PeKF7Fg4gOKINyMtZ8rf0a_VJxF2p2G8g.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfelldoublepica/v14/3XF2EqMq_94s9PeKF7Fg4gOKINyMtZ8rf0W_VA.ttf" - }, - { - "family": "IM Fell Double Pica SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/imfelldoublepicasc/v21/neIazDmuiMkFo6zj_sHpQ8teNbWlwBB_hXjJ4Y0Eeru2dGg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfelldoublepicasc/v21/neIazDmuiMkFo6zj_sHpQ8teNbWlwBB_hXjJ0YwOfg.ttf" - }, - { - "family": "IM Fell English", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v14", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/imfellenglish/v14/Ktk1ALSLW8zDe0rthJysWrnLsAz3F6mZVY9Y5w.ttf", - "italic": "https://fonts.gstatic.com/s/imfellenglish/v14/Ktk3ALSLW8zDe0rthJysWrnLsAzHFaOdd4pI59zg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfellenglish/v14/Ktk1ALSLW8zDe0rthJysWrnLsAzHFqOd.ttf" - }, - { - "family": "IM Fell English SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/imfellenglishsc/v16/a8IENpD3CDX-4zrWfr1VY879qFF05pZLO4gOg0shzA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfellenglishsc/v16/a8IENpD3CDX-4zrWfr1VY879qFF05pZ7OoIK.ttf" - }, - { - "family": "IM Fell French Canon", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/imfellfrenchcanon/v21/-F6ufiNtDWYfYc-tDiyiw08rrghJszkK6coVPt1ozoPz.ttf", - "italic": "https://fonts.gstatic.com/s/imfellfrenchcanon/v21/-F6gfiNtDWYfYc-tDiyiw08rrghJszkK6foXNNlKy5PzzrU.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfellfrenchcanon/v21/-F6ufiNtDWYfYc-tDiyiw08rrghJszkK6foUNNk.ttf" - }, - { - "family": "IM Fell French Canon SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/imfellfrenchcanonsc/v23/FBVmdCru5-ifcor2bgq9V89khWcmQghEURY7H3c0UBCVIVqH.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfellfrenchcanonsc/v23/FBVmdCru5-ifcor2bgq9V89khWcmQghEURY7H0c1WhQ.ttf" - }, - { - "family": "IM Fell Great Primer", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/imfellgreatprimer/v21/bx6aNwSJtayYxOkbYFsT6hMsLzX7u85rJorXvDo3SQY1.ttf", - "italic": "https://fonts.gstatic.com/s/imfellgreatprimer/v21/bx6UNwSJtayYxOkbYFsT6hMsLzX7u85rJrrVtj4VTBY1N6U.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfellgreatprimer/v21/bx6aNwSJtayYxOkbYFsT6hMsLzX7u85rJrrWtj4.ttf" - }, - { - "family": "IM Fell Great Primer SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/imfellgreatprimersc/v21/ga6daxBOxyt6sCqz3fjZCTFCTUDMHagsQKdDTLf9BXz0s8FG.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imfellgreatprimersc/v21/ga6daxBOxyt6sCqz3fjZCTFCTUDMHagsQKdDTIf8D3g.ttf" - }, - { - "family": "Iansui", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-traditional", - "latin", - "latin-ext", - "symbols2" - ], - "version": "v7", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/iansui/v7/w8gbH2UoTuUp5bOajSGD1FcXoQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/iansui/v7/w8gbH2UoTuUp5bOqjCuH.ttf" - }, - { - "family": "Ibarra Real Nova", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXdg5MDtVT9TWIvS.ttf", - "500": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXdS5MDtVT9TWIvS.ttf", - "600": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXe-48DtVT9TWIvS.ttf", - "700": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXeH48DtVT9TWIvS.ttf", - "italic": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlsdQiA-DBIDCcaWtQzL4BZHoiDkH5CH9yb5n3ZFmKopyiuXztxXZvSkTo.ttf", - "500italic": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlsdQiA-DBIDCcaWtQzL4BZHoiDkH5CH9yb5n3ZFmKopxquXztxXZvSkTo.ttf", - "600italic": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlsdQiA-DBIDCcaWtQzL4BZHoiDkH5CH9yb5n3ZFmKop_apXztxXZvSkTo.ttf", - "700italic": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlsdQiA-DBIDCcaWtQzL4BZHoiDkH5CH9yb5n3ZFmKop8-pXztxXZvSkTo.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXdg5PDsXzs.ttf" - }, - { - "family": "Iceberg", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/iceberg/v26/8QIJdijAiM7o-qnZuIgOq7jkAOw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/iceberg/v26/8QIJdijAiM7o-qnZiIkErw.ttf" - }, - { - "family": "Iceland", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/iceland/v22/rax9HiuFsdMNOnWPWKxGADBbg0s.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/iceland/v22/rax9HiuFsdMNOnWPaK1MBA.ttf" - }, - { - "family": "Imbue", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP8iWfOsNNK-Q4xY.ttf", - "200": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP0iXfOsNNK-Q4xY.ttf", - "300": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP5aXfOsNNK-Q4xY.ttf", - "regular": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP8iXfOsNNK-Q4xY.ttf", - "500": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP_qXfOsNNK-Q4xY.ttf", - "600": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoPxaQfOsNNK-Q4xY.ttf", - "700": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoPy-QfOsNNK-Q4xY.ttf", - "800": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP0iQfOsNNK-Q4xY.ttf", - "900": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP2GQfOsNNK-Q4xY.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP8iXTOoHMA.ttf" - }, - { - "family": "Imperial Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/imperialscript/v8/5DCPAKrpzy_H98IV2ISnZBbGrVNvPenlvttWNg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imperialscript/v8/5DCPAKrpzy_H98IV2ISnZBbGrVNfPOPh.ttf" - }, - { - "family": "Imprima", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/imprima/v19/VEMxRoN7sY3yuy-7-oWHyDzktPo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/imprima/v19/VEMxRoN7sY3yuy-7yoSNzA.ttf" - }, - { - "family": "Inclusive Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfLhtN7mxtc0bIsQ.ttf", - "regular": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfcBtN7mxtc0bIsQ.ttf", - "500": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfQhtN7mxtc0bIsQ.ttf", - "600": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfrhxN7mxtc0bIsQ.ttf", - "700": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtflxxN7mxtc0bIsQ.ttf", - "300italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFj7rWZpUUPYsTVx.ttf", - "italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFilrWZpUUPYsTVx.ttf", - "500italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFiXrWZpUUPYsTVx.ttf", - "600italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFh7qmZpUUPYsTVx.ttf", - "700italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFhCqmZpUUPYsTVx.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfcBt972Zp.ttf" - }, - { - "family": "Inconsolata", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v37", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7LppwU8aRr8lleY2co.ttf", - "300": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp9s8aRr8lleY2co.ttf", - "regular": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8aRr8lleY2co.ttf", - "500": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp7c8aRr8lleY2co.ttf", - "600": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp1s7aRr8lleY2co.ttf", - "700": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp2I7aRr8lleY2co.ttf", - "800": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7LppwU7aRr8lleY2co.ttf", - "900": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lppyw7aRr8lleY2co.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRv2kg.ttf" - }, - { - "family": "Inder", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/inder/v15/w8gUH2YoQe8_4vq6pw-P3U4O.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/inder/v15/w8gUH2YoQe8_4sq7rQs.ttf" - }, - { - "family": "Indie Flower", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/indieflower/v24/m8JVjfNVeKWVnh3QMuKkFcZlbkGG1dKEDw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/indieflower/v24/m8JVjfNVeKWVnh3QMuKkFcZVb0uC.ttf" - }, - { - "family": "Ingrid Darling", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/ingriddarling/v7/LDIrapaJNxUtSuFdw-9yf4rCPsLOub458jGL.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ingriddarling/v7/LDIrapaJNxUtSuFdw-9yf4rCPvLPs7o.ttf" - }, - { - "family": "Inika", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/inika/v22/rnCm-x5X3QP-phTHRcc2s2XH.ttf", - "700": "https://fonts.gstatic.com/s/inika/v22/rnCr-x5X3QP-pix7auM-mHnOSOuk.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/inika/v22/rnCm-x5X3QP-piTGT8M.ttf" - }, - { - "family": "Inknut Antiqua", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU2vwrj5bBoIYJNf.ttf", - "regular": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GSYax7VC4ot_qNB4nYpBdaKXUD6pzxRwYB.ttf", - "500": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU33w7j5bBoIYJNf.ttf", - "600": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU3bxLj5bBoIYJNf.ttf", - "700": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU2_xbj5bBoIYJNf.ttf", - "800": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU2jxrj5bBoIYJNf.ttf", - "900": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU2Hx7j5bBoIYJNf.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GSYax7VC4ot_qNB4nYpBdaKUUC4Jg.ttf" - }, - { - "family": "Inria Sans", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/inriasans/v15/ptRPTiqXYfZMCOiVj9kQ3ELaDQtFqeY3fX4.ttf", - "300italic": "https://fonts.gstatic.com/s/inriasans/v15/ptRRTiqXYfZMCOiVj9kQ1OzAgQlPrcQybX4pQA.ttf", - "regular": "https://fonts.gstatic.com/s/inriasans/v15/ptRMTiqXYfZMCOiVj9kQ5O7yKQNute8.ttf", - "italic": "https://fonts.gstatic.com/s/inriasans/v15/ptROTiqXYfZMCOiVj9kQ1Oz4LSFrpe8uZA.ttf", - "700": "https://fonts.gstatic.com/s/inriasans/v15/ptRPTiqXYfZMCOiVj9kQ3FLdDQtFqeY3fX4.ttf", - "700italic": "https://fonts.gstatic.com/s/inriasans/v15/ptRRTiqXYfZMCOiVj9kQ1OzAkQ5PrcQybX4pQA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/inriasans/v15/ptRMTiqXYfZMCOiVj9kQ1O_4LQ.ttf" - }, - { - "family": "Inria Serif", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/inriaserif/v18/fC14PYxPY3rXxEndZJAzN3wAVQjFhFyta3xN.ttf", - "300italic": "https://fonts.gstatic.com/s/inriaserif/v18/fC16PYxPY3rXxEndZJAzN3SuT4THjliPbmxN0_E.ttf", - "regular": "https://fonts.gstatic.com/s/inriaserif/v18/fC1lPYxPY3rXxEndZJAzN0SsfSzNr0Ck.ttf", - "italic": "https://fonts.gstatic.com/s/inriaserif/v18/fC1nPYxPY3rXxEndZJAzN3SudyjvqlCkcmU.ttf", - "700": "https://fonts.gstatic.com/s/inriaserif/v18/fC14PYxPY3rXxEndZJAzN3wQUgjFhFyta3xN.ttf", - "700italic": "https://fonts.gstatic.com/s/inriaserif/v18/fC16PYxPY3rXxEndZJAzN3SuT5TAjliPbmxN0_E.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/inriaserif/v18/fC1lPYxPY3rXxEndZJAzN3Stdyg.ttf" - }, - { - "family": "Inspiration", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/inspiration/v7/x3dkckPPZa6L4wIg5cZOEvoGnSrlBBsy.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/inspiration/v7/x3dkckPPZa6L4wIg5cZOEsoHly4.ttf" - }, - { - "family": "Instrument Sans", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npSTF-Qf1mS0v3_7Y.ttf", - "500": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npST3-Qf1mS0v3_7Y.ttf", - "600": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npSQb_gf1mS0v3_7Y.ttf", - "700": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npSQi_gf1mS0v3_7Y.ttf", - "italic": "https://fonts.gstatic.com/s/instrumentsans/v4/pxigypc9vsFDm051Uf6KVwgkfoSbSnNPooZAN0lInHGpCWNE27lgU-XJojENuu-2kykN2u7YUwU.ttf", - "500italic": "https://fonts.gstatic.com/s/instrumentsans/v4/pxigypc9vsFDm051Uf6KVwgkfoSbSnNPooZAN0lInHGpCWNE27lgU-XJojENut22kykN2u7YUwU.ttf", - "600italic": "https://fonts.gstatic.com/s/instrumentsans/v4/pxigypc9vsFDm051Uf6KVwgkfoSbSnNPooZAN0lInHGpCWNE27lgU-XJojENujGxkykN2u7YUwU.ttf", - "700italic": "https://fonts.gstatic.com/s/instrumentsans/v4/pxigypc9vsFDm051Uf6KVwgkfoSbSnNPooZAN0lInHGpCWNE27lgU-XJojENugixkykN2u7YUwU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npSTF-Tf0kyk.ttf" - }, - { - "family": "Instrument Serif", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/instrumentserif/v5/jizBRFtNs2ka5fXjeivQ4LroWlx-2zIZj1bIkNo.ttf", - "italic": "https://fonts.gstatic.com/s/instrumentserif/v5/jizHRFtNs2ka5fXjeivQ4LroWlx-6zATi3TNgNq55w.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/instrumentserif/v5/jizBRFtNs2ka5fXjeivQ4LroWlx-6zMTiw.ttf" - }, - { - "family": "Intel One Mono", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "symbols2", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-07-16", - "files": { - "300": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMg__cRnD9TMr2nYA.ttf", - "300italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abSn3zVXELi3YD27.ttf", - "regular": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgofcRnD9TMr2nYA.ttf", - "italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abT53zVXELi3YD27.ttf", - "500": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgk_cRnD9TMr2nYA.ttf", - "500italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abTL3zVXELi3YD27.ttf", - "600": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgf_ARnD9TMr2nYA.ttf", - "600italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abQn2DVXELi3YD27.ttf", - "700": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgRvARnD9TMr2nYA.ttf", - "700italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abQe2DVXELi3YD27.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgofchnTVX.ttf" - }, - { - "family": "Inter", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyeMZhrib2Bg-4.ttf", - "200": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuDyfMZhrib2Bg-4.ttf", - "300": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuOKfMZhrib2Bg-4.ttf", - "regular": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfMZhrib2Bg-4.ttf", - "500": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuI6fMZhrib2Bg-4.ttf", - "600": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuGKYMZhrib2Bg-4.ttf", - "700": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuFuYMZhrib2Bg-4.ttf", - "800": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuDyYMZhrib2Bg-4.ttf", - "900": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuBWYMZhrib2Bg-4.ttf", - "100italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTc2dphjZ-Ek-7MeA.ttf", - "200italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTcWdthjZ-Ek-7MeA.ttf", - "300italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTch9thjZ-Ek-7MeA.ttf", - "italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTc2dthjZ-Ek-7MeA.ttf", - "500italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTc69thjZ-Ek-7MeA.ttf", - "600italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTcB9xhjZ-Ek-7MeA.ttf", - "700italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTcPtxhjZ-Ek-7MeA.ttf", - "800italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTcWdxhjZ-Ek-7MeA.ttf", - "900italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTccNxhjZ-Ek-7MeA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZlhjQ.ttf" - }, - { - "family": "Inter Tight", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjDw6qXCRToK8EPg.ttf", - "200": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjjw-qXCRToK8EPg.ttf", - "300": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjUQ-qXCRToK8EPg.ttf", - "regular": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjDw-qXCRToK8EPg.ttf", - "500": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjPQ-qXCRToK8EPg.ttf", - "600": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mj0QiqXCRToK8EPg.ttf", - "700": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mj6AiqXCRToK8EPg.ttf", - "800": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjjwiqXCRToK8EPg.ttf", - "900": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjpgiqXCRToK8EPg.ttf", - "100italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0xCHi5XgqoUPvi5.ttf", - "200italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0zCHy5XgqoUPvi5.ttf", - "300italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0wcHy5XgqoUPvi5.ttf", - "italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0xCHy5XgqoUPvi5.ttf", - "500italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0xwHy5XgqoUPvi5.ttf", - "600italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0ycGC5XgqoUPvi5.ttf", - "700italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0ylGC5XgqoUPvi5.ttf", - "800italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0zCGC5XgqoUPvi5.ttf", - "900italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0zrGC5XgqoUPvi5.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjDw-aXS5X.ttf" - }, - { - "family": "Irish Grover", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/irishgrover/v23/buExpoi6YtLz2QW7LA4flVgf-P5Oaiw4cw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/irishgrover/v23/buExpoi6YtLz2QW7LA4flVgv-fRK.ttf" - }, - { - "family": "Island Moments", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/islandmoments/v8/NaPBcZfVGvBdxIt7Ar0qzkXJF-TGIohbZ6SY.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/islandmoments/v8/NaPBcZfVGvBdxIt7Ar0qzkXJF9THKIw.ttf" - }, - { - "family": "Istok Web", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/istokweb/v26/3qTvojGmgSyUukBzKslZAWF-9kIIaQ.ttf", - "italic": "https://fonts.gstatic.com/s/istokweb/v26/3qTpojGmgSyUukBzKslpA2t61EcYaQ7F.ttf", - "700": "https://fonts.gstatic.com/s/istokweb/v26/3qTqojGmgSyUukBzKslhvU5a_mkUYBfcMw.ttf", - "700italic": "https://fonts.gstatic.com/s/istokweb/v26/3qT0ojGmgSyUukBzKslpA1PG-2MQQhLMMygN.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/istokweb/v26/3qTvojGmgSyUukBzKslpAGt6.ttf" - }, - { - "family": "Italiana", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/italiana/v21/QldNNTtLsx4E__B0XTmRY31Wx7Vv.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/italiana/v21/QldNNTtLsx4E__B0XQmQaXk.ttf" - }, - { - "family": "Italianno", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/italianno/v18/dg4n_p3sv6gCJkwzT6Rnj5YpQwM-gg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/italianno/v18/dg4n_p3sv6gCJkwzT6RXjpwt.ttf" - }, - { - "family": "Itim", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/itim/v16/0nknC9ziJOYewARKkc7ZdwU.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/itim/v16/0nknC9ziJOYe8AVAlQ.ttf" - }, - { - "family": "Jacquard 12", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v8", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jacquard12/v8/vm8ydRLuXETEweL79J4rGc3JUnr34c9-.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jacquard12/v8/vm8ydRLuXETEweL79J4rGf3IWH4.ttf" - }, - { - "family": "Jacquard 12 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jacquard12charted/v4/i7dWIE97bzCOB9Q_Up6PQmYfKDPIb2HwT3StZ9jetKY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jacquard12charted/v4/i7dWIE97bzCOB9Q_Up6PQmYfKDPIb2Hwf3WnYw.ttf" - }, - { - "family": "Jacquard 24", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jacquard24/v4/jVyO7nf_B2zO5jVpUGU8lgQEdchf9xXp.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jacquard24/v4/jVyO7nf_B2zO5jVpUGU8ljQFf8w.ttf" - }, - { - "family": "Jacquard 24 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jacquard24charted/v5/mtGm4-dNK6HaudrE9VVKhENTsEXEYish0iRrMYJ_K-4.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jacquard24charted/v5/mtGm4-dNK6HaudrE9VVKhENTsEXEYish4iVhNQ.ttf" - }, - { - "family": "Jacquarda Bastarda 9", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v6", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jacquardabastarda9/v6/f0Xp0fWr_8t6WFtKQJfOhaC0hcZ1HYAMAbwD1TB_JHHY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jacquardabastarda9/v6/f0Xp0fWr_8t6WFtKQJfOhaC0hcZ1HYAMAYwC3zQ.ttf" - }, - { - "family": "Jacquarda Bastarda 9 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jacquardabastarda9charted/v4/Yq6D-KaMUyfq4qLgx19A_ocp43FeLd9m0vDxm-yf8JPuf0cPaL8pmQg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jacquardabastarda9charted/v4/Yq6D-KaMUyfq4qLgx19A_ocp43FeLd9m0vDxm-yf8JPuT0YFbA.ttf" - }, - { - "family": "Jacques Francois", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/jacquesfrancois/v26/ZXu9e04ZvKeOOHIe1TMahbcIU2cgmcPqoeRWfbs.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jacquesfrancois/v26/ZXu9e04ZvKeOOHIe1TMahbcIU2cgqcLgpQ.ttf" - }, - { - "family": "Jacques Francois Shadow", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/jacquesfrancoisshadow/v27/KR1FBtOz8PKTMk-kqdkLVrvR0ECFrB6Pin-2_q8VsHuV5ULS.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jacquesfrancoisshadow/v27/KR1FBtOz8PKTMk-kqdkLVrvR0ECFrB6Pin-2_p8Uun8.ttf" - }, - { - "family": "Jaini", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/jaini/v1/fC1vPYJMbGHQzEmOK-ZSUHyt.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jaini/v1/fC1vPYJMbGHQzHmPIeI.ttf" - }, - { - "family": "Jaini Purva", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/jainipurva/v1/CHynV-vdHVXwbWcUswbUGHoOHH4sj3lR.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jainipurva/v1/CHynV-vdHVXwbWcUswbUGEoPFno.ttf" - }, - { - "family": "Jaldi", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/jaldi/v14/or3sQ67z0_CI30NUZpD_B6g8.ttf", - "700": "https://fonts.gstatic.com/s/jaldi/v14/or3hQ67z0_CI33voSbT3LLQ1niPn.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jaldi/v14/or3sQ67z0_CI33NVbJQ.ttf" - }, - { - "family": "Jaro", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/jaro/v8/ea8DadQwV_r_Rv3-7zZMCGhQgVr1SlCsNP3VpQ_a.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jaro/v8/ea8DadQwV_r_Rv3-7zZMCGhQgVr1SmCtPvk.ttf" - }, - { - "family": "Jersey 10", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jersey10/v4/GftH7vZKsggXMf9n_J5X-JLgy1wtSw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jersey10/v4/GftH7vZKsggXMf9n_J5n-Zjk.ttf" - }, - { - "family": "Jersey 10 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jersey10charted/v4/oY1E8fPFr6XiNWqEp90XSbwUGfF8SnedKmeBvEYs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jersey10charted/v4/oY1E8fPFr6XiNWqEp90XSbwUGfF8SkecIGM.ttf" - }, - { - "family": "Jersey 15", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jersey15/v4/_6_9EDzuROGsUuk2TWjSYoohsCkvSQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jersey15/v4/_6_9EDzuROGsUuk2TWjiY4Al.ttf" - }, - { - "family": "Jersey 15 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jersey15charted/v4/nuFjD-rCQIjoVp1Sva2ToCTudGbLeRv4r2024gxi.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jersey15charted/v4/nuFjD-rCQIjoVp1Sva2ToCTudGbLeSv5pWk.ttf" - }, - { - "family": "Jersey 20", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jersey20/v4/ZgNRjP1ON6jeW4D12z3crE_qP4mXuQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jersey20/v4/ZgNRjP1ON6jeW4D12z3srUXu.ttf" - }, - { - "family": "Jersey 20 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jersey20charted/v4/JTUNjJMy9DKq5FzVaj9tpgYgvHqGn_Z1ji-rqnQ_.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jersey20charted/v4/JTUNjJMy9DKq5FzVaj9tpgYgvHqGn8Z0hCs.ttf" - }, - { - "family": "Jersey 25", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jersey25/v4/ll8-K2eeXj2tAs6F9BXIJ4AMng8ChA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jersey25/v4/ll8-K2eeXj2tAs6F9BX4JooI.ttf" - }, - { - "family": "Jersey 25 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/jersey25charted/v3/6NUM8EWHIhCWbxOqtLkv94Rlu6EkGv2uUGQW93Cg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jersey25charted/v3/6NUM8EWHIhCWbxOqtLkv94Rlu6EkGs2vWmA.ttf" - }, - { - "family": "JetBrains Mono", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yK1jPVmUsaaDhw.ttf", - "200": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8SKxjPVmUsaaDhw.ttf", - "300": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8lqxjPVmUsaaDhw.ttf", - "regular": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxjPVmUsaaDhw.ttf", - "500": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8-qxjPVmUsaaDhw.ttf", - "600": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8FqtjPVmUsaaDhw.ttf", - "700": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8L6tjPVmUsaaDhw.ttf", - "800": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8SKtjPVmUsaaDhw.ttf", - "100italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO-Lf1OQk6OThxPA.ttf", - "200italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO8LflOQk6OThxPA.ttf", - "300italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO_VflOQk6OThxPA.ttf", - "italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO-LflOQk6OThxPA.ttf", - "500italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO-5flOQk6OThxPA.ttf", - "600italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO9VeVOQk6OThxPA.ttf", - "700italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO9seVOQk6OThxPA.ttf", - "800italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO8LeVOQk6OThxPA.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTPFOQ.ttf" - }, - { - "family": "Jim Nightshade", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/jimnightshade/v21/PlIkFlu9Pb08Q8HLM1PxmB0g-OS4V3qKaMxD.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jimnightshade/v21/PlIkFlu9Pb08Q8HLM1PxmB0g-NS5XX4.ttf" - }, - { - "family": "Joan", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/joan/v12/ZXupe1oZsqWRbRdH8X1p_Ng.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/joan/v12/ZXupe1oZsqWRXRZN9Q.ttf" - }, - { - "family": "Jockey One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/jockeyone/v23/HTxpL2g2KjCFj4x8WI6ArIb7HYOk4xc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jockeyone/v23/HTxpL2g2KjCFj4x8WI6AnIfxGQ.ttf" - }, - { - "family": "Jolly Lodger", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/jollylodger/v21/BXRsvFTAh_bGkA1uQ48dlB3VWerT3ZyuqA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jollylodger/v21/BXRsvFTAh_bGkA1uQ48dlB3lWODX.ttf" - }, - { - "family": "Jomhuria", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/jomhuria/v22/Dxxp8j-TMXf-llKur2b1MOGbC3Dh.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jomhuria/v22/Dxxp8j-TMXf-llKur1b0OuU.ttf" - }, - { - "family": "Jomolhari", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "tibetan" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/jomolhari/v21/EvONzA1M1Iw_CBd2hsQCF1IZKq5INg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jomolhari/v21/EvONzA1M1Iw_CBd2hsQyFlgd.ttf" - }, - { - "family": "Josefin Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v34", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_DjRXMFrLgTsQV0.ttf", - "200": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_LjQXMFrLgTsQV0.ttf", - "300": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_GbQXMFrLgTsQV0.ttf", - "regular": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_DjQXMFrLgTsQV0.ttf", - "500": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_ArQXMFrLgTsQV0.ttf", - "600": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_ObXXMFrLgTsQV0.ttf", - "700": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_N_XXMFrLgTsQV0.ttf", - "100italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTtINhKibpUV3MEQ.ttf", - "200italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTNIJhKibpUV3MEQ.ttf", - "300italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCT6oJhKibpUV3MEQ.ttf", - "italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTtIJhKibpUV3MEQ.ttf", - "500italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCThoJhKibpUV3MEQ.ttf", - "600italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTaoVhKibpUV3MEQ.ttf", - "700italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTU4VhKibpUV3MEQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_DjQbMBhKg.ttf" - }, - { - "family": "Josefin Slab", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v29", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W71mtd3k3K6CcEyI.ttf", - "200": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W79msd3k3K6CcEyI.ttf", - "300": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W7wesd3k3K6CcEyI.ttf", - "regular": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W71msd3k3K6CcEyI.ttf", - "500": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W72usd3k3K6CcEyI.ttf", - "600": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W74erd3k3K6CcEyI.ttf", - "700": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W776rd3k3K6CcEyI.ttf", - "100italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvnzs9L4KZAyK43w.ttf", - "200italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvHzo9L4KZAyK43w.ttf", - "300italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvwTo9L4KZAyK43w.ttf", - "italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvnzo9L4KZAyK43w.ttf", - "500italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvrTo9L4KZAyK43w.ttf", - "600italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvQT09L4KZAyK43w.ttf", - "700italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHveD09L4KZAyK43w.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W71msR3g9Lw.ttf" - }, - { - "family": "Jost", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7myjJAVGPokMmuHL.ttf", - "200": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mwjJQVGPokMmuHL.ttf", - "300": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mz9JQVGPokMmuHL.ttf", - "regular": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7myjJQVGPokMmuHL.ttf", - "500": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7myRJQVGPokMmuHL.ttf", - "600": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mx9IgVGPokMmuHL.ttf", - "700": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mxEIgVGPokMmuHL.ttf", - "800": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mwjIgVGPokMmuHL.ttf", - "900": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mwKIgVGPokMmuHL.ttf", - "100italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZu0ENI0un_HLMEo.ttf", - "200italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZm0FNI0un_HLMEo.ttf", - "300italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZrMFNI0un_HLMEo.ttf", - "italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZu0FNI0un_HLMEo.ttf", - "500italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZt8FNI0un_HLMEo.ttf", - "600italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZjMCNI0un_HLMEo.ttf", - "700italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZgoCNI0un_HLMEo.ttf", - "800italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZm0CNI0un_HLMEo.ttf", - "900italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZkQCNI0un_HLMEo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7myjJTVHNI0.ttf" - }, - { - "family": "Joti One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/jotione/v28/Z9XVDmdJQAmWm9TwaYTe4u2El6GC.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jotione/v28/Z9XVDmdJQAmWm9TwabTf6Ok.ttf" - }, - { - "family": "Jua", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/jua/v18/co3KmW9ljjAjc-DZCsKgsg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jua/v18/co3KmW9ljjATcurd.ttf" - }, - { - "family": "Judson", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/judson/v20/FeVRS0Fbvbc14VxRD7N01bV7kg.ttf", - "italic": "https://fonts.gstatic.com/s/judson/v20/FeVTS0Fbvbc14VxhDblw97BrknZf.ttf", - "700": "https://fonts.gstatic.com/s/judson/v20/FeVSS0Fbvbc14Vxps5xQ3Z5nm29Gww.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/judson/v20/FeVRS0Fbvbc14VxhDrlw.ttf" - }, - { - "family": "Julee", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/julee/v26/TuGfUVB3RpZPQ6ZLodgzydtk.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/julee/v26/TuGfUVB3RpZPQ5ZKq9w.ttf" - }, - { - "family": "Julius Sans One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/juliussansone/v20/1Pt2g8TAX_SGgBGUi0tGOYEga5W-xXEW6aGXHw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/juliussansone/v20/1Pt2g8TAX_SGgBGUi0tGOYEga5WOxHsS.ttf" - }, - { - "family": "Junge", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v26", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/junge/v26/gokgH670Gl1lUqAdvhB7SnKm.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/junge/v26/gokgH670Gl1lUpActBQ.ttf" - }, - { - "family": "Jura", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "kayah-li", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v34", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP0D7auhTfmrH_rt.ttf", - "regular": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP1d7auhTfmrH_rt.ttf", - "500": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP1v7auhTfmrH_rt.ttf", - "600": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP2D6quhTfmrH_rt.ttf", - "700": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP266quhTfmrH_rt.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP1d7ZugR_0.ttf" - }, - { - "family": "Just Another Hand", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/justanotherhand/v21/845CNN4-AJyIGvIou-6yJKyptyOpOcr_BmmlS5aw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/justanotherhand/v21/845CNN4-AJyIGvIou-6yJKyptyOpOfr-DG0.ttf" - }, - { - "family": "Just Me Again Down Here", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/justmeagaindownhere/v25/MwQmbgXtz-Wc6RUEGNMc0QpRrfUh2hSdBBMoAuwHvqDwc_fg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/justmeagaindownhere/v25/MwQmbgXtz-Wc6RUEGNMc0QpRrfUh2hSdBBMoAtwGtKQ.ttf" - }, - { - "family": "K2D", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/k2d/v13/J7aRnpF2V0ErE6UpvrIw74NL.ttf", - "100italic": "https://fonts.gstatic.com/s/k2d/v13/J7afnpF2V0EjdZ1NtLYS6pNLAjk.ttf", - "200": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Erv4QJlJw85ppSGw.ttf", - "200italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ3hlZY4xJ9CGyAa.ttf", - "300": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Er24cJlJw85ppSGw.ttf", - "300italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ2FlpY4xJ9CGyAa.ttf", - "regular": "https://fonts.gstatic.com/s/k2d/v13/J7aTnpF2V0ETd68tnLcg7w.ttf", - "italic": "https://fonts.gstatic.com/s/k2d/v13/J7aRnpF2V0EjdaUpvrIw74NL.ttf", - "500": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Erg4YJlJw85ppSGw.ttf", - "500italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ3dl5Y4xJ9CGyAa.ttf", - "600": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Err4EJlJw85ppSGw.ttf", - "600italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ3xkJY4xJ9CGyAa.ttf", - "700": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Ery4AJlJw85ppSGw.ttf", - "700italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ2VkZY4xJ9CGyAa.ttf", - "800": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Er14MJlJw85ppSGw.ttf", - "800italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ2JkpY4xJ9CGyAa.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/k2d/v13/J7aTnpF2V0EjdqUp.ttf" - }, - { - "family": "Kablammo", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "emoji", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/kablammo/v4/bWtm7fHPcgrhC-J3lcXhcQTY5Ixs6Au9YgCjjx0Rf4YDKw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kablammo/v4/bWtm7fHPcgrhC-J3lcXhcQTY5Ixs6Au9YgCTjhcV.ttf" - }, - { - "family": "Kadwa", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin" - ], - "version": "v13", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/kadwa/v13/rnCm-x5V0g7iphTHRcc2s2XH.ttf", - "700": "https://fonts.gstatic.com/s/kadwa/v13/rnCr-x5V0g7ipix7auM-mHnOSOuk.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kadwa/v13/rnCm-x5V0g7ipiTGT8M.ttf" - }, - { - "family": "Kaisei Decol", - "variants": [ - "regular", - "500", - "700" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/kaiseidecol/v11/bMrwmSqP45sidWf3QmfFW6iyW1EP22OjoA.ttf", - "500": "https://fonts.gstatic.com/s/kaiseidecol/v11/bMrvmSqP45sidWf3QmfFW6iKr3gr00i_qb57kA.ttf", - "700": "https://fonts.gstatic.com/s/kaiseidecol/v11/bMrvmSqP45sidWf3QmfFW6iK534r00i_qb57kA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kaiseidecol/v11/bMrwmSqP45sidWf3QmfFW6iCWlsL.ttf" - }, - { - "family": "Kaisei HarunoUmi", - "variants": [ - "regular", - "500", - "700" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/kaiseiharunoumi/v11/HI_RiZQSLqBQoAHhK_C6N_nzy_jcGsv5sM8u3mk.ttf", - "500": "https://fonts.gstatic.com/s/kaiseiharunoumi/v11/HI_WiZQSLqBQoAHhK_C6N_nzy_jcIj_QlMcFwmC9FAU.ttf", - "700": "https://fonts.gstatic.com/s/kaiseiharunoumi/v11/HI_WiZQSLqBQoAHhK_C6N_nzy_jcInfWlMcFwmC9FAU.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kaiseiharunoumi/v11/HI_RiZQSLqBQoAHhK_C6N_nzy_jcKsrztA.ttf" - }, - { - "family": "Kaisei Opti", - "variants": [ - "regular", - "500", - "700" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/kaiseiopti/v11/QldKNThJphYb8_g6c2nlIFle7KlmxuHx.ttf", - "500": "https://fonts.gstatic.com/s/kaiseiopti/v11/QldXNThJphYb8_g6c2nlIGGqxY1u7f34DYwn.ttf", - "700": "https://fonts.gstatic.com/s/kaiseiopti/v11/QldXNThJphYb8_g6c2nlIGHiw41u7f34DYwn.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kaiseiopti/v11/QldKNThJphYb8_g6c2nlIGlf5q0.ttf" - }, - { - "family": "Kaisei Tokumin", - "variants": [ - "regular", - "500", - "700", - "800" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8sN5wdZg7xCwuMsylww2ZiQkJf1l0pj946.ttf", - "500": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8vN5wdZg7xCwuMsylww2ZiQnqr_3khpMIzeI6v.ttf", - "700": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8vN5wdZg7xCwuMsylww2ZiQnrj-XkhpMIzeI6v.ttf", - "800": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8vN5wdZg7xCwuMsylww2ZiQnr_-nkhpMIzeI6v.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8sN5wdZg7xCwuMsylww2ZiQnJe3Fk.ttf" - }, - { - "family": "Kalam", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/kalam/v18/YA9Qr0Wd4kDdMtD6GgLLmCUItqGt.ttf", - "regular": "https://fonts.gstatic.com/s/kalam/v18/YA9dr0Wd4kDdMuhWMibDszkB.ttf", - "700": "https://fonts.gstatic.com/s/kalam/v18/YA9Qr0Wd4kDdMtDqHQLLmCUItqGt.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kalam/v18/YA9dr0Wd4kDdMthXOCI.ttf" - }, - { - "family": "Kalnia", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "math" - ], - "version": "v6", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW9il2xRGNcykIZc.ttf", - "200": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW_ilmxRGNcykIZc.ttf", - "300": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW88lmxRGNcykIZc.ttf", - "regular": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW9ilmxRGNcykIZc.ttf", - "500": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW9QlmxRGNcykIZc.ttf", - "600": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW-8kWxRGNcykIZc.ttf", - "700": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW-FkWxRGNcykIZc.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW9illxQEtM.ttf" - }, - { - "family": "Kalnia Glaze", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYdL63nZKfhpVTvN.ttf", - "200": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYfL6nnZKfhpVTvN.ttf", - "300": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYcV6nnZKfhpVTvN.ttf", - "regular": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYdL6nnZKfhpVTvN.ttf", - "500": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYd56nnZKfhpVTvN.ttf", - "600": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYeV7XnZKfhpVTvN.ttf", - "700": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYes7XnZKfhpVTvN.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYdL6knYI_w.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Kameron", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4Ne3cbcbvZPxCDLR.ttf", - "500": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4NeFcbcbvZPxCDLR.ttf", - "600": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4NdpdrcbvZPxCDLR.ttf", - "700": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4NdQdrcbvZPxCDLR.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4Ne3cYcat5c.ttf" - }, - { - "family": "Kanchenjunga", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "kirat-rai", - "latin" - ], - "version": "v2", - "lastModified": "2025-04-23", - "files": { - "regular": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmPoKKd5fUmrILiWsjCI6TiqYsGBGBzCw.ttf", - "500": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmQoKKd5fUmrILiWsjCI6TaXaIiDEtvAlaMKw.ttf", - "600": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmQoKKd5fUmrILiWsjCI6TacaUiDEtvAlaMKw.ttf", - "700": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmQoKKd5fUmrILiWsjCI6TaFaQiDEtvAlaMKw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmPoKKd5fUmrILiWsjCI6TSqIEC.ttf" - }, - { - "family": "Kanit", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/kanit/v17/nKKX-Go6G5tXcr72GwWKcaxALFs.ttf", - "100italic": "https://fonts.gstatic.com/s/kanit/v17/nKKV-Go6G5tXcraQI2GAdY5FPFtrGw.ttf", - "200": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr5aOiWgX6BJNUJy.ttf", - "200italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI82hVaRrMFJyAu4.ttf", - "300": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr4-OSWgX6BJNUJy.ttf", - "300italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI6miVaRrMFJyAu4.ttf", - "regular": "https://fonts.gstatic.com/s/kanit/v17/nKKZ-Go6G5tXcoaSEQGodLxA.ttf", - "italic": "https://fonts.gstatic.com/s/kanit/v17/nKKX-Go6G5tXcraQGwWKcaxALFs.ttf", - "500": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr5mOCWgX6BJNUJy.ttf", - "500italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI_GjVaRrMFJyAu4.ttf", - "600": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr5KPyWgX6BJNUJy.ttf", - "600italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI92kVaRrMFJyAu4.ttf", - "700": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr4uPiWgX6BJNUJy.ttf", - "700italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI7mlVaRrMFJyAu4.ttf", - "800": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr4yPSWgX6BJNUJy.ttf", - "800italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI6WmVaRrMFJyAu4.ttf", - "900": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr4WPCWgX6BJNUJy.ttf", - "900italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI4GnVaRrMFJyAu4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kanit/v17/nKKZ-Go6G5tXcraTGwU.ttf" - }, - { - "family": "Kantumruy Pro", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "khmer", - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg1urUs0M34dR6dW.ttf", - "200": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg3urEs0M34dR6dW.ttf", - "300": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg0wrEs0M34dR6dW.ttf", - "regular": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg1urEs0M34dR6dW.ttf", - "500": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg1crEs0M34dR6dW.ttf", - "600": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg2wq0s0M34dR6dW.ttf", - "700": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg2Jq0s0M34dR6dW.ttf", - "100italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim76N2OXo_QrdWlcU.ttf", - "200italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim7yN3OXo_QrdWlcU.ttf", - "300italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim7_13OXo_QrdWlcU.ttf", - "italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim76N3OXo_QrdWlcU.ttf", - "500italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim75F3OXo_QrdWlcU.ttf", - "600italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim731wOXo_QrdWlcU.ttf", - "700italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim70RwOXo_QrdWlcU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg1urHs1OXo.ttf" - }, - { - "family": "Kapakana", - "variants": [ - "300", - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/kapakana/v19/sykt-yN0m6InS7OD9BCc9iYVO-6XOlDixNA5tRbXZ4IXAA.ttf", - "regular": "https://fonts.gstatic.com/s/kapakana/v19/sykt-yN0m6InS7OD9BCc9iYVO-6XOlDimtA5tRbXZ4IXAA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kapakana/v19/sykt-yN0m6InS7OD9BCc9iYVO-6XOlDimtAJtBzT.ttf" - }, - { - "family": "Karantina", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/karantina/v13/buExpo24ccnh31GVMABxXCgf-P5Oaiw4cw.ttf", - "regular": "https://fonts.gstatic.com/s/karantina/v13/buE0po24ccnh31GVMABJ8AA78NVSYw.ttf", - "700": "https://fonts.gstatic.com/s/karantina/v13/buExpo24ccnh31GVMABxTC8f-P5Oaiw4cw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/karantina/v13/buE0po24ccnh31GVMAB58Qo_.ttf" - }, - { - "family": "Karla", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v33", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDeJqqFENLR7fHGw.ttf", - "300": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDppqqFENLR7fHGw.ttf", - "regular": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTD-JqqFENLR7fHGw.ttf", - "500": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDypqqFENLR7fHGw.ttf", - "600": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDJp2qFENLR7fHGw.ttf", - "700": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDH52qFENLR7fHGw.ttf", - "800": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDeJ2qFENLR7fHGw.ttf", - "200italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNnCV0lPZbLXGxGR.ttf", - "300italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNkcV0lPZbLXGxGR.ttf", - "italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNlCV0lPZbLXGxGR.ttf", - "500italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNlwV0lPZbLXGxGR.ttf", - "600italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNmcUElPZbLXGxGR.ttf", - "700italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNmlUElPZbLXGxGR.ttf", - "800italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNnCUElPZbLXGxGR.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTD-JqaFUlP.ttf" - }, - { - "family": "Karla Tamil Inclined", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "tamil" - ], - "version": "v2", - "lastModified": "2024-10-29", - "files": { - "regular": "https://fonts.gstatic.com/s/karlatamilinclined/v2/vm8pdQ3vXFXZ1aPd8dNzR82AFh2TibkaVrcbvZPxCDLR.ttf", - "700": "https://fonts.gstatic.com/s/karlatamilinclined/v2/vm8mdQ3vXFXZ1aPd8dNzR82AFh2TibkaVo-nkrf5Iy7YGkI1.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/karlatamilinclined/v2/vm8pdQ3vXFXZ1aPd8dNzR82AFh2TibkaVocat5c.ttf" - }, - { - "family": "Karla Tamil Upright", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "tamil" - ], - "version": "v2", - "lastModified": "2024-10-29", - "files": { - "regular": "https://fonts.gstatic.com/s/karlatamilupright/v2/IFS4HfVMk95HnY0u6SeQ_cHoozW_3U5XoBJ9hK8kMK4.ttf", - "700": "https://fonts.gstatic.com/s/karlatamilupright/v2/IFS1HfVMk95HnY0u6SeQ_cHoozW_3U5XmK5SoKcPLKclE4o.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/karlatamilupright/v2/IFS4HfVMk95HnY0u6SeQ_cHoozW_3U5XkBN3gA.ttf" - }, - { - "family": "Karma", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/karma/v18/va9F4kzAzMZRGLjDY8Z_uqzGQC_-.ttf", - "regular": "https://fonts.gstatic.com/s/karma/v18/va9I4kzAzMZRGIBvS-J3kbDP.ttf", - "500": "https://fonts.gstatic.com/s/karma/v18/va9F4kzAzMZRGLibYsZ_uqzGQC_-.ttf", - "600": "https://fonts.gstatic.com/s/karma/v18/va9F4kzAzMZRGLi3ZcZ_uqzGQC_-.ttf", - "700": "https://fonts.gstatic.com/s/karma/v18/va9F4kzAzMZRGLjTZMZ_uqzGQC_-.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/karma/v18/va9I4kzAzMZRGLBuQeY.ttf" - }, - { - "family": "Katibeh", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/katibeh/v22/ZGjXol5MQJog4bxDaC1RVDNdGDs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/katibeh/v22/ZGjXol5MQJog4bxDWCxbUA.ttf" - }, - { - "family": "Kaushan Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/kaushanscript/v19/vm8vdRfvXFLG3OLnsO15WYS5DF7_ytN3M48a.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kaushanscript/v19/vm8vdRfvXFLG3OLnsO15WYS5DG7-wNc.ttf" - }, - { - "family": "Kavivanar", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/kavivanar/v22/o-0IIpQgyXYSwhxP7_Jb4j5Ba_2c7A.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kavivanar/v22/o-0IIpQgyXYSwhxP7_Jr4zRF.ttf" - }, - { - "family": "Kavoon", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/kavoon/v25/pxiFyp4_scRYhlU4NLr6f1pdEQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kavoon/v25/pxiFyp4_scRYhlUINbD-.ttf" - }, - { - "family": "Kay Pho Du", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "kayah-li", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/kayphodu/v2/jizfREFPvGNOx-jhPwHR4OmnLD0Z4zM.ttf", - "500": "https://fonts.gstatic.com/s/kayphodu/v2/jizcREFPvGNOx-jhPwHR2B2OCDUy_zoyk18.ttf", - "600": "https://fonts.gstatic.com/s/kayphodu/v2/jizcREFPvGNOx-jhPwHR2DGJCDUy_zoyk18.ttf", - "700": "https://fonts.gstatic.com/s/kayphodu/v2/jizcREFPvGNOx-jhPwHR2FWICDUy_zoyk18.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kayphodu/v2/jizfREFPvGNOx-jhPwHR0OitKA.ttf" - }, - { - "family": "Kdam Thmor Pro", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/kdamthmorpro/v7/EJRPQgAzVdcI-Qdvt34jzurnGA7_j89I8ZWb.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kdamthmorpro/v7/EJRPQgAzVdcI-Qdvt34jzurnGD7-hcs.ttf" - }, - { - "family": "Keania One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/keaniaone/v26/zOL54pXJk65E8pXardnuycRuv-hHkOs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/keaniaone/v26/zOL54pXJk65E8pXardnu-cVkuw.ttf" - }, - { - "family": "Kelly Slab", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/kellyslab/v18/-W_7XJX0Rz3cxUnJC5t6TkMBf50kbiM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kellyslab/v18/-W_7XJX0Rz3cxUnJC5t6fkILew.ttf" - }, - { - "family": "Kenia", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/kenia/v30/jizURE5PuHQH9qCONUGswfGM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kenia/v30/jizURE5PuHQH9pCPP0U.ttf" - }, - { - "family": "Khand", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/khand/v22/TwMN-IINQlQQ0bL5cFE3ZwaH__-C.ttf", - "regular": "https://fonts.gstatic.com/s/khand/v22/TwMA-IINQlQQ0YpVWHU_TBqO.ttf", - "500": "https://fonts.gstatic.com/s/khand/v22/TwMN-IINQlQQ0bKhcVE3ZwaH__-C.ttf", - "600": "https://fonts.gstatic.com/s/khand/v22/TwMN-IINQlQQ0bKNdlE3ZwaH__-C.ttf", - "700": "https://fonts.gstatic.com/s/khand/v22/TwMN-IINQlQQ0bLpd1E3ZwaH__-C.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/khand/v22/TwMA-IINQlQQ0bpUUnE.ttf" - }, - { - "family": "Khmer", - "variants": [ - "regular" - ], - "subsets": [ - "khmer" - ], - "version": "v38", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/khmer/v38/MjQImit_vPPwpF-BpN2EeYmD.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/khmer/v38/MjQImit_vPPwpG-Artk.ttf" - }, - { - "family": "Khula", - "variants": [ - "300", - "regular", - "600", - "700", - "800" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/khula/v17/OpNPnoEOns3V7G-ljCvUrC59XwXD.ttf", - "regular": "https://fonts.gstatic.com/s/khula/v17/OpNCnoEOns3V7FcJpA_chzJ0.ttf", - "600": "https://fonts.gstatic.com/s/khula/v17/OpNPnoEOns3V7G_RiivUrC59XwXD.ttf", - "700": "https://fonts.gstatic.com/s/khula/v17/OpNPnoEOns3V7G-1iyvUrC59XwXD.ttf", - "800": "https://fonts.gstatic.com/s/khula/v17/OpNPnoEOns3V7G-piCvUrC59XwXD.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/khula/v17/OpNCnoEOns3V7GcIrgs.ttf" - }, - { - "family": "Kings", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/kings/v9/8AtnGsK4O5CYXU_Iq6GSPaHS.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kings/v9/8AtnGsK4O5CYXX_JoaU.ttf" - }, - { - "family": "Kirang Haerang", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/kiranghaerang/v22/E21-_dn_gvvIjhYON1lpIU4-bcqvWPaJq4no.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kiranghaerang/v22/E21-_dn_gvvIjhYON1lpIU4-bfquUvI.ttf" - }, - { - "family": "Kite One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/kiteone/v23/70lQu7shLnA_E02vyq1b6HnGO4uA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kiteone/v23/70lQu7shLnA_E02vyp1a4n0.ttf" - }, - { - "family": "Kiwi Maru", - "variants": [ - "300", - "regular", - "500" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/kiwimaru/v20/R70djykGkuuDep-hRg6gNCi0Vxn9R5ShnA.ttf", - "regular": "https://fonts.gstatic.com/s/kiwimaru/v20/R70YjykGkuuDep-hRg6YmACQXzLhTg.ttf", - "500": "https://fonts.gstatic.com/s/kiwimaru/v20/R70djykGkuuDep-hRg6gbCm0Vxn9R5ShnA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kiwimaru/v20/R70YjykGkuuDep-hRg6omQqU.ttf" - }, - { - "family": "Klee One", - "variants": [ - "regular", - "600" - ], - "subsets": [ - "cyrillic", - "greek-ext", - "japanese", - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/kleeone/v13/LDIxapCLNRc6A8oT4q4AOeekWPrP.ttf", - "600": "https://fonts.gstatic.com/s/kleeone/v13/LDI2apCLNRc6A8oT4pbYF8Osc-bGkqIw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kleeone/v13/LDIxapCLNRc6A8oT4p4BM-M.ttf" - }, - { - "family": "Knewave", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/knewave/v15/sykz-yx0lLcxQaSItSq9-trEvlQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/knewave/v15/sykz-yx0lLcxQaSIhSu3_g.ttf" - }, - { - "family": "KoHo", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPuE1WJ75JoKhHys.ttf", - "200italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNisssJ_zIqCkDyvqZA.ttf", - "300": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPoU2WJ75JoKhHys.ttf", - "300italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNiss1JzzIqCkDyvqZA.ttf", - "regular": "https://fonts.gstatic.com/s/koho/v18/K2F-fZ5fmddNBikefJbSOos.ttf", - "italic": "https://fonts.gstatic.com/s/koho/v18/K2FwfZ5fmddNNisUeLTXKou4Bg.ttf", - "500": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPt03WJ75JoKhHys.ttf", - "500italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNissjJ3zIqCkDyvqZA.ttf", - "600": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPvEwWJ75JoKhHys.ttf", - "600italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNissoJrzIqCkDyvqZA.ttf", - "700": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPpUxWJ75JoKhHys.ttf", - "700italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNissxJvzIqCkDyvqZA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/koho/v18/K2F-fZ5fmddNNigUeA.ttf" - }, - { - "family": "Kodchasan", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJeR1Cggeqo3eMeoA.ttf", - "200italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUlIgOCs_-YOoIgN.ttf", - "300": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJeI1Oggeqo3eMeoA.ttf", - "300italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUksg-Cs_-YOoIgN.ttf", - "regular": "https://fonts.gstatic.com/s/kodchasan/v20/1cXxaUPOAJv9sG4I-DJmj3uEicG01A.ttf", - "italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cX3aUPOAJv9sG4I-DJWjXGAq8Sk1PoH.ttf", - "500": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJee1Kggeqo3eMeoA.ttf", - "500italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUl0guCs_-YOoIgN.ttf", - "600": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJeV1Wggeqo3eMeoA.ttf", - "600italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUlYheCs_-YOoIgN.ttf", - "700": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJeM1Sggeqo3eMeoA.ttf", - "700italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUk8hOCs_-YOoIgN.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kodchasan/v20/1cXxaUPOAJv9sG4I-DJWjnGA.ttf" - }, - { - "family": "Kode Mono", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq5my9DqTaOW2A3k.ttf", - "500": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq6uy9DqTaOW2A3k.ttf", - "600": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq0e19DqTaOW2A3k.ttf", - "700": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq3619DqTaOW2A3k.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq5myxDuZbA.ttf" - }, - { - "family": "Koh Santepheap", - "variants": [ - "100", - "300", - "regular", - "700", - "900" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v15", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMfW3p6SJbwyGj2rBZyeOrTjNuFHVyTtjNJUWU.ttf", - "300": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMeW3p6SJbwyGj2rBZyeOrTjNtNP3y5mD9ASHz5.ttf", - "regular": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMdW3p6SJbwyGj2rBZyeOrTjOPhF1ixsyNJ.ttf", - "700": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMeW3p6SJbwyGj2rBZyeOrTjNtdOHy5mD9ASHz5.ttf", - "900": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMeW3p6SJbwyGj2rBZyeOrTjNtlOny5mD9ASHz5.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMdW3p6SJbwyGj2rBZyeOrTjNPgHVw.ttf" - }, - { - "family": "Kolker Brush", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/kolkerbrush/v8/iJWDBXWRZjfKWdvmzwvvog3-7KJ6x8qNUQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kolkerbrush/v8/iJWDBXWRZjfKWdvmzwvvog3O7ah-.ttf" - }, - { - "family": "Konkhmer Sleokchher", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/konkhmersleokchher/v3/_Xmw-GE-rjmabA_M-aPOZOsCrUv825LFI3507E0d-W0.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/konkhmersleokchher/v3/_Xmw-GE-rjmabA_M-aPOZOsCrUv825LFE39-6A.ttf" - }, - { - "family": "Kosugi", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/kosugi/v19/pxiFyp4_v8FCjlI4NLr6f1pdEQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kosugi/v19/pxiFyp4_v8FCjlIINbD-.ttf" - }, - { - "family": "Kosugi Maru", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/kosugimaru/v17/0nksC9PgP_wGh21A2KeqGiTqivr9iBq_.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kosugimaru/v17/0nksC9PgP_wGh21A2KeqGhTrgP4.ttf" - }, - { - "family": "Kotta One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/kottaone/v21/S6u_w41LXzPc_jlfNWqPHA3s5dwt7w.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kottaone/v21/S6u_w41LXzPc_jlfNWq_HQfo.ttf" - }, - { - "family": "Koulen", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v30", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/koulen/v30/AMOQz46as3KIBPeWgnA9kuYMUg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/koulen/v30/AMOQz46as3KIBPemg3o5.ttf" - }, - { - "family": "Kranky", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v29", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/kranky/v29/hESw6XVgJzlPsFnMpheEZo_H_w.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kranky/v29/hESw6XVgJzlPsFn8px2A.ttf" - }, - { - "family": "Kreon", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v40", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvPNimejUfp2dWNg.ttf", - "regular": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvYtimejUfp2dWNg.ttf", - "500": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvUNimejUfp2dWNg.ttf", - "600": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvvN-mejUfp2dWNg.ttf", - "700": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2Dnvhd-mejUfp2dWNg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvYtiWez8b.ttf" - }, - { - "family": "Kristi", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/kristi/v23/uK_y4ricdeU6zwdRCh0TMv6EXw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kristi/v23/uK_y4ricdeU6zwdhCxcX.ttf" - }, - { - "family": "Krona One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/kronaone/v15/jAnEgHdjHcjgfIb1ZcUCMY-h3cWkWg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kronaone/v15/jAnEgHdjHcjgfIb1ZcUyMIWl.ttf" - }, - { - "family": "Krub", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZo47KLF4R6gWaf8.ttf", - "200italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQiwLByQ4oTef_6gQ.ttf", - "300": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZuo4KLF4R6gWaf8.ttf", - "300italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQipLNyQ4oTef_6gQ.ttf", - "regular": "https://fonts.gstatic.com/s/krub/v11/sZlLdRyC6CRYXkYQDLlTW6E.ttf", - "italic": "https://fonts.gstatic.com/s/krub/v11/sZlFdRyC6CRYbkQaCJtWS6EPcA.ttf", - "500": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZrI5KLF4R6gWaf8.ttf", - "500italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQi_LJyQ4oTef_6gQ.ttf", - "600": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZp4-KLF4R6gWaf8.ttf", - "600italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQi0LVyQ4oTef_6gQ.ttf", - "700": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZvo_KLF4R6gWaf8.ttf", - "700italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQitLRyQ4oTef_6gQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/krub/v11/sZlLdRyC6CRYbkcaCA.ttf" - }, - { - "family": "Kufam", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3lqk7qQCJHvIwYg.ttf", - "500": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3pKk7qQCJHvIwYg.ttf", - "600": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3SK47qQCJHvIwYg.ttf", - "700": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3ca47qQCJHvIwYg.ttf", - "800": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3Fq47qQCJHvIwYg.ttf", - "900": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3P647qQCJHvIwYg.ttf", - "italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXurT6gqNPPcgYp0i.ttf", - "500italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXurh6gqNPPcgYp0i.ttf", - "600italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXuoN7QqNPPcgYp0i.ttf", - "700italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXuo07QqNPPcgYp0i.ttf", - "800italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXupT7QqNPPcgYp0i.ttf", - "900italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXup67QqNPPcgYp0i.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3lqkLqAqN.ttf" - }, - { - "family": "Kulim Park", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/kulimpark/v15/fdN49secq3hflz1Uu3IwjJYNwa5aZbUvGjU.ttf", - "200italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdNm9secq3hflz1Uu3IwhFwUKa9QYZcqCjVVUA.ttf", - "300": "https://fonts.gstatic.com/s/kulimpark/v15/fdN49secq3hflz1Uu3IwjPIOwa5aZbUvGjU.ttf", - "300italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdNm9secq3hflz1Uu3IwhFwUTaxQYZcqCjVVUA.ttf", - "regular": "https://fonts.gstatic.com/s/kulimpark/v15/fdN79secq3hflz1Uu3IwtF4m5aZxebw.ttf", - "italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdN59secq3hflz1Uu3IwhFws4YR0abw2Aw.ttf", - "600": "https://fonts.gstatic.com/s/kulimpark/v15/fdN49secq3hflz1Uu3IwjIYIwa5aZbUvGjU.ttf", - "600italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdNm9secq3hflz1Uu3IwhFwUOapQYZcqCjVVUA.ttf", - "700": "https://fonts.gstatic.com/s/kulimpark/v15/fdN49secq3hflz1Uu3IwjOIJwa5aZbUvGjU.ttf", - "700italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdNm9secq3hflz1Uu3IwhFwUXatQYZcqCjVVUA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kulimpark/v15/fdN79secq3hflz1Uu3IwhF8s4Q.ttf" - }, - { - "family": "Kumar One", - "variants": [ - "regular" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/kumarone/v25/bMr1mS-P958wYi6YaGeGNO6WU3oT0g.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kumarone/v25/bMr1mS-P958wYi6YaGe2NeSS.ttf" - }, - { - "family": "Kumar One Outline", - "variants": [ - "regular" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/kumaroneoutline/v20/Noao6VH62pyLP0fsrZ-v18wlUEcX9zDwRQu8EGKF.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kumaroneoutline/v20/Noao6VH62pyLP0fsrZ-v18wlUEcX9wDxTw8.ttf" - }, - { - "family": "Kumbh Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQkZcA8bTuUkqaLg.ttf", - "200": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQEZYA8bTuUkqaLg.ttf", - "300": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQz5YA8bTuUkqaLg.ttf", - "regular": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQkZYA8bTuUkqaLg.ttf", - "500": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQo5YA8bTuUkqaLg.ttf", - "600": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQT5EA8bTuUkqaLg.ttf", - "700": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQdpEA8bTuUkqaLg.ttf", - "800": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQEZEA8bTuUkqaLg.ttf", - "900": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQOJEA8bTuUkqaLg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQkZYw8L7q.ttf" - }, - { - "family": "Kurale", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "devanagari", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/kurale/v14/4iCs6KV9e9dXjho6eAT3v02QFg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/kurale/v14/4iCs6KV9e9dXjhoKeQ7z.ttf" - }, - { - "family": "LXGW Marker Gothic", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "symbols2", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-06-12", - "files": { - "regular": "https://fonts.gstatic.com/s/lxgwmarkergothic/v1/Gg8oN4AaXyDVTi_NlS1-xCtMQxY3lToBjuw_cZe26Q.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lxgwmarkergothic/v1/Gg8oN4AaXyDVTi_NlS1-xCtMQxY3lToxj-Y7.ttf" - }, - { - "family": "LXGW WenKai Mono TC", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "lisu", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-06-09", - "files": { - "300": "https://fonts.gstatic.com/s/lxgwwenkaimonotc/v9/pxiVyos4iPVgyWx9WtufHnsIf5nkaB0HssKqhvJljXmo2SA.ttf", - "regular": "https://fonts.gstatic.com/s/lxgwwenkaimonotc/v9/pxiYyos4iPVgyWx9WtufHnsIf5nkaB0Him6CovpOkXA.ttf", - "700": "https://fonts.gstatic.com/s/lxgwwenkaimonotc/v9/pxiVyos4iPVgyWx9WtufHnsIf5nkaB0HstKthvJljXmo2SA.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lxgwwenkaimonotc/v9/pxiYyos4iPVgyWx9WtufHnsIf5nkaB0Hum-Ipg.ttf" - }, - { - "family": "LXGW WenKai TC", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "lisu", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-06-09", - "files": { - "300": "https://fonts.gstatic.com/s/lxgwwenkaitc/v9/w8gAH20td8wNsI3f40DmtXZb4_MmBfkpTClICyan.ttf", - "regular": "https://fonts.gstatic.com/s/lxgwwenkaitc/v9/w8gDH20td8wNsI3f40DmtXZb48uKLd0hZzVB.ttf", - "700": "https://fonts.gstatic.com/s/lxgwwenkaitc/v9/w8gAH20td8wNsI3f40DmtXZb4_M2AvkpTClICyan.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lxgwwenkaitc/v9/w8gDH20td8wNsI3f40DmtXZb4_uLJ9k.ttf" - }, - { - "family": "La Belle Aurore", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/labelleaurore/v23/RrQIbot8-mNYKnGNDkWlocovHeIIG-eFNVmULg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/labelleaurore/v23/RrQIbot8-mNYKnGNDkWlocovHeI4Gu2B.ttf" - }, - { - "family": "Labrada", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9VTSgM4QPdUej17.ttf", - "200": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9XTSwM4QPdUej17.ttf", - "300": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9UNSwM4QPdUej17.ttf", - "regular": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9VTSwM4QPdUej17.ttf", - "500": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9VhSwM4QPdUej17.ttf", - "600": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9WNTAM4QPdUej17.ttf", - "700": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9W0TAM4QPdUej17.ttf", - "800": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9XTTAM4QPdUej17.ttf", - "900": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9X6TAM4QPdUej17.ttf", - "100italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCOt6SvN2fy17-dE.ttf", - "200italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCGt7SvN2fy17-dE.ttf", - "300italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCLV7SvN2fy17-dE.ttf", - "italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCOt7SvN2fy17-dE.ttf", - "500italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCNl7SvN2fy17-dE.ttf", - "600italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCDV8SvN2fy17-dE.ttf", - "700italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCAx8SvN2fy17-dE.ttf", - "800italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCGt8SvN2fy17-dE.ttf", - "900italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCEJ8SvN2fy17-dE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9VTSzM5SvM.ttf" - }, - { - "family": "Lacquer", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/lacquer/v16/EYqzma1QwqpG4_BBB7-AXhttQ5I.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lacquer/v16/EYqzma1QwqpG4_BBN76KWg.ttf" - }, - { - "family": "Laila", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-06-25", - "files": { - "300": "https://fonts.gstatic.com/s/laila/v20/LYjBdG_8nE8jDLzxogNAh14nVcfe.ttf", - "regular": "https://fonts.gstatic.com/s/laila/v20/LYjMdG_8nE8jDIRdiidIrEIu.ttf", - "500": "https://fonts.gstatic.com/s/laila/v20/LYjBdG_8nE8jDLypowNAh14nVcfe.ttf", - "600": "https://fonts.gstatic.com/s/laila/v20/LYjBdG_8nE8jDLyFpANAh14nVcfe.ttf", - "700": "https://fonts.gstatic.com/s/laila/v20/LYjBdG_8nE8jDLzhpQNAh14nVcfe.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/laila/v20/LYjMdG_8nE8jDLRcgCM.ttf" - }, - { - "family": "Lakki Reddy", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/lakkireddy/v25/S6u5w49MUSzD9jlCPmvLZQfox9k97-xZ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lakkireddy/v25/S6u5w49MUSzD9jlCPmvLZTfpzd0.ttf" - }, - { - "family": "Lalezar", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/lalezar/v16/zrfl0HLVx-HwTP82UaDyIiL0RCg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lalezar/v16/zrfl0HLVx-HwTP82YaH4Jg.ttf" - }, - { - "family": "Lancelot", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/lancelot/v28/J7acnppxBGtQEulG4JY4xJ9CGyAa.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lancelot/v28/J7acnppxBGtQEulG4KY5zps.ttf" - }, - { - "family": "Langar", - "variants": [ - "regular" - ], - "subsets": [ - "gurmukhi", - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/langar/v30/kJEyBukW7AIlgjGVrTVZ99sqrQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/langar/v30/kJEyBukW7AIlgjGlrD9d.ttf" - }, - { - "family": "Lateef", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v35", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0bjygbqTb9nQ-RA.ttf", - "300": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0Cj-gbqTb9nQ-RA.ttf", - "regular": "https://fonts.gstatic.com/s/lateef/v35/hESw6XVnNCxEvkbMpheEZo_H_w.ttf", - "500": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0Uj6gbqTb9nQ-RA.ttf", - "600": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0fjmgbqTb9nQ-RA.ttf", - "700": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0GjigbqTb9nQ-RA.ttf", - "800": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0BjugbqTb9nQ-RA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lateef/v35/hESw6XVnNCxEvkb8px2A.ttf" - }, - { - "family": "Lato", - "variants": [ - "100", - "100italic", - "300", - "300italic", - "regular", - "italic", - "700", - "700italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/lato/v25/S6u8w4BMUTPHh30wWyWrFCbw7A.ttf", - "100italic": "https://fonts.gstatic.com/s/lato/v25/S6u-w4BMUTPHjxsIPy-vNiPg7MU0.ttf", - "300": "https://fonts.gstatic.com/s/lato/v25/S6u9w4BMUTPHh7USew-FGC_p9dw.ttf", - "300italic": "https://fonts.gstatic.com/s/lato/v25/S6u_w4BMUTPHjxsI9w2PHA3s5dwt7w.ttf", - "regular": "https://fonts.gstatic.com/s/lato/v25/S6uyw4BMUTPHvxk6XweuBCY.ttf", - "italic": "https://fonts.gstatic.com/s/lato/v25/S6u8w4BMUTPHjxswWyWrFCbw7A.ttf", - "700": "https://fonts.gstatic.com/s/lato/v25/S6u9w4BMUTPHh6UVew-FGC_p9dw.ttf", - "700italic": "https://fonts.gstatic.com/s/lato/v25/S6u_w4BMUTPHjxsI5wqPHA3s5dwt7w.ttf", - "900": "https://fonts.gstatic.com/s/lato/v25/S6u9w4BMUTPHh50Xew-FGC_p9dw.ttf", - "900italic": "https://fonts.gstatic.com/s/lato/v25/S6u_w4BMUTPHjxsI3wiPHA3s5dwt7w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lato/v25/S6uyw4BMUTPHjxgwWw.ttf" - }, - { - "family": "Lavishly Yours", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/lavishlyyours/v7/jizDREVIvGwH5OjiZmX9r5z_WxUY0TY7ikbI.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lavishlyyours/v7/jizDREVIvGwH5OjiZmX9r5z_WyUZ2zI.ttf" - }, - { - "family": "League Gothic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/leaguegothic/v13/qFdR35CBi4tvBz81xy7WG7ep-BQAY7Krj7feObpH_-amidQ6Q9hn.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/leaguegothic/v13/qFdR35CBi4tvBz81xy7WG7ep-BQAY7Krj7feObpH_9ang9A.ttf" - }, - { - "family": "League Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v30", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/leaguescript/v30/CSR54zpSlumSWj9CGVsoBZdeaNNUuOwkC2s.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/leaguescript/v30/CSR54zpSlumSWj9CGVsoBZdeWNJevA.ttf" - }, - { - "family": "League Spartan", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvM_oXpBMdcFguczA.ttf", - "200": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMfoTpBMdcFguczA.ttf", - "300": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMoITpBMdcFguczA.ttf", - "regular": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvM_oTpBMdcFguczA.ttf", - "500": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMzITpBMdcFguczA.ttf", - "600": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMIIPpBMdcFguczA.ttf", - "700": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMGYPpBMdcFguczA.ttf", - "800": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMfoPpBMdcFguczA.ttf", - "900": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMV4PpBMdcFguczA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvM_oTZBc1Y.ttf" - }, - { - "family": "Leckerli One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/leckerlione/v22/V8mCoQH8VCsNttEnxnGQ-1itLZxcBtItFw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/leckerlione/v22/V8mCoQH8VCsNttEnxnGQ-1idLJZY.ttf" - }, - { - "family": "Ledger", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/ledger/v17/j8_q6-HK1L3if_sxm8DwHTBhHw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ledger/v17/j8_q6-HK1L3if_sBmsr0.ttf" - }, - { - "family": "Lekton", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/lekton/v21/SZc43FDmLaWmWpBeXxfonUPL6Q.ttf", - "italic": "https://fonts.gstatic.com/s/lekton/v21/SZc63FDmLaWmWpBuXR3sv0bb6StO.ttf", - "700": "https://fonts.gstatic.com/s/lekton/v21/SZc73FDmLaWmWpBm4zjMlWjX4DJXgQ.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lekton/v21/SZc43FDmLaWmWpBuXh3s.ttf" - }, - { - "family": "Lemon", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/lemon/v19/HI_EiYEVKqRMq0jBSZXAQ4-d.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lemon/v19/HI_EiYEVKqRMq3jAQ5E.ttf" - }, - { - "family": "Lemonada", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v31", - "lastModified": "2025-09-02", - "files": { - "300": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGJOt2mfWc3Z2pTg.ttf", - "regular": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGeut2mfWc3Z2pTg.ttf", - "500": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGSOt2mfWc3Z2pTg.ttf", - "600": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGpOx2mfWc3Z2pTg.ttf", - "700": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGnex2mfWc3Z2pTg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGeutGmP-Y.ttf" - }, - { - "family": "Lexend", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WCzsX_LBte6KuGEo.ttf", - "200": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC7sW_LBte6KuGEo.ttf", - "300": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC2UW_LBte6KuGEo.ttf", - "regular": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WCzsW_LBte6KuGEo.ttf", - "500": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WCwkW_LBte6KuGEo.ttf", - "600": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC-UR_LBte6KuGEo.ttf", - "700": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC9wR_LBte6KuGEo.ttf", - "800": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC7sR_LBte6KuGEo.ttf", - "900": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC5IR_LBte6KuGEo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WCzsWzLFnfw.ttf" - }, - { - "family": "Lexend Deca", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U48MxArBPCqLNflg.ttf", - "200": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4cM1ArBPCqLNflg.ttf", - "300": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4rs1ArBPCqLNflg.ttf", - "regular": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U48M1ArBPCqLNflg.ttf", - "500": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4ws1ArBPCqLNflg.ttf", - "600": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4LspArBPCqLNflg.ttf", - "700": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4F8pArBPCqLNflg.ttf", - "800": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4cMpArBPCqLNflg.ttf", - "900": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4WcpArBPCqLNflg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U48M1wrRnG.ttf" - }, - { - "family": "Lexend Exa", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v35", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9r7T6bHHJ8BRq0b.ttf", - "200": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9p7TqbHHJ8BRq0b.ttf", - "300": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9qlTqbHHJ8BRq0b.ttf", - "regular": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9r7TqbHHJ8BRq0b.ttf", - "500": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9rJTqbHHJ8BRq0b.ttf", - "600": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9olSabHHJ8BRq0b.ttf", - "700": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9ocSabHHJ8BRq0b.ttf", - "800": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9p7SabHHJ8BRq0b.ttf", - "900": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9pSSabHHJ8BRq0b.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9r7TpbGFps.ttf" - }, - { - "family": "Lexend Giga", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRC2LmE68oo6eepYQ.ttf", - "200": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCWLiE68oo6eepYQ.ttf", - "300": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRChriE68oo6eepYQ.ttf", - "regular": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRC2LiE68oo6eepYQ.ttf", - "500": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRC6riE68oo6eepYQ.ttf", - "600": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCBr-E68oo6eepYQ.ttf", - "700": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCP7-E68oo6eepYQ.ttf", - "800": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCWL-E68oo6eepYQ.ttf", - "900": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCcb-E68oo6eepYQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRC2Li06sAs.ttf" - }, - { - "family": "Lexend Mega", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDL8fivveyiq9EqQw.ttf", - "200": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLcfmvveyiq9EqQw.ttf", - "300": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLr_mvveyiq9EqQw.ttf", - "regular": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDL8fmvveyiq9EqQw.ttf", - "500": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLw_mvveyiq9EqQw.ttf", - "600": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLL_6vveyiq9EqQw.ttf", - "700": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLFv6vveyiq9EqQw.ttf", - "800": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLcf6vveyiq9EqQw.ttf", - "900": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLWP6vveyiq9EqQw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDL8fmfvOam.ttf" - }, - { - "family": "Lexend Peta", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgR6SFyW1YuRTsnfw.ttf", - "200": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRaSByW1YuRTsnfw.ttf", - "300": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRtyByW1YuRTsnfw.ttf", - "regular": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgR6SByW1YuRTsnfw.ttf", - "500": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgR2yByW1YuRTsnfw.ttf", - "600": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRNydyW1YuRTsnfw.ttf", - "700": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRDidyW1YuRTsnfw.ttf", - "800": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRaSdyW1YuRTsnfw.ttf", - "900": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRQCdyW1YuRTsnfw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgR6SBCWlwq.ttf" - }, - { - "family": "Lexend Tera", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiM5zITdpz0fYxcrQ.ttf", - "200": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMZzMTdpz0fYxcrQ.ttf", - "300": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMuTMTdpz0fYxcrQ.ttf", - "regular": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiM5zMTdpz0fYxcrQ.ttf", - "500": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiM1TMTdpz0fYxcrQ.ttf", - "600": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMOTQTdpz0fYxcrQ.ttf", - "700": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMADQTdpz0fYxcrQ.ttf", - "800": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMZzQTdpz0fYxcrQ.ttf", - "900": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMTjQTdpz0fYxcrQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiM5zMjd5bw.ttf" - }, - { - "family": "Lexend Zetta", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v32", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy9bH0z5jbs8qbts.ttf", - "200": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy1bG0z5jbs8qbts.ttf", - "300": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy4jG0z5jbs8qbts.ttf", - "regular": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy9bG0z5jbs8qbts.ttf", - "500": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy-TG0z5jbs8qbts.ttf", - "600": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCywjB0z5jbs8qbts.ttf", - "700": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCyzHB0z5jbs8qbts.ttf", - "800": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy1bB0z5jbs8qbts.ttf", - "900": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy3_B0z5jbs8qbts.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy9bG4z9pag.ttf" - }, - { - "family": "Libertinus Keyboard", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/libertinuskeyboard/v2/NaPEcYrQAP5Z2JsyIac0i2DYHaapaf43RryztWo_3fk.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/libertinuskeyboard/v2/NaPEcYrQAP5Z2JsyIac0i2DYHaapaf43dr25sQ.ttf" - }, - { - "family": "Libertinus Math", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "math", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/libertinusmath/v1/Gw6iwc3770TVMoHVurPejWtfenRLv_KJt3R-2Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/libertinusmath/v1/Gw6iwc3770TVMoHVurPejWtfenR7vviN.ttf" - }, - { - "family": "Libertinus Mono", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/libertinusmono/v1/_gPg1RnxrjY_TDm97ApTqwneJJFToBF3YROW_w.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/libertinusmono/v1/_gPg1RnxrjY_TDm97ApTqwneJJFjoRtz.ttf" - }, - { - "family": "Libertinus Sans", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-07-30", - "files": { - "regular": "https://fonts.gstatic.com/s/libertinussans/v1/YA9Lr0-a6k7ZLbw_dle4knJh2cqMjt3V_dB0Yw.ttf", - "italic": "https://fonts.gstatic.com/s/libertinussans/v1/YA9Jr0-a6k7ZLbw_dle4knJh2cq8jNfR39VkYzCp.ttf", - "700": "https://fonts.gstatic.com/s/libertinussans/v1/YA9Or0-a6k7ZLbw_dle4knJh2cq0MvLx9ftoaimwmw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/libertinussans/v1/YA9Lr0-a6k7ZLbw_dle4knJh2cq8j9fR.ttf" - }, - { - "family": "Libertinus Serif", - "variants": [ - "regular", - "italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-07-30", - "files": { - "regular": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpkK4bw7KinajYBg0RTTwCLF5Ben6kFUHPIFaU.ttf", - "italic": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpiK4bw7KinajYBg0RTTwCLF5Ber6sPVFHNBaVImA.ttf", - "600": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpjK4bw7KinajYBg0RTTwCLF5Bep3ErdHvjCaxRgew.ttf", - "600italic": "https://fonts.gstatic.com/s/libertinusserif/v1/RLphK4bw7KinajYBg0RTTwCLF5Ber6s3jH_pDY5UkexwPg.ttf", - "700": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpjK4bw7KinajYBg0RTTwCLF5BepxUqdHvjCaxRgew.ttf", - "700italic": "https://fonts.gstatic.com/s/libertinusserif/v1/RLphK4bw7KinajYBg0RTTwCLF5Ber6s36H7pDY5UkexwPg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpkK4bw7KinajYBg0RTTwCLF5Ber6gPVA.ttf" - }, - { - "family": "Libertinus Serif Display", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/libertinusserifdisplay/v2/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcrg81gHhVOxQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/libertinusserifdisplay/v2/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbgsdk.ttf" - }, - { - "family": "Libre Barcode 128", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v31", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/librebarcode128/v31/cIfnMbdUsUoiW3O_hVviCwVjuLtXeJ_A_gMk0izH.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librebarcode128/v31/cIfnMbdUsUoiW3O_hVviCwVjuLtXeK_B9Ac.ttf" - }, - { - "family": "Libre Barcode 128 Text", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v31", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/librebarcode128text/v31/fdNv9tubt3ZEnz1Gu3I4-zppwZ9CWZ16Z0w5cV3Y6M90w4k.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librebarcode128text/v31/fdNv9tubt3ZEnz1Gu3I4-zppwZ9CWZ16Z0w5QVzS7A.ttf" - }, - { - "family": "Libre Barcode 39", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v25", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/librebarcode39/v25/-nFnOHM08vwC6h8Li1eQnP_AHzI2K_d709jy92k.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librebarcode39/v25/-nFnOHM08vwC6h8Li1eQnP_AHzI2G_Zx1w.ttf" - }, - { - "family": "Libre Barcode 39 Extended", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v30", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/librebarcode39extended/v30/8At7Gt6_O5yNS0-K4Nf5U922qSzhJ3dUdfJpwNUgfNRCOZ1GOBw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librebarcode39extended/v30/8At7Gt6_O5yNS0-K4Nf5U922qSzhJ3dUdfJpwNUgTNVIPQ.ttf" - }, - { - "family": "Libre Barcode 39 Extended Text", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v30", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/librebarcode39extendedtext/v30/eLG1P_rwIgOiDA7yrs9LoKaYRVLQ1YldrrOnnL7xPO4jNP68fLIiPopNNA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librebarcode39extendedtext/v30/eLG1P_rwIgOiDA7yrs9LoKaYRVLQ1YldrrOnnL7xPO4jNP6Mfbgm.ttf" - }, - { - "family": "Libre Barcode 39 Text", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v32", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/librebarcode39text/v32/sJoa3KhViNKANw_E3LwoDXvs5Un0HQ1vT-031RRL-9rYaw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librebarcode39text/v32/sJoa3KhViNKANw_E3LwoDXvs5Un0HQ1vT-0H1B5P.ttf" - }, - { - "family": "Libre Barcode EAN13 Text", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v25", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/librebarcodeean13text/v25/wlpigxXFDU1_oCu9nfZytgIqSG0XRcJm_OQiB96PAGEki52WfA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librebarcodeean13text/v25/wlpigxXFDU1_oCu9nfZytgIqSG0XRcJm_OQiB96_AWsg.ttf" - }, - { - "family": "Libre Baskerville", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/librebaskerville/v17/kmKnZrc3Hgbbcjq75U4uslyuy4kn0pNeYRI4CN2V.ttf", - "italic": "https://fonts.gstatic.com/s/librebaskerville/v17/kmKhZrc3Hgbbcjq75U4uslyuy4kn0qNcaxYaDc2V2ro.ttf", - "700": "https://fonts.gstatic.com/s/librebaskerville/v17/kmKiZrc3Hgbbcjq75U4uslyuy4kn0qviTjYwI8Gcw6Oi.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librebaskerville/v17/kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNfaxY.ttf" - }, - { - "family": "Libre Bodoni", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6I1fwWzZcOb3U3s.ttf", - "500": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6L9fwWzZcOb3U3s.ttf", - "600": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6FNYwWzZcOb3U3s.ttf", - "700": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6GpYwWzZcOb3U3s.ttf", - "italic": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm4-H45qDWDYULr5OfyZud9xBKfuwNnnsVZ_UUcKS_TdMTyQ3syLg.ttf", - "500italic": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm4-H45qDWDYULr5OfyZud9xBKfuwNnnsVZ_UUcGy_TdMTyQ3syLg.ttf", - "600italic": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm4-H45qDWDYULr5OfyZud9xBKfuwNnnsVZ_UUc9yjTdMTyQ3syLg.ttf", - "700italic": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm4-H45qDWDYULr5OfyZud9xBKfuwNnnsVZ_UUczijTdMTyQ3syLg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6I1f8W3TdA.ttf" - }, - { - "family": "Libre Caslon Display", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/librecaslondisplay/v18/TuGOUUFxWphYQ6YI6q9Xp61FQzxDRKmzr2lRdRhtCC4d.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librecaslondisplay/v18/TuGOUUFxWphYQ6YI6q9Xp61FQzxDRKmzr1lQfxw.ttf" - }, - { - "family": "Libre Caslon Text", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/librecaslontext/v5/DdT878IGsGw1aF1JU10PUbTvNNaDMcq_3eNrHgO1.ttf", - "italic": "https://fonts.gstatic.com/s/librecaslontext/v5/DdT678IGsGw1aF1JU10PUbTvNNaDMfq91-dJGxO1q9o.ttf", - "700": "https://fonts.gstatic.com/s/librecaslontext/v5/DdT578IGsGw1aF1JU10PUbTvNNaDMfID8sdjNR-8ssPt.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librecaslontext/v5/DdT878IGsGw1aF1JU10PUbTvNNaDMfq-1-c.ttf" - }, - { - "family": "Libre Franklin", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhLsSUB9rIb-JH1g.ttf", - "200": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhrsWUB9rIb-JH1g.ttf", - "300": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhcMWUB9rIb-JH1g.ttf", - "regular": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhLsWUB9rIb-JH1g.ttf", - "500": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhHMWUB9rIb-JH1g.ttf", - "600": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduh8MKUB9rIb-JH1g.ttf", - "700": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhycKUB9rIb-JH1g.ttf", - "800": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhrsKUB9rIb-JH1g.ttf", - "900": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhh8KUB9rIb-JH1g.ttf", - "100italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oZ8RdDMTedX1sGE.ttf", - "200italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05ob8RNDMTedX1sGE.ttf", - "300italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oYiRNDMTedX1sGE.ttf", - "italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oZ8RNDMTedX1sGE.ttf", - "500italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oZORNDMTedX1sGE.ttf", - "600italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oaiQ9DMTedX1sGE.ttf", - "700italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oabQ9DMTedX1sGE.ttf", - "800italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05ob8Q9DMTedX1sGE.ttf", - "900italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05obVQ9DMTedX1sGE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhLsWkBtDM.ttf" - }, - { - "family": "Licorice", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/licorice/v8/t5tjIR8TMomTCAyjNk23hqLgzCHu.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/licorice/v8/t5tjIR8TMomTCAyjNn22jKY.ttf" - }, - { - "family": "Life Savers", - "variants": [ - "regular", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/lifesavers/v23/ZXuie1UftKKabUQMgxAal_lrFgpbuNvB.ttf", - "700": "https://fonts.gstatic.com/s/lifesavers/v23/ZXu_e1UftKKabUQMgxAal8HXOS5Tk8fIpPRW.ttf", - "800": "https://fonts.gstatic.com/s/lifesavers/v23/ZXu_e1UftKKabUQMgxAal8HLOi5Tk8fIpPRW.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lifesavers/v23/ZXuie1UftKKabUQMgxAal8lqHA4.ttf" - }, - { - "family": "Lilita One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/lilitaone/v17/i7dPIFZ9Zz-WBtRtedDbUEZ2RFq7AwU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lilitaone/v17/i7dPIFZ9Zz-WBtRtedDbYEd8QA.ttf" - }, - { - "family": "Lily Script One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/lilyscriptone/v16/LhW9MV7ZMfIPdMxeBjBvFN8SXLS4gsSjQNsRMg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lilyscriptone/v16/LhW9MV7ZMfIPdMxeBjBvFN8SXLSIg86n.ttf" - }, - { - "family": "Limelight", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/limelight/v21/XLYkIZL7aopJVbZJHDuYPeNGrnY2TA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/limelight/v21/XLYkIZL7aopJVbZJHDuoPOlC.ttf" - }, - { - "family": "Linden Hill", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/lindenhill/v27/-F61fjxoKSg9Yc3hZgO8ygFI7CwC009k.ttf", - "italic": "https://fonts.gstatic.com/s/lindenhill/v27/-F63fjxoKSg9Yc3hZgO8yjFK5igg1l9kn-s.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lindenhill/v27/-F61fjxoKSg9Yc3hZgO8yjFJ5ig.ttf" - }, - { - "family": "Linefont", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin" - ], - "version": "v10", - "lastModified": "2025-09-17", - "files": { - "100": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY4UNbu7tmdXux3U.ttf", - "200": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnYwUMbu7tmdXux3U.ttf", - "300": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY9sMbu7tmdXux3U.ttf", - "regular": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY4UMbu7tmdXux3U.ttf", - "500": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY7cMbu7tmdXux3U.ttf", - "600": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY1sLbu7tmdXux3U.ttf", - "700": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY2ILbu7tmdXux3U.ttf", - "800": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnYwULbu7tmdXux3U.ttf", - "900": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnYywLbu7tmdXux3U.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY4UMXu_nnQ.ttf" - }, - { - "family": "Lisu Bosa", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "lisu" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "200": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXX2DGRdbY1P1Sbg.ttf", - "200italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXkuRNzc9vhCblye.ttf", - "300": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXO2PGRdbY1P1Sbg.ttf", - "300italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXlKR9zc9vhCblye.ttf", - "regular": "https://fonts.gstatic.com/s/lisubosa/v2/3XFoErkv240fsdmJRJQvl0viTf3E3Q.ttf", - "italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFuErkv240fsdmJRJQflUHmb_jU3eRL.ttf", - "500": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXY2LGRdbY1P1Sbg.ttf", - "500italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXkSRtzc9vhCblye.ttf", - "600": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXT2XGRdbY1P1Sbg.ttf", - "600italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXk-Qdzc9vhCblye.ttf", - "700": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXK2TGRdbY1P1Sbg.ttf", - "700italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXlaQNzc9vhCblye.ttf", - "800": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXN2fGRdbY1P1Sbg.ttf", - "800italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXlGQ9zc9vhCblye.ttf", - "900": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXE2bGRdbY1P1Sbg.ttf", - "900italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXliQtzc9vhCblye.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lisubosa/v2/3XFoErkv240fsdmJRJQflkHm.ttf" - }, - { - "family": "Liter", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/liter/v4/SLXGc1nX4GQ4d2ImRJqExst1.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/liter/v4/SLXGc1nX4GQ4d1InTp4.ttf" - }, - { - "family": "Literata", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v40", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbJG_F_bcTWCWp8g.ttf", - "300": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbE-_F_bcTWCWp8g.ttf", - "regular": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbBG_F_bcTWCWp8g.ttf", - "500": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbCO_F_bcTWCWp8g.ttf", - "600": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbM-4F_bcTWCWp8g.ttf", - "700": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbPa4F_bcTWCWp8g.ttf", - "800": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbJG4F_bcTWCWp8g.ttf", - "900": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbLi4F_bcTWCWp8g.ttf", - "200italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8f7XWSUKTt8iVow.ttf", - "300italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8obXWSUKTt8iVow.ttf", - "italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8_7XWSUKTt8iVow.ttf", - "500italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8zbXWSUKTt8iVow.ttf", - "600italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8IbLWSUKTt8iVow.ttf", - "700italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8GLLWSUKTt8iVow.ttf", - "800italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8f7LWSUKTt8iVow.ttf", - "900italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8VrLWSUKTt8iVow.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbBG_J_fWSQ.ttf" - }, - { - "family": "Liu Jian Mao Cao", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-simplified", - "latin" - ], - "version": "v24", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/liujianmaocao/v24/845DNN84HJrccNonurqXILGpvCOoferVKGWsUo8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/liujianmaocao/v24/845DNN84HJrccNonurqXILGpvCOoTevfLA.ttf" - }, - { - "family": "Livvic", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/livvic/v15/rnCr-x1S2hzjrlffC-M-mHnOSOuk.ttf", - "100italic": "https://fonts.gstatic.com/s/livvic/v15/rnCt-x1S2hzjrlfXbdtakn3sTfukQHs.ttf", - "200": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlffp8IeslfCQfK9WQ.ttf", - "200italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbdv2s13GY_etWWIJ.ttf", - "300": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlffw8EeslfCQfK9WQ.ttf", - "300italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbduSsF3GY_etWWIJ.ttf", - "regular": "https://fonts.gstatic.com/s/livvic/v15/rnCp-x1S2hzjrlfnb-k6unzeSA.ttf", - "italic": "https://fonts.gstatic.com/s/livvic/v15/rnCr-x1S2hzjrlfXbeM-mHnOSOuk.ttf", - "500": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlffm8AeslfCQfK9WQ.ttf", - "500italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbdvKsV3GY_etWWIJ.ttf", - "600": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlfft8ceslfCQfK9WQ.ttf", - "600italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbdvmtl3GY_etWWIJ.ttf", - "700": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlff08YeslfCQfK9WQ.ttf", - "700italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbduCt13GY_etWWIJ.ttf", - "900": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlff68QeslfCQfK9WQ.ttf", - "900italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbdu6tV3GY_etWWIJ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/livvic/v15/rnCp-x1S2hzjrlfXbuM-.ttf" - }, - { - "family": "Lobster", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v32", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/lobster/v32/neILzCirqoswsqX9_oWsMqEzSJQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lobster/v32/neILzCirqoswsqX9zoSmNg.ttf" - }, - { - "family": "Lobster Two", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/lobstertwo/v22/BngMUXZGTXPUvIoyV6yN59fK7KSJ4ACD.ttf", - "italic": "https://fonts.gstatic.com/s/lobstertwo/v22/BngOUXZGTXPUvIoyV6yN5-fI5qCr5RCDY_k.ttf", - "700": "https://fonts.gstatic.com/s/lobstertwo/v22/BngRUXZGTXPUvIoyV6yN5-92w4CByxyKeuDp.ttf", - "700italic": "https://fonts.gstatic.com/s/lobstertwo/v22/BngTUXZGTXPUvIoyV6yN5-fI3hyEwRiof_DpXMY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lobstertwo/v22/BngMUXZGTXPUvIoyV6yN5-fL5qA.ttf" - }, - { - "family": "Londrina Outline", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v29", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/londrinaoutline/v29/C8c44dM8vmb14dfsZxhetg3pDH-SfuoxrSKMDvI.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/londrinaoutline/v29/C8c44dM8vmb14dfsZxhetg3pDH-STus7qQ.ttf" - }, - { - "family": "Londrina Shadow", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/londrinashadow/v28/oPWX_kB4kOQoWNJmjxLV5JuoCUlXRlaSxkrMCQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/londrinashadow/v28/oPWX_kB4kOQoWNJmjxLV5JuoCUlnR1yW.ttf" - }, - { - "family": "Londrina Sketch", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/londrinasketch/v27/c4m41npxGMTnomOHtRU68eIJn8qfWWn5Pos6CA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/londrinasketch/v27/c4m41npxGMTnomOHtRU68eIJn8qvWGP9.ttf" - }, - { - "family": "Londrina Solid", - "variants": [ - "100", - "300", - "regular", - "900" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/londrinasolid/v19/flUjRq6sw40kQEJxWNgkLuudGfs9KBYesZHhV64.ttf", - "300": "https://fonts.gstatic.com/s/londrinasolid/v19/flUiRq6sw40kQEJxWNgkLuudGfv1CjY0n53oTrcL.ttf", - "regular": "https://fonts.gstatic.com/s/londrinasolid/v19/flUhRq6sw40kQEJxWNgkLuudGcNZIhI8tIHh.ttf", - "900": "https://fonts.gstatic.com/s/londrinasolid/v19/flUiRq6sw40kQEJxWNgkLuudGfvdDzY0n53oTrcL.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/londrinasolid/v19/flUhRq6sw40kQEJxWNgkLuudGfNYKBY.ttf" - }, - { - "family": "Long Cang", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-simplified", - "latin" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/longcang/v21/LYjAdGP8kkgoTec8zkRgrXArXN7HWQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/longcang/v21/LYjAdGP8kkgoTec8zkRQrHov.ttf" - }, - { - "family": "Lora", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v37", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787weuyJGmKxemMeZ.ttf", - "500": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787wsuyJGmKxemMeZ.ttf", - "600": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787zAvCJGmKxemMeZ.ttf", - "700": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787z5vCJGmKxemMeZ.ttf", - "italic": "https://fonts.gstatic.com/s/lora/v37/0QI8MX1D_JOuMw_hLdO6T2wV9KnW-MoFkqh8ndeZzZ0.ttf", - "500italic": "https://fonts.gstatic.com/s/lora/v37/0QI8MX1D_JOuMw_hLdO6T2wV9KnW-PgFkqh8ndeZzZ0.ttf", - "600italic": "https://fonts.gstatic.com/s/lora/v37/0QI8MX1D_JOuMw_hLdO6T2wV9KnW-BQCkqh8ndeZzZ0.ttf", - "700italic": "https://fonts.gstatic.com/s/lora/v37/0QI8MX1D_JOuMw_hLdO6T2wV9KnW-C0Ckqh8ndeZzZ0.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787weuxJHkqg.ttf" - }, - { - "family": "Love Light", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/lovelight/v8/t5tlIR0TNJyZWimpNAXDjKbCyTHuspo.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lovelight/v8/t5tlIR0TNJyZWimpNAXDvKfIzQ.ttf" - }, - { - "family": "Love Ya Like A Sister", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/loveyalikeasister/v23/R70EjzUBlOqPeouhFDfR80-0FhOqJubN-Be78nZcsGGycA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/loveyalikeasister/v23/R70EjzUBlOqPeouhFDfR80-0FhOqJubN-BeL83xY.ttf" - }, - { - "family": "Loved by the King", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/lovedbytheking/v24/Gw6gwdP76VDVJNXerebZxUMeRXUF2PiNlXFu2R64.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lovedbytheking/v24/Gw6gwdP76VDVJNXerebZxUMeRXUF2MiMn3U.ttf" - }, - { - "family": "Lovers Quarrel", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/loversquarrel/v25/Yq6N-LSKXTL-5bCy8ksBzpQ_-zAsY7pO6siz.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/loversquarrel/v25/Yq6N-LSKXTL-5bCy8ksBzpQ_-wAtab4.ttf" - }, - { - "family": "Luckiest Guy", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/luckiestguy/v25/_gP_1RrxsjcxVyin9l9n_j2RStR3qDpraA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/luckiestguy/v25/_gP_1RrxsjcxVyin9l9n_j2hS95z.ttf" - }, - { - "family": "Lugrasimo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/lugrasimo/v5/qkBXXvoF_s_eT9c7Y7ae5JRLkAXbMQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lugrasimo/v5/qkBXXvoF_s_eT9c7Y7au5Z5P.ttf" - }, - { - "family": "Lumanosimo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/lumanosimo/v5/K2F0fZBYg_JDSEZHEfO8AoqKAyLzfWo.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lumanosimo/v5/K2F0fZBYg_JDSEZHEfO8MouABw.ttf" - }, - { - "family": "Lunasima", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/lunasima/v1/wEO-EBvPh9RSOj7JFAwle94H1VIe.ttf", - "700": "https://fonts.gstatic.com/s/lunasima/v1/wEO5EBvPh9RSOj7JFDSZVPoP_k4XiKvO.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lunasima/v1/wEO-EBvPh9RSOj7JFDwkcdo.ttf" - }, - { - "family": "Lusitana", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v14", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/lusitana/v14/CSR84z9ShvucWzsMKxhaRuMiSct_.ttf", - "700": "https://fonts.gstatic.com/s/lusitana/v14/CSR74z9ShvucWzsMKyDmaccqYtd2vfwk.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lusitana/v14/CSR84z9ShvucWzsMKyhbTOc.ttf" - }, - { - "family": "Lustria", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/lustria/v14/9oRONYodvDEyjuhOrCg5MtPyAcg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/lustria/v14/9oRONYodvDEyjuhOnCkzNg.ttf" - }, - { - "family": "Luxurious Roman", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v10", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/luxuriousroman/v10/buEupou_ZcP1w0yTKxJJokVSmbpqYgckeo9RMw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/luxuriousroman/v10/buEupou_ZcP1w0yTKxJJokVSmbpaYw0g.ttf" - }, - { - "family": "Luxurious Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/luxuriousscript/v9/ahcCv9e7yydulT32KZ0rBIoD7DzMg0rOby1JtYk.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/luxuriousscript/v9/ahcCv9e7yydulT32KZ0rBIoD7DzMs0vEaw.ttf" - }, - { - "family": "M PLUS 1", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5VSe78nZcsGGycA.ttf", - "200": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW51Sa78nZcsGGycA.ttf", - "300": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5Cya78nZcsGGycA.ttf", - "regular": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5VSa78nZcsGGycA.ttf", - "500": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5Zya78nZcsGGycA.ttf", - "600": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5iyG78nZcsGGycA.ttf", - "700": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5siG78nZcsGGycA.ttf", - "800": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW51SG78nZcsGGycA.ttf", - "900": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5_CG78nZcsGGycA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5VSaL83xY.ttf" - }, - { - "family": "M PLUS 1 Code", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7iN0XHpapwmdZhY.ttf", - "200": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7gN0HHpapwmdZhY.ttf", - "300": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7jT0HHpapwmdZhY.ttf", - "regular": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7iN0HHpapwmdZhY.ttf", - "500": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7i_0HHpapwmdZhY.ttf", - "600": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7hT13HpapwmdZhY.ttf", - "700": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7hq13HpapwmdZhY.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7iN0EHoYJg.ttf" - }, - { - "family": "M PLUS 1p", - "variants": [ - "100", - "300", - "regular", - "500", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "hebrew", - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v32", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/mplus1p/v32/e3tleuShHdiFyPFzBRrQnDQAUW3aq-5N.ttf", - "300": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQVBYge0PWovdU4w.ttf", - "regular": "https://fonts.gstatic.com/s/mplus1p/v32/e3tjeuShHdiFyPFzBRro-D4Ec2jKqw.ttf", - "500": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQDBcge0PWovdU4w.ttf", - "700": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQRBEge0PWovdU4w.ttf", - "800": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQWBIge0PWovdU4w.ttf", - "900": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQfBMge0PWovdU4w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mplus1p/v32/e3tjeuShHdiFyPFzBRrY-TQA.ttf" - }, - { - "family": "M PLUS 2", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwOa-VxlqHrzNgAw.ttf", - "200": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwua6VxlqHrzNgAw.ttf", - "300": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwZ66VxlqHrzNgAw.ttf", - "regular": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwOa6VxlqHrzNgAw.ttf", - "500": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwC66VxlqHrzNgAw.ttf", - "600": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkw56mVxlqHrzNgAw.ttf", - "700": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkw3qmVxlqHrzNgAw.ttf", - "800": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwuamVxlqHrzNgAw.ttf", - "900": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwkKmVxlqHrzNgAw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwOa6lx1CD.ttf" - }, - { - "family": "M PLUS Code Latin", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1EbB6i5MqF9TRwg.ttf", - "200": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1MbA6i5MqF9TRwg.ttf", - "300": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1BjA6i5MqF9TRwg.ttf", - "regular": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1EbA6i5MqF9TRwg.ttf", - "500": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1HTA6i5MqF9TRwg.ttf", - "600": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1JjH6i5MqF9TRwg.ttf", - "700": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1KHH6i5MqF9TRwg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1EbA2i9GrA.ttf" - }, - { - "family": "M PLUS Rounded 1c", - "variants": [ - "100", - "300", - "regular", - "500", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "hebrew", - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-06-25", - "files": { - "100": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGCAYIAV6gnpUpoWwNkYvrugw9RuM3ixLsg6-av1x0.ttf", - "300": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM0q5psKxeqmzgRK.ttf", - "regular": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGEAYIAV6gnpUpoWwNkYvrugw9RuPWGzr8C7vav.ttf", - "500": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM1y55sKxeqmzgRK.ttf", - "700": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM064ZsKxeqmzgRK.ttf", - "800": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM0m4psKxeqmzgRK.ttf", - "900": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM0C45sKxeqmzgRK.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGEAYIAV6gnpUpoWwNkYvrugw9RuMWHxLs.ttf" - }, - { - "family": "Ma Shan Zheng", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-simplified", - "latin" - ], - "version": "v14", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMTsDIRSfr0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXadMXmCA.ttf" - }, - { - "family": "Macondo", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/macondo/v27/RrQQboN9-iB1IXmOS2XO0LBBd4Y.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/macondo/v27/RrQQboN9-iB1IXmOe2TE1A.ttf" - }, - { - "family": "Macondo Swash Caps", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/macondoswashcaps/v26/6NUL8EaAJgGKZA7lpt941Z9s6ZYgDq6Oekoa_mm5bA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/macondoswashcaps/v26/6NUL8EaAJgGKZA7lpt941Z9s6ZYgDq6-e0Ae.ttf" - }, - { - "family": "Mada", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFlOkHkw2-m9x2iC.ttf", - "300": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFmQkHkw2-m9x2iC.ttf", - "regular": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFnOkHkw2-m9x2iC.ttf", - "500": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFn8kHkw2-m9x2iC.ttf", - "600": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFkQl3kw2-m9x2iC.ttf", - "700": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFkpl3kw2-m9x2iC.ttf", - "800": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFlOl3kw2-m9x2iC.ttf", - "900": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFlnl3kw2-m9x2iC.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFnOkEkx0e0.ttf" - }, - { - "family": "Madimi One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/madimione/v1/2V0YKIEADpA8U6RygDnZZFQoBoHMd2U.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/madimione/v1/2V0YKIEADpA8U6RygDnZVFUiAg.ttf" - }, - { - "family": "Magra", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/magra/v15/uK_94ruaZus72k5xIDMfO-ed.ttf", - "700": "https://fonts.gstatic.com/s/magra/v15/uK_w4ruaZus72nbNDxcXEPuUX1ow.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/magra/v15/uK_94ruaZus72n5wKjc.ttf" - }, - { - "family": "Maiden Orange", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v32", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/maidenorange/v32/kJE1BuIX7AUmhi2V4m08kb1XjOZdCZS8FY8.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/maidenorange/v32/kJE1BuIX7AUmhi2V4m08kb1XvOdXDQ.ttf" - }, - { - "family": "Maitree", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrklhGNWJGovLdh6OE.ttf", - "300": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrklnWOWJGovLdh6OE.ttf", - "regular": "https://fonts.gstatic.com/s/maitree/v11/MjQGmil5tffhpBrkrtmmfJmDoL4.ttf", - "500": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrkli2PWJGovLdh6OE.ttf", - "600": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrklgGIWJGovLdh6OE.ttf", - "700": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrklmWJWJGovLdh6OE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/maitree/v11/MjQGmil5tffhpBrkntiseA.ttf" - }, - { - "family": "Major Mono Display", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/majormonodisplay/v18/RWmVoLyb5fEqtsfBX9PDZIGr2tFubRhLCn2QIndPww.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/majormonodisplay/v18/RWmVoLyb5fEqtsfBX9PDZIGr2tFubRh7C3eU.ttf" - }, - { - "family": "Mako", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/mako/v19/H4coBX6Mmc_Z0ST09g478Lo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mako/v19/H4coBX6Mmc_Z4SX-8g.ttf" - }, - { - "family": "Mali", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QOLlKlRaJdbWgdY.ttf", - "200italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj8wlVQIfTTkdbJYA.ttf", - "300": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QIbmKlRaJdbWgdY.ttf", - "300italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj8plZQIfTTkdbJYA.ttf", - "regular": "https://fonts.gstatic.com/s/mali/v13/N0ba2SRONuN4eCrODlxxOd8.ttf", - "italic": "https://fonts.gstatic.com/s/mali/v13/N0bU2SRONuN4SCjECn50Kd_PmA.ttf", - "500": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QN7nKlRaJdbWgdY.ttf", - "500italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj8_ldQIfTTkdbJYA.ttf", - "600": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QPLgKlRaJdbWgdY.ttf", - "600italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj80lBQIfTTkdbJYA.ttf", - "700": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QJbhKlRaJdbWgdY.ttf", - "700italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj8tlFQIfTTkdbJYA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mali/v13/N0ba2SRONuN4SCvECg.ttf" - }, - { - "family": "Mallanna", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v15", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/mallanna/v15/hv-Vlzx-KEQb84YaDGwzEzRwVvJ-.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mallanna/v15/hv-Vlzx-KEQb84YaDFwyGTA.ttf" - }, - { - "family": "Maname", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "sinhala", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/maname/v2/gNMFW3J8RpCx9my42FkGGI6q_Q.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/maname/v2/gNMFW3J8RpCx9myI2VMC.ttf" - }, - { - "family": "Mandali", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/mandali/v16/LhWlMVbYOfASNfNUVFk1ZPdcKtA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mandali/v16/LhWlMVbYOfASNfNUZFg_YA.ttf" - }, - { - "family": "Manjari", - "variants": [ - "100", - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "malayalam" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/manjari/v14/k3kSo8UPMOBO2w1UdbroK2vFIaOV8A.ttf", - "regular": "https://fonts.gstatic.com/s/manjari/v14/k3kQo8UPMOBO2w1UTd7iL0nAMaM.ttf", - "700": "https://fonts.gstatic.com/s/manjari/v14/k3kVo8UPMOBO2w1UdWLNC0HrLaqM6Q4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/manjari/v14/k3kQo8UPMOBO2w1Ufd_oKw.ttf" - }, - { - "family": "Manrope", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk59FO_F87jxeN7B.ttf", - "300": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk6jFO_F87jxeN7B.ttf", - "regular": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FO_F87jxeN7B.ttf", - "500": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk7PFO_F87jxeN7B.ttf", - "600": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk4jE-_F87jxeN7B.ttf", - "700": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk4aE-_F87jxeN7B.ttf", - "800": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk59E-_F87jxeN7B.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_E-bw.ttf" - }, - { - "family": "Mansalva", - "variants": [ - "regular" - ], - "subsets": [ - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/mansalva/v16/aWB4m0aacbtDfvq5NJllI47vdyBg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mansalva/v16/aWB4m0aacbtDfvq5NKlkKYo.ttf" - }, - { - "family": "Manuale", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v31", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeG6e7wD1TB_JHHY.ttf", - "regular": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeHke7wD1TB_JHHY.ttf", - "500": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeHWe7wD1TB_JHHY.ttf", - "600": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeE6fLwD1TB_JHHY.ttf", - "700": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeEDfLwD1TB_JHHY.ttf", - "800": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeFkfLwD1TB_JHHY.ttf", - "300italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOApA3zRdIWHYr8M.ttf", - "italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOFRA3zRdIWHYr8M.ttf", - "500italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOGZA3zRdIWHYr8M.ttf", - "600italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOIpH3zRdIWHYr8M.ttf", - "700italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOLNH3zRdIWHYr8M.ttf", - "800italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsONRH3zRdIWHYr8M.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeHke4wC3zQ.ttf" - }, - { - "family": "Manufacturing Consent", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/manufacturingconsent/v1/N0bL2TVONuFkPkuHfiECSLCwuZS-D-IsakikR6QvbfFYLA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/manufacturingconsent/v1/N0bL2TVONuFkPkuHfiECSLCwuZS-D-IsakiURq4r.ttf" - }, - { - "family": "Marcellus", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/marcellus/v14/wEO_EBrOk8hQLDvIAF8FUfAL3EsHiA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/marcellus/v14/wEO_EBrOk8hQLDvIAF81UPoP.ttf" - }, - { - "family": "Marcellus SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/marcellussc/v14/ke8iOgUHP1dg-Rmi6RWjbLEPgdydGKikhA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/marcellussc/v14/ke8iOgUHP1dg-Rmi6RWjbLE_gNaZ.ttf" - }, - { - "family": "Marck Script", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/marckscript/v22/nwpTtK2oNgBA3Or78gapdwuCzyI-aMPF7Q.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/marckscript/v22/nwpTtK2oNgBA3Or78gapdwuyzig6.ttf" - }, - { - "family": "Margarine", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/margarine/v27/qkBXXvoE6trLT9Y7YLye5JRLkAXbMQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/margarine/v27/qkBXXvoE6trLT9Y7YLyu5Z5P.ttf" - }, - { - "family": "Marhey", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBZVwO2cXiGevOMw.ttf", - "regular": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBctwO2cXiGevOMw.ttf", - "500": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBflwO2cXiGevOMw.ttf", - "600": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBRV3O2cXiGevOMw.ttf", - "700": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBSx3O2cXiGevOMw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBctwC2YdjA.ttf" - }, - { - "family": "Markazi Text", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v28", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtfSQT4MlBekmJLo.ttf", - "500": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtcaQT4MlBekmJLo.ttf", - "600": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtSqXT4MlBekmJLo.ttf", - "700": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtROXT4MlBekmJLo.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtfSQf4IvAQ.ttf" - }, - { - "family": "Marko One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/markoone/v24/9Btq3DFG0cnVM5lw1haaKpUfrHPzUw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/markoone/v24/9Btq3DFG0cnVM5lw1haqK58b.ttf" - }, - { - "family": "Marmelad", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/marmelad/v19/Qw3eZQdSHj_jK2e-8tFLG-YMC0R8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/marmelad/v19/Qw3eZQdSHj_jK2e-8uFKEeI.ttf" - }, - { - "family": "Martel", - "variants": [ - "200", - "300", - "regular", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XVqekahRbX9vnDzw.ttf", - "300": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XVzeoahRbX9vnDzw.ttf", - "regular": "https://fonts.gstatic.com/s/martel/v12/PN_xRfK9oXHga0XtYcI-jT3L_w.ttf", - "600": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XVuewahRbX9vnDzw.ttf", - "700": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XV3e0ahRbX9vnDzw.ttf", - "800": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XVwe4ahRbX9vnDzw.ttf", - "900": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XV5e8ahRbX9vnDzw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/martel/v12/PN_xRfK9oXHga0XdYMg6.ttf" - }, - { - "family": "Martel Sans", - "variants": [ - "200", - "300", - "regular", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hAX5suHFUknqMxQ.ttf", - "300": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hBz5cuHFUknqMxQ.ttf", - "regular": "https://fonts.gstatic.com/s/martelsans/v14/h0GsssGi7VdzDgKjM-4d8ijfze-PPlUu.ttf", - "600": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hAH48uHFUknqMxQ.ttf", - "700": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hBj4suHFUknqMxQ.ttf", - "800": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hB_4cuHFUknqMxQ.ttf", - "900": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hBb4MuHFUknqMxQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/martelsans/v14/h0GsssGi7VdzDgKjM-4d8hjex-s.ttf" - }, - { - "family": "Martian Mono", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY1qus6WD75kdpF2.ttf", - "200": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY3qu86WD75kdpF2.ttf", - "300": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY00u86WD75kdpF2.ttf", - "regular": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY1qu86WD75kdpF2.ttf", - "500": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY1Yu86WD75kdpF2.ttf", - "600": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY20vM6WD75kdpF2.ttf", - "700": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY2NvM6WD75kdpF2.ttf", - "800": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY3qvM6WD75kdpF2.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY1qu_6XBbo.ttf" - }, - { - "family": "Marvel", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/marvel/v17/nwpVtKeoNgBV0qaIkV7ED366zg.ttf", - "italic": "https://fonts.gstatic.com/s/marvel/v17/nwpXtKeoNgBV0qa4k1TALXuqzhA7.ttf", - "700": "https://fonts.gstatic.com/s/marvel/v17/nwpWtKeoNgBV0qawLXHgB1WmxwkiYQ.ttf", - "700italic": "https://fonts.gstatic.com/s/marvel/v17/nwpQtKeoNgBV0qa4k2x8Al-i5QwyYdrc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/marvel/v17/nwpVtKeoNgBV0qa4kFTA.ttf" - }, - { - "family": "Matangi", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-08-26", - "files": { - "300": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7PICDYwI8Gcw6Oi.ttf", - "regular": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7OWCDYwI8Gcw6Oi.ttf", - "500": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7OkCDYwI8Gcw6Oi.ttf", - "600": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7NIDzYwI8Gcw6Oi.ttf", - "700": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7NxDzYwI8Gcw6Oi.ttf", - "800": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7MWDzYwI8Gcw6Oi.ttf", - "900": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7M_DzYwI8Gcw6Oi.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7OWCAYxKcU.ttf" - }, - { - "family": "Mate", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/mate/v19/m8JdjftRd7WZ2z28WoXSaLU.ttf", - "italic": "https://fonts.gstatic.com/s/mate/v19/m8JTjftRd7WZ6z-2XqfXeLVdbw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mate/v19/m8JdjftRd7WZ6zy2Xg.ttf" - }, - { - "family": "Mate SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/matesc/v23/-nF8OGQ1-uoVr2wKyiXZ95OkJwA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/matesc/v23/-nF8OGQ1-uoVr2wK-iTT8w.ttf" - }, - { - "family": "Matemasie", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/matemasie/v4/OD5BuMCN3ne3Gmr7dlL3rEq4DL6w2w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/matemasie/v4/OD5BuMCN3ne3Gmr7dlLHrUC8.ttf" - }, - { - "family": "Material Icons", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v145", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/materialicons/v145/flUhRq6tzZclQEJ-Vdg-IuiaDsNZIhI8tIHh.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/materialicons/v145/flUhRq6tzZclQEJ-Vdg-IuiaDvNYKBY.ttf" - }, - { - "family": "Material Icons Outlined", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v110", - "lastModified": "2025-06-17", - "files": { - "regular": "https://fonts.gstatic.com/s/materialiconsoutlined/v110/gok-H7zzDkdnRel8-DQ6KAXJ69wP1tGnf4ZGhUcdl5GuI2Ze.otf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/materialiconsoutlined/v110/gok-H7zzDkdnRel8-DQ6KAXJ69wP1tGnf4ZGhXcanZM.otf" - }, - { - "family": "Material Icons Round", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v109", - "lastModified": "2025-06-17", - "files": { - "regular": "https://fonts.gstatic.com/s/materialiconsround/v109/LDItaoyNOAY6Uewc665JcIzCKsKc_M9flwmMq_fTTvg-.otf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/materialiconsround/v109/LDItaoyNOAY6Uewc665JcIzCKsKc_M9flzmLofU.otf" - }, - { - "family": "Material Icons Sharp", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v110", - "lastModified": "2025-06-17", - "files": { - "regular": "https://fonts.gstatic.com/s/materialiconssharp/v110/oPWQ_lt5nv4pWNJpghLP75WiFR4kLh3kvmvSImEyc0vd.otf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/materialiconssharp/v110/oPWQ_lt5nv4pWNJpghLP75WiFR4kLh3kvlvVKGM.otf" - }, - { - "family": "Material Icons Two Tone", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v113", - "lastModified": "2025-06-17", - "files": { - "regular": "https://fonts.gstatic.com/s/materialiconstwotone/v113/hESh6WRmNCxEqUmNyh3JDeGxjVVyMg4tHGctNCu3NjDrH_77.otf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/materialiconstwotone/v113/hESh6WRmNCxEqUmNyh3JDeGxjVVyMg4tHGctNBuwPDI.otf", - "colorCapabilities": [ - "COLRv0" - ] - }, - { - "family": "Material Symbols", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-10-17", - "files": { - "100": "https://fonts.gstatic.com/s/materialsymbols/v17/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEHuRbn3PT2vOA.ttf", - "200": "https://fonts.gstatic.com/s/materialsymbols/v17/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNV3EDuRbn3PT2vOA.ttf", - "300": "https://fonts.gstatic.com/s/materialsymbols/v17/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVAkDuRbn3PT2vOA.ttf", - "regular": "https://fonts.gstatic.com/s/materialsymbols/v17/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEDuRbn3PT2vOA.ttf", - "500": "https://fonts.gstatic.com/s/materialsymbols/v17/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVbkDuRbn3PT2vOA.ttf", - "600": "https://fonts.gstatic.com/s/materialsymbols/v17/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVgkfuRbn3PT2vOA.ttf", - "700": "https://fonts.gstatic.com/s/materialsymbols/v17/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVu0fuRbn3PT2vOA.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/materialsymbols/v17/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEDeRLPz.ttf" - }, - { - "family": "Material Symbols Outlined", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v290", - "lastModified": "2025-10-17", - "files": { - "100": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v290/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHeembd5zrTgt.ttf", - "200": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v290/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDAvHOembd5zrTgt.ttf", - "300": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v290/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDDxHOembd5zrTgt.ttf", - "regular": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v290/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOembd5zrTgt.ttf", - "500": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v290/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCdHOembd5zrTgt.ttf", - "600": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v290/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDBxG-embd5zrTgt.ttf", - "700": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v290/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDBIG-embd5zrTgt.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v290/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHNenZ9o.ttf" - }, - { - "family": "Material Symbols Rounded", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v291", - "lastModified": "2025-10-17", - "files": { - "100": "https://fonts.gstatic.com/s/materialsymbolsrounded/v291/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIekXxKJKJBjAa8.ttf", - "200": "https://fonts.gstatic.com/s/materialsymbolsrounded/v291/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rAelXxKJKJBjAa8.ttf", - "300": "https://fonts.gstatic.com/s/materialsymbolsrounded/v291/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rNmlXxKJKJBjAa8.ttf", - "regular": "https://fonts.gstatic.com/s/materialsymbolsrounded/v291/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIelXxKJKJBjAa8.ttf", - "500": "https://fonts.gstatic.com/s/materialsymbolsrounded/v291/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rLWlXxKJKJBjAa8.ttf", - "600": "https://fonts.gstatic.com/s/materialsymbolsrounded/v291/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rFmiXxKJKJBjAa8.ttf", - "700": "https://fonts.gstatic.com/s/materialsymbolsrounded/v291/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rGCiXxKJKJBjAa8.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/materialsymbolsrounded/v291/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIelbxODLA.ttf" - }, - { - "family": "Material Symbols Sharp", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v287", - "lastModified": "2025-10-17", - "files": { - "100": "https://fonts.gstatic.com/s/materialsymbolssharp/v287/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLozCOJ1H7-knk.ttf", - "200": "https://fonts.gstatic.com/s/materialsymbolssharp/v287/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxMLojCOJ1H7-knk.ttf", - "300": "https://fonts.gstatic.com/s/materialsymbolssharp/v287/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxPVojCOJ1H7-knk.ttf", - "regular": "https://fonts.gstatic.com/s/materialsymbolssharp/v287/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLojCOJ1H7-knk.ttf", - "500": "https://fonts.gstatic.com/s/materialsymbolssharp/v287/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxO5ojCOJ1H7-knk.ttf", - "600": "https://fonts.gstatic.com/s/materialsymbolssharp/v287/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxNVpTCOJ1H7-knk.ttf", - "700": "https://fonts.gstatic.com/s/materialsymbolssharp/v287/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxNspTCOJ1H7-knk.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/materialsymbolssharp/v287/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLogCPLVU.ttf" - }, - { - "family": "Maven Pro", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v40", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX25nCpozp5GvU.ttf", - "500": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8Rf25nCpozp5GvU.ttf", - "600": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8fvx5nCpozp5GvU.ttf", - "700": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8cLx5nCpozp5GvU.ttf", - "800": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8aXx5nCpozp5GvU.ttf", - "900": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8Yzx5nCpozp5GvU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nGjpw.ttf" - }, - { - "family": "McLaren", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/mclaren/v19/2EbnL-ZuAXFqZFXISYYf8z2Yt_c.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mclaren/v19/2EbnL-ZuAXFqZFXIeYcV9w.ttf" - }, - { - "family": "Mea Culpa", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/meaculpa/v8/AMOTz4GcuWbEIuza8jsZms0QW3mqyg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/meaculpa/v8/AMOTz4GcuWbEIuza8jspm8cU.ttf" - }, - { - "family": "Meddon", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/meddon/v27/kmK8ZqA2EgDNeHTZhBdB3y_Aow.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/meddon/v27/kmK8ZqA2EgDNeHTphR1F.ttf" - }, - { - "family": "MedievalSharp", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/medievalsharp/v28/EvOJzAlL3oU5AQl2mP5KdgptAq96MwvXLDk.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/medievalsharp/v28/EvOJzAlL3oU5AQl2mP5KdgptMq5wNw.ttf" - }, - { - "family": "Medula One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/medulaone/v20/YA9Wr0qb5kjJM6l2V0yukiEqs7GtlvY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/medulaone/v20/YA9Wr0qb5kjJM6l2V0yuoiAgtw.ttf" - }, - { - "family": "Meera Inimai", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "tamil" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/meerainimai/v14/845fNMM5EIqOW5MPuvO3ILep_2jDVevnLQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/meerainimai/v14/845fNMM5EIqOW5MPuvO3ILeZ_mLH.ttf" - }, - { - "family": "Megrim", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/megrim/v18/46kulbz5WjvLqJZlbWXgd0RY1g.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/megrim/v18/46kulbz5WjvLqJZVbG_k.ttf" - }, - { - "family": "Meie Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/meiescript/v22/_LOImzDK7erRjhunIspaMjxn5IXg0WDz.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/meiescript/v22/_LOImzDK7erRjhunIspaMgxm7oE.ttf" - }, - { - "family": "Menbere", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "ethiopic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-06-25", - "files": { - "100": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdI_9qn1UnpeWOQ5.ttf", - "200": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdK_96n1UnpeWOQ5.ttf", - "300": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdJh96n1UnpeWOQ5.ttf", - "regular": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdI_96n1UnpeWOQ5.ttf", - "500": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdIN96n1UnpeWOQ5.ttf", - "600": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdLh8Kn1UnpeWOQ5.ttf", - "700": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdLY8Kn1UnpeWOQ5.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdI_95n0WH4.ttf" - }, - { - "family": "Meow Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/meowscript/v6/0FlQVPqanlaJrtr8AnJ0ESch0_0CfDf1.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/meowscript/v6/0FlQVPqanlaJrtr8AnJ0ERcg2fk.ttf" - }, - { - "family": "Merienda", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5JHhoSU78QGBV0A.ttf", - "regular": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5enhoSU78QGBV0A.ttf", - "500": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5SHhoSU78QGBV0A.ttf", - "600": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5pH9oSU78QGBV0A.ttf", - "700": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5nX9oSU78QGBV0A.ttf", - "800": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5-n9oSU78QGBV0A.ttf", - "900": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5039oSU78QGBV0A.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5enhYSET4.ttf" - }, - { - "family": "Merriweather", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v33", - "lastModified": "2025-09-02", - "files": { - "300": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrgCcqE1f0KvXKYQ.ttf", - "regular": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr3icqE1f0KvXKYQ.ttf", - "500": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr7CcqE1f0KvXKYQ.ttf", - "600": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrACAqE1f0KvXKYQ.ttf", - "700": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrOSAqE1f0KvXKYQ.ttf", - "800": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrXiAqE1f0KvXKYQ.ttf", - "900": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrdyAqE1f0KvXKYQ.ttf", - "300italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmScUF3wCPDaYa_F.ttf", - "italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF3wCPDaYa_F.ttf", - "500italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTwUF3wCPDaYa_F.ttf", - "600italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmQcV13wCPDaYa_F.ttf", - "700italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmQlV13wCPDaYa_F.ttf", - "800italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmRCV13wCPDaYa_F.ttf", - "900italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmRrV13wCPDaYa_F.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr3icaEl3w.ttf" - }, - { - "family": "Merriweather Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZ_O4ljuEG7xFHnQ.ttf", - "regular": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZou4ljuEG7xFHnQ.ttf", - "500": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZkO4ljuEG7xFHnQ.ttf", - "600": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZfOkljuEG7xFHnQ.ttf", - "700": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZRekljuEG7xFHnQ.ttf", - "800": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZIukljuEG7xFHnQ.ttf", - "300italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq2TzesCzRRXnaur.ttf", - "italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq3NzesCzRRXnaur.ttf", - "500italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq3_zesCzRRXnaur.ttf", - "600italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq0TyusCzRRXnaur.ttf", - "700italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq0qyusCzRRXnaur.ttf", - "800italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq1NyusCzRRXnaur.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZou4Vj-sC.ttf" - }, - { - "family": "Metal", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v32", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/metal/v32/lW-wwjUJIXTo7i3nnoQAUdN2.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/metal/v32/lW-wwjUJIXTo7h3mlIA.ttf" - }, - { - "family": "Metal Mania", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/metalmania/v23/RWmMoKWb4e8kqMfBUdPFJeXCg6UKDXlq.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/metalmania/v23/RWmMoKWb4e8kqMfBUdPFJdXDiaE.ttf" - }, - { - "family": "Metamorphous", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/metamorphous/v22/Wnz8HA03aAXcC39ZEX5y1330PCCthTsmaQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/metamorphous/v22/Wnz8HA03aAXcC39ZEX5y133EPSqp.ttf" - }, - { - "family": "Metrophobic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/metrophobic/v24/sJoA3LZUhMSAPV_u0qwiAT-J737FPEEL.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/metrophobic/v24/sJoA3LZUhMSAPV_u0qwiAQ-I5Xo.ttf" - }, - { - "family": "Michroma", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/michroma/v21/PN_zRfy9qWD8fEagAMg6rzjb_-Da.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/michroma/v21/PN_zRfy9qWD8fEagAPg7pTw.ttf" - }, - { - "family": "Micro 5", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/micro5/v2/H4cnBX2MkcfEngTr0gYQ7LO5mqc.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/micro5/v2/H4cnBX2MkcfEngTr4gca6A.ttf" - }, - { - "family": "Micro 5 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/micro5charted/v2/hESp6XxmPDtTtADZhn7oD_yrmxEGRUsJQAlbUA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/micro5charted/v2/hESp6XxmPDtTtADZhn7oD_yrmxE2REEN.ttf" - }, - { - "family": "Milonga", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/milonga/v24/SZc53FHnIaK9W5kffz3GkUrS8DI.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/milonga/v24/SZc53FHnIaK9W5kfTzzMlQ.ttf" - }, - { - "family": "Miltonian", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v32", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/miltonian/v32/zOL-4pbPn6Ne9JqTg9mr6e5As-FeiQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/miltonian/v32/zOL-4pbPn6Ne9JqTg9mb6ORE.ttf" - }, - { - "family": "Miltonian Tattoo", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v34", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/miltoniantattoo/v34/EvOUzBRL0o0kCxF-lcMCQxlpVsA_FwP8MDBku-s.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/miltoniantattoo/v34/EvOUzBRL0o0kCxF-lcMCQxlpVsA_JwL2NA.ttf" - }, - { - "family": "Mina", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "bengali", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/mina/v14/-nFzOGc18vARrz9j7i3y65o.ttf", - "700": "https://fonts.gstatic.com/s/mina/v14/-nF8OGc18vARl4NMyiXZ95OkJwA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mina/v14/-nFzOGc18vARnz5p6g.ttf" - }, - { - "family": "Mingzat", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "lepcha" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/mingzat/v11/0QIgMX5C-o-oWWyvBttkm_mv670.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mingzat/v11/0QIgMX5C-o-oWWyvNtpunw.ttf" - }, - { - "family": "Miniver", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/miniver/v27/eLGcP-PxIg-5H0vC770Cy8r8fWA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/miniver/v27/eLGcP-PxIg-5H0vC37wIzw.ttf" - }, - { - "family": "Miriam Libre", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjH9P3k9vGL-8tY7Q.ttf", - "500": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjH-H3k9vGL-8tY7Q.ttf", - "600": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjHw3wk9vGL-8tY7Q.ttf", - "700": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjHzTwk9vGL-8tY7Q.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjH9P3o9rMKw.ttf" - }, - { - "family": "Mirza", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/mirza/v19/co3ImWlikiN5EurdKMewsrvI.ttf", - "500": "https://fonts.gstatic.com/s/mirza/v19/co3FmWlikiN5EtIpAeO4mafBomDi.ttf", - "600": "https://fonts.gstatic.com/s/mirza/v19/co3FmWlikiN5EtIFBuO4mafBomDi.ttf", - "700": "https://fonts.gstatic.com/s/mirza/v19/co3FmWlikiN5EtJhB-O4mafBomDi.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mirza/v19/co3ImWlikiN5EtrcIsM.ttf" - }, - { - "family": "Miss Fajardose", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/missfajardose/v23/E21-_dn5gvrawDdPFVl-N0Ajb8qvWPaJq4no.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/missfajardose/v23/E21-_dn5gvrawDdPFVl-N0Ajb_quUvI.ttf" - }, - { - "family": "Mitr", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8fMZFJDUc1NECPY.ttf", - "300": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8ZcaFJDUc1NECPY.ttf", - "regular": "https://fonts.gstatic.com/s/mitr/v13/pxiLypw5ucZFyTsyMJj_b1o.ttf", - "500": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8c8bFJDUc1NECPY.ttf", - "600": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8eMcFJDUc1NECPY.ttf", - "700": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8YcdFJDUc1NECPY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mitr/v13/pxiLypw5ucZF-To4NA.ttf" - }, - { - "family": "Mochiy Pop One", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin" - ], - "version": "v12", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/mochiypopone/v12/QdVPSTA9Jh-gg-5XZP2UmU4O9kwwD3s6ZKAi.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mochiypopone/v12/QdVPSTA9Jh-gg-5XZP2UmU4O9nwxBX8.ttf" - }, - { - "family": "Mochiy Pop P One", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin" - ], - "version": "v12", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/mochiypoppone/v12/Ktk2AKuPeY_td1-h9LayHYWCjAqyN4O3WYZB_sU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mochiypoppone/v12/Ktk2AKuPeY_td1-h9LayHYWCjAqyB4K9XQ.ttf" - }, - { - "family": "Modak", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/modak/v21/EJRYQgs1XtIEsnMH8BVZ76KU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/modak/v21/EJRYQgs1XtIEskMG-hE.ttf" - }, - { - "family": "Modern Antiqua", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/modernantiqua/v26/NGStv5TIAUg6Iq_RLNo_2dp1sI1Ea2u0c3Gi.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/modernantiqua/v26/NGStv5TIAUg6Iq_RLNo_2dp1sL1FYW8.ttf" - }, - { - "family": "Moderustic", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjBVsTNe55aRa7UE.ttf", - "regular": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjALsTNe55aRa7UE.ttf", - "500": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjA5sTNe55aRa7UE.ttf", - "600": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjDVtjNe55aRa7UE.ttf", - "700": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjDstjNe55aRa7UE.ttf", - "800": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjCLtjNe55aRa7UE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjALsQNf7ZI.ttf" - }, - { - "family": "Mogra", - "variants": [ - "regular" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/mogra/v22/f0X40eSs8c95TBo4DvLmxtnG.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mogra/v22/f0X40eSs8c95TCo5BPY.ttf" - }, - { - "family": "Mohave", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdif_HvCQopLSvBk.ttf", - "regular": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdnn_HvCQopLSvBk.ttf", - "500": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdkv_HvCQopLSvBk.ttf", - "600": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdqf4HvCQopLSvBk.ttf", - "700": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdp74HvCQopLSvBk.ttf", - "300italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G8qLOaprDXrBlSVw.ttf", - "italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G89rOaprDXrBlSVw.ttf", - "500italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G8xLOaprDXrBlSVw.ttf", - "600italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G8KLSaprDXrBlSVw.ttf", - "700italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G8EbSaprDXrBlSVw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdnn_LvGapg.ttf" - }, - { - "family": "Moirai One", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/moiraione/v1/2sDbZGFUgJLJmby6xgNGT0WWB7UcfCg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/moiraione/v1/2sDbZGFUgJLJmby6xgNGf0ScAw.ttf" - }, - { - "family": "Molengo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/molengo/v17/I_uuMpWeuBzZNBtQbbRQkiCvs5Y.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/molengo/v17/I_uuMpWeuBzZNBtQXbValg.ttf" - }, - { - "family": "Molle", - "variants": [ - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "italic": "https://fonts.gstatic.com/s/molle/v25/E21n_dL5hOXFhWEsXzgmVydREus.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/molle/v25/E21n_dL5hOXFhWEsbzksUw.ttf" - }, - { - "family": "Mona Sans", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyB9A99d41P6zHtY.ttf", - "300": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyCjA99d41P6zHtY.ttf", - "regular": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9A99d41P6zHtY.ttf", - "500": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyDPA99d41P6zHtY.ttf", - "600": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyAjBN9d41P6zHtY.ttf", - "700": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyAaBN9d41P6zHtY.ttf", - "800": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyB9BN9d41P6zHtY.ttf", - "900": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyBUBN9d41P6zHtY.ttf", - "200italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QLce6VfYyWtY1rI.ttf", - "300italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QGke6VfYyWtY1rI.ttf", - "italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QDce6VfYyWtY1rI.ttf", - "500italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QAUe6VfYyWtY1rI.ttf", - "600italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QOkZ6VfYyWtY1rI.ttf", - "700italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QNAZ6VfYyWtY1rI.ttf", - "800italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QLcZ6VfYyWtY1rI.ttf", - "900italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QJ4Z6VfYyWtY1rI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9A-9c6Vc.ttf" - }, - { - "family": "Monda", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWsH3oMoWtGaA-Ijw.ttf", - "500": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWsLXoMoWtGaA-Ijw.ttf", - "600": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWswX0MoWtGaA-Ijw.ttf", - "700": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWs-H0MoWtGaA-Ijw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWsH3o8oGFC.ttf" - }, - { - "family": "Monofett", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/monofett/v24/mFTyWbofw6zc9NtnW43SuRwr0VJ7.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/monofett/v24/mFTyWbofw6zc9NtnW73Tsxg.ttf" - }, - { - "family": "Monomakh", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/monomakh/v1/Wnz4HAk3Yh_SC3FACTYdiArcPRKo.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/monomakh/v1/Wnz4HAk3Yh_SC3FACQYcgg4.ttf" - }, - { - "family": "Monomaniac One", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/monomaniacone/v15/4iC06K17YctZjx50EU-QlwPmcqRnqYkB5kwI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/monomaniacone/v15/4iC06K17YctZjx50EU-QlwPmcpRmo40.ttf" - }, - { - "family": "Monoton", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/monoton/v22/5h1aiZUrOngCibe4fkbBQ2S7FU8.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/monoton/v22/5h1aiZUrOngCibe4TkfLRw.ttf" - }, - { - "family": "Monsieur La Doulaise", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/monsieurladoulaise/v20/_Xmz-GY4rjmCbQfc-aPRaa4pqV340p7EZl5ewkEU4HTy.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/monsieurladoulaise/v20/_Xmz-GY4rjmCbQfc-aPRaa4pqV340p7EZm5fyEU.ttf" - }, - { - "family": "Montaga", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/montaga/v14/H4cnBX2Ml8rCkEO_0gYQ7LO5mqc.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/montaga/v14/H4cnBX2Ml8rCkEO_4gca6A.ttf" - }, - { - "family": "Montagu Slab", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkDbE3P9Fs7bOSO7.ttf", - "200": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkBbEnP9Fs7bOSO7.ttf", - "300": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkCFEnP9Fs7bOSO7.ttf", - "regular": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkDbEnP9Fs7bOSO7.ttf", - "500": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkDpEnP9Fs7bOSO7.ttf", - "600": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkAFFXP9Fs7bOSO7.ttf", - "700": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkA8FXP9Fs7bOSO7.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkDbEkP8HMo.ttf" - }, - { - "family": "MonteCarlo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/montecarlo/v13/buEzpo6-f9X01GadLA0G0CoV_NxLeiw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/montecarlo/v13/buEzpo6-f9X01GadLA0G4Csf-A.ttf" - }, - { - "family": "Montez", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/montez/v25/845ZNMk5GoGIX8lm1LDeSd-R_g.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/montez/v25/845ZNMk5GoGIX8lW1bra.ttf" - }, - { - "family": "Montserrat", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v31", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Uw-Y3tcoqK5.ttf", - "200": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr6Ew-Y3tcoqK5.ttf", - "300": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCs16Ew-Y3tcoqK5.ttf", - "regular": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew-Y3tcoqK5.ttf", - "500": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtZ6Ew-Y3tcoqK5.ttf", - "600": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCu170w-Y3tcoqK5.ttf", - "700": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM70w-Y3tcoqK5.ttf", - "800": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr70w-Y3tcoqK5.ttf", - "900": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvC70w-Y3tcoqK5.ttf", - "100italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R8aX9-p7K5ILg.ttf", - "200italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR9aX9-p7K5ILg.ttf", - "300italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq_p9aX9-p7K5ILg.ttf", - "italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R9aX9-p7K5ILg.ttf", - "500italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq5Z9aX9-p7K5ILg.ttf", - "600italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq3p6aX9-p7K5ILg.ttf", - "700italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq0N6aX9-p7K5ILg.ttf", - "800italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR6aX9-p7K5ILg.ttf", - "900italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqw16aX9-p7K5ILg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Hw_aX8.ttf" - }, - { - "family": "Montserrat Alternates", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/montserratalternates/v18/mFThWacfw6zH4dthXcyms1lPpC8I_b0juU0xiKfVKphL03l4.ttf", - "100italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTjWacfw6zH4dthXcyms1lPpC8I_b0juU057p-xIJxp1ml4imo.ttf", - "200": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xJIb1ALZH2mBhkw.ttf", - "200italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p8dAbxD-GVxk3Nd.ttf", - "300": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xQIX1ALZH2mBhkw.ttf", - "300italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p95ArxD-GVxk3Nd.ttf", - "regular": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTvWacfw6zH4dthXcyms1lPpC8I_b0juU0J7K3RCJ1b0w.ttf", - "italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFThWacfw6zH4dthXcyms1lPpC8I_b0juU057qfVKphL03l4.ttf", - "500": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xGIT1ALZH2mBhkw.ttf", - "500italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p8hA7xD-GVxk3Nd.ttf", - "600": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xNIP1ALZH2mBhkw.ttf", - "600italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p8NBLxD-GVxk3Nd.ttf", - "700": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xUIL1ALZH2mBhkw.ttf", - "700italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p9pBbxD-GVxk3Nd.ttf", - "800": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xTIH1ALZH2mBhkw.ttf", - "800italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p91BrxD-GVxk3Nd.ttf", - "900": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xaID1ALZH2mBhkw.ttf", - "900italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p9RB7xD-GVxk3Nd.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTvWacfw6zH4dthXcyms1lPpC8I_b0juU057afV.ttf" - }, - { - "family": "Montserrat Underline", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5Wil8ubbffHtmMw.ttf", - "200": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F52ih8ubbffHtmMw.ttf", - "300": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5BCh8ubbffHtmMw.ttf", - "regular": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5Wih8ubbffHtmMw.ttf", - "500": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5aCh8ubbffHtmMw.ttf", - "600": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5hC98ubbffHtmMw.ttf", - "700": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5vS98ubbffHtmMw.ttf", - "800": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F52i98ubbffHtmMw.ttf", - "900": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F58y98ubbffHtmMw.ttf", - "100italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmuU-7zbXn52M1Mi.ttf", - "200italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmsU-rzbXn52M1Mi.ttf", - "300italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmvK-rzbXn52M1Mi.ttf", - "italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmuU-rzbXn52M1Mi.ttf", - "500italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmum-rzbXn52M1Mi.ttf", - "600italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmtK_bzbXn52M1Mi.ttf", - "700italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmtz_bzbXn52M1Mi.ttf", - "800italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmsU_bzbXn52M1Mi.ttf", - "900italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskms9_bzbXn52M1Mi.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5WihMuLzb.ttf" - }, - { - "family": "Moo Lah Lah", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/moolahlah/v8/dg4h_p_opKZOA0w1AYcm55wtYQYugjW4.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/moolahlah/v8/dg4h_p_opKZOA0w1AYcm56wsawI.ttf" - }, - { - "family": "Mooli", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/mooli/v1/-F6_fjJpLyk1bYPBBG7YpzlJ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mooli/v1/-F6_fjJpLyk1bbPADmo.ttf" - }, - { - "family": "Moon Dance", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/moondance/v8/WBLgrEbUbFlYW9ekmGawe2XiKMiokE4.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/moondance/v8/WBLgrEbUbFlYW9ekmGawS2ToLA.ttf" - }, - { - "family": "Moul", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v30", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/moul/v30/nuF2D__FSo_3E-RYiJCy-00.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/moul/v30/nuF2D__FSo_3I-VSjA.ttf" - }, - { - "family": "Moulpali", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v33", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/moulpali/v33/H4ckBXKMl9HagUWymyY6wr-wg763.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/moulpali/v33/H4ckBXKMl9HagUWymxY7yLs.ttf" - }, - { - "family": "Mountains of Christmas", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/mountainsofchristmas/v24/3y9w6a4zcCnn5X0FDyrKi2ZRUBIy8uxoUo7ePNamMPNpJpc.ttf", - "700": "https://fonts.gstatic.com/s/mountainsofchristmas/v24/3y9z6a4zcCnn5X0FDyrKi2ZRUBIy8uxoUo7eBGqJFPtCOp6IaEA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mountainsofchristmas/v24/3y9w6a4zcCnn5X0FDyrKi2ZRUBIy8uxoUo7eDNesNA.ttf" - }, - { - "family": "Mouse Memoirs", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/mousememoirs/v19/t5tmIRoSNJ-PH0WNNgDYxdSb7TnFrpOHYh4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mousememoirs/v19/t5tmIRoSNJ-PH0WNNgDYxdSb3TjPqg.ttf" - }, - { - "family": "Mozilla Headline", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-07-30", - "files": { - "200": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOBYIYVZRxvtcorUQ.ttf", - "300": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOBvoYVZRxvtcorUQ.ttf", - "regular": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOB4IYVZRxvtcorUQ.ttf", - "500": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOB0oYVZRxvtcorUQ.ttf", - "600": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOBPoEVZRxvtcorUQ.ttf", - "700": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOBB4EVZRxvtcorUQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOB4IYlZBZr.ttf" - }, - { - "family": "Mozilla Text", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-07-30", - "files": { - "200": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOBwUcPNBRVYmoOXo.ttf", - "300": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB9scPNBRVYmoOXo.ttf", - "regular": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB4UcPNBRVYmoOXo.ttf", - "500": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB7ccPNBRVYmoOXo.ttf", - "600": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB1sbPNBRVYmoOXo.ttf", - "700": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB2IbPNBRVYmoOXo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB4UcDNFbUQ.ttf" - }, - { - "family": "Mr Bedfort", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/mrbedfort/v23/MQpR-WCtNZSWAdTMwBicliq0XZe_Iy8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mrbedfort/v23/MQpR-WCtNZSWAdTMwBicpiu-WQ.ttf" - }, - { - "family": "Mr Dafoe", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/mrdafoe/v15/lJwE-pIzkS5NXuMMrGiqg7MCxz_C.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mrdafoe/v15/lJwE-pIzkS5NXuMMrFiribc.ttf" - }, - { - "family": "Mr De Haviland", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/mrdehaviland/v15/OpNVnooIhJj96FdB73296ksbOj3C4ULVNTlB.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mrdehaviland/v15/OpNVnooIhJj96FdB73296ksbOg3D60Y.ttf" - }, - { - "family": "Mrs Saint Delafield", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/mrssaintdelafield/v14/v6-IGZDIOVXH9xtmTZfRagunqBw5WC62cK4tLsubB2w.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mrssaintdelafield/v14/v6-IGZDIOVXH9xtmTZfRagunqBw5WC62QK8nKg.ttf" - }, - { - "family": "Mrs Sheppards", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/mrssheppards/v25/PN_2Rfm9snC0XUGoEZhb91ig3vjxynMix4Y.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mrssheppards/v25/PN_2Rfm9snC0XUGoEZhb91ig7vn7zg.ttf" - }, - { - "family": "Ms Madi", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/msmadi/v2/HTxsL2UxNnOji5E1N-DPiI7QAYo.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/msmadi/v2/HTxsL2UxNnOji5E1B-HFjA.ttf" - }, - { - "family": "Mukta", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbEOjFma-2HW7ZB_.ttf", - "300": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbFqj1ma-2HW7ZB_.ttf", - "regular": "https://fonts.gstatic.com/s/mukta/v17/iJWKBXyXfDDVXYnGp32S0H3f.ttf", - "500": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbEyjlma-2HW7ZB_.ttf", - "600": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbEeiVma-2HW7ZB_.ttf", - "700": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbF6iFma-2HW7ZB_.ttf", - "800": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbFmi1ma-2HW7ZB_.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mukta/v17/iJWKBXyXfDDVXbnHrXk.ttf" - }, - { - "family": "Mukta Mahee", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "gurmukhi", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9MFcBoHJndqZCsW.ttf", - "300": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9NhcxoHJndqZCsW.ttf", - "regular": "https://fonts.gstatic.com/s/muktamahee/v19/XRXQ3IOIi0hcP8iVU67hA-vNWz4PDWtj.ttf", - "500": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9M5choHJndqZCsW.ttf", - "600": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9MVdRoHJndqZCsW.ttf", - "700": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9NxdBoHJndqZCsW.ttf", - "800": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9NtdxoHJndqZCsW.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/muktamahee/v19/XRXQ3IOIi0hcP8iVU67hA9vMUTo.ttf" - }, - { - "family": "Mukta Malar", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqIMwBtAB62ruoAZW.ttf", - "300": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqINUBdAB62ruoAZW.ttf", - "regular": "https://fonts.gstatic.com/s/muktamalar/v14/MCoXzAXyz8LOE2FpJMxZqLv4LfQJwHbn.ttf", - "500": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqIMMBNAB62ruoAZW.ttf", - "600": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqIMgA9AB62ruoAZW.ttf", - "700": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqINEAtAB62ruoAZW.ttf", - "800": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqINYAdAB62ruoAZW.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/muktamalar/v14/MCoXzAXyz8LOE2FpJMxZqIv5J_A.ttf" - }, - { - "family": "Mukta Vaani", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGXNV8BD-u97MW1a.ttf", - "300": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGWpVMBD-u97MW1a.ttf", - "regular": "https://fonts.gstatic.com/s/muktavaani/v15/3Jn5SD_-ynaxmxnEfVHPIF0FfORL0fNy.ttf", - "500": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGXxVcBD-u97MW1a.ttf", - "600": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGXdUsBD-u97MW1a.ttf", - "700": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGW5U8BD-u97MW1a.ttf", - "800": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGWlUMBD-u97MW1a.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/muktavaani/v15/3Jn5SD_-ynaxmxnEfVHPIG0EduA.ttf" - }, - { - "family": "Mulish", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexRNRwaClGrw-PTY.ttf", - "300": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexc1RwaClGrw-PTY.ttf", - "regular": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexZNRwaClGrw-PTY.ttf", - "500": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexaFRwaClGrw-PTY.ttf", - "600": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexU1WwaClGrw-PTY.ttf", - "700": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexXRWwaClGrw-PTY.ttf", - "800": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexRNWwaClGrw-PTY.ttf", - "900": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexTpWwaClGrw-PTY.ttf", - "200italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSqeOvHp47LTZFwA.ttf", - "300italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSd-OvHp47LTZFwA.ttf", - "italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSKeOvHp47LTZFwA.ttf", - "500italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSG-OvHp47LTZFwA.ttf", - "600italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsS9-SvHp47LTZFwA.ttf", - "700italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSzuSvHp47LTZFwA.ttf", - "800italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSqeSvHp47LTZFwA.ttf", - "900italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSgOSvHp47LTZFwA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexZNR8aGvHg.ttf" - }, - { - "family": "Murecho", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "japanese", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMpr5HWZLCpUOaM6.ttf", - "200": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMrr5XWZLCpUOaM6.ttf", - "300": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMo15XWZLCpUOaM6.ttf", - "regular": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMpr5XWZLCpUOaM6.ttf", - "500": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMpZ5XWZLCpUOaM6.ttf", - "600": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMq14nWZLCpUOaM6.ttf", - "700": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMqM4nWZLCpUOaM6.ttf", - "800": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMrr4nWZLCpUOaM6.ttf", - "900": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMrC4nWZLCpUOaM6.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMpr5UWYJi4.ttf" - }, - { - "family": "MuseoModerno", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMlZFuewajeKlCdo.ttf", - "200": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMtZEuewajeKlCdo.ttf", - "300": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMghEuewajeKlCdo.ttf", - "regular": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMlZEuewajeKlCdo.ttf", - "500": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMmREuewajeKlCdo.ttf", - "600": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMohDuewajeKlCdo.ttf", - "700": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMrFDuewajeKlCdo.ttf", - "800": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMtZDuewajeKlCdo.ttf", - "900": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMv9DuewajeKlCdo.ttf", - "100italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HUa4QicCgGdrS3g.ttf", - "200italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54H0a8QicCgGdrS3g.ttf", - "300italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HD68QicCgGdrS3g.ttf", - "italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HUa8QicCgGdrS3g.ttf", - "500italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HY68QicCgGdrS3g.ttf", - "600italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54Hj6gQicCgGdrS3g.ttf", - "700italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HtqgQicCgGdrS3g.ttf", - "800italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54H0agQicCgGdrS3g.ttf", - "900italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54H-KgQicCgGdrS3g.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMlZEie0QiQ.ttf" - }, - { - "family": "My Soul", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/mysoul/v7/3XFqErcuy945_u6KF_Ulk2nnXf0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mysoul/v7/3XFqErcuy945_u6KJ_Qvlw.ttf" - }, - { - "family": "Mynerve", - "variants": [ - "regular" - ], - "subsets": [ - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/mynerve/v8/P5sCzZKPdNjb4jt7xCRuiZ-uydg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mynerve/v8/P5sCzZKPdNjb4jt79CVkjQ.ttf" - }, - { - "family": "Mystery Quest", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/mysteryquest/v21/-nF6OG414u0E6k0wynSGlujRHwElD_9Qz9E.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/mysteryquest/v21/-nF6OG414u0E6k0wynSGlujRLwAvCw.ttf" - }, - { - "family": "NTR", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/ntr/v19/RLpzK5Xy0ZjiGGhs5TA4bg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ntr/v19/RLpzK5Xy0ZjSGWJo.ttf" - }, - { - "family": "Nabla", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "math", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/nabla/v17/j8_D6-LI0Lvpe7Makz5UhJt9C3uqg_X_75gyGS4jAxsNIjrRNRBUFFR_198.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nabla/v17/j8_D6-LI0Lvpe7Makz5UhJt9C3uqg_X_75gyGS4jAxsNIjrRBRFeEA.ttf", - "colorCapabilities": [ - "COLRv1", - "SVG" - ] - }, - { - "family": "Namdhinggo", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "limbu" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-mEGe3rbgg8Xzoy5-TDnWj4yxx7o8.ttf", - "500": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-lEGe3rbgg8Xzoy5-TNoGKxyRa8oZK9I0.ttf", - "600": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-lEGe3rbgg8Xzoy5-TNq2NxyRa8oZK9I0.ttf", - "700": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-lEGe3rbgg8Xzoy5-TNsmMxyRa8oZK9I0.ttf", - "800": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-lEGe3rbgg8Xzoy5-TNtWPxyRa8oZK9I0.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-mEGe3rbgg8Xzoy5-TPnSp5w.ttf" - }, - { - "family": "Nanum Brush Script", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/nanumbrushscript/v26/wXK2E2wfpokopxzthSqPbcR5_gVaxazyjqBr1lO97Q.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nanumbrushscript/v26/wXK2E2wfpokopxzthSqPbcR5_gVaxazCj6pv.ttf" - }, - { - "family": "Nanum Gothic", - "variants": [ - "regular", - "700", - "800" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v26", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/nanumgothic/v26/PN_3Rfi-oW3hYwmKDpxS7F_z_tLfxno73g.ttf", - "700": "https://fonts.gstatic.com/s/nanumgothic/v26/PN_oRfi-oW3hYwmKDpxS7F_LQv37zlEn14YEUQ.ttf", - "800": "https://fonts.gstatic.com/s/nanumgothic/v26/PN_oRfi-oW3hYwmKDpxS7F_LXv77zlEn14YEUQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nanumgothic/v26/PN_3Rfi-oW3hYwmKDpxS7F_D_9jb.ttf" - }, - { - "family": "Nanum Gothic Coding", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/nanumgothiccoding/v27/8QIVdjzHisX_8vv59_xMxtPFW4IXROwsy6QxVs1X7tc.ttf", - "700": "https://fonts.gstatic.com/s/nanumgothiccoding/v27/8QIYdjzHisX_8vv59_xMxtPFW4IXROws8xgecsV88t5V9r4.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nanumgothiccoding/v27/8QIVdjzHisX_8vv59_xMxtPFW4IXROws-6U7Ug.ttf" - }, - { - "family": "Nanum Myeongjo", - "variants": [ - "regular", - "700", - "800" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v31", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/nanummyeongjo/v31/9Btx3DZF0dXLMZlywRbVRNhxy1LreHQ8juyl.ttf", - "700": "https://fonts.gstatic.com/s/nanummyeongjo/v31/9Bty3DZF0dXLMZlywRbVRNhxy2pXV1A0pfCs5Kos.ttf", - "800": "https://fonts.gstatic.com/s/nanummyeongjo/v31/9Bty3DZF0dXLMZlywRbVRNhxy2pLVFA0pfCs5Kos.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nanummyeongjo/v31/9Btx3DZF0dXLMZlywRbVRNhxy2LqcnA.ttf" - }, - { - "family": "Nanum Pen Script", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v25", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/nanumpenscript/v25/daaDSSYiLGqEal3MvdA_FOL_3FkN2z7-aMFCcTU.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nanumpenscript/v25/daaDSSYiLGqEal3MvdA_FOL_3FkN6z_0bA.ttf" - }, - { - "family": "Narnoor", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "gunjala-gondi", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v10", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/narnoor/v10/cIf9MaFWuVo-UTyPxCmrYGkHgIs.ttf", - "500": "https://fonts.gstatic.com/s/narnoor/v10/cIf4MaFWuVo-UTyP_N2CRGEsnIJkWL4.ttf", - "600": "https://fonts.gstatic.com/s/narnoor/v10/cIf4MaFWuVo-UTyP_PGFRGEsnIJkWL4.ttf", - "700": "https://fonts.gstatic.com/s/narnoor/v10/cIf4MaFWuVo-UTyP_JWERGEsnIJkWL4.ttf", - "800": "https://fonts.gstatic.com/s/narnoor/v10/cIf4MaFWuVo-UTyP_ImHRGEsnIJkWL4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/narnoor/v10/cIf9MaFWuVo-UTyP9CihZA.ttf" - }, - { - "family": "Nata Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-07-30", - "files": { - "100": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg6wI6g2M62M1AXs.ttf", - "200": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChgywJ6g2M62M1AXs.ttf", - "300": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg_IJ6g2M62M1AXs.ttf", - "regular": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg6wJ6g2M62M1AXs.ttf", - "500": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg54J6g2M62M1AXs.ttf", - "600": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg3IO6g2M62M1AXs.ttf", - "700": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg0sO6g2M62M1AXs.ttf", - "800": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChgywO6g2M62M1AXs.ttf", - "900": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChgwUO6g2M62M1AXs.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg6wJ2gyG7w.ttf" - }, - { - "family": "National Park", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfL_b5XMdoayNUNf.ttf", - "300": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfIhb5XMdoayNUNf.ttf", - "regular": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfJ_b5XMdoayNUNf.ttf", - "500": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfJNb5XMdoayNUNf.ttf", - "600": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfKhaJXMdoayNUNf.ttf", - "700": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfKYaJXMdoayNUNf.ttf", - "800": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfL_aJXMdoayNUNf.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfJ_b6XNfII.ttf" - }, - { - "family": "Neonderthaw", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/neonderthaw/v8/Iure6Yx5-oWVZI0r-17AeZZJprVA4XQ0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/neonderthaw/v8/Iure6Yx5-oWVZI0r-17AeaZIrLE.ttf" - }, - { - "family": "Nerko One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/nerkoone/v17/m8JQjfZSc7OXlB3ZMOjzcJ5BZmqa3A.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nerkoone/v17/m8JQjfZSc7OXlB3ZMOjDcZRF.ttf" - }, - { - "family": "Neucha", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/neucha/v18/q5uGsou0JOdh94bvugNsCxVEgA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/neucha/v18/q5uGsou0JOdh94bfuwlo.ttf" - }, - { - "family": "Neuton", - "variants": [ - "200", - "300", - "regular", - "italic", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/neuton/v24/UMBQrPtMoH62xUZKAKkfegD5Drog6Q.ttf", - "300": "https://fonts.gstatic.com/s/neuton/v24/UMBQrPtMoH62xUZKZKofegD5Drog6Q.ttf", - "regular": "https://fonts.gstatic.com/s/neuton/v24/UMBTrPtMoH62xUZyyII7civlBw.ttf", - "italic": "https://fonts.gstatic.com/s/neuton/v24/UMBRrPtMoH62xUZCyog_UC71B6M5.ttf", - "700": "https://fonts.gstatic.com/s/neuton/v24/UMBQrPtMoH62xUZKdK0fegD5Drog6Q.ttf", - "800": "https://fonts.gstatic.com/s/neuton/v24/UMBQrPtMoH62xUZKaK4fegD5Drog6Q.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/neuton/v24/UMBTrPtMoH62xUZCyYg_.ttf" - }, - { - "family": "New Amsterdam", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/newamsterdam/v1/YA9Vr02Y5lucHqUlbEe51kBtl7mGiv_Q7dA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/newamsterdam/v1/YA9Vr02Y5lucHqUlbEe51kBtp7iMjg.ttf" - }, - { - "family": "New Rocker", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/newrocker/v17/MwQzbhjp3-HImzcCU_cJkGMViblPtXs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/newrocker/v17/MwQzbhjp3-HImzcCU_cJoGIfjQ.ttf" - }, - { - "family": "New Tegomin", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/newtegomin/v13/SLXMc1fV7Gd9USdBAfPlqfN0Q3ptkDMN.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/newtegomin/v13/SLXMc1fV7Gd9USdBAfPlqcN1SX4.ttf" - }, - { - "family": "News Cycle", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/newscycle/v26/CSR64z1Qlv-GDxkbKVQ_TOcATNt_pOU.ttf", - "700": "https://fonts.gstatic.com/s/newscycle/v26/CSR54z1Qlv-GDxkbKVQ_dFsvaNNUuOwkC2s.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/newscycle/v26/CSR64z1Qlv-GDxkbKVQ_fOYKSA.ttf" - }, - { - "family": "Newsreader", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438w-I_ADOxEPjCggA.ttf", - "300": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438wJo_ADOxEPjCggA.ttf", - "regular": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438weI_ADOxEPjCggA.ttf", - "500": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438wSo_ADOxEPjCggA.ttf", - "600": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438wpojADOxEPjCggA.ttf", - "700": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438wn4jADOxEPjCggA.ttf", - "800": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438w-IjADOxEPjCggA.ttf", - "200italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMyoT-ZAHDWwgECi.ttf", - "300italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMx2T-ZAHDWwgECi.ttf", - "italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMwoT-ZAHDWwgECi.ttf", - "500italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMwaT-ZAHDWwgECi.ttf", - "600italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMz2SOZAHDWwgECi.ttf", - "700italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMzPSOZAHDWwgECi.ttf", - "800italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMyoSOZAHDWwgECi.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438weI_wDeZA.ttf" - }, - { - "family": "Niconne", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/niconne/v16/w8gaH2QvRug1_rTfrQut2F4OuOo.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/niconne/v16/w8gaH2QvRug1_rTfnQqn3A.ttf" - }, - { - "family": "Niramit", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVXx7tiiEr5_BdZ8.ttf", - "200italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiXimOq73EZZ_f6w.ttf", - "300": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVRh4tiiEr5_BdZ8.ttf", - "300italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiOiqOq73EZZ_f6w.ttf", - "regular": "https://fonts.gstatic.com/s/niramit/v12/I_uuMpWdvgLdNxVLbbRQkiCvs5Y.ttf", - "italic": "https://fonts.gstatic.com/s/niramit/v12/I_usMpWdvgLdNxVLXbZalgKqo5bYbA.ttf", - "500": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVUB5tiiEr5_BdZ8.ttf", - "500italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiYiuOq73EZZ_f6w.ttf", - "600": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVWx-tiiEr5_BdZ8.ttf", - "600italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiTiyOq73EZZ_f6w.ttf", - "700": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVQh_tiiEr5_BdZ8.ttf", - "700italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiKi2Oq73EZZ_f6w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/niramit/v12/I_uuMpWdvgLdNxVLXbValg.ttf" - }, - { - "family": "Nixie One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/nixieone/v17/lW-8wjkKLXjg5y2o2uUoUOFzpS-yLw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nixieone/v17/lW-8wjkKLXjg5y2o2uUYUet3.ttf" - }, - { - "family": "Nobile", - "variants": [ - "regular", - "italic", - "500", - "500italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/nobile/v19/m8JTjflSeaOVl1i2XqfXeLVdbw.ttf", - "italic": "https://fonts.gstatic.com/s/nobile/v19/m8JRjflSeaOVl1iGXK3TWrBNb3OD.ttf", - "500": "https://fonts.gstatic.com/s/nobile/v19/m8JQjflSeaOVl1iOqo7zcJ5BZmqa3A.ttf", - "500italic": "https://fonts.gstatic.com/s/nobile/v19/m8JWjflSeaOVl1iGXJUnc5RFRG-K3Mud.ttf", - "700": "https://fonts.gstatic.com/s/nobile/v19/m8JQjflSeaOVl1iO4ojzcJ5BZmqa3A.ttf", - "700italic": "https://fonts.gstatic.com/s/nobile/v19/m8JWjflSeaOVl1iGXJVvdZRFRG-K3Mud.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nobile/v19/m8JTjflSeaOVl1iGX63T.ttf" - }, - { - "family": "Nokora", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v34", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMuj1ecbKpdHdrk1k.ttf", - "200": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMur1fcbKpdHdrk1k.ttf", - "300": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMumNfcbKpdHdrk1k.ttf", - "regular": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMuj1fcbKpdHdrk1k.ttf", - "500": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMug9fcbKpdHdrk1k.ttf", - "600": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMuuNYcbKpdHdrk1k.ttf", - "700": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMutpYcbKpdHdrk1k.ttf", - "800": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMur1YcbKpdHdrk1k.ttf", - "900": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMupRYcbKpdHdrk1k.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMuj1fQbOjcA.ttf" - }, - { - "family": "Norican", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/norican/v16/MwQ2bhXp1eSBqjkPGJJRtGs-lbA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/norican/v16/MwQ2bhXp1eSBqjkPKJNbsA.ttf" - }, - { - "family": "Nosifer", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/nosifer/v23/ZGjXol5JTp0g5bxZaC1RVDNdGDs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nosifer/v23/ZGjXol5JTp0g5bxZWCxbUA.ttf" - }, - { - "family": "Notable", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/notable/v20/gNMEW3N_SIqx-WX9-HMoFIez5MI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notable/v20/gNMEW3N_SIqx-WX9yHIiEA.ttf" - }, - { - "family": "Nothing You Could Do", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/nothingyoucoulddo/v21/oY1B8fbBpaP5OX3DtrRYf_Q2BPB1SnfZb0OJl1ol2Ymo.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nothingyoucoulddo/v21/oY1B8fbBpaP5OX3DtrRYf_Q2BPB1SnfZb3OInV4.ttf" - }, - { - "family": "Noticia Text", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/noticiatext/v16/VuJ2dNDF2Yv9qppOePKYRP1GYTFZt0rNpQ.ttf", - "italic": "https://fonts.gstatic.com/s/noticiatext/v16/VuJodNDF2Yv9qppOePKYRP12YztdlU_dpSjt.ttf", - "700": "https://fonts.gstatic.com/s/noticiatext/v16/VuJpdNDF2Yv9qppOePKYRP1-3R59v2HRrDH0eA.ttf", - "700italic": "https://fonts.gstatic.com/s/noticiatext/v16/VuJrdNDF2Yv9qppOePKYRP12YwPhumvVjjTkeMnz.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/noticiatext/v16/VuJ2dNDF2Yv9qppOePKYRP12YDtd.ttf" - }, - { - "family": "Noto Color Emoji", - "variants": [ - "regular" - ], - "subsets": [ - "emoji" - ], - "version": "v36", - "lastModified": "2025-09-06", - "files": { - "regular": "https://fonts.gstatic.com/s/notocoloremoji/v36/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFab5s79iz64w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notocoloremoji/v36/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFWb9m6w.ttf", - "colorCapabilities": [ - "COLRv1", - "SVG" - ] - }, - { - "family": "Noto Emoji", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "emoji" - ], - "version": "v61", - "lastModified": "2025-09-17", - "files": { - "300": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob_10jwvS-FGJCMY.ttf", - "regular": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-r0jwvS-FGJCMY.ttf", - "500": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-Z0jwvS-FGJCMY.ttf", - "600": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob911TwvS-FGJCMY.ttf", - "700": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob9M1TwvS-FGJCMY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-r0gwuQeU.ttf" - }, - { - "family": "Noto Kufi Arabic", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v27", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh5v3obPnLSmf5yD.ttf", - "200": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh7v34bPnLSmf5yD.ttf", - "300": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh4x34bPnLSmf5yD.ttf", - "regular": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh5v34bPnLSmf5yD.ttf", - "500": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh5d34bPnLSmf5yD.ttf", - "600": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh6x2IbPnLSmf5yD.ttf", - "700": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh6I2IbPnLSmf5yD.ttf", - "800": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh7v2IbPnLSmf5yD.ttf", - "900": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh7G2IbPnLSmf5yD.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh5v37bOlrA.ttf" - }, - { - "family": "Noto Music", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "music" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notomusic/v21/pe0rMIiSN5pO63htf1sxIteQB9Zra1U.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notomusic/v21/pe0rMIiSN5pO63htf1sxEtaaAw.ttf" - }, - { - "family": "Noto Naskh Arabic", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v39", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notonaskharabic/v39/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwvc5krK0z9_Mnuw.ttf", - "500": "https://fonts.gstatic.com/s/notonaskharabic/v39/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwj85krK0z9_Mnuw.ttf", - "600": "https://fonts.gstatic.com/s/notonaskharabic/v39/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwY8lkrK0z9_Mnuw.ttf", - "700": "https://fonts.gstatic.com/s/notonaskharabic/v39/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwWslkrK0z9_Mnuw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notonaskharabic/v39/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwvc5Urac3.ttf" - }, - { - "family": "Noto Nastaliq Urdu", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3Qt_-DK2f2-_8mEw.ttf", - "500": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3Qu3-DK2f2-_8mEw.ttf", - "600": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3QgH5DK2f2-_8mEw.ttf", - "700": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3Qjj5DK2f2-_8mEw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3Qt_-PKyV3w.ttf" - }, - { - "family": "Noto Rashi Hebrew", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "greek-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZB-DkRyq6Nf2pfA.ttf", - "200": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZh-HkRyq6Nf2pfA.ttf", - "300": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZWeHkRyq6Nf2pfA.ttf", - "regular": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZB-HkRyq6Nf2pfA.ttf", - "500": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZNeHkRyq6Nf2pfA.ttf", - "600": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZ2ebkRyq6Nf2pfA.ttf", - "700": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZ4ObkRyq6Nf2pfA.ttf", - "800": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZh-bkRyq6Nf2pfA.ttf", - "900": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZrubkRyq6Nf2pfA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZB-HURiC-.ttf" - }, - { - "family": "Noto Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "devanagari", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v42", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9At9d41P6zHtY.ttf", - "200": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyB9A99d41P6zHtY.ttf", - "300": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyCjA99d41P6zHtY.ttf", - "regular": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9A99d41P6zHtY.ttf", - "500": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyDPA99d41P6zHtY.ttf", - "600": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyAjBN9d41P6zHtY.ttf", - "700": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyAaBN9d41P6zHtY.ttf", - "800": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyB9BN9d41P6zHtY.ttf", - "900": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyBUBN9d41P6zHtY.ttf", - "100italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QDcf6VfYyWtY1rI.ttf", - "200italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QLce6VfYyWtY1rI.ttf", - "300italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QGke6VfYyWtY1rI.ttf", - "italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QDce6VfYyWtY1rI.ttf", - "500italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QAUe6VfYyWtY1rI.ttf", - "600italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QOkZ6VfYyWtY1rI.ttf", - "700italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QNAZ6VfYyWtY1rI.ttf", - "800italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QLcZ6VfYyWtY1rI.ttf", - "900italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QJ4Z6VfYyWtY1rI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9A-9c6Vc.ttf" - }, - { - "family": "Noto Sans Adlam", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "adlam", - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufnv0TGnBZLwhuvk.ttf", - "500": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufkn0TGnBZLwhuvk.ttf", - "600": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufqXzTGnBZLwhuvk.ttf", - "700": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufpzzTGnBZLwhuvk.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufnv0fGjLYA.ttf" - }, - { - "family": "Noto Sans Adlam Unjoined", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "adlam", - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_Ye35PMEe-E3slUg.ttf", - "500": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_Yd_5PMEe-E3slUg.ttf", - "600": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_YTP-PMEe-E3slUg.ttf", - "700": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_YQr-PMEe-E3slUg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_Ye35DMAU_A.ttf" - }, - { - "family": "Noto Sans Anatolian Hieroglyphs", - "variants": [ - "regular" - ], - "subsets": [ - "anatolian-hieroglyphs", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansanatolianhieroglyphs/v17/ijw9s4roRME5LLRxjsRb8A0gKPSWq4BbDmHHu6j2pEtUJzZWXybIymc5QYo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansanatolianhieroglyphs/v17/ijw9s4roRME5LLRxjsRb8A0gKPSWq4BbDmHHu6j2pEtUJzZWbyfCzg.ttf" - }, - { - "family": "Noto Sans Arabic", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v33", - "lastModified": "2025-09-17", - "files": { - "100": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfyG2vu3CBFQLaig.ttf", - "200": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfSGyvu3CBFQLaig.ttf", - "300": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCflmyvu3CBFQLaig.ttf", - "regular": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfyGyvu3CBFQLaig.ttf", - "500": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCf-myvu3CBFQLaig.ttf", - "600": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfFmuvu3CBFQLaig.ttf", - "700": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfL2uvu3CBFQLaig.ttf", - "800": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfSGuvu3CBFQLaig.ttf", - "900": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfYWuvu3CBFQLaig.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfyGyfunqF.ttf" - }, - { - "family": "Noto Sans Armenian", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "armenian", - "latin", - "latin-ext" - ], - "version": "v47", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLorxbq0iYy6zF3Eg.ttf", - "200": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLopxb60iYy6zF3Eg.ttf", - "300": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLoqvb60iYy6zF3Eg.ttf", - "regular": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLorxb60iYy6zF3Eg.ttf", - "500": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLorDb60iYy6zF3Eg.ttf", - "600": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLoovaK0iYy6zF3Eg.ttf", - "700": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLooWaK0iYy6zF3Eg.ttf", - "800": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLopxaK0iYy6zF3Eg.ttf", - "900": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLopYaK0iYy6zF3Eg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLorxb50jaSo.ttf" - }, - { - "family": "Noto Sans Avestan", - "variants": [ - "regular" - ], - "subsets": [ - "avestan", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansavestan/v22/bWti7ejKfBziStx7lIzKOLQZKhIJkyu9SASLji8U.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansavestan/v22/bWti7ejKfBziStx7lIzKOLQZKhIJkxu8QgA.ttf" - }, - { - "family": "Noto Sans Balinese", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "balinese", - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov7fdhE5Vd222PPY.ttf", - "500": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov4XdhE5Vd222PPY.ttf", - "600": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov2nahE5Vd222PPY.ttf", - "700": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov1DahE5Vd222PPY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov7fdtE9fcw.ttf" - }, - { - "family": "Noto Sans Bamum", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "bamum", - "latin", - "latin-ext" - ], - "version": "v35", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPEddO-_gLykxEkxA.ttf", - "500": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPEeVO-_gLykxEkxA.ttf", - "600": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPEQlJ-_gLykxEkxA.ttf", - "700": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPETBJ-_gLykxEkxA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPEddOy_kBzg.ttf" - }, - { - "family": "Noto Sans Bassa Vah", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "bassa-vah", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4MaAc6p34gH-GD7.ttf", - "500": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4MoAc6p34gH-GD7.ttf", - "600": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4PEBs6p34gH-GD7.ttf", - "700": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4P9Bs6p34gH-GD7.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4MaAf6o1Yw.ttf" - }, - { - "family": "Noto Sans Batak", - "variants": [ - "regular" - ], - "subsets": [ - "batak", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansbatak/v23/gok2H6TwAEdtF9N8-mdTCQvT-Zdgo4_PHuk74A.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansbatak/v23/gok2H6TwAEdtF9N8-mdTCQvT-ZdQooXL.ttf" - }, - { - "family": "Noto Sans Bengali", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "bengali", - "latin", - "latin-ext" - ], - "version": "v32", - "lastModified": "2025-09-17", - "files": { - "100": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsolKudCk8izI0lc.ttf", - "200": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsglLudCk8izI0lc.ttf", - "300": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmstdLudCk8izI0lc.ttf", - "regular": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsolLudCk8izI0lc.ttf", - "500": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsrtLudCk8izI0lc.ttf", - "600": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsldMudCk8izI0lc.ttf", - "700": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6Kmsm5MudCk8izI0lc.ttf", - "800": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsglMudCk8izI0lc.ttf", - "900": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsiBMudCk8izI0lc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsolLidGu9g.ttf" - }, - { - "family": "Noto Sans Bhaiksuki", - "variants": [ - "regular" - ], - "subsets": [ - "bhaiksuki", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansbhaiksuki/v18/UcC63EosKniBH4iELXATsSBWdvUHXxhj8rLUdU4wh9U.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansbhaiksuki/v18/UcC63EosKniBH4iELXATsSBWdvUHXxhjwrPecQ.ttf" - }, - { - "family": "Noto Sans Brahmi", - "variants": [ - "regular" - ], - "subsets": [ - "brahmi", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansbrahmi/v20/vEFK2-VODB8RrNDvZSUmQQIIByV18tK1W77HtMo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansbrahmi/v20/vEFK2-VODB8RrNDvZSUmQQIIByV1wtO_Xw.ttf" - }, - { - "family": "Noto Sans Buginese", - "variants": [ - "regular" - ], - "subsets": [ - "buginese", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansbuginese/v19/esDM30ldNv-KYGGJpKGk18phe_7Da6_gtfuEXLmNtw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansbuginese/v19/esDM30ldNv-KYGGJpKGk18phe_7Da6_QtPGA.ttf" - }, - { - "family": "Noto Sans Buhid", - "variants": [ - "regular" - ], - "subsets": [ - "buhid", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansbuhid/v23/Dxxy8jiXMW75w3OmoDXVWJD7YwzAe6tgnaFoGA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansbuhid/v23/Dxxy8jiXMW75w3OmoDXVWJD7YwzweqFk.ttf" - }, - { - "family": "Noto Sans Canadian Aboriginal", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "canadian-aboriginal", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigWLj_yAsg0q0uhQ.ttf", - "200": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzig2Ln_yAsg0q0uhQ.ttf", - "300": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigBrn_yAsg0q0uhQ.ttf", - "regular": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigWLn_yAsg0q0uhQ.ttf", - "500": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigarn_yAsg0q0uhQ.ttf", - "600": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzighr7_yAsg0q0uhQ.ttf", - "700": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigv77_yAsg0q0uhQ.ttf", - "800": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzig2L7_yAsg0q0uhQ.ttf", - "900": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzig8b7_yAsg0q0uhQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigWLnPyQEk.ttf" - }, - { - "family": "Noto Sans Carian", - "variants": [ - "regular" - ], - "subsets": [ - "carian", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanscarian/v17/LDIpaoiONgYwA9Yc6f0gUILeMIOgs7ob9yGLmfI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanscarian/v17/LDIpaoiONgYwA9Yc6f0gUILeMIOgg7sR8w.ttf" - }, - { - "family": "Noto Sans Caucasian Albanian", - "variants": [ - "regular" - ], - "subsets": [ - "caucasian-albanian", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanscaucasianalbanian/v19/nKKA-HM_FYFRJvXzVXaANsU0VzsAc46QGOkWytlTs-TXrYDmoVmRSZo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanscaucasianalbanian/v19/nKKA-HM_FYFRJvXzVXaANsU0VzsAc46QGOkWytlTs-TXnYHspQ.ttf" - }, - { - "family": "Noto Sans Chakma", - "variants": [ - "regular" - ], - "subsets": [ - "chakma", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanschakma/v18/Y4GQYbJ8VTEp4t3MKJSMjg5OIzhi4JjTQhYBeYo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanschakma/v18/Y4GQYbJ8VTEp4t3MKJSMjg5OIzhi0JnZRg.ttf" - }, - { - "family": "Noto Sans Cham", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cham", - "latin", - "latin-ext" - ], - "version": "v33", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcER0cv7GykboaLg.ttf", - "200": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfckRwcv7GykboaLg.ttf", - "300": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcTxwcv7GykboaLg.ttf", - "regular": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcERwcv7GykboaLg.ttf", - "500": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcIxwcv7GykboaLg.ttf", - "600": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfczxscv7GykboaLg.ttf", - "700": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfc9hscv7GykboaLg.ttf", - "800": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfckRscv7GykboaLg.ttf", - "900": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcuBscv7GykboaLg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcERwsvru2.ttf" - }, - { - "family": "Noto Sans Cherokee", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cherokee", - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWi5ODkm5rAffjl0.ttf", - "200": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWq5PDkm5rAffjl0.ttf", - "300": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWnBPDkm5rAffjl0.ttf", - "regular": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWi5PDkm5rAffjl0.ttf", - "500": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWhxPDkm5rAffjl0.ttf", - "600": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWvBIDkm5rAffjl0.ttf", - "700": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWslIDkm5rAffjl0.ttf", - "800": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWq5IDkm5rAffjl0.ttf", - "900": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWodIDkm5rAffjl0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWi5PPkizqA.ttf" - }, - { - "family": "Noto Sans Chorasmian", - "variants": [ - "regular" - ], - "subsets": [ - "chorasmian", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v3", - "lastModified": "2024-01-26", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanschorasmian/v3/MQpL-X6uKMC7ROPLwRnI9ULxK_7NVkf8S5vyoH7w4g9b.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanschorasmian/v3/MQpL-X6uKMC7ROPLwRnI9ULxK_7NVkf8S6vzqno.ttf" - }, - { - "family": "Noto Sans Coptic", - "variants": [ - "regular" - ], - "subsets": [ - "coptic", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanscoptic/v22/iJWfBWmUZi_OHPqn4wq6kgqumOEd78u_VG0xR4Y.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanscoptic/v22/iJWfBWmUZi_OHPqn4wq6kgqumOEd38q1UA.ttf" - }, - { - "family": "Noto Sans Cuneiform", - "variants": [ - "regular" - ], - "subsets": [ - "cuneiform", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanscuneiform/v18/bMrrmTWK7YY-MF22aHGGd7H8PhJtvBDWgb9JlRQueeQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanscuneiform/v18/bMrrmTWK7YY-MF22aHGGd7H8PhJtvBDWsb5DkQ.ttf" - }, - { - "family": "Noto Sans Cypriot", - "variants": [ - "regular" - ], - "subsets": [ - "cypriot", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanscypriot/v20/8AtzGta9PYqQDjyp79a6f8Cj-3a3cxIsK5MPpahF.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanscypriot/v20/8AtzGta9PYqQDjyp79a6f8Cj-3a3cyItIZc.ttf" - }, - { - "family": "Noto Sans Cypro Minoan", - "variants": [ - "regular" - ], - "subsets": [ - "cypro-minoan", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanscyprominoan/v1/2Eb2L_dtDUlkNmPHB_UVtEzp3ZlPGqZ_4nAGq9eSf8_eQSE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanscyprominoan/v1/2Eb2L_dtDUlkNmPHB_UVtEzp3ZlPGqZ_4nAGm9aYew.ttf" - }, - { - "family": "Noto Sans Deseret", - "variants": [ - "regular" - ], - "subsets": [ - "deseret", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansdeseret/v18/MwQsbgPp1eKH6QsAVuFb9AZM6MMr2Vq9ZnJSZtQG.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansdeseret/v18/MwQsbgPp1eKH6QsAVuFb9AZM6MMr2Wq8bHY.ttf" - }, - { - "family": "Noto Sans Devanagari", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlXQky-AzoFoW4Ow.ttf", - "200": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlfQly-AzoFoW4Ow.ttf", - "300": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlSoly-AzoFoW4Ow.ttf", - "regular": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlXQly-AzoFoW4Ow.ttf", - "500": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlUYly-AzoFoW4Ow.ttf", - "600": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08Alaoiy-AzoFoW4Ow.ttf", - "700": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlZMiy-AzoFoW4Ow.ttf", - "800": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlfQiy-AzoFoW4Ow.ttf", - "900": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08Ald0iy-AzoFoW4Ow.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlXQl--E5pA.ttf" - }, - { - "family": "Noto Sans Display", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v30", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_3cLVTGQ2iHrvWM.ttf", - "200": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp__cKVTGQ2iHrvWM.ttf", - "300": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_ykKVTGQ2iHrvWM.ttf", - "regular": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_3cKVTGQ2iHrvWM.ttf", - "500": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_0UKVTGQ2iHrvWM.ttf", - "600": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_6kNVTGQ2iHrvWM.ttf", - "700": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_5ANVTGQ2iHrvWM.ttf", - "800": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp__cNVTGQ2iHrvWM.ttf", - "900": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_94NVTGQ2iHrvWM.ttf", - "100italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JvXOa3gPurWM9uQ.ttf", - "200italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JPXKa3gPurWM9uQ.ttf", - "300italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9J43Ka3gPurWM9uQ.ttf", - "italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JvXKa3gPurWM9uQ.ttf", - "500italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9Jj3Ka3gPurWM9uQ.ttf", - "600italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JY3Wa3gPurWM9uQ.ttf", - "700italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JWnWa3gPurWM9uQ.ttf", - "800italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JPXWa3gPurWM9uQ.ttf", - "900italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JFHWa3gPurWM9uQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_3cKZTCa3g.ttf" - }, - { - "family": "Noto Sans Duployan", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "duployan", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansduployan/v19/gokzH7nwAEdtF9N8-mdTDx_X9JM5wsvrFsIn6WYDvA.ttf", - "700": "https://fonts.gstatic.com/s/notosansduployan/v19/gokwH7nwAEdtF9N8-mdTDx_X9JM5wsvTqu0D4U0ftZS-Iw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansduployan/v19/gokzH7nwAEdtF9N8-mdTDx_X9JM5wsvbF8gj.ttf" - }, - { - "family": "Noto Sans Egyptian Hieroglyphs", - "variants": [ - "regular" - ], - "subsets": [ - "egyptian-hieroglyphs", - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansegyptianhieroglyphs/v30/vEF42-tODB8RrNDvZSUmRhcQHzx1s7y_F9-j3qSzEcbEYindSVK8xRg7iw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansegyptianhieroglyphs/v30/vEF42-tODB8RrNDvZSUmRhcQHzx1s7y_F9-j3qSzEcbEYintSFi4.ttf" - }, - { - "family": "Noto Sans Elbasan", - "variants": [ - "regular" - ], - "subsets": [ - "elbasan", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanselbasan/v17/-F6rfiZqLzI2JPCgQBnw400qp1trvHdlre4dFcFh.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanselbasan/v17/-F6rfiZqLzI2JPCgQBnw400qp1trvEdkp-o.ttf" - }, - { - "family": "Noto Sans Elymaic", - "variants": [ - "regular" - ], - "subsets": [ - "elymaic", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanselymaic/v18/UqyKK9YTJW5liNMhTMqe9vUFP65ZD4AjWOT0zi2V.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanselymaic/v18/UqyKK9YTJW5liNMhTMqe9vUFP65ZD7AiUuA.ttf" - }, - { - "family": "Noto Sans Ethiopic", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "ethiopic", - "latin", - "latin-ext" - ], - "version": "v50", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OKqDjwmfeaY9u.ttf", - "200": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T37OK6DjwmfeaY9u.ttf", - "300": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T34QK6DjwmfeaY9u.ttf", - "regular": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OK6DjwmfeaY9u.ttf", - "500": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T358K6DjwmfeaY9u.ttf", - "600": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T36QLKDjwmfeaY9u.ttf", - "700": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T36pLKDjwmfeaY9u.ttf", - "800": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T37OLKDjwmfeaY9u.ttf", - "900": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T37nLKDjwmfeaY9u.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OK5DiyGM.ttf" - }, - { - "family": "Noto Sans Georgian", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic-ext", - "georgian", - "greek-ext", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v48", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpvnzVj-f5WK0OQV.ttf", - "200": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdptnzFj-f5WK0OQV.ttf", - "300": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpu5zFj-f5WK0OQV.ttf", - "regular": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpvnzFj-f5WK0OQV.ttf", - "500": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpvVzFj-f5WK0OQV.ttf", - "600": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdps5y1j-f5WK0OQV.ttf", - "700": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpsAy1j-f5WK0OQV.ttf", - "800": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdptny1j-f5WK0OQV.ttf", - "900": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdptOy1j-f5WK0OQV.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpvnzGj_dZE.ttf" - }, - { - "family": "Noto Sans Glagolitic", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "glagolitic", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansglagolitic/v19/1q2ZY4-BBFBst88SU_tOj4J-4yuNF_HI4ERK4Amu7nM1.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansglagolitic/v19/1q2ZY4-BBFBst88SU_tOj4J-4yuNF_HI4HRL6g0.ttf" - }, - { - "family": "Noto Sans Gothic", - "variants": [ - "regular" - ], - "subsets": [ - "gothic", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansgothic/v17/TuGKUUVzXI5FBtUq5a8bj6wRbzxTFMX40kFQRx0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansgothic/v17/TuGKUUVzXI5FBtUq5a8bj6wRbzxTJMTy1g.ttf" - }, - { - "family": "Noto Sans Grantha", - "variants": [ - "regular" - ], - "subsets": [ - "grantha", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansgrantha/v20/3y976akwcCjmsU8NDyrKo3IQfQ4o-r8cFeulHc6N.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansgrantha/v20/3y976akwcCjmsU8NDyrKo3IQfQ4o-o8dH-8.ttf" - }, - { - "family": "Noto Sans Gujarati", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_ypFgPM_OdiEH0s.ttf", - "200": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_wpFwPM_OdiEH0s.ttf", - "300": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_z3FwPM_OdiEH0s.ttf", - "regular": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_ypFwPM_OdiEH0s.ttf", - "500": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_ybFwPM_OdiEH0s.ttf", - "600": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_x3EAPM_OdiEH0s.ttf", - "700": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_xOEAPM_OdiEH0s.ttf", - "800": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_wpEAPM_OdiEH0s.ttf", - "900": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_wAEAPM_OdiEH0s.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_ypFzPN9uM.ttf" - }, - { - "family": "Noto Sans Gunjala Gondi", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "gunjala-gondi", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYL4YDE4J4vCTxEJQ.ttf", - "500": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYL04DE4J4vCTxEJQ.ttf", - "600": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYLP4fE4J4vCTxEJQ.ttf", - "700": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYLBofE4J4vCTxEJQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYL4YD04ZQr.ttf" - }, - { - "family": "Noto Sans Gurmukhi", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "gurmukhi", - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG1Oe3bxZ_trdp7h.ttf", - "200": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG3OenbxZ_trdp7h.ttf", - "300": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG0QenbxZ_trdp7h.ttf", - "regular": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG1OenbxZ_trdp7h.ttf", - "500": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG18enbxZ_trdp7h.ttf", - "600": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG2QfXbxZ_trdp7h.ttf", - "700": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG2pfXbxZ_trdp7h.ttf", - "800": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG3OfXbxZ_trdp7h.ttf", - "900": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG3nfXbxZ_trdp7h.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG1Oekbwbf8.ttf" - }, - { - "family": "Noto Sans HK", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "chinese-hongkong", - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v34", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qHB_-oWTiYjNvVA.ttf", - "200": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qPB--oWTiYjNvVA.ttf", - "300": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qC5--oWTiYjNvVA.ttf", - "regular": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qHB--oWTiYjNvVA.ttf", - "500": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qEJ--oWTiYjNvVA.ttf", - "600": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qK55-oWTiYjNvVA.ttf", - "700": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qJd5-oWTiYjNvVA.ttf", - "800": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qPB5-oWTiYjNvVA.ttf", - "900": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qNl5-oWTiYjNvVA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qHB-yoSZjQ.ttf" - }, - { - "family": "Noto Sans Hanifi Rohingya", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "hanifi-rohingya", - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIYY4j6vvcudK8rN.ttf", - "500": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIYq4j6vvcudK8rN.ttf", - "600": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIbG5T6vvcudK8rN.ttf", - "700": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIb_5T6vvcudK8rN.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIYY4g6ut88.ttf" - }, - { - "family": "Noto Sans Hanunoo", - "variants": [ - "regular" - ], - "subsets": [ - "hanunoo", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanshanunoo/v22/f0Xs0fCv8dxkDWlZSoXOj6CphMloFsEsEpgL_ix2.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanshanunoo/v22/f0Xs0fCv8dxkDWlZSoXOj6CphMloFvEtGJw.ttf" - }, - { - "family": "Noto Sans Hatran", - "variants": [ - "regular" - ], - "subsets": [ - "hatran", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanshatran/v17/A2BBn4Ne0RgnVF3Lnko-0sOBIfL_mM83r1nwzDs.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanshatran/v17/A2BBn4Ne0RgnVF3Lnko-0sOBIfL_qM49qw.ttf" - }, - { - "family": "Noto Sans Hebrew", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic-ext", - "greek-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v50", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXd4utoiJltutR2g.ttf", - "200": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiX94qtoiJltutR2g.ttf", - "300": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXKYqtoiJltutR2g.ttf", - "regular": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXd4qtoiJltutR2g.ttf", - "500": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXRYqtoiJltutR2g.ttf", - "600": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXqY2toiJltutR2g.ttf", - "700": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXkI2toiJltutR2g.ttf", - "800": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiX942toiJltutR2g.ttf", - "900": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiX3o2toiJltutR2g.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXd4qdoyhh.ttf" - }, - { - "family": "Noto Sans Imperial Aramaic", - "variants": [ - "regular" - ], - "subsets": [ - "imperial-aramaic", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansimperialaramaic/v18/a8IMNpjwKmHXpgXbMIsbTc_kvks91LlLetBr5itQrtdml3YfPNno.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansimperialaramaic/v18/a8IMNpjwKmHXpgXbMIsbTc_kvks91LlLetBr5itQrudnnXI.ttf" - }, - { - "family": "Noto Sans Indic Siyaq Numbers", - "variants": [ - "regular" - ], - "subsets": [ - "indic-siyaq-numbers", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansindicsiyaqnumbers/v17/6xK5dTJFKcWIu4bpRBjRZRpsIYHabOeZ8UZLubTzpXNHKx2WPOpVd5Iu.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansindicsiyaqnumbers/v17/6xK5dTJFKcWIu4bpRBjRZRpsIYHabOeZ8UZLubTzpXNHKy2XNu4.ttf" - }, - { - "family": "Noto Sans Inscriptional Pahlavi", - "variants": [ - "regular" - ], - "subsets": [ - "inscriptional-pahlavi", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansinscriptionalpahlavi/v18/ll8UK3GaVDuxR-TEqFPIbsR79Xxz9WEKbwsjpz7VklYlC7FCVtqVOAYK0QA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansinscriptionalpahlavi/v18/ll8UK3GaVDuxR-TEqFPIbsR79Xxz9WEKbwsjpz7VklYlC7FCZtufPA.ttf" - }, - { - "family": "Noto Sans Inscriptional Parthian", - "variants": [ - "regular" - ], - "subsets": [ - "inscriptional-parthian", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansinscriptionalparthian/v18/k3k7o-IMPvpLmixcA63oYi-yStDkgXuXncL7dzfW3P4TAJ2yklBJ2jNkLlLr.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansinscriptionalparthian/v18/k3k7o-IMPvpLmixcA63oYi-yStDkgXuXncL7dzfW3P4TAJ2ykmBI0Dc.ttf" - }, - { - "family": "Noto Sans JP", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v55", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFBEi75vY0rw-oME.ttf", - "200": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFJEj75vY0rw-oME.ttf", - "300": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFE8j75vY0rw-oME.ttf", - "regular": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFBEj75vY0rw-oME.ttf", - "500": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFCMj75vY0rw-oME.ttf", - "600": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFM8k75vY0rw-oME.ttf", - "700": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFPYk75vY0rw-oME.ttf", - "800": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFJEk75vY0rw-oME.ttf", - "900": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFLgk75vY0rw-oME.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFBEj35rS1g.ttf" - }, - { - "family": "Noto Sans Javanese", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "javanese", - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxJnkFFliZYWj4O8.ttf", - "500": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxKvkFFliZYWj4O8.ttf", - "600": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxEfjFFliZYWj4O8.ttf", - "700": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxH7jFFliZYWj4O8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxJnkJFhoYQ.ttf" - }, - { - "family": "Noto Sans KR", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "korean", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v38", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuozeLTq8H4hfeE.ttf", - "200": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzmoyeLTq8H4hfeE.ttf", - "300": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzrQyeLTq8H4hfeE.ttf", - "regular": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLTq8H4hfeE.ttf", - "500": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzztgyeLTq8H4hfeE.ttf", - "600": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzjQ1eLTq8H4hfeE.ttf", - "700": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzg01eLTq8H4hfeE.ttf", - "800": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzmo1eLTq8H4hfeE.ttf", - "900": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzkM1eLTq8H4hfeE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoySLXg9A.ttf" - }, - { - "family": "Noto Sans Kaithi", - "variants": [ - "regular" - ], - "subsets": [ - "kaithi", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanskaithi/v23/buEtppS9f8_vkXadMBJJu0tWjLwjQi0KdoZIKlo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanskaithi/v23/buEtppS9f8_vkXadMBJJu0tWjLwjciwAcg.ttf" - }, - { - "family": "Noto Sans Kannada", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext" - ], - "version": "v31", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrDvMzSIMLsPKrkY.ttf", - "200": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrLvNzSIMLsPKrkY.ttf", - "300": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrGXNzSIMLsPKrkY.ttf", - "regular": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrDvNzSIMLsPKrkY.ttf", - "500": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrAnNzSIMLsPKrkY.ttf", - "600": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrOXKzSIMLsPKrkY.ttf", - "700": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrNzKzSIMLsPKrkY.ttf", - "800": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrLvKzSIMLsPKrkY.ttf", - "900": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrJLKzSIMLsPKrkY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrDvN_SMGKg.ttf" - }, - { - "family": "Noto Sans Kawi", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "kawi", - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnK4AhmCpRyMjXVsQ.ttf", - "500": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnK0ghmCpRyMjXVsQ.ttf", - "600": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnKPg9mCpRyMjXVsQ.ttf", - "700": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnKBw9mCpRyMjXVsQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnK4AhWC552.ttf" - }, - { - "family": "Noto Sans Kayah Li", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "kayah-li", - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WCc3CZH4EXLuKVM.ttf", - "500": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WBU3CZH4EXLuKVM.ttf", - "600": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WPkwCZH4EXLuKVM.ttf", - "700": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WMAwCZH4EXLuKVM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WCc3OZDyFQ.ttf" - }, - { - "family": "Noto Sans Kharoshthi", - "variants": [ - "regular" - ], - "subsets": [ - "kharoshthi", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanskharoshthi/v17/Fh4qPiLjKS30-P4-pGMMXCCfvkc5Vd7KE5z4rFyx5mR1.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanskharoshthi/v17/Fh4qPiLjKS30-P4-pGMMXCCfvkc5Vd7KE6z5plg.ttf" - }, - { - "family": "Noto Sans Khmer", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "khmer", - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYuNAZz4kAbrddiA.ttf", - "200": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYsNAJz4kAbrddiA.ttf", - "300": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYvTAJz4kAbrddiA.ttf", - "regular": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYuNAJz4kAbrddiA.ttf", - "500": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYu_AJz4kAbrddiA.ttf", - "600": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYtTB5z4kAbrddiA.ttf", - "700": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYtqB5z4kAbrddiA.ttf", - "800": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYsNB5z4kAbrddiA.ttf", - "900": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYskB5z4kAbrddiA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYuNAKz5mgI.ttf" - }, - { - "family": "Noto Sans Khojki", - "variants": [ - "regular" - ], - "subsets": [ - "khojki", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanskhojki/v20/-nFnOHM29Oofr2wohFbTuPPKVWpmK_d709jy92k.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanskhojki/v20/-nFnOHM29Oofr2wohFbTuPPKVWpmG_Zx1w.ttf" - }, - { - "family": "Noto Sans Khudawadi", - "variants": [ - "regular" - ], - "subsets": [ - "khudawadi", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanskhudawadi/v23/fdNi9t6ZsWBZ2k5ltHN73zZ5hc8HANlHIjRnVVXz9MY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanskhudawadi/v23/fdNi9t6ZsWBZ2k5ltHN73zZ5hc8HANlHEjVtUQ.ttf" - }, - { - "family": "Noto Sans Lao", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "lao", - "latin", - "latin-ext" - ], - "version": "v33", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4ccfdf5MK3riB2w.ttf", - "200": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt48cbdf5MK3riB2w.ttf", - "300": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4L8bdf5MK3riB2w.ttf", - "regular": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4ccbdf5MK3riB2w.ttf", - "500": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4Q8bdf5MK3riB2w.ttf", - "600": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4r8Hdf5MK3riB2w.ttf", - "700": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4lsHdf5MK3riB2w.ttf", - "800": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt48cHdf5MK3riB2w.ttf", - "900": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt42MHdf5MK3riB2w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4ccbtfpkO.ttf" - }, - { - "family": "Noto Sans Lao Looped", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "lao", - "latin", - "latin-ext" - ], - "version": "v10", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomPr2M-Zw5V_T71k.ttf", - "200": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomHr3M-Zw5V_T71k.ttf", - "300": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomKT3M-Zw5V_T71k.ttf", - "regular": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomPr3M-Zw5V_T71k.ttf", - "500": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomMj3M-Zw5V_T71k.ttf", - "600": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomCTwM-Zw5V_T71k.ttf", - "700": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomB3wM-Zw5V_T71k.ttf", - "800": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomHrwM-Zw5V_T71k.ttf", - "900": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomFPwM-Zw5V_T71k.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomPr3A-d64Q.ttf" - }, - { - "family": "Noto Sans Lepcha", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "lepcha" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanslepcha/v20/0QI7MWlB_JWgA166SKhu05TekNS32AJstqBXgd4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanslepcha/v20/0QI7MWlB_JWgA166SKhu05TekNS36ANmsg.ttf" - }, - { - "family": "Noto Sans Limbu", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "limbu" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanslimbu/v26/3JnlSDv90Gmq2mrzckOBBRRoNJVj0MF3OHRDnA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanslimbu/v26/3JnlSDv90Gmq2mrzckOBBRRoNJVT0ctz.ttf" - }, - { - "family": "Noto Sans Linear A", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "linear-a" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanslineara/v19/oPWS_l16kP4jCuhpgEGmwJOiA18FZj22zmHQAGQicw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanslineara/v19/oPWS_l16kP4jCuhpgEGmwJOiA18FZj2Gz2vU.ttf" - }, - { - "family": "Noto Sans Linear B", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "linear-b" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanslinearb/v18/HhyJU4wt9vSgfHoORYOiXOckKNB737IV3BkFTq4EPw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanslinearb/v18/HhyJU4wt9vSgfHoORYOiXOckKNB737Il3RMB.ttf" - }, - { - "family": "Noto Sans Lisu", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "lisu" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHP2Vwt29IlxkVdig.ttf", - "500": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHP61wt29IlxkVdig.ttf", - "600": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHPB1st29IlxkVdig.ttf", - "700": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHPPlst29IlxkVdig.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHP2Vwd2tgh.ttf" - }, - { - "family": "Noto Sans Lycian", - "variants": [ - "regular" - ], - "subsets": [ - "lycian" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanslycian/v16/QldVNSNMqAsHtsJ7UmqxBQA9r8wA5_naCJwn00E.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanslycian/v16/QldVNSNMqAsHtsJ7UmqxBQA9r8wA1_jQDA.ttf" - }, - { - "family": "Noto Sans Lydian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "lydian" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanslydian/v19/c4m71mVzGN7s8FmIukZJ1v4ZlcPReUPXMoIjEQI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanslydian/v19/c4m71mVzGN7s8FmIukZJ1v4ZlcPRSULdNg.ttf" - }, - { - "family": "Noto Sans Mahajani", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "mahajani" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmahajani/v20/-F6sfiVqLzI2JPCgQBnw60Agp0JrvD5Fh8ARHNh4zg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmahajani/v20/-F6sfiVqLzI2JPCgQBnw60Agp0JrvD51hsoV.ttf" - }, - { - "family": "Noto Sans Malayalam", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "malayalam" - ], - "version": "v29", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_RuH9BFzEr6HxEA.ttf", - "200": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_xuD9BFzEr6HxEA.ttf", - "300": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_GOD9BFzEr6HxEA.ttf", - "regular": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_RuD9BFzEr6HxEA.ttf", - "500": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_dOD9BFzEr6HxEA.ttf", - "600": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_mOf9BFzEr6HxEA.ttf", - "700": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_oef9BFzEr6HxEA.ttf", - "800": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_xuf9BFzEr6HxEA.ttf", - "900": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_7-f9BFzEr6HxEA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_RuDNBVbA.ttf" - }, - { - "family": "Noto Sans Mandaic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "mandaic" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmandaic/v18/cIfnMbdWt1w_HgCcilqhKQBo_OsMI5_A_gMk0izH.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmandaic/v18/cIfnMbdWt1w_HgCcilqhKQBo_OsMI6_B9Ac.ttf" - }, - { - "family": "Noto Sans Manichaean", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "manichaean" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmanichaean/v19/taiVGntiC4--qtsfi4Jp9-_GkPZZCcrfekqCNTtFCtdX.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmanichaean/v19/taiVGntiC4--qtsfi4Jp9-_GkPZZCcrfenqDPz8.ttf" - }, - { - "family": "Noto Sans Marchen", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "marchen" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmarchen/v21/aFTO7OZ_Y282EP-WyG6QTOX_C8WZMHhPk652ZaHk.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmarchen/v21/aFTO7OZ_Y282EP-WyG6QTOX_C8WZMEhOmao.ttf" - }, - { - "family": "Noto Sans Masaram Gondi", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "masaram-gondi" - ], - "version": "v18", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmasaramgondi/v18/6xK_dThFKcWIu4bpRBjRYRV7KZCbUq6n_1kPnuGe7RI9WSWX.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmasaramgondi/v18/6xK_dThFKcWIu4bpRBjRYRV7KZCbUq6n_1kPntGf5xY.ttf" - }, - { - "family": "Noto Sans Math", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "math" - ], - "version": "v18", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmath/v18/7Aump_cpkSecTWaHRlH2hyV5UHkG-V048PW0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmath/v18/7Aump_cpkSecTWaHRlH2hyV5UEkH81k.ttf" - }, - { - "family": "Noto Sans Mayan Numerals", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "mayan-numerals" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmayannumerals/v17/PlIuFk25O6RzLfvNNVSivR09_KqYMwvvDKYjfIiE68oo6eepYQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmayannumerals/v17/PlIuFk25O6RzLfvNNVSivR09_KqYMwvvDKYjfIi06sAs.ttf" - }, - { - "family": "Noto Sans Medefaidrin", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "medefaidrin" - ], - "version": "v29", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmErWlT318e5A3rw.ttf", - "500": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmHjWlT318e5A3rw.ttf", - "600": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmJTRlT318e5A3rw.ttf", - "700": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmK3RlT318e5A3rw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmErWpTz_9Q.ttf" - }, - { - "family": "Noto Sans Meetei Mayek", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "meetei-mayek" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1TJ__TW5PgeFYVa.ttf", - "200": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1RJ_vTW5PgeFYVa.ttf", - "300": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1SX_vTW5PgeFYVa.ttf", - "regular": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1TJ_vTW5PgeFYVa.ttf", - "500": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1T7_vTW5PgeFYVa.ttf", - "600": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1QX-fTW5PgeFYVa.ttf", - "700": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1Qu-fTW5PgeFYVa.ttf", - "800": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1RJ-fTW5PgeFYVa.ttf", - "900": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1Rg-fTW5PgeFYVa.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1TJ_sTX7vw.ttf" - }, - { - "family": "Noto Sans Mende Kikakui", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "mende-kikakui" - ], - "version": "v29", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmendekikakui/v29/11hRGoLHz17aKjQCWj-JHcLvu2Q5zZrnkbNCLUx_aDJLAHer.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmendekikakui/v29/11hRGoLHz17aKjQCWj-JHcLvu2Q5zZrnkbNCLXx-YjY.ttf" - }, - { - "family": "Noto Sans Meroitic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "meroitic", - "meroitic-cursive", - "meroitic-hieroglyphs" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmeroitic/v19/IFS5HfRJndhE3P4b5jnZ3ITPvC6i00UDgDhTiKY9KQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmeroitic/v19/IFS5HfRJndhE3P4b5jnZ3ITPvC6i00UzgTJX.ttf" - }, - { - "family": "Noto Sans Miao", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "miao" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmiao/v18/Dxxz8jmXMW75w3OmoDXVV4zyZUjgUYVslLhx.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmiao/v18/Dxxz8jmXMW75w3OmoDXVV4zyZXjhW4E.ttf" - }, - { - "family": "Noto Sans Modi", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "modi" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmodi/v25/pe03MIySN5pO62Z5YkFyT7jeav5qWVAgVol-.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmodi/v25/pe03MIySN5pO62Z5YkFyT7jeas5rU1Q.ttf" - }, - { - "family": "Noto Sans Mongolian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "mongolian", - "symbols" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmongolian/v23/VdGCAYADGIwE0EopZx8xQfHlgEAMsrToxLsg6-av1x0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmongolian/v23/VdGCAYADGIwE0EopZx8xQfHlgEAMsrTo9Loq7w.ttf" - }, - { - "family": "Noto Sans Mono", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v37", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_FNI49rXVEQQL8Y.ttf", - "200": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_NNJ49rXVEQQL8Y.ttf", - "300": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_A1J49rXVEQQL8Y.ttf", - "regular": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_FNJ49rXVEQQL8Y.ttf", - "500": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_GFJ49rXVEQQL8Y.ttf", - "600": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_I1O49rXVEQQL8Y.ttf", - "700": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_LRO49rXVEQQL8Y.ttf", - "800": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_NNO49rXVEQQL8Y.ttf", - "900": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_PpO49rXVEQQL8Y.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_FNJ09vdUA.ttf" - }, - { - "family": "Noto Sans Mro", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "mro" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmro/v19/qWcsB6--pZv9TqnUQMhe9b39WDzRtjkho4M.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmro/v19/qWcsB6--pZv9TqnUQMhe9b39aD3bsg.ttf" - }, - { - "family": "Noto Sans Multani", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "multani" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansmultani/v21/9Bty3ClF38_RfOpe1gCaZ8p30BOFO1A0pfCs5Kos.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmultani/v21/9Bty3ClF38_RfOpe1gCaZ8p30BOFO2A1r_Q.ttf" - }, - { - "family": "Noto Sans Myanmar", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "myanmar" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZs_y1ZtY3ymOryg38hOCSdOnFq0HGS1uEapkAC3AY.ttf", - "200": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HE-98EwiEwLxR-r.ttf", - "300": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HFa9MEwiEwLxR-r.ttf", - "regular": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZq_y1ZtY3ymOryg38hOCSdOnFq0En23OU4o1AC.ttf", - "500": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HEC9cEwiEwLxR-r.ttf", - "600": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HEu8sEwiEwLxR-r.ttf", - "700": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HFK88EwiEwLxR-r.ttf", - "800": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HFW8MEwiEwLxR-r.ttf", - "900": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HFy8cEwiEwLxR-r.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZq_y1ZtY3ymOryg38hOCSdOnFq0Hn31uE.ttf" - }, - { - "family": "Noto Sans NKo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "nko" - ], - "version": "v7", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansnko/v7/esDX31ZdNv-KYGGJpKGk2_RpMpCMHMLBrdA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansnko/v7/esDX31ZdNv-KYGGJpKGk2_RpApGGGA.ttf" - }, - { - "family": "Noto Sans NKo Unjoined", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "nko" - ], - "version": "v4", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rvF2gEPxf5wbh3T.ttf", - "500": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rv32gEPxf5wbh3T.ttf", - "600": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rsb3QEPxf5wbh3T.ttf", - "700": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rsi3QEPxf5wbh3T.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rvF2jEOz_o.ttf" - }, - { - "family": "Noto Sans Nabataean", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "nabataean" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansnabataean/v17/IFS4HfVJndhE3P4b5jnZ34DfsjO330dNoBJ9hK8kMK4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansnabataean/v17/IFS4HfVJndhE3P4b5jnZ34DfsjO330dNkBN3gA.ttf" - }, - { - "family": "Noto Sans Nag Mundari", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "nag-mundari" - ], - "version": "v4", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHRxirbUGA0whP19M.ttf", - "500": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHRyqrbUGA0whP19M.ttf", - "600": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHR8asbUGA0whP19M.ttf", - "700": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHR_-sbUGA0whP19M.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHRxirXUCK1w.ttf" - }, - { - "family": "Noto Sans Nandinagari", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "nandinagari" - ], - "version": "v4", - "lastModified": "2023-10-25", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansnandinagari/v4/or38Q7733eiDljA1IufXSNFT-1KI5y10H4jVa5RXzC1KOw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansnandinagari/v4/or38Q7733eiDljA1IufXSNFT-1KI5y10H4jlap5T.ttf" - }, - { - "family": "Noto Sans New Tai Lue", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "new-tai-lue" - ], - "version": "v24", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pdeXAYUbghFPKzeY.ttf", - "500": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pddfAYUbghFPKzeY.ttf", - "600": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pdTvHYUbghFPKzeY.ttf", - "700": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pdQLHYUbghFPKzeY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pdeXAUUfqgA.ttf" - }, - { - "family": "Noto Sans Newa", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "newa" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansnewa/v17/7r3fqXp6utEsO9pI4f8ok8sWg8n_qN4R5lNU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansnewa/v17/7r3fqXp6utEsO9pI4f8ok8sWg_n-oto.ttf" - }, - { - "family": "Noto Sans Nushu", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "nushu" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansnushu/v20/rnCw-xRQ3B7652emAbAe_Ai1IYaFWFAMArZKqQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansnushu/v20/rnCw-xRQ3B7652emAbAe_Ai1IYa1WVoI.ttf" - }, - { - "family": "Noto Sans Ogham", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "ogham" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansogham/v18/kmKlZqk1GBDGN0mY6k5lmEmww4hrt5laQxcoCA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansogham/v18/kmKlZqk1GBDGN0mY6k5lmEmww4hbtpNe.ttf" - }, - { - "family": "Noto Sans Ol Chiki", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "ol-chiki" - ], - "version": "v31", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALWk267I6gVrz5gQ.ttf", - "500": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALVs267I6gVrz5gQ.ttf", - "600": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALbcx67I6gVrz5gQ.ttf", - "700": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALY4x67I6gVrz5gQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALWk227MwhQ.ttf" - }, - { - "family": "Noto Sans Old Hungarian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "old-hungarian" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansoldhungarian/v19/E213_cD6hP3GwCJPEUssHEM0KqLaHJXg2PiIgRfjbg5nCYXt.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansoldhungarian/v19/E213_cD6hP3GwCJPEUssHEM0KqLaHJXg2PiIgSfiZAo.ttf" - }, - { - "family": "Noto Sans Old Italic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "old-italic" - ], - "version": "v18", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansolditalic/v18/TuGOUUFzXI5FBtUq5a8bh68BJxxEVam7tWlRdRhtCC4d.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansolditalic/v18/TuGOUUFzXI5FBtUq5a8bh68BJxxEVam7tVlQfxw.ttf" - }, - { - "family": "Noto Sans Old North Arabian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "old-north-arabian" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansoldnortharabian/v17/esDF30BdNv-KYGGJpKGk2tNiMt7Jar6olZDyNdr81zBQmUo_xw4ABw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansoldnortharabian/v17/esDF30BdNv-KYGGJpKGk2tNiMt7Jar6olZDyNdr81zBgmEA7.ttf" - }, - { - "family": "Noto Sans Old Permic", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "old-permic" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansoldpermic/v18/snf1s1q1-dF8pli1TesqcbUY4Mr-ElrwKLdXgv_dKYB5.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansoldpermic/v18/snf1s1q1-dF8pli1TesqcbUY4Mr-ElrwKIdWiPs.ttf" - }, - { - "family": "Noto Sans Old Persian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "old-persian" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansoldpersian/v17/wEOjEAbNnc5caQTFG18FHrZr9Bp6-8CmIJ_tqOlQfx9CjA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansoldpersian/v17/wEOjEAbNnc5caQTFG18FHrZr9Bp6-8CmIJ_dqeNU.ttf" - }, - { - "family": "Noto Sans Old Sogdian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "old-sogdian" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansoldsogdian/v18/3JnjSCH90Gmq2mrzckOBBhFhdrMst48aURt7neIqM-9uyg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansoldsogdian/v18/3JnjSCH90Gmq2mrzckOBBhFhdrMst48aURtLnOgu.ttf" - }, - { - "family": "Noto Sans Old South Arabian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "old-south-arabian" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansoldsoutharabian/v17/3qT5oiOhnSyU8TNFIdhZTice3hB_HWKsEnF--0XCHiKx1OtDT9HwTA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansoldsoutharabian/v17/3qT5oiOhnSyU8TNFIdhZTice3hB_HWKsEnF--0XCHiKB1eFH.ttf" - }, - { - "family": "Noto Sans Old Turkic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "old-turkic" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansoldturkic/v19/yMJNMJVya43H0SUF_WmcGEQVqoEMKDKbsE2RjEw-Vyws.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansoldturkic/v19/yMJNMJVya43H0SUF_WmcGEQVqoEMKDKbsH2Qhkg.ttf" - }, - { - "family": "Noto Sans Oriya", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "oriya" - ], - "version": "v33", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivj0fq_c6LhHBRe-.ttf", - "200": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivh0f6_c6LhHBRe-.ttf", - "300": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Iviqf6_c6LhHBRe-.ttf", - "regular": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivj0f6_c6LhHBRe-.ttf", - "500": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5IvjGf6_c6LhHBRe-.ttf", - "600": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5IvgqeK_c6LhHBRe-.ttf", - "700": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5IvgTeK_c6LhHBRe-.ttf", - "800": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivh0eK_c6LhHBRe-.ttf", - "900": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5IvhdeK_c6LhHBRe-.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivj0f5_d4rw.ttf" - }, - { - "family": "Noto Sans Osage", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "osage" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansosage/v19/oPWX_kB6kP4jCuhpgEGmw4mtAVtXRlaSxkrMCQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansosage/v19/oPWX_kB6kP4jCuhpgEGmw4mtAVtnR1yW.ttf" - }, - { - "family": "Noto Sans Osmanya", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "osmanya" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansosmanya/v19/8vIS7xs32H97qzQKnzfeWzUyUpOJmz6kR47NCV5Z.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansosmanya/v19/8vIS7xs32H97qzQKnzfeWzUyUpOJmw6lTYo.ttf" - }, - { - "family": "Noto Sans Pahawh Hmong", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "pahawh-hmong" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanspahawhhmong/v19/bWtp7e_KfBziStx7lIzKKaMUOBEA3UPQDW7krzc_c48aMpM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanspahawhhmong/v19/bWtp7e_KfBziStx7lIzKKaMUOBEA3UPQDW7knzY1dw.ttf" - }, - { - "family": "Noto Sans Palmyrene", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "palmyrene" - ], - "version": "v17", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanspalmyrene/v17/ZgNPjOdKPa7CHqq0h37c_ASCWvH93SFCPnK5ZpdNtcA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanspalmyrene/v17/ZgNPjOdKPa7CHqq0h37c_ASCWvH93SFCDnOzYg.ttf" - }, - { - "family": "Noto Sans Pau Cin Hau", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "pau-cin-hau" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanspaucinhau/v21/x3d-cl3IZKmUqiMg_9wBLLtzl22EayN7ehIdjEWqKMxsKw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanspaucinhau/v21/x3d-cl3IZKmUqiMg_9wBLLtzl22EayN7ehItjU-u.ttf" - }, - { - "family": "Noto Sans PhagsPa", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "phags-pa", - "symbols" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansphagspa/v24/XLY8IYr5bJNDGYxPGjyYbaEjwQR-LFlsYMYHGGeT.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansphagspa/v24/XLY8IYr5bJNDGYxPGjyYbaEjwQR-LGltasI.ttf" - }, - { - "family": "Noto Sans Phoenician", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "phoenician" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansphoenician/v18/jizFRF9Ksm4Bt9PvcTaEkIHiTVtxmFtS5X7Jot-p5561.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansphoenician/v18/jizFRF9Ksm4Bt9PvcTaEkIHiTVtxmFtS5U7IqNs.ttf" - }, - { - "family": "Noto Sans Psalter Pahlavi", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "psalter-pahlavi" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanspsalterpahlavi/v18/rP2Vp3K65FkAtHfwd-eISGznYihzggmsicPfud3w1G3KsUQBct4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanspsalterpahlavi/v18/rP2Vp3K65FkAtHfwd-eISGznYihzggmsicPfud3w5GzAtQ.ttf" - }, - { - "family": "Noto Sans Rejang", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "rejang" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansrejang/v22/Ktk2AKuMeZjqPnXgyqrib7DIogqwN4O3WYZB_sU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansrejang/v22/Ktk2AKuMeZjqPnXgyqrib7DIogqwB4K9XQ.ttf" - }, - { - "family": "Noto Sans Runic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "runic" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansrunic/v18/H4c_BXWPl9DZ0Xe_nHUaus7W68WWaxpvHtgIYg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansrunic/v18/H4c_BXWPl9DZ0Xe_nHUaus7W68WmahBr.ttf" - }, - { - "family": "Noto Sans SC", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "chinese-simplified", - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v39", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG9_EnYxNbPzS5HE.ttf", - "200": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG1_FnYxNbPzS5HE.ttf", - "300": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG4HFnYxNbPzS5HE.ttf", - "regular": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG9_FnYxNbPzS5HE.ttf", - "500": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG-3FnYxNbPzS5HE.ttf", - "600": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaGwHCnYxNbPzS5HE.ttf", - "700": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaGzjCnYxNbPzS5HE.ttf", - "800": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG1_CnYxNbPzS5HE.ttf", - "900": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG3bCnYxNbPzS5HE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG9_FrY1HaA.ttf" - }, - { - "family": "Noto Sans Samaritan", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "samaritan" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssamaritan/v17/buEqppe9f8_vkXadMBJJo0tSmaYjFkxOUo5jNlOVMzQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssamaritan/v17/buEqppe9f8_vkXadMBJJo0tSmaYjFkxOYo9pMg.ttf" - }, - { - "family": "Noto Sans Saurashtra", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "saurashtra" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssaurashtra/v24/ea8GacQ0Wfz_XKWXe6OtoA8w8zvmYwTef9ndjhPTSIx9.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssaurashtra/v24/ea8GacQ0Wfz_XKWXe6OtoA8w8zvmYwTef-nchBc.ttf" - }, - { - "family": "Noto Sans Sharada", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "sharada" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssharada/v17/gok0H7rwAEdtF9N8-mdTGALG6p0kwoXLPOwr4H8a.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssharada/v17/gok0H7rwAEdtF9N8-mdTGALG6p0kwrXKNug.ttf" - }, - { - "family": "Noto Sans Shavian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "shavian" - ], - "version": "v18", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansshavian/v18/CHy5V_HZE0jxJBQlqAeCKjJvQBNF4EFQSplv2Cwg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansshavian/v18/CHy5V_HZE0jxJBQlqAeCKjJvQBNF4HFRQJ0.ttf" - }, - { - "family": "Noto Sans Siddham", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "siddham" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssiddham/v21/OZpZg-FwqiNLe9PELUikxTWDoCCeGqndk3Ic92ZH.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssiddham/v21/OZpZg-FwqiNLe9PELUikxTWDoCCeGpncmXY.ttf" - }, - { - "family": "Noto Sans SignWriting", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "signwriting" - ], - "version": "v5", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssignwriting/v5/Noas6VX_wIWFbTTCrYmvy9A2UnkL-2SZAWiUEVCARYQemg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssignwriting/v5/Noas6VX_wIWFbTTCrYmvy9A2UnkL-2SZAWikEFqE.ttf" - }, - { - "family": "Noto Sans Sinhala", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "sinhala" - ], - "version": "v36", - "lastModified": "2025-09-17", - "files": { - "100": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwg2b5lgLpJwbQRM.ttf", - "200": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwo2a5lgLpJwbQRM.ttf", - "300": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwlOa5lgLpJwbQRM.ttf", - "regular": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwg2a5lgLpJwbQRM.ttf", - "500": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwj-a5lgLpJwbQRM.ttf", - "600": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwtOd5lgLpJwbQRM.ttf", - "700": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwuqd5lgLpJwbQRM.ttf", - "800": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwo2d5lgLpJwbQRM.ttf", - "900": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwqSd5lgLpJwbQRM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwg2a1lkBoA.ttf" - }, - { - "family": "Noto Sans Sogdian", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "sogdian" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssogdian/v17/taiQGn5iC4--qtsfi4Jp6eHPnfxQBo--Pm6KHidM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssogdian/v17/taiQGn5iC4--qtsfi4Jp6eHPnfxQBr-_NGo.ttf" - }, - { - "family": "Noto Sans Sora Sompeng", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "sora-sompeng" - ], - "version": "v26", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHR818DpZXJQd4Mu.ttf", - "500": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHRO18DpZXJQd4Mu.ttf", - "600": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHSi0MDpZXJQd4Mu.ttf", - "700": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHSb0MDpZXJQd4Mu.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHR81_Dob3Y.ttf" - }, - { - "family": "Noto Sans Soyombo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "soyombo" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssoyombo/v18/RWmSoL-Y6-8q5LTtXs6MF6q7xsxgY0FrIFOcK25W.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssoyombo/v18/RWmSoL-Y6-8q5LTtXs6MF6q7xsxgY3FqKlc.ttf" - }, - { - "family": "Noto Sans Sundanese", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "sundanese" - ], - "version": "v28", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6ctxpNNHCizv7fQES.ttf", - "500": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6ctxbNNHCizv7fQES.ttf", - "600": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6cty3M9HCizv7fQES.ttf", - "700": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6ctyOM9HCizv7fQES.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6ctxpNOHDgT8.ttf" - }, - { - "family": "Noto Sans Sunuwar", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "sunuwar" - ], - "version": "v1", - "lastModified": "2025-06-26", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssunuwar/v1/FwZB7_04xUkosG2xJo2gm7nF0DTfho_Du2akOrkv.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssunuwar/v1/FwZB7_04xUkosG2xJo2gm7nF0DTfhr_CsWI.ttf" - }, - { - "family": "Noto Sans Syloti Nagri", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "syloti-nagri" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssylotinagri/v25/uU9eCAQZ75uhfF9UoWDRiY3q7Sf_VFV3m4dGFVfxN87gsj0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssylotinagri/v25/uU9eCAQZ75uhfF9UoWDRiY3q7Sf_VFV3m4dGJVb7Mw.ttf" - }, - { - "family": "Noto Sans Symbols", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "symbols" - ], - "version": "v47", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gfQ4gavVFRkzrbQ.ttf", - "200": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3g_Q8gavVFRkzrbQ.ttf", - "300": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gIw8gavVFRkzrbQ.ttf", - "regular": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gfQ8gavVFRkzrbQ.ttf", - "500": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gTw8gavVFRkzrbQ.ttf", - "600": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gowggavVFRkzrbQ.ttf", - "700": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gmgggavVFRkzrbQ.ttf", - "800": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3g_QggavVFRkzrbQ.ttf", - "900": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3g1AggavVFRkzrbQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gfQ8Qa_9B.ttf" - }, - { - "family": "Noto Sans Symbols 2", - "variants": [ - "regular" - ], - "subsets": [ - "braille", - "latin", - "latin-ext", - "math", - "mayan-numerals", - "symbols" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanssymbols2/v25/I_uyMoGduATTei9eI8daxVHDyfisHr71ypPqfX71-AI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssymbols2/v25/I_uyMoGduATTei9eI8daxVHDyfisHr71-pLgeQ.ttf" - }, - { - "family": "Noto Sans Syriac", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "syriac" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-VD9caJyZfUL_FC.ttf", - "200": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-XD9MaJyZfUL_FC.ttf", - "300": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Ud9MaJyZfUL_FC.ttf", - "regular": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-VD9MaJyZfUL_FC.ttf", - "500": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Vx9MaJyZfUL_FC.ttf", - "600": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Wd88aJyZfUL_FC.ttf", - "700": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Wk88aJyZfUL_FC.ttf", - "800": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-XD88aJyZfUL_FC.ttf", - "900": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Xq88aJyZfUL_FC.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-VD9PaIw5M.ttf" - }, - { - "family": "Noto Sans Syriac Eastern", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "syriac" - ], - "version": "v3", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPi-eszCL5ep1QPQ.ttf", - "200": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPq-fszCL5ep1QPQ.ttf", - "300": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPnGfszCL5ep1QPQ.ttf", - "regular": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPi-fszCL5ep1QPQ.ttf", - "500": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPh2fszCL5ep1QPQ.ttf", - "600": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPvGYszCL5ep1QPQ.ttf", - "700": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPsiYszCL5ep1QPQ.ttf", - "800": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPq-YszCL5ep1QPQ.ttf", - "900": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPoaYszCL5ep1QPQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPi-fgzGB4Q.ttf" - }, - { - "family": "Noto Sans TC", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v38", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz76Cz_CpOtma3uNQ.ttf", - "200": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7yCy_CpOtma3uNQ.ttf", - "300": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7_6y_CpOtma3uNQ.ttf", - "regular": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz76Cy_CpOtma3uNQ.ttf", - "500": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz75Ky_CpOtma3uNQ.ttf", - "600": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7361_CpOtma3uNQ.ttf", - "700": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz70e1_CpOtma3uNQ.ttf", - "800": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7yC1_CpOtma3uNQ.ttf", - "900": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7wm1_CpOtma3uNQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz76CyzCtEsg.ttf" - }, - { - "family": "Noto Sans Tagalog", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tagalog" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstagalog/v23/J7aFnoNzCnFcV9ZI-sUYuvote1R0wwEAA8jHexnL.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstagalog/v23/J7aFnoNzCnFcV9ZI-sUYuvote1R0wzEBCcw.ttf" - }, - { - "family": "Noto Sans Tagbanwa", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tagbanwa" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstagbanwa/v19/Y4GWYbB8VTEp4t3MKJSMmQdIKjRtt_nZRjQEaYpGoQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstagbanwa/v19/Y4GWYbB8VTEp4t3MKJSMmQdIKjRtt_npRz4A.ttf" - }, - { - "family": "Noto Sans Tai Le", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tai-le" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstaile/v18/vEFK2-VODB8RrNDvZSUmVxEATwR58tK1W77HtMo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstaile/v18/vEFK2-VODB8RrNDvZSUmVxEATwR5wtO_Xw.ttf" - }, - { - "family": "Noto Sans Tai Tham", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "tai-tham" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBCUbPgquyaRGKMw.ttf", - "500": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBBcbPgquyaRGKMw.ttf", - "600": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBPscPgquyaRGKMw.ttf", - "700": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBMIcPgquyaRGKMw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBCUbDgukzQ.ttf" - }, - { - "family": "Noto Sans Tai Viet", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tai-viet" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstaiviet/v20/8QIUdj3HhN_lv4jf9vsE-9GMOLsaSPZr644fWsRO9w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstaiviet/v20/8QIUdj3HhN_lv4jf9vsE-9GMOLsaSPZb6oQb.ttf" - }, - { - "family": "Noto Sans Takri", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "takri" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstakri/v25/TuGJUVpzXI5FBtUq5a8bnKIOdTwQNO_W3khJXg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstakri/v25/TuGJUVpzXI5FBtUq5a8bnKIOdTwgNeXS.ttf" - }, - { - "family": "Noto Sans Tamil", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil" - ], - "version": "v31", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7vGor0RqKDt_EvT.ttf", - "200": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7tGo70RqKDt_EvT.ttf", - "300": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7uYo70RqKDt_EvT.ttf", - "regular": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7vGo70RqKDt_EvT.ttf", - "500": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7v0o70RqKDt_EvT.ttf", - "600": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7sYpL0RqKDt_EvT.ttf", - "700": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7shpL0RqKDt_EvT.ttf", - "800": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7tGpL0RqKDt_EvT.ttf", - "900": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7tvpL0RqKDt_EvT.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7vGo40QoqQ.ttf" - }, - { - "family": "Noto Sans Tamil Supplement", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil-supplement" - ], - "version": "v23", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstamilsupplement/v23/DdTz78kEtnooLS5rXF1DaruiCd_bFp_Ph4sGcn7ax_vsAeMkeq1x.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstamilsupplement/v23/DdTz78kEtnooLS5rXF1DaruiCd_bFp_Ph4sGcn7ax8vtC-c.ttf" - }, - { - "family": "Noto Sans Tangsa", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "tangsa" - ], - "version": "v9", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp1YkyoRYdplyJDA.ttf", - "500": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp1qkyoRYdplyJDA.ttf", - "600": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp2GlCoRYdplyJDA.ttf", - "700": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp2_lCoRYdplyJDA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp1YkxoQa94.ttf" - }, - { - "family": "Noto Sans Telugu", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "telugu" - ], - "version": "v30", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntezfqQUbf-3v37w.ttf", - "200": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEnt-zbqQUbf-3v37w.ttf", - "300": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntJTbqQUbf-3v37w.ttf", - "regular": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntezbqQUbf-3v37w.ttf", - "500": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntSTbqQUbf-3v37w.ttf", - "600": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntpTHqQUbf-3v37w.ttf", - "700": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntnDHqQUbf-3v37w.ttf", - "800": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEnt-zHqQUbf-3v37w.ttf", - "900": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEnt0jHqQUbf-3v37w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntezbaQEzb.ttf" - }, - { - "family": "Noto Sans Thaana", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "thaana" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4XrbxLhnu4-tbNu.ttf", - "200": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4VrbhLhnu4-tbNu.ttf", - "300": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4W1bhLhnu4-tbNu.ttf", - "regular": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4XrbhLhnu4-tbNu.ttf", - "500": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4XZbhLhnu4-tbNu.ttf", - "600": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4U1aRLhnu4-tbNu.ttf", - "700": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4UMaRLhnu4-tbNu.ttf", - "800": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4VraRLhnu4-tbNu.ttf", - "900": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4VCaRLhnu4-tbNu.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4XrbiLglOo.ttf" - }, - { - "family": "Noto Sans Thai", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "thai" - ], - "version": "v29", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU5RspzF-QRvzzXg.ttf", - "200": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdUxRtpzF-QRvzzXg.ttf", - "300": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU8ptpzF-QRvzzXg.ttf", - "regular": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU5RtpzF-QRvzzXg.ttf", - "500": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU6ZtpzF-QRvzzXg.ttf", - "600": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU0pqpzF-QRvzzXg.ttf", - "700": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU3NqpzF-QRvzzXg.ttf", - "800": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdUxRqpzF-QRvzzXg.ttf", - "900": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdUz1qpzF-QRvzzXg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU5RtlzB0RQ.ttf" - }, - { - "family": "Noto Sans Thai Looped", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "thai" - ], - "version": "v16", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_gtHxJiQo49kz2h.ttf", - "200": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_itHhJiQo49kz2h.ttf", - "300": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_hzHhJiQo49kz2h.ttf", - "regular": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_gtHhJiQo49kz2h.ttf", - "500": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_gfHhJiQo49kz2h.ttf", - "600": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_jzGRJiQo49kz2h.ttf", - "700": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_jKGRJiQo49kz2h.ttf", - "800": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_itGRJiQo49kz2h.ttf", - "900": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_iEGRJiQo49kz2h.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_gtHiJjSIo.ttf" - }, - { - "family": "Noto Sans Tifinagh", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tifinagh" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstifinagh/v21/I_uzMoCduATTei9eI8dawkHIwvmhCvbn6rnEcXfs4Q.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstifinagh/v21/I_uzMoCduATTei9eI8dawkHIwvmhCvbX67PA.ttf" - }, - { - "family": "Noto Sans Tirhuta", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tirhuta" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanstirhuta/v17/t5t6IQYRNJ6TWjahPR6X-M-apUyby7uGUBsTrn5P.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanstirhuta/v17/t5t6IQYRNJ6TWjahPR6X-M-apUyby4uHWh8.ttf" - }, - { - "family": "Noto Sans Ugaritic", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "ugaritic" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansugaritic/v17/3qTwoiqhnSyU8TNFIdhZVCwbjCpkAXXkMhoIkiazfg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansugaritic/v17/3qTwoiqhnSyU8TNFIdhZVCwbjCpkAXXUMxAM.ttf" - }, - { - "family": "Noto Sans Vai", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vai" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansvai/v18/NaPecZTSBuhTirw6IaFn_UrURMTsDIRSfr0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansvai/v18/NaPecZTSBuhTirw6IaFn_UrUdMXmCA.ttf" - }, - { - "family": "Noto Sans Vithkuqi", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vithkuqi" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnva5SgKM7vmn0BLE.ttf", - "500": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnvZxSgKM7vmn0BLE.ttf", - "600": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnvXBVgKM7vmn0BLE.ttf", - "700": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnvUlVgKM7vmn0BLE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnva5SsKIxug.ttf" - }, - { - "family": "Noto Sans Wancho", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "wancho" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanswancho/v18/zrf-0GXXyfn6Fs0lH9P4cUubP0GBqAPopiRfKp8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanswancho/v18/zrf-0GXXyfn6Fs0lH9P4cUubP0GBmALiog.ttf" - }, - { - "family": "Noto Sans Warang Citi", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "warang-citi" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanswarangciti/v18/EYqtmb9SzL1YtsZSScyKDXIeOv3w-zgsNvKRpeVCCXzdgA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanswarangciti/v18/EYqtmb9SzL1YtsZSScyKDXIeOv3w-zgsNvKhpO9G.ttf" - }, - { - "family": "Noto Sans Yi", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "yi" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notosansyi/v20/sJoD3LFXjsSdcnzn071rO3apxVDJNVgSNg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosansyi/v20/sJoD3LFXjsSdcnzn071rO3aZxFrN.ttf" - }, - { - "family": "Noto Sans Zanabazar Square", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "zanabazar-square" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notosanszanabazarsquare/v20/Cn-jJsuGWQxOjaGwMQ6fOicyxLBEMRfDtkzl4uagQtJxOCEgN0Gc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notosanszanabazarsquare/v20/Cn-jJsuGWQxOjaGwMQ6fOicyxLBEMRfDtkzl4uagQuJwMiU.ttf" - }, - { - "family": "Noto Serif", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "math", - "vietnamese" - ], - "version": "v33", - "lastModified": "2025-09-06", - "files": { - "100": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZqFGjwM0Lhq_Szw.ttf", - "200": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZKFCjwM0Lhq_Szw.ttf", - "300": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZ9lCjwM0Lhq_Szw.ttf", - "regular": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZqFCjwM0Lhq_Szw.ttf", - "500": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZmlCjwM0Lhq_Szw.ttf", - "600": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZdlejwM0Lhq_Szw.ttf", - "700": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZT1ejwM0Lhq_Szw.ttf", - "800": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZKFejwM0Lhq_Szw.ttf", - "900": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZAVejwM0Lhq_Szw.ttf", - "100italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBNLgscPpKrCzyUi.ttf", - "200italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBPLg8cPpKrCzyUi.ttf", - "300italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBMVg8cPpKrCzyUi.ttf", - "italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBNLg8cPpKrCzyUi.ttf", - "500italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBN5g8cPpKrCzyUi.ttf", - "600italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBOVhMcPpKrCzyUi.ttf", - "700italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBOshMcPpKrCzyUi.ttf", - "800italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBPLhMcPpKrCzyUi.ttf", - "900italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBPihMcPpKrCzyUi.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZqFCTwccP.ttf" - }, - { - "family": "Noto Serif Ahom", - "variants": [ - "regular" - ], - "subsets": [ - "ahom", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifahom/v21/FeVIS0hfp6cprmEUffAW_fUL_AN-wuYrPFiwaw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifahom/v21/FeVIS0hfp6cprmEUffAW_fUL_ANOw-wv.ttf" - }, - { - "family": "Noto Serif Armenian", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "armenian", - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZi8ObxvXagGdkbg.ttf", - "200": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZC8KbxvXagGdkbg.ttf", - "300": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZ1cKbxvXagGdkbg.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZi8KbxvXagGdkbg.ttf", - "500": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZucKbxvXagGdkbg.ttf", - "600": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZVcWbxvXagGdkbg.ttf", - "700": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZbMWbxvXagGdkbg.ttf", - "800": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZC8WbxvXagGdkbg.ttf", - "900": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZIsWbxvXagGdkbg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZi8Krx__e.ttf" - }, - { - "family": "Noto Serif Balinese", - "variants": [ - "regular" - ], - "subsets": [ - "balinese", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifbalinese/v21/QdVKSS0-JginysQSRvuCmUMB_wVeQAxXRbgJdhapcUU.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifbalinese/v21/QdVKSS0-JginysQSRvuCmUMB_wVeQAxXdbkDcg.ttf" - }, - { - "family": "Noto Serif Bengali", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "bengali", - "latin", - "latin-ext" - ], - "version": "v31", - "lastModified": "2025-09-17", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfcAH3qn4LjQH8yD.ttf", - "200": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfeAHnqn4LjQH8yD.ttf", - "300": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfdeHnqn4LjQH8yD.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfcAHnqn4LjQH8yD.ttf", - "500": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfcyHnqn4LjQH8yD.ttf", - "600": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JffeGXqn4LjQH8yD.ttf", - "700": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JffnGXqn4LjQH8yD.ttf", - "800": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfeAGXqn4LjQH8yD.ttf", - "900": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfepGXqn4LjQH8yD.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfcAHkqm6rw.ttf" - }, - { - "family": "Noto Serif Devanagari", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v34", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTA-og-HMUe1u_dv.ttf", - "200": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTC-ow-HMUe1u_dv.ttf", - "300": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTBgow-HMUe1u_dv.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTA-ow-HMUe1u_dv.ttf", - "500": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTAMow-HMUe1u_dv.ttf", - "600": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTDgpA-HMUe1u_dv.ttf", - "700": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTDZpA-HMUe1u_dv.ttf", - "800": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTC-pA-HMUe1u_dv.ttf", - "900": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTCXpA-HMUe1u_dv.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTA-oz-GO0M.ttf" - }, - { - "family": "Noto Serif Display", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-06", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVpd49gKaDU9hvzC.ttf", - "200": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVrd4tgKaDU9hvzC.ttf", - "300": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVoD4tgKaDU9hvzC.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVpd4tgKaDU9hvzC.ttf", - "500": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVpv4tgKaDU9hvzC.ttf", - "600": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVqD5dgKaDU9hvzC.ttf", - "700": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVq65dgKaDU9hvzC.ttf", - "800": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVrd5dgKaDU9hvzC.ttf", - "900": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVr05dgKaDU9hvzC.ttf", - "100italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoTBIYjEfg-zCmf4.ttf", - "200italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VobBJYjEfg-zCmf4.ttf", - "300italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoW5JYjEfg-zCmf4.ttf", - "italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoTBJYjEfg-zCmf4.ttf", - "500italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoQJJYjEfg-zCmf4.ttf", - "600italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-Voe5OYjEfg-zCmf4.ttf", - "700italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoddOYjEfg-zCmf4.ttf", - "800italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VobBOYjEfg-zCmf4.ttf", - "900italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoZlOYjEfg-zCmf4.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVpd4ugLYjE.ttf" - }, - { - "family": "Noto Serif Dives Akuru", - "variants": [ - "regular" - ], - "subsets": [ - "dives-akuru", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifdivesakuru/v8/QldfNSVMqAsHtsJ_TnD3aT03sMgd57ibeeZT60DIyoV9Ejs.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifdivesakuru/v8/QldfNSVMqAsHtsJ_TnD3aT03sMgd57ibeeZT20HCzg.ttf" - }, - { - "family": "Noto Serif Dogra", - "variants": [ - "regular" - ], - "subsets": [ - "dogra", - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifdogra/v24/MQpP-XquKMC7ROPP3QOOlm7xPu3fGy63IbPzkns.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifdogra/v24/MQpP-XquKMC7ROPP3QOOlm7xPu3fKy-9JQ.ttf" - }, - { - "family": "Noto Serif Ethiopic", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "ethiopic", - "latin", - "latin-ext" - ], - "version": "v32", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCzSQjkaO9UVLyiw.ttf", - "200": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCTSUjkaO9UVLyiw.ttf", - "300": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCkyUjkaO9UVLyiw.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCzSUjkaO9UVLyiw.ttf", - "500": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxC_yUjkaO9UVLyiw.ttf", - "600": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCEyIjkaO9UVLyiw.ttf", - "700": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCKiIjkaO9UVLyiw.ttf", - "800": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCTSIjkaO9UVLyiw.ttf", - "900": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCZCIjkaO9UVLyiw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCzSUTkKm5.ttf" - }, - { - "family": "Noto Serif Georgian", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "georgian", - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSTvsfdzTw-FgZxQ.ttf", - "200": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSzvofdzTw-FgZxQ.ttf", - "300": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSEPofdzTw-FgZxQ.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSTvofdzTw-FgZxQ.ttf", - "500": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSfPofdzTw-FgZxQ.ttf", - "600": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSkP0fdzTw-FgZxQ.ttf", - "700": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSqf0fdzTw-FgZxQ.ttf", - "800": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSzv0fdzTw-FgZxQ.ttf", - "900": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aS5_0fdzTw-FgZxQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSTvovdj70.ttf" - }, - { - "family": "Noto Serif Grantha", - "variants": [ - "regular" - ], - "subsets": [ - "grantha", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifgrantha/v22/qkBIXuEH5NzDDvc3fLDYxPk9-Wq3WLiqFENLR7fHGw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifgrantha/v22/qkBIXuEH5NzDDvc3fLDYxPk9-Wq3WLiaFUlP.ttf" - }, - { - "family": "Noto Serif Gujarati", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v29", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuYycYzuM1Kf-OJu.ttf", - "200": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuaycIzuM1Kf-OJu.ttf", - "300": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuZscIzuM1Kf-OJu.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuYycIzuM1Kf-OJu.ttf", - "500": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuYAcIzuM1Kf-OJu.ttf", - "600": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2Hubsd4zuM1Kf-OJu.ttf", - "700": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HubVd4zuM1Kf-OJu.ttf", - "800": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2Huayd4zuM1Kf-OJu.ttf", - "900": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2Huabd4zuM1Kf-OJu.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuYycLzvOVY.ttf" - }, - { - "family": "Noto Serif Gurmukhi", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "gurmukhi", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr6-eBTNmqVU7y6l.ttf", - "200": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr4-eRTNmqVU7y6l.ttf", - "300": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr7geRTNmqVU7y6l.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr6-eRTNmqVU7y6l.ttf", - "500": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr6MeRTNmqVU7y6l.ttf", - "600": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr5gfhTNmqVU7y6l.ttf", - "700": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr5ZfhTNmqVU7y6l.ttf", - "800": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr4-fhTNmqVU7y6l.ttf", - "900": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr4XfhTNmqVU7y6l.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr6-eSTMkKE.ttf" - }, - { - "family": "Noto Serif HK", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "chinese-hongkong", - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMf-K2RmV9Su1M6i.ttf", - "300": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMcgK2RmV9Su1M6i.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMd-K2RmV9Su1M6i.ttf", - "500": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMdMK2RmV9Su1M6i.ttf", - "600": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMegLGRmV9Su1M6i.ttf", - "700": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMeZLGRmV9Su1M6i.ttf", - "800": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMf-LGRmV9Su1M6i.ttf", - "900": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMfXLGRmV9Su1M6i.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMd-K1RnXdA.ttf" - }, - { - "family": "Noto Serif Hebrew", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVAwTAG8_vlQxz24.ttf", - "200": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVIwSAG8_vlQxz24.ttf", - "300": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVFISAG8_vlQxz24.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVAwSAG8_vlQxz24.ttf", - "500": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVD4SAG8_vlQxz24.ttf", - "600": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVNIVAG8_vlQxz24.ttf", - "700": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVOsVAG8_vlQxz24.ttf", - "800": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVIwVAG8_vlQxz24.ttf", - "900": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVKUVAG8_vlQxz24.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVAwSMG41ug.ttf" - }, - { - "family": "Noto Serif Hentaigana", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "kana-extended", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzgwGqxEZWEARdDE.ttf", - "300": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hztIGqxEZWEARdDE.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzowGqxEZWEARdDE.ttf", - "500": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzr4GqxEZWEARdDE.ttf", - "600": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzlIBqxEZWEARdDE.ttf", - "700": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzmsBqxEZWEARdDE.ttf", - "800": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzgwBqxEZWEARdDE.ttf", - "900": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hziUBqxEZWEARdDE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzowGmxATXA.ttf" - }, - { - "family": "Noto Serif JP", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v32", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2byxOubAILO5wBCU.ttf", - "300": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bxvOubAILO5wBCU.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bwxOubAILO5wBCU.ttf", - "500": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bwDOubAILO5wBCU.ttf", - "600": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bzvPebAILO5wBCU.ttf", - "700": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bzWPebAILO5wBCU.ttf", - "800": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2byxPebAILO5wBCU.ttf", - "900": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2byYPebAILO5wBCU.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bwxOtbBKrc.ttf" - }, - { - "family": "Noto Serif KR", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "korean", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v30", - "lastModified": "2025-09-02", - "files": { - "200": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOnchmeM524ZvTePRu.ttf", - "300": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOnci4eM524ZvTePRu.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncjmeM524ZvTePRu.ttf", - "500": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncjUeM524ZvTePRu.ttf", - "600": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncg4f8524ZvTePRu.ttf", - "700": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncgBf8524ZvTePRu.ttf", - "800": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOnchmf8524ZvTePRu.ttf", - "900": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOnchPf8524ZvTePRu.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncjmeP53658.ttf" - }, - { - "family": "Noto Serif Kannada", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgcYCceRJ71svgcI.ttf", - "200": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgUYDceRJ71svgcI.ttf", - "300": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgZgDceRJ71svgcI.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgcYDceRJ71svgcI.ttf", - "500": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgfQDceRJ71svgcI.ttf", - "600": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgRgEceRJ71svgcI.ttf", - "700": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgSEEceRJ71svgcI.ttf", - "800": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgUYEceRJ71svgcI.ttf", - "900": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgW8EceRJ71svgcI.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgcYDQeVD6w.ttf" - }, - { - "family": "Noto Serif Khitan Small Script", - "variants": [ - "regular" - ], - "subsets": [ - "khitan-small-script", - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifkhitansmallscript/v4/jizzRFVKsm4Bt9PrbSzC4KLlQUF5lRJg5j-l5PvyhfTdd4TsZ8lb39iddA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifkhitansmallscript/v4/jizzRFVKsm4Bt9PrbSzC4KLlQUF5lRJg5j-l5PvyhfTdd4TcZsNf.ttf" - }, - { - "family": "Noto Serif Khmer", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "khmer", - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdN6B4wXEZK9Xo4xg.ttf", - "200": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNaB8wXEZK9Xo4xg.ttf", - "300": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNth8wXEZK9Xo4xg.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdN6B8wXEZK9Xo4xg.ttf", - "500": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdN2h8wXEZK9Xo4xg.ttf", - "600": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNNhgwXEZK9Xo4xg.ttf", - "700": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNDxgwXEZK9Xo4xg.ttf", - "800": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNaBgwXEZK9Xo4xg.ttf", - "900": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNQRgwXEZK9Xo4xg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdN6B8AXUxO.ttf" - }, - { - "family": "Noto Serif Khojki", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "khojki", - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMY0ghvyZ0Qtc5HAQ.ttf", - "500": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMY4AhvyZ0Qtc5HAQ.ttf", - "600": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMYDA9vyZ0Qtc5HAQ.ttf", - "700": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMYNQ9vyZ0Qtc5HAQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMY0ghfyJcU.ttf" - }, - { - "family": "Noto Serif Lao", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "lao", - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VeMLrvOjlmyhHHQ.ttf", - "200": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VWMKrvOjlmyhHHQ.ttf", - "300": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8Vb0KrvOjlmyhHHQ.ttf", - "regular": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VeMKrvOjlmyhHHQ.ttf", - "500": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VdEKrvOjlmyhHHQ.ttf", - "600": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VT0NrvOjlmyhHHQ.ttf", - "700": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VQQNrvOjlmyhHHQ.ttf", - "800": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VWMNrvOjlmyhHHQ.ttf", - "900": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VUoNrvOjlmyhHHQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VeMKnvKpkg.ttf" - }, - { - "family": "Noto Serif Makasar", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "makasar" - ], - "version": "v1", - "lastModified": "2023-06-30", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifmakasar/v1/memjYbqtyH-NiZpFH_9zcvB_PqkfY9S7j4HTVSmevw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifmakasar/v1/memjYbqtyH-NiZpFH_9zcvB_PqkfY9SLjovX.ttf" - }, - { - "family": "Noto Serif Malayalam", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "malayalam" - ], - "version": "v32", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1t-1fnVwHpQVySg.ttf", - "200": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1N-xfnVwHpQVySg.ttf", - "300": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL16exfnVwHpQVySg.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1t-xfnVwHpQVySg.ttf", - "500": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1hexfnVwHpQVySg.ttf", - "600": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1aetfnVwHpQVySg.ttf", - "700": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1UOtfnVwHpQVySg.ttf", - "800": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1N-tfnVwHpQVySg.ttf", - "900": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1HutfnVwHpQVySg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1t-xvnFYD.ttf" - }, - { - "family": "Noto Serif Myanmar", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "myanmar" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJudM7F2Yv76aBKKs-bHMQfAHUw3jnNwBDsU9X6RPzQ.ttf", - "200": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNbDHMefv2TeXJng.ttf", - "300": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNCDLMefv2TeXJng.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJsdM7F2Yv76aBKKs-bHMQfAHUw3jn1pBrocdDqRA.ttf", - "500": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNUDPMefv2TeXJng.ttf", - "600": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNfDTMefv2TeXJng.ttf", - "700": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNGDXMefv2TeXJng.ttf", - "800": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNBDbMefv2TeXJng.ttf", - "900": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNIDfMefv2TeXJng.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJsdM7F2Yv76aBKKs-bHMQfAHUw3jnFpRDs.ttf" - }, - { - "family": "Noto Serif NP Hmong", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "nyiakeng-puachue-hmong" - ], - "version": "v5", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbjPhFLp3u0rVO-d.ttf", - "500": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbj9hFLp3u0rVO-d.ttf", - "600": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbgRg1Lp3u0rVO-d.ttf", - "700": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbgog1Lp3u0rVO-d.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbjPhGLo1Ok.ttf" - }, - { - "family": "Noto Serif Old Uyghur", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "old-uyghur" - ], - "version": "v4", - "lastModified": "2024-09-23", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifolduyghur/v4/v6-KGZbLJFKIhClqUYqXDiGnrVoFRCW6JdwnKumeF2yVgA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifolduyghur/v4/v6-KGZbLJFKIhClqUYqXDiGnrVoFRCW6JdwXK-Oa.ttf" - }, - { - "family": "Noto Serif Oriya", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "oriya" - ], - "version": "v6", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxrc_Hy-v039MF1j.ttf", - "500": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxru_Hy-v039MF1j.ttf", - "600": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxoC-3y-v039MF1j.ttf", - "700": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxo7-3y-v039MF1j.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxrc_Ey_tUk.ttf" - }, - { - "family": "Noto Serif Ottoman Siyaq", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "ottoman-siyaq-numbers" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifottomansiyaq/v2/fC1yPZ9IYnzRhTrrc4s8cSvYI0eozzaFOQ01qoHLJrgA00kAdA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifottomansiyaq/v2/fC1yPZ9IYnzRhTrrc4s8cSvYI0eozzaFOQ01qoH7J7IE.ttf" - }, - { - "family": "Noto Serif SC", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "chinese-simplified", - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v34", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7QCqyWv847hdDWC.ttf", - "300": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7TcqyWv847hdDWC.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7SCqyWv847hdDWC.ttf", - "500": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7SwqyWv847hdDWC.ttf", - "600": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7RcrCWv847hdDWC.ttf", - "700": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7RlrCWv847hdDWC.ttf", - "800": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7QCrCWv847hdDWC.ttf", - "900": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7QrrCWv847hdDWC.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7SCqxWu-Yo.ttf" - }, - { - "family": "Noto Serif Sinhala", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "sinhala" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pGxRlMsxaLRn3W-.ttf", - "200": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pExR1MsxaLRn3W-.ttf", - "300": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pHvR1MsxaLRn3W-.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pGxR1MsxaLRn3W-.ttf", - "500": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pGDR1MsxaLRn3W-.ttf", - "600": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pFvQFMsxaLRn3W-.ttf", - "700": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pFWQFMsxaLRn3W-.ttf", - "800": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pExQFMsxaLRn3W-.ttf", - "900": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pEYQFMsxaLRn3W-.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pGxR2Mtz6Y.ttf" - }, - { - "family": "Noto Serif TC", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v34", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX_aMOpDOWYMr2OM.ttf", - "300": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX8EMOpDOWYMr2OM.ttf", - "regular": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX9aMOpDOWYMr2OM.ttf", - "500": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX9oMOpDOWYMr2OM.ttf", - "600": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX-EN-pDOWYMr2OM.ttf", - "700": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX-9N-pDOWYMr2OM.ttf", - "800": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX_aN-pDOWYMr2OM.ttf", - "900": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX_zN-pDOWYMr2OM.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX9aMNpCM2I.ttf" - }, - { - "family": "Noto Serif Tamil", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil" - ], - "version": "v31", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecattN6R8Pz3v8Etew.ttf", - "200": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatNN-R8Pz3v8Etew.ttf", - "300": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecat6t-R8Pz3v8Etew.ttf", - "regular": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecattN-R8Pz3v8Etew.ttf", - "500": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatht-R8Pz3v8Etew.ttf", - "600": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatatiR8Pz3v8Etew.ttf", - "700": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatU9iR8Pz3v8Etew.ttf", - "800": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatNNiR8Pz3v8Etew.ttf", - "900": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatHdiR8Pz3v8Etew.ttf", - "100italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJx5svbzncQ9e3wx.ttf", - "200italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJz5s_bzncQ9e3wx.ttf", - "300italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJwns_bzncQ9e3wx.ttf", - "italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJx5s_bzncQ9e3wx.ttf", - "500italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJxLs_bzncQ9e3wx.ttf", - "600italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJyntPbzncQ9e3wx.ttf", - "700italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJyetPbzncQ9e3wx.ttf", - "800italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJz5tPbzncQ9e3wx.ttf", - "900italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJzQtPbzncQ9e3wx.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecattN-h8fbz.ttf" - }, - { - "family": "Noto Serif Tangut", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tangut" - ], - "version": "v19", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/notoseriftangut/v19/xn76YGc72GKoTvER4Gn3b4m9Ern7Em41fcvN2KT4.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoseriftangut/v19/xn76YGc72GKoTvER4Gn3b4m9Ern7El40d88.ttf" - }, - { - "family": "Noto Serif Telugu", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "telugu" - ], - "version": "v29", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9D9TGwuY2fjgrZYA.ttf", - "200": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DdTCwuY2fjgrZYA.ttf", - "300": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DqzCwuY2fjgrZYA.ttf", - "regular": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9D9TCwuY2fjgrZYA.ttf", - "500": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DxzCwuY2fjgrZYA.ttf", - "600": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DKzewuY2fjgrZYA.ttf", - "700": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DEjewuY2fjgrZYA.ttf", - "800": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DdTewuY2fjgrZYA.ttf", - "900": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DXDewuY2fjgrZYA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9D9TCAuIeb.ttf" - }, - { - "family": "Noto Serif Thai", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "thai" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0oiFuRRCmsdu0Qx.ttf", - "200": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0qiF-RRCmsdu0Qx.ttf", - "300": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0p8F-RRCmsdu0Qx.ttf", - "regular": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0oiF-RRCmsdu0Qx.ttf", - "500": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0oQF-RRCmsdu0Qx.ttf", - "600": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0r8EORRCmsdu0Qx.ttf", - "700": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0rFEORRCmsdu0Qx.ttf", - "800": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0qiEORRCmsdu0Qx.ttf", - "900": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0qLEORRCmsdu0Qx.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0oiF9RQAG8.ttf" - }, - { - "family": "Noto Serif Tibetan", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "tibetan" - ], - "version": "v24", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIrYdPS7rdSy_32c.ttf", - "200": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIjYcPS7rdSy_32c.ttf", - "300": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIugcPS7rdSy_32c.ttf", - "regular": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIrYcPS7rdSy_32c.ttf", - "500": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIoQcPS7rdSy_32c.ttf", - "600": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmImgbPS7rdSy_32c.ttf", - "700": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIlEbPS7rdSy_32c.ttf", - "800": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIjYbPS7rdSy_32c.ttf", - "900": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIh8bPS7rdSy_32c.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIrYcDS_hcQ.ttf" - }, - { - "family": "Noto Serif Todhri", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "todhri" - ], - "version": "v3", - "lastModified": "2025-01-23", - "files": { - "regular": "https://fonts.gstatic.com/s/notoseriftodhri/v3/dFalZeyY-aYz1YVbjMoBWml1nBz7N3ByX6n0fnNk.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoseriftodhri/v3/dFalZeyY-aYz1YVbjMoBWml1nBz7N0BzVa0.ttf" - }, - { - "family": "Noto Serif Toto", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "toto" - ], - "version": "v7", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhCy3Il-aj55vdNug.ttf", - "500": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhCx_Il-aj55vdNug.ttf", - "600": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhC_PPl-aj55vdNug.ttf", - "700": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhC8rPl-aj55vdNug.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhCy3Ip-ep4w.ttf" - }, - { - "family": "Noto Serif Vithkuqi", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vithkuqi" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRWMdW2Cqy9A4teH.ttf", - "500": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRW-dW2Cqy9A4teH.ttf", - "600": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRVScm2Cqy9A4teH.ttf", - "700": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRVrcm2Cqy9A4teH.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRWMdV2DoSs.ttf" - }, - { - "family": "Noto Serif Yezidi", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "yezidi" - ], - "version": "v23", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspD2yEkrlGJgmVCqg.ttf", - "500": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspD6SEkrlGJgmVCqg.ttf", - "600": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspDBSYkrlGJgmVCqg.ttf", - "700": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspDPCYkrlGJgmVCqg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspD2yEUr1uN.ttf" - }, - { - "family": "Noto Traditional Nushu", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "nushu" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXvy1tnPa7QoqirI.ttf", - "regular": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXus1tnPa7QoqirI.ttf", - "500": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXue1tnPa7QoqirI.ttf", - "600": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXty0dnPa7QoqirI.ttf", - "700": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXtL0dnPa7QoqirI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXus1unOYbA.ttf" - }, - { - "family": "Noto Znamenny Musical Notation", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols", - "znamenny" - ], - "version": "v7", - "lastModified": "2025-06-09", - "files": { - "regular": "https://fonts.gstatic.com/s/notoznamennymusicalnotation/v7/CSRW4ylQnPyaDwAMK1U_AolTaJ4Lz41GcgaIZV9YO2rO88jvtpqqdoWa7g.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/notoznamennymusicalnotation/v7/CSRW4ylQnPyaDwAMK1U_AolTaJ4Lz41GcgaIZV9YO2rO88jft5Cu.ttf", - "colorCapabilities": [ - "COLRv0" - ] - }, - { - "family": "Nova Cut", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/novacut/v26/KFOkCnSYu8mL-39LkWxPKTM1K9nz.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/novacut/v26/KFOkCnSYu8mL-39LkVxOIzc.ttf" - }, - { - "family": "Nova Flat", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/novaflat/v26/QdVUSTc-JgqpytEbVebEuStkm20oJA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/novaflat/v26/QdVUSTc-JgqpytEbVeb0uCFg.ttf" - }, - { - "family": "Nova Mono", - "variants": [ - "regular" - ], - "subsets": [ - "greek", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/novamono/v23/Cn-0JtiGWQ5Ajb--MRKfYGxYrdM9Sg.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/novamono/v23/Cn-0JtiGWQ5Ajb--MRKvYWZc.ttf" - }, - { - "family": "Nova Oval", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/novaoval/v26/jAnEgHdmANHvPenMaswCMY-h3cWkWg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/novaoval/v26/jAnEgHdmANHvPenMaswyMIWl.ttf" - }, - { - "family": "Nova Round", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/novaround/v23/flU9Rqquw5UhEnlwTJYTYYfeeetYEBc.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/novaround/v23/flU9Rqquw5UhEnlwTJYTUYbUfQ.ttf" - }, - { - "family": "Nova Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/novascript/v27/7Au7p_IpkSWSTWaFWkumvmQNEl0O0kEx.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/novascript/v27/7Au7p_IpkSWSTWaFWkumvlQMGFk.ttf" - }, - { - "family": "Nova Slim", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/novaslim/v26/Z9XUDmZNQAuem8jyZcn-yMOInrib9Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/novaslim/v26/Z9XUDmZNQAuem8jyZcnOycmM.ttf" - }, - { - "family": "Nova Square", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/novasquare/v27/RrQUbo9-9DV7b06QHgSWsZhARYMgGtWA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/novasquare/v27/RrQUbo9-9DV7b06QHgSWsahBT4c.ttf" - }, - { - "family": "Numans", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/numans/v16/SlGRmQmGupYAfH8IYRggiHVqaQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/numans/v16/SlGRmQmGupYAfH84YBIk.ttf" - }, - { - "family": "Nunito", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v32", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDDshRTM9jo7eTWk.ttf", - "300": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDOUhRTM9jo7eTWk.ttf", - "regular": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDLshRTM9jo7eTWk.ttf", - "500": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhRTM9jo7eTWk.ttf", - "600": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDGUmRTM9jo7eTWk.ttf", - "700": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDFwmRTM9jo7eTWk.ttf", - "800": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDDsmRTM9jo7eTWk.ttf", - "900": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDBImRTM9jo7eTWk.ttf", - "200italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiLXA3iqzbXWnoeg.ttf", - "300italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNi83A3iqzbXWnoeg.ttf", - "italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNirXA3iqzbXWnoeg.ttf", - "500italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNin3A3iqzbXWnoeg.ttf", - "600italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNic3c3iqzbXWnoeg.ttf", - "700italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiSnc3iqzbXWnoeg.ttf", - "800italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiLXc3iqzbXWnoeg.ttf", - "900italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiBHc3iqzbXWnoeg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDLshdTI3ig.ttf" - }, - { - "family": "Nunito Sans", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GVilntF8kA_Ykqw.ttf", - "300": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GiClntF8kA_Ykqw.ttf", - "regular": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4G1ilntF8kA_Ykqw.ttf", - "500": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4G5ClntF8kA_Ykqw.ttf", - "600": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GCC5ntF8kA_Ykqw.ttf", - "700": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GMS5ntF8kA_Ykqw.ttf", - "800": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GVi5ntF8kA_Ykqw.ttf", - "900": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4Gfy5ntF8kA_Ykqw.ttf", - "200italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmoP91UgIfM0qxVd.ttf", - "300italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmrR91UgIfM0qxVd.ttf", - "italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmqP91UgIfM0qxVd.ttf", - "500italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmq991UgIfM0qxVd.ttf", - "600italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmpR8FUgIfM0qxVd.ttf", - "700italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmpo8FUgIfM0qxVd.ttf", - "800italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmoP8FUgIfM0qxVd.ttf", - "900italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmom8FUgIfM0qxVd.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4G1ilXtVUg.ttf" - }, - { - "family": "Nuosu SIL", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "yi" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/nuosusil/v12/8vIK7wM3wmRn_kc4uAjeFGxbO_zo-w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/nuosusil/v12/8vIK7wM3wmRn_kc4uAjuFWZf.ttf" - }, - { - "family": "Odibee Sans", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/odibeesans/v20/neIPzCSooYAho6WvjeToRYkyepH9qGsf.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/odibeesans/v20/neIPzCSooYAho6WvjeToRbkzcJU.ttf" - }, - { - "family": "Odor Mean Chey", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v31", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/odormeanchey/v31/raxkHiKDttkTe1aOGcJMR1A_4mrY2zqUKafv.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/odormeanchey/v31/raxkHiKDttkTe1aOGcJMR1A_4lrZ0T4.ttf" - }, - { - "family": "Offside", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/offside/v26/HI_KiYMWKa9QrAykQ5HiRp-dhpQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/offside/v26/HI_KiYMWKa9QrAykc5DoQg.ttf" - }, - { - "family": "Oi", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "tamil", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/oi/v21/w8gXH2EuRqtaut6yjBOG.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oi/v21/w8gXH2EuRptbsNo.ttf" - }, - { - "family": "Ojuju", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_ypk552FRLYeruQ.ttf", - "300": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_FJk552FRLYeruQ.ttf", - "regular": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_Spk552FRLYeruQ.ttf", - "500": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_eJk552FRLYeruQ.ttf", - "600": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_lJ4552FRLYeruQ.ttf", - "700": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_rZ4552FRLYeruQ.ttf", - "800": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_yp4552FRLYeruQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_SpkJ5mtV.ttf" - }, - { - "family": "Old Standard TT", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/oldstandardtt/v22/MwQubh3o1vLImiwAVvYawgcf2eVurVC5RHdCZg.ttf", - "italic": "https://fonts.gstatic.com/s/oldstandardtt/v22/MwQsbh3o1vLImiwAVvYawgcf2eVer1q9ZnJSZtQG.ttf", - "700": "https://fonts.gstatic.com/s/oldstandardtt/v22/MwQrbh3o1vLImiwAVvYawgcf2eVWEX-dTFxeb80flQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oldstandardtt/v22/MwQubh3o1vLImiwAVvYawgcf2eVerFq9.ttf" - }, - { - "family": "Oldenburg", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/oldenburg/v24/fC1jPY5JYWzbywv7c4V6UU6oXyndrw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oldenburg/v24/fC1jPY5JYWzbywv7c4VKUESs.ttf" - }, - { - "family": "Ole", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/ole/v3/dFazZf6Z-rd89fw69qJ_ew.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ole/v3/dFazZf6Z-rdM9PY-.ttf" - }, - { - "family": "Oleo Script", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/oleoscript/v15/rax5HieDvtMOe0iICsUccBhasU7Q8Cad.ttf", - "700": "https://fonts.gstatic.com/s/oleoscript/v15/raxkHieDvtMOe0iICsUccCDmnmrY2zqUKafv.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oleoscript/v15/rax5HieDvtMOe0iICsUccChbu0o.ttf" - }, - { - "family": "Oleo Script Swash Caps", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/oleoscriptswashcaps/v14/Noaj6Vb-w5SFbTTAsZP_7JkCS08K-jCzDn_HMXquSY0Hg90.ttf", - "700": "https://fonts.gstatic.com/s/oleoscriptswashcaps/v14/Noag6Vb-w5SFbTTAsZP_7JkCS08K-jCzDn_HCcaBbYUsn9T5dt0.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oleoscriptswashcaps/v14/Noaj6Vb-w5SFbTTAsZP_7JkCS08K-jCzDn_HAXukTQ.ttf" - }, - { - "family": "Onest", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v9", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPh9R6ZshFMQWXgSQ.ttf", - "200": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhdR-ZshFMQWXgSQ.ttf", - "300": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhqx-ZshFMQWXgSQ.ttf", - "regular": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPh9R-ZshFMQWXgSQ.ttf", - "500": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhxx-ZshFMQWXgSQ.ttf", - "600": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhKxiZshFMQWXgSQ.ttf", - "700": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhEhiZshFMQWXgSQ.ttf", - "800": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhdRiZshFMQWXgSQ.ttf", - "900": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhXBiZshFMQWXgSQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPh9R-psxtI.ttf" - }, - { - "family": "Oooh Baby", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/ooohbaby/v4/2sDcZGJWgJTT2Jf76xQDb2-4C7wFZQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ooohbaby/v4/2sDcZGJWgJTT2Jf76xQzbmW8.ttf" - }, - { - "family": "Open Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "hebrew", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v44", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4nY1M2xLER.ttf", - "regular": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4nY1M2xLER.ttf", - "500": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjr0C4nY1M2xLER.ttf", - "600": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsgH1y4nY1M2xLER.ttf", - "700": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4nY1M2xLER.ttf", - "800": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgshZ1y4nY1M2xLER.ttf", - "300italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVcUwaERZjA.ttf", - "italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVcUwaERZjA.ttf", - "500italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk_RkaVcUwaERZjA.ttf", - "600italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkxhjaVcUwaERZjA.ttf", - "700italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVcUwaERZjA.ttf", - "800italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk0ZjaVcUwaERZjA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4maVc.ttf" - }, - { - "family": "Oranienbaum", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/oranienbaum/v16/OZpHg_txtzZKMuXLIVrx-3zn7kz3dpHc.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oranienbaum/v16/OZpHg_txtzZKMuXLIVrx-0zm5Eg.ttf" - }, - { - "family": "Orbit", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/orbit/v1/_LOCmz7I-uHd2mjEeqciRwRm.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/orbit/v1/_LOCmz7I-uHd2ljFcKM.ttf" - }, - { - "family": "Orbitron", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin" - ], - "version": "v35", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyGy6xpmIyXjU1pg.ttf", - "500": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyKS6xpmIyXjU1pg.ttf", - "600": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyxSmxpmIyXjU1pg.ttf", - "700": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1ny_CmxpmIyXjU1pg.ttf", - "800": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nymymxpmIyXjU1pg.ttf", - "900": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nysimxpmIyXjU1pg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyGy6Bp2g2.ttf" - }, - { - "family": "Oregano", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/oregano/v17/If2IXTPxciS3H4S2kZffPznO3yM.ttf", - "italic": "https://fonts.gstatic.com/s/oregano/v17/If2KXTPxciS3H4S2oZXVOxvLzyP_qw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oregano/v17/If2IXTPxciS3H4S2oZbVOw.ttf" - }, - { - "family": "Orelega One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/orelegaone/v14/3qTpojOggD2XtAdFb-QXZGt61EcYaQ7F.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/orelegaone/v14/3qTpojOggD2XtAdFb-QXZFt73kM.ttf" - }, - { - "family": "Orienta", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/orienta/v16/PlI9FlK4Jrl5Y9zNeyeo9HRFhcU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/orienta/v16/PlI9FlK4Jrl5Y9zNSyai8A.ttf" - }, - { - "family": "Original Surfer", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/originalsurfer/v25/RWmQoKGZ9vIirYntXJ3_MbekzNMiDEtvAlaMKw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/originalsurfer/v25/RWmQoKGZ9vIirYntXJ3_MbekzNMSDUFr.ttf" - }, - { - "family": "Oswald", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v57", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs13FvgUFoZAaRliE.ttf", - "300": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs169vgUFoZAaRliE.ttf", - "regular": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs1_FvgUFoZAaRliE.ttf", - "500": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs18NvgUFoZAaRliE.ttf", - "600": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs1y9ogUFoZAaRliE.ttf", - "700": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs1xZogUFoZAaRliE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs1_FvsUBiYA.ttf" - }, - { - "family": "Outfit", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4TC0C4G-EiAou6Y.ttf", - "200": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4bC1C4G-EiAou6Y.ttf", - "300": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4W61C4G-EiAou6Y.ttf", - "regular": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4TC1C4G-EiAou6Y.ttf", - "500": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4QK1C4G-EiAou6Y.ttf", - "600": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4e6yC4G-EiAou6Y.ttf", - "700": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4deyC4G-EiAou6Y.ttf", - "800": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4bCyC4G-EiAou6Y.ttf", - "900": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4ZmyC4G-EiAou6Y.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4TC1O4C0Fg.ttf" - }, - { - "family": "Over the Rainbow", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/overtherainbow/v23/11haGoXG1k_HKhMLUWz7Mc7vvW5upvOm9NA2XG0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/overtherainbow/v23/11haGoXG1k_HKhMLUWz7Mc7vvW5ulvKs8A.ttf" - }, - { - "family": "Overlock", - "variants": [ - "regular", - "italic", - "700", - "700italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/overlock/v19/Z9XVDmdMWRiN1_T9Z4Te4u2El6GC.ttf", - "italic": "https://fonts.gstatic.com/s/overlock/v19/Z9XTDmdMWRiN1_T9Z7Tc6OmmkrGC7Cs.ttf", - "700": "https://fonts.gstatic.com/s/overlock/v19/Z9XSDmdMWRiN1_T9Z7xizcmMvL2L9TLT.ttf", - "700italic": "https://fonts.gstatic.com/s/overlock/v19/Z9XQDmdMWRiN1_T9Z7Tc0FWJtrmp8CLTlNs.ttf", - "900": "https://fonts.gstatic.com/s/overlock/v19/Z9XSDmdMWRiN1_T9Z7xaz8mMvL2L9TLT.ttf", - "900italic": "https://fonts.gstatic.com/s/overlock/v19/Z9XQDmdMWRiN1_T9Z7Tc0G2Ltrmp8CLTlNs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/overlock/v19/Z9XVDmdMWRiN1_T9Z7Tf6Ok.ttf" - }, - { - "family": "Overlock SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/overlocksc/v25/1cX3aUHKGZrstGAY8nwVzHGAq8Sk1PoH.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/overlocksc/v25/1cX3aUHKGZrstGAY8nwVzEGBocA.ttf" - }, - { - "family": "Overpass", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6_PLrOZCLtce-og.ttf", - "200": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6fPPrOZCLtce-og.ttf", - "300": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6ovPrOZCLtce-og.ttf", - "regular": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6_PPrOZCLtce-og.ttf", - "500": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6zvPrOZCLtce-og.ttf", - "600": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6IvTrOZCLtce-og.ttf", - "700": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6G_TrOZCLtce-og.ttf", - "800": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6fPTrOZCLtce-og.ttf", - "900": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6VfTrOZCLtce-og.ttf", - "100italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLADe5qPl8Kuosgz.ttf", - "200italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLCDepqPl8Kuosgz.ttf", - "300italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLBdepqPl8Kuosgz.ttf", - "italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLADepqPl8Kuosgz.ttf", - "500italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLAxepqPl8Kuosgz.ttf", - "600italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLDdfZqPl8Kuosgz.ttf", - "700italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLDkfZqPl8Kuosgz.ttf", - "800italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLCDfZqPl8Kuosgz.ttf", - "900italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLCqfZqPl8Kuosgz.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6_PPbOJqP.ttf" - }, - { - "family": "Overpass Mono", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EWKokzzXur-SmIr.ttf", - "regular": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EXUokzzXur-SmIr.ttf", - "500": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EXmokzzXur-SmIr.ttf", - "600": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EUKpUzzXur-SmIr.ttf", - "700": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EUzpUzzXur-SmIr.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EXUonzyVO4.ttf" - }, - { - "family": "Ovo", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/ovo/v18/yYLl0h7Wyfzjy4Q5_3WVxA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ovo/v18/yYLl0h7WyfzTyo49.ttf" - }, - { - "family": "Oxanium", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G83JfniMBXQ7d67x.ttf", - "300": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G80XfniMBXQ7d67x.ttf", - "regular": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G81JfniMBXQ7d67x.ttf", - "500": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G817fniMBXQ7d67x.ttf", - "600": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G82XeXiMBXQ7d67x.ttf", - "700": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G82ueXiMBXQ7d67x.ttf", - "800": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G83JeXiMBXQ7d67x.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G81JfkiND3A.ttf" - }, - { - "family": "Oxygen", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/oxygen/v16/2sDcZG1Wl4LcnbuCJW8Db2-4C7wFZQ.ttf", - "regular": "https://fonts.gstatic.com/s/oxygen/v16/2sDfZG1Wl4Lcnbu6iUcnZ0SkAg.ttf", - "700": "https://fonts.gstatic.com/s/oxygen/v16/2sDcZG1Wl4LcnbuCNWgDb2-4C7wFZQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oxygen/v16/2sDfZG1Wl4LcnbuKiE0j.ttf" - }, - { - "family": "Oxygen Mono", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/oxygenmono/v15/h0GsssGg9FxgDgCjLeAd7ijfze-PPlUu.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/oxygenmono/v15/h0GsssGg9FxgDgCjLeAd7hjex-s.ttf" - }, - { - "family": "PT Mono", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/ptmono/v14/9oRONYoBnWILk-9ArCg5MtPyAcg.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ptmono/v14/9oRONYoBnWILk-9AnCkzNg.ttf" - }, - { - "family": "PT Sans", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/ptsans/v18/jizaRExUiTo99u79P0WOxOGMMDQ.ttf", - "italic": "https://fonts.gstatic.com/s/ptsans/v18/jizYRExUiTo99u79D0eEwMOJIDQA-g.ttf", - "700": "https://fonts.gstatic.com/s/ptsans/v18/jizfRExUiTo99u79B_mh4OmnLD0Z4zM.ttf", - "700italic": "https://fonts.gstatic.com/s/ptsans/v18/jizdRExUiTo99u79D0e8fOytKB8c8zMrig.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ptsans/v18/jizaRExUiTo99u79D0SEwA.ttf" - }, - { - "family": "PT Sans Caption", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/ptsanscaption/v20/0FlMVP6Hrxmt7-fsUFhlFXNIlpcqfQXwQy6yxg.ttf", - "700": "https://fonts.gstatic.com/s/ptsanscaption/v20/0FlJVP6Hrxmt7-fsUFhlFXNIlpcSwSrUSwWuz38Tgg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ptsanscaption/v20/0FlMVP6Hrxmt7-fsUFhlFXNIlpcafA_0.ttf" - }, - { - "family": "PT Sans Narrow", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/ptsansnarrow/v19/BngRUXNadjH0qYEzV7ab-oWlsYCByxyKeuDp.ttf", - "700": "https://fonts.gstatic.com/s/ptsansnarrow/v19/BngSUXNadjH0qYEzV7ab-oWlsbg95DiCUfzgRd-3.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ptsansnarrow/v19/BngRUXNadjH0qYEzV7ab-oWlsbCAwRg.ttf" - }, - { - "family": "PT Serif", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/ptserif/v19/EJRVQgYoZZY2vCFuvDFRxL6ddjb-.ttf", - "italic": "https://fonts.gstatic.com/s/ptserif/v19/EJRTQgYoZZY2vCFuvAFTzrq_cyb-vco.ttf", - "700": "https://fonts.gstatic.com/s/ptserif/v19/EJRSQgYoZZY2vCFuvAnt65qVXSr3pNNB.ttf", - "700italic": "https://fonts.gstatic.com/s/ptserif/v19/EJRQQgYoZZY2vCFuvAFT9gaQVy7VocNB6Iw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ptserif/v19/EJRVQgYoZZY2vCFuvAFQzro.ttf" - }, - { - "family": "PT Serif Caption", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/ptserifcaption/v18/ieVl2ZhbGCW-JoW6S34pSDpqYKU059WxDCs5cvI.ttf", - "italic": "https://fonts.gstatic.com/s/ptserifcaption/v18/ieVj2ZhbGCW-JoW6S34pSDpqYKU019e7CAk8YvJEeg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ptserifcaption/v18/ieVl2ZhbGCW-JoW6S34pSDpqYKU019S7CA.ttf" - }, - { - "family": "Pacifico", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/pacifico/v23/FwZY7-Qmy14u9lezJ96A4sijpFu_.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pacifico/v23/FwZY7-Qmy14u9lezJ-6B6Mw.ttf" - }, - { - "family": "Padauk", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "myanmar" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/padauk/v17/RrQRboJg-id7OnbBa0_g3LlYbg.ttf", - "700": "https://fonts.gstatic.com/s/padauk/v17/RrQSboJg-id7Onb512DE1JJEZ4YwGg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/padauk/v17/RrQRboJg-id7OnbxakXk.ttf" - }, - { - "family": "Padyakke Expanded One", - "variants": [ - "regular" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/padyakkeexpandedone/v8/K2FvfY9El_tbR0JfHb6WWvrBaU6XAUvC4IAYOKRkpDjeoQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/padyakkeexpandedone/v8/K2FvfY9El_tbR0JfHb6WWvrBaU6XAUvC4IAoOa5g.ttf" - }, - { - "family": "Palanquin", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/palanquin/v17/9XUhlJ90n1fBFg7ceXwUEltI7rWmZzTH.ttf", - "200": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwUvnpoxJuqbi3ezg.ttf", - "300": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwU2nloxJuqbi3ezg.ttf", - "regular": "https://fonts.gstatic.com/s/palanquin/v17/9XUnlJ90n1fBFg7ceXwsdlFMzLC2Zw.ttf", - "500": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwUgnhoxJuqbi3ezg.ttf", - "600": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwUrn9oxJuqbi3ezg.ttf", - "700": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwUyn5oxJuqbi3ezg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/palanquin/v17/9XUnlJ90n1fBFg7ceXwcd1tI.ttf" - }, - { - "family": "Palanquin Dark", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/palanquindark/v17/xn75YHgl1nqmANMB-26xC7yuF_6OTEo9VtfE.ttf", - "500": "https://fonts.gstatic.com/s/palanquindark/v17/xn76YHgl1nqmANMB-26xC7yuF8Z6ZW41fcvN2KT4.ttf", - "600": "https://fonts.gstatic.com/s/palanquindark/v17/xn76YHgl1nqmANMB-26xC7yuF8ZWYm41fcvN2KT4.ttf", - "700": "https://fonts.gstatic.com/s/palanquindark/v17/xn76YHgl1nqmANMB-26xC7yuF8YyY241fcvN2KT4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/palanquindark/v17/xn75YHgl1nqmANMB-26xC7yuF86PRk4.ttf" - }, - { - "family": "Palette Mosaic", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin" - ], - "version": "v13", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/palettemosaic/v13/AMOIz4aBvWuBFe3TohdW6YZ9MFiy4dxL4jSr.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/palettemosaic/v13/AMOIz4aBvWuBFe3TohdW6YZ9MGiz69g.ttf" - }, - { - "family": "Pangolin", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/pangolin/v12/cY9GfjGcW0FPpi-tWPfK5d3aiLBG.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pangolin/v12/cY9GfjGcW0FPpi-tWMfL79k.ttf" - }, - { - "family": "Paprika", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/paprika/v24/8QIJdijZitv49rDfuIgOq7jkAOw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/paprika/v24/8QIJdijZitv49rDfiIkErw.ttf" - }, - { - "family": "Parastoo", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/parastoo/v1/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlT6k1FPNkx5rq1w.ttf", - "500": "https://fonts.gstatic.com/s/parastoo/v1/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlfak1FPNkx5rq1w.ttf", - "600": "https://fonts.gstatic.com/s/parastoo/v1/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlka41FPNkx5rq1w.ttf", - "700": "https://fonts.gstatic.com/s/parastoo/v1/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlqK41FPNkx5rq1w.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/parastoo/v1/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlT6kFFflg.ttf" - }, - { - "family": "Parisienne", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/parisienne/v14/E21i_d3kivvAkxhLEVZpcy96DuKuavM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/parisienne/v14/E21i_d3kivvAkxhLEVZpQy5wCg.ttf" - }, - { - "family": "Parkinsans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gSI6R8K-8Z_dt-E.ttf", - "regular": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gTW6R8K-8Z_dt-E.ttf", - "500": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gTk6R8K-8Z_dt-E.ttf", - "600": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gQI7h8K-8Z_dt-E.ttf", - "700": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gQx7h8K-8Z_dt-E.ttf", - "800": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gRW7h8K-8Z_dt-E.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gTW6S8L8cI.ttf" - }, - { - "family": "Passero One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/passeroone/v28/JTUTjIko8DOq5FeaeEAjgE5B5Arr-s50.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/passeroone/v28/JTUTjIko8DOq5FeaeEAjgH5A7g4.ttf" - }, - { - "family": "Passion One", - "variants": [ - "regular", - "700", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/passionone/v20/PbynFmL8HhTPqbjUzux3JHuW_Frg6YoV.ttf", - "700": "https://fonts.gstatic.com/s/passionone/v20/Pby6FmL8HhTPqbjUzux3JEMq037owpYcuH8y.ttf", - "900": "https://fonts.gstatic.com/s/passionone/v20/Pby6FmL8HhTPqbjUzux3JEMS0X7owpYcuH8y.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/passionone/v20/PbynFmL8HhTPqbjUzux3JEuX9l4.ttf" - }, - { - "family": "Passions Conflict", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/passionsconflict/v9/kmKnZrcrFhfafnWX9x0GuEC-zowow5NeYRI4CN2V.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/passionsconflict/v9/kmKnZrcrFhfafnWX9x0GuEC-zowow6NfaxY.ttf" - }, - { - "family": "Pathway Extreme", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xak2Nx1Kyw3igP5eg.ttf", - "200": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakWN11Kyw3igP5eg.ttf", - "300": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakht11Kyw3igP5eg.ttf", - "regular": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xak2N11Kyw3igP5eg.ttf", - "500": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xak6t11Kyw3igP5eg.ttf", - "600": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakBtp1Kyw3igP5eg.ttf", - "700": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakP9p1Kyw3igP5eg.ttf", - "800": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakWNp1Kyw3igP5eg.ttf", - "900": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakcdp1Kyw3igP5eg.ttf", - "100italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ6daSYzqAbpepnF.ttf", - "200italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ4daCYzqAbpepnF.ttf", - "300italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ7DaCYzqAbpepnF.ttf", - "italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ6daCYzqAbpepnF.ttf", - "500italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ6vaCYzqAbpepnF.ttf", - "600italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ5DbyYzqAbpepnF.ttf", - "700italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ56byYzqAbpepnF.ttf", - "800italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ4dbyYzqAbpepnF.ttf", - "900italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ40byYzqAbpepnF.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xak2N1FKiYz.ttf" - }, - { - "family": "Pathway Gothic One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/pathwaygothicone/v16/MwQrbgD32-KAvjkYGNUUxAtW7pEBwx-dTFxeb80flQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pathwaygothicone/v16/MwQrbgD32-KAvjkYGNUUxAtW7pEBwx-tTVZa.ttf" - }, - { - "family": "Patrick Hand", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/patrickhand/v25/LDI1apSQOAYtSuYWp8ZhfYeMWcjKm7sp8g.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/patrickhand/v25/LDI1apSQOAYtSuYWp8ZhfYe8WMLO.ttf" - }, - { - "family": "Patrick Hand SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/patrickhandsc/v17/0nkwC9f7MfsBiWcLtY65AWDK873ViSi6JQc7Vg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/patrickhandsc/v17/0nkwC9f7MfsBiWcLtY65AWDK873liCK-.ttf" - }, - { - "family": "Pattaya", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/pattaya/v18/ea8ZadcqV_zkHY-XNdCn92ZEmVs.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pattaya/v18/ea8ZadcqV_zkHY-XBdGt8w.ttf" - }, - { - "family": "Patua One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/patuaone/v22/ZXuke1cDvLCKLDcimxBI5PNvNA9LuA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/patuaone/v22/ZXuke1cDvLCKLDcimxB45flr.ttf" - }, - { - "family": "Pavanam", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil" - ], - "version": "v13", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/pavanam/v13/BXRrvF_aiezLh0xPDOtQ9Wf0QcE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pavanam/v13/BXRrvF_aiezLh0xPPOpa8Q.ttf" - }, - { - "family": "Paytone One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/paytoneone/v25/0nksC9P7MfYHj2oFtYm2CiTqivr9iBq_.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/paytoneone/v25/0nksC9P7MfYHj2oFtYm2ChTrgP4.ttf" - }, - { - "family": "Peddana", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/peddana/v24/aFTU7PBhaX89UcKWhh2aBYyMcKw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/peddana/v24/aFTU7PBhaX89UcKWthyQAQ.ttf" - }, - { - "family": "Peralta", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/peralta/v21/hYkJPu0-RP_9d3kRGxAhrv956B8.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/peralta/v21/hYkJPu0-RP_9d3kRKxErqg.ttf" - }, - { - "family": "Permanent Marker", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/permanentmarker/v16/Fh4uPib9Iyv2ucM6pGQMWimMp004HaqIfrT5nlk.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/permanentmarker/v16/Fh4uPib9Iyv2ucM6pGQMWimMp004LauCeg.ttf" - }, - { - "family": "Petemoss", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/petemoss/v9/A2BZn5tA2xgtGWHZgxkesKb9UouQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/petemoss/v9/A2BZn5tA2xgtGWHZgykfuqI.ttf" - }, - { - "family": "Petit Formal Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/petitformalscript/v19/B50TF6xQr2TXJBnGOFME6u5OR83oRP5qoHnqP4gZSiE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/petitformalscript/v19/B50TF6xQr2TXJBnGOFME6u5OR83oRP5qkHjgOw.ttf" - }, - { - "family": "Petrona", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v36", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk6NsARBH452Mvds.ttf", - "200": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk4NsQRBH452Mvds.ttf", - "300": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk7TsQRBH452Mvds.ttf", - "regular": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk6NsQRBH452Mvds.ttf", - "500": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk6_sQRBH452Mvds.ttf", - "600": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk5TtgRBH452Mvds.ttf", - "700": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk5qtgRBH452Mvds.ttf", - "800": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk4NtgRBH452Mvds.ttf", - "900": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk4ktgRBH452Mvds.ttf", - "100italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8uwDFYpUN-dsIWs.ttf", - "200italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8mwCFYpUN-dsIWs.ttf", - "300italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8rICFYpUN-dsIWs.ttf", - "italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8uwCFYpUN-dsIWs.ttf", - "500italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8t4CFYpUN-dsIWs.ttf", - "600italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8jIFFYpUN-dsIWs.ttf", - "700italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8gsFFYpUN-dsIWs.ttf", - "800italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8mwFFYpUN-dsIWs.ttf", - "900italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8kUFFYpUN-dsIWs.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk6NsTRAFYo.ttf" - }, - { - "family": "Phetsarath", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "lao" - ], - "version": "v3", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/phetsarath/v3/N0bQ2SpTP-plK0uWayAYAd79nd_QeZA.ttf", - "700": "https://fonts.gstatic.com/s/phetsarath/v3/N0bT2SpTP-plK0uWayAYOWLSudf7ZZlIHD0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/phetsarath/v3/N0bQ2SpTP-plK0uWayAYMd_3mQ.ttf" - }, - { - "family": "Philosopher", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/philosopher/v21/vEFV2_5QCwIS4_Dhez5jcVBpRUwU08qe.ttf", - "italic": "https://fonts.gstatic.com/s/philosopher/v21/vEFX2_5QCwIS4_Dhez5jcWBrT0g21tqeR7c.ttf", - "700": "https://fonts.gstatic.com/s/philosopher/v21/vEFI2_5QCwIS4_Dhez5jcWjVamgc-NaXXq7H.ttf", - "700italic": "https://fonts.gstatic.com/s/philosopher/v21/vEFK2_5QCwIS4_Dhez5jcWBrd_QZ8tK1W77HtMo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/philosopher/v21/vEFV2_5QCwIS4_Dhez5jcWBoT0g.ttf" - }, - { - "family": "Phudu", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkK62zUSwWuz38Tgg.ttf", - "regular": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKtWzUSwWuz38Tgg.ttf", - "500": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKh2zUSwWuz38Tgg.ttf", - "600": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKa2vUSwWuz38Tgg.ttf", - "700": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKUmvUSwWuz38Tgg.ttf", - "800": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKNWvUSwWuz38Tgg.ttf", - "900": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKHGvUSwWuz38Tgg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKtWzkSg-q.ttf" - }, - { - "family": "Piazzolla", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v40", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7LYx3Ly1AHfAAy5.ttf", - "200": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7JYxnLy1AHfAAy5.ttf", - "300": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7KGxnLy1AHfAAy5.ttf", - "regular": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7LYxnLy1AHfAAy5.ttf", - "500": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7LqxnLy1AHfAAy5.ttf", - "600": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7IGwXLy1AHfAAy5.ttf", - "700": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7I_wXLy1AHfAAy5.ttf", - "800": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7JYwXLy1AHfAAy5.ttf", - "900": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7JxwXLy1AHfAAy5.ttf", - "100italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhZqw3gX9BRy5m5M.ttf", - "200italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhRqx3gX9BRy5m5M.ttf", - "300italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhcSx3gX9BRy5m5M.ttf", - "italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhZqx3gX9BRy5m5M.ttf", - "500italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhaix3gX9BRy5m5M.ttf", - "600italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhUS23gX9BRy5m5M.ttf", - "700italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhX223gX9BRy5m5M.ttf", - "800italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhRq23gX9BRy5m5M.ttf", - "900italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhTO23gX9BRy5m5M.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7LYxkLz3gU.ttf" - }, - { - "family": "Piedra", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/piedra/v27/ke8kOg8aN0Bn7hTunEyHN_M3gA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/piedra/v27/ke8kOg8aN0Bn7hTenUaD.ttf" - }, - { - "family": "Pinyon Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/pinyonscript/v24/6xKpdSJbL9-e9LuoeQiDRQR8aOLQO4bhiDY.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pinyonscript/v24/6xKpdSJbL9-e9LuoeQiDRQR8WOPaPw.ttf" - }, - { - "family": "Pirata One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/pirataone/v23/I_urMpiDvgLdLh0fAtoftiiEr5_BdZ8.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pirataone/v23/I_urMpiDvgLdLh0fAtofhimOqw.ttf" - }, - { - "family": "Pixelify Sans", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TTp0H1Yb5JagkmX.ttf", - "500": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TTb0H1Yb5JagkmX.ttf", - "600": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TQ3131Yb5JagkmX.ttf", - "700": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TQO131Yb5JagkmX.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TTp0E1ZZZY.ttf" - }, - { - "family": "Plaster", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/plaster/v25/DdTm79QatW80eRh4Ei5JOtLOeLI.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/plaster/v25/DdTm79QatW80eRh4Ii9DPg.ttf" - }, - { - "family": "Platypi", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02It4p9juxgnYP1P.ttf", - "regular": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02Jz4p9juxgnYP1P.ttf", - "500": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02JB4p9juxgnYP1P.ttf", - "600": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02Kt5Z9juxgnYP1P.ttf", - "700": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02KU5Z9juxgnYP1P.ttf", - "800": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02Lz5Z9juxgnYP1P.ttf", - "300italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oSkgsRwFZe1PPTo.ttf", - "italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oXcgsRwFZe1PPTo.ttf", - "500italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oUUgsRwFZe1PPTo.ttf", - "600italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oaknsRwFZe1PPTo.ttf", - "700italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oZAnsRwFZe1PPTo.ttf", - "800italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7ofcnsRwFZe1PPTo.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02Jz4q9isRw.ttf" - }, - { - "family": "Play", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/play/v21/6aez4K2oVqwIjtI8Hp8Tx3A.ttf", - "700": "https://fonts.gstatic.com/s/play/v21/6ae84K2oVqwItm4TOpc423nTJTM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/play/v21/6aez4K2oVqwIvtM2Gg.ttf" - }, - { - "family": "Playball", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/playball/v22/TK3gWksYAxQ7jbsKcj8Dl-tPKo2t.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playball/v22/TK3gWksYAxQ7jbsKcg8Cne8.ttf" - }, - { - "family": "Playfair", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v10", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPlKetgdoSMw5ifm.ttf", - "regular": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPkUetgdoSMw5ifm.ttf", - "500": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPkmetgdoSMw5ifm.ttf", - "600": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPnKfdgdoSMw5ifm.ttf", - "700": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPnzfdgdoSMw5ifm.ttf", - "800": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPmUfdgdoSMw5ifm.ttf", - "900": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPm9fdgdoSMw5ifm.ttf", - "300italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOW5eqycS4zfmNrE.ttf", - "italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOTBeqycS4zfmNrE.ttf", - "500italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOQJeqycS4zfmNrE.ttf", - "600italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOe5ZqycS4zfmNrE.ttf", - "700italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOddZqycS4zfmNrE.ttf", - "800italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcObBZqycS4zfmNrE.ttf", - "900italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOZlZqycS4zfmNrE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPkUeugcqyc.ttf" - }, - { - "family": "Playfair Display", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v40", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKdFvUDQZNLo_U2r.ttf", - "500": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKd3vUDQZNLo_U2r.ttf", - "600": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKebukDQZNLo_U2r.ttf", - "700": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKeiukDQZNLo_U2r.ttf", - "800": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKfFukDQZNLo_U2r.ttf", - "900": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKfsukDQZNLo_U2r.ttf", - "italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_qiTbtbK-F2rA0s.ttf", - "500italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_pqTbtbK-F2rA0s.ttf", - "600italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_naUbtbK-F2rA0s.ttf", - "700italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_k-UbtbK-F2rA0s.ttf", - "800italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_iiUbtbK-F2rA0s.ttf", - "900italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_gGUbtbK-F2rA0s.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKdFvXDRbtY.ttf" - }, - { - "family": "Playfair Display SC", - "variants": [ - "regular", - "italic", - "700", - "700italic", - "900", - "900italic" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke85OhoaMkR6-hSn7kbHVoFf7ZfgMPr_pb4GEcM2M4s.ttf", - "italic": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke87OhoaMkR6-hSn7kbHVoFf7ZfgMPr_lbwMFeEzI4sNKg.ttf", - "700": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke80OhoaMkR6-hSn7kbHVoFf7ZfgMPr_nQIpNcsdL4IUMyE.ttf", - "700italic": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke82OhoaMkR6-hSn7kbHVoFf7ZfgMPr_lbw0qc4XK6ARIyH5IA.ttf", - "900": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke80OhoaMkR6-hSn7kbHVoFf7ZfgMPr_nTorNcsdL4IUMyE.ttf", - "900italic": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke82OhoaMkR6-hSn7kbHVoFf7ZfgMPr_lbw0kcwXK6ARIyH5IA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke85OhoaMkR6-hSn7kbHVoFf7ZfgMPr_lb8MFQ.ttf" - }, - { - "family": "Playpen Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "emoji", - "greek", - "latin", - "latin-ext", - "math", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IvRgunQ9Ffmme0w.ttf", - "200": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4InRhunQ9Ffmme0w.ttf", - "300": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IqphunQ9Ffmme0w.ttf", - "regular": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IvRhunQ9Ffmme0w.ttf", - "500": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IsZhunQ9Ffmme0w.ttf", - "600": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IipmunQ9Ffmme0w.ttf", - "700": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IhNmunQ9Ffmme0w.ttf", - "800": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4InRmunQ9Ffmme0w.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IvRhinU3EQ.ttf" - }, - { - "family": "Playpen Sans Arabic", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "arabic", - "emoji", - "latin", - "latin-ext", - "math" - ], - "version": "v8", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-ZBobPcBO1L0EHE.ttf", - "200": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-bBoLPcBO1L0EHE.ttf", - "300": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-YfoLPcBO1L0EHE.ttf", - "regular": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-ZBoLPcBO1L0EHE.ttf", - "500": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-ZzoLPcBO1L0EHE.ttf", - "600": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-afp7PcBO1L0EHE.ttf", - "700": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-amp7PcBO1L0EHE.ttf", - "800": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-bBp7PcBO1L0EHE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-ZBoIPdDuk.ttf" - }, - { - "family": "Playpen Sans Deva", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "devanagari", - "emoji", - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQ0xgUG_5NygdkiQ.ttf", - "200": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQUxkUG_5NygdkiQ.ttf", - "300": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQjRkUG_5NygdkiQ.ttf", - "regular": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQ0xkUG_5NygdkiQ.ttf", - "500": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQ4RkUG_5NygdkiQ.ttf", - "600": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQDR4UG_5NygdkiQ.ttf", - "700": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQNB4UG_5NygdkiQ.ttf", - "800": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQUx4UG_5NygdkiQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQ0xkkGvRJ.ttf" - }, - { - "family": "Playpen Sans Hebrew", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "emoji", - "hebrew", - "latin", - "latin-ext", - "math" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnnp5pC63VFfsRss.ttf", - "200": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnlp55C63VFfsRss.ttf", - "300": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnm355C63VFfsRss.ttf", - "regular": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnnp55C63VFfsRss.ttf", - "500": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnnb55C63VFfsRss.ttf", - "600": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnk34JC63VFfsRss.ttf", - "700": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnkO4JC63VFfsRss.ttf", - "800": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnlp4JC63VFfsRss.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnnp56C711U.ttf" - }, - { - "family": "Playpen Sans Thai", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "emoji", - "latin", - "latin-ext", - "math", - "thai" - ], - "version": "v8", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLghGPoxxAISLTzA.ttf", - "200": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLAhCPoxxAISLTzA.ttf", - "300": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxL3BCPoxxAISLTzA.ttf", - "regular": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLghCPoxxAISLTzA.ttf", - "500": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLsBCPoxxAISLTzA.ttf", - "600": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLXBePoxxAISLTzA.ttf", - "700": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLZRePoxxAISLTzA.ttf", - "800": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLAhePoxxAISLTzA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLghC_ohZE.ttf" - }, - { - "family": "Playwrite AR", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-fteqf-ES67xIO8.ttf", - "200": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-Xtfqf-ES67xIO8.ttf", - "300": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-aVfqf-ES67xIO8.ttf", - "regular": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-ftfqf-ES67xIO8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-ftfmf6OTw.ttf" - }, - { - "family": "Playwrite AR Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v5", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritearguides/v5/iJWYBWqKZTrYS9uv-Ry6kDf-q_0Xq67mcGUaW4_MiYQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritearguides/v5/iJWYBWqKZTrYS9uv-Ry6kDf-q_0Xq67mQGQQXw.ttf" - }, - { - "family": "Playwrite AT", - "variants": [ - "100", - "200", - "300", - "regular", - "100italic", - "200italic", - "300italic", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2M77d03MLIHJ-rk.ttf", - "200": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2E76d03MLIHJ-rk.ttf", - "300": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2JD6d03MLIHJ-rk.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2M76d03MLIHJ-rk.ttf", - "100italic": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6uwc7n6kfJN4fVoKON7HIuDCZgtyxdIs5hzQa5nw_GKKPM6rkyVg.ttf", - "200italic": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6uwc7n6kfJN4fVoKON7HIuDCZgtyxdIs5hzQa5Hw7GKKPM6rkyVg.ttf", - "300italic": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6uwc7n6kfJN4fVoKON7HIuDCZgtyxdIs5hzQa5wQ7GKKPM6rkyVg.ttf", - "italic": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6uwc7n6kfJN4fVoKON7HIuDCZgtyxdIs5hzQa5nw7GKKPM6rkyVg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2M76R0zGKA.ttf" - }, - { - "family": "Playwrite AT Guides", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteatguides/v1/QdVKSS0gJR2xneUeQPfE-FVA1BlZQRpBRbgJdhapcUU.ttf", - "italic": "https://fonts.gstatic.com/s/playwriteatguides/v1/QdVISS0gJR2xneUeQPfE-FVA1BlZQRpBdboDcjSsYUVUjg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteatguides/v1/QdVKSS0gJR2xneUeQPfE-FVA1BlZQRpBdbkDcg.ttf" - }, - { - "family": "Playwrite AU NSW", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xZjML96TD2dC1gS.ttf", - "200": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xbjMb96TD2dC1gS.ttf", - "300": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xY9Mb96TD2dC1gS.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xZjMb96TD2dC1gS.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xZjMY97Rjk.ttf" - }, - { - "family": "Playwrite AU NSW Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteaunswguides/v1/LDIiao-QNRMmVPcU8-sgUraMF7GZs_1Emk3v8tPbZeQ3YBXs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteaunswguides/v1/LDIiao-QNRMmVPcU8-sgUraMF7GZs_1Emk3v8uPab-A.ttf" - }, - { - "family": "Playwrite AU QLD", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA6-yMY2fqm1BV-XS.ttf", - "200": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA68yMI2fqm1BV-XS.ttf", - "300": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA6_sMI2fqm1BV-XS.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA6-yMI2fqm1BV-XS.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA6-yML2eoGk.ttf" - }, - { - "family": "Playwrite AU QLD Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteauqldguides/v1/TuGBUUJtX5tTUfQi_7kbiZZFVhl0FIKnvy00LDxlIzIU5RwD.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteauqldguides/v1/TuGBUUJtX5tTUfQi_7kbiZZFVhl0FIKnvy00LAxkKTY.ttf" - }, - { - "family": "Playwrite AU SA", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpZgQcuVjCoV0bbE.ttf", - "200": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpRgRcuVjCoV0bbE.ttf", - "300": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpcYRcuVjCoV0bbE.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpZgRcuVjCoV0bbE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpZgRQuRpDg.ttf" - }, - { - "family": "Playwrite AU SA Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteausaguides/v1/3JnsSCLj03y8jUv7aFWBCCglBaFjl54aVBAovcgEP-Z3054.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteausaguides/v1/3JnsSCLj03y8jUv7aFWBCCglBaFjl54aVBAojckOOw.ttf" - }, - { - "family": "Playwrite AU TAS", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLUEHqK6Hl9WrXm4.ttf", - "200": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLWEH6K6Hl9WrXm4.ttf", - "300": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLVaH6K6Hl9WrXm4.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLUEH6K6Hl9WrXm4.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLUEH5K7FFs.ttf" - }, - { - "family": "Playwrite AU TAS Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteautasguides/v1/cY9Vfi6cVk5RvjGtQrLqjozy3ekUDtDMDX-NNjbKL4UbaDZD.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteautasguides/v1/cY9Vfi6cVk5RvjGtQrLqjozy3ekUDtDMDX-NNgbLJYE.ttf" - }, - { - "family": "Playwrite AU VIC", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4fTaLK0CBIDKNvl.ttf", - "200": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4dTabK0CBIDKNvl.ttf", - "300": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4eNabK0CBIDKNvl.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4fTabK0CBIDKNvl.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4fTaYK1AhY.ttf" - }, - { - "family": "Playwrite AU VIC Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteauvicguides/v1/ll8sK3mEVy6nEMXMskXIZv8owEdZpVIWaQEnuD6F2TpBa98q.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteauvicguides/v1/ll8sK3mEVy6nEMXMskXIZv8owEdZpVIWaQEnuA6E0z4.ttf" - }, - { - "family": "Playwrite BE VLG", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blL8vfCMMiyBIkNg.ttf", - "200": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blJ8vPCMMiyBIkNg.ttf", - "300": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blKivPCMMiyBIkNg.ttf", - "regular": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blL8vPCMMiyBIkNg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blL8vMCNOCg.ttf" - }, - { - "family": "Playwrite BE VLG Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritebevlgguides/v2/EYqjmb1Mz6hO4edaU9qKGFZMDd_Q-zwwK__U1u9GK3nNgEoc.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritebevlgguides/v2/EYqjmb1Mz6hO4edaU9qKGFZMDd_Q-zwwK__U1t9HIX0.ttf" - }, - { - "family": "Playwrite BE WAL", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v7", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsWCGfugHxwiSZp8.ttf", - "200": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsUCGPugHxwiSZp8.ttf", - "300": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsXcGPugHxwiSZp8.ttf", - "regular": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsWCGPugHxwiSZp8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsWCGMuhFRg.ttf" - }, - { - "family": "Playwrite BE WAL Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritebewalguides/v1/l7gPbiR5yM62ycwevWCt02rrTFoEJvY4kyrrUzHlVJabaOSA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritebewalguides/v1/l7gPbiR5yM62ycwevWCt02rrTFoEJvY4kyrrUwHkXpI.ttf" - }, - { - "family": "Playwrite BR", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmFOOFsfjAOVZBgs.ttf", - "200": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmNOPFsfjAOVZBgs.ttf", - "300": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmA2PFsfjAOVZBgs.ttf", - "regular": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmFOPFsfjAOVZBgs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmFOPJsbpBA.ttf" - }, - { - "family": "Playwrite BR Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritebrguides/v1/tssxAohQaiQS-wrnJz-F5CqW4dOezRwp-9cCOxBu_BM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritebrguides/v1/tssxAohQaiQS-wrnJz-F5CqW4dOezRwpy9YIPw.ttf" - }, - { - "family": "Playwrite CA", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHiquYp261AIQU98.ttf", - "200": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHqqvYp261AIQU98.ttf", - "300": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHnSvYp261AIQU98.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHiqvYp261AIQU98.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHiqvUpyw0A.ttf" - }, - { - "family": "Playwrite CA Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritecaguides/v1/MjQamj1kuP_soQ3o-rysO9Ci_8oJlIUUInch3bTfcxs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritecaguides/v1/MjQamj1kuP_soQ3o-rysO9Ci_8oJlIUUEnYr2Q.ttf" - }, - { - "family": "Playwrite CL", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU8JbvLq3DyPNbus.ttf", - "200": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU0JavLq3DyPNbus.ttf", - "300": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU5xavLq3DyPNbus.ttf", - "regular": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU8JavLq3DyPNbus.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU8JajLu9Cw.ttf" - }, - { - "family": "Playwrite CL Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteclguides/v2/Z9XKDnxTQxyGzOn3eMH-i6Ws0czqkE-hrNpVuw5_BAM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteclguides/v2/Z9XKDnxTQxyGzOn3eMH-i6Ws0czqkE-hnNtfvw.ttf" - }, - { - "family": "Playwrite CO", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v13", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqx7ZJo-dOEhxX3Iw.ttf", - "200": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqxzZIo-dOEhxX3Iw.ttf", - "300": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqx-hIo-dOEhxX3Iw.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqx7ZIo-dOEhxX3Iw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqx7ZIk-ZEFg.ttf" - }, - { - "family": "Playwrite CO Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v5", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritecoguides/v5/AYCXpWvtftIVXepC5AzjAx1KgYPugOK0TqxTJw_GOM0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritecoguides/v5/AYCXpWvtftIVXepC5AzjAx1KgYPugOK0fq1ZIw.ttf" - }, - { - "family": "Playwrite CU", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseRmwZeT7m2YIByI.ttf", - "200": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseZmxZeT7m2YIByI.ttf", - "300": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseUexZeT7m2YIByI.ttf", - "regular": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseRmxZeT7m2YIByI.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseRmxVeXxnw.ttf" - }, - { - "family": "Playwrite CU Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritecuguides/v1/c4m81mZtG8v6p3iAoFBJ2dJdu9fWPSaOFooIDQtJbok.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritecuguides/v1/c4m81mZtG8v6p3iAoFBJ2dJdu9fWPSaOJosCCQ.ttf" - }, - { - "family": "Playwrite CZ", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCI4aTqT_VkAS5X4.ttf", - "200": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCA4bTqT_VkAS5X4.ttf", - "300": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCNAbTqT_VkAS5X4.ttf", - "regular": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCI4bTqT_VkAS5X4.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCI4bfqX1Ug.ttf" - }, - { - "family": "Playwrite CZ Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteczguides/v1/6qLcKY0NtxD-qVlIPUIPeH4lUQa6B3ZZQkseuneh7xc.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteczguides/v1/6qLcKY0NtxD-qVlIPUIPeH4lUQa6B3ZZckoUvg.ttf" - }, - { - "family": "Playwrite DE Grund", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZz2qGZwCUOfSwZTM.ttf", - "200": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZz-qHZwCUOfSwZTM.ttf", - "300": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZzzSHZwCUOfSwZTM.ttf", - "regular": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZz2qHZwCUOfSwZTM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZz2qHVwGePQ.ttf" - }, - { - "family": "Playwrite DE Grund Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritedegrundguides/v1/OD5RuNCQ02KrAHnha1L36CWcQ83dtK5BLxqexnduX98TJlnjHAA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedegrundguides/v1/OD5RuNCQ02KrAHnha1L36CWcQ83dtK5BLxqexndub94ZIg.ttf" - }, - { - "family": "Playwrite DE LA", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2FnrPgcigC5Ph2w.ttf", - "200": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2NnqPgcigC5Ph2w.ttf", - "300": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2AfqPgcigC5Ph2w.ttf", - "regular": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2FnqPgcigC5Ph2w.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2FnqDgYohA.ttf" - }, - { - "family": "Playwrite DE LA Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritedelaguides/v2/1q2XY42fB0V64O4aSe1OjKs_yAXBOfDI5wE56g2M62M1AXs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedelaguides/v2/1q2XY42fB0V64O4aSe1OjKs_yAXBOfDI5wE52gyG7w.ttf" - }, - { - "family": "Playwrite DE SAS", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTeVg-6lSyVPgRkJ.ttf", - "200": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTcVgu6lSyVPgRkJ.ttf", - "300": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTfLgu6lSyVPgRkJ.ttf", - "regular": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTeVgu6lSyVPgRkJ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTeVgt6kQSE.ttf" - }, - { - "family": "Playwrite DE SAS Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritedesasguides/v1/8At5GtCjPp-GWR2h9cC6ePzz2l6LJ3VZaPNi15BEdtBgPI1G.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedesasguides/v1/8At5GtCjPp-GWR2h9cC6ePzz2l6LJ3VZaPNi16BFfNQ.ttf" - }, - { - "family": "Playwrite DE VA", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRSyTv24jGyvutu4.ttf", - "200": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRaySv24jGyvutu4.ttf", - "300": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRXKSv24jGyvutu4.ttf", - "regular": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRSySv24jGyvutu4.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRSySj28pHw.ttf" - }, - { - "family": "Playwrite DE VA Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritedevaguides/v1/WwkPxOmkDVqm-ojMLT_kdMUoBpMYm6KTeb28UB9SNQIUdqQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedevaguides/v1/WwkPxOmkDVqm-ojMLT_kdMUoBpMYm6KTeb28YB5YMQ.ttf" - }, - { - "family": "Playwrite DK Loopet", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75JJwOgRuQovSE8_.ttf", - "200": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75LJwegRuQovSE8_.ttf", - "300": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75IXwegRuQovSE8_.ttf", - "regular": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75JJwegRuQovSE8_.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75JJwdgQsw4.ttf" - }, - { - "family": "Playwrite DK Loopet Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritedkloopetguides/v1/4iC46LlmYsRPlQ1zDEvT8weoW-sI8-h9xxN83W-Cb5tmElj-b0nB.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedkloopetguides/v1/4iC46LlmYsRPlQ1zDEvT8weoW-sI8-h9xxN83W-Cb6tnGFw.ttf" - }, - { - "family": "Playwrite DK Uloopet", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K06lQrKeng6LUzAA.ttf", - "200": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K0alUrKeng6LUzAA.ttf", - "300": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K0tFUrKeng6LUzAA.ttf", - "regular": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K06lUrKeng6LUzAA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K06lUbKOPk.ttf" - }, - { - "family": "Playwrite DK Uloopet Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritedkuloopetguides/v1/WwkKxOSkDVqm-ojMLT_kdMsoBb5Xs6efafiIBXYcVHk1bo9bkIONtA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritedkuloopetguides/v1/WwkKxOSkDVqm-ojMLT_kdMsoBb5Xs6efafiIBXYcVHkFb4Vf.ttf" - }, - { - "family": "Playwrite ES", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmFOOFsfjAOVZBgs.ttf", - "200": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmNOPFsfjAOVZBgs.ttf", - "300": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmA2PFsfjAOVZBgs.ttf", - "regular": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmFOPFsfjAOVZBgs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmFOPJsbpBA.ttf" - }, - { - "family": "Playwrite ES Deco", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4yrZxOQ9p5Cljpw.ttf", - "200": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4SrdxOQ9p5Cljpw.ttf", - "300": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4lLdxOQ9p5Cljpw.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4yrdxOQ9p5Cljpw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4yrdBOAVt.ttf" - }, - { - "family": "Playwrite ES Deco Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteesdecoguides/v1/flUrRriwwII5RVl2TZ1XBNTUOYY6ZzZzwPCEKtwqYEyDBQWJ7Q.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteesdecoguides/v1/flUrRriwwII5RVl2TZ1XBNTUOYY6ZzZzwPCEKtwaYUaH.ttf" - }, - { - "family": "Playwrite ES Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteesguides/v1/VuJtdM_b2p7tvoFGLMPdedpGJm402y6mhDDGfdnzXeU.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteesguides/v1/VuJtdM_b2p7tvoFGLMPdedpGJm402y6mtDHMeQ.ttf" - }, - { - "family": "Playwrite FR Moderne", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJuAOvAl74XSpRjw.ttf", - "200": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJOAKvAl74XSpRjw.ttf", - "300": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJ5gKvAl74XSpRjw.ttf", - "regular": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJuAKvAl74XSpRjw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJuAKfA1T8.ttf" - }, - { - "family": "Playwrite FR Moderne Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritefrmoderneguides/v2/CSRr4yxOn-mMWCgLPl16KrUKBbwa2ZZLdkrvXllIP22HnIzLvrG2fw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritefrmoderneguides/v2/CSRr4yxOn-mMWCgLPl16KrUKBbwa2ZZLdkrvXllIP223nYbP.ttf" - }, - { - "family": "Playwrite FR Trad", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v13", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvAogrNdt-fwzTS5A.ttf", - "200": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvAIgvNdt-fwzTS5A.ttf", - "300": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvA_AvNdt-fwzTS5A.ttf", - "regular": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvAogvNdt-fwzTS5A.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvAogv9d9Wb.ttf" - }, - { - "family": "Playwrite FR Trad Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritefrtradguides/v1/l7gMbit5yM62ycwevWCt133rT2kpYpEKjyfqRWLFfriXYf2ZXw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritefrtradguides/v1/l7gMbit5yM62ycwevWCt133rT2kpYpEKjyfqRWL1f7KT.ttf" - }, - { - "family": "Playwrite GB J", - "variants": [ - "100", - "200", - "300", - "regular", - "100italic", - "200italic", - "300italic", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheGdc5HaN7X9HFR8Q.ttf", - "200": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheG9c9HaN7X9HFR8Q.ttf", - "300": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheGK89HaN7X9HFR8Q.ttf", - "regular": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheGdc9HaN7X9HFR8Q.ttf", - "100italic": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kGo8wSPe9dzQ1UGbvobAPhY7KPywT2BnwHoBCTvYyvKtTT1nRB8S9t.ttf", - "200italic": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kGo8wSPe9dzQ1UGbvobAPhY7KPywT2BnwHoBCTvYwvK9TT1nRB8S9t.ttf", - "300italic": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kGo8wSPe9dzQ1UGbvobAPhY7KPywT2BnwHoBCTvYzxK9TT1nRB8S9t.ttf", - "italic": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kGo8wSPe9dzQ1UGbvobAPhY7KPywT2BnwHoBCTvYyvK9TT1nRB8S9t.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheGdc93adTT.ttf" - }, - { - "family": "Playwrite GB J Guides", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritegbjguides/v2/CSRh4yJOn-mMWCgLPl16K6UKAvM5yY1BdhmIKxooUh-_nQ.ttf", - "italic": "https://fonts.gstatic.com/s/playwritegbjguides/v2/CSRv4yJOn-mMWCgLPl16K6UKAvM5yY1Bdhm4KRAscBqvnb7O.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritegbjguides/v2/CSRh4yJOn-mMWCgLPl16K6UKAvM5yY1Bdhm4KhAs.ttf" - }, - { - "family": "Playwrite GB S", - "variants": [ - "100", - "200", - "300", - "regular", - "100italic", - "200italic", - "300italic", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v12", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU6uhH8x5eMaTk8AQ.ttf", - "200": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU6OhD8x5eMaTk8AQ.ttf", - "300": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU65BD8x5eMaTk8AQ.ttf", - "regular": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU6uhD8x5eMaTk8AQ.ttf", - "100italic": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWZ_kFkk-s1Xclhmlemy7jsNS51fHeeOptJs2IvclMUhZ2ISzwsAReZ.ttf", - "200italic": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWZ_kFkk-s1Xclhmlemy7jsNS51fHeeOptJs2IvclOUhJ2ISzwsAReZ.ttf", - "300italic": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWZ_kFkk-s1Xclhmlemy7jsNS51fHeeOptJs2IvclNKhJ2ISzwsAReZ.ttf", - "italic": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWZ_kFkk-s1Xclhmlemy7jsNS51fHeeOptJs2IvclMUhJ2ISzwsAReZ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU6uhDMxp2I.ttf" - }, - { - "family": "Playwrite GB S Guides", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritegbsguides/v1/0FlKVOSHl1iH-fv2BH4kIkUBqtlNCEaQLlyKx1QPi-Z8Fw.ttf", - "italic": "https://fonts.gstatic.com/s/playwritegbsguides/v1/0FlEVOSHl1iH-fv2BH4kIkUBqtlNCEaQLly6xV4LqeNsFwxX.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritegbsguides/v1/0FlKVOSHl1iH-fv2BH4kIkUBqtlNCEaQLly6xl4L.ttf" - }, - { - "family": "Playwrite HR", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPsoA9YHXAHC7tvg.ttf", - "200": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPkoB9YHXAHC7tvg.ttf", - "300": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPpQB9YHXAHC7tvg.ttf", - "regular": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPsoB9YHXAHC7tvg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPsoBxYDdBA.ttf" - }, - { - "family": "Playwrite HR Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritehrguides/v1/6NUK8EedKwOcfRjj8ukv_L4kjqAoGrjdWmA08mCgdfM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritehrguides/v1/6NUK8EedKwOcfRjj8ukv_L4kjqAoGrjdamE-9g.ttf" - }, - { - "family": "Playwrite HR Lijeva", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d4zB8aUy4_lxmKl.ttf", - "200": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d6zBsaUy4_lxmKl.ttf", - "300": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d5tBsaUy4_lxmKl.ttf", - "regular": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d4zBsaUy4_lxmKl.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d4zBvaVwYs.ttf" - }, - { - "family": "Playwrite HR Lijeva Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritehrlijevaguides/v1/uU9aCAgH7I63K35cu3bRkqamzjr8EW133LJaXDO-QObhgDgMKYJO.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritehrlijevaguides/v1/uU9aCAgH7I63K35cu3bRkqamzjr8EW133LJaXDO-QNbgijw.ttf" - }, - { - "family": "Playwrite HU", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1PL7TO2dH3B2Xx4.ttf", - "200": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1HL6TO2dH3B2Xx4.ttf", - "300": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1Kz6TO2dH3B2Xx4.ttf", - "regular": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1PL6TO2dH3B2Xx4.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1PL6fOyXGw.ttf" - }, - { - "family": "Playwrite HU Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritehuguides/v1/AYCXpWvtftIVXepC5AzjCAdKgYPugOK0TqxTJw_GOM0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritehuguides/v1/AYCXpWvtftIVXepC5AzjCAdKgYPugOK0fq1ZIw.ttf" - }, - { - "family": "Playwrite ID", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUl0-QB_JbFi0pLlg.ttf", - "200": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUl8-RB_JbFi0pLlg.ttf", - "300": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUlxGRB_JbFi0pLlg.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUl0-RB_JbFi0pLlg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUl0-RN_NREg.ttf" - }, - { - "family": "Playwrite ID Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteidguides/v1/MjQamj1kuP_soQ3o-rysMdWi_8oJlIUUInch3bTfcxs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteidguides/v1/MjQamj1kuP_soQ3o-rysMdWi_8oJlIUUEnYr2Q.ttf" - }, - { - "family": "Playwrite IE", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMyzipBpIu30AZbUY.ttf", - "200": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMy7ioBpIu30AZbUY.ttf", - "300": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMy2aoBpIu30AZbUY.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMyzioBpIu30AZbUY.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMyzioNpMk2w.ttf" - }, - { - "family": "Playwrite IE Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteieguides/v1/LhW5MULFNP8PI-1UADw_Kbp9daTx5ovUaNojN9_8IVQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteieguides/v1/LhW5MULFNP8PI-1UADw_Kbp9daTx5ovUWNspMw.ttf" - }, - { - "family": "Playwrite IN", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkM7mNMR8n3_Ag1kU.ttf", - "200": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkMzmMMR8n3_Ag1kU.ttf", - "300": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkM-eMMR8n3_Ag1kU.ttf", - "regular": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkM7mMMR8n3_Ag1kU.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkM7mMAR4t2w.ttf" - }, - { - "family": "Playwrite IN Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteinguides/v1/GFD2WBRug3mQSvrAT9AL4vx4d3lQNQV4Tt1qdGqgdlM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteinguides/v1/GFD2WBRug3mQSvrAT9AL4vx4d3lQNQV4ftxgcA.ttf" - }, - { - "family": "Playwrite IS", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v10", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jq6R8aX9-p7K5ILg.ttf", - "200": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jqyR9aX9-p7K5ILg.ttf", - "300": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jq_p9aX9-p7K5ILg.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jq6R9aX9-p7K5ILg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jq6R9WX50ow.ttf" - }, - { - "family": "Playwrite IS Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteisguides/v1/5aUp9-GkphaVExwxdX6SwWF-uigk3Cglrm9ptxu7HZ0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteisguides/v1/5aUp9-GkphaVExwxdX6SwWF-uigk3Cglnm5jsw.ttf" - }, - { - "family": "Playwrite IT Moderna", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F5Wil8ubbffHtmMw.ttf", - "200": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F52ih8ubbffHtmMw.ttf", - "300": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F5BCh8ubbffHtmMw.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F5Wih8ubbffHtmMw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F5WihMuLzb.ttf" - }, - { - "family": "Playwrite IT Moderna Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteitmodernaguides/v1/2sDKZHBJg5rCj6fz_QgDJhGcTtJ5AVu-1w5jRQjRv9qPpOVtBhB5gQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteitmodernaguides/v1/2sDKZHBJg5rCj6fz_QgDJhGcTtJ5AVu-1w5jRQjRv9q_pe9p.ttf" - }, - { - "family": "Playwrite IT Trad", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq96u--_gENNXvzL2Q.ttf", - "200": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq96O-6_gENNXvzL2Q.ttf", - "300": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq965e6_gENNXvzL2Q.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq96u-6_gENNXvzL2Q.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq96u-6PgUlJ.ttf" - }, - { - "family": "Playwrite IT Trad Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteittradguides/v2/SlGDmReYo5oYZX5BFVcEySBSPE50BiuP2AHaRsRUA4V-e6yHgQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteittradguides/v2/SlGDmReYo5oYZX5BFVcEySBSPE50BiuP2AHaRsRkAo96.ttf" - }, - { - "family": "Playwrite MX", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v13", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr9wnc5xYfXDWXDu8.ttf", - "200": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr94nd5xYfXDWXDu8.ttf", - "300": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr91fd5xYfXDWXDu8.ttf", - "regular": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr9wnd5xYfXDWXDu8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr9wnd1xcVWA.ttf" - }, - { - "family": "Playwrite MX Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritemxguides/v1/k3kMo9ESPe9dzQ1UGbvoZhnhbtfklWqN0qywHx-HpY0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritemxguides/v1/k3kMo9ESPe9dzQ1UGbvoZhnhbtfklWqN4q26Gw.ttf" - }, - { - "family": "Playwrite NG Modern", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V17tPQbi5GswWJNE.ttf", - "200": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V15tPAbi5GswWJNE.ttf", - "300": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V16zPAbi5GswWJNE.ttf", - "regular": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V17tPAbi5GswWJNE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V17tPDbj7m8.ttf" - }, - { - "family": "Playwrite NG Modern Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritengmodernguides/v1/6qLVKYQNtxD-qVlIPUIPdWMlWxy3BmFEQgxB1xvFhDarWJtyZyGU.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritengmodernguides/v1/6qLVKYQNtxD-qVlIPUIPdWMlWxy3BmFEQgxB1xvFhAaqUp8.ttf" - }, - { - "family": "Playwrite NL", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v10", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG9_EnYxNbPzS5HE.ttf", - "200": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG1_FnYxNbPzS5HE.ttf", - "300": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG4HFnYxNbPzS5HE.ttf", - "regular": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG9_FnYxNbPzS5HE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG9_FrY1HaA.ttf" - }, - { - "family": "Playwrite NL Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritenlguides/v1/FwZH7_8mxlw-50y5PJughoCL4jbXkMqwsWKGP6kvdPA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritenlguides/v1/FwZH7_8mxlw-50y5PJughoCL4jbXkMqwgWOMOw.ttf" - }, - { - "family": "Playwrite NO", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v10", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-49whHKen-mjRVtc.ttf", - "200": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-41wgHKen-mjRVtc.ttf", - "300": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-44IgHKen-mjRVtc.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-49wgHKen-mjRVtc.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-49wgLKat_g.ttf" - }, - { - "family": "Playwrite NO Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritenoguides/v1/DPEwYx-Cyg4cQ2aAcFshOLL79zJKccqHe2-Z2vnLeAs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritenoguides/v1/DPEwYx-Cyg4cQ2aAcFshOLL79zJKccqHS26T3g.ttf" - }, - { - "family": "Playwrite NZ", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjngAVeRt5gGCzkrs.ttf", - "200": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjnoAUeRt5gGCzkrs.ttf", - "300": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjnl4UeRt5gGCzkrs.ttf", - "regular": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjngAUeRt5gGCzkrs.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjngAUSRpzhA.ttf" - }, - { - "family": "Playwrite NZ Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritenzguides/v1/t5t8IQQPN4uFDRepJwiX4vzIikyGzv71Wh8xq25PL5k.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritenzguides/v1/t5t8IQQPN4uFDRepJwiX4vzIikyGzv71ah47rw.ttf" - }, - { - "family": "Playwrite PE", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v6", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesO2lsTPHFdtSgb_A.ttf", - "200": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesO-ltTPHFdtSgb_A.ttf", - "300": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesOzdtTPHFdtSgb_A.ttf", - "regular": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesO2ltTPHFdtSgb_A.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesO2ltfPDPcg.ttf" - }, - { - "family": "Playwrite PE Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritepeguides/v1/AMONz5uBsGadFuvf9j8ZyqI0FA3br70wwyyAlqETME8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritepeguides/v1/AMONz5uBsGadFuvf9j8ZyqI0FA3br70w8y2Kkg.ttf" - }, - { - "family": "Playwrite PL", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v10", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmRfa9ZybSwcVtHQ.ttf", - "200": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmZfb9ZybSwcVtHQ.ttf", - "300": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmUnb9ZybSwcVtHQ.ttf", - "regular": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmRfb9ZybSwcVtHQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmRfbxZ2RTw.ttf" - }, - { - "family": "Playwrite PL Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteplguides/v1/jVyW7m_lCm7G5CZyQCAu8mgkGLk-kmibWR3aRZ2Kw7A.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteplguides/v1/jVyW7m_lCm7G5CZyQCAu8mgkGLk-kmibaRzQQQ.ttf" - }, - { - "family": "Playwrite PT", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v10", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9qDjTfJtvlo3Qaw.ttf", - "200": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9iDiTfJtvlo3Qaw.ttf", - "300": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9v7iTfJtvlo3Qaw.ttf", - "regular": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9qDiTfJtvlo3Qaw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9qDiffNnug.ttf" - }, - { - "family": "Playwrite PT Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteptguides/v2/sJoY3K5JjdGLJV3vyatrMkupgg-kWTx5F5k90TZO69o.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteptguides/v2/sJoY3K5JjdGLJV3vyatrMkupgg-kWTx5J5g31Q.ttf" - }, - { - "family": "Playwrite RO", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v10", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4a9ZnZWMJnZeBS8.ttf", - "200": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4S9YnZWMJnZeBS8.ttf", - "300": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4fFYnZWMJnZeBS8.ttf", - "regular": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4a9YnZWMJnZeBS8.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4a9YrZSGIg.ttf" - }, - { - "family": "Playwrite RO Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteroguides/v1/wlptgx7ZCE50snmWiOExiylvL10_b5Ym_LBte6KuGEo.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteroguides/v1/wlptgx7ZCE50snmWiOExiylvL10_b5YmzLFnfw.ttf" - }, - { - "family": "Playwrite SK", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v10", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf-2dvsOzdK9OF68.ttf", - "200": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf22cvsOzdK9OF68.ttf", - "300": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf7OcvsOzdK9OF68.ttf", - "regular": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf-2cvsOzdK9OF68.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf-2cjsK5cA.ttf" - }, - { - "family": "Playwrite SK Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteskguides/v1/P5sezYaSYdfH5z93kEFk3tyPlqxeQeo_JzruWQshcbU.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteskguides/v1/P5sezYaSYdfH5z93kEFk3tyPlqxeQeo_FzvkXQ.ttf" - }, - { - "family": "Playwrite TZ", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDWwSue1COwjVROo.ttf", - "200": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDewTue1COwjVROo.ttf", - "300": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDTITue1COwjVROo.ttf", - "regular": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDWwTue1COwjVROo.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDWwTiexIPw.ttf" - }, - { - "family": "Playwrite TZ Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritetzguides/v1/SLXUc0_L5XEkcjBPGvusk4lULgsM9U5_YQy93JQ2XEg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritetzguides/v1/SLXUc0_L5XEkcjBPGvusk4lULgsM9U5_UQ232A.ttf" - }, - { - "family": "Playwrite US Modern", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62YohNw2Da0LCgUPK.ttf", - "200": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62YqhNg2Da0LCgUPK.ttf", - "300": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62Yp_Ng2Da0LCgUPK.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62YohNg2Da0LCgUPK.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62YohNj2CYUY.ttf" - }, - { - "family": "Playwrite US Modern Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteusmodernguides/v1/0QI1MWNf_4C2VH-yUr5uyqKOvtOynXAoku8j8Lv9pryxZQscrW1V.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteusmodernguides/v1/0QI1MWNf_4C2VH-yUr5uyqKOvtOynXAoku8j8Lv9poywbw8.ttf" - }, - { - "family": "Playwrite US Trad", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1E8pgj6Kf5uBNig.ttf", - "200": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1k8tgj6Kf5uBNig.ttf", - "300": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1Tctgj6Kf5uBNig.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1E8tgj6Kf5uBNig.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1E8tQjqib.ttf" - }, - { - "family": "Playwrite US Trad Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwriteustradguides/v1/-zk29027wssz_XLkGgu8kTL39c2bMssjmiZPNnk5nJCZAyrUdw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteustradguides/v1/-zk29027wssz_XLkGgu8kTL39c2bMssjmiZPNnkJnZqd.ttf" - }, - { - "family": "Playwrite VN", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNUI8E-9HPWIQtD0.ttf", - "200": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNcI9E-9HPWIQtD0.ttf", - "300": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNRw9E-9HPWIQtD0.ttf", - "regular": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNUI9E-9HPWIQtD0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNUI9I-5NOQ.ttf" - }, - { - "family": "Playwrite VN Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritevnguides/v1/JIAvUUlydXJZq1IQU8oDBn2CUkROHFEAfXMXfpmSLuI.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritevnguides/v1/JIAvUUlydXJZq1IQU8oDBn2CUkROHFEATXIdeg.ttf" - }, - { - "family": "Playwrite ZA", - "variants": [ - "100", - "200", - "300", - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0EbLGbYUsn9T5dt0.ttf", - "200": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0ETLHbYUsn9T5dt0.ttf", - "300": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0EezHbYUsn9T5dt0.ttf", - "regular": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0EbLHbYUsn9T5dt0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0EbLHXYQmmw.ttf" - }, - { - "family": "Playwrite ZA Guides", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/playwritezaguides/v1/O4ZOFHPsmxlhCg3-iycDyEwy0BT1ribk2HDoCLfQmgE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/playwritezaguides/v1/O4ZOFHPsmxlhCg3-iycDyEwy0BT1ribk6HHiDA.ttf" - }, - { - "family": "Plus Jakarta Sans", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_KU7NShXUEKi4Rw.ttf", - "300": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_907NShXUEKi4Rw.ttf", - "regular": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_qU7NShXUEKi4Rw.ttf", - "500": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_m07NShXUEKi4Rw.ttf", - "600": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_d0nNShXUEKi4Rw.ttf", - "700": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_TknNShXUEKi4Rw.ttf", - "800": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_KUnNShXUEKi4Rw.ttf", - "200italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ2lCR_QMq2oR82k.ttf", - "300italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ17CR_QMq2oR82k.ttf", - "italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ0lCR_QMq2oR82k.ttf", - "500italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ0XCR_QMq2oR82k.ttf", - "600italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ37Dh_QMq2oR82k.ttf", - "700italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ3CDh_QMq2oR82k.ttf", - "800italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ2lDh_QMq2oR82k.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_qU79Sx_Q.ttf" - }, - { - "family": "Pochaevsk", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin" - ], - "version": "v5", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/pochaevsk/v5/55xuey9_OdX_Om7ReYgloJd4-bnQKg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pochaevsk/v5/55xuey9_OdX_Om7ReYgVoZ18.ttf" - }, - { - "family": "Podkova", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v33", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWtFzcU4EoporSHH.ttf", - "500": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWt3zcU4EoporSHH.ttf", - "600": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWubysU4EoporSHH.ttf", - "700": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWuiysU4EoporSHH.ttf", - "800": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWvFysU4EoporSHH.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWtFzfU5GI4.ttf" - }, - { - "family": "Poetsen One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/poetsenone/v3/ke8hOgIaMUB37xCgvCntWtIvq_KREbG9.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/poetsenone/v3/ke8hOgIaMUB37xCgvCntWuIuofY.ttf" - }, - { - "family": "Poiret One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/poiretone/v18/UqyVK80NJXN4zfRgbdfbk5lWVscxdKE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/poiretone/v18/UqyVK80NJXN4zfRgbdfbo5hcUg.ttf" - }, - { - "family": "Poller One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v25", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/pollerone/v25/ahccv82n0TN3gia5E4Bud-lbgUS5u0s.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pollerone/v25/ahccv82n0TN3gia5E4BuR-hRhQ.ttf" - }, - { - "family": "Poltawski Nowy", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KqCWnDS6V5CzCoQ.ttf", - "500": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KmiWnDS6V5CzCoQ.ttf", - "600": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KdiKnDS6V5CzCoQ.ttf", - "700": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KTyKnDS6V5CzCoQ.ttf", - "italic": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUuRq6ww480U1xsUpFXD-iDBPNbMh08QUl99KgfYGZPTiSRxinSoROp.ttf", - "500italic": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUuRq6ww480U1xsUpFXD-iDBPNbMh08QUl99KgfYGZ9TiSRxinSoROp.ttf", - "600italic": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUuRq6ww480U1xsUpFXD-iDBPNbMh08QUl99KgfYGaRSSSRxinSoROp.ttf", - "700italic": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUuRq6ww480U1xsUpFXD-iDBPNbMh08QUl99KgfYGaoSSSRxinSoROp.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KqCWXDCSR.ttf" - }, - { - "family": "Poly", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/poly/v18/MQpb-W6wKNitRLCAq2Lpris.ttf", - "italic": "https://fonts.gstatic.com/s/poly/v18/MQpV-W6wKNitdLKKr0DsviuGWA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/poly/v18/MQpb-W6wKNitdLGKrw.ttf" - }, - { - "family": "Pompiere", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/pompiere/v21/VEMyRoxis5Dwuyeov6Wt5jDtreOL.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pompiere/v21/VEMyRoxis5Dwuyeov5Ws7DQ.ttf" - }, - { - "family": "Ponnala", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v3", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/ponnala/v3/w8gaH2QxQOU08bbbrQut2F4OuOo.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ponnala/v3/w8gaH2QxQOU08bbbnQqn3A.ttf" - }, - { - "family": "Ponomar", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin" - ], - "version": "v5", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/ponomar/v5/or3iQ6zp3fKD2wImbJTdArg8hzo.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ponomar/v5/or3iQ6zp3fKD2wImXJXXBg.ttf" - }, - { - "family": "Pontano Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOSzMncaMp9gzWsE.ttf", - "regular": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOXLMncaMp9gzWsE.ttf", - "500": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOUDMncaMp9gzWsE.ttf", - "600": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOazLncaMp9gzWsE.ttf", - "700": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOZXLncaMp9gzWsE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOXLMrceGow.ttf" - }, - { - "family": "Poor Story", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/poorstory/v24/jizfREFUsnUct9P6cDfd4OmnLD0Z4zM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/poorstory/v24/jizfREFUsnUct9P6cDfd0OitKA.ttf" - }, - { - "family": "Poppins", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/poppins/v24/pxiGyp8kv8JHgFVrLPTed3FBGPaTSQ.ttf", - "100italic": "https://fonts.gstatic.com/s/poppins/v24/pxiAyp8kv8JHgFVrJJLmE3tFOvODSVFF.ttf", - "200": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLFj_V1tvFP-KUEg.ttf", - "200italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLmv1plEN2PQEhcqw.ttf", - "300": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLDz8V1tvFP-KUEg.ttf", - "300italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLm21llEN2PQEhcqw.ttf", - "regular": "https://fonts.gstatic.com/s/poppins/v24/pxiEyp8kv8JHgFVrFJDUc1NECPY.ttf", - "italic": "https://fonts.gstatic.com/s/poppins/v24/pxiGyp8kv8JHgFVrJJLed3FBGPaTSQ.ttf", - "500": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLGT9V1tvFP-KUEg.ttf", - "500italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLmg1hlEN2PQEhcqw.ttf", - "600": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLEj6V1tvFP-KUEg.ttf", - "600italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLmr19lEN2PQEhcqw.ttf", - "700": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLCz7V1tvFP-KUEg.ttf", - "700italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLmy15lEN2PQEhcqw.ttf", - "800": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLDD4V1tvFP-KUEg.ttf", - "800italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLm111lEN2PQEhcqw.ttf", - "900": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLBT5V1tvFP-KUEg.ttf", - "900italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLm81xlEN2PQEhcqw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/poppins/v24/pxiEyp8kv8JHgFVrJJHedw.ttf" - }, - { - "family": "Port Lligat Sans", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/portlligatsans/v24/kmKmZrYrGBbdN1aV7Vokow6Lw4s4l7N0Tx4xEcQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/portlligatsans/v24/kmKmZrYrGBbdN1aV7Vokow6Lw4s4p7J-Sw.ttf" - }, - { - "family": "Port Lligat Slab", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/portlligatslab/v27/LDIpaoiQNgArA8kR7ulhZ8P_NYOss7ob9yGLmfI.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/portlligatslab/v27/LDIpaoiQNgArA8kR7ulhZ8P_NYOsg7sR8w.ttf" - }, - { - "family": "Potta One", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/pottaone/v19/FeVSS05Bp6cy7xI-YfxQ3Z5nm29Gww.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pottaone/v19/FeVSS05Bp6cy7xI-Yfxg3JRj.ttf" - }, - { - "family": "Pragati Narrow", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/pragatinarrow/v15/vm8vdRf0T0bS1ffgsPB7WZ-mD17_ytN3M48a.ttf", - "700": "https://fonts.gstatic.com/s/pragatinarrow/v15/vm8sdRf0T0bS1ffgsPB7WZ-mD2ZD5fd_GJMTlo_4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pragatinarrow/v15/vm8vdRf0T0bS1ffgsPB7WZ-mD27-wNc.ttf" - }, - { - "family": "Praise", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/praise/v9/qkBUXvUZ-cnFXcFyDvO67L9XmQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/praise/v9/qkBUXvUZ-cnFXcFCD_m-.ttf" - }, - { - "family": "Prata", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/prata/v22/6xKhdSpbNNCT-vWIAG_5LWwJ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/prata/v22/6xKhdSpbNNCT-sWJCms.ttf" - }, - { - "family": "Preahvihear", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v32", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/preahvihear/v32/6NUS8F-dNQeEYhzj7uluxswE49FJf8Wv.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/preahvihear/v32/6NUS8F-dNQeEYhzj7uluxvwF6dU.ttf" - }, - { - "family": "Press Start 2P", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/pressstart2p/v16/e3t4euO8T-267oIAQAu6jDQyK0nSgPJE4580.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pressstart2p/v16/e3t4euO8T-267oIAQAu6jDQyK3nTivY.ttf" - }, - { - "family": "Pridi", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc1SiE0jRUG0AqUc.ttf", - "300": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc02i00jRUG0AqUc.ttf", - "regular": "https://fonts.gstatic.com/s/pridi/v15/2sDQZG5JnZLfkfWao2krbl29.ttf", - "500": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc1uik0jRUG0AqUc.ttf", - "600": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc1CjU0jRUG0AqUc.ttf", - "700": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc0mjE0jRUG0AqUc.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/pridi/v15/2sDQZG5JnZLfkcWbqW0.ttf" - }, - { - "family": "Princess Sofia", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/princesssofia/v27/qWczB6yguIb8DZ_GXZst16n7GRz7mDUoupoI.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/princesssofia/v27/qWczB6yguIb8DZ_GXZst16n7GSz6kjE.ttf" - }, - { - "family": "Prociono", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v28", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/prociono/v28/r05YGLlR-KxAf9GGO8upyDYtStiJ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/prociono/v28/r05YGLlR-KxAf9GGO_uowjI.ttf" - }, - { - "family": "Prompt", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/prompt/v12/-W_9XJnvUD7dzB2CA9oYREcjeo0k.ttf", - "100italic": "https://fonts.gstatic.com/s/prompt/v12/-W_7XJnvUD7dzB2KZeJ8TkMBf50kbiM.ttf", - "200": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Cr_s4bmkvc5Q9dw.ttf", - "200italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeLQb2MrUZEtdzow.ttf", - "300": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Cy_g4bmkvc5Q9dw.ttf", - "300italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeK0bGMrUZEtdzow.ttf", - "regular": "https://fonts.gstatic.com/s/prompt/v12/-W__XJnvUD7dzB26Z9AcZkIzeg.ttf", - "italic": "https://fonts.gstatic.com/s/prompt/v12/-W_9XJnvUD7dzB2KZdoYREcjeo0k.ttf", - "500": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Ck_k4bmkvc5Q9dw.ttf", - "500italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeLsbWMrUZEtdzow.ttf", - "600": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Cv_44bmkvc5Q9dw.ttf", - "600italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeLAamMrUZEtdzow.ttf", - "700": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2C2_84bmkvc5Q9dw.ttf", - "700italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeKka2MrUZEtdzow.ttf", - "800": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Cx_w4bmkvc5Q9dw.ttf", - "800italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeK4aGMrUZEtdzow.ttf", - "900": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2C4_04bmkvc5Q9dw.ttf", - "900italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeKcaWMrUZEtdzow.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/prompt/v12/-W__XJnvUD7dzB2KZtoY.ttf" - }, - { - "family": "Prosto One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/prostoone/v21/OpNJno4VhNfK-RgpwWWxpipfWhXD00c.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/prostoone/v21/OpNJno4VhNfK-RgpwWWxlitVXg.ttf" - }, - { - "family": "Protest Guerrilla", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/protestguerrilla/v2/Qw3HZR5PDSL6K3irtrY-VJB2YzARHV0koJ8y_eiS.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/protestguerrilla/v2/Qw3HZR5PDSL6K3irtrY-VJB2YzARHW0lqps.ttf" - }, - { - "family": "Protest Revolution", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/protestrevolution/v2/11hcGofZ0kXBbxQXFB7MJsjtqnVw6Z2s8PIzTG1nQw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/protestrevolution/v2/11hcGofZ0kXBbxQXFB7MJsjtqnVw6Z2c8fg3.ttf" - }, - { - "family": "Protest Riot", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/protestriot/v2/d6lPkaOxWMKm7TdezXFmpkrM1_JgjmRpOA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/protestriot/v2/d6lPkaOxWMKm7TdezXFmpkr81vhk.ttf" - }, - { - "family": "Protest Strike", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/proteststrike/v2/0QI5MXdf4Y67Rn6vBog67ZjFlpzW0gZOs7BX.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/proteststrike/v2/0QI5MXdf4Y67Rn6vBog67ZjFlqzX2AI.ttf" - }, - { - "family": "Proza Libre", - "variants": [ - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v9", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/prozalibre/v9/LYjGdGHgj0k1DIQRyUEyyHovftvXWYyz.ttf", - "italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjEdGHgj0k1DIQRyUEyyEotdN_1XJyz7zc.ttf", - "500": "https://fonts.gstatic.com/s/prozalibre/v9/LYjbdGHgj0k1DIQRyUEyyELbV__fcpC69i6N.ttf", - "500italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjZdGHgj0k1DIQRyUEyyEotTCvceJSY8z6Np1k.ttf", - "600": "https://fonts.gstatic.com/s/prozalibre/v9/LYjbdGHgj0k1DIQRyUEyyEL3UP_fcpC69i6N.ttf", - "600italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjZdGHgj0k1DIQRyUEyyEotTAfbeJSY8z6Np1k.ttf", - "700": "https://fonts.gstatic.com/s/prozalibre/v9/LYjbdGHgj0k1DIQRyUEyyEKTUf_fcpC69i6N.ttf", - "700italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjZdGHgj0k1DIQRyUEyyEotTGPaeJSY8z6Np1k.ttf", - "800": "https://fonts.gstatic.com/s/prozalibre/v9/LYjbdGHgj0k1DIQRyUEyyEKPUv_fcpC69i6N.ttf", - "800italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjZdGHgj0k1DIQRyUEyyEotTH_ZeJSY8z6Np1k.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/prozalibre/v9/LYjGdGHgj0k1DIQRyUEyyEoudN8.ttf" - }, - { - "family": "Public Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuFpi5ww0pX189fg.ttf", - "200": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymulpm5ww0pX189fg.ttf", - "300": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuSJm5ww0pX189fg.ttf", - "regular": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuFpm5ww0pX189fg.ttf", - "500": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuJJm5ww0pX189fg.ttf", - "600": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuyJ65ww0pX189fg.ttf", - "700": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymu8Z65ww0pX189fg.ttf", - "800": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymulp65ww0pX189fg.ttf", - "900": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuv565ww0pX189fg.ttf", - "100italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tpRgQctfVotfj7j.ttf", - "200italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673trRgActfVotfj7j.ttf", - "300italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673toPgActfVotfj7j.ttf", - "italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tpRgActfVotfj7j.ttf", - "500italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tpjgActfVotfj7j.ttf", - "600italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tqPhwctfVotfj7j.ttf", - "700italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tq2hwctfVotfj7j.ttf", - "800italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673trRhwctfVotfj7j.ttf", - "900italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tr4hwctfVotfj7j.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuFpmJwgct.ttf" - }, - { - "family": "Puppies Play", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/puppiesplay/v11/wlp2gwHZEV99rG6M3NR9uB9vaAJSA_JN3Q.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/puppiesplay/v11/wlp2gwHZEV99rG6M3NR9uB9faQhW.ttf" - }, - { - "family": "Puritan", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/puritan/v25/845YNMgkAJ2VTtIo9JrwRdaI50M.ttf", - "italic": "https://fonts.gstatic.com/s/puritan/v25/845aNMgkAJ2VTtIoxJj6QfSN90PfXA.ttf", - "700": "https://fonts.gstatic.com/s/puritan/v25/845dNMgkAJ2VTtIozCbfYd6j-0rGRes.ttf", - "700italic": "https://fonts.gstatic.com/s/puritan/v25/845fNMgkAJ2VTtIoxJjC_dup_2jDVevnLQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/puritan/v25/845YNMgkAJ2VTtIoxJv6QQ.ttf" - }, - { - "family": "Purple Purse", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/purplepurse/v25/qWctB66gv53iAp-Vfs4My6qyeBb_ujA4ug.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/purplepurse/v25/qWctB66gv53iAp-Vfs4My6qCeRz7.ttf" - }, - { - "family": "Qahiri", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin" - ], - "version": "v11", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/qahiri/v11/tsssAp1RZy0C_hGuU3Chrnmupw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/qahiri/v11/tsssAp1RZy0C_hGeUnql.ttf" - }, - { - "family": "Quando", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/quando/v18/xMQVuFNaVa6YuW0pC6WzKX_QmA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/quando/v18/xMQVuFNaVa6YuW0ZCq-3.ttf" - }, - { - "family": "Quantico", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/quantico/v19/rax-HiSdp9cPL3KIF4xsLjxSmlLZ.ttf", - "italic": "https://fonts.gstatic.com/s/quantico/v19/rax4HiSdp9cPL3KIF7xuJDhwn0LZ6T8.ttf", - "700": "https://fonts.gstatic.com/s/quantico/v19/rax5HiSdp9cPL3KIF7TQARhasU7Q8Cad.ttf", - "700italic": "https://fonts.gstatic.com/s/quantico/v19/rax7HiSdp9cPL3KIF7xuHIRfu0ry9TadML4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/quantico/v19/rax-HiSdp9cPL3KIF7xtJDg.ttf" - }, - { - "family": "Quattrocento", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/quattrocento/v24/OZpEg_xvsDZQL_LKIF7q4jPHxGL7f4jFuA.ttf", - "700": "https://fonts.gstatic.com/s/quattrocento/v24/OZpbg_xvsDZQL_LKIF7q4jP_eE3fd6PZsXcM9w.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/quattrocento/v24/OZpEg_xvsDZQL_LKIF7q4jP3xWj_.ttf" - }, - { - "family": "Quattrocento Sans", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9c4lja2NVIDdIAAoMR5MfuElaRB3zOvU7eHGHJ.ttf", - "italic": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9a4lja2NVIDdIAAoMR5MfuElaRB0zMt0r8GXHJkLI.ttf", - "700": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9Z4lja2NVIDdIAAoMR5MfuElaRB0RykmrWN33AiasJ.ttf", - "700italic": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9X4lja2NVIDdIAAoMR5MfuElaRB0zMj_bTPXnijLsJV7E.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9c4lja2NVIDdIAAoMR5MfuElaRB0zPt0o.ttf" - }, - { - "family": "Questrial", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/questrial/v19/QdVUSTchPBm7nuUeVf7EuStkm20oJA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/questrial/v19/QdVUSTchPBm7nuUeVf70uCFg.ttf" - }, - { - "family": "Quicksand", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v37", - "lastModified": "2025-09-02", - "files": { - "300": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkKEo18G0wx40QDw.ttf", - "regular": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o18G0wx40QDw.ttf", - "500": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkM0o18G0wx40QDw.ttf", - "600": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkCEv18G0wx40QDw.ttf", - "700": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkBgv18G0wx40QDw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o58C-xw.ttf" - }, - { - "family": "Quintessential", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/quintessential/v24/fdNn9sOGq31Yjnh3qWU14DdtjY5wS7kmAyxM.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/quintessential/v24/fdNn9sOGq31Yjnh3qWU14Ddtjb5xQb0.ttf" - }, - { - "family": "Qwigley", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/qwigley/v20/1cXzaU3UGJb5tGoCuVxsi1mBmcE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/qwigley/v20/1cXzaU3UGJb5tGoCiV1mjw.ttf" - }, - { - "family": "Qwitcher Grypen", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/qwitchergrypen/v8/pxicypclp9tDilN9RrC5BSI1dZmrSGNAom-wpw.ttf", - "700": "https://fonts.gstatic.com/s/qwitchergrypen/v8/pxiZypclp9tDilN9RrC5BSI1dZmT9ExkqkSsrvNXiA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/qwitchergrypen/v8/pxicypclp9tDilN9RrC5BSI1dZmbSWlE.ttf" - }, - { - "family": "REM", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPMLrrToUbIqIfBU.ttf", - "200": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPELqrToUbIqIfBU.ttf", - "300": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPJzqrToUbIqIfBU.ttf", - "regular": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPMLqrToUbIqIfBU.ttf", - "500": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPPDqrToUbIqIfBU.ttf", - "600": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPBztrToUbIqIfBU.ttf", - "700": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPCXtrToUbIqIfBU.ttf", - "800": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPELtrToUbIqIfBU.ttf", - "900": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPGvtrToUbIqIfBU.ttf", - "100italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpRXgeaKiNbBVWkw.ttf", - "200italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpxXkeaKiNbBVWkw.ttf", - "300italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpG3keaKiNbBVWkw.ttf", - "italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpRXkeaKiNbBVWkw.ttf", - "500italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpd3keaKiNbBVWkw.ttf", - "600italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpm34eaKiNbBVWkw.ttf", - "700italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpon4eaKiNbBVWkw.ttf", - "800italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpxX4eaKiNbBVWkw.ttf", - "900italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqp7H4eaKiNbBVWkw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPMLqnTseaA.ttf" - }, - { - "family": "Racing Sans One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/racingsansone/v17/sykr-yRtm7EvTrXNxkv5jfKKyDCwL3rmWpIBtA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/racingsansone/v17/sykr-yRtm7EvTrXNxkv5jfKKyDCALnDi.ttf" - }, - { - "family": "Radio Canada", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "canadian-aboriginal", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nESkQPIJOdSSfOT.ttf", - "regular": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nFMkQPIJOdSSfOT.ttf", - "500": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nF-kQPIJOdSSfOT.ttf", - "600": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nGSlgPIJOdSSfOT.ttf", - "700": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nGrlgPIJOdSSfOT.ttf", - "300italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0rWLLuNwTOOTa9k.ttf", - "italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0uuLLuNwTOOTa9k.ttf", - "500italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0tmLLuNwTOOTa9k.ttf", - "600italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0jWMLuNwTOOTa9k.ttf", - "700italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0gyMLuNwTOOTa9k.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nFMkTPJLuM.ttf" - }, - { - "family": "Radio Canada Big", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6nNRY3p2pcheCsG.ttf", - "500": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6n_RY3p2pcheCsG.ttf", - "600": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6kTQo3p2pcheCsG.ttf", - "700": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6kqQo3p2pcheCsG.ttf", - "italic": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjqdHrinEImAoQewU0hyTsPFra4SJaI_D54b8U_WLwFBmWq0JMDfTsGdMc.ttf", - "500italic": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjqdHrinEImAoQewU0hyTsPFra4SJaI_D54b8U_WLwFBleq0JMDfTsGdMc.ttf", - "600italic": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjqdHrinEImAoQewU0hyTsPFra4SJaI_D54b8U_WLwFBrut0JMDfTsGdMc.ttf", - "700italic": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjqdHrinEImAoQewU0hyTsPFra4SJaI_D54b8U_WLwFBoKt0JMDfTsGdMc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6nNRb3o0JM.ttf" - }, - { - "family": "Radley", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/radley/v24/LYjDdGzinEIjCN19oAlEpVs3VQ.ttf", - "italic": "https://fonts.gstatic.com/s/radley/v24/LYjBdGzinEIjCN1NogNAh14nVcfe.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/radley/v24/LYjDdGzinEIjCN1NoQNA.ttf" - }, - { - "family": "Rajdhani", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/rajdhani/v17/LDI2apCSOBg7S-QT7pasEcOsc-bGkqIw.ttf", - "regular": "https://fonts.gstatic.com/s/rajdhani/v17/LDIxapCSOBg7S-QT7q4AOeekWPrP.ttf", - "500": "https://fonts.gstatic.com/s/rajdhani/v17/LDI2apCSOBg7S-QT7pb0EMOsc-bGkqIw.ttf", - "600": "https://fonts.gstatic.com/s/rajdhani/v17/LDI2apCSOBg7S-QT7pbYF8Osc-bGkqIw.ttf", - "700": "https://fonts.gstatic.com/s/rajdhani/v17/LDI2apCSOBg7S-QT7pa8FsOsc-bGkqIw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rajdhani/v17/LDIxapCSOBg7S-QT7p4BM-M.ttf" - }, - { - "family": "Rakkas", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/rakkas/v22/Qw3cZQlNHiblL3j_lttPOeMcCw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rakkas/v22/Qw3cZQlNHiblL3jPl9FL.ttf" - }, - { - "family": "Raleway", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v37", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvao4CPNLA3JC9c.ttf", - "200": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVtaooCPNLA3JC9c.ttf", - "300": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVuEooCPNLA3JC9c.ttf", - "regular": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaooCPNLA3JC9c.ttf", - "500": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvoooCPNLA3JC9c.ttf", - "600": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVsEpYCPNLA3JC9c.ttf", - "700": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVs9pYCPNLA3JC9c.ttf", - "800": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVtapYCPNLA3JC9c.ttf", - "900": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVtzpYCPNLA3JC9c.ttf", - "100italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4WjNPrQVIT9c2c8.ttf", - "200italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4ejMPrQVIT9c2c8.ttf", - "300italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4TbMPrQVIT9c2c8.ttf", - "italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4WjMPrQVIT9c2c8.ttf", - "500italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4VrMPrQVIT9c2c8.ttf", - "600italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4bbLPrQVIT9c2c8.ttf", - "700italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4Y_LPrQVIT9c2c8.ttf", - "800italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4ejLPrQVIT9c2c8.ttf", - "900italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4cHLPrQVIT9c2c8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCOPrQ.ttf" - }, - { - "family": "Raleway Dots", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/ralewaydots/v19/6NUR8FifJg6AfQvzpshgwJ8kyf9Fdty2ew.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ralewaydots/v19/6NUR8FifJg6AfQvzpshgwJ8UyPVB.ttf" - }, - { - "family": "Ramabhadra", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/ramabhadra/v17/EYq2maBOwqRW9P1SQ83LehNGX5uWw3o.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ramabhadra/v17/EYq2maBOwqRW9P1SQ83LShJMWw.ttf" - }, - { - "family": "Ramaraja", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/ramaraja/v17/SlGTmQearpYAYG1CABIkqnB6aSQU.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ramaraja/v17/SlGTmQearpYAYG1CACIloHQ.ttf" - }, - { - "family": "Rambla", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/rambla/v14/snfrs0ip98hx6mr0I7IONthkwQ.ttf", - "italic": "https://fonts.gstatic.com/s/rambla/v14/snfps0ip98hx6mrEIbgKFN10wYKa.ttf", - "700": "https://fonts.gstatic.com/s/rambla/v14/snfos0ip98hx6mrMn50qPvN4yJuDYQ.ttf", - "700italic": "https://fonts.gstatic.com/s/rambla/v14/snfus0ip98hx6mrEIYC2O_l86p6TYS-Y.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rambla/v14/snfrs0ip98hx6mrEIrgK.ttf" - }, - { - "family": "Rammetto One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/rammettoone/v21/LhWiMV3HOfMbMetJG3lQDpp9Mvuciu-_SQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rammettoone/v21/LhWiMV3HOfMbMetJG3lQDppNM_GY.ttf" - }, - { - "family": "Rampart One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/rampartone/v13/K2F1fZFGl_JSR1tAWNG9R6qgLS76ZHOM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rampartone/v13/K2F1fZFGl_JSR1tAWNG9R5qhJyo.ttf" - }, - { - "family": "Ranchers", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/ranchers/v19/zrfm0H3Lx-P2Xvs2AoDYDC79XTHv.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ranchers/v19/zrfm0H3Lx-P2Xvs2ArDZBio.ttf" - }, - { - "family": "Rancho", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/rancho/v22/46kulbzmXjLaqZRlbWXgd0RY1g.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rancho/v22/46kulbzmXjLaqZRVbG_k.ttf" - }, - { - "family": "Ranga", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-04-23", - "files": { - "regular": "https://fonts.gstatic.com/s/ranga/v22/C8ct4cYisGb28p6CLDwZwmGE.ttf", - "700": "https://fonts.gstatic.com/s/ranga/v22/C8cg4cYisGb28qY-AxgR6X2NZAn2.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ranga/v22/C8ct4cYisGb28q6DJjg.ttf" - }, - { - "family": "Rasa", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN4YJW41fcvN2KT4.ttf", - "regular": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN5GJW41fcvN2KT4.ttf", - "500": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN50JW41fcvN2KT4.ttf", - "600": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN6YIm41fcvN2KT4.ttf", - "700": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN6hIm41fcvN2KT4.ttf", - "300italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZth2d8_v3bT4Ycc.ttf", - "italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZoZ2d8_v3bT4Ycc.ttf", - "500italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZrR2d8_v3bT4Ycc.ttf", - "600italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZlhxd8_v3bT4Ycc.ttf", - "700italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZmFxd8_v3bT4Ycc.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN5GJV40d88.ttf" - }, - { - "family": "Rationale", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/rationale/v30/9XUnlJ92n0_JFxHIfHcsdlFMzLC2Zw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rationale/v30/9XUnlJ92n0_JFxHIfHccd1tI.ttf" - }, - { - "family": "Ravi Prakash", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v21", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/raviprakash/v21/gokpH6fsDkVrF9Bv9X8SOAKHmNZEq6TTFw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/raviprakash/v21/gokpH6fsDkVrF9Bv9X8SOAK3mdxA.ttf" - }, - { - "family": "Readex Pro", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTCYUSmgmsglvjkag.ttf", - "300": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTCv0Smgmsglvjkag.ttf", - "regular": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTC4USmgmsglvjkag.ttf", - "500": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTC00Smgmsglvjkag.ttf", - "600": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTCP0Omgmsglvjkag.ttf", - "700": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTCBkOmgmsglvjkag.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTC4USWg2Ek.ttf" - }, - { - "family": "Recursive", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v44", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck018vwxjDJCL.ttf", - "regular": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk018vwxjDJCL.ttf", - "500": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk018vwxjDJCL.ttf", - "600": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclE18vwxjDJCL.ttf", - "700": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllE18vwxjDJCL.ttf", - "800": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClE18vwxjDJCL.ttf", - "900": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlE18vwxjDJCL.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk319tQg.ttf" - }, - { - "family": "Red Hat Display", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbjKWckg5-Xecg3w.ttf", - "regular": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbmyWckg5-Xecg3w.ttf", - "500": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbl6Wckg5-Xecg3w.ttf", - "600": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbrKRckg5-Xecg3w.ttf", - "700": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbouRckg5-Xecg3w.ttf", - "800": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbuyRckg5-Xecg3w.ttf", - "900": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbsWRckg5-Xecg3w.ttf", - "300italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVxAsz_VWZk3zJGg.ttf", - "italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVmgsz_VWZk3zJGg.ttf", - "500italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVqAsz_VWZk3zJGg.ttf", - "600italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVRAwz_VWZk3zJGg.ttf", - "700italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVfQwz_VWZk3zJGg.ttf", - "800italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVGgwz_VWZk3zJGg.ttf", - "900italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVMwwz_VWZk3zJGg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbmyWQkkz_Q.ttf" - }, - { - "family": "Red Hat Mono", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQQPI-7HNuW4QuKI.ttf", - "regular": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQV3I-7HNuW4QuKI.ttf", - "500": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQW_I-7HNuW4QuKI.ttf", - "600": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQYPP-7HNuW4QuKI.ttf", - "700": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQbrP-7HNuW4QuKI.ttf", - "300italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWLTfLHvUwVqKIJuw.ttf", - "italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWLE_LHvUwVqKIJuw.ttf", - "500italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWLIfLHvUwVqKIJuw.ttf", - "600italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWLzfXHvUwVqKIJuw.ttf", - "700italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWL9PXHvUwVqKIJuw.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQV3Iy7DHvQ.ttf" - }, - { - "family": "Red Hat Text", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML-ZwVrbacYVFtIY.ttf", - "regular": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML7hwVrbacYVFtIY.ttf", - "500": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML4pwVrbacYVFtIY.ttf", - "600": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML2Z3VrbacYVFtIY.ttf", - "700": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML193VrbacYVFtIY.ttf", - "300italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAz4PXQdadApIYv_g.ttf", - "italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAzvvXQdadApIYv_g.ttf", - "500italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAzjPXQdadApIYv_g.ttf", - "600italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAzYPLQdadApIYv_g.ttf", - "700italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAzWfLQdadApIYv_g.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML7hwZrfQdQ.ttf" - }, - { - "family": "Red Rose", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8y8_sDcjSsYUVUjg.ttf", - "regular": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8yrfsDcjSsYUVUjg.ttf", - "500": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8yn_sDcjSsYUVUjg.ttf", - "600": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8yc_wDcjSsYUVUjg.ttf", - "700": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8ySvwDcjSsYUVUjg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8yrfszcz6o.ttf" - }, - { - "family": "Redacted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/redacted/v11/Z9XVDmdRShme2O_7aITe4u2El6GC.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redacted/v11/Z9XVDmdRShme2O_7aLTf6Ok.ttf" - }, - { - "family": "Redacted Script", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-17", - "files": { - "300": "https://fonts.gstatic.com/s/redactedscript/v12/ypvEbXGRglhokR7dcC3d1-R6zmxqHUzVmbI397ldkg.ttf", - "regular": "https://fonts.gstatic.com/s/redactedscript/v12/ypvBbXGRglhokR7dcC3d1-R6zmxSsWTxkZkr_g.ttf", - "700": "https://fonts.gstatic.com/s/redactedscript/v12/ypvEbXGRglhokR7dcC3d1-R6zmxqDUvVmbI397ldkg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redactedscript/v12/ypvBbXGRglhokR7dcC3d1-R6zmxisG71.ttf" - }, - { - "family": "Reddit Mono", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUQCYacnnYz7yQYA.ttf", - "300": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUniYacnnYz7yQYA.ttf", - "regular": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUwCYacnnYz7yQYA.ttf", - "500": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vU8iYacnnYz7yQYA.ttf", - "600": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUHiEacnnYz7yQYA.ttf", - "700": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUJyEacnnYz7yQYA.ttf", - "800": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUQCEacnnYz7yQYA.ttf", - "900": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUaSEacnnYz7yQYA.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUwCYqc3Pc.ttf" - }, - { - "family": "Reddit Sans", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5ux7YxmAVfBiVMFlw.ttf", - "300": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxM4xmAVfBiVMFlw.ttf", - "regular": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxbYxmAVfBiVMFlw.ttf", - "500": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxX4xmAVfBiVMFlw.ttf", - "600": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxs4tmAVfBiVMFlw.ttf", - "700": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxiotmAVfBiVMFlw.ttf", - "800": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5ux7YtmAVfBiVMFlw.ttf", - "900": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxxItmAVfBiVMFlw.ttf", - "200italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc8OQl3Fq1YVlz5F.ttf", - "300italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc_QQl3Fq1YVlz5F.ttf", - "italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc-OQl3Fq1YVlz5F.ttf", - "500italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc-8Ql3Fq1YVlz5F.ttf", - "600italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc9QRV3Fq1YVlz5F.ttf", - "700italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc9pRV3Fq1YVlz5F.ttf", - "800italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc8ORV3Fq1YVlz5F.ttf", - "900italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc8nRV3Fq1YVlz5F.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxbYxWAF3F.ttf" - }, - { - "family": "Reddit Sans Condensed", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro9kKUpU4u7XDIuc.ttf", - "300": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJrowcKUpU4u7XDIuc.ttf", - "regular": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro1kKUpU4u7XDIuc.ttf", - "500": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro2sKUpU4u7XDIuc.ttf", - "600": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro4cNUpU4u7XDIuc.ttf", - "700": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro74NUpU4u7XDIuc.ttf", - "800": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro9kNUpU4u7XDIuc.ttf", - "900": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro_ANUpU4u7XDIuc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro1kKYpQyvw.ttf" - }, - { - "family": "Redressed", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v32", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/redressed/v32/x3dickHUbrmJ7wMy9MsBfPACvy_1BA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/redressed/v32/x3dickHUbrmJ7wMy9MsxffoG.ttf" - }, - { - "family": "Reem Kufi", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v28", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQtuZnEGGf3qGuvM4.ttf", - "500": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQttRnEGGf3qGuvM4.ttf", - "600": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQtjhgEGGf3qGuvM4.ttf", - "700": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQtgFgEGGf3qGuvM4.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQtuZnIGCV2g.ttf" - }, - { - "family": "Reem Kufi Fun", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChoYj3nCgrvqZzZXq.ttf", - "500": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChoYR3nCgrvqZzZXq.ttf", - "600": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChob92XCgrvqZzZXq.ttf", - "700": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChobE2XCgrvqZzZXq.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChoYj3kChpP4.ttf", - "colorCapabilities": [ - "COLRv0" - ] - }, - { - "family": "Reem Kufi Ink", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v11", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/reemkufiink/v11/oPWJ_kJmmu8hCvB9iFumxZSnRj5dQnSX1ko.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/reemkufiink/v11/oPWJ_kJmmu8hCvB9iFumxZSndj9XRg.ttf", - "colorCapabilities": [ - "COLRv1", - "SVG" - ] - }, - { - "family": "Reenie Beanie", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/reeniebeanie/v22/z7NSdR76eDkaJKZJFkkjuvWxbP2_qoOgf_w.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/reeniebeanie/v22/z7NSdR76eDkaJKZJFkkjuvWxXPy1rg.ttf" - }, - { - "family": "Reggae One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/reggaeone/v19/7r3DqX5msMIkeuwJwOJt_a5L5uH-mts.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/reggaeone/v19/7r3DqX5msMIkeuwJwOJtza9B4g.ttf" - }, - { - "family": "Rethink Sans", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqkmFRCE7mma-aua4.ttf", - "500": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqklNRCE7mma-aua4.ttf", - "600": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45Dmqkr9WCE7mma-aua4.ttf", - "700": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqkoZWCE7mma-aua4.ttf", - "800": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqkuFWCE7mma-aua4.ttf", - "italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kS4A3snY2fqa7iVQ.ttf", - "500italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kS0g3snY2fqa7iVQ.ttf", - "600italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kSPgrsnY2fqa7iVQ.ttf", - "700italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kSBwrsnY2fqa7iVQ.ttf", - "800italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kSYArsnY2fqa7iVQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqkmFROE_snQ.ttf" - }, - { - "family": "Revalia", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/revalia/v24/WwkexPimBE2-4ZPEeVruNIgJSNM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/revalia/v24/WwkexPimBE2-4ZPESVvkMA.ttf" - }, - { - "family": "Rhodium Libre", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/rhodiumlibre/v21/1q2AY5adA0tn_ukeHcQHqpx6pETLeo2gm2U.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rhodiumlibre/v21/1q2AY5adA0tn_ukeHcQHqpx6lEXBfg.ttf" - }, - { - "family": "Ribeye", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/ribeye/v27/L0x8DFMxk1MP9R3RvPCmRSlUig.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ribeye/v27/L0x8DFMxk1MP9R3hvfqi.ttf" - }, - { - "family": "Ribeye Marrow", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/ribeyemarrow/v26/GFDsWApshnqMRO2JdtRZ2d0vEAwTVWgKdtw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ribeyemarrow/v26/GFDsWApshnqMRO2JdtRZ2d0vIA0ZUQ.ttf" - }, - { - "family": "Righteous", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/righteous/v18/1cXxaUPXBpj2rGoU7C9mj3uEicG01A.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/righteous/v18/1cXxaUPXBpj2rGoU7C9WjnGA.ttf" - }, - { - "family": "Risque", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/risque/v24/VdGfAZUfHosahXxoCUYVBJ-T5g.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/risque/v24/VdGfAZUfHosahXxYCEwR.ttf" - }, - { - "family": "Road Rage", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/roadrage/v9/6NUU8F2fKAOBKjjr4ekvtMYAwdRZfw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/roadrage/v9/6NUU8F2fKAOBKjjr4ekftcwE.ttf" - }, - { - "family": "Roboto", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v49", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbGmTggvWl0Qn.ttf", - "200": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZEbWmTggvWl0Qn.ttf", - "300": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabWmTggvWl0Qn.ttf", - "regular": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbWmTggvWl0Qn.ttf", - "500": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bWmTggvWl0Qn.ttf", - "600": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYaammTggvWl0Qn.ttf", - "700": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjammTggvWl0Qn.ttf", - "800": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZEammTggvWl0Qn.ttf", - "900": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZtammTggvWl0Qn.ttf", - "100italic": "https://fonts.gstatic.com/s/roboto/v49/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLoHRiA_0klQnx24.ttf", - "200italic": "https://fonts.gstatic.com/s/roboto/v49/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLgHQiA_0klQnx24.ttf", - "300italic": "https://fonts.gstatic.com/s/roboto/v49/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLt_QiA_0klQnx24.ttf", - "italic": "https://fonts.gstatic.com/s/roboto/v49/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLoHQiA_0klQnx24.ttf", - "500italic": "https://fonts.gstatic.com/s/roboto/v49/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLrPQiA_0klQnx24.ttf", - "600italic": "https://fonts.gstatic.com/s/roboto/v49/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLl_XiA_0klQnx24.ttf", - "700italic": "https://fonts.gstatic.com/s/roboto/v49/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLmbXiA_0klQnx24.ttf", - "800italic": "https://fonts.gstatic.com/s/roboto/v49/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLgHXiA_0klQnx24.ttf", - "900italic": "https://fonts.gstatic.com/s/roboto/v49/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLijXiA_0klQnx24.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/roboto/v49/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmSiA8.ttf" - }, - { - "family": "Roboto Condensed", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v31", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyWyo_BJ731BKMSK.ttf", - "200": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyUyovBJ731BKMSK.ttf", - "300": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyXsovBJ731BKMSK.ttf", - "regular": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyWyovBJ731BKMSK.ttf", - "500": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyWAovBJ731BKMSK.ttf", - "600": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyVspfBJ731BKMSK.ttf", - "700": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyVVpfBJ731BKMSK.ttf", - "800": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyUypfBJ731BKMSK.ttf", - "900": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyUbpfBJ731BKMSK.ttf", - "100italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64RgL5XljLdSK37o.ttf", - "200italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64ZgK5XljLdSK37o.ttf", - "300italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64UYK5XljLdSK37o.ttf", - "italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64RgK5XljLdSK37o.ttf", - "500italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64SoK5XljLdSK37o.ttf", - "600italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64cYN5XljLdSK37o.ttf", - "700italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64f8N5XljLdSK37o.ttf", - "800italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64ZgN5XljLdSK37o.ttf", - "900italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64bEN5XljLdSK37o.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyWyosBI5Xk.ttf" - }, - { - "family": "Roboto Flex", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v30", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/robotoflex/v30/NaNnepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jZktqc2V3Zs0KvDLdBP8SBZtOs2IifRuUZQMsPJtUsR4DEK6cULNeUx9XgTnH37Ha_FIAp4Fm0PP1hw45DntW2x0wZGzhPmr1YNMYKYn9_1IQXGwJAiUJVUMdN5YUW4O8HtSoXjC1z3QSabshNFVe3e0O5j3ZjrZCu23Qd4G0EBysQNK-QKavMl1cKq3tHXtXi8mzLjaAQbGunCNCKMY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/robotoflex/v30/NaNnepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jZktqc2V3Zs0KvDLdBP8SBZtOs2IifRuUZQMsPJtUsR4DEK6cULNeUx9XgTnH37Ha_FIAp4Fm0PP1hw45DntW2x0wZGzhPmr1YNMYKYn9_1IQXGwJAiUJVUMdN5YUW4O8HtSoXjC1z3QSabshNFVe3e0O5j3ZjrZCu23Qd4G0EBysQNK-QKavMl1cKq3tHXtXi8mzLjaAcbCkmA.ttf" - }, - { - "family": "Roboto Mono", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v31", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vuPQ--5Ip2sSQ.ttf", - "200": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_XvqPQ--5Ip2sSQ.ttf", - "300": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_gPqPQ--5Ip2sSQ.ttf", - "regular": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vqPQ--5Ip2sSQ.ttf", - "500": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_7PqPQ--5Ip2sSQ.ttf", - "600": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_AP2PQ--5Ip2sSQ.ttf", - "700": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_Of2PQ--5Ip2sSQ.ttf", - "100italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAeW9AJi8SZwt.ttf", - "200italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrnnAOW9AJi8SZwt.ttf", - "300italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrk5AOW9AJi8SZwt.ttf", - "italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAOW9AJi8SZwt.ttf", - "500italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlVAOW9AJi8SZwt.ttf", - "600italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrm5B-W9AJi8SZwt.ttf", - "700italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrmAB-W9AJi8SZwt.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QuW9.ttf" - }, - { - "family": "Roboto Serif", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEliosp6d2Af5fR4k.ttf", - "200": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElqotp6d2Af5fR4k.ttf", - "300": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElnQtp6d2Af5fR4k.ttf", - "regular": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEliotp6d2Af5fR4k.ttf", - "500": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElhgtp6d2Af5fR4k.ttf", - "600": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElvQqp6d2Af5fR4k.ttf", - "700": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEls0qp6d2Af5fR4k.ttf", - "800": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElqoqp6d2Af5fR4k.ttf", - "900": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEloMqp6d2Af5fR4k.ttf", - "100italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuT-V8BdxaV4nUFw.ttf", - "200italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-Juz-R8BdxaV4nUFw.ttf", - "300italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuEeR8BdxaV4nUFw.ttf", - "italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuT-R8BdxaV4nUFw.ttf", - "500italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JufeR8BdxaV4nUFw.ttf", - "600italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JukeN8BdxaV4nUFw.ttf", - "700italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuqON8BdxaV4nUFw.ttf", - "800italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-Juz-N8BdxaV4nUFw.ttf", - "900italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-Ju5uN8BdxaV4nUFw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEliotl6Z8BQ.ttf" - }, - { - "family": "Roboto Slab", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v36", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjojIWWaG5iddG-1A.ttf", - "200": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoDISWaG5iddG-1A.ttf", - "300": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjo0oSWaG5iddG-1A.ttf", - "regular": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjojISWaG5iddG-1A.ttf", - "500": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjovoSWaG5iddG-1A.ttf", - "600": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoUoOWaG5iddG-1A.ttf", - "700": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoa4OWaG5iddG-1A.ttf", - "800": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoDIOWaG5iddG-1A.ttf", - "900": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoJYOWaG5iddG-1A.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjojISmaWRm.ttf" - }, - { - "family": "Rochester", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/rochester/v24/6ae-4KCqVa4Zy6Fif-Uy31vWNTMwoQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rochester/v24/6ae-4KCqVa4Zy6Fif-UC3lHS.ttf" - }, - { - "family": "Rock 3D", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin" - ], - "version": "v13", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/rock3d/v13/yYLp0hrL0PCo651513SnwRnQyNI.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rock3d/v13/yYLp0hrL0PCo651553WtxQ.ttf" - }, - { - "family": "Rock Salt", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/rocksalt/v24/MwQ0bhv11fWD6QsAVOZbsEk7hbBWrA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rocksalt/v24/MwQ0bhv11fWD6QsAVOZrsUM_.ttf" - }, - { - "family": "RocknRoll One", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/rocknrollone/v16/kmK7ZqspGAfCeUiW6FFlmEC9guVhs7tfUxc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rocknrollone/v16/kmK7ZqspGAfCeUiW6FFlmEC9suRrtw.ttf" - }, - { - "family": "Rokkitt", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v39", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1rydpDLE76HvN6n.ttf", - "200": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1pyd5DLE76HvN6n.ttf", - "300": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1qsd5DLE76HvN6n.ttf", - "regular": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1ryd5DLE76HvN6n.ttf", - "500": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1rAd5DLE76HvN6n.ttf", - "600": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1oscJDLE76HvN6n.ttf", - "700": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1oVcJDLE76HvN6n.ttf", - "800": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1pycJDLE76HvN6n.ttf", - "900": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1pbcJDLE76HvN6n.ttf", - "100italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NHiJGbqluc6nu9E.ttf", - "200italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NPiIGbqluc6nu9E.ttf", - "300italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NCaIGbqluc6nu9E.ttf", - "italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NHiIGbqluc6nu9E.ttf", - "500italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NEqIGbqluc6nu9E.ttf", - "600italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NKaPGbqluc6nu9E.ttf", - "700italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NJ-PGbqluc6nu9E.ttf", - "800italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NPiPGbqluc6nu9E.ttf", - "900italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NNGPGbqluc6nu9E.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1ryd6DKGbo.ttf" - }, - { - "family": "Romanesco", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/romanesco/v22/w8gYH2ozQOY7_r_J7mSn3HwLqOqSBg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/romanesco/v22/w8gYH2ozQOY7_r_J7mSX3XYP.ttf" - }, - { - "family": "Ropa Sans", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/ropasans/v16/EYqxmaNOzLlWtsZSScyKWjloU5KP2g.ttf", - "italic": "https://fonts.gstatic.com/s/ropasans/v16/EYq3maNOzLlWtsZSScy6WDNscZef2mNE.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ropasans/v16/EYqxmaNOzLlWtsZSScy6WzNs.ttf" - }, - { - "family": "Rosario", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v35", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM69GCWczd-YnOzUD.ttf", - "regular": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM68YCWczd-YnOzUD.ttf", - "500": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM68qCWczd-YnOzUD.ttf", - "600": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM6_GDmczd-YnOzUD.ttf", - "700": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM6__Dmczd-YnOzUD.ttf", - "300italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQStFwfeIFPiUDn08.ttf", - "italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQSo9wfeIFPiUDn08.ttf", - "500italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQSr1wfeIFPiUDn08.ttf", - "600italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQSlF3feIFPiUDn08.ttf", - "700italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQSmh3feIFPiUDn08.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM68YCVcyfeI.ttf" - }, - { - "family": "Rosarivo", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/rosarivo/v24/PlI-Fl2lO6N9f8HaNAeC2nhMnNy5.ttf", - "italic": "https://fonts.gstatic.com/s/rosarivo/v24/PlI4Fl2lO6N9f8HaNDeA0Hxumcy5ZX8.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rosarivo/v24/PlI-Fl2lO6N9f8HaNDeD0Hw.ttf" - }, - { - "family": "Rouge Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/rougescript/v20/LYjFdGbiklMoCIQOw1Ep3S4PVPXbUJWq9g.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rougescript/v20/LYjFdGbiklMoCIQOw1Ep3S4_Vf_f.ttf" - }, - { - "family": "Rowdies", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/rowdies/v19/ptRMTieMYPNBAK219hth5O7yKQNute8.ttf", - "regular": "https://fonts.gstatic.com/s/rowdies/v19/ptRJTieMYPNBAK21zrdJwObZNQo.ttf", - "700": "https://fonts.gstatic.com/s/rowdies/v19/ptRMTieMYPNBAK219gtm5O7yKQNute8.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rowdies/v19/ptRJTieMYPNBAK21_rZDxA.ttf" - }, - { - "family": "Rozha One", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/rozhaone/v17/AlZy_zVFtYP12Zncg2khdXf4XB0Tow.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rozhaone/v17/AlZy_zVFtYP12Zncg2kRdH38.ttf" - }, - { - "family": "Rubik", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "arabic", - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v31", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-WYi1UE80V4bVkA.ttf", - "regular": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-B4i1UE80V4bVkA.ttf", - "500": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-NYi1UE80V4bVkA.ttf", - "600": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-2Y-1UE80V4bVkA.ttf", - "700": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-4I-1UE80V4bVkA.ttf", - "800": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-h4-1UE80V4bVkA.ttf", - "900": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-ro-1UE80V4bVkA.ttf", - "300italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8sDE0UwdYPFkJ1O.ttf", - "italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8tdE0UwdYPFkJ1O.ttf", - "500italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8tvE0UwdYPFkJ1O.ttf", - "600italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8uDFEUwdYPFkJ1O.ttf", - "700italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8u6FEUwdYPFkJ1O.ttf", - "800italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8vdFEUwdYPFkJ1O.ttf", - "900italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8v0FEUwdYPFkJ1O.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-B4iFUUUw.ttf" - }, - { - "family": "Rubik 80s Fade", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubik80sfade/v2/U9MF6dW37nLSmnwZXyoV-uPXUhHwkbL8IHcK.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubik80sfade/v2/U9MF6dW37nLSmnwZXyoV-uPXUiHxm7Y.ttf" - }, - { - "family": "Rubik Beastly", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikbeastly/v11/0QImMXRd5oOmSC2ZQ7o9653X07z8_ApHqqk.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikbeastly/v11/0QImMXRd5oOmSC2ZQ7o9653X4732-A.ttf" - }, - { - "family": "Rubik Broken Fax", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikbrokenfax/v1/NGSvv4rXG042O-GzH9sg1cUgl8w8YW-WdmGi300.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikbrokenfax/v1/NGSvv4rXG042O-GzH9sg1cUgl8w8UW6ccg.ttf" - }, - { - "family": "Rubik Bubbles", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikbubbles/v3/JIA1UVdwbHFJtwA7Us1BPFbRNTENfDxyRXI.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikbubbles/v3/JIA1UVdwbHFJtwA7Us1BPFbRBTAHeA.ttf" - }, - { - "family": "Rubik Burned", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikburned/v1/Jqzk5TmOVOqQHihKqPpscqniHQuaCY5ZSg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikburned/v1/Jqzk5TmOVOqQHihKqPpscqnSHAGe.ttf" - }, - { - "family": "Rubik Dirt", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikdirt/v2/DtVmJxC7WLEj1uIXEWAdulwm6gDXvwE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikdirt/v2/DtVmJxC7WLEj1uIXEWAdil0s7g.ttf" - }, - { - "family": "Rubik Distressed", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikdistressed/v1/GFDxWBdsmnqAVqjtUsZf2dcrQ2ldcWAhatVBaGM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikdistressed/v1/GFDxWBdsmnqAVqjtUsZf2dcrQ2ldQWErbg.ttf" - }, - { - "family": "Rubik Doodle Shadow", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikdoodleshadow/v1/rP2bp3im_k8G_wTVdvvMdHqmXTR3lEaLyKuZ3KOY7Gw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikdoodleshadow/v1/rP2bp3im_k8G_wTVdvvMdHqmXTR3lEaL-KqT2A.ttf" - }, - { - "family": "Rubik Doodle Triangles", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikdoodletriangles/v1/esDA301BLOmMKxKspb3g-domRuLPeaSn2bTzdLi_slZxgWE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikdoodletriangles/v1/esDA301BLOmMKxKspb3g-domRuLPeaSn2bTzRLm1tg.ttf" - }, - { - "family": "Rubik Gemstones", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikgemstones/v1/zrf90HrL0-_8Xb4DFM2rUkWbOVrOiCnGqi1GMw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikgemstones/v1/zrf90HrL0-_8Xb4DFM2rUkWbOVr-iSPC.ttf" - }, - { - "family": "Rubik Glitch", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikglitch/v2/qkBSXv8b_srFRYQVYrDKh9ZvmC7HONiSFQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikglitch/v2/qkBSXv8b_srFRYQVYrDKh9ZfmSTD.ttf" - }, - { - "family": "Rubik Glitch Pop", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikglitchpop/v1/tDbX2pGHhFcM0gB3hN2elZLa3G-MOwStSUrV_BE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikglitchpop/v1/tDbX2pGHhFcM0gB3hN2elZLa3G-MCwWnTQ.ttf" - }, - { - "family": "Rubik Iso", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikiso/v2/x3dickHUfr-S4VAI4sABfPACvy_1BA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikiso/v2/x3dickHUfr-S4VAI4sAxffoG.ttf" - }, - { - "family": "Rubik Lines", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubiklines/v1/_gP81R3vsjYzVW2Y6xFF-GSxYPp7oSNy.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubiklines/v1/_gP81R3vsjYzVW2Y6xFF-FSwav4.ttf" - }, - { - "family": "Rubik Maps", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikmaps/v1/Gw6_wcjl80TZK9XxtbbejSYUChRqp9k.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikmaps/v1/Gw6_wcjl80TZK9XxtbbevSceDg.ttf" - }, - { - "family": "Rubik Marker Hatch", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikmarkerhatch/v1/QldTNSFQsh0B_bFXXWv6LAt-jswapJHQDL4iw0H6zw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikmarkerhatch/v1/QldTNSFQsh0B_bFXXWv6LAt-jswapJHgDbQm.ttf" - }, - { - "family": "Rubik Maze", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikmaze/v2/xMQRuF9ZVa2ftiJEavXSAX7inS-bxV4.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikmaze/v2/xMQRuF9ZVa2ftiJEavXSMX_omQ.ttf" - }, - { - "family": "Rubik Microbe", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikmicrobe/v2/UqyWK8oPP3hjw6ANS9rM3PsZcs8aaKgiauE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikmicrobe/v2/UqyWK8oPP3hjw6ANS9rM3PsZQs4QbA.ttf" - }, - { - "family": "Rubik Mono One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikmonoone/v20/UqyJK8kPP3hjw6ANTdfRk9YSN-8wRqQrc_j9.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikmonoone/v20/UqyJK8kPP3hjw6ANTdfRk9YSN98xTKA.ttf" - }, - { - "family": "Rubik Moonrocks", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikmoonrocks/v7/845ANMAmAI2VUZMLu_W0M7HqlDHnXcD7JGy1Sw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikmoonrocks/v7/845ANMAmAI2VUZMLu_W0M7HqlDHXXMr_.ttf" - }, - { - "family": "Rubik Pixels", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikpixels/v3/SlGXmQOaupkIeSx4CEpB7AdSaBYRagrQrA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikpixels/v3/SlGXmQOaupkIeSx4CEpB7AdiaRwV.ttf" - }, - { - "family": "Rubik Puddles", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikpuddles/v2/1Ptog8bYX_qGnkLkrU5MJsQcJfC0wVMT-aE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikpuddles/v2/1Ptog8bYX_qGnkLkrU5MJsQcFfG-xQ.ttf" - }, - { - "family": "Rubik Scribble", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikscribble/v1/snfzs0Cp48d67SuHQOpjXLsQpbqbSjORSo9W.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikscribble/v1/snfzs0Cp48d67SuHQOpjXLsQpYqaQDc.ttf" - }, - { - "family": "Rubik Spray Paint", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikspraypaint/v1/WnzhHBAoeBPUDTB4EWR82y6EXWPH-Ro-QoaBZQxP.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikspraypaint/v1/WnzhHBAoeBPUDTB4EWR82y6EXWPH-So_SII.ttf" - }, - { - "family": "Rubik Storm", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikstorm/v1/eLGYP-_uPgO5Ag7ju9JaouL9T2Xh9NQk.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikstorm/v1/eLGYP-_uPgO5Ag7ju9JaotL8RWE.ttf" - }, - { - "family": "Rubik Vinyl", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikvinyl/v1/iJWABXKIfDnIV4mQ5BfjvUXexox2ztOU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikvinyl/v1/iJWABXKIfDnIV4mQ5BfjvXXfzIg.ttf" - }, - { - "family": "Rubik Wet Paint", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "hebrew", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/rubikwetpaint/v2/HTx0L20uMDGHgdULcpTF3Oe4d_-F-zz313DuvQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rubikwetpaint/v2/HTx0L20uMDGHgdULcpTF3Oe4d_-1-jbz.ttf" - }, - { - "family": "Ruda", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v30", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaJFsi_-2KiSGg-H.ttf", - "500": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaJ3si_-2KiSGg-H.ttf", - "600": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaKbtS_-2KiSGg-H.ttf", - "700": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaKitS_-2KiSGg-H.ttf", - "800": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaLFtS_-2KiSGg-H.ttf", - "900": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaLstS_-2KiSGg-H.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaJFsh__0qw.ttf" - }, - { - "family": "Rufina", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/rufina/v17/Yq6V-LyURyLy-aKyoxRktOdClg.ttf", - "700": "https://fonts.gstatic.com/s/rufina/v17/Yq6W-LyURyLy-aKKHztAvMxenxE0SA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rufina/v17/Yq6V-LyURyLy-aKCoh5g.ttf" - }, - { - "family": "Ruge Boogie", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/rugeboogie/v30/JIA3UVFwbHRF_GIWSMhKNROiPzUveSxy.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rugeboogie/v30/JIA3UVFwbHRF_GIWSMhKNSOjNTE.ttf" - }, - { - "family": "Ruluko", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/ruluko/v22/xMQVuFNZVaODtm0pC6WzKX_QmA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ruluko/v22/xMQVuFNZVaODtm0ZCq-3.ttf" - }, - { - "family": "Rum Raisin", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/rumraisin/v24/nwpRtKu3Ih8D5avB4h2uJ3-IywA7eMM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rumraisin/v24/nwpRtKu3Ih8D5avB4h2uF36Czw.ttf" - }, - { - "family": "Ruslan Display", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v27", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/ruslandisplay/v27/Gw6jwczl81XcIZuckK_e3UpfdzxrldyFvm1n.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ruslandisplay/v27/Gw6jwczl81XcIZuckK_e3Upfdwxqn9g.ttf" - }, - { - "family": "Russo One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/russoone/v18/Z9XUDmZRWg6M1LvRYsH-yMOInrib9Q.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/russoone/v18/Z9XUDmZRWg6M1LvRYsHOycmM.ttf" - }, - { - "family": "Ruthie", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v28", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/ruthie/v28/gokvH63sGkdqXuU9lD53Q2u_mQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ruthie/v28/gokvH63sGkdqXuUNlTRz.ttf" - }, - { - "family": "Ruwudu", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/ruwudu/v4/syky-y1tj6UzRKfNlQCT9tPdpw.ttf", - "500": "https://fonts.gstatic.com/s/ruwudu/v4/sykx-y1tj6UzRKf1YSm3_vjBrlSILg.ttf", - "600": "https://fonts.gstatic.com/s/ruwudu/v4/sykx-y1tj6UzRKf1TS63_vjBrlSILg.ttf", - "700": "https://fonts.gstatic.com/s/ruwudu/v4/sykx-y1tj6UzRKf1KS-3_vjBrlSILg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ruwudu/v4/syky-y1tj6UzRKf9lAqX.ttf" - }, - { - "family": "Rye", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/rye/v17/r05XGLJT86YDFpTsXOqx4w.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/rye/v17/r05XGLJT86YzF57o.ttf" - }, - { - "family": "STIX Two Text", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5Yihg2SOYWxFMN1WD.ttf", - "500": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5YihS2SOYWxFMN1WD.ttf", - "600": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5Yii-3iOYWxFMN1WD.ttf", - "700": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5YiiH3iOYWxFMN1WD.ttf", - "italic": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Er02F12Xkf5whdwKf11l0p7uWhf8lJUzXZT2omsvbURVuMkWDmSo.ttf", - "500italic": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Er02F12Xkf5whdwKf11l0p7uWhf8lJUzXZT2omvnbURVuMkWDmSo.ttf", - "600italic": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Er02F12Xkf5whdwKf11l0p7uWhf8lJUzXZT2omhXcURVuMkWDmSo.ttf", - "700italic": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Er02F12Xkf5whdwKf11l0p7uWhf8lJUzXZT2omizcURVuMkWDmSo.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5Yihg2ROZURU.ttf" - }, - { - "family": "SUSE", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-18", - "files": { - "100": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbGG71q9ZnJSZtQG.ttf", - "200": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbEG7lq9ZnJSZtQG.ttf", - "300": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbHY7lq9ZnJSZtQG.ttf", - "regular": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbGG7lq9ZnJSZtQG.ttf", - "500": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbG07lq9ZnJSZtQG.ttf", - "600": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbFY6Vq9ZnJSZtQG.ttf", - "700": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbFh6Vq9ZnJSZtQG.ttf", - "800": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbEG6Vq9ZnJSZtQG.ttf", - "900": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbEv6Vq9ZnJSZtQG.ttf", - "100italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrbL_bHZwY8QGjKU.ttf", - "200italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrTL-bHZwY8QGjKU.ttf", - "300italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrez-bHZwY8QGjKU.ttf", - "italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrbL-bHZwY8QGjKU.ttf", - "500italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrYD-bHZwY8QGjKU.ttf", - "600italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrWz5bHZwY8QGjKU.ttf", - "700italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrVX5bHZwY8QGjKU.ttf", - "800italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrTL5bHZwY8QGjKU.ttf", - "900italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrRv5bHZwY8QGjKU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbGG7mq8bHY.ttf" - }, - { - "family": "SUSE Mono", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v1", - "lastModified": "2025-09-18", - "files": { - "100": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB656x2gtcobW_gE0.ttf", - "200": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB6x6w2gtcobW_gE0.ttf", - "300": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB68Cw2gtcobW_gE0.ttf", - "regular": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB656w2gtcobW_gE0.ttf", - "500": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB66yw2gtcobW_gE0.ttf", - "600": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB60C32gtcobW_gE0.ttf", - "700": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB63m32gtcobW_gE0.ttf", - "800": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB6x632gtcobW_gE0.ttf", - "100italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzMklWpZe6kE2tPw.ttf", - "200italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzskhWpZe6kE2tPw.ttf", - "300italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzbEhWpZe6kE2tPw.ttf", - "italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzMkhWpZe6kE2tPw.ttf", - "500italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzAEhWpZe6kE2tPw.ttf", - "600italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbz7E9WpZe6kE2tPw.ttf", - "700italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbz1U9WpZe6kE2tPw.ttf", - "800italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzsk9WpZe6kE2tPw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB656w6gpWpQ.ttf" - }, - { - "family": "Sacramento", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/sacramento/v17/buEzpo6gcdjy0EiZMBUG0CoV_NxLeiw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sacramento/v17/buEzpo6gcdjy0EiZMBUG4Csf-A.ttf" - }, - { - "family": "Sahitya", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/sahitya/v20/6qLAKZkOuhnuqlJAaScFPywEDnI.ttf", - "700": "https://fonts.gstatic.com/s/sahitya/v20/6qLFKZkOuhnuqlJAUZsqGyQvEnvSexI.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sahitya/v20/6qLAKZkOuhnuqlJAWSYPOw.ttf" - }, - { - "family": "Sail", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/sail/v17/DPEjYwiBxwYJFBTDADYAbvw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sail/v17/DPEjYwiBxwYJJBXJBA.ttf" - }, - { - "family": "Saira", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA71rDosg7lwYmUVY.ttf", - "200": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA79rCosg7lwYmUVY.ttf", - "300": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA7wTCosg7lwYmUVY.ttf", - "regular": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA71rCosg7lwYmUVY.ttf", - "500": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA72jCosg7lwYmUVY.ttf", - "600": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA74TFosg7lwYmUVY.ttf", - "700": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA773Fosg7lwYmUVY.ttf", - "800": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA79rFosg7lwYmUVY.ttf", - "900": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA7_PFosg7lwYmUVY.ttf", - "100italic": "https://fonts.gstatic.com/s/saira/v22/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBSooxkyQjQVYmxA.ttf", - "200italic": "https://fonts.gstatic.com/s/saira/v22/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKByosxkyQjQVYmxA.ttf", - "300italic": "https://fonts.gstatic.com/s/saira/v22/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBFIsxkyQjQVYmxA.ttf", - "italic": "https://fonts.gstatic.com/s/saira/v22/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBSosxkyQjQVYmxA.ttf", - "500italic": "https://fonts.gstatic.com/s/saira/v22/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBeIsxkyQjQVYmxA.ttf", - "600italic": "https://fonts.gstatic.com/s/saira/v22/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBlIwxkyQjQVYmxA.ttf", - "700italic": "https://fonts.gstatic.com/s/saira/v22/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBrYwxkyQjQVYmxA.ttf", - "800italic": "https://fonts.gstatic.com/s/saira/v22/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKByowxkyQjQVYmxA.ttf", - "900italic": "https://fonts.gstatic.com/s/saira/v22/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKB44wxkyQjQVYmxA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/saira/v22/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA71rCkskxkw.ttf" - }, - { - "family": "Saira Condensed", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRMQgErUN8XuHNEtX81i9TmEkrnwetA2omSrzS8.ttf", - "200": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnbcpg8Keepi2lHw.ttf", - "300": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnCclg8Keepi2lHw.ttf", - "regular": "https://fonts.gstatic.com/s/sairacondensed/v12/EJROQgErUN8XuHNEtX81i9TmEkrfpeFE-IyCrw.ttf", - "500": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnUchg8Keepi2lHw.ttf", - "600": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnfc9g8Keepi2lHw.ttf", - "700": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnGc5g8Keepi2lHw.ttf", - "800": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnBc1g8Keepi2lHw.ttf", - "900": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnIcxg8Keepi2lHw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sairacondensed/v12/EJROQgErUN8XuHNEtX81i9TmEkrvpOtA.ttf" - }, - { - "family": "Saira Extra Condensed", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFsOHYr-vcC7h8MklGBkrvmUG9rbpkisrTri0jx9i5ss3a3.ttf", - "200": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrJ2nR3ABgum-uoQ.ttf", - "300": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrQ2rR3ABgum-uoQ.ttf", - "regular": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFiOHYr-vcC7h8MklGBkrvmUG9rbpkisrTT70L11Ct8sw.ttf", - "500": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrG2vR3ABgum-uoQ.ttf", - "600": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrN2zR3ABgum-uoQ.ttf", - "700": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrU23R3ABgum-uoQ.ttf", - "800": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrT27R3ABgum-uoQ.ttf", - "900": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTra2_R3ABgum-uoQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFiOHYr-vcC7h8MklGBkrvmUG9rbpkisrTj7kjx.ttf" - }, - { - "family": "Saira Semi Condensed", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MN6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXdvaOM8rXT-8V8.ttf", - "200": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXfDScMWg3j36Ebz.ttf", - "300": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXenSsMWg3j36Ebz.ttf", - "regular": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MD6c-2-nnJkHxyCjRcnMHcWVWV1cWRRU8LYuceqGT-.ttf", - "500": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXf_S8MWg3j36Ebz.ttf", - "600": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXfTTMMWg3j36Ebz.ttf", - "700": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXe3TcMWg3j36Ebz.ttf", - "800": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXerTsMWg3j36Ebz.ttf", - "900": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXePT8MWg3j36Ebz.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MD6c-2-nnJkHxyCjRcnMHcWVWV1cWRRX8KaOM.ttf" - }, - { - "family": "Saira Stencil One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/sairastencilone/v18/SLXSc03I6HkvZGJ1GvvipLoYSTEL9AsMawif2YQ2.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sairastencilone/v18/SLXSc03I6HkvZGJ1GvvipLoYSTEL9DsNYQw.ttf" - }, - { - "family": "Salsa", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/salsa/v23/gNMKW3FiRpKj-imY8ncKEZez.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/salsa/v23/gNMKW3FiRpKj-hmZ-HM.ttf" - }, - { - "family": "Sanchez", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/sanchez/v17/Ycm2sZJORluHnXbITm5b_BwE1l0.ttf", - "italic": "https://fonts.gstatic.com/s/sanchez/v17/Ycm0sZJORluHnXbIfmxR-D4Bxl3gkw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sanchez/v17/Ycm2sZJORluHnXbIfm9R-A.ttf" - }, - { - "family": "Sancreek", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sancreek/v27/pxiHypAnsdxUm159X7D-XV9NEe-K.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sancreek/v27/pxiHypAnsdxUm159X4D_V1s.ttf" - }, - { - "family": "Sankofa Display", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/sankofadisplay/v2/Ktk1ALSRd4LucUDghJ2rTqXOoh33F6mZVY9Y5w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sankofadisplay/v2/Ktk1ALSRd4LucUDghJ2rTqXOoh3HFqOd.ttf" - }, - { - "family": "Sansation", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "greek", - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-04-23", - "files": { - "300": "https://fonts.gstatic.com/s/sansation/v1/LYjFdGPjnEg8DNA0z01YAVgPVPXbUJWq9g.ttf", - "300italic": "https://fonts.gstatic.com/s/sansation/v1/LYjbdGPjnEg8DNA0z01Qr0KDVv_fcpC69i6N.ttf", - "regular": "https://fonts.gstatic.com/s/sansation/v1/LYjAdGPjnEg8DNA0z01grXArXN7HWQ.ttf", - "italic": "https://fonts.gstatic.com/s/sansation/v1/LYjGdGPjnEg8DNA0z01Qr3ovftvXWYyz.ttf", - "700": "https://fonts.gstatic.com/s/sansation/v1/LYjFdGPjnEg8DNA0z01YEV8PVPXbUJWq9g.ttf", - "700italic": "https://fonts.gstatic.com/s/sansation/v1/LYjbdGPjnEg8DNA0z01Qr0KTUf_fcpC69i6N.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sansation/v1/LYjAdGPjnEg8DNA0z01QrHov.ttf" - }, - { - "family": "Sansita", - "variants": [ - "regular", - "italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/sansita/v12/QldONTRRphEb_-V7HBm7TXFf3qw.ttf", - "italic": "https://fonts.gstatic.com/s/sansita/v12/QldMNTRRphEb_-V7LBuxSVNazqx2xg.ttf", - "700": "https://fonts.gstatic.com/s/sansita/v12/QldLNTRRphEb_-V7JKWUaXl0wqVv3_g.ttf", - "700italic": "https://fonts.gstatic.com/s/sansita/v12/QldJNTRRphEb_-V7LBuJ9Xx-xodqz_joDQ.ttf", - "800": "https://fonts.gstatic.com/s/sansita/v12/QldLNTRRphEb_-V7JLmXaXl0wqVv3_g.ttf", - "800italic": "https://fonts.gstatic.com/s/sansita/v12/QldJNTRRphEb_-V7LBuJ6X9-xodqz_joDQ.ttf", - "900": "https://fonts.gstatic.com/s/sansita/v12/QldLNTRRphEb_-V7JJ2WaXl0wqVv3_g.ttf", - "900italic": "https://fonts.gstatic.com/s/sansita/v12/QldJNTRRphEb_-V7LBuJzX5-xodqz_joDQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sansita/v12/QldONTRRphEb_-V7LBixSQ.ttf" - }, - { - "family": "Sansita Swashed", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW-ppbToVehmEa4Q.ttf", - "regular": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW7RpbToVehmEa4Q.ttf", - "500": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW4ZpbToVehmEa4Q.ttf", - "600": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW2pubToVehmEa4Q.ttf", - "700": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW1NubToVehmEa4Q.ttf", - "800": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSWzRubToVehmEa4Q.ttf", - "900": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSWx1ubToVehmEa4Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW7RpXTsffg.ttf" - }, - { - "family": "Sarabun", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/sarabun/v17/DtVhJx26TKEr37c9YHZJmnYI5gnOpg.ttf", - "100italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVnJx26TKEr37c9aBBx_nwMxAzephhN.ttf", - "200": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YNpoulwm6gDXvwE.ttf", - "200italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxUl0s7iLSrwFUlw.ttf", - "300": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YL5rulwm6gDXvwE.ttf", - "300italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxNl4s7iLSrwFUlw.ttf", - "regular": "https://fonts.gstatic.com/s/sarabun/v17/DtVjJx26TKEr37c9WBJDnlQN9gk.ttf", - "italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVhJx26TKEr37c9aBBJmnYI5gnOpg.ttf", - "500": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YOZqulwm6gDXvwE.ttf", - "500italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxbl8s7iLSrwFUlw.ttf", - "600": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YMptulwm6gDXvwE.ttf", - "600italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxQlgs7iLSrwFUlw.ttf", - "700": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YK5sulwm6gDXvwE.ttf", - "700italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxJlks7iLSrwFUlw.ttf", - "800": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YLJvulwm6gDXvwE.ttf", - "800italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxOlos7iLSrwFUlw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sarabun/v17/DtVjJx26TKEr37c9aBNJmg.ttf" - }, - { - "family": "Sarala", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/sarala/v14/uK_y4riEZv4o1w9RCh0TMv6EXw.ttf", - "700": "https://fonts.gstatic.com/s/sarala/v14/uK_x4riEZv4o1w9ptjI3OtWYVkMpXA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sarala/v14/uK_y4riEZv4o1w9hCxcX.ttf" - }, - { - "family": "Sarina", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sarina/v25/-F6wfjF3ITQwasLhLkDUriBQxw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sarina/v25/-F6wfjF3ITQwasLRL0rQ.ttf" - }, - { - "family": "Sarpanch", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sarpanch/v15/hESy6Xt4NCpRuk6Pzh2ARIrX_20n.ttf", - "500": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziV0ba7f1HEuRHkM.ttf", - "600": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziVYaq7f1HEuRHkM.ttf", - "700": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziU8a67f1HEuRHkM.ttf", - "800": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziUgaK7f1HEuRHkM.ttf", - "900": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziUEaa7f1HEuRHkM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sarpanch/v15/hESy6Xt4NCpRuk6Pzi2BTo4.ttf" - }, - { - "family": "Sassy Frass", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sassyfrass/v9/LhWhMVrGOe0FLb97BjhsE99dGNWQg_am.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sassyfrass/v9/LhWhMVrGOe0FLb97BjhsE-9cEtE.ttf" - }, - { - "family": "Satisfy", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/satisfy/v22/rP2Hp2yn6lkG50LoOZSCHBeHFl0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/satisfy/v22/rP2Hp2yn6lkG50LoCZWIGA.ttf" - }, - { - "family": "Savate", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJTdxRbgJdhapcUU.ttf", - "300": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJelxRbgJdhapcUU.ttf", - "regular": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJbdxRbgJdhapcUU.ttf", - "500": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJYVxRbgJdhapcUU.ttf", - "600": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJWl2RbgJdhapcUU.ttf", - "700": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJVB2RbgJdhapcUU.ttf", - "800": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJTd2RbgJdhapcUU.ttf", - "900": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJR52RbgJdhapcUU.ttf", - "200italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yLfsDcjSsYUVUjg.ttf", - "300italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8y8_sDcjSsYUVUjg.ttf", - "italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yrfsDcjSsYUVUjg.ttf", - "500italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yn_sDcjSsYUVUjg.ttf", - "600italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yc_wDcjSsYUVUjg.ttf", - "700italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8ySvwDcjSsYUVUjg.ttf", - "800italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yLfwDcjSsYUVUjg.ttf", - "900italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yBPwDcjSsYUVUjg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJbdxdbkDcg.ttf" - }, - { - "family": "Sawarabi Gothic", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/sawarabigothic/v16/x3d4ckfVaqqa-BEj-I9mE65u3k3NBSk3E2YljQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sawarabigothic/v16/x3d4ckfVaqqa-BEj-I9mE65u3k39BCMz.ttf" - }, - { - "family": "Sawarabi Mincho", - "variants": [ - "regular" - ], - "subsets": [ - "braille", - "japanese", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/sawarabimincho/v20/8QIRdiDaitzr7brc8ahpxt6GcIJTLahP46UDUw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sawarabimincho/v20/8QIRdiDaitzr7brc8ahpxt6GcIJjLKJL.ttf" - }, - { - "family": "Scada", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/scada/v16/RLpxK5Pv5qumeWJoxzUobkvv.ttf", - "italic": "https://fonts.gstatic.com/s/scada/v16/RLp_K5Pv5qumeVJqzTEKa1vvffg.ttf", - "700": "https://fonts.gstatic.com/s/scada/v16/RLp8K5Pv5qumeVrU6BEgRVfmZOE5.ttf", - "700italic": "https://fonts.gstatic.com/s/scada/v16/RLp6K5Pv5qumeVJq9Y0lT1PEYfE5p6g.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/scada/v16/RLpxK5Pv5qumeVJpzTE.ttf" - }, - { - "family": "Scheherazade New", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaZrFhTvxVnHDvUkUiHg8jprP4DCwNsOl4p5Is.ttf", - "500": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaerFhTvxVnHDvUkUiHg8jprP4DM_dFHlYC-IKnoSE.ttf", - "600": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaerFhTvxVnHDvUkUiHg8jprP4DM9tCHlYC-IKnoSE.ttf", - "700": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaerFhTvxVnHDvUkUiHg8jprP4DM79DHlYC-IKnoSE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaZrFhTvxVnHDvUkUiHg8jprP4DOwJmPg.ttf" - }, - { - "family": "Schibsted Grotesk", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v7", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNIsEAT8JuXFGVOQ.ttf", - "500": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNEMEAT8JuXFGVOQ.ttf", - "600": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMN_MYAT8JuXFGVOQ.ttf", - "700": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNxcYAT8JuXFGVOQ.ttf", - "800": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNosYAT8JuXFGVOQ.ttf", - "900": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNi8YAT8JuXFGVOQ.ttf", - "italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oLoDMhqflSFOTXs.ttf", - "500italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oLaDMhqflSFOTXs.ttf", - "600italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oI2C8hqflSFOTXs.ttf", - "700italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oIPC8hqflSFOTXs.ttf", - "800italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oJoC8hqflSFOTXs.ttf", - "900italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oJBC8hqflSFOTXs.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNIsEwTshq.ttf" - }, - { - "family": "Schoolbell", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/schoolbell/v18/92zQtBZWOrcgoe-fgnJIVxIQ6mRqfiQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/schoolbell/v18/92zQtBZWOrcgoe-fgnJIZxMa7g.ttf" - }, - { - "family": "Scope One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/scopeone/v15/WBLnrEXKYFlGHrOKmGD1W0_MJMGxiQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/scopeone/v15/WBLnrEXKYFlGHrOKmGDFWkXI.ttf" - }, - { - "family": "Seaweed Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/seaweedscript/v17/bx6cNx6Tne2pxOATYE8C_Rsoe0WJ-KcGVbLW.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/seaweedscript/v17/bx6cNx6Tne2pxOATYE8C_Rsoe3WI8qM.ttf" - }, - { - "family": "Secular One", - "variants": [ - "regular" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/secularone/v14/8QINdiTajsj_87rMuMdKypDlMul7LJpK.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/secularone/v14/8QINdiTajsj_87rMuMdKyqDkOO0.ttf" - }, - { - "family": "Sedan", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/sedan/v1/Yq6a-L-VVyD6-eOSiTpovf5b.ttf", - "italic": "https://fonts.gstatic.com/s/sedan/v1/Yq6U-L-VVyD6-dOQgz5KuO5bjxE.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sedan/v1/Yq6a-L-VVyD6-dOTgz4.ttf" - }, - { - "family": "Sedan SC", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/sedansc/v2/yMJRMIlvYZ3Jn1Y30Dq8fSx5i814.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sedansc/v2/yMJRMIlvYZ3Jn1Y30Aq9dyg.ttf" - }, - { - "family": "Sedgwick Ave", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/sedgwickave/v13/uK_04rKEYuguzAcSYRdWTJq8Xmg1Vcf5JA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sedgwickave/v13/uK_04rKEYuguzAcSYRdWTJqMX2Ix.ttf" - }, - { - "family": "Sedgwick Ave Display", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/sedgwickavedisplay/v23/xfuu0XPgU3jZPUoUo3ScvmPi-NapQ8OxM2czd-YnOzUD.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sedgwickavedisplay/v23/xfuu0XPgU3jZPUoUo3ScvmPi-NapQ8OxM1cyfeI.ttf" - }, - { - "family": "Sen", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISCq5H47KlD9q78A.ttf", - "500": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISBi5H47KlD9q78A.ttf", - "600": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISPS-H47KlD9q78A.ttf", - "700": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISM2-H47KlD9q78A.ttf", - "800": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISKq-H47KlD9q78A.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISCq5L4_AkA.ttf" - }, - { - "family": "Send Flowers", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/sendflowers/v7/If2PXTjtZS-0Xqy13uCQSULvxwjjouU1iw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sendflowers/v7/If2PXTjtZS-0Xqy13uCQSULfxgLn.ttf" - }, - { - "family": "Sevillana", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sevillana/v25/KFOlCnWFscmDt1Bfiy1vAx05IsDqlA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sevillana/v25/KFOlCnWFscmDt1Bfiy1fAhc9.ttf" - }, - { - "family": "Seymour One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/seymourone/v25/4iCp6Khla9xbjQpoWGGd0myIPYBvgpUI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/seymourone/v25/4iCp6Khla9xbjQpoWGGd0lyJN4Q.ttf" - }, - { - "family": "Shadows Into Light", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/shadowsintolight/v22/UqyNK9UOIntux_czAvDQx_ZcHqZXBNQDcsr4xzSMYA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shadowsintolight/v22/UqyNK9UOIntux_czAvDQx_ZcHqZXBNQzc8D8.ttf" - }, - { - "family": "Shadows Into Light Two", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/shadowsintolighttwo/v19/4iC86LVlZsRSjQhpWGedwyOoW-0A6_kpsyNmlAvNGLNnIF0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shadowsintolighttwo/v19/4iC86LVlZsRSjQhpWGedwyOoW-0A6_kpsyNmpArHHA.ttf" - }, - { - "family": "Shafarik", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "glagolitic", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/shafarik/v3/RWmLoKaF7PojpZXlW52sbsHKqLkD.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shafarik/v3/RWmLoKaF7PojpZXlW62tZMU.ttf" - }, - { - "family": "Shalimar", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/shalimar/v9/uU9MCBoE6I6iNWFUvTPx8PCOg0uX.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shalimar/v9/uU9MCBoE6I6iNWFUvQPw-vQ.ttf" - }, - { - "family": "Shantell Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYQiS2i2yPwxjyRN.ttf", - "regular": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYR8S2i2yPwxjyRN.ttf", - "500": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYROS2i2yPwxjyRN.ttf", - "600": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYSiTGi2yPwxjyRN.ttf", - "700": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYSbTGi2yPwxjyRN.ttf", - "800": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYT8TGi2yPwxjyRN.ttf", - "300italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CN71wvgTijRNYgQ.ttf", - "italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CID1wvgTijRNYgQ.ttf", - "500italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CLL1wvgTijRNYgQ.ttf", - "600italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CF7ywvgTijRNYgQ.ttf", - "700italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CGfywvgTijRNYgQ.ttf", - "800italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CADywvgTijRNYgQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYR8S1i3wvg.ttf" - }, - { - "family": "Shanti", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/shanti/v25/t5thIREMM4uSDgzgU0ezpKfwzA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shanti/v25/t5thIREMM4uSDgzQUk23.ttf" - }, - { - "family": "Share", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/share/v20/i7dEIFliZjKNF5VNHLq2cV5d.ttf", - "italic": "https://fonts.gstatic.com/s/share/v20/i7dKIFliZjKNF6VPFr6UdE5dWFM.ttf", - "700": "https://fonts.gstatic.com/s/share/v20/i7dJIFliZjKNF63xM56-WkJUQUq7.ttf", - "700italic": "https://fonts.gstatic.com/s/share/v20/i7dPIFliZjKNF6VPLgK7UEZ2RFq7AwU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/share/v20/i7dEIFliZjKNF6VMFr4.ttf" - }, - { - "family": "Share Tech", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/sharetech/v23/7cHtv4Uyi5K0OeZ7bohUwHoDmTcibrA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sharetech/v23/7cHtv4Uyi5K0OeZ7bohU8HsJnQ.ttf" - }, - { - "family": "Share Tech Mono", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sharetechmono/v16/J7aHnp1uDWRBEqV98dVQztYldFc7pAsEIc3Xew.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sharetechmono/v16/J7aHnp1uDWRBEqV98dVQztYldFcLpQEA.ttf" - }, - { - "family": "Shippori Antique", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/shipporiantique/v11/-F6qfid3KC8pdMyzR0qRyFUht11v8ldPg-IUDNg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shipporiantique/v11/-F6qfid3KC8pdMyzR0qRyFUht11vwlZFhw.ttf" - }, - { - "family": "Shippori Antique B1", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/shipporiantiqueb1/v11/2Eb7L_JwClR7Zl_UAKZ0mUHw3oMKd40grRFCj9-5Y8Y.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shipporiantiqueb1/v11/2Eb7L_JwClR7Zl_UAKZ0mUHw3oMKd40gnRBIiw.ttf" - }, - { - "family": "Shippori Mincho", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGGAZweH5EbgHY6YExcZfDoj0BA2_-C7LoS7g.ttf", - "500": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGDAZweH5EbgHY6YExcZfDoj0B4L9am5JEO5--2zg.ttf", - "600": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGDAZweH5EbgHY6YExcZfDoj0B4A9Gm5JEO5--2zg.ttf", - "700": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGDAZweH5EbgHY6YExcZfDoj0B4Z9Cm5JEO5--2zg.ttf", - "800": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGDAZweH5EbgHY6YExcZfDoj0B4e9Om5JEO5--2zg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGGAZweH5EbgHY6YExcZfDoj0Bw2vWG.ttf" - }, - { - "family": "Shippori Mincho B1", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK2E2wCr44tulPdnn-xbIpJ9RgT9-nyjqBr1lO97Q.ttf", - "500": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK1E2wCr44tulPdnn-xbIpJ9RgT9-nKeolP3nih5H4Uug.ttf", - "600": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK1E2wCr44tulPdnn-xbIpJ9RgT9-nKVo5P3nih5H4Uug.ttf", - "700": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK1E2wCr44tulPdnn-xbIpJ9RgT9-nKMo9P3nih5H4Uug.ttf", - "800": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK1E2wCr44tulPdnn-xbIpJ9RgT9-nKLoxP3nih5H4Uug.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK2E2wCr44tulPdnn-xbIpJ9RgT9-nCj6pv.ttf" - }, - { - "family": "Shizuru", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin" - ], - "version": "v13", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/shizuru/v13/O4ZSFGfvnxFiCA3i30IJlgUTj2A.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shizuru/v13/O4ZSFGfvnxFiCA3i70MDkg.ttf" - }, - { - "family": "Shojumaru", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/shojumaru/v16/rax_HiWfutkLLnaKCtlMBBJek0vA8A.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shojumaru/v16/rax_HiWfutkLLnaKCtl8BRha.ttf" - }, - { - "family": "Short Stack", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/shortstack/v16/bMrzmS2X6p0jZC6EcmPFX-SScX8D0nq6.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shortstack/v16/bMrzmS2X6p0jZC6EcmPFX9STe3s.ttf" - }, - { - "family": "Shrikhand", - "variants": [ - "regular" - ], - "subsets": [ - "gujarati", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/shrikhand/v17/a8IbNovtLWfR7T7bMJwbBIiQ0zhMtA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/shrikhand/v17/a8IbNovtLWfR7T7bMJwrBYKU.ttf" - }, - { - "family": "Siemreap", - "variants": [ - "regular" - ], - "subsets": [ - "khmer" - ], - "version": "v30", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/siemreap/v30/Gg82N5oFbgLvHAfNl2YbnA8DLXpe.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/siemreap/v30/Gg82N5oFbgLvHAfNl1Yalgs.ttf" - }, - { - "family": "Sigmar", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sigmar/v9/hv-XlzJgIE8a85pUbWY3MTFgVg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sigmar/v9/hv-XlzJgIE8a85pkbGwz.ttf" - }, - { - "family": "Sigmar One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/sigmarone/v20/co3DmWZ8kjZuErj9Ta3dk6Pjp3Di8U0.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sigmarone/v20/co3DmWZ8kjZuErj9Ta3do6Lpow.ttf" - }, - { - "family": "Signika", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v29", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r93zuYzTMngt4xjw.ttf", - "regular": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9gTuYzTMngt4xjw.ttf", - "500": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9szuYzTMngt4xjw.ttf", - "600": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9XzyYzTMngt4xjw.ttf", - "700": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9ZjyYzTMngt4xjw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9gTuozDkj.ttf" - }, - { - "family": "Signika Negative", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v26", - "lastModified": "2025-09-02", - "files": { - "300": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAr5S73st9hiuEq8.ttf", - "regular": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAqnS73st9hiuEq8.ttf", - "500": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAqVS73st9hiuEq8.ttf", - "600": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAp5TL3st9hiuEq8.ttf", - "700": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RApATL3st9hiuEq8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAqnS43tvdw.ttf" - }, - { - "family": "Silkscreen", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/silkscreen/v6/m8JXjfVPf62XiF7kO-i9ULRvamODxdI.ttf", - "700": "https://fonts.gstatic.com/s/silkscreen/v6/m8JUjfVPf62XiF7kO-i9aAhATmuo2dudFvc.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/silkscreen/v6/m8JXjfVPf62XiF7kO-i9YLVlbg.ttf" - }, - { - "family": "Simonetta", - "variants": [ - "regular", - "italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/simonetta/v29/x3dickHVYrCU5BU15c4BfPACvy_1BA.ttf", - "italic": "https://fonts.gstatic.com/s/simonetta/v29/x3dkckHVYrCU5BU15c4xfvoGnSrlBBsy.ttf", - "900": "https://fonts.gstatic.com/s/simonetta/v29/x3dnckHVYrCU5BU15c45-N0mtwTpDQIrGg.ttf", - "900italic": "https://fonts.gstatic.com/s/simonetta/v29/x3d5ckHVYrCU5BU15c4xfsKCsA7tLwc7Gn88.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/simonetta/v29/x3dickHVYrCU5BU15c4xffoG.ttf" - }, - { - "family": "Single Day", - "variants": [ - "regular" - ], - "subsets": [ - "korean" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/singleday/v19/LYjHdGDjlEgoAcF95EI5jVoFUNfeQJU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/singleday/v19/LYjHdGDjlEgoAcF95EI5vVsPVA.ttf" - }, - { - "family": "Sintony", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sintony/v17/XoHm2YDqR7-98cVUITQnu98ojjs.ttf", - "700": "https://fonts.gstatic.com/s/sintony/v17/XoHj2YDqR7-98cVUGYgIn9cDkjLp6C8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sintony/v17/XoHm2YDqR7-98cVUETUtvw.ttf" - }, - { - "family": "Sirin Stencil", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v27", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/sirinstencil/v27/mem4YaWwznmLx-lzGfN7MdRydchGBq6al6o.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sirinstencil/v27/mem4YaWwznmLx-lzGfN7MdRyRclMAg.ttf" - }, - { - "family": "Sirivennela", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v2", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/sirivennela/v2/kmK5Zq0oHhbAYX-X6lgptg7YiOFDtqtf.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sirivennela/v2/kmK5Zq0oHhbAYX-X6lgptj7ZguU.ttf" - }, - { - "family": "Six Caps", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/sixcaps/v23/6ae_4KGrU7VR7bNmabcS9XXaPCop.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sixcaps/v23/6ae_4KGrU7VR7bNmaYcT_3E.ttf" - }, - { - "family": "Sixtyfour", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v3", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/sixtyfour/v3/OD5vuMCT1numDm3nakXtp2h4jg463t9haG_3mBkVsV20uFT3BAE5f73YnyS5ZuOV.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sixtyfour/v3/OD5vuMCT1numDm3nakXtp2h4jg463t9haG_3mBkVsV20uFT3BAE5f43ZlSA.ttf" - }, - { - "family": "Sixtyfour Convergence", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols" - ], - "version": "v5", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/sixtyfourconvergence/v5/m8IQjepPf7mIglv5K__zM9srGA7wurbybZMfZsqG2Q6EWlJro5FJSJ4acT9PoOPwGgieaK7zkSpdXP-GrR9Yw9Tg7E4HGLbUKPlOh102hotkk3grz3g.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sixtyfourconvergence/v5/m8IQjepPf7mIglv5K__zM9srGA7wurbybZMfZsqG2Q6EWlJro5FJSJ4acT9PoOPwGgieaK7zkSpdXP-GrR9Yw9Tg7E4HGLbUKPlOh102topulw.ttf", - "colorCapabilities": [ - "COLRv1" - ] - }, - { - "family": "Skranji", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/skranji/v14/OZpDg_dtriVFNerMYzuuklTm3Ek.ttf", - "700": "https://fonts.gstatic.com/s/skranji/v14/OZpGg_dtriVFNerMW4eBtlzNwED-b4g.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/skranji/v14/OZpDg_dtriVFNerMUzqklg.ttf" - }, - { - "family": "Slabo 13px", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/slabo13px/v17/11hEGp_azEvXZUdSBzzRcKer2wkYnvI.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/slabo13px/v17/11hEGp_azEvXZUdSBzzRQKah3w.ttf" - }, - { - "family": "Slabo 27px", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/slabo27px/v16/mFT0WbgBwKPR_Z4hGN2qsxgJ1EJ7i90.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/slabo27px/v16/mFT0WbgBwKPR_Z4hGN2qgxkD0A.ttf" - }, - { - "family": "Slackey", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v29", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/slackey/v29/N0bV2SdQO-5yM0-dKlRaJdbWgdY.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/slackey/v29/N0bV2SdQO-5yM0-dGlVQIQ.ttf" - }, - { - "family": "Slackside One", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/slacksideone/v14/EJRQQgMrXdcGsiBuvnRxodTwVy7VocNB6Iw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/slacksideone/v14/EJRQQgMrXdcGsiBuvnRxodTwZy_fpQ.ttf" - }, - { - "family": "Smokum", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v30", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/smokum/v30/TK3iWkUbAhopmrdGHjUHte5fKg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/smokum/v30/TK3iWkUbAhopmrd2Hz8D.ttf" - }, - { - "family": "Smooch", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/smooch/v9/o-0LIps4xW8U1xUBjqp_6hVdYg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/smooch/v9/o-0LIps4xW8U1xUxj6B7.ttf" - }, - { - "family": "Smooch Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiwUFodqIeNlzayg.ttf", - "200": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiQUBodqIeNlzayg.ttf", - "300": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oin0BodqIeNlzayg.ttf", - "regular": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiwUBodqIeNlzayg.ttf", - "500": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oi80BodqIeNlzayg.ttf", - "600": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiH0dodqIeNlzayg.ttf", - "700": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiJkdodqIeNlzayg.ttf", - "800": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiQUdodqIeNlzayg.ttf", - "900": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiaEdodqIeNlzayg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiwUBYd6ga.ttf" - }, - { - "family": "Smythe", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/smythe/v24/MwQ3bhT01--coT1BOLh_uGInjA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/smythe/v24/MwQ3bhT01--coT1xObJ7.ttf" - }, - { - "family": "Sniglet", - "variants": [ - "regular", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/sniglet/v18/cIf9MaFLtkE3UjaJxCmrYGkHgIs.ttf", - "800": "https://fonts.gstatic.com/s/sniglet/v18/cIf4MaFLtkE3UjaJ_ImHRGEsnIJkWL4.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sniglet/v18/cIf9MaFLtkE3UjaJ9CihZA.ttf" - }, - { - "family": "Snippet", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/snippet/v21/bWt47f7XfQH9Gupu2v_Afcp9QWc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/snippet/v21/bWt47f7XfQH9Gupu6v7KeQ.ttf" - }, - { - "family": "Snowburst One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/snowburstone/v21/MQpS-WezKdujBsXY3B7I-UT7eZ-UPyacPbo.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/snowburstone/v21/MQpS-WezKdujBsXY3B7I-UT7SZ6eOw.ttf" - }, - { - "family": "Sofadi One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/sofadione/v22/JIA2UVBxdnVBuElZaMFGcDOIETkmYDU.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sofadione/v22/JIA2UVBxdnVBuElZaMFGQDKCFQ.ttf" - }, - { - "family": "Sofia", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v15", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/sofia/v15/8QIHdirahM3j_vu-sowsrqjk.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sofia/v15/8QIHdirahM3j_su_uIg.ttf" - }, - { - "family": "Sofia Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69B6sa3trvKCXl8k.ttf", - "200": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69D6sK3trvKCXl8k.ttf", - "300": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69AksK3trvKCXl8k.ttf", - "regular": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69B6sK3trvKCXl8k.ttf", - "500": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69BIsK3trvKCXl8k.ttf", - "600": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69Ckt63trvKCXl8k.ttf", - "700": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69Cdt63trvKCXl8k.ttf", - "800": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69D6t63trvKCXl8k.ttf", - "900": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69DTt63trvKCXl8k.ttf", - "100italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy80WvpPagW08kdLY.ttf", - "200italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy88WupPagW08kdLY.ttf", - "300italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy8xuupPagW08kdLY.ttf", - "italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy80WupPagW08kdLY.ttf", - "500italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy83eupPagW08kdLY.ttf", - "600italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy85uppPagW08kdLY.ttf", - "700italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy86KppPagW08kdLY.ttf", - "800italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy88WppPagW08kdLY.ttf", - "900italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy8-yppPagW08kdLY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69B6sJ3spPY.ttf" - }, - { - "family": "Sofia Sans Condensed", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqh-Csl8QO3OfwQQ.ttf", - "200": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqB-Gsl8QO3OfwQQ.ttf", - "300": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUq2eGsl8QO3OfwQQ.ttf", - "regular": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqh-Gsl8QO3OfwQQ.ttf", - "500": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqteGsl8QO3OfwQQ.ttf", - "600": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqWeasl8QO3OfwQQ.ttf", - "700": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqYOasl8QO3OfwQQ.ttf", - "800": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqB-asl8QO3OfwQQ.ttf", - "900": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqLuasl8QO3OfwQQ.ttf", - "100italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6JE1c4K_uLgQZ_3.ttf", - "200italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6LE1M4K_uLgQZ_3.ttf", - "300italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6Ia1M4K_uLgQZ_3.ttf", - "italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6JE1M4K_uLgQZ_3.ttf", - "500italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6J21M4K_uLgQZ_3.ttf", - "600italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6Ka084K_uLgQZ_3.ttf", - "700italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6Kj084K_uLgQZ_3.ttf", - "800italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6LE084K_uLgQZ_3.ttf", - "900italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6Lt084K_uLgQZ_3.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqh-Gcls4K.ttf" - }, - { - "family": "Sofia Sans Extra Condensed", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLmmmEfzmM356GxA.ttf", - "200": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLGmiEfzmM356GxA.ttf", - "300": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLxGiEfzmM356GxA.ttf", - "regular": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLmmiEfzmM356GxA.ttf", - "500": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLqGiEfzmM356GxA.ttf", - "600": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLRG-EfzmM356GxA.ttf", - "700": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLfW-EfzmM356GxA.ttf", - "800": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLGm-EfzmM356GxA.ttf", - "900": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLM2-EfzmM356GxA.ttf", - "100italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUitsPTOI_ZuWxFXe.ttf", - "200italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUivsPDOI_ZuWxFXe.ttf", - "300italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUisyPDOI_ZuWxFXe.ttf", - "italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUitsPDOI_ZuWxFXe.ttf", - "500italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUitePDOI_ZuWxFXe.ttf", - "600italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUiuyOzOI_ZuWxFXe.ttf", - "700italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUiuLOzOI_ZuWxFXe.ttf", - "800italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUivsOzOI_ZuWxFXe.ttf", - "900italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUivFOzOI_ZuWxFXe.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLmmi0fjOI.ttf" - }, - { - "family": "Sofia Sans Semi Condensed", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoobEO9TGahllIhN.ttf", - "200": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoqbEe9TGahllIhN.ttf", - "300": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvopFEe9TGahllIhN.ttf", - "regular": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoobEe9TGahllIhN.ttf", - "500": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoopEe9TGahllIhN.ttf", - "600": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvorFFu9TGahllIhN.ttf", - "700": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvor8Fu9TGahllIhN.ttf", - "800": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoqbFu9TGahllIhN.ttf", - "900": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoqyFu9TGahllIhN.ttf", - "100italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUgcRE6xHkZhNeas.ttf", - "200italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUocQE6xHkZhNeas.ttf", - "300italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUlkQE6xHkZhNeas.ttf", - "italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUgcQE6xHkZhNeas.ttf", - "500italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUjUQE6xHkZhNeas.ttf", - "600italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUtkXE6xHkZhNeas.ttf", - "700italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUuAXE6xHkZhNeas.ttf", - "800italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUocXE6xHkZhNeas.ttf", - "900italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUq4XE6xHkZhNeas.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoobEd9SE6w.ttf" - }, - { - "family": "Solitreo", - "variants": [ - "regular" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/solitreo/v2/r05YGLlS5a9KYsyNO8upyDYtStiJ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/solitreo/v2/r05YGLlS5a9KYsyNO_uowjI.ttf" - }, - { - "family": "Solway", - "variants": [ - "300", - "regular", - "500", - "700", - "800" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "300": "https://fonts.gstatic.com/s/solway/v19/AMOTz46Cs2uTAOCuLlgZms0QW3mqyg.ttf", - "regular": "https://fonts.gstatic.com/s/solway/v19/AMOQz46Cs2uTAOCWgnA9kuYMUg.ttf", - "500": "https://fonts.gstatic.com/s/solway/v19/AMOTz46Cs2uTAOCudlkZms0QW3mqyg.ttf", - "700": "https://fonts.gstatic.com/s/solway/v19/AMOTz46Cs2uTAOCuPl8Zms0QW3mqyg.ttf", - "800": "https://fonts.gstatic.com/s/solway/v19/AMOTz46Cs2uTAOCuIlwZms0QW3mqyg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/solway/v19/AMOQz46Cs2uTAOCmg3o5.ttf" - }, - { - "family": "Sometype Mono", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTAMGE9agQBbs7uG.ttf", - "500": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTA-GE9agQBbs7uG.ttf", - "600": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTDSH09agQBbs7uG.ttf", - "700": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTDrH09agQBbs7uG.ttf", - "italic": "https://fonts.gstatic.com/s/sometypemono/v4/70lEu745KGk_R3uxyq0WrROhKpG7T0e3JvPLoiXEW6cZiwR5tquGrxk.ttf", - "500italic": "https://fonts.gstatic.com/s/sometypemono/v4/70lEu745KGk_R3uxyq0WrROhKpG7T0e3JvPLoiXEW5UZiwR5tquGrxk.ttf", - "600italic": "https://fonts.gstatic.com/s/sometypemono/v4/70lEu745KGk_R3uxyq0WrROhKpG7T0e3JvPLoiXEW3keiwR5tquGrxk.ttf", - "700italic": "https://fonts.gstatic.com/s/sometypemono/v4/70lEu745KGk_R3uxyq0WrROhKpG7T0e3JvPLoiXEW0AeiwR5tquGrxk.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTAMGH9biwQ.ttf" - }, - { - "family": "Song Myung", - "variants": [ - "regular" - ], - "subsets": [ - "korean" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/songmyung/v22/1cX2aUDWAJH5-EIC7DIhr1GqhcitzeM.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/songmyung/v22/1cX2aUDWAJH5-EIC7DIhn1CggQ.ttf" - }, - { - "family": "Sono", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVNkWdEnR4qYeB4Q.ttf", - "300": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxV6EWdEnR4qYeB4Q.ttf", - "regular": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVtkWdEnR4qYeB4Q.ttf", - "500": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVhEWdEnR4qYeB4Q.ttf", - "600": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVaEKdEnR4qYeB4Q.ttf", - "700": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVUUKdEnR4qYeB4Q.ttf", - "800": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVNkKdEnR4qYeB4Q.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVtkWtE358.ttf" - }, - { - "family": "Sonsie One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/sonsieone/v22/PbymFmP_EAnPqbKaoc18YVu80lbp8JM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sonsieone/v22/PbymFmP_EAnPqbKaoc18UVq21g.ttf" - }, - { - "family": "Sora", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSdSn3-KIwNhBti0.ttf", - "200": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSfSnn-KIwNhBti0.ttf", - "300": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmScMnn-KIwNhBti0.ttf", - "regular": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSdSnn-KIwNhBti0.ttf", - "500": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSdgnn-KIwNhBti0.ttf", - "600": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSeMmX-KIwNhBti0.ttf", - "700": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSe1mX-KIwNhBti0.ttf", - "800": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSfSmX-KIwNhBti0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSdSnk-LKQc.ttf" - }, - { - "family": "Sorts Mill Goudy", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/sortsmillgoudy/v16/Qw3GZR9MED_6PSuS_50nEaVrfzgEXH0OjpM75PE.ttf", - "italic": "https://fonts.gstatic.com/s/sortsmillgoudy/v16/Qw3AZR9MED_6PSuS_50nEaVrfzgEbH8EirE-9PGLfQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sortsmillgoudy/v16/Qw3GZR9MED_6PSuS_50nEaVrfzgEbHwEig.ttf" - }, - { - "family": "Sour Gummy", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1N88JU91CMD2tcoQ.ttf", - "200": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1Nc8NU91CMD2tcoQ.ttf", - "300": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NrcNU91CMD2tcoQ.ttf", - "regular": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1N88NU91CMD2tcoQ.ttf", - "500": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NwcNU91CMD2tcoQ.ttf", - "600": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NLcRU91CMD2tcoQ.ttf", - "700": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NFMRU91CMD2tcoQ.ttf", - "800": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1Nc8RU91CMD2tcoQ.ttf", - "900": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NWsRU91CMD2tcoQ.ttf", - "100italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4C8tVqILW5MobGa.ttf", - "200italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4A8tFqILW5MobGa.ttf", - "300italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4DitFqILW5MobGa.ttf", - "italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4C8tFqILW5MobGa.ttf", - "500italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4COtFqILW5MobGa.ttf", - "600italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4Bis1qILW5MobGa.ttf", - "700italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4Bbs1qILW5MobGa.ttf", - "800italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4A8s1qILW5MobGa.ttf", - "900italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4AVs1qILW5MobGa.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1N88Nk9lqI.ttf" - }, - { - "family": "Source Code Pro", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v31", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DEyQhM5hTXUcdJg.ttf", - "300": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DJKQhM5hTXUcdJg.ttf", - "regular": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQhM5hTXUcdJg.ttf", - "500": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DP6QhM5hTXUcdJg.ttf", - "600": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DBKXhM5hTXUcdJg.ttf", - "700": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DCuXhM5hTXUcdJg.ttf", - "800": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DEyXhM5hTXUcdJg.ttf", - "900": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DGWXhM5hTXUcdJg.ttf", - "200italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTT7I1rSVcZZJiGpw.ttf", - "300italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTMo1rSVcZZJiGpw.ttf", - "italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTbI1rSVcZZJiGpw.ttf", - "500italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTXo1rSVcZZJiGpw.ttf", - "600italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTsoprSVcZZJiGpw.ttf", - "700italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTi4prSVcZZJiGpw.ttf", - "800italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTT7IprSVcZZJiGpw.ttf", - "900italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTxYprSVcZZJiGpw.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQtM9rSQ.ttf" - }, - { - "family": "Source Sans 3", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "200": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kw461EN_io6npfB.ttf", - "300": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kzm61EN_io6npfB.ttf", - "regular": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Ky461EN_io6npfB.ttf", - "500": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8KyK61EN_io6npfB.ttf", - "600": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kxm7FEN_io6npfB.ttf", - "700": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kxf7FEN_io6npfB.ttf", - "800": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kw47FEN_io6npfB.ttf", - "900": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8KwR7FEN_io6npfB.ttf", - "200italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqDlO9C4Ym4fB3Ts.ttf", - "300italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqOdO9C4Ym4fB3Ts.ttf", - "italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqLlO9C4Ym4fB3Ts.ttf", - "500italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqItO9C4Ym4fB3Ts.ttf", - "600italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqGdJ9C4Ym4fB3Ts.ttf", - "700italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqF5J9C4Ym4fB3Ts.ttf", - "800italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqDlJ9C4Ym4fB3Ts.ttf", - "900italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqBBJ9C4Ym4fB3Ts.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Ky462EM9C4.ttf" - }, - { - "family": "Source Serif 4", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjipdqrhxXD-wGvjU.ttf", - "300": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjiklqrhxXD-wGvjU.ttf", - "regular": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjihdqrhxXD-wGvjU.ttf", - "500": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjiiVqrhxXD-wGvjU.ttf", - "600": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjisltrhxXD-wGvjU.ttf", - "700": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjivBtrhxXD-wGvjU.ttf", - "800": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjipdtrhxXD-wGvjU.ttf", - "900": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjir5trhxXD-wGvjU.ttf", - "200italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pxl9dC84DrjXEXw.ttf", - "300italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pGF9dC84DrjXEXw.ttf", - "italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pRl9dC84DrjXEXw.ttf", - "500italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pdF9dC84DrjXEXw.ttf", - "600italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pmFhdC84DrjXEXw.ttf", - "700italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98poVhdC84DrjXEXw.ttf", - "800italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pxlhdC84DrjXEXw.ttf", - "900italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98p71hdC84DrjXEXw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjihdqnh1dCw.ttf" - }, - { - "family": "Space Grotesk", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj62UUsjNsFjTDJK.ttf", - "regular": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj7oUUsjNsFjTDJK.ttf", - "500": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj7aUUsjNsFjTDJK.ttf", - "600": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj42VksjNsFjTDJK.ttf", - "700": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj4PVksjNsFjTDJK.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj7oUXsiPMU.ttf" - }, - { - "family": "Space Mono", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/spacemono/v17/i7dPIFZifjKcF5UAWdDRUEZ2RFq7AwU.ttf", - "italic": "https://fonts.gstatic.com/s/spacemono/v17/i7dNIFZifjKcF5UAWdDRYER8QHi-EwWMbg.ttf", - "700": "https://fonts.gstatic.com/s/spacemono/v17/i7dMIFZifjKcF5UAWdDRaPpZYFKQHwyVd3U.ttf", - "700italic": "https://fonts.gstatic.com/s/spacemono/v17/i7dSIFZifjKcF5UAWdDRYERE_FeaGy6QZ3WfYg.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/spacemono/v17/i7dPIFZifjKcF5UAWdDRYEd8QA.ttf" - }, - { - "family": "Special Elite", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/specialelite/v20/XLYgIZbkc4JPUL5CVArUVL0nhncESXFtUsM.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/specialelite/v20/XLYgIZbkc4JPUL5CVArUVL0ntnYOTQ.ttf" - }, - { - "family": "Special Gothic", - "variants": [ - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-07-30", - "files": { - "regular": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4bF8-SgLPIOkEp8.ttf", - "500": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4YN8-SgLPIOkEp8.ttf", - "600": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4W97-SgLPIOkEp8.ttf", - "700": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4VZ7-SgLPIOkEp8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4bF8ySkBOA.ttf" - }, - { - "family": "Special Gothic Condensed One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-04-23", - "files": { - "regular": "https://fonts.gstatic.com/s/specialgothiccondensedone/v2/R70Njzwei_mJM7OsFDzX7EL9NBO6IPvd-Avolzh49w7PUZt_5YtxbX8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/specialgothiccondensedone/v2/R70Njzwei_mJM7OsFDzX7EL9NBO6IPvd-Avolzh49w7PYZp14Q.ttf" - }, - { - "family": "Special Gothic Expanded One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-04-23", - "files": { - "regular": "https://fonts.gstatic.com/s/specialgothicexpandedone/v2/IurO6Zxk74-YaYk1r3HOet4g75ENmBxUmOK61tA0Iu5gn5t-KhUVvQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/specialgothicexpandedone/v2/IurO6Zxk74-YaYk1r3HOet4g75ENmBxUmOK61tA0Iu5QnpF6.ttf" - }, - { - "family": "Spectral", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9v2s13GY_etWWIJ.ttf", - "200italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qrXHafOPXHIJErY.ttf", - "300": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9uSsF3GY_etWWIJ.ttf", - "300italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qtHEafOPXHIJErY.ttf", - "regular": "https://fonts.gstatic.com/s/spectral/v15/rnCr-xNNww_2s0amA-M-mHnOSOuk.ttf", - "italic": "https://fonts.gstatic.com/s/spectral/v15/rnCt-xNNww_2s0amA9M8kn3sTfukQHs.ttf", - "500": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9vKsV3GY_etWWIJ.ttf", - "500italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qonFafOPXHIJErY.ttf", - "600": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9vmtl3GY_etWWIJ.ttf", - "600italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qqXCafOPXHIJErY.ttf", - "700": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9uCt13GY_etWWIJ.ttf", - "700italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qsHDafOPXHIJErY.ttf", - "800": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9uetF3GY_etWWIJ.ttf", - "800italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qt3AafOPXHIJErY.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/spectral/v15/rnCr-xNNww_2s0amA9M_kn0.ttf" - }, - { - "family": "Spectral SC", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-02", - "files": { - "200": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs1qwkTXPYeVXJZB.ttf", - "200italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg26zWN4O3WYZB_sU.ttf", - "300": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs0OwUTXPYeVXJZB.ttf", - "300italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg28jVN4O3WYZB_sU.ttf", - "regular": "https://fonts.gstatic.com/s/spectralsc/v15/KtkpALCRZonmalTgyPmRfvWi6WDfFpuc.ttf", - "italic": "https://fonts.gstatic.com/s/spectralsc/v15/KtkrALCRZonmalTgyPmRfsWg42T9E4ucRY8.ttf", - "500": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs1WwETXPYeVXJZB.ttf", - "500italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg25DUN4O3WYZB_sU.ttf", - "600": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs16x0TXPYeVXJZB.ttf", - "600italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg27zTN4O3WYZB_sU.ttf", - "700": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs0exkTXPYeVXJZB.ttf", - "700italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg29jSN4O3WYZB_sU.ttf", - "800": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs0CxUTXPYeVXJZB.ttf", - "800italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg28TRN4O3WYZB_sU.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/spectralsc/v15/KtkpALCRZonmalTgyPmRfsWj42Q.ttf" - }, - { - "family": "Spicy Rice", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/spicyrice/v28/uK_24rSEd-Uqwk4jY1RyGv-2WkowRcc.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/spicyrice/v28/uK_24rSEd-Uqwk4jY1RyKv68Xg.ttf" - }, - { - "family": "Spinnaker", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/spinnaker/v21/w8gYH2oyX-I0_rvR6Hmn3HwLqOqSBg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/spinnaker/v21/w8gYH2oyX-I0_rvR6HmX3XYP.ttf" - }, - { - "family": "Spirax", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/spirax/v22/buE3poKgYNLy0F3cXktt-Csn-Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/spirax/v22/buE3poKgYNLy0F3sX0Fp.ttf" - }, - { - "family": "Splash", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/splash/v8/KtksAL2RZoDkbU6hpPPGNdS6wg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/splash/v8/KtksAL2RZoDkbU6RpfnC.ttf" - }, - { - "family": "Spline Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRpZlnYEtvlUfE2kw.ttf", - "regular": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRpOFnYEtvlUfE2kw.ttf", - "500": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRpClnYEtvlUfE2kw.ttf", - "600": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRp5l7YEtvlUfE2kw.ttf", - "700": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRp317YEtvlUfE2kw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRpOFnoE9Hh.ttf" - }, - { - "family": "Spline Sans Mono", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGA8MrtVy4d4dGb1.ttf", - "regular": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGBiMrtVy4d4dGb1.ttf", - "500": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGBQMrtVy4d4dGb1.ttf", - "600": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGC8NbtVy4d4dGb1.ttf", - "700": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGCFNbtVy4d4dGb1.ttf", - "300italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcQ0WwYNacXb12MM.ttf", - "italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcVMWwYNacXb12MM.ttf", - "500italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcWEWwYNacXb12MM.ttf", - "600italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcY0RwYNacXb12MM.ttf", - "700italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcbQRwYNacXb12MM.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGBiMotUwYM.ttf" - }, - { - "family": "Squada One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/squadaone/v20/BCasqZ8XsOrx4mcOk6MtWaA8WDBkHgs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/squadaone/v20/BCasqZ8XsOrx4mcOk6MtaaE2XA.ttf" - }, - { - "family": "Square Peg", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/squarepeg/v7/y83eW48Nzw6ZlUHc-phrBDHrHHfrFPE.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/squarepeg/v7/y83eW48Nzw6ZlUHc-phrNDDhGA.ttf" - }, - { - "family": "Sree Krushnadevaraya", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v23", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/sreekrushnadevaraya/v23/R70FjzQeifmPepmyQQjQ9kvwMkWYPfTA_EWb2FhQuXir.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sreekrushnadevaraya/v23/R70FjzQeifmPepmyQQjQ9kvwMkWYPfTA_HWa0lw.ttf" - }, - { - "family": "Sriracha", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/sriracha/v16/0nkrC9D4IuYBgWcI9ObYRQDioeb0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sriracha/v16/0nkrC9D4IuYBgWcI9NbZTwQ.ttf" - }, - { - "family": "Srisakdi", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/srisakdi/v18/yMJRMIlvdpDbkB0A-jq8fSx5i814.ttf", - "700": "https://fonts.gstatic.com/s/srisakdi/v18/yMJWMIlvdpDbkB0A-gIAUghxoNFxW0Hz.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/srisakdi/v18/yMJRMIlvdpDbkB0A-gq9dyg.ttf" - }, - { - "family": "Staatliches", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/staatliches/v15/HI_OiY8KO6hCsQSoAPmtMbectJG9O9PS.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/staatliches/v15/HI_OiY8KO6hCsQSoAPmtMYedvpU.ttf" - }, - { - "family": "Stalemate", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/stalemate/v24/taiIGmZ_EJq97-UfkZRpuqSs8ZQpaQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stalemate/v24/taiIGmZ_EJq97-UfkZRZu66o.ttf" - }, - { - "family": "Stalinist One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v58", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/stalinistone/v58/MQpS-WezM9W4Dd7D3B7I-UT7eZ-UPyacPbo.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stalinistone/v58/MQpS-WezM9W4Dd7D3B7I-UT7SZ6eOw.ttf" - }, - { - "family": "Stardos Stencil", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v15", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/stardosstencil/v15/X7n94bcuGPC8hrvEOHXOgaKCc2TR71R3tiSx0g.ttf", - "700": "https://fonts.gstatic.com/s/stardosstencil/v15/X7n44bcuGPC8hrvEOHXOgaKCc2TpU3tTvg-t29HSHw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stardosstencil/v15/X7n94bcuGPC8hrvEOHXOgaKCc2Th7l5z.ttf" - }, - { - "family": "Stick", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/stick/v20/Qw3TZQpMCyTtJSvfvPVDMPoF.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stick/v20/Qw3TZQpMCyTtJRvetvE.ttf" - }, - { - "family": "Stick No Bills", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "sinhala" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVP8Q7KriwKhcTKA.ttf", - "300": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcV4cQ7KriwKhcTKA.ttf", - "regular": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVv8Q7KriwKhcTKA.ttf", - "500": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVjcQ7KriwKhcTKA.ttf", - "600": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVYcM7KriwKhcTKA.ttf", - "700": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVWMM7KriwKhcTKA.ttf", - "800": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVP8M7KriwKhcTKA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVv8QLK7K0.ttf" - }, - { - "family": "Stint Ultra Condensed", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/stintultracondensed/v25/-W_gXIrsVjjeyEnPC45qD2NoFPtBE0xCh2A-qhUO2cNvdg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stintultracondensed/v25/-W_gXIrsVjjeyEnPC45qD2NoFPtBE0xCh2AOqx8K.ttf" - }, - { - "family": "Stint Ultra Expanded", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/stintultraexpanded/v24/CSRg4yNNh-GbW3o3JkwoDcdvMKMf0oBAd0qoATQkWwam.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stintultraexpanded/v24/CSRg4yNNh-GbW3o3JkwoDcdvMKMf0oBAd3qpCzA.ttf" - }, - { - "family": "Stoke", - "variants": [ - "300", - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/stoke/v26/z7NXdRb7aTMfKNvFVgxC_pjcTeWU.ttf", - "regular": "https://fonts.gstatic.com/s/stoke/v26/z7NadRb7aTMfKONpfihK1YTV.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stoke/v26/z7NadRb7aTMfKNNodCw.ttf" - }, - { - "family": "Story Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v3", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/storyscript/v3/mem5YaSw02SQ0OlzDuR8Isk-VeJoCqeDjg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/storyscript/v3/mem5YaSw02SQ0OlzDuR8IskOVOhs.ttf" - }, - { - "family": "Strait", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/strait/v19/DtViJxy6WaEr1LZzeDhtkl0U7w.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/strait/v19/DtViJxy6WaEr1LZDeTJp.ttf" - }, - { - "family": "Style Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/stylescript/v13/vm8xdRX3SV7Z0aPa88xzW5npeFT76NZnMw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stylescript/v13/vm8xdRX3SV7Z0aPa88xzW5nZeV7_.ttf" - }, - { - "family": "Stylish", - "variants": [ - "regular" - ], - "subsets": [ - "korean" - ], - "version": "v25", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/stylish/v25/m8JSjfhPYriQkk7-fo35dLxEdmo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/stylish/v25/m8JSjfhPYriQkk7-TozzcA.ttf" - }, - { - "family": "Sue Ellen Francisco", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/sueellenfrancisco/v22/wXK3E20CsoJ9j1DDkjHcQ5ZL8xRaxru9ropF2lqk9H4.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sueellenfrancisco/v22/wXK3E20CsoJ9j1DDkjHcQ5ZL8xRaxru9notP3g.ttf" - }, - { - "family": "Suez One", - "variants": [ - "regular" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/suezone/v15/taiJGmd_EZ6rqscQgNFJkIqg-I0w.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/suezone/v15/taiJGmd_EZ6rqscQgOFImo4.ttf" - }, - { - "family": "Sulphur Point", - "variants": [ - "300", - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/sulphurpoint/v16/RLpkK5vv8KaycDcazWFPBj2afVU6n6kFUHPIFaU.ttf", - "regular": "https://fonts.gstatic.com/s/sulphurpoint/v16/RLp5K5vv8KaycDcazWFPBj2aRfkSu6EuTHo.ttf", - "700": "https://fonts.gstatic.com/s/sulphurpoint/v16/RLpkK5vv8KaycDcazWFPBj2afUU9n6kFUHPIFaU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sulphurpoint/v16/RLp5K5vv8KaycDcazWFPBj2adfgYvw.ttf" - }, - { - "family": "Sumana", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/sumana/v12/4UaDrE5TqRBjGj-G8Bji76zR4w.ttf", - "700": "https://fonts.gstatic.com/s/sumana/v12/4UaArE5TqRBjGj--TDfG54fN6ppsKg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sumana/v12/4UaDrE5TqRBjGj-28RLm.ttf" - }, - { - "family": "Sunflower", - "variants": [ - "300", - "500", - "700" - ], - "subsets": [ - "korean" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/sunflower/v18/RWmPoKeF8fUjqIj7Vc-06MfiqYsGBGBzCw.ttf", - "500": "https://fonts.gstatic.com/s/sunflower/v18/RWmPoKeF8fUjqIj7Vc-0sMbiqYsGBGBzCw.ttf", - "700": "https://fonts.gstatic.com/s/sunflower/v18/RWmPoKeF8fUjqIj7Vc-0-MDiqYsGBGBzCw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sunflower/v18/RWmPoKeF8fUjqIj7Vc-06MfSqIEC.ttf" - }, - { - "family": "Sunshiney", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/sunshiney/v24/LDIwapGTLBwsS-wT4vcgE8moUePWkg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sunshiney/v24/LDIwapGTLBwsS-wT4vcQEsOs.ttf" - }, - { - "family": "Supermercado One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/supermercadoone/v29/OpNXnpQWg8jc_xps_Gi14kVVEXOn60b3MClBRTs.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/supermercadoone/v29/OpNXnpQWg8jc_xps_Gi14kVVEXOn20f9NA.ttf" - }, - { - "family": "Sura", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/sura/v21/SZc23FL5PbyzFf5UWzXtjUM.ttf", - "700": "https://fonts.gstatic.com/s/sura/v21/SZc53FL5PbyzLUJ7fz3GkUrS8DI.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/sura/v21/SZc23FL5PbyzJf9eXw.ttf" - }, - { - "family": "Suranna", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v15", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/suranna/v15/gokuH6ztGkFjWe58tBRZT2KmgP0.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/suranna/v15/gokuH6ztGkFjWe58hBVTSw.ttf" - }, - { - "family": "Suravaram", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/suravaram/v23/_gP61R_usiY7SCym4xIAi261Qv9roQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/suravaram/v23/_gP61R_usiY7SCym4xIwimSx.ttf" - }, - { - "family": "Suwannaphum", - "variants": [ - "100", - "300", - "regular", - "700", - "900" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v33", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnAgHV7GtDvc8jbe8hXXL3B9cSWXx2VZmk.ttf", - "300": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnfgHV7GtDvc8jbe8hXXL0J1-S8cRGcf3Ai.ttf", - "regular": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnCgHV7GtDvc8jbe8hXXIWl_8C0Wg2V.ttf", - "700": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnfgHV7GtDvc8jbe8hXXL0Z0OS8cRGcf3Ai.ttf", - "900": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnfgHV7GtDvc8jbe8hXXL0h0uS8cRGcf3Ai.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnCgHV7GtDvc8jbe8hXXLWk9cQ.ttf" - }, - { - "family": "Swanky and Moo Moo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/swankyandmoomoo/v24/flUlRrKz24IuWVI_WJYTYcqbEsMUZ3kUtbPkR64SYQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/swankyandmoomoo/v24/flUlRrKz24IuWVI_WJYTYcqbEsMUZ3kktLng.ttf" - }, - { - "family": "Syncopate", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/syncopate/v24/pe0sMIuPIYBCpEV5eFdyAv2-C99ycg.ttf", - "700": "https://fonts.gstatic.com/s/syncopate/v24/pe0pMIuPIYBCpEV5eFdKvtKaA_Rue1UwVg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/syncopate/v24/pe0sMIuPIYBCpEV5eFdCA_e6.ttf" - }, - { - "family": "Syne", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "greek", - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_04uT6kR47NCV5Z.ttf", - "500": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_0KuT6kR47NCV5Z.ttf", - "600": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_3mvj6kR47NCV5Z.ttf", - "700": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_3fvj6kR47NCV5Z.ttf", - "800": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_24vj6kR47NCV5Z.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_04uQ6lTYo.ttf" - }, - { - "family": "Syne Mono", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/synemono/v16/K2FzfZNHj_FHBmRbFvHzIqCkDyvqZA.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/synemono/v16/K2FzfZNHj_FHBmRbFvHDI6qg.ttf" - }, - { - "family": "Syne Tactile", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/synetactile/v16/11hGGpna2UTQKjMCVzjAPMKh3ysdjvKU8Q.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/synetactile/v16/11hGGpna2UTQKjMCVzjAPMKR3iEZ.ttf" - }, - { - "family": "TASA Explorer", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI6o7xnGirZPlnP-.ttf", - "500": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI6a7xnGirZPlnP-.ttf", - "600": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI526BnGirZPlnP-.ttf", - "700": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI5P6BnGirZPlnP-.ttf", - "800": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI4o6BnGirZPlnP-.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI6o7ynHgLI.ttf" - }, - { - "family": "TASA Orbiter", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVH4C8py095IuGcc.ttf", - "500": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVEwC8py095IuGcc.ttf", - "600": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVKAF8py095IuGcc.ttf", - "700": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVJkF8py095IuGcc.ttf", - "800": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVP4F8py095IuGcc.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVH4Cwp2-8w.ttf" - }, - { - "family": "Tac One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/tacone/v5/ahcZv8Cj3zw7qDr8fO4hU-FwnU0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tacone/v5/ahcZv8Cj3zw7qDr8TO8rVw.ttf" - }, - { - "family": "Tagesschrift", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-04-23", - "files": { - "regular": "https://fonts.gstatic.com/s/tagesschrift/v2/pe0pMI6IOYlEuEZ7ZEA7ZKOaA_Rue1UwVg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tagesschrift/v2/pe0pMI6IOYlEuEZ7ZEA7ZKOqAv5q.ttf" - }, - { - "family": "Tai Heritage Pro", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "tai-viet", - "vietnamese" - ], - "version": "v9", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/taiheritagepro/v9/sZlfdQid-zgaNiNIYcUzJMU3IYyNoHxSENxuLuE.ttf", - "700": "https://fonts.gstatic.com/s/taiheritagepro/v9/sZlYdQid-zgaNiNIYcUzJMU3IYyNmMB9NNRFMuhjCXY.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/taiheritagepro/v9/sZlfdQid-zgaNiNIYcUzJMU3IYyNkH1YFA.ttf" - }, - { - "family": "Tajawal", - "variants": [ - "200", - "300", - "regular", - "500", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin" - ], - "version": "v12", - "lastModified": "2025-09-08", - "files": { - "200": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l_6gLrZjiLlJ-G0.ttf", - "300": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l5qjLrZjiLlJ-G0.ttf", - "regular": "https://fonts.gstatic.com/s/tajawal/v12/Iura6YBj_oCad4k1rzaLCr5IlLA.ttf", - "500": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l8KiLrZjiLlJ-G0.ttf", - "700": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l4qkLrZjiLlJ-G0.ttf", - "800": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l5anLrZjiLlJ-G0.ttf", - "900": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l7KmLrZjiLlJ-G0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tajawal/v12/Iura6YBj_oCad4k1nzeBDg.ttf" - }, - { - "family": "Tangerine", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/tangerine/v18/IurY6Y5j_oScZZow4VOBDpxNhLBQ4Q.ttf", - "700": "https://fonts.gstatic.com/s/tangerine/v18/Iurd6Y5j_oScZZow4VO5srNpjJtM6G0t9w.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tangerine/v18/IurY6Y5j_oScZZow4VOxD5ZJ.ttf" - }, - { - "family": "Tapestry", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/tapestry/v6/SlGTmQecrosEYXhaGBIkqnB6aSQU.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tapestry/v6/SlGTmQecrosEYXhaGCIloHQ.ttf" - }, - { - "family": "Taprom", - "variants": [ - "regular" - ], - "subsets": [ - "khmer", - "latin" - ], - "version": "v29", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/taprom/v29/UcCn3F82JHycULbFQyk3-0kvHg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/taprom/v29/UcCn3F82JHycULb1QiMz.ttf" - }, - { - "family": "Tauri", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/tauri/v20/TwMA-IISS0AM3IpVWHU_TBqO.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tauri/v20/TwMA-IISS0AM3LpUUnE.ttf" - }, - { - "family": "Taviraj", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v15", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/taviraj/v15/ahcbv8Cj3ylylTXzRIorV8N1jU2gog.ttf", - "100italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcdv8Cj3ylylTXzTOwTM8lxr0iwolLl.ttf", - "200": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRCYKd-lbgUS5u0s.ttf", - "200italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwTn-hRhWa8q0v8ag.ttf", - "300": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzREIJd-lbgUS5u0s.ttf", - "300italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwT--tRhWa8q0v8ag.ttf", - "regular": "https://fonts.gstatic.com/s/taviraj/v15/ahcZv8Cj3ylylTXzfO4hU-FwnU0.ttf", - "italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcbv8Cj3ylylTXzTOwrV8N1jU2gog.ttf", - "500": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRBoId-lbgUS5u0s.ttf", - "500italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwTo-pRhWa8q0v8ag.ttf", - "600": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRDYPd-lbgUS5u0s.ttf", - "600italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwTj-1RhWa8q0v8ag.ttf", - "700": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRFIOd-lbgUS5u0s.ttf", - "700italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwT6-xRhWa8q0v8ag.ttf", - "800": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRE4Nd-lbgUS5u0s.ttf", - "800italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwT9-9RhWa8q0v8ag.ttf", - "900": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRGoMd-lbgUS5u0s.ttf", - "900italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwT0-5RhWa8q0v8ag.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/taviraj/v15/ahcZv8Cj3ylylTXzTO8rVw.ttf" - }, - { - "family": "Teachers", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "greek-ext", - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBr3powY55O4AS32A.ttf", - "500": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBr7JowY55O4AS32A.ttf", - "600": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBrAJ0wY55O4AS32A.ttf", - "700": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBrOZ0wY55O4AS32A.ttf", - "800": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBrXp0wY55O4AS32A.ttf", - "italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-FtnYIJRKwgGn2JLo.ttf", - "500italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-FtnqIJRKwgGn2JLo.ttf", - "600italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-FtkGJ5RKwgGn2JLo.ttf", - "700italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-Ftk_J5RKwgGn2JLo.ttf", - "800italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-FtlYJ5RKwgGn2JLo.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBr3poAYpRK.ttf" - }, - { - "family": "Teko", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN9JG7Sy3TKEvkCF.ttf", - "regular": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN8XG7Sy3TKEvkCF.ttf", - "500": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN8lG7Sy3TKEvkCF.ttf", - "600": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN_JHLSy3TKEvkCF.ttf", - "700": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN_wHLSy3TKEvkCF.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN8XG4Sz1zY.ttf" - }, - { - "family": "Tektur", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrwuVYtOY8P7TWd0.ttf", - "500": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrwcVYtOY8P7TWd0.ttf", - "600": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrzwUotOY8P7TWd0.ttf", - "700": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrzJUotOY8P7TWd0.ttf", - "800": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TryuUotOY8P7TWd0.ttf", - "900": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TryHUotOY8P7TWd0.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrwuVbtPacc.ttf" - }, - { - "family": "Telex", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/telex/v18/ieVw2Y1fKWmIO9fTB1piKFIf.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/telex/v18/ieVw2Y1fKWmIO-fSDV4.ttf" - }, - { - "family": "Tenali Ramakrishna", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v14", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/tenaliramakrishna/v14/raxgHj6Yt9gAN3LLKs0BZVMo8jmwn1-8KJXqUFFvtA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tenaliramakrishna/v14/raxgHj6Yt9gAN3LLKs0BZVMo8jmwn1-MKZ_u.ttf" - }, - { - "family": "Tenor Sans", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/tenorsans/v21/bx6ANxqUneKx06UkIXISr3JyC22IyqI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tenorsans/v21/bx6ANxqUneKx06UkIXISn3N4Dw.ttf" - }, - { - "family": "Text Me One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v26", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/textmeone/v26/i7dOIFdlayuLUvgoFvHQFWZcalayGhyV.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/textmeone/v26/i7dOIFdlayuLUvgoFvHQFVZdYFI.ttf" - }, - { - "family": "Texturina", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v32", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2eYG_Ug25riW1OD.ttf", - "200": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2cYGvUg25riW1OD.ttf", - "300": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2fGGvUg25riW1OD.ttf", - "regular": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2eYGvUg25riW1OD.ttf", - "500": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2eqGvUg25riW1OD.ttf", - "600": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2dGHfUg25riW1OD.ttf", - "700": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2d_HfUg25riW1OD.ttf", - "800": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2cYHfUg25riW1OD.ttf", - "900": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2cxHfUg25riW1OD.ttf", - "100italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWR1i0Z7AXkODN94.ttf", - "200italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWZ1j0Z7AXkODN94.ttf", - "300italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWUNj0Z7AXkODN94.ttf", - "italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWR1j0Z7AXkODN94.ttf", - "500italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWS9j0Z7AXkODN94.ttf", - "600italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWcNk0Z7AXkODN94.ttf", - "700italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWfpk0Z7AXkODN94.ttf", - "800italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWZ1k0Z7AXkODN94.ttf", - "900italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWbRk0Z7AXkODN94.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2eYGsUh0Z4.ttf" - }, - { - "family": "Thasadith", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/thasadith/v13/mtG44_1TIqPYrd_f5R1YsEkU0CWuFw.ttf", - "italic": "https://fonts.gstatic.com/s/thasadith/v13/mtG-4_1TIqPYrd_f5R1oskMQ8iC-F1ZE.ttf", - "700": "https://fonts.gstatic.com/s/thasadith/v13/mtG94_1TIqPYrd_f5R1gDGYw2A6yHk9d8w.ttf", - "700italic": "https://fonts.gstatic.com/s/thasadith/v13/mtGj4_1TIqPYrd_f5R1osnus3QS2PEpN8zxA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/thasadith/v13/mtG44_1TIqPYrd_f5R1osUMQ.ttf" - }, - { - "family": "The Girl Next Door", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/thegirlnextdoor/v25/pe0zMJCIMIsBjFxqYBIcZ6_OI5oFHCYIV7t7w6bE2A.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/thegirlnextdoor/v25/pe0zMJCIMIsBjFxqYBIcZ6_OI5oFHCY4VrF_.ttf" - }, - { - "family": "The Nautigal", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/thenautigal/v8/VdGZAZ8ZH51Lvng9fQV2bfKr5wVk09Se5Q.ttf", - "700": "https://fonts.gstatic.com/s/thenautigal/v8/VdGGAZ8ZH51Lvng9fQV2bfKTWypA2_-C7LoS7g.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/thenautigal/v8/VdGZAZ8ZH51Lvng9fQV2bfKb5g9g.ttf" - }, - { - "family": "Tienne", - "variants": [ - "regular", - "700", - "900" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/tienne/v21/AYCKpX7pe9YCRP0LkEPHSFNyxw.ttf", - "700": "https://fonts.gstatic.com/s/tienne/v21/AYCJpX7pe9YCRP0zLGzjQHhuzvef5Q.ttf", - "900": "https://fonts.gstatic.com/s/tienne/v21/AYCJpX7pe9YCRP0zFG7jQHhuzvef5Q.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tienne/v21/AYCKpX7pe9YCRP07kUnD.ttf" - }, - { - "family": "TikTok Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-11", - "files": { - "300": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7VuH1pFroETJ6Rg.ttf", - "regular": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7COH1pFroETJ6Rg.ttf", - "500": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7OuH1pFroETJ6Rg.ttf", - "600": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo71ub1pFroETJ6Rg.ttf", - "700": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo77-b1pFroETJ6Rg.ttf", - "800": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7iOb1pFroETJ6Rg.ttf", - "900": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7oeb1pFroETJ6Rg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7COHFpVDs.ttf" - }, - { - "family": "Tillana", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/tillana/v15/VuJxdNvf35P4qJ1OeKbXOIFneRo.ttf", - "500": "https://fonts.gstatic.com/s/tillana/v15/VuJ0dNvf35P4qJ1OQFL-HIlMZRNcp0o.ttf", - "600": "https://fonts.gstatic.com/s/tillana/v15/VuJ0dNvf35P4qJ1OQH75HIlMZRNcp0o.ttf", - "700": "https://fonts.gstatic.com/s/tillana/v15/VuJ0dNvf35P4qJ1OQBr4HIlMZRNcp0o.ttf", - "800": "https://fonts.gstatic.com/s/tillana/v15/VuJ0dNvf35P4qJ1OQAb7HIlMZRNcp0o.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tillana/v15/VuJxdNvf35P4qJ1OSKfdPA.ttf" - }, - { - "family": "Tilt Neon", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/tiltneon/v12/E21L_d7gguXdwD9LEFY2WCeElCNtd-eBqpHp1TzrkJSmwpj5ndxquXK9WualJ9DS.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tiltneon/v12/E21L_d7gguXdwD9LEFY2WCeElCNtd-eBqpHp1TzrkJSmwpj5ndxquUK8UOI.ttf" - }, - { - "family": "Tilt Prism", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/tiltprism/v16/5h11iZgyPHoZ3YikNzWGfWey2dCAZXT-bH9V4VGn-FJ7tLI25oc_rIbwoTSrn86NKw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tiltprism/v16/5h11iZgyPHoZ3YikNzWGfWey2dCAZXT-bH9V4VGn-FJ7tLI25oc_rIbAoD6v.ttf" - }, - { - "family": "Tilt Warp", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/tiltwarp/v18/AlZc_zVDs5XpmO7yn3w7flUoytXJp3z29uEwmEMLEJljLXvT8UJSZTBxAVfMGOPb.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tiltwarp/v18/AlZc_zVDs5XpmO7yn3w7flUoytXJp3z29uEwmEMLEJljLXvT8UJSZQBwC1M.ttf" - }, - { - "family": "Timmana", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "telugu" - ], - "version": "v14", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/timmana/v14/6xKvdShfL9yK-rvpCmvbKHwJUOM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/timmana/v14/6xKvdShfL9yK-rvpOmrRLA.ttf" - }, - { - "family": "Tinos", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/tinos/v25/buE4poGnedXvwgX8dGVh8TI-.ttf", - "italic": "https://fonts.gstatic.com/s/tinos/v25/buE2poGnedXvwjX-fmFD9CI-4NU.ttf", - "700": "https://fonts.gstatic.com/s/tinos/v25/buE1poGnedXvwj1AW0Fp2i43-cxL.ttf", - "700italic": "https://fonts.gstatic.com/s/tinos/v25/buEzpoGnedXvwjX-Rt1s0CoV_NxLeiw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tinos/v25/buE4poGnedXvwjX9fmE.ttf" - }, - { - "family": "Tiny5", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/tiny5/v3/KFOpCnmCvdGT7hw-z0hHAi88.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tiny5/v3/KFOpCnmCvdGT7iw_xUw.ttf" - }, - { - "family": "Tiro Bangla", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "bengali", - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/tirobangla/v6/IFSgHe1Tm95E3O8b5i2V8MG9-UPeuz4i.ttf", - "italic": "https://fonts.gstatic.com/s/tirobangla/v6/IFSiHe1Tm95E3O8b5i2V8PG_80f8vi4imBM.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tirobangla/v6/IFSgHe1Tm95E3O8b5i2V8PG880c.ttf" - }, - { - "family": "Tiro Devanagari Hindi", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/tirodevanagarihindi/v5/55xyezN7P8T4e0_CfIJrwdodg9HoYw0i-M9fSOkOfG0Y3A.ttf", - "italic": "https://fonts.gstatic.com/s/tirodevanagarihindi/v5/55x8ezN7P8T4e0_CfIJrwdodg9HoYw0i-M9vSuMKXmgI3F_o.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tirodevanagarihindi/v5/55xyezN7P8T4e0_CfIJrwdodg9HoYw0i-M9vSeMK.ttf" - }, - { - "family": "Tiro Devanagari Marathi", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/tirodevanagarimarathi/v5/fC1xPZBSZHrRhS3rd4M0MAPNJUHl4znXCxAkotDrDJYM2lAZ.ttf", - "italic": "https://fonts.gstatic.com/s/tirodevanagarimarathi/v5/fC1zPZBSZHrRhS3rd4M0MAPNJUHl4znXCxAkouDpBpIu30AZbUY.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tirodevanagarimarathi/v5/fC1xPZBSZHrRhS3rd4M0MAPNJUHl4znXCxAkouDqBpI.ttf" - }, - { - "family": "Tiro Devanagari Sanskrit", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v5", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/tirodevanagarisanskrit/v5/MCoAzBbr09vVUgVBM8FWu_yZdZkhkg-I0nUlb59pEoEqgtOh0w.ttf", - "italic": "https://fonts.gstatic.com/s/tirodevanagarisanskrit/v5/MCoGzBbr09vVUgVBM8FWu_yZdZkhkg-I0nUlb59ZEIsuoNax06MM.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tirodevanagarisanskrit/v5/MCoAzBbr09vVUgVBM8FWu_yZdZkhkg-I0nUlb59ZE4su.ttf" - }, - { - "family": "Tiro Gurmukhi", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "gurmukhi", - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/tirogurmukhi/v6/x3dmckXSYq-Uqjc048JUF7Jvly7HAQsyA2Y.ttf", - "italic": "https://fonts.gstatic.com/s/tirogurmukhi/v6/x3d4ckXSYq-Uqjc048JUF7JvpyzNBSk3E2YljQ.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tirogurmukhi/v6/x3dmckXSYq-Uqjc048JUF7Jvpy_NBQ.ttf" - }, - { - "family": "Tiro Kannada", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "kannada", - "latin", - "latin-ext" - ], - "version": "v6", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/tirokannada/v6/CSR44ztKmvqaDxEDJFY7CIYKSPl6tOU9Eg.ttf", - "italic": "https://fonts.gstatic.com/s/tirokannada/v6/CSRm4ztKmvqaDxEDJFY7CIY6SvN-luAtEnKp.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tirokannada/v6/CSR44ztKmvqaDxEDJFY7CIY6SfN-.ttf" - }, - { - "family": "Tiro Tamil", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext", - "tamil" - ], - "version": "v11", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/tirotamil/v11/m8JXjfVIf7OT22n3M-S_ULRvamODxdI.ttf", - "italic": "https://fonts.gstatic.com/s/tirotamil/v11/m8JVjfVIf7OT22n3M-S_YLZlbkGG1dKEDw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tirotamil/v11/m8JXjfVIf7OT22n3M-S_YLVlbg.ttf" - }, - { - "family": "Tiro Telugu", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext", - "telugu" - ], - "version": "v7", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/tirotelugu/v7/aFTQ7PxlZWk2EPiSymjXdKSNQqn0X0BO.ttf", - "italic": "https://fonts.gstatic.com/s/tirotelugu/v7/aFTS7PxlZWk2EPiSymjXdJSPSK3WWlBOoas.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tirotelugu/v7/aFTQ7PxlZWk2EPiSymjXdJSMSK0.ttf" - }, - { - "family": "Tirra", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "tifinagh" - ], - "version": "v2", - "lastModified": "2025-08-26", - "files": { - "regular": "https://fonts.gstatic.com/s/tirra/v2/WBLrrEnNakREGrPF3AHdWn3J.ttf", - "500": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGosx9SXVcWHALdio.ttf", - "600": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGosd8iXVcWHALdio.ttf", - "700": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGot58yXVcWHALdio.ttf", - "800": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGotl8CXVcWHALdio.ttf", - "900": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGotB8SXVcWHALdio.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tirra/v2/WBLrrEnNakREGoPE1gU.ttf" - }, - { - "family": "Titan One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/titanone/v17/mFTzWbsGxbbS_J5cQcjykzIn2Etikg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/titanone/v17/mFTzWbsGxbbS_J5cQcjCkjgj.ttf" - }, - { - "family": "Titillium Web", - "variants": [ - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "600", - "600italic", - "700", - "700italic", - "900" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffAzHKIx5YrSYqWM.ttf", - "200italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPFcZTIAOhVxoMyOr9n_E7fdMbewI1zZpaduWMmxA.ttf", - "300": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffGjEKIx5YrSYqWM.ttf", - "300italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPFcZTIAOhVxoMyOr9n_E7fdMbepI5zZpaduWMmxA.ttf", - "regular": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPecZTIAOhVxoMyOr9n_E7fRMTsDIRSfr0.ttf", - "italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPAcZTIAOhVxoMyOr9n_E7fdMbmCKZXbr2BsA.ttf", - "600": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffBzCKIx5YrSYqWM.ttf", - "600italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPFcZTIAOhVxoMyOr9n_E7fdMbe0IhzZpaduWMmxA.ttf", - "700": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffHjDKIx5YrSYqWM.ttf", - "700italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPFcZTIAOhVxoMyOr9n_E7fdMbetIlzZpaduWMmxA.ttf", - "900": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffEDBKIx5YrSYqWM.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPecZTIAOhVxoMyOr9n_E7fdMXmCA.ttf" - }, - { - "family": "Tomorrow", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/tomorrow/v19/WBLgrETNbFtZCeGqgR2xe2XiKMiokE4.ttf", - "100italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLirETNbFtZCeGqgRXXQwHoLOqtgE5h0A.ttf", - "200": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR0dWkXIBsShiVd4.ttf", - "200italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ63JDMCDjEd4yVY.ttf", - "300": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR15WUXIBsShiVd4.ttf", - "300italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ8nKDMCDjEd4yVY.ttf", - "regular": "https://fonts.gstatic.com/s/tomorrow/v19/WBLmrETNbFtZCeGqgSXVcWHALdio.ttf", - "italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLgrETNbFtZCeGqgRXXe2XiKMiokE4.ttf", - "500": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR0hWEXIBsShiVd4.ttf", - "500italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ5HLDMCDjEd4yVY.ttf", - "600": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR0NX0XIBsShiVd4.ttf", - "600italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ73MDMCDjEd4yVY.ttf", - "700": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR1pXkXIBsShiVd4.ttf", - "700italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ9nNDMCDjEd4yVY.ttf", - "800": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR11XUXIBsShiVd4.ttf", - "800italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ8XODMCDjEd4yVY.ttf", - "900": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR1RXEXIBsShiVd4.ttf", - "900italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ-HPDMCDjEd4yVY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tomorrow/v19/WBLmrETNbFtZCeGqgRXUe2U.ttf" - }, - { - "family": "Tourney", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GOQByZTp1I1LcGA.ttf", - "200": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GuQFyZTp1I1LcGA.ttf", - "300": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GZwFyZTp1I1LcGA.ttf", - "regular": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GOQFyZTp1I1LcGA.ttf", - "500": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GCwFyZTp1I1LcGA.ttf", - "600": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7G5wZyZTp1I1LcGA.ttf", - "700": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7G3gZyZTp1I1LcGA.ttf", - "800": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GuQZyZTp1I1LcGA.ttf", - "900": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GkAZyZTp1I1LcGA.ttf", - "100italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UKaJzBxAVfMGOPb.ttf", - "200italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UIaJjBxAVfMGOPb.ttf", - "300italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8ULEJjBxAVfMGOPb.ttf", - "italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UKaJjBxAVfMGOPb.ttf", - "500italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UKoJjBxAVfMGOPb.ttf", - "600italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UJEITBxAVfMGOPb.ttf", - "700italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UJ9ITBxAVfMGOPb.ttf", - "800italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UIaITBxAVfMGOPb.ttf", - "900italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UIzITBxAVfMGOPb.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GOQFCZDBx.ttf" - }, - { - "family": "Trade Winds", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/tradewinds/v18/AYCPpXPpYNIIT7h8-QenM3Jq7PKP5Z_G.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tradewinds/v18/AYCPpXPpYNIIT7h8-QenM0Jr5vY.ttf" - }, - { - "family": "Train One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/trainone/v16/gyB-hwkiNtc6KnxUVjWHOqbZRY7JVQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/trainone/v16/gyB-hwkiNtc6KnxUVjW3O6zd.ttf" - }, - { - "family": "Triodion", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/triodion/v3/IFSnHe5TgMVEmMQV5mr5u-W10l_X.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/triodion/v3/IFSnHe5TgMVEmMQV5lr4seE.ttf" - }, - { - "family": "Trirong", - "variants": [ - "100", - "100italic", - "200", - "200italic", - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic", - "900", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "thai", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/trirong/v17/7r3EqXNgp8wxdOdOl-go3YRl6ujngw.ttf", - "100italic": "https://fonts.gstatic.com/s/trirong/v17/7r3CqXNgp8wxdOdOn44QuY5hyO33g8IY.ttf", - "200": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOl0QJ_a5L5uH-mts.ttf", - "200italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QFa9B4sP7itsB5g.ttf", - "300": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOlyAK_a5L5uH-mts.ttf", - "300italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QcaxB4sP7itsB5g.ttf", - "regular": "https://fonts.gstatic.com/s/trirong/v17/7r3GqXNgp8wxdOdOr4wi2aZg-ug.ttf", - "italic": "https://fonts.gstatic.com/s/trirong/v17/7r3EqXNgp8wxdOdOn44o3YRl6ujngw.ttf", - "500": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOl3gL_a5L5uH-mts.ttf", - "500italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QKa1B4sP7itsB5g.ttf", - "600": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOl1QM_a5L5uH-mts.ttf", - "600italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QBapB4sP7itsB5g.ttf", - "700": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOlzAN_a5L5uH-mts.ttf", - "700italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QYatB4sP7itsB5g.ttf", - "800": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOlywO_a5L5uH-mts.ttf", - "800italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QfahB4sP7itsB5g.ttf", - "900": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOlwgP_a5L5uH-mts.ttf", - "900italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QWalB4sP7itsB5g.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/trirong/v17/7r3GqXNgp8wxdOdOn40o3Q.ttf" - }, - { - "family": "Trispace", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-08", - "files": { - "100": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbH9qoQl0zHugpt0.ttf", - "200": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbP9roQl0zHugpt0.ttf", - "300": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbCFroQl0zHugpt0.ttf", - "regular": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbH9roQl0zHugpt0.ttf", - "500": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbE1roQl0zHugpt0.ttf", - "600": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbKFsoQl0zHugpt0.ttf", - "700": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbJhsoQl0zHugpt0.ttf", - "800": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbP9soQl0zHugpt0.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbH9rkQh-yA.ttf" - }, - { - "family": "Trocchi", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/trocchi/v19/qWcqB6WkuIDxDZLcDrtUvMeTYD0.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/trocchi/v19/qWcqB6WkuIDxDZLcPrpeuA.ttf" - }, - { - "family": "Trochut", - "variants": [ - "regular", - "italic", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/trochut/v24/CHyjV-fDDlP9bDIw5nSIfVIPLns.ttf", - "italic": "https://fonts.gstatic.com/s/trochut/v24/CHyhV-fDDlP9bDIw1naCeXAKPns8jw.ttf", - "700": "https://fonts.gstatic.com/s/trochut/v24/CHymV-fDDlP9bDIw3sinWVokMnIllmA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/trochut/v24/CHyjV-fDDlP9bDIw1nWCeQ.ttf" - }, - { - "family": "Truculenta", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v27", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMlAjswcFHnJMMhg.ttf", - "200": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMtAiswcFHnJMMhg.ttf", - "300": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMg4iswcFHnJMMhg.ttf", - "regular": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMlAiswcFHnJMMhg.ttf", - "500": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMmIiswcFHnJMMhg.ttf", - "600": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMo4lswcFHnJMMhg.ttf", - "700": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMrclswcFHnJMMhg.ttf", - "800": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMtAlswcFHnJMMhg.ttf", - "900": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMvklswcFHnJMMhg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMlAigwYPGg.ttf" - }, - { - "family": "Trykker", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/trykker/v22/KtktALyWZJXudUPzhNnoOd2j22U.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/trykker/v22/KtktALyWZJXudUPztNjiPQ.ttf" - }, - { - "family": "Tsukimi Rounded", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoZ3LJNksWZO0LvnZwkF3HtoB7VkVsqN7MT3T9X8g.ttf", - "regular": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoc3LJNksWZO0LvnZwkF3HtoB7tPXMOP5gP1A.ttf", - "500": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoZ3LJNksWZO0LvnZwkF3HtoB7VyVoqN7MT3T9X8g.ttf", - "600": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoZ3LJNksWZO0LvnZwkF3HtoB7V5V0qN7MT3T9X8g.ttf", - "700": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoZ3LJNksWZO0LvnZwkF3HtoB7VgVwqN7MT3T9X8g.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoc3LJNksWZO0LvnZwkF3HtoB7dPHkK.ttf" - }, - { - "family": "Tuffy", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext", - "phoenician" - ], - "version": "v1", - "lastModified": "2025-04-23", - "files": { - "regular": "https://fonts.gstatic.com/s/tuffy/v1/1q2IY56bHkJl7rxzF4xmyfYe.ttf", - "italic": "https://fonts.gstatic.com/s/tuffy/v1/1q2GY56bHkJl7oxxHYhEzOYenEU.ttf", - "700": "https://fonts.gstatic.com/s/tuffy/v1/1q2FY56bHkJl7oTPOKhu4uoXhVzg.ttf", - "700italic": "https://fonts.gstatic.com/s/tuffy/v1/1q2DY56bHkJl7oxxJTRr6O41gEzgZoQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tuffy/v1/1q2IY56bHkJl7oxyHYg.ttf" - }, - { - "family": "Tulpen One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v26", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/tulpenone/v26/dFa6ZfeC474skLgesc0CWj0w_HyIRlE.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/tulpenone/v26/dFa6ZfeC474skLgesc0Cajw6-A.ttf" - }, - { - "family": "Turret Road", - "variants": [ - "200", - "300", - "regular", - "500", - "700", - "800" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0ONEdeLYk1Mq3ap.ttf", - "300": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0PpEteLYk1Mq3ap.ttf", - "regular": "https://fonts.gstatic.com/s/turretroad/v11/pxiAypMgpcBFjE84Zv-fE3tFOvODSVFF.ttf", - "500": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0OxE9eLYk1Mq3ap.ttf", - "700": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0P5FdeLYk1Mq3ap.ttf", - "800": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0PlFteLYk1Mq3ap.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/turretroad/v11/pxiAypMgpcBFjE84Zv-fE0tEMPc.ttf" - }, - { - "family": "Twinkle Star", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/twinklestar/v8/pe0pMI6IL4dPoFl9LGEmY6WaA_Rue1UwVg.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/twinklestar/v8/pe0pMI6IL4dPoFl9LGEmY6WqAv5q.ttf" - }, - { - "family": "Ubuntu", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-02", - "files": { - "300": "https://fonts.gstatic.com/s/ubuntu/v21/4iCv6KVjbNBYlgoC1CzTt2aMH4V_gg.ttf", - "300italic": "https://fonts.gstatic.com/s/ubuntu/v21/4iCp6KVjbNBYlgoKejZftWyIPYBvgpUI.ttf", - "regular": "https://fonts.gstatic.com/s/ubuntu/v21/4iCs6KVjbNBYlgo6eAT3v02QFg.ttf", - "italic": "https://fonts.gstatic.com/s/ubuntu/v21/4iCu6KVjbNBYlgoKeg7znUiAFpxm.ttf", - "500": "https://fonts.gstatic.com/s/ubuntu/v21/4iCv6KVjbNBYlgoCjC3Tt2aMH4V_gg.ttf", - "500italic": "https://fonts.gstatic.com/s/ubuntu/v21/4iCp6KVjbNBYlgoKejYHtGyIPYBvgpUI.ttf", - "700": "https://fonts.gstatic.com/s/ubuntu/v21/4iCv6KVjbNBYlgoCxCvTt2aMH4V_gg.ttf", - "700italic": "https://fonts.gstatic.com/s/ubuntu/v21/4iCp6KVjbNBYlgoKejZPsmyIPYBvgpUI.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ubuntu/v21/4iCs6KVjbNBYlgoKeQ7z.ttf" - }, - { - "family": "Ubuntu Condensed", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/ubuntucondensed/v17/u-4k0rCzjgs5J7oXnJcM_0kACGMtf-fVqvHoJXw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ubuntucondensed/v17/u-4k0rCzjgs5J7oXnJcM_0kACGMtT-bfrg.ttf" - }, - { - "family": "Ubuntu Mono", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/ubuntumono/v19/KFOjCneDtsqEr0keqCMhbBc9AMX6lJBP.ttf", - "italic": "https://fonts.gstatic.com/s/ubuntumono/v19/KFOhCneDtsqEr0keqCMhbCc_CsHYkYBPY3o.ttf", - "700": "https://fonts.gstatic.com/s/ubuntumono/v19/KFO-CneDtsqEr0keqCMhbC-BL-Hyv4xGemO1.ttf", - "700italic": "https://fonts.gstatic.com/s/ubuntumono/v19/KFO8CneDtsqEr0keqCMhbCc_Mn33tYhkf3O1GVg.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ubuntumono/v19/KFOjCneDtsqEr0keqCMhbCc8CsE.ttf" - }, - { - "family": "Ubuntu Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-02", - "files": { - "100": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbujzt7CfqLVLT9mgk.ttf", - "200": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj7t6CfqLVLT9mgk.ttf", - "300": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj2V6CfqLVLT9mgk.ttf", - "regular": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbujzt6CfqLVLT9mgk.ttf", - "500": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbujwl6CfqLVLT9mgk.ttf", - "600": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj-V9CfqLVLT9mgk.ttf", - "700": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj9x9CfqLVLT9mgk.ttf", - "800": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj7t9CfqLVLT9mgk.ttf", - "100italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM54biBUJb4iglIHg.ttf", - "200italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5YbmBUJb4iglIHg.ttf", - "300italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5v7mBUJb4iglIHg.ttf", - "italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM54bmBUJb4iglIHg.ttf", - "500italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM507mBUJb4iglIHg.ttf", - "600italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5P76BUJb4iglIHg.ttf", - "700italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5Br6BUJb4iglIHg.ttf", - "800italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5Yb6BUJb4iglIHg.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbujzt6OfuBUA.ttf" - }, - { - "family": "Ubuntu Sans Mono", - "variants": [ - "regular", - "500", - "600", - "700", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "greek-ext", - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27Ev_kYRiqcZu3n0.ttf", - "500": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27Ed_kYRiqcZu3n0.ttf", - "600": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27Hx-UYRiqcZu3n0.ttf", - "700": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27HI-UYRiqcZu3n0.ttf", - "italic": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyi7mzgBHrR5yE7ZyRg0QRJMKI45g_SchUEkQgw3KTnva5SgKM7vmn0BLE.ttf", - "500italic": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyi7mzgBHrR5yE7ZyRg0QRJMKI45g_SchUEkQgw3KTnvZxSgKM7vmn0BLE.ttf", - "600italic": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyi7mzgBHrR5yE7ZyRg0QRJMKI45g_SchUEkQgw3KTnvXBVgKM7vmn0BLE.ttf", - "700italic": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyi7mzgBHrR5yE7ZyRg0QRJMKI45g_SchUEkQgw3KTnvUlVgKM7vmn0BLE.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27Ev_nYQgKM.ttf" - }, - { - "family": "Uchen", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "tibetan" - ], - "version": "v11", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/uchen/v11/nKKZ-GokGZ1baIaSEQGodLxA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/uchen/v11/nKKZ-GokGZ1baLaTGwU.ttf" - }, - { - "family": "Ultra", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/ultra/v25/zOLy4prXmrtY-tT6yLOD6NxF.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ultra/v25/zOLy4prXmrtY-uT7wrc.ttf" - }, - { - "family": "Unbounded", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-11", - "files": { - "200": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG65jx043HgP6LR0Y.ttf", - "300": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG60bx043HgP6LR0Y.ttf", - "regular": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG6xjx043HgP6LR0Y.ttf", - "500": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG6yrx043HgP6LR0Y.ttf", - "600": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG68b2043HgP6LR0Y.ttf", - "700": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG6__2043HgP6LR0Y.ttf", - "800": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG65j2043HgP6LR0Y.ttf", - "900": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG67H2043HgP6LR0Y.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG6xjx44zNhA.ttf" - }, - { - "family": "Uncial Antiqua", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/uncialantiqua/v22/N0bM2S5WOex4OUbESzoESK-i-PfRS5VBBSSF.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/uncialantiqua/v22/N0bM2S5WOex4OUbESzoESK-i-MfQQZE.ttf" - }, - { - "family": "Underdog", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/underdog/v24/CHygV-jCElj7diMroVSiU14GN2Il.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/underdog/v24/CHygV-jCElj7diMroWSjWVo.ttf" - }, - { - "family": "Unica One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/unicaone/v20/DPEuYwWHyAYGVTSmalshdtffuEY7FA.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/unicaone/v20/DPEuYwWHyAYGVTSmalsRd93b.ttf" - }, - { - "family": "UnifrakturCook", - "variants": [ - "700" - ], - "subsets": [ - "latin" - ], - "version": "v25", - "lastModified": "2025-09-05", - "files": { - "700": "https://fonts.gstatic.com/s/unifrakturcook/v25/IurA6Yli8YOdcoky-0PTTdkm56n05Uw13ILXs-h6.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/unifrakturcook/v25/IurA6Yli8YOdcoky-0PTTdkm56n05Xw01oY.ttf" - }, - { - "family": "UnifrakturMaguntia", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/unifrakturmaguntia/v22/WWXPlieVYwiGNomYU-ciRLRvEmK7oaVun2xNNgNa1A.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/unifrakturmaguntia/v22/WWXPlieVYwiGNomYU-ciRLRvEmK7oaVenmZJ.ttf" - }, - { - "family": "Unkempt", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin" - ], - "version": "v22", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/unkempt/v22/2EbnL-Z2DFZue0DSSYYf8z2Yt_c.ttf", - "700": "https://fonts.gstatic.com/s/unkempt/v22/2EbiL-Z2DFZue0DScTow1zWzq_5uT84.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/unkempt/v22/2EbnL-Z2DFZue0DSeYcV9w.ttf" - }, - { - "family": "Unlock", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v28", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/unlock/v28/7Au-p_8ykD-cDl7GKAjSwkUVOQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/unlock/v28/7Au-p_8ykD-cDl72KQLW.ttf" - }, - { - "family": "Unna", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/unna/v25/AYCEpXzofN0NCpgBlGHCWFM.ttf", - "italic": "https://fonts.gstatic.com/s/unna/v25/AYCKpXzofN0NOpoLkEPHSFNyxw.ttf", - "700": "https://fonts.gstatic.com/s/unna/v25/AYCLpXzofN0NMiQusGnpRFpr3vc.ttf", - "700italic": "https://fonts.gstatic.com/s/unna/v25/AYCJpXzofN0NOpozLGzjQHhuzvef5Q.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/unna/v25/AYCEpXzofN0NOpkLkA.ttf" - }, - { - "family": "UoqMunThenKhung", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "latin", - "symbols2" - ], - "version": "v1", - "lastModified": "2025-06-25", - "files": { - "regular": "https://fonts.gstatic.com/s/uoqmunthenkhung/v1/Y4GTYa1nVTQLt-D5LoLChg5aJjIjwLL9Th8YYA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/uoqmunthenkhung/v1/Y4GTYa1nVTQLt-D5LoLChg5aJjITwbj5.ttf" - }, - { - "family": "Updock", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/updock/v7/nuF4D_3dVZ70UI9SjLK3602XBw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/updock/v7/nuF4D_3dVZ70UI9ijbiz.ttf" - }, - { - "family": "Urbanist", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDyx8fFpOrS8SlKw.ttf", - "200": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDSx4fFpOrS8SlKw.ttf", - "300": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDlR4fFpOrS8SlKw.ttf", - "regular": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDyx4fFpOrS8SlKw.ttf", - "500": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqD-R4fFpOrS8SlKw.ttf", - "600": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDFRkfFpOrS8SlKw.ttf", - "700": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDLBkfFpOrS8SlKw.ttf", - "800": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDSxkfFpOrS8SlKw.ttf", - "900": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDYhkfFpOrS8SlKw.ttf", - "100italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA133VJmvacG1K4S1.ttf", - "200italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA113VZmvacG1K4S1.ttf", - "300italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA12pVZmvacG1K4S1.ttf", - "italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA133VZmvacG1K4S1.ttf", - "500italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA13FVZmvacG1K4S1.ttf", - "600italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA10pUpmvacG1K4S1.ttf", - "700italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA10QUpmvacG1K4S1.ttf", - "800italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA113UpmvacG1K4S1.ttf", - "900italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA11eUpmvacG1K4S1.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDyx4vF5mv.ttf" - }, - { - "family": "VT323", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/vt323/v18/pxiKyp0ihIEF2hsYHpT2dkNE.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vt323/v18/pxiKyp0ihIEF2isZFJA.ttf" - }, - { - "family": "Vampiro One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/vampiroone/v19/gokqH6DoDl5yXvJytFsdLkqnsvhIor3K.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vampiroone/v19/gokqH6DoDl5yXvJytFsdLnqmuPw.ttf" - }, - { - "family": "Varela", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/varela/v17/DPEtYwqExx0AWHXJBBQFfvzDsQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/varela/v17/DPEtYwqExx0AWHX5BR4B.ttf" - }, - { - "family": "Varela Round", - "variants": [ - "regular" - ], - "subsets": [ - "hebrew", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/varelaround/v21/w8gdH283Tvk__Lua32TysjIvoMGOD9gxZw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/varelaround/v21/w8gdH283Tvk__Lua32TysjIfocuK.ttf" - }, - { - "family": "Varta", - "variants": [ - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "300": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x96j4EirE-9PGLfQ.ttf", - "regular": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9tD4EirE-9PGLfQ.ttf", - "500": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9hj4EirE-9PGLfQ.ttf", - "600": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9ajkEirE-9PGLfQ.ttf", - "700": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9UzkEirE-9PGLfQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9tD40i7s6.ttf" - }, - { - "family": "Vast Shadow", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/vastshadow/v21/pe0qMImKOZ1V62ZwbVY9dfe6Kdpickwp.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vastshadow/v21/pe0qMImKOZ1V62ZwbVY9dce7I94.ttf" - }, - { - "family": "Vazirmatn", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklWgyOReZ72DF_QY.ttf", - "200": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklegzOReZ72DF_QY.ttf", - "300": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklTYzOReZ72DF_QY.ttf", - "regular": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklWgzOReZ72DF_QY.ttf", - "500": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklVozOReZ72DF_QY.ttf", - "600": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklbY0OReZ72DF_QY.ttf", - "700": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklY80OReZ72DF_QY.ttf", - "800": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRkleg0OReZ72DF_QY.ttf", - "900": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklcE0OReZ72DF_QY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklWgzCRaT6w.ttf" - }, - { - "family": "Vend Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v1", - "lastModified": "2025-08-26", - "files": { - "300": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqgeqzzfJQAJuEJw.ttf", - "regular": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqlmqzzfJQAJuEJw.ttf", - "500": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqmuqzzfJQAJuEJw.ttf", - "600": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqoetzzfJQAJuEJw.ttf", - "700": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqr6tzzfJQAJuEJw.ttf", - "300italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5HpeXTDRCBrAJz0nA.ttf", - "italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5HpJ3TDRCBrAJz0nA.ttf", - "500italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5HpFXTDRCBrAJz0nA.ttf", - "600italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5Hp-XPDRCBrAJz0nA.ttf", - "700italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5HpwHPDRCBrAJz0nA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqlmq_zbDRA.ttf" - }, - { - "family": "Vesper Libre", - "variants": [ - "regular", - "500", - "700", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6CNxyWnf-uxPdXDHUD_Rd4D0-N2qIWVQ.ttf", - "500": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6dNxyWnf-uxPdXDHUD_RdA-2ap0okKXKvPlw.ttf", - "700": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6dNxyWnf-uxPdXDHUD_RdAs2Cp0okKXKvPlw.ttf", - "900": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6dNxyWnf-uxPdXDHUD_RdAi2Kp0okKXKvPlw.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6CNxyWnf-uxPdXDHUD_RdIDkWJ.ttf" - }, - { - "family": "Viaoda Libre", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v20", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/viaodalibre/v20/vEFW2_lWCgoR6OKuRz9kcRVJb2IY2tOHXg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/viaodalibre/v20/vEFW2_lWCgoR6OKuRz9kcRV5bmgc.ttf" - }, - { - "family": "Vibes", - "variants": [ - "regular" - ], - "subsets": [ - "arabic", - "latin" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/vibes/v16/QdVYSTsmIB6tmbd3HpbsuBlh.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vibes/v16/QdVYSTsmIB6tmYd2FJI.ttf" - }, - { - "family": "Vibur", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/vibur/v24/DPEiYwmEzw0QRjTpLjoJd-Xa.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vibur/v24/DPEiYwmEzw0QRgToJD4.ttf" - }, - { - "family": "Victor Mono", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-05", - "files": { - "100": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyO8_NhNyOV0Y9bQ.ttf", - "200": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyu87NhNyOV0Y9bQ.ttf", - "300": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyZc7NhNyOV0Y9bQ.ttf", - "regular": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyO87NhNyOV0Y9bQ.ttf", - "500": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyCc7NhNyOV0Y9bQ.ttf", - "600": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCy5cnNhNyOV0Y9bQ.ttf", - "700": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCy3MnNhNyOV0Y9bQ.ttf", - "100italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen840lxtaKdUMtba8p.ttf", - "200italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen842lx9aKdUMtba8p.ttf", - "300italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen8417x9aKdUMtba8p.ttf", - "italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen840lx9aKdUMtba8p.ttf", - "500italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen840Xx9aKdUMtba8p.ttf", - "600italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen8437wNaKdUMtba8p.ttf", - "700italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen843CwNaKdUMtba8p.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyO879hdaK.ttf" - }, - { - "family": "Vidaloka", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/vidaloka/v19/7cHrv4c3ipenMKlEass8yn4hnCci.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vidaloka/v19/7cHrv4c3ipenMKlEavs9wHo.ttf" - }, - { - "family": "Viga", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/viga/v15/xMQbuFFdSaiX_QIjD4e2OX8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/viga/v15/xMQbuFFdSaiXzQMpCw.ttf" - }, - { - "family": "Vina Sans", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/vinasans/v8/m8JQjfZKf6-d2273MP7zcJ5BZmqa3A.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vinasans/v8/m8JQjfZKf6-d2273MP7DcZRF.ttf" - }, - { - "family": "Voces", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/voces/v24/-F6_fjJyLyU8d4PBBG7YpzlJ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/voces/v24/-F6_fjJyLyU8d7PADmo.ttf" - }, - { - "family": "Volkhov", - "variants": [ - "regular", - "italic", - "700", - "700italic" - ], - "subsets": [ - "latin" - ], - "version": "v18", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/volkhov/v18/SlGQmQieoJcKemNeQTIOhHxzcD0.ttf", - "italic": "https://fonts.gstatic.com/s/volkhov/v18/SlGSmQieoJcKemNecTAEgF52YD0NYw.ttf", - "700": "https://fonts.gstatic.com/s/volkhov/v18/SlGVmQieoJcKemNeeY4hoHRYbDQUego.ttf", - "700italic": "https://fonts.gstatic.com/s/volkhov/v18/SlGXmQieoJcKemNecTA8PHFSaBYRagrQrA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/volkhov/v18/SlGQmQieoJcKemNecTMEgA.ttf" - }, - { - "family": "Vollkorn", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v30", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2MHGuGWOdEbD63w.ttf", - "500": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2AnGuGWOdEbD63w.ttf", - "600": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df27nauGWOdEbD63w.ttf", - "700": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df213auGWOdEbD63w.ttf", - "800": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2sHauGWOdEbD63w.ttf", - "900": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2mXauGWOdEbD63w.ttf", - "italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DJGWmmZM7Xq34g9.ttf", - "500italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DJ0WmmZM7Xq34g9.ttf", - "600italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DKYXWmZM7Xq34g9.ttf", - "700italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DKhXWmZM7Xq34g9.ttf", - "800italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DLGXWmZM7Xq34g9.ttf", - "900italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DLvXWmZM7Xq34g9.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2MHGeGGmZ.ttf" - }, - { - "family": "Vollkorn SC", - "variants": [ - "regular", - "600", - "700", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_v6-zQ3rXpceZj9cqnVhF5NH-iSq_E.ttf", - "600": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_y6-zQ3rXpceZj9cqnVimhGluqYbPN5Yjn.ttf", - "700": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_y6-zQ3rXpceZj9cqnVinFG1uqYbPN5Yjn.ttf", - "900": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_y6-zQ3rXpceZj9cqnVin9GVuqYbPN5Yjn.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_v6-zQ3rXpceZj9cqnViF4Pns.ttf" - }, - { - "family": "Voltaire", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v23", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/voltaire/v23/1Pttg8PcRfSblAvGvQooYKVnBOif.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/voltaire/v23/1Pttg8PcRfSblAvGvTopaqE.ttf" - }, - { - "family": "Vujahday Script", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v10", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/vujahdayscript/v10/RWmQoKGA8fEkrIPtSZ3_J7er2dUiDEtvAlaMKw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/vujahdayscript/v10/RWmQoKGA8fEkrIPtSZ3_J7er2dUSDUFr.ttf" - }, - { - "family": "WDXL Lubrifont JP N", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext", - "symbols2" - ], - "version": "v1", - "lastModified": "2025-06-12", - "files": { - "regular": "https://fonts.gstatic.com/s/wdxllubrifontjpn/v1/8At1GtSkFqazDiO949fzWta9_T-SVxJiIZctoLhFRNU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wdxllubrifontjpn/v1/8At1GtSkFqazDiO949fzWta9_T-SVxJiEZYnpA.ttf" - }, - { - "family": "WDXL Lubrifont SC", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-simplified", - "cyrillic", - "latin", - "latin-ext", - "symbols2" - ], - "version": "v1", - "lastModified": "2025-06-12", - "files": { - "regular": "https://fonts.gstatic.com/s/wdxllubrifontsc/v1/gNMeW2VmY6acu0XtugFrduDciOOyfny5mD9ASHz5.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wdxllubrifontsc/v1/gNMeW2VmY6acu0XtugFrduDciOOyfky4kjs.ttf" - }, - { - "family": "WDXL Lubrifont TC", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-traditional", - "cyrillic", - "latin", - "latin-ext", - "symbols2" - ], - "version": "v4", - "lastModified": "2025-06-18", - "files": { - "regular": "https://fonts.gstatic.com/s/wdxllubrifonttc/v4/nKKN-H4mPq1yJurnWXfJE8svQHonWc_-EqxyqaA8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wdxllubrifonttc/v4/nKKN-H4mPq1yJurnWXfJE8svQHonWf__GKg.ttf" - }, - { - "family": "Waiting for the Sunrise", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v23", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/waitingforthesunrise/v23/WBL1rFvOYl9CEv2i1mO6KUW8RKWJ2zoXoz5JsYZQ9h_ZYk5J.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/waitingforthesunrise/v23/WBL1rFvOYl9CEv2i1mO6KUW8RKWJ2zoXoz5JsbZR_Bs.ttf" - }, - { - "family": "Wallpoet", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v21", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/wallpoet/v21/f0X10em2_8RnXVVdUNbu7cXP8L8G.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wallpoet/v21/f0X10em2_8RnXVVdUObv58E.ttf" - }, - { - "family": "Walter Turncoat", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v24", - "lastModified": "2025-06-02", - "files": { - "regular": "https://fonts.gstatic.com/s/walterturncoat/v24/snfys0Gs98ln43n0d-14ULoToe67YB2dQ5ZPqQ.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/walterturncoat/v24/snfys0Gs98ln43n0d-14ULoToe6LYReZ.ttf" - }, - { - "family": "Warnes", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v29", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/warnes/v29/pONn1hc0GsW6sW5OpiC2o6Lkqg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/warnes/v29/pONn1hc0GsW6sW5-pyqy.ttf" - }, - { - "family": "Water Brush", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v6", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/waterbrush/v6/AYCPpXPqc8cJWLhp4hywKHJq7PKP5Z_G.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/waterbrush/v6/AYCPpXPqc8cJWLhp4hywKEJr5vY.ttf" - }, - { - "family": "Waterfall", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v8", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/waterfall/v8/MCoRzAfo293fACdFKcwY2rH8D_EZwA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/waterfall/v8/MCoRzAfo293fACdFKcwo27v4.ttf" - }, - { - "family": "Wavefont", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "latin" - ], - "version": "v19", - "lastModified": "2025-09-17", - "files": { - "100": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI3V0rDHXKtOXOg4.ttf", - "200": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI1V07DHXKtOXOg4.ttf", - "300": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI2L07DHXKtOXOg4.ttf", - "regular": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI3V07DHXKtOXOg4.ttf", - "500": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI3n07DHXKtOXOg4.ttf", - "600": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI0L1LDHXKtOXOg4.ttf", - "700": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI0y1LDHXKtOXOg4.ttf", - "800": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI1V1LDHXKtOXOg4.ttf", - "900": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI181LDHXKtOXOg4.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI3V04DGVq8.ttf" - }, - { - "family": "Wellfleet", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/wellfleet/v25/nuF7D_LfQJb3VYgX6eyT42aLDhO2HA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wellfleet/v25/nuF7D_LfQJb3VYgX6eyj4myP.ttf" - }, - { - "family": "Wendy One", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v20", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/wendyone/v20/2sDcZGJOipXfgfXV5wgDb2-4C7wFZQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wendyone/v20/2sDcZGJOipXfgfXV5wgzbmW8.ttf" - }, - { - "family": "Whisper", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v7", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/whisper/v7/q5uHsoqtKftx74K9milCBxxdmYU.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/whisper/v7/q5uHsoqtKftx74K9qihIAw.ttf" - }, - { - "family": "WindSong", - "variants": [ - "regular", - "500" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/windsong/v13/KR1WBsyu-P-GFEW57r95HdG6vjH3.ttf", - "500": "https://fonts.gstatic.com/s/windsong/v13/KR1RBsyu-P-GFEW57oeNNPWylS3-jVXm.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/windsong/v13/KR1WBsyu-P-GFEW57o94F9U.ttf" - }, - { - "family": "Winky Rough", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bOSVuN7JB-KCmzg.ttf", - "regular": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bZyVuN7JB-KCmzg.ttf", - "500": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bVSVuN7JB-KCmzg.ttf", - "600": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8buSJuN7JB-KCmzg.ttf", - "700": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bgCJuN7JB-KCmzg.ttf", - "800": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8b5yJuN7JB-KCmzg.ttf", - "900": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bziJuN7JB-KCmzg.ttf", - "300italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2bYdLhF2qW2zneX.ttf", - "italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2aGdLhF2qW2zneX.ttf", - "500italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2a0dLhF2qW2zneX.ttf", - "600italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2ZYc7hF2qW2zneX.ttf", - "700italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2Zhc7hF2qW2zneX.ttf", - "800italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2YGc7hF2qW2zneX.ttf", - "900italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2Yvc7hF2qW2zneX.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bZyVeNrhF.ttf" - }, - { - "family": "Winky Sans", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v3", - "lastModified": "2025-09-02", - "files": { - "300": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGXUiD6F2TpBa98q.ttf", - "regular": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGWKiD6F2TpBa98q.ttf", - "500": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGW4iD6F2TpBa98q.ttf", - "600": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGVUjz6F2TpBa98q.ttf", - "700": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGVtjz6F2TpBa98q.ttf", - "800": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGUKjz6F2TpBa98q.ttf", - "900": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGUjjz6F2TpBa98q.ttf", - "300italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy4jG0z5jbs8qbts.ttf", - "italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy9bG0z5jbs8qbts.ttf", - "500italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy-TG0z5jbs8qbts.ttf", - "600italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCywjB0z5jbs8qbts.ttf", - "700italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCyzHB0z5jbs8qbts.ttf", - "800italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy1bB0z5jbs8qbts.ttf", - "900italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy3_B0z5jbs8qbts.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGWKiA6E0z4.ttf" - }, - { - "family": "Wire One", - "variants": [ - "regular" - ], - "subsets": [ - "latin" - ], - "version": "v30", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/wireone/v30/qFdH35Wah5htUhV75WGiWdrCwwcJ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wireone/v30/qFdH35Wah5htUhV75VGjU94.ttf" - }, - { - "family": "Wittgenstein", - "variants": [ - "regular", - "500", - "600", - "700", - "800", - "900", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v4", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61G4T_Bv7Z15J4ow.ttf", - "500": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61FwT_Bv7Z15J4ow.ttf", - "600": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61LAU_Bv7Z15J4ow.ttf", - "700": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61IkU_Bv7Z15J4ow.ttf", - "800": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61O4U_Bv7Z15J4ow.ttf", - "900": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61McU_Bv7Z15J4ow.ttf", - "italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQFFjxY3xM8ozHYA.ttf", - "500italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQJljxY3xM8ozHYA.ttf", - "600italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQyl_xY3xM8ozHYA.ttf", - "700italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQ81_xY3xM8ozHYA.ttf", - "800italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQlF_xY3xM8ozHYA.ttf", - "900italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQvV_xY3xM8ozHYA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61G4TzBrxYw.ttf" - }, - { - "family": "Wix Madefor Display", - "variants": [ - "regular", - "500", - "600", - "700", - "800" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v12", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYFhYltkv_3HQKgh.ttf", - "500": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYFTYltkv_3HQKgh.ttf", - "600": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYG_ZVtkv_3HQKgh.ttf", - "700": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYGGZVtkv_3HQKgh.ttf", - "800": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYHhZVtkv_3HQKgh.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYFhYmtltfk.ttf" - }, - { - "family": "Wix Madefor Text", - "variants": [ - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic", - "800", - "800italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cK_NOeFgpRt9rN5.ttf", - "italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3dw_GiJBP86N53IY.ttf", - "500": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cKNNOeFgpRt9rN5.ttf", - "500italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3dz3GiJBP86N53IY.ttf", - "600": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cJhM-eFgpRt9rN5.ttf", - "600italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3d9HBiJBP86N53IY.ttf", - "700": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cJYM-eFgpRt9rN5.ttf", - "700italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3d-jBiJBP86N53IY.ttf", - "800": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cI_M-eFgpRt9rN5.ttf", - "800italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3d4_BiJBP86N53IY.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cK_NNeEiJA.ttf" - }, - { - "family": "Work Sans", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K0nWNigDp6_cOyA.ttf", - "200": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K8nXNigDp6_cOyA.ttf", - "300": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32KxfXNigDp6_cOyA.ttf", - "regular": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K0nXNigDp6_cOyA.ttf", - "500": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K3vXNigDp6_cOyA.ttf", - "600": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K5fQNigDp6_cOyA.ttf", - "700": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K67QNigDp6_cOyA.ttf", - "800": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K8nQNigDp6_cOyA.ttf", - "900": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K-DQNigDp6_cOyA.ttf", - "100italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGU3moJo43ZKyDSQQ.ttf", - "200italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUXmsJo43ZKyDSQQ.ttf", - "300italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUgGsJo43ZKyDSQQ.ttf", - "italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGU3msJo43ZKyDSQQ.ttf", - "500italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGU7GsJo43ZKyDSQQ.ttf", - "600italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUAGwJo43ZKyDSQQ.ttf", - "700italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUOWwJo43ZKyDSQQ.ttf", - "800italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUXmwJo43ZKyDSQQ.ttf", - "900italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUd2wJo43ZKyDSQQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K0nXBikJow.ttf" - }, - { - "family": "Workbench", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "math", - "symbols" - ], - "version": "v3", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/workbench/v3/FeV8S05Gp6Et7FcfbPFK1rynGd_MxtkvNFmoUDFhgF2VKTGQk6vapdOL0GKqgZyb.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/workbench/v3/FeV8S05Gp6Et7FcfbPFK1rynGd_MxtkvNFmoUDFhgF2VKTGQk6vapeOK2mY.ttf" - }, - { - "family": "Xanh Mono", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/xanhmono/v19/R70YjykVmvKCep-vWhSYmACQXzLhTg.ttf", - "italic": "https://fonts.gstatic.com/s/xanhmono/v19/R70ejykVmvKCep-vWhSomgqUfTfxTo24.ttf" - }, - "category": "monospace", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/xanhmono/v19/R70YjykVmvKCep-vWhSomQqU.ttf" - }, - { - "family": "Yaldevi", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "latin", - "latin-ext", - "sinhala" - ], - "version": "v17", - "lastModified": "2025-09-10", - "files": { - "200": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpfxJzvobxLCBJkS.ttf", - "300": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpcvJzvobxLCBJkS.ttf", - "regular": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpdxJzvobxLCBJkS.ttf", - "500": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpdDJzvobxLCBJkS.ttf", - "600": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpevIDvobxLCBJkS.ttf", - "700": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpeWIDvobxLCBJkS.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpdxJwvpZRY.ttf" - }, - { - "family": "Yanone Kaffeesatz", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v32", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftodtWpcGuLCnXkVA.ttf", - "300": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftoqNWpcGuLCnXkVA.ttf", - "regular": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIfto9tWpcGuLCnXkVA.ttf", - "500": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftoxNWpcGuLCnXkVA.ttf", - "600": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftoKNKpcGuLCnXkVA.ttf", - "700": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftoEdKpcGuLCnXkVA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIfto9tWZcWGP.ttf" - }, - { - "family": "Yantramanav", - "variants": [ - "100", - "300", - "regular", - "500", - "700", - "900" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/yantramanav/v15/flU-Rqu5zY00QEpyWJYWN5-QXeNzDB41rZg.ttf", - "300": "https://fonts.gstatic.com/s/yantramanav/v15/flUhRqu5zY00QEpyWJYWN59Yf8NZIhI8tIHh.ttf", - "regular": "https://fonts.gstatic.com/s/yantramanav/v15/flU8Rqu5zY00QEpyWJYWN6f0V-dRCQ41.ttf", - "500": "https://fonts.gstatic.com/s/yantramanav/v15/flUhRqu5zY00QEpyWJYWN58AfsNZIhI8tIHh.ttf", - "700": "https://fonts.gstatic.com/s/yantramanav/v15/flUhRqu5zY00QEpyWJYWN59IeMNZIhI8tIHh.ttf", - "900": "https://fonts.gstatic.com/s/yantramanav/v15/flUhRqu5zY00QEpyWJYWN59wesNZIhI8tIHh.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yantramanav/v15/flU8Rqu5zY00QEpyWJYWN5f1XeM.ttf" - }, - { - "family": "Yarndings 12", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "math", - "symbols" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/yarndings12/v4/55xreyp2N8T5P2LJbZAlkY9c8ZLMI2VUnQ.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yarndings12/v4/55xreyp2N8T5P2LJbZAlkY9s8JjI.ttf" - }, - { - "family": "Yarndings 12 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "math", - "symbols" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/yarndings12charted/v4/eLGDP_DlKhO-DUfeqM4I_vDdJgmIh7hAvvbJ0t-dHaJH.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yarndings12charted/v4/eLGDP_DlKhO-DUfeqM4I_vDdJgmIh7hAvsbI2Ns.ttf" - }, - { - "family": "Yarndings 20", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "math", - "symbols" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/yarndings20/v4/TuGWUVlkUohEQu8l7K8b-vNFB380PMTK1w.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yarndings20/v4/TuGWUVlkUohEQu8l7K8b-vN1BnUw.ttf" - }, - { - "family": "Yarndings 20 Charted", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "math", - "symbols" - ], - "version": "v4", - "lastModified": "2025-09-17", - "files": { - "regular": "https://fonts.gstatic.com/s/yarndings20charted/v4/QldRNSdbpg0G8vh0W2qxe0l-hcUPtY2VaLQm4UTqz5V9.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yarndings20charted/v4/QldRNSdbpg0G8vh0W2qxe0l-hcUPtY2VaIQn60A.ttf" - }, - { - "family": "Yatra One", - "variants": [ - "regular" - ], - "subsets": [ - "devanagari", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/yatraone/v16/C8ch4copsHzj8p7NaF0xw1OBbRDvXw.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yatraone/v16/C8ch4copsHzj8p7NaF0BwlmF.ttf" - }, - { - "family": "Yellowtail", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v25", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/yellowtail/v25/OZpGg_pnoDtINPfRIlLotlzNwED-b4g.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yellowtail/v25/OZpGg_pnoDtINPfRIlLohl3HxA.ttf" - }, - { - "family": "Yeon Sung", - "variants": [ - "regular" - ], - "subsets": [ - "korean", - "latin" - ], - "version": "v22", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/yeonsung/v22/QldMNTpbohAGtsJvUn6xSVNazqx2xg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yeonsung/v22/QldMNTpbohAGtsJvUn6BSFle.ttf" - }, - { - "family": "Yeseva One", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v24", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/yesevaone/v24/OpNJno4ck8vc-xYpwWWxpipfWhXD00c.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yesevaone/v24/OpNJno4ck8vc-xYpwWWxlitVXg.ttf" - }, - { - "family": "Yesteryear", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/yesteryear/v21/dg4g_p78rroaKl8kRKo1r7wHTwonmyw.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yesteryear/v21/dg4g_p78rroaKl8kRKo1n70NSw.ttf" - }, - { - "family": "Yomogi", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v13", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/yomogi/v13/VuJwdNrS2ZL7rpoPWIz5NIh-YA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yomogi/v13/VuJwdNrS2ZL7rpo_WYb9.ttf" - }, - { - "family": "Young Serif", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-05-30", - "files": { - "regular": "https://fonts.gstatic.com/s/youngserif/v2/3qTpojO2nS2VtkB3KtkQZ2t61EcYaQ7F.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/youngserif/v2/3qTpojO2nS2VtkB3KtkQZ1t73kM.ttf" - }, - { - "family": "Yrsa", - "variants": [ - "300", - "regular", - "500", - "600", - "700", - "300italic", - "italic", - "500italic", - "600italic", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext", - "vietnamese" - ], - "version": "v25", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCjASNNV9rRPfrKu.ttf", - "regular": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCieSNNV9rRPfrKu.ttf", - "500": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCisSNNV9rRPfrKu.ttf", - "600": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaChAT9NV9rRPfrKu.ttf", - "700": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCh5T9NV9rRPfrKu.ttf", - "300italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WC2UW_LBte6KuGEo.ttf", - "italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WCzsW_LBte6KuGEo.ttf", - "500italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WCwkW_LBte6KuGEo.ttf", - "600italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WC-UR_LBte6KuGEo.ttf", - "700italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WC9wR_LBte6KuGEo.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCieSONU_LA.ttf" - }, - { - "family": "Ysabeau", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v5", - "lastModified": "2025-09-11", - "files": { - "100": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7OWCTYwI8Gcw6Oi.ttf", - "200": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7MWCDYwI8Gcw6Oi.ttf", - "300": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7PICDYwI8Gcw6Oi.ttf", - "regular": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7OWCDYwI8Gcw6Oi.ttf", - "500": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7OkCDYwI8Gcw6Oi.ttf", - "600": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7NIDzYwI8Gcw6Oi.ttf", - "700": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7NxDzYwI8Gcw6Oi.ttf", - "800": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7MWDzYwI8Gcw6Oi.ttf", - "900": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7M_DzYwI8Gcw6Oi.ttf", - "100italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS95yKcW-xrOiIUw.ttf", - "200italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS15zKcW-xrOiIUw.ttf", - "300italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS4BzKcW-xrOiIUw.ttf", - "italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS95zKcW-xrOiIUw.ttf", - "500italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS-xzKcW-xrOiIUw.ttf", - "600italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeSwB0KcW-xrOiIUw.ttf", - "700italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeSzl0KcW-xrOiIUw.ttf", - "800italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS150KcW-xrOiIUw.ttf", - "900italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS3d0KcW-xrOiIUw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7OWCAYxKcU.ttf" - }, - { - "family": "Ysabeau Infant", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYFo4HK5ChLwKH6A.ttf", - "200": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYlo8HK5ChLwKH6A.ttf", - "300": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYSI8HK5ChLwKH6A.ttf", - "regular": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYFo8HK5ChLwKH6A.ttf", - "500": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYJI8HK5ChLwKH6A.ttf", - "600": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYyIgHK5ChLwKH6A.ttf", - "700": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQY8YgHK5ChLwKH6A.ttf", - "800": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYlogHK5ChLwKH6A.ttf", - "900": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYv4gHK5ChLwKH6A.ttf", - "100italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3szvaZqlDQeX6Dc5.ttf", - "200italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3sxvaJqlDQeX6Dc5.ttf", - "300italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3syxaJqlDQeX6Dc5.ttf", - "italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3szvaJqlDQeX6Dc5.ttf", - "500italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3szdaJqlDQeX6Dc5.ttf", - "600italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3swxb5qlDQeX6Dc5.ttf", - "700italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3swIb5qlDQeX6Dc5.ttf", - "800italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3sxvb5qlDQeX6Dc5.ttf", - "900italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3sxGb5qlDQeX6Dc5.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYFo83Kpql.ttf" - }, - { - "family": "Ysabeau Office", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "100italic", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-10", - "files": { - "100": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbh6IfYSfpQj7IGQ.ttf", - "200": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbB6MfYSfpQj7IGQ.ttf", - "300": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPb2aMfYSfpQj7IGQ.ttf", - "regular": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbh6MfYSfpQj7IGQ.ttf", - "500": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbtaMfYSfpQj7IGQ.ttf", - "600": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbWaQfYSfpQj7IGQ.ttf", - "700": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbYKQfYSfpQj7IGQ.ttf", - "800": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbB6QfYSfpQj7IGQ.ttf", - "900": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbLqQfYSfpQj7IGQ.ttf", - "100italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-D3Iy3tYDvYGbGh.ttf", - "200italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-B3Ii3tYDvYGbGh.ttf", - "300italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-CpIi3tYDvYGbGh.ttf", - "italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-D3Ii3tYDvYGbGh.ttf", - "500italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-DFIi3tYDvYGbGh.ttf", - "600italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-ApJS3tYDvYGbGh.ttf", - "700italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-AQJS3tYDvYGbGh.ttf", - "800italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-B3JS3tYDvYGbGh.ttf", - "900italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-BeJS3tYDvYGbGh.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbh6MvYC3t.ttf" - }, - { - "family": "Ysabeau SC", - "variants": [ - "100", - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900" - ], - "subsets": [ - "cyrillic", - "cyrillic-ext", - "greek", - "latin", - "latin-ext", - "math", - "symbols", - "vietnamese" - ], - "version": "v4", - "lastModified": "2025-09-16", - "files": { - "100": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw98U1qEZ4EOmsT5.ttf", - "200": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw_8UlqEZ4EOmsT5.ttf", - "300": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw8iUlqEZ4EOmsT5.ttf", - "regular": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw98UlqEZ4EOmsT5.ttf", - "500": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw9OUlqEZ4EOmsT5.ttf", - "600": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw-iVVqEZ4EOmsT5.ttf", - "700": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw-bVVqEZ4EOmsT5.ttf", - "800": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw_8VVqEZ4EOmsT5.ttf", - "900": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw_VVVqEZ4EOmsT5.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw98UmqFbYU.ttf" - }, - { - "family": "Yuji Boku", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/yujiboku/v8/P5sAzZybeNzXsA9xj1Fkjb2r2dgvJA.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yujiboku/v8/P5sAzZybeNzXsA9xj1FUjLev.ttf" - }, - { - "family": "Yuji Hentaigana Akari", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/yujihentaiganaakari/v14/cY9bfiyVT0VB6QuhWKOrpr6z58lnb_zYFnLIRTzODYALaA.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yujihentaiganaakari/v14/cY9bfiyVT0VB6QuhWKOrpr6z58lnb_zYFnL4RDbK.ttf" - }, - { - "family": "Yuji Hentaigana Akebono", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v15", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/yujihentaiganaakebono/v15/EJRGQhkhRNwM-RtitGUwh930GU_f5KAlkuL0wQy9NKXRzrrF.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yujihentaiganaakebono/v15/EJRGQhkhRNwM-RtitGUwh930GU_f5KAlkuL0wTy8PqE.ttf" - }, - { - "family": "Yuji Mai", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/yujimai/v8/ZgNQjPxdJ7DEHrS0gC38hmHmNpCO.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yujimai/v8/ZgNQjPxdJ7DEHrS0gB39jGU.ttf" - }, - { - "family": "Yuji Syuku", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/yujisyuku/v8/BngNUXdTV3vO6Lw5ApOPqPfgwqiA-Rk.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yujisyuku/v8/BngNUXdTV3vO6Lw5ApOPmPbqxg.ttf" - }, - { - "family": "Yusei Magic", - "variants": [ - "regular" - ], - "subsets": [ - "japanese", - "latin", - "latin-ext" - ], - "version": "v16", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/yuseimagic/v16/yYLt0hbAyuCmoo5wlhPkpjHR-tdfcIT_.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/yuseimagic/v16/yYLt0hbAyuCmoo5wlhPkpgHQ8NM.ttf" - }, - { - "family": "ZCOOL KuaiLe", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-simplified", - "latin" - ], - "version": "v20", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2WpozzoXhC2g.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2mp4b3.ttf" - }, - { - "family": "ZCOOL QingKe HuangYou", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-simplified", - "latin" - ], - "version": "v16", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/zcoolqingkehuangyou/v16/2Eb5L_R5IXJEWhD3AOhSvFC554MOOahI4mRIi_28c8bHWA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zcoolqingkehuangyou/v16/2Eb5L_R5IXJEWhD3AOhSvFC554MOOahI4mR4ive4.ttf" - }, - { - "family": "ZCOOL XiaoWei", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-simplified", - "latin" - ], - "version": "v15", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/zcoolxiaowei/v15/i7dMIFFrTRywPpUVX9_RJyM1YFKQHwyVd3U.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zcoolxiaowei/v15/i7dMIFFrTRywPpUVX9_RJyM1UFOaGw.ttf" - }, - { - "family": "Zain", - "variants": [ - "200", - "300", - "300italic", - "regular", - "italic", - "700", - "800", - "900" - ], - "subsets": [ - "arabic", - "latin" - ], - "version": "v3", - "lastModified": "2025-05-30", - "files": { - "200": "https://fonts.gstatic.com/s/zain/v3/sykz-y9lm7soOBrstSq9-trEvlQ.ttf", - "300": "https://fonts.gstatic.com/s/zain/v3/sykz-y9lm7soOH7vtSq9-trEvlQ.ttf", - "300italic": "https://fonts.gstatic.com/s/zain/v3/sykx-y9lm7soMND1OSi3_vjBrlSILg.ttf", - "regular": "https://fonts.gstatic.com/s/zain/v3/syk8-y9lm7soANLHkSKW5tM.ttf", - "italic": "https://fonts.gstatic.com/s/zain/v3/syky-y9lm7soMNDNlQCT9tPdpw.ttf", - "700": "https://fonts.gstatic.com/s/zain/v3/sykz-y9lm7soOG7otSq9-trEvlQ.ttf", - "800": "https://fonts.gstatic.com/s/zain/v3/sykz-y9lm7soOHLrtSq9-trEvlQ.ttf", - "900": "https://fonts.gstatic.com/s/zain/v3/sykz-y9lm7soOFbqtSq9-trEvlQ.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zain/v3/syk8-y9lm7soMNPNlQ.ttf" - }, - { - "family": "Zalando Sans", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT-7PzkTYUMEgzhp.ttf", - "300": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT9lPzkTYUMEgzhp.ttf", - "regular": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT87PzkTYUMEgzhp.ttf", - "500": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT8JPzkTYUMEgzhp.ttf", - "600": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT_lODkTYUMEgzhp.ttf", - "700": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT_cODkTYUMEgzhp.ttf", - "800": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT-7ODkTYUMEgzhp.ttf", - "900": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT-SODkTYUMEgzhp.ttf", - "200italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfFFQa0cmhihp69o.ttf", - "300italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfI9Qa0cmhihp69o.ttf", - "italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfNFQa0cmhihp69o.ttf", - "500italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfONQa0cmhihp69o.ttf", - "600italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfA9Xa0cmhihp69o.ttf", - "700italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfDZXa0cmhihp69o.ttf", - "800italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfFFXa0cmhihp69o.ttf", - "900italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfHhXa0cmhihp69o.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT87PwkSa0c.ttf" - }, - { - "family": "Zalando Sans Expanded", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OPGIl41hcxm2zLI.ttf", - "300": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OC-Il41hcxm2zLI.ttf", - "regular": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OHGIl41hcxm2zLI.ttf", - "500": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OEOIl41hcxm2zLI.ttf", - "600": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OK-Pl41hcxm2zLI.ttf", - "700": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OJaPl41hcxm2zLI.ttf", - "800": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OPGPl41hcxm2zLI.ttf", - "900": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4ONiPl41hcxm2zLI.ttf", - "200italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnL_85rdzuz3LKaMA.ttf", - "300italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLIc5rdzuz3LKaMA.ttf", - "italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLf85rdzuz3LKaMA.ttf", - "500italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLTc5rdzuz3LKaMA.ttf", - "600italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLoclrdzuz3LKaMA.ttf", - "700italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLmMlrdzuz3LKaMA.ttf", - "800italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnL_8lrdzuz3LKaMA.ttf", - "900italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnL1slrdzuz3LKaMA.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OHGIp4xrdw.ttf" - }, - { - "family": "Zalando Sans SemiExpanded", - "variants": [ - "200", - "300", - "regular", - "500", - "600", - "700", - "800", - "900", - "200italic", - "300italic", - "italic", - "500italic", - "600italic", - "700italic", - "800italic", - "900italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v2", - "lastModified": "2025-09-16", - "files": { - "200": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkBbEnP9Fs7bOSO7.ttf", - "300": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkCFEnP9Fs7bOSO7.ttf", - "regular": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkDbEnP9Fs7bOSO7.ttf", - "500": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkDpEnP9Fs7bOSO7.ttf", - "600": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkAFFXP9Fs7bOSO7.ttf", - "700": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkA8FXP9Fs7bOSO7.ttf", - "800": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkBbFXP9Fs7bOSO7.ttf", - "900": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkByFXP9Fs7bOSO7.ttf", - "200italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTURu-HMr5PDO71Qs.ttf", - "300italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUcW-HMr5PDO71Qs.ttf", - "italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUZu-HMr5PDO71Qs.ttf", - "500italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUam-HMr5PDO71Qs.ttf", - "600italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUUW5HMr5PDO71Qs.ttf", - "700italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUXy5HMr5PDO71Qs.ttf", - "800italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTURu5HMr5PDO71Qs.ttf", - "900italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUTK5HMr5PDO71Qs.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkDbEkP8HMo.ttf" - }, - { - "family": "Zen Antique", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "greek", - "japanese", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/zenantique/v14/AYCPpXPnd91Ma_Zf-Ri2JXJq7PKP5Z_G.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zenantique/v14/AYCPpXPnd91Ma_Zf-Ri2JUJr5vY.ttf" - }, - { - "family": "Zen Antique Soft", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "greek", - "japanese", - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/zenantiquesoft/v14/DtV4JwqzSL1q_KwnEWMc_3xfgW6ihwBmkui5HNg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zenantiquesoft/v14/DtV4JwqzSL1q_KwnEWMc_3xfgW6itwFslg.ttf" - }, - { - "family": "Zen Dots", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v14", - "lastModified": "2025-09-05", - "files": { - "regular": "https://fonts.gstatic.com/s/zendots/v14/XRXX3ICfm00IGoesQeaETM_FcCIG.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zendots/v14/XRXX3ICfm00IGoesQdaFRss.ttf" - }, - { - "family": "Zen Kaku Gothic Antique", - "variants": [ - "300", - "regular", - "500", - "700", - "900" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLVKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22cM9TarWJtyZyGU.ttf", - "regular": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLQKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB21-g3RKjc4d7.ttf", - "500": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLVKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22dU9DarWJtyZyGU.ttf", - "700": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLVKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22cc8jarWJtyZyGU.ttf", - "900": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLVKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22ck8DarWJtyZyGU.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLQKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22-h1xY.ttf" - }, - { - "family": "Zen Kaku Gothic New", - "variants": [ - "300", - "regular", - "500", - "700", - "900" - ], - "subsets": [ - "cyrillic", - "japanese", - "latin", - "latin-ext" - ], - "version": "v18", - "lastModified": "2025-09-16", - "files": { - "300": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMVW2drQpDw0GjzrVNFf_valaDBcznOqpdKaWTSTGlMyd8.ttf", - "regular": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMYW2drQpDw0GjzrVNFf_valaDBcznOkjtiTWz5UGA.ttf", - "500": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMVW2drQpDw0GjzrVNFf_valaDBcznOqs9LaWTSTGlMyd8.ttf", - "700": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMVW2drQpDw0GjzrVNFf_valaDBcznOqodNaWTSTGlMyd8.ttf", - "900": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMVW2drQpDw0GjzrVNFf_valaDBcznOqr9PaWTSTGlMyd8.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMYW2drQpDw0GjzrVNFf_valaDBcznOojpoSQ.ttf" - }, - { - "family": "Zen Kurenaido", - "variants": [ - "regular" - ], - "subsets": [ - "cyrillic", - "greek", - "japanese", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/zenkurenaido/v19/3XFsEr0515BK2u6UUptu_gWJZfz22PRLd0U.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zenkurenaido/v19/3XFsEr0515BK2u6UUptu_gWJVf383A.ttf" - }, - { - "family": "Zen Loop", - "variants": [ - "regular", - "italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v11", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/zenloop/v11/h0GrssK16UsnJwHsEK9zqwzX5vOG.ttf", - "italic": "https://fonts.gstatic.com/s/zenloop/v11/h0GtssK16UsnJwHsEJ9xoQj14-OGJ0w.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zenloop/v11/h0GrssK16UsnJwHsEJ9yoQg.ttf" - }, - { - "family": "Zen Maru Gothic", - "variants": [ - "300", - "regular", - "500", - "700", - "900" - ], - "subsets": [ - "cyrillic", - "greek", - "japanese", - "latin", - "latin-ext" - ], - "version": "v19", - "lastModified": "2025-06-25", - "files": { - "300": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0XIpIxzW5b-RxT-6A8jWAtCp-cQWpCPJqa_ajlvw.ttf", - "regular": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0SIpIxzW5b-RxT-6A8jWAtCp-k7UJmNLGG9A.ttf", - "500": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0XIpIxzW5b-RxT-6A8jWAtCp-cGWtCPJqa_ajlvw.ttf", - "700": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0XIpIxzW5b-RxT-6A8jWAtCp-cUW1CPJqa_ajlvw.ttf", - "900": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0XIpIxzW5b-RxT-6A8jWAtCp-caW9CPJqa_ajlvw.ttf" - }, - "category": "sans-serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0SIpIxzW5b-RxT-6A8jWAtCp-U7Ehi.ttf" - }, - { - "family": "Zen Old Mincho", - "variants": [ - "regular", - "500", - "600", - "700", - "900" - ], - "subsets": [ - "cyrillic", - "greek", - "japanese", - "latin", - "latin-ext" - ], - "version": "v13", - "lastModified": "2025-09-02", - "files": { - "regular": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss0ApVaYytLwxTqcxfMyBveyYb3g31S2s8p.ttf", - "500": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss3ApVaYytLwxTqcxfMyBveyb4Dqlla8dMgPgBu.ttf", - "600": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss3ApVaYytLwxTqcxfMyBveyb4vrVla8dMgPgBu.ttf", - "700": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss3ApVaYytLwxTqcxfMyBveyb5LrFla8dMgPgBu.ttf", - "900": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss3ApVaYytLwxTqcxfMyBveyb5zrlla8dMgPgBu.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss0ApVaYytLwxTqcxfMyBveybb2iXk.ttf" - }, - { - "family": "Zen Tokyo Zoo", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v8", - "lastModified": "2025-09-10", - "files": { - "regular": "https://fonts.gstatic.com/s/zentokyozoo/v8/NGSyv5ffC0J_BK6aFNtr6sRv8a1uRWe9amg.ttf" - }, - "category": "display", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zentokyozoo/v8/NGSyv5ffC0J_BK6aFNtr6sRvwaxkQQ.ttf" - }, - { - "family": "Zeyada", - "variants": [ - "regular" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v22", - "lastModified": "2025-09-16", - "files": { - "regular": "https://fonts.gstatic.com/s/zeyada/v22/11hAGpPTxVPUbgZDNGatWKaZ3g.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zeyada/v22/11hAGpPTxVPUbgZzNWyp.ttf" - }, - { - "family": "Zhi Mang Xing", - "variants": [ - "regular" - ], - "subsets": [ - "chinese-simplified", - "latin" - ], - "version": "v19", - "lastModified": "2025-09-08", - "files": { - "regular": "https://fonts.gstatic.com/s/zhimangxing/v19/f0Xw0ey79sErYFtWQ9a2rq-g0actfektIJ0.ttf" - }, - "category": "handwriting", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zhimangxing/v19/f0Xw0ey79sErYFtWQ9a2rq-g4aYneQ.ttf" - }, - { - "family": "Zilla Slab", - "variants": [ - "300", - "300italic", - "regular", - "italic", - "500", - "500italic", - "600", - "600italic", - "700", - "700italic" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v12", - "lastModified": "2025-09-05", - "files": { - "300": "https://fonts.gstatic.com/s/zillaslab/v12/dFa5ZfeM_74wlPZtksIFYpEY2HSjWlhzbaw.ttf", - "300italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFanZfeM_74wlPZtksIFaj8CVHapXnp2fazkfg.ttf", - "regular": "https://fonts.gstatic.com/s/zillaslab/v12/dFa6ZfeM_74wlPZtksIFWj0w_HyIRlE.ttf", - "italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFa4ZfeM_74wlPZtksIFaj86-F6NVlFqdA.ttf", - "500": "https://fonts.gstatic.com/s/zillaslab/v12/dFa5ZfeM_74wlPZtksIFYskZ2HSjWlhzbaw.ttf", - "500italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFanZfeM_74wlPZtksIFaj8CDHepXnp2fazkfg.ttf", - "600": "https://fonts.gstatic.com/s/zillaslab/v12/dFa5ZfeM_74wlPZtksIFYuUe2HSjWlhzbaw.ttf", - "600italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFanZfeM_74wlPZtksIFaj8CIHCpXnp2fazkfg.ttf", - "700": "https://fonts.gstatic.com/s/zillaslab/v12/dFa5ZfeM_74wlPZtksIFYoEf2HSjWlhzbaw.ttf", - "700italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFanZfeM_74wlPZtksIFaj8CRHGpXnp2fazkfg.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zillaslab/v12/dFa6ZfeM_74wlPZtksIFajw6-A.ttf" - }, - { - "family": "Zilla Slab Highlight", - "variants": [ - "regular", - "700" - ], - "subsets": [ - "latin", - "latin-ext" - ], - "version": "v21", - "lastModified": "2025-09-11", - "files": { - "regular": "https://fonts.gstatic.com/s/zillaslabhighlight/v21/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxhtIY2DwSXlM.ttf", - "700": "https://fonts.gstatic.com/s/zillaslabhighlight/v21/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0TET4YmVF0Mb6.ttf" - }, - "category": "serif", - "kind": "webfonts#webfont", - "menu": "https://fonts.gstatic.com/s/zillaslabhighlight/v21/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitJaWQ.ttf" - } - ] -} + "kind": "webfonts#webfontList", + "items": [ + { + "family": "ABeeZee", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/abeezee/v23/esDR31xSG-6AGleN6tKukbcHCpE.ttf", + "italic": "https://fonts.gstatic.com/s/abeezee/v23/esDT31xSG-6AGleN2tCklZUCGpG-GQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/abeezee/v23/esDR31xSG-6AGleN2tOklQ.ttf" + }, + { + "family": "ADLaM Display", + "variants": [ + "regular" + ], + "subsets": [ + "adlam", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/adlamdisplay/v1/KFOhCnGXkPOLlhx6jD8_b1ZECsHYkYBPY3o.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/adlamdisplay/v1/KFOhCnGXkPOLlhx6jD8_b1ZEOsDSlQ.ttf" + }, + { + "family": "AR One Sans", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWn_9DW03no5mBF4.ttf", + "500": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWk39DW03no5mBF4.ttf", + "600": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWqH6DW03no5mBF4.ttf", + "700": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWpj6DW03no5mBF4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aronesans/v6/TUZezwhrmbFp0Srr_tH6fv6RcUejHO_u7GF5aXfv-U2QzBLF6gslWn_9PWw9mg.ttf" + }, + { + "family": "Abel", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE6VhLPJp6qGI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE2VlBOA.ttf" + }, + { + "family": "Abhaya Libre", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "sinhala" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/abhayalibre/v18/e3tmeuGtX-Co5MNzeAOqinEge0PWovdU4w.ttf", + "500": "https://fonts.gstatic.com/s/abhayalibre/v18/e3t5euGtX-Co5MNzeAOqinEYj2ryqtxI6oYtBA.ttf", + "600": "https://fonts.gstatic.com/s/abhayalibre/v18/e3t5euGtX-Co5MNzeAOqinEYo23yqtxI6oYtBA.ttf", + "700": "https://fonts.gstatic.com/s/abhayalibre/v18/e3t5euGtX-Co5MNzeAOqinEYx2zyqtxI6oYtBA.ttf", + "800": "https://fonts.gstatic.com/s/abhayalibre/v18/e3t5euGtX-Co5MNzeAOqinEY22_yqtxI6oYtBA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/abhayalibre/v18/e3tmeuGtX-Co5MNzeAOqinEQeknS.ttf" + }, + { + "family": "Aboreto", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/aboreto/v2/5DCXAKLhwDDQ4N8blKTeA2yuxSY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aboreto/v2/5DCXAKLhwDDQ4N8bpKXUBw.ttf" + }, + { + "family": "Abril Fatface", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/abrilfatface/v25/zOL64pLDlL1D99S8g8PtiKchm-BsjOLhZBY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/abrilfatface/v25/zOL64pLDlL1D99S8g8PtiKchq-FmiA.ttf" + }, + { + "family": "Abyssinica SIL", + "variants": [ + "regular" + ], + "subsets": [ + "ethiopic", + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/abyssinicasil/v9/oY1H8ezOqK7iI3rK_45WKoc8J6UZBFOVAXuI.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/abyssinicasil/v9/oY1H8ezOqK7iI3rK_45WKoc8J5UYDlc.ttf" + }, + { + "family": "Aclonica", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/aclonica/v25/K2FyfZJVlfNNSEBXGb7TCI6oBjLz.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aclonica/v25/K2FyfZJVlfNNSEBXGY7SAoo.ttf" + }, + { + "family": "Acme", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/acme/v27/RrQfboBx-C5_bx3Lb23lzLk.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/acme/v27/RrQfboBx-C5_XxzBaw.ttf" + }, + { + "family": "Actor", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/actor/v18/wEOzEBbCkc5cO3ekXygtUMIO.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/actor/v18/wEOzEBbCkc5cO0elVSw.ttf" + }, + { + "family": "Adamina", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/adamina/v22/j8_r6-DH1bjoc-dwu-reETl4Bno.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/adamina/v22/j8_r6-DH1bjoc-dwi-vUFQ.ttf" + }, + { + "family": "Advent Pro", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext" + ], + "version": "v33", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLQyJPTJoonw1aBA.ttf", + "200": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLwyNPTJoonw1aBA.ttf", + "300": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLHSNPTJoonw1aBA.ttf", + "regular": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLQyNPTJoonw1aBA.ttf", + "500": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLcSNPTJoonw1aBA.ttf", + "600": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLnSRPTJoonw1aBA.ttf", + "700": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLpCRPTJoonw1aBA.ttf", + "800": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLwyRPTJoonw1aBA.ttf", + "900": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpL6iRPTJoonw1aBA.ttf", + "100italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2CnDpAsvQhKBH4C.ttf", + "200italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2AnD5AsvQhKBH4C.ttf", + "300italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2D5D5AsvQhKBH4C.ttf", + "italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2CnD5AsvQhKBH4C.ttf", + "500italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2CVD5AsvQhKBH4C.ttf", + "600italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2B5CJAsvQhKBH4C.ttf", + "700italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2BACJAsvQhKBH4C.ttf", + "800italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2AnCJAsvQhKBH4C.ttf", + "900italic": "https://fonts.gstatic.com/s/adventpro/v33/V8mkoQfxVT4Dvddr_yOwhT-3Jr6w5kKOEbAVEvZiKGAr6BX29i1ei2AOCJAsvQhKBH4C.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/adventpro/v33/V8mqoQfxVT4Dvddr_yOwrzaFxV7JtdQgFqXdUAQrGp_zgX5sWCpLQyN_TZAs.ttf" + }, + { + "family": "Afacad", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfhXtWmA08mCgdfM.ttf", + "500": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfiftWmA08mCgdfM.ttf", + "600": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfsvqWmA08mCgdfM.ttf", + "700": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfvLqWmA08mCgdfM.ttf", + "italic": "https://fonts.gstatic.com/s/afacad/v3/6NUI8FKMIQOGaw6ahLYEvBjUVG5Ga92usiM-9kKlZfNfuw.ttf", + "500italic": "https://fonts.gstatic.com/s/afacad/v3/6NUI8FKMIQOGaw6ahLYEvBjUVG5Ga92ugCM-9kKlZfNfuw.ttf", + "600italic": "https://fonts.gstatic.com/s/afacad/v3/6NUI8FKMIQOGaw6ahLYEvBjUVG5Ga92ubCQ-9kKlZfNfuw.ttf", + "700italic": "https://fonts.gstatic.com/s/afacad/v3/6NUI8FKMIQOGaw6ahLYEvBjUVG5Ga92uVSQ-9kKlZfNfuw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/afacad/v3/6NUK8FKMIQOGaw6wjYT7ZHG_zsBBfhXtamE-9g.ttf" + }, + { + "family": "Afacad Flux", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsUwWZaRqQsJr67E.ttf", + "200": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edscwXZaRqQsJr67E.ttf", + "300": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsRIXZaRqQsJr67E.ttf", + "regular": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsUwXZaRqQsJr67E.ttf", + "500": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsX4XZaRqQsJr67E.ttf", + "600": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsZIQZaRqQsJr67E.ttf", + "700": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsasQZaRqQsJr67E.ttf", + "800": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edscwQZaRqQsJr67E.ttf", + "900": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edseUQZaRqQsJr67E.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/afacadflux/v4/9oRgNYYQryMlneUPykRmTuH4ET0fri4I5rJVT_CWHKDZnskVK5edsUwXVaVgRg.ttf" + }, + { + "family": "Agbalumo", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "ethiopic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/agbalumo/v6/55xvey5uMdT2N37KZcMFirl08KDJ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/agbalumo/v6/55xvey5uMdT2N37KZfMEgL0.ttf" + }, + { + "family": "Agdasima", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/agdasima/v5/PN_zRfyxp2f1fUCgAMg6rzjb_-Da.ttf", + "700": "https://fonts.gstatic.com/s/agdasima/v5/PN_0Rfyxp2f1fUCgAPCGgBzT1PzTz2Mi.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/agdasima/v5/PN_zRfyxp2f1fUCgAPg7pTw.ttf" + }, + { + "family": "Agu Display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/agudisplay/v3/iJWXBXKbbi6BeMC1_RX7qF_V5E7aciGRRWUwX4ftka9LM6y8Zg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/agudisplay/v3/iJWXBXKbbi6BeMC1_RX7qF_V5E7aciGRRWUwX4fdkKVP.ttf" + }, + { + "family": "Aguafina Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/aguafinascript/v24/If2QXTv_ZzSxGIO30LemWEOmt1bHqs4pgicOrg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aguafinascript/v24/If2QXTv_ZzSxGIO30LemWEOmt1b3q8Qt.ttf" + }, + { + "family": "Akatab", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "tifinagh" + ], + "version": "v9", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/akatab/v9/VuJwdNrK3Z7gqJEPWIz5NIh-YA.ttf", + "500": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE3rKXdPKNiaRpFvg.ttf", + "600": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE3gKLdPKNiaRpFvg.ttf", + "700": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE35KPdPKNiaRpFvg.ttf", + "800": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE3-KDdPKNiaRpFvg.ttf", + "900": "https://fonts.gstatic.com/s/akatab/v9/VuJzdNrK3Z7gqJE33KHdPKNiaRpFvg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/akatab/v9/VuJwdNrK3Z7gqJE_WYb9.ttf" + }, + { + "family": "Akaya Kanadaka", + "variants": [ + "regular" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/akayakanadaka/v18/N0bM2S5CPO5oOQqvazoRRb-8-PfRS5VBBSSF.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/akayakanadaka/v18/N0bM2S5CPO5oOQqvazoRRb-8-MfQQZE.ttf" + }, + { + "family": "Akaya Telivigala", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "telugu" + ], + "version": "v28", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/akayatelivigala/v28/lJwc-oo_iG9wXqU3rCTD395tp0uifdLdsIH0YH8.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/akayatelivigala/v28/lJwc-oo_iG9wXqU3rCTD395tp0uiTdPXtA.ttf" + }, + { + "family": "Akronim", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/akronim/v23/fdN-9sqWtWZZlHRp-gBxkFYN-a8.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/akronim/v23/fdN-9sqWtWZZlHRpygF7lA.ttf" + }, + { + "family": "Akshar", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSSgFy9CY94XsnPc.ttf", + "regular": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSXYFy9CY94XsnPc.ttf", + "500": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSUQFy9CY94XsnPc.ttf", + "600": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSagCy9CY94XsnPc.ttf", + "700": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSZECy9CY94XsnPc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/akshar/v17/Yq6I-LyHWTfz9rGoqDaUbHvhkAUsSXYF-9GS8w.ttf" + }, + { + "family": "Aladin", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/aladin/v26/ZgNSjPJFPrvJV5f16Sf4pGT2Ng.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aladin/v26/ZgNSjPJFPrvJV5fF6C38.ttf" + }, + { + "family": "Alan Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-11-20", + "files": { + "300": "https://fonts.gstatic.com/s/alansans/v5/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfIHoxyB1jBwiRr0.ttf", + "regular": "https://fonts.gstatic.com/s/alansans/v5/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfN_oxyB1jBwiRr0.ttf", + "500": "https://fonts.gstatic.com/s/alansans/v5/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfO3oxyB1jBwiRr0.ttf", + "600": "https://fonts.gstatic.com/s/alansans/v5/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfAHvxyB1jBwiRr0.ttf", + "700": "https://fonts.gstatic.com/s/alansans/v5/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfDjvxyB1jBwiRr0.ttf", + "800": "https://fonts.gstatic.com/s/alansans/v5/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfF_vxyB1jBwiRr0.ttf", + "900": "https://fonts.gstatic.com/s/alansans/v5/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfHbvxyB1jBwiRr0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alansans/v5/zOLt4pbDmq5Eu6ebjMSx4sywa339j__gfN_o9yF_iA.ttf" + }, + { + "family": "Alata", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/alata/v12/PbytFmztEwbIofe6xKcRQEOX.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alata/v12/PbytFmztEwbIoce7zqM.ttf" + }, + { + "family": "Alatsi", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/alatsi/v14/TK3iWkUJAxQ2nLNGHjUHte5fKg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alatsi/v14/TK3iWkUJAxQ2nLN2Hz8D.ttf" + }, + { + "family": "Albert Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHq5L_rI32TxAj1g.ttf", + "200": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHK5P_rI32TxAj1g.ttf", + "300": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSH9ZP_rI32TxAj1g.ttf", + "regular": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHq5P_rI32TxAj1g.ttf", + "500": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHmZP_rI32TxAj1g.ttf", + "600": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHdZT_rI32TxAj1g.ttf", + "700": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHTJT_rI32TxAj1g.ttf", + "800": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHK5T_rI32TxAj1g.ttf", + "900": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHApT_rI32TxAj1g.ttf", + "100italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9AX7ofybRUz1r5t.ttf", + "200italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9CX74fybRUz1r5t.ttf", + "300italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9BJ74fybRUz1r5t.ttf", + "italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9AX74fybRUz1r5t.ttf", + "500italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9Al74fybRUz1r5t.ttf", + "600italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9DJ6IfybRUz1r5t.ttf", + "700italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9Dw6IfybRUz1r5t.ttf", + "800italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9CX6IfybRUz1r5t.ttf", + "900italic": "https://fonts.gstatic.com/s/albertsans/v4/i7dfIFdwYjGaAMFtZd_QA1Zeelmy79QJ1HOSY9C-6IfybRUz1r5t.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/albertsans/v4/i7dZIFdwYjGaAMFtZd_QA3xXSKZqhr-TenSHq5PPrYfy.ttf" + }, + { + "family": "Aldrich", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/aldrich/v22/MCoTzAn-1s3IGyJMZaAS3pP5H_E.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aldrich/v22/MCoTzAn-1s3IGyJMVaEY2g.ttf" + }, + { + "family": "Alef", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "hebrew", + "latin" + ], + "version": "v24", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/alef/v24/FeVfS0NQpLYgrjJbC5FxxbU.ttf", + "700": "https://fonts.gstatic.com/s/alef/v24/FeVQS0NQpLYglo50L5la2bxii28.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alef/v24/FeVfS0NQpLYgnjNRDw.ttf" + }, + { + "family": "Alegreya", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v39", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNG9hUI_KCisSGVrw.ttf", + "500": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGxBUI_KCisSGVrw.ttf", + "600": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGKBII_KCisSGVrw.ttf", + "700": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGERII_KCisSGVrw.ttf", + "800": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGdhII_KCisSGVrw.ttf", + "900": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNGXxII_KCisSGVrw.ttf", + "italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlbgv6qmkySFr9V9.ttf", + "500italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlbSv6qmkySFr9V9.ttf", + "600italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlY-uKqmkySFr9V9.ttf", + "700italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlYHuKqmkySFr9V9.ttf", + "800italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlZguKqmkySFr9V9.ttf", + "900italic": "https://fonts.gstatic.com/s/alegreya/v39/4UaSrEBBsBhlBjvfkSLk3abBFkvpkARTPlZJuKqmkySFr9V9.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alegreya/v39/4UacrEBBsBhlBjvfkQjt71kZfyBzPgNG9hU4_aqm.ttf" + }, + { + "family": "Alegreya SC", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/alegreyasc/v26/taiOGmRtCJ62-O0HhNEa-a6o05E5abe_.ttf", + "italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiMGmRtCJ62-O0HhNEa-Z6q2ZUbbKe_DGs.ttf", + "500": "https://fonts.gstatic.com/s/alegreyasc/v26/taiTGmRtCJ62-O0HhNEa-ZZc-rUxQqu2FXKD.ttf", + "500italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiRGmRtCJ62-O0HhNEa-Z6q4WEySK-UEGKDBz4.ttf", + "700": "https://fonts.gstatic.com/s/alegreyasc/v26/taiTGmRtCJ62-O0HhNEa-ZYU_LUxQqu2FXKD.ttf", + "700italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiRGmRtCJ62-O0HhNEa-Z6q4Sk0SK-UEGKDBz4.ttf", + "800": "https://fonts.gstatic.com/s/alegreyasc/v26/taiTGmRtCJ62-O0HhNEa-ZYI_7UxQqu2FXKD.ttf", + "800italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiRGmRtCJ62-O0HhNEa-Z6q4TU3SK-UEGKDBz4.ttf", + "900": "https://fonts.gstatic.com/s/alegreyasc/v26/taiTGmRtCJ62-O0HhNEa-ZYs_rUxQqu2FXKD.ttf", + "900italic": "https://fonts.gstatic.com/s/alegreyasc/v26/taiRGmRtCJ62-O0HhNEa-Z6q4RE2SK-UEGKDBz4.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alegreyasc/v26/taiOGmRtCJ62-O0HhNEa-Z6p2ZU.ttf" + }, + { + "family": "Alegreya Sans", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUt9_-1phKLFgshYDvh6Vwt5TltuGdShm5bsg.ttf", + "100italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUv9_-1phKLFgshYDvh6Vwt7V9V3G1WpGtLsgu7.ttf", + "300": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5fFPmE18imdCqxI.ttf", + "300italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VFE92jkVHuxKiBA.ttf", + "regular": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUz9_-1phKLFgshYDvh6Vwt3V1nvEVXlm4.ttf", + "italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUt9_-1phKLFgshYDvh6Vwt7V9tuGdShm5bsg.ttf", + "500": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5alOmE18imdCqxI.ttf", + "500italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VTE52jkVHuxKiBA.ttf", + "700": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5eFImE18imdCqxI.ttf", + "700italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VBEh2jkVHuxKiBA.ttf", + "800": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5f1LmE18imdCqxI.ttf", + "800italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VGEt2jkVHuxKiBA.ttf", + "900": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUu9_-1phKLFgshYDvh6Vwt5dlKmE18imdCqxI.ttf", + "900italic": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUo9_-1phKLFgshYDvh6Vwt7V9VPEp2jkVHuxKiBA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alegreyasans/v26/5aUz9_-1phKLFgshYDvh6Vwt7VxtuA.ttf" + }, + { + "family": "Alegreya Sans SC", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGn4-RGJqfMvt7P8FUr0Q1j-Hf1Dipl8g5FPYtmMg.ttf", + "100italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGl4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdlgRBH452Mvds.ttf", + "300": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1DuJH0iRrMYJ_K-4.ttf", + "300italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdXiZhNaB6O-51OA.ttf", + "regular": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGh4-RGJqfMvt7P8FUr0Q1j-Hf1Nk5v9ixALYs.ttf", + "italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGn4-RGJqfMvt7P8FUr0Q1j-Hf1Bkxl8g5FPYtmMg.ttf", + "500": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1DrpG0iRrMYJ_K-4.ttf", + "500italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdBidhNaB6O-51OA.ttf", + "700": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1DvJA0iRrMYJ_K-4.ttf", + "700italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdTiFhNaB6O-51OA.ttf", + "800": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1Du5D0iRrMYJ_K-4.ttf", + "800italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxdUiJhNaB6O-51OA.ttf", + "900": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGm4-RGJqfMvt7P8FUr0Q1j-Hf1DspC0iRrMYJ_K-4.ttf", + "900italic": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGk4-RGJqfMvt7P8FUr0Q1j-Hf1BkxddiNhNaB6O-51OA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alegreyasanssc/v24/mtGh4-RGJqfMvt7P8FUr0Q1j-Hf1Bk9l8g.ttf" + }, + { + "family": "Aleo", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KJ3G2P9HI4qCBtJ.ttf", + "200": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KL3GmP9HI4qCBtJ.ttf", + "300": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KIpGmP9HI4qCBtJ.ttf", + "regular": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KJ3GmP9HI4qCBtJ.ttf", + "500": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KJFGmP9HI4qCBtJ.ttf", + "600": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KKpHWP9HI4qCBtJ.ttf", + "700": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KKQHWP9HI4qCBtJ.ttf", + "800": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KL3HWP9HI4qCBtJ.ttf", + "900": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KLeHWP9HI4qCBtJ.ttf", + "100italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WYu_FooIDQtJbok.ttf", + "200italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WQu-FooIDQtJbok.ttf", + "300italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WdW-FooIDQtJbok.ttf", + "italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WYu-FooIDQtJbok.ttf", + "500italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_Wbm-FooIDQtJbok.ttf", + "600italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WVW5FooIDQtJbok.ttf", + "700italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WWy5FooIDQtJbok.ttf", + "800italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WQu5FooIDQtJbok.ttf", + "900italic": "https://fonts.gstatic.com/s/aleo/v16/c4m81nF8G8_swAjT3z2dShrG-7e_WSK5FooIDQtJbok.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aleo/v16/c4m61nF8G8_s6gHhIOX0IYBo_KJ3GlP8Foo.ttf" + }, + { + "family": "Alex Brush", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/alexbrush/v23/SZc83FzrJKuqFbwMKk6EtUL57DtOmCc.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alexbrush/v23/SZc83FzrJKuqFbwMKk6EhUPz6A.ttf" + }, + { + "family": "Alexandria", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9r7T6bHHJ8BRq0b.ttf", + "200": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9p7TqbHHJ8BRq0b.ttf", + "300": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9qlTqbHHJ8BRq0b.ttf", + "regular": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9r7TqbHHJ8BRq0b.ttf", + "500": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9rJTqbHHJ8BRq0b.ttf", + "600": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9olSabHHJ8BRq0b.ttf", + "700": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9ocSabHHJ8BRq0b.ttf", + "800": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9p7SabHHJ8BRq0b.ttf", + "900": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9pSSabHHJ8BRq0b.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alexandria/v6/UMBCrPdDqW66y0Y2usFeQCH18mulUxBvI9r7TpbGFps.ttf" + }, + { + "family": "Alfa Slab One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/alfaslabone/v21/6NUQ8FmMKwSEKjnm5-4v-4Jh6dVretWvYmE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alfaslabone/v21/6NUQ8FmMKwSEKjnm5-4v-4Jh2dRhfg.ttf" + }, + { + "family": "Alice", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/alice/v21/OpNCnoEEmtHa6FcJpA_chzJ0.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alice/v21/OpNCnoEEmtHa6GcIrgs.ttf" + }, + { + "family": "Alike", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/alike/v22/HI_EiYEYI6BIoEjBSZXAQ4-d.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alike/v22/HI_EiYEYI6BIoHjAQ5E.ttf" + }, + { + "family": "Alike Angular", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v27", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/alikeangular/v27/3qTrojWunjGQtEBlIcwMbSoI3kM6bB7FKjE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alikeangular/v27/3qTrojWunjGQtEBlIcwMbSoI7kIwaA.ttf" + }, + { + "family": "Alkalami", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/alkalami/v8/zOL_4pfDmqRL95WXi5eLw8BMuvhH.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alkalami/v8/zOL_4pfDmqRL95WXi6eKycQ.ttf" + }, + { + "family": "Alkatra", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "bengali", + "devanagari", + "latin", + "latin-ext", + "oriya" + ], + "version": "v5", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48Medzngmu7cPrNDVemxE.ttf", + "500": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48MedzngUu7cPrNDVemxE.ttf", + "600": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48Medznj4vLcPrNDVemxE.ttf", + "700": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48MedznjBvLcPrNDVemxE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alkatra/v5/r05EGLZA5qhCYsyJbuChFuK48Medzngmu4cOptQ.ttf" + }, + { + "family": "Allan", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/allan/v26/ea8XadU7WuTxEtb2P9SF8nZE.ttf", + "700": "https://fonts.gstatic.com/s/allan/v26/ea8aadU7WuTxEu5KEPCN2WpNgEKU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/allan/v26/ea8XadU7WuTxEub3NdA.ttf" + }, + { + "family": "Allerta", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/allerta/v19/TwMO-IAHRlkbx940UnEdSQqO5uY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/allerta/v19/TwMO-IAHRlkbx940YnAXTQ.ttf" + }, + { + "family": "Allerta Stencil", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/allertastencil/v24/HTx0L209KT-LmIE9N7OR6eiycOeF-zz313DuvQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/allertastencil/v24/HTx0L209KT-LmIE9N7OR6eiycOe1-jbz.ttf" + }, + { + "family": "Allison", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/allison/v13/X7nl4b88AP2nkbvZOCaQ4MTgAgk.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/allison/v13/X7nl4b88AP2nkbvZCCea5A.ttf" + }, + { + "family": "Allura", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/allura/v23/9oRPNYsQpS4zjuAPjAIXPtrrGA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/allura/v23/9oRPNYsQpS4zjuA_jQgT.ttf" + }, + { + "family": "Almarai", + "variants": [ + "300", + "regular", + "700", + "800" + ], + "subsets": [ + "arabic", + "latin" + ], + "version": "v19", + "lastModified": "2025-09-02", + "files": { + "300": "https://fonts.gstatic.com/s/almarai/v19/tssoApxBaigK_hnnS_anhnicoq72sXg.ttf", + "regular": "https://fonts.gstatic.com/s/almarai/v19/tsstApxBaigK_hnnc1qPonC3vqc.ttf", + "700": "https://fonts.gstatic.com/s/almarai/v19/tssoApxBaigK_hnnS-aghnicoq72sXg.ttf", + "800": "https://fonts.gstatic.com/s/almarai/v19/tssoApxBaigK_hnnS_qjhnicoq72sXg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/almarai/v19/tsstApxBaigK_hnnQ1uFpg.ttf" + }, + { + "family": "Almendra", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/almendra/v28/H4ckBXKAlMnTn0CskyY6wr-wg763.ttf", + "italic": "https://fonts.gstatic.com/s/almendra/v28/H4ciBXKAlMnTn0CskxY4yLuShq63czE.ttf", + "700": "https://fonts.gstatic.com/s/almendra/v28/H4cjBXKAlMnTn0Cskx6G7Zu4qKK-aihq.ttf", + "700italic": "https://fonts.gstatic.com/s/almendra/v28/H4chBXKAlMnTn0CskxY48Ae9oqacbzhqDtg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/almendra/v28/H4ckBXKAlMnTn0CskxY7yLs.ttf" + }, + { + "family": "Almendra Display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v33", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/almendradisplay/v33/0FlPVOGWl1Sb4O3tETtADHRRlZhzXS_eTyer338.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/almendradisplay/v33/0FlPVOGWl1Sb4O3tETtADHRRlZhzbS7USw.ttf" + }, + { + "family": "Almendra SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v31", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/almendrasc/v31/Iure6Yx284eebowr7hbyTZZJprVA4XQ0.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/almendrasc/v31/Iure6Yx284eebowr7hbyTaZIrLE.ttf" + }, + { + "family": "Alumni Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9OO5QqFsJ3C8qng.ttf", + "200": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9uO9QqFsJ3C8qng.ttf", + "300": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9Zu9QqFsJ3C8qng.ttf", + "regular": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9OO9QqFsJ3C8qng.ttf", + "500": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9Cu9QqFsJ3C8qng.ttf", + "600": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd95uhQqFsJ3C8qng.ttf", + "700": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd93-hQqFsJ3C8qng.ttf", + "800": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9uOhQqFsJ3C8qng.ttf", + "900": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9kehQqFsJ3C8qng.ttf", + "100italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Ky46lEN_io6npfB.ttf", + "200italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kw461EN_io6npfB.ttf", + "300italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kzm61EN_io6npfB.ttf", + "italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Ky461EN_io6npfB.ttf", + "500italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8KyK61EN_io6npfB.ttf", + "600italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kxm7FEN_io6npfB.ttf", + "700italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kxf7FEN_io6npfB.ttf", + "800italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8Kw47FEN_io6npfB.ttf", + "900italic": "https://fonts.gstatic.com/s/alumnisans/v20/nwpBtKqkOwdO2aOIwhWudG-g9QMylBJAV3Bo8KwR7FEN_io6npfB.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alumnisans/v20/nwpHtKqkOwdO2aOIwhWudEWpx_zq_Xna-Xd9OO9gqVEN.ttf" + }, + { + "family": "Alumni Sans Collegiate One", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/alumnisanscollegiateone/v7/MQpB-XChK8G5CtmK_AuGxQrdNvPSXkn0RM-XqjWWhjdayDiPw2ta.ttf", + "italic": "https://fonts.gstatic.com/s/alumnisanscollegiateone/v7/MQpD-XChK8G5CtmK_AuGxQrdNvPSXkn0RM-XqjWWhgdYwjytxntaDFU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alumnisanscollegiateone/v7/MQpB-XChK8G5CtmK_AuGxQrdNvPSXkn0RM-XqjWWhgdbwjw.ttf" + }, + { + "family": "Alumni Sans Inline One", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/alumnisansinlineone/v7/RrQBbpJx9zZ3IXTBOASKp5gJAetBdaihcjbpD3AZcr7xbYw.ttf", + "italic": "https://fonts.gstatic.com/s/alumnisansinlineone/v7/RrQDbpJx9zZ3IXTBOASKp5gJAetBdaihcjbpP3ITdpz0fYxcrQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alumnisansinlineone/v7/RrQBbpJx9zZ3IXTBOASKp5gJAetBdaihcjbpP3ETdg.ttf" + }, + { + "family": "Alumni Sans Pinstripe", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/alumnisanspinstripe/v8/ZgNNjOFFPq_AUJD1umyS30W-Xub8zD1ObhezYrVIpcDA5w.ttf", + "italic": "https://fonts.gstatic.com/s/alumnisanspinstripe/v8/ZgNDjOFFPq_AUJD1umyS30W-Xub8zD1ObheDYL9Mh8XQ5_cY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alumnisanspinstripe/v8/ZgNNjOFFPq_AUJD1umyS30W-Xub8zD1ObheDY79M.ttf" + }, + { + "family": "Alumni Sans SC", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteaLxWgMKfbBlLNQ.ttf", + "200": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIte6L1WgMKfbBlLNQ.ttf", + "300": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteNr1WgMKfbBlLNQ.ttf", + "regular": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteaL1WgMKfbBlLNQ.ttf", + "500": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteWr1WgMKfbBlLNQ.ttf", + "600": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdItetrpWgMKfbBlLNQ.ttf", + "700": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdItej7pWgMKfbBlLNQ.ttf", + "800": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIte6LpWgMKfbBlLNQ.ttf", + "900": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdItewbpWgMKfbBlLNQ.ttf", + "100italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP6-wsibThxbNRJQ.ttf", + "200italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP4-w8ibThxbNRJQ.ttf", + "300italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP7gw8ibThxbNRJQ.ttf", + "italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP6-w8ibThxbNRJQ.ttf", + "500italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP6Mw8ibThxbNRJQ.ttf", + "600italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP5gxMibThxbNRJQ.ttf", + "700italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP5ZxMibThxbNRJQ.ttf", + "800italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP4-xMibThxbNRJQ.ttf", + "900italic": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GdYaxzVjArrOeNFYbCvkZ8C0UB-pPxss6d2oxLoP4XxMibThxbNRJQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/alumnisanssc/v3/Y4GfYaxzVjArrOeNFYbCvkZ8C28IyGwp26UHdIteaL1mgcib.ttf" + }, + { + "family": "Amarante", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/amarante/v30/xMQXuF1KTa6EvGx9bq-3C3rAmD-b.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/amarante/v30/xMQXuF1KTa6EvGx9bp-2AX4.ttf" + }, + { + "family": "Amaranth", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/amaranth/v19/KtkuALODe433f0j1zPnCF9GqwnzW.ttf", + "italic": "https://fonts.gstatic.com/s/amaranth/v19/KtkoALODe433f0j1zMnAHdWIx2zWD4I.ttf", + "700": "https://fonts.gstatic.com/s/amaranth/v19/KtkpALODe433f0j1zMF-OPWi6WDfFpuc.ttf", + "700italic": "https://fonts.gstatic.com/s/amaranth/v19/KtkrALODe433f0j1zMnAJWmn42T9E4ucRY8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/amaranth/v19/KtkuALODe433f0j1zMnDHdU.ttf" + }, + { + "family": "Amatic SC", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/amaticsc/v28/TUZyzwprpvBS1izr_vO0De6ecZQf1A.ttf", + "700": "https://fonts.gstatic.com/s/amaticsc/v28/TUZ3zwprpvBS1izr_vOMscG6eb8D3WTy-A.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/amaticsc/v28/TUZyzwprpvBS1izr_vOEDOSa.ttf" + }, + { + "family": "Amethysta", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/amethysta/v17/rP2Fp2K15kgb_F3ibfWIGDWCBl0O8Q.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/amethysta/v17/rP2Fp2K15kgb_F3ibfW4GT-G.ttf" + }, + { + "family": "Amiko", + "variants": [ + "regular", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/amiko/v15/WwkQxPq1DFK04tqlc17MMZgJ.ttf", + "600": "https://fonts.gstatic.com/s/amiko/v15/WwkdxPq1DFK04uJ9XXrEGoQAUco5.ttf", + "700": "https://fonts.gstatic.com/s/amiko/v15/WwkdxPq1DFK04uIZXHrEGoQAUco5.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/amiko/v15/WwkQxPq1DFK04uqkeVo.ttf" + }, + { + "family": "Amiri", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/amiri/v30/J7aRnpd8CGxBHqUpvrIw74NL.ttf", + "italic": "https://fonts.gstatic.com/s/amiri/v30/J7afnpd8CGxBHpUrtLYS6pNLAjk.ttf", + "700": "https://fonts.gstatic.com/s/amiri/v30/J7acnpd8CGxBHp2VkZY4xJ9CGyAa.ttf", + "700italic": "https://fonts.gstatic.com/s/amiri/v30/J7aanpd8CGxBHpUrjAo9zptgHjAavCA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/amiri/v30/J7aRnpd8CGxBHpUotLY.ttf" + }, + { + "family": "Amiri Quran", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin" + ], + "version": "v19", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/amiriquran/v19/_Xmo-Hk0rD6DbUL4_vH8Zq5t7Cycsu-2.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/amiriquran/v19/_Xmo-Hk0rD6DbUL4_vH8Zp5s5ig.ttf" + }, + { + "family": "Amita", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/amita/v20/HhyaU5si9Om7PQlvAfSKEZZL.ttf", + "700": "https://fonts.gstatic.com/s/amita/v20/HhyXU5si9Om7PTHTLtCCOopCTKkI.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/amita/v20/HhyaU5si9Om7PTluC_A.ttf" + }, + { + "family": "Anaheim", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h5sLqrFIkJQb7zU.ttf", + "500": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h5eLqrFIkJQb7zU.ttf", + "600": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h6yKarFIkJQb7zU.ttf", + "700": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h6LKarFIkJQb7zU.ttf", + "800": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h7sKarFIkJQb7zU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anaheim/v17/8vIX7w042Wp87g4Gy0_24JbCiPrl-h5sLprEKEY.ttf" + }, + { + "family": "Ancizar Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "greek", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMyzipBpIu30AZbUY.ttf", + "200": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy7ioBpIu30AZbUY.ttf", + "300": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy2aoBpIu30AZbUY.ttf", + "regular": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMyzioBpIu30AZbUY.ttf", + "500": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMywqoBpIu30AZbUY.ttf", + "600": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy-avBpIu30AZbUY.ttf", + "700": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy9-vBpIu30AZbUY.ttf", + "800": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy7ivBpIu30AZbUY.ttf", + "900": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMy5GvBpIu30AZbUY.ttf", + "100italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDr7tAk22IcfUZgBQ.ttf", + "200italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrbtEk22IcfUZgBQ.ttf", + "300italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrsNEk22IcfUZgBQ.ttf", + "italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDr7tEk22IcfUZgBQ.ttf", + "500italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDr3NEk22IcfUZgBQ.ttf", + "600italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrMNYk22IcfUZgBQ.ttf", + "700italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrCdYk22IcfUZgBQ.ttf", + "800italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrbtYk22IcfUZgBQ.ttf", + "900italic": "https://fonts.gstatic.com/s/ancizarsans/v8/fC11PYtHY2vX3wj8IbE7Pxe8VRLOpqx1999L3vDrR9Yk22IcfUZgBQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ancizarsans/v8/fC1zPYtHY2vX3wj8IbE7PxeWXCAxfsUebXFMyzioNpMk2w.ttf" + }, + { + "family": "Ancizar Serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "greek", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN2H_fAQtYfaQ_ao.ttf", + "regular": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN3Z_fAQtYfaQ_ao.ttf", + "500": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN3r_fAQtYfaQ_ao.ttf", + "600": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN0H-vAQtYfaQ_ao.ttf", + "700": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN0--vAQtYfaQ_ao.ttf", + "800": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN1Z-vAQtYfaQ_ao.ttf", + "900": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN1w-vAQtYfaQ_ao.ttf", + "300italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvkZTv4P4Ruao7Y0.ttf", + "italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvhhTv4P4Ruao7Y0.ttf", + "500italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvipTv4P4Ruao7Y0.ttf", + "600italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvsZUv4P4Ruao7Y0.ttf", + "700italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvv9Uv4P4Ruao7Y0.ttf", + "800italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvphUv4P4Ruao7Y0.ttf", + "900italic": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_nRfmxrmD9dEi_Qbtf91W17vrhxXPXDxqnV8gRvrFUv4P4Ruao7Y0.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ancizarserif/v8/PN_lRfmxrmD9dEi_Qbtf91W1xPPTOqu-ZIAJUN3Z_cARv4M.ttf" + }, + { + "family": "Andada Pro", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DPJBY8cFLzvIt2S.ttf", + "500": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DP7BY8cFLzvIt2S.ttf", + "600": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DMXAo8cFLzvIt2S.ttf", + "700": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DMuAo8cFLzvIt2S.ttf", + "800": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DNJAo8cFLzvIt2S.ttf", + "italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRmdfHrjNJ82Stjw.ttf", + "500italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRlVfHrjNJ82Stjw.ttf", + "600italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRrlYHrjNJ82Stjw.ttf", + "700italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRoBYHrjNJ82Stjw.ttf", + "800italic": "https://fonts.gstatic.com/s/andadapro/v24/HhyGU5Qi9-SuOEhPe4LtAIxwRrn9L22O2yYBRudYHrjNJ82Stjw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/andadapro/v24/HhyEU5Qi9-SuOEhPe4LtKoVCuWGURPcg3DPJBb8dHrg.ttf" + }, + { + "family": "Andika", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/andika/v27/mem_Ya6iyW-LwqgAbbwRWrwGVA.ttf", + "italic": "https://fonts.gstatic.com/s/andika/v27/mem9Ya6iyW-Lwqgwb7YVeLkWVNBt.ttf", + "700": "https://fonts.gstatic.com/s/andika/v27/mem8Ya6iyW-Lwqg40ZM1UpcaXcl0Aw.ttf", + "700italic": "https://fonts.gstatic.com/s/andika/v27/mem6Ya6iyW-Lwqgwb46pV50ef8xkA76a.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/andika/v27/mem_Ya6iyW-LwqgwbLYV.ttf" + }, + { + "family": "Anek Bangla", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "bengali", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofm9YIocg56yyvt0.ttf", + "200": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofu9ZIocg56yyvt0.ttf", + "300": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3OfjFZIocg56yyvt0.ttf", + "regular": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofm9ZIocg56yyvt0.ttf", + "500": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofl1ZIocg56yyvt0.ttf", + "600": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3OfrFeIocg56yyvt0.ttf", + "700": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3OfoheIocg56yyvt0.ttf", + "800": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofu9eIocg56yyvt0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anekbangla/v16/_gPW1R38qTExHg-17BhM6n66QhabMYB0fBKONtHhRSIUIre5mq3Ofm9ZEoYq4w.ttf" + }, + { + "family": "Anek Devanagari", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLDtk-9nFk0LjZ7E.ttf", + "200": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLBtku9nFk0LjZ7E.ttf", + "300": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLCzku9nFk0LjZ7E.ttf", + "regular": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLDtku9nFk0LjZ7E.ttf", + "500": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLDfku9nFk0LjZ7E.ttf", + "600": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLAzle9nFk0LjZ7E.ttf", + "700": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLAKle9nFk0LjZ7E.ttf", + "800": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLBtle9nFk0LjZ7E.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anekdevanagari/v17/jVyo7nP0CGrUsxB-QiRgw0NlLaVt_QUAkYxLRoCL23mlh20ZVHOMAWbgHLDtkt9mHEk.ttf" + }, + { + "family": "Anek Gujarati", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0F5G7w0KgB7Lm7g.ttf", + "200": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0l5C7w0KgB7Lm7g.ttf", + "300": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0SZC7w0KgB7Lm7g.ttf", + "regular": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0F5C7w0KgB7Lm7g.ttf", + "500": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0JZC7w0KgB7Lm7g.ttf", + "600": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0yZe7w0KgB7Lm7g.ttf", + "700": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-08Je7w0KgB7Lm7g.ttf", + "800": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0l5e7w0KgB7Lm7g.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anekgujarati/v17/l7g_bj5oysqknvkCo2T_8FuiIRBA7lncQUmbIBEtPKiYYQhRwyBxCD-0F5CLwkik.ttf" + }, + { + "family": "Anek Gurmukhi", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "gurmukhi", + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbd5ppXK41H6DjbA.ttf", + "200": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkb95tpXK41H6DjbA.ttf", + "300": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbKZtpXK41H6DjbA.ttf", + "regular": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbd5tpXK41H6DjbA.ttf", + "500": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbRZtpXK41H6DjbA.ttf", + "600": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbqZxpXK41H6DjbA.ttf", + "700": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbkJxpXK41H6DjbA.ttf", + "800": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkb95xpXK41H6DjbA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anekgurmukhi/v13/0QIAMXRO_YSkA0quVLY79JnHybfeEOrXCa9Dmd9Ql6a6R_vEMc5TaLkbd5tZXaQx.ttf" + }, + { + "family": "Anek Kannada", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dFDEAukVReA1oef.ttf", + "200": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dHDEQukVReA1oef.ttf", + "300": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dEdEQukVReA1oef.ttf", + "regular": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dFDEQukVReA1oef.ttf", + "500": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dFxEQukVReA1oef.ttf", + "600": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dGdFgukVReA1oef.ttf", + "700": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dGkFgukVReA1oef.ttf", + "800": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dHDFgukVReA1oef.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anekkannada/v15/raxcHiCNvNMKe1CKFsINYFlgkEIwGa8nL6ruWJg1j--h8pvBKSiw4dFDETulXxM.ttf" + }, + { + "family": "Anek Latin", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuR7EZKdClWL3kgw.ttf", + "200": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3Pux7AZKdClWL3kgw.ttf", + "300": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuGbAZKdClWL3kgw.ttf", + "regular": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuR7AZKdClWL3kgw.ttf", + "500": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PudbAZKdClWL3kgw.ttf", + "600": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PumbcZKdClWL3kgw.ttf", + "700": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuoLcZKdClWL3kgw.ttf", + "800": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3Pux7cZKdClWL3kgw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aneklatin/v11/co3pmWZulTRoU4a8dqrWiajBS5ByUkvdrluH-xWG5uJTY4x-L3PuR7ApKNqh.ttf" + }, + { + "family": "Anek Malayalam", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "malayalam" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUZu_HMr5PDO71Qs.ttf", + "200": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTURu-HMr5PDO71Qs.ttf", + "300": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUcW-HMr5PDO71Qs.ttf", + "regular": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUZu-HMr5PDO71Qs.ttf", + "500": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUam-HMr5PDO71Qs.ttf", + "600": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUUW5HMr5PDO71Qs.ttf", + "700": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUXy5HMr5PDO71Qs.ttf", + "800": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTURu5HMr5PDO71Qs.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anekmalayalam/v18/6qLjKZActRTs_mZAJUZWWkhke0nYa_vC8_Azq3-gP1SReZeOtqQuDVUTUZu-LMvzOA.ttf" + }, + { + "family": "Anek Odia", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "oriya" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnmZf63mXZAtm_es.ttf", + "200": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnkZfq3mXZAtm_es.ttf", + "300": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnnHfq3mXZAtm_es.ttf", + "regular": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnmZfq3mXZAtm_es.ttf", + "500": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnmrfq3mXZAtm_es.ttf", + "600": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnlHea3mXZAtm_es.ttf", + "700": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnl-ea3mXZAtm_es.ttf", + "800": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnkZea3mXZAtm_es.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anekodia/v17/TK3PWkoJARApz5UCd345tuevwwQX0CwsoYkAWgWYevAauivBUnmZfp3nV5Q.ttf" + }, + { + "family": "Anek Tamil", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNQiZ6q4v4oegjOQ.ttf", + "200": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNwid6q4v4oegjOQ.ttf", + "300": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNHCd6q4v4oegjOQ.ttf", + "regular": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNQid6q4v4oegjOQ.ttf", + "500": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNcCd6q4v4oegjOQ.ttf", + "600": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNnCB6q4v4oegjOQ.ttf", + "700": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNpSB6q4v4oegjOQ.ttf", + "800": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNwiB6q4v4oegjOQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anektamil/v18/XLYJIZH2bYJHGYtPGSbUB8JKTp-_9n55SsLHW0WZez6TjtkDu3uNQidKqoH8.ttf" + }, + { + "family": "Anek Telugu", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "telugu" + ], + "version": "v13", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13y-_oE2G2ep10_8.ttf", + "200": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i136--oE2G2ep10_8.ttf", + "300": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i133G-oE2G2ep10_8.ttf", + "regular": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13y--oE2G2ep10_8.ttf", + "500": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13x2-oE2G2ep10_8.ttf", + "600": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13_G5oE2G2ep10_8.ttf", + "700": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i138i5oE2G2ep10_8.ttf", + "800": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i136-5oE2G2ep10_8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anektelugu/v13/LhWLMVrUNvsddMtYGCx4FcVWOjlwE1WgXdoJ-5XHMl2DkooGK7i13y--kEyM3Q.ttf" + }, + { + "family": "Angkor", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v35", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/angkor/v35/H4cmBXyAlsPdnlb-8iw-4Lqggw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/angkor/v35/H4cmBXyAlsPdnlbO8yY6.ttf" + }, + { + "family": "Annapurna SIL", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/annapurnasil/v2/yYLv0hDY0f2iu9tPmRWtllid8NN9dZT_PZs.ttf", + "700": "https://fonts.gstatic.com/s/annapurnasil/v2/yYLy0hDY0f2iu9tPmRWtllidyG9SUZzUIZJ008A.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/annapurnasil/v2/yYLv0hDY0f2iu9tPmRWtllidwNJ3cQ.ttf" + }, + { + "family": "Annie Use Your Telescope", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/annieuseyourtelescope/v20/daaLSS4tI2qYYl3Jq9s_Hu74xwktnlKxH6osGVGjlDfB3UUVZA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/annieuseyourtelescope/v20/daaLSS4tI2qYYl3Jq9s_Hu74xwktnlKxH6osGVGTlT3F.ttf" + }, + { + "family": "Anonymous Pro", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "greek", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2Bp2a15UIB7Un-bOeISG3pLlw89CH98Ko.ttf", + "italic": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2fp2a15UIB7Un-bOeISG3pHl428AP44Kqr2Q.ttf", + "700": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2cp2a15UIB7Un-bOeISG3pFuAT0CnW7KOywKo.ttf", + "700italic": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2ap2a15UIB7Un-bOeISG3pHl4OTCzc6IG30KqB9Q.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anonymouspro/v22/rP2Bp2a15UIB7Un-bOeISG3pHl028A.ttf" + }, + { + "family": "Anta", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/anta/v1/gyBzhwQ3KsIyZFwxPFimIo0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anta/v1/gyBzhwQ3KsIyVF07OA.ttf" + }, + { + "family": "Antic", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/antic/v20/TuGfUVB8XY5DRaZLodgzydtk.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/antic/v20/TuGfUVB8XY5DRZZKq9w.ttf" + }, + { + "family": "Antic Didone", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/anticdidone/v17/RWmPoKKX6u8sp8fIWdnDKqDiqYsGBGBzCw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anticdidone/v17/RWmPoKKX6u8sp8fIWdnDKqDSqIEC.ttf" + }, + { + "family": "Antic Slab", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/anticslab/v17/bWt97fPFfRzkCa9Jlp6IWcJWXW5p5Qo.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anticslab/v17/bWt97fPFfRzkCa9Jlp6IacNcWQ.ttf" + }, + { + "family": "Anton", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/anton/v27/1Ptgg87LROyAm0K08i4gS7lu.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anton/v27/1Ptgg87LROyAm3K1-Co.ttf" + }, + { + "family": "Anton SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/antonsc/v1/4UaBrEBBsgltGn71sxLmzanB44N1.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/antonsc/v1/4UaBrEBBsgltGn71syLnx60.ttf" + }, + { + "family": "Antonio", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVxx8BtIY2DwSXlM.ttf", + "200": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVzx8RtIY2DwSXlM.ttf", + "300": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVwv8RtIY2DwSXlM.ttf", + "regular": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVxx8RtIY2DwSXlM.ttf", + "500": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVxD8RtIY2DwSXlM.ttf", + "600": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVyv9htIY2DwSXlM.ttf", + "700": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVyW9htIY2DwSXlM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/antonio/v22/gNMbW3NwSYq_9WD34ngK5F8vR8T0PVxx8StJaWQ.ttf" + }, + { + "family": "Anuphan", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCkY9A4kGmW927Gu.ttf", + "200": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCmY9Q4kGmW927Gu.ttf", + "300": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZClG9Q4kGmW927Gu.ttf", + "regular": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCkY9Q4kGmW927Gu.ttf", + "500": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCkq9Q4kGmW927Gu.ttf", + "600": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCnG8g4kGmW927Gu.ttf", + "700": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCn_8g4kGmW927Gu.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anuphan/v6/2sDBZGxYgY7LkLT0s2Yrm5UhuLoIZCkY9T4lEGE.ttf" + }, + { + "family": "Anybody", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4J12HPrsXD_nBPpQ.ttf", + "200": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JV2DPrsXD_nBPpQ.ttf", + "300": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JiWDPrsXD_nBPpQ.ttf", + "regular": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4J12DPrsXD_nBPpQ.ttf", + "500": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4J5WDPrsXD_nBPpQ.ttf", + "600": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JCWfPrsXD_nBPpQ.ttf", + "700": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JMGfPrsXD_nBPpQ.ttf", + "800": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JV2fPrsXD_nBPpQ.ttf", + "900": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4JfmfPrsXD_nBPpQ.ttf", + "100italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyMn7M_H3HVfpcHY.ttf", + "200italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyOn7c_H3HVfpcHY.ttf", + "300italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyN57c_H3HVfpcHY.ttf", + "italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyMn7c_H3HVfpcHY.ttf", + "500italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyMV7c_H3HVfpcHY.ttf", + "600italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyP56s_H3HVfpcHY.ttf", + "700italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyPA6s_H3HVfpcHY.ttf", + "800italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyOn6s_H3HVfpcHY.ttf", + "900italic": "https://fonts.gstatic.com/s/anybody/v13/VuJddNvK2Ib2ppdWSKTHN4GOiYrmuF7VpPiuQ9r6sTRMJGkcHyOO6s_H3HVfpcHY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/anybody/v13/VuJbdNvK2Ib2ppdWYq311GH32hxIv0sd5grncSUi2F_Wim4J12D_r8_H.ttf" + }, + { + "family": "Aoboshi One", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/aoboshione/v13/Gg8xN5kXaAXtHQrFxwl10ysLBmZX_UEg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aoboshione/v13/Gg8xN5kXaAXtHQrFxwl10xsKDGI.ttf" + }, + { + "family": "Arapey", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/arapey/v17/-W__XJn-UDDA2RC6Z9AcZkIzeg.ttf", + "italic": "https://fonts.gstatic.com/s/arapey/v17/-W_9XJn-UDDA2RCKZdoYREcjeo0k.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arapey/v17/-W__XJn-UDDA2RCKZtoY.ttf" + }, + { + "family": "Arbutus", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/arbutus/v30/NaPYcZ7dG_5J3poob9JtryO8fMU.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arbutus/v30/NaPYcZ7dG_5J3pooX9Nnqw.ttf" + }, + { + "family": "Arbutus Slab", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/arbutusslab/v17/oY1Z8e7OuLXkJGbXtr5ba7ZVa68dJlaFAQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arbutusslab/v17/oY1Z8e7OuLXkJGbXtr5ba7ZlaqUZ.ttf" + }, + { + "family": "Architects Daughter", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/architectsdaughter/v20/KtkxAKiDZI_td1Lkx62xHZHDtgO_Y-bvfY5q4szgE-Q.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/architectsdaughter/v20/KtkxAKiDZI_td1Lkx62xHZHDtgO_Y-bvTY9g5g.ttf" + }, + { + "family": "Archivo", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTNDJp8B1oJ0vyVQ.ttf", + "200": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTtDNp8B1oJ0vyVQ.ttf", + "300": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTajNp8B1oJ0vyVQ.ttf", + "regular": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTNDNp8B1oJ0vyVQ.ttf", + "500": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTBjNp8B1oJ0vyVQ.ttf", + "600": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTT6jRp8B1oJ0vyVQ.ttf", + "700": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTT0zRp8B1oJ0vyVQ.ttf", + "800": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTtDRp8B1oJ0vyVQ.ttf", + "900": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTnTRp8B1oJ0vyVQ.ttf", + "100italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HCBshdsBU7iVdxQ.ttf", + "200italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HABsxdsBU7iVdxQ.ttf", + "300italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HDfsxdsBU7iVdxQ.ttf", + "italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HCBsxdsBU7iVdxQ.ttf", + "500italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HCzsxdsBU7iVdxQ.ttf", + "600italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HBftBdsBU7iVdxQ.ttf", + "700italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HBmtBdsBU7iVdxQ.ttf", + "800italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HABtBdsBU7iVdxQ.ttf", + "900italic": "https://fonts.gstatic.com/s/archivo/v25/k3k8o8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYIRyOSVz60_PG_HAotBdsBU7iVdxQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/archivo/v25/k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTNDNZ8Rds.ttf" + }, + { + "family": "Archivo Black", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/archivoblack/v23/HTxqL289NzCGg4MzN6KJ7eW6OYuP_x7yx3A.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/archivoblack/v23/HTxqL289NzCGg4MzN6KJ7eW6CYqF-w.ttf" + }, + { + "family": "Archivo Narrow", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v35", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvLFGKpHOtFCQ76Q.ttf", + "500": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvHlGKpHOtFCQ76Q.ttf", + "600": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhv8laKpHOtFCQ76Q.ttf", + "700": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvy1aKpHOtFCQ76Q.ttf", + "italic": "https://fonts.gstatic.com/s/archivonarrow/v35/tss7ApVBdCYD5Q7hcxTE1ArZ0bb1k3JSLwe1hB965BJi53mpNiEr6T6Y.ttf", + "500italic": "https://fonts.gstatic.com/s/archivonarrow/v35/tss7ApVBdCYD5Q7hcxTE1ArZ0bb1k3JSLwe1hB965BJQ53mpNiEr6T6Y.ttf", + "600italic": "https://fonts.gstatic.com/s/archivonarrow/v35/tss7ApVBdCYD5Q7hcxTE1ArZ0bb1k3JSLwe1hB965BK84HmpNiEr6T6Y.ttf", + "700italic": "https://fonts.gstatic.com/s/archivonarrow/v35/tss7ApVBdCYD5Q7hcxTE1ArZ0bb1k3JSLwe1hB965BKF4HmpNiEr6T6Y.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/archivonarrow/v35/tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvLFG6pXmp.ttf" + }, + { + "family": "Are You Serious", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/areyouserious/v14/ll8kK2GVSSr-PtjQ5nONVcNn4306hT9nCGRayg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/areyouserious/v14/ll8kK2GVSSr-PtjQ5nONVcNn430KhDVj.ttf" + }, + { + "family": "Aref Ruqaa", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/arefruqaa/v26/WwkbxPW1E165rajQKDulEIAiVNo5xNY.ttf", + "700": "https://fonts.gstatic.com/s/arefruqaa/v26/WwkYxPW1E165rajQKDulKDwNcNIS2N_7Bdk.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arefruqaa/v26/WwkbxPW1E165rajQKDulIIEoUA.ttf" + }, + { + "family": "Aref Ruqaa Ink", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/arefruqaaink/v11/1q2fY5WOGUFlt84GTOkP6Kdx72ThVIGpgnxL.ttf", + "700": "https://fonts.gstatic.com/s/arefruqaaink/v11/1q2cY5WOGUFlt84GTOkP6Kdx71xde6WhqWBCyxWn.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arefruqaaink/v11/1q2fY5WOGUFlt84GTOkP6Kdx71TgXoU.ttf", + "colorCapabilities": [ + "COLRv1", + "SVG" + ] + }, + { + "family": "Arima", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "greek", + "greek-ext", + "latin", + "latin-ext", + "malayalam", + "tamil", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1YTE-pQGOyYw2fw.ttf", + "200": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX14TA-pQGOyYw2fw.ttf", + "300": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1PzA-pQGOyYw2fw.ttf", + "regular": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1YTA-pQGOyYw2fw.ttf", + "500": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1UzA-pQGOyYw2fw.ttf", + "600": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1vzc-pQGOyYw2fw.ttf", + "700": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1hjc-pQGOyYw2fw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arima/v7/neIWzCqmt4Aup_qE1nFWqxI1RZX1YTAOpAuK.ttf" + }, + { + "family": "Arimo", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v35", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk37cxsBxDAVQI4aA.ttf", + "500": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk338xsBxDAVQI4aA.ttf", + "600": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk3M8tsBxDAVQI4aA.ttf", + "700": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk3CstsBxDAVQI4aA.ttf", + "italic": "https://fonts.gstatic.com/s/arimo/v35/P5sdzZCDf9_T_10c3i9MeUcyat4iJY-ERBrEdwcoaKww.ttf", + "500italic": "https://fonts.gstatic.com/s/arimo/v35/P5sdzZCDf9_T_10c3i9MeUcyat4iJY-2RBrEdwcoaKww.ttf", + "600italic": "https://fonts.gstatic.com/s/arimo/v35/P5sdzZCDf9_T_10c3i9MeUcyat4iJY9aQxrEdwcoaKww.ttf", + "700italic": "https://fonts.gstatic.com/s/arimo/v35/P5sdzZCDf9_T_10c3i9MeUcyat4iJY9jQxrEdwcoaKww.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arimo/v35/P5sfzZCDf9_T_3cV7NCUECyoxNk37cxcBhrE.ttf" + }, + { + "family": "Arizonia", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/arizonia/v23/neIIzCemt4A5qa7mv6WGHK06UY30.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arizonia/v23/neIIzCemt4A5qa7mv5WHFqk.ttf" + }, + { + "family": "Armata", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/armata/v21/gokvH63_HV5jQ-E9lD53Q2u_mQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/armata/v21/gokvH63_HV5jQ-ENlTRz.ttf" + }, + { + "family": "Arsenal", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/arsenal/v13/wXKrE3kQtZQ4pF3D11_WAewrhXY.ttf", + "italic": "https://fonts.gstatic.com/s/arsenal/v13/wXKpE3kQtZQ4pF3D513cBc4ulXYrtA.ttf", + "700": "https://fonts.gstatic.com/s/arsenal/v13/wXKuE3kQtZQ4pF3D7-P5JeQAmX8yrdk.ttf", + "700italic": "https://fonts.gstatic.com/s/arsenal/v13/wXKsE3kQtZQ4pF3D513kueEKnV03vdnKjw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arsenal/v13/wXKrE3kQtZQ4pF3D517cBQ.ttf" + }, + { + "family": "Arsenal SC", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/arsenalsc/v1/x3dlckLHea6e5BEtsfxiXNossybsHQI.ttf", + "italic": "https://fonts.gstatic.com/s/arsenalsc/v1/x3dnckLHea6e5BEtsfxibNgmtwTpDQIrGg.ttf", + "700": "https://fonts.gstatic.com/s/arsenalsc/v1/x3dmckLHea6e5BEtsfxiZGYDly7HAQsyA2Y.ttf", + "700italic": "https://fonts.gstatic.com/s/arsenalsc/v1/x3d4ckLHea6e5BEtsfxibNgeCyvNBSk3E2YljQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arsenalsc/v1/x3dlckLHea6e5BEtsfxibNsmtw.ttf" + }, + { + "family": "Artifika", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/artifika/v22/VEMyRoxzronptCuxu6Wt5jDtreOL.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/artifika/v22/VEMyRoxzronptCuxu5Ws7DQ.ttf" + }, + { + "family": "Arvo", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/arvo/v23/tDbD2oWUg0MKmSAa7Lzr7vs.ttf", + "italic": "https://fonts.gstatic.com/s/arvo/v23/tDbN2oWUg0MKqSIQ6J7u_vvijQ.ttf", + "700": "https://fonts.gstatic.com/s/arvo/v23/tDbM2oWUg0MKoZw1yLTA8vL7lAE.ttf", + "700italic": "https://fonts.gstatic.com/s/arvo/v23/tDbO2oWUg0MKqSIoVLHK9tD-hAHkGg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arvo/v23/tDbD2oWUg0MKqSEQ6A.ttf" + }, + { + "family": "Arya", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/arya/v21/ga6CawNG-HJd9Ub1-beqdFE.ttf", + "700": "https://fonts.gstatic.com/s/arya/v21/ga6NawNG-HJdzfra3b-BaFg3dRE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/arya/v21/ga6CawNG-HJdxUf__Q.ttf" + }, + { + "family": "Asap", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v34", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYkqQsLmOXoA7Glw.ttf", + "200": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYEqUsLmOXoA7Glw.ttf", + "300": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYzKUsLmOXoA7Glw.ttf", + "regular": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYkqUsLmOXoA7Glw.ttf", + "500": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYoKUsLmOXoA7Glw.ttf", + "600": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYTKIsLmOXoA7Glw.ttf", + "700": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYdaIsLmOXoA7Glw.ttf", + "800": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYEqIsLmOXoA7Glw.ttf", + "900": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYO6IsLmOXoA7Glw.ttf", + "100italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWubEbGmTggvWl0Qn.ttf", + "200italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuZEbWmTggvWl0Qn.ttf", + "300italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuaabWmTggvWl0Qn.ttf", + "italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWubEbWmTggvWl0Qn.ttf", + "500italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWub2bWmTggvWl0Qn.ttf", + "600italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuYaammTggvWl0Qn.ttf", + "700italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuYjammTggvWl0Qn.ttf", + "800italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuZEammTggvWl0Qn.ttf", + "900italic": "https://fonts.gstatic.com/s/asap/v34/KFOMCniXp96ayz4E7kSn66aGLdTylUAMQXC89YmC2DPNWuZtammTggvWl0Qn.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/asap/v34/KFOOCniXp96a4Tc2DaTeuDAoKsE617JFc49knOIYdjTYkqUcL2mT.ttf" + }, + { + "family": "Asap Condensed", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-02", + "files": { + "200": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO9DSWlEgGqgp-pO.ttf", + "200italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUIFFim6CovpOkXA.ttf", + "300": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO8nSmlEgGqgp-pO.ttf", + "300italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUOVGim6CovpOkXA.ttf", + "regular": "https://fonts.gstatic.com/s/asapcondensed/v18/pxidypY1o9NHyXh3WvSbGSggdNeLYk1Mq3ap.ttf", + "italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxifypY1o9NHyXh3WvSbGSggdOeJaElurmapvvM.ttf", + "500": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO9_S2lEgGqgp-pO.ttf", + "500italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUL1Him6CovpOkXA.ttf", + "600": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO9TTGlEgGqgp-pO.ttf", + "600italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUJFAim6CovpOkXA.ttf", + "700": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO83TWlEgGqgp-pO.ttf", + "700italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUPVBim6CovpOkXA.ttf", + "800": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO8rTmlEgGqgp-pO.ttf", + "800italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUOlCim6CovpOkXA.ttf", + "900": "https://fonts.gstatic.com/s/asapcondensed/v18/pxieypY1o9NHyXh3WvSbGSggdO8PT2lEgGqgp-pO.ttf", + "900italic": "https://fonts.gstatic.com/s/asapcondensed/v18/pxiYypY1o9NHyXh3WvSbGSggdOeJUM1Dim6CovpOkXA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/asapcondensed/v18/pxidypY1o9NHyXh3WvSbGSggdOeKaEk.ttf" + }, + { + "family": "Asar", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/asar/v24/sZlLdRyI6TBIXkYQDLlTW6E.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/asar/v24/sZlLdRyI6TBIbkcaCA.ttf" + }, + { + "family": "Asimovian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/asimovian/v2/oY1c8evOub78P2XN94MXCv5xY4QBLw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/asimovian/v2/oY1c8evOub78P2XN94MnC_R1.ttf" + }, + { + "family": "Asset", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v30", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/asset/v30/SLXGc1na-mM4cWImRJqExst1.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/asset/v30/SLXGc1na-mM4cVInTp4.ttf" + }, + { + "family": "Assistant", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtmZnEGGf3qGuvM4.ttf", + "300": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtrhnEGGf3qGuvM4.ttf", + "regular": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtuZnEGGf3qGuvM4.ttf", + "500": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQttRnEGGf3qGuvM4.ttf", + "600": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtjhgEGGf3qGuvM4.ttf", + "700": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtgFgEGGf3qGuvM4.ttf", + "800": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtmZgEGGf3qGuvM4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/assistant/v24/2sDPZGJYnIjSi6H75xkZZE1I0yCmYzzQtuZnIGCV2g.ttf" + }, + { + "family": "Asta Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v3", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo6r_mVnvqYRoVr0.ttf", + "regular": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo_T_mVnvqYRoVr0.ttf", + "500": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo8b_mVnvqYRoVr0.ttf", + "600": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveoyr4mVnvqYRoVr0.ttf", + "700": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveoxP4mVnvqYRoVr0.ttf", + "800": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo3T4mVnvqYRoVr0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/astasans/v3/XoH32Y74XaWovvhMb0c3tN_dRqdT9zveo_T_qVjlrQ.ttf" + }, + { + "family": "Astloch", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/astloch/v27/TuGRUVJ8QI5GSeUjq9wRzMtkH1Q.ttf", + "700": "https://fonts.gstatic.com/s/astloch/v27/TuGUUVJ8QI5GSeUjk2A-6MNPA10xLMQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/astloch/v27/TuGRUVJ8QI5GSeUjm90byA.ttf" + }, + { + "family": "Asul", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/asul/v22/VuJ-dNjKxYr46fMFXK78JIg.ttf", + "700": "https://fonts.gstatic.com/s/asul/v22/VuJxdNjKxYr40U8qeKbXOIFneRo.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/asul/v22/VuJ-dNjKxYr42fIPWA.ttf" + }, + { + "family": "Athiti", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wAxDNyAv2-C99ycg.ttf", + "300": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wAoDByAv2-C99ycg.ttf", + "regular": "https://fonts.gstatic.com/s/athiti/v14/pe0vMISdLIZIv1w4DBhWCtaiAg.ttf", + "500": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wA-DFyAv2-C99ycg.ttf", + "600": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wA1DZyAv2-C99ycg.ttf", + "700": "https://fonts.gstatic.com/s/athiti/v14/pe0sMISdLIZIv1wAsDdyAv2-C99ycg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/athiti/v14/pe0vMISdLIZIv1wIDRJS.ttf" + }, + { + "family": "Atkinson Hyperlegible", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt23C1KxNDXMspQ1lPyU89-1h6ONRlW45GE5ZgpewSSbQ.ttf", + "italic": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt43C1KxNDXMspQ1lPyU89-1h6ONRlW45G055ItWQGCbUWn.ttf", + "700": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt73C1KxNDXMspQ1lPyU89-1h6ONRlW45G8WbcNcy-OZFy-FA.ttf", + "700italic": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt93C1KxNDXMspQ1lPyU89-1h6ONRlW45G056qRdiWKRlmuFH24.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/atkinsonhyperlegible/v12/9Bt23C1KxNDXMspQ1lPyU89-1h6ONRlW45G05JIt.ttf" + }, + { + "family": "Atkinson Hyperlegible Mono", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZnNeiDSkb2qzelw.ttf", + "300": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZQteiDSkb2qzelw.ttf", + "regular": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZHNeiDSkb2qzelw.ttf", + "500": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZLteiDSkb2qzelw.ttf", + "600": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZwtCiDSkb2qzelw.ttf", + "700": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZ-9CiDSkb2qzelw.ttf", + "800": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZnNCiDSkb2qzelw.ttf", + "200italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JTKTiMf-KnOlxYs.ttf", + "300italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JQUTiMf-KnOlxYs.ttf", + "italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JRKTiMf-KnOlxYs.ttf", + "500italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JR4TiMf-KnOlxYs.ttf", + "600italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JSUSSMf-KnOlxYs.ttf", + "700italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JStSSMf-KnOlxYs.ttf", + "800italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssPAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiwKonlKh6PW-UyGM1JTKSSMf-KnOlxYs.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/atkinsonhyperlegiblemono/v8/tssNAoFBci4C4gvhPXrt3wjT1MqSzhA4t7IIcncBiyihrK15gZ4k_SaZHNeSDCMf.ttf" + }, + { + "family": "Atkinson Hyperlegible Next", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3bLQhtNl93TwPEQ.ttf", + "300": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3srQhtNl93TwPEQ.ttf", + "regular": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW37LQhtNl93TwPEQ.ttf", + "500": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW33rQhtNl93TwPEQ.ttf", + "600": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3MrMhtNl93TwPEQ.ttf", + "700": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3C7MhtNl93TwPEQ.ttf", + "800": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW3bLMhtNl93TwPEQ.ttf", + "200italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPdJ99N5_zkfEYNP.ttf", + "300italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPeX99N5_zkfEYNP.ttf", + "italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPfJ99N5_zkfEYNP.ttf", + "500italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPf799N5_zkfEYNP.ttf", + "600italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPcX8NN5_zkfEYNP.ttf", + "700italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPcu8NN5_zkfEYNP.ttf", + "800italic": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP6cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiMhXSWUJ7iyGKiJPdJ8NN5_zkfEYNP.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaP4cYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGscKFt4tOOfV4ZmW37LQRtdN5.ttf" + }, + { + "family": "Atma", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "bengali", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/atma/v19/uK_z4rqWc-Eoo8JzKjc9PvedRkM.ttf", + "regular": "https://fonts.gstatic.com/s/atma/v19/uK_84rqWc-Eom25bDj8WIv4.ttf", + "500": "https://fonts.gstatic.com/s/atma/v19/uK_z4rqWc-Eoo5pyKjc9PvedRkM.ttf", + "600": "https://fonts.gstatic.com/s/atma/v19/uK_z4rqWc-Eoo7Z1Kjc9PvedRkM.ttf", + "700": "https://fonts.gstatic.com/s/atma/v19/uK_z4rqWc-Eoo9J0Kjc9PvedRkM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/atma/v19/uK_84rqWc-Eoq29RCg.ttf" + }, + { + "family": "Atomic Age", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/atomicage/v29/f0Xz0eug6sdmRFkYZZGL58Ht9a8GYeA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/atomicage/v29/f0Xz0eug6sdmRFkYZZGL18Dn8Q.ttf" + }, + { + "family": "Aubrey", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v29", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/aubrey/v29/q5uGsou7NPBw-p7vugNsCxVEgA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/aubrey/v29/q5uGsou7NPBw-p7fuwlo.ttf" + }, + { + "family": "Audiowide", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/audiowide/v22/l7gdbjpo0cum0ckerWCtkQXPExpQBw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/audiowide/v22/l7gdbjpo0cum0ckerWCdkA_L.ttf" + }, + { + "family": "Autour One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/autourone/v25/UqyVK80cP25l3fJgbdfbk5lWVscxdKE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/autourone/v25/UqyVK80cP25l3fJgbdfbo5hcUg.ttf" + }, + { + "family": "Average", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/average/v19/fC1hPYBHe23MxA7rIeJwVWytTyk.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/average/v19/fC1hPYBHe23MxA7rEeN6UQ.ttf" + }, + { + "family": "Average Sans", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/averagesans/v17/1Ptpg8fLXP2dlAXR-HlJJNJPBdqazVoK4A.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/averagesans/v17/1Ptpg8fLXP2dlAXR-HlJJNJ_BNCe.ttf" + }, + { + "family": "Averia Gruesa Libre", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/averiagruesalibre/v22/NGSov4nEGEktOaDRKsY-1dhh8eEtIx3ZUmmJw0SLRA8.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/averiagruesalibre/v22/NGSov4nEGEktOaDRKsY-1dhh8eEtIx3ZYmiDxw.ttf" + }, + { + "family": "Averia Libre", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-05-30", + "files": { + "300": "https://fonts.gstatic.com/s/averialibre/v16/2V0FKIcMGZEnV6xygz7eNjEarovtb07t-pQgTw.ttf", + "300italic": "https://fonts.gstatic.com/s/averialibre/v16/2V0HKIcMGZEnV6xygz7eNjESAJFhbUTp2JEwT4Sk.ttf", + "regular": "https://fonts.gstatic.com/s/averialibre/v16/2V0aKIcMGZEnV6xygz7eNjEiAqPJZ2Xx8w.ttf", + "italic": "https://fonts.gstatic.com/s/averialibre/v16/2V0EKIcMGZEnV6xygz7eNjESAKnNRWDh8405.ttf", + "700": "https://fonts.gstatic.com/s/averialibre/v16/2V0FKIcMGZEnV6xygz7eNjEavoztb07t-pQgTw.ttf", + "700italic": "https://fonts.gstatic.com/s/averialibre/v16/2V0HKIcMGZEnV6xygz7eNjESAJFxakTp2JEwT4Sk.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/averialibre/v16/2V0aKIcMGZEnV6xygz7eNjESA6nN.ttf" + }, + { + "family": "Averia Sans Libre", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-06-02", + "files": { + "300": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6SaxZG_G5OvCf_rt7FH3B6BHLMEd3lMKcQJZP1LmD9.ttf", + "300italic": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6caxZG_G5OvCf_rt7FH3B6BHLMEdVLKisSL5fXK3D9qtg.ttf", + "regular": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6XaxZG_G5OvCf_rt7FH3B6BHLMEeVJGIMYDo_8.ttf", + "italic": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6RaxZG_G5OvCf_rt7FH3B6BHLMEdVLEoc6C5_8N3k.ttf", + "700": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6SaxZG_G5OvCf_rt7FH3B6BHLMEd31N6cQJZP1LmD9.ttf", + "700italic": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6caxZG_G5OvCf_rt7FH3B6BHLMEdVLKjsVL5fXK3D9qtg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/averiasanslibre/v20/ga6XaxZG_G5OvCf_rt7FH3B6BHLMEdVIEoc.ttf" + }, + { + "family": "Averia Serif Libre", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-06-02", + "files": { + "300": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIVzD2ms4wxr6GvjeD0X88SHPyX2xYGCSmqwacqdrKvbQ.ttf", + "300italic": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIbzD2ms4wxr6GvjeD0X88SHPyX2xYOpzMmw60uVLe_bXHq.ttf", + "regular": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIWzD2ms4wxr6GvjeD0X88SHPyX2xY-pQGOyYw2fw.ttf", + "italic": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIUzD2ms4wxr6GvjeD0X88SHPyX2xYOpwuK64kmf6u2.ttf", + "700": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIVzD2ms4wxr6GvjeD0X88SHPyX2xYGGS6qwacqdrKvbQ.ttf", + "700italic": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIbzD2ms4wxr6GvjeD0X88SHPyX2xYOpzM2xK0uVLe_bXHq.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/averiaseriflibre/v19/neIWzD2ms4wxr6GvjeD0X88SHPyX2xYOpAuK.ttf" + }, + { + "family": "Azeret Mono", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfnPRh0raa-5s3AA.ttf", + "200": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfHPVh0raa-5s3AA.ttf", + "300": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfwvVh0raa-5s3AA.ttf", + "regular": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfnPVh0raa-5s3AA.ttf", + "500": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfrvVh0raa-5s3AA.ttf", + "600": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfQvJh0raa-5s3AA.ttf", + "700": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfe_Jh0raa-5s3AA.ttf", + "800": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfHPJh0raa-5s3AA.ttf", + "900": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfNfJh0raa-5s3AA.ttf", + "100italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLaJkLye2Z4nAN7J.ttf", + "200italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLYJkbye2Z4nAN7J.ttf", + "300italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLbXkbye2Z4nAN7J.ttf", + "italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLaJkbye2Z4nAN7J.ttf", + "500italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLa7kbye2Z4nAN7J.ttf", + "600italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLZXlrye2Z4nAN7J.ttf", + "700italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLZulrye2Z4nAN7J.ttf", + "800italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLYJlrye2Z4nAN7J.ttf", + "900italic": "https://fonts.gstatic.com/s/azeretmono/v21/3XF_ErsiyJsY9O_Gepph-HHkf_fUKCzX1EOKVLYglrye2Z4nAN7J.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/azeretmono/v21/3XF5ErsiyJsY9O_Gepph-FvtTQgMQUdNekSfnPVR07ye.ttf" + }, + { + "family": "B612", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/b612/v13/3JnySDDxiSz32jm4GDigUXw.ttf", + "italic": "https://fonts.gstatic.com/s/b612/v13/3Jn8SDDxiSz36juyHBqlQXwdVw.ttf", + "700": "https://fonts.gstatic.com/s/b612/v13/3Jn9SDDxiSz34oWXPDCLTXUETuE.ttf", + "700italic": "https://fonts.gstatic.com/s/b612/v13/3Jn_SDDxiSz36juKoDWBSVcBXuFb0Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/b612/v13/3JnySDDxiSz36jiyHA.ttf" + }, + { + "family": "B612 Mono", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/b612mono/v16/kmK_Zq85QVWbN1eW6lJl1wTcquRTtg.ttf", + "italic": "https://fonts.gstatic.com/s/b612mono/v16/kmK5Zq85QVWbN1eW6lJV1Q7YiOFDtqtf.ttf", + "700": "https://fonts.gstatic.com/s/b612mono/v16/kmK6Zq85QVWbN1eW6lJdayv4os9Pv7JGSg.ttf", + "700italic": "https://fonts.gstatic.com/s/b612mono/v16/kmKkZq85QVWbN1eW6lJV1TZkp8VLnbdWSg4x.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/b612mono/v16/kmK_Zq85QVWbN1eW6lJV1g7Y.ttf" + }, + { + "family": "BBH Sans Bartle", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-10-06", + "files": { + "regular": "https://fonts.gstatic.com/s/bbhsansbartle/v1/eLGEP-v-CSnwOk_evJ1qrrCJCQTJ9eYh0tfR-Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bbhsansbartle/v1/eLGEP-v-CSnwOk_evJ1qrrCJCQT59Owl.ttf" + }, + { + "family": "BBH Sans Bogle", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-10-06", + "files": { + "regular": "https://fonts.gstatic.com/s/bbhsansbogle/v1/LYjbdGTyv25vPsUz0wMCwj1DMf_fcpC69i6N.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bbhsansbogle/v1/LYjbdGTyv25vPsUz0wMCwj1DMc_eeJQ.ttf" + }, + { + "family": "BBH Sans Hegarty", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-10-06", + "files": { + "regular": "https://fonts.gstatic.com/s/bbhsanshegarty/v1/UqyLK9cfCFIq--EuUZn21v4dILtJTKAJduj91zQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bbhsanshegarty/v1/UqyLK9cfCFIq--EuUZn21v4dILtJfKEDcg.ttf" + }, + { + "family": "BIZ UDGothic", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "greek-ext", + "japanese", + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/bizudgothic/v12/daafSTouBF7RUjnbt8p3LuKttQN98z_MbQ.ttf", + "700": "https://fonts.gstatic.com/s/bizudgothic/v12/daaASTouBF7RUjnbt8p3LuKVCSxZ-xTQZMhbaA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bizudgothic/v12/daafSTouBF7RUjnbt8p3LuKdtAl5.ttf" + }, + { + "family": "BIZ UDMincho", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "greek-ext", + "japanese", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/bizudmincho/v11/EJRRQgI6eOxFjBdKs38yhtW1dwT7rcpY8Q.ttf", + "700": "https://fonts.gstatic.com/s/bizudmincho/v11/EJROQgI6eOxFjBdKs38yhtWNyyvfpeFE-IyCrw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bizudmincho/v11/EJRRQgI6eOxFjBdKs38yhtWFdg7_.ttf" + }, + { + "family": "BIZ UDPGothic", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "greek-ext", + "japanese", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/bizudpgothic/v15/hES36X5pHAIBjmS84VL0Bue83nUMQWkMUAk.ttf", + "700": "https://fonts.gstatic.com/s/bizudpgothic/v15/hESq6X5pHAIBjmS84VL0Bue85skjZWEnTABCSQo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bizudpgothic/v15/hES36X5pHAIBjmS84VL0Bue87nQGRQ.ttf" + }, + { + "family": "BIZ UDPMincho", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "greek-ext", + "japanese", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/bizudpmincho/v11/ypvfbXOBrmYppy7oWWTg1_58nhhYtUb0gZk.ttf", + "700": "https://fonts.gstatic.com/s/bizudpmincho/v11/ypvCbXOBrmYppy7oWWTg1_58pqR3kU7fnZAy57k.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bizudpmincho/v11/ypvfbXOBrmYppy7oWWTg1_58rhlSsQ.ttf" + }, + { + "family": "Babylonica", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/babylonica/v7/5aUw9_i2qxWVCAE2aHjTqDJ0-VVMoEw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/babylonica/v7/5aUw9_i2qxWVCAE2aHjTmDN-_Q.ttf" + }, + { + "family": "Bacasime Antique", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/bacasimeantique/v1/tDbX2pGXkFYEykldjZSrmI6T_XWZOwStSUrV_BE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bacasimeantique/v1/tDbX2pGXkFYEykldjZSrmI6T_XWZCwWnTQ.ttf" + }, + { + "family": "Bad Script", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/badscript/v18/6NUT8F6PJgbFWQn47_x7lOwuzd1AZtw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/badscript/v18/6NUT8F6PJgbFWQn47_x7pO0kyQ.ttf" + }, + { + "family": "Badeen Display", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/badeendisplay/v1/pxidypY2sdZSjFU4cPmNBzckadeLYk1Mq3ap.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/badeendisplay/v1/pxidypY2sdZSjFU4cPmNBzckaeeKaEk.ttf" + }, + { + "family": "Bagel Fat One", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/bagelfatone/v2/hYkPPucsQOr5dy02WmQr5Zkd0B5mvv0dSbM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bagelfatone/v2/hYkPPucsQOr5dy02WmQr5Zkd4B9sug.ttf" + }, + { + "family": "Bahiana", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/bahiana/v25/uU9PCBUV4YenPWJU7xPb3vyHmlI.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bahiana/v25/uU9PCBUV4YenPWJU3xLR2g.ttf" + }, + { + "family": "Bahianita", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/bahianita/v23/yYLr0hTb3vuqqsBUgxWtxTvV2NJPcA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bahianita/v23/yYLr0hTb3vuqqsBUgxWdxDHR.ttf" + }, + { + "family": "Bai Jamjuree", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa0kePuk5A1-yiSgA.ttf", + "200italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_oGkpox2S2CgOva.ttf", + "300": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa09eDuk5A1-yiSgA.ttf", + "300italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_pikZox2S2CgOva.ttf", + "regular": "https://fonts.gstatic.com/s/baijamjuree/v13/LDI1apSCOBt_aeQQ7ftydoaMWcjKm7sp8g.ttf", + "italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIrapSCOBt_aeQQ7ftydoa8W8LOub458jGL.ttf", + "500": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa0reHuk5A1-yiSgA.ttf", + "500italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_o6kJox2S2CgOva.ttf", + "600": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa0gebuk5A1-yiSgA.ttf", + "600italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_oWl5ox2S2CgOva.ttf", + "700": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIqapSCOBt_aeQQ7ftydoa05efuk5A1-yiSgA.ttf", + "700italic": "https://fonts.gstatic.com/s/baijamjuree/v13/LDIoapSCOBt_aeQQ7ftydoa8W_pylpox2S2CgOva.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baijamjuree/v13/LDI1apSCOBt_aeQQ7ftydoa8WMLO.ttf" + }, + { + "family": "Bakbak One", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/bakbakone/v11/zOL54pXAl6RI-p_ardnuycRuv-hHkOs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bakbakone/v11/zOL54pXAl6RI-p_ardnu-cVkuw.ttf" + }, + { + "family": "Ballet", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/ballet/v30/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3C4G-EiAou6Y.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ballet/v30/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4C0Fg.ttf" + }, + { + "family": "Baloo 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdgazapv9Fat7WcN.ttf", + "500": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdgozapv9Fat7WcN.ttf", + "600": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdjEyqpv9Fat7WcN.ttf", + "700": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdj9yqpv9Fat7WcN.ttf", + "800": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdiayqpv9Fat7WcN.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baloo2/v23/wXK0E3kTposypRydzVT08TS3JnAmtdgazZpu_lI.ttf" + }, + { + "family": "Baloo Bhai 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v30", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNighMXeCo-jsZzo.ttf", + "500": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNhohMXeCo-jsZzo.ttf", + "600": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNvYmMXeCo-jsZzo.ttf", + "700": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNs8mMXeCo-jsZzo.ttf", + "800": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNqgmMXeCo-jsZzo.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baloobhai2/v30/sZlWdRSL-z1VEWZ4YNA7Y5ItevYWUOHDE8FvNighAXaIpw.ttf" + }, + { + "family": "Baloo Bhaijaan 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TyRSqP4L4ppfcyC.ttf", + "500": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TyjSqP4L4ppfcyC.ttf", + "600": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TxPTaP4L4ppfcyC.ttf", + "700": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8Tx2TaP4L4ppfcyC.ttf", + "800": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TwRTaP4L4ppfcyC.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baloobhaijaan2/v21/zYXwKUwuEqdVGqM8tPDdAA_Y-_bMKo1EhQd2tWxo8TyRSpP5JY4.ttf" + }, + { + "family": "Baloo Bhaina 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "oriya", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEssPvRfRLYWmZSA.ttf", + "500": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEgMPvRfRLYWmZSA.ttf", + "600": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEbMTvRfRLYWmZSA.ttf", + "700": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEVcTvRfRLYWmZSA.ttf", + "800": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEMsTvRfRLYWmZSA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baloobhaina2/v29/qWc-B6yyq4P9Adr3RtoX1q6ySgbwusXwJjkOS-XEssPfRP5P.ttf" + }, + { + "family": "Baloo Chettan 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "malayalam", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CeKTO1oeH9xI2gc.ttf", + "500": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CdCTO1oeH9xI2gc.ttf", + "600": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CTyUO1oeH9xI2gc.ttf", + "700": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CQWUO1oeH9xI2gc.ttf", + "800": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CWKUO1oeH9xI2gc.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baloochettan2/v23/vm8hdRbmXEva26PK-NtuX4ynWEzF69-L4gqgkIL5CeKTC1sUGw.ttf" + }, + { + "family": "Baloo Da 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "bengali", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjALsTNe55aRa7UE.ttf", + "500": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjA5sTNe55aRa7UE.ttf", + "600": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjDVtjNe55aRa7UE.ttf", + "700": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjDstjNe55aRa7UE.ttf", + "800": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjCLtjNe55aRa7UE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/balooda2/v26/2-c39J9j0IaUMQZwAJyJaOX1UUnf3GLnYjALsQNf7ZI.ttf" + }, + { + "family": "Baloo Paaji 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "gurmukhi", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9AX74fybRUz1r5t.ttf", + "500": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9Al74fybRUz1r5t.ttf", + "600": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9DJ6IfybRUz1r5t.ttf", + "700": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9Dw6IfybRUz1r5t.ttf", + "800": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9CX6IfybRUz1r5t.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baloopaaji2/v29/i7dfIFFzbz-QHZUdV9_UGWZuelmy79QJ1HOSY9AX77fzZxE.ttf" + }, + { + "family": "Baloo Tamma 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMscPp-0IF71SGC5.ttf", + "500": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMsuPp-0IF71SGC5.ttf", + "600": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMvCOZ-0IF71SGC5.ttf", + "700": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMv7OZ-0IF71SGC5.ttf", + "800": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMucOZ-0IF71SGC5.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/balootamma2/v20/vEFE2_hCAgcR46PaajtrYlBbVUMUJgIC5LHTrMscPq-1Klo.ttf" + }, + { + "family": "Baloo Tammudu 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "telugu", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_Jf8e4c6PZSlGmAA.ttf", + "500": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_Jc0e4c6PZSlGmAA.ttf", + "600": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_JSEZ4c6PZSlGmAA.ttf", + "700": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_JRgZ4c6PZSlGmAA.ttf", + "800": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_JX8Z4c6PZSlGmAA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/balootammudu2/v27/1Pt5g8TIS_SAmkLguUdFP8UaJcKkzlPmMT00GaE_Jf8e0c-FYQ.ttf" + }, + { + "family": "Baloo Thambi 2", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKzcIzaQRG_n4osQ.ttf", + "500": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbK_8IzaQRG_n4osQ.ttf", + "600": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKE8UzaQRG_n4osQ.ttf", + "700": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKKsUzaQRG_n4osQ.ttf", + "800": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKTcUzaQRG_n4osQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baloothambi2/v22/cY9RfjeOW0NHpmOQXranrbDyu5JMJmNp-aDvUBbKzcIDaA5C.ttf" + }, + { + "family": "Balsamiq Sans", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sEzZiAbNrN8SB3lQQX7Pnc8dkdIYdNHzs.ttf", + "italic": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sazZiAbNrN8SB3lQQX7PncwdsXJaVIDzvcXA.ttf", + "700": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sZzZiAbNrN8SB3lQQX7PncyWUyBY9mAzLFRQI.ttf", + "700italic": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sfzZiAbNrN8SB3lQQX7PncwdsvmYpsBxDAVQI4aA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/balsamiqsans/v15/P5sEzZiAbNrN8SB3lQQX7PncwdgXJQ.ttf" + }, + { + "family": "Balthazar", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/balthazar/v18/d6lKkaajS8Gm4CVQjFEvyRTo39l8hw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/balthazar/v18/d6lKkaajS8Gm4CVQjFEfyB7s.ttf" + }, + { + "family": "Bangers", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/bangers/v25/FeVQS0BTqb0h60ACL5la2bxii28.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bangers/v25/FeVQS0BTqb0h60ACH5hQ3Q.ttf" + }, + { + "family": "Barlow", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/barlow/v13/7cHrv4kjgoGqM7E3b8s8yn4hnCci.ttf", + "100italic": "https://fonts.gstatic.com/s/barlow/v13/7cHtv4kjgoGqM7E_CfNYwHoDmTcibrA.ttf", + "200": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3w-oc4FAtlT47dw.ttf", + "200italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfP04Voptzsrd6m9.ttf", + "300": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3p-kc4FAtlT47dw.ttf", + "300italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfOQ4loptzsrd6m9.ttf", + "regular": "https://fonts.gstatic.com/s/barlow/v13/7cHpv4kjgoGqM7EPC8E46HsxnA.ttf", + "italic": "https://fonts.gstatic.com/s/barlow/v13/7cHrv4kjgoGqM7E_Ccs8yn4hnCci.ttf", + "500": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3_-gc4FAtlT47dw.ttf", + "500italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfPI41optzsrd6m9.ttf", + "600": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E30-8c4FAtlT47dw.ttf", + "600italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfPk5Foptzsrd6m9.ttf", + "700": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3t-4c4FAtlT47dw.ttf", + "700italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfOA5Voptzsrd6m9.ttf", + "800": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3q-0c4FAtlT47dw.ttf", + "800italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfOc5loptzsrd6m9.ttf", + "900": "https://fonts.gstatic.com/s/barlow/v13/7cHqv4kjgoGqM7E3j-wc4FAtlT47dw.ttf", + "900italic": "https://fonts.gstatic.com/s/barlow/v13/7cHsv4kjgoGqM7E_CfO451optzsrd6m9.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/barlow/v13/7cHpv4kjgoGqM7E_Css8.ttf" + }, + { + "family": "Barlow Condensed", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxxL3I-JCGChYJ8VI-L6OO_au7B43LT31vytKgbaw.ttf", + "100italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxzL3I-JCGChYJ8VI-L6OO_au7B6xTru1H2lq0La6JN.ttf", + "200": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B497y_3HcuKECcrs.ttf", + "200italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrF3DWvIMHYrtUxg.ttf", + "300": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B47rx_3HcuKECcrs.ttf", + "300italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrc3PWvIMHYrtUxg.ttf", + "regular": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTx3L3I-JCGChYJ8VI-L6OO_au7B2xbZ23n3pKg.ttf", + "italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxxL3I-JCGChYJ8VI-L6OO_au7B6xTT31vytKgbaw.ttf", + "500": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B4-Lw_3HcuKECcrs.ttf", + "500italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrK3LWvIMHYrtUxg.ttf", + "600": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B4873_3HcuKECcrs.ttf", + "600italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrB3XWvIMHYrtUxg.ttf", + "700": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B46r2_3HcuKECcrs.ttf", + "700italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrY3TWvIMHYrtUxg.ttf", + "800": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B47b1_3HcuKECcrs.ttf", + "800italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrf3fWvIMHYrtUxg.ttf", + "900": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxwL3I-JCGChYJ8VI-L6OO_au7B45L0_3HcuKECcrs.ttf", + "900italic": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTxyL3I-JCGChYJ8VI-L6OO_au7B6xTrW3bWvIMHYrtUxg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/barlowcondensed/v13/HTx3L3I-JCGChYJ8VI-L6OO_au7B6xfT3w.ttf" + }, + { + "family": "Barlow Semi Condensed", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlphgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfG4qvKk8ogoSP.ttf", + "100italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpjgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbLLIEsKh5SPZWs.ttf", + "200": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRft6uPAGEki52WfA.ttf", + "200italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbJnAWsgqZiGfHK5.ttf", + "300": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRf06iPAGEki52WfA.ttf", + "300italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbIDAmsgqZiGfHK5.ttf", + "regular": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpvgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRnf4CrCEo4gg.ttf", + "italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlphgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfYqvKk8ogoSP.ttf", + "500": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfi6mPAGEki52WfA.ttf", + "500italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbJbA2sgqZiGfHK5.ttf", + "600": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfp66PAGEki52WfA.ttf", + "600italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbJ3BGsgqZiGfHK5.ttf", + "700": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfw6-PAGEki52WfA.ttf", + "700italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbITBWsgqZiGfHK5.ttf", + "800": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRf36yPAGEki52WfA.ttf", + "800italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbIPBmsgqZiGfHK5.ttf", + "900": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRf-62PAGEki52WfA.ttf", + "900italic": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpkgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfbIrB2sgqZiGfHK5.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/barlowsemicondensed/v16/wlpvgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXfoqv.ttf" + }, + { + "family": "Barriecito", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/barriecito/v18/WWXXlj-CbBOSLY2QTuY_KdUiYwTO0MU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/barriecito/v18/WWXXlj-CbBOSLY2QTuY_GdQoZw.ttf" + }, + { + "family": "Barrio", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/barrio/v20/wEO8EBXBk8hBIDiEdQYhWdsX1Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/barrio/v20/wEO8EBXBk8hBIDi0dAwl.ttf" + }, + { + "family": "Basic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/basic/v18/xfu_0WLxV2_XKQN34lDVyR7D.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/basic/v18/xfu_0WLxV2_XKTN26FQ.ttf" + }, + { + "family": "Baskervville", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYuDrugOydR1FLkw.ttf", + "500": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYtLrugOydR1FLkw.ttf", + "600": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYj7sugOydR1FLkw.ttf", + "700": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYgfsugOydR1FLkw.ttf", + "italic": "https://fonts.gstatic.com/s/baskervville/v20/YA9Hr0yU4l_XOrogbkun3kQQtYOnhgMBaGprdyioUkC4cT9APkyagA.ttf", + "500italic": "https://fonts.gstatic.com/s/baskervville/v20/YA9Hr0yU4l_XOrogbkun3kQQtYOnhgMBaGprdyioYEC4cT9APkyagA.ttf", + "600italic": "https://fonts.gstatic.com/s/baskervville/v20/YA9Hr0yU4l_XOrogbkun3kQQtYOnhgMBaGprdyiojEe4cT9APkyagA.ttf", + "700italic": "https://fonts.gstatic.com/s/baskervville/v20/YA9Hr0yU4l_XOrogbkun3kQQtYOnhgMBaGprdyiotUe4cT9APkyagA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baskervville/v20/YA9Br0yU4l_XOrogbkun3kQ6vLFYXmpq8sRsYuDrigK4cQ.ttf" + }, + { + "family": "Baskervville SC", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHjziXM3kPWntDsg.ttf", + "500": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHg7iXM3kPWntDsg.ttf", + "600": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHuLlXM3kPWntDsg.ttf", + "700": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHtvlXM3kPWntDsg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baskervvillesc/v4/X7ny4bc_DeKlh6bBbk_WiKnBSUvL5HaHbrgS1MXKHjzibMzuOQ.ttf" + }, + { + "family": "Battambang", + "variants": [ + "100", + "300", + "regular", + "700", + "900" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/battambang/v26/uk-kEGe7raEw-HjkzZabNhGp5w50_o9T7Q.ttf", + "300": "https://fonts.gstatic.com/s/battambang/v26/uk-lEGe7raEw-HjkzZabNtmLxyRa8oZK9I0.ttf", + "regular": "https://fonts.gstatic.com/s/battambang/v26/uk-mEGe7raEw-HjkzZabDnWj4yxx7o8.ttf", + "700": "https://fonts.gstatic.com/s/battambang/v26/uk-lEGe7raEw-HjkzZabNsmMxyRa8oZK9I0.ttf", + "900": "https://fonts.gstatic.com/s/battambang/v26/uk-lEGe7raEw-HjkzZabNvGOxyRa8oZK9I0.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/battambang/v26/uk-mEGe7raEw-HjkzZabPnSp5w.ttf" + }, + { + "family": "Baumans", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/baumans/v18/-W_-XJj9QyTd3QfpR_oyaksqY5Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/baumans/v18/-W_-XJj9QyTd3Qfpd_s4bg.ttf" + }, + { + "family": "Bayon", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v36", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/bayon/v36/9XUrlJNmn0LPFl-pOhYEd2NJ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bayon/v36/9XUrlJNmn0LPFm-oMBI.ttf" + }, + { + "family": "Be Vietnam Pro", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVNSTAyLFyeg_IDWvOJmVES_HRUBX8YYbAiah8.ttf", + "100italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVLSTAyLFyeg_IDWvOJmVES_HwyPRsSZZIneh-waA.ttf", + "200": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HT4JF8yT7wrcwap.ttf", + "200italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPbczRbgJdhapcUU.ttf", + "300": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HScJ18yT7wrcwap.ttf", + "300italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPdMwRbgJdhapcUU.ttf", + "regular": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVPSTAyLFyeg_IDWvOJmVES_EwwD3s6ZKAi.ttf", + "italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVNSTAyLFyeg_IDWvOJmVES_HwyBX8YYbAiah8.ttf", + "500": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HTEJl8yT7wrcwap.ttf", + "500italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPYsxRbgJdhapcUU.ttf", + "600": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HToIV8yT7wrcwap.ttf", + "600italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPac2RbgJdhapcUU.ttf", + "700": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HSMIF8yT7wrcwap.ttf", + "700italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPcM3RbgJdhapcUU.ttf", + "800": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HSQI18yT7wrcwap.ttf", + "800italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPd80RbgJdhapcUU.ttf", + "900": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVMSTAyLFyeg_IDWvOJmVES_HS0Il8yT7wrcwap.ttf", + "900italic": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVKSTAyLFyeg_IDWvOJmVES_HwyPfs1RbgJdhapcUU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bevietnampro/v12/QdVPSTAyLFyeg_IDWvOJmVES_HwxBX8.ttf" + }, + { + "family": "Beau Rivage", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/beaurivage/v2/UcCi3FIgIG2bH4mMNWJUlmg3NZp8K2sL.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/beaurivage/v2/UcCi3FIgIG2bH4mMNWJUllg2P54.ttf" + }, + { + "family": "Bebas Neue", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/bebasneue/v16/JTUSjIg69CK48gW7PXooxW5rygbi49c.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bebasneue/v16/JTUSjIg69CK48gW7PXoo9W9hzg.ttf" + }, + { + "family": "Beiruti", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9Y95wujgWg2SGdV.ttf", + "300": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9bj5wujgWg2SGdV.ttf", + "regular": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9a95wujgWg2SGdV.ttf", + "500": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9aP5wujgWg2SGdV.ttf", + "600": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9Zj4AujgWg2SGdV.ttf", + "700": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9Za4AujgWg2SGdV.ttf", + "800": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9Y94AujgWg2SGdV.ttf", + "900": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9YU4AujgWg2SGdV.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/beiruti/v5/JTUIjIU69Cmr9FGcYgRFEb7cdQn2-9a95zuii2w.ttf" + }, + { + "family": "Belanosima", + "variants": [ + "regular", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/belanosima/v4/3y9k6bI8ejDo_3MfCDSLxABbF3JBg54.ttf", + "600": "https://fonts.gstatic.com/s/belanosima/v4/3y9n6bI8ejDo_3MfCDSL_Nh1M3pqn5cdJ-4.ttf", + "700": "https://fonts.gstatic.com/s/belanosima/v4/3y9n6bI8ejDo_3MfCDSL_Lx0M3pqn5cdJ-4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/belanosima/v4/3y9k6bI8ejDo_3MfCDSL9AFREw.ttf" + }, + { + "family": "Belgrano", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/belgrano/v19/55xvey5tM9rwKWrJZcMFirl08KDJ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/belgrano/v19/55xvey5tM9rwKWrJZfMEgL0.ttf" + }, + { + "family": "Bellefair", + "variants": [ + "regular" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/bellefair/v15/kJExBuYY6AAuhiXUxG19__A2pOdvDA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bellefair/v15/kJExBuYY6AAuhiXUxG1N_voy.ttf" + }, + { + "family": "Belleza", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/belleza/v18/0nkoC9_pNeMfhX4BtcbyawzruP8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/belleza/v18/0nkoC9_pNeMfhX4Bhcf4bw.ttf" + }, + { + "family": "Bellota", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/bellota/v17/MwQzbhXl3_qEpiwAID55kGMViblPtXs.ttf", + "300italic": "https://fonts.gstatic.com/s/bellota/v17/MwQxbhXl3_qEpiwAKJBjHGEfjZtKpXulTQ.ttf", + "regular": "https://fonts.gstatic.com/s/bellota/v17/MwQ2bhXl3_qEpiwAGJJRtGs-lbA.ttf", + "italic": "https://fonts.gstatic.com/s/bellota/v17/MwQ0bhXl3_qEpiwAKJBbsEk7hbBWrA.ttf", + "700": "https://fonts.gstatic.com/s/bellota/v17/MwQzbhXl3_qEpiwAIC5-kGMViblPtXs.ttf", + "700italic": "https://fonts.gstatic.com/s/bellota/v17/MwQxbhXl3_qEpiwAKJBjDGYfjZtKpXulTQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bellota/v17/MwQ2bhXl3_qEpiwAKJNbsA.ttf" + }, + { + "family": "Bellota Text", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/bellotatext/v20/0FlMVP2VnlWS4f3-UE9hHXM5VfsqfQXwQy6yxg.ttf", + "300italic": "https://fonts.gstatic.com/s/bellotatext/v20/0FlOVP2VnlWS4f3-UE9hHXMx--Gmfw_0YSuixmYK.ttf", + "regular": "https://fonts.gstatic.com/s/bellotatext/v20/0FlTVP2VnlWS4f3-UE9hHXMB-dMOdS7sSg.ttf", + "italic": "https://fonts.gstatic.com/s/bellotatext/v20/0FlNVP2VnlWS4f3-UE9hHXMx-9kKVyv8Sjer.ttf", + "700": "https://fonts.gstatic.com/s/bellotatext/v20/0FlMVP2VnlWS4f3-UE9hHXM5RfwqfQXwQy6yxg.ttf", + "700italic": "https://fonts.gstatic.com/s/bellotatext/v20/0FlOVP2VnlWS4f3-UE9hHXMx--G2eA_0YSuixmYK.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bellotatext/v20/0FlTVP2VnlWS4f3-UE9hHXMx-NkK.ttf" + }, + { + "family": "BenchNine", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/benchnine/v17/ahcev8612zF4jxrwMosT--tRhWa8q0v8ag.ttf", + "regular": "https://fonts.gstatic.com/s/benchnine/v17/ahcbv8612zF4jxrwMosrV8N1jU2gog.ttf", + "700": "https://fonts.gstatic.com/s/benchnine/v17/ahcev8612zF4jxrwMosT6-xRhWa8q0v8ag.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/benchnine/v17/ahcbv8612zF4jxrwMosbVslx.ttf" + }, + { + "family": "Benne", + "variants": [ + "regular" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/benne/v24/L0xzDFAhn18E6Vjxlt6qTDBN.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/benne/v24/L0xzDFAhn18E6WjwnNo.ttf" + }, + { + "family": "Bentham", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/bentham/v20/VdGeAZQPEpYfmHglKWw7CJaK_y4.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bentham/v20/VdGeAZQPEpYfmHglGW0xDA.ttf" + }, + { + "family": "Berkshire Swash", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/berkshireswash/v22/ptRRTi-cavZOGqCvnNJDl5m5XmNPrcQybX4pQA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/berkshireswash/v22/ptRRTi-cavZOGqCvnNJDl5m5XmN_rM42.ttf" + }, + { + "family": "Besley", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fbbBSdRoFPOl8-E.ttf", + "500": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fYTBSdRoFPOl8-E.ttf", + "600": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fWjGSdRoFPOl8-E.ttf", + "700": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fVHGSdRoFPOl8-E.ttf", + "800": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fTbGSdRoFPOl8-E.ttf", + "900": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fR_GSdRoFPOl8-E.ttf", + "italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6CoZdiENGg4-E04A.ttf", + "500italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6Ck5diENGg4-E04A.ttf", + "600italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6Cf5BiENGg4-E04A.ttf", + "700italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6CRpBiENGg4-E04A.ttf", + "800italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6CIZBiENGg4-E04A.ttf", + "900italic": "https://fonts.gstatic.com/s/besley/v22/PlIjFlO1MaNwaNG8WR2J-IiUAH-_aH6CCJBiENGg4-E04A.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fbbBedViEA.ttf" + }, + { + "family": "Beth Ellen", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/bethellen/v22/WwkbxPW2BE-3rb_JNT-qEIAiVNo5xNY.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bethellen/v22/WwkbxPW2BE-3rb_JNT-qIIEoUA.ttf" + }, + { + "family": "Bevan", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/bevan/v26/4iCj6KZ0a9NXjF8aUir7tlSJ.ttf", + "italic": "https://fonts.gstatic.com/s/bevan/v26/4iCt6KZ0a9NXjG8YWC7Zs0SJD4U.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bevan/v26/4iCj6KZ0a9NXjG8bWC4.ttf" + }, + { + "family": "BhuTuka Expanded One", + "variants": [ + "regular" + ], + "subsets": [ + "gurmukhi", + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/bhutukaexpandedone/v9/SLXXc0jZ4WUJcClHTtv0t7IaDRsBsWRiJCyX8pg_RVH1.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bhutukaexpandedone/v9/SLXXc0jZ4WUJcClHTtv0t7IaDRsBsWRiJByW-Jw.ttf" + }, + { + "family": "Big Shoulders", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9SOL9ANM1LlZAtA.ttf", + "200": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9yOP9ANM1LlZAtA.ttf", + "300": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9FuP9ANM1LlZAtA.ttf", + "regular": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9SOP9ANM1LlZAtA.ttf", + "500": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9euP9ANM1LlZAtA.ttf", + "600": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9luT9ANM1LlZAtA.ttf", + "700": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9r-T9ANM1LlZAtA.ttf", + "800": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9yOT9ANM1LlZAtA.ttf", + "900": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko94eT9ANM1LlZAtA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bigshoulders/v4/qFdk35CPh40oITJ69S3GFqy5-BQAcbz7z7beObrv_PytqyTi33thrko9SOPNAdkx.ttf" + }, + { + "family": "Big Shoulders Inline", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1nHb-oUTA-kSKkM.ttf", + "200": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1vHa-oUTA-kSKkM.ttf", + "300": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1i_a-oUTA-kSKkM.ttf", + "regular": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1nHa-oUTA-kSKkM.ttf", + "500": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1kPa-oUTA-kSKkM.ttf", + "600": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1q_d-oUTA-kSKkM.ttf", + "700": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1pbd-oUTA-kSKkM.ttf", + "800": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1vHd-oUTA-kSKkM.ttf", + "900": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1tjd-oUTA-kSKkM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bigshouldersinline/v4/bx68NwSCkev-8u0YNXAF6gArLyznvspgMZDcnsTZieUyOqQzOiBfauOMaRhGeKwO1nHayoQZBw.ttf" + }, + { + "family": "Big Shoulders Stencil", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp2x5OZJnqtwIp4I.ttf", + "200": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp0x5eZJnqtwIp4I.ttf", + "300": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp3v5eZJnqtwIp4I.ttf", + "regular": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp2x5eZJnqtwIp4I.ttf", + "500": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp2D5eZJnqtwIp4I.ttf", + "600": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp1v4uZJnqtwIp4I.ttf", + "700": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp1W4uZJnqtwIp4I.ttf", + "800": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp0x4uZJnqtwIp4I.ttf", + "900": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp0Y4uZJnqtwIp4I.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bigshouldersstencil/v4/TwM2-JIEQ1Je5sI6Bx1TKHD83rT3u3NSCfbFxqa9oQbR_CiZMgOzPB7iSLKdsgE9Sp2x5dZIlK8.ttf" + }, + { + "family": "Bigelow Rules", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v31", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/bigelowrules/v31/RrQWboly8iR_I3KWSzeRuN0zT4cCH8WAJVk.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bigelowrules/v31/RrQWboly8iR_I3KWSzeRuN0zf4YIGw.ttf" + }, + { + "family": "Bigshot One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v31", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/bigshotone/v31/u-470qukhRkkO6BD_7cM_gxuUQJBXv_-.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bigshotone/v31/u-470qukhRkkO6BD_7cM_jxvWwY.ttf" + }, + { + "family": "Bilbo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/bilbo/v21/o-0EIpgpwWwZ210hpIRz4wxE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bilbo/v21/o-0EIpgpwWwZ220groA.ttf" + }, + { + "family": "Bilbo Swash Caps", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/bilboswashcaps/v23/zrf-0GXbz-H3Wb4XBsGrTgq2PVmdqAPopiRfKp8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bilboswashcaps/v23/zrf-0GXbz-H3Wb4XBsGrTgq2PVmdmALiog.ttf" + }, + { + "family": "BioRhyme", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OrIimiaki-gkRDE.ttf", + "300": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4Omwimiaki-gkRDE.ttf", + "regular": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OjIimiaki-gkRDE.ttf", + "500": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OgAimiaki-gkRDE.ttf", + "600": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4Ouwlmiaki-gkRDE.ttf", + "700": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OtUlmiaki-gkRDE.ttf", + "800": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OrIlmiaki-gkRDE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/biorhyme/v21/1cXeaULHBpDMsHYW_GZNh7loEHurwOIGadI205trrbeBgQs4OjIiqieujw.ttf" + }, + { + "family": "BioRhyme Expanded", + "variants": [ + "200", + "300", + "regular", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dVIE1zZzytGswgU577CDY9LjbffxxcblSHSdTXrb_z.ttf", + "300": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dVIE1zZzytGswgU577CDY9Ljbffxw4bVSHSdTXrb_z.ttf", + "regular": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dQIE1zZzytGswgU577CDY9LjbffySURXCPYsje.ttf", + "700": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dVIE1zZzytGswgU577CDY9LjbffxwoalSHSdTXrb_z.ttf", + "800": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dVIE1zZzytGswgU577CDY9Ljbffxw0aVSHSdTXrb_z.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/biorhymeexpanded/v23/i7dQIE1zZzytGswgU577CDY9LjbffxSVT3Q.ttf" + }, + { + "family": "Birthstone", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/birthstone/v16/8AtsGs2xO4yLRhy87sv_HLn5jRfZHzM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/birthstone/v16/8AtsGs2xO4yLRhy87sv_LLjziQ.ttf" + }, + { + "family": "Birthstone Bounce", + "variants": [ + "regular", + "500" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/birthstonebounce/v13/ga6XaxZF43lIvTWrktHOTBJZGH7dEeVJGIMYDo_8.ttf", + "500": "https://fonts.gstatic.com/s/birthstonebounce/v13/ga6SaxZF43lIvTWrktHOTBJZGH7dEd29MacQJZP1LmD9.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/birthstonebounce/v13/ga6XaxZF43lIvTWrktHOTBJZGH7dEdVIEoc.ttf" + }, + { + "family": "Biryani", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84YddYQyGTBSU-J-RxQ.ttf", + "300": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84YddeAxGTBSU-J-RxQ.ttf", + "regular": "https://fonts.gstatic.com/s/biryani/v15/hv-WlzNxIFoO84YdTUwZPTh5T-s.ttf", + "600": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84YddZQ3GTBSU-J-RxQ.ttf", + "700": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84YddfA2GTBSU-J-RxQ.ttf", + "800": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84Yddew1GTBSU-J-RxQ.ttf", + "900": "https://fonts.gstatic.com/s/biryani/v15/hv-TlzNxIFoO84Yddcg0GTBSU-J-RxQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/biryani/v15/hv-WlzNxIFoO84YdfU0TOQ.ttf" + }, + { + "family": "Bitcount", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJVvr06JyZBdg54o.ttf", + "200": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJdvq06JyZBdg54o.ttf", + "300": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJQXq06JyZBdg54o.ttf", + "regular": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJVvq06JyZBdg54o.ttf", + "500": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJWnq06JyZBdg54o.ttf", + "600": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJYXt06JyZBdg54o.ttf", + "700": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJbzt06JyZBdg54o.ttf", + "800": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJdvt06JyZBdg54o.ttf", + "900": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJfLt06JyZBdg54o.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcount/v3/ijxXs53kQsE1Y5J-lI1wubXnlQH-1-E1LhaU1dJRZZaHU0slfybi9GQwiTv06bjtugLjdPqK3d9XKDqRc2jrJlC4ZRsgxqxP-aVoJVvq46N4YA.ttf" + }, + { + "family": "Bitcount Grid Double", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZDxleZEXi_Ul10k.ttf", + "200": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZLxkeZEXi_Ul10k.ttf", + "300": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZGJkeZEXi_Ul10k.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZDxkeZEXi_Ul10k.ttf", + "500": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZA5keZEXi_Ul10k.ttf", + "600": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZOJjeZEXi_Ul10k.ttf", + "700": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZNtjeZEXi_Ul10k.ttf", + "800": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZLxjeZEXi_Ul10k.ttf", + "900": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZJVjeZEXi_Ul10k.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountgriddouble/v3/WBK7rFjbakJVFOargiWSKQysDITG_S0VtG0x3HD2FYHVdlZI-rLlahmEAPp8wjYMvkPq48MVQo5RQf2svjnxa5Anx8-Y-pHdkVb0ByRHaxzbXaLbA9wfZDxkSZAdjw.ttf" + }, + { + "family": "Bitcount Grid Double Ink", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzR07bFhBRdj-elg.ttf", + "200": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2Jhzx0_bFhBRdj-elg.ttf", + "300": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzGU_bFhBRdj-elg.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzR0_bFhBRdj-elg.ttf", + "500": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzdU_bFhBRdj-elg.ttf", + "600": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzmUjbFhBRdj-elg.ttf", + "700": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzoEjbFhBRdj-elg.ttf", + "800": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2Jhzx0jbFhBRdj-elg.ttf", + "900": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2Jhz7kjbFhBRdj-elg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountgriddoubleink/v2/55zMcCw3FN_jOGTSZJcl588VlZiMRBEu8MNfAa1hTmcIC-EgZzYwMlaO_awRPudtyc3Y6uQYyaHkeKGSq8TU4RVR7xpYN_MnWZejEGOGrT-NcapoFhvUOhVjLNJ2XCLrbMxtAR6SYY1mL-OvDnjOVsnRj34-p6VMvv549Lg7J4HRX7TqUxwskRMxVR7_3L-QRhDtbv8kM-EDNmBQr1-hsC1tMPJC0vkO2JhzR0_rFxpV.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Bitcount Grid Single", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanohqZUINrmJ9z94.ttf", + "200": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanghrZUINrmJ9z94.ttf", + "300": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGantZrZUINrmJ9z94.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanohrZUINrmJ9z94.ttf", + "500": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanrprZUINrmJ9z94.ttf", + "600": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanlZsZUINrmJ9z94.ttf", + "700": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanm9sZUINrmJ9z94.ttf", + "800": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanghsZUINrmJ9z94.ttf", + "900": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGaniFsZUINrmJ9z94.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountgridsingle/v3/cY8bfi2OU1tLpjaqQveNvbC2qfsuQPDVASHjTcBszBsXfC5C9kAKu8QoqnfqMiS4gVij5yxO41San7UnNMBH-Y9u33JUGFdHpUYahAAdbgvnnHmmgUGanohrVUMHqg.ttf" + }, + { + "family": "Bitcount Grid Single Ink", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavMl1GIY8dxef0jQ.ttf", + "200": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavslxGIY8dxef0jQ.ttf", + "300": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavbFxGIY8dxef0jQ.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavMlxGIY8dxef0jQ.ttf", + "500": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavAFxGIY8dxef0jQ.ttf", + "600": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKav7FtGIY8dxef0jQ.ttf", + "700": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKav1VtGIY8dxef0jQ.ttf", + "800": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavsltGIY8dxef0jQ.ttf", + "900": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavm1tGIY8dxef0jQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountgridsingleink/v2/NaN4epOEK_VIyYAuIaZn7FnUAOSVYeI0Ctm5-AxV__OGadlXPkpqc2W3G80KvDvfZJcTBZtOWSEifRuVdQ9MPZtUsYBBEK6cMpFmAx9Xgbn8m7Ha_CUon9Fm0PP1zM05Dnsuyw04ZGzhvlKxYNMYWI3t91IQXOwJRiUJVTErJ5YUW4O8LJCoXjD9tXQjarshNDUf3e0O5j3ZjrZCu23Qd4G0EACUTNK-QKavMlx2IIUZ.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Bitcount Ink", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpjycCL3BeDtAVdA.ttf", + "200": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpDyYCL3BeDtAVdA.ttf", + "300": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-Lp0SYCL3BeDtAVdA.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpjyYCL3BeDtAVdA.ttf", + "500": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpvSYCL3BeDtAVdA.ttf", + "600": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpUSECL3BeDtAVdA.ttf", + "700": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpaCECL3BeDtAVdA.ttf", + "800": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpDyECL3BeDtAVdA.ttf", + "900": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpJiECL3BeDtAVdA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountink/v2/CHw3XOqbPlXqZygxqACCMDRlDHEsWMeZ-ply2TQhrGdTTV70MvuSq-hd_83nDPWRtOLnAR0RGYwUI6_l53HbUsPlZt2f_nGD_DNHtMCB7B9hQwZ0b5o6F6iN-beb4rZZL0lJiDukrkTdyFcJaMYOfDmhx95p-j2BlGfR752-BOzpyNMOV-otpEi0LP8lkm2L_v1iV4b0vZlRFNojp-LpjyYyLnpa.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Bitcount Prop Double", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWck5Kx91m1YFsiM.ttf", + "200": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWUk4Kx91m1YFsiM.ttf", + "300": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWZc4Kx91m1YFsiM.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWck4Kx91m1YFsiM.ttf", + "500": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWfs4Kx91m1YFsiM.ttf", + "600": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWRc_Kx91m1YFsiM.ttf", + "700": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWS4_Kx91m1YFsiM.ttf", + "800": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWUk_Kx91m1YFsiM.ttf", + "900": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWWA_Kx91m1YFsiM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountpropdouble/v3/K2EvfY5Wn-tBSVxaDL6DUOXQJ26dEAnh698zMFjGZaPCtbJHl1TFmDKfGe4_bKUh3sC1Q7DxZ5-3PQRHsSZEX9ctiFN1ZosZvKyl3LzeFmQvK5hIm0nBWck4Gx5_nw.ttf" + }, + { + "family": "Bitcount Prop Double Ink", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAz5--C4pTNcOH4A.ttf", + "200": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAT56-C4pTNcOH4A.ttf", + "300": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAkZ6-C4pTNcOH4A.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAz56-C4pTNcOH4A.ttf", + "500": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUA_Z6-C4pTNcOH4A.ttf", + "600": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAEZm-C4pTNcOH4A.ttf", + "700": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAKJm-C4pTNcOH4A.ttf", + "800": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAT5m-C4pTNcOH4A.ttf", + "900": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAZpm-C4pTNcOH4A.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountpropdoubleink/v2/Y4EraqgqeCwyoeHYKJOMnRRAOHVHr-2bKnsgKOU1mvV-Vk5S_hxGNApRqvOsLjMS7TL7U6J7vsT0x86f1E_MhJ7Fc8CNp0DtWIOPIdLKGVtyw2WU1OmnzDEO5QVqngZewgsX32-qkruHpLpXeSB4hOOrFaY6I-9oLQWBuD4CtdBkkmqV6mdr8M41Shcr_DYnIqojkFlhekgcGiaIMOm7DY3-ibiJFY5uuJUAz56OCoBX.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Bitcount Prop Single", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GXZkLGUYg0NjZiU.ttf", + "200": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GfZlLGUYg0NjZiU.ttf", + "300": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GShlLGUYg0NjZiU.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GXZlLGUYg0NjZiU.ttf", + "500": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GURlLGUYg0NjZiU.ttf", + "600": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GahiLGUYg0NjZiU.ttf", + "700": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GZFiLGUYg0NjZiU.ttf", + "800": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GfZiLGUYg0NjZiU.ttf", + "900": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921Gd9iLGUYg0NjZiU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountpropsingle/v3/-W-gXIv9SyXT0xz0E9pIHCxbW8ZMGEVdhz4VoumsGFhzYseFqK9f_KOwYjYsHSocfu1DlxztzQH877SgJ2SUzQ4SJdODLz0JoLU3vXFrqXQooCdbs921GXZlHGQShw.ttf" + }, + { + "family": "Bitcount Prop Single Ink", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4u37HDRGOJzIi0xg.ttf", + "200": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4uX7DDRGOJzIi0xg.ttf", + "300": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4ugbDDRGOJzIi0xg.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4u37DDRGOJzIi0xg.ttf", + "500": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4u7bDDRGOJzIi0xg.ttf", + "600": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4uAbfDRGOJzIi0xg.ttf", + "700": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4uOLfDRGOJzIi0xg.ttf", + "800": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4uX7fDRGOJzIi0xg.ttf", + "900": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4udrfDRGOJzIi0xg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountpropsingleink/v4/wXILGHRJhY4pqVPamSvcVZZF7Vdg3La14u9PlzzO1nQEbZPzF-4gWjUKyDXV8KJN2EmG9tnR1UwPVIktRU7KfRvK49YKhcKoqpd0qENrktXGo3hmFUX9oJiQ_cI3D53uhksE9rntl1PkS1IjdhAg77zMwnnLO7zJ5bZKR5MO8LRFFwWr-XrNplyw2CuD3tEnNissrzK7ZCnsz5HReNrx9v6MX009gC5TFm4u37DzRWmN.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Bitcount Single", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8jKC4tYzXjwevWm.ttf", + "200": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8hKCotYzXjwevWm.ttf", + "300": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8iUCotYzXjwevWm.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8jKCotYzXjwevWm.ttf", + "500": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8j4CotYzXjwevWm.ttf", + "600": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8gUDYtYzXjwevWm.ttf", + "700": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8gtDYtYzXjwevWm.ttf", + "800": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8hKDYtYzXjwevWm.ttf", + "900": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8hjDYtYzXjwevWm.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountsingle/v3/or25Q6T72-iP2RY6OLSkb95a817cjULDyyhvb6tTxCxtAOObpH9NnfLjSWiXv_OGqtjRD0BNzrItMZWC-9SK8R6EpA2l9RAyOs8BbxT7gd3xw8jKCrtZx3w.ttf" + }, + { + "family": "Bitcount Single Ink", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN0T8ugz0rbvZS6k.ttf", + "200": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN8T9ugz0rbvZS6k.ttf", + "300": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QNxr9ugz0rbvZS6k.ttf", + "regular": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN0T9ugz0rbvZS6k.ttf", + "500": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN3b9ugz0rbvZS6k.ttf", + "600": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN5r6ugz0rbvZS6k.ttf", + "700": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN6P6ugz0rbvZS6k.ttf", + "800": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN8T6ugz0rbvZS6k.ttf", + "900": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN-36ugz0rbvZS6k.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitcountsingleink/v4/Fwb25OZl6FQz81GlJoqgm6XFwi_b1Oat-linM3eIpWvrZ9yhd874qjc72qi5T1IMgiBoydD3bDjJgnXIJ9Cr_oGr36FB5R5iKLRfpSXGN3dP9opQwU38v-r6dJk-vDaziAhRxAxKG59HJAjcNGNBlalyPEmoi939mIWU-GaeCu-JxR9Tn0k2TuKy0CJqQ-Jyh2beggR6Zmt0ewICe5TepUFVly3QN0T9ig3-qQ.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Bitter", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v40", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8fbeCL_EXFh2reU.ttf", + "200": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8XbfCL_EXFh2reU.ttf", + "300": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8ajfCL_EXFh2reU.ttf", + "regular": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8fbfCL_EXFh2reU.ttf", + "500": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8cTfCL_EXFh2reU.ttf", + "600": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8SjYCL_EXFh2reU.ttf", + "700": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8RHYCL_EXFh2reU.ttf", + "800": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8XbYCL_EXFh2reU.ttf", + "900": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8V_YCL_EXFh2reU.ttf", + "100italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6c4P3OWHpzveWxBw.ttf", + "200italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cYPzOWHpzveWxBw.ttf", + "300italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cvvzOWHpzveWxBw.ttf", + "italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6c4PzOWHpzveWxBw.ttf", + "500italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6c0vzOWHpzveWxBw.ttf", + "600italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cPvvOWHpzveWxBw.ttf", + "700italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cB_vOWHpzveWxBw.ttf", + "800italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cYPvOWHpzveWxBw.ttf", + "900italic": "https://fonts.gstatic.com/s/bitter/v40/raxjHiqOu8IVPmn7epZnDMyKBvHf5D6cSfvOWHpzveWxBw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bitter/v40/raxhHiqOu8IVPmnRc6SY1KXhnF_Y8fbfOL7OWA.ttf" + }, + { + "family": "Black And White Picture", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v30", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/blackandwhitepicture/v30/TwMe-JAERlQd3ooUHBUXGmrmioKjjnRSFO-NqI5HbcMi-yWY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/blackandwhitepicture/v30/TwMe-JAERlQd3ooUHBUXGmrmioKjjnRSFO-NqL5GZ8c.ttf" + }, + { + "family": "Black Han Sans", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/blackhansans/v24/ea8Aad44WunzF9a-dL6toA8r8nqVIXSkH-Hc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/blackhansans/v24/ea8Aad44WunzF9a-dL6toA8r8kqUK3A.ttf" + }, + { + "family": "Black Ops One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/blackopsone/v21/qWcsB6-ypo7xBdr6Xshe96H3WDzRtjkho4M.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/blackopsone/v21/qWcsB6-ypo7xBdr6Xshe96H3aD3bsg.ttf" + }, + { + "family": "Blaka", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/blaka/v8/8vIG7w8722p_6kdr20D2FV5e.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/blaka/v8/8vIG7w8722p_6ndq0UQ.ttf" + }, + { + "family": "Blaka Hollow", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/blakahollow/v8/MCoUzAL91sjRE2FsKsxUtezYB9oFyW_-oA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/blakahollow/v8/MCoUzAL91sjRE2FsKsxUtezoBtAB.ttf" + }, + { + "family": "Blaka Ink", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v10", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/blakaink/v10/AlZy_zVVtpj22Znag2chdXf4XB0Tow.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/blakaink/v10/AlZy_zVVtpj22Znag2cRdH38.ttf", + "colorCapabilities": [ + "COLRv1", + "SVG" + ] + }, + { + "family": "Blinker", + "variants": [ + "100", + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/blinker/v14/cIf_MaFatEE-VTaP_E2hZEsCkIt9QQ.ttf", + "200": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_OGARGEsnIJkWL4.ttf", + "300": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_IWDRGEsnIJkWL4.ttf", + "regular": "https://fonts.gstatic.com/s/blinker/v14/cIf9MaFatEE-VTaPxCmrYGkHgIs.ttf", + "600": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_PGFRGEsnIJkWL4.ttf", + "700": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_JWERGEsnIJkWL4.ttf", + "800": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_ImHRGEsnIJkWL4.ttf", + "900": "https://fonts.gstatic.com/s/blinker/v14/cIf4MaFatEE-VTaP_K2GRGEsnIJkWL4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/blinker/v14/cIf9MaFatEE-VTaP9CihZA.ttf" + }, + { + "family": "Bodoni Moda", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oU7awIBytVjMYwE.ttf", + "500": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oXzawIBytVjMYwE.ttf", + "600": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oZDdwIBytVjMYwE.ttf", + "700": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oandwIBytVjMYwE.ttf", + "800": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oc7dwIBytVjMYwE.ttf", + "900": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oefdwIBytVjMYwE.ttf", + "italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZKMN4sXrJcwHqoQ.ttf", + "500italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZGsN4sXrJcwHqoQ.ttf", + "600italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZ9sR4sXrJcwHqoQ.ttf", + "700italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZz8R4sXrJcwHqoQ.ttf", + "800italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZqMR4sXrJcwHqoQ.ttf", + "900italic": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT07PxzY382XsXX63LUYJSPUqb0pL6OQqxrZLnVbvZedvJtj-V7tIaZgcR4sXrJcwHqoQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bodonimoda/v28/aFT67PxzY382XsXX63LUYL6GYFcan6NJrKp-VPjfJMShrpsGFUt8oU7a8IF4sQ.ttf" + }, + { + "family": "Bodoni Moda SC", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v3", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbA7uXJyb9N7yr8E.ttf", + "500": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbDzuXJyb9N7yr8E.ttf", + "600": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbNDpXJyb9N7yr8E.ttf", + "700": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbOnpXJyb9N7yr8E.ttf", + "800": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbI7pXJyb9N7yr8E.ttf", + "900": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbKfpXJyb9N7yr8E.ttf", + "italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecattN-R8Pz3v8Etew.ttf", + "500italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatht-R8Pz3v8Etew.ttf", + "600italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatatiR8Pz3v8Etew.ttf", + "700italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatU9iR8Pz3v8Etew.ttf", + "800italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatNNiR8Pz3v8Etew.ttf", + "900italic": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjndGTykkIgA8197UwkzHp8F8_dYp-6DdBNRF6RX6k1R5fi-Gf55IgAecatHdiR8Pz3v8Etew.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bodonimodasc/v3/LYjhdGTykkIgA8197UwkzHp8F-XUUG5UNs2KqliEb-g_DaUdIA6SfiYHbA7ubJ2R8A.ttf" + }, + { + "family": "Bokor", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v32", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/bokor/v32/m8JcjfpeeaqTiR2WdInbcaxE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bokor/v32/m8JcjfpeeaqTiS2Xfo0.ttf" + }, + { + "family": "Boldonse", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/boldonse/v1/ZgNQjPxGPbbJUZemjC38hmHmNpCO.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/boldonse/v1/ZgNQjPxGPbbJUZemjB39jGU.ttf" + }, + { + "family": "Bona Nova", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/bonanova/v12/B50NF7ZCpX7fcHfvIUBJi6hqHK-CLA.ttf", + "italic": "https://fonts.gstatic.com/s/bonanova/v12/B50LF7ZCpX7fcHfvIUB5iaJuPqqSLJYf.ttf", + "700": "https://fonts.gstatic.com/s/bonanova/v12/B50IF7ZCpX7fcHfvIUBxN4dOFISeJY8GgQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bonanova/v12/B50NF7ZCpX7fcHfvIUB5iqJu.ttf" + }, + { + "family": "Bona Nova SC", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/bonanovasc/v1/mem5YaShyGWDiYdPG_c1Af4-VeJoCqeDjg.ttf", + "italic": "https://fonts.gstatic.com/s/bonanovasc/v1/memnYaShyGWDiYdPG_c1Af4OV-hsKKKTjrPW.ttf", + "700": "https://fonts.gstatic.com/s/bonanovasc/v1/memmYaShyGWDiYdPG_c1Af4G6c1MAoyfh6rPXA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bonanovasc/v1/mem5YaShyGWDiYdPG_c1Af4OVOhs.ttf" + }, + { + "family": "Bonbon", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v32", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/bonbon/v32/0FlVVPeVlFec4ee_cDEAbQY5-A.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bonbon/v32/0FlVVPeVlFec4eePcTsE.ttf" + }, + { + "family": "Bonheur Royale", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/bonheurroyale/v15/c4m51nt_GMTrtX-b9GcG4-YRmYK_c0f1N5Ij.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bonheurroyale/v15/c4m51nt_GMTrtX-b9GcG4-YRmbK-eUM.ttf" + }, + { + "family": "Boogaloo", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v25", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/boogaloo/v25/kmK-Zq45GAvOdnaW6x1F_SrQo_1K.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/boogaloo/v25/kmK-Zq45GAvOdnaW6y1E9y4.ttf" + }, + { + "family": "Borel", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-11-04", + "files": { + "regular": "https://fonts.gstatic.com/s/borel/v9/6qLOKZsftAPisgshYyMnOjwE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/borel/v9/6qLOKZsftAPisjsgaSc.ttf" + }, + { + "family": "Bowlby One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v25", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/bowlbyone/v25/taiPGmVuC4y96PFeqp8smo6C_Z0wcK4.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bowlbyone/v25/taiPGmVuC4y96PFeqp8sqo-I-Q.ttf" + }, + { + "family": "Bowlby One SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/bowlbyonesc/v27/DtVlJxerQqQm37tzN3wMug9Pzgj8owhNjuE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bowlbyonesc/v27/DtVlJxerQqQm37tzN3wMug9P_gn2pw.ttf" + }, + { + "family": "Braah One", + "variants": [ + "regular" + ], + "subsets": [ + "gurmukhi", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/braahone/v8/KFOlCnWUpt6LsxxxiylvAx05IsDqlA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/braahone/v8/KFOlCnWUpt6LsxxxiylfAhc9.ttf" + }, + { + "family": "Brawler", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/brawler/v20/xn7gYHE3xXewAscGsgC7S9XdZN8.ttf", + "700": "https://fonts.gstatic.com/s/brawler/v20/xn7lYHE3xXewAscGiryUb932eNaPfk8.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/brawler/v20/xn7gYHE3xXewAscGggGxTw.ttf" + }, + { + "family": "Bree Serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/breeserif/v18/4UaHrEJCrhhnVA3DgluAx63j5pN1MwI.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/breeserif/v18/4UaHrEJCrhhnVA3DgluA96zp4g.ttf" + }, + { + "family": "Bricolage Grotesque", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvZviyM0vs-wJDtw.ttf", + "300": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvUXiyM0vs-wJDtw.ttf", + "regular": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvRviyM0vs-wJDtw.ttf", + "500": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvSniyM0vs-wJDtw.ttf", + "600": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvcXlyM0vs-wJDtw.ttf", + "700": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvfzlyM0vs-wJDtw.ttf", + "800": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvZvlyM0vs-wJDtw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9U6as8bTXq_nANBjzKo3IeZx8z6up5BeSl5jBNz_19PpbpMXuECpwUxJBOm_OJWiaaD30YfKfjZZoLvRvi-Mwltw.ttf" + }, + { + "family": "Bruno Ace", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/brunoace/v7/WwkcxPa2E06x4trkOj_kMKoMWNMg3Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/brunoace/v7/WwkcxPa2E06x4trkOj_UMaAI.ttf" + }, + { + "family": "Bruno Ace SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/brunoacesc/v7/ptROTiycffFLBuiHjdJDl634LSFrpe8uZA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/brunoacesc/v7/ptROTiycffFLBuiHjdJDl63ILCtv.ttf" + }, + { + "family": "Brygada 1918", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y2-f-V8Wu5O3gbo.ttf", + "500": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y12f-V8Wu5O3gbo.ttf", + "600": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y7GY-V8Wu5O3gbo.ttf", + "700": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y4iY-V8Wu5O3gbo.ttf", + "italic": "https://fonts.gstatic.com/s/brygada1918/v27/pe06MI6eKpdGqlF5LANrM--qAeRhe6D4yip43qfcERwcv7GykboaLg.ttf", + "500italic": "https://fonts.gstatic.com/s/brygada1918/v27/pe06MI6eKpdGqlF5LANrM--qAeRhe6D4yip43qfcIxwcv7GykboaLg.ttf", + "600italic": "https://fonts.gstatic.com/s/brygada1918/v27/pe06MI6eKpdGqlF5LANrM--qAeRhe6D4yip43qfczxscv7GykboaLg.ttf", + "700italic": "https://fonts.gstatic.com/s/brygada1918/v27/pe06MI6eKpdGqlF5LANrM--qAeRhe6D4yip43qfc9hscv7GykboaLg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/brygada1918/v27/pe08MI6eKpdGqlF5LANrM--ACNaeo8mTUIR_y2-fyV4cvw.ttf" + }, + { + "family": "Bubblegum Sans", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/bubblegumsans/v22/AYCSpXb_Z9EORv1M5QTjEzMEtdaHzoPPb7R4.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bubblegumsans/v22/AYCSpXb_Z9EORv1M5QTjEzMEteaGxIc.ttf" + }, + { + "family": "Bubbler One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/bubblerone/v22/f0Xy0eqj68ppQV9KBLmAouHH26MPePkt.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bubblerone/v22/f0Xy0eqj68ppQV9KBLmAotHG0ac.ttf" + }, + { + "family": "Buda", + "variants": [ + "300" + ], + "subsets": [ + "latin" + ], + "version": "v31", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/buda/v31/GFDqWAN8mnyIJSSrG7UBr7pZKA0.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/buda/v31/GFDqWAN8mnyIJSSrK7QLqw.ttf" + }, + { + "family": "Buenard", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92sqpK0_3iBYVfsc4.ttf", + "500": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92sqbK0_3iBYVfsc4.ttf", + "600": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92sp3LE_3iBYVfsc4.ttf", + "700": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92spOLE_3iBYVfsc4.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/buenard/v22/OD5cuM6Cyma8FnnsJTzfWLAhv7i92sqpK3_2ghI.ttf" + }, + { + "family": "Bungee", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/bungee/v17/N0bU2SZBIuF2PU_ECn50Kd_PmA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bungee/v17/N0bU2SZBIuF2PU_0C3Rw.ttf" + }, + { + "family": "Bungee Hairline", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/bungeehairline/v26/snfys0G548t04270a_ljTLUVrv-7YB2dQ5ZPqQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bungeehairline/v26/snfys0G548t04270a_ljTLUVrv-LYReZ.ttf" + }, + { + "family": "Bungee Inline", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/bungeeinline/v19/Gg8zN58UcgnlCweMrih332VuDGJ1-FEglsc.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bungeeinline/v19/Gg8zN58UcgnlCweMrih332VuPGN__A.ttf" + }, + { + "family": "Bungee Outline", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/bungeeoutline/v24/_6_mEDvmVP24UvU2MyiGDslL3Qg3YhJqPXxo.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bungeeoutline/v24/_6_mEDvmVP24UvU2MyiGDslL3Tg2aBY.ttf" + }, + { + "family": "Bungee Shade", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/bungeeshade/v17/DtVkJxarWL0t2KdzK3oI_jks7iLSrwFUlw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bungeeshade/v17/DtVkJxarWL0t2KdzK3oI_jkc7yjW.ttf" + }, + { + "family": "Bungee Spice", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/bungeespice/v15/nwpTtK2nIhxE0q-IwgSpZBqCzyI-aMPF7Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bungeespice/v15/nwpTtK2nIhxE0q-IwgSpZBqyzig6.ttf", + "colorCapabilities": [ + "COLRv1", + "SVG" + ] + }, + { + "family": "Bungee Tint", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/bungeetint/v3/J7abnpl_EGtUEuAJwN9WmrtKMDwTpTkB.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bungeetint/v3/J7abnpl_EGtUEuAJwN9WmotLOjg.ttf", + "colorCapabilities": [ + "COLRv0" + ] + }, + { + "family": "Butcherman", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/butcherman/v25/2EbiL-thF0loflXUBOdb1zWzq_5uT84.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/butcherman/v25/2EbiL-thF0loflXUBOdb5zS5rw.ttf" + }, + { + "family": "Butterfly Kids", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/butterflykids/v27/ll8lK2CWTjuqAsXDqlnIbMNs5S4arxFrAX1D.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/butterflykids/v27/ll8lK2CWTjuqAsXDqlnIbMNs5R4bpRU.ttf" + }, + { + "family": "Bytesized", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/bytesized/v1/goksH6L8FkdnROln8XBTS0CjkP1Yog.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/bytesized/v1/goksH6L8FkdnROln8XBjSkqn.ttf" + }, + { + "family": "Cabin", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v35", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkV2EL7Gvxm7rE_s.ttf", + "500": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkW-EL7Gvxm7rE_s.ttf", + "600": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkYODL7Gvxm7rE_s.ttf", + "700": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkbqDL7Gvxm7rE_s.ttf", + "italic": "https://fonts.gstatic.com/s/cabin/v35/u-4V0qWljRw-Pd815fNqc8T_wAFcX-c37MPiNYlWniJ2hJXHx_KlwkzuA_u1Bg.ttf", + "500italic": "https://fonts.gstatic.com/s/cabin/v35/u-4V0qWljRw-Pd815fNqc8T_wAFcX-c37MPiNYlWniJ2hJXH9fKlwkzuA_u1Bg.ttf", + "600italic": "https://fonts.gstatic.com/s/cabin/v35/u-4V0qWljRw-Pd815fNqc8T_wAFcX-c37MPiNYlWniJ2hJXHGfWlwkzuA_u1Bg.ttf", + "700italic": "https://fonts.gstatic.com/s/cabin/v35/u-4V0qWljRw-Pd815fNqc8T_wAFcX-c37MPiNYlWniJ2hJXHIPWlwkzuA_u1Bg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cabin/v35/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkV2EH7Clwg.ttf" + }, + { + "family": "Cabin Condensed", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpMtK6mNhBK2err_hqkYhHRqmwaYOjZ5HZl8Q.ttf", + "500": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpJtK6mNhBK2err_hqkYhHRqmwilMH97F15-K1oqQ.ttf", + "600": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpJtK6mNhBK2err_hqkYhHRqmwiuMb97F15-K1oqQ.ttf", + "700": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpJtK6mNhBK2err_hqkYhHRqmwi3Mf97F15-K1oqQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cabincondensed/v21/nwpMtK6mNhBK2err_hqkYhHRqmwqYeLd.ttf" + }, + { + "family": "Cabin Sketch", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/cabinsketch/v23/QGYpz_kZZAGCONcK2A4bGOjMn9JM6fnuKg.ttf", + "700": "https://fonts.gstatic.com/s/cabinsketch/v23/QGY2z_kZZAGCONcK2A4bGOj0I_1o4dLyI4CMFw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cabinsketch/v23/QGYpz_kZZAGCONcK2A4bGOj8nthI.ttf" + }, + { + "family": "Cactus Classical Serif", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-07-16", + "files": { + "regular": "https://fonts.gstatic.com/s/cactusclassicalserif/v13/sZlVdQ6K-zJOCzUaS90zMNN-Ep-OoC8dZr0JFuBIFX-pv-E.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cactusclassicalserif/v13/sZlVdQ6K-zJOCzUaS90zMNN-Ep-OoC8dZr0JJuFCEQ.ttf" + }, + { + "family": "Caesar Dressing", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/caesardressing/v22/yYLx0hLa3vawqtwdswbotmK4vrR3cbb6LZttyg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/caesardressing/v22/yYLx0hLa3vawqtwdswbotmK4vrRHcLz-.ttf" + }, + { + "family": "Cagliostro", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/cagliostro/v22/ZgNWjP5HM73BV5amnX-TjGXEM4COoE4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cagliostro/v22/ZgNWjP5HM73BV5amnX-TvGTONw.ttf" + }, + { + "family": "Cairo", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v31", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hGA-W1ToLQ-HmkA.ttf", + "300": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hL4-W1ToLQ-HmkA.ttf", + "regular": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hOA-W1ToLQ-HmkA.ttf", + "500": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hNI-W1ToLQ-HmkA.ttf", + "600": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hD45W1ToLQ-HmkA.ttf", + "700": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hAc5W1ToLQ-HmkA.ttf", + "800": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hGA5W1ToLQ-HmkA.ttf", + "900": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hEk5W1ToLQ-HmkA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cairo/v31/SLXgc1nY6HkvangtZmpQdkhzfH5lkSs2SgRjCAGMQ1z0hOA-a1XiKQ.ttf" + }, + { + "family": "Cairo Play", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1EnYq9yXa8GvzaA.ttf", + "300": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1zHYq9yXa8GvzaA.ttf", + "regular": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1knYq9yXa8GvzaA.ttf", + "500": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1oHYq9yXa8GvzaA.ttf", + "600": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1THEq9yXa8GvzaA.ttf", + "700": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1dXEq9yXa8GvzaA.ttf", + "800": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1EnEq9yXa8GvzaA.ttf", + "900": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1O3Eq9yXa8GvzaA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cairoplay/v13/wXKEE3QSpo4vpRz_mz6FP-8iaauCLt_Hjopv3miu5IvcJo49mOo1knYa9i_e.ttf", + "colorCapabilities": [ + "COLRv0" + ] + }, + { + "family": "Cal Sans", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-06-09", + "files": { + "regular": "https://fonts.gstatic.com/s/calsans/v2/fdN99sWUv3gWqXxqqSBbvloE4LZx.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/calsans/v2/fdN99sWUv3gWqXxqqRBatF4.ttf" + }, + { + "family": "Caladea", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/caladea/v8/kJEzBugZ7AAjhybUjR93-9IztOc.ttf", + "italic": "https://fonts.gstatic.com/s/caladea/v8/kJExBugZ7AAjhybUvR19__A2pOdvDA.ttf", + "700": "https://fonts.gstatic.com/s/caladea/v8/kJE2BugZ7AAjhybUtaNY39oYqO52FZ0.ttf", + "700italic": "https://fonts.gstatic.com/s/caladea/v8/kJE0BugZ7AAjhybUvR1FQ98SrMxzBZ2lDA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/caladea/v8/kJEzBugZ7AAjhybUvR59_w.ttf" + }, + { + "family": "Calistoga", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/calistoga/v18/6NUU8F2OJg6MeR7l4e0vtMYAwdRZfw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/calistoga/v18/6NUU8F2OJg6MeR7l4e0ftcwE.ttf" + }, + { + "family": "Calligraffitti", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/calligraffitti/v20/46k2lbT3XjDVqJw3DCmCFjE0vnFZM5ZBpYN-.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/calligraffitti/v20/46k2lbT3XjDVqJw3DCmCFjE0vkFYOZI.ttf" + }, + { + "family": "Cambay", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/cambay/v14/SLXJc1rY6H0_ZDsGbrSIz9JsaA.ttf", + "italic": "https://fonts.gstatic.com/s/cambay/v14/SLXLc1rY6H0_ZDs2bL6M7dd8aGZk.ttf", + "700": "https://fonts.gstatic.com/s/cambay/v14/SLXKc1rY6H0_ZDs-0pusx_lwYX99kA.ttf", + "700italic": "https://fonts.gstatic.com/s/cambay/v14/SLXMc1rY6H0_ZDs2bIYwwvN0Q3ptkDMN.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cambay/v14/SLXJc1rY6H0_ZDs2b76M.ttf" + }, + { + "family": "Cambo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/cambo/v19/IFSqHeNEk8FJk416ok7xkPm8.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cambo/v19/IFSqHeNEk8FJk717qEo.ttf" + }, + { + "family": "Candal", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/candal/v16/XoHn2YH6T7-t_8cNAR4Jt9Yxlw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/candal/v16/XoHn2YH6T7-t_8c9ABQN.ttf" + }, + { + "family": "Cantarell", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/cantarell/v18/B50NF7ZDq37KMUvlO01Ji6hqHK-CLA.ttf", + "italic": "https://fonts.gstatic.com/s/cantarell/v18/B50LF7ZDq37KMUvlO015iaJuPqqSLJYf.ttf", + "700": "https://fonts.gstatic.com/s/cantarell/v18/B50IF7ZDq37KMUvlO01xN4dOFISeJY8GgQ.ttf", + "700italic": "https://fonts.gstatic.com/s/cantarell/v18/B50WF7ZDq37KMUvlO015iZrSEY6aB4oWgWHB.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cantarell/v18/B50NF7ZDq37KMUvlO015iqJu.ttf" + }, + { + "family": "Cantata One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/cantataone/v16/PlI5Fl60Nb5obNzNe2jslVxEt8CwfGaD.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cantataone/v16/PlI5Fl60Nb5obNzNe2jslWxFvcQ.ttf" + }, + { + "family": "Cantora One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/cantoraone/v20/gyB4hws1JdgnKy56GB_JX6zdZ4vZVbgZ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cantoraone/v20/gyB4hws1JdgnKy56GB_JX5zcbY8.ttf" + }, + { + "family": "Caprasimo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/caprasimo/v6/esDT31JQOPuXIUGBp72klZUCGpG-GQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/caprasimo/v6/esDT31JQOPuXIUGBp72UlJ8G.ttf" + }, + { + "family": "Capriola", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/capriola/v15/wXKoE3YSppcvo1PDln_8L-AinG8y.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/capriola/v15/wXKoE3YSppcvo1PDlk_9JeQ.ttf" + }, + { + "family": "Caramel", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/caramel/v8/P5sCzZKBbMTf_ShyxCRuiZ-uydg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/caramel/v8/P5sCzZKBbMTf_Shy9CVkjQ.ttf" + }, + { + "family": "Carattere", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/carattere/v8/4iCv6Kp1b9dXlgt_CkvTt2aMH4V_gg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/carattere/v8/4iCv6Kp1b9dXlgt_CkvjtmyI.ttf" + }, + { + "family": "Cardo", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "gothic", + "greek", + "greek-ext", + "hebrew", + "latin", + "latin-ext", + "old-italic", + "runic" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/cardo/v21/wlp_gwjKBV1pqiv_1oAZ2H5O.ttf", + "italic": "https://fonts.gstatic.com/s/cardo/v21/wlpxgwjKBV1pqhv93IQ73W5OcCk.ttf", + "700": "https://fonts.gstatic.com/s/cardo/v21/wlpygwjKBV1pqhND-aQR82JHaTBX.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cardo/v21/wlp_gwjKBV1pqhv-3IQ.ttf" + }, + { + "family": "Carlito", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/carlito/v4/3Jn9SDPw3m-pk039PDCLTXUETuE.ttf", + "italic": "https://fonts.gstatic.com/s/carlito/v4/3Jn_SDPw3m-pk039DDKBSVcBXuFb0Q.ttf", + "700": "https://fonts.gstatic.com/s/carlito/v4/3Jn4SDPw3m-pk039BIykaX0vUuhCyOo.ttf", + "700italic": "https://fonts.gstatic.com/s/carlito/v4/3Jn6SDPw3m-pk039DDK59XglVspH2OprMQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/carlito/v4/3Jn9SDPw3m-pk039DDGBSQ.ttf" + }, + { + "family": "Carme", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/carme/v17/ptRHTiWdbvZIDOjGxLNrxfbZ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/carme/v17/ptRHTiWdbvZIDNjHzrc.ttf" + }, + { + "family": "Carrois Gothic", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/carroisgothic/v17/Z9XPDmFATg-N1PLtLOOxvIHl9ZmD3i7ajcJ-.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/carroisgothic/v17/Z9XPDmFATg-N1PLtLOOxvIHl9amC1Co.ttf" + }, + { + "family": "Carrois Gothic SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/carroisgothicsc/v16/ZgNJjOVHM6jfUZCmyUqT2A2HVKjc-28nNHabY4dN.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/carroisgothicsc/v16/ZgNJjOVHM6jfUZCmyUqT2A2HVKjc-18mPnI.ttf" + }, + { + "family": "Carter One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/carterone/v18/q5uCsoe5IOB2-pXv9UcNIxR2hYxREMs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/carterone/v18/q5uCsoe5IOB2-pXv9UcNExV8gQ.ttf" + }, + { + "family": "Cascadia Code", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "arabic", + "braille", + "cyrillic", + "cyrillic-ext", + "greek", + "hebrew", + "latin", + "latin-ext", + "symbols2", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuWMOaDPb9pHaHCA.ttf", + "300": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuVSOaDPb9pHaHCA.ttf", + "regular": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuUMOaDPb9pHaHCA.ttf", + "500": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuU-OaDPb9pHaHCA.ttf", + "600": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuXSPqDPb9pHaHCA.ttf", + "700": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuXrPqDPb9pHaHCA.ttf", + "200italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEesiMZd5lbWCAUXU.ttf", + "300italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEehaMZd5lbWCAUXU.ttf", + "italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEekiMZd5lbWCAUXU.ttf", + "500italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEenqMZd5lbWCAUXU.ttf", + "600italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEepaLZd5lbWCAUXU.ttf", + "700italic": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc9B6-zq5zxD57cT5s916v3aD7BuTnUax-yWfDEeq-LZd5lbWCAUXU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cascadiacode/v5/qWc_B6-zq5zxD57cT5s916v3QjfzRuG9AIUcXuUMOZDOZd4.ttf" + }, + { + "family": "Cascadia Mono", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "arabic", + "braille", + "cyrillic", + "cyrillic-ext", + "greek", + "hebrew", + "latin", + "latin-ext", + "symbols2", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTadsWVkNot27AYk.ttf", + "300": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTZDsWVkNot27AYk.ttf", + "regular": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTYdsWVkNot27AYk.ttf", + "500": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTYvsWVkNot27AYk.ttf", + "600": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTbDtmVkNot27AYk.ttf", + "700": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTb6tmVkNot27AYk.ttf", + "200italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8g0nPI9U6RYkQrY.ttf", + "300italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8tMnPI9U6RYkQrY.ttf", + "italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8o0nPI9U6RYkQrY.ttf", + "500italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8r8nPI9U6RYkQrY.ttf", + "600italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8lMgPI9U6RYkQrY.ttf", + "700italic": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZnzw5pquJF3iuizJDZYqr1aZc93m0eKfzCTiPV8mogPI9U6RYkQrY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cascadiamono/v5/TUZlzw5pquJF3iuizJDZYqr1Q54PIbV3QmZsSTYdsVVlPI8.ttf" + }, + { + "family": "Castoro", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/castoro/v20/1q2GY5yMCld3-O4cHYhEzOYenEU.ttf", + "italic": "https://fonts.gstatic.com/s/castoro/v20/1q2EY5yMCld3-O4cLYpOyMQbjEX5fw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/castoro/v20/1q2GY5yMCld3-O4cLYlOyA.ttf" + }, + { + "family": "Castoro Titling", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v10", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/castorotitling/v10/buEupouwccj03leTfjUAhEZWlrNqYgckeo9RMw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/castorotitling/v10/buEupouwccj03leTfjUAhEZWlrNaYw0g.ttf" + }, + { + "family": "Catamaran", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil" + ], + "version": "v28", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPHjc1anXuluiLyw.ttf", + "200": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPPjd1anXuluiLyw.ttf", + "300": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPCbd1anXuluiLyw.ttf", + "regular": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPHjd1anXuluiLyw.ttf", + "500": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPErd1anXuluiLyw.ttf", + "600": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPKba1anXuluiLyw.ttf", + "700": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPJ_a1anXuluiLyw.ttf", + "800": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPPja1anXuluiLyw.ttf", + "900": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPNHa1anXuluiLyw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/catamaran/v28/o-0bIpQoyXQa2RxT7-5B6Ryxs2E_6n1iPHjd5ajdvg.ttf" + }, + { + "family": "Caudex", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "greek", + "greek-ext", + "latin", + "latin-ext", + "runic", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/caudex/v19/esDQ311QOP6BJUrIyviAnb4eEw.ttf", + "italic": "https://fonts.gstatic.com/s/caudex/v19/esDS311QOP6BJUr4yPKEv7sOE4in.ttf", + "700": "https://fonts.gstatic.com/s/caudex/v19/esDT311QOP6BJUrwdteklZUCGpG-GQ.ttf", + "700italic": "https://fonts.gstatic.com/s/caudex/v19/esDV311QOP6BJUr4yMo4kJ8GOJSuGdLB.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/caudex/v19/esDQ311QOP6BJUr4y_KE.ttf" + }, + { + "family": "Caveat", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9SIKjYBxPigs.ttf", + "500": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjcB9SIKjYBxPigs.ttf", + "600": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjSx6SIKjYBxPigs.ttf", + "700": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjRV6SIKjYBxPigs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9eIOpZA.ttf" + }, + { + "family": "Caveat Brush", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/caveatbrush/v12/EYq0maZfwr9S9-ETZc3fKXtMW7mT03pdQw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/caveatbrush/v12/EYq0maZfwr9S9-ETZc3fKXt8WrOX.ttf" + }, + { + "family": "Cedarville Cursive", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/cedarvillecursive/v18/yYL00g_a2veiudhUmxjo5VKkoqA-B_neJbBxw8BeTg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cedarvillecursive/v18/yYL00g_a2veiudhUmxjo5VKkoqA-B_nuJLp1.ttf" + }, + { + "family": "Ceviche One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/cevicheone/v17/gyB4hws1IcA6JzR-GB_JX6zdZ4vZVbgZ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cevicheone/v17/gyB4hws1IcA6JzR-GB_JX5zcbY8.ttf" + }, + { + "family": "Chakra Petch", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/chakrapetch/v13/cIflMapbsEk7TDLdtEz1BwkeNIhFQJXE3AY00g.ttf", + "300italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfnMapbsEk7TDLdtEz1BwkWmpLJQp_A_gMk0izH.ttf", + "regular": "https://fonts.gstatic.com/s/chakrapetch/v13/cIf6MapbsEk7TDLdtEz1BwkmmKBhSL7Y1Q.ttf", + "italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfkMapbsEk7TDLdtEz1BwkWmqplarvI1R8t.ttf", + "500": "https://fonts.gstatic.com/s/chakrapetch/v13/cIflMapbsEk7TDLdtEz1BwkebIlFQJXE3AY00g.ttf", + "500italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfnMapbsEk7TDLdtEz1BwkWmpKRQ5_A_gMk0izH.ttf", + "600": "https://fonts.gstatic.com/s/chakrapetch/v13/cIflMapbsEk7TDLdtEz1BwkeQI5FQJXE3AY00g.ttf", + "600italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfnMapbsEk7TDLdtEz1BwkWmpK9RJ_A_gMk0izH.ttf", + "700": "https://fonts.gstatic.com/s/chakrapetch/v13/cIflMapbsEk7TDLdtEz1BwkeJI9FQJXE3AY00g.ttf", + "700italic": "https://fonts.gstatic.com/s/chakrapetch/v13/cIfnMapbsEk7TDLdtEz1BwkWmpLZRZ_A_gMk0izH.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chakrapetch/v13/cIf6MapbsEk7TDLdtEz1BwkWmapl.ttf" + }, + { + "family": "Changa", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZy2xQjDp9htf1ZM.ttf", + "300": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ_OxQjDp9htf1ZM.ttf", + "regular": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ62xQjDp9htf1ZM.ttf", + "500": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ5-xQjDp9htf1ZM.ttf", + "600": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ3O2QjDp9htf1ZM.ttf", + "700": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ0q2QjDp9htf1ZM.ttf", + "800": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZy22QjDp9htf1ZM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/changa/v29/2-c79JNi2YuVOUcOarRPgnNGooxCZ62xcjHj8g.ttf" + }, + { + "family": "Changa One", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/changaone/v22/xfu00W3wXn3QLUJXhzq46AbouLfbK64.ttf", + "italic": "https://fonts.gstatic.com/s/changaone/v22/xfu20W3wXn3QLUJXhzq42ATivJXeO67ISw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/changaone/v22/xfu00W3wXn3QLUJXhzq42AfivA.ttf" + }, + { + "family": "Chango", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/chango/v29/2V0cKI0OB5U7WaJyz324TFUaAw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chango/v29/2V0cKI0OB5U7WaJCzne8.ttf" + }, + { + "family": "Charis SIL", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/charissil/v2/oPWK_kV3l-s-Q8govXvKrPrmYjZ2Xn0.ttf", + "italic": "https://fonts.gstatic.com/s/charissil/v2/oPWI_kV3l-s-Q8govXvKnPjsZhRzTn2Ozw.ttf", + "700": "https://fonts.gstatic.com/s/charissil/v2/oPWJ_kV3l-s-Q8govXvKlEbJRj5dQnSX1ko.ttf", + "700italic": "https://fonts.gstatic.com/s/charissil/v2/oPWX_kV3l-s-Q8govXvKnPjU2jtXRlaSxkrMCQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/charissil/v2/oPWK_kV3l-s-Q8govXvKnPvsZg.ttf" + }, + { + "family": "Charm", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/charm/v14/7cHmv4oii5K0MeYvIe804WIo.ttf", + "700": "https://fonts.gstatic.com/s/charm/v14/7cHrv4oii5K0Md6TDss8yn4hnCci.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/charm/v14/7cHmv4oii5K0MdYuK-s.ttf" + }, + { + "family": "Charmonman", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/charmonman/v20/MjQDmiR3vP_nuxDv47jiWJGovLdh6OE.ttf", + "700": "https://fonts.gstatic.com/s/charmonman/v20/MjQAmiR3vP_nuxDv47jiYC2HmL9K9OhmGnY.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/charmonman/v20/MjQDmiR3vP_nuxDv47jiaJCiuA.ttf" + }, + { + "family": "Chathura", + "variants": [ + "100", + "300", + "regular", + "700", + "800" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/chathura/v22/_gP91R7-rzUuVjim42dEq0SbTvZyuDo.ttf", + "300": "https://fonts.gstatic.com/s/chathura/v22/_gP81R7-rzUuVjim42eMiWSxYPp7oSNy.ttf", + "regular": "https://fonts.gstatic.com/s/chathura/v22/_gP71R7-rzUuVjim418goUC5S-Zy.ttf", + "700": "https://fonts.gstatic.com/s/chathura/v22/_gP81R7-rzUuVjim42ecjmSxYPp7oSNy.ttf", + "800": "https://fonts.gstatic.com/s/chathura/v22/_gP81R7-rzUuVjim42eAjWSxYPp7oSNy.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chathura/v22/_gP71R7-rzUuVjim428hq0Q.ttf" + }, + { + "family": "Chau Philomene One", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/chauphilomeneone/v16/55xxezRsPtfie1vPY49qzdgSlJiHRQFsnIx7QMISdQ.ttf", + "italic": "https://fonts.gstatic.com/s/chauphilomeneone/v16/55xzezRsPtfie1vPY49qzdgSlJiHRQFcnoZ_YscCdXQB.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chauphilomeneone/v16/55xxezRsPtfie1vPY49qzdgSlJiHRQFcnYZ_.ttf" + }, + { + "family": "Chela One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/chelaone/v22/6ae-4KC7Uqgdz_JZdPIy31vWNTMwoQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chelaone/v22/6ae-4KC7Uqgdz_JZdPIC3lHS.ttf" + }, + { + "family": "Chelsea Market", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/chelseamarket/v14/BCawqZsHqfr89WNP_IApC8tzKBhlLA4uKkWk.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chelseamarket/v14/BCawqZsHqfr89WNP_IApC8tzKChkJgo.ttf" + }, + { + "family": "Chenla", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v25", + "lastModified": "2022-09-22", + "files": { + "regular": "https://fonts.gstatic.com/s/chenla/v25/SZc43FDpIKu8WZ9eXxfonUPL6Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chenla/v25/SZc43FDpIKu8WZ9uXh3s.ttf" + }, + { + "family": "Cherish", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/cherish/v9/ll88K2mXUyqsDsTN5iDCI6IJjg8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cherish/v9/ll88K2mXUyqsDsTN1iHIJw.ttf" + }, + { + "family": "Cherry Bomb One", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/cherrybombone/v11/y83DW4od1h6KlV3c6JJhRhGOdhrKDNpF41fr-w.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cherrybombone/v11/y83DW4od1h6KlV3c6JJhRhGOdhr6DdBB.ttf" + }, + { + "family": "Cherry Cream Soda", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/cherrycreamsoda/v21/UMBIrOxBrW6w2FFyi9paG0fdVdRciTd6Cd47DJ7G.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cherrycreamsoda/v21/UMBIrOxBrW6w2FFyi9paG0fdVdRciQd7A9o.ttf" + }, + { + "family": "Cherry Swash", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/cherryswash/v22/i7dNIFByZjaNAMxtZcnfAy58QHi-EwWMbg.ttf", + "700": "https://fonts.gstatic.com/s/cherryswash/v22/i7dSIFByZjaNAMxtZcnfAy5E_FeaGy6QZ3WfYg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cherryswash/v22/i7dNIFByZjaNAMxtZcnfAy5MQXK6.ttf" + }, + { + "family": "Chewy", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/chewy/v18/uK_94ruUb-k-wk5xIDMfO-ed.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chewy/v18/uK_94ruUb-k-wn5wKjc.ttf" + }, + { + "family": "Chicle", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/chicle/v27/lJwG-pw9i2dqU-BDyWKuobYSxw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chicle/v27/lJwG-pw9i2dqU-BzyGiq.ttf" + }, + { + "family": "Chilanka", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "malayalam" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/chilanka/v23/WWXRlj2DZQiMJYaYRrJQI9EAZhTO.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chilanka/v23/WWXRlj2DZQiMJYaYRoJRKdU.ttf" + }, + { + "family": "Chiron GoRound TC", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-08-26", + "files": { + "200": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKq7BqJHA8n4CeB1Q.ttf", + "300": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqMhqJHA8n4CeB1Q.ttf", + "regular": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqbBqJHA8n4CeB1Q.ttf", + "500": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqXhqJHA8n4CeB1Q.ttf", + "600": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqsh2JHA8n4CeB1Q.ttf", + "700": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqix2JHA8n4CeB1Q.ttf", + "800": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKq7B2JHA8n4CeB1Q.ttf", + "900": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqxR2JHA8n4CeB1Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chirongoroundtc/v2/tssEAopDbiwZ4xauFDX3yQ3Ywoaj6kNR0yP4oqNo8RKqbBq5HQUj.ttf" + }, + { + "family": "Chiron Hei HK", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "symbols2", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-08-26", + "files": { + "200": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lLtr18MkTEyjPI0.ttf", + "300": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lIzr18MkTEyjPI0.ttf", + "regular": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lJtr18MkTEyjPI0.ttf", + "500": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lJfr18MkTEyjPI0.ttf", + "600": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lKzqF8MkTEyjPI0.ttf", + "700": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lKKqF8MkTEyjPI0.ttf", + "800": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lLtqF8MkTEyjPI0.ttf", + "900": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lLEqF8MkTEyjPI0.ttf", + "200italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7DdPmzUQieI0QjQ.ttf", + "300italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7OlPmzUQieI0QjQ.ttf", + "italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7LdPmzUQieI0QjQ.ttf", + "500italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7IVPmzUQieI0QjQ.ttf", + "600italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7GlImzUQieI0QjQ.ttf", + "700italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7FBImzUQieI0QjQ.ttf", + "800italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7DdImzUQieI0QjQ.ttf", + "900italic": "https://fonts.gstatic.com/s/chironheihk/v3/wXK8E3MSr44vpVKPvzqVJaxhjXUJvtAmXhfU2Uel7B5ImzUQieI0QjQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chironheihk/v3/wXK-E3MSr44vpVKPvzqVJaxhp3w7QQhPNY163lJtr28NmzU.ttf" + }, + { + "family": "Chiron Sung HK", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "chinese-hongkong", + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "symbols2", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-06-12", + "files": { + "200": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjdOSt_krURtf4_Q.ttf", + "300": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjquSt_krURtf4_Q.ttf", + "regular": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRj9OSt_krURtf4_Q.ttf", + "500": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjxuSt_krURtf4_Q.ttf", + "600": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjKuOt_krURtf4_Q.ttf", + "700": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjE-Ot_krURtf4_Q.ttf", + "800": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjdOOt_krURtf4_Q.ttf", + "900": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRjXeOt_krURtf4_Q.ttf", + "200italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKfFvUDQZNLo_U2r.ttf", + "300italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKcbvUDQZNLo_U2r.ttf", + "italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKdFvUDQZNLo_U2r.ttf", + "500italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKd3vUDQZNLo_U2r.ttf", + "600italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKebukDQZNLo_U2r.ttf", + "700italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKeiukDQZNLo_U2r.ttf", + "800italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKfFukDQZNLo_U2r.ttf", + "900italic": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFvD_XLTZPpXIpS3-3dhGzHTQKsJzDwcbmjWBN2PKfsukDQZNLo_U2r.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chironsunghk/v1/nuFtD_XLTZPpXIpS3-3dhGzHTSilFc8oGNI59hRj9OSd_0DQ.ttf" + }, + { + "family": "Chivo", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_vB7ul2DSFXjQiQ.ttf", + "200": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_PB_ul2DSFXjQiQ.ttf", + "300": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_4h_ul2DSFXjQiQ.ttf", + "regular": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_vB_ul2DSFXjQiQ.ttf", + "500": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_jh_ul2DSFXjQiQ.ttf", + "600": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_Yhjul2DSFXjQiQ.ttf", + "700": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_Wxjul2DSFXjQiQ.ttf", + "800": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_PBjul2DSFXjQiQ.ttf", + "900": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_FRjul2DSFXjQiQ.ttf", + "100italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFwG1WrWN33AiasJ.ttf", + "200italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFyG1GrWN33AiasJ.ttf", + "300italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFxY1GrWN33AiasJ.ttf", + "italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFwG1GrWN33AiasJ.ttf", + "500italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFw01GrWN33AiasJ.ttf", + "600italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFzY02rWN33AiasJ.ttf", + "700italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFzh02rWN33AiasJ.ttf", + "800italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFyG02rWN33AiasJ.ttf", + "900italic": "https://fonts.gstatic.com/s/chivo/v21/va9Z4kzIxd1KFrBtW-13ZHhT-jDqdFyv02rWN33AiasJ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chivo/v21/va9b4kzIxd1KFppkaRKvDRPJVDf_vB_elmrW.ttf" + }, + { + "family": "Chivo Mono", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D7hrqfVKphL03l4.ttf", + "200": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D5hr6fVKphL03l4.ttf", + "300": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D6_r6fVKphL03l4.ttf", + "regular": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D7hr6fVKphL03l4.ttf", + "500": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D7Tr6fVKphL03l4.ttf", + "600": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D4_qKfVKphL03l4.ttf", + "700": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D4GqKfVKphL03l4.ttf", + "800": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D5hqKfVKphL03l4.ttf", + "900": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D5IqKfVKphL03l4.ttf", + "100italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7E-XIJxp1ml4imo.ttf", + "200italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7M-WIJxp1ml4imo.ttf", + "300italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7BGWIJxp1ml4imo.ttf", + "italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7E-WIJxp1ml4imo.ttf", + "500italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7H2WIJxp1ml4imo.ttf", + "600italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7JGRIJxp1ml4imo.ttf", + "700italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7KiRIJxp1ml4imo.ttf", + "800italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7M-RIJxp1ml4imo.ttf", + "900italic": "https://fonts.gstatic.com/s/chivomono/v11/mFTjWbgRxKvF_Z5eQMO9gxoZ20KOQ0Hs2ysp7OaRIJxp1ml4imo.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chivomono/v11/mFThWbgRxKvF_Z5eQMO9qRMrJJrnKNtC3D7hr5fUIJw.ttf" + }, + { + "family": "Chocolate Classical Sans", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/chocolateclassicalsans/v14/nuFqD-PLTZX4XIgT-P2ToCDudWHHflqUpTpfjWdDPI2J9mHITw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chocolateclassicalsans/v14/nuFqD-PLTZX4XIgT-P2ToCDudWHHflqUpTpfjWdzPYeN.ttf" + }, + { + "family": "Chokokutai", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/chokokutai/v12/kmK4Zqw4HwvCeHGM8Fws9y7ypu1Kr7I.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chokokutai/v12/kmK4Zqw4HwvCeHGM8Fwsxy_4og.ttf" + }, + { + "family": "Chonburi", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/chonburi/v14/8AtqGs-wOpGRTBq66IWaFr3biAfZ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/chonburi/v14/8AtqGs-wOpGRTBq66LWbHLk.ttf" + }, + { + "family": "Cinzel", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-tbnTYrvDE5ZdqU.ttf", + "500": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-uTnTYrvDE5ZdqU.ttf", + "600": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-gjgTYrvDE5ZdqU.ttf", + "700": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-jHgTYrvDE5ZdqU.ttf", + "800": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-lbgTYrvDE5ZdqU.ttf", + "900": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-n_gTYrvDE5ZdqU.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cinzel/v26/8vIU7ww63mVu7gtR-kwKxNvkNOjw-tbnfYvlCA.ttf" + }, + { + "family": "Cinzel Decorative", + "variants": [ + "regular", + "700", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/cinzeldecorative/v19/daaCSScvJGqLYhG8nNt8KPPswUAPnh7URs1LaCyC.ttf", + "700": "https://fonts.gstatic.com/s/cinzeldecorative/v19/daaHSScvJGqLYhG8nNt8KPPswUAPniZoaelDQzCLlQXE.ttf", + "900": "https://fonts.gstatic.com/s/cinzeldecorative/v19/daaHSScvJGqLYhG8nNt8KPPswUAPniZQa-lDQzCLlQXE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cinzeldecorative/v19/daaCSScvJGqLYhG8nNt8KPPswUAPni7VTMk.ttf" + }, + { + "family": "Clicker Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/clickerscript/v14/raxkHiKPvt8CMH6ZWP8PdlEq72rY2zqUKafv.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/clickerscript/v14/raxkHiKPvt8CMH6ZWP8PdlEq71rZ0T4.ttf" + }, + { + "family": "Climate Crisis", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/climatecrisis/v14/wEOpEB3AntNeKCPBVW9XOKlmp3AUgWFN1DvIvcM0gFp6jaUrGb7PsQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/climatecrisis/v14/wEOpEB3AntNeKCPBVW9XOKlmp3AUgWFN1DvIvcM0gFpKjK8v.ttf" + }, + { + "family": "Coda", + "variants": [ + "regular", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/coda/v22/SLXHc1jY5nQ8JUIMapaN39I.ttf", + "800": "https://fonts.gstatic.com/s/coda/v22/SLXIc1jY5nQ8HeIgTp6mw9t1cX8.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/coda/v22/SLXHc1jY5nQ8FUMGbg.ttf" + }, + { + "family": "Codystar", + "variants": [ + "300", + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/codystar/v19/FwZf7-Q1xVk-40qxOuYsyuyrj0e29bfC.ttf", + "regular": "https://fonts.gstatic.com/s/codystar/v19/FwZY7-Q1xVk-40qxOt6A4sijpFu_.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/codystar/v19/FwZY7-Q1xVk-40qxOu6B6Mw.ttf" + }, + { + "family": "Coiny", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/coiny/v17/gyByhwU1K989PXwbElSvO5Tc.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/coiny/v17/gyByhwU1K989PUwaGFA.ttf" + }, + { + "family": "Combo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/combo/v22/BXRlvF3Jh_fIhg0iBu9y8Hf0.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/combo/v22/BXRlvF3Jh_fIhj0jDOs.ttf" + }, + { + "family": "Comfortaa", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v47", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4TbMPrQVIT9c2c8.ttf", + "regular": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4WjMPrQVIT9c2c8.ttf", + "500": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4VrMPrQVIT9c2c8.ttf", + "600": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4bbLPrQVIT9c2c8.ttf", + "700": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4Y_LPrQVIT9c2c8.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/comfortaa/v47/1Pt_g8LJRfWJmhDAuUsSQamb1W0lwk4S4WjMDrUfJQ.ttf" + }, + { + "family": "Comforter", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/comforter/v9/H4clBXOCl8nQnlaql3Qa6JG8iqeuag.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/comforter/v9/H4clBXOCl8nQnlaql3Qq6Zu4.ttf" + }, + { + "family": "Comforter Brush", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/comforterbrush/v9/Y4GTYa1xVSggrfzZI5WMjxRaOz0jwLL9Th8YYA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/comforterbrush/v9/Y4GTYa1xVSggrfzZI5WMjxRaOz0Twbj5.ttf" + }, + { + "family": "Comic Neue", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v9", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/comicneue/v9/4UaErEJDsxBrF37olUeD_wHLwpteLwtHJlc.ttf", + "300italic": "https://fonts.gstatic.com/s/comicneue/v9/4UaarEJDsxBrF37olUeD96_RTplUKylCNlcw_Q.ttf", + "regular": "https://fonts.gstatic.com/s/comicneue/v9/4UaHrEJDsxBrF37olUeDx63j5pN1MwI.ttf", + "italic": "https://fonts.gstatic.com/s/comicneue/v9/4UaFrEJDsxBrF37olUeD96_p4rFwIwJePw.ttf", + "700": "https://fonts.gstatic.com/s/comicneue/v9/4UaErEJDsxBrF37olUeD_xHMwpteLwtHJlc.ttf", + "700italic": "https://fonts.gstatic.com/s/comicneue/v9/4UaarEJDsxBrF37olUeD96_RXp5UKylCNlcw_Q.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/comicneue/v9/4UaHrEJDsxBrF37olUeD96zp4g.ttf" + }, + { + "family": "Comic Relief", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "greek", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-04-23", + "files": { + "regular": "https://fonts.gstatic.com/s/comicrelief/v2/BCauqZkHrvL55SZ8uaEhHMY2XBJhDgs-Kg.ttf", + "700": "https://fonts.gstatic.com/s/comicrelief/v2/BCaxqZkHrvL55SZ8uaEhHMYO4D1FBiAiI1y92w.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/comicrelief/v2/BCauqZkHrvL55SZ8uaEhHMYGXRhl.ttf" + }, + { + "family": "Coming Soon", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/comingsoon/v20/qWcuB6mzpYL7AJ2VfdQR1u-SUjjzsykh.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/comingsoon/v20/qWcuB6mzpYL7AJ2VfdQR1t-TWDw.ttf" + }, + { + "family": "Comme", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1z5cBr644fWsRO9w.ttf", + "200": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zZcFr644fWsRO9w.ttf", + "300": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zu8Fr644fWsRO9w.ttf", + "regular": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1z5cFr644fWsRO9w.ttf", + "500": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1z18Fr644fWsRO9w.ttf", + "600": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zO8Zr644fWsRO9w.ttf", + "700": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zAsZr644fWsRO9w.ttf", + "800": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zZcZr644fWsRO9w.ttf", + "900": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1zTMZr644fWsRO9w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/comme/v4/8QIUdirKhMbn-uG1kHz0MgviDe1z5cFb6oQb.ttf" + }, + { + "family": "Commissioner", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTMNcGPe7Fu0jUdk.ttf", + "200": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTENdGPe7Fu0jUdk.ttf", + "300": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTJ1dGPe7Fu0jUdk.ttf", + "regular": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTMNdGPe7Fu0jUdk.ttf", + "500": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTPFdGPe7Fu0jUdk.ttf", + "600": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTB1aGPe7Fu0jUdk.ttf", + "700": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTCRaGPe7Fu0jUdk.ttf", + "800": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTENaGPe7Fu0jUdk.ttf", + "900": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTGpaGPe7Fu0jUdk.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/commissioner/v24/tDaH2o2WnlgI0FNDgduEk4jAhwgumbU1SVfU5BD8OuRL8OstC6KOhgvBYWSFJ-Mgdrgiju6fF8meZm0rk4eF-ZugTMNdKPaxEg.ttf" + }, + { + "family": "Concert One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/concertone/v24/VEM1Ro9xs5PjtzCu-srDqRTlhv-CuVAQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/concertone/v24/VEM1Ro9xs5PjtzCu-srDqSTkjPs.ttf" + }, + { + "family": "Condiment", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/condiment/v26/pONk1hggFNmwvXALyH6Sq4n4o1vyCQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/condiment/v26/pONk1hggFNmwvXALyH6iqoP8.ttf" + }, + { + "family": "Content", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "khmer" + ], + "version": "v27", + "lastModified": "2024-12-04", + "files": { + "regular": "https://fonts.gstatic.com/s/content/v27/zrfl0HLayePhU_AwUaDyIiL0RCg.ttf", + "700": "https://fonts.gstatic.com/s/content/v27/zrfg0HLayePhU_AwaRzdBirfWCHvkAI.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/content/v27/zrfl0HLayePhU_AwYaH4Jg.ttf" + }, + { + "family": "Contrail One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/contrailone/v21/eLGbP-j_JA-kG0_Zo51noafdZUvt_c092w.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/contrailone/v21/eLGbP-j_JA-kG0_Zo51noaftZEHp.ttf" + }, + { + "family": "Convergence", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/convergence/v16/rax5HiePvdgXPmmMHcIPYRhasU7Q8Cad.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/convergence/v16/rax5HiePvdgXPmmMHcIPYShbu0o.ttf" + }, + { + "family": "Cookie", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/cookie/v23/syky-y18lb0tSbfNlQCT9tPdpw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cookie/v23/syky-y18lb0tSbf9lAqX.ttf" + }, + { + "family": "Copse", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/copse/v16/11hPGpDKz1rGb0djHkihUb-A.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/copse/v16/11hPGpDKz1rGb3diFEw.ttf" + }, + { + "family": "Coral Pixels", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-04-23", + "files": { + "regular": "https://fonts.gstatic.com/s/coralpixels/v1/qWctB66zpZ3zAtrlR8Mb1LyyeBb_ujA4ug.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/coralpixels/v1/qWctB66zpZ3zAtrlR8Mb1LyCeRz7.ttf", + "colorCapabilities": [ + "COLRv0" + ] + }, + { + "family": "Corben", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/corben/v23/LYjDdGzzklQtCMp9oAlEpVs3VQ.ttf", + "700": "https://fonts.gstatic.com/s/corben/v23/LYjAdGzzklQtCMpFHCZgrXArXN7HWQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/corben/v23/LYjDdGzzklQtCMpNoQNA.ttf" + }, + { + "family": "Corinthia", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/corinthia/v13/wEO_EBrAnchaJyPMHE0FUfAL3EsHiA.ttf", + "700": "https://fonts.gstatic.com/s/corinthia/v13/wEO6EBrAnchaJyPMHE097d8v1GAbgbLXQA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/corinthia/v13/wEO_EBrAnchaJyPMHE01UPoP.ttf" + }, + { + "family": "Cormorant", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFk9TQ7Rg7A2uwYs.ttf", + "regular": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFhFTQ7Rg7A2uwYs.ttf", + "500": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFiNTQ7Rg7A2uwYs.ttf", + "600": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFs9UQ7Rg7A2uwYs.ttf", + "700": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFvZUQ7Rg7A2uwYs.ttf", + "300italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQ9fdq6C-r0YvxdA.ttf", + "italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQq_dq6C-r0YvxdA.ttf", + "500italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQmfdq6C-r0YvxdA.ttf", + "600italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQdfBq6C-r0YvxdA.ttf", + "700italic": "https://fonts.gstatic.com/s/cormorant/v24/H4c0BXOCl9bbnla_nHIq6oGzilJm9otsA9kQTPBq6C-r0YvxdA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cormorant/v24/H4c2BXOCl9bbnla_nHIA47NMUjsNbCVrFhFTc7Vq6A.ttf" + }, + { + "family": "Cormorant Garamond", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_qE6GnPEi_s4Mfs.ttf", + "regular": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_v86GnPEi_s4Mfs.ttf", + "500": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_s06GnPEi_s4Mfs.ttf", + "600": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_iE9GnPEi_s4Mfs.ttf", + "700": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_hg9GnPEi_s4Mfs.ttf", + "300italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd5rDDOj9k9Ifu5UQ.ttf", + "italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd58jDOj9k9Ifu5UQ.ttf", + "500italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd5wDDOj9k9Ifu5UQ.ttf", + "600italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd5LDfOj9k9Ifu5UQ.ttf", + "700italic": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3smX5slCNuHLi8bLeY9MK7whWMhyjYrGFEsdtdc62E6zd5FTfOj9k9Ifu5UQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_v86KnLOjw.ttf" + }, + { + "family": "Cormorant Infant", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrhxYOWThDlDkWSy.ttf", + "regular": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrgvYOWThDlDkWSy.ttf", + "500": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrgdYOWThDlDkWSy.ttf", + "600": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrjxZ-WThDlDkWSy.ttf", + "700": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrjIZ-WThDlDkWSy.ttf", + "300italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nI1PQjj1hlHSyazs.ttf", + "italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nIw3Qjj1hlHSyazs.ttf", + "500italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nIz_Qjj1hlHSyazs.ttf", + "600italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nI9PXjj1hlHSyazs.ttf", + "700italic": "https://fonts.gstatic.com/s/cormorantinfant/v22/Hhy8U44g9vKiM1sORYSiWeAsLN997_IP1zv1ljKnOa3nI-rXjj1hlHSyazs.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cormorantinfant/v22/HhyCU44g9vKiM1sORYSiWeAsLN99xfs9KOOc_agJPrgvYNWSjj0.ttf" + }, + { + "family": "Cormorant SC", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/cormorantsc/v19/0ybmGD4kxqXBmOVLG30OGwsmABIU_R3y8DOWGA.ttf", + "regular": "https://fonts.gstatic.com/s/cormorantsc/v19/0yb5GD4kxqXBmOVLG30OGwserDow9Tbu-Q.ttf", + "500": "https://fonts.gstatic.com/s/cormorantsc/v19/0ybmGD4kxqXBmOVLG30OGwsmWBMU_R3y8DOWGA.ttf", + "600": "https://fonts.gstatic.com/s/cormorantsc/v19/0ybmGD4kxqXBmOVLG30OGwsmdBQU_R3y8DOWGA.ttf", + "700": "https://fonts.gstatic.com/s/cormorantsc/v19/0ybmGD4kxqXBmOVLG30OGwsmEBUU_R3y8DOWGA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cormorantsc/v19/0yb5GD4kxqXBmOVLG30OGwsurTA0.ttf" + }, + { + "family": "Cormorant Unicase", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_ViZUaILtOqhqgDeXoF_n1_fTGX9N_tucv7Gy0DRzS.ttf", + "regular": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_QiZUaILtOqhqgDeXoF_n1_fTGX-vTnsMnx3C9.ttf", + "500": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_ViZUaILtOqhqgDeXoF_n1_fTGX9Mnt-cv7Gy0DRzS.ttf", + "600": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_ViZUaILtOqhqgDeXoF_n1_fTGX9MLsOcv7Gy0DRzS.ttf", + "700": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_ViZUaILtOqhqgDeXoF_n1_fTGX9Nvsecv7Gy0DRzS.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cormorantunicase/v25/HI_QiZUaILtOqhqgDeXoF_n1_fTGX9vSlMc.ttf" + }, + { + "family": "Cormorant Upright", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJudM3I2Y35poFONtLdafkUCHw1y1N5phDsU9X6RPzQ.ttf", + "regular": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJrdM3I2Y35poFONtLdafkUCHw1y2vVjjTkeMnz.ttf", + "500": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJudM3I2Y35poFONtLdafkUCHw1y1MhpxDsU9X6RPzQ.ttf", + "600": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJudM3I2Y35poFONtLdafkUCHw1y1MNoBDsU9X6RPzQ.ttf", + "700": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJudM3I2Y35poFONtLdafkUCHw1y1NpoRDsU9X6RPzQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cormorantupright/v19/VuJrdM3I2Y35poFONtLdafkUCHw1y1vUhDA.ttf" + }, + { + "family": "Cossette Texte", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-10-29", + "files": { + "regular": "https://fonts.gstatic.com/s/cossettetexte/v3/S6ukw4pDXzTb-m1kPi_7eV-ciP01xPBQ19bE.ttf", + "700": "https://fonts.gstatic.com/s/cossettetexte/v3/S6unw4pDXzTb-m1kPi_7eV-ciMWJ69RY_MrNDZes.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cossettetexte/v3/S6ukw4pDXzTb-m1kPi_7eV-ciM00zvQ.ttf" + }, + { + "family": "Cossette Titre", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-10-29", + "files": { + "regular": "https://fonts.gstatic.com/s/cossettetitre/v3/11hYGpvKz1nGbxMXUWz9OdPzuiEZrPeE8cA2.ttf", + "700": "https://fonts.gstatic.com/s/cossettetitre/v3/11hbGpvKz1nGbxMXUWz9OdPzuhmlg9OM2tw_RXR-.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cossettetitre/v3/11hYGpvKz1nGbxMXUWz9OdPzuhEYpvM.ttf" + }, + { + "family": "Courgette", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/courgette/v19/wEO_EBrAnc9BLjLQAUkFUfAL3EsHiA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/courgette/v19/wEO_EBrAnc9BLjLQAUk1UPoP.ttf" + }, + { + "family": "Courier Prime", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/courierprime/v11/u-450q2lgwslOqpF_6gQ8kELWwZjW-_-tvg.ttf", + "italic": "https://fonts.gstatic.com/s/courierprime/v11/u-4n0q2lgwslOqpF_6gQ8kELawRpX837pvjxPA.ttf", + "700": "https://fonts.gstatic.com/s/courierprime/v11/u-4k0q2lgwslOqpF_6gQ8kELY7pMf-fVqvHoJXw.ttf", + "700italic": "https://fonts.gstatic.com/s/courierprime/v11/u-4i0q2lgwslOqpF_6gQ8kELawRR4-LfrtPtNXyeAg.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/courierprime/v11/u-450q2lgwslOqpF_6gQ8kELawdpXw.ttf" + }, + { + "family": "Cousine", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/cousine/v29/d6lIkaiiRdih4SpPzSMlzTbtz9k.ttf", + "italic": "https://fonts.gstatic.com/s/cousine/v29/d6lKkaiiRdih4SpP_SEvyRTo39l8hw.ttf", + "700": "https://fonts.gstatic.com/s/cousine/v29/d6lNkaiiRdih4SpP9Z8K6T7G09BlnmQ.ttf", + "700italic": "https://fonts.gstatic.com/s/cousine/v29/d6lPkaiiRdih4SpP_SEXdTvM1_JgjmRpOA.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cousine/v29/d6lIkaiiRdih4SpP_SIvyQ.ttf" + }, + { + "family": "Coustard", + "variants": [ + "regular", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/coustard/v17/3XFpErgg3YsZ5fqUU9UPvWXuROTd.ttf", + "900": "https://fonts.gstatic.com/s/coustard/v17/3XFuErgg3YsZ5fqUU-2LkEHmb_jU3eRL.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/coustard/v17/3XFpErgg3YsZ5fqUU-UOt2E.ttf" + }, + { + "family": "Covered By Your Grace", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/coveredbyyourgrace/v17/QGYwz-AZahWOJJI9kykWW9mD6opopoqXSOS0FgItq6bFIg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/coveredbyyourgrace/v17/QGYwz-AZahWOJJI9kykWW9mD6opopoqXSOSEFwgp.ttf" + }, + { + "family": "Crafty Girls", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/craftygirls/v16/va9B4kXI39VaDdlPJo8N_NvuQR37fF3Wlg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/craftygirls/v16/va9B4kXI39VaDdlPJo8N_NveQBf_.ttf" + }, + { + "family": "Creepster", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v13", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/creepster/v13/AlZy_zVUqJz4yMrniH4hdXf4XB0Tow.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/creepster/v13/AlZy_zVUqJz4yMrniH4RdH38.ttf" + }, + { + "family": "Crete Round", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/creteround/v16/55xoey1sJNPjPiv1ZZZrxJ1827zAKnxN.ttf", + "italic": "https://fonts.gstatic.com/s/creteround/v16/55xqey1sJNPjPiv1ZZZrxK1-0bjiL2xNhKc.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/creteround/v16/55xoey1sJNPjPiv1ZZZrxK190bg.ttf" + }, + { + "family": "Crimson Pro", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v28", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZTm18OJE_VNWoyQ.ttf", + "300": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZkG18OJE_VNWoyQ.ttf", + "regular": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZzm18OJE_VNWoyQ.ttf", + "500": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZ_G18OJE_VNWoyQ.ttf", + "600": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZEGp8OJE_VNWoyQ.ttf", + "700": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZKWp8OJE_VNWoyQ.ttf", + "800": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZTmp8OJE_VNWoyQ.ttf", + "900": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZZ2p8OJE_VNWoyQ.ttf", + "200italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi4Ue5s7dtC4yZNE.ttf", + "300italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi7Ke5s7dtC4yZNE.ttf", + "italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi6Ue5s7dtC4yZNE.ttf", + "500italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi6me5s7dtC4yZNE.ttf", + "600italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi5KfJs7dtC4yZNE.ttf", + "700italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi5zfJs7dtC4yZNE.ttf", + "800italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi4UfJs7dtC4yZNE.ttf", + "900italic": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uSsoa5M_tv7IihmnkabAReu49Y_Bo-HVKMBi49fJs7dtC4yZNE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/crimsonpro/v28/q5uUsoa5M_tv7IihmnkabC5XiXCAlXGks1WZzm1MOZs7.ttf" + }, + { + "family": "Crimson Text", + "variants": [ + "regular", + "italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/crimsontext/v19/wlp2gwHKFkZgtmSR3NB0oRJvaAJSA_JN3Q.ttf", + "italic": "https://fonts.gstatic.com/s/crimsontext/v19/wlpogwHKFkZgtmSR3NB0oRJfaghWIfdd3ahG.ttf", + "600": "https://fonts.gstatic.com/s/crimsontext/v19/wlppgwHKFkZgtmSR3NB0oRJXsCx2C9lR1LFffg.ttf", + "600italic": "https://fonts.gstatic.com/s/crimsontext/v19/wlprgwHKFkZgtmSR3NB0oRJfajCOD9NV9rRPfrKu.ttf", + "700": "https://fonts.gstatic.com/s/crimsontext/v19/wlppgwHKFkZgtmSR3NB0oRJX1C12C9lR1LFffg.ttf", + "700italic": "https://fonts.gstatic.com/s/crimsontext/v19/wlprgwHKFkZgtmSR3NB0oRJfajDqDtNV9rRPfrKu.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/crimsontext/v19/wlp2gwHKFkZgtmSR3NB0oRJfaQhW.ttf" + }, + { + "family": "Croissant One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/croissantone/v28/3y9n6bU9bTPg4m8NDy3Kq24UM3pqn5cdJ-4.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/croissantone/v28/3y9n6bU9bTPg4m8NDy3Kq24UA3tgmw.ttf" + }, + { + "family": "Crushed", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v32", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/crushed/v32/U9Mc6dym6WXImTlFT1kfuIqyLzA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/crushed/v32/U9Mc6dym6WXImTlFf1gVvA.ttf" + }, + { + "family": "Cuprum", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6ZjzSJjQjgnU.ttf", + "500": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmg9f6ZjzSJjQjgnU.ttf", + "600": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmgzv9ZjzSJjQjgnU.ttf", + "700": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmgwL9ZjzSJjQjgnU.ttf", + "italic": "https://fonts.gstatic.com/s/cuprum/v29/dg47_pLmvrkcOkBNI_FMh0j91rkhli25jn_YIhYmknUPEA.ttf", + "500italic": "https://fonts.gstatic.com/s/cuprum/v29/dg47_pLmvrkcOkBNI_FMh0j91rkhli25vH_YIhYmknUPEA.ttf", + "600italic": "https://fonts.gstatic.com/s/cuprum/v29/dg47_pLmvrkcOkBNI_FMh0j91rkhli25UHjYIhYmknUPEA.ttf", + "700italic": "https://fonts.gstatic.com/s/cuprum/v29/dg47_pLmvrkcOkBNI_FMh0j91rkhli25aXjYIhYmknUPEA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cuprum/v29/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6Vj3YIg.ttf" + }, + { + "family": "Cute Font", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v28", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/cutefont/v28/Noaw6Uny2oWPbSHMrY6vmJNVNC9hkw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cutefont/v28/Noaw6Uny2oWPbSHMrY6fmZlR.ttf" + }, + { + "family": "Cutive", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/cutive/v24/NaPZcZ_fHOhV3Ip7T_hDoyqlZQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cutive/v24/NaPZcZ_fHOhV3IpLTvJH.ttf" + }, + { + "family": "Cutive Mono", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/cutivemono/v23/m8JWjfRfY7WVjVi2E-K9H5RFRG-K3Mud.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/cutivemono/v23/m8JWjfRfY7WVjVi2E-K9H6RETms.ttf" + }, + { + "family": "DM Mono", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/dmmono/v16/aFTR7PB1QTsUX8KYvrGyIYSnbKX9Rlk.ttf", + "300italic": "https://fonts.gstatic.com/s/dmmono/v16/aFTT7PB1QTsUX8KYth-orYataIf4VllXuA.ttf", + "regular": "https://fonts.gstatic.com/s/dmmono/v16/aFTU7PB1QTsUX8KYhh2aBYyMcKw.ttf", + "italic": "https://fonts.gstatic.com/s/dmmono/v16/aFTW7PB1QTsUX8KYth-QAa6JYKzkXw.ttf", + "500": "https://fonts.gstatic.com/s/dmmono/v16/aFTR7PB1QTsUX8KYvumzIYSnbKX9Rlk.ttf", + "500italic": "https://fonts.gstatic.com/s/dmmono/v16/aFTT7PB1QTsUX8KYth-o9YetaIf4VllXuA.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dmmono/v16/aFTU7PB1QTsUX8KYthyQAQ.ttf" + }, + { + "family": "DM Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAop1hTmf3ZGMZpg.ttf", + "200": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpxhTmf3ZGMZpg.ttf", + "300": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwA_JxhTmf3ZGMZpg.ttf", + "regular": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxhTmf3ZGMZpg.ttf", + "500": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAkJxhTmf3ZGMZpg.ttf", + "600": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAfJthTmf3ZGMZpg.ttf", + "700": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwARZthTmf3ZGMZpg.ttf", + "800": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpthTmf3ZGMZpg.ttf", + "900": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAC5thTmf3ZGMZpg.ttf", + "100italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDG3zRmYJpso5.ttf", + "200italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JDW3zRmYJpso5.ttf", + "300italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat_XDW3zRmYJpso5.ttf", + "italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDW3zRmYJpso5.ttf", + "500italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-7DW3zRmYJpso5.ttf", + "600italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9XCm3zRmYJpso5.ttf", + "700italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9uCm3zRmYJpso5.ttf", + "800italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JCm3zRmYJpso5.ttf", + "900italic": "https://fonts.gstatic.com/s/dmsans/v17/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8gCm3zRmYJpso5.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dmsans/v17/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxRT23z.ttf" + }, + { + "family": "DM Serif Display", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/dmserifdisplay/v17/-nFnOHM81r4j6k0gjAW3mujVU2B2K_d709jy92k.ttf", + "italic": "https://fonts.gstatic.com/s/dmserifdisplay/v17/-nFhOHM81r4j6k0gjAW3mujVU2B2G_Vx1_r352np3Q.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dmserifdisplay/v17/-nFnOHM81r4j6k0gjAW3mujVU2B2G_Zx1w.ttf" + }, + { + "family": "DM Serif Text", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/dmseriftext/v13/rnCu-xZa_krGokauCeNq1wWyafOPXHIJErY.ttf", + "italic": "https://fonts.gstatic.com/s/dmseriftext/v13/rnCw-xZa_krGokauCeNq1wWyWfGFWFAMArZKqQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dmseriftext/v13/rnCu-xZa_krGokauCeNq1wWyWfKFWA.ttf" + }, + { + "family": "Dai Banna SIL", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "new-tai-lue" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "300": "https://fonts.gstatic.com/s/daibannasil/v2/lW-lwj0AJWmpwGyJ2uEoA4I7tYKoDsrKOgMX95A.ttf", + "300italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-jwj0AJWmpwGyJ2uEoA4I7vSyygsjAPiES55D3Vg.ttf", + "regular": "https://fonts.gstatic.com/s/daibannasil/v2/lW-4wj0AJWmpwGyJ2uEoA4I7jS6AKsLhJgo.ttf", + "italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-mwj0AJWmpwGyJ2uEoA4I7vSyKLuDkNgoO7g.ttf", + "500": "https://fonts.gstatic.com/s/daibannasil/v2/lW-lwj0AJWmpwGyJ2uEoA4I7tdqpDsrKOgMX95A.ttf", + "500italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-jwj0AJWmpwGyJ2uEoA4I7vSyy2snAPiES55D3Vg.ttf", + "600": "https://fonts.gstatic.com/s/daibannasil/v2/lW-lwj0AJWmpwGyJ2uEoA4I7tfauDsrKOgMX95A.ttf", + "600italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-jwj0AJWmpwGyJ2uEoA4I7vSyy9s7APiES55D3Vg.ttf", + "700": "https://fonts.gstatic.com/s/daibannasil/v2/lW-lwj0AJWmpwGyJ2uEoA4I7tZKvDsrKOgMX95A.ttf", + "700italic": "https://fonts.gstatic.com/s/daibannasil/v2/lW-jwj0AJWmpwGyJ2uEoA4I7vSyyks_APiES55D3Vg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/daibannasil/v2/lW-4wj0AJWmpwGyJ2uEoA4I7vS-KLg.ttf" + }, + { + "family": "Damion", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/damion/v15/hv-XlzJ3KEUe_YZUbWY3MTFgVg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/damion/v15/hv-XlzJ3KEUe_YZkbGwz.ttf" + }, + { + "family": "Dancing Script", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7BMSoHTeB9ptDqpw.ttf", + "500": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7BAyoHTeB9ptDqpw.ttf", + "600": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7B7y0HTeB9ptDqpw.ttf", + "700": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7B1i0HTeB9ptDqpw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dancingscript/v29/If2cXTr6YS-zF4S-kcSWSVi_sxjsohD9F50Ruu7BMSo3TOp5.ttf" + }, + { + "family": "Danfo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/danfo/v5/snf3s0u_98t16THfK1Csj3N41ZqbYDe5S71ToPrNKQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/danfo/v5/snf3s0u_98t16THfK1Csj3N41ZqbYDeJSrdX.ttf" + }, + { + "family": "Dangrek", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v33", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/dangrek/v33/LYjCdG30nEgoH8E2gCNqqVIuTN4.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dangrek/v33/LYjCdG30nEgoH8E2sCJgrQ.ttf" + }, + { + "family": "Darker Grotesque", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v10", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXxpqn7y-XFyZFUB.ttf", + "regular": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXw3qn7y-XFyZFUB.ttf", + "500": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXwFqn7y-XFyZFUB.ttf", + "600": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXzprX7y-XFyZFUB.ttf", + "700": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXzQrX7y-XFyZFUB.ttf", + "800": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXy3rX7y-XFyZFUB.ttf", + "900": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXyerX7y-XFyZFUB.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/darkergrotesque/v10/U9MK6cuh-mLQlC4BKCtayOfARkSVgb381b-W8-QDqXw3qk7z83U.ttf" + }, + { + "family": "Darumadrop One", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/darumadropone/v14/cY9cfjeIW11dpCKgRLi675a87IhHBJOxZQPp.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/darumadropone/v14/cY9cfjeIW11dpCKgRLi675a87LhGDpc.ttf" + }, + { + "family": "David Libre", + "variants": [ + "regular", + "500", + "700" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/davidlibre/v17/snfus0W_99N64iuYSvp4W_l86p6TYS-Y.ttf", + "500": "https://fonts.gstatic.com/s/davidlibre/v17/snfzs0W_99N64iuYSvp4W8GIw7qbSjORSo9W.ttf", + "700": "https://fonts.gstatic.com/s/davidlibre/v17/snfzs0W_99N64iuYSvp4W8HAxbqbSjORSo9W.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/davidlibre/v17/snfus0W_99N64iuYSvp4W8l94Jo.ttf" + }, + { + "family": "Dawning of a New Day", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/dawningofanewday/v22/t5t_IQMbOp2SEwuncwLRjMfIg1yYit_nAz8bhWJGNoBE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dawningofanewday/v22/t5t_IQMbOp2SEwuncwLRjMfIg1yYit_nAw8aj2Y.ttf" + }, + { + "family": "Days One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin" + ], + "version": "v19", + "lastModified": "2025-04-23", + "files": { + "regular": "https://fonts.gstatic.com/s/daysone/v19/mem9YaCnxnKRiYZOCLYVeLkWVNBt.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/daysone/v19/mem9YaCnxnKRiYZOCIYUcr0.ttf" + }, + { + "family": "Dekko", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/dekko/v23/46khlb_wWjfSrttFR0vsfl1B.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dekko/v23/46khlb_wWjfSrutETU8.ttf" + }, + { + "family": "Dela Gothic One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "greek", + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/delagothicone/v19/hESp6XxvMDRA-2eD0lXpDa6QkBAGRUsJQAlbUA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/delagothicone/v19/hESp6XxvMDRA-2eD0lXpDa6QkBA2REEN.ttf" + }, + { + "family": "Delicious Handrawn", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v10", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/delicioushandrawn/v10/wlpsgx_NAUNkpmKQifcxkQchDFo3fJ113JpDd6u3AQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/delicioushandrawn/v10/wlpsgx_NAUNkpmKQifcxkQchDFo3fJ1F3ZBH.ttf" + }, + { + "family": "Delius", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/delius/v21/PN_xRfK0pW_9e1rtYcI-jT3L_w.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/delius/v21/PN_xRfK0pW_9e1rdYMg6.ttf" + }, + { + "family": "Delius Swash Caps", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/deliusswashcaps/v25/oY1E8fPLr7v4JWCExZpWebxVKORpXXedKmeBvEYs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/deliusswashcaps/v25/oY1E8fPLr7v4JWCExZpWebxVKORpXUecIGM.ttf" + }, + { + "family": "Delius Unicase", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v30", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/deliusunicase/v30/845BNMEwEIOVT8BmgfSzIr_6mmLHd-73LXWs.ttf", + "700": "https://fonts.gstatic.com/s/deliusunicase/v30/845CNMEwEIOVT8BmgfSzIr_6mlp7WMr_BmmlS5aw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/deliusunicase/v30/845BNMEwEIOVT8BmgfSzIr_6mlLGfeo.ttf" + }, + { + "family": "Della Respira", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/dellarespira/v24/RLp5K5v44KaueWI6iEJQBiGPRfkSu6EuTHo.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dellarespira/v24/RLp5K5v44KaueWI6iEJQBiGPdfgYvw.ttf" + }, + { + "family": "Denk One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/denkone/v21/dg4m_pzhrqcFb2IzROtHpbglShon.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/denkone/v21/dg4m_pzhrqcFb2IzRNtGr7w.ttf" + }, + { + "family": "Devonshire", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/devonshire/v29/46kqlbDwWirWr4gtBD2BX0Vq01lYAZM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/devonshire/v29/46kqlbDwWirWr4gtBD2Bb0Rg1w.ttf" + }, + { + "family": "Dhurjati", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/dhurjati/v27/_6_8ED3gSeatXfFiFX3ySKQtuTA2.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dhurjati/v27/_6_8ED3gSeatXfFiFU3zQqA.ttf" + }, + { + "family": "Didact Gothic", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/didactgothic/v21/ahcfv8qz1zt6hCC5G4F_P4ASpUySp0LlcyQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/didactgothic/v21/ahcfv8qz1zt6hCC5G4F_P4ASlU2Yow.ttf" + }, + { + "family": "Diphylleia", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/diphylleia/v2/DtVmJxCtRKMixK4_HXsIulwm6gDXvwE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/diphylleia/v2/DtVmJxCtRKMixK4_HXsIil0s7g.ttf" + }, + { + "family": "Diplomata", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v33", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/diplomata/v33/Cn-0JtiMXwhNwp-wKxyfYGxYrdM9Sg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/diplomata/v33/Cn-0JtiMXwhNwp-wKxyvYWZc.ttf" + }, + { + "family": "Diplomata SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/diplomatasc/v30/buExpoi3ecvs3kidKgBJo2kf-P5Oaiw4cw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/diplomatasc/v30/buExpoi3ecvs3kidKgBJo2kv-fRK.ttf" + }, + { + "family": "Do Hyeon", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/dohyeon/v21/TwMN-I8CRRU2zM86HFE3ZwaH__-C.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dohyeon/v21/TwMN-I8CRRU2zM86HGE2bQI.ttf" + }, + { + "family": "Dokdo", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/dokdo/v23/esDf315XNuCBLxLo4NaMlKcH.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dokdo/v23/esDf315XNuCBLyLp6tI.ttf" + }, + { + "family": "Domine", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X3LAI10VErGuW8Q.ttf", + "500": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X0DAI10VErGuW8Q.ttf", + "600": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X6zHI10VErGuW8Q.ttf", + "700": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X5XHI10VErGuW8Q.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/domine/v25/L0xhDFMnlVwD4h3Lt9JWnbX3jG-2X3LAE1wfFg.ttf" + }, + { + "family": "Donegal One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/donegalone/v22/m8JWjfRYea-ZnFz6fsK9FZRFRG-K3Mud.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/donegalone/v22/m8JWjfRYea-ZnFz6fsK9FaRETms.ttf" + }, + { + "family": "Dongle", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "korean", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/dongle/v16/sJoG3Ltdjt6VPkqeEcxrYjWNzXvVPA.ttf", + "regular": "https://fonts.gstatic.com/s/dongle/v16/sJoF3Ltdjt6VPkqmveRPah6RxA.ttf", + "700": "https://fonts.gstatic.com/s/dongle/v16/sJoG3Ltdjt6VPkqeActrYjWNzXvVPA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dongle/v16/sJoF3Ltdjt6VPkqWvO5L.ttf" + }, + { + "family": "Doppio One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/doppioone/v14/Gg8wN5gSaBfyBw2MqCh-lgshKGpe5Fg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/doppioone/v14/Gg8wN5gSaBfyBw2MqCh-pgorLA.ttf" + }, + { + "family": "Dorsa", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v29", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/dorsa/v29/yYLn0hjd0OGwqo493XCFxAnQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dorsa/v29/yYLn0hjd0OGwqr4813Q.ttf" + }, + { + "family": "Dosis", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v34", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJt7MV3BkFTq4EPw.ttf", + "300": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJabMV3BkFTq4EPw.ttf", + "regular": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJN7MV3BkFTq4EPw.ttf", + "500": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJBbMV3BkFTq4EPw.ttf", + "600": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJ6bQV3BkFTq4EPw.ttf", + "700": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJ0LQV3BkFTq4EPw.ttf", + "800": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJt7QV3BkFTq4EPw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dosis/v34/HhyJU5sn9vOmLxNkIwRSjTVNWLEJN7Ml3RMB.ttf" + }, + { + "family": "DotGothic16", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/dotgothic16/v21/v6-QGYjBJFKgyw5nSoDAGE7L435YPFrT.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dotgothic16/v21/v6-QGYjBJFKgyw5nSoDAGH7K6Xo.ttf" + }, + { + "family": "Doto", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFOOOez0WSvrlpgw.ttf", + "200": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFuOKez0WSvrlpgw.ttf", + "300": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFZuKez0WSvrlpgw.ttf", + "regular": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFOOKez0WSvrlpgw.ttf", + "500": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFCuKez0WSvrlpgw.ttf", + "600": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphF5uWez0WSvrlpgw.ttf", + "700": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphF3-Wez0WSvrlpgw.ttf", + "800": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFuOWez0WSvrlpgw.ttf", + "900": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFkeWez0WSvrlpgw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/doto/v3/t5tJIRMbNJ6TQG7Il_EKPqP9zTnvqqGNcuvLMt1JIphFOOKuzk-W.ttf" + }, + { + "family": "Dr Sugiyama", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/drsugiyama/v30/HTxoL2k4N3O9n5I1boGI7abRM4-t-g7y.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/drsugiyama/v30/HTxoL2k4N3O9n5I1boGI7ZbQOYs.ttf" + }, + { + "family": "Duru Sans", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/durusans/v21/xn7iYH8xwmSyTvEV_HOxT_fYdN-WZw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/durusans/v21/xn7iYH8xwmSyTvEV_HOBTv3c.ttf" + }, + { + "family": "DynaPuff", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RSxYu6YjrSRs4wn8.ttf", + "500": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RSyQu6YjrSRs4wn8.ttf", + "600": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RS8gp6YjrSRs4wn8.ttf", + "700": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RS_Ep6YjrSRs4wn8.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dynapuff/v9/z7N5dRvsZDIVHbYPMhZJ3HQ83UaSu4uhr7-ZFeoYkgAr1x8RSxYu2YnhTQ.ttf" + }, + { + "family": "Dynalight", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/dynalight/v24/1Ptsg8LOU_aOmQvTsF4ISotrDfGGxA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/dynalight/v24/1Ptsg8LOU_aOmQvTsF44S4Fv.ttf" + }, + { + "family": "EB Garamond", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v32", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RUA4V-e6yHgQ.ttf", + "500": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-2fRUA4V-e6yHgQ.ttf", + "600": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-NfNUA4V-e6yHgQ.ttf", + "700": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-DPNUA4V-e6yHgQ.ttf", + "800": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-a_NUA4V-e6yHgQ.ttf", + "italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7e8QI96WamXgXFI.ttf", + "500italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7eOQI96WamXgXFI.ttf", + "600italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7diR496WamXgXFI.ttf", + "700italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7dbR496WamXgXFI.ttf", + "800italic": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7c8R496WamXgXFI.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RkAo96.ttf" + }, + { + "family": "Eagle Lake", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/eaglelake/v26/ptRMTiqbbuNJDOiKj9wG5O7yKQNute8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eaglelake/v26/ptRMTiqbbuNJDOiKj9wG1O_4LQ.ttf" + }, + { + "family": "East Sea Dokdo", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v26", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/eastseadokdo/v26/xfuo0Wn2V2_KanASqXSZp22m05_aGavYS18y.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eastseadokdo/v26/xfuo0Wn2V2_KanASqXSZp22m06_bE68.ttf" + }, + { + "family": "Eater", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/eater/v27/mtG04_FCK7bOvpu2u3FwsXsR.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eater/v27/mtG04_FCK7bOvqu3sXU.ttf" + }, + { + "family": "Economica", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/economica/v17/Qw3fZQZaHCLgIWa29ZBrMcgAAl1lfQ.ttf", + "italic": "https://fonts.gstatic.com/s/economica/v17/Qw3ZZQZaHCLgIWa29ZBbM8IEIFh1fWUl.ttf", + "700": "https://fonts.gstatic.com/s/economica/v17/Qw3aZQZaHCLgIWa29ZBTjeckCnZ5dHw8iw.ttf", + "700italic": "https://fonts.gstatic.com/s/economica/v17/Qw3EZQZaHCLgIWa29ZBbM_q4D3x9Vnksi4M7.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/economica/v17/Qw3fZQZaHCLgIWa29ZBbMMIE.ttf" + }, + { + "family": "Eczar", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "devanagari", + "greek", + "greek-ext", + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXHd6WqTIVKWJKWg.ttf", + "500": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXL96WqTIVKWJKWg.ttf", + "600": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXw9mWqTIVKWJKWg.ttf", + "700": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDX-tmWqTIVKWJKWg.ttf", + "800": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXndmWqTIVKWJKWg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eczar/v27/BXR2vF3Pi-DLmxcpJB-qbNTyTMDXHd6mqDgR.ttf" + }, + { + "family": "Edu AU VIC WA NT Arrows", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5tAcvhTTk90n91Vw.ttf", + "500": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5tM8vhTTk90n91Vw.ttf", + "600": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5t38zhTTk90n91Vw.ttf", + "700": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5t5szhTTk90n91Vw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduauvicwantarrows/v4/z7N7dQTteSlUDJZJAmUB9MuVbLPBjsrTFZLUbdjnSmlATbEWXt5tAcvRTDM5.ttf" + }, + { + "family": "Edu AU VIC WA NT Dots", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLvtYEtmT2SB3_5U.ttf", + "500": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLslYEtmT2SB3_5U.ttf", + "600": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLiVfEtmT2SB3_5U.ttf", + "700": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLhxfEtmT2SB3_5U.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduauvicwantdots/v4/S6uQw5FFVDKI3kwwDUbsPHCpzZNhzrA3or3_B4dZ6MmTX8QNLvtYItiZ3Q.ttf" + }, + { + "family": "Edu AU VIC WA NT Guides", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPdK1ZazoF08FsYlA.ttf", + "500": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPdGVZazoF08FsYlA.ttf", + "600": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPd9VFazoF08FsYlA.ttf", + "700": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPdzFFazoF08FsYlA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduauvicwantguides/v3/TuG-UUJ4V48KZ9Nr3ZV46JQkJxtkFIKnvy00LCZuAcLMeb8FnyPdK1Zqz4tw.ttf" + }, + { + "family": "Edu AU VIC WA NT Hand", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtCJ1lKtFbYfTEUU.ttf", + "500": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtBB1lKtFbYfTEUU.ttf", + "600": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtPxylKtFbYfTEUU.ttf", + "700": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtMVylKtFbYfTEUU.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduauvicwanthand/v3/C8cO4dY1tX2x0uuiUHFS4y7ERV-jfqJ6x063HfvcsxiYKifhtCJ1pKpPaQ.ttf" + }, + { + "family": "Edu AU VIC WA NT Pre", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIyJmkwr6MhKkg6nw.ttf", + "500": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIyFGkwr6MhKkg6nw.ttf", + "600": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIy-G4wr6MhKkg6nw.ttf", + "700": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIywW4wr6MhKkg6nw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduauvicwantpre/v3/f0Xc0fWk-t0rbG8Ycr-t55aG0elTWbFeXaYI98CnuNLeosIyJmkArqkl.ttf" + }, + { + "family": "Edu NSW ACT Cursive", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCrd5giiVjXBs6BMb.ttf", + "500": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCrdLgiiVjXBs6BMb.ttf", + "600": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCrenhSiVjXBs6BMb.ttf", + "700": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCreehSiVjXBs6BMb.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/edunswactcursive/v3/xn7LYGUw02PnIPEjskHSG_2fCaz9DzhQbcTNLWxkwsHVCrd5ghiUh3Q.ttf" + }, + { + "family": "Edu NSW ACT Foundation", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki9tovGLeC-sfguJ.ttf", + "500": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki9fovGLeC-sfguJ.ttf", + "600": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki-zpfGLeC-sfguJ.ttf", + "700": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki-KpfGLeC-sfguJ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/edunswactfoundation/v5/raxRHjqJtsNBFUi8WO0vUBgc9D-2lV_oQdCAYlt_QTQ0vUxJki9tosGKcis.ttf" + }, + { + "family": "Edu NSW ACT Hand Pre", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0ywWBqtsjedKEHuQ.ttf", + "500": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0y82BqtsjedKEHuQ.ttf", + "600": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0yH2dqtsjedKEHuQ.ttf", + "700": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0yJmdqtsjedKEHuQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/edunswacthandpre/v3/kmKXZrI-ExGJWUmupHwGgw6Qw4svl-MsLiw7ATFEXwCkLE0ywWBat8La.ttf" + }, + { + "family": "Edu QLD Beginner", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE4E3oebi6vyVWCN.ttf", + "500": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE423oebi6vyVWCN.ttf", + "600": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE7a2Yebi6vyVWCN.ttf", + "700": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE7j2Yebi6vyVWCN.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduqldbeginner/v5/AMOHz5iUuHLEMNXyohhc_Y56PR3A8dNLF_w3Ka4HKE4E3reaga8.ttf" + }, + { + "family": "Edu QLD Hand", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjngAUeRt5gGCzkrs.ttf", + "500": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjnjIUeRt5gGCzkrs.ttf", + "600": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjnt4TeRt5gGCzkrs.ttf", + "700": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjnucTeRt5gGCzkrs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduqldhand/v3/d6lakaOkTtjy2QhuzWtup1rW3NCQVvjKPjPjngAUSRpzhA.ttf" + }, + { + "family": "Edu SA Beginner", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9989fo1yBydUEDs.ttf", + "500": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9-09fo1yBydUEDs.ttf", + "600": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9wE6fo1yBydUEDs.ttf", + "700": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9zg6fo1yBydUEDs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/edusabeginner/v5/rnC_-xRb1x-1lHXnLaZZ2xOoLIGfU3L82irpr_3C9989Tox4Aw.ttf" + }, + { + "family": "Edu SA Hand", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXlWumvkSE55OZgw.ttf", + "500": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXp2umvkSE55OZgw.ttf", + "600": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXS2ymvkSE55OZgw.ttf", + "700": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXcmymvkSE55OZgw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/edusahand/v3/memtYaOmw37C-ogAJfd7NocVXTy8nx2cmqvXlWuWv06A.ttf" + }, + { + "family": "Edu TAS Beginner", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_HwemkrBWRhvk02.ttf", + "500": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_HCemkrBWRhvk02.ttf", + "600": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_EufWkrBWRhvk02.ttf", + "700": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_EXfWkrBWRhvk02.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/edutasbeginner/v5/ZXuwe04WubHfGVY-1TcNg7AFUmshg8jIUTzK3r34f_HwelkqD2A.ttf" + }, + { + "family": "Edu VIC WA NT Beginner", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-OXlPmFXwnpkeGR.ttf", + "500": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-OllPmFXwnpkeGR.ttf", + "600": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-NJk_mFXwnpkeGR.ttf", + "700": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-Nwk_mFXwnpkeGR.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduvicwantbeginner/v6/jiz2RF1BuW9OwcnNPxLl4KfZCHd9nFtd5Tu7stCpElYpvPfZZ-OXlMmEVQ0.ttf" + }, + { + "family": "Edu VIC WA NT Hand", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuLyfMZhrib2Bg-4.ttf", + "500": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuI6fMZhrib2Bg-4.ttf", + "600": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuGKYMZhrib2Bg-4.ttf", + "700": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuFuYMZhrib2Bg-4.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduvicwanthand/v3/UcCO3EsnIXnOaZKmY1Ry0wZjP9YVRBcw2boKoduKmMEVuLyfAZlhjQ.ttf" + }, + { + "family": "Edu VIC WA NT Hand Pre", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLTo4dgUBS1Nzqn8.ttf", + "500": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLTa4dgUBS1Nzqn8.ttf", + "600": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLQ25tgUBS1Nzqn8.ttf", + "700": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLQP5tgUBS1Nzqn8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/eduvicwanthandpre/v3/neInzDmioZxjkInM_tLHFudmcN2Uxxc-9Vnv-4YmimMq127-YLTo4egVDyk.ttf" + }, + { + "family": "El Messiri", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuXwe65ghj3OoapG.ttf", + "500": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuXCe65ghj3OoapG.ttf", + "600": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuUufK5ghj3OoapG.ttf", + "700": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuUXfK5ghj3OoapG.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/elmessiri/v25/K2FhfZBRmr9vQ1pHEey6GIGo8_pv3myYjuXwe55hjDk.ttf" + }, + { + "family": "Electrolize", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/electrolize/v20/cIf5Ma1dtE0zSiGSiED7AUEGso5tQafB.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/electrolize/v20/cIf5Ma1dtE0zSiGSiED7AXEHuIo.ttf" + }, + { + "family": "Elms Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-11-04", + "files": { + "100": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jpp3bJi52PLM6RNU.ttf", + "200": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jph3aJi52PLM6RNU.ttf", + "300": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jpsPaJi52PLM6RNU.ttf", + "regular": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jpp3aJi52PLM6RNU.ttf", + "500": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jpq_aJi52PLM6RNU.ttf", + "600": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jpkPdJi52PLM6RNU.ttf", + "700": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jpnrdJi52PLM6RNU.ttf", + "800": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jph3dJi52PLM6RNU.ttf", + "900": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jpjTdJi52PLM6RNU.ttf", + "100italic": "https://fonts.gstatic.com/s/elmssans/v5/q5uUsoS_Lf9xv7Su1Fp4AS5XiXCAlXGks1WZzmx8OJE_VNWoyQ.ttf", + "200italic": "https://fonts.gstatic.com/s/elmssans/v5/q5uUsoS_Lf9xv7Su1Fp4AS5XiXCAlXGks1WZTm18OJE_VNWoyQ.ttf", + "300italic": "https://fonts.gstatic.com/s/elmssans/v5/q5uUsoS_Lf9xv7Su1Fp4AS5XiXCAlXGks1WZkG18OJE_VNWoyQ.ttf", + "italic": "https://fonts.gstatic.com/s/elmssans/v5/q5uUsoS_Lf9xv7Su1Fp4AS5XiXCAlXGks1WZzm18OJE_VNWoyQ.ttf", + "500italic": "https://fonts.gstatic.com/s/elmssans/v5/q5uUsoS_Lf9xv7Su1Fp4AS5XiXCAlXGks1WZ_G18OJE_VNWoyQ.ttf", + "600italic": "https://fonts.gstatic.com/s/elmssans/v5/q5uUsoS_Lf9xv7Su1Fp4AS5XiXCAlXGks1WZEGp8OJE_VNWoyQ.ttf", + "700italic": "https://fonts.gstatic.com/s/elmssans/v5/q5uUsoS_Lf9xv7Su1Fp4AS5XiXCAlXGks1WZKWp8OJE_VNWoyQ.ttf", + "800italic": "https://fonts.gstatic.com/s/elmssans/v5/q5uUsoS_Lf9xv7Su1Fp4AS5XiXCAlXGks1WZTmp8OJE_VNWoyQ.ttf", + "900italic": "https://fonts.gstatic.com/s/elmssans/v5/q5uUsoS_Lf9xv7Su1Fp4AS5XiXCAlXGks1WZZ2p8OJE_VNWoyQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/elmssans/v5/q5uWsoS_Lf9xv7Su1FpSCByoURnrD9-jpp3aFi98OA.ttf" + }, + { + "family": "Elsie", + "variants": [ + "regular", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/elsie/v26/BCanqZABrez54yYu9slAeLgX.ttf", + "900": "https://fonts.gstatic.com/s/elsie/v26/BCaqqZABrez54x6q2-1IU6QeXSBk.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/elsie/v26/BCanqZABrez54xYv_M0.ttf" + }, + { + "family": "Elsie Swash Caps", + "variants": [ + "regular", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/elsieswashcaps/v25/845DNN8xGZyVX5MVo_upKf7KnjK0ferVKGWsUo8.ttf", + "900": "https://fonts.gstatic.com/s/elsieswashcaps/v25/845ENN8xGZyVX5MVo_upKf7KnjK0RW74DG2HToawrdU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/elsieswashcaps/v25/845DNN8xGZyVX5MVo_upKf7KnjK0TevfLA.ttf" + }, + { + "family": "Emblema One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/emblemaone/v22/nKKT-GQ0F5dSY8vzG0rOEIRBHl57G_f_.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/emblemaone/v22/nKKT-GQ0F5dSY8vzG0rOELRAFFo.ttf" + }, + { + "family": "Emilys Candy", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/emilyscandy/v21/2EbgL-1mD1Rnb0OGKudbk0y5r9xrX84JjA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/emilyscandy/v21/2EbgL-1mD1Rnb0OGKudbk0yJrtZv.ttf" + }, + { + "family": "Encode Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGGHiZtWP7FJCt2c.ttf", + "200": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGOHjZtWP7FJCt2c.ttf", + "300": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGD_jZtWP7FJCt2c.ttf", + "regular": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGGHjZtWP7FJCt2c.ttf", + "500": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGFPjZtWP7FJCt2c.ttf", + "600": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGL_kZtWP7FJCt2c.ttf", + "700": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGIbkZtWP7FJCt2c.ttf", + "800": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGOHkZtWP7FJCt2c.ttf", + "900": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGMjkZtWP7FJCt2c.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/encodesans/v23/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGGHjVtSF6A.ttf" + }, + { + "family": "Encode Sans Condensed", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_76_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-5a-JLQoFI2KR.ttf", + "200": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-SY6pByQJKnuIFA.ttf", + "300": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-LY2pByQJKnuIFA.ttf", + "regular": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_16_LD37rqfuwxyIuaZhE6cRXOLtm2gfTGgaWNDw8VIw.ttf", + "500": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-dYypByQJKnuIFA.ttf", + "600": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-WYupByQJKnuIFA.ttf", + "700": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-PYqpByQJKnuIFA.ttf", + "800": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-IYmpByQJKnuIFA.ttf", + "900": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-BYipByQJKnuIFA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/encodesanscondensed/v11/j8_16_LD37rqfuwxyIuaZhE6cRXOLtm2gfT2gK-J.ttf" + }, + { + "family": "Encode Sans Expanded", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mx1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpJGKQNicoAbJlw.ttf", + "200": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpLqCCNIXIwSP0XD.ttf", + "300": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpKOCyNIXIwSP0XD.ttf", + "regular": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4m_1mF4GcnstG_Jh1QH6ac4hNLeNyeYUqoiIwdAd5Ab.ttf", + "500": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpLWCiNIXIwSP0XD.ttf", + "600": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpL6DSNIXIwSP0XD.ttf", + "700": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpKeDCNIXIwSP0XD.ttf", + "800": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpKCDyNIXIwSP0XD.ttf", + "900": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4mw1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpKmDiNIXIwSP0XD.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/encodesansexpanded/v12/c4m_1mF4GcnstG_Jh1QH6ac4hNLeNyeYUpojKQM.ttf" + }, + { + "family": "Encode Sans SC", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HHhn8c9NOEEClIc.ttf", + "200": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HPhm8c9NOEEClIc.ttf", + "300": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HCZm8c9NOEEClIc.ttf", + "regular": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HHhm8c9NOEEClIc.ttf", + "500": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HEpm8c9NOEEClIc.ttf", + "600": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HKZh8c9NOEEClIc.ttf", + "700": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HJ9h8c9NOEEClIc.ttf", + "800": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HPhh8c9NOEEClIc.ttf", + "900": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HNFh8c9NOEEClIc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/encodesanssc/v14/jVyp7nLwCGzQ9zE7ZyRg0QRXHPZc_uUA6Kb3VJWLE_Pdtm7lcD6qvXT1HHhmwc5HPA.ttf" + }, + { + "family": "Encode Sans Semi Condensed", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT6oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1T19MFtQ9jpVUA.ttf", + "200": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1RZ1eFHbdTgTFmr.ttf", + "300": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1Q91uFHbdTgTFmr.ttf", + "regular": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT4oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG2yR_sVPRsjp.ttf", + "500": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1Rl1-FHbdTgTFmr.ttf", + "600": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1RJ0OFHbdTgTFmr.ttf", + "700": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1Qt0eFHbdTgTFmr.ttf", + "800": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1Qx0uFHbdTgTFmr.ttf", + "900": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT7oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1QV0-FHbdTgTFmr.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/encodesanssemicondensed/v11/3qT4oiKqnDuUtQUEHMoXcmspmy55SFWrXFRp9FTOG1yQ9ME.ttf" + }, + { + "family": "Encode Sans Semi Expanded", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8xOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TM-41KwrlKXeOEA.ttf", + "200": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TM0IUCyDLJX6XCWU.ttf", + "300": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TMyYXCyDLJX6XCWU.ttf", + "regular": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke83OhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TC4o_LyjgOXc.ttf", + "500": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TM34WCyDLJX6XCWU.ttf", + "600": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TM1IRCyDLJX6XCWU.ttf", + "700": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TMzYQCyDLJX6XCWU.ttf", + "800": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TMyoTCyDLJX6XCWU.ttf", + "900": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke8yOhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TMw4SCyDLJX6XCWU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/encodesanssemiexpanded/v20/ke83OhAPMEZs-BDuzwftTNJ85JvwMOzE9d9Cca5TO4s1Kw.ttf" + }, + { + "family": "Engagement", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/engagement/v29/x3dlckLDZbqa7RUs9MFVXNossybsHQI.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/engagement/v29/x3dlckLDZbqa7RUs9MFVbNsmtw.ttf" + }, + { + "family": "Englebert", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/englebert/v24/xn7iYH8w2XGrC8AR4HSxT_fYdN-WZw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/englebert/v24/xn7iYH8w2XGrC8AR4HSBTv3c.ttf" + }, + { + "family": "Enriqueta", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/enriqueta/v19/goksH6L7AUFrRvV44HVTS0CjkP1Yog.ttf", + "500": "https://fonts.gstatic.com/s/enriqueta/v19/gokpH6L7AUFrRvV44HVrv2mHmNZEq6TTFw.ttf", + "600": "https://fonts.gstatic.com/s/enriqueta/v19/gokpH6L7AUFrRvV44HVrk26HmNZEq6TTFw.ttf", + "700": "https://fonts.gstatic.com/s/enriqueta/v19/gokpH6L7AUFrRvV44HVr92-HmNZEq6TTFw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/enriqueta/v19/goksH6L7AUFrRvV44HVjSkqn.ttf" + }, + { + "family": "Ephesis", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/ephesis/v11/uU9PCBUS8IerL2VG7xPb3vyHmlI.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ephesis/v11/uU9PCBUS8IerL2VG3xLR2g.ttf" + }, + { + "family": "Epilogue", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXMDLiDJXVigHPVA.ttf", + "200": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXsDPiDJXVigHPVA.ttf", + "300": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXbjPiDJXVigHPVA.ttf", + "regular": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXMDPiDJXVigHPVA.ttf", + "500": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXAjPiDJXVigHPVA.ttf", + "600": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OX7jTiDJXVigHPVA.ttf", + "700": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OX1zTiDJXVigHPVA.ttf", + "800": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXsDTiDJXVigHPVA.ttf", + "900": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXmTTiDJXVigHPVA.ttf", + "100italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HAKTp_RqATfVHNU.ttf", + "200italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HCKT5_RqATfVHNU.ttf", + "300italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HBUT5_RqATfVHNU.ttf", + "italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HAKT5_RqATfVHNU.ttf", + "500italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HA4T5_RqATfVHNU.ttf", + "600italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HDUSJ_RqATfVHNU.ttf", + "700italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HDtSJ_RqATfVHNU.ttf", + "800italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HCKSJ_RqATfVHNU.ttf", + "900italic": "https://fonts.gstatic.com/s/epilogue/v20/O4ZCFGj5hxF0EhjimlIhqAYaY7EBcUSC-HCjSJ_RqATfVHNU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/epilogue/v20/O4ZMFGj5hxF0EhjimngomvnCCtqb30OXMDPSDZ_R.ttf" + }, + { + "family": "Epunda Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndMlT7Sb54PQAqcA.ttf", + "regular": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndbFT7Sb54PQAqcA.ttf", + "500": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndXlT7Sb54PQAqcA.ttf", + "600": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndslP7Sb54PQAqcA.ttf", + "700": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndi1P7Sb54PQAqcA.ttf", + "800": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_nd7FP7Sb54PQAqcA.ttf", + "900": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndxVP7Sb54PQAqcA.ttf", + "300italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBdNCrR8HwU6cADD.ttf", + "italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBcTCrR8HwU6cADD.ttf", + "500italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBchCrR8HwU6cADD.ttf", + "600italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBfNDbR8HwU6cADD.ttf", + "700italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBf0DbR8HwU6cADD.ttf", + "800italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBeTDbR8HwU6cADD.ttf", + "900italic": "https://fonts.gstatic.com/s/epundasans/v5/ea8Mads_Rv3-GJfWRrHjgH5Hu1Gd_6Axpf7IpBe6DbR8HwU6cADD.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/epundasans/v5/ea8Kads_Rv3-GJfWRrHjgFROia5FlsurC_ndbFTLSLR8.ttf" + }, + { + "family": "Epunda Slab", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-08-26", + "files": { + "300": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_JjNVoU4Q_2eOpA.ttf", + "regular": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_eDNVoU4Q_2eOpA.ttf", + "500": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_SjNVoU4Q_2eOpA.ttf", + "600": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_pjRVoU4Q_2eOpA.ttf", + "700": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_nzRVoU4Q_2eOpA.ttf", + "800": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_-DRVoU4Q_2eOpA.ttf", + "900": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_0TRVoU4Q_2eOpA.ttf", + "300italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHDj4kQU3WKepN0B.ttf", + "italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHC94kQU3WKepN0B.ttf", + "500italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHCP4kQU3WKepN0B.ttf", + "600italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHBj5UQU3WKepN0B.ttf", + "700italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHBa5UQU3WKepN0B.ttf", + "800italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHA95UQU3WKepN0B.ttf", + "900italic": "https://fonts.gstatic.com/s/epundaslab/v2/46k6lbHxTynXpZplPiOFHVVC7VpR7ULUH5xqsHAU5UQU3WKepN0B.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/epundaslab/v2/46k8lbHxTynXpZplPiOFHX9L36WJhClOsZt_eDNloEQU.ttf" + }, + { + "family": "Erica One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/ericaone/v29/WBLnrEXccV9VGrOKmGD1W0_MJMGxiQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ericaone/v29/WBLnrEXccV9VGrOKmGDFWkXI.ttf" + }, + { + "family": "Esteban", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/esteban/v16/r05bGLZE-bdGdN-GdOuD5jokU8E.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/esteban/v16/r05bGLZE-bdGdN-GROqJ4g.ttf" + }, + { + "family": "Estonia", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/estonia/v13/7Au_p_4ijSecA1yHCCL8zkwMIFg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/estonia/v13/7Au_p_4ijSecA1yHOCP2yg.ttf" + }, + { + "family": "Euphoria Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/euphoriascript/v22/mFTpWb0X2bLb_cx6To2B8GpKoD5ak_ZT1D8x7Q.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/euphoriascript/v22/mFTpWb0X2bLb_cx6To2B8GpKoD5qkvxX.ttf" + }, + { + "family": "Ewert", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/ewert/v27/va9I4kzO2tFODYBvS-J3kbDP.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ewert/v27/va9I4kzO2tFODbBuQeY.ttf" + }, + { + "family": "Exile", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-13", + "files": { + "regular": "https://fonts.gstatic.com/s/exile/v1/pxiKyp0xqNtbjBsYHpT2dkNE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/exile/v1/pxiKyp0xqNtbjCsZFJA.ttf" + }, + { + "family": "Exo", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4lM2CwNsOl4p5Is.ttf", + "200": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4tM3CwNsOl4p5Is.ttf", + "300": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4g03CwNsOl4p5Is.ttf", + "regular": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4lM3CwNsOl4p5Is.ttf", + "500": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4mE3CwNsOl4p5Is.ttf", + "600": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4o0wCwNsOl4p5Is.ttf", + "700": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4rQwCwNsOl4p5Is.ttf", + "800": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4tMwCwNsOl4p5Is.ttf", + "900": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4vowCwNsOl4p5Is.ttf", + "100italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t040FmPnws9Iu-uA.ttf", + "200italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0Y0BmPnws9Iu-uA.ttf", + "300italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0vUBmPnws9Iu-uA.ttf", + "italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t040BmPnws9Iu-uA.ttf", + "500italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t00UBmPnws9Iu-uA.ttf", + "600italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0PUdmPnws9Iu-uA.ttf", + "700italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0BEdmPnws9Iu-uA.ttf", + "800italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0Y0dmPnws9Iu-uA.ttf", + "900italic": "https://fonts.gstatic.com/s/exo/v25/4UafrEtFpBISdmSt-MY2ehbO95t0SkdmPnws9Iu-uA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/exo/v25/4UaZrEtFpBI4f1ZSIK9d4LjJ4lM3OwJmPg.ttf" + }, + { + "family": "Exo 2", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jvvOcPtq-rpvLpQ.ttf", + "200": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jPvKcPtq-rpvLpQ.ttf", + "300": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8j4PKcPtq-rpvLpQ.ttf", + "regular": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jvvKcPtq-rpvLpQ.ttf", + "500": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jjPKcPtq-rpvLpQ.ttf", + "600": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jYPWcPtq-rpvLpQ.ttf", + "700": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jWfWcPtq-rpvLpQ.ttf", + "800": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jPvWcPtq-rpvLpQ.ttf", + "900": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jF_WcPtq-rpvLpQ.ttf", + "100italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drF0fNC6jJ7bpQBL.ttf", + "200italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drH0fdC6jJ7bpQBL.ttf", + "300italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drEqfdC6jJ7bpQBL.ttf", + "italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drF0fdC6jJ7bpQBL.ttf", + "500italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drFGfdC6jJ7bpQBL.ttf", + "600italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drGqetC6jJ7bpQBL.ttf", + "700italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drGTetC6jJ7bpQBL.ttf", + "800italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drH0etC6jJ7bpQBL.ttf", + "900italic": "https://fonts.gstatic.com/s/exo2/v26/7cH3v4okm5zmbtYtMeA0FKq0Jjg2drHdetC6jJ7bpQBL.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/exo2/v26/7cH1v4okm5zmbvwkAx_sfcEuiD8jvvKsP9C6.ttf" + }, + { + "family": "Expletus Sans", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v31", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaSY2s1oFQTcXfMm.ttf", + "500": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaSq2s1oFQTcXfMm.ttf", + "600": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaRG3c1oFQTcXfMm.ttf", + "700": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaR_3c1oFQTcXfMm.ttf", + "italic": "https://fonts.gstatic.com/s/expletussans/v31/RLpoK5v5_bqufTYdnhFzDj2ddfsCtKHbhOZyCrFQmSUrHwD-WOMmKKY.ttf", + "500italic": "https://fonts.gstatic.com/s/expletussans/v31/RLpoK5v5_bqufTYdnhFzDj2ddfsCtKHbhOZyCrFQmRcrHwD-WOMmKKY.ttf", + "600italic": "https://fonts.gstatic.com/s/expletussans/v31/RLpoK5v5_bqufTYdnhFzDj2ddfsCtKHbhOZyCrFQmfssHwD-WOMmKKY.ttf", + "700italic": "https://fonts.gstatic.com/s/expletussans/v31/RLpoK5v5_bqufTYdnhFzDj2ddfsCtKHbhOZyCrFQmcIsHwD-WOMmKKY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/expletussans/v31/RLpqK5v5_bqufTYdnhFzDj2dX_IwS3my73zcDaSY2v1pHwA.ttf" + }, + { + "family": "Explora", + "variants": [ + "regular" + ], + "subsets": [ + "cherokee", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/explora/v11/tsstApxFfjUH4wrvc1qPonC3vqc.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/explora/v11/tsstApxFfjUH4wrvQ1uFpg.ttf" + }, + { + "family": "Faculty Glyphic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/facultyglyphic/v4/RrQIbot2-iBvI2mYSyKIrcgoBuQIG-eFNVmULg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/facultyglyphic/v4/RrQIbot2-iBvI2mYSyKIrcgoBuQ4Gu2B.ttf" + }, + { + "family": "Fahkwang", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOJHmZlRFipxkwjx.ttf", + "200italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgHFQHC5Tlhjxdw4.ttf", + "300": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOIjmplRFipxkwjx.ttf", + "300italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgBVTHC5Tlhjxdw4.ttf", + "regular": "https://fonts.gstatic.com/s/fahkwang/v18/Noax6Uj3zpmBOgbNpNqPsr1ZPTZ4.ttf", + "italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa36Uj3zpmBOgbNpOqNuLl7OCZ4ihE.ttf", + "500": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOJ7m5lRFipxkwjx.ttf", + "500italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgE1SHC5Tlhjxdw4.ttf", + "600": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOJXnJlRFipxkwjx.ttf", + "600italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgGFVHC5Tlhjxdw4.ttf", + "700": "https://fonts.gstatic.com/s/fahkwang/v18/Noa26Uj3zpmBOgbNpOIznZlRFipxkwjx.ttf", + "700italic": "https://fonts.gstatic.com/s/fahkwang/v18/Noa06Uj3zpmBOgbNpOqNgAVUHC5Tlhjxdw4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fahkwang/v18/Noax6Uj3zpmBOgbNpOqOuLk.ttf" + }, + { + "family": "Familjen Grotesk", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMGJaSztc1jcEYq2.ttf", + "500": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMG7aSztc1jcEYq2.ttf", + "600": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMFXbiztc1jcEYq2.ttf", + "700": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMFubiztc1jcEYq2.ttf", + "italic": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw31ZR9ZHiDnImG6-NEMQ41wby8WbH8egZPOLG0oe9RBKsSueVz-FJq2Rv4.ttf", + "500italic": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw31ZR9ZHiDnImG6-NEMQ41wby8WbH8egZPOLG0oe9RBKvaueVz-FJq2Rv4.ttf", + "600italic": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw31ZR9ZHiDnImG6-NEMQ41wby8WbH8egZPOLG0oe9RBKhqpeVz-FJq2Rv4.ttf", + "700italic": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw31ZR9ZHiDnImG6-NEMQ41wby8WbH8egZPOLG0oe9RBKiOpeVz-FJq2Rv4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/familjengrotesk/v11/Qw3LZR9ZHiDnImG6-NEMQ41wby8WRnYsfkunR_eGfMGJaRzseVw.ttf" + }, + { + "family": "Fanwood Text", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/fanwoodtext/v17/3XFtErwl05Ad_vSCF6Fq7xXGRdbY1P1Sbg.ttf", + "italic": "https://fonts.gstatic.com/s/fanwoodtext/v17/3XFzErwl05Ad_vSCF6Fq7xX2R9zc9vhCblye.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fanwoodtext/v17/3XFtErwl05Ad_vSCF6Fq7xX2RNzc.ttf" + }, + { + "family": "Farro", + "variants": [ + "300", + "regular", + "500", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/farro/v15/i7dJIFl3byGNHa3hNJ6-WkJUQUq7.ttf", + "regular": "https://fonts.gstatic.com/s/farro/v15/i7dEIFl3byGNHZVNHLq2cV5d.ttf", + "500": "https://fonts.gstatic.com/s/farro/v15/i7dJIFl3byGNHa25NZ6-WkJUQUq7.ttf", + "700": "https://fonts.gstatic.com/s/farro/v15/i7dJIFl3byGNHa3xM56-WkJUQUq7.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/farro/v15/i7dEIFl3byGNHaVMFr4.ttf" + }, + { + "family": "Farsan", + "variants": [ + "regular" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/farsan/v24/VEMwRoJ0vY_zsyz62q-pxDX9rQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/farsan/v24/VEMwRoJ0vY_zsyzK26Wt.ttf" + }, + { + "family": "Fascinate", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/fascinate/v23/z7NWdRrufC8XJK0IIEli1LbQRPyNrw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fascinate/v23/z7NWdRrufC8XJK0IIElS1bzU.ttf" + }, + { + "family": "Fascinate Inline", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/fascinateinline/v24/jVyR7mzzB3zc-jp6QCAu60poNqIy1g3CfRXxWZQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fascinateinline/v24/jVyR7mzzB3zc-jp6QCAu60poNqIy5gzIeQ.ttf" + }, + { + "family": "Faster One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/fasterone/v20/H4ciBXCHmdfClFb-vWhfyLuShq63czE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fasterone/v20/H4ciBXCHmdfClFb-vWhf-LqYgg.ttf" + }, + { + "family": "Fasthand", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v33", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/fasthand/v33/0yb9GDohyKTYn_ZEESkuYkw2rQg1.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fasthand/v33/0yb9GDohyKTYn_ZEERkvaEg.ttf" + }, + { + "family": "Fauna One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/faunaone/v16/wlpzgwTPBVpjpCuwkuEx2UxLYClOCg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/faunaone/v16/wlpzgwTPBVpjpCuwkuEB2EZP.ttf" + }, + { + "family": "Faustina", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHls3IEvGVWWe8tbEg.ttf", + "regular": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsgoEvGVWWe8tbEg.ttf", + "500": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlssIEvGVWWe8tbEg.ttf", + "600": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsXIYvGVWWe8tbEg.ttf", + "700": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsZYYvGVWWe8tbEg.ttf", + "800": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsAoYvGVWWe8tbEg.ttf", + "300italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsKZWl-SWc5LEnoF.ttf", + "italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsLHWl-SWc5LEnoF.ttf", + "500italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsL1Wl-SWc5LEnoF.ttf", + "600italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsIZXV-SWc5LEnoF.ttf", + "700italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsIgXV-SWc5LEnoF.ttf", + "800italic": "https://fonts.gstatic.com/s/faustina/v23/XLY2IZPxYpJfTbZAFV-6B8JKUqez9n55SsJHXV-SWc5LEnoF.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/faustina/v23/XLY4IZPxYpJfTbZAFXWzNT2SO8wpWHlsgoEfGF-S.ttf" + }, + { + "family": "Federant", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v31", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/federant/v31/2sDdZGNfip_eirT0_U0jRUG0AqUc.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/federant/v31/2sDdZGNfip_eirT0_X0iT0U.ttf" + }, + { + "family": "Federo", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/federo/v20/iJWFBX-cbD_ETsbmjVOe2WTG7Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/federo/v20/iJWFBX-cbD_ETsbWjFma.ttf" + }, + { + "family": "Felipa", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/felipa/v27/FwZa7-owz1Eu4F_wSNSEwM2zpA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/felipa/v27/FwZa7-owz1Eu4F_ASd6A.ttf" + }, + { + "family": "Fenix", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/fenix/v21/XoHo2YL_S7-g5ostKzAFvs8o.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fenix/v21/XoHo2YL_S7-g5rssITQ.ttf" + }, + { + "family": "Festive", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/festive/v11/cY9Ffj6KX1xcoDWhFtfgy9HTkak.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/festive/v11/cY9Ffj6KX1xcoDWhJtbqzw.ttf" + }, + { + "family": "Figtree", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_chQF5ewkEU4HTy.ttf", + "regular": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_d_QF5ewkEU4HTy.ttf", + "500": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_dNQF5ewkEU4HTy.ttf", + "600": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_ehR15ewkEU4HTy.ttf", + "700": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_eYR15ewkEU4HTy.ttf", + "800": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_f_R15ewkEU4HTy.ttf", + "900": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_fWR15ewkEU4HTy.ttf", + "300italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A-gdyEU25WTybO8.ttf", + "italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A7YdyEU25WTybO8.ttf", + "500italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A4QdyEU25WTybO8.ttf", + "600italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A2gayEU25WTybO8.ttf", + "700italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3A1EayEU25WTybO8.ttf", + "800italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3AzYayEU25WTybO8.ttf", + "900italic": "https://fonts.gstatic.com/s/figtree/v9/_Xm9-HUzqDCFdgfMm4GnA4aZFrUvtOK3Ax8ayEU25WTybO8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_d_QG5fyEU.ttf" + }, + { + "family": "Finger Paint", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/fingerpaint/v21/0QInMXVJ-o-oRn_7dron8YWO85bS8ANesw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fingerpaint/v21/0QInMXVJ-o-oRn_7dron8YW-8pzW.ttf" + }, + { + "family": "Finlandica", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v10", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19A7rEjx9i5ss3a3.ttf", + "500": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19AJrEjx9i5ss3a3.ttf", + "600": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19Dlq0jx9i5ss3a3.ttf", + "700": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19Dcq0jx9i5ss3a3.ttf", + "italic": "https://fonts.gstatic.com/s/finlandica/v10/-nFuOGk-8vAc7lEtg0aS45mfNAn722rq0MXz76Cy_CpOtma3uNQ.ttf", + "500italic": "https://fonts.gstatic.com/s/finlandica/v10/-nFuOGk-8vAc7lEtg0aS45mfNAn722rq0MXz75Ky_CpOtma3uNQ.ttf", + "600italic": "https://fonts.gstatic.com/s/finlandica/v10/-nFuOGk-8vAc7lEtg0aS45mfNAn722rq0MXz7361_CpOtma3uNQ.ttf", + "700italic": "https://fonts.gstatic.com/s/finlandica/v10/-nFuOGk-8vAc7lEtg0aS45mfNAn722rq0MXz70e1_CpOtma3uNQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/finlandica/v10/-nFsOGk-8vAc7lEtg0aSyZCty9GSsPBE19A7rHjw_Co.ttf" + }, + { + "family": "Fira Code", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "symbols2" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_GNsFVfxN87gsj0.ttf", + "regular": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_D1sFVfxN87gsj0.ttf", + "500": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_A9sFVfxN87gsj0.ttf", + "600": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_ONrFVfxN87gsj0.ttf", + "700": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_NprFVfxN87gsj0.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/firacode/v27/uU9eCBsR6Z2vfE9aq3bL0fxyUs4tcw4W_D1sJVb7Mw.ttf" + }, + { + "family": "Fira Mono", + "variants": [ + "regular", + "500", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "symbols2" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/firamono/v16/N0bX2SlFPv1weGeLZDtQIfTTkdbJYA.ttf", + "500": "https://fonts.gstatic.com/s/firamono/v16/N0bS2SlFPv1weGeLZDto1d33mf3VaZBRBQ.ttf", + "700": "https://fonts.gstatic.com/s/firamono/v16/N0bS2SlFPv1weGeLZDtondv3mf3VaZBRBQ.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/firamono/v16/N0bX2SlFPv1weGeLZDtgIP7X.ttf" + }, + { + "family": "Fira Sans", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/firasans/v18/va9C4kDNxMZdWfMOD5Vn9IjOazP3dUTP.ttf", + "100italic": "https://fonts.gstatic.com/s/firasans/v18/va9A4kDNxMZdWfMOD5VvkrCqYTfVcFTPj0s.ttf", + "200": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnWKnuQR37fF3Wlg.ttf", + "200italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrAGQBf_XljGllLX.ttf", + "300": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnPKruQR37fF3Wlg.ttf", + "300italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrBiQxf_XljGllLX.ttf", + "regular": "https://fonts.gstatic.com/s/firasans/v18/va9E4kDNxMZdWfMOD5VfkILKSTbndQ.ttf", + "italic": "https://fonts.gstatic.com/s/firasans/v18/va9C4kDNxMZdWfMOD5VvkojOazP3dUTP.ttf", + "500": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnZKvuQR37fF3Wlg.ttf", + "500italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrA6Qhf_XljGllLX.ttf", + "600": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnSKzuQR37fF3Wlg.ttf", + "600italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrAWRRf_XljGllLX.ttf", + "700": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnLK3uQR37fF3Wlg.ttf", + "700italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrByRBf_XljGllLX.ttf", + "800": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnMK7uQR37fF3Wlg.ttf", + "800italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrBuRxf_XljGllLX.ttf", + "900": "https://fonts.gstatic.com/s/firasans/v18/va9B4kDNxMZdWfMOD5VnFK_uQR37fF3Wlg.ttf", + "900italic": "https://fonts.gstatic.com/s/firasans/v18/va9f4kDNxMZdWfMOD5VvkrBKRhf_XljGllLX.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/firasans/v18/va9E4kDNxMZdWfMOD5VvkYjO.ttf" + }, + { + "family": "Fira Sans Condensed", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOjEADFm8hSaQTFG18FErVhsC9x-tarWZXtqOlQfx9CjA.ttf", + "100italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOtEADFm8hSaQTFG18FErVhsC9x-tarUfPVzONUXRpSjJcu.ttf", + "200": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWTnMiMN-cxZblY4.ttf", + "200italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVYMJ0dzRehY43EA.ttf", + "300": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWV3PiMN-cxZblY4.ttf", + "300italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVBMF0dzRehY43EA.ttf", + "regular": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOhEADFm8hSaQTFG18FErVhsC9x-tarYfHnrMtVbx8.ttf", + "italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOjEADFm8hSaQTFG18FErVhsC9x-tarUfPtqOlQfx9CjA.ttf", + "500": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWQXOiMN-cxZblY4.ttf", + "500italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVXMB0dzRehY43EA.ttf", + "600": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWSnJiMN-cxZblY4.ttf", + "600italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVcMd0dzRehY43EA.ttf", + "700": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWU3IiMN-cxZblY4.ttf", + "700italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVFMZ0dzRehY43EA.ttf", + "800": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWVHLiMN-cxZblY4.ttf", + "800italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVCMV0dzRehY43EA.ttf", + "900": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOsEADFm8hSaQTFG18FErVhsC9x-tarWXXKiMN-cxZblY4.ttf", + "900italic": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOuEADFm8hSaQTFG18FErVhsC9x-tarUfPVLMR0dzRehY43EA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/firasanscondensed/v11/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfDtqA.ttf" + }, + { + "family": "Fira Sans Extra Condensed", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPMcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3Zyuv1WarE9ncg.ttf", + "100italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPOcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqW21-ejkp3cn22.ttf", + "200": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3TCPn3-0oEZ-a2Q.ttf", + "200italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWd36-pGR7e2SvJQ.ttf", + "300": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3VSMn3-0oEZ-a2Q.ttf", + "300italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWE32-pGR7e2SvJQ.ttf", + "regular": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPKcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda5fiku3efvE8.ttf", + "italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPMcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fquv1WarE9ncg.ttf", + "500": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3QyNn3-0oEZ-a2Q.ttf", + "500italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWS3y-pGR7e2SvJQ.ttf", + "600": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3SCKn3-0oEZ-a2Q.ttf", + "600italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWZ3u-pGR7e2SvJQ.ttf", + "700": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3USLn3-0oEZ-a2Q.ttf", + "700italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWA3q-pGR7e2SvJQ.ttf", + "800": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3ViIn3-0oEZ-a2Q.ttf", + "800italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWH3m-pGR7e2SvJQ.ttf", + "900": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPPcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda3XyJn3-0oEZ-a2Q.ttf", + "900italic": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPxcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fqWO3i-pGR7e2SvJQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/firasansextracondensed/v11/NaPKcYDaAO5dirw6IaFn7lPJFqXmS-M9Atn3wgda1fmuvw.ttf" + }, + { + "family": "Fjalla One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/fjallaone/v16/Yq6R-LCAWCX3-6Ky7FAFnOZwkxgtUb8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fjallaone/v16/Yq6R-LCAWCX3-6Ky7FAFrOd6lw.ttf" + }, + { + "family": "Fjord One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/fjordone/v22/zOL-4pbEnKBY_9S1jNKr6e5As-FeiQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fjordone/v22/zOL-4pbEnKBY_9S1jNKb6ORE.ttf" + }, + { + "family": "Flamenco", + "variants": [ + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/flamenco/v19/neIPzCehqYguo67ssZ0qNIkyepH9qGsf.ttf", + "regular": "https://fonts.gstatic.com/s/flamenco/v19/neIIzCehqYguo67ssaWGHK06UY30.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/flamenco/v19/neIIzCehqYguo67ssZWHFqk.ttf" + }, + { + "family": "Flavors", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/flavors/v28/FBV2dDrhxqmveJTpbkzlNqkG9UY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/flavors/v28/FBV2dDrhxqmveJTpXk3vMg.ttf" + }, + { + "family": "Fleur De Leah", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/fleurdeleah/v11/AYCNpXX7ftYZWLhv9UmPJTMC5vat4I_Gdq0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fleurdeleah/v11/AYCNpXX7ftYZWLhv9UmPJTMC1ven5A.ttf" + }, + { + "family": "Flow Block", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/flowblock/v15/wlp0gwfPCEB65UmTk-d6-WZlbCBXE_I.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/flowblock/v15/wlp0gwfPCEB65UmTk-d6yWdvaA.ttf" + }, + { + "family": "Flow Circular", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/flowcircular/v15/lJwB-pc4j2F-H8YKuyvfxdZ45ifpWdr2rIg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/flowcircular/v15/lJwB-pc4j2F-H8YKuyvfxdZ41ibjXQ.ttf" + }, + { + "family": "Flow Rounded", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/flowrounded/v15/-zki91mtwsU9qlLiGwD4oQX3oZX-Xup87g.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/flowrounded/v15/-zki91mtwsU9qlLiGwD4oQXHoJ_6.ttf" + }, + { + "family": "Foldit", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XpANmapUYLHkN80.ttf", + "200": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XhAMmapUYLHkN80.ttf", + "300": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8Xs4MmapUYLHkN80.ttf", + "regular": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XpAMmapUYLHkN80.ttf", + "500": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XqIMmapUYLHkN80.ttf", + "600": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8Xk4LmapUYLHkN80.ttf", + "700": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XncLmapUYLHkN80.ttf", + "800": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XhALmapUYLHkN80.ttf", + "900": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XjkLmapUYLHkN80.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/foldit/v8/aFTI7PF3Y3c9WdjNrRVE0Rk2b7j8XpAMqateZA.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Fondamento", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/fondamento/v22/4UaHrEJGsxNmFTPDnkaJx63j5pN1MwI.ttf", + "italic": "https://fonts.gstatic.com/s/fondamento/v22/4UaFrEJGsxNmFTPDnkaJ96_p4rFwIwJePw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fondamento/v22/4UaHrEJGsxNmFTPDnkaJ96zp4g.ttf" + }, + { + "family": "Fontdiner Swanky", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/fontdinerswanky/v24/ijwOs4XgRNsiaI5-hcVb4hQgMvCD4uEfKiGvxts.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fontdinerswanky/v24/ijwOs4XgRNsiaI5-hcVb4hQgMvCD0uAVLg.ttf" + }, + { + "family": "Forum", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/forum/v19/6aey4Ky-Vb8Ew_IWMJMa3mnT.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/forum/v19/6aey4Ky-Vb8Ew8IXOpc.ttf" + }, + { + "family": "Fragment Mono", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/fragmentmono/v6/4iCr6K5wfMRRjxp0DA6-2CLnN4RNh4UI_1U.ttf", + "italic": "https://fonts.gstatic.com/s/fragmentmono/v6/4iC16K5wfMRRjxp0DA6-2CLnB4ZHg6cN71URtQ.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fragmentmono/v6/4iCr6K5wfMRRjxp0DA6-2CLnB4VHgw.ttf" + }, + { + "family": "Francois One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/francoisone/v22/_Xmr-H4zszafZw3A-KPSZutNxgKQu_avAg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/francoisone/v22/_Xmr-H4zszafZw3A-KPSZut9xwiU.ttf" + }, + { + "family": "Frank Ruhl Libre", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw6bYVqQPxR2EUR_.ttf", + "regular": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw7FYVqQPxR2EUR_.ttf", + "500": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw73YVqQPxR2EUR_.ttf", + "600": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw4bZlqQPxR2EUR_.ttf", + "700": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw4iZlqQPxR2EUR_.ttf", + "800": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw5FZlqQPxR2EUR_.ttf", + "900": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw5sZlqQPxR2EUR_.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/frankruhllibre/v23/j8_96_fAw7jrcalD7oKYNX0QfAnPcbzNEEB7OoicBw7FYWqRNRA.ttf" + }, + { + "family": "Fraunces", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v38", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxqjDvTShUtWNg.ttf", + "200": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcNxujDvTShUtWNg.ttf", + "300": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIc6RujDvTShUtWNg.ttf", + "regular": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxujDvTShUtWNg.ttf", + "500": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIchRujDvTShUtWNg.ttf", + "600": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcaRyjDvTShUtWNg.ttf", + "700": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcUByjDvTShUtWNg.ttf", + "800": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcNxyjDvTShUtWNg.ttf", + "900": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIcHhyjDvTShUtWNg.ttf", + "100italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1hLTP7Wp05GNi3k.ttf", + "200italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1jLTf7Wp05GNi3k.ttf", + "300italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1gVTf7Wp05GNi3k.ttf", + "italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1hLTf7Wp05GNi3k.ttf", + "500italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1h5Tf7Wp05GNi3k.ttf", + "600italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1iVSv7Wp05GNi3k.ttf", + "700italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1isSv7Wp05GNi3k.ttf", + "800italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1jLSv7Wp05GNi3k.ttf", + "900italic": "https://fonts.gstatic.com/s/fraunces/v38/6NVf8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9sPEKsxx664UJf1jiSv7Wp05GNi3k.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fraunces/v38/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTD_7W.ttf" + }, + { + "family": "Freckle Face", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/freckleface/v16/AMOWz4SXrmKHCvXTohxY-YI0U1K2w9lb4g.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/freckleface/v16/AMOWz4SXrmKHCvXTohxY-YIEUliy.ttf" + }, + { + "family": "Fredericka the Great", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/frederickathegreat/v23/9Bt33CxNwt7aOctW2xjbCstzwVKsIBVV-9Skz7Ylch2L.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/frederickathegreat/v23/9Bt33CxNwt7aOctW2xjbCstzwVKsIBVV--SlxbI.ttf" + }, + { + "family": "Fredoka", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3OryLMFuOLlNldbw.ttf", + "regular": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3O8SLMFuOLlNldbw.ttf", + "500": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3OwyLMFuOLlNldbw.ttf", + "600": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3OLyXMFuOLlNldbw.ttf", + "700": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3OFiXMFuOLlNldbw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fredoka/v17/X7nP4b87HvSqjb_WIi2yDCRwoQ_k7367_B-i2yQag0-mac3O8SL8F-mP.ttf" + }, + { + "family": "Freehand", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v34", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/freehand/v34/cIf-Ma5eqk01VjKTgAmBTmUOmZJk.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/freehand/v34/cIf-Ma5eqk01VjKTgDmARGE.ttf" + }, + { + "family": "Freeman", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/freeman/v1/S6u9w4NGQiLN8nh-ew-FGC_p9dw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/freeman/v1/S6u9w4NGQiLN8nh-Sw6PHA.ttf" + }, + { + "family": "Fresca", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/fresca/v24/6ae94K--SKgCzbM2Gr0W13DKPA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fresca/v24/6ae94K--SKgCzbMGG7cS.ttf" + }, + { + "family": "Frijole", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v15", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/frijole/v15/uU9PCBUR8oakM2BQ7xPb3vyHmlI.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/frijole/v15/uU9PCBUR8oakM2BQ3xLR2g.ttf" + }, + { + "family": "Fruktur", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v28", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/fruktur/v28/SZc53FHsOru5QYsMfz3GkUrS8DI.ttf", + "italic": "https://fonts.gstatic.com/s/fruktur/v28/SZc73FHsOru5QYsMTz_MlWjX4DJXgQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fruktur/v28/SZc53FHsOru5QYsMTzzMlQ.ttf" + }, + { + "family": "Fugaz One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/fugazone/v21/rax_HiWKp9EAITukFslMBBJek0vA8A.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fugazone/v21/rax_HiWKp9EAITukFsl8BRha.ttf" + }, + { + "family": "Fuggles", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/fuggles/v14/k3kQo8UEJOlD1hpOTd7iL0nAMaM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fuggles/v14/k3kQo8UEJOlD1hpOfd_oKw.ttf" + }, + { + "family": "Funnel Display", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYxGPXWMVwIZDKFA.ttf", + "regular": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYmmPXWMVwIZDKFA.ttf", + "500": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYqGPXWMVwIZDKFA.ttf", + "600": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYRGTXWMVwIZDKFA.ttf", + "700": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYfWTXWMVwIZDKFA.ttf", + "800": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYGmTXWMVwIZDKFA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/funneldisplay/v3/B50bF7FGv37QNVWgE0ga--4PbZSRJXrOHcLHLoAYmmPnWc90.ttf" + }, + { + "family": "Funnel Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAy3mEfm9NnDyL7w.ttf", + "regular": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAlXmEfm9NnDyL7w.ttf", + "500": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAp3mEfm9NnDyL7w.ttf", + "600": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAS36Efm9NnDyL7w.ttf", + "700": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAcn6Efm9NnDyL7w.ttf", + "800": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAFX6Efm9NnDyL7w.ttf", + "300italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXToyPWVJvjmb76XZ.ttf", + "italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTpsPWVJvjmb76XZ.ttf", + "500italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTpePWVJvjmb76XZ.ttf", + "600italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTqyOmVJvjmb76XZ.ttf", + "700italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTqLOmVJvjmb76XZ.ttf", + "800italic": "https://fonts.gstatic.com/s/funnelsans/v3/OpNZno8Dg9bX6Bsp3Wq69Tp3ZBbKP5ZAjyZVXTrsOmVJvjmb76XZ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/funnelsans/v3/OpNfno8Dg9bX6Bsp3Wq69RB-VukSVv3aISFAlXm0f2VJ.ttf" + }, + { + "family": "Fustat", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCMQQRryztWo_3fk.ttf", + "300": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCBoQRryztWo_3fk.ttf", + "regular": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCEQQRryztWo_3fk.ttf", + "500": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCHYQRryztWo_3fk.ttf", + "600": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCJoXRryztWo_3fk.ttf", + "700": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCKMXRryztWo_3fk.ttf", + "800": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCMQXRryztWo_3fk.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCEQQdr25sQ.ttf" + }, + { + "family": "Fuzzy Bubbles", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/fuzzybubbles/v9/6qLGKZMbrgv9pwtjPEVNV0F2NnP5Zxsreko.ttf", + "700": "https://fonts.gstatic.com/s/fuzzybubbles/v9/6qLbKZMbrgv9pwtjPEVNV0F2Ds_WQxMAZkM1pn4.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/fuzzybubbles/v9/6qLGKZMbrgv9pwtjPEVNV0F2BnLzYw.ttf" + }, + { + "family": "GFS Didot", + "variants": [ + "regular" + ], + "subsets": [ + "greek", + "greek-ext", + "latin", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/gfsdidot/v18/Jqzh5TybZ9vZMWFssvwiF-fGFSCGAA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gfsdidot/v18/Jqzh5TybZ9vZMWFssvwSFu3C.ttf" + }, + { + "family": "GFS Neohellenic", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "greek", + "greek-ext", + "latin", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QIRdiDOrfiq0b7R8O1Iw9WLcY5TLahP46UDUw.ttf", + "italic": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QITdiDOrfiq0b7R8O1Iw9WLcY5jL6JLwaATU91X.ttf", + "700": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QIUdiDOrfiq0b7R8O1Iw9WLcY5rkYdr644fWsRO9w.ttf", + "700italic": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QIWdiDOrfiq0b7R8O1Iw9WLcY5jL5r37oQbeMFe985V.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gfsneohellenic/v27/8QIRdiDOrfiq0b7R8O1Iw9WLcY5jLKJL.ttf" + }, + { + "family": "Ga Maamli", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/gamaamli/v3/uU9NCBsQ4c-DPW1Yo3rR2t6CilKOdQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gamaamli/v3/uU9NCBsQ4c-DPW1Yo3rh29SG.ttf" + }, + { + "family": "Gabarito", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj248K0FgItq6bFIg.ttf", + "500": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj20cK0FgItq6bFIg.ttf", + "600": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj2PcW0FgItq6bFIg.ttf", + "700": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj2BMW0FgItq6bFIg.ttf", + "800": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj2Y8W0FgItq6bFIg.ttf", + "900": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj2SsW0FgItq6bFIg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gabarito/v9/QGYwz_0dZAGKJJ4t3FFkc3Q8AkNP9Pj248KEFwgp.ttf" + }, + { + "family": "Gabriela", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/gabriela/v23/qkBWXvsO6sreR8E-b_m-zrpHmRzC.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gabriela/v23/qkBWXvsO6sreR8E-b8m_xL4.ttf" + }, + { + "family": "Gaegu", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/gaegu/v23/TuGSUVB6Up9NU57nifw74sdtBk0x.ttf", + "regular": "https://fonts.gstatic.com/s/gaegu/v23/TuGfUVB6Up9NU6ZLodgzydtk.ttf", + "700": "https://fonts.gstatic.com/s/gaegu/v23/TuGSUVB6Up9NU573jvw74sdtBk0x.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gaegu/v23/TuGfUVB6Up9NU5ZKq9w.ttf" + }, + { + "family": "Gafata", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/gafata/v22/XRXV3I6Cn0VJKon4MuyAbsrVcA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gafata/v22/XRXV3I6Cn0VJKonIM-aE.ttf" + }, + { + "family": "Gajraj One", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/gajrajone/v7/1cX2aUDCDpXsuWVb1jIjr1GqhcitzeM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gajrajone/v7/1cX2aUDCDpXsuWVb1jIjn1CggQ.ttf" + }, + { + "family": "Galada", + "variants": [ + "regular" + ], + "subsets": [ + "bengali", + "latin" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/galada/v21/H4cmBXyGmcjXlUX-8iw-4Lqggw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/galada/v21/H4cmBXyGmcjXlUXO8yY6.ttf" + }, + { + "family": "Galdeano", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/galdeano/v23/uU9MCBoQ4YOqOW1boDPx8PCOg0uX.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/galdeano/v23/uU9MCBoQ4YOqOW1boAPw-vQ.ttf" + }, + { + "family": "Galindo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/galindo/v26/HI_KiYMeLqVKqwyuQ5HiRp-dhpQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/galindo/v26/HI_KiYMeLqVKqwyuc5DoQg.ttf" + }, + { + "family": "Gamja Flower", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/gamjaflower/v26/6NUR8FiKJg-Pa0rM6uN40Z4kyf9Fdty2ew.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gamjaflower/v26/6NUR8FiKJg-Pa0rM6uN40Z4UyPVB.ttf" + }, + { + "family": "Gantari", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g0gOz3wa5GD2qnm.ttf", + "200": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g2gOj3wa5GD2qnm.ttf", + "300": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g1-Oj3wa5GD2qnm.ttf", + "regular": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g0gOj3wa5GD2qnm.ttf", + "500": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g0SOj3wa5GD2qnm.ttf", + "600": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g3-PT3wa5GD2qnm.ttf", + "700": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g3HPT3wa5GD2qnm.ttf", + "800": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g2gPT3wa5GD2qnm.ttf", + "900": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g2JPT3wa5GD2qnm.ttf", + "100italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoedWyYZWh37nmpWc.ttf", + "200italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeVWzYZWh37nmpWc.ttf", + "300italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeYuzYZWh37nmpWc.ttf", + "italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoedWzYZWh37nmpWc.ttf", + "500italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeeezYZWh37nmpWc.ttf", + "600italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeQu0YZWh37nmpWc.ttf", + "700italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeTK0YZWh37nmpWc.ttf", + "800italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeVW0YZWh37nmpWc.ttf", + "900italic": "https://fonts.gstatic.com/s/gantari/v4/jVyb7nvyB2HL8iZyJEc0qSzwj1Hs8RjoeXy0YZWh37nmpWc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gantari/v4/jVyV7nvyB2HL8iZyDk4GVvSZ5MtC9g0gOg3xYZU.ttf" + }, + { + "family": "Gasoek One", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/gasoekone/v3/EJRTQgQ_UMUKvDgnlX80zrq_cyb-vco.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gasoekone/v3/EJRTQgQ_UMUKvDgnlX80_ru1dw.ttf" + }, + { + "family": "Gayathri", + "variants": [ + "100", + "regular", + "700" + ], + "subsets": [ + "latin", + "malayalam" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/gayathri/v20/MCoWzAb429DbBilWLLhc-pvSA_gA2W8.ttf", + "regular": "https://fonts.gstatic.com/s/gayathri/v20/MCoQzAb429DbBilWLIA48J_wBugA.ttf", + "700": "https://fonts.gstatic.com/s/gayathri/v20/MCoXzAb429DbBilWLLiE37v4LfQJwHbn.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gayathri/v20/MCoQzAb429DbBilWLLA5-ps.ttf" + }, + { + "family": "Geist", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RnOI4nZPby1QNtA.ttf", + "200": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RHOM4nZPby1QNtA.ttf", + "300": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RwuM4nZPby1QNtA.ttf", + "regular": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RnOM4nZPby1QNtA.ttf", + "500": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RruM4nZPby1QNtA.ttf", + "600": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RQuQ4nZPby1QNtA.ttf", + "700": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_Re-Q4nZPby1QNtA.ttf", + "800": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RHOQ4nZPby1QNtA.ttf", + "900": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RNeQ4nZPby1QNtA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/geist/v4/gyBhhwUxId8gMGYQMKR3pzfaWI_RnOMInJnf.ttf" + }, + { + "family": "Geist Mono", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeE9KZ5T7ihaO_CS.ttf", + "200": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeG9KJ5T7ihaO_CS.ttf", + "300": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeFjKJ5T7ihaO_CS.ttf", + "regular": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeE9KJ5T7ihaO_CS.ttf", + "500": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeEPKJ5T7ihaO_CS.ttf", + "600": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeHjL55T7ihaO_CS.ttf", + "700": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeHaL55T7ihaO_CS.ttf", + "800": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeG9L55T7ihaO_CS.ttf", + "900": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeGUL55T7ihaO_CS.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/geistmono/v4/or3yQ6H-1_WfwkMZI_qYPLs1a-t7PU0AbeE9KK5S5Cw.ttf" + }, + { + "family": "Gelasio", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL8Ilycs-TDO8Aba.ttf", + "500": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL86lycs-TDO8Aba.ttf", + "600": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL_WkCcs-TDO8Aba.ttf", + "700": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL_vkCcs-TDO8Aba.ttf", + "italic": "https://fonts.gstatic.com/s/gelasio/v14/cIfsMaFfvUQxTTqS9Cu7b2nySBfeR6rA1M9v8zTs9RbanYs.ttf", + "500italic": "https://fonts.gstatic.com/s/gelasio/v14/cIfsMaFfvUQxTTqS9Cu7b2nySBfeR6rA1P1v8zTs9RbanYs.ttf", + "600italic": "https://fonts.gstatic.com/s/gelasio/v14/cIfsMaFfvUQxTTqS9Cu7b2nySBfeR6rA1BFo8zTs9RbanYs.ttf", + "700italic": "https://fonts.gstatic.com/s/gelasio/v14/cIfsMaFfvUQxTTqS9Cu7b2nySBfeR6rA1Cho8zTs9RbanYs.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gelasio/v14/cIfiMaFfvUQxTTqS3iKJkLGbI41wQL8Ilxct8zQ.ttf" + }, + { + "family": "Gemunu Libre", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "sinhala" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp05iJPvSLeMXPIWA.ttf", + "300": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp00aJPvSLeMXPIWA.ttf", + "regular": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp0xiJPvSLeMXPIWA.ttf", + "500": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp0yqJPvSLeMXPIWA.ttf", + "600": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp08aOPvSLeMXPIWA.ttf", + "700": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp0_-OPvSLeMXPIWA.ttf", + "800": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp05iOPvSLeMXPIWA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gemunulibre/v18/X7n34bQ6Cfy7jKGXVE_YlqnbEQAFP-PIuTCp0xiJDvWBfA.ttf" + }, + { + "family": "Genos", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cherokee", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVqknorUK6K7ZsAg.ttf", + "200": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVKkjorUK6K7ZsAg.ttf", + "300": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwV9EjorUK6K7ZsAg.ttf", + "regular": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVqkjorUK6K7ZsAg.ttf", + "500": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVmEjorUK6K7ZsAg.ttf", + "600": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVdE_orUK6K7ZsAg.ttf", + "700": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVTU_orUK6K7ZsAg.ttf", + "800": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVKk_orUK6K7ZsAg.ttf", + "900": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVA0_orUK6K7ZsAg.ttf", + "100italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgsA70i-CbN8Ard7.ttf", + "200italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYguA7ki-CbN8Ard7.ttf", + "300italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgte7ki-CbN8Ard7.ttf", + "italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgsA7ki-CbN8Ard7.ttf", + "500italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgsy7ki-CbN8Ard7.ttf", + "600italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgve6Ui-CbN8Ard7.ttf", + "700italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgvn6Ui-CbN8Ard7.ttf", + "800italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYguA6Ui-CbN8Ard7.ttf", + "900italic": "https://fonts.gstatic.com/s/genos/v16/SlGPmQqPqpUOYRwqWzksdKTv0zsAYgup6Ui-CbN8Ard7.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/genos/v16/SlGNmQqPqpUOYTYjacb0Hc91fTwVqkjYrEi-.ttf" + }, + { + "family": "Gentium Book Plus", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFL2-RHBgUK5fbjKxRpbBtJPyRpofKfdbLOrdPV.ttf", + "italic": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFN2-RHBgUK5fbjKxRpbBtJPyRpocKdf7bsqMPVZb4.ttf", + "700": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFO2-RHBgUK5fbjKxRpbBtJPyRpocojWpbGhs_cfKe1.ttf", + "700italic": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFA2-RHBgUK5fbjKxRpbBtJPyRpocKdRwrDjMv-ebe1Els.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gentiumbookplus/v1/vEFL2-RHBgUK5fbjKxRpbBtJPyRpocKef7Y.ttf" + }, + { + "family": "Gentium Plus", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/gentiumplus/v2/Iurd6Ytw-oSPaZ00r2bNe8VpjJtM6G0t9w.ttf", + "italic": "https://fonts.gstatic.com/s/gentiumplus/v2/IurD6Ytw-oSPaZ00r2bNe8VZjpFIymg9957e.ttf", + "700": "https://fonts.gstatic.com/s/gentiumplus/v2/IurC6Ytw-oSPaZ00r2bNe8VRMLRo4EYx_ofHsw.ttf", + "700italic": "https://fonts.gstatic.com/s/gentiumplus/v2/IurA6Ytw-oSPaZ00r2bNe8VZjqn05Uw13ILXs-h6.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gentiumplus/v2/Iurd6Ytw-oSPaZ00r2bNe8VZjZFI.ttf" + }, + { + "family": "Geo", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/geo/v23/CSRz4zRZlufVL3BmQjlCbQ.ttf", + "italic": "https://fonts.gstatic.com/s/geo/v23/CSRx4zRZluflLXpiYDxSbf8r.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/geo/v23/CSRz4zRZluflLnpi.ttf" + }, + { + "family": "Geologica", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqDx_qQ-MYAXWnqFs.ttf", + "200": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD5_rQ-MYAXWnqFs.ttf", + "300": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD0HrQ-MYAXWnqFs.ttf", + "regular": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqDx_rQ-MYAXWnqFs.ttf", + "500": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqDy3rQ-MYAXWnqFs.ttf", + "600": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD8HsQ-MYAXWnqFs.ttf", + "700": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD_jsQ-MYAXWnqFs.ttf", + "800": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD5_sQ-MYAXWnqFs.ttf", + "900": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqD7bsQ-MYAXWnqFs.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/geologica/v5/oY1o8evIr7j9P3TN9YwNAdyjzUyDKkKdAGOJh1UlCDUIhAIdhCZOn1fLsig7jfvCCPHZckU8H3G11_z-_OZqDx_rc-ISBQ.ttf" + }, + { + "family": "Georama", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5GvktmQsL5_tgbg.ttf", + "200": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5mvgtmQsL5_tgbg.ttf", + "300": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5RPgtmQsL5_tgbg.ttf", + "regular": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5GvgtmQsL5_tgbg.ttf", + "500": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5KPgtmQsL5_tgbg.ttf", + "600": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5xP8tmQsL5_tgbg.ttf", + "700": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5_f8tmQsL5_tgbg.ttf", + "800": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5mv8tmQsL5_tgbg.ttf", + "900": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5s_8tmQsL5_tgbg.ttf", + "100italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rvF2wEPxf5wbh3T.ttf", + "200italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rtF2gEPxf5wbh3T.ttf", + "300italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rub2gEPxf5wbh3T.ttf", + "italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rvF2gEPxf5wbh3T.ttf", + "500italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rv32gEPxf5wbh3T.ttf", + "600italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rsb3QEPxf5wbh3T.ttf", + "700italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rsi3QEPxf5wbh3T.ttf", + "800italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rtF3QEPxf5wbh3T.ttf", + "900italic": "https://fonts.gstatic.com/s/georama/v15/MCo_zAn438bIEyxFVaIC0ZMQ72G6xnvmodYVPOBB5nuzMdWs0rts3QEPxf5wbh3T.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/georama/v15/MCo5zAn438bIEyxFf6swMnNpvPcUwW4u4yRcDh-ZjxApn9K5GvgdmAEP.ttf" + }, + { + "family": "Geostar", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/geostar/v27/sykz-yx4n701VLOftSq9-trEvlQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/geostar/v27/sykz-yx4n701VLOfhSu3_g.ttf" + }, + { + "family": "Geostar Fill", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/geostarfill/v27/AMOWz4SWuWiXFfjEohxQ9os0U1K2w9lb4g.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/geostarfill/v27/AMOWz4SWuWiXFfjEohxQ9osEUliy.ttf" + }, + { + "family": "Germania One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/germaniaone/v21/Fh4yPjrqIyv2ucM2qzBjeS3ezAJONau6ew.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/germaniaone/v21/Fh4yPjrqIyv2ucM2qzBjeS3uzQhK.ttf" + }, + { + "family": "Gideon Roman", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/gideonroman/v13/e3tmeuGrVOys8sxzZgWlmXoge0PWovdU4w.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gideonroman/v13/e3tmeuGrVOys8sxzZgWlmXoQeknS.ttf" + }, + { + "family": "Gidole", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/gidole/v24/sZlFdR6O8zVVEiMaCJtWS6EPcA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gidole/v24/sZlFdR6O8zVVEiMqCZFS.ttf" + }, + { + "family": "Gidugu", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "telugu" + ], + "version": "v28", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/gidugu/v28/L0x8DFMkk1Uf6w3RvPCmRSlUig.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gidugu/v28/L0x8DFMkk1Uf6w3hvfqi.ttf" + }, + { + "family": "Gilda Display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/gildadisplay/v20/t5tmIRoYMoaYG0WEOh7HwMeR7TnFrpOHYh4.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gildadisplay/v20/t5tmIRoYMoaYG0WEOh7HwMeR3TjPqg.ttf" + }, + { + "family": "Girassol", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/girassol/v24/JTUUjIo_-DK48laaNC9Nz2pJzxbi.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/girassol/v24/JTUUjIo_-DK48laaNB9MxW4.ttf" + }, + { + "family": "Give You Glory", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/giveyouglory/v17/8QIQdiHOgt3vv4LR7ahjw9-XYc1zB4ZD6rwa.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/giveyouglory/v17/8QIQdiHOgt3vv4LR7ahjw9-XYf1yDYI.ttf" + }, + { + "family": "Glass Antiqua", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/glassantiqua/v26/xfu30Wr0Wn3NOQM2piC0uXOjnL_wN6fRUkY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/glassantiqua/v26/xfu30Wr0Wn3NOQM2piC0uXOjrL76Mw.ttf" + }, + { + "family": "Glegoo", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/glegoo/v17/_Xmt-HQyrTKWaw2Ji6mZAI91xw.ttf", + "700": "https://fonts.gstatic.com/s/glegoo/v17/_Xmu-HQyrTKWaw2xN4a9CKRpzimMsg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/glegoo/v17/_Xmt-HQyrTKWaw25iqOd.ttf" + }, + { + "family": "Gloock", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/gloock/v8/Iurb6YFw84WUY4N5jxylBrdRjQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gloock/v8/Iurb6YFw84WUY4NJjhah.ttf" + }, + { + "family": "Gloria Hallelujah", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/gloriahallelujah/v24/LYjYdHv3kUk9BMV96EIswT9DIbW-MLSy3TKEvkCF.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gloriahallelujah/v24/LYjYdHv3kUk9BMV96EIswT9DIbW-MISz1zY.ttf" + }, + { + "family": "Glory", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQwIiDpn-dDi9EOQ.ttf", + "200": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQQImDpn-dDi9EOQ.ttf", + "300": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQnomDpn-dDi9EOQ.ttf", + "regular": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQwImDpn-dDi9EOQ.ttf", + "500": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQ8omDpn-dDi9EOQ.ttf", + "600": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQHo6Dpn-dDi9EOQ.ttf", + "700": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQJ46Dpn-dDi9EOQ.ttf", + "800": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQQI6Dpn-dDi9EOQ.ttf", + "100italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMpr5HWZLCpUOaM6.ttf", + "200italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMrr5XWZLCpUOaM6.ttf", + "300italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMo15XWZLCpUOaM6.ttf", + "italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMpr5XWZLCpUOaM6.ttf", + "500italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMpZ5XWZLCpUOaM6.ttf", + "600italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMq14nWZLCpUOaM6.ttf", + "700italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMqM4nWZLCpUOaM6.ttf", + "800italic": "https://fonts.gstatic.com/s/glory/v18/q5uYsoi9Lf1w5vfNgCJg98TBOoNFCMrr4nWZLCpUOaM6.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/glory/v18/q5uasoi9Lf1w5t3Est24nq9blIRQwImzp3WZ.ttf" + }, + { + "family": "Gluten", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Vb7B1Luni7ciJh.ttf", + "200": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Xb7R1Luni7ciJh.ttf", + "300": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8UF7R1Luni7ciJh.ttf", + "regular": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Vb7R1Luni7ciJh.ttf", + "500": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Vp7R1Luni7ciJh.ttf", + "600": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8WF6h1Luni7ciJh.ttf", + "700": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8W86h1Luni7ciJh.ttf", + "800": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Xb6h1Luni7ciJh.ttf", + "900": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Xy6h1Luni7ciJh.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gluten/v18/Hhy_U5gk9fW7OUdVIPh2zD_RSqQJ__A15jgJsn-Bhb_yI8Vb7S1KsHw.ttf" + }, + { + "family": "Goblin One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v28", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/goblinone/v28/CSR64z1ZnOqZRjRCBVY_TOcATNt_pOU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/goblinone/v28/CSR64z1ZnOqZRjRCBVY_fOYKSA.ttf" + }, + { + "family": "Gochi Hand", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/gochihand/v25/hES06XlsOjtJsgCkx1PkTo71-n0nXWA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gochihand/v25/hES06XlsOjtJsgCkx1Pkfo___g.ttf" + }, + { + "family": "Goldman", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/goldman/v21/pe0uMIWbN4JFplR2LDJ4Bt-7G98.ttf", + "700": "https://fonts.gstatic.com/s/goldman/v21/pe0rMIWbN4JFplR2FI5XIteQB9Zra1U.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/goldman/v21/pe0uMIWbN4JFplR2HDNyAg.ttf" + }, + { + "family": "Golos Text", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plVRRQ5cEr8zXcyx.ttf", + "500": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plVjRQ5cEr8zXcyx.ttf", + "600": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plWPQg5cEr8zXcyx.ttf", + "700": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plW2Qg5cEr8zXcyx.ttf", + "800": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plXRQg5cEr8zXcyx.ttf", + "900": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plX4Qg5cEr8zXcyx.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/golostext/v7/q5uXsoe9Lv5t7Meb31EcOR9UdVTNs822plVRRT5dGLs.ttf" + }, + { + "family": "Google Sans Code", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "adlam", + "canadian-aboriginal", + "cherokee", + "latin", + "latin-ext", + "math", + "old-permic", + "symbols", + "symbols2", + "syriac", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXE_ggF--rWcgmBz.ttf", + "regular": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXFhggF--rWcgmBz.ttf", + "500": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXFTggF--rWcgmBz.ttf", + "600": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXG_hQF--rWcgmBz.ttf", + "700": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXGGhQF--rWcgmBz.ttf", + "800": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXHhhQF--rWcgmBz.ttf", + "300italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwbc98LG-h3BzvSU.ttf", + "italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwek98LG-h3BzvSU.ttf", + "500italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwds98LG-h3BzvSU.ttf", + "600italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwTc68LG-h3BzvSU.ttf", + "700italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwQ468LG-h3BzvSU.ttf", + "800italic": "https://fonts.gstatic.com/s/googlesanscode/v14/pxisyogzv91QhV44Z_GQBHsGf5PuWEt-oWZcdm_0jmSpwWk68LG-h3BzvSU.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/googlesanscode/v14/pxiSyogzv91QhV44Z_GQBHsGf5PuckJMXr41HfVaiXFhgjF_8LE.ttf" + }, + { + "family": "Google Sans Flex", + "variants": [ + "regular" + ], + "subsets": [ + "canadian-aboriginal", + "cherokee", + "latin", + "latin-ext", + "math", + "nushu", + "symbols", + "syriac", + "tifinagh", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-11-24", + "files": { + "regular": "https://fonts.gstatic.com/s/googlesansflex/v15/t5sJIQcYNIWbFgDgAAzZ34auoVyXkJCOvp3SFWJbN5hF8Ju1x6sKCyp0l9sI40swNJwInycYAJzz0m7kJ4qFQOJBOjLvDSndo0SKMpKSTzwliVdHAy4bxTDHg_ugnAakp8ubyctqU4LBMUM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/googlesansflex/v15/t5sJIQcYNIWbFgDgAAzZ34auoVyXkJCOvp3SFWJbN5hF8Ju1x6sKCyp0l9sI40swNJwInycYAJzz0m7kJ4qFQOJBOjLvDSndo0SKMpKSTzwliVdHAy4bxTDHg_ugnAakp8ub-cpgVw.ttf" + }, + { + "family": "Gorditas", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/gorditas/v24/ll8_K2aTVD26DsPEtQDoDa4AlxYb.ttf", + "700": "https://fonts.gstatic.com/s/gorditas/v24/ll84K2aTVD26DsPEtThUIooIvAoShA1i.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gorditas/v24/ll8_K2aTVD26DsPEtTDpB6o.ttf" + }, + { + "family": "Gothic A1", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "korean", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/gothica1/v18/CSR74z5ZnPydRjlCCwlCCMcqYtd2vfwk.ttf", + "200": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCpOYKSPl6tOU9Eg.ttf", + "300": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCwOUKSPl6tOU9Eg.ttf", + "regular": "https://fonts.gstatic.com/s/gothica1/v18/CSR94z5ZnPydRjlCCwl6bM0uQNJmvQ.ttf", + "500": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCmOQKSPl6tOU9Eg.ttf", + "600": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCtOMKSPl6tOU9Eg.ttf", + "700": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlC0OIKSPl6tOU9Eg.ttf", + "800": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlCzOEKSPl6tOU9Eg.ttf", + "900": "https://fonts.gstatic.com/s/gothica1/v18/CSR44z5ZnPydRjlCCwlC6OAKSPl6tOU9Eg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gothica1/v18/CSR94z5ZnPydRjlCCwlKbccq.ttf" + }, + { + "family": "Gotu", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/gotu/v18/o-0FIpksx3QOlH0Lioh6-hU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gotu/v18/o-0FIpksx3QOpHwBjg.ttf" + }, + { + "family": "Goudy Bookletter 1911", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/goudybookletter1911/v21/sykt-z54laciWfKv-kX8krex0jDiD2HbY6I5tRbXZ4IXAA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/goudybookletter1911/v21/sykt-z54laciWfKv-kX8krex0jDiD2HbY6IJtBzT.ttf" + }, + { + "family": "Gowun Batang", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "korean", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/gowunbatang/v12/ijwSs5nhRMIjYsdSgcMa3wRhXLH-yuAtLw.ttf", + "700": "https://fonts.gstatic.com/s/gowunbatang/v12/ijwNs5nhRMIjYsdSgcMa3wRZ4J7awssxJii23w.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gowunbatang/v12/ijwSs5nhRMIjYsdSgcMa3wRRXbv6.ttf" + }, + { + "family": "Gowun Dodum", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/gowundodum/v12/3Jn5SD_00GqwlBnWc1TUJF0FfORL0fNy.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gowundodum/v12/3Jn5SD_00GqwlBnWc1TUJG0EduA.ttf" + }, + { + "family": "Graduate", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/graduate/v19/C8cg4cs3o2n15t_2YxgR6X2NZAn2.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/graduate/v19/C8cg4cs3o2n15t_2YygQ43k.ttf" + }, + { + "family": "Grand Hotel", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/grandhotel/v21/7Au7p_IgjDKdCRWuR1azpmQNEl0O0kEx.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/grandhotel/v21/7Au7p_IgjDKdCRWuR1azplQMGFk.ttf" + }, + { + "family": "Grandiflora One", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/grandifloraone/v3/0ybmGD0g27bCk_5MGWZcKWhxwnUU_R3y8DOWGA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/grandifloraone/v3/0ybmGD0g27bCk_5MGWZcKWhxwnUk_Bf2.ttf" + }, + { + "family": "Grandstander", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD1-_D3jWttFGmQk.ttf", + "200": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD9--D3jWttFGmQk.ttf", + "300": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQDwG-D3jWttFGmQk.ttf", + "regular": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD1--D3jWttFGmQk.ttf", + "500": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD22-D3jWttFGmQk.ttf", + "600": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD4G5D3jWttFGmQk.ttf", + "700": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD7i5D3jWttFGmQk.ttf", + "800": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD9-5D3jWttFGmQk.ttf", + "900": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD_a5D3jWttFGmQk.ttf", + "100italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf95zrcsvNDiQlBYQ.ttf", + "200italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9ZzvcsvNDiQlBYQ.ttf", + "300italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9uTvcsvNDiQlBYQ.ttf", + "italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf95zvcsvNDiQlBYQ.ttf", + "500italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf91TvcsvNDiQlBYQ.ttf", + "600italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9OTzcsvNDiQlBYQ.ttf", + "700italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9ADzcsvNDiQlBYQ.ttf", + "800italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9ZzzcsvNDiQlBYQ.ttf", + "900italic": "https://fonts.gstatic.com/s/grandstander/v20/ga6ZawtA-GpSsTWrnNHPCSImbyq1fDGZrzwXGpf9TjzcsvNDiQlBYQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/grandstander/v20/ga6fawtA-GpSsTWrnNHPCSIMZhhKpFjyNZIQD1--P3ncsg.ttf" + }, + { + "family": "Grape Nuts", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/grapenuts/v7/syk2-yF4iLM2RfKj4F7k3tLvol2RN1E.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/grapenuts/v7/syk2-yF4iLM2RfKj4F7k7tPlpg.ttf" + }, + { + "family": "Gravitas One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/gravitasone/v21/5h1diZ4hJ3cblKy3LWakKQmaDWRNr3DzbQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gravitasone/v21/5h1diZ4hJ3cblKy3LWakKQmqDG5J.ttf" + }, + { + "family": "Great Vibes", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/greatvibes/v21/RWmMoKWR9v4ksMfaWd_JN-XCg6UKDXlq.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/greatvibes/v21/RWmMoKWR9v4ksMfaWd_JN9XDiaE.ttf" + }, + { + "family": "Grechen Fuemen", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/grechenfuemen/v11/vEFI2_tHEQ4d5ObgKxBzZh0MAWgc-NaXXq7H.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/grechenfuemen/v11/vEFI2_tHEQ4d5ObgKxBzZh0MAVgd8tI.ttf" + }, + { + "family": "Grenze", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/grenze/v16/O4ZRFGb7hR12BxqPm2IjuAkalnmd.ttf", + "100italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZXFGb7hR12BxqH_VpHsg04k2md0kI.ttf", + "200": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPN0MDkicWn2CEyw.ttf", + "200italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_Vrrky0SvWWUy1uW.ttf", + "300": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPU0ADkicWn2CEyw.ttf", + "300italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_VqPkC0SvWWUy1uW.ttf", + "regular": "https://fonts.gstatic.com/s/grenze/v16/O4ZTFGb7hR12Bxq3_2gnmgwKlg.ttf", + "italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZRFGb7hR12BxqH_WIjuAkalnmd.ttf", + "500": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPC0EDkicWn2CEyw.ttf", + "500italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_VrXkS0SvWWUy1uW.ttf", + "600": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPJ0YDkicWn2CEyw.ttf", + "600italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_Vr7li0SvWWUy1uW.ttf", + "700": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPQ0cDkicWn2CEyw.ttf", + "700italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_Vqfly0SvWWUy1uW.ttf", + "800": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPX0QDkicWn2CEyw.ttf", + "800italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_VqDlC0SvWWUy1uW.ttf", + "900": "https://fonts.gstatic.com/s/grenze/v16/O4ZQFGb7hR12BxqPe0UDkicWn2CEyw.ttf", + "900italic": "https://fonts.gstatic.com/s/grenze/v16/O4ZWFGb7hR12BxqH_VqnlS0SvWWUy1uW.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/grenze/v16/O4ZTFGb7hR12BxqH_mIj.ttf" + }, + { + "family": "Grenze Gotisch", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5Lz5UcICdYPSd_w.ttf", + "200": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5rz9UcICdYPSd_w.ttf", + "300": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5cT9UcICdYPSd_w.ttf", + "regular": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5Lz9UcICdYPSd_w.ttf", + "500": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5HT9UcICdYPSd_w.ttf", + "600": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i58ThUcICdYPSd_w.ttf", + "700": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5yDhUcICdYPSd_w.ttf", + "800": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5rzhUcICdYPSd_w.ttf", + "900": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5hjhUcICdYPSd_w.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/grenzegotisch/v20/Fh4hPjjqNDz1osh_jX9YfjudpBJBNV5y5wf_k1i5Lz9kcYqZ.ttf" + }, + { + "family": "Grey Qo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/greyqo/v11/BXRrvF_Nmv_TyXxNDOtQ9Wf0QcE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/greyqo/v11/BXRrvF_Nmv_TyXxNPOpa8Q.ttf" + }, + { + "family": "Griffy", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/griffy/v23/FwZa7-ox2FQh9kfwSNSEwM2zpA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/griffy/v23/FwZa7-ox2FQh9kfASd6A.ttf" + }, + { + "family": "Gruppo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/gruppo/v23/WwkfxPmzE06v_ZWFWXDAOIEQUQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gruppo/v23/WwkfxPmzE06v_ZW1WHrE.ttf" + }, + { + "family": "Gudea", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/gudea/v16/neIFzCqgsI0mp-CP9IGON7Ez.ttf", + "italic": "https://fonts.gstatic.com/s/gudea/v16/neILzCqgsI0mp9CN_oWsMqEzSJQ.ttf", + "700": "https://fonts.gstatic.com/s/gudea/v16/neIIzCqgsI0mp9gz26WGHK06UY30.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gudea/v16/neIFzCqgsI0mp9CO_oU.ttf" + }, + { + "family": "Gugi", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/gugi/v21/A2BVn5dXywshVA6A9DEfgqM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gugi/v21/A2BVn5dXywshZA-K8A.ttf" + }, + { + "family": "Gulzar", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/gulzar/v14/Wnz6HAc9eB3HB2ILYTwZqg_MPQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gulzar/v14/Wnz6HAc9eB3HB2I7YDYd.ttf" + }, + { + "family": "Gupter", + "variants": [ + "regular", + "500", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/gupter/v18/2-cm9JNmxJqPO1QUYZa_Wu_lpA.ttf", + "500": "https://fonts.gstatic.com/s/gupter/v18/2-cl9JNmxJqPO1Qslb-bUsT5rZhaZg.ttf", + "700": "https://fonts.gstatic.com/s/gupter/v18/2-cl9JNmxJqPO1Qs3bmbUsT5rZhaZg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gupter/v18/2-cm9JNmxJqPO1QkYJy7.ttf" + }, + { + "family": "Gurajada", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "telugu" + ], + "version": "v22", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/gurajada/v22/FwZY7-Qx308m-l-0Kd6A4sijpFu_.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gurajada/v22/FwZY7-Qx308m-l-0Ke6B6Mw.ttf" + }, + { + "family": "Gwendolyn", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/gwendolyn/v9/qkBXXvoO_M3CSss-d7ee5JRLkAXbMQ.ttf", + "700": "https://fonts.gstatic.com/s/gwendolyn/v9/qkBSXvoO_M3CSss-d7emWLtvmC7HONiSFQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/gwendolyn/v9/qkBXXvoO_M3CSss-d7eu5Z5P.ttf" + }, + { + "family": "Habibi", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/habibi/v22/CSR-4zFWkuqcTTNCShJeZOYySQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/habibi/v22/CSR-4zFWkuqcTTNySxha.ttf" + }, + { + "family": "Hachi Maru Pop", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/hachimarupop/v23/HI_TiYoRLqpLrEiMAuO9Ysfz7rW1EM_btd8u.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hachimarupop/v23/HI_TiYoRLqpLrEiMAuO9Ysfz7oW0Gss.ttf" + }, + { + "family": "Hahmlet", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "korean", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RhKOdjobsO-aVxn.ttf", + "200": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RjKONjobsO-aVxn.ttf", + "300": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RgUONjobsO-aVxn.ttf", + "regular": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RhKONjobsO-aVxn.ttf", + "500": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4Rh4ONjobsO-aVxn.ttf", + "600": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RiUP9jobsO-aVxn.ttf", + "700": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RitP9jobsO-aVxn.ttf", + "800": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RjKP9jobsO-aVxn.ttf", + "900": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RjjP9jobsO-aVxn.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hahmlet/v21/BngXUXpCQ3nKpIo0TfPyfCdXfaeU4RhKOOjpZMc.ttf" + }, + { + "family": "Halant", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/halant/v17/u-490qaujRI2Pbsvc_pCmwZqcwdRXg.ttf", + "regular": "https://fonts.gstatic.com/s/halant/v17/u-4-0qaujRI2PbsX39Jmky12eg.ttf", + "500": "https://fonts.gstatic.com/s/halant/v17/u-490qaujRI2PbsvK_tCmwZqcwdRXg.ttf", + "600": "https://fonts.gstatic.com/s/halant/v17/u-490qaujRI2PbsvB_xCmwZqcwdRXg.ttf", + "700": "https://fonts.gstatic.com/s/halant/v17/u-490qaujRI2PbsvY_1CmwZqcwdRXg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/halant/v17/u-4-0qaujRI2Pbsn3thi.ttf" + }, + { + "family": "Hammersmith One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/hammersmithone/v18/qWcyB624q4L_C4jGQ9IK0O_dFlnbshsks4MRXw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hammersmithone/v18/qWcyB624q4L_C4jGQ9IK0O_dFlnrsxEg.ttf" + }, + { + "family": "Hanalei", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/hanalei/v24/E21n_dD8iufIjBRHXzgmVydREus.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hanalei/v24/E21n_dD8iufIjBRHbzksUw.ttf" + }, + { + "family": "Hanalei Fill", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/hanaleifill/v23/fC1mPYtObGbfyQznIaQzPQiMVwLBplm9aw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hanaleifill/v23/fC1mPYtObGbfyQznIaQzPQi8VgjF.ttf" + }, + { + "family": "Handjet", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "armenian", + "cyrillic", + "cyrillic-ext", + "greek", + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHTmbUkUsEHFAH2A.ttf", + "200": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHbmaUkUsEHFAH2A.ttf", + "300": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHWeaUkUsEHFAH2A.ttf", + "regular": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHTmaUkUsEHFAH2A.ttf", + "500": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHQuaUkUsEHFAH2A.ttf", + "600": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHeedUkUsEHFAH2A.ttf", + "700": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHd6dUkUsEHFAH2A.ttf", + "800": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHbmdUkUsEHFAH2A.ttf", + "900": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHZCdUkUsEHFAH2A.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/handjet/v22/oY1n8eXHq7n1OnbQrOY_2FrEwYEMLlcdP1mCtZaLaTutCwcIhGZ0lGU0akFcO3XFHTmaYkQmFA.ttf" + }, + { + "family": "Handlee", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/handlee/v20/-F6xfjBsISg9aMakDmr6oilJ3ik.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/handlee/v20/-F6xfjBsISg9aMakPmvwpg.ttf" + }, + { + "family": "Hanken Grotesk", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_Ncs2da4fpNzXhRKA.ttf", + "200": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcM2Za4fpNzXhRKA.ttf", + "300": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_Nc7WZa4fpNzXhRKA.ttf", + "regular": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_Ncs2Za4fpNzXhRKA.ttf", + "500": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcgWZa4fpNzXhRKA.ttf", + "600": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcbWFa4fpNzXhRKA.ttf", + "700": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcVGFa4fpNzXhRKA.ttf", + "800": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcM2Fa4fpNzXhRKA.ttf", + "900": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_NcGmFa4fpNzXhRKA.ttf", + "100italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyWyo_BJ731BKMSK.ttf", + "200italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyUyovBJ731BKMSK.ttf", + "300italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyXsovBJ731BKMSK.ttf", + "italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyWyovBJ731BKMSK.ttf", + "500italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyWAovBJ731BKMSK.ttf", + "600italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyVspfBJ731BKMSK.ttf", + "700italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyVVpfBJ731BKMSK.ttf", + "800italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyUypfBJ731BKMSK.ttf", + "900italic": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVo2YZDLWuGJpnzaiwFXS9tYtpY_d6T_POl0fRJeyUbpfBJ731BKMSK.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hankengrotesk/v12/ieVq2YZDLWuGJpnzaiwFXS9tYvBRzyFLlZg_f_Ncs2Zq4PBJ.ttf" + }, + { + "family": "Hanuman", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v24", + "lastModified": "2025-06-12", + "files": { + "100": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0sd5hDsU9X6RPzQ.ttf", + "200": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0ud5xDsU9X6RPzQ.ttf", + "300": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0tD5xDsU9X6RPzQ.ttf", + "regular": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0sd5xDsU9X6RPzQ.ttf", + "500": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0sv5xDsU9X6RPzQ.ttf", + "600": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0vD4BDsU9X6RPzQ.ttf", + "700": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0v64BDsU9X6RPzQ.ttf", + "800": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0ud4BDsU9X6RPzQ.ttf", + "900": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0u04BDsU9X6RPzQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hanuman/v24/VuJudNvD15HhpJJBYq31yFn72hxIv0sd5yDtWdE.ttf" + }, + { + "family": "Happy Monkey", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/happymonkey/v15/K2F2fZZcl-9SXwl5F_C4R_OABwD2bWqVjw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/happymonkey/v15/K2F2fZZcl-9SXwl5F_C4R_OwBgry.ttf" + }, + { + "family": "Harmattan", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/harmattan/v24/goksH6L2DkFvVvRp9XpTS0CjkP1Yog.ttf", + "500": "https://fonts.gstatic.com/s/harmattan/v24/gokpH6L2DkFvVvRp9Xprv2mHmNZEq6TTFw.ttf", + "600": "https://fonts.gstatic.com/s/harmattan/v24/gokpH6L2DkFvVvRp9Xprk26HmNZEq6TTFw.ttf", + "700": "https://fonts.gstatic.com/s/harmattan/v24/gokpH6L2DkFvVvRp9Xpr92-HmNZEq6TTFw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/harmattan/v24/goksH6L2DkFvVvRp9XpjSkqn.ttf" + }, + { + "family": "Headland One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/headlandone/v17/yYLu0hHR2vKnp89Tk1TCq3Tx0PlTeZ3mJA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/headlandone/v17/yYLu0hHR2vKnp89Tk1TCq3TB0fNX.ttf" + }, + { + "family": "Hedvig Letters Sans", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/hedvigletterssans/v2/CHy_V_PfGVjobSBkihHWDT98RVp37w8jQJ1N3Twgi1w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hedvigletterssans/v2/CHy_V_PfGVjobSBkihHWDT98RVp37w8jcJxH2Q.ttf" + }, + { + "family": "Hedvig Letters Serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v4", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/hedviglettersserif/v4/OD5puN2I2mekHmyoU1Kj2AXOd5_7v7gIDlX8quj7viQ_N1HixEAZf7fcvSGpZg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hedviglettersserif/v4/OD5puN2I2mekHmyoU1Kj2AXOd5_7v7gIDlX8quj7viQ_N1HixEApfr3Y.ttf" + }, + { + "family": "Heebo", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v28", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EiS2cckOnz02SXQ.ttf", + "200": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1ECSycckOnz02SXQ.ttf", + "300": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1E1yycckOnz02SXQ.ttf", + "regular": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EiSycckOnz02SXQ.ttf", + "500": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EuyycckOnz02SXQ.ttf", + "600": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EVyucckOnz02SXQ.ttf", + "700": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EbiucckOnz02SXQ.ttf", + "800": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1ECSucckOnz02SXQ.ttf", + "900": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EICucckOnz02SXQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/heebo/v28/NGSpv5_NC0k9P_v6ZUCbLRAHxK1EiSysc0mj.ttf" + }, + { + "family": "Henny Penny", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/hennypenny/v18/wXKvE3UZookzsxz_kjGSfMQqt3M7tMDT.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hennypenny/v18/wXKvE3UZookzsxz_kjGSfPQrvXc.ttf" + }, + { + "family": "Hepta Slab", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvkV5jfbY5B0NBkz.ttf", + "200": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvmV5zfbY5B0NBkz.ttf", + "300": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvlL5zfbY5B0NBkz.ttf", + "regular": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvkV5zfbY5B0NBkz.ttf", + "500": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5Hvkn5zfbY5B0NBkz.ttf", + "600": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvnL4DfbY5B0NBkz.ttf", + "700": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5Hvny4DfbY5B0NBkz.ttf", + "800": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvmV4DfbY5B0NBkz.ttf", + "900": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5Hvm84DfbY5B0NBkz.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/heptaslab/v25/ea8JadoyU_jkHdalebHvyWVNdYoIsHe5HvkV5wfaaZQ.ttf" + }, + { + "family": "Herr Von Muellerhoff", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/herrvonmuellerhoff/v23/WBL6rFjRZkREW8WqmCWYLgCkQKXb4CAft3c6_qJY3QPQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/herrvonmuellerhoff/v23/WBL6rFjRZkREW8WqmCWYLgCkQKXb4CAft0c79KY.ttf" + }, + { + "family": "Hi Melody", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/himelody/v19/46ktlbP8Vnz0pJcqCTbEf29E31BBGA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/himelody/v19/46ktlbP8Vnz0pJcqCTb0fmVA.ttf" + }, + { + "family": "Hina Mincho", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/hinamincho/v16/2sDaZGBRhpXa2Jjz5w5LAGW8KbkVZTHR.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hinamincho/v16/2sDaZGBRhpXa2Jjz5w5LAFW9I70.ttf" + }, + { + "family": "Hind", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/hind/v18/5aU19_a8oxmIfMJaIRuYjDpf5Vw.ttf", + "regular": "https://fonts.gstatic.com/s/hind/v18/5aU69_a8oxmIRG5yBROzkDM.ttf", + "500": "https://fonts.gstatic.com/s/hind/v18/5aU19_a8oxmIfJpbIRuYjDpf5Vw.ttf", + "600": "https://fonts.gstatic.com/s/hind/v18/5aU19_a8oxmIfLZcIRuYjDpf5Vw.ttf", + "700": "https://fonts.gstatic.com/s/hind/v18/5aU19_a8oxmIfNJdIRuYjDpf5Vw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hind/v18/5aU69_a8oxmIdG94AQ.ttf" + }, + { + "family": "Hind Guntur", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "telugu" + ], + "version": "v14", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/hindguntur/v14/wXKyE3UZrok56nvamSuJd_yGn1czn9zaj5Ju.ttf", + "regular": "https://fonts.gstatic.com/s/hindguntur/v14/wXKvE3UZrok56nvamSuJd8Qqt3M7tMDT.ttf", + "500": "https://fonts.gstatic.com/s/hindguntur/v14/wXKyE3UZrok56nvamSuJd_zenlczn9zaj5Ju.ttf", + "600": "https://fonts.gstatic.com/s/hindguntur/v14/wXKyE3UZrok56nvamSuJd_zymVczn9zaj5Ju.ttf", + "700": "https://fonts.gstatic.com/s/hindguntur/v14/wXKyE3UZrok56nvamSuJd_yWmFczn9zaj5Ju.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hindguntur/v14/wXKvE3UZrok56nvamSuJd_QrvXc.ttf" + }, + { + "family": "Hind Madurai", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil" + ], + "version": "v13", + "lastModified": "2025-09-02", + "files": { + "300": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xu0e2p98ZvDXdZQIOcpqjfXaUnecsoMJ0b_g.ttf", + "regular": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xx0e2p98ZvDXdZQIOcpqjn8Y0DceA0OQ.ttf", + "500": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xu0e2p98ZvDXdZQIOcpqjfBaQnecsoMJ0b_g.ttf", + "600": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xu0e2p98ZvDXdZQIOcpqjfKaMnecsoMJ0b_g.ttf", + "700": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xu0e2p98ZvDXdZQIOcpqjfTaInecsoMJ0b_g.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hindmadurai/v13/f0Xx0e2p98ZvDXdZQIOcpqjX8IcH.ttf" + }, + { + "family": "Hind Mysuru", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "300": "https://fonts.gstatic.com/s/hindmysuru/v1/sykq-yB3k7wiAJ-U5l_li8pppHWQBVTqU4sY.ttf", + "regular": "https://fonts.gstatic.com/s/hindmysuru/v1/syk3-yB3k7wiAJ-U5l_li_LFjFGYLkjj.ttf", + "500": "https://fonts.gstatic.com/s/hindmysuru/v1/sykq-yB3k7wiAJ-U5l_li8oxpXWQBVTqU4sY.ttf", + "600": "https://fonts.gstatic.com/s/hindmysuru/v1/sykq-yB3k7wiAJ-U5l_li8odonWQBVTqU4sY.ttf", + "700": "https://fonts.gstatic.com/s/hindmysuru/v1/sykq-yB3k7wiAJ-U5l_li8p5o3WQBVTqU4sY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hindmysuru/v1/syk3-yB3k7wiAJ-U5l_li8LEhlU.ttf" + }, + { + "family": "Hind Siliguri", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "bengali", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwOs5juQtsyLLR5jN4cxBEoRDf44uEfKiGvxts.ttf", + "regular": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwTs5juQtsyLLR5jN4cxBEofJvQxuk0Nig.ttf", + "500": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwOs5juQtsyLLR5jN4cxBEoRG_54uEfKiGvxts.ttf", + "600": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwOs5juQtsyLLR5jN4cxBEoREP-4uEfKiGvxts.ttf", + "700": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwOs5juQtsyLLR5jN4cxBEoRCf_4uEfKiGvxts.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hindsiliguri/v14/ijwTs5juQtsyLLR5jN4cxBEoTJrawg.ttf" + }, + { + "family": "Hind Vadodara", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/hindvadodara/v16/neIQzCKvrIcn5pbuuuriV9tTSDn3iXM0oSOL2Yw.ttf", + "regular": "https://fonts.gstatic.com/s/hindvadodara/v16/neINzCKvrIcn5pbuuuriV9tTcJXfrXsfvSo.ttf", + "500": "https://fonts.gstatic.com/s/hindvadodara/v16/neIQzCKvrIcn5pbuuuriV9tTSGH2iXM0oSOL2Yw.ttf", + "600": "https://fonts.gstatic.com/s/hindvadodara/v16/neIQzCKvrIcn5pbuuuriV9tTSE3xiXM0oSOL2Yw.ttf", + "700": "https://fonts.gstatic.com/s/hindvadodara/v16/neIQzCKvrIcn5pbuuuriV9tTSCnwiXM0oSOL2Yw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hindvadodara/v16/neINzCKvrIcn5pbuuuriV9tTQJTVqQ.ttf" + }, + { + "family": "Holtwood One SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/holtwoodonesc/v23/yYLx0hLR0P-3vMFSk1TCq3Txg5B3cbb6LZttyg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/holtwoodonesc/v23/yYLx0hLR0P-3vMFSk1TCq3Txg5BHcLz-.ttf" + }, + { + "family": "Homemade Apple", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/homemadeapple/v24/Qw3EZQFXECDrI2q789EKQZJob3x9Vnksi4M7.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/homemadeapple/v24/Qw3EZQFXECDrI2q789EKQZJob0x8XH0.ttf" + }, + { + "family": "Homenaje", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/homenaje/v17/FwZY7-Q-xVAi_l-6Ld6A4sijpFu_.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/homenaje/v17/FwZY7-Q-xVAi_l-6Le6B6Mw.ttf" + }, + { + "family": "Honk", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/honk/v6/m8J7jftUea-XwTaemClumrBQbmvynOmXBji9zFhHRr8WFgVLo7tNepQKvg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/honk/v6/m8J7jftUea-XwTaemClumrBQbmvynOmXBji9zFhHRr8WFgV7orFJ.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Host Grotesk", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PubnOzhap-j94InI.ttf", + "regular": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuefOzhap-j94InI.ttf", + "500": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PudXOzhap-j94InI.ttf", + "600": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuTnJzhap-j94InI.ttf", + "700": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuQDJzhap-j94InI.ttf", + "800": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuWfJzhap-j94InI.ttf", + "300italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NeFWj_h19MnL2jg.ttf", + "italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NJlWj_h19MnL2jg.ttf", + "500italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NFFWj_h19MnL2jg.ttf", + "600italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-N-FKj_h19MnL2jg.ttf", + "700italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NwVKj_h19MnL2jg.ttf", + "800italic": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3SmWBnlCJ3U42vbbfdwMjZoULo4bgYM-BIrC-NplKj_h19MnL2jg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hostgrotesk/v5/co3UmWBnlCJ3U42vbbfdwMjzqHAXOdFzqU5PuefO_hej_g.ttf" + }, + { + "family": "Hubballi", + "variants": [ + "regular" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext" + ], + "version": "v10", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/hubballi/v10/o-0JIpUj3WIZ1RFN56B7yBBNYuSF.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hubballi/v10/o-0JIpUj3WIZ1RFN55B6whQ.ttf" + }, + { + "family": "Hubot Sans", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCZ7ZdgLDVwVqcXQ.ttf", + "300": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCubZdgLDVwVqcXQ.ttf", + "regular": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsC57ZdgLDVwVqcXQ.ttf", + "500": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsC1bZdgLDVwVqcXQ.ttf", + "600": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCObFdgLDVwVqcXQ.ttf", + "700": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCALFdgLDVwVqcXQ.ttf", + "800": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCZ7FdgLDVwVqcXQ.ttf", + "900": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsCTrFdgLDVwVqcXQ.ttf", + "200italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_U1w7rR41-MXUss.ttf", + "300italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_Xrw7rR41-MXUss.ttf", + "italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_W1w7rR41-MXUss.ttf", + "500italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_WHw7rR41-MXUss.ttf", + "600italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_VrxLrR41-MXUss.ttf", + "700italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_VSxLrR41-MXUss.ttf", + "800italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_U1xLrR41-MXUss.ttf", + "900italic": "https://fonts.gstatic.com/s/hubotsans/v5/pe0PMIiULYxOvxVLbVwhEtWACNaCm8WTUIR_y2-e41Q0S0srIrwXL_UcxLrR41-MXUss.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hubotsans/v5/pe0BMIiULYxOvxVLbVwhONyy6zb7yFM9V5G3iZ3X0avsIiCxjLsC57ZtgbrR.ttf" + }, + { + "family": "Huninn", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-06-12", + "files": { + "regular": "https://fonts.gstatic.com/s/huninn/v2/OpNNnoINg9bQ4xkpjiHQjittXw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/huninn/v2/OpNNnoINg9bQ4xkZjyvU.ttf" + }, + { + "family": "Hurricane", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/hurricane/v9/pe0sMIuULZxTolZ5YldyAv2-C99ycg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/hurricane/v9/pe0sMIuULZxTolZ5YldCA_e6.ttf" + }, + { + "family": "IBM Plex Mono", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6pfjptAgt5VM-kVkqdyU8n3kwq0n1hj-sNFQ.ttf", + "100italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6rfjptAgt5VM-kVkqdyU8n1ioStndlre4dFcFh.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3uAL8ldPg-IUDNg.ttf", + "200italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSGlZFh8ARHNh4zg.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3oQI8ldPg-IUDNg.ttf", + "300italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSflVFh8ARHNh4zg.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n5igg1l9kn-s.ttf", + "italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6pfjptAgt5VM-kVkqdyU8n1ioq0n1hj-sNFQ.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJ8ldPg-IUDNg.ttf", + "500italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSJlRFh8ARHNh4zg.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAO8ldPg-IUDNg.ttf", + "600italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSClNFh8ARHNh4zg.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3pQP8ldPg-IUDNg.ttf", + "700italic": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F6sfjptAgt5VM-kVkqdyU8n1ioSblJFh8ARHNh4zg.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1ikq0g.ttf" + }, + { + "family": "IBM Plex Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSD6lhzAKI5loa26g.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSDallzAKI5loa26g.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSDtFlzAKI5loa26g.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSD6llzAKI5loa26g.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSD2FlzAKI5loa26g.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSDNF5zAKI5loa26g.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSDDV5zAKI5loa26g.ttf", + "100italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhqbQqg9tIOm6vje.ttf", + "200italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhobQ6g9tIOm6vje.ttf", + "300italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhrFQ6g9tIOm6vje.ttf", + "italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhqbQ6g9tIOm6vje.ttf", + "500italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhqpQ6g9tIOm6vje.ttf", + "600italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhpFRKg9tIOm6vje.ttf", + "700italic": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXEKVElMYYaJe8bpLHnCwDKhdTEG46kmUZQCX598fQbM4jw8V78x9OWIhp8RKg9tIOm6vje.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexsans/v23/zYXGKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1swZSAXcomDVmadSD6llDAag9.ttf" + }, + { + "family": "IBM Plex Sans Arabic", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe3PC5eMlAMg0.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_dCTVsVJKxTs.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_tCTVsVJKxTs.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6bs61vSbfdlA.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_9CTVsVJKxTs.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-NCTVsVJKxTs.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-dCTVsVJKxTs.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexsansarabic/v14/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys73PA.ttf" + }, + { + "family": "IBM Plex Sans Condensed", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8nN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY7KyKvBgYsMDhM.ttf", + "100italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8hN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8M_LhakJHhOgBg.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY5m6Yvrr4cFFwq5.ttf", + "200italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8GPqpYMnEhq5H1w.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY4C6ovrr4cFFwq5.ttf", + "300italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8AfppYMnEhq5H1w.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8lN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHbauwq_jhJsM.ttf", + "italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8nN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYasyKvBgYsMDhM.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY5a64vrr4cFFwq5.ttf", + "500italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8F_opYMnEhq5H1w.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY527Ivrr4cFFwq5.ttf", + "600italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8HPvpYMnEhq5H1w.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8gN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHY4S7Yvrr4cFFwq5.ttf", + "700italic": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8iN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYas8BfupYMnEhq5H1w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexsanscondensed/v15/Gg8lN4UfRSqiPg7Jn2ZI12V4DCEwkj1E4LVeHYavyKs.ttf" + }, + { + "family": "IBM Plex Sans Devanagari", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic-ext", + "devanagari", + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXB3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_HMUjwUcjwCEQq.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_HnWnQe-b8AV0z0w.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_H-WrQe-b8AV0z0w.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXH3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O__VUL0c83gCA.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_HoWvQe-b8AV0z0w.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_HjWzQe-b8AV0z0w.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXA3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_H6W3Qe-b8AV0z0w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexsansdevanagari/v12/XRXH3JCMvG4IDoS9SubXB6W-UX5iehIMBFR2-O_PVEjw.ttf" + }, + { + "family": "IBM Plex Sans Hebrew", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa4qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEXB-l0VqDaM7C4.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEVt230_hjqF9Tc2.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEUJ2H0_hjqF9Tc2.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa2qYENg9Kw1mpLpO0bGM5lfHAAZHhDXH2l8Fk3rSaM.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEVR2X0_hjqF9Tc2.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEV93n0_hjqF9Tc2.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa5qYENg9Kw1mpLpO0bGM5lfHAAZHhDXEUZ330_hjqF9Tc2.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexsanshebrew/v12/BCa2qYENg9Kw1mpLpO0bGM5lfHAAZHhDXE2k-l0.ttf" + }, + { + "family": "IBM Plex Sans JP", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XLDn9KbTDf6_f7dISNqYf_tvPT7E7yjPB7twdmHQ.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7OLTrNpVuw5_BAM.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7IbQrNpVuw5_BAM.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XNDn9KbTDf6_f7dISNqYf_tvPT1Cr4iNJ-pwc.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7N7RrNpVuw5_BAM.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7PLWrNpVuw5_BAM.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XKDn9KbTDf6_f7dISNqYf_tvPT7JbXrNpVuw5_BAM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexsansjp/v7/Z9XNDn9KbTDf6_f7dISNqYf_tvPT5CvyjA.ttf" + }, + { + "family": "IBM Plex Sans KR", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "korean", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFM2-VJISZe3O_rc3ZVYh4aTwNOyra_X5zCpMrMfA.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOyhqef7bsqMPVZb4.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOyn6df7bsqMPVZb4.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFK2-VJISZe3O_rc3ZVYh4aTwNO8tK1W77HtMo.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOyiacf7bsqMPVZb4.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOygqbf7bsqMPVZb4.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFN2-VJISZe3O_rc3ZVYh4aTwNOym6af7bsqMPVZb4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexsanskr/v11/vEFK2-VJISZe3O_rc3ZVYh4aTwNOwtO_Xw.ttf" + }, + { + "family": "IBM Plex Sans Thai", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "thai" + ], + "version": "v11", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JNje1VVIzcq1HzJq2AEdo2Tj_qvLqEatYlR8ZKUqcX.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqExvcFbehGW74OXw.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqEovQFbehGW74OXw.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JPje1VVIzcq1HzJq2AEdo2Tj_qvLq8DtwhZcNaUg.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqE-vUFbehGW74OXw.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqE1vIFbehGW74OXw.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JMje1VVIzcq1HzJq2AEdo2Tj_qvLqEsvMFbehGW74OXw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexsansthai/v11/m8JPje1VVIzcq1HzJq2AEdo2Tj_qvLqMD9Yl.ttf" + }, + { + "family": "IBM Plex Sans Thai Looped", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "thai" + ], + "version": "v12", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss5AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_HaKpHOtFCQ76Q.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_NqrhFmDGC0i8Cc.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_L6ohFmDGC0i8Cc.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss_AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30LxBKAoFGoBCQ.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_OaphFmDGC0i8Cc.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_MquhFmDGC0i8Cc.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss6AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L_K6vhFmDGC0i8Cc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexsansthailooped/v12/tss_AoJJRAhL3BTrK3r2xxbFhvKfyBB6l7hHT30L9BOKpA.ttf" + }, + { + "family": "IBM Plex Serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizBREVNn1dOx-zrZ2X3pZvkTi182zIZj1bIkNo.ttf", + "100italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizHREVNn1dOx-zrZ2X3pZvkTiUa41YTi3TNgNq55w.ttf", + "200": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi3Q-hIzoVrBicOg.ttf", + "200italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa4_oyq17jjNOg_oc.ttf", + "300": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi20-RIzoVrBicOg.ttf", + "300italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa454xq17jjNOg_oc.ttf", + "regular": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizDREVNn1dOx-zrZ2X3pZvkThUY0TY7ikbI.ttf", + "italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizBREVNn1dOx-zrZ2X3pZvkTiUa2zIZj1bIkNo.ttf", + "500": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi3s-BIzoVrBicOg.ttf", + "500italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa48Ywq17jjNOg_oc.ttf", + "600": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi3A_xIzoVrBicOg.ttf", + "600italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa4-o3q17jjNOg_oc.ttf", + "700": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizAREVNn1dOx-zrZ2X3pZvkTi2k_hIzoVrBicOg.ttf", + "700italic": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizGREVNn1dOx-zrZ2X3pZvkTiUa4442q17jjNOg_oc.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibmplexserif/v20/jizDREVNn1dOx-zrZ2X3pZvkTiUZ2zI.ttf" + }, + { + "family": "IM Fell DW Pica", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/imfelldwpica/v16/2sDGZGRQotv9nbn2qSl0TxXVYNw9ZAPUvi88MQ.ttf", + "italic": "https://fonts.gstatic.com/s/imfelldwpica/v16/2sDEZGRQotv9nbn2qSl0TxXVYNwNZgnQnCosMXm0.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfelldwpica/v16/2sDGZGRQotv9nbn2qSl0TxXVYNwNZQnQ.ttf" + }, + { + "family": "IM Fell DW Pica SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/imfelldwpicasc/v21/0ybjGCAu5PfqkvtGVU15aBhXz3EUrnTW-BiKEUiBGA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfelldwpicasc/v21/0ybjGCAu5PfqkvtGVU15aBhXz3EUrnTm-RKO.ttf" + }, + { + "family": "IM Fell Double Pica", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v14", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/imfelldoublepica/v14/3XF2EqMq_94s9PeKF7Fg4gOKINyMtZ8rT0S1UL5Ayp0.ttf", + "italic": "https://fonts.gstatic.com/s/imfelldoublepica/v14/3XF0EqMq_94s9PeKF7Fg4gOKINyMtZ8rf0a_VJxF2p2G8g.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfelldoublepica/v14/3XF2EqMq_94s9PeKF7Fg4gOKINyMtZ8rf0W_VA.ttf" + }, + { + "family": "IM Fell Double Pica SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/imfelldoublepicasc/v21/neIazDmuiMkFo6zj_sHpQ8teNbWlwBB_hXjJ4Y0Eeru2dGg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfelldoublepicasc/v21/neIazDmuiMkFo6zj_sHpQ8teNbWlwBB_hXjJ0YwOfg.ttf" + }, + { + "family": "IM Fell English", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v14", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/imfellenglish/v14/Ktk1ALSLW8zDe0rthJysWrnLsAz3F6mZVY9Y5w.ttf", + "italic": "https://fonts.gstatic.com/s/imfellenglish/v14/Ktk3ALSLW8zDe0rthJysWrnLsAzHFaOdd4pI59zg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfellenglish/v14/Ktk1ALSLW8zDe0rthJysWrnLsAzHFqOd.ttf" + }, + { + "family": "IM Fell English SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/imfellenglishsc/v16/a8IENpD3CDX-4zrWfr1VY879qFF05pZLO4gOg0shzA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfellenglishsc/v16/a8IENpD3CDX-4zrWfr1VY879qFF05pZ7OoIK.ttf" + }, + { + "family": "IM Fell French Canon", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/imfellfrenchcanon/v21/-F6ufiNtDWYfYc-tDiyiw08rrghJszkK6coVPt1ozoPz.ttf", + "italic": "https://fonts.gstatic.com/s/imfellfrenchcanon/v21/-F6gfiNtDWYfYc-tDiyiw08rrghJszkK6foXNNlKy5PzzrU.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfellfrenchcanon/v21/-F6ufiNtDWYfYc-tDiyiw08rrghJszkK6foUNNk.ttf" + }, + { + "family": "IM Fell French Canon SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/imfellfrenchcanonsc/v23/FBVmdCru5-ifcor2bgq9V89khWcmQghEURY7H3c0UBCVIVqH.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfellfrenchcanonsc/v23/FBVmdCru5-ifcor2bgq9V89khWcmQghEURY7H0c1WhQ.ttf" + }, + { + "family": "IM Fell Great Primer", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/imfellgreatprimer/v21/bx6aNwSJtayYxOkbYFsT6hMsLzX7u85rJorXvDo3SQY1.ttf", + "italic": "https://fonts.gstatic.com/s/imfellgreatprimer/v21/bx6UNwSJtayYxOkbYFsT6hMsLzX7u85rJrrVtj4VTBY1N6U.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfellgreatprimer/v21/bx6aNwSJtayYxOkbYFsT6hMsLzX7u85rJrrWtj4.ttf" + }, + { + "family": "IM Fell Great Primer SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/imfellgreatprimersc/v21/ga6daxBOxyt6sCqz3fjZCTFCTUDMHagsQKdDTLf9BXz0s8FG.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imfellgreatprimersc/v21/ga6daxBOxyt6sCqz3fjZCTFCTUDMHagsQKdDTIf8D3g.ttf" + }, + { + "family": "Iansui", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-traditional", + "latin", + "latin-ext", + "symbols2" + ], + "version": "v7", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/iansui/v7/w8gbH2UoTuUp5bOajSGD1FcXoQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/iansui/v7/w8gbH2UoTuUp5bOqjCuH.ttf" + }, + { + "family": "Ibarra Real Nova", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXdg5MDtVT9TWIvS.ttf", + "500": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXdS5MDtVT9TWIvS.ttf", + "600": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXe-48DtVT9TWIvS.ttf", + "700": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXeH48DtVT9TWIvS.ttf", + "italic": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlsdQiA-DBIDCcaWtQzL4BZHoiDkH5CH9yb5n3ZFmKopyiuXztxXZvSkTo.ttf", + "500italic": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlsdQiA-DBIDCcaWtQzL4BZHoiDkH5CH9yb5n3ZFmKopxquXztxXZvSkTo.ttf", + "600italic": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlsdQiA-DBIDCcaWtQzL4BZHoiDkH5CH9yb5n3ZFmKop_apXztxXZvSkTo.ttf", + "700italic": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlsdQiA-DBIDCcaWtQzL4BZHoiDkH5CH9yb5n3ZFmKop8-pXztxXZvSkTo.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ibarrarealnova/v30/sZlSdQiA-DBIDCcaWtQzL4BZHoiDundw4ATyjed3EXdg5PDsXzs.ttf" + }, + { + "family": "Iceberg", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/iceberg/v26/8QIJdijAiM7o-qnZuIgOq7jkAOw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/iceberg/v26/8QIJdijAiM7o-qnZiIkErw.ttf" + }, + { + "family": "Iceland", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/iceland/v22/rax9HiuFsdMNOnWPWKxGADBbg0s.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/iceland/v22/rax9HiuFsdMNOnWPaK1MBA.ttf" + }, + { + "family": "Imbue", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP8iWfOsNNK-Q4xY.ttf", + "200": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP0iXfOsNNK-Q4xY.ttf", + "300": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP5aXfOsNNK-Q4xY.ttf", + "regular": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP8iXfOsNNK-Q4xY.ttf", + "500": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP_qXfOsNNK-Q4xY.ttf", + "600": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoPxaQfOsNNK-Q4xY.ttf", + "700": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoPy-QfOsNNK-Q4xY.ttf", + "800": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP0iQfOsNNK-Q4xY.ttf", + "900": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP2GQfOsNNK-Q4xY.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imbue/v29/RLpXK5P16Ki3fXhj5cvGrqjocPk4n-gVX3M93TnrnvhoP8iXTOoHMA.ttf" + }, + { + "family": "Imperial Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/imperialscript/v8/5DCPAKrpzy_H98IV2ISnZBbGrVNvPenlvttWNg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imperialscript/v8/5DCPAKrpzy_H98IV2ISnZBbGrVNfPOPh.ttf" + }, + { + "family": "Imprima", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/imprima/v19/VEMxRoN7sY3yuy-7-oWHyDzktPo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/imprima/v19/VEMxRoN7sY3yuy-7yoSNzA.ttf" + }, + { + "family": "Inclusive Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfLhtN7mxtc0bIsQ.ttf", + "regular": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfcBtN7mxtc0bIsQ.ttf", + "500": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfQhtN7mxtc0bIsQ.ttf", + "600": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfrhxN7mxtc0bIsQ.ttf", + "700": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtflxxN7mxtc0bIsQ.ttf", + "300italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFj7rWZpUUPYsTVx.ttf", + "italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFilrWZpUUPYsTVx.ttf", + "500italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFiXrWZpUUPYsTVx.ttf", + "600italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFh7qmZpUUPYsTVx.ttf", + "700italic": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk-C9biPuwflXcJ46P4PGWE0-73swm22da-7KxKuFhCqmZpUUPYsTVx.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/inclusivesans/v4/0nk8C9biPuwflXcJ46P4PGWE08T-gfZusL0kQqtfcBt972Zp.ttf" + }, + { + "family": "Inconsolata", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v37", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7LppwU8aRr8lleY2co.ttf", + "300": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp9s8aRr8lleY2co.ttf", + "regular": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8aRr8lleY2co.ttf", + "500": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp7c8aRr8lleY2co.ttf", + "600": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp1s7aRr8lleY2co.ttf", + "700": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp2I7aRr8lleY2co.ttf", + "800": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7LppwU7aRr8lleY2co.ttf", + "900": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lppyw7aRr8lleY2co.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/inconsolata/v37/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRv2kg.ttf" + }, + { + "family": "Inder", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/inder/v15/w8gUH2YoQe8_4vq6pw-P3U4O.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/inder/v15/w8gUH2YoQe8_4sq7rQs.ttf" + }, + { + "family": "Indie Flower", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/indieflower/v24/m8JVjfNVeKWVnh3QMuKkFcZlbkGG1dKEDw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/indieflower/v24/m8JVjfNVeKWVnh3QMuKkFcZVb0uC.ttf" + }, + { + "family": "Ingrid Darling", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/ingriddarling/v7/LDIrapaJNxUtSuFdw-9yf4rCPsLOub458jGL.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ingriddarling/v7/LDIrapaJNxUtSuFdw-9yf4rCPvLPs7o.ttf" + }, + { + "family": "Inika", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/inika/v22/rnCm-x5X3QP-phTHRcc2s2XH.ttf", + "700": "https://fonts.gstatic.com/s/inika/v22/rnCr-x5X3QP-pix7auM-mHnOSOuk.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/inika/v22/rnCm-x5X3QP-piTGT8M.ttf" + }, + { + "family": "Inknut Antiqua", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU2vwrj5bBoIYJNf.ttf", + "regular": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GSYax7VC4ot_qNB4nYpBdaKXUD6pzxRwYB.ttf", + "500": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU33w7j5bBoIYJNf.ttf", + "600": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU3bxLj5bBoIYJNf.ttf", + "700": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU2_xbj5bBoIYJNf.ttf", + "800": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU2jxrj5bBoIYJNf.ttf", + "900": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GRYax7VC4ot_qNB4nYpBdaKU2Hx7j5bBoIYJNf.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/inknutantiqua/v16/Y4GSYax7VC4ot_qNB4nYpBdaKUUC4Jg.ttf" + }, + { + "family": "Inria Sans", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/inriasans/v15/ptRPTiqXYfZMCOiVj9kQ3ELaDQtFqeY3fX4.ttf", + "300italic": "https://fonts.gstatic.com/s/inriasans/v15/ptRRTiqXYfZMCOiVj9kQ1OzAgQlPrcQybX4pQA.ttf", + "regular": "https://fonts.gstatic.com/s/inriasans/v15/ptRMTiqXYfZMCOiVj9kQ5O7yKQNute8.ttf", + "italic": "https://fonts.gstatic.com/s/inriasans/v15/ptROTiqXYfZMCOiVj9kQ1Oz4LSFrpe8uZA.ttf", + "700": "https://fonts.gstatic.com/s/inriasans/v15/ptRPTiqXYfZMCOiVj9kQ3FLdDQtFqeY3fX4.ttf", + "700italic": "https://fonts.gstatic.com/s/inriasans/v15/ptRRTiqXYfZMCOiVj9kQ1OzAkQ5PrcQybX4pQA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/inriasans/v15/ptRMTiqXYfZMCOiVj9kQ1O_4LQ.ttf" + }, + { + "family": "Inria Serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/inriaserif/v18/fC14PYxPY3rXxEndZJAzN3wAVQjFhFyta3xN.ttf", + "300italic": "https://fonts.gstatic.com/s/inriaserif/v18/fC16PYxPY3rXxEndZJAzN3SuT4THjliPbmxN0_E.ttf", + "regular": "https://fonts.gstatic.com/s/inriaserif/v18/fC1lPYxPY3rXxEndZJAzN0SsfSzNr0Ck.ttf", + "italic": "https://fonts.gstatic.com/s/inriaserif/v18/fC1nPYxPY3rXxEndZJAzN3SudyjvqlCkcmU.ttf", + "700": "https://fonts.gstatic.com/s/inriaserif/v18/fC14PYxPY3rXxEndZJAzN3wQUgjFhFyta3xN.ttf", + "700italic": "https://fonts.gstatic.com/s/inriaserif/v18/fC16PYxPY3rXxEndZJAzN3SuT5TAjliPbmxN0_E.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/inriaserif/v18/fC1lPYxPY3rXxEndZJAzN3Stdyg.ttf" + }, + { + "family": "Inspiration", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/inspiration/v7/x3dkckPPZa6L4wIg5cZOEvoGnSrlBBsy.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/inspiration/v7/x3dkckPPZa6L4wIg5cZOEsoHly4.ttf" + }, + { + "family": "Instrument Sans", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npSTF-Qf1mS0v3_7Y.ttf", + "500": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npST3-Qf1mS0v3_7Y.ttf", + "600": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npSQb_gf1mS0v3_7Y.ttf", + "700": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npSQi_gf1mS0v3_7Y.ttf", + "italic": "https://fonts.gstatic.com/s/instrumentsans/v4/pxigypc9vsFDm051Uf6KVwgkfoSbSnNPooZAN0lInHGpCWNE27lgU-XJojENuu-2kykN2u7YUwU.ttf", + "500italic": "https://fonts.gstatic.com/s/instrumentsans/v4/pxigypc9vsFDm051Uf6KVwgkfoSbSnNPooZAN0lInHGpCWNE27lgU-XJojENut22kykN2u7YUwU.ttf", + "600italic": "https://fonts.gstatic.com/s/instrumentsans/v4/pxigypc9vsFDm051Uf6KVwgkfoSbSnNPooZAN0lInHGpCWNE27lgU-XJojENujGxkykN2u7YUwU.ttf", + "700italic": "https://fonts.gstatic.com/s/instrumentsans/v4/pxigypc9vsFDm051Uf6KVwgkfoSbSnNPooZAN0lInHGpCWNE27lgU-XJojENugixkykN2u7YUwU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/instrumentsans/v4/pximypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr-yp2JGEJOH9npSTF-Tf0kyk.ttf" + }, + { + "family": "Instrument Serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/instrumentserif/v5/jizBRFtNs2ka5fXjeivQ4LroWlx-2zIZj1bIkNo.ttf", + "italic": "https://fonts.gstatic.com/s/instrumentserif/v5/jizHRFtNs2ka5fXjeivQ4LroWlx-6zATi3TNgNq55w.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/instrumentserif/v5/jizBRFtNs2ka5fXjeivQ4LroWlx-6zMTiw.ttf" + }, + { + "family": "Intel One Mono", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "symbols2", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-07-16", + "files": { + "300": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMg__cRnD9TMr2nYA.ttf", + "300italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abSn3zVXELi3YD27.ttf", + "regular": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgofcRnD9TMr2nYA.ttf", + "italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abT53zVXELi3YD27.ttf", + "500": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgk_cRnD9TMr2nYA.ttf", + "500italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abTL3zVXELi3YD27.ttf", + "600": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgf_ARnD9TMr2nYA.ttf", + "600italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abQn2DVXELi3YD27.ttf", + "700": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgRvARnD9TMr2nYA.ttf", + "700italic": "https://fonts.gstatic.com/s/intelonemono/v2/P5sUzZuLY8Lb_G1RikFkwPjBvsk1H4RE8-pZ5gQ1abQe2DVXELi3YD27.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/intelonemono/v2/P5sWzZuLY8Lb_G1RikFkwPjBvuM8LXucmoHDSAMgofchnTVX.ttf" + }, + { + "family": "Inter", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyeMZhrib2Bg-4.ttf", + "200": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuDyfMZhrib2Bg-4.ttf", + "300": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuOKfMZhrib2Bg-4.ttf", + "regular": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfMZhrib2Bg-4.ttf", + "500": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuI6fMZhrib2Bg-4.ttf", + "600": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuGKYMZhrib2Bg-4.ttf", + "700": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuFuYMZhrib2Bg-4.ttf", + "800": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuDyYMZhrib2Bg-4.ttf", + "900": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuBWYMZhrib2Bg-4.ttf", + "100italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTc2dphjZ-Ek-7MeA.ttf", + "200italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTcWdthjZ-Ek-7MeA.ttf", + "300italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTch9thjZ-Ek-7MeA.ttf", + "italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTc2dthjZ-Ek-7MeA.ttf", + "500italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTc69thjZ-Ek-7MeA.ttf", + "600italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTcB9xhjZ-Ek-7MeA.ttf", + "700italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTcPtxhjZ-Ek-7MeA.ttf", + "800italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTcWdxhjZ-Ek-7MeA.ttf", + "900italic": "https://fonts.gstatic.com/s/inter/v20/UcCM3FwrK3iLTcvneQg7Ca725JhhKnNqk4j1ebLhAm8SrXTccNxhjZ-Ek-7MeA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZlhjQ.ttf" + }, + { + "family": "Inter Tight", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjDw6qXCRToK8EPg.ttf", + "200": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjjw-qXCRToK8EPg.ttf", + "300": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjUQ-qXCRToK8EPg.ttf", + "regular": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjDw-qXCRToK8EPg.ttf", + "500": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjPQ-qXCRToK8EPg.ttf", + "600": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mj0QiqXCRToK8EPg.ttf", + "700": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mj6AiqXCRToK8EPg.ttf", + "800": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjjwiqXCRToK8EPg.ttf", + "900": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjpgiqXCRToK8EPg.ttf", + "100italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0xCHi5XgqoUPvi5.ttf", + "200italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0zCHy5XgqoUPvi5.ttf", + "300italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0wcHy5XgqoUPvi5.ttf", + "italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0xCHy5XgqoUPvi5.ttf", + "500italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0xwHy5XgqoUPvi5.ttf", + "600italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0ycGC5XgqoUPvi5.ttf", + "700italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0ylGC5XgqoUPvi5.ttf", + "800italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0zCGC5XgqoUPvi5.ttf", + "900italic": "https://fonts.gstatic.com/s/intertight/v9/NGShv5HMAFg6IuGlBNMjxLsC66ZMtb8hyW62x0zrGC5XgqoUPvi5.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/intertight/v9/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjDw-aXS5X.ttf" + }, + { + "family": "Irish Grover", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/irishgrover/v23/buExpoi6YtLz2QW7LA4flVgf-P5Oaiw4cw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/irishgrover/v23/buExpoi6YtLz2QW7LA4flVgv-fRK.ttf" + }, + { + "family": "Island Moments", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/islandmoments/v8/NaPBcZfVGvBdxIt7Ar0qzkXJF-TGIohbZ6SY.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/islandmoments/v8/NaPBcZfVGvBdxIt7Ar0qzkXJF9THKIw.ttf" + }, + { + "family": "Istok Web", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/istokweb/v26/3qTvojGmgSyUukBzKslZAWF-9kIIaQ.ttf", + "italic": "https://fonts.gstatic.com/s/istokweb/v26/3qTpojGmgSyUukBzKslpA2t61EcYaQ7F.ttf", + "700": "https://fonts.gstatic.com/s/istokweb/v26/3qTqojGmgSyUukBzKslhvU5a_mkUYBfcMw.ttf", + "700italic": "https://fonts.gstatic.com/s/istokweb/v26/3qT0ojGmgSyUukBzKslpA1PG-2MQQhLMMygN.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/istokweb/v26/3qTvojGmgSyUukBzKslpAGt6.ttf" + }, + { + "family": "Italiana", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/italiana/v21/QldNNTtLsx4E__B0XTmRY31Wx7Vv.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/italiana/v21/QldNNTtLsx4E__B0XQmQaXk.ttf" + }, + { + "family": "Italianno", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/italianno/v18/dg4n_p3sv6gCJkwzT6Rnj5YpQwM-gg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/italianno/v18/dg4n_p3sv6gCJkwzT6RXjpwt.ttf" + }, + { + "family": "Itim", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/itim/v16/0nknC9ziJOYewARKkc7ZdwU.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/itim/v16/0nknC9ziJOYe8AVAlQ.ttf" + }, + { + "family": "Jacquard 12", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v8", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jacquard12/v8/vm8ydRLuXETEweL79J4rGc3JUnr34c9-.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jacquard12/v8/vm8ydRLuXETEweL79J4rGf3IWH4.ttf" + }, + { + "family": "Jacquard 12 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jacquard12charted/v4/i7dWIE97bzCOB9Q_Up6PQmYfKDPIb2HwT3StZ9jetKY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jacquard12charted/v4/i7dWIE97bzCOB9Q_Up6PQmYfKDPIb2Hwf3WnYw.ttf" + }, + { + "family": "Jacquard 24", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jacquard24/v4/jVyO7nf_B2zO5jVpUGU8lgQEdchf9xXp.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jacquard24/v4/jVyO7nf_B2zO5jVpUGU8ljQFf8w.ttf" + }, + { + "family": "Jacquard 24 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jacquard24charted/v5/mtGm4-dNK6HaudrE9VVKhENTsEXEYish0iRrMYJ_K-4.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jacquard24charted/v5/mtGm4-dNK6HaudrE9VVKhENTsEXEYish4iVhNQ.ttf" + }, + { + "family": "Jacquarda Bastarda 9", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v6", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jacquardabastarda9/v6/f0Xp0fWr_8t6WFtKQJfOhaC0hcZ1HYAMAbwD1TB_JHHY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jacquardabastarda9/v6/f0Xp0fWr_8t6WFtKQJfOhaC0hcZ1HYAMAYwC3zQ.ttf" + }, + { + "family": "Jacquarda Bastarda 9 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jacquardabastarda9charted/v4/Yq6D-KaMUyfq4qLgx19A_ocp43FeLd9m0vDxm-yf8JPuf0cPaL8pmQg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jacquardabastarda9charted/v4/Yq6D-KaMUyfq4qLgx19A_ocp43FeLd9m0vDxm-yf8JPuT0YFbA.ttf" + }, + { + "family": "Jacques Francois", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/jacquesfrancois/v26/ZXu9e04ZvKeOOHIe1TMahbcIU2cgmcPqoeRWfbs.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jacquesfrancois/v26/ZXu9e04ZvKeOOHIe1TMahbcIU2cgqcLgpQ.ttf" + }, + { + "family": "Jacques Francois Shadow", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/jacquesfrancoisshadow/v27/KR1FBtOz8PKTMk-kqdkLVrvR0ECFrB6Pin-2_q8VsHuV5ULS.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jacquesfrancoisshadow/v27/KR1FBtOz8PKTMk-kqdkLVrvR0ECFrB6Pin-2_p8Uun8.ttf" + }, + { + "family": "Jaini", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/jaini/v1/fC1vPYJMbGHQzEmOK-ZSUHyt.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jaini/v1/fC1vPYJMbGHQzHmPIeI.ttf" + }, + { + "family": "Jaini Purva", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/jainipurva/v1/CHynV-vdHVXwbWcUswbUGHoOHH4sj3lR.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jainipurva/v1/CHynV-vdHVXwbWcUswbUGEoPFno.ttf" + }, + { + "family": "Jaldi", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/jaldi/v14/or3sQ67z0_CI30NUZpD_B6g8.ttf", + "700": "https://fonts.gstatic.com/s/jaldi/v14/or3hQ67z0_CI33voSbT3LLQ1niPn.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jaldi/v14/or3sQ67z0_CI33NVbJQ.ttf" + }, + { + "family": "Jaro", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/jaro/v8/ea8DadQwV_r_Rv3-7zZMCGhQgVr1SlCsNP3VpQ_a.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jaro/v8/ea8DadQwV_r_Rv3-7zZMCGhQgVr1SmCtPvk.ttf" + }, + { + "family": "Jersey 10", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jersey10/v4/GftH7vZKsggXMf9n_J5X-JLgy1wtSw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jersey10/v4/GftH7vZKsggXMf9n_J5n-Zjk.ttf" + }, + { + "family": "Jersey 10 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jersey10charted/v4/oY1E8fPFr6XiNWqEp90XSbwUGfF8SnedKmeBvEYs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jersey10charted/v4/oY1E8fPFr6XiNWqEp90XSbwUGfF8SkecIGM.ttf" + }, + { + "family": "Jersey 15", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jersey15/v4/_6_9EDzuROGsUuk2TWjSYoohsCkvSQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jersey15/v4/_6_9EDzuROGsUuk2TWjiY4Al.ttf" + }, + { + "family": "Jersey 15 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jersey15charted/v4/nuFjD-rCQIjoVp1Sva2ToCTudGbLeRv4r2024gxi.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jersey15charted/v4/nuFjD-rCQIjoVp1Sva2ToCTudGbLeSv5pWk.ttf" + }, + { + "family": "Jersey 20", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jersey20/v4/ZgNRjP1ON6jeW4D12z3crE_qP4mXuQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jersey20/v4/ZgNRjP1ON6jeW4D12z3srUXu.ttf" + }, + { + "family": "Jersey 20 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jersey20charted/v4/JTUNjJMy9DKq5FzVaj9tpgYgvHqGn_Z1ji-rqnQ_.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jersey20charted/v4/JTUNjJMy9DKq5FzVaj9tpgYgvHqGn8Z0hCs.ttf" + }, + { + "family": "Jersey 25", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jersey25/v4/ll8-K2eeXj2tAs6F9BXIJ4AMng8ChA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jersey25/v4/ll8-K2eeXj2tAs6F9BX4JooI.ttf" + }, + { + "family": "Jersey 25 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/jersey25charted/v3/6NUM8EWHIhCWbxOqtLkv94Rlu6EkGv2uUGQW93Cg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jersey25charted/v3/6NUM8EWHIhCWbxOqtLkv94Rlu6EkGs2vWmA.ttf" + }, + { + "family": "JetBrains Mono", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yK1jPVmUsaaDhw.ttf", + "200": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8SKxjPVmUsaaDhw.ttf", + "300": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8lqxjPVmUsaaDhw.ttf", + "regular": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxjPVmUsaaDhw.ttf", + "500": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8-qxjPVmUsaaDhw.ttf", + "600": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8FqtjPVmUsaaDhw.ttf", + "700": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8L6tjPVmUsaaDhw.ttf", + "800": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8SKtjPVmUsaaDhw.ttf", + "100italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO-Lf1OQk6OThxPA.ttf", + "200italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO8LflOQk6OThxPA.ttf", + "300italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO_VflOQk6OThxPA.ttf", + "italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO-LflOQk6OThxPA.ttf", + "500italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO-5flOQk6OThxPA.ttf", + "600italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO9VeVOQk6OThxPA.ttf", + "700italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO9seVOQk6OThxPA.ttf", + "800italic": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO8LeVOQk6OThxPA.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTPFOQ.ttf" + }, + { + "family": "Jim Nightshade", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/jimnightshade/v21/PlIkFlu9Pb08Q8HLM1PxmB0g-OS4V3qKaMxD.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jimnightshade/v21/PlIkFlu9Pb08Q8HLM1PxmB0g-NS5XX4.ttf" + }, + { + "family": "Joan", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/joan/v12/ZXupe1oZsqWRbRdH8X1p_Ng.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/joan/v12/ZXupe1oZsqWRXRZN9Q.ttf" + }, + { + "family": "Jockey One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/jockeyone/v23/HTxpL2g2KjCFj4x8WI6ArIb7HYOk4xc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jockeyone/v23/HTxpL2g2KjCFj4x8WI6AnIfxGQ.ttf" + }, + { + "family": "Jolly Lodger", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/jollylodger/v21/BXRsvFTAh_bGkA1uQ48dlB3VWerT3ZyuqA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jollylodger/v21/BXRsvFTAh_bGkA1uQ48dlB3lWODX.ttf" + }, + { + "family": "Jomhuria", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/jomhuria/v22/Dxxp8j-TMXf-llKur2b1MOGbC3Dh.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jomhuria/v22/Dxxp8j-TMXf-llKur1b0OuU.ttf" + }, + { + "family": "Jomolhari", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "tibetan" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/jomolhari/v21/EvONzA1M1Iw_CBd2hsQCF1IZKq5INg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jomolhari/v21/EvONzA1M1Iw_CBd2hsQyFlgd.ttf" + }, + { + "family": "Josefin Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v34", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_DjRXMFrLgTsQV0.ttf", + "200": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_LjQXMFrLgTsQV0.ttf", + "300": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_GbQXMFrLgTsQV0.ttf", + "regular": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_DjQXMFrLgTsQV0.ttf", + "500": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_ArQXMFrLgTsQV0.ttf", + "600": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_ObXXMFrLgTsQV0.ttf", + "700": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_N_XXMFrLgTsQV0.ttf", + "100italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTtINhKibpUV3MEQ.ttf", + "200italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTNIJhKibpUV3MEQ.ttf", + "300italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCT6oJhKibpUV3MEQ.ttf", + "italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTtIJhKibpUV3MEQ.ttf", + "500italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCThoJhKibpUV3MEQ.ttf", + "600italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTaoVhKibpUV3MEQ.ttf", + "700italic": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3JZQNVED7rKGKxtqIqX5EUCGZ2dIn0FyA96fCTU4VhKibpUV3MEQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/josefinsans/v34/Qw3PZQNVED7rKGKxtqIqX5E-AVSJrOCfjY46_DjQbMBhKg.ttf" + }, + { + "family": "Josefin Slab", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v29", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W71mtd3k3K6CcEyI.ttf", + "200": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W79msd3k3K6CcEyI.ttf", + "300": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W7wesd3k3K6CcEyI.ttf", + "regular": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W71msd3k3K6CcEyI.ttf", + "500": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W72usd3k3K6CcEyI.ttf", + "600": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W74erd3k3K6CcEyI.ttf", + "700": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W776rd3k3K6CcEyI.ttf", + "100italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvnzs9L4KZAyK43w.ttf", + "200italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvHzo9L4KZAyK43w.ttf", + "300italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvwTo9L4KZAyK43w.ttf", + "italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvnzo9L4KZAyK43w.ttf", + "500italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvrTo9L4KZAyK43w.ttf", + "600italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHvQT09L4KZAyK43w.ttf", + "700italic": "https://fonts.gstatic.com/s/josefinslab/v29/lW-qwjwOK3Ps5GSJlNNkMalnrxShJj4wo7AR-pHveD09L4KZAyK43w.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/josefinslab/v29/lW-swjwOK3Ps5GSJlNNkMalNpiZe_ldbOR4W71msR3g9Lw.ttf" + }, + { + "family": "Jost", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7myjJAVGPokMmuHL.ttf", + "200": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mwjJQVGPokMmuHL.ttf", + "300": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mz9JQVGPokMmuHL.ttf", + "regular": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7myjJQVGPokMmuHL.ttf", + "500": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7myRJQVGPokMmuHL.ttf", + "600": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mx9IgVGPokMmuHL.ttf", + "700": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mxEIgVGPokMmuHL.ttf", + "800": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mwjIgVGPokMmuHL.ttf", + "900": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7mwKIgVGPokMmuHL.ttf", + "100italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZu0ENI0un_HLMEo.ttf", + "200italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZm0FNI0un_HLMEo.ttf", + "300italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZrMFNI0un_HLMEo.ttf", + "italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZu0FNI0un_HLMEo.ttf", + "500italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZt8FNI0un_HLMEo.ttf", + "600italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZjMCNI0un_HLMEo.ttf", + "700italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZgoCNI0un_HLMEo.ttf", + "800italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZm0CNI0un_HLMEo.ttf", + "900italic": "https://fonts.gstatic.com/s/jost/v20/92zJtBhPNqw73oHH7BbQp4-B6XlrZkQCNI0un_HLMEo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jost/v20/92zPtBhPNqw79Ij1E865zBUv7myjJTVHNI0.ttf" + }, + { + "family": "Joti One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/jotione/v28/Z9XVDmdJQAmWm9TwaYTe4u2El6GC.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jotione/v28/Z9XVDmdJQAmWm9TwabTf6Ok.ttf" + }, + { + "family": "Jua", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/jua/v18/co3KmW9ljjAjc-DZCsKgsg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jua/v18/co3KmW9ljjATcurd.ttf" + }, + { + "family": "Judson", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/judson/v20/FeVRS0Fbvbc14VxRD7N01bV7kg.ttf", + "italic": "https://fonts.gstatic.com/s/judson/v20/FeVTS0Fbvbc14VxhDblw97BrknZf.ttf", + "700": "https://fonts.gstatic.com/s/judson/v20/FeVSS0Fbvbc14Vxps5xQ3Z5nm29Gww.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/judson/v20/FeVRS0Fbvbc14VxhDrlw.ttf" + }, + { + "family": "Julee", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/julee/v26/TuGfUVB3RpZPQ6ZLodgzydtk.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/julee/v26/TuGfUVB3RpZPQ5ZKq9w.ttf" + }, + { + "family": "Julius Sans One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/juliussansone/v20/1Pt2g8TAX_SGgBGUi0tGOYEga5W-xXEW6aGXHw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/juliussansone/v20/1Pt2g8TAX_SGgBGUi0tGOYEga5WOxHsS.ttf" + }, + { + "family": "Junge", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v26", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/junge/v26/gokgH670Gl1lUqAdvhB7SnKm.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/junge/v26/gokgH670Gl1lUpActBQ.ttf" + }, + { + "family": "Jura", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "kayah-li", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v34", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP0D7auhTfmrH_rt.ttf", + "regular": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP1d7auhTfmrH_rt.ttf", + "500": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP1v7auhTfmrH_rt.ttf", + "600": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP2D6quhTfmrH_rt.ttf", + "700": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP266quhTfmrH_rt.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/jura/v34/z7NOdRfiaC4Vd8hhoPzfb5vBTP1d7ZugR_0.ttf" + }, + { + "family": "Just Another Hand", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/justanotherhand/v21/845CNN4-AJyIGvIou-6yJKyptyOpOcr_BmmlS5aw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/justanotherhand/v21/845CNN4-AJyIGvIou-6yJKyptyOpOfr-DG0.ttf" + }, + { + "family": "Just Me Again Down Here", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/justmeagaindownhere/v25/MwQmbgXtz-Wc6RUEGNMc0QpRrfUh2hSdBBMoAuwHvqDwc_fg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/justmeagaindownhere/v25/MwQmbgXtz-Wc6RUEGNMc0QpRrfUh2hSdBBMoAtwGtKQ.ttf" + }, + { + "family": "K2D", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/k2d/v13/J7aRnpF2V0ErE6UpvrIw74NL.ttf", + "100italic": "https://fonts.gstatic.com/s/k2d/v13/J7afnpF2V0EjdZ1NtLYS6pNLAjk.ttf", + "200": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Erv4QJlJw85ppSGw.ttf", + "200italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ3hlZY4xJ9CGyAa.ttf", + "300": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Er24cJlJw85ppSGw.ttf", + "300italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ2FlpY4xJ9CGyAa.ttf", + "regular": "https://fonts.gstatic.com/s/k2d/v13/J7aTnpF2V0ETd68tnLcg7w.ttf", + "italic": "https://fonts.gstatic.com/s/k2d/v13/J7aRnpF2V0EjdaUpvrIw74NL.ttf", + "500": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Erg4YJlJw85ppSGw.ttf", + "500italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ3dl5Y4xJ9CGyAa.ttf", + "600": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Err4EJlJw85ppSGw.ttf", + "600italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ3xkJY4xJ9CGyAa.ttf", + "700": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Ery4AJlJw85ppSGw.ttf", + "700italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ2VkZY4xJ9CGyAa.ttf", + "800": "https://fonts.gstatic.com/s/k2d/v13/J7aenpF2V0Er14MJlJw85ppSGw.ttf", + "800italic": "https://fonts.gstatic.com/s/k2d/v13/J7acnpF2V0EjdZ2JkpY4xJ9CGyAa.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/k2d/v13/J7aTnpF2V0EjdqUp.ttf" + }, + { + "family": "Kablammo", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "emoji", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/kablammo/v4/bWtm7fHPcgrhC-J3lcXhcQTY5Ixs6Au9YgCjjx0Rf4YDKw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kablammo/v4/bWtm7fHPcgrhC-J3lcXhcQTY5Ixs6Au9YgCTjhcV.ttf" + }, + { + "family": "Kadwa", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin" + ], + "version": "v13", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/kadwa/v13/rnCm-x5V0g7iphTHRcc2s2XH.ttf", + "700": "https://fonts.gstatic.com/s/kadwa/v13/rnCr-x5V0g7ipix7auM-mHnOSOuk.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kadwa/v13/rnCm-x5V0g7ipiTGT8M.ttf" + }, + { + "family": "Kaisei Decol", + "variants": [ + "regular", + "500", + "700" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/kaiseidecol/v11/bMrwmSqP45sidWf3QmfFW6iyW1EP22OjoA.ttf", + "500": "https://fonts.gstatic.com/s/kaiseidecol/v11/bMrvmSqP45sidWf3QmfFW6iKr3gr00i_qb57kA.ttf", + "700": "https://fonts.gstatic.com/s/kaiseidecol/v11/bMrvmSqP45sidWf3QmfFW6iK534r00i_qb57kA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kaiseidecol/v11/bMrwmSqP45sidWf3QmfFW6iCWlsL.ttf" + }, + { + "family": "Kaisei HarunoUmi", + "variants": [ + "regular", + "500", + "700" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/kaiseiharunoumi/v11/HI_RiZQSLqBQoAHhK_C6N_nzy_jcGsv5sM8u3mk.ttf", + "500": "https://fonts.gstatic.com/s/kaiseiharunoumi/v11/HI_WiZQSLqBQoAHhK_C6N_nzy_jcIj_QlMcFwmC9FAU.ttf", + "700": "https://fonts.gstatic.com/s/kaiseiharunoumi/v11/HI_WiZQSLqBQoAHhK_C6N_nzy_jcInfWlMcFwmC9FAU.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kaiseiharunoumi/v11/HI_RiZQSLqBQoAHhK_C6N_nzy_jcKsrztA.ttf" + }, + { + "family": "Kaisei Opti", + "variants": [ + "regular", + "500", + "700" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/kaiseiopti/v11/QldKNThJphYb8_g6c2nlIFle7KlmxuHx.ttf", + "500": "https://fonts.gstatic.com/s/kaiseiopti/v11/QldXNThJphYb8_g6c2nlIGGqxY1u7f34DYwn.ttf", + "700": "https://fonts.gstatic.com/s/kaiseiopti/v11/QldXNThJphYb8_g6c2nlIGHiw41u7f34DYwn.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kaiseiopti/v11/QldKNThJphYb8_g6c2nlIGlf5q0.ttf" + }, + { + "family": "Kaisei Tokumin", + "variants": [ + "regular", + "500", + "700", + "800" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8sN5wdZg7xCwuMsylww2ZiQkJf1l0pj946.ttf", + "500": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8vN5wdZg7xCwuMsylww2ZiQnqr_3khpMIzeI6v.ttf", + "700": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8vN5wdZg7xCwuMsylww2ZiQnrj-XkhpMIzeI6v.ttf", + "800": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8vN5wdZg7xCwuMsylww2ZiQnr_-nkhpMIzeI6v.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kaiseitokumin/v11/Gg8sN5wdZg7xCwuMsylww2ZiQnJe3Fk.ttf" + }, + { + "family": "Kalam", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/kalam/v18/YA9Qr0Wd4kDdMtD6GgLLmCUItqGt.ttf", + "regular": "https://fonts.gstatic.com/s/kalam/v18/YA9dr0Wd4kDdMuhWMibDszkB.ttf", + "700": "https://fonts.gstatic.com/s/kalam/v18/YA9Qr0Wd4kDdMtDqHQLLmCUItqGt.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kalam/v18/YA9dr0Wd4kDdMthXOCI.ttf" + }, + { + "family": "Kalnia", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "math" + ], + "version": "v6", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW9il2xRGNcykIZc.ttf", + "200": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW_ilmxRGNcykIZc.ttf", + "300": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW88lmxRGNcykIZc.ttf", + "regular": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW9ilmxRGNcykIZc.ttf", + "500": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW9QlmxRGNcykIZc.ttf", + "600": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW-8kWxRGNcykIZc.ttf", + "700": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW-FkWxRGNcykIZc.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kalnia/v6/11hqGpPCwUbbYwZZP0RBuDY62BQZhjvOytM_sLzi-TFWAW9illxQEtM.ttf" + }, + { + "family": "Kalnia Glaze", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYdL63nZKfhpVTvN.ttf", + "200": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYfL6nnZKfhpVTvN.ttf", + "300": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYcV6nnZKfhpVTvN.ttf", + "regular": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYdL6nnZKfhpVTvN.ttf", + "500": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYd56nnZKfhpVTvN.ttf", + "600": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYeV7XnZKfhpVTvN.ttf", + "700": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYes7XnZKfhpVTvN.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kalniaglaze/v5/wlpQgwHCBUNjrGrfu-hwowN1YyC-42Lu26VHf2LtOkAod0wTxm2tFYdL6knYI_w.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Kameron", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4Ne3cbcbvZPxCDLR.ttf", + "500": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4NeFcbcbvZPxCDLR.ttf", + "600": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4NdpdrcbvZPxCDLR.ttf", + "700": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4NdQdrcbvZPxCDLR.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kameron/v18/vm8pdR7vXErQxuznqrUS3z1Uw3nq4Ne3cYcat5c.ttf" + }, + { + "family": "Kanchenjunga", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "kirat-rai", + "latin" + ], + "version": "v2", + "lastModified": "2025-04-23", + "files": { + "regular": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmPoKKd5fUmrILiWsjCI6TiqYsGBGBzCw.ttf", + "500": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmQoKKd5fUmrILiWsjCI6TaXaIiDEtvAlaMKw.ttf", + "600": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmQoKKd5fUmrILiWsjCI6TacaUiDEtvAlaMKw.ttf", + "700": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmQoKKd5fUmrILiWsjCI6TaFaQiDEtvAlaMKw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kanchenjunga/v2/RWmPoKKd5fUmrILiWsjCI6TSqIEC.ttf" + }, + { + "family": "Kanit", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/kanit/v17/nKKX-Go6G5tXcr72GwWKcaxALFs.ttf", + "100italic": "https://fonts.gstatic.com/s/kanit/v17/nKKV-Go6G5tXcraQI2GAdY5FPFtrGw.ttf", + "200": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr5aOiWgX6BJNUJy.ttf", + "200italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI82hVaRrMFJyAu4.ttf", + "300": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr4-OSWgX6BJNUJy.ttf", + "300italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI6miVaRrMFJyAu4.ttf", + "regular": "https://fonts.gstatic.com/s/kanit/v17/nKKZ-Go6G5tXcoaSEQGodLxA.ttf", + "italic": "https://fonts.gstatic.com/s/kanit/v17/nKKX-Go6G5tXcraQGwWKcaxALFs.ttf", + "500": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr5mOCWgX6BJNUJy.ttf", + "500italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI_GjVaRrMFJyAu4.ttf", + "600": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr5KPyWgX6BJNUJy.ttf", + "600italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI92kVaRrMFJyAu4.ttf", + "700": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr4uPiWgX6BJNUJy.ttf", + "700italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI7mlVaRrMFJyAu4.ttf", + "800": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr4yPSWgX6BJNUJy.ttf", + "800italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI6WmVaRrMFJyAu4.ttf", + "900": "https://fonts.gstatic.com/s/kanit/v17/nKKU-Go6G5tXcr4WPCWgX6BJNUJy.ttf", + "900italic": "https://fonts.gstatic.com/s/kanit/v17/nKKS-Go6G5tXcraQI4GnVaRrMFJyAu4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kanit/v17/nKKZ-Go6G5tXcraTGwU.ttf" + }, + { + "family": "Kantumruy Pro", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "khmer", + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg1urUs0M34dR6dW.ttf", + "200": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg3urEs0M34dR6dW.ttf", + "300": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg0wrEs0M34dR6dW.ttf", + "regular": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg1urEs0M34dR6dW.ttf", + "500": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg1crEs0M34dR6dW.ttf", + "600": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg2wq0s0M34dR6dW.ttf", + "700": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg2Jq0s0M34dR6dW.ttf", + "100italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim76N2OXo_QrdWlcU.ttf", + "200italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim7yN3OXo_QrdWlcU.ttf", + "300italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim7_13OXo_QrdWlcU.ttf", + "italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim76N3OXo_QrdWlcU.ttf", + "500italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim75F3OXo_QrdWlcU.ttf", + "600italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim731wOXo_QrdWlcU.ttf", + "700italic": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2RY5aECkp34vEBSPFOmJxwlEbbdY1VU_nxzRim70RwOXo_QrdWlcU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kantumruypro/v12/1q2TY5aECkp34vEBSPFOmJxwvk_pilU8OGNfyg1urHs1OXo.ttf" + }, + { + "family": "Kapakana", + "variants": [ + "300", + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/kapakana/v19/sykt-yN0m6InS7OD9BCc9iYVO-6XOlDixNA5tRbXZ4IXAA.ttf", + "regular": "https://fonts.gstatic.com/s/kapakana/v19/sykt-yN0m6InS7OD9BCc9iYVO-6XOlDimtA5tRbXZ4IXAA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kapakana/v19/sykt-yN0m6InS7OD9BCc9iYVO-6XOlDimtAJtBzT.ttf" + }, + { + "family": "Karantina", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/karantina/v13/buExpo24ccnh31GVMABxXCgf-P5Oaiw4cw.ttf", + "regular": "https://fonts.gstatic.com/s/karantina/v13/buE0po24ccnh31GVMABJ8AA78NVSYw.ttf", + "700": "https://fonts.gstatic.com/s/karantina/v13/buExpo24ccnh31GVMABxTC8f-P5Oaiw4cw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/karantina/v13/buE0po24ccnh31GVMAB58Qo_.ttf" + }, + { + "family": "Karla", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v33", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDeJqqFENLR7fHGw.ttf", + "300": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDppqqFENLR7fHGw.ttf", + "regular": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTD-JqqFENLR7fHGw.ttf", + "500": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDypqqFENLR7fHGw.ttf", + "600": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDJp2qFENLR7fHGw.ttf", + "700": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDH52qFENLR7fHGw.ttf", + "800": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTDeJ2qFENLR7fHGw.ttf", + "200italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNnCV0lPZbLXGxGR.ttf", + "300italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNkcV0lPZbLXGxGR.ttf", + "italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNlCV0lPZbLXGxGR.ttf", + "500italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNlwV0lPZbLXGxGR.ttf", + "600italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNmcUElPZbLXGxGR.ttf", + "700italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNmlUElPZbLXGxGR.ttf", + "800italic": "https://fonts.gstatic.com/s/karla/v33/qkBKXvYC6trAT7RQNNK2EG7SIwPWMNnCUElPZbLXGxGR.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/karla/v33/qkBIXvYC6trAT55ZBi1ueQVIjQTD-JqaFUlP.ttf" + }, + { + "family": "Karla Tamil Inclined", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "tamil" + ], + "version": "v2", + "lastModified": "2024-10-29", + "files": { + "regular": "https://fonts.gstatic.com/s/karlatamilinclined/v2/vm8pdQ3vXFXZ1aPd8dNzR82AFh2TibkaVrcbvZPxCDLR.ttf", + "700": "https://fonts.gstatic.com/s/karlatamilinclined/v2/vm8mdQ3vXFXZ1aPd8dNzR82AFh2TibkaVo-nkrf5Iy7YGkI1.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/karlatamilinclined/v2/vm8pdQ3vXFXZ1aPd8dNzR82AFh2TibkaVocat5c.ttf" + }, + { + "family": "Karla Tamil Upright", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "tamil" + ], + "version": "v2", + "lastModified": "2024-10-29", + "files": { + "regular": "https://fonts.gstatic.com/s/karlatamilupright/v2/IFS4HfVMk95HnY0u6SeQ_cHoozW_3U5XoBJ9hK8kMK4.ttf", + "700": "https://fonts.gstatic.com/s/karlatamilupright/v2/IFS1HfVMk95HnY0u6SeQ_cHoozW_3U5XmK5SoKcPLKclE4o.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/karlatamilupright/v2/IFS4HfVMk95HnY0u6SeQ_cHoozW_3U5XkBN3gA.ttf" + }, + { + "family": "Karma", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/karma/v18/va9F4kzAzMZRGLjDY8Z_uqzGQC_-.ttf", + "regular": "https://fonts.gstatic.com/s/karma/v18/va9I4kzAzMZRGIBvS-J3kbDP.ttf", + "500": "https://fonts.gstatic.com/s/karma/v18/va9F4kzAzMZRGLibYsZ_uqzGQC_-.ttf", + "600": "https://fonts.gstatic.com/s/karma/v18/va9F4kzAzMZRGLi3ZcZ_uqzGQC_-.ttf", + "700": "https://fonts.gstatic.com/s/karma/v18/va9F4kzAzMZRGLjTZMZ_uqzGQC_-.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/karma/v18/va9I4kzAzMZRGLBuQeY.ttf" + }, + { + "family": "Katibeh", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/katibeh/v22/ZGjXol5MQJog4bxDaC1RVDNdGDs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/katibeh/v22/ZGjXol5MQJog4bxDWCxbUA.ttf" + }, + { + "family": "Kaushan Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/kaushanscript/v19/vm8vdRfvXFLG3OLnsO15WYS5DF7_ytN3M48a.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kaushanscript/v19/vm8vdRfvXFLG3OLnsO15WYS5DG7-wNc.ttf" + }, + { + "family": "Kavivanar", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/kavivanar/v22/o-0IIpQgyXYSwhxP7_Jb4j5Ba_2c7A.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kavivanar/v22/o-0IIpQgyXYSwhxP7_Jr4zRF.ttf" + }, + { + "family": "Kavoon", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/kavoon/v25/pxiFyp4_scRYhlU4NLr6f1pdEQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kavoon/v25/pxiFyp4_scRYhlUINbD-.ttf" + }, + { + "family": "Kay Pho Du", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "kayah-li", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/kayphodu/v2/jizfREFPvGNOx-jhPwHR4OmnLD0Z4zM.ttf", + "500": "https://fonts.gstatic.com/s/kayphodu/v2/jizcREFPvGNOx-jhPwHR2B2OCDUy_zoyk18.ttf", + "600": "https://fonts.gstatic.com/s/kayphodu/v2/jizcREFPvGNOx-jhPwHR2DGJCDUy_zoyk18.ttf", + "700": "https://fonts.gstatic.com/s/kayphodu/v2/jizcREFPvGNOx-jhPwHR2FWICDUy_zoyk18.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kayphodu/v2/jizfREFPvGNOx-jhPwHR0OitKA.ttf" + }, + { + "family": "Kdam Thmor Pro", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/kdamthmorpro/v7/EJRPQgAzVdcI-Qdvt34jzurnGA7_j89I8ZWb.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kdamthmorpro/v7/EJRPQgAzVdcI-Qdvt34jzurnGD7-hcs.ttf" + }, + { + "family": "Keania One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/keaniaone/v26/zOL54pXJk65E8pXardnuycRuv-hHkOs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/keaniaone/v26/zOL54pXJk65E8pXardnu-cVkuw.ttf" + }, + { + "family": "Kedebideri", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v2", + "lastModified": "2025-11-20", + "files": { + "regular": "https://fonts.gstatic.com/s/kedebideri/v2/t5tlIR0UPo6ZGAykNh_ejKbCyTHuspo.ttf", + "500": "https://fonts.gstatic.com/s/kedebideri/v2/t5tmIR0UPo6ZGAykNh_etFLr7TnFrpOHYh4.ttf", + "600": "https://fonts.gstatic.com/s/kedebideri/v2/t5tmIR0UPo6ZGAykNh_etH7s7TnFrpOHYh4.ttf", + "700": "https://fonts.gstatic.com/s/kedebideri/v2/t5tmIR0UPo6ZGAykNh_etBrt7TnFrpOHYh4.ttf", + "800": "https://fonts.gstatic.com/s/kedebideri/v2/t5tmIR0UPo6ZGAykNh_etAbu7TnFrpOHYh4.ttf", + "900": "https://fonts.gstatic.com/s/kedebideri/v2/t5tmIR0UPo6ZGAykNh_etCLv7TnFrpOHYh4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kedebideri/v2/t5tlIR0UPo6ZGAykNh_evKfIzQ.ttf" + }, + { + "family": "Kelly Slab", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/kellyslab/v18/-W_7XJX0Rz3cxUnJC5t6TkMBf50kbiM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kellyslab/v18/-W_7XJX0Rz3cxUnJC5t6fkILew.ttf" + }, + { + "family": "Kenia", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/kenia/v30/jizURE5PuHQH9qCONUGswfGM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kenia/v30/jizURE5PuHQH9pCPP0U.ttf" + }, + { + "family": "Khand", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/khand/v22/TwMN-IINQlQQ0bL5cFE3ZwaH__-C.ttf", + "regular": "https://fonts.gstatic.com/s/khand/v22/TwMA-IINQlQQ0YpVWHU_TBqO.ttf", + "500": "https://fonts.gstatic.com/s/khand/v22/TwMN-IINQlQQ0bKhcVE3ZwaH__-C.ttf", + "600": "https://fonts.gstatic.com/s/khand/v22/TwMN-IINQlQQ0bKNdlE3ZwaH__-C.ttf", + "700": "https://fonts.gstatic.com/s/khand/v22/TwMN-IINQlQQ0bLpd1E3ZwaH__-C.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/khand/v22/TwMA-IINQlQQ0bpUUnE.ttf" + }, + { + "family": "Khmer", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v38", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/khmer/v38/MjQImit_vPPwpF-BpN2EeYmD.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/khmer/v38/MjQImit_vPPwpG-Artk.ttf" + }, + { + "family": "Khula", + "variants": [ + "300", + "regular", + "600", + "700", + "800" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/khula/v17/OpNPnoEOns3V7G-ljCvUrC59XwXD.ttf", + "regular": "https://fonts.gstatic.com/s/khula/v17/OpNCnoEOns3V7FcJpA_chzJ0.ttf", + "600": "https://fonts.gstatic.com/s/khula/v17/OpNPnoEOns3V7G_RiivUrC59XwXD.ttf", + "700": "https://fonts.gstatic.com/s/khula/v17/OpNPnoEOns3V7G-1iyvUrC59XwXD.ttf", + "800": "https://fonts.gstatic.com/s/khula/v17/OpNPnoEOns3V7G-piCvUrC59XwXD.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/khula/v17/OpNCnoEOns3V7GcIrgs.ttf" + }, + { + "family": "Kings", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/kings/v9/8AtnGsK4O5CYXU_Iq6GSPaHS.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kings/v9/8AtnGsK4O5CYXX_JoaU.ttf" + }, + { + "family": "Kirang Haerang", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/kiranghaerang/v22/E21-_dn_gvvIjhYON1lpIU4-bcqvWPaJq4no.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kiranghaerang/v22/E21-_dn_gvvIjhYON1lpIU4-bfquUvI.ttf" + }, + { + "family": "Kite One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/kiteone/v23/70lQu7shLnA_E02vyq1b6HnGO4uA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kiteone/v23/70lQu7shLnA_E02vyp1a4n0.ttf" + }, + { + "family": "Kiwi Maru", + "variants": [ + "300", + "regular", + "500" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/kiwimaru/v20/R70djykGkuuDep-hRg6gNCi0Vxn9R5ShnA.ttf", + "regular": "https://fonts.gstatic.com/s/kiwimaru/v20/R70YjykGkuuDep-hRg6YmACQXzLhTg.ttf", + "500": "https://fonts.gstatic.com/s/kiwimaru/v20/R70djykGkuuDep-hRg6gbCm0Vxn9R5ShnA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kiwimaru/v20/R70YjykGkuuDep-hRg6omQqU.ttf" + }, + { + "family": "Klee One", + "variants": [ + "regular", + "600" + ], + "subsets": [ + "cyrillic", + "greek-ext", + "japanese", + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/kleeone/v13/LDIxapCLNRc6A8oT4q4AOeekWPrP.ttf", + "600": "https://fonts.gstatic.com/s/kleeone/v13/LDI2apCLNRc6A8oT4pbYF8Osc-bGkqIw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kleeone/v13/LDIxapCLNRc6A8oT4p4BM-M.ttf" + }, + { + "family": "Knewave", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/knewave/v15/sykz-yx0lLcxQaSItSq9-trEvlQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/knewave/v15/sykz-yx0lLcxQaSIhSu3_g.ttf" + }, + { + "family": "KoHo", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPuE1WJ75JoKhHys.ttf", + "200italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNisssJ_zIqCkDyvqZA.ttf", + "300": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPoU2WJ75JoKhHys.ttf", + "300italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNiss1JzzIqCkDyvqZA.ttf", + "regular": "https://fonts.gstatic.com/s/koho/v18/K2F-fZ5fmddNBikefJbSOos.ttf", + "italic": "https://fonts.gstatic.com/s/koho/v18/K2FwfZ5fmddNNisUeLTXKou4Bg.ttf", + "500": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPt03WJ75JoKhHys.ttf", + "500italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNissjJ3zIqCkDyvqZA.ttf", + "600": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPvEwWJ75JoKhHys.ttf", + "600italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNissoJrzIqCkDyvqZA.ttf", + "700": "https://fonts.gstatic.com/s/koho/v18/K2FxfZ5fmddNPpUxWJ75JoKhHys.ttf", + "700italic": "https://fonts.gstatic.com/s/koho/v18/K2FzfZ5fmddNNissxJvzIqCkDyvqZA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/koho/v18/K2F-fZ5fmddNNigUeA.ttf" + }, + { + "family": "Kodchasan", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJeR1Cggeqo3eMeoA.ttf", + "200italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUlIgOCs_-YOoIgN.ttf", + "300": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJeI1Oggeqo3eMeoA.ttf", + "300italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUksg-Cs_-YOoIgN.ttf", + "regular": "https://fonts.gstatic.com/s/kodchasan/v20/1cXxaUPOAJv9sG4I-DJmj3uEicG01A.ttf", + "italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cX3aUPOAJv9sG4I-DJWjXGAq8Sk1PoH.ttf", + "500": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJee1Kggeqo3eMeoA.ttf", + "500italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUl0guCs_-YOoIgN.ttf", + "600": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJeV1Wggeqo3eMeoA.ttf", + "600italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUlYheCs_-YOoIgN.ttf", + "700": "https://fonts.gstatic.com/s/kodchasan/v20/1cX0aUPOAJv9sG4I-DJeM1Sggeqo3eMeoA.ttf", + "700italic": "https://fonts.gstatic.com/s/kodchasan/v20/1cXqaUPOAJv9sG4I-DJWjUk8hOCs_-YOoIgN.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kodchasan/v20/1cXxaUPOAJv9sG4I-DJWjnGA.ttf" + }, + { + "family": "Kode Mono", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq5my9DqTaOW2A3k.ttf", + "500": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq6uy9DqTaOW2A3k.ttf", + "600": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq0e19DqTaOW2A3k.ttf", + "700": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq3619DqTaOW2A3k.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kodemono/v4/A2BLn5pb0QgtVEPFnlYkkaoBgw4qv9odq5myxDuZbA.ttf" + }, + { + "family": "Koh Santepheap", + "variants": [ + "100", + "300", + "regular", + "700", + "900" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v15", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMfW3p6SJbwyGj2rBZyeOrTjNuFHVyTtjNJUWU.ttf", + "300": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMeW3p6SJbwyGj2rBZyeOrTjNtNP3y5mD9ASHz5.ttf", + "regular": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMdW3p6SJbwyGj2rBZyeOrTjOPhF1ixsyNJ.ttf", + "700": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMeW3p6SJbwyGj2rBZyeOrTjNtdOHy5mD9ASHz5.ttf", + "900": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMeW3p6SJbwyGj2rBZyeOrTjNtlOny5mD9ASHz5.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kohsantepheap/v15/gNMdW3p6SJbwyGj2rBZyeOrTjNPgHVw.ttf" + }, + { + "family": "Kolker Brush", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/kolkerbrush/v8/iJWDBXWRZjfKWdvmzwvvog3-7KJ6x8qNUQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kolkerbrush/v8/iJWDBXWRZjfKWdvmzwvvog3O7ah-.ttf" + }, + { + "family": "Konkhmer Sleokchher", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/konkhmersleokchher/v3/_Xmw-GE-rjmabA_M-aPOZOsCrUv825LFI3507E0d-W0.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/konkhmersleokchher/v3/_Xmw-GE-rjmabA_M-aPOZOsCrUv825LFE39-6A.ttf" + }, + { + "family": "Kosugi", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/kosugi/v19/pxiFyp4_v8FCjlI4NLr6f1pdEQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kosugi/v19/pxiFyp4_v8FCjlIINbD-.ttf" + }, + { + "family": "Kosugi Maru", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/kosugimaru/v17/0nksC9PgP_wGh21A2KeqGiTqivr9iBq_.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kosugimaru/v17/0nksC9PgP_wGh21A2KeqGhTrgP4.ttf" + }, + { + "family": "Kotta One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/kottaone/v21/S6u_w41LXzPc_jlfNWqPHA3s5dwt7w.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kottaone/v21/S6u_w41LXzPc_jlfNWq_HQfo.ttf" + }, + { + "family": "Koulen", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v30", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/koulen/v30/AMOQz46as3KIBPeWgnA9kuYMUg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/koulen/v30/AMOQz46as3KIBPemg3o5.ttf" + }, + { + "family": "Kranky", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v29", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/kranky/v29/hESw6XVgJzlPsFnMpheEZo_H_w.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kranky/v29/hESw6XVgJzlPsFn8px2A.ttf" + }, + { + "family": "Kreon", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v40", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvPNimejUfp2dWNg.ttf", + "regular": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvYtimejUfp2dWNg.ttf", + "500": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvUNimejUfp2dWNg.ttf", + "600": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvvN-mejUfp2dWNg.ttf", + "700": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2Dnvhd-mejUfp2dWNg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kreon/v40/t5t9IRIUKY-TFF_LW5lnMR3v2DnvYtiWez8b.ttf" + }, + { + "family": "Kristi", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/kristi/v23/uK_y4ricdeU6zwdRCh0TMv6EXw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kristi/v23/uK_y4ricdeU6zwdhCxcX.ttf" + }, + { + "family": "Krona One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/kronaone/v15/jAnEgHdjHcjgfIb1ZcUCMY-h3cWkWg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kronaone/v15/jAnEgHdjHcjgfIb1ZcUyMIWl.ttf" + }, + { + "family": "Krub", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZo47KLF4R6gWaf8.ttf", + "200italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQiwLByQ4oTef_6gQ.ttf", + "300": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZuo4KLF4R6gWaf8.ttf", + "300italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQipLNyQ4oTef_6gQ.ttf", + "regular": "https://fonts.gstatic.com/s/krub/v11/sZlLdRyC6CRYXkYQDLlTW6E.ttf", + "italic": "https://fonts.gstatic.com/s/krub/v11/sZlFdRyC6CRYbkQaCJtWS6EPcA.ttf", + "500": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZrI5KLF4R6gWaf8.ttf", + "500italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQi_LJyQ4oTef_6gQ.ttf", + "600": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZp4-KLF4R6gWaf8.ttf", + "600italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQi0LVyQ4oTef_6gQ.ttf", + "700": "https://fonts.gstatic.com/s/krub/v11/sZlEdRyC6CRYZvo_KLF4R6gWaf8.ttf", + "700italic": "https://fonts.gstatic.com/s/krub/v11/sZlGdRyC6CRYbkQitLRyQ4oTef_6gQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/krub/v11/sZlLdRyC6CRYbkcaCA.ttf" + }, + { + "family": "Kufam", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3lqk7qQCJHvIwYg.ttf", + "500": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3pKk7qQCJHvIwYg.ttf", + "600": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3SK47qQCJHvIwYg.ttf", + "700": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3ca47qQCJHvIwYg.ttf", + "800": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3Fq47qQCJHvIwYg.ttf", + "900": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3P647qQCJHvIwYg.ttf", + "italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXurT6gqNPPcgYp0i.ttf", + "500italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXurh6gqNPPcgYp0i.ttf", + "600italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXuoN7QqNPPcgYp0i.ttf", + "700italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXuo07QqNPPcgYp0i.ttf", + "800italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXupT7QqNPPcgYp0i.ttf", + "900italic": "https://fonts.gstatic.com/s/kufam/v26/C8c84cY7pG7w_q6APDMZN6kY3hbiXup67QqNPPcgYp0i.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kufam/v26/C8c-4cY7pG7w_oSJDszBXsKCcBH3lqkLqAqN.ttf" + }, + { + "family": "Kulim Park", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/kulimpark/v15/fdN49secq3hflz1Uu3IwjJYNwa5aZbUvGjU.ttf", + "200italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdNm9secq3hflz1Uu3IwhFwUKa9QYZcqCjVVUA.ttf", + "300": "https://fonts.gstatic.com/s/kulimpark/v15/fdN49secq3hflz1Uu3IwjPIOwa5aZbUvGjU.ttf", + "300italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdNm9secq3hflz1Uu3IwhFwUTaxQYZcqCjVVUA.ttf", + "regular": "https://fonts.gstatic.com/s/kulimpark/v15/fdN79secq3hflz1Uu3IwtF4m5aZxebw.ttf", + "italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdN59secq3hflz1Uu3IwhFws4YR0abw2Aw.ttf", + "600": "https://fonts.gstatic.com/s/kulimpark/v15/fdN49secq3hflz1Uu3IwjIYIwa5aZbUvGjU.ttf", + "600italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdNm9secq3hflz1Uu3IwhFwUOapQYZcqCjVVUA.ttf", + "700": "https://fonts.gstatic.com/s/kulimpark/v15/fdN49secq3hflz1Uu3IwjOIJwa5aZbUvGjU.ttf", + "700italic": "https://fonts.gstatic.com/s/kulimpark/v15/fdNm9secq3hflz1Uu3IwhFwUXatQYZcqCjVVUA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kulimpark/v15/fdN79secq3hflz1Uu3IwhF8s4Q.ttf" + }, + { + "family": "Kumar One", + "variants": [ + "regular" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/kumarone/v25/bMr1mS-P958wYi6YaGeGNO6WU3oT0g.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kumarone/v25/bMr1mS-P958wYi6YaGe2NeSS.ttf" + }, + { + "family": "Kumar One Outline", + "variants": [ + "regular" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/kumaroneoutline/v20/Noao6VH62pyLP0fsrZ-v18wlUEcX9zDwRQu8EGKF.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kumaroneoutline/v20/Noao6VH62pyLP0fsrZ-v18wlUEcX9wDxTw8.ttf" + }, + { + "family": "Kumbh Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQkZcA8bTuUkqaLg.ttf", + "200": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQEZYA8bTuUkqaLg.ttf", + "300": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQz5YA8bTuUkqaLg.ttf", + "regular": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQkZYA8bTuUkqaLg.ttf", + "500": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQo5YA8bTuUkqaLg.ttf", + "600": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQT5EA8bTuUkqaLg.ttf", + "700": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQdpEA8bTuUkqaLg.ttf", + "800": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQEZEA8bTuUkqaLg.ttf", + "900": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQOJEA8bTuUkqaLg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kumbhsans/v27/c4mP1n92AsfhuCq6tVsaoIx1LQICk0boNoq0SjlDfnzKo-bF3mdQkZYw8L7q.ttf" + }, + { + "family": "Kurale", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "devanagari", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/kurale/v14/4iCs6KV9e9dXjho6eAT3v02QFg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/kurale/v14/4iCs6KV9e9dXjhoKeQ7z.ttf" + }, + { + "family": "LXGW Marker Gothic", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "symbols2", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-06-12", + "files": { + "regular": "https://fonts.gstatic.com/s/lxgwmarkergothic/v1/Gg8oN4AaXyDVTi_NlS1-xCtMQxY3lToBjuw_cZe26Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lxgwmarkergothic/v1/Gg8oN4AaXyDVTi_NlS1-xCtMQxY3lToxj-Y7.ttf" + }, + { + "family": "LXGW WenKai Mono TC", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "lisu", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-06-09", + "files": { + "300": "https://fonts.gstatic.com/s/lxgwwenkaimonotc/v9/pxiVyos4iPVgyWx9WtufHnsIf5nkaB0HssKqhvJljXmo2SA.ttf", + "regular": "https://fonts.gstatic.com/s/lxgwwenkaimonotc/v9/pxiYyos4iPVgyWx9WtufHnsIf5nkaB0Him6CovpOkXA.ttf", + "700": "https://fonts.gstatic.com/s/lxgwwenkaimonotc/v9/pxiVyos4iPVgyWx9WtufHnsIf5nkaB0HstKthvJljXmo2SA.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lxgwwenkaimonotc/v9/pxiYyos4iPVgyWx9WtufHnsIf5nkaB0Hum-Ipg.ttf" + }, + { + "family": "LXGW WenKai TC", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "lisu", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-06-09", + "files": { + "300": "https://fonts.gstatic.com/s/lxgwwenkaitc/v9/w8gAH20td8wNsI3f40DmtXZb4_MmBfkpTClICyan.ttf", + "regular": "https://fonts.gstatic.com/s/lxgwwenkaitc/v9/w8gDH20td8wNsI3f40DmtXZb48uKLd0hZzVB.ttf", + "700": "https://fonts.gstatic.com/s/lxgwwenkaitc/v9/w8gAH20td8wNsI3f40DmtXZb4_M2AvkpTClICyan.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lxgwwenkaitc/v9/w8gDH20td8wNsI3f40DmtXZb4_uLJ9k.ttf" + }, + { + "family": "La Belle Aurore", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/labelleaurore/v23/RrQIbot8-mNYKnGNDkWlocovHeIIG-eFNVmULg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/labelleaurore/v23/RrQIbot8-mNYKnGNDkWlocovHeI4Gu2B.ttf" + }, + { + "family": "Labrada", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9VTSgM4QPdUej17.ttf", + "200": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9XTSwM4QPdUej17.ttf", + "300": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9UNSwM4QPdUej17.ttf", + "regular": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9VTSwM4QPdUej17.ttf", + "500": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9VhSwM4QPdUej17.ttf", + "600": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9WNTAM4QPdUej17.ttf", + "700": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9W0TAM4QPdUej17.ttf", + "800": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9XTTAM4QPdUej17.ttf", + "900": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9X6TAM4QPdUej17.ttf", + "100italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCOt6SvN2fy17-dE.ttf", + "200italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCGt7SvN2fy17-dE.ttf", + "300italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCLV7SvN2fy17-dE.ttf", + "italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCOt7SvN2fy17-dE.ttf", + "500italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCNl7SvN2fy17-dE.ttf", + "600italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCDV8SvN2fy17-dE.ttf", + "700italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCAx8SvN2fy17-dE.ttf", + "800italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCGt8SvN2fy17-dE.ttf", + "900italic": "https://fonts.gstatic.com/s/labrada/v4/ieVv2Y9HLWefIpOyPVxQIkLq2VfhwMCbCEJ8SvN2fy17-dE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/labrada/v4/ieVh2Y9HLWefIpOyF1Vi3ZqDss1Px9VTSzM5SvM.ttf" + }, + { + "family": "Lacquer", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/lacquer/v16/EYqzma1QwqpG4_BBB7-AXhttQ5I.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lacquer/v16/EYqzma1QwqpG4_BBN76KWg.ttf" + }, + { + "family": "Laila", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-06-25", + "files": { + "300": "https://fonts.gstatic.com/s/laila/v20/LYjBdG_8nE8jDLzxogNAh14nVcfe.ttf", + "regular": "https://fonts.gstatic.com/s/laila/v20/LYjMdG_8nE8jDIRdiidIrEIu.ttf", + "500": "https://fonts.gstatic.com/s/laila/v20/LYjBdG_8nE8jDLypowNAh14nVcfe.ttf", + "600": "https://fonts.gstatic.com/s/laila/v20/LYjBdG_8nE8jDLyFpANAh14nVcfe.ttf", + "700": "https://fonts.gstatic.com/s/laila/v20/LYjBdG_8nE8jDLzhpQNAh14nVcfe.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/laila/v20/LYjMdG_8nE8jDLRcgCM.ttf" + }, + { + "family": "Lakki Reddy", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/lakkireddy/v25/S6u5w49MUSzD9jlCPmvLZQfox9k97-xZ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lakkireddy/v25/S6u5w49MUSzD9jlCPmvLZTfpzd0.ttf" + }, + { + "family": "Lalezar", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/lalezar/v16/zrfl0HLVx-HwTP82UaDyIiL0RCg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lalezar/v16/zrfl0HLVx-HwTP82YaH4Jg.ttf" + }, + { + "family": "Lancelot", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/lancelot/v28/J7acnppxBGtQEulG4JY4xJ9CGyAa.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lancelot/v28/J7acnppxBGtQEulG4KY5zps.ttf" + }, + { + "family": "Langar", + "variants": [ + "regular" + ], + "subsets": [ + "gurmukhi", + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/langar/v30/kJEyBukW7AIlgjGVrTVZ99sqrQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/langar/v30/kJEyBukW7AIlgjGlrD9d.ttf" + }, + { + "family": "Lateef", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v35", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0bjygbqTb9nQ-RA.ttf", + "300": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0Cj-gbqTb9nQ-RA.ttf", + "regular": "https://fonts.gstatic.com/s/lateef/v35/hESw6XVnNCxEvkbMpheEZo_H_w.ttf", + "500": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0Uj6gbqTb9nQ-RA.ttf", + "600": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0fjmgbqTb9nQ-RA.ttf", + "700": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0GjigbqTb9nQ-RA.ttf", + "800": "https://fonts.gstatic.com/s/lateef/v35/hESz6XVnNCxEvkb0BjugbqTb9nQ-RA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lateef/v35/hESw6XVnNCxEvkb8px2A.ttf" + }, + { + "family": "Lato", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/lato/v25/S6u8w4BMUTPHh30wWyWrFCbw7A.ttf", + "100italic": "https://fonts.gstatic.com/s/lato/v25/S6u-w4BMUTPHjxsIPy-vNiPg7MU0.ttf", + "300": "https://fonts.gstatic.com/s/lato/v25/S6u9w4BMUTPHh7USew-FGC_p9dw.ttf", + "300italic": "https://fonts.gstatic.com/s/lato/v25/S6u_w4BMUTPHjxsI9w2PHA3s5dwt7w.ttf", + "regular": "https://fonts.gstatic.com/s/lato/v25/S6uyw4BMUTPHvxk6XweuBCY.ttf", + "italic": "https://fonts.gstatic.com/s/lato/v25/S6u8w4BMUTPHjxswWyWrFCbw7A.ttf", + "700": "https://fonts.gstatic.com/s/lato/v25/S6u9w4BMUTPHh6UVew-FGC_p9dw.ttf", + "700italic": "https://fonts.gstatic.com/s/lato/v25/S6u_w4BMUTPHjxsI5wqPHA3s5dwt7w.ttf", + "900": "https://fonts.gstatic.com/s/lato/v25/S6u9w4BMUTPHh50Xew-FGC_p9dw.ttf", + "900italic": "https://fonts.gstatic.com/s/lato/v25/S6u_w4BMUTPHjxsI3wiPHA3s5dwt7w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lato/v25/S6uyw4BMUTPHjxgwWw.ttf" + }, + { + "family": "Lavishly Yours", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/lavishlyyours/v7/jizDREVIvGwH5OjiZmX9r5z_WxUY0TY7ikbI.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lavishlyyours/v7/jizDREVIvGwH5OjiZmX9r5z_WyUZ2zI.ttf" + }, + { + "family": "League Gothic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/leaguegothic/v13/qFdR35CBi4tvBz81xy7WG7ep-BQAY7Krj7feObpH_-amidQ6Q9hn.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/leaguegothic/v13/qFdR35CBi4tvBz81xy7WG7ep-BQAY7Krj7feObpH_9ang9A.ttf" + }, + { + "family": "League Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v30", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/leaguescript/v30/CSR54zpSlumSWj9CGVsoBZdeaNNUuOwkC2s.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/leaguescript/v30/CSR54zpSlumSWj9CGVsoBZdeWNJevA.ttf" + }, + { + "family": "League Spartan", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvM_oXpBMdcFguczA.ttf", + "200": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMfoTpBMdcFguczA.ttf", + "300": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMoITpBMdcFguczA.ttf", + "regular": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvM_oTpBMdcFguczA.ttf", + "500": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMzITpBMdcFguczA.ttf", + "600": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMIIPpBMdcFguczA.ttf", + "700": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMGYPpBMdcFguczA.ttf", + "800": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMfoPpBMdcFguczA.ttf", + "900": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvMV4PpBMdcFguczA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/leaguespartan/v15/kJEnBuEW6A0lliaV_m88ja5Twtx8BWhtkDVmjZvM_oTZBc1Y.ttf" + }, + { + "family": "Leckerli One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/leckerlione/v22/V8mCoQH8VCsNttEnxnGQ-1itLZxcBtItFw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/leckerlione/v22/V8mCoQH8VCsNttEnxnGQ-1idLJZY.ttf" + }, + { + "family": "Ledger", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/ledger/v17/j8_q6-HK1L3if_sxm8DwHTBhHw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ledger/v17/j8_q6-HK1L3if_sBmsr0.ttf" + }, + { + "family": "Lekton", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/lekton/v21/SZc43FDmLaWmWpBeXxfonUPL6Q.ttf", + "italic": "https://fonts.gstatic.com/s/lekton/v21/SZc63FDmLaWmWpBuXR3sv0bb6StO.ttf", + "700": "https://fonts.gstatic.com/s/lekton/v21/SZc73FDmLaWmWpBm4zjMlWjX4DJXgQ.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lekton/v21/SZc43FDmLaWmWpBuXh3s.ttf" + }, + { + "family": "Lemon", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/lemon/v19/HI_EiYEVKqRMq0jBSZXAQ4-d.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lemon/v19/HI_EiYEVKqRMq3jAQ5E.ttf" + }, + { + "family": "Lemonada", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v31", + "lastModified": "2025-09-02", + "files": { + "300": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGJOt2mfWc3Z2pTg.ttf", + "regular": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGeut2mfWc3Z2pTg.ttf", + "500": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGSOt2mfWc3Z2pTg.ttf", + "600": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGpOx2mfWc3Z2pTg.ttf", + "700": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGnex2mfWc3Z2pTg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lemonada/v31/0QI-MXFD9oygTWy_R-FFlwV-bgfR7QJGeutGmP-Y.ttf" + }, + { + "family": "Lexend", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WCzsX_LBte6KuGEo.ttf", + "200": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC7sW_LBte6KuGEo.ttf", + "300": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC2UW_LBte6KuGEo.ttf", + "regular": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WCzsW_LBte6KuGEo.ttf", + "500": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WCwkW_LBte6KuGEo.ttf", + "600": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC-UR_LBte6KuGEo.ttf", + "700": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC9wR_LBte6KuGEo.ttf", + "800": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC7sR_LBte6KuGEo.ttf", + "900": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WC5IR_LBte6KuGEo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lexend/v26/wlptgwvFAVdoq2_F94zlCfv0bz1WCzsWzLFnfw.ttf" + }, + { + "family": "Lexend Deca", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U48MxArBPCqLNflg.ttf", + "200": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4cM1ArBPCqLNflg.ttf", + "300": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4rs1ArBPCqLNflg.ttf", + "regular": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U48M1ArBPCqLNflg.ttf", + "500": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4ws1ArBPCqLNflg.ttf", + "600": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4LspArBPCqLNflg.ttf", + "700": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4F8pArBPCqLNflg.ttf", + "800": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4cMpArBPCqLNflg.ttf", + "900": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U4WcpArBPCqLNflg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lexenddeca/v25/K2FifZFYk-dHSE0UPPuwQ7CrD94i-NCKm-U48M1wrRnG.ttf" + }, + { + "family": "Lexend Exa", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v35", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9r7T6bHHJ8BRq0b.ttf", + "200": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9p7TqbHHJ8BRq0b.ttf", + "300": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9qlTqbHHJ8BRq0b.ttf", + "regular": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9r7TqbHHJ8BRq0b.ttf", + "500": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9rJTqbHHJ8BRq0b.ttf", + "600": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9olSabHHJ8BRq0b.ttf", + "700": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9ocSabHHJ8BRq0b.ttf", + "800": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9p7SabHHJ8BRq0b.ttf", + "900": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9pSSabHHJ8BRq0b.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lexendexa/v35/UMBCrPdOoHOnxExyjdBeQCH18mulUxBvI9r7TpbGFps.ttf" + }, + { + "family": "Lexend Giga", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRC2LmE68oo6eepYQ.ttf", + "200": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCWLiE68oo6eepYQ.ttf", + "300": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRChriE68oo6eepYQ.ttf", + "regular": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRC2LiE68oo6eepYQ.ttf", + "500": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRC6riE68oo6eepYQ.ttf", + "600": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCBr-E68oo6eepYQ.ttf", + "700": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCP7-E68oo6eepYQ.ttf", + "800": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCWL-E68oo6eepYQ.ttf", + "900": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRCcb-E68oo6eepYQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lexendgiga/v27/PlIuFl67Mah5Y8yMHE7lkUZPlTBo4MWFfNRC2Li06sAs.ttf" + }, + { + "family": "Lexend Mega", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDL8fivveyiq9EqQw.ttf", + "200": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLcfmvveyiq9EqQw.ttf", + "300": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLr_mvveyiq9EqQw.ttf", + "regular": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDL8fmvveyiq9EqQw.ttf", + "500": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLw_mvveyiq9EqQw.ttf", + "600": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLL_6vveyiq9EqQw.ttf", + "700": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLFv6vveyiq9EqQw.ttf", + "800": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLcf6vveyiq9EqQw.ttf", + "900": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDLWP6vveyiq9EqQw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lexendmega/v27/qFdX35aBi5JtHD41zSTFEuTByuvYFuE9IbDL8fmfvOam.ttf" + }, + { + "family": "Lexend Peta", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgR6SFyW1YuRTsnfw.ttf", + "200": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRaSByW1YuRTsnfw.ttf", + "300": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRtyByW1YuRTsnfw.ttf", + "regular": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgR6SByW1YuRTsnfw.ttf", + "500": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgR2yByW1YuRTsnfw.ttf", + "600": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRNydyW1YuRTsnfw.ttf", + "700": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRDidyW1YuRTsnfw.ttf", + "800": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRaSdyW1YuRTsnfw.ttf", + "900": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgRQCdyW1YuRTsnfw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lexendpeta/v30/BXR4vFPGjeLPh0kCfI4OkFX-UTQHSCaxvBgR6SBCWlwq.ttf" + }, + { + "family": "Lexend Tera", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiM5zITdpz0fYxcrQ.ttf", + "200": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMZzMTdpz0fYxcrQ.ttf", + "300": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMuTMTdpz0fYxcrQ.ttf", + "regular": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiM5zMTdpz0fYxcrQ.ttf", + "500": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiM1TMTdpz0fYxcrQ.ttf", + "600": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMOTQTdpz0fYxcrQ.ttf", + "700": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMADQTdpz0fYxcrQ.ttf", + "800": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMZzQTdpz0fYxcrQ.ttf", + "900": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiMTjQTdpz0fYxcrQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lexendtera/v29/RrQDbo98_jt_IXnBPwCWtYJLZ3P4hnaGKFiM5zMjd5bw.ttf" + }, + { + "family": "Lexend Zetta", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v32", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy9bH0z5jbs8qbts.ttf", + "200": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy1bG0z5jbs8qbts.ttf", + "300": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy4jG0z5jbs8qbts.ttf", + "regular": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy9bG0z5jbs8qbts.ttf", + "500": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy-TG0z5jbs8qbts.ttf", + "600": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCywjB0z5jbs8qbts.ttf", + "700": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCyzHB0z5jbs8qbts.ttf", + "800": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy1bB0z5jbs8qbts.ttf", + "900": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy3_B0z5jbs8qbts.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lexendzetta/v32/ll8uK2KYXje7CdOFnEWcU8synQbuVYjYB3BCy9bG4z9pag.ttf" + }, + { + "family": "Libertinus Keyboard", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/libertinuskeyboard/v2/NaPEcYrQAP5Z2JsyIac0i2DYHaapaf43RryztWo_3fk.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/libertinuskeyboard/v2/NaPEcYrQAP5Z2JsyIac0i2DYHaapaf43dr25sQ.ttf" + }, + { + "family": "Libertinus Math", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "math", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/libertinusmath/v1/Gw6iwc3770TVMoHVurPejWtfenRLv_KJt3R-2Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/libertinusmath/v1/Gw6iwc3770TVMoHVurPejWtfenR7vviN.ttf" + }, + { + "family": "Libertinus Mono", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/libertinusmono/v1/_gPg1RnxrjY_TDm97ApTqwneJJFToBF3YROW_w.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/libertinusmono/v1/_gPg1RnxrjY_TDm97ApTqwneJJFjoRtz.ttf" + }, + { + "family": "Libertinus Sans", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-07-30", + "files": { + "regular": "https://fonts.gstatic.com/s/libertinussans/v1/YA9Lr0-a6k7ZLbw_dle4knJh2cqMjt3V_dB0Yw.ttf", + "italic": "https://fonts.gstatic.com/s/libertinussans/v1/YA9Jr0-a6k7ZLbw_dle4knJh2cq8jNfR39VkYzCp.ttf", + "700": "https://fonts.gstatic.com/s/libertinussans/v1/YA9Or0-a6k7ZLbw_dle4knJh2cq0MvLx9ftoaimwmw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/libertinussans/v1/YA9Lr0-a6k7ZLbw_dle4knJh2cq8j9fR.ttf" + }, + { + "family": "Libertinus Serif", + "variants": [ + "regular", + "italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-07-30", + "files": { + "regular": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpkK4bw7KinajYBg0RTTwCLF5Ben6kFUHPIFaU.ttf", + "italic": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpiK4bw7KinajYBg0RTTwCLF5Ber6sPVFHNBaVImA.ttf", + "600": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpjK4bw7KinajYBg0RTTwCLF5Bep3ErdHvjCaxRgew.ttf", + "600italic": "https://fonts.gstatic.com/s/libertinusserif/v1/RLphK4bw7KinajYBg0RTTwCLF5Ber6s3jH_pDY5UkexwPg.ttf", + "700": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpjK4bw7KinajYBg0RTTwCLF5BepxUqdHvjCaxRgew.ttf", + "700italic": "https://fonts.gstatic.com/s/libertinusserif/v1/RLphK4bw7KinajYBg0RTTwCLF5Ber6s36H7pDY5UkexwPg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/libertinusserif/v1/RLpkK4bw7KinajYBg0RTTwCLF5Ber6gPVA.ttf" + }, + { + "family": "Libertinus Serif Display", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/libertinusserifdisplay/v2/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcrg81gHhVOxQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/libertinusserifdisplay/v2/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbgsdk.ttf" + }, + { + "family": "Libre Barcode 128", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v31", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/librebarcode128/v31/cIfnMbdUsUoiW3O_hVviCwVjuLtXeJ_A_gMk0izH.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librebarcode128/v31/cIfnMbdUsUoiW3O_hVviCwVjuLtXeK_B9Ac.ttf" + }, + { + "family": "Libre Barcode 128 Text", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v31", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/librebarcode128text/v31/fdNv9tubt3ZEnz1Gu3I4-zppwZ9CWZ16Z0w5cV3Y6M90w4k.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librebarcode128text/v31/fdNv9tubt3ZEnz1Gu3I4-zppwZ9CWZ16Z0w5QVzS7A.ttf" + }, + { + "family": "Libre Barcode 39", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v25", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/librebarcode39/v25/-nFnOHM08vwC6h8Li1eQnP_AHzI2K_d709jy92k.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librebarcode39/v25/-nFnOHM08vwC6h8Li1eQnP_AHzI2G_Zx1w.ttf" + }, + { + "family": "Libre Barcode 39 Extended", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v30", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/librebarcode39extended/v30/8At7Gt6_O5yNS0-K4Nf5U922qSzhJ3dUdfJpwNUgfNRCOZ1GOBw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librebarcode39extended/v30/8At7Gt6_O5yNS0-K4Nf5U922qSzhJ3dUdfJpwNUgTNVIPQ.ttf" + }, + { + "family": "Libre Barcode 39 Extended Text", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v30", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/librebarcode39extendedtext/v30/eLG1P_rwIgOiDA7yrs9LoKaYRVLQ1YldrrOnnL7xPO4jNP68fLIiPopNNA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librebarcode39extendedtext/v30/eLG1P_rwIgOiDA7yrs9LoKaYRVLQ1YldrrOnnL7xPO4jNP6Mfbgm.ttf" + }, + { + "family": "Libre Barcode 39 Text", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v32", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/librebarcode39text/v32/sJoa3KhViNKANw_E3LwoDXvs5Un0HQ1vT-031RRL-9rYaw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librebarcode39text/v32/sJoa3KhViNKANw_E3LwoDXvs5Un0HQ1vT-0H1B5P.ttf" + }, + { + "family": "Libre Barcode EAN13 Text", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v25", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/librebarcodeean13text/v25/wlpigxXFDU1_oCu9nfZytgIqSG0XRcJm_OQiB96PAGEki52WfA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librebarcodeean13text/v25/wlpigxXFDU1_oCu9nfZytgIqSG0XRcJm_OQiB96_AWsg.ttf" + }, + { + "family": "Libre Baskerville", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-11-20", + "files": { + "regular": "https://fonts.gstatic.com/s/librebaskerville/v24/kmKUZrc3Hgbbcjq75U4uslyuy4kn0olVQ-LglH6T17uj8Q4SCQlOvuPCfQ.ttf", + "500": "https://fonts.gstatic.com/s/librebaskerville/v24/kmKUZrc3Hgbbcjq75U4uslyuy4kn0olVQ-LglH6T17ujww4SCQlOvuPCfQ.ttf", + "600": "https://fonts.gstatic.com/s/librebaskerville/v24/kmKUZrc3Hgbbcjq75U4uslyuy4kn0olVQ-LglH6T17ujLwkSCQlOvuPCfQ.ttf", + "700": "https://fonts.gstatic.com/s/librebaskerville/v24/kmKUZrc3Hgbbcjq75U4uslyuy4kn0olVQ-LglH6T17ujFgkSCQlOvuPCfQ.ttf", + "italic": "https://fonts.gstatic.com/s/librebaskerville/v24/kmKWZrc3Hgbbcjq75U4uslyuy4kn0qNccR04_RUJeby2OU36SgNKnObSfbge.ttf", + "500italic": "https://fonts.gstatic.com/s/librebaskerville/v24/kmKWZrc3Hgbbcjq75U4uslyuy4kn0qNccR04_RUJeby2OU3ISgNKnObSfbge.ttf", + "600italic": "https://fonts.gstatic.com/s/librebaskerville/v24/kmKWZrc3Hgbbcjq75U4uslyuy4kn0qNccR04_RUJeby2OU0kTQNKnObSfbge.ttf", + "700italic": "https://fonts.gstatic.com/s/librebaskerville/v24/kmKWZrc3Hgbbcjq75U4uslyuy4kn0qNccR04_RUJeby2OU0dTQNKnObSfbge.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librebaskerville/v24/kmKUZrc3Hgbbcjq75U4uslyuy4kn0olVQ-LglH6T17uj8Q4iCANK.ttf" + }, + { + "family": "Libre Bodoni", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6I1fwWzZcOb3U3s.ttf", + "500": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6L9fwWzZcOb3U3s.ttf", + "600": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6FNYwWzZcOb3U3s.ttf", + "700": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6GpYwWzZcOb3U3s.ttf", + "italic": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm4-H45qDWDYULr5OfyZud9xBKfuwNnnsVZ_UUcKS_TdMTyQ3syLg.ttf", + "500italic": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm4-H45qDWDYULr5OfyZud9xBKfuwNnnsVZ_UUcGy_TdMTyQ3syLg.ttf", + "600italic": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm4-H45qDWDYULr5OfyZud9xBKfuwNnnsVZ_UUc9yjTdMTyQ3syLg.ttf", + "700italic": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm4-H45qDWDYULr5OfyZud9xBKfuwNnnsVZ_UUczijTdMTyQ3syLg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librebodoni/v9/_Xm--H45qDWDYULr5OfyZudXzSBgY2oMBGte6I1f8W3TdA.ttf" + }, + { + "family": "Libre Caslon Display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/librecaslondisplay/v18/TuGOUUFxWphYQ6YI6q9Xp61FQzxDRKmzr2lRdRhtCC4d.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librecaslondisplay/v18/TuGOUUFxWphYQ6YI6q9Xp61FQzxDRKmzr1lQfxw.ttf" + }, + { + "family": "Libre Caslon Text", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/librecaslontext/v5/DdT878IGsGw1aF1JU10PUbTvNNaDMcq_3eNrHgO1.ttf", + "italic": "https://fonts.gstatic.com/s/librecaslontext/v5/DdT678IGsGw1aF1JU10PUbTvNNaDMfq91-dJGxO1q9o.ttf", + "700": "https://fonts.gstatic.com/s/librecaslontext/v5/DdT578IGsGw1aF1JU10PUbTvNNaDMfID8sdjNR-8ssPt.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librecaslontext/v5/DdT878IGsGw1aF1JU10PUbTvNNaDMfq-1-c.ttf" + }, + { + "family": "Libre Franklin", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhLsSUB9rIb-JH1g.ttf", + "200": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhrsWUB9rIb-JH1g.ttf", + "300": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhcMWUB9rIb-JH1g.ttf", + "regular": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhLsWUB9rIb-JH1g.ttf", + "500": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhHMWUB9rIb-JH1g.ttf", + "600": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduh8MKUB9rIb-JH1g.ttf", + "700": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhycKUB9rIb-JH1g.ttf", + "800": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhrsKUB9rIb-JH1g.ttf", + "900": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhh8KUB9rIb-JH1g.ttf", + "100italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oZ8RdDMTedX1sGE.ttf", + "200italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05ob8RNDMTedX1sGE.ttf", + "300italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oYiRNDMTedX1sGE.ttf", + "italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oZ8RNDMTedX1sGE.ttf", + "500italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oZORNDMTedX1sGE.ttf", + "600italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oaiQ9DMTedX1sGE.ttf", + "700italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oabQ9DMTedX1sGE.ttf", + "800italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05ob8Q9DMTedX1sGE.ttf", + "900italic": "https://fonts.gstatic.com/s/librefranklin/v20/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05obVQ9DMTedX1sGE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/librefranklin/v20/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhLsWkBtDM.ttf" + }, + { + "family": "Licorice", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/licorice/v8/t5tjIR8TMomTCAyjNk23hqLgzCHu.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/licorice/v8/t5tjIR8TMomTCAyjNn22jKY.ttf" + }, + { + "family": "Life Savers", + "variants": [ + "regular", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/lifesavers/v23/ZXuie1UftKKabUQMgxAal_lrFgpbuNvB.ttf", + "700": "https://fonts.gstatic.com/s/lifesavers/v23/ZXu_e1UftKKabUQMgxAal8HXOS5Tk8fIpPRW.ttf", + "800": "https://fonts.gstatic.com/s/lifesavers/v23/ZXu_e1UftKKabUQMgxAal8HLOi5Tk8fIpPRW.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lifesavers/v23/ZXuie1UftKKabUQMgxAal8lqHA4.ttf" + }, + { + "family": "Lilita One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/lilitaone/v17/i7dPIFZ9Zz-WBtRtedDbUEZ2RFq7AwU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lilitaone/v17/i7dPIFZ9Zz-WBtRtedDbYEd8QA.ttf" + }, + { + "family": "Lily Script One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/lilyscriptone/v16/LhW9MV7ZMfIPdMxeBjBvFN8SXLS4gsSjQNsRMg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lilyscriptone/v16/LhW9MV7ZMfIPdMxeBjBvFN8SXLSIg86n.ttf" + }, + { + "family": "Limelight", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/limelight/v21/XLYkIZL7aopJVbZJHDuYPeNGrnY2TA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/limelight/v21/XLYkIZL7aopJVbZJHDuoPOlC.ttf" + }, + { + "family": "Linden Hill", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/lindenhill/v27/-F61fjxoKSg9Yc3hZgO8ygFI7CwC009k.ttf", + "italic": "https://fonts.gstatic.com/s/lindenhill/v27/-F63fjxoKSg9Yc3hZgO8yjFK5igg1l9kn-s.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lindenhill/v27/-F61fjxoKSg9Yc3hZgO8yjFJ5ig.ttf" + }, + { + "family": "Linefont", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2025-09-17", + "files": { + "100": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY4UNbu7tmdXux3U.ttf", + "200": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnYwUMbu7tmdXux3U.ttf", + "300": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY9sMbu7tmdXux3U.ttf", + "regular": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY4UMbu7tmdXux3U.ttf", + "500": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY7cMbu7tmdXux3U.ttf", + "600": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY1sLbu7tmdXux3U.ttf", + "700": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY2ILbu7tmdXux3U.ttf", + "800": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnYwULbu7tmdXux3U.ttf", + "900": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnYywLbu7tmdXux3U.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/linefont/v10/dg4I_pzpoqcLKUIzVfFMh1TF2rkhli25jn7CKTTWSumsFuSnY4UMXu_nnQ.ttf" + }, + { + "family": "Lisu Bosa", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "lisu" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "200": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXX2DGRdbY1P1Sbg.ttf", + "200italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXkuRNzc9vhCblye.ttf", + "300": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXO2PGRdbY1P1Sbg.ttf", + "300italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXlKR9zc9vhCblye.ttf", + "regular": "https://fonts.gstatic.com/s/lisubosa/v2/3XFoErkv240fsdmJRJQvl0viTf3E3Q.ttf", + "italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFuErkv240fsdmJRJQflUHmb_jU3eRL.ttf", + "500": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXY2LGRdbY1P1Sbg.ttf", + "500italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXkSRtzc9vhCblye.ttf", + "600": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXT2XGRdbY1P1Sbg.ttf", + "600italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXk-Qdzc9vhCblye.ttf", + "700": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXK2TGRdbY1P1Sbg.ttf", + "700italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXlaQNzc9vhCblye.ttf", + "800": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXN2fGRdbY1P1Sbg.ttf", + "800italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXlGQ9zc9vhCblye.ttf", + "900": "https://fonts.gstatic.com/s/lisubosa/v2/3XFtErkv240fsdmJRJQXE2bGRdbY1P1Sbg.ttf", + "900italic": "https://fonts.gstatic.com/s/lisubosa/v2/3XFzErkv240fsdmJRJQflXliQtzc9vhCblye.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lisubosa/v2/3XFoErkv240fsdmJRJQflkHm.ttf" + }, + { + "family": "Liter", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/liter/v4/SLXGc1nX4GQ4d2ImRJqExst1.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/liter/v4/SLXGc1nX4GQ4d1InTp4.ttf" + }, + { + "family": "Literata", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v40", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbJG_F_bcTWCWp8g.ttf", + "300": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbE-_F_bcTWCWp8g.ttf", + "regular": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbBG_F_bcTWCWp8g.ttf", + "500": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbCO_F_bcTWCWp8g.ttf", + "600": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbM-4F_bcTWCWp8g.ttf", + "700": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbPa4F_bcTWCWp8g.ttf", + "800": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbJG4F_bcTWCWp8g.ttf", + "900": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbLi4F_bcTWCWp8g.ttf", + "200italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8f7XWSUKTt8iVow.ttf", + "300italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8obXWSUKTt8iVow.ttf", + "italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8_7XWSUKTt8iVow.ttf", + "500italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8zbXWSUKTt8iVow.ttf", + "600italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8IbLWSUKTt8iVow.ttf", + "700italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8GLLWSUKTt8iVow.ttf", + "800italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8f7LWSUKTt8iVow.ttf", + "900italic": "https://fonts.gstatic.com/s/literata/v40/or3NQ6P12-iJxAIgLYT1PLs1Zd0nfUwAbeGVKoRYzNiCp1OUedn8VrLWSUKTt8iVow.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/literata/v40/or3PQ6P12-iJxAIgLa78DkrbXsDgk0oVDaDPYLanFLHpPf2TbBG_J_fWSQ.ttf" + }, + { + "family": "Liu Jian Mao Cao", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-simplified", + "latin" + ], + "version": "v24", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/liujianmaocao/v24/845DNN84HJrccNonurqXILGpvCOoferVKGWsUo8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/liujianmaocao/v24/845DNN84HJrccNonurqXILGpvCOoTevfLA.ttf" + }, + { + "family": "Livvic", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/livvic/v15/rnCr-x1S2hzjrlffC-M-mHnOSOuk.ttf", + "100italic": "https://fonts.gstatic.com/s/livvic/v15/rnCt-x1S2hzjrlfXbdtakn3sTfukQHs.ttf", + "200": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlffp8IeslfCQfK9WQ.ttf", + "200italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbdv2s13GY_etWWIJ.ttf", + "300": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlffw8EeslfCQfK9WQ.ttf", + "300italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbduSsF3GY_etWWIJ.ttf", + "regular": "https://fonts.gstatic.com/s/livvic/v15/rnCp-x1S2hzjrlfnb-k6unzeSA.ttf", + "italic": "https://fonts.gstatic.com/s/livvic/v15/rnCr-x1S2hzjrlfXbeM-mHnOSOuk.ttf", + "500": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlffm8AeslfCQfK9WQ.ttf", + "500italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbdvKsV3GY_etWWIJ.ttf", + "600": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlfft8ceslfCQfK9WQ.ttf", + "600italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbdvmtl3GY_etWWIJ.ttf", + "700": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlff08YeslfCQfK9WQ.ttf", + "700italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbduCt13GY_etWWIJ.ttf", + "900": "https://fonts.gstatic.com/s/livvic/v15/rnCq-x1S2hzjrlff68QeslfCQfK9WQ.ttf", + "900italic": "https://fonts.gstatic.com/s/livvic/v15/rnCs-x1S2hzjrlfXbdu6tV3GY_etWWIJ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/livvic/v15/rnCp-x1S2hzjrlfXbuM-.ttf" + }, + { + "family": "Lobster", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v32", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/lobster/v32/neILzCirqoswsqX9_oWsMqEzSJQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lobster/v32/neILzCirqoswsqX9zoSmNg.ttf" + }, + { + "family": "Lobster Two", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/lobstertwo/v22/BngMUXZGTXPUvIoyV6yN59fK7KSJ4ACD.ttf", + "italic": "https://fonts.gstatic.com/s/lobstertwo/v22/BngOUXZGTXPUvIoyV6yN5-fI5qCr5RCDY_k.ttf", + "700": "https://fonts.gstatic.com/s/lobstertwo/v22/BngRUXZGTXPUvIoyV6yN5-92w4CByxyKeuDp.ttf", + "700italic": "https://fonts.gstatic.com/s/lobstertwo/v22/BngTUXZGTXPUvIoyV6yN5-fI3hyEwRiof_DpXMY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lobstertwo/v22/BngMUXZGTXPUvIoyV6yN5-fL5qA.ttf" + }, + { + "family": "Londrina Outline", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v29", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/londrinaoutline/v29/C8c44dM8vmb14dfsZxhetg3pDH-SfuoxrSKMDvI.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/londrinaoutline/v29/C8c44dM8vmb14dfsZxhetg3pDH-STus7qQ.ttf" + }, + { + "family": "Londrina Shadow", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/londrinashadow/v28/oPWX_kB4kOQoWNJmjxLV5JuoCUlXRlaSxkrMCQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/londrinashadow/v28/oPWX_kB4kOQoWNJmjxLV5JuoCUlnR1yW.ttf" + }, + { + "family": "Londrina Sketch", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/londrinasketch/v27/c4m41npxGMTnomOHtRU68eIJn8qfWWn5Pos6CA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/londrinasketch/v27/c4m41npxGMTnomOHtRU68eIJn8qvWGP9.ttf" + }, + { + "family": "Londrina Solid", + "variants": [ + "100", + "300", + "regular", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/londrinasolid/v19/flUjRq6sw40kQEJxWNgkLuudGfs9KBYesZHhV64.ttf", + "300": "https://fonts.gstatic.com/s/londrinasolid/v19/flUiRq6sw40kQEJxWNgkLuudGfv1CjY0n53oTrcL.ttf", + "regular": "https://fonts.gstatic.com/s/londrinasolid/v19/flUhRq6sw40kQEJxWNgkLuudGcNZIhI8tIHh.ttf", + "900": "https://fonts.gstatic.com/s/londrinasolid/v19/flUiRq6sw40kQEJxWNgkLuudGfvdDzY0n53oTrcL.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/londrinasolid/v19/flUhRq6sw40kQEJxWNgkLuudGfNYKBY.ttf" + }, + { + "family": "Long Cang", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-simplified", + "latin" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/longcang/v21/LYjAdGP8kkgoTec8zkRgrXArXN7HWQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/longcang/v21/LYjAdGP8kkgoTec8zkRQrHov.ttf" + }, + { + "family": "Lora", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v37", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787weuyJGmKxemMeZ.ttf", + "500": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787wsuyJGmKxemMeZ.ttf", + "600": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787zAvCJGmKxemMeZ.ttf", + "700": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787z5vCJGmKxemMeZ.ttf", + "italic": "https://fonts.gstatic.com/s/lora/v37/0QI8MX1D_JOuMw_hLdO6T2wV9KnW-MoFkqh8ndeZzZ0.ttf", + "500italic": "https://fonts.gstatic.com/s/lora/v37/0QI8MX1D_JOuMw_hLdO6T2wV9KnW-PgFkqh8ndeZzZ0.ttf", + "600italic": "https://fonts.gstatic.com/s/lora/v37/0QI8MX1D_JOuMw_hLdO6T2wV9KnW-BQCkqh8ndeZzZ0.ttf", + "700italic": "https://fonts.gstatic.com/s/lora/v37/0QI8MX1D_JOuMw_hLdO6T2wV9KnW-C0Ckqh8ndeZzZ0.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lora/v37/0QI6MX1D_JOuGQbT0gvTJPa787weuxJHkqg.ttf" + }, + { + "family": "Love Light", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/lovelight/v8/t5tlIR0TNJyZWimpNAXDjKbCyTHuspo.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lovelight/v8/t5tlIR0TNJyZWimpNAXDvKfIzQ.ttf" + }, + { + "family": "Love Ya Like A Sister", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/loveyalikeasister/v23/R70EjzUBlOqPeouhFDfR80-0FhOqJubN-Be78nZcsGGycA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/loveyalikeasister/v23/R70EjzUBlOqPeouhFDfR80-0FhOqJubN-BeL83xY.ttf" + }, + { + "family": "Loved by the King", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/lovedbytheking/v24/Gw6gwdP76VDVJNXerebZxUMeRXUF2PiNlXFu2R64.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lovedbytheking/v24/Gw6gwdP76VDVJNXerebZxUMeRXUF2MiMn3U.ttf" + }, + { + "family": "Lovers Quarrel", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/loversquarrel/v25/Yq6N-LSKXTL-5bCy8ksBzpQ_-zAsY7pO6siz.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/loversquarrel/v25/Yq6N-LSKXTL-5bCy8ksBzpQ_-wAtab4.ttf" + }, + { + "family": "Luckiest Guy", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/luckiestguy/v25/_gP_1RrxsjcxVyin9l9n_j2RStR3qDpraA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/luckiestguy/v25/_gP_1RrxsjcxVyin9l9n_j2hS95z.ttf" + }, + { + "family": "Lugrasimo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/lugrasimo/v5/qkBXXvoF_s_eT9c7Y7ae5JRLkAXbMQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lugrasimo/v5/qkBXXvoF_s_eT9c7Y7au5Z5P.ttf" + }, + { + "family": "Lumanosimo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/lumanosimo/v5/K2F0fZBYg_JDSEZHEfO8AoqKAyLzfWo.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lumanosimo/v5/K2F0fZBYg_JDSEZHEfO8MouABw.ttf" + }, + { + "family": "Lunasima", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/lunasima/v1/wEO-EBvPh9RSOj7JFAwle94H1VIe.ttf", + "700": "https://fonts.gstatic.com/s/lunasima/v1/wEO5EBvPh9RSOj7JFDSZVPoP_k4XiKvO.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lunasima/v1/wEO-EBvPh9RSOj7JFDwkcdo.ttf" + }, + { + "family": "Lusitana", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v14", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/lusitana/v14/CSR84z9ShvucWzsMKxhaRuMiSct_.ttf", + "700": "https://fonts.gstatic.com/s/lusitana/v14/CSR74z9ShvucWzsMKyDmaccqYtd2vfwk.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lusitana/v14/CSR84z9ShvucWzsMKyhbTOc.ttf" + }, + { + "family": "Lustria", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/lustria/v14/9oRONYodvDEyjuhOrCg5MtPyAcg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/lustria/v14/9oRONYodvDEyjuhOnCkzNg.ttf" + }, + { + "family": "Luxurious Roman", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v10", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/luxuriousroman/v10/buEupou_ZcP1w0yTKxJJokVSmbpqYgckeo9RMw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/luxuriousroman/v10/buEupou_ZcP1w0yTKxJJokVSmbpaYw0g.ttf" + }, + { + "family": "Luxurious Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/luxuriousscript/v9/ahcCv9e7yydulT32KZ0rBIoD7DzMg0rOby1JtYk.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/luxuriousscript/v9/ahcCv9e7yydulT32KZ0rBIoD7DzMs0vEaw.ttf" + }, + { + "family": "M PLUS 1", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5VSe78nZcsGGycA.ttf", + "200": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW51Sa78nZcsGGycA.ttf", + "300": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5Cya78nZcsGGycA.ttf", + "regular": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5VSa78nZcsGGycA.ttf", + "500": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5Zya78nZcsGGycA.ttf", + "600": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5iyG78nZcsGGycA.ttf", + "700": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5siG78nZcsGGycA.ttf", + "800": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW51SG78nZcsGGycA.ttf", + "900": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5_CG78nZcsGGycA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mplus1/v15/R70EjygA28ymD4HgBUGzkN5Eyoj-WpW5VSaL83xY.ttf" + }, + { + "family": "M PLUS 1 Code", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7iN0XHpapwmdZhY.ttf", + "200": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7gN0HHpapwmdZhY.ttf", + "300": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7jT0HHpapwmdZhY.ttf", + "regular": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7iN0HHpapwmdZhY.ttf", + "500": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7i_0HHpapwmdZhY.ttf", + "600": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7hT13HpapwmdZhY.ttf", + "700": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7hq13HpapwmdZhY.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mplus1code/v16/ypvMbXOOx2xFpzmYJS3N2_J2hBN6RZ5oIp8m_7iN0EHoYJg.ttf" + }, + { + "family": "M PLUS 1p", + "variants": [ + "100", + "300", + "regular", + "500", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "hebrew", + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v32", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/mplus1p/v32/e3tleuShHdiFyPFzBRrQnDQAUW3aq-5N.ttf", + "300": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQVBYge0PWovdU4w.ttf", + "regular": "https://fonts.gstatic.com/s/mplus1p/v32/e3tjeuShHdiFyPFzBRro-D4Ec2jKqw.ttf", + "500": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQDBcge0PWovdU4w.ttf", + "700": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQRBEge0PWovdU4w.ttf", + "800": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQWBIge0PWovdU4w.ttf", + "900": "https://fonts.gstatic.com/s/mplus1p/v32/e3tmeuShHdiFyPFzBRrQfBMge0PWovdU4w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mplus1p/v32/e3tjeuShHdiFyPFzBRrY-TQA.ttf" + }, + { + "family": "M PLUS 2", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwOa-VxlqHrzNgAw.ttf", + "200": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwua6VxlqHrzNgAw.ttf", + "300": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwZ66VxlqHrzNgAw.ttf", + "regular": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwOa6VxlqHrzNgAw.ttf", + "500": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwC66VxlqHrzNgAw.ttf", + "600": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkw56mVxlqHrzNgAw.ttf", + "700": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkw3qmVxlqHrzNgAw.ttf", + "800": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwuamVxlqHrzNgAw.ttf", + "900": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwkKmVxlqHrzNgAw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mplus2/v15/7Auhp_Eq3gO_OGbGGhjdwrDdpeIBxlkwOa6lx1CD.ttf" + }, + { + "family": "M PLUS Code Latin", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1EbB6i5MqF9TRwg.ttf", + "200": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1MbA6i5MqF9TRwg.ttf", + "300": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1BjA6i5MqF9TRwg.ttf", + "regular": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1EbA6i5MqF9TRwg.ttf", + "500": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1HTA6i5MqF9TRwg.ttf", + "600": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1JjH6i5MqF9TRwg.ttf", + "700": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1KHH6i5MqF9TRwg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mpluscodelatin/v16/hv-ylyV-aXg7x7tULiNXXBA0Np4WMS8fDIymHY8fy8wn4_ifLAtrObKDO0Xf1EbA2i9GrA.ttf" + }, + { + "family": "M PLUS Rounded 1c", + "variants": [ + "100", + "300", + "regular", + "500", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "hebrew", + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-06-25", + "files": { + "100": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGCAYIAV6gnpUpoWwNkYvrugw9RuM3ixLsg6-av1x0.ttf", + "300": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM0q5psKxeqmzgRK.ttf", + "regular": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGEAYIAV6gnpUpoWwNkYvrugw9RuPWGzr8C7vav.ttf", + "500": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM1y55sKxeqmzgRK.ttf", + "700": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM064ZsKxeqmzgRK.ttf", + "800": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM0m4psKxeqmzgRK.ttf", + "900": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGBAYIAV6gnpUpoWwNkYvrugw9RuM0C45sKxeqmzgRK.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mplusrounded1c/v19/VdGEAYIAV6gnpUpoWwNkYvrugw9RuMWHxLs.ttf" + }, + { + "family": "Ma Shan Zheng", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-simplified", + "latin" + ], + "version": "v14", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMTsDIRSfr0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXadMXmCA.ttf" + }, + { + "family": "Macondo", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/macondo/v27/RrQQboN9-iB1IXmOS2XO0LBBd4Y.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/macondo/v27/RrQQboN9-iB1IXmOe2TE1A.ttf" + }, + { + "family": "Macondo Swash Caps", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/macondoswashcaps/v26/6NUL8EaAJgGKZA7lpt941Z9s6ZYgDq6Oekoa_mm5bA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/macondoswashcaps/v26/6NUL8EaAJgGKZA7lpt941Z9s6ZYgDq6-e0Ae.ttf" + }, + { + "family": "Mada", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFlOkHkw2-m9x2iC.ttf", + "300": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFmQkHkw2-m9x2iC.ttf", + "regular": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFnOkHkw2-m9x2iC.ttf", + "500": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFn8kHkw2-m9x2iC.ttf", + "600": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFkQl3kw2-m9x2iC.ttf", + "700": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFkpl3kw2-m9x2iC.ttf", + "800": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFlOl3kw2-m9x2iC.ttf", + "900": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFlnl3kw2-m9x2iC.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mada/v21/7Aulp_0qnzeSVz7u3PJLcUMYOFnOkEkx0e0.ttf" + }, + { + "family": "Madimi One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/madimione/v1/2V0YKIEADpA8U6RygDnZZFQoBoHMd2U.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/madimione/v1/2V0YKIEADpA8U6RygDnZVFUiAg.ttf" + }, + { + "family": "Magra", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/magra/v15/uK_94ruaZus72k5xIDMfO-ed.ttf", + "700": "https://fonts.gstatic.com/s/magra/v15/uK_w4ruaZus72nbNDxcXEPuUX1ow.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/magra/v15/uK_94ruaZus72n5wKjc.ttf" + }, + { + "family": "Maiden Orange", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v32", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/maidenorange/v32/kJE1BuIX7AUmhi2V4m08kb1XjOZdCZS8FY8.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/maidenorange/v32/kJE1BuIX7AUmhi2V4m08kb1XvOdXDQ.ttf" + }, + { + "family": "Maitree", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrklhGNWJGovLdh6OE.ttf", + "300": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrklnWOWJGovLdh6OE.ttf", + "regular": "https://fonts.gstatic.com/s/maitree/v11/MjQGmil5tffhpBrkrtmmfJmDoL4.ttf", + "500": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrkli2PWJGovLdh6OE.ttf", + "600": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrklgGIWJGovLdh6OE.ttf", + "700": "https://fonts.gstatic.com/s/maitree/v11/MjQDmil5tffhpBrklmWJWJGovLdh6OE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/maitree/v11/MjQGmil5tffhpBrkntiseA.ttf" + }, + { + "family": "Major Mono Display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/majormonodisplay/v18/RWmVoLyb5fEqtsfBX9PDZIGr2tFubRhLCn2QIndPww.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/majormonodisplay/v18/RWmVoLyb5fEqtsfBX9PDZIGr2tFubRh7C3eU.ttf" + }, + { + "family": "Mako", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/mako/v19/H4coBX6Mmc_Z0ST09g478Lo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mako/v19/H4coBX6Mmc_Z4SX-8g.ttf" + }, + { + "family": "Mali", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QOLlKlRaJdbWgdY.ttf", + "200italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj8wlVQIfTTkdbJYA.ttf", + "300": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QIbmKlRaJdbWgdY.ttf", + "300italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj8plZQIfTTkdbJYA.ttf", + "regular": "https://fonts.gstatic.com/s/mali/v13/N0ba2SRONuN4eCrODlxxOd8.ttf", + "italic": "https://fonts.gstatic.com/s/mali/v13/N0bU2SRONuN4SCjECn50Kd_PmA.ttf", + "500": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QN7nKlRaJdbWgdY.ttf", + "500italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj8_ldQIfTTkdbJYA.ttf", + "600": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QPLgKlRaJdbWgdY.ttf", + "600italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj80lBQIfTTkdbJYA.ttf", + "700": "https://fonts.gstatic.com/s/mali/v13/N0bV2SRONuN4QJbhKlRaJdbWgdY.ttf", + "700italic": "https://fonts.gstatic.com/s/mali/v13/N0bX2SRONuN4SCj8tlFQIfTTkdbJYA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mali/v13/N0ba2SRONuN4SCvECg.ttf" + }, + { + "family": "Mallanna", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v15", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/mallanna/v15/hv-Vlzx-KEQb84YaDGwzEzRwVvJ-.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mallanna/v15/hv-Vlzx-KEQb84YaDFwyGTA.ttf" + }, + { + "family": "Maname", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "sinhala", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/maname/v2/gNMFW3J8RpCx9my42FkGGI6q_Q.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/maname/v2/gNMFW3J8RpCx9myI2VMC.ttf" + }, + { + "family": "Mandali", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/mandali/v16/LhWlMVbYOfASNfNUVFk1ZPdcKtA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mandali/v16/LhWlMVbYOfASNfNUZFg_YA.ttf" + }, + { + "family": "Manjari", + "variants": [ + "100", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "malayalam" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/manjari/v14/k3kSo8UPMOBO2w1UdbroK2vFIaOV8A.ttf", + "regular": "https://fonts.gstatic.com/s/manjari/v14/k3kQo8UPMOBO2w1UTd7iL0nAMaM.ttf", + "700": "https://fonts.gstatic.com/s/manjari/v14/k3kVo8UPMOBO2w1UdWLNC0HrLaqM6Q4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/manjari/v14/k3kQo8UPMOBO2w1Ufd_oKw.ttf" + }, + { + "family": "Manrope", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk59FO_F87jxeN7B.ttf", + "300": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk6jFO_F87jxeN7B.ttf", + "regular": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FO_F87jxeN7B.ttf", + "500": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk7PFO_F87jxeN7B.ttf", + "600": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk4jE-_F87jxeN7B.ttf", + "700": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk4aE-_F87jxeN7B.ttf", + "800": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk59E-_F87jxeN7B.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/manrope/v20/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_E-bw.ttf" + }, + { + "family": "Mansalva", + "variants": [ + "regular" + ], + "subsets": [ + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/mansalva/v16/aWB4m0aacbtDfvq5NJllI47vdyBg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mansalva/v16/aWB4m0aacbtDfvq5NKlkKYo.ttf" + }, + { + "family": "Manuale", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v31", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeG6e7wD1TB_JHHY.ttf", + "regular": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeHke7wD1TB_JHHY.ttf", + "500": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeHWe7wD1TB_JHHY.ttf", + "600": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeE6fLwD1TB_JHHY.ttf", + "700": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeEDfLwD1TB_JHHY.ttf", + "800": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeFkfLwD1TB_JHHY.ttf", + "300italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOApA3zRdIWHYr8M.ttf", + "italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOFRA3zRdIWHYr8M.ttf", + "500italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOGZA3zRdIWHYr8M.ttf", + "600italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOIpH3zRdIWHYr8M.ttf", + "700italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsOLNH3zRdIWHYr8M.ttf", + "800italic": "https://fonts.gstatic.com/s/manuale/v31/f0Xn0eas_8Z-TFZdNPTUzMkzITq8fvQsONRH3zRdIWHYr8M.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/manuale/v31/f0Xp0eas_8Z-TFZdHv3mMxFaSqASeeHke4wC3zQ.ttf" + }, + { + "family": "Manufacturing Consent", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/manufacturingconsent/v1/N0bL2TVONuFkPkuHfiECSLCwuZS-D-IsakikR6QvbfFYLA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/manufacturingconsent/v1/N0bL2TVONuFkPkuHfiECSLCwuZS-D-IsakiURq4r.ttf" + }, + { + "family": "Marcellus", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/marcellus/v14/wEO_EBrOk8hQLDvIAF8FUfAL3EsHiA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/marcellus/v14/wEO_EBrOk8hQLDvIAF81UPoP.ttf" + }, + { + "family": "Marcellus SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/marcellussc/v14/ke8iOgUHP1dg-Rmi6RWjbLEPgdydGKikhA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/marcellussc/v14/ke8iOgUHP1dg-Rmi6RWjbLE_gNaZ.ttf" + }, + { + "family": "Marck Script", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/marckscript/v22/nwpTtK2oNgBA3Or78gapdwuCzyI-aMPF7Q.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/marckscript/v22/nwpTtK2oNgBA3Or78gapdwuyzig6.ttf" + }, + { + "family": "Margarine", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/margarine/v27/qkBXXvoE6trLT9Y7YLye5JRLkAXbMQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/margarine/v27/qkBXXvoE6trLT9Y7YLyu5Z5P.ttf" + }, + { + "family": "Marhey", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBZVwO2cXiGevOMw.ttf", + "regular": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBctwO2cXiGevOMw.ttf", + "500": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBflwO2cXiGevOMw.ttf", + "600": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBRV3O2cXiGevOMw.ttf", + "700": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBSx3O2cXiGevOMw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/marhey/v8/x3d8ck7Laq-T7wl7mqfVrEe9sDvtBctwC2YdjA.ttf" + }, + { + "family": "Markazi Text", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v28", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtfSQT4MlBekmJLo.ttf", + "500": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtcaQT4MlBekmJLo.ttf", + "600": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtSqXT4MlBekmJLo.ttf", + "700": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtROXT4MlBekmJLo.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/markazitext/v28/sykh-ydym6AtQaiEtX7yhqb_rV1k_81ZVYYZtfSQf4IvAQ.ttf" + }, + { + "family": "Marko One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/markoone/v24/9Btq3DFG0cnVM5lw1haaKpUfrHPzUw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/markoone/v24/9Btq3DFG0cnVM5lw1haqK58b.ttf" + }, + { + "family": "Marmelad", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/marmelad/v19/Qw3eZQdSHj_jK2e-8tFLG-YMC0R8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/marmelad/v19/Qw3eZQdSHj_jK2e-8uFKEeI.ttf" + }, + { + "family": "Martel", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XVqekahRbX9vnDzw.ttf", + "300": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XVzeoahRbX9vnDzw.ttf", + "regular": "https://fonts.gstatic.com/s/martel/v12/PN_xRfK9oXHga0XtYcI-jT3L_w.ttf", + "600": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XVuewahRbX9vnDzw.ttf", + "700": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XV3e0ahRbX9vnDzw.ttf", + "800": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XVwe4ahRbX9vnDzw.ttf", + "900": "https://fonts.gstatic.com/s/martel/v12/PN_yRfK9oXHga0XV5e8ahRbX9vnDzw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/martel/v12/PN_xRfK9oXHga0XdYMg6.ttf" + }, + { + "family": "Martel Sans", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hAX5suHFUknqMxQ.ttf", + "300": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hBz5cuHFUknqMxQ.ttf", + "regular": "https://fonts.gstatic.com/s/martelsans/v14/h0GsssGi7VdzDgKjM-4d8ijfze-PPlUu.ttf", + "600": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hAH48uHFUknqMxQ.ttf", + "700": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hBj4suHFUknqMxQ.ttf", + "800": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hB_4cuHFUknqMxQ.ttf", + "900": "https://fonts.gstatic.com/s/martelsans/v14/h0GxssGi7VdzDgKjM-4d8hBb4MuHFUknqMxQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/martelsans/v14/h0GsssGi7VdzDgKjM-4d8hjex-s.ttf" + }, + { + "family": "Martian Mono", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY1qus6WD75kdpF2.ttf", + "200": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY3qu86WD75kdpF2.ttf", + "300": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY00u86WD75kdpF2.ttf", + "regular": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY1qu86WD75kdpF2.ttf", + "500": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY1Yu86WD75kdpF2.ttf", + "600": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY20vM6WD75kdpF2.ttf", + "700": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY2NvM6WD75kdpF2.ttf", + "800": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY3qvM6WD75kdpF2.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/martianmono/v6/2V08KIcADoYhV6w87xrTKjs4CYElh_VS9YA4TlTnQzaVMIE6j15dYY1qu_6XBbo.ttf" + }, + { + "family": "Marvel", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/marvel/v17/nwpVtKeoNgBV0qaIkV7ED366zg.ttf", + "italic": "https://fonts.gstatic.com/s/marvel/v17/nwpXtKeoNgBV0qa4k1TALXuqzhA7.ttf", + "700": "https://fonts.gstatic.com/s/marvel/v17/nwpWtKeoNgBV0qawLXHgB1WmxwkiYQ.ttf", + "700italic": "https://fonts.gstatic.com/s/marvel/v17/nwpQtKeoNgBV0qa4k2x8Al-i5QwyYdrc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/marvel/v17/nwpVtKeoNgBV0qa4kFTA.ttf" + }, + { + "family": "Matangi", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-08-26", + "files": { + "300": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7PICDYwI8Gcw6Oi.ttf", + "regular": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7OWCDYwI8Gcw6Oi.ttf", + "500": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7OkCDYwI8Gcw6Oi.ttf", + "600": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7NIDzYwI8Gcw6Oi.ttf", + "700": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7NxDzYwI8Gcw6Oi.ttf", + "800": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7MWDzYwI8Gcw6Oi.ttf", + "900": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7M_DzYwI8Gcw6Oi.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/matangi/v5/kmKiZqE2FhDIeX2QvjZNI_5FGeJet7OWCAYxKcU.ttf" + }, + { + "family": "Mate", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/mate/v19/m8JdjftRd7WZ2z28WoXSaLU.ttf", + "italic": "https://fonts.gstatic.com/s/mate/v19/m8JTjftRd7WZ6z-2XqfXeLVdbw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mate/v19/m8JdjftRd7WZ6zy2Xg.ttf" + }, + { + "family": "Mate SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/matesc/v23/-nF8OGQ1-uoVr2wKyiXZ95OkJwA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/matesc/v23/-nF8OGQ1-uoVr2wK-iTT8w.ttf" + }, + { + "family": "Matemasie", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/matemasie/v4/OD5BuMCN3ne3Gmr7dlL3rEq4DL6w2w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/matemasie/v4/OD5BuMCN3ne3Gmr7dlLHrUC8.ttf" + }, + { + "family": "Material Icons", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v145", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/materialicons/v145/flUhRq6tzZclQEJ-Vdg-IuiaDsNZIhI8tIHh.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/materialicons/v145/flUhRq6tzZclQEJ-Vdg-IuiaDvNYKBY.ttf" + }, + { + "family": "Material Icons Outlined", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v110", + "lastModified": "2025-06-17", + "files": { + "regular": "https://fonts.gstatic.com/s/materialiconsoutlined/v110/gok-H7zzDkdnRel8-DQ6KAXJ69wP1tGnf4ZGhUcdl5GuI2Ze.otf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/materialiconsoutlined/v110/gok-H7zzDkdnRel8-DQ6KAXJ69wP1tGnf4ZGhXcanZM.otf" + }, + { + "family": "Material Icons Round", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v109", + "lastModified": "2025-06-17", + "files": { + "regular": "https://fonts.gstatic.com/s/materialiconsround/v109/LDItaoyNOAY6Uewc665JcIzCKsKc_M9flwmMq_fTTvg-.otf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/materialiconsround/v109/LDItaoyNOAY6Uewc665JcIzCKsKc_M9flzmLofU.otf" + }, + { + "family": "Material Icons Sharp", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v110", + "lastModified": "2025-06-17", + "files": { + "regular": "https://fonts.gstatic.com/s/materialiconssharp/v110/oPWQ_lt5nv4pWNJpghLP75WiFR4kLh3kvmvSImEyc0vd.otf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/materialiconssharp/v110/oPWQ_lt5nv4pWNJpghLP75WiFR4kLh3kvlvVKGM.otf" + }, + { + "family": "Material Icons Two Tone", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v113", + "lastModified": "2025-06-17", + "files": { + "regular": "https://fonts.gstatic.com/s/materialiconstwotone/v113/hESh6WRmNCxEqUmNyh3JDeGxjVVyMg4tHGctNCu3NjDrH_77.otf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/materialiconstwotone/v113/hESh6WRmNCxEqUmNyh3JDeGxjVVyMg4tHGctNBuwPDI.otf", + "colorCapabilities": [ + "COLRv0" + ] + }, + { + "family": "Material Symbols", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-11-25", + "files": { + "100": "https://fonts.gstatic.com/s/materialsymbols/v27/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEHuRbn3PT2vOA.ttf", + "200": "https://fonts.gstatic.com/s/materialsymbols/v27/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNV3EDuRbn3PT2vOA.ttf", + "300": "https://fonts.gstatic.com/s/materialsymbols/v27/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVAkDuRbn3PT2vOA.ttf", + "regular": "https://fonts.gstatic.com/s/materialsymbols/v27/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEDuRbn3PT2vOA.ttf", + "500": "https://fonts.gstatic.com/s/materialsymbols/v27/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVbkDuRbn3PT2vOA.ttf", + "600": "https://fonts.gstatic.com/s/materialsymbols/v27/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVgkfuRbn3PT2vOA.ttf", + "700": "https://fonts.gstatic.com/s/materialsymbols/v27/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVu0fuRbn3PT2vOA.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/materialsymbols/v27/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEDeRLPz.ttf" + }, + { + "family": "Material Symbols Outlined", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v299", + "lastModified": "2025-11-25", + "files": { + "100": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v299/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHeembd5zrTgt.ttf", + "200": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v299/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDAvHOembd5zrTgt.ttf", + "300": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v299/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDDxHOembd5zrTgt.ttf", + "regular": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v299/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOembd5zrTgt.ttf", + "500": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v299/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCdHOembd5zrTgt.ttf", + "600": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v299/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDBxG-embd5zrTgt.ttf", + "700": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v299/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDBIG-embd5zrTgt.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/materialsymbolsoutlined/v299/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHNenZ9o.ttf" + }, + { + "family": "Material Symbols Rounded", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v301", + "lastModified": "2025-11-25", + "files": { + "100": "https://fonts.gstatic.com/s/materialsymbolsrounded/v301/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIekXxKJKJBjAa8.ttf", + "200": "https://fonts.gstatic.com/s/materialsymbolsrounded/v301/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rAelXxKJKJBjAa8.ttf", + "300": "https://fonts.gstatic.com/s/materialsymbolsrounded/v301/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rNmlXxKJKJBjAa8.ttf", + "regular": "https://fonts.gstatic.com/s/materialsymbolsrounded/v301/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIelXxKJKJBjAa8.ttf", + "500": "https://fonts.gstatic.com/s/materialsymbolsrounded/v301/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rLWlXxKJKJBjAa8.ttf", + "600": "https://fonts.gstatic.com/s/materialsymbolsrounded/v301/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rFmiXxKJKJBjAa8.ttf", + "700": "https://fonts.gstatic.com/s/materialsymbolsrounded/v301/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rGCiXxKJKJBjAa8.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/materialsymbolsrounded/v301/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIelbxODLA.ttf" + }, + { + "family": "Material Symbols Sharp", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v296", + "lastModified": "2025-11-25", + "files": { + "100": "https://fonts.gstatic.com/s/materialsymbolssharp/v296/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLozCOJ1H7-knk.ttf", + "200": "https://fonts.gstatic.com/s/materialsymbolssharp/v296/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxMLojCOJ1H7-knk.ttf", + "300": "https://fonts.gstatic.com/s/materialsymbolssharp/v296/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxPVojCOJ1H7-knk.ttf", + "regular": "https://fonts.gstatic.com/s/materialsymbolssharp/v296/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLojCOJ1H7-knk.ttf", + "500": "https://fonts.gstatic.com/s/materialsymbolssharp/v296/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxO5ojCOJ1H7-knk.ttf", + "600": "https://fonts.gstatic.com/s/materialsymbolssharp/v296/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxNVpTCOJ1H7-knk.ttf", + "700": "https://fonts.gstatic.com/s/materialsymbolssharp/v296/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxNspTCOJ1H7-knk.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/materialsymbolssharp/v296/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLogCPLVU.ttf" + }, + { + "family": "Maven Pro", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v40", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX25nCpozp5GvU.ttf", + "500": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8Rf25nCpozp5GvU.ttf", + "600": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8fvx5nCpozp5GvU.ttf", + "700": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8cLx5nCpozp5GvU.ttf", + "800": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8aXx5nCpozp5GvU.ttf", + "900": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8Yzx5nCpozp5GvU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mavenpro/v40/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nGjpw.ttf" + }, + { + "family": "McLaren", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/mclaren/v19/2EbnL-ZuAXFqZFXISYYf8z2Yt_c.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mclaren/v19/2EbnL-ZuAXFqZFXIeYcV9w.ttf" + }, + { + "family": "Mea Culpa", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/meaculpa/v8/AMOTz4GcuWbEIuza8jsZms0QW3mqyg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/meaculpa/v8/AMOTz4GcuWbEIuza8jspm8cU.ttf" + }, + { + "family": "Meddon", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/meddon/v27/kmK8ZqA2EgDNeHTZhBdB3y_Aow.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/meddon/v27/kmK8ZqA2EgDNeHTphR1F.ttf" + }, + { + "family": "MedievalSharp", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/medievalsharp/v28/EvOJzAlL3oU5AQl2mP5KdgptAq96MwvXLDk.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/medievalsharp/v28/EvOJzAlL3oU5AQl2mP5KdgptMq5wNw.ttf" + }, + { + "family": "Medula One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/medulaone/v20/YA9Wr0qb5kjJM6l2V0yukiEqs7GtlvY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/medulaone/v20/YA9Wr0qb5kjJM6l2V0yuoiAgtw.ttf" + }, + { + "family": "Meera Inimai", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "tamil" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/meerainimai/v14/845fNMM5EIqOW5MPuvO3ILep_2jDVevnLQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/meerainimai/v14/845fNMM5EIqOW5MPuvO3ILeZ_mLH.ttf" + }, + { + "family": "Megrim", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/megrim/v18/46kulbz5WjvLqJZlbWXgd0RY1g.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/megrim/v18/46kulbz5WjvLqJZVbG_k.ttf" + }, + { + "family": "Meie Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/meiescript/v22/_LOImzDK7erRjhunIspaMjxn5IXg0WDz.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/meiescript/v22/_LOImzDK7erRjhunIspaMgxm7oE.ttf" + }, + { + "family": "Menbere", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "ethiopic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-06-25", + "files": { + "100": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdI_9qn1UnpeWOQ5.ttf", + "200": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdK_96n1UnpeWOQ5.ttf", + "300": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdJh96n1UnpeWOQ5.ttf", + "regular": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdI_96n1UnpeWOQ5.ttf", + "500": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdIN96n1UnpeWOQ5.ttf", + "600": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdLh8Kn1UnpeWOQ5.ttf", + "700": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdLY8Kn1UnpeWOQ5.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/menbere/v1/lJwY-p0zhmBrWvcG80OiXWeXfSDWXdI_95n0WH4.ttf" + }, + { + "family": "Meow Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/meowscript/v6/0FlQVPqanlaJrtr8AnJ0ESch0_0CfDf1.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/meowscript/v6/0FlQVPqanlaJrtr8AnJ0ERcg2fk.ttf" + }, + { + "family": "Merienda", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5JHhoSU78QGBV0A.ttf", + "regular": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5enhoSU78QGBV0A.ttf", + "500": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5SHhoSU78QGBV0A.ttf", + "600": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5pH9oSU78QGBV0A.ttf", + "700": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5nX9oSU78QGBV0A.ttf", + "800": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5-n9oSU78QGBV0A.ttf", + "900": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5039oSU78QGBV0A.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/merienda/v22/gNMaW3x8Qoy5_mf8uUkJGHtiYXjmKFy5enhYSET4.ttf" + }, + { + "family": "Merriweather", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v33", + "lastModified": "2025-09-02", + "files": { + "300": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrgCcqE1f0KvXKYQ.ttf", + "regular": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr3icqE1f0KvXKYQ.ttf", + "500": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr7CcqE1f0KvXKYQ.ttf", + "600": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrACAqE1f0KvXKYQ.ttf", + "700": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrOSAqE1f0KvXKYQ.ttf", + "800": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrXiAqE1f0KvXKYQ.ttf", + "900": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrdyAqE1f0KvXKYQ.ttf", + "300italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmScUF3wCPDaYa_F.ttf", + "italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF3wCPDaYa_F.ttf", + "500italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTwUF3wCPDaYa_F.ttf", + "600italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmQcV13wCPDaYa_F.ttf", + "700italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmQlV13wCPDaYa_F.ttf", + "800italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmRCV13wCPDaYa_F.ttf", + "900italic": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmRrV13wCPDaYa_F.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr3icaEl3w.ttf" + }, + { + "family": "Merriweather Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZ_O4ljuEG7xFHnQ.ttf", + "regular": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZou4ljuEG7xFHnQ.ttf", + "500": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZkO4ljuEG7xFHnQ.ttf", + "600": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZfOkljuEG7xFHnQ.ttf", + "700": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZRekljuEG7xFHnQ.ttf", + "800": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZIukljuEG7xFHnQ.ttf", + "300italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq2TzesCzRRXnaur.ttf", + "italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq3NzesCzRRXnaur.ttf", + "500italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq3_zesCzRRXnaur.ttf", + "600italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq0TyusCzRRXnaur.ttf", + "700italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq0qyusCzRRXnaur.ttf", + "800italic": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cM9IRs1JiJN1FRAMjTN5zd9vgsFHXwWDvLBsPDdpWMaq1NyusCzRRXnaur.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/merriweathersans/v28/2-cO9IRs1JiJN1FRAMjTN5zd9vgsFF_5asQTb6hZ2JKZou4Vj-sC.ttf" + }, + { + "family": "Metal", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v32", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/metal/v32/lW-wwjUJIXTo7i3nnoQAUdN2.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/metal/v32/lW-wwjUJIXTo7h3mlIA.ttf" + }, + { + "family": "Metal Mania", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/metalmania/v23/RWmMoKWb4e8kqMfBUdPFJeXCg6UKDXlq.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/metalmania/v23/RWmMoKWb4e8kqMfBUdPFJdXDiaE.ttf" + }, + { + "family": "Metamorphous", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/metamorphous/v22/Wnz8HA03aAXcC39ZEX5y1330PCCthTsmaQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/metamorphous/v22/Wnz8HA03aAXcC39ZEX5y133EPSqp.ttf" + }, + { + "family": "Metrophobic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/metrophobic/v24/sJoA3LZUhMSAPV_u0qwiAT-J737FPEEL.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/metrophobic/v24/sJoA3LZUhMSAPV_u0qwiAQ-I5Xo.ttf" + }, + { + "family": "Michroma", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/michroma/v21/PN_zRfy9qWD8fEagAMg6rzjb_-Da.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/michroma/v21/PN_zRfy9qWD8fEagAPg7pTw.ttf" + }, + { + "family": "Micro 5", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/micro5/v2/H4cnBX2MkcfEngTr0gYQ7LO5mqc.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/micro5/v2/H4cnBX2MkcfEngTr4gca6A.ttf" + }, + { + "family": "Micro 5 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/micro5charted/v2/hESp6XxmPDtTtADZhn7oD_yrmxEGRUsJQAlbUA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/micro5charted/v2/hESp6XxmPDtTtADZhn7oD_yrmxE2REEN.ttf" + }, + { + "family": "Milonga", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/milonga/v24/SZc53FHnIaK9W5kffz3GkUrS8DI.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/milonga/v24/SZc53FHnIaK9W5kfTzzMlQ.ttf" + }, + { + "family": "Miltonian", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v32", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/miltonian/v32/zOL-4pbPn6Ne9JqTg9mr6e5As-FeiQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/miltonian/v32/zOL-4pbPn6Ne9JqTg9mb6ORE.ttf" + }, + { + "family": "Miltonian Tattoo", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v34", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/miltoniantattoo/v34/EvOUzBRL0o0kCxF-lcMCQxlpVsA_FwP8MDBku-s.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/miltoniantattoo/v34/EvOUzBRL0o0kCxF-lcMCQxlpVsA_JwL2NA.ttf" + }, + { + "family": "Mina", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "bengali", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/mina/v14/-nFzOGc18vARrz9j7i3y65o.ttf", + "700": "https://fonts.gstatic.com/s/mina/v14/-nF8OGc18vARl4NMyiXZ95OkJwA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mina/v14/-nFzOGc18vARnz5p6g.ttf" + }, + { + "family": "Mingzat", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "lepcha" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/mingzat/v11/0QIgMX5C-o-oWWyvBttkm_mv670.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mingzat/v11/0QIgMX5C-o-oWWyvNtpunw.ttf" + }, + { + "family": "Miniver", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/miniver/v27/eLGcP-PxIg-5H0vC770Cy8r8fWA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/miniver/v27/eLGcP-PxIg-5H0vC37wIzw.ttf" + }, + { + "family": "Miriam Libre", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjH9P3k9vGL-8tY7Q.ttf", + "500": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjH-H3k9vGL-8tY7Q.ttf", + "600": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjHw3wk9vGL-8tY7Q.ttf", + "700": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjHzTwk9vGL-8tY7Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/miriamlibre/v19/DdT0798HsHwubBAqfkcBTL_1a7sPlXcE8PJjH9P3o9rMKw.ttf" + }, + { + "family": "Mirza", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/mirza/v19/co3ImWlikiN5EurdKMewsrvI.ttf", + "500": "https://fonts.gstatic.com/s/mirza/v19/co3FmWlikiN5EtIpAeO4mafBomDi.ttf", + "600": "https://fonts.gstatic.com/s/mirza/v19/co3FmWlikiN5EtIFBuO4mafBomDi.ttf", + "700": "https://fonts.gstatic.com/s/mirza/v19/co3FmWlikiN5EtJhB-O4mafBomDi.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mirza/v19/co3ImWlikiN5EtrcIsM.ttf" + }, + { + "family": "Miss Fajardose", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/missfajardose/v23/E21-_dn5gvrawDdPFVl-N0Ajb8qvWPaJq4no.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/missfajardose/v23/E21-_dn5gvrawDdPFVl-N0Ajb_quUvI.ttf" + }, + { + "family": "Mitr", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8fMZFJDUc1NECPY.ttf", + "300": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8ZcaFJDUc1NECPY.ttf", + "regular": "https://fonts.gstatic.com/s/mitr/v13/pxiLypw5ucZFyTsyMJj_b1o.ttf", + "500": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8c8bFJDUc1NECPY.ttf", + "600": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8eMcFJDUc1NECPY.ttf", + "700": "https://fonts.gstatic.com/s/mitr/v13/pxiEypw5ucZF8YcdFJDUc1NECPY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mitr/v13/pxiLypw5ucZF-To4NA.ttf" + }, + { + "family": "Mochiy Pop One", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin" + ], + "version": "v12", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/mochiypopone/v12/QdVPSTA9Jh-gg-5XZP2UmU4O9kwwD3s6ZKAi.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mochiypopone/v12/QdVPSTA9Jh-gg-5XZP2UmU4O9nwxBX8.ttf" + }, + { + "family": "Mochiy Pop P One", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin" + ], + "version": "v12", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/mochiypoppone/v12/Ktk2AKuPeY_td1-h9LayHYWCjAqyN4O3WYZB_sU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mochiypoppone/v12/Ktk2AKuPeY_td1-h9LayHYWCjAqyB4K9XQ.ttf" + }, + { + "family": "Modak", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/modak/v21/EJRYQgs1XtIEsnMH8BVZ76KU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/modak/v21/EJRYQgs1XtIEskMG-hE.ttf" + }, + { + "family": "Modern Antiqua", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/modernantiqua/v26/NGStv5TIAUg6Iq_RLNo_2dp1sI1Ea2u0c3Gi.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/modernantiqua/v26/NGStv5TIAUg6Iq_RLNo_2dp1sL1FYW8.ttf" + }, + { + "family": "Moderustic", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjBVsTNe55aRa7UE.ttf", + "regular": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjALsTNe55aRa7UE.ttf", + "500": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjA5sTNe55aRa7UE.ttf", + "600": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjDVtjNe55aRa7UE.ttf", + "700": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjDstjNe55aRa7UE.ttf", + "800": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjCLtjNe55aRa7UE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/moderustic/v3/2-c39J9s3o6eLFNHFdXYaOX1UUnf3GLnYjALsQNf7ZI.ttf" + }, + { + "family": "Mogra", + "variants": [ + "regular" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/mogra/v22/f0X40eSs8c95TBo4DvLmxtnG.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mogra/v22/f0X40eSs8c95TCo5BPY.ttf" + }, + { + "family": "Mohave", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdif_HvCQopLSvBk.ttf", + "regular": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdnn_HvCQopLSvBk.ttf", + "500": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdkv_HvCQopLSvBk.ttf", + "600": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdqf4HvCQopLSvBk.ttf", + "700": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdp74HvCQopLSvBk.ttf", + "300italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G8qLOaprDXrBlSVw.ttf", + "italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G89rOaprDXrBlSVw.ttf", + "500italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G8xLOaprDXrBlSVw.ttf", + "600italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G8KLSaprDXrBlSVw.ttf", + "700italic": "https://fonts.gstatic.com/s/mohave/v13/7cH2v4ksjJunKqM_CdE36I75AIQkY7G8EbSaprDXrBlSVw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mohave/v13/7cH0v4ksjJunKqMVAOPIMOeSmiojdnn_LvGapg.ttf" + }, + { + "family": "Moirai One", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/moiraione/v1/2sDbZGFUgJLJmby6xgNGT0WWB7UcfCg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/moiraione/v1/2sDbZGFUgJLJmby6xgNGf0ScAw.ttf" + }, + { + "family": "Molengo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/molengo/v17/I_uuMpWeuBzZNBtQbbRQkiCvs5Y.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/molengo/v17/I_uuMpWeuBzZNBtQXbValg.ttf" + }, + { + "family": "Molle", + "variants": [ + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "italic": "https://fonts.gstatic.com/s/molle/v25/E21n_dL5hOXFhWEsXzgmVydREus.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/molle/v25/E21n_dL5hOXFhWEsbzksUw.ttf" + }, + { + "family": "Momo Signature", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-10-29", + "files": { + "regular": "https://fonts.gstatic.com/s/momosignature/v2/RrQJbop99C51b06IDAuFoM0yCqcoMcmJPECN.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/momosignature/v2/RrQJbop99C51b06IDAuFoM0yCpcpO80.ttf" + }, + { + "family": "Momo Trust Display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-10-29", + "files": { + "regular": "https://fonts.gstatic.com/s/momotrustdisplay/v2/WWXPlieNYgyPZLyBUuEkKZFhFHyjqb1un2xNNgNa1A.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/momotrustdisplay/v2/WWXPlieNYgyPZLyBUuEkKZFhFHyjqb1enmZJ.ttf" + }, + { + "family": "Momo Trust Sans", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-11-20", + "files": { + "200": "https://fonts.gstatic.com/s/momotrustsans/v4/BXR8vFfHh_fFyXlQWZgO0TyUN7Pt3pVCeYWqJnZSWzRpbToVehmEa4Q.ttf", + "300": "https://fonts.gstatic.com/s/momotrustsans/v4/BXR8vFfHh_fFyXlQWZgO0TyUN7Pt3pVCeYWqJnZSW-ppbToVehmEa4Q.ttf", + "regular": "https://fonts.gstatic.com/s/momotrustsans/v4/BXR8vFfHh_fFyXlQWZgO0TyUN7Pt3pVCeYWqJnZSW7RpbToVehmEa4Q.ttf", + "500": "https://fonts.gstatic.com/s/momotrustsans/v4/BXR8vFfHh_fFyXlQWZgO0TyUN7Pt3pVCeYWqJnZSW4ZpbToVehmEa4Q.ttf", + "600": "https://fonts.gstatic.com/s/momotrustsans/v4/BXR8vFfHh_fFyXlQWZgO0TyUN7Pt3pVCeYWqJnZSW2pubToVehmEa4Q.ttf", + "700": "https://fonts.gstatic.com/s/momotrustsans/v4/BXR8vFfHh_fFyXlQWZgO0TyUN7Pt3pVCeYWqJnZSW1NubToVehmEa4Q.ttf", + "800": "https://fonts.gstatic.com/s/momotrustsans/v4/BXR8vFfHh_fFyXlQWZgO0TyUN7Pt3pVCeYWqJnZSWzRubToVehmEa4Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/momotrustsans/v4/BXR8vFfHh_fFyXlQWZgO0TyUN7Pt3pVCeYWqJnZSW7RpXTsffg.ttf" + }, + { + "family": "Mona Sans", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyB9A99d41P6zHtY.ttf", + "300": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyCjA99d41P6zHtY.ttf", + "regular": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9A99d41P6zHtY.ttf", + "500": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyDPA99d41P6zHtY.ttf", + "600": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyAjBN9d41P6zHtY.ttf", + "700": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyAaBN9d41P6zHtY.ttf", + "800": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyB9BN9d41P6zHtY.ttf", + "900": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyBUBN9d41P6zHtY.ttf", + "200italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QLce6VfYyWtY1rI.ttf", + "300italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QGke6VfYyWtY1rI.ttf", + "italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QDce6VfYyWtY1rI.ttf", + "500italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QAUe6VfYyWtY1rI.ttf", + "600italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QOkZ6VfYyWtY1rI.ttf", + "700italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QNAZ6VfYyWtY1rI.ttf", + "800italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QLcZ6VfYyWtY1rI.ttf", + "900italic": "https://fonts.gstatic.com/s/monasans/v4/o-0kIpQmx24alC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QJ4Z6VfYyWtY1rI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/monasans/v4/o-0mIpQmx24alC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9A-9c6Vc.ttf" + }, + { + "family": "Monda", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWsH3oMoWtGaA-Ijw.ttf", + "500": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWsLXoMoWtGaA-Ijw.ttf", + "600": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWswX0MoWtGaA-Ijw.ttf", + "700": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWs-H0MoWtGaA-Ijw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/monda/v19/TK3-WkYFABsmjuBtFuvTIFRAPpWsH3o8oGFC.ttf" + }, + { + "family": "Monofett", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/monofett/v24/mFTyWbofw6zc9NtnW43SuRwr0VJ7.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/monofett/v24/mFTyWbofw6zc9NtnW73Tsxg.ttf" + }, + { + "family": "Monomakh", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/monomakh/v1/Wnz4HAk3Yh_SC3FACTYdiArcPRKo.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/monomakh/v1/Wnz4HAk3Yh_SC3FACQYcgg4.ttf" + }, + { + "family": "Monomaniac One", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/monomaniacone/v15/4iC06K17YctZjx50EU-QlwPmcqRnqYkB5kwI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/monomaniacone/v15/4iC06K17YctZjx50EU-QlwPmcpRmo40.ttf" + }, + { + "family": "Monoton", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/monoton/v22/5h1aiZUrOngCibe4fkbBQ2S7FU8.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/monoton/v22/5h1aiZUrOngCibe4TkfLRw.ttf" + }, + { + "family": "Monsieur La Doulaise", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/monsieurladoulaise/v20/_Xmz-GY4rjmCbQfc-aPRaa4pqV340p7EZl5ewkEU4HTy.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/monsieurladoulaise/v20/_Xmz-GY4rjmCbQfc-aPRaa4pqV340p7EZm5fyEU.ttf" + }, + { + "family": "Montaga", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/montaga/v14/H4cnBX2Ml8rCkEO_0gYQ7LO5mqc.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/montaga/v14/H4cnBX2Ml8rCkEO_4gca6A.ttf" + }, + { + "family": "Montagu Slab", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkDbE3P9Fs7bOSO7.ttf", + "200": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkBbEnP9Fs7bOSO7.ttf", + "300": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkCFEnP9Fs7bOSO7.ttf", + "regular": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkDbEnP9Fs7bOSO7.ttf", + "500": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkDpEnP9Fs7bOSO7.ttf", + "600": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkAFFXP9Fs7bOSO7.ttf", + "700": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkA8FXP9Fs7bOSO7.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/montaguslab/v17/6qLhKZIQtB_zv0xUaXRDWkY_HXsphdLRZF40vm_jzR2jhk_n3T6ACkDbEkP8HMo.ttf" + }, + { + "family": "MonteCarlo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/montecarlo/v13/buEzpo6-f9X01GadLA0G0CoV_NxLeiw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/montecarlo/v13/buEzpo6-f9X01GadLA0G4Csf-A.ttf" + }, + { + "family": "Montez", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/montez/v25/845ZNMk5GoGIX8lm1LDeSd-R_g.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/montez/v25/845ZNMk5GoGIX8lW1bra.ttf" + }, + { + "family": "Montserrat", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v31", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Uw-Y3tcoqK5.ttf", + "200": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr6Ew-Y3tcoqK5.ttf", + "300": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCs16Ew-Y3tcoqK5.ttf", + "regular": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew-Y3tcoqK5.ttf", + "500": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtZ6Ew-Y3tcoqK5.ttf", + "600": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCu170w-Y3tcoqK5.ttf", + "700": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM70w-Y3tcoqK5.ttf", + "800": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr70w-Y3tcoqK5.ttf", + "900": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvC70w-Y3tcoqK5.ttf", + "100italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R8aX9-p7K5ILg.ttf", + "200italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR9aX9-p7K5ILg.ttf", + "300italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq_p9aX9-p7K5ILg.ttf", + "italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R9aX9-p7K5ILg.ttf", + "500italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq5Z9aX9-p7K5ILg.ttf", + "600italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq3p6aX9-p7K5ILg.ttf", + "700italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq0N6aX9-p7K5ILg.ttf", + "800italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR6aX9-p7K5ILg.ttf", + "900italic": "https://fonts.gstatic.com/s/montserrat/v31/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqw16aX9-p7K5ILg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/montserrat/v31/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Hw_aX8.ttf" + }, + { + "family": "Montserrat Alternates", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/montserratalternates/v18/mFThWacfw6zH4dthXcyms1lPpC8I_b0juU0xiKfVKphL03l4.ttf", + "100italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTjWacfw6zH4dthXcyms1lPpC8I_b0juU057p-xIJxp1ml4imo.ttf", + "200": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xJIb1ALZH2mBhkw.ttf", + "200italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p8dAbxD-GVxk3Nd.ttf", + "300": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xQIX1ALZH2mBhkw.ttf", + "300italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p95ArxD-GVxk3Nd.ttf", + "regular": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTvWacfw6zH4dthXcyms1lPpC8I_b0juU0J7K3RCJ1b0w.ttf", + "italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFThWacfw6zH4dthXcyms1lPpC8I_b0juU057qfVKphL03l4.ttf", + "500": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xGIT1ALZH2mBhkw.ttf", + "500italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p8hA7xD-GVxk3Nd.ttf", + "600": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xNIP1ALZH2mBhkw.ttf", + "600italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p8NBLxD-GVxk3Nd.ttf", + "700": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xUIL1ALZH2mBhkw.ttf", + "700italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p9pBbxD-GVxk3Nd.ttf", + "800": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xTIH1ALZH2mBhkw.ttf", + "800italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p91BrxD-GVxk3Nd.ttf", + "900": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xaID1ALZH2mBhkw.ttf", + "900italic": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTkWacfw6zH4dthXcyms1lPpC8I_b0juU057p9RB7xD-GVxk3Nd.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/montserratalternates/v18/mFTvWacfw6zH4dthXcyms1lPpC8I_b0juU057afV.ttf" + }, + { + "family": "Montserrat Underline", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5Wil8ubbffHtmMw.ttf", + "200": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F52ih8ubbffHtmMw.ttf", + "300": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5BCh8ubbffHtmMw.ttf", + "regular": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5Wih8ubbffHtmMw.ttf", + "500": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5aCh8ubbffHtmMw.ttf", + "600": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5hC98ubbffHtmMw.ttf", + "700": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5vS98ubbffHtmMw.ttf", + "800": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F52i98ubbffHtmMw.ttf", + "900": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F58y98ubbffHtmMw.ttf", + "100italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmuU-7zbXn52M1Mi.ttf", + "200italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmsU-rzbXn52M1Mi.ttf", + "300italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmvK-rzbXn52M1Mi.ttf", + "italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmuU-rzbXn52M1Mi.ttf", + "500italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmum-rzbXn52M1Mi.ttf", + "600italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmtK_bzbXn52M1Mi.ttf", + "700italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmtz_bzbXn52M1Mi.ttf", + "800italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskmsU_bzbXn52M1Mi.ttf", + "900italic": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTdWaYfw6zH4dthXcyms01NtC8I_7U5uS4r1ozd9EzeaWZskms9_bzbXn52M1Mi.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/montserratunderline/v3/mFTbWaYfw6zH4dthXcyms01NtC8I_7U5uQQi5HMFnSdEx2F5WihMuLzb.ttf" + }, + { + "family": "Moo Lah Lah", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/moolahlah/v8/dg4h_p_opKZOA0w1AYcm55wtYQYugjW4.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/moolahlah/v8/dg4h_p_opKZOA0w1AYcm56wsawI.ttf" + }, + { + "family": "Mooli", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/mooli/v1/-F6_fjJpLyk1bYPBBG7YpzlJ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mooli/v1/-F6_fjJpLyk1bbPADmo.ttf" + }, + { + "family": "Moon Dance", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/moondance/v8/WBLgrEbUbFlYW9ekmGawe2XiKMiokE4.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/moondance/v8/WBLgrEbUbFlYW9ekmGawS2ToLA.ttf" + }, + { + "family": "Moul", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v30", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/moul/v30/nuF2D__FSo_3E-RYiJCy-00.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/moul/v30/nuF2D__FSo_3I-VSjA.ttf" + }, + { + "family": "Moulpali", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v33", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/moulpali/v33/H4ckBXKMl9HagUWymyY6wr-wg763.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/moulpali/v33/H4ckBXKMl9HagUWymxY7yLs.ttf" + }, + { + "family": "Mountains of Christmas", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/mountainsofchristmas/v24/3y9w6a4zcCnn5X0FDyrKi2ZRUBIy8uxoUo7ePNamMPNpJpc.ttf", + "700": "https://fonts.gstatic.com/s/mountainsofchristmas/v24/3y9z6a4zcCnn5X0FDyrKi2ZRUBIy8uxoUo7eBGqJFPtCOp6IaEA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mountainsofchristmas/v24/3y9w6a4zcCnn5X0FDyrKi2ZRUBIy8uxoUo7eDNesNA.ttf" + }, + { + "family": "Mouse Memoirs", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/mousememoirs/v19/t5tmIRoSNJ-PH0WNNgDYxdSb7TnFrpOHYh4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mousememoirs/v19/t5tmIRoSNJ-PH0WNNgDYxdSb3TjPqg.ttf" + }, + { + "family": "Mozilla Headline", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-07-30", + "files": { + "200": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOBYIYVZRxvtcorUQ.ttf", + "300": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOBvoYVZRxvtcorUQ.ttf", + "regular": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOB4IYVZRxvtcorUQ.ttf", + "500": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOB0oYVZRxvtcorUQ.ttf", + "600": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOBPoEVZRxvtcorUQ.ttf", + "700": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOBB4EVZRxvtcorUQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mozillaheadline/v1/QGYLz-UXahmCOps4kyMKGuSA9pYt2_P-w2kFrS88o6cVYRvBSDSOuerB_FOB4IYlZBZr.ttf" + }, + { + "family": "Mozilla Text", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-07-30", + "files": { + "200": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOBwUcPNBRVYmoOXo.ttf", + "300": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB9scPNBRVYmoOXo.ttf", + "regular": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB4UcPNBRVYmoOXo.ttf", + "500": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB7ccPNBRVYmoOXo.ttf", + "600": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB1sbPNBRVYmoOXo.ttf", + "700": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB2IbPNBRVYmoOXo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mozillatext/v1/SZcr3FrnJ7S7WZIff2mJ7Tbp4zu7ULu3HkPOB4UcDNFbUQ.ttf" + }, + { + "family": "Mr Bedfort", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/mrbedfort/v23/MQpR-WCtNZSWAdTMwBicliq0XZe_Iy8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mrbedfort/v23/MQpR-WCtNZSWAdTMwBicpiu-WQ.ttf" + }, + { + "family": "Mr Dafoe", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/mrdafoe/v15/lJwE-pIzkS5NXuMMrGiqg7MCxz_C.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mrdafoe/v15/lJwE-pIzkS5NXuMMrFiribc.ttf" + }, + { + "family": "Mr De Haviland", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/mrdehaviland/v15/OpNVnooIhJj96FdB73296ksbOj3C4ULVNTlB.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mrdehaviland/v15/OpNVnooIhJj96FdB73296ksbOg3D60Y.ttf" + }, + { + "family": "Mrs Saint Delafield", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/mrssaintdelafield/v14/v6-IGZDIOVXH9xtmTZfRagunqBw5WC62cK4tLsubB2w.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mrssaintdelafield/v14/v6-IGZDIOVXH9xtmTZfRagunqBw5WC62QK8nKg.ttf" + }, + { + "family": "Mrs Sheppards", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/mrssheppards/v25/PN_2Rfm9snC0XUGoEZhb91ig3vjxynMix4Y.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mrssheppards/v25/PN_2Rfm9snC0XUGoEZhb91ig7vn7zg.ttf" + }, + { + "family": "Ms Madi", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/msmadi/v2/HTxsL2UxNnOji5E1N-DPiI7QAYo.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/msmadi/v2/HTxsL2UxNnOji5E1B-HFjA.ttf" + }, + { + "family": "Mukta", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbEOjFma-2HW7ZB_.ttf", + "300": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbFqj1ma-2HW7ZB_.ttf", + "regular": "https://fonts.gstatic.com/s/mukta/v17/iJWKBXyXfDDVXYnGp32S0H3f.ttf", + "500": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbEyjlma-2HW7ZB_.ttf", + "600": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbEeiVma-2HW7ZB_.ttf", + "700": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbF6iFma-2HW7ZB_.ttf", + "800": "https://fonts.gstatic.com/s/mukta/v17/iJWHBXyXfDDVXbFmi1ma-2HW7ZB_.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mukta/v17/iJWKBXyXfDDVXbnHrXk.ttf" + }, + { + "family": "Mukta Mahee", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "gurmukhi", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9MFcBoHJndqZCsW.ttf", + "300": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9NhcxoHJndqZCsW.ttf", + "regular": "https://fonts.gstatic.com/s/muktamahee/v19/XRXQ3IOIi0hcP8iVU67hA-vNWz4PDWtj.ttf", + "500": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9M5choHJndqZCsW.ttf", + "600": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9MVdRoHJndqZCsW.ttf", + "700": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9NxdBoHJndqZCsW.ttf", + "800": "https://fonts.gstatic.com/s/muktamahee/v19/XRXN3IOIi0hcP8iVU67hA9NtdxoHJndqZCsW.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/muktamahee/v19/XRXQ3IOIi0hcP8iVU67hA9vMUTo.ttf" + }, + { + "family": "Mukta Malar", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqIMwBtAB62ruoAZW.ttf", + "300": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqINUBdAB62ruoAZW.ttf", + "regular": "https://fonts.gstatic.com/s/muktamalar/v14/MCoXzAXyz8LOE2FpJMxZqLv4LfQJwHbn.ttf", + "500": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqIMMBNAB62ruoAZW.ttf", + "600": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqIMgA9AB62ruoAZW.ttf", + "700": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqINEAtAB62ruoAZW.ttf", + "800": "https://fonts.gstatic.com/s/muktamalar/v14/MCoKzAXyz8LOE2FpJMxZqINYAdAB62ruoAZW.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/muktamalar/v14/MCoXzAXyz8LOE2FpJMxZqIv5J_A.ttf" + }, + { + "family": "Mukta Vaani", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGXNV8BD-u97MW1a.ttf", + "300": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGWpVMBD-u97MW1a.ttf", + "regular": "https://fonts.gstatic.com/s/muktavaani/v15/3Jn5SD_-ynaxmxnEfVHPIF0FfORL0fNy.ttf", + "500": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGXxVcBD-u97MW1a.ttf", + "600": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGXdUsBD-u97MW1a.ttf", + "700": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGW5U8BD-u97MW1a.ttf", + "800": "https://fonts.gstatic.com/s/muktavaani/v15/3JnkSD_-ynaxmxnEfVHPIGWlUMBD-u97MW1a.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/muktavaani/v15/3Jn5SD_-ynaxmxnEfVHPIG0EduA.ttf" + }, + { + "family": "Mulish", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexRNRwaClGrw-PTY.ttf", + "300": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexc1RwaClGrw-PTY.ttf", + "regular": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexZNRwaClGrw-PTY.ttf", + "500": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexaFRwaClGrw-PTY.ttf", + "600": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexU1WwaClGrw-PTY.ttf", + "700": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexXRWwaClGrw-PTY.ttf", + "800": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexRNWwaClGrw-PTY.ttf", + "900": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexTpWwaClGrw-PTY.ttf", + "200italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSqeOvHp47LTZFwA.ttf", + "300italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSd-OvHp47LTZFwA.ttf", + "italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSKeOvHp47LTZFwA.ttf", + "500italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSG-OvHp47LTZFwA.ttf", + "600italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsS9-SvHp47LTZFwA.ttf", + "700italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSzuSvHp47LTZFwA.ttf", + "800italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSqeSvHp47LTZFwA.ttf", + "900italic": "https://fonts.gstatic.com/s/mulish/v18/1Ptwg83HX_SGhgqk2hAjQlW_mEuZ0FsSgOSvHp47LTZFwA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mulish/v18/1Ptyg83HX_SGhgqO0yLcmjzUAuWexZNR8aGvHg.ttf" + }, + { + "family": "Murecho", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "japanese", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMpr5HWZLCpUOaM6.ttf", + "200": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMrr5XWZLCpUOaM6.ttf", + "300": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMo15XWZLCpUOaM6.ttf", + "regular": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMpr5XWZLCpUOaM6.ttf", + "500": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMpZ5XWZLCpUOaM6.ttf", + "600": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMq14nWZLCpUOaM6.ttf", + "700": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMqM4nWZLCpUOaM6.ttf", + "800": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMrr4nWZLCpUOaM6.ttf", + "900": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMrC4nWZLCpUOaM6.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/murecho/v17/q5uYsoq3NOBn_I-ggCJg98TBOoNFCMpr5UWYJi4.ttf" + }, + { + "family": "MuseoModerno", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMlZFuewajeKlCdo.ttf", + "200": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMtZEuewajeKlCdo.ttf", + "300": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMghEuewajeKlCdo.ttf", + "regular": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMlZEuewajeKlCdo.ttf", + "500": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMmREuewajeKlCdo.ttf", + "600": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMohDuewajeKlCdo.ttf", + "700": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMrFDuewajeKlCdo.ttf", + "800": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMtZDuewajeKlCdo.ttf", + "900": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMv9DuewajeKlCdo.ttf", + "100italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HUa4QicCgGdrS3g.ttf", + "200italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54H0a8QicCgGdrS3g.ttf", + "300italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HD68QicCgGdrS3g.ttf", + "italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HUa8QicCgGdrS3g.ttf", + "500italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HY68QicCgGdrS3g.ttf", + "600italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54Hj6gQicCgGdrS3g.ttf", + "700italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54HtqgQicCgGdrS3g.ttf", + "800italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54H0agQicCgGdrS3g.ttf", + "900italic": "https://fonts.gstatic.com/s/museomoderno/v29/zrfx0HnU0_7wWdMrFcWqSEXlXhPlgPcSP5dZJ54H-KgQicCgGdrS3g.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/museomoderno/v29/zrf30HnU0_7wWdMrFcWqSEXPVyEaWJ55pTleMlZEie0QiQ.ttf" + }, + { + "family": "My Soul", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/mysoul/v7/3XFqErcuy945_u6KF_Ulk2nnXf0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mysoul/v7/3XFqErcuy945_u6KJ_Qvlw.ttf" + }, + { + "family": "Mynerve", + "variants": [ + "regular" + ], + "subsets": [ + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/mynerve/v8/P5sCzZKPdNjb4jt7xCRuiZ-uydg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mynerve/v8/P5sCzZKPdNjb4jt79CVkjQ.ttf" + }, + { + "family": "Mystery Quest", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/mysteryquest/v21/-nF6OG414u0E6k0wynSGlujRHwElD_9Qz9E.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/mysteryquest/v21/-nF6OG414u0E6k0wynSGlujRLwAvCw.ttf" + }, + { + "family": "NTR", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/ntr/v19/RLpzK5Xy0ZjiGGhs5TA4bg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ntr/v19/RLpzK5Xy0ZjSGWJo.ttf" + }, + { + "family": "Nabla", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "math", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/nabla/v17/j8_D6-LI0Lvpe7Makz5UhJt9C3uqg_X_75gyGS4jAxsNIjrRNRBUFFR_198.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nabla/v17/j8_D6-LI0Lvpe7Makz5UhJt9C3uqg_X_75gyGS4jAxsNIjrRBRFeEA.ttf", + "colorCapabilities": [ + "COLRv1", + "SVG" + ] + }, + { + "family": "Namdhinggo", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "limbu" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-mEGe3rbgg8Xzoy5-TDnWj4yxx7o8.ttf", + "500": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-lEGe3rbgg8Xzoy5-TNoGKxyRa8oZK9I0.ttf", + "600": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-lEGe3rbgg8Xzoy5-TNq2NxyRa8oZK9I0.ttf", + "700": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-lEGe3rbgg8Xzoy5-TNsmMxyRa8oZK9I0.ttf", + "800": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-lEGe3rbgg8Xzoy5-TNtWPxyRa8oZK9I0.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/namdhinggo/v2/uk-mEGe3rbgg8Xzoy5-TPnSp5w.ttf" + }, + { + "family": "Nanum Brush Script", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/nanumbrushscript/v26/wXK2E2wfpokopxzthSqPbcR5_gVaxazyjqBr1lO97Q.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nanumbrushscript/v26/wXK2E2wfpokopxzthSqPbcR5_gVaxazCj6pv.ttf" + }, + { + "family": "Nanum Gothic", + "variants": [ + "regular", + "700", + "800" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v26", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/nanumgothic/v26/PN_3Rfi-oW3hYwmKDpxS7F_z_tLfxno73g.ttf", + "700": "https://fonts.gstatic.com/s/nanumgothic/v26/PN_oRfi-oW3hYwmKDpxS7F_LQv37zlEn14YEUQ.ttf", + "800": "https://fonts.gstatic.com/s/nanumgothic/v26/PN_oRfi-oW3hYwmKDpxS7F_LXv77zlEn14YEUQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nanumgothic/v26/PN_3Rfi-oW3hYwmKDpxS7F_D_9jb.ttf" + }, + { + "family": "Nanum Gothic Coding", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/nanumgothiccoding/v27/8QIVdjzHisX_8vv59_xMxtPFW4IXROwsy6QxVs1X7tc.ttf", + "700": "https://fonts.gstatic.com/s/nanumgothiccoding/v27/8QIYdjzHisX_8vv59_xMxtPFW4IXROws8xgecsV88t5V9r4.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nanumgothiccoding/v27/8QIVdjzHisX_8vv59_xMxtPFW4IXROws-6U7Ug.ttf" + }, + { + "family": "Nanum Myeongjo", + "variants": [ + "regular", + "700", + "800" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v31", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/nanummyeongjo/v31/9Btx3DZF0dXLMZlywRbVRNhxy1LreHQ8juyl.ttf", + "700": "https://fonts.gstatic.com/s/nanummyeongjo/v31/9Bty3DZF0dXLMZlywRbVRNhxy2pXV1A0pfCs5Kos.ttf", + "800": "https://fonts.gstatic.com/s/nanummyeongjo/v31/9Bty3DZF0dXLMZlywRbVRNhxy2pLVFA0pfCs5Kos.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nanummyeongjo/v31/9Btx3DZF0dXLMZlywRbVRNhxy2LqcnA.ttf" + }, + { + "family": "Nanum Pen Script", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v25", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/nanumpenscript/v25/daaDSSYiLGqEal3MvdA_FOL_3FkN2z7-aMFCcTU.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nanumpenscript/v25/daaDSSYiLGqEal3MvdA_FOL_3FkN6z_0bA.ttf" + }, + { + "family": "Narnoor", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "gunjala-gondi", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v10", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/narnoor/v10/cIf9MaFWuVo-UTyPxCmrYGkHgIs.ttf", + "500": "https://fonts.gstatic.com/s/narnoor/v10/cIf4MaFWuVo-UTyP_N2CRGEsnIJkWL4.ttf", + "600": "https://fonts.gstatic.com/s/narnoor/v10/cIf4MaFWuVo-UTyP_PGFRGEsnIJkWL4.ttf", + "700": "https://fonts.gstatic.com/s/narnoor/v10/cIf4MaFWuVo-UTyP_JWERGEsnIJkWL4.ttf", + "800": "https://fonts.gstatic.com/s/narnoor/v10/cIf4MaFWuVo-UTyP_ImHRGEsnIJkWL4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/narnoor/v10/cIf9MaFWuVo-UTyP9CihZA.ttf" + }, + { + "family": "Nata Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-07-30", + "files": { + "100": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg6wI6g2M62M1AXs.ttf", + "200": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChgywJ6g2M62M1AXs.ttf", + "300": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg_IJ6g2M62M1AXs.ttf", + "regular": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg6wJ6g2M62M1AXs.ttf", + "500": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg54J6g2M62M1AXs.ttf", + "600": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg3IO6g2M62M1AXs.ttf", + "700": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg0sO6g2M62M1AXs.ttf", + "800": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChgywO6g2M62M1AXs.ttf", + "900": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChgwUO6g2M62M1AXs.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/natasans/v1/1q2XY5KBClBit88SU_tUw-brVNlaeZChg6wJ2gyG7w.ttf" + }, + { + "family": "National Park", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfL_b5XMdoayNUNf.ttf", + "300": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfIhb5XMdoayNUNf.ttf", + "regular": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfJ_b5XMdoayNUNf.ttf", + "500": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfJNb5XMdoayNUNf.ttf", + "600": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfKhaJXMdoayNUNf.ttf", + "700": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfKYaJXMdoayNUNf.ttf", + "800": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfL_aJXMdoayNUNf.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nationalpark/v4/GftQ7vJOtg4NO-gmoY4nmcqP-VY9vs1ixcqgHfJ_b6XNfII.ttf" + }, + { + "family": "Neonderthaw", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/neonderthaw/v8/Iure6Yx5-oWVZI0r-17AeZZJprVA4XQ0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/neonderthaw/v8/Iure6Yx5-oWVZI0r-17AeaZIrLE.ttf" + }, + { + "family": "Nerko One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/nerkoone/v17/m8JQjfZSc7OXlB3ZMOjzcJ5BZmqa3A.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nerkoone/v17/m8JQjfZSc7OXlB3ZMOjDcZRF.ttf" + }, + { + "family": "Neucha", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/neucha/v18/q5uGsou0JOdh94bvugNsCxVEgA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/neucha/v18/q5uGsou0JOdh94bfuwlo.ttf" + }, + { + "family": "Neuton", + "variants": [ + "200", + "300", + "regular", + "italic", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/neuton/v24/UMBQrPtMoH62xUZKAKkfegD5Drog6Q.ttf", + "300": "https://fonts.gstatic.com/s/neuton/v24/UMBQrPtMoH62xUZKZKofegD5Drog6Q.ttf", + "regular": "https://fonts.gstatic.com/s/neuton/v24/UMBTrPtMoH62xUZyyII7civlBw.ttf", + "italic": "https://fonts.gstatic.com/s/neuton/v24/UMBRrPtMoH62xUZCyog_UC71B6M5.ttf", + "700": "https://fonts.gstatic.com/s/neuton/v24/UMBQrPtMoH62xUZKdK0fegD5Drog6Q.ttf", + "800": "https://fonts.gstatic.com/s/neuton/v24/UMBQrPtMoH62xUZKaK4fegD5Drog6Q.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/neuton/v24/UMBTrPtMoH62xUZCyYg_.ttf" + }, + { + "family": "New Amsterdam", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/newamsterdam/v1/YA9Vr02Y5lucHqUlbEe51kBtl7mGiv_Q7dA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/newamsterdam/v1/YA9Vr02Y5lucHqUlbEe51kBtp7iMjg.ttf" + }, + { + "family": "New Rocker", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/newrocker/v17/MwQzbhjp3-HImzcCU_cJkGMViblPtXs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/newrocker/v17/MwQzbhjp3-HImzcCU_cJoGIfjQ.ttf" + }, + { + "family": "New Tegomin", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/newtegomin/v13/SLXMc1fV7Gd9USdBAfPlqfN0Q3ptkDMN.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/newtegomin/v13/SLXMc1fV7Gd9USdBAfPlqcN1SX4.ttf" + }, + { + "family": "News Cycle", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/newscycle/v26/CSR64z1Qlv-GDxkbKVQ_TOcATNt_pOU.ttf", + "700": "https://fonts.gstatic.com/s/newscycle/v26/CSR54z1Qlv-GDxkbKVQ_dFsvaNNUuOwkC2s.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/newscycle/v26/CSR64z1Qlv-GDxkbKVQ_fOYKSA.ttf" + }, + { + "family": "Newsreader", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438w-I_ADOxEPjCggA.ttf", + "300": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438wJo_ADOxEPjCggA.ttf", + "regular": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438weI_ADOxEPjCggA.ttf", + "500": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438wSo_ADOxEPjCggA.ttf", + "600": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438wpojADOxEPjCggA.ttf", + "700": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438wn4jADOxEPjCggA.ttf", + "800": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438w-IjADOxEPjCggA.ttf", + "200italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMyoT-ZAHDWwgECi.ttf", + "300italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMx2T-ZAHDWwgECi.ttf", + "italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMwoT-ZAHDWwgECi.ttf", + "500italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMwaT-ZAHDWwgECi.ttf", + "600italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMz2SOZAHDWwgECi.ttf", + "700italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMzPSOZAHDWwgECi.ttf", + "800italic": "https://fonts.gstatic.com/s/newsreader/v26/cY9kfjOCX1hbuyalUrK439vogqC9yFZCYg7oRZaLP4obnf7fTXglsMyoSOZAHDWwgECi.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/newsreader/v26/cY9qfjOCX1hbuyalUrK49dLac06G1ZGsZBtoBCzBDXXD9JVF438weI_wDeZA.ttf" + }, + { + "family": "Niconne", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/niconne/v16/w8gaH2QvRug1_rTfrQut2F4OuOo.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/niconne/v16/w8gaH2QvRug1_rTfnQqn3A.ttf" + }, + { + "family": "Niramit", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVXx7tiiEr5_BdZ8.ttf", + "200italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiXimOq73EZZ_f6w.ttf", + "300": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVRh4tiiEr5_BdZ8.ttf", + "300italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiOiqOq73EZZ_f6w.ttf", + "regular": "https://fonts.gstatic.com/s/niramit/v12/I_uuMpWdvgLdNxVLbbRQkiCvs5Y.ttf", + "italic": "https://fonts.gstatic.com/s/niramit/v12/I_usMpWdvgLdNxVLXbZalgKqo5bYbA.ttf", + "500": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVUB5tiiEr5_BdZ8.ttf", + "500italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiYiuOq73EZZ_f6w.ttf", + "600": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVWx-tiiEr5_BdZ8.ttf", + "600italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiTiyOq73EZZ_f6w.ttf", + "700": "https://fonts.gstatic.com/s/niramit/v12/I_urMpWdvgLdNxVLVQh_tiiEr5_BdZ8.ttf", + "700italic": "https://fonts.gstatic.com/s/niramit/v12/I_upMpWdvgLdNxVLXbZiKi2Oq73EZZ_f6w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/niramit/v12/I_uuMpWdvgLdNxVLXbValg.ttf" + }, + { + "family": "Nixie One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/nixieone/v17/lW-8wjkKLXjg5y2o2uUoUOFzpS-yLw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nixieone/v17/lW-8wjkKLXjg5y2o2uUYUet3.ttf" + }, + { + "family": "Nobile", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/nobile/v19/m8JTjflSeaOVl1i2XqfXeLVdbw.ttf", + "italic": "https://fonts.gstatic.com/s/nobile/v19/m8JRjflSeaOVl1iGXK3TWrBNb3OD.ttf", + "500": "https://fonts.gstatic.com/s/nobile/v19/m8JQjflSeaOVl1iOqo7zcJ5BZmqa3A.ttf", + "500italic": "https://fonts.gstatic.com/s/nobile/v19/m8JWjflSeaOVl1iGXJUnc5RFRG-K3Mud.ttf", + "700": "https://fonts.gstatic.com/s/nobile/v19/m8JQjflSeaOVl1iO4ojzcJ5BZmqa3A.ttf", + "700italic": "https://fonts.gstatic.com/s/nobile/v19/m8JWjflSeaOVl1iGXJVvdZRFRG-K3Mud.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nobile/v19/m8JTjflSeaOVl1iGX63T.ttf" + }, + { + "family": "Nokora", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v34", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMuj1ecbKpdHdrk1k.ttf", + "200": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMur1fcbKpdHdrk1k.ttf", + "300": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMumNfcbKpdHdrk1k.ttf", + "regular": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMuj1fcbKpdHdrk1k.ttf", + "500": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMug9fcbKpdHdrk1k.ttf", + "600": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMuuNYcbKpdHdrk1k.ttf", + "700": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMutpYcbKpdHdrk1k.ttf", + "800": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMur1YcbKpdHdrk1k.ttf", + "900": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMupRYcbKpdHdrk1k.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nokora/v34/hYkVPuwgTubzaWxKMBj_emrD9wtMuj1fQbOjcA.ttf" + }, + { + "family": "Norican", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/norican/v16/MwQ2bhXp1eSBqjkPGJJRtGs-lbA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/norican/v16/MwQ2bhXp1eSBqjkPKJNbsA.ttf" + }, + { + "family": "Nosifer", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/nosifer/v23/ZGjXol5JTp0g5bxZaC1RVDNdGDs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nosifer/v23/ZGjXol5JTp0g5bxZWCxbUA.ttf" + }, + { + "family": "Notable", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/notable/v20/gNMEW3N_SIqx-WX9-HMoFIez5MI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notable/v20/gNMEW3N_SIqx-WX9yHIiEA.ttf" + }, + { + "family": "Nothing You Could Do", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/nothingyoucoulddo/v21/oY1B8fbBpaP5OX3DtrRYf_Q2BPB1SnfZb0OJl1ol2Ymo.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nothingyoucoulddo/v21/oY1B8fbBpaP5OX3DtrRYf_Q2BPB1SnfZb3OInV4.ttf" + }, + { + "family": "Noticia Text", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/noticiatext/v16/VuJ2dNDF2Yv9qppOePKYRP1GYTFZt0rNpQ.ttf", + "italic": "https://fonts.gstatic.com/s/noticiatext/v16/VuJodNDF2Yv9qppOePKYRP12YztdlU_dpSjt.ttf", + "700": "https://fonts.gstatic.com/s/noticiatext/v16/VuJpdNDF2Yv9qppOePKYRP1-3R59v2HRrDH0eA.ttf", + "700italic": "https://fonts.gstatic.com/s/noticiatext/v16/VuJrdNDF2Yv9qppOePKYRP12YwPhumvVjjTkeMnz.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/noticiatext/v16/VuJ2dNDF2Yv9qppOePKYRP12YDtd.ttf" + }, + { + "family": "Noto Color Emoji", + "variants": [ + "regular" + ], + "subsets": [ + "emoji" + ], + "version": "v36", + "lastModified": "2025-09-06", + "files": { + "regular": "https://fonts.gstatic.com/s/notocoloremoji/v36/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFab5s79iz64w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notocoloremoji/v36/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFWb9m6w.ttf", + "colorCapabilities": [ + "COLRv1", + "SVG" + ] + }, + { + "family": "Noto Emoji", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "emoji" + ], + "version": "v61", + "lastModified": "2025-09-17", + "files": { + "300": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob_10jwvS-FGJCMY.ttf", + "regular": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-r0jwvS-FGJCMY.ttf", + "500": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-Z0jwvS-FGJCMY.ttf", + "600": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob911TwvS-FGJCMY.ttf", + "700": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob9M1TwvS-FGJCMY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoemoji/v61/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-r0gwuQeU.ttf" + }, + { + "family": "Noto Kufi Arabic", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v27", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh5v3obPnLSmf5yD.ttf", + "200": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh7v34bPnLSmf5yD.ttf", + "300": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh4x34bPnLSmf5yD.ttf", + "regular": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh5v34bPnLSmf5yD.ttf", + "500": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh5d34bPnLSmf5yD.ttf", + "600": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh6x2IbPnLSmf5yD.ttf", + "700": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh6I2IbPnLSmf5yD.ttf", + "800": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh7v2IbPnLSmf5yD.ttf", + "900": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh7G2IbPnLSmf5yD.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notokufiarabic/v27/CSRp4ydQnPyaDxEXLFF6LZVLKrodhu8t57o1kDc5Wh5v37bOlrA.ttf" + }, + { + "family": "Noto Music", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "music" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notomusic/v21/pe0rMIiSN5pO63htf1sxIteQB9Zra1U.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notomusic/v21/pe0rMIiSN5pO63htf1sxEtaaAw.ttf" + }, + { + "family": "Noto Naskh Arabic", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v43", + "lastModified": "2025-11-20", + "files": { + "regular": "https://fonts.gstatic.com/s/notonaskharabic/v43/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwvc5krK0z9_Mnuw.ttf", + "500": "https://fonts.gstatic.com/s/notonaskharabic/v43/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwj85krK0z9_Mnuw.ttf", + "600": "https://fonts.gstatic.com/s/notonaskharabic/v43/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwY8lkrK0z9_Mnuw.ttf", + "700": "https://fonts.gstatic.com/s/notonaskharabic/v43/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwWslkrK0z9_Mnuw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notonaskharabic/v43/RrQ5bpV-9Dd1b1OAGA6M9PkyDuVBePeKNaxcsss0Y7bwvc5Urac3.ttf" + }, + { + "family": "Noto Nastaliq Urdu", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3Qt_-DK2f2-_8mEw.ttf", + "500": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3Qu3-DK2f2-_8mEw.ttf", + "600": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3QgH5DK2f2-_8mEw.ttf", + "700": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3Qjj5DK2f2-_8mEw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notonastaliqurdu/v23/LhWNMUPbN-oZdNFcBy1-DJYsEoTq5pudQ9L940pGPkB3Qt_-PKyV3w.ttf" + }, + { + "family": "Noto Rashi Hebrew", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "greek-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZB-DkRyq6Nf2pfA.ttf", + "200": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZh-HkRyq6Nf2pfA.ttf", + "300": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZWeHkRyq6Nf2pfA.ttf", + "regular": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZB-HkRyq6Nf2pfA.ttf", + "500": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZNeHkRyq6Nf2pfA.ttf", + "600": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZ2ebkRyq6Nf2pfA.ttf", + "700": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZ4ObkRyq6Nf2pfA.ttf", + "800": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZh-bkRyq6Nf2pfA.ttf", + "900": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZrubkRyq6Nf2pfA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notorashihebrew/v28/EJR_Qh82XsIK-QFmqXk4zvLwFVya0vFL-HlKM5e6C6HZB-HURiC-.ttf" + }, + { + "family": "Noto Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "devanagari", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v42", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9At9d41P6zHtY.ttf", + "200": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyB9A99d41P6zHtY.ttf", + "300": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyCjA99d41P6zHtY.ttf", + "regular": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9A99d41P6zHtY.ttf", + "500": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyDPA99d41P6zHtY.ttf", + "600": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyAjBN9d41P6zHtY.ttf", + "700": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyAaBN9d41P6zHtY.ttf", + "800": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyB9BN9d41P6zHtY.ttf", + "900": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyBUBN9d41P6zHtY.ttf", + "100italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QDcf6VfYyWtY1rI.ttf", + "200italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QLce6VfYyWtY1rI.ttf", + "300italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QGke6VfYyWtY1rI.ttf", + "italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QDce6VfYyWtY1rI.ttf", + "500italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QAUe6VfYyWtY1rI.ttf", + "600italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QOkZ6VfYyWtY1rI.ttf", + "700italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QNAZ6VfYyWtY1rI.ttf", + "800italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QLcZ6VfYyWtY1rI.ttf", + "900italic": "https://fonts.gstatic.com/s/notosans/v42/o-0kIpQlx3QUlC5A4PNr4C5OaxRsfNNlKbCePevHtVtX57DGjDU1QJ4Z6VfYyWtY1rI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosans/v42/o-0mIpQlx3QUlC5A4PNB6Ryti20_6n1iPHjcz6L1SoM-jCpoiyD9A-9c6Vc.ttf" + }, + { + "family": "Noto Sans Adlam", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "adlam", + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufnv0TGnBZLwhuvk.ttf", + "500": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufkn0TGnBZLwhuvk.ttf", + "600": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufqXzTGnBZLwhuvk.ttf", + "700": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufpzzTGnBZLwhuvk.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansadlam/v27/neIczCCpqp0s5pPusPamd81eMfjPonvqdbYxxpgufnv0fGjLYA.ttf" + }, + { + "family": "Noto Sans Adlam Unjoined", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "adlam", + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_Ye35PMEe-E3slUg.ttf", + "500": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_Yd_5PMEe-E3slUg.ttf", + "600": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_YTP-PMEe-E3slUg.ttf", + "700": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_YQr-PMEe-E3slUg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansadlamunjoined/v28/P5sszY2MYsLRsB5_ildkzPPDsLQXcOEmaFOqOGcaYrzFTIjsPam_Ye35DMAU_A.ttf" + }, + { + "family": "Noto Sans Anatolian Hieroglyphs", + "variants": [ + "regular" + ], + "subsets": [ + "anatolian-hieroglyphs", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansanatolianhieroglyphs/v17/ijw9s4roRME5LLRxjsRb8A0gKPSWq4BbDmHHu6j2pEtUJzZWXybIymc5QYo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansanatolianhieroglyphs/v17/ijw9s4roRME5LLRxjsRb8A0gKPSWq4BbDmHHu6j2pEtUJzZWbyfCzg.ttf" + }, + { + "family": "Noto Sans Arabic", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v33", + "lastModified": "2025-09-17", + "files": { + "100": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfyG2vu3CBFQLaig.ttf", + "200": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfSGyvu3CBFQLaig.ttf", + "300": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCflmyvu3CBFQLaig.ttf", + "regular": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfyGyvu3CBFQLaig.ttf", + "500": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCf-myvu3CBFQLaig.ttf", + "600": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfFmuvu3CBFQLaig.ttf", + "700": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfL2uvu3CBFQLaig.ttf", + "800": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfSGuvu3CBFQLaig.ttf", + "900": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfYWuvu3CBFQLaig.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansarabic/v33/nwpxtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlhQ5l3sQWIHPqzCfyGyfunqF.ttf" + }, + { + "family": "Noto Sans Armenian", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "armenian", + "latin", + "latin-ext" + ], + "version": "v47", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLorxbq0iYy6zF3Eg.ttf", + "200": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLopxb60iYy6zF3Eg.ttf", + "300": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLoqvb60iYy6zF3Eg.ttf", + "regular": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLorxb60iYy6zF3Eg.ttf", + "500": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLorDb60iYy6zF3Eg.ttf", + "600": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLoovaK0iYy6zF3Eg.ttf", + "700": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLooWaK0iYy6zF3Eg.ttf", + "800": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLopxaK0iYy6zF3Eg.ttf", + "900": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLopYaK0iYy6zF3Eg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansarmenian/v47/ZgN0jOZKPa7CHqq0h37c7ReDUubm2SEdFXp7ig73qtTY5idb74R9UdM3y2nZLorxb50jaSo.ttf" + }, + { + "family": "Noto Sans Avestan", + "variants": [ + "regular" + ], + "subsets": [ + "avestan", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansavestan/v22/bWti7ejKfBziStx7lIzKOLQZKhIJkyu9SASLji8U.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansavestan/v22/bWti7ejKfBziStx7lIzKOLQZKhIJkxu8QgA.ttf" + }, + { + "family": "Noto Sans Balinese", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "balinese", + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov7fdhE5Vd222PPY.ttf", + "500": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov4XdhE5Vd222PPY.ttf", + "600": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov2nahE5Vd222PPY.ttf", + "700": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov1DahE5Vd222PPY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansbalinese/v27/NaPwcYvSBuhTirw6IaFn6UrRDaqje-lpbbRtYf-Fwu2Ov7fdtE9fcw.ttf" + }, + { + "family": "Noto Sans Bamum", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "bamum", + "latin", + "latin-ext" + ], + "version": "v35", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPEddO-_gLykxEkxA.ttf", + "500": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPEeVO-_gLykxEkxA.ttf", + "600": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPEQlJ-_gLykxEkxA.ttf", + "700": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPETBJ-_gLykxEkxA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansbamum/v35/uk-0EGK3o6EruUbnwovcbBTkkklK_Ya_PBHfNGTPEddOy_kBzg.ttf" + }, + { + "family": "Noto Sans Bassa Vah", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "bassa-vah", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4MaAc6p34gH-GD7.ttf", + "500": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4MoAc6p34gH-GD7.ttf", + "600": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4PEBs6p34gH-GD7.ttf", + "700": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4P9Bs6p34gH-GD7.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansbassavah/v21/PN_bRee-r3f7LnqsD5sax12gjZn7mBpL5YwUpA2MBdcFn4MaAf6o1Yw.ttf" + }, + { + "family": "Noto Sans Batak", + "variants": [ + "regular" + ], + "subsets": [ + "batak", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansbatak/v23/gok2H6TwAEdtF9N8-mdTCQvT-Zdgo4_PHuk74A.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansbatak/v23/gok2H6TwAEdtF9N8-mdTCQvT-ZdQooXL.ttf" + }, + { + "family": "Noto Sans Bengali", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "bengali", + "latin", + "latin-ext" + ], + "version": "v32", + "lastModified": "2025-09-17", + "files": { + "100": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsolKudCk8izI0lc.ttf", + "200": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsglLudCk8izI0lc.ttf", + "300": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmstdLudCk8izI0lc.ttf", + "regular": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsolLudCk8izI0lc.ttf", + "500": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsrtLudCk8izI0lc.ttf", + "600": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsldMudCk8izI0lc.ttf", + "700": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6Kmsm5MudCk8izI0lc.ttf", + "800": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsglMudCk8izI0lc.ttf", + "900": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsiBMudCk8izI0lc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansbengali/v32/Cn-SJsCGWQxOjaGwMQ6fIiMywrNJIky6nvd8BjzVMvJx2mcSPVFpVEqE-6KmsolLidGu9g.ttf" + }, + { + "family": "Noto Sans Bhaiksuki", + "variants": [ + "regular" + ], + "subsets": [ + "bhaiksuki", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansbhaiksuki/v18/UcC63EosKniBH4iELXATsSBWdvUHXxhj8rLUdU4wh9U.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansbhaiksuki/v18/UcC63EosKniBH4iELXATsSBWdvUHXxhjwrPecQ.ttf" + }, + { + "family": "Noto Sans Brahmi", + "variants": [ + "regular" + ], + "subsets": [ + "brahmi", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansbrahmi/v20/vEFK2-VODB8RrNDvZSUmQQIIByV18tK1W77HtMo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansbrahmi/v20/vEFK2-VODB8RrNDvZSUmQQIIByV1wtO_Xw.ttf" + }, + { + "family": "Noto Sans Buginese", + "variants": [ + "regular" + ], + "subsets": [ + "buginese", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansbuginese/v19/esDM30ldNv-KYGGJpKGk18phe_7Da6_gtfuEXLmNtw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansbuginese/v19/esDM30ldNv-KYGGJpKGk18phe_7Da6_QtPGA.ttf" + }, + { + "family": "Noto Sans Buhid", + "variants": [ + "regular" + ], + "subsets": [ + "buhid", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansbuhid/v23/Dxxy8jiXMW75w3OmoDXVWJD7YwzAe6tgnaFoGA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansbuhid/v23/Dxxy8jiXMW75w3OmoDXVWJD7YwzweqFk.ttf" + }, + { + "family": "Noto Sans Canadian Aboriginal", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "canadian-aboriginal", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigWLj_yAsg0q0uhQ.ttf", + "200": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzig2Ln_yAsg0q0uhQ.ttf", + "300": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigBrn_yAsg0q0uhQ.ttf", + "regular": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigWLn_yAsg0q0uhQ.ttf", + "500": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigarn_yAsg0q0uhQ.ttf", + "600": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzighr7_yAsg0q0uhQ.ttf", + "700": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigv77_yAsg0q0uhQ.ttf", + "800": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzig2L7_yAsg0q0uhQ.ttf", + "900": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzig8b7_yAsg0q0uhQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanscanadianaboriginal/v28/4C_TLjTuEqPj-8J01CwaGkiZ9os0iGVkezM1mUT-j_Lmlzda6uH_nnX1bzigWLnPyQEk.ttf" + }, + { + "family": "Noto Sans Carian", + "variants": [ + "regular" + ], + "subsets": [ + "carian", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanscarian/v17/LDIpaoiONgYwA9Yc6f0gUILeMIOgs7ob9yGLmfI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanscarian/v17/LDIpaoiONgYwA9Yc6f0gUILeMIOgg7sR8w.ttf" + }, + { + "family": "Noto Sans Caucasian Albanian", + "variants": [ + "regular" + ], + "subsets": [ + "caucasian-albanian", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanscaucasianalbanian/v19/nKKA-HM_FYFRJvXzVXaANsU0VzsAc46QGOkWytlTs-TXrYDmoVmRSZo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanscaucasianalbanian/v19/nKKA-HM_FYFRJvXzVXaANsU0VzsAc46QGOkWytlTs-TXnYHspQ.ttf" + }, + { + "family": "Noto Sans Chakma", + "variants": [ + "regular" + ], + "subsets": [ + "chakma", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanschakma/v18/Y4GQYbJ8VTEp4t3MKJSMjg5OIzhi4JjTQhYBeYo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanschakma/v18/Y4GQYbJ8VTEp4t3MKJSMjg5OIzhi0JnZRg.ttf" + }, + { + "family": "Noto Sans Cham", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cham", + "latin", + "latin-ext" + ], + "version": "v33", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcER0cv7GykboaLg.ttf", + "200": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfckRwcv7GykboaLg.ttf", + "300": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcTxwcv7GykboaLg.ttf", + "regular": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcERwcv7GykboaLg.ttf", + "500": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcIxwcv7GykboaLg.ttf", + "600": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfczxscv7GykboaLg.ttf", + "700": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfc9hscv7GykboaLg.ttf", + "800": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfckRscv7GykboaLg.ttf", + "900": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcuBscv7GykboaLg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanscham/v33/pe06MIySN5pO62Z5YkFyQb_bbuRhe6D4yip43qfcERwsvru2.ttf" + }, + { + "family": "Noto Sans Cherokee", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cherokee", + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWi5ODkm5rAffjl0.ttf", + "200": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWq5PDkm5rAffjl0.ttf", + "300": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWnBPDkm5rAffjl0.ttf", + "regular": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWi5PDkm5rAffjl0.ttf", + "500": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWhxPDkm5rAffjl0.ttf", + "600": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWvBIDkm5rAffjl0.ttf", + "700": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWslIDkm5rAffjl0.ttf", + "800": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWq5IDkm5rAffjl0.ttf", + "900": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWodIDkm5rAffjl0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanscherokee/v25/KFOPCm6Yu8uF-29fiz9vQF9YWK6Z8O10cHNA0cSkZCHYWi5PPkizqA.ttf" + }, + { + "family": "Noto Sans Chorasmian", + "variants": [ + "regular" + ], + "subsets": [ + "chorasmian", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v3", + "lastModified": "2024-01-26", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanschorasmian/v3/MQpL-X6uKMC7ROPLwRnI9ULxK_7NVkf8S5vyoH7w4g9b.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanschorasmian/v3/MQpL-X6uKMC7ROPLwRnI9ULxK_7NVkf8S6vzqno.ttf" + }, + { + "family": "Noto Sans Coptic", + "variants": [ + "regular" + ], + "subsets": [ + "coptic", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanscoptic/v22/iJWfBWmUZi_OHPqn4wq6kgqumOEd78u_VG0xR4Y.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanscoptic/v22/iJWfBWmUZi_OHPqn4wq6kgqumOEd38q1UA.ttf" + }, + { + "family": "Noto Sans Cuneiform", + "variants": [ + "regular" + ], + "subsets": [ + "cuneiform", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanscuneiform/v18/bMrrmTWK7YY-MF22aHGGd7H8PhJtvBDWgb9JlRQueeQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanscuneiform/v18/bMrrmTWK7YY-MF22aHGGd7H8PhJtvBDWsb5DkQ.ttf" + }, + { + "family": "Noto Sans Cypriot", + "variants": [ + "regular" + ], + "subsets": [ + "cypriot", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanscypriot/v20/8AtzGta9PYqQDjyp79a6f8Cj-3a3cxIsK5MPpahF.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanscypriot/v20/8AtzGta9PYqQDjyp79a6f8Cj-3a3cyItIZc.ttf" + }, + { + "family": "Noto Sans Cypro Minoan", + "variants": [ + "regular" + ], + "subsets": [ + "cypro-minoan", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanscyprominoan/v1/2Eb2L_dtDUlkNmPHB_UVtEzp3ZlPGqZ_4nAGq9eSf8_eQSE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanscyprominoan/v1/2Eb2L_dtDUlkNmPHB_UVtEzp3ZlPGqZ_4nAGm9aYew.ttf" + }, + { + "family": "Noto Sans Deseret", + "variants": [ + "regular" + ], + "subsets": [ + "deseret", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansdeseret/v18/MwQsbgPp1eKH6QsAVuFb9AZM6MMr2Vq9ZnJSZtQG.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansdeseret/v18/MwQsbgPp1eKH6QsAVuFb9AZM6MMr2Wq8bHY.ttf" + }, + { + "family": "Noto Sans Devanagari", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlXQky-AzoFoW4Ow.ttf", + "200": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlfQly-AzoFoW4Ow.ttf", + "300": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlSoly-AzoFoW4Ow.ttf", + "regular": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlXQly-AzoFoW4Ow.ttf", + "500": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlUYly-AzoFoW4Ow.ttf", + "600": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08Alaoiy-AzoFoW4Ow.ttf", + "700": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlZMiy-AzoFoW4Ow.ttf", + "800": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlfQiy-AzoFoW4Ow.ttf", + "900": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08Ald0iy-AzoFoW4Ow.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansdevanagari/v30/TuGoUUFzXI5FBtUq5a8bjKYTZjtRU6Sgv3NaV_SNmI0b8QQCQmHn6B2OHjbL_08AlXQl--E5pA.ttf" + }, + { + "family": "Noto Sans Display", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v30", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_3cLVTGQ2iHrvWM.ttf", + "200": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp__cKVTGQ2iHrvWM.ttf", + "300": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_ykKVTGQ2iHrvWM.ttf", + "regular": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_3cKVTGQ2iHrvWM.ttf", + "500": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_0UKVTGQ2iHrvWM.ttf", + "600": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_6kNVTGQ2iHrvWM.ttf", + "700": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_5ANVTGQ2iHrvWM.ttf", + "800": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp__cNVTGQ2iHrvWM.ttf", + "900": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_94NVTGQ2iHrvWM.ttf", + "100italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JvXOa3gPurWM9uQ.ttf", + "200italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JPXKa3gPurWM9uQ.ttf", + "300italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9J43Ka3gPurWM9uQ.ttf", + "italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JvXKa3gPurWM9uQ.ttf", + "500italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9Jj3Ka3gPurWM9uQ.ttf", + "600italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JY3Wa3gPurWM9uQ.ttf", + "700italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JWnWa3gPurWM9uQ.ttf", + "800italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JPXWa3gPurWM9uQ.ttf", + "900italic": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpZK4fy6r6tOBEJg0IAKzqdFZVZxrktbnDB5UzBIup9PwAcHtEsOFNBZqyu6r9JFHWa3gPurWM9uQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansdisplay/v30/RLpbK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LuV-PT4Doq_AKp_3cKZTCa3g.ttf" + }, + { + "family": "Noto Sans Duployan", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "duployan", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansduployan/v19/gokzH7nwAEdtF9N8-mdTDx_X9JM5wsvrFsIn6WYDvA.ttf", + "700": "https://fonts.gstatic.com/s/notosansduployan/v19/gokwH7nwAEdtF9N8-mdTDx_X9JM5wsvTqu0D4U0ftZS-Iw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansduployan/v19/gokzH7nwAEdtF9N8-mdTDx_X9JM5wsvbF8gj.ttf" + }, + { + "family": "Noto Sans Egyptian Hieroglyphs", + "variants": [ + "regular" + ], + "subsets": [ + "egyptian-hieroglyphs", + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansegyptianhieroglyphs/v30/vEF42-tODB8RrNDvZSUmRhcQHzx1s7y_F9-j3qSzEcbEYindSVK8xRg7iw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansegyptianhieroglyphs/v30/vEF42-tODB8RrNDvZSUmRhcQHzx1s7y_F9-j3qSzEcbEYintSFi4.ttf" + }, + { + "family": "Noto Sans Elbasan", + "variants": [ + "regular" + ], + "subsets": [ + "elbasan", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanselbasan/v17/-F6rfiZqLzI2JPCgQBnw400qp1trvHdlre4dFcFh.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanselbasan/v17/-F6rfiZqLzI2JPCgQBnw400qp1trvEdkp-o.ttf" + }, + { + "family": "Noto Sans Elymaic", + "variants": [ + "regular" + ], + "subsets": [ + "elymaic", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanselymaic/v18/UqyKK9YTJW5liNMhTMqe9vUFP65ZD4AjWOT0zi2V.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanselymaic/v18/UqyKK9YTJW5liNMhTMqe9vUFP65ZD7AiUuA.ttf" + }, + { + "family": "Noto Sans Ethiopic", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "ethiopic", + "latin", + "latin-ext" + ], + "version": "v50", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OKqDjwmfeaY9u.ttf", + "200": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T37OK6DjwmfeaY9u.ttf", + "300": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T34QK6DjwmfeaY9u.ttf", + "regular": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OK6DjwmfeaY9u.ttf", + "500": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T358K6DjwmfeaY9u.ttf", + "600": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T36QLKDjwmfeaY9u.ttf", + "700": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T36pLKDjwmfeaY9u.ttf", + "800": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T37OLKDjwmfeaY9u.ttf", + "900": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T37nLKDjwmfeaY9u.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OK5DiyGM.ttf" + }, + { + "family": "Noto Sans Georgian", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic-ext", + "georgian", + "greek-ext", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v48", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpvnzVj-f5WK0OQV.ttf", + "200": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdptnzFj-f5WK0OQV.ttf", + "300": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpu5zFj-f5WK0OQV.ttf", + "regular": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpvnzFj-f5WK0OQV.ttf", + "500": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpvVzFj-f5WK0OQV.ttf", + "600": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdps5y1j-f5WK0OQV.ttf", + "700": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpsAy1j-f5WK0OQV.ttf", + "800": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdptny1j-f5WK0OQV.ttf", + "900": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdptOy1j-f5WK0OQV.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansgeorgian/v48/PlIaFke5O6RzLfvNNVSitxkr76PRHBC4Ytyq-Gof7PUs4S7zWn-8YDB09HFNdpvnzGj_dZE.ttf" + }, + { + "family": "Noto Sans Glagolitic", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "glagolitic", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansglagolitic/v19/1q2ZY4-BBFBst88SU_tOj4J-4yuNF_HI4ERK4Amu7nM1.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansglagolitic/v19/1q2ZY4-BBFBst88SU_tOj4J-4yuNF_HI4HRL6g0.ttf" + }, + { + "family": "Noto Sans Gothic", + "variants": [ + "regular" + ], + "subsets": [ + "gothic", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansgothic/v17/TuGKUUVzXI5FBtUq5a8bj6wRbzxTFMX40kFQRx0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansgothic/v17/TuGKUUVzXI5FBtUq5a8bj6wRbzxTJMTy1g.ttf" + }, + { + "family": "Noto Sans Grantha", + "variants": [ + "regular" + ], + "subsets": [ + "grantha", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansgrantha/v20/3y976akwcCjmsU8NDyrKo3IQfQ4o-r8cFeulHc6N.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansgrantha/v20/3y976akwcCjmsU8NDyrKo3IQfQ4o-o8dH-8.ttf" + }, + { + "family": "Noto Sans Gujarati", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_ypFgPM_OdiEH0s.ttf", + "200": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_wpFwPM_OdiEH0s.ttf", + "300": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_z3FwPM_OdiEH0s.ttf", + "regular": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_ypFwPM_OdiEH0s.ttf", + "500": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_ybFwPM_OdiEH0s.ttf", + "600": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_x3EAPM_OdiEH0s.ttf", + "700": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_xOEAPM_OdiEH0s.ttf", + "800": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_wpEAPM_OdiEH0s.ttf", + "900": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_wAEAPM_OdiEH0s.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansgujarati/v27/wlpWgx_HC1ti5ViekvcxnhMlCVo3f5pv17ivlzsUB14gg1TMR2Gw4VceEl7MA_ypFzPN9uM.ttf" + }, + { + "family": "Noto Sans Gunjala Gondi", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "gunjala-gondi", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYL4YDE4J4vCTxEJQ.ttf", + "500": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYL04DE4J4vCTxEJQ.ttf", + "600": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYLP4fE4J4vCTxEJQ.ttf", + "700": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYLBofE4J4vCTxEJQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansgunjalagondi/v21/bWtX7e7KfBziStx7lIzKPrcSMwcEnCv6DW7n5g0ef3PLtymzNxYL4YD04ZQr.ttf" + }, + { + "family": "Noto Sans Gurmukhi", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "gurmukhi", + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG1Oe3bxZ_trdp7h.ttf", + "200": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG3OenbxZ_trdp7h.ttf", + "300": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG0QenbxZ_trdp7h.ttf", + "regular": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG1OenbxZ_trdp7h.ttf", + "500": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG18enbxZ_trdp7h.ttf", + "600": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG2QfXbxZ_trdp7h.ttf", + "700": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG2pfXbxZ_trdp7h.ttf", + "800": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG3OfXbxZ_trdp7h.ttf", + "900": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG3nfXbxZ_trdp7h.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansgurmukhi/v29/w8g9H3EvQP81sInb43inmyN9zZ7hb7ATbSWo4q8dJ74a3cVrYFQ_bogT0-gPeG1Oekbwbf8.ttf" + }, + { + "family": "Noto Sans HK", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "chinese-hongkong", + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v34", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qHB_-oWTiYjNvVA.ttf", + "200": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qPB--oWTiYjNvVA.ttf", + "300": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qC5--oWTiYjNvVA.ttf", + "regular": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qHB--oWTiYjNvVA.ttf", + "500": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qEJ--oWTiYjNvVA.ttf", + "600": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qK55-oWTiYjNvVA.ttf", + "700": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qJd5-oWTiYjNvVA.ttf", + "800": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qPB5-oWTiYjNvVA.ttf", + "900": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qNl5-oWTiYjNvVA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanshk/v34/nKKF-GM_FYFRJvXzVXaAPe97P1KHynJFP716qHB-yoSZjQ.ttf" + }, + { + "family": "Noto Sans Hanifi Rohingya", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "hanifi-rohingya", + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIYY4j6vvcudK8rN.ttf", + "500": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIYq4j6vvcudK8rN.ttf", + "600": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIbG5T6vvcudK8rN.ttf", + "700": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIb_5T6vvcudK8rN.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanshanifirohingya/v30/5h17iYsoOmIC3Yu3MDXLDw3UZCgghyOEBBY7hhLNyo3tiaiuSIAqrIYY4g6ut88.ttf" + }, + { + "family": "Noto Sans Hanunoo", + "variants": [ + "regular" + ], + "subsets": [ + "hanunoo", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanshanunoo/v22/f0Xs0fCv8dxkDWlZSoXOj6CphMloFsEsEpgL_ix2.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanshanunoo/v22/f0Xs0fCv8dxkDWlZSoXOj6CphMloFvEtGJw.ttf" + }, + { + "family": "Noto Sans Hatran", + "variants": [ + "regular" + ], + "subsets": [ + "hatran", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanshatran/v17/A2BBn4Ne0RgnVF3Lnko-0sOBIfL_mM83r1nwzDs.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanshatran/v17/A2BBn4Ne0RgnVF3Lnko-0sOBIfL_qM49qw.ttf" + }, + { + "family": "Noto Sans Hebrew", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic-ext", + "greek-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v50", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXd4utoiJltutR2g.ttf", + "200": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiX94qtoiJltutR2g.ttf", + "300": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXKYqtoiJltutR2g.ttf", + "regular": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXd4qtoiJltutR2g.ttf", + "500": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXRYqtoiJltutR2g.ttf", + "600": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXqY2toiJltutR2g.ttf", + "700": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXkI2toiJltutR2g.ttf", + "800": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiX942toiJltutR2g.ttf", + "900": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiX3o2toiJltutR2g.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanshebrew/v50/or3HQ7v33eiDljA1IufXTtVf7V6RvEEdhQlk0LlGxCyaeNKYZC0sqk3xXGiXd4qdoyhh.ttf" + }, + { + "family": "Noto Sans Imperial Aramaic", + "variants": [ + "regular" + ], + "subsets": [ + "imperial-aramaic", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansimperialaramaic/v18/a8IMNpjwKmHXpgXbMIsbTc_kvks91LlLetBr5itQrtdml3YfPNno.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansimperialaramaic/v18/a8IMNpjwKmHXpgXbMIsbTc_kvks91LlLetBr5itQrudnnXI.ttf" + }, + { + "family": "Noto Sans Indic Siyaq Numbers", + "variants": [ + "regular" + ], + "subsets": [ + "indic-siyaq-numbers", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansindicsiyaqnumbers/v17/6xK5dTJFKcWIu4bpRBjRZRpsIYHabOeZ8UZLubTzpXNHKx2WPOpVd5Iu.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansindicsiyaqnumbers/v17/6xK5dTJFKcWIu4bpRBjRZRpsIYHabOeZ8UZLubTzpXNHKy2XNu4.ttf" + }, + { + "family": "Noto Sans Inscriptional Pahlavi", + "variants": [ + "regular" + ], + "subsets": [ + "inscriptional-pahlavi", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansinscriptionalpahlavi/v18/ll8UK3GaVDuxR-TEqFPIbsR79Xxz9WEKbwsjpz7VklYlC7FCVtqVOAYK0QA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansinscriptionalpahlavi/v18/ll8UK3GaVDuxR-TEqFPIbsR79Xxz9WEKbwsjpz7VklYlC7FCZtufPA.ttf" + }, + { + "family": "Noto Sans Inscriptional Parthian", + "variants": [ + "regular" + ], + "subsets": [ + "inscriptional-parthian", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansinscriptionalparthian/v18/k3k7o-IMPvpLmixcA63oYi-yStDkgXuXncL7dzfW3P4TAJ2yklBJ2jNkLlLr.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansinscriptionalparthian/v18/k3k7o-IMPvpLmixcA63oYi-yStDkgXuXncL7dzfW3P4TAJ2ykmBI0Dc.ttf" + }, + { + "family": "Noto Sans JP", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v55", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFBEi75vY0rw-oME.ttf", + "200": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFJEj75vY0rw-oME.ttf", + "300": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFE8j75vY0rw-oME.ttf", + "regular": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFBEj75vY0rw-oME.ttf", + "500": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFCMj75vY0rw-oME.ttf", + "600": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFM8k75vY0rw-oME.ttf", + "700": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFPYk75vY0rw-oME.ttf", + "800": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFJEk75vY0rw-oME.ttf", + "900": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFLgk75vY0rw-oME.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansjp/v55/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFBEj35rS1g.ttf" + }, + { + "family": "Noto Sans Javanese", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "javanese", + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxJnkFFliZYWj4O8.ttf", + "500": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxKvkFFliZYWj4O8.ttf", + "600": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxEfjFFliZYWj4O8.ttf", + "700": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxH7jFFliZYWj4O8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansjavanese/v25/2V01KJkDAIA6Hp4zoSScDjV0Y-eoHAHT-Z3MngEefiidxJnkJFhoYQ.ttf" + }, + { + "family": "Noto Sans KR", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "korean", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v38", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuozeLTq8H4hfeE.ttf", + "200": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzmoyeLTq8H4hfeE.ttf", + "300": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzrQyeLTq8H4hfeE.ttf", + "regular": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLTq8H4hfeE.ttf", + "500": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzztgyeLTq8H4hfeE.ttf", + "600": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzjQ1eLTq8H4hfeE.ttf", + "700": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzg01eLTq8H4hfeE.ttf", + "800": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzmo1eLTq8H4hfeE.ttf", + "900": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzkM1eLTq8H4hfeE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanskr/v38/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoySLXg9A.ttf" + }, + { + "family": "Noto Sans Kaithi", + "variants": [ + "regular" + ], + "subsets": [ + "kaithi", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanskaithi/v23/buEtppS9f8_vkXadMBJJu0tWjLwjQi0KdoZIKlo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanskaithi/v23/buEtppS9f8_vkXadMBJJu0tWjLwjciwAcg.ttf" + }, + { + "family": "Noto Sans Kannada", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext" + ], + "version": "v31", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrDvMzSIMLsPKrkY.ttf", + "200": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrLvNzSIMLsPKrkY.ttf", + "300": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrGXNzSIMLsPKrkY.ttf", + "regular": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrDvNzSIMLsPKrkY.ttf", + "500": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrAnNzSIMLsPKrkY.ttf", + "600": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrOXKzSIMLsPKrkY.ttf", + "700": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrNzKzSIMLsPKrkY.ttf", + "800": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrLvKzSIMLsPKrkY.ttf", + "900": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrJLKzSIMLsPKrkY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanskannada/v31/8vIs7xs32H97qzQKnzfeXycxXZyUmySvZWItmf1fe6TVmgop9ndpS-BqHEyGrDvN_SMGKg.ttf" + }, + { + "family": "Noto Sans Kawi", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "kawi", + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnK4AhmCpRyMjXVsQ.ttf", + "500": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnK0ghmCpRyMjXVsQ.ttf", + "600": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnKPg9mCpRyMjXVsQ.ttf", + "700": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnKBw9mCpRyMjXVsQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanskawi/v5/92zBtBJLNqsg7tCciW0EPHNNh1ZgbtGWiTYDjvnK4AhWC552.ttf" + }, + { + "family": "Noto Sans Kayah Li", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "kayah-li", + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WCc3CZH4EXLuKVM.ttf", + "500": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WBU3CZH4EXLuKVM.ttf", + "600": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WPkwCZH4EXLuKVM.ttf", + "700": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WMAwCZH4EXLuKVM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanskayahli/v26/B50nF61OpWTRcGrhOVJJwOMXdca6Yecki3E06x2jVTX3WCc3OZDyFQ.ttf" + }, + { + "family": "Noto Sans Kharoshthi", + "variants": [ + "regular" + ], + "subsets": [ + "kharoshthi", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanskharoshthi/v17/Fh4qPiLjKS30-P4-pGMMXCCfvkc5Vd7KE5z4rFyx5mR1.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanskharoshthi/v17/Fh4qPiLjKS30-P4-pGMMXCCfvkc5Vd7KE6z5plg.ttf" + }, + { + "family": "Noto Sans Khmer", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "khmer", + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYuNAZz4kAbrddiA.ttf", + "200": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYsNAJz4kAbrddiA.ttf", + "300": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYvTAJz4kAbrddiA.ttf", + "regular": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYuNAJz4kAbrddiA.ttf", + "500": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYu_AJz4kAbrddiA.ttf", + "600": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYtTB5z4kAbrddiA.ttf", + "700": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYtqB5z4kAbrddiA.ttf", + "800": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYsNB5z4kAbrddiA.ttf", + "900": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYskB5z4kAbrddiA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanskhmer/v29/ijw3s5roRME5LLRxjsRb-gssOenAyendxrgV2c-Zw-9vbVUti_Z_dWgtWYuNAKz5mgI.ttf" + }, + { + "family": "Noto Sans Khojki", + "variants": [ + "regular" + ], + "subsets": [ + "khojki", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanskhojki/v20/-nFnOHM29Oofr2wohFbTuPPKVWpmK_d709jy92k.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanskhojki/v20/-nFnOHM29Oofr2wohFbTuPPKVWpmG_Zx1w.ttf" + }, + { + "family": "Noto Sans Khudawadi", + "variants": [ + "regular" + ], + "subsets": [ + "khudawadi", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanskhudawadi/v23/fdNi9t6ZsWBZ2k5ltHN73zZ5hc8HANlHIjRnVVXz9MY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanskhudawadi/v23/fdNi9t6ZsWBZ2k5ltHN73zZ5hc8HANlHEjVtUQ.ttf" + }, + { + "family": "Noto Sans Lao", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "lao", + "latin", + "latin-ext" + ], + "version": "v33", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4ccfdf5MK3riB2w.ttf", + "200": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt48cbdf5MK3riB2w.ttf", + "300": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4L8bdf5MK3riB2w.ttf", + "regular": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4ccbdf5MK3riB2w.ttf", + "500": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4Q8bdf5MK3riB2w.ttf", + "600": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4r8Hdf5MK3riB2w.ttf", + "700": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4lsHdf5MK3riB2w.ttf", + "800": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt48cHdf5MK3riB2w.ttf", + "900": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt42MHdf5MK3riB2w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanslao/v33/bx6lNx2Ol_ixgdYWLm9BwxM3NW6BOkuf763Clj73CiQ_J1Djx9pidOt4ccbtfpkO.ttf" + }, + { + "family": "Noto Sans Lao Looped", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "lao", + "latin", + "latin-ext" + ], + "version": "v10", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomPr2M-Zw5V_T71k.ttf", + "200": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomHr3M-Zw5V_T71k.ttf", + "300": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomKT3M-Zw5V_T71k.ttf", + "regular": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomPr3M-Zw5V_T71k.ttf", + "500": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomMj3M-Zw5V_T71k.ttf", + "600": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomCTwM-Zw5V_T71k.ttf", + "700": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomB3wM-Zw5V_T71k.ttf", + "800": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomHrwM-Zw5V_T71k.ttf", + "900": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomFPwM-Zw5V_T71k.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanslaolooped/v10/a8IgNpbwKmHXpgXbMIsbSMP7-3U72qUOX5gBg6LRXExhqHIX9YPTpvqkW4UthhjomPr3A-d64Q.ttf" + }, + { + "family": "Noto Sans Lepcha", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "lepcha" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanslepcha/v20/0QI7MWlB_JWgA166SKhu05TekNS32AJstqBXgd4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanslepcha/v20/0QI7MWlB_JWgA166SKhu05TekNS36ANmsg.ttf" + }, + { + "family": "Noto Sans Limbu", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "limbu" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanslimbu/v26/3JnlSDv90Gmq2mrzckOBBRRoNJVj0MF3OHRDnA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanslimbu/v26/3JnlSDv90Gmq2mrzckOBBRRoNJVT0ctz.ttf" + }, + { + "family": "Noto Sans Linear A", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "linear-a" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanslineara/v19/oPWS_l16kP4jCuhpgEGmwJOiA18FZj22zmHQAGQicw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanslineara/v19/oPWS_l16kP4jCuhpgEGmwJOiA18FZj2Gz2vU.ttf" + }, + { + "family": "Noto Sans Linear B", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "linear-b" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanslinearb/v18/HhyJU4wt9vSgfHoORYOiXOckKNB737IV3BkFTq4EPw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanslinearb/v18/HhyJU4wt9vSgfHoORYOiXOckKNB737Il3RMB.ttf" + }, + { + "family": "Noto Sans Lisu", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "lisu" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHP2Vwt29IlxkVdig.ttf", + "500": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHP61wt29IlxkVdig.ttf", + "600": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHPB1st29IlxkVdig.ttf", + "700": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHPPlst29IlxkVdig.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanslisu/v27/uk-3EGO3o6EruUbnwovcYhz6kh57_nqbcTdjJnHP2Vwd2tgh.ttf" + }, + { + "family": "Noto Sans Lycian", + "variants": [ + "regular" + ], + "subsets": [ + "lycian" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanslycian/v16/QldVNSNMqAsHtsJ7UmqxBQA9r8wA5_naCJwn00E.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanslycian/v16/QldVNSNMqAsHtsJ7UmqxBQA9r8wA1_jQDA.ttf" + }, + { + "family": "Noto Sans Lydian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "lydian" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanslydian/v19/c4m71mVzGN7s8FmIukZJ1v4ZlcPReUPXMoIjEQI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanslydian/v19/c4m71mVzGN7s8FmIukZJ1v4ZlcPRSULdNg.ttf" + }, + { + "family": "Noto Sans Mahajani", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "mahajani" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmahajani/v20/-F6sfiVqLzI2JPCgQBnw60Agp0JrvD5Fh8ARHNh4zg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmahajani/v20/-F6sfiVqLzI2JPCgQBnw60Agp0JrvD51hsoV.ttf" + }, + { + "family": "Noto Sans Malayalam", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "malayalam" + ], + "version": "v29", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_RuH9BFzEr6HxEA.ttf", + "200": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_xuD9BFzEr6HxEA.ttf", + "300": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_GOD9BFzEr6HxEA.ttf", + "regular": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_RuD9BFzEr6HxEA.ttf", + "500": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_dOD9BFzEr6HxEA.ttf", + "600": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_mOf9BFzEr6HxEA.ttf", + "700": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_oef9BFzEr6HxEA.ttf", + "800": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_xuf9BFzEr6HxEA.ttf", + "900": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_7-f9BFzEr6HxEA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmalayalam/v29/sJoi3K5XjsSdcnzn071rL37lpAOsUThnDZIfPdbeSNzVakglNM-Qw8EaeB8Nss-_RuDNBVbA.ttf" + }, + { + "family": "Noto Sans Mandaic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "mandaic" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmandaic/v18/cIfnMbdWt1w_HgCcilqhKQBo_OsMI5_A_gMk0izH.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmandaic/v18/cIfnMbdWt1w_HgCcilqhKQBo_OsMI6_B9Ac.ttf" + }, + { + "family": "Noto Sans Manichaean", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "manichaean" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmanichaean/v19/taiVGntiC4--qtsfi4Jp9-_GkPZZCcrfekqCNTtFCtdX.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmanichaean/v19/taiVGntiC4--qtsfi4Jp9-_GkPZZCcrfenqDPz8.ttf" + }, + { + "family": "Noto Sans Marchen", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "marchen" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmarchen/v21/aFTO7OZ_Y282EP-WyG6QTOX_C8WZMHhPk652ZaHk.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmarchen/v21/aFTO7OZ_Y282EP-WyG6QTOX_C8WZMEhOmao.ttf" + }, + { + "family": "Noto Sans Masaram Gondi", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "masaram-gondi" + ], + "version": "v18", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmasaramgondi/v18/6xK_dThFKcWIu4bpRBjRYRV7KZCbUq6n_1kPnuGe7RI9WSWX.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmasaramgondi/v18/6xK_dThFKcWIu4bpRBjRYRV7KZCbUq6n_1kPntGf5xY.ttf" + }, + { + "family": "Noto Sans Math", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "math" + ], + "version": "v18", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmath/v18/7Aump_cpkSecTWaHRlH2hyV5UHkG-V048PW0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmath/v18/7Aump_cpkSecTWaHRlH2hyV5UEkH81k.ttf" + }, + { + "family": "Noto Sans Mayan Numerals", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "mayan-numerals" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmayannumerals/v17/PlIuFk25O6RzLfvNNVSivR09_KqYMwvvDKYjfIiE68oo6eepYQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmayannumerals/v17/PlIuFk25O6RzLfvNNVSivR09_KqYMwvvDKYjfIi06sAs.ttf" + }, + { + "family": "Noto Sans Medefaidrin", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "medefaidrin" + ], + "version": "v29", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmErWlT318e5A3rw.ttf", + "500": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmHjWlT318e5A3rw.ttf", + "600": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmJTRlT318e5A3rw.ttf", + "700": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmK3RlT318e5A3rw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmedefaidrin/v29/WwkzxOq6Dk-wranENynkfeVsNbRZtbOIdLb1exeM4ZeuabBfmErWpTz_9Q.ttf" + }, + { + "family": "Noto Sans Meetei Mayek", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "meetei-mayek" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1TJ__TW5PgeFYVa.ttf", + "200": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1RJ_vTW5PgeFYVa.ttf", + "300": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1SX_vTW5PgeFYVa.ttf", + "regular": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1TJ_vTW5PgeFYVa.ttf", + "500": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1T7_vTW5PgeFYVa.ttf", + "600": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1QX-fTW5PgeFYVa.ttf", + "700": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1Qu-fTW5PgeFYVa.ttf", + "800": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1RJ-fTW5PgeFYVa.ttf", + "900": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1Rg-fTW5PgeFYVa.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmeeteimayek/v20/HTxAL3QyKieByqY9eZPFweO0be7M21uSphSdhqILnmrRfJ8t_1TJ_sTX7vw.ttf" + }, + { + "family": "Noto Sans Mende Kikakui", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "mende-kikakui" + ], + "version": "v29", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmendekikakui/v29/11hRGoLHz17aKjQCWj-JHcLvu2Q5zZrnkbNCLUx_aDJLAHer.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmendekikakui/v29/11hRGoLHz17aKjQCWj-JHcLvu2Q5zZrnkbNCLXx-YjY.ttf" + }, + { + "family": "Noto Sans Meroitic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "meroitic", + "meroitic-cursive", + "meroitic-hieroglyphs" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmeroitic/v19/IFS5HfRJndhE3P4b5jnZ3ITPvC6i00UDgDhTiKY9KQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmeroitic/v19/IFS5HfRJndhE3P4b5jnZ3ITPvC6i00UzgTJX.ttf" + }, + { + "family": "Noto Sans Miao", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "miao" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmiao/v18/Dxxz8jmXMW75w3OmoDXVV4zyZUjgUYVslLhx.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmiao/v18/Dxxz8jmXMW75w3OmoDXVV4zyZXjhW4E.ttf" + }, + { + "family": "Noto Sans Modi", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "modi" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmodi/v25/pe03MIySN5pO62Z5YkFyT7jeav5qWVAgVol-.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmodi/v25/pe03MIySN5pO62Z5YkFyT7jeas5rU1Q.ttf" + }, + { + "family": "Noto Sans Mongolian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "mongolian", + "symbols" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmongolian/v23/VdGCAYADGIwE0EopZx8xQfHlgEAMsrToxLsg6-av1x0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmongolian/v23/VdGCAYADGIwE0EopZx8xQfHlgEAMsrTo9Loq7w.ttf" + }, + { + "family": "Noto Sans Mono", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v37", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_FNI49rXVEQQL8Y.ttf", + "200": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_NNJ49rXVEQQL8Y.ttf", + "300": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_A1J49rXVEQQL8Y.ttf", + "regular": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_FNJ49rXVEQQL8Y.ttf", + "500": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_GFJ49rXVEQQL8Y.ttf", + "600": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_I1O49rXVEQQL8Y.ttf", + "700": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_LRO49rXVEQQL8Y.ttf", + "800": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_NNO49rXVEQQL8Y.ttf", + "900": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_PpO49rXVEQQL8Y.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmono/v37/BngrUXNETWXI6LwhGYvaxZikqZqK6fBq6kPvUce2oAZcdthSBUsYck4-_FNJ09vdUA.ttf" + }, + { + "family": "Noto Sans Mro", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "mro" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmro/v19/qWcsB6--pZv9TqnUQMhe9b39WDzRtjkho4M.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmro/v19/qWcsB6--pZv9TqnUQMhe9b39aD3bsg.ttf" + }, + { + "family": "Noto Sans Multani", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "multani" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansmultani/v21/9Bty3ClF38_RfOpe1gCaZ8p30BOFO1A0pfCs5Kos.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmultani/v21/9Bty3ClF38_RfOpe1gCaZ8p30BOFO2A1r_Q.ttf" + }, + { + "family": "Noto Sans Myanmar", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "myanmar" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZs_y1ZtY3ymOryg38hOCSdOnFq0HGS1uEapkAC3AY.ttf", + "200": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HE-98EwiEwLxR-r.ttf", + "300": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HFa9MEwiEwLxR-r.ttf", + "regular": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZq_y1ZtY3ymOryg38hOCSdOnFq0En23OU4o1AC.ttf", + "500": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HEC9cEwiEwLxR-r.ttf", + "600": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HEu8sEwiEwLxR-r.ttf", + "700": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HFK88EwiEwLxR-r.ttf", + "800": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HFW8MEwiEwLxR-r.ttf", + "900": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZv_y1ZtY3ymOryg38hOCSdOnFq0HFy8cEwiEwLxR-r.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansmyanmar/v21/AlZq_y1ZtY3ymOryg38hOCSdOnFq0Hn31uE.ttf" + }, + { + "family": "Noto Sans NKo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "nko" + ], + "version": "v7", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansnko/v7/esDX31ZdNv-KYGGJpKGk2_RpMpCMHMLBrdA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansnko/v7/esDX31ZdNv-KYGGJpKGk2_RpApGGGA.ttf" + }, + { + "family": "Noto Sans NKo Unjoined", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "nko" + ], + "version": "v4", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rvF2gEPxf5wbh3T.ttf", + "500": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rv32gEPxf5wbh3T.ttf", + "600": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rsb3QEPxf5wbh3T.ttf", + "700": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rsi3QEPxf5wbh3T.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansnkounjoined/v4/MCo_zBjx1d3VUhJFK9MYlNCXJ6VvqwGPz3szPOBB5nuzMdWs0rvF2jEOz_o.ttf" + }, + { + "family": "Noto Sans Nabataean", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "nabataean" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansnabataean/v17/IFS4HfVJndhE3P4b5jnZ34DfsjO330dNoBJ9hK8kMK4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansnabataean/v17/IFS4HfVJndhE3P4b5jnZ34DfsjO330dNkBN3gA.ttf" + }, + { + "family": "Noto Sans Nag Mundari", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "nag-mundari" + ], + "version": "v4", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHRxirbUGA0whP19M.ttf", + "500": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHRyqrbUGA0whP19M.ttf", + "600": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHR8asbUGA0whP19M.ttf", + "700": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHR_-sbUGA0whP19M.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansnagmundari/v4/3qTAoi2hnSyU8TNFIdhZTyod3g5lBnKlQFk2kS9fr9Eq09RHRxirXUCK1w.ttf" + }, + { + "family": "Noto Sans Nandinagari", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "nandinagari" + ], + "version": "v4", + "lastModified": "2023-10-25", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansnandinagari/v4/or38Q7733eiDljA1IufXSNFT-1KI5y10H4jVa5RXzC1KOw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansnandinagari/v4/or38Q7733eiDljA1IufXSNFT-1KI5y10H4jlap5T.ttf" + }, + { + "family": "Noto Sans New Tai Lue", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "new-tai-lue" + ], + "version": "v24", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pdeXAYUbghFPKzeY.ttf", + "500": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pddfAYUbghFPKzeY.ttf", + "600": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pdTvHYUbghFPKzeY.ttf", + "700": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pdQLHYUbghFPKzeY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansnewtailue/v24/H4cKBW-Pl9DZ0Xe_nHUapt7PovLXAhAnY7wqaLy-OJgU3p_pdeXAUUfqgA.ttf" + }, + { + "family": "Noto Sans Newa", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "newa" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansnewa/v17/7r3fqXp6utEsO9pI4f8ok8sWg8n_qN4R5lNU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansnewa/v17/7r3fqXp6utEsO9pI4f8ok8sWg_n-oto.ttf" + }, + { + "family": "Noto Sans Nushu", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "nushu" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansnushu/v20/rnCw-xRQ3B7652emAbAe_Ai1IYaFWFAMArZKqQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansnushu/v20/rnCw-xRQ3B7652emAbAe_Ai1IYa1WVoI.ttf" + }, + { + "family": "Noto Sans Ogham", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "ogham" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansogham/v18/kmKlZqk1GBDGN0mY6k5lmEmww4hrt5laQxcoCA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansogham/v18/kmKlZqk1GBDGN0mY6k5lmEmww4hbtpNe.ttf" + }, + { + "family": "Noto Sans Ol Chiki", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "ol-chiki" + ], + "version": "v31", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALWk267I6gVrz5gQ.ttf", + "500": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALVs267I6gVrz5gQ.ttf", + "600": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALbcx67I6gVrz5gQ.ttf", + "700": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALY4x67I6gVrz5gQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansolchiki/v31/N0b92TJNOPt-eHmFZCdQbrL32r-4CvhzDzRwlxOQYuVALWk227MwhQ.ttf" + }, + { + "family": "Noto Sans Old Hungarian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "old-hungarian" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansoldhungarian/v19/E213_cD6hP3GwCJPEUssHEM0KqLaHJXg2PiIgRfjbg5nCYXt.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansoldhungarian/v19/E213_cD6hP3GwCJPEUssHEM0KqLaHJXg2PiIgSfiZAo.ttf" + }, + { + "family": "Noto Sans Old Italic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "old-italic" + ], + "version": "v18", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansolditalic/v18/TuGOUUFzXI5FBtUq5a8bh68BJxxEVam7tWlRdRhtCC4d.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansolditalic/v18/TuGOUUFzXI5FBtUq5a8bh68BJxxEVam7tVlQfxw.ttf" + }, + { + "family": "Noto Sans Old North Arabian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "old-north-arabian" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansoldnortharabian/v17/esDF30BdNv-KYGGJpKGk2tNiMt7Jar6olZDyNdr81zBQmUo_xw4ABw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansoldnortharabian/v17/esDF30BdNv-KYGGJpKGk2tNiMt7Jar6olZDyNdr81zBgmEA7.ttf" + }, + { + "family": "Noto Sans Old Permic", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "old-permic" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansoldpermic/v18/snf1s1q1-dF8pli1TesqcbUY4Mr-ElrwKLdXgv_dKYB5.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansoldpermic/v18/snf1s1q1-dF8pli1TesqcbUY4Mr-ElrwKIdWiPs.ttf" + }, + { + "family": "Noto Sans Old Persian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "old-persian" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansoldpersian/v17/wEOjEAbNnc5caQTFG18FHrZr9Bp6-8CmIJ_tqOlQfx9CjA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansoldpersian/v17/wEOjEAbNnc5caQTFG18FHrZr9Bp6-8CmIJ_dqeNU.ttf" + }, + { + "family": "Noto Sans Old Sogdian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "old-sogdian" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansoldsogdian/v18/3JnjSCH90Gmq2mrzckOBBhFhdrMst48aURt7neIqM-9uyg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansoldsogdian/v18/3JnjSCH90Gmq2mrzckOBBhFhdrMst48aURtLnOgu.ttf" + }, + { + "family": "Noto Sans Old South Arabian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "old-south-arabian" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansoldsoutharabian/v17/3qT5oiOhnSyU8TNFIdhZTice3hB_HWKsEnF--0XCHiKx1OtDT9HwTA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansoldsoutharabian/v17/3qT5oiOhnSyU8TNFIdhZTice3hB_HWKsEnF--0XCHiKB1eFH.ttf" + }, + { + "family": "Noto Sans Old Turkic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "old-turkic" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansoldturkic/v19/yMJNMJVya43H0SUF_WmcGEQVqoEMKDKbsE2RjEw-Vyws.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansoldturkic/v19/yMJNMJVya43H0SUF_WmcGEQVqoEMKDKbsH2Qhkg.ttf" + }, + { + "family": "Noto Sans Oriya", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "oriya" + ], + "version": "v33", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivj0fq_c6LhHBRe-.ttf", + "200": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivh0f6_c6LhHBRe-.ttf", + "300": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Iviqf6_c6LhHBRe-.ttf", + "regular": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivj0f6_c6LhHBRe-.ttf", + "500": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5IvjGf6_c6LhHBRe-.ttf", + "600": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5IvgqeK_c6LhHBRe-.ttf", + "700": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5IvgTeK_c6LhHBRe-.ttf", + "800": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivh0eK_c6LhHBRe-.ttf", + "900": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5IvhdeK_c6LhHBRe-.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansoriya/v33/AYCppXfzfccDCstK_hrjDyADv5e9748vhj3CJBLHIARtgD6TJQS0dJT5Ivj0f5_d4rw.ttf" + }, + { + "family": "Noto Sans Osage", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "osage" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansosage/v19/oPWX_kB6kP4jCuhpgEGmw4mtAVtXRlaSxkrMCQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansosage/v19/oPWX_kB6kP4jCuhpgEGmw4mtAVtnR1yW.ttf" + }, + { + "family": "Noto Sans Osmanya", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "osmanya" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansosmanya/v19/8vIS7xs32H97qzQKnzfeWzUyUpOJmz6kR47NCV5Z.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansosmanya/v19/8vIS7xs32H97qzQKnzfeWzUyUpOJmw6lTYo.ttf" + }, + { + "family": "Noto Sans Pahawh Hmong", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "pahawh-hmong" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanspahawhhmong/v19/bWtp7e_KfBziStx7lIzKKaMUOBEA3UPQDW7krzc_c48aMpM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanspahawhhmong/v19/bWtp7e_KfBziStx7lIzKKaMUOBEA3UPQDW7knzY1dw.ttf" + }, + { + "family": "Noto Sans Palmyrene", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "palmyrene" + ], + "version": "v17", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanspalmyrene/v17/ZgNPjOdKPa7CHqq0h37c_ASCWvH93SFCPnK5ZpdNtcA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanspalmyrene/v17/ZgNPjOdKPa7CHqq0h37c_ASCWvH93SFCDnOzYg.ttf" + }, + { + "family": "Noto Sans Pau Cin Hau", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "pau-cin-hau" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanspaucinhau/v21/x3d-cl3IZKmUqiMg_9wBLLtzl22EayN7ehIdjEWqKMxsKw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanspaucinhau/v21/x3d-cl3IZKmUqiMg_9wBLLtzl22EayN7ehItjU-u.ttf" + }, + { + "family": "Noto Sans PhagsPa", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "phags-pa", + "symbols" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansphagspa/v24/XLY8IYr5bJNDGYxPGjyYbaEjwQR-LFlsYMYHGGeT.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansphagspa/v24/XLY8IYr5bJNDGYxPGjyYbaEjwQR-LGltasI.ttf" + }, + { + "family": "Noto Sans Phoenician", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "phoenician" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansphoenician/v18/jizFRF9Ksm4Bt9PvcTaEkIHiTVtxmFtS5X7Jot-p5561.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansphoenician/v18/jizFRF9Ksm4Bt9PvcTaEkIHiTVtxmFtS5U7IqNs.ttf" + }, + { + "family": "Noto Sans Psalter Pahlavi", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "psalter-pahlavi" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanspsalterpahlavi/v18/rP2Vp3K65FkAtHfwd-eISGznYihzggmsicPfud3w1G3KsUQBct4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanspsalterpahlavi/v18/rP2Vp3K65FkAtHfwd-eISGznYihzggmsicPfud3w5GzAtQ.ttf" + }, + { + "family": "Noto Sans Rejang", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "rejang" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansrejang/v22/Ktk2AKuMeZjqPnXgyqrib7DIogqwN4O3WYZB_sU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansrejang/v22/Ktk2AKuMeZjqPnXgyqrib7DIogqwB4K9XQ.ttf" + }, + { + "family": "Noto Sans Runic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "runic" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansrunic/v18/H4c_BXWPl9DZ0Xe_nHUaus7W68WWaxpvHtgIYg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansrunic/v18/H4c_BXWPl9DZ0Xe_nHUaus7W68WmahBr.ttf" + }, + { + "family": "Noto Sans SC", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "chinese-simplified", + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v39", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG9_EnYxNbPzS5HE.ttf", + "200": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG1_FnYxNbPzS5HE.ttf", + "300": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG4HFnYxNbPzS5HE.ttf", + "regular": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG9_FnYxNbPzS5HE.ttf", + "500": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG-3FnYxNbPzS5HE.ttf", + "600": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaGwHCnYxNbPzS5HE.ttf", + "700": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaGzjCnYxNbPzS5HE.ttf", + "800": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG1_CnYxNbPzS5HE.ttf", + "900": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG3bCnYxNbPzS5HE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssc/v39/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG9_FrY1HaA.ttf" + }, + { + "family": "Noto Sans Samaritan", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "samaritan" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssamaritan/v17/buEqppe9f8_vkXadMBJJo0tSmaYjFkxOUo5jNlOVMzQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssamaritan/v17/buEqppe9f8_vkXadMBJJo0tSmaYjFkxOYo9pMg.ttf" + }, + { + "family": "Noto Sans Saurashtra", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "saurashtra" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssaurashtra/v24/ea8GacQ0Wfz_XKWXe6OtoA8w8zvmYwTef9ndjhPTSIx9.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssaurashtra/v24/ea8GacQ0Wfz_XKWXe6OtoA8w8zvmYwTef-nchBc.ttf" + }, + { + "family": "Noto Sans Sharada", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "sharada" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssharada/v17/gok0H7rwAEdtF9N8-mdTGALG6p0kwoXLPOwr4H8a.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssharada/v17/gok0H7rwAEdtF9N8-mdTGALG6p0kwrXKNug.ttf" + }, + { + "family": "Noto Sans Shavian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "shavian" + ], + "version": "v18", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansshavian/v18/CHy5V_HZE0jxJBQlqAeCKjJvQBNF4EFQSplv2Cwg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansshavian/v18/CHy5V_HZE0jxJBQlqAeCKjJvQBNF4HFRQJ0.ttf" + }, + { + "family": "Noto Sans Siddham", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "siddham" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssiddham/v21/OZpZg-FwqiNLe9PELUikxTWDoCCeGqndk3Ic92ZH.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssiddham/v21/OZpZg-FwqiNLe9PELUikxTWDoCCeGpncmXY.ttf" + }, + { + "family": "Noto Sans SignWriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "signwriting" + ], + "version": "v5", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssignwriting/v5/Noas6VX_wIWFbTTCrYmvy9A2UnkL-2SZAWiUEVCARYQemg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssignwriting/v5/Noas6VX_wIWFbTTCrYmvy9A2UnkL-2SZAWikEFqE.ttf" + }, + { + "family": "Noto Sans Sinhala", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "sinhala" + ], + "version": "v36", + "lastModified": "2025-09-17", + "files": { + "100": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwg2b5lgLpJwbQRM.ttf", + "200": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwo2a5lgLpJwbQRM.ttf", + "300": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwlOa5lgLpJwbQRM.ttf", + "regular": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwg2a5lgLpJwbQRM.ttf", + "500": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwj-a5lgLpJwbQRM.ttf", + "600": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwtOd5lgLpJwbQRM.ttf", + "700": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwuqd5lgLpJwbQRM.ttf", + "800": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwo2d5lgLpJwbQRM.ttf", + "900": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwqSd5lgLpJwbQRM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssinhala/v36/yMJ2MJBya43H0SUF_WmcBEEf4rQVO2P524V5N_MxQzQtb-tf5dJbC30Fu9zUwg2a1lkBoA.ttf" + }, + { + "family": "Noto Sans Sogdian", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "sogdian" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssogdian/v17/taiQGn5iC4--qtsfi4Jp6eHPnfxQBo--Pm6KHidM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssogdian/v17/taiQGn5iC4--qtsfi4Jp6eHPnfxQBr-_NGo.ttf" + }, + { + "family": "Noto Sans Sora Sompeng", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "sora-sompeng" + ], + "version": "v26", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHR818DpZXJQd4Mu.ttf", + "500": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHRO18DpZXJQd4Mu.ttf", + "600": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHSi0MDpZXJQd4Mu.ttf", + "700": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHSb0MDpZXJQd4Mu.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssorasompeng/v26/PlIRFkO5O6RzLfvNNVSioxM2_OTrEhPyDLolKvCsHzCxWuGkYHR81_Dob3Y.ttf" + }, + { + "family": "Noto Sans Soyombo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "soyombo" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssoyombo/v18/RWmSoL-Y6-8q5LTtXs6MF6q7xsxgY0FrIFOcK25W.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssoyombo/v18/RWmSoL-Y6-8q5LTtXs6MF6q7xsxgY3FqKlc.ttf" + }, + { + "family": "Noto Sans Sundanese", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "sundanese" + ], + "version": "v28", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6ctxpNNHCizv7fQES.ttf", + "500": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6ctxbNNHCizv7fQES.ttf", + "600": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6cty3M9HCizv7fQES.ttf", + "700": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6ctyOM9HCizv7fQES.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssundanese/v28/FwZw7_84xUkosG2xJo2gm7nFwSLQkdymq2mkz3Gz1_b6ctxpNOHDgT8.ttf" + }, + { + "family": "Noto Sans Sunuwar", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "sunuwar" + ], + "version": "v1", + "lastModified": "2025-06-26", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssunuwar/v1/FwZB7_04xUkosG2xJo2gm7nF0DTfho_Du2akOrkv.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssunuwar/v1/FwZB7_04xUkosG2xJo2gm7nF0DTfhr_CsWI.ttf" + }, + { + "family": "Noto Sans Syloti Nagri", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "syloti-nagri" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssylotinagri/v25/uU9eCAQZ75uhfF9UoWDRiY3q7Sf_VFV3m4dGFVfxN87gsj0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssylotinagri/v25/uU9eCAQZ75uhfF9UoWDRiY3q7Sf_VFV3m4dGJVb7Mw.ttf" + }, + { + "family": "Noto Sans Symbols", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "symbols" + ], + "version": "v47", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gfQ4gavVFRkzrbQ.ttf", + "200": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3g_Q8gavVFRkzrbQ.ttf", + "300": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gIw8gavVFRkzrbQ.ttf", + "regular": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gfQ8gavVFRkzrbQ.ttf", + "500": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gTw8gavVFRkzrbQ.ttf", + "600": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gowggavVFRkzrbQ.ttf", + "700": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gmgggavVFRkzrbQ.ttf", + "800": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3g_QggavVFRkzrbQ.ttf", + "900": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3g1AggavVFRkzrbQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssymbols/v47/rP2up3q65FkAtHfwd-eIS2brbDN6gxP34F9jRRCe4W3gfQ8Qa_9B.ttf" + }, + { + "family": "Noto Sans Symbols 2", + "variants": [ + "regular" + ], + "subsets": [ + "braille", + "latin", + "latin-ext", + "math", + "mayan-numerals", + "symbols" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanssymbols2/v25/I_uyMoGduATTei9eI8daxVHDyfisHr71ypPqfX71-AI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssymbols2/v25/I_uyMoGduATTei9eI8daxVHDyfisHr71-pLgeQ.ttf" + }, + { + "family": "Noto Sans Syriac", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "syriac" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-VD9caJyZfUL_FC.ttf", + "200": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-XD9MaJyZfUL_FC.ttf", + "300": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Ud9MaJyZfUL_FC.ttf", + "regular": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-VD9MaJyZfUL_FC.ttf", + "500": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Vx9MaJyZfUL_FC.ttf", + "600": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Wd88aJyZfUL_FC.ttf", + "700": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Wk88aJyZfUL_FC.ttf", + "800": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-XD88aJyZfUL_FC.ttf", + "900": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-Xq88aJyZfUL_FC.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssyriac/v18/Ktk7AKuMeZjqPnXgyqribqzQqgW0LYiVqV7dXcP0C-VD9PaIw5M.ttf" + }, + { + "family": "Noto Sans Syriac Eastern", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "syriac" + ], + "version": "v3", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPi-eszCL5ep1QPQ.ttf", + "200": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPq-fszCL5ep1QPQ.ttf", + "300": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPnGfszCL5ep1QPQ.ttf", + "regular": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPi-fszCL5ep1QPQ.ttf", + "500": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPh2fszCL5ep1QPQ.ttf", + "600": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPvGYszCL5ep1QPQ.ttf", + "700": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPsiYszCL5ep1QPQ.ttf", + "800": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPq-YszCL5ep1QPQ.ttf", + "900": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPoaYszCL5ep1QPQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssyriaceastern/v3/Noac6Vj_wIWFbTTCrYmvy8AjVU8aslWRHHvRYxS-Ro3yS0FDacnHPi-fgzGB4Q.ttf" + }, + { + "family": "Noto Sans Syriac Western", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "syriac" + ], + "version": "v2", + "lastModified": "2025-10-29", + "files": { + "100": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWEaw_X8uP2jTYyH0.ttf", + "200": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWESw-X8uP2jTYyH0.ttf", + "300": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWEfI-X8uP2jTYyH0.ttf", + "regular": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWEaw-X8uP2jTYyH0.ttf", + "500": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWEZ4-X8uP2jTYyH0.ttf", + "600": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWEXI5X8uP2jTYyH0.ttf", + "700": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWEUs5X8uP2jTYyH0.ttf", + "800": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWESw5X8uP2jTYyH0.ttf", + "900": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWEQU5X8uP2jTYyH0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanssyriacwestern/v2/ke8LOhEEMVFsvCav8hWjbItd6Jf6MP7Z9spJZ6UNIILh-71aJmOWEaw-b8qF3g.ttf" + }, + { + "family": "Noto Sans TC", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v38", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz76Cz_CpOtma3uNQ.ttf", + "200": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7yCy_CpOtma3uNQ.ttf", + "300": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7_6y_CpOtma3uNQ.ttf", + "regular": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz76Cy_CpOtma3uNQ.ttf", + "500": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz75Ky_CpOtma3uNQ.ttf", + "600": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7361_CpOtma3uNQ.ttf", + "700": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz70e1_CpOtma3uNQ.ttf", + "800": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7yC1_CpOtma3uNQ.ttf", + "900": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz7wm1_CpOtma3uNQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstc/v38/-nFuOG829Oofr2wohFbTp9ifNAn722rq0MXz76CyzCtEsg.ttf" + }, + { + "family": "Noto Sans Tagalog", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tagalog" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstagalog/v23/J7aFnoNzCnFcV9ZI-sUYuvote1R0wwEAA8jHexnL.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstagalog/v23/J7aFnoNzCnFcV9ZI-sUYuvote1R0wzEBCcw.ttf" + }, + { + "family": "Noto Sans Tagbanwa", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tagbanwa" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstagbanwa/v19/Y4GWYbB8VTEp4t3MKJSMmQdIKjRtt_nZRjQEaYpGoQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstagbanwa/v19/Y4GWYbB8VTEp4t3MKJSMmQdIKjRtt_npRz4A.ttf" + }, + { + "family": "Noto Sans Tai Le", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tai-le" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstaile/v18/vEFK2-VODB8RrNDvZSUmVxEATwR58tK1W77HtMo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstaile/v18/vEFK2-VODB8RrNDvZSUmVxEATwR5wtO_Xw.ttf" + }, + { + "family": "Noto Sans Tai Tham", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "tai-tham" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBCUbPgquyaRGKMw.ttf", + "500": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBBcbPgquyaRGKMw.ttf", + "600": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBPscPgquyaRGKMw.ttf", + "700": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBMIcPgquyaRGKMw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstaitham/v25/kJEbBv0U4hgtwxDUw2x9q7tbjLIfbPGHBoaVSAZ3MdLJBCUbDgukzQ.ttf" + }, + { + "family": "Noto Sans Tai Viet", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tai-viet" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstaiviet/v20/8QIUdj3HhN_lv4jf9vsE-9GMOLsaSPZr644fWsRO9w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstaiviet/v20/8QIUdj3HhN_lv4jf9vsE-9GMOLsaSPZb6oQb.ttf" + }, + { + "family": "Noto Sans Takri", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "takri" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstakri/v25/TuGJUVpzXI5FBtUq5a8bnKIOdTwQNO_W3khJXg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstakri/v25/TuGJUVpzXI5FBtUq5a8bnKIOdTwgNeXS.ttf" + }, + { + "family": "Noto Sans Tamil", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil" + ], + "version": "v31", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7vGor0RqKDt_EvT.ttf", + "200": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7tGo70RqKDt_EvT.ttf", + "300": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7uYo70RqKDt_EvT.ttf", + "regular": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7vGo70RqKDt_EvT.ttf", + "500": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7v0o70RqKDt_EvT.ttf", + "600": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7sYpL0RqKDt_EvT.ttf", + "700": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7shpL0RqKDt_EvT.ttf", + "800": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7tGpL0RqKDt_EvT.ttf", + "900": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7tvpL0RqKDt_EvT.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstamil/v31/ieVc2YdFI3GCY6SyQy1KfStzYKZgzN1z4LKDbeZce-0429tBManUktuex7vGo40QoqQ.ttf" + }, + { + "family": "Noto Sans Tamil Supplement", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil-supplement" + ], + "version": "v23", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstamilsupplement/v23/DdTz78kEtnooLS5rXF1DaruiCd_bFp_Ph4sGcn7ax_vsAeMkeq1x.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstamilsupplement/v23/DdTz78kEtnooLS5rXF1DaruiCd_bFp_Ph4sGcn7ax8vtC-c.ttf" + }, + { + "family": "Noto Sans Tangsa", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "tangsa" + ], + "version": "v9", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp1YkyoRYdplyJDA.ttf", + "500": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp1qkyoRYdplyJDA.ttf", + "600": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp2GlCoRYdplyJDA.ttf", + "700": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp2_lCoRYdplyJDA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstangsa/v9/z7NCdQPmcigbbZAIOl9igP26K470lICpky0-peX5Qp1YkxoQa94.ttf" + }, + { + "family": "Noto Sans Telugu", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "telugu" + ], + "version": "v30", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntezfqQUbf-3v37w.ttf", + "200": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEnt-zbqQUbf-3v37w.ttf", + "300": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntJTbqQUbf-3v37w.ttf", + "regular": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntezbqQUbf-3v37w.ttf", + "500": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntSTbqQUbf-3v37w.ttf", + "600": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntpTHqQUbf-3v37w.ttf", + "700": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntnDHqQUbf-3v37w.ttf", + "800": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEnt-zHqQUbf-3v37w.ttf", + "900": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEnt0jHqQUbf-3v37w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstelugu/v30/0FlxVOGZlE2Rrtr-HmgkMWJNjJ5_RyT8o8c7fHkeg-esVC5dzHkHIJQqrEntezbaQEzb.ttf" + }, + { + "family": "Noto Sans Thaana", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "thaana" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4XrbxLhnu4-tbNu.ttf", + "200": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4VrbhLhnu4-tbNu.ttf", + "300": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4W1bhLhnu4-tbNu.ttf", + "regular": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4XrbhLhnu4-tbNu.ttf", + "500": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4XZbhLhnu4-tbNu.ttf", + "600": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4U1aRLhnu4-tbNu.ttf", + "700": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4UMaRLhnu4-tbNu.ttf", + "800": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4VraRLhnu4-tbNu.ttf", + "900": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4VCaRLhnu4-tbNu.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansthaana/v26/C8c14dM-vnz-s-3jaEsxlxHkBH-WZOETXfoQrfQ9Y4XrbiLglOo.ttf" + }, + { + "family": "Noto Sans Thai", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "thai" + ], + "version": "v29", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU5RspzF-QRvzzXg.ttf", + "200": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdUxRtpzF-QRvzzXg.ttf", + "300": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU8ptpzF-QRvzzXg.ttf", + "regular": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU5RtpzF-QRvzzXg.ttf", + "500": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU6ZtpzF-QRvzzXg.ttf", + "600": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU0pqpzF-QRvzzXg.ttf", + "700": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU3NqpzF-QRvzzXg.ttf", + "800": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdUxRqpzF-QRvzzXg.ttf", + "900": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdUz1qpzF-QRvzzXg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansthai/v29/iJWnBXeUZi_OHPqn4wq6hQ2_hbJ1xyN9wd43SofNWcd1MKVQt_So_9CdU5RtlzB0RQ.ttf" + }, + { + "family": "Noto Sans Thai Looped", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "thai" + ], + "version": "v16", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_gtHxJiQo49kz2h.ttf", + "200": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_itHhJiQo49kz2h.ttf", + "300": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_hzHhJiQo49kz2h.ttf", + "regular": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_gtHhJiQo49kz2h.ttf", + "500": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_gfHhJiQo49kz2h.ttf", + "600": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_jzGRJiQo49kz2h.ttf", + "700": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_jKGRJiQo49kz2h.ttf", + "800": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_itGRJiQo49kz2h.ttf", + "900": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_iEGRJiQo49kz2h.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansthailooped/v16/B503F6pOpWTRcGrhOVJJ3-oPfY7WQuFu5R36MIjwurFMX_p0KVmQL3HnxYJ8hCVQ-_gtHiJjSIo.ttf" + }, + { + "family": "Noto Sans Tifinagh", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tifinagh" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstifinagh/v21/I_uzMoCduATTei9eI8dawkHIwvmhCvbn6rnEcXfs4Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstifinagh/v21/I_uzMoCduATTei9eI8dawkHIwvmhCvbX67PA.ttf" + }, + { + "family": "Noto Sans Tirhuta", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tirhuta" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanstirhuta/v17/t5t6IQYRNJ6TWjahPR6X-M-apUyby7uGUBsTrn5P.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanstirhuta/v17/t5t6IQYRNJ6TWjahPR6X-M-apUyby4uHWh8.ttf" + }, + { + "family": "Noto Sans Ugaritic", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "ugaritic" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansugaritic/v17/3qTwoiqhnSyU8TNFIdhZVCwbjCpkAXXkMhoIkiazfg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansugaritic/v17/3qTwoiqhnSyU8TNFIdhZVCwbjCpkAXXUMxAM.ttf" + }, + { + "family": "Noto Sans Vai", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vai" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansvai/v18/NaPecZTSBuhTirw6IaFn_UrURMTsDIRSfr0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansvai/v18/NaPecZTSBuhTirw6IaFn_UrUdMXmCA.ttf" + }, + { + "family": "Noto Sans Vithkuqi", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vithkuqi" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnva5SgKM7vmn0BLE.ttf", + "500": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnvZxSgKM7vmn0BLE.ttf", + "600": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnvXBVgKM7vmn0BLE.ttf", + "700": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnvUlVgKM7vmn0BLE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansvithkuqi/v3/jVyi7m77CXvQswd6WjYu9E1wN6cih2TSchUEkQgw3KTnva5SsKIxug.ttf" + }, + { + "family": "Noto Sans Wancho", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "wancho" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanswancho/v18/zrf-0GXXyfn6Fs0lH9P4cUubP0GBqAPopiRfKp8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanswancho/v18/zrf-0GXXyfn6Fs0lH9P4cUubP0GBmALiog.ttf" + }, + { + "family": "Noto Sans Warang Citi", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "warang-citi" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanswarangciti/v18/EYqtmb9SzL1YtsZSScyKDXIeOv3w-zgsNvKRpeVCCXzdgA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanswarangciti/v18/EYqtmb9SzL1YtsZSScyKDXIeOv3w-zgsNvKhpO9G.ttf" + }, + { + "family": "Noto Sans Yi", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "yi" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notosansyi/v20/sJoD3LFXjsSdcnzn071rO3apxVDJNVgSNg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosansyi/v20/sJoD3LFXjsSdcnzn071rO3aZxFrN.ttf" + }, + { + "family": "Noto Sans Zanabazar Square", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "zanabazar-square" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notosanszanabazarsquare/v20/Cn-jJsuGWQxOjaGwMQ6fOicyxLBEMRfDtkzl4uagQtJxOCEgN0Gc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notosanszanabazarsquare/v20/Cn-jJsuGWQxOjaGwMQ6fOicyxLBEMRfDtkzl4uagQuJwMiU.ttf" + }, + { + "family": "Noto Serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "math", + "vietnamese" + ], + "version": "v33", + "lastModified": "2025-09-06", + "files": { + "100": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZqFGjwM0Lhq_Szw.ttf", + "200": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZKFCjwM0Lhq_Szw.ttf", + "300": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZ9lCjwM0Lhq_Szw.ttf", + "regular": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZqFCjwM0Lhq_Szw.ttf", + "500": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZmlCjwM0Lhq_Szw.ttf", + "600": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZdlejwM0Lhq_Szw.ttf", + "700": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZT1ejwM0Lhq_Szw.ttf", + "800": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZKFejwM0Lhq_Szw.ttf", + "900": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZAVejwM0Lhq_Szw.ttf", + "100italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBNLgscPpKrCzyUi.ttf", + "200italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBPLg8cPpKrCzyUi.ttf", + "300italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBMVg8cPpKrCzyUi.ttf", + "italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBNLg8cPpKrCzyUi.ttf", + "500italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBN5g8cPpKrCzyUi.ttf", + "600italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBOVhMcPpKrCzyUi.ttf", + "700italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBOshMcPpKrCzyUi.ttf", + "800italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBPLhMcPpKrCzyUi.ttf", + "900italic": "https://fonts.gstatic.com/s/notoserif/v33/ga6saw1J5X9T9RW6j9bNfFIMZhhWnFTyNZIQD1-_FXP0RgnaOg9MYBPihMcPpKrCzyUi.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserif/v33/ga6iaw1J5X9T9RW6j9bNVls-hfgvz8JcMofYTa32J4wsL2JAlAhZqFCTwccP.ttf" + }, + { + "family": "Noto Serif Ahom", + "variants": [ + "regular" + ], + "subsets": [ + "ahom", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifahom/v21/FeVIS0hfp6cprmEUffAW_fUL_AN-wuYrPFiwaw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifahom/v21/FeVIS0hfp6cprmEUffAW_fUL_ANOw-wv.ttf" + }, + { + "family": "Noto Serif Armenian", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "armenian", + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZi8ObxvXagGdkbg.ttf", + "200": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZC8KbxvXagGdkbg.ttf", + "300": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZ1cKbxvXagGdkbg.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZi8KbxvXagGdkbg.ttf", + "500": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZucKbxvXagGdkbg.ttf", + "600": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZVcWbxvXagGdkbg.ttf", + "700": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZbMWbxvXagGdkbg.ttf", + "800": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZC8WbxvXagGdkbg.ttf", + "900": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZIsWbxvXagGdkbg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifarmenian/v30/3XFMEqMt3YoFsciDRZxptyCUKJmytZ0kVU-XvF7QaZuL85rnQ_zDNzDe5xNnKxyZi8Krx__e.ttf" + }, + { + "family": "Noto Serif Balinese", + "variants": [ + "regular" + ], + "subsets": [ + "balinese", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifbalinese/v21/QdVKSS0-JginysQSRvuCmUMB_wVeQAxXRbgJdhapcUU.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifbalinese/v21/QdVKSS0-JginysQSRvuCmUMB_wVeQAxXdbkDcg.ttf" + }, + { + "family": "Noto Serif Bengali", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "bengali", + "latin", + "latin-ext" + ], + "version": "v31", + "lastModified": "2025-09-17", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfcAH3qn4LjQH8yD.ttf", + "200": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfeAHnqn4LjQH8yD.ttf", + "300": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfdeHnqn4LjQH8yD.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfcAHnqn4LjQH8yD.ttf", + "500": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfcyHnqn4LjQH8yD.ttf", + "600": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JffeGXqn4LjQH8yD.ttf", + "700": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JffnGXqn4LjQH8yD.ttf", + "800": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfeAGXqn4LjQH8yD.ttf", + "900": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfepGXqn4LjQH8yD.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifbengali/v31/hYkuPvggTvnzO14VSXltirUdnnkt1pwmWrprmO7RjE0a5BtdATYU1crFaM_5JfcAHkqm6rw.ttf" + }, + { + "family": "Noto Serif Devanagari", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v34", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTA-og-HMUe1u_dv.ttf", + "200": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTC-ow-HMUe1u_dv.ttf", + "300": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTBgow-HMUe1u_dv.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTA-ow-HMUe1u_dv.ttf", + "500": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTAMow-HMUe1u_dv.ttf", + "600": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTDgpA-HMUe1u_dv.ttf", + "700": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTDZpA-HMUe1u_dv.ttf", + "800": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTC-pA-HMUe1u_dv.ttf", + "900": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTCXpA-HMUe1u_dv.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifdevanagari/v34/x3dYcl3IZKmUqiMk48ZHXJ5jwU-DZGRSaQ4Hh2dGyFzPLcQPVbnRNeFsw0xRWb6uxTA-oz-GO0M.ttf" + }, + { + "family": "Noto Serif Display", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-06", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVpd49gKaDU9hvzC.ttf", + "200": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVrd4tgKaDU9hvzC.ttf", + "300": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVoD4tgKaDU9hvzC.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVpd4tgKaDU9hvzC.ttf", + "500": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVpv4tgKaDU9hvzC.ttf", + "600": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVqD5dgKaDU9hvzC.ttf", + "700": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVq65dgKaDU9hvzC.ttf", + "800": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVrd5dgKaDU9hvzC.ttf", + "900": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVr05dgKaDU9hvzC.ttf", + "100italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoTBIYjEfg-zCmf4.ttf", + "200italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VobBJYjEfg-zCmf4.ttf", + "300italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoW5JYjEfg-zCmf4.ttf", + "italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoTBJYjEfg-zCmf4.ttf", + "500italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoQJJYjEfg-zCmf4.ttf", + "600italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-Voe5OYjEfg-zCmf4.ttf", + "700italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoddOYjEfg-zCmf4.ttf", + "800italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VobBOYjEfg-zCmf4.ttf", + "900italic": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buEPppa9f8_vkXaZLAgP0G5Wi6QmA1QwcLRCOrN8uo7t6FBJOJTQit-N33sQOk-VoZlOYjEfg-zCmf4.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifdisplay/v29/buERppa9f8_vkXaZLAgP0G5Wi6QmA1QaeYah2sovLCDq_ZgLyt3idQfktOG-PVpd4ugLYjE.ttf" + }, + { + "family": "Noto Serif Dives Akuru", + "variants": [ + "regular" + ], + "subsets": [ + "dives-akuru", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifdivesakuru/v8/QldfNSVMqAsHtsJ_TnD3aT03sMgd57ibeeZT60DIyoV9Ejs.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifdivesakuru/v8/QldfNSVMqAsHtsJ_TnD3aT03sMgd57ibeeZT20HCzg.ttf" + }, + { + "family": "Noto Serif Dogra", + "variants": [ + "regular" + ], + "subsets": [ + "dogra", + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifdogra/v24/MQpP-XquKMC7ROPP3QOOlm7xPu3fGy63IbPzkns.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifdogra/v24/MQpP-XquKMC7ROPP3QOOlm7xPu3fKy-9JQ.ttf" + }, + { + "family": "Noto Serif Ethiopic", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "ethiopic", + "latin", + "latin-ext" + ], + "version": "v32", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCzSQjkaO9UVLyiw.ttf", + "200": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCTSUjkaO9UVLyiw.ttf", + "300": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCkyUjkaO9UVLyiw.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCzSUjkaO9UVLyiw.ttf", + "500": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxC_yUjkaO9UVLyiw.ttf", + "600": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCEyIjkaO9UVLyiw.ttf", + "700": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCKiIjkaO9UVLyiw.ttf", + "800": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCTSIjkaO9UVLyiw.ttf", + "900": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCZCIjkaO9UVLyiw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifethiopic/v32/V8mjoR7-XjwJ8_Au3Ti5tXj5Rd83frpWLK4d-taxqWw2HMWjDxBAg5S_0QsrggxCzSUTkKm5.ttf" + }, + { + "family": "Noto Serif Georgian", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "georgian", + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSTvsfdzTw-FgZxQ.ttf", + "200": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSzvofdzTw-FgZxQ.ttf", + "300": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSEPofdzTw-FgZxQ.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSTvofdzTw-FgZxQ.ttf", + "500": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSfPofdzTw-FgZxQ.ttf", + "600": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSkP0fdzTw-FgZxQ.ttf", + "700": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSqf0fdzTw-FgZxQ.ttf", + "800": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSzv0fdzTw-FgZxQ.ttf", + "900": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aS5_0fdzTw-FgZxQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifgeorgian/v29/VEMXRpd8s4nv8hG_qOzL7HOAw4nt0Sl_XxyaEduNMvi7T6Y4etRnmGhyLop-R3aSTvovdj70.ttf" + }, + { + "family": "Noto Serif Grantha", + "variants": [ + "regular" + ], + "subsets": [ + "grantha", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifgrantha/v22/qkBIXuEH5NzDDvc3fLDYxPk9-Wq3WLiqFENLR7fHGw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifgrantha/v22/qkBIXuEH5NzDDvc3fLDYxPk9-Wq3WLiaFUlP.ttf" + }, + { + "family": "Noto Serif Gujarati", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v29", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuYycYzuM1Kf-OJu.ttf", + "200": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuaycIzuM1Kf-OJu.ttf", + "300": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuZscIzuM1Kf-OJu.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuYycIzuM1Kf-OJu.ttf", + "500": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuYAcIzuM1Kf-OJu.ttf", + "600": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2Hubsd4zuM1Kf-OJu.ttf", + "700": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HubVd4zuM1Kf-OJu.ttf", + "800": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2Huayd4zuM1Kf-OJu.ttf", + "900": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2Huabd4zuM1Kf-OJu.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifgujarati/v29/hESa6WBlOixO-3OJ1FTmTsmqlBRUJBVkcgNLpdsspzP2HuYycLzvOVY.ttf" + }, + { + "family": "Noto Serif Gurmukhi", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "gurmukhi", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr6-eBTNmqVU7y6l.ttf", + "200": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr4-eRTNmqVU7y6l.ttf", + "300": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr7geRTNmqVU7y6l.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr6-eRTNmqVU7y6l.ttf", + "500": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr6MeRTNmqVU7y6l.ttf", + "600": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr5gfhTNmqVU7y6l.ttf", + "700": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr5ZfhTNmqVU7y6l.ttf", + "800": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr4-fhTNmqVU7y6l.ttf", + "900": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr4XfhTNmqVU7y6l.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifgurmukhi/v22/92z-tA9LNqsg7tCYlXdCV1VPnAEeDU0vLoYMbylXk0xTCr6-eSTMkKE.ttf" + }, + { + "family": "Noto Serif HK", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "chinese-hongkong", + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMf-K2RmV9Su1M6i.ttf", + "300": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMcgK2RmV9Su1M6i.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMd-K2RmV9Su1M6i.ttf", + "500": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMdMK2RmV9Su1M6i.ttf", + "600": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMegLGRmV9Su1M6i.ttf", + "700": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMeZLGRmV9Su1M6i.ttf", + "800": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMf-LGRmV9Su1M6i.ttf", + "900": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMfXLGRmV9Su1M6i.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifhk/v11/BngdUXBETWXI6LwlBZGcqL-B_KuJFcgfwP_9RMd-K1RnXdA.ttf" + }, + { + "family": "Noto Serif Hebrew", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVAwTAG8_vlQxz24.ttf", + "200": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVIwSAG8_vlQxz24.ttf", + "300": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVFISAG8_vlQxz24.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVAwSAG8_vlQxz24.ttf", + "500": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVD4SAG8_vlQxz24.ttf", + "600": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVNIVAG8_vlQxz24.ttf", + "700": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVOsVAG8_vlQxz24.ttf", + "800": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVIwVAG8_vlQxz24.ttf", + "900": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVKUVAG8_vlQxz24.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifhebrew/v30/k3k0o9MMPvpLmixYH7euCwmkS9DohjX1-kRyiqyBqIxnoLbp93i9IKrXKF_qVAwSMG41ug.ttf" + }, + { + "family": "Noto Serif Hentaigana", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "kana-extended", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzgwGqxEZWEARdDE.ttf", + "300": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hztIGqxEZWEARdDE.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzowGqxEZWEARdDE.ttf", + "500": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzr4GqxEZWEARdDE.ttf", + "600": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzlIBqxEZWEARdDE.ttf", + "700": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzmsBqxEZWEARdDE.ttf", + "800": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzgwBqxEZWEARdDE.ttf", + "900": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hziUBqxEZWEARdDE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifhentaigana/v17/uk-OEHi3o6EruUbj3pGaDj3siVARn-kqgu1eOHk7wYK23O0hzowGmxATXA.ttf" + }, + { + "family": "Noto Serif JP", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v32", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2byxOubAILO5wBCU.ttf", + "300": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bxvOubAILO5wBCU.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bwxOubAILO5wBCU.ttf", + "500": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bwDOubAILO5wBCU.ttf", + "600": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bzvPebAILO5wBCU.ttf", + "700": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bzWPebAILO5wBCU.ttf", + "800": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2byxPebAILO5wBCU.ttf", + "900": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2byYPebAILO5wBCU.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifjp/v32/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bwxOtbBKrc.ttf" + }, + { + "family": "Noto Serif KR", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "korean", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v30", + "lastModified": "2025-09-02", + "files": { + "200": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOnchmeM524ZvTePRu.ttf", + "300": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOnci4eM524ZvTePRu.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncjmeM524ZvTePRu.ttf", + "500": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncjUeM524ZvTePRu.ttf", + "600": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncg4f8524ZvTePRu.ttf", + "700": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncgBf8524ZvTePRu.ttf", + "800": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOnchmf8524ZvTePRu.ttf", + "900": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOnchPf8524ZvTePRu.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifkr/v30/3JnoSDn90Gmq2mr3blnHaTZXbOtLJDvui3JOncjmeP53658.ttf" + }, + { + "family": "Noto Serif Kannada", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgcYCceRJ71svgcI.ttf", + "200": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgUYDceRJ71svgcI.ttf", + "300": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgZgDceRJ71svgcI.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgcYDceRJ71svgcI.ttf", + "500": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgfQDceRJ71svgcI.ttf", + "600": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgRgEceRJ71svgcI.ttf", + "700": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgSEEceRJ71svgcI.ttf", + "800": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgUYEceRJ71svgcI.ttf", + "900": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgW8EceRJ71svgcI.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifkannada/v30/v6-8GZHLJFKIhClqUYqXDiWqpxQxWSPoW6bz-l4hGHiNgcYDQeVD6w.ttf" + }, + { + "family": "Noto Serif Khitan Small Script", + "variants": [ + "regular" + ], + "subsets": [ + "khitan-small-script", + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifkhitansmallscript/v4/jizzRFVKsm4Bt9PrbSzC4KLlQUF5lRJg5j-l5PvyhfTdd4TsZ8lb39iddA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifkhitansmallscript/v4/jizzRFVKsm4Bt9PrbSzC4KLlQUF5lRJg5j-l5PvyhfTdd4TcZsNf.ttf" + }, + { + "family": "Noto Serif Khmer", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "khmer", + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdN6B4wXEZK9Xo4xg.ttf", + "200": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNaB8wXEZK9Xo4xg.ttf", + "300": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNth8wXEZK9Xo4xg.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdN6B8wXEZK9Xo4xg.ttf", + "500": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdN2h8wXEZK9Xo4xg.ttf", + "600": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNNhgwXEZK9Xo4xg.ttf", + "700": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNDxgwXEZK9Xo4xg.ttf", + "800": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNaBgwXEZK9Xo4xg.ttf", + "900": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdNQRgwXEZK9Xo4xg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifkhmer/v29/-F6UfidqLzI2JPCkXAO2hmogq0146FxtbwKEr951z5s6lI40sDRH_AVhUKdN6B8AXUxO.ttf" + }, + { + "family": "Noto Serif Khojki", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "khojki", + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMY0ghvyZ0Qtc5HAQ.ttf", + "500": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMY4AhvyZ0Qtc5HAQ.ttf", + "600": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMYDA9vyZ0Qtc5HAQ.ttf", + "700": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMYNQ9vyZ0Qtc5HAQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifkhojki/v13/I_uHMoOduATTei9aP90ctmPGxP2rBKTM4mcQ5M3z9QMY0ghfyJcU.ttf" + }, + { + "family": "Noto Serif Lao", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "lao", + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VeMLrvOjlmyhHHQ.ttf", + "200": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VWMKrvOjlmyhHHQ.ttf", + "300": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8Vb0KrvOjlmyhHHQ.ttf", + "regular": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VeMKrvOjlmyhHHQ.ttf", + "500": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VdEKrvOjlmyhHHQ.ttf", + "600": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VT0NrvOjlmyhHHQ.ttf", + "700": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VQQNrvOjlmyhHHQ.ttf", + "800": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VWMNrvOjlmyhHHQ.ttf", + "900": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VUoNrvOjlmyhHHQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoseriflao/v29/3y9C6bYwcCjmsU8JEzCMxEwQfEBLk3f0rlSqCdaM_LlSNZ59oNw0BWH8VeMKnvKpkg.ttf" + }, + { + "family": "Noto Serif Makasar", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "makasar" + ], + "version": "v1", + "lastModified": "2023-06-30", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifmakasar/v1/memjYbqtyH-NiZpFH_9zcvB_PqkfY9S7j4HTVSmevw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifmakasar/v1/memjYbqtyH-NiZpFH_9zcvB_PqkfY9SLjovX.ttf" + }, + { + "family": "Noto Serif Malayalam", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "malayalam" + ], + "version": "v32", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1t-1fnVwHpQVySg.ttf", + "200": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1N-xfnVwHpQVySg.ttf", + "300": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL16exfnVwHpQVySg.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1t-xfnVwHpQVySg.ttf", + "500": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1hexfnVwHpQVySg.ttf", + "600": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1aetfnVwHpQVySg.ttf", + "700": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1UOtfnVwHpQVySg.ttf", + "800": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1N-tfnVwHpQVySg.ttf", + "900": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1HutfnVwHpQVySg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifmalayalam/v32/JIAZUU5sdmdP_HMcVcZFcH7DeVBeGVgSMEk2cmVDq1ihUXL1t-xvnFYD.ttf" + }, + { + "family": "Noto Serif Myanmar", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "myanmar" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJudM7F2Yv76aBKKs-bHMQfAHUw3jnNwBDsU9X6RPzQ.ttf", + "200": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNbDHMefv2TeXJng.ttf", + "300": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNCDLMefv2TeXJng.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJsdM7F2Yv76aBKKs-bHMQfAHUw3jn1pBrocdDqRA.ttf", + "500": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNUDPMefv2TeXJng.ttf", + "600": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNfDTMefv2TeXJng.ttf", + "700": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNGDXMefv2TeXJng.ttf", + "800": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNBDbMefv2TeXJng.ttf", + "900": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJvdM7F2Yv76aBKKs-bHMQfAHUw3jnNIDfMefv2TeXJng.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifmyanmar/v14/VuJsdM7F2Yv76aBKKs-bHMQfAHUw3jnFpRDs.ttf" + }, + { + "family": "Noto Serif NP Hmong", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "nyiakeng-puachue-hmong" + ], + "version": "v5", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbjPhFLp3u0rVO-d.ttf", + "500": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbj9hFLp3u0rVO-d.ttf", + "600": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbgRg1Lp3u0rVO-d.ttf", + "700": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbgog1Lp3u0rVO-d.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifnphmong/v5/pONN1gItFMO79E4L1GPUi-2sixKHZyFj9Jy6_KhXPwzdvbjPhGLo1Ok.ttf" + }, + { + "family": "Noto Serif Old Uyghur", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "old-uyghur" + ], + "version": "v4", + "lastModified": "2024-09-23", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifolduyghur/v4/v6-KGZbLJFKIhClqUYqXDiGnrVoFRCW6JdwnKumeF2yVgA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifolduyghur/v4/v6-KGZbLJFKIhClqUYqXDiGnrVoFRCW6JdwXK-Oa.ttf" + }, + { + "family": "Noto Serif Oriya", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "oriya" + ], + "version": "v6", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxrc_Hy-v039MF1j.ttf", + "500": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxru_Hy-v039MF1j.ttf", + "600": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxoC-3y-v039MF1j.ttf", + "700": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxo7-3y-v039MF1j.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoseriforiya/v6/MjQQmj56u-r69izk_LDqWN7w0cYByutv9qeWYrvLaxrc_Ey_tUk.ttf" + }, + { + "family": "Noto Serif Ottoman Siyaq", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "ottoman-siyaq-numbers" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifottomansiyaq/v2/fC1yPZ9IYnzRhTrrc4s8cSvYI0eozzaFOQ01qoHLJrgA00kAdA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifottomansiyaq/v2/fC1yPZ9IYnzRhTrrc4s8cSvYI0eozzaFOQ01qoH7J7IE.ttf" + }, + { + "family": "Noto Serif SC", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "chinese-simplified", + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v34", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7QCqyWv847hdDWC.ttf", + "300": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7TcqyWv847hdDWC.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7SCqyWv847hdDWC.ttf", + "500": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7SwqyWv847hdDWC.ttf", + "600": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7RcrCWv847hdDWC.ttf", + "700": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7RlrCWv847hdDWC.ttf", + "800": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7QCrCWv847hdDWC.ttf", + "900": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7QrrCWv847hdDWC.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifsc/v34/H4cyBXePl9DZ0Xe7gG9cyOj7uK2-n-D2rd4FY7SCqxWu-Yo.ttf" + }, + { + "family": "Noto Serif Sinhala", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "sinhala" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pGxRlMsxaLRn3W-.ttf", + "200": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pExR1MsxaLRn3W-.ttf", + "300": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pHvR1MsxaLRn3W-.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pGxR1MsxaLRn3W-.ttf", + "500": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pGDR1MsxaLRn3W-.ttf", + "600": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pFvQFMsxaLRn3W-.ttf", + "700": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pFWQFMsxaLRn3W-.ttf", + "800": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pExQFMsxaLRn3W-.ttf", + "900": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pEYQFMsxaLRn3W-.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifsinhala/v30/DtVEJwinQqclnZE2CnsPug9lgGC3y2F2nehQ7Eg4EdBKWxPiDxMivFLgRXs_-pGxR2Mtz6Y.ttf" + }, + { + "family": "Noto Serif TC", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v34", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX_aMOpDOWYMr2OM.ttf", + "300": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX8EMOpDOWYMr2OM.ttf", + "regular": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX9aMOpDOWYMr2OM.ttf", + "500": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX9oMOpDOWYMr2OM.ttf", + "600": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX-EN-pDOWYMr2OM.ttf", + "700": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX-9N-pDOWYMr2OM.ttf", + "800": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX_aN-pDOWYMr2OM.ttf", + "900": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX_zN-pDOWYMr2OM.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoseriftc/v34/XLYzIZb5bJNDGYxLBibeHZ0BnHwmuanx8cUaGX9aMNpCM2I.ttf" + }, + { + "family": "Noto Serif Tamil", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil" + ], + "version": "v31", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecattN6R8Pz3v8Etew.ttf", + "200": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatNN-R8Pz3v8Etew.ttf", + "300": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecat6t-R8Pz3v8Etew.ttf", + "regular": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecattN-R8Pz3v8Etew.ttf", + "500": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatht-R8Pz3v8Etew.ttf", + "600": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatatiR8Pz3v8Etew.ttf", + "700": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatU9iR8Pz3v8Etew.ttf", + "800": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatNNiR8Pz3v8Etew.ttf", + "900": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecatHdiR8Pz3v8Etew.ttf", + "100italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJx5svbzncQ9e3wx.ttf", + "200italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJz5s_bzncQ9e3wx.ttf", + "300italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJwns_bzncQ9e3wx.ttf", + "italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJx5s_bzncQ9e3wx.ttf", + "500italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJxLs_bzncQ9e3wx.ttf", + "600italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJyntPbzncQ9e3wx.ttf", + "700italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJyetPbzncQ9e3wx.ttf", + "800italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJz5tPbzncQ9e3wx.ttf", + "900italic": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjldHr-klIgTfc40komjQ5OObazSJaI_D5kV8k_WLwFBmWrypghjeOa18G4fJzQtPbzncQ9e3wx.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoseriftamil/v31/LYjndHr-klIgTfc40komjQ5OObazYp-6H94dBF-RX6nNRJfi-Gf55IgAecattN-h8fbz.ttf" + }, + { + "family": "Noto Serif Tangut", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tangut" + ], + "version": "v19", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/notoseriftangut/v19/xn76YGc72GKoTvER4Gn3b4m9Ern7Em41fcvN2KT4.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoseriftangut/v19/xn76YGc72GKoTvER4Gn3b4m9Ern7El40d88.ttf" + }, + { + "family": "Noto Serif Telugu", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "telugu" + ], + "version": "v29", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9D9TGwuY2fjgrZYA.ttf", + "200": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DdTCwuY2fjgrZYA.ttf", + "300": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DqzCwuY2fjgrZYA.ttf", + "regular": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9D9TCwuY2fjgrZYA.ttf", + "500": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DxzCwuY2fjgrZYA.ttf", + "600": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DKzewuY2fjgrZYA.ttf", + "700": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DEjewuY2fjgrZYA.ttf", + "800": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DdTewuY2fjgrZYA.ttf", + "900": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9DXDewuY2fjgrZYA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoseriftelugu/v29/tDbl2pCbnkEKmXNVmt2M1q6f4HWbbj6MRbYEeav7Fe9D9TCAuIeb.ttf" + }, + { + "family": "Noto Serif Thai", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "thai" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0oiFuRRCmsdu0Qx.ttf", + "200": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0qiF-RRCmsdu0Qx.ttf", + "300": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0p8F-RRCmsdu0Qx.ttf", + "regular": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0oiF-RRCmsdu0Qx.ttf", + "500": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0oQF-RRCmsdu0Qx.ttf", + "600": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0r8EORRCmsdu0Qx.ttf", + "700": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0rFEORRCmsdu0Qx.ttf", + "800": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0qiEORRCmsdu0Qx.ttf", + "900": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0qLEORRCmsdu0Qx.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifthai/v28/k3kyo80MPvpLmixYH7euCxWpSMu3-gcWGj0hHAKGvUQlUv_bCKDUSzB5L0oiF9RQAG8.ttf" + }, + { + "family": "Noto Serif Tibetan", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "tibetan" + ], + "version": "v24", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIrYdPS7rdSy_32c.ttf", + "200": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIjYcPS7rdSy_32c.ttf", + "300": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIugcPS7rdSy_32c.ttf", + "regular": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIrYcPS7rdSy_32c.ttf", + "500": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIoQcPS7rdSy_32c.ttf", + "600": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmImgbPS7rdSy_32c.ttf", + "700": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIlEbPS7rdSy_32c.ttf", + "800": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIjYbPS7rdSy_32c.ttf", + "900": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIh8bPS7rdSy_32c.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoseriftibetan/v24/gokGH7nwAEdtF9N45n0Vaz7O-pk0wsvxHeDXMfqguoCmIrYcDS_hcQ.ttf" + }, + { + "family": "Noto Serif Todhri", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "todhri" + ], + "version": "v3", + "lastModified": "2025-01-23", + "files": { + "regular": "https://fonts.gstatic.com/s/notoseriftodhri/v3/dFalZeyY-aYz1YVbjMoBWml1nBz7N3ByX6n0fnNk.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoseriftodhri/v3/dFalZeyY-aYz1YVbjMoBWml1nBz7N0BzVa0.ttf" + }, + { + "family": "Noto Serif Toto", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "toto" + ], + "version": "v7", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhCy3Il-aj55vdNug.ttf", + "500": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhCx_Il-aj55vdNug.ttf", + "600": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhC_PPl-aj55vdNug.ttf", + "700": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhC8rPl-aj55vdNug.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoseriftoto/v7/Ktk6ALSMeZjqPnXk1rCkHYHNtwvtHItpjRP74dHhCy3Ip-ep4w.ttf" + }, + { + "family": "Noto Serif Vithkuqi", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vithkuqi" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRWMdW2Cqy9A4teH.ttf", + "500": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRW-dW2Cqy9A4teH.ttf", + "600": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRVScm2Cqy9A4teH.ttf", + "700": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRVrcm2Cqy9A4teH.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifvithkuqi/v3/YA94r1OY7FjTf5szakutkndpw9HH-4a4z9pklvg1IQSNcRWMdV2DoSs.ttf" + }, + { + "family": "Noto Serif Yezidi", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "yezidi" + ], + "version": "v23", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspD2yEkrlGJgmVCqg.ttf", + "500": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspD6SEkrlGJgmVCqg.ttf", + "600": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspDBSYkrlGJgmVCqg.ttf", + "700": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspDPCYkrlGJgmVCqg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoserifyezidi/v23/XLYPIYr5bJNDGYxLBibeHZAn3B5KJENnQjbfhMSVZspD2yEUr1uN.ttf" + }, + { + "family": "Noto Traditional Nushu", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "nushu" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXvy1tnPa7QoqirI.ttf", + "regular": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXus1tnPa7QoqirI.ttf", + "500": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXue1tnPa7QoqirI.ttf", + "600": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXty0dnPa7QoqirI.ttf", + "700": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXtL0dnPa7QoqirI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nototraditionalnushu/v23/SZcV3EDkJ7q9FaoMPlmF4Su8hlIjoGh5aj67PUZX6ADm6oa8IXus1unOYbA.ttf" + }, + { + "family": "Noto Znamenny Musical Notation", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols", + "znamenny" + ], + "version": "v7", + "lastModified": "2025-06-09", + "files": { + "regular": "https://fonts.gstatic.com/s/notoznamennymusicalnotation/v7/CSRW4ylQnPyaDwAMK1U_AolTaJ4Lz41GcgaIZV9YO2rO88jvtpqqdoWa7g.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/notoznamennymusicalnotation/v7/CSRW4ylQnPyaDwAMK1U_AolTaJ4Lz41GcgaIZV9YO2rO88jft5Cu.ttf", + "colorCapabilities": [ + "COLRv0" + ] + }, + { + "family": "Nova Cut", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/novacut/v26/KFOkCnSYu8mL-39LkWxPKTM1K9nz.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/novacut/v26/KFOkCnSYu8mL-39LkVxOIzc.ttf" + }, + { + "family": "Nova Flat", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/novaflat/v26/QdVUSTc-JgqpytEbVebEuStkm20oJA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/novaflat/v26/QdVUSTc-JgqpytEbVeb0uCFg.ttf" + }, + { + "family": "Nova Mono", + "variants": [ + "regular" + ], + "subsets": [ + "greek", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/novamono/v23/Cn-0JtiGWQ5Ajb--MRKfYGxYrdM9Sg.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/novamono/v23/Cn-0JtiGWQ5Ajb--MRKvYWZc.ttf" + }, + { + "family": "Nova Oval", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/novaoval/v26/jAnEgHdmANHvPenMaswCMY-h3cWkWg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/novaoval/v26/jAnEgHdmANHvPenMaswyMIWl.ttf" + }, + { + "family": "Nova Round", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/novaround/v23/flU9Rqquw5UhEnlwTJYTYYfeeetYEBc.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/novaround/v23/flU9Rqquw5UhEnlwTJYTUYbUfQ.ttf" + }, + { + "family": "Nova Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/novascript/v27/7Au7p_IpkSWSTWaFWkumvmQNEl0O0kEx.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/novascript/v27/7Au7p_IpkSWSTWaFWkumvlQMGFk.ttf" + }, + { + "family": "Nova Slim", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/novaslim/v26/Z9XUDmZNQAuem8jyZcn-yMOInrib9Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/novaslim/v26/Z9XUDmZNQAuem8jyZcnOycmM.ttf" + }, + { + "family": "Nova Square", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/novasquare/v27/RrQUbo9-9DV7b06QHgSWsZhARYMgGtWA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/novasquare/v27/RrQUbo9-9DV7b06QHgSWsahBT4c.ttf" + }, + { + "family": "Numans", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/numans/v16/SlGRmQmGupYAfH8IYRggiHVqaQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/numans/v16/SlGRmQmGupYAfH84YBIk.ttf" + }, + { + "family": "Nunito", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v32", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDDshRTM9jo7eTWk.ttf", + "300": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDOUhRTM9jo7eTWk.ttf", + "regular": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDLshRTM9jo7eTWk.ttf", + "500": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhRTM9jo7eTWk.ttf", + "600": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDGUmRTM9jo7eTWk.ttf", + "700": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDFwmRTM9jo7eTWk.ttf", + "800": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDDsmRTM9jo7eTWk.ttf", + "900": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDBImRTM9jo7eTWk.ttf", + "200italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiLXA3iqzbXWnoeg.ttf", + "300italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNi83A3iqzbXWnoeg.ttf", + "italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNirXA3iqzbXWnoeg.ttf", + "500italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNin3A3iqzbXWnoeg.ttf", + "600italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNic3c3iqzbXWnoeg.ttf", + "700italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiSnc3iqzbXWnoeg.ttf", + "800italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiLXc3iqzbXWnoeg.ttf", + "900italic": "https://fonts.gstatic.com/s/nunito/v32/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiBHc3iqzbXWnoeg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nunito/v32/XRXI3I6Li01BKofiOc5wtlZ2di8HDLshdTI3ig.ttf" + }, + { + "family": "Nunito Sans", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GVilntF8kA_Ykqw.ttf", + "300": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GiClntF8kA_Ykqw.ttf", + "regular": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4G1ilntF8kA_Ykqw.ttf", + "500": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4G5ClntF8kA_Ykqw.ttf", + "600": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GCC5ntF8kA_Ykqw.ttf", + "700": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GMS5ntF8kA_Ykqw.ttf", + "800": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4GVi5ntF8kA_Ykqw.ttf", + "900": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4Gfy5ntF8kA_Ykqw.ttf", + "200italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmoP91UgIfM0qxVd.ttf", + "300italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmrR91UgIfM0qxVd.ttf", + "italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmqP91UgIfM0qxVd.ttf", + "500italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmq991UgIfM0qxVd.ttf", + "600italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmpR8FUgIfM0qxVd.ttf", + "700italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmpo8FUgIfM0qxVd.ttf", + "800italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmoP8FUgIfM0qxVd.ttf", + "900italic": "https://fonts.gstatic.com/s/nunitosans/v19/pe1kMImSLYBIv1o4X1M8cce4OdVisMz5nZRqy6cmmmU3t2FQWEAEOvV9wNvrwlNstMKW3Y6K5WMwXeVy3GboJ0kTHmom8FUgIfM0qxVd.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nunitosans/v19/pe1mMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp5F5bxqqtQ1yiU4G1ilXtVUg.ttf" + }, + { + "family": "Nuosu SIL", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "yi" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/nuosusil/v12/8vIK7wM3wmRn_kc4uAjeFGxbO_zo-w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/nuosusil/v12/8vIK7wM3wmRn_kc4uAjuFWZf.ttf" + }, + { + "family": "Odibee Sans", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/odibeesans/v20/neIPzCSooYAho6WvjeToRYkyepH9qGsf.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/odibeesans/v20/neIPzCSooYAho6WvjeToRbkzcJU.ttf" + }, + { + "family": "Odor Mean Chey", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v31", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/odormeanchey/v31/raxkHiKDttkTe1aOGcJMR1A_4mrY2zqUKafv.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/odormeanchey/v31/raxkHiKDttkTe1aOGcJMR1A_4lrZ0T4.ttf" + }, + { + "family": "Offside", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/offside/v26/HI_KiYMWKa9QrAykQ5HiRp-dhpQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/offside/v26/HI_KiYMWKa9QrAykc5DoQg.ttf" + }, + { + "family": "Oi", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "tamil", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/oi/v21/w8gXH2EuRqtaut6yjBOG.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oi/v21/w8gXH2EuRptbsNo.ttf" + }, + { + "family": "Ojuju", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_ypk552FRLYeruQ.ttf", + "300": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_FJk552FRLYeruQ.ttf", + "regular": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_Spk552FRLYeruQ.ttf", + "500": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_eJk552FRLYeruQ.ttf", + "600": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_lJ4552FRLYeruQ.ttf", + "700": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_rZ4552FRLYeruQ.ttf", + "800": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_yp4552FRLYeruQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ojuju/v5/7r3bqXF7v9ApbrMih3jYQBVm9-n_SpkJ5mtV.ttf" + }, + { + "family": "Old Standard TT", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/oldstandardtt/v22/MwQubh3o1vLImiwAVvYawgcf2eVurVC5RHdCZg.ttf", + "italic": "https://fonts.gstatic.com/s/oldstandardtt/v22/MwQsbh3o1vLImiwAVvYawgcf2eVer1q9ZnJSZtQG.ttf", + "700": "https://fonts.gstatic.com/s/oldstandardtt/v22/MwQrbh3o1vLImiwAVvYawgcf2eVWEX-dTFxeb80flQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oldstandardtt/v22/MwQubh3o1vLImiwAVvYawgcf2eVerFq9.ttf" + }, + { + "family": "Oldenburg", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/oldenburg/v24/fC1jPY5JYWzbywv7c4V6UU6oXyndrw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oldenburg/v24/fC1jPY5JYWzbywv7c4VKUESs.ttf" + }, + { + "family": "Ole", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/ole/v3/dFazZf6Z-rd89fw69qJ_ew.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ole/v3/dFazZf6Z-rdM9PY-.ttf" + }, + { + "family": "Oleo Script", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/oleoscript/v15/rax5HieDvtMOe0iICsUccBhasU7Q8Cad.ttf", + "700": "https://fonts.gstatic.com/s/oleoscript/v15/raxkHieDvtMOe0iICsUccCDmnmrY2zqUKafv.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oleoscript/v15/rax5HieDvtMOe0iICsUccChbu0o.ttf" + }, + { + "family": "Oleo Script Swash Caps", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/oleoscriptswashcaps/v14/Noaj6Vb-w5SFbTTAsZP_7JkCS08K-jCzDn_HMXquSY0Hg90.ttf", + "700": "https://fonts.gstatic.com/s/oleoscriptswashcaps/v14/Noag6Vb-w5SFbTTAsZP_7JkCS08K-jCzDn_HCcaBbYUsn9T5dt0.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oleoscriptswashcaps/v14/Noaj6Vb-w5SFbTTAsZP_7JkCS08K-jCzDn_HAXukTQ.ttf" + }, + { + "family": "Onest", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPh9R6ZshFMQWXgSQ.ttf", + "200": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhdR-ZshFMQWXgSQ.ttf", + "300": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhqx-ZshFMQWXgSQ.ttf", + "regular": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPh9R-ZshFMQWXgSQ.ttf", + "500": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhxx-ZshFMQWXgSQ.ttf", + "600": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhKxiZshFMQWXgSQ.ttf", + "700": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhEhiZshFMQWXgSQ.ttf", + "800": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhdRiZshFMQWXgSQ.ttf", + "900": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPhXBiZshFMQWXgSQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/onest/v9/gNMZW3F-SZuj7zOT0IfSjTS16cPh9R-psxtI.ttf" + }, + { + "family": "Oooh Baby", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/ooohbaby/v4/2sDcZGJWgJTT2Jf76xQDb2-4C7wFZQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ooohbaby/v4/2sDcZGJWgJTT2Jf76xQzbmW8.ttf" + }, + { + "family": "Open Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "hebrew", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v44", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4nY1M2xLER.ttf", + "regular": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4nY1M2xLER.ttf", + "500": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjr0C4nY1M2xLER.ttf", + "600": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsgH1y4nY1M2xLER.ttf", + "700": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4nY1M2xLER.ttf", + "800": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgshZ1y4nY1M2xLER.ttf", + "300italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVcUwaERZjA.ttf", + "italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVcUwaERZjA.ttf", + "500italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk_RkaVcUwaERZjA.ttf", + "600italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkxhjaVcUwaERZjA.ttf", + "700italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVcUwaERZjA.ttf", + "800italic": "https://fonts.gstatic.com/s/opensans/v44/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk0ZjaVcUwaERZjA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/opensans/v44/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4maVc.ttf" + }, + { + "family": "Oranienbaum", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/oranienbaum/v16/OZpHg_txtzZKMuXLIVrx-3zn7kz3dpHc.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oranienbaum/v16/OZpHg_txtzZKMuXLIVrx-0zm5Eg.ttf" + }, + { + "family": "Orbit", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/orbit/v1/_LOCmz7I-uHd2mjEeqciRwRm.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/orbit/v1/_LOCmz7I-uHd2ljFcKM.ttf" + }, + { + "family": "Orbitron", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v35", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyGy6xpmIyXjU1pg.ttf", + "500": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyKS6xpmIyXjU1pg.ttf", + "600": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyxSmxpmIyXjU1pg.ttf", + "700": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1ny_CmxpmIyXjU1pg.ttf", + "800": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nymymxpmIyXjU1pg.ttf", + "900": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nysimxpmIyXjU1pg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/orbitron/v35/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyGy6Bp2g2.ttf" + }, + { + "family": "Oregano", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/oregano/v17/If2IXTPxciS3H4S2kZffPznO3yM.ttf", + "italic": "https://fonts.gstatic.com/s/oregano/v17/If2KXTPxciS3H4S2oZXVOxvLzyP_qw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oregano/v17/If2IXTPxciS3H4S2oZbVOw.ttf" + }, + { + "family": "Orelega One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/orelegaone/v14/3qTpojOggD2XtAdFb-QXZGt61EcYaQ7F.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/orelegaone/v14/3qTpojOggD2XtAdFb-QXZFt73kM.ttf" + }, + { + "family": "Orienta", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/orienta/v16/PlI9FlK4Jrl5Y9zNeyeo9HRFhcU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/orienta/v16/PlI9FlK4Jrl5Y9zNSyai8A.ttf" + }, + { + "family": "Original Surfer", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/originalsurfer/v25/RWmQoKGZ9vIirYntXJ3_MbekzNMiDEtvAlaMKw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/originalsurfer/v25/RWmQoKGZ9vIirYntXJ3_MbekzNMSDUFr.ttf" + }, + { + "family": "Oswald", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v57", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs13FvgUFoZAaRliE.ttf", + "300": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs169vgUFoZAaRliE.ttf", + "regular": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs1_FvgUFoZAaRliE.ttf", + "500": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs18NvgUFoZAaRliE.ttf", + "600": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs1y9ogUFoZAaRliE.ttf", + "700": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs1xZogUFoZAaRliE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oswald/v57/TK3_WkUHHAIjg75cFRf3bXL8LICs1_FvsUBiYA.ttf" + }, + { + "family": "Outfit", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4TC0C4G-EiAou6Y.ttf", + "200": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4bC1C4G-EiAou6Y.ttf", + "300": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4W61C4G-EiAou6Y.ttf", + "regular": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4TC1C4G-EiAou6Y.ttf", + "500": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4QK1C4G-EiAou6Y.ttf", + "600": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4e6yC4G-EiAou6Y.ttf", + "700": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4deyC4G-EiAou6Y.ttf", + "800": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4bCyC4G-EiAou6Y.ttf", + "900": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4ZmyC4G-EiAou6Y.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/outfit/v15/QGYyz_MVcBeNP4NjuGObqx1XmO1I4TC1O4C0Fg.ttf" + }, + { + "family": "Over the Rainbow", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/overtherainbow/v23/11haGoXG1k_HKhMLUWz7Mc7vvW5upvOm9NA2XG0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/overtherainbow/v23/11haGoXG1k_HKhMLUWz7Mc7vvW5ulvKs8A.ttf" + }, + { + "family": "Overlock", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/overlock/v19/Z9XVDmdMWRiN1_T9Z4Te4u2El6GC.ttf", + "italic": "https://fonts.gstatic.com/s/overlock/v19/Z9XTDmdMWRiN1_T9Z7Tc6OmmkrGC7Cs.ttf", + "700": "https://fonts.gstatic.com/s/overlock/v19/Z9XSDmdMWRiN1_T9Z7xizcmMvL2L9TLT.ttf", + "700italic": "https://fonts.gstatic.com/s/overlock/v19/Z9XQDmdMWRiN1_T9Z7Tc0FWJtrmp8CLTlNs.ttf", + "900": "https://fonts.gstatic.com/s/overlock/v19/Z9XSDmdMWRiN1_T9Z7xaz8mMvL2L9TLT.ttf", + "900italic": "https://fonts.gstatic.com/s/overlock/v19/Z9XQDmdMWRiN1_T9Z7Tc0G2Ltrmp8CLTlNs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/overlock/v19/Z9XVDmdMWRiN1_T9Z7Tf6Ok.ttf" + }, + { + "family": "Overlock SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/overlocksc/v25/1cX3aUHKGZrstGAY8nwVzHGAq8Sk1PoH.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/overlocksc/v25/1cX3aUHKGZrstGAY8nwVzEGBocA.ttf" + }, + { + "family": "Overpass", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6_PLrOZCLtce-og.ttf", + "200": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6fPPrOZCLtce-og.ttf", + "300": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6ovPrOZCLtce-og.ttf", + "regular": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6_PPrOZCLtce-og.ttf", + "500": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6zvPrOZCLtce-og.ttf", + "600": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6IvTrOZCLtce-og.ttf", + "700": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6G_TrOZCLtce-og.ttf", + "800": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6fPTrOZCLtce-og.ttf", + "900": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6VfTrOZCLtce-og.ttf", + "100italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLADe5qPl8Kuosgz.ttf", + "200italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLCDepqPl8Kuosgz.ttf", + "300italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLBdepqPl8Kuosgz.ttf", + "italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLADepqPl8Kuosgz.ttf", + "500italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLAxepqPl8Kuosgz.ttf", + "600italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLDdfZqPl8Kuosgz.ttf", + "700italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLDkfZqPl8Kuosgz.ttf", + "800italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLCDfZqPl8Kuosgz.ttf", + "900italic": "https://fonts.gstatic.com/s/overpass/v19/qFdU35WCmI96Ajtm81GgSdXCNs-VMF0vNLCqfZqPl8Kuosgz.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/overpass/v19/qFda35WCmI96Ajtm83upeyoaX6QPnlo6_PPbOJqP.ttf" + }, + { + "family": "Overpass Mono", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EWKokzzXur-SmIr.ttf", + "regular": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EXUokzzXur-SmIr.ttf", + "500": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EXmokzzXur-SmIr.ttf", + "600": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EUKpUzzXur-SmIr.ttf", + "700": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EUzpUzzXur-SmIr.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/overpassmono/v21/_Xm5-H86tzKDdAPa-KPQZ-AC_COcRycquHlL6EXUonzyVO4.ttf" + }, + { + "family": "Ovo", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/ovo/v18/yYLl0h7Wyfzjy4Q5_3WVxA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ovo/v18/yYLl0h7WyfzTyo49.ttf" + }, + { + "family": "Oxanium", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G83JfniMBXQ7d67x.ttf", + "300": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G80XfniMBXQ7d67x.ttf", + "regular": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G81JfniMBXQ7d67x.ttf", + "500": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G817fniMBXQ7d67x.ttf", + "600": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G82XeXiMBXQ7d67x.ttf", + "700": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G82ueXiMBXQ7d67x.ttf", + "800": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G83JeXiMBXQ7d67x.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oxanium/v21/RrQPboN_4yJ0JmiMUW7sIGjd1IA9G81JfkiND3A.ttf" + }, + { + "family": "Oxygen", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/oxygen/v16/2sDcZG1Wl4LcnbuCJW8Db2-4C7wFZQ.ttf", + "regular": "https://fonts.gstatic.com/s/oxygen/v16/2sDfZG1Wl4Lcnbu6iUcnZ0SkAg.ttf", + "700": "https://fonts.gstatic.com/s/oxygen/v16/2sDcZG1Wl4LcnbuCNWgDb2-4C7wFZQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oxygen/v16/2sDfZG1Wl4LcnbuKiE0j.ttf" + }, + { + "family": "Oxygen Mono", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/oxygenmono/v15/h0GsssGg9FxgDgCjLeAd7ijfze-PPlUu.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/oxygenmono/v15/h0GsssGg9FxgDgCjLeAd7hjex-s.ttf" + }, + { + "family": "PT Mono", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/ptmono/v14/9oRONYoBnWILk-9ArCg5MtPyAcg.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ptmono/v14/9oRONYoBnWILk-9AnCkzNg.ttf" + }, + { + "family": "PT Sans", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/ptsans/v18/jizaRExUiTo99u79P0WOxOGMMDQ.ttf", + "italic": "https://fonts.gstatic.com/s/ptsans/v18/jizYRExUiTo99u79D0eEwMOJIDQA-g.ttf", + "700": "https://fonts.gstatic.com/s/ptsans/v18/jizfRExUiTo99u79B_mh4OmnLD0Z4zM.ttf", + "700italic": "https://fonts.gstatic.com/s/ptsans/v18/jizdRExUiTo99u79D0e8fOytKB8c8zMrig.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ptsans/v18/jizaRExUiTo99u79D0SEwA.ttf" + }, + { + "family": "PT Sans Caption", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/ptsanscaption/v20/0FlMVP6Hrxmt7-fsUFhlFXNIlpcqfQXwQy6yxg.ttf", + "700": "https://fonts.gstatic.com/s/ptsanscaption/v20/0FlJVP6Hrxmt7-fsUFhlFXNIlpcSwSrUSwWuz38Tgg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ptsanscaption/v20/0FlMVP6Hrxmt7-fsUFhlFXNIlpcafA_0.ttf" + }, + { + "family": "PT Sans Narrow", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/ptsansnarrow/v19/BngRUXNadjH0qYEzV7ab-oWlsYCByxyKeuDp.ttf", + "700": "https://fonts.gstatic.com/s/ptsansnarrow/v19/BngSUXNadjH0qYEzV7ab-oWlsbg95DiCUfzgRd-3.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ptsansnarrow/v19/BngRUXNadjH0qYEzV7ab-oWlsbCAwRg.ttf" + }, + { + "family": "PT Serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/ptserif/v19/EJRVQgYoZZY2vCFuvDFRxL6ddjb-.ttf", + "italic": "https://fonts.gstatic.com/s/ptserif/v19/EJRTQgYoZZY2vCFuvAFTzrq_cyb-vco.ttf", + "700": "https://fonts.gstatic.com/s/ptserif/v19/EJRSQgYoZZY2vCFuvAnt65qVXSr3pNNB.ttf", + "700italic": "https://fonts.gstatic.com/s/ptserif/v19/EJRQQgYoZZY2vCFuvAFT9gaQVy7VocNB6Iw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ptserif/v19/EJRVQgYoZZY2vCFuvAFQzro.ttf" + }, + { + "family": "PT Serif Caption", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/ptserifcaption/v18/ieVl2ZhbGCW-JoW6S34pSDpqYKU059WxDCs5cvI.ttf", + "italic": "https://fonts.gstatic.com/s/ptserifcaption/v18/ieVj2ZhbGCW-JoW6S34pSDpqYKU019e7CAk8YvJEeg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ptserifcaption/v18/ieVl2ZhbGCW-JoW6S34pSDpqYKU019S7CA.ttf" + }, + { + "family": "Pacifico", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/pacifico/v23/FwZY7-Qmy14u9lezJ96A4sijpFu_.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pacifico/v23/FwZY7-Qmy14u9lezJ-6B6Mw.ttf" + }, + { + "family": "Padauk", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "myanmar" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/padauk/v17/RrQRboJg-id7OnbBa0_g3LlYbg.ttf", + "700": "https://fonts.gstatic.com/s/padauk/v17/RrQSboJg-id7Onb512DE1JJEZ4YwGg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/padauk/v17/RrQRboJg-id7OnbxakXk.ttf" + }, + { + "family": "Padyakke Expanded One", + "variants": [ + "regular" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/padyakkeexpandedone/v8/K2FvfY9El_tbR0JfHb6WWvrBaU6XAUvC4IAYOKRkpDjeoQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/padyakkeexpandedone/v8/K2FvfY9El_tbR0JfHb6WWvrBaU6XAUvC4IAoOa5g.ttf" + }, + { + "family": "Palanquin", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/palanquin/v17/9XUhlJ90n1fBFg7ceXwUEltI7rWmZzTH.ttf", + "200": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwUvnpoxJuqbi3ezg.ttf", + "300": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwU2nloxJuqbi3ezg.ttf", + "regular": "https://fonts.gstatic.com/s/palanquin/v17/9XUnlJ90n1fBFg7ceXwsdlFMzLC2Zw.ttf", + "500": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwUgnhoxJuqbi3ezg.ttf", + "600": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwUrn9oxJuqbi3ezg.ttf", + "700": "https://fonts.gstatic.com/s/palanquin/v17/9XUilJ90n1fBFg7ceXwUyn5oxJuqbi3ezg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/palanquin/v17/9XUnlJ90n1fBFg7ceXwcd1tI.ttf" + }, + { + "family": "Palanquin Dark", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/palanquindark/v17/xn75YHgl1nqmANMB-26xC7yuF_6OTEo9VtfE.ttf", + "500": "https://fonts.gstatic.com/s/palanquindark/v17/xn76YHgl1nqmANMB-26xC7yuF8Z6ZW41fcvN2KT4.ttf", + "600": "https://fonts.gstatic.com/s/palanquindark/v17/xn76YHgl1nqmANMB-26xC7yuF8ZWYm41fcvN2KT4.ttf", + "700": "https://fonts.gstatic.com/s/palanquindark/v17/xn76YHgl1nqmANMB-26xC7yuF8YyY241fcvN2KT4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/palanquindark/v17/xn75YHgl1nqmANMB-26xC7yuF86PRk4.ttf" + }, + { + "family": "Palette Mosaic", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin" + ], + "version": "v13", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/palettemosaic/v13/AMOIz4aBvWuBFe3TohdW6YZ9MFiy4dxL4jSr.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/palettemosaic/v13/AMOIz4aBvWuBFe3TohdW6YZ9MGiz69g.ttf" + }, + { + "family": "Pangolin", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/pangolin/v12/cY9GfjGcW0FPpi-tWPfK5d3aiLBG.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pangolin/v12/cY9GfjGcW0FPpi-tWMfL79k.ttf" + }, + { + "family": "Paprika", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/paprika/v24/8QIJdijZitv49rDfuIgOq7jkAOw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/paprika/v24/8QIJdijZitv49rDfiIkErw.ttf" + }, + { + "family": "Parastoo", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-10-29", + "files": { + "regular": "https://fonts.gstatic.com/s/parastoo/v3/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlT6k1FPNkx5rq1w.ttf", + "500": "https://fonts.gstatic.com/s/parastoo/v3/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlfak1FPNkx5rq1w.ttf", + "600": "https://fonts.gstatic.com/s/parastoo/v3/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlka41FPNkx5rq1w.ttf", + "700": "https://fonts.gstatic.com/s/parastoo/v3/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlqK41FPNkx5rq1w.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/parastoo/v3/-F6vfj90ITQ4d9euQVDbrtWYW5MNx1dlT6kFFflg.ttf" + }, + { + "family": "Parisienne", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/parisienne/v14/E21i_d3kivvAkxhLEVZpcy96DuKuavM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/parisienne/v14/E21i_d3kivvAkxhLEVZpQy5wCg.ttf" + }, + { + "family": "Parkinsans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gSI6R8K-8Z_dt-E.ttf", + "regular": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gTW6R8K-8Z_dt-E.ttf", + "500": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gTk6R8K-8Z_dt-E.ttf", + "600": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gQI7h8K-8Z_dt-E.ttf", + "700": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gQx7h8K-8Z_dt-E.ttf", + "800": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gRW7h8K-8Z_dt-E.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/parkinsans/v3/-W_uXJXvQyPb1QfpBpRrVEgjj0W4zSUk4gTW6S8L8cI.ttf" + }, + { + "family": "Passero One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/passeroone/v28/JTUTjIko8DOq5FeaeEAjgE5B5Arr-s50.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/passeroone/v28/JTUTjIko8DOq5FeaeEAjgH5A7g4.ttf" + }, + { + "family": "Passion One", + "variants": [ + "regular", + "700", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/passionone/v20/PbynFmL8HhTPqbjUzux3JHuW_Frg6YoV.ttf", + "700": "https://fonts.gstatic.com/s/passionone/v20/Pby6FmL8HhTPqbjUzux3JEMq037owpYcuH8y.ttf", + "900": "https://fonts.gstatic.com/s/passionone/v20/Pby6FmL8HhTPqbjUzux3JEMS0X7owpYcuH8y.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/passionone/v20/PbynFmL8HhTPqbjUzux3JEuX9l4.ttf" + }, + { + "family": "Passions Conflict", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/passionsconflict/v9/kmKnZrcrFhfafnWX9x0GuEC-zowow5NeYRI4CN2V.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/passionsconflict/v9/kmKnZrcrFhfafnWX9x0GuEC-zowow6NfaxY.ttf" + }, + { + "family": "Pathway Extreme", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xak2Nx1Kyw3igP5eg.ttf", + "200": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakWN11Kyw3igP5eg.ttf", + "300": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakht11Kyw3igP5eg.ttf", + "regular": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xak2N11Kyw3igP5eg.ttf", + "500": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xak6t11Kyw3igP5eg.ttf", + "600": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakBtp1Kyw3igP5eg.ttf", + "700": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakP9p1Kyw3igP5eg.ttf", + "800": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakWNp1Kyw3igP5eg.ttf", + "900": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xakcdp1Kyw3igP5eg.ttf", + "100italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ6daSYzqAbpepnF.ttf", + "200italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ4daCYzqAbpepnF.ttf", + "300italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ7DaCYzqAbpepnF.ttf", + "italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ6daCYzqAbpepnF.ttf", + "500italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ6vaCYzqAbpepnF.ttf", + "600italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ5DbyYzqAbpepnF.ttf", + "700italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ56byYzqAbpepnF.ttf", + "800italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ4dbyYzqAbpepnF.ttf", + "900italic": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI4zCC3pJ0rsaH2_sD-QttXPfDlq0kVrdFsAHYoa7O3LCjRa7zISmmvKDxFz3m_CdF3-dIqTRGxEJ40byYzqAbpepnF.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pathwayextreme/v7/neI6zCC3pJ0rsaH2_sD-QttXPfDPonvkQ-pxx5gufvP2VmLjiFyxGf8BLymNjYv2Oy6vkLmw4xak2N1FKiYz.ttf" + }, + { + "family": "Pathway Gothic One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/pathwaygothicone/v16/MwQrbgD32-KAvjkYGNUUxAtW7pEBwx-dTFxeb80flQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pathwaygothicone/v16/MwQrbgD32-KAvjkYGNUUxAtW7pEBwx-tTVZa.ttf" + }, + { + "family": "Patrick Hand", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/patrickhand/v25/LDI1apSQOAYtSuYWp8ZhfYeMWcjKm7sp8g.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/patrickhand/v25/LDI1apSQOAYtSuYWp8ZhfYe8WMLO.ttf" + }, + { + "family": "Patrick Hand SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/patrickhandsc/v17/0nkwC9f7MfsBiWcLtY65AWDK873ViSi6JQc7Vg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/patrickhandsc/v17/0nkwC9f7MfsBiWcLtY65AWDK873liCK-.ttf" + }, + { + "family": "Pattaya", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/pattaya/v18/ea8ZadcqV_zkHY-XNdCn92ZEmVs.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pattaya/v18/ea8ZadcqV_zkHY-XBdGt8w.ttf" + }, + { + "family": "Patua One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/patuaone/v22/ZXuke1cDvLCKLDcimxBI5PNvNA9LuA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/patuaone/v22/ZXuke1cDvLCKLDcimxB45flr.ttf" + }, + { + "family": "Pavanam", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil" + ], + "version": "v13", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/pavanam/v13/BXRrvF_aiezLh0xPDOtQ9Wf0QcE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pavanam/v13/BXRrvF_aiezLh0xPPOpa8Q.ttf" + }, + { + "family": "Paytone One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/paytoneone/v25/0nksC9P7MfYHj2oFtYm2CiTqivr9iBq_.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/paytoneone/v25/0nksC9P7MfYHj2oFtYm2ChTrgP4.ttf" + }, + { + "family": "Peddana", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/peddana/v24/aFTU7PBhaX89UcKWhh2aBYyMcKw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/peddana/v24/aFTU7PBhaX89UcKWthyQAQ.ttf" + }, + { + "family": "Peralta", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/peralta/v21/hYkJPu0-RP_9d3kRGxAhrv956B8.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/peralta/v21/hYkJPu0-RP_9d3kRKxErqg.ttf" + }, + { + "family": "Permanent Marker", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/permanentmarker/v16/Fh4uPib9Iyv2ucM6pGQMWimMp004HaqIfrT5nlk.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/permanentmarker/v16/Fh4uPib9Iyv2ucM6pGQMWimMp004LauCeg.ttf" + }, + { + "family": "Petemoss", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/petemoss/v9/A2BZn5tA2xgtGWHZgxkesKb9UouQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/petemoss/v9/A2BZn5tA2xgtGWHZgykfuqI.ttf" + }, + { + "family": "Petit Formal Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/petitformalscript/v19/B50TF6xQr2TXJBnGOFME6u5OR83oRP5qoHnqP4gZSiE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/petitformalscript/v19/B50TF6xQr2TXJBnGOFME6u5OR83oRP5qkHjgOw.ttf" + }, + { + "family": "Petrona", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v36", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk6NsARBH452Mvds.ttf", + "200": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk4NsQRBH452Mvds.ttf", + "300": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk7TsQRBH452Mvds.ttf", + "regular": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk6NsQRBH452Mvds.ttf", + "500": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk6_sQRBH452Mvds.ttf", + "600": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk5TtgRBH452Mvds.ttf", + "700": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk5qtgRBH452Mvds.ttf", + "800": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk4NtgRBH452Mvds.ttf", + "900": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk4ktgRBH452Mvds.ttf", + "100italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8uwDFYpUN-dsIWs.ttf", + "200italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8mwCFYpUN-dsIWs.ttf", + "300italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8rICFYpUN-dsIWs.ttf", + "italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8uwCFYpUN-dsIWs.ttf", + "500italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8t4CFYpUN-dsIWs.ttf", + "600italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8jIFFYpUN-dsIWs.ttf", + "700italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8gsFFYpUN-dsIWs.ttf", + "800italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8mwFFYpUN-dsIWs.ttf", + "900italic": "https://fonts.gstatic.com/s/petrona/v36/mtGr4_NXL7bZo9XXgXdCu2vkCLkNEVtF8kUFFYpUN-dsIWs.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/petrona/v36/mtGl4_NXL7bZo9XXq35wRLONYyOjFk6NsTRAFYo.ttf" + }, + { + "family": "Phetsarath", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "lao" + ], + "version": "v3", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/phetsarath/v3/N0bQ2SpTP-plK0uWayAYAd79nd_QeZA.ttf", + "700": "https://fonts.gstatic.com/s/phetsarath/v3/N0bT2SpTP-plK0uWayAYOWLSudf7ZZlIHD0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/phetsarath/v3/N0bQ2SpTP-plK0uWayAYMd_3mQ.ttf" + }, + { + "family": "Philosopher", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/philosopher/v21/vEFV2_5QCwIS4_Dhez5jcVBpRUwU08qe.ttf", + "italic": "https://fonts.gstatic.com/s/philosopher/v21/vEFX2_5QCwIS4_Dhez5jcWBrT0g21tqeR7c.ttf", + "700": "https://fonts.gstatic.com/s/philosopher/v21/vEFI2_5QCwIS4_Dhez5jcWjVamgc-NaXXq7H.ttf", + "700italic": "https://fonts.gstatic.com/s/philosopher/v21/vEFK2_5QCwIS4_Dhez5jcWBrd_QZ8tK1W77HtMo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/philosopher/v21/vEFV2_5QCwIS4_Dhez5jcWBoT0g.ttf" + }, + { + "family": "Phudu", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkK62zUSwWuz38Tgg.ttf", + "regular": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKtWzUSwWuz38Tgg.ttf", + "500": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKh2zUSwWuz38Tgg.ttf", + "600": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKa2vUSwWuz38Tgg.ttf", + "700": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKUmvUSwWuz38Tgg.ttf", + "800": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKNWvUSwWuz38Tgg.ttf", + "900": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKHGvUSwWuz38Tgg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/phudu/v6/0FlJVPSHk0ya-7OUeO_U-Lwm7PkKtWzkSg-q.ttf" + }, + { + "family": "Piazzolla", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v40", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7LYx3Ly1AHfAAy5.ttf", + "200": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7JYxnLy1AHfAAy5.ttf", + "300": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7KGxnLy1AHfAAy5.ttf", + "regular": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7LYxnLy1AHfAAy5.ttf", + "500": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7LqxnLy1AHfAAy5.ttf", + "600": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7IGwXLy1AHfAAy5.ttf", + "700": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7I_wXLy1AHfAAy5.ttf", + "800": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7JYwXLy1AHfAAy5.ttf", + "900": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7JxwXLy1AHfAAy5.ttf", + "100italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhZqw3gX9BRy5m5M.ttf", + "200italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhRqx3gX9BRy5m5M.ttf", + "300italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhcSx3gX9BRy5m5M.ttf", + "italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhZqx3gX9BRy5m5M.ttf", + "500italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhaix3gX9BRy5m5M.ttf", + "600italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhUS23gX9BRy5m5M.ttf", + "700italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhX223gX9BRy5m5M.ttf", + "800italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhRq23gX9BRy5m5M.ttf", + "900italic": "https://fonts.gstatic.com/s/piazzolla/v40/N0b72SlTPu5rIkWIZjVgI-TckS03oGpPETyEJ88Rbvi0_TzOzKcQhTO23gX9BRy5m5M.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/piazzolla/v40/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7LYxkLz3gU.ttf" + }, + { + "family": "Piedra", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/piedra/v27/ke8kOg8aN0Bn7hTunEyHN_M3gA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/piedra/v27/ke8kOg8aN0Bn7hTenUaD.ttf" + }, + { + "family": "Pinyon Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/pinyonscript/v24/6xKpdSJbL9-e9LuoeQiDRQR8aOLQO4bhiDY.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pinyonscript/v24/6xKpdSJbL9-e9LuoeQiDRQR8WOPaPw.ttf" + }, + { + "family": "Pirata One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/pirataone/v23/I_urMpiDvgLdLh0fAtoftiiEr5_BdZ8.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pirataone/v23/I_urMpiDvgLdLh0fAtofhimOqw.ttf" + }, + { + "family": "Pixelify Sans", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TTp0H1Yb5JagkmX.ttf", + "500": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TTb0H1Yb5JagkmX.ttf", + "600": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TQ3131Yb5JagkmX.ttf", + "700": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TQO131Yb5JagkmX.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pixelifysans/v3/CHy2V-3HFUT7aC4iv1TxGDR9DHEserHN25py2TTp0E1ZZZY.ttf" + }, + { + "family": "Plaster", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/plaster/v25/DdTm79QatW80eRh4Ei5JOtLOeLI.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/plaster/v25/DdTm79QatW80eRh4Ii9DPg.ttf" + }, + { + "family": "Platypi", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02It4p9juxgnYP1P.ttf", + "regular": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02Jz4p9juxgnYP1P.ttf", + "500": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02JB4p9juxgnYP1P.ttf", + "600": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02Kt5Z9juxgnYP1P.ttf", + "700": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02KU5Z9juxgnYP1P.ttf", + "800": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02Lz5Z9juxgnYP1P.ttf", + "300italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oSkgsRwFZe1PPTo.ttf", + "italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oXcgsRwFZe1PPTo.ttf", + "500italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oUUgsRwFZe1PPTo.ttf", + "600italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oaknsRwFZe1PPTo.ttf", + "700italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7oZAnsRwFZe1PPTo.ttf", + "800italic": "https://fonts.gstatic.com/s/platypi/v6/bMrmmSGU7pMlaX6-FgCcP8xmi-aw1He7ofcnsRwFZe1PPTo.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/platypi/v6/bMromSGU7pMlaX6-PAmuwBQP4Hwe02Jz4q9isRw.ttf" + }, + { + "family": "Play", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/play/v21/6aez4K2oVqwIjtI8Hp8Tx3A.ttf", + "700": "https://fonts.gstatic.com/s/play/v21/6ae84K2oVqwItm4TOpc423nTJTM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/play/v21/6aez4K2oVqwIvtM2Gg.ttf" + }, + { + "family": "Playball", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/playball/v22/TK3gWksYAxQ7jbsKcj8Dl-tPKo2t.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playball/v22/TK3gWksYAxQ7jbsKcg8Cne8.ttf" + }, + { + "family": "Playfair", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v10", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPlKetgdoSMw5ifm.ttf", + "regular": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPkUetgdoSMw5ifm.ttf", + "500": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPkmetgdoSMw5ifm.ttf", + "600": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPnKfdgdoSMw5ifm.ttf", + "700": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPnzfdgdoSMw5ifm.ttf", + "800": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPmUfdgdoSMw5ifm.ttf", + "900": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPm9fdgdoSMw5ifm.ttf", + "300italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOW5eqycS4zfmNrE.ttf", + "italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOTBeqycS4zfmNrE.ttf", + "500italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOQJeqycS4zfmNrE.ttf", + "600italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOe5ZqycS4zfmNrE.ttf", + "700italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOddZqycS4zfmNrE.ttf", + "800italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcObBZqycS4zfmNrE.ttf", + "900italic": "https://fonts.gstatic.com/s/playfair/v10/0nkSC9D7PO4KhmUJ59baVQ_iWhg0cgSrLQZDFpFUsLCFf_1ubkfQeG9KkBAQcOsAs-zcOZlZqycS4zfmNrE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playfair/v10/0nkQC9D7PO4KhmUJ5_zTZ_4MYQXznAK-TUcZXKO3UMnW6VNpe4-SiiZ4b8h5G3GutPkUeugcqyc.ttf" + }, + { + "family": "Playfair Display", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v40", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKdFvUDQZNLo_U2r.ttf", + "500": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKd3vUDQZNLo_U2r.ttf", + "600": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKebukDQZNLo_U2r.ttf", + "700": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKeiukDQZNLo_U2r.ttf", + "800": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKfFukDQZNLo_U2r.ttf", + "900": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKfsukDQZNLo_U2r.ttf", + "italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_qiTbtbK-F2rA0s.ttf", + "500italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_pqTbtbK-F2rA0s.ttf", + "600italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_naUbtbK-F2rA0s.ttf", + "700italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_k-UbtbK-F2rA0s.ttf", + "800italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_iiUbtbK-F2rA0s.ttf", + "900italic": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFRD-vYSZviVYUb_rj3ij__anPXDTnCjmHKM4nYO7KN_gGUbtbK-F2rA0s.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKdFvXDRbtY.ttf" + }, + { + "family": "Playfair Display SC", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke85OhoaMkR6-hSn7kbHVoFf7ZfgMPr_pb4GEcM2M4s.ttf", + "italic": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke87OhoaMkR6-hSn7kbHVoFf7ZfgMPr_lbwMFeEzI4sNKg.ttf", + "700": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke80OhoaMkR6-hSn7kbHVoFf7ZfgMPr_nQIpNcsdL4IUMyE.ttf", + "700italic": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke82OhoaMkR6-hSn7kbHVoFf7ZfgMPr_lbw0qc4XK6ARIyH5IA.ttf", + "900": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke80OhoaMkR6-hSn7kbHVoFf7ZfgMPr_nTorNcsdL4IUMyE.ttf", + "900italic": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke82OhoaMkR6-hSn7kbHVoFf7ZfgMPr_lbw0kcwXK6ARIyH5IA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playfairdisplaysc/v18/ke85OhoaMkR6-hSn7kbHVoFf7ZfgMPr_lb8MFQ.ttf" + }, + { + "family": "Playpen Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "emoji", + "greek", + "latin", + "latin-ext", + "math", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IvRgunQ9Ffmme0w.ttf", + "200": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4InRhunQ9Ffmme0w.ttf", + "300": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IqphunQ9Ffmme0w.ttf", + "regular": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IvRhunQ9Ffmme0w.ttf", + "500": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IsZhunQ9Ffmme0w.ttf", + "600": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IipmunQ9Ffmme0w.ttf", + "700": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IhNmunQ9Ffmme0w.ttf", + "800": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4InRmunQ9Ffmme0w.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playpensans/v22/dg43_pj1p6gXP0gzAZgm4c8XQArSU7ACQSn4IvRhinU3EQ.ttf" + }, + { + "family": "Playpen Sans Arabic", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "arabic", + "emoji", + "latin", + "latin-ext", + "math" + ], + "version": "v8", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-ZBobPcBO1L0EHE.ttf", + "200": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-bBoLPcBO1L0EHE.ttf", + "300": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-YfoLPcBO1L0EHE.ttf", + "regular": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-ZBoLPcBO1L0EHE.ttf", + "500": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-ZzoLPcBO1L0EHE.ttf", + "600": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-afp7PcBO1L0EHE.ttf", + "700": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-amp7PcBO1L0EHE.ttf", + "800": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-bBp7PcBO1L0EHE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playpensansarabic/v8/KtkGAKiSeo38bkPvhIqjU6aCgha2der-Z4VIEhR8sOKet-ZBoIPdDuk.ttf" + }, + { + "family": "Playpen Sans Deva", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "devanagari", + "emoji", + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQ0xgUG_5NygdkiQ.ttf", + "200": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQUxkUG_5NygdkiQ.ttf", + "300": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQjRkUG_5NygdkiQ.ttf", + "regular": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQ0xkUG_5NygdkiQ.ttf", + "500": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQ4RkUG_5NygdkiQ.ttf", + "600": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQDR4UG_5NygdkiQ.ttf", + "700": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQNB4UG_5NygdkiQ.ttf", + "800": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQUx4UG_5NygdkiQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playpensansdeva/v4/vm8fdQj0UUbMxObnsO17RZ7pPBuJge10OmPLCiz-HCrQ0xkkGvRJ.ttf" + }, + { + "family": "Playpen Sans Hebrew", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "emoji", + "hebrew", + "latin", + "latin-ext", + "math" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnnp5pC63VFfsRss.ttf", + "200": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnlp55C63VFfsRss.ttf", + "300": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnm355C63VFfsRss.ttf", + "regular": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnnp55C63VFfsRss.ttf", + "500": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnnb55C63VFfsRss.ttf", + "600": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnk34JC63VFfsRss.ttf", + "700": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnkO4JC63VFfsRss.ttf", + "800": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnlp4JC63VFfsRss.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playpensanshebrew/v8/lJws-okuj29wT-AN6RvLx8QqjkKhL7eAjoL9jK7L4vstDnnp56C711U.ttf" + }, + { + "family": "Playpen Sans Thai", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "emoji", + "latin", + "latin-ext", + "math", + "thai" + ], + "version": "v8", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLghGPoxxAISLTzA.ttf", + "200": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLAhCPoxxAISLTzA.ttf", + "300": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxL3BCPoxxAISLTzA.ttf", + "regular": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLghCPoxxAISLTzA.ttf", + "500": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLsBCPoxxAISLTzA.ttf", + "600": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLXBePoxxAISLTzA.ttf", + "700": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLZRePoxxAISLTzA.ttf", + "800": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLAhePoxxAISLTzA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playpensansthai/v8/VdG3AYIdG5kSgHwmKT9wYu2rs0cBsu-N7E_aclWp2hxLghC_ohZE.ttf" + }, + { + "family": "Playwrite AR", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-fteqf-ES67xIO8.ttf", + "200": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-Xtfqf-ES67xIO8.ttf", + "300": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-aVfqf-ES67xIO8.ttf", + "regular": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-ftfqf-ES67xIO8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritear/v6/VEMjRohisJz5pTCzruCNjWbfp_N-aNWqYgKS-ftfmf6OTw.ttf" + }, + { + "family": "Playwrite AR Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritearguides/v5/iJWYBWqKZTrYS9uv-Ry6kDf-q_0Xq67mcGUaW4_MiYQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritearguides/v5/iJWYBWqKZTrYS9uv-Ry6kDf-q_0Xq67mQGQQXw.ttf" + }, + { + "family": "Playwrite AT", + "variants": [ + "100", + "200", + "300", + "regular", + "100italic", + "200italic", + "300italic", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2M77d03MLIHJ-rk.ttf", + "200": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2E76d03MLIHJ-rk.ttf", + "300": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2JD6d03MLIHJ-rk.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2M76d03MLIHJ-rk.ttf", + "100italic": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6uwc7n6kfJN4fVoKON7HIuDCZgtyxdIs5hzQa5nw_GKKPM6rkyVg.ttf", + "200italic": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6uwc7n6kfJN4fVoKON7HIuDCZgtyxdIs5hzQa5Hw7GKKPM6rkyVg.ttf", + "300italic": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6uwc7n6kfJN4fVoKON7HIuDCZgtyxdIs5hzQa5wQ7GKKPM6rkyVg.ttf", + "italic": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6uwc7n6kfJN4fVoKON7HIuDCZgtyxdIs5hzQa5nw7GKKPM6rkyVg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteat/v6/Gw6owc7n6kfJN4fVoKON7HIEBRSfb0U2uGBm2M76R0zGKA.ttf" + }, + { + "family": "Playwrite AT Guides", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteatguides/v1/QdVKSS0gJR2xneUeQPfE-FVA1BlZQRpBRbgJdhapcUU.ttf", + "italic": "https://fonts.gstatic.com/s/playwriteatguides/v1/QdVISS0gJR2xneUeQPfE-FVA1BlZQRpBdboDcjSsYUVUjg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteatguides/v1/QdVKSS0gJR2xneUeQPfE-FVA1BlZQRpBdbkDcg.ttf" + }, + { + "family": "Playwrite AU NSW", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xZjML96TD2dC1gS.ttf", + "200": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xbjMb96TD2dC1gS.ttf", + "300": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xY9Mb96TD2dC1gS.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xZjMb96TD2dC1gS.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteaunsw/v11/6qLWKY4NtxD-qVlIPUIPenElWCCEWRgilpupBXi19xZjMY97Rjk.ttf" + }, + { + "family": "Playwrite AU NSW Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteaunswguides/v1/LDIiao-QNRMmVPcU8-sgUraMF7GZs_1Emk3v8tPbZeQ3YBXs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteaunswguides/v1/LDIiao-QNRMmVPcU8-sgUraMF7GZs_1Emk3v8uPab-A.ttf" + }, + { + "family": "Playwrite AU QLD", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA6-yMY2fqm1BV-XS.ttf", + "200": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA68yMI2fqm1BV-XS.ttf", + "300": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA6_sMI2fqm1BV-XS.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA6-yMI2fqm1BV-XS.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteauqld/v11/SlGGmR-Yo5oYZX5BFVcEwSFSOXBRWADAWbgjmLBhA6-yML2eoGk.ttf" + }, + { + "family": "Playwrite AU QLD Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteauqldguides/v1/TuGBUUJtX5tTUfQi_7kbiZZFVhl0FIKnvy00LDxlIzIU5RwD.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteauqldguides/v1/TuGBUUJtX5tTUfQi_7kbiZZFVhl0FIKnvy00LAxkKTY.ttf" + }, + { + "family": "Playwrite AU SA", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpZgQcuVjCoV0bbE.ttf", + "200": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpRgRcuVjCoV0bbE.ttf", + "300": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpcYRcuVjCoV0bbE.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpZgRcuVjCoV0bbE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteausa/v11/YcmhsZpNS1SdgmHbGgtRuUElnR3CmSC5bVQVlrclpZgRQuRpDg.ttf" + }, + { + "family": "Playwrite AU SA Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteausaguides/v1/3JnsSCLj03y8jUv7aFWBCCglBaFjl54aVBAovcgEP-Z3054.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteausaguides/v1/3JnsSCLj03y8jUv7aFWBCCglBaFjl54aVBAojckOOw.ttf" + }, + { + "family": "Playwrite AU TAS", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLUEHqK6Hl9WrXm4.ttf", + "200": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLWEH6K6Hl9WrXm4.ttf", + "300": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLVaH6K6Hl9WrXm4.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLUEH6K6Hl9WrXm4.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteautas/v11/GftT7u9QuxsdI_QuuctXue3ElxxmcBb3ih0opvWiLLUEH5K7FFs.ttf" + }, + { + "family": "Playwrite AU TAS Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteautasguides/v1/cY9Vfi6cVk5RvjGtQrLqjozy3ekUDtDMDX-NNjbKL4UbaDZD.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteautasguides/v1/cY9Vfi6cVk5RvjGtQrLqjozy3ekUDtDMDX-NNgbLJYE.ttf" + }, + { + "family": "Playwrite AU VIC", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4fTaLK0CBIDKNvl.ttf", + "200": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4dTabK0CBIDKNvl.ttf", + "300": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4eNabK0CBIDKNvl.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4fTabK0CBIDKNvl.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteauvic/v11/bWtu7enUfwn0Hf1zjprKOJdcDy8rxwC1ltAeNDAAd4fTaYK1AhY.ttf" + }, + { + "family": "Playwrite AU VIC Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteauvicguides/v1/ll8sK3mEVy6nEMXMskXIZv8owEdZpVIWaQEnuD6F2TpBa98q.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteauvicguides/v1/ll8sK3mEVy6nEMXMskXIZv8owEdZpVIWaQEnuA6E0z4.ttf" + }, + { + "family": "Playwrite BE VLG", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blL8vfCMMiyBIkNg.ttf", + "200": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blJ8vPCMMiyBIkNg.ttf", + "300": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blKivPCMMiyBIkNg.ttf", + "regular": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blL8vPCMMiyBIkNg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritebevlg/v6/GFD8WBdug3mQSvrAT9AL6fd4ZkB-a2sDmg3dy2W0blL8vMCNOCg.ttf" + }, + { + "family": "Playwrite BE VLG Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritebevlgguides/v2/EYqjmb1Mz6hO4edaU9qKGFZMDd_Q-zwwK__U1u9GK3nNgEoc.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritebevlgguides/v2/EYqjmb1Mz6hO4edaU9qKGFZMDd_Q-zwwK__U1t9HIX0.ttf" + }, + { + "family": "Playwrite BE WAL", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsWCGfugHxwiSZp8.ttf", + "200": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsUCGPugHxwiSZp8.ttf", + "300": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsXcGPugHxwiSZp8.ttf", + "regular": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsWCGPugHxwiSZp8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritebewal/v7/DtV1Jwq5QbIzyrA6DHdJ2BksuUmanQtEYjAlv96WFsWCGMuhFRg.ttf" + }, + { + "family": "Playwrite BE WAL Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritebewalguides/v1/l7gPbiR5yM62ycwevWCt02rrTFoEJvY4kyrrUzHlVJabaOSA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritebewalguides/v1/l7gPbiR5yM62ycwevWCt02rrTFoEJvY4kyrrUwHkXpI.ttf" + }, + { + "family": "Playwrite BR", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmFOOFsfjAOVZBgs.ttf", + "200": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmNOPFsfjAOVZBgs.ttf", + "300": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmA2PFsfjAOVZBgs.ttf", + "regular": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmFOPFsfjAOVZBgs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritebr/v11/kJEhBuMK4Q07lDHc2Xp9vYgIp-6D3QEGCpthmFOPJsbpBA.ttf" + }, + { + "family": "Playwrite BR Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritebrguides/v1/tssxAohQaiQS-wrnJz-F5CqW4dOezRwp-9cCOxBu_BM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritebrguides/v1/tssxAohQaiQS-wrnJz-F5CqW4dOezRwpy9YIPw.ttf" + }, + { + "family": "Playwrite CA", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHiquYp261AIQU98.ttf", + "200": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHqqvYp261AIQU98.ttf", + "300": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHnSvYp261AIQU98.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHiqvYp261AIQU98.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteca/v11/z7NGdR_4cT0NOrEAIElil93uR_VhfhYaYOijHiqvUpyw0A.ttf" + }, + { + "family": "Playwrite CA Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritecaguides/v1/MjQamj1kuP_soQ3o-rysO9Ci_8oJlIUUInch3bTfcxs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritecaguides/v1/MjQamj1kuP_soQ3o-rysO9Ci_8oJlIUUEnYr2Q.ttf" + }, + { + "family": "Playwrite CL", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU8JbvLq3DyPNbus.ttf", + "200": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU0JavLq3DyPNbus.ttf", + "300": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU5xavLq3DyPNbus.ttf", + "regular": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU8JavLq3DyPNbus.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritecl/v6/-zk391m7wssz_XLkGgu8hy3tqrcOhnbf6ForU8JajLu9Cw.ttf" + }, + { + "family": "Playwrite CL Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteclguides/v2/Z9XKDnxTQxyGzOn3eMH-i6Ws0czqkE-hrNpVuw5_BAM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteclguides/v2/Z9XKDnxTQxyGzOn3eMH-i6Ws0czqkE-hnNtfvw.ttf" + }, + { + "family": "Playwrite CO", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v13", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqx7ZJo-dOEhxX3Iw.ttf", + "200": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqxzZIo-dOEhxX3Iw.ttf", + "300": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqx-hIo-dOEhxX3Iw.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqx7ZIo-dOEhxX3Iw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteco/v13/0FlGVP2Hl1iH-fv2BH4kJkgb8vH-rbJPTDqqx7ZIk-ZEFg.ttf" + }, + { + "family": "Playwrite CO Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritecoguides/v5/AYCXpWvtftIVXepC5AzjAx1KgYPugOK0TqxTJw_GOM0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritecoguides/v5/AYCXpWvtftIVXepC5AzjAx1KgYPugOK0fq1ZIw.ttf" + }, + { + "family": "Playwrite CU", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseRmwZeT7m2YIByI.ttf", + "200": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseZmxZeT7m2YIByI.ttf", + "300": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseUexZeT7m2YIByI.ttf", + "regular": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseRmxZeT7m2YIByI.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritecu/v6/VuJjdNDb2p7tvoFGLMPdf9xcahOpb9ZuoyXseRmxVeXxnw.ttf" + }, + { + "family": "Playwrite CU Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritecuguides/v1/c4m81mZtG8v6p3iAoFBJ2dJdu9fWPSaOFooIDQtJbok.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritecuguides/v1/c4m81mZtG8v6p3iAoFBJ2dJdu9fWPSaOJosCCQ.ttf" + }, + { + "family": "Playwrite CZ", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCI4aTqT_VkAS5X4.ttf", + "200": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCA4bTqT_VkAS5X4.ttf", + "300": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCNAbTqT_VkAS5X4.ttf", + "regular": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCI4bTqT_VkAS5X4.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritecz/v6/8vIa7wYp22pt_BUChSHeVxxlOPUEKoMfap_FCI4bfqX1Ug.ttf" + }, + { + "family": "Playwrite CZ Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteczguides/v1/6qLcKY0NtxD-qVlIPUIPeH4lUQa6B3ZZQkseuneh7xc.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteczguides/v1/6qLcKY0NtxD-qVlIPUIPeH4lUQa6B3ZZckoUvg.ttf" + }, + { + "family": "Playwrite DE Grund", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZz2qGZwCUOfSwZTM.ttf", + "200": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZz-qHZwCUOfSwZTM.ttf", + "300": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZzzSHZwCUOfSwZTM.ttf", + "regular": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZz2qHZwCUOfSwZTM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedegrund/v11/EJR-QhwoXdccriFurnRxqv-1MFyKy696-4VufrEGGbTZz2qHVwGePQ.ttf" + }, + { + "family": "Playwrite DE Grund Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritedegrundguides/v1/OD5RuNCQ02KrAHnha1L36CWcQ83dtK5BLxqexnduX98TJlnjHAA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedegrundguides/v1/OD5RuNCQ02KrAHnha1L36CWcQ83dtK5BLxqexndub94ZIg.ttf" + }, + { + "family": "Playwrite DE LA", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2FnrPgcigC5Ph2w.ttf", + "200": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2NnqPgcigC5Ph2w.ttf", + "300": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2AfqPgcigC5Ph2w.ttf", + "regular": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2FnqPgcigC5Ph2w.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedela/v11/oY1J8e3fprboJ2HN4ogXTpFVJ8QjJV9p0P4yukst2FnqDgYohA.ttf" + }, + { + "family": "Playwrite DE LA Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritedelaguides/v2/1q2XY42fB0V64O4aSe1OjKs_yAXBOfDI5wE56g2M62M1AXs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedelaguides/v2/1q2XY42fB0V64O4aSe1OjKs_yAXBOfDI5wE52gyG7w.ttf" + }, + { + "family": "Playwrite DE SAS", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTeVg-6lSyVPgRkJ.ttf", + "200": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTcVgu6lSyVPgRkJ.ttf", + "300": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTfLgu6lSyVPgRkJ.ttf", + "regular": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTeVgu6lSyVPgRkJ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedesas/v11/1Pt4g9vaRvmWghDdrE8IDuRPVrHN_1AaFXASpbMqJTeVgt6kQSE.ttf" + }, + { + "family": "Playwrite DE SAS Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritedesasguides/v1/8At5GtCjPp-GWR2h9cC6ePzz2l6LJ3VZaPNi15BEdtBgPI1G.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedesasguides/v1/8At5GtCjPp-GWR2h9cC6ePzz2l6LJ3VZaPNi16BFfNQ.ttf" + }, + { + "family": "Playwrite DE VA", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRSyTv24jGyvutu4.ttf", + "200": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRaySv24jGyvutu4.ttf", + "300": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRXKSv24jGyvutu4.ttf", + "regular": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRSySv24jGyvutu4.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedeva/v11/VuJmdNPb2p7tvoFGLMPdeMxGN1pntEMhdK1XfsTyRSySj28pHw.ttf" + }, + { + "family": "Playwrite DE VA Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritedevaguides/v1/WwkPxOmkDVqm-ojMLT_kdMUoBpMYm6KTeb28UB9SNQIUdqQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedevaguides/v1/WwkPxOmkDVqm-ojMLT_kdMUoBpMYm6KTeb28YB5YMQ.ttf" + }, + { + "family": "Playwrite DK Loopet", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75JJwOgRuQovSE8_.ttf", + "200": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75LJwegRuQovSE8_.ttf", + "300": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75IXwegRuQovSE8_.ttf", + "regular": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75JJwegRuQovSE8_.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedkloopet/v6/memVYbuzy2qb3rtJGfM1FvY-GacDcsPvtaDfqfgbBWmV75JJwdgQsw4.ttf" + }, + { + "family": "Playwrite DK Loopet Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritedkloopetguides/v1/4iC46LlmYsRPlQ1zDEvT8weoW-sI8-h9xxN83W-Cb5tmElj-b0nB.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedkloopetguides/v1/4iC46LlmYsRPlQ1zDEvT8weoW-sI8-h9xxN83W-Cb6tnGFw.ttf" + }, + { + "family": "Playwrite DK Uloopet", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K06lQrKeng6LUzAA.ttf", + "200": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K0alUrKeng6LUzAA.ttf", + "300": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K0tFUrKeng6LUzAA.ttf", + "regular": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K06lUrKeng6LUzAA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedkuloopet/v6/bWtS7e3Ufwn0Hf1zjprKPYlcDAoHknvYFjqIh8PF6jwcP5K06lUbKOPk.ttf" + }, + { + "family": "Playwrite DK Uloopet Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritedkuloopetguides/v1/WwkKxOSkDVqm-ojMLT_kdMsoBb5Xs6efafiIBXYcVHk1bo9bkIONtA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritedkuloopetguides/v1/WwkKxOSkDVqm-ojMLT_kdMsoBb5Xs6efafiIBXYcVHkFb4Vf.ttf" + }, + { + "family": "Playwrite ES", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmFOOFsfjAOVZBgs.ttf", + "200": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmNOPFsfjAOVZBgs.ttf", + "300": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmA2PFsfjAOVZBgs.ttf", + "regular": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmFOPFsfjAOVZBgs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritees/v11/kJEhBuMK4Q07lDHc2Xp9uokIp-6D3QEGCpthmFOPJsbpBA.ttf" + }, + { + "family": "Playwrite ES Deco", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4yrZxOQ9p5Cljpw.ttf", + "200": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4SrdxOQ9p5Cljpw.ttf", + "300": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4lLdxOQ9p5Cljpw.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4yrdxOQ9p5Cljpw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteesdeco/v11/7AuWp-g3kjKKGkePXEf2jxctfDxlvGM7-RllW8uEsjJ4yrdBOAVt.ttf" + }, + { + "family": "Playwrite ES Deco Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteesdecoguides/v1/flUrRriwwII5RVl2TZ1XBNTUOYY6ZzZzwPCEKtwqYEyDBQWJ7Q.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteesdecoguides/v1/flUrRriwwII5RVl2TZ1XBNTUOYY6ZzZzwPCEKtwaYUaH.ttf" + }, + { + "family": "Playwrite ES Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteesguides/v1/VuJtdM_b2p7tvoFGLMPdedpGJm402y6mhDDGfdnzXeU.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteesguides/v1/VuJtdM_b2p7tvoFGLMPdedpGJm402y6mtDHMeQ.ttf" + }, + { + "family": "Playwrite FR Moderne", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJuAOvAl74XSpRjw.ttf", + "200": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJOAKvAl74XSpRjw.ttf", + "300": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJ5gKvAl74XSpRjw.ttf", + "regular": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJuAKvAl74XSpRjw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritefrmoderne/v11/3y9L6awucz3w5m4FFTzKolJRXhUk_u1yWtWmFCJcqUBvK5aJuAKfA1T8.ttf" + }, + { + "family": "Playwrite FR Moderne Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritefrmoderneguides/v2/CSRr4yxOn-mMWCgLPl16KrUKBbwa2ZZLdkrvXllIP22HnIzLvrG2fw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritefrmoderneguides/v2/CSRr4yxOn-mMWCgLPl16KrUKBbwa2ZZLdkrvXllIP223nYbP.ttf" + }, + { + "family": "Playwrite FR Trad", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v13", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvAogrNdt-fwzTS5A.ttf", + "200": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvAIgvNdt-fwzTS5A.ttf", + "300": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvA_AvNdt-fwzTS5A.ttf", + "regular": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvAogvNdt-fwzTS5A.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritefrtrad/v13/sJot3KxJjdGLJV3vyatrJE2pkQisWWMBP23HSIVI5tvAogv9d9Wb.ttf" + }, + { + "family": "Playwrite FR Trad Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritefrtradguides/v1/l7gMbit5yM62ycwevWCt133rT2kpYpEKjyfqRWLFfriXYf2ZXw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritefrtradguides/v1/l7gMbit5yM62ycwevWCt133rT2kpYpEKjyfqRWL1f7KT.ttf" + }, + { + "family": "Playwrite GB J", + "variants": [ + "100", + "200", + "300", + "regular", + "100italic", + "200italic", + "300italic", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheGdc5HaN7X9HFR8Q.ttf", + "200": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheG9c9HaN7X9HFR8Q.ttf", + "300": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheGK89HaN7X9HFR8Q.ttf", + "regular": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheGdc9HaN7X9HFR8Q.ttf", + "100italic": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kGo8wSPe9dzQ1UGbvobAPhY7KPywT2BnwHoBCTvYyvKtTT1nRB8S9t.ttf", + "200italic": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kGo8wSPe9dzQ1UGbvobAPhY7KPywT2BnwHoBCTvYwvK9TT1nRB8S9t.ttf", + "300italic": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kGo8wSPe9dzQ1UGbvobAPhY7KPywT2BnwHoBCTvYzxK9TT1nRB8S9t.ttf", + "italic": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kGo8wSPe9dzQ1UGbvobAPhY7KPywT2BnwHoBCTvYyvK9TT1nRB8S9t.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritegbj/v11/k3kEo8wSPe9dzQ1UGbvobAPhY5iG-fsubxedDheGdc93adTT.ttf" + }, + { + "family": "Playwrite GB J Guides", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritegbjguides/v2/CSRh4yJOn-mMWCgLPl16K6UKAvM5yY1BdhmIKxooUh-_nQ.ttf", + "italic": "https://fonts.gstatic.com/s/playwritegbjguides/v2/CSRv4yJOn-mMWCgLPl16K6UKAvM5yY1Bdhm4KRAscBqvnb7O.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritegbjguides/v2/CSRh4yJOn-mMWCgLPl16K6UKAvM5yY1Bdhm4KhAs.ttf" + }, + { + "family": "Playwrite GB S", + "variants": [ + "100", + "200", + "300", + "regular", + "100italic", + "200italic", + "300italic", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v12", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU6uhH8x5eMaTk8AQ.ttf", + "200": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU6OhD8x5eMaTk8AQ.ttf", + "300": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU65BD8x5eMaTk8AQ.ttf", + "regular": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU6uhD8x5eMaTk8AQ.ttf", + "100italic": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWZ_kFkk-s1Xclhmlemy7jsNS51fHeeOptJs2IvclMUhZ2ISzwsAReZ.ttf", + "200italic": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWZ_kFkk-s1Xclhmlemy7jsNS51fHeeOptJs2IvclOUhJ2ISzwsAReZ.ttf", + "300italic": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWZ_kFkk-s1Xclhmlemy7jsNS51fHeeOptJs2IvclNKhJ2ISzwsAReZ.ttf", + "italic": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWZ_kFkk-s1Xclhmlemy7jsNS51fHeeOptJs2IvclMUhJ2ISzwsAReZ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritegbs/v12/oPWb_kFkk-s1Xclhmlemy7jsNQR8TohGU_DTHWU6uhDMxp2I.ttf" + }, + { + "family": "Playwrite GB S Guides", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritegbsguides/v1/0FlKVOSHl1iH-fv2BH4kIkUBqtlNCEaQLlyKx1QPi-Z8Fw.ttf", + "italic": "https://fonts.gstatic.com/s/playwritegbsguides/v1/0FlEVOSHl1iH-fv2BH4kIkUBqtlNCEaQLly6xV4LqeNsFwxX.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritegbsguides/v1/0FlKVOSHl1iH-fv2BH4kIkUBqtlNCEaQLly6xl4L.ttf" + }, + { + "family": "Playwrite HR", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPsoA9YHXAHC7tvg.ttf", + "200": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPkoB9YHXAHC7tvg.ttf", + "300": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPpQB9YHXAHC7tvg.ttf", + "regular": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPsoB9YHXAHC7tvg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritehr/v6/WWXAljmQYQCZM5qaU_dwQYcybAQ7GFn1mFNJPsoBxYDdBA.ttf" + }, + { + "family": "Playwrite HR Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritehrguides/v1/6NUK8EedKwOcfRjj8ukv_L4kjqAoGrjdWmA08mCgdfM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritehrguides/v1/6NUK8EedKwOcfRjj8ukv_L4kjqAoGrjdamE-9g.ttf" + }, + { + "family": "Playwrite HR Lijeva", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d4zB8aUy4_lxmKl.ttf", + "200": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d6zBsaUy4_lxmKl.ttf", + "300": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d5tBsaUy4_lxmKl.ttf", + "regular": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d4zBsaUy4_lxmKl.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritehrlijeva/v6/gNMvW2dhS5-p7HvxrBYiWN2SsKqLWCrYiDBAvbRl82ZY0d4zBvaVwYs.ttf" + }, + { + "family": "Playwrite HR Lijeva Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritehrlijevaguides/v1/uU9aCAgH7I63K35cu3bRkqamzjr8EW133LJaXDO-QObhgDgMKYJO.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritehrlijevaguides/v1/uU9aCAgH7I63K35cu3bRkqamzjr8EW133LJaXDO-QNbgijw.ttf" + }, + { + "family": "Playwrite HU", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1PL7TO2dH3B2Xx4.ttf", + "200": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1HL6TO2dH3B2Xx4.ttf", + "300": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1Kz6TO2dH3B2Xx4.ttf", + "regular": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1PL6TO2dH3B2Xx4.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritehu/v6/A2BIn59A0g0xA3zDhFw-0vfPWJtlaFKmrETx1PL6fOyXGw.ttf" + }, + { + "family": "Playwrite HU Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritehuguides/v1/AYCXpWvtftIVXepC5AzjCAdKgYPugOK0TqxTJw_GOM0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritehuguides/v1/AYCXpWvtftIVXepC5AzjCAdKgYPugOK0fq1ZIw.ttf" + }, + { + "family": "Playwrite ID", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUl0-QB_JbFi0pLlg.ttf", + "200": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUl8-RB_JbFi0pLlg.ttf", + "300": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUlxGRB_JbFi0pLlg.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUl0-RB_JbFi0pLlg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteid/v11/Cn-kJt2YWhlY2oC4KxifKQJmrtrRm-sKkQqUl0-RN_NREg.ttf" + }, + { + "family": "Playwrite ID Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteidguides/v1/MjQamj1kuP_soQ3o-rysMdWi_8oJlIUUInch3bTfcxs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteidguides/v1/MjQamj1kuP_soQ3o-rysMdWi_8oJlIUUEnYr2Q.ttf" + }, + { + "family": "Playwrite IE", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMyzipBpIu30AZbUY.ttf", + "200": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMy7ioBpIu30AZbUY.ttf", + "300": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMy2aoBpIu30AZbUY.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMyzioBpIu30AZbUY.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteie/v11/fC1zPYtWYWnH0hvndYd6GCGWXCAxfsUebXFMyzioNpMk2w.ttf" + }, + { + "family": "Playwrite IE Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteieguides/v1/LhW5MULFNP8PI-1UADw_Kbp9daTx5ovUaNojN9_8IVQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteieguides/v1/LhW5MULFNP8PI-1UADw_Kbp9daTx5ovUWNspMw.ttf" + }, + { + "family": "Playwrite IN", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkM7mNMR8n3_Ag1kU.ttf", + "200": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkMzmMMR8n3_Ag1kU.ttf", + "300": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkM-eMMR8n3_Ag1kU.ttf", + "regular": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkM7mMMR8n3_Ag1kU.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritein/v11/uk-xEGGpoLQ97mfv2J3cZzuz7CyEJhPw65lkM7mMAR4t2w.ttf" + }, + { + "family": "Playwrite IN Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteinguides/v1/GFD2WBRug3mQSvrAT9AL4vx4d3lQNQV4Tt1qdGqgdlM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteinguides/v1/GFD2WBRug3mQSvrAT9AL4vx4d3lQNQV4ftxgcA.ttf" + }, + { + "family": "Playwrite IS", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jq6R8aX9-p7K5ILg.ttf", + "200": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jqyR9aX9-p7K5ILg.ttf", + "300": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jq_p9aX9-p7K5ILg.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jq6R9aX9-p7K5ILg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteis/v10/JTUFjI4o_SGg9lecLGptrD17xQYXK0vOoz6jq6R9WX50ow.ttf" + }, + { + "family": "Playwrite IS Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteisguides/v1/5aUp9-GkphaVExwxdX6SwWF-uigk3Cglrm9ptxu7HZ0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteisguides/v1/5aUp9-GkphaVExwxdX6SwWF-uigk3Cglnm5jsw.ttf" + }, + { + "family": "Playwrite IT Moderna", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F5Wil8ubbffHtmMw.ttf", + "200": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F52ih8ubbffHtmMw.ttf", + "300": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F5BCh8ubbffHtmMw.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F5Wih8ubbffHtmMw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteitmoderna/v11/mFTbWaYCwKPK5cx6W8jy2kwDnSUe9q45vQQi5HMFnSdEx2F5WihMuLzb.ttf" + }, + { + "family": "Playwrite IT Moderna Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteitmodernaguides/v1/2sDKZHBJg5rCj6fz_QgDJhGcTtJ5AVu-1w5jRQjRv9qPpOVtBhB5gQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteitmodernaguides/v1/2sDKZHBJg5rCj6fz_QgDJhGcTtJ5AVu-1w5jRQjRv9q_pe9p.ttf" + }, + { + "family": "Playwrite IT Trad", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq96u--_gENNXvzL2Q.ttf", + "200": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq96O-6_gENNXvzL2Q.ttf", + "300": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq965e6_gENNXvzL2Q.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq96u-6_gENNXvzL2Q.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteittrad/v11/SlG5mR6Yo5oYZX5BFVcEySBSPE50BjHDpZxuvgxzFq96u-6PgUlJ.ttf" + }, + { + "family": "Playwrite IT Trad Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteittradguides/v2/SlGDmReYo5oYZX5BFVcEySBSPE50BiuP2AHaRsRUA4V-e6yHgQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteittradguides/v2/SlGDmReYo5oYZX5BFVcEySBSPE50BiuP2AHaRsRkAo96.ttf" + }, + { + "family": "Playwrite MX", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v13", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr9wnc5xYfXDWXDu8.ttf", + "200": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr94nd5xYfXDWXDu8.ttf", + "300": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr91fd5xYfXDWXDu8.ttf", + "regular": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr9wnd5xYfXDWXDu8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritemx/v13/6xK9dSNbKtCe7KfhXg7RYSwyQ-oO7xNblyJr9wnd1xcVWA.ttf" + }, + { + "family": "Playwrite MX Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritemxguides/v1/k3kMo9ESPe9dzQ1UGbvoZhnhbtfklWqN0qywHx-HpY0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritemxguides/v1/k3kMo9ESPe9dzQ1UGbvoZhnhbtfklWqN4q26Gw.ttf" + }, + { + "family": "Playwrite NG Modern", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V17tPQbi5GswWJNE.ttf", + "200": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V15tPAbi5GswWJNE.ttf", + "300": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V16zPAbi5GswWJNE.ttf", + "regular": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V17tPAbi5GswWJNE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritengmodern/v11/ijw-s4b2R9Qve5V5lNJb_yRhEfSep5NbFCKmKgoEeCA4V17tPDbj7m8.ttf" + }, + { + "family": "Playwrite NG Modern Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritengmodernguides/v1/6qLVKYQNtxD-qVlIPUIPdWMlWxy3BmFEQgxB1xvFhDarWJtyZyGU.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritengmodernguides/v1/6qLVKYQNtxD-qVlIPUIPdWMlWxy3BmFEQgxB1xvFhAaqUp8.ttf" + }, + { + "family": "Playwrite NL", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG9_EnYxNbPzS5HE.ttf", + "200": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG1_FnYxNbPzS5HE.ttf", + "300": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG4HFnYxNbPzS5HE.ttf", + "regular": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG9_FnYxNbPzS5HE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritenl/v10/k3kCo84SPe9dzQ1UGbvoZQ37Iqp5IZJF9bmaG9_FrY1HaA.ttf" + }, + { + "family": "Playwrite NL Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritenlguides/v1/FwZH7_8mxlw-50y5PJughoCL4jbXkMqwsWKGP6kvdPA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritenlguides/v1/FwZH7_8mxlw-50y5PJughoCL4jbXkMqwgWOMOw.ttf" + }, + { + "family": "Playwrite NO", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-49whHKen-mjRVtc.ttf", + "200": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-41wgHKen-mjRVtc.ttf", + "300": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-44IgHKen-mjRVtc.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-49wgHKen-mjRVtc.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteno/v10/nuFrD_fYSZviRJYb-P2TrQO1DRpazaZDgnw-49wgLKat_g.ttf" + }, + { + "family": "Playwrite NO Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritenoguides/v1/DPEwYx-Cyg4cQ2aAcFshOLL79zJKccqHe2-Z2vnLeAs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritenoguides/v1/DPEwYx-Cyg4cQ2aAcFshOLL79zJKccqHS26T3g.ttf" + }, + { + "family": "Playwrite NZ", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjngAVeRt5gGCzkrs.ttf", + "200": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjnoAUeRt5gGCzkrs.ttf", + "300": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjnl4UeRt5gGCzkrs.ttf", + "regular": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjngAUeRt5gGCzkrs.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritenz/v11/d6lakaOxRsyr_zZDmUYvh2TW3NCQVvjKPjPjngAUSRpzhA.ttf" + }, + { + "family": "Playwrite NZ Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritenzguides/v1/t5t8IQQPN4uFDRepJwiX4vzIikyGzv71Wh8xq25PL5k.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritenzguides/v1/t5t8IQQPN4uFDRepJwiX4vzIikyGzv71ah47rw.ttf" + }, + { + "family": "Playwrite PE", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesO2lsTPHFdtSgb_A.ttf", + "200": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesO-ltTPHFdtSgb_A.ttf", + "300": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesOzdtTPHFdtSgb_A.ttf", + "regular": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesO2ltTPHFdtSgb_A.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritepe/v6/FwZJ7-Amxlw-50y5PJugmImRrktKJDJ4lnesO2ltfPDPcg.ttf" + }, + { + "family": "Playwrite PE Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritepeguides/v1/AMONz5uBsGadFuvf9j8ZyqI0FA3br70wwyyAlqETME8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritepeguides/v1/AMONz5uBsGadFuvf9j8ZyqI0FA3br70w8y2Kkg.ttf" + }, + { + "family": "Playwrite PL", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmRfa9ZybSwcVtHQ.ttf", + "200": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmZfb9ZybSwcVtHQ.ttf", + "300": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmUnb9ZybSwcVtHQ.ttf", + "regular": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmRfb9ZybSwcVtHQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritepl/v10/0QIyMXVf_4C2VH-yUr5uz72U-LQiKJ_9tb1WmRfbxZ2RTw.ttf" + }, + { + "family": "Playwrite PL Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteplguides/v1/jVyW7m_lCm7G5CZyQCAu8mgkGLk-kmibWR3aRZ2Kw7A.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteplguides/v1/jVyW7m_lCm7G5CZyQCAu8mgkGLk-kmibaRzQQQ.ttf" + }, + { + "family": "Playwrite PT", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9qDjTfJtvlo3Qaw.ttf", + "200": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9iDiTfJtvlo3Qaw.ttf", + "300": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9v7iTfJtvlo3Qaw.ttf", + "regular": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9qDiTfJtvlo3Qaw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritept/v10/6NUE8FidKwOcfRjj8ukv5Lg-wt21rkAVfXUe9qDiffNnug.ttf" + }, + { + "family": "Playwrite PT Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteptguides/v2/sJoY3K5JjdGLJV3vyatrMkupgg-kWTx5F5k90TZO69o.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteptguides/v2/sJoY3K5JjdGLJV3vyatrMkupgg-kWTx5J5g31Q.ttf" + }, + { + "family": "Playwrite RO", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4a9ZnZWMJnZeBS8.ttf", + "200": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4S9YnZWMJnZeBS8.ttf", + "300": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4fFYnZWMJnZeBS8.ttf", + "regular": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4a9YnZWMJnZeBS8.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritero/v10/gok8H6fuA1J7QPJ04HFTGSWdk_S0czhwEf0j4a9YrZSGIg.ttf" + }, + { + "family": "Playwrite RO Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteroguides/v1/wlptgx7ZCE50snmWiOExiylvL10_b5Ym_LBte6KuGEo.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteroguides/v1/wlptgx7ZCE50snmWiOExiylvL10_b5YmzLFnfw.ttf" + }, + { + "family": "Playwrite SK", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf-2dvsOzdK9OF68.ttf", + "200": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf22cvsOzdK9OF68.ttf", + "300": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf7OcvsOzdK9OF68.ttf", + "regular": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf-2cvsOzdK9OF68.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritesk/v10/9XU3lJp0klrZDw3AZHcsJTByz7latrF9yDIlf-2cjsK5cA.ttf" + }, + { + "family": "Playwrite SK Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteskguides/v1/P5sezYaSYdfH5z93kEFk3tyPlqxeQeo_JzruWQshcbU.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteskguides/v1/P5sezYaSYdfH5z93kEFk3tyPlqxeQeo_FzvkXQ.ttf" + }, + { + "family": "Playwrite TZ", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDWwSue1COwjVROo.ttf", + "200": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDewTue1COwjVROo.ttf", + "300": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDTITue1COwjVROo.ttf", + "regular": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDWwTue1COwjVROo.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritetz/v11/RLptK5rs6au7bzABmVQAOwnUbvHMbzSUU27JDWwTiexIPw.ttf" + }, + { + "family": "Playwrite TZ Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritetzguides/v1/SLXUc0_L5XEkcjBPGvusk4lULgsM9U5_YQy93JQ2XEg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritetzguides/v1/SLXUc0_L5XEkcjBPGvusk4lULgsM9U5_UQ232A.ttf" + }, + { + "family": "Playwrite US Modern", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62YohNw2Da0LCgUPK.ttf", + "200": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62YqhNg2Da0LCgUPK.ttf", + "300": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62Yp_Ng2Da0LCgUPK.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62YohNg2Da0LCgUPK.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteusmodern/v11/H4cMBWmRlMXPhla3hmMaveiYz8nSDkIFLNIYl2TXUwK62YohNj2CYUY.ttf" + }, + { + "family": "Playwrite US Modern Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteusmodernguides/v1/0QI1MWNf_4C2VH-yUr5uyqKOvtOynXAoku8j8Lv9pryxZQscrW1V.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteusmodernguides/v1/0QI1MWNf_4C2VH-yUr5uyqKOvtOynXAoku8j8Lv9poywbw8.ttf" + }, + { + "family": "Playwrite US Trad", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1E8pgj6Kf5uBNig.ttf", + "200": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1k8tgj6Kf5uBNig.ttf", + "300": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1Tctgj6Kf5uBNig.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1E8tgj6Kf5uBNig.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteustrad/v11/fdNX9tyHsnVPjW9trmV7wQ0stdwRBYclCsCdzOb1-cd1E8tQjqib.ttf" + }, + { + "family": "Playwrite US Trad Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwriteustradguides/v1/-zk29027wssz_XLkGgu8kTL39c2bMssjmiZPNnk5nJCZAyrUdw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteustradguides/v1/-zk29027wssz_XLkGgu8kTL39c2bMssjmiZPNnkJnZqd.ttf" + }, + { + "family": "Playwrite VN", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNUI8E-9HPWIQtD0.ttf", + "200": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNcI9E-9HPWIQtD0.ttf", + "300": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNRw9E-9HPWIQtD0.ttf", + "regular": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNUI9E-9HPWIQtD0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritevn/v11/mtGo4_hXJqPSu8nf5RBY5i0q0yxCxtP-9TFBNUI9I-5NOQ.ttf" + }, + { + "family": "Playwrite VN Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritevnguides/v1/JIAvUUlydXJZq1IQU8oDBn2CUkROHFEAfXMXfpmSLuI.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritevnguides/v1/JIAvUUlydXJZq1IQU8oDBn2CUkROHFEATXIdeg.ttf" + }, + { + "family": "Playwrite ZA", + "variants": [ + "100", + "200", + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0EbLGbYUsn9T5dt0.ttf", + "200": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0ETLHbYUsn9T5dt0.ttf", + "300": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0EezHbYUsn9T5dt0.ttf", + "regular": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0EbLHbYUsn9T5dt0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwriteza/v11/Noag6Uzhw5CTOhXKt5-vwvhrNyaNQo1LaBq0EbLHXYQmmw.ttf" + }, + { + "family": "Playwrite ZA Guides", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/playwritezaguides/v1/O4ZOFHPsmxlhCg3-iycDyEwy0BT1ribk2HDoCLfQmgE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/playwritezaguides/v1/O4ZOFHPsmxlhCg3-iycDyEwy0BT1ribk6HHiDA.ttf" + }, + { + "family": "Plus Jakarta Sans", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_KU7NShXUEKi4Rw.ttf", + "300": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_907NShXUEKi4Rw.ttf", + "regular": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_qU7NShXUEKi4Rw.ttf", + "500": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_m07NShXUEKi4Rw.ttf", + "600": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_d0nNShXUEKi4Rw.ttf", + "700": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_TknNShXUEKi4Rw.ttf", + "800": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_KUnNShXUEKi4Rw.ttf", + "200italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ2lCR_QMq2oR82k.ttf", + "300italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ17CR_QMq2oR82k.ttf", + "italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ0lCR_QMq2oR82k.ttf", + "500italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ0XCR_QMq2oR82k.ttf", + "600italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ37Dh_QMq2oR82k.ttf", + "700italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ3CDh_QMq2oR82k.ttf", + "800italic": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIZaomQNQcsA88c7O9yZ4KMCoOg4KozySKCdSNG9OcqYQ2lDh_QMq2oR82k.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/plusjakartasans/v12/LDIbaomQNQcsA88c7O9yZ4KMCoOg4IA6-91aHEjcWuA_qU79Sx_Q.ttf" + }, + { + "family": "Pochaevsk", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin" + ], + "version": "v5", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/pochaevsk/v5/55xuey9_OdX_Om7ReYgloJd4-bnQKg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pochaevsk/v5/55xuey9_OdX_Om7ReYgVoZ18.ttf" + }, + { + "family": "Podkova", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v33", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWtFzcU4EoporSHH.ttf", + "500": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWt3zcU4EoporSHH.ttf", + "600": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWubysU4EoporSHH.ttf", + "700": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWuiysU4EoporSHH.ttf", + "800": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWvFysU4EoporSHH.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/podkova/v33/K2FufZ1EmftJSV9VQpXb1lo9vC3nZWtFzfU5GI4.ttf" + }, + { + "family": "Poetsen One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/poetsenone/v3/ke8hOgIaMUB37xCgvCntWtIvq_KREbG9.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/poetsenone/v3/ke8hOgIaMUB37xCgvCntWuIuofY.ttf" + }, + { + "family": "Poiret One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/poiretone/v18/UqyVK80NJXN4zfRgbdfbk5lWVscxdKE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/poiretone/v18/UqyVK80NJXN4zfRgbdfbo5hcUg.ttf" + }, + { + "family": "Poller One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v25", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/pollerone/v25/ahccv82n0TN3gia5E4Bud-lbgUS5u0s.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pollerone/v25/ahccv82n0TN3gia5E4BuR-hRhQ.ttf" + }, + { + "family": "Poltawski Nowy", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KqCWnDS6V5CzCoQ.ttf", + "500": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KmiWnDS6V5CzCoQ.ttf", + "600": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KdiKnDS6V5CzCoQ.ttf", + "700": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KTyKnDS6V5CzCoQ.ttf", + "italic": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUuRq6ww480U1xsUpFXD-iDBPNbMh08QUl99KgfYGZPTiSRxinSoROp.ttf", + "500italic": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUuRq6ww480U1xsUpFXD-iDBPNbMh08QUl99KgfYGZ9TiSRxinSoROp.ttf", + "600italic": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUuRq6ww480U1xsUpFXD-iDBPNbMh08QUl99KgfYGaRSSSRxinSoROp.ttf", + "700italic": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUuRq6ww480U1xsUpFXD-iDBPNbMh08QUl99KgfYGaoSSSRxinSoROp.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/poltawskinowy/v5/flUsRq6ww480U1xsUpFXD-iDBNlSAOLkKCLnWq8KqCWXDCSR.ttf" + }, + { + "family": "Poly", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/poly/v18/MQpb-W6wKNitRLCAq2Lpris.ttf", + "italic": "https://fonts.gstatic.com/s/poly/v18/MQpV-W6wKNitdLKKr0DsviuGWA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/poly/v18/MQpb-W6wKNitdLGKrw.ttf" + }, + { + "family": "Pompiere", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/pompiere/v21/VEMyRoxis5Dwuyeov6Wt5jDtreOL.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pompiere/v21/VEMyRoxis5Dwuyeov5Ws7DQ.ttf" + }, + { + "family": "Ponnala", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v3", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/ponnala/v3/w8gaH2QxQOU08bbbrQut2F4OuOo.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ponnala/v3/w8gaH2QxQOU08bbbnQqn3A.ttf" + }, + { + "family": "Ponomar", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin" + ], + "version": "v5", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/ponomar/v5/or3iQ6zp3fKD2wImbJTdArg8hzo.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ponomar/v5/or3iQ6zp3fKD2wImXJXXBg.ttf" + }, + { + "family": "Pontano Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOSzMncaMp9gzWsE.ttf", + "regular": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOXLMncaMp9gzWsE.ttf", + "500": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOUDMncaMp9gzWsE.ttf", + "600": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOazLncaMp9gzWsE.ttf", + "700": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOZXLncaMp9gzWsE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pontanosans/v19/qFdW35GdgYR8EzR6oBLDHa3wyRf8W8eBM6XLOXLMrceGow.ttf" + }, + { + "family": "Poor Story", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/poorstory/v24/jizfREFUsnUct9P6cDfd4OmnLD0Z4zM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/poorstory/v24/jizfREFUsnUct9P6cDfd0OitKA.ttf" + }, + { + "family": "Poppins", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/poppins/v24/pxiGyp8kv8JHgFVrLPTed3FBGPaTSQ.ttf", + "100italic": "https://fonts.gstatic.com/s/poppins/v24/pxiAyp8kv8JHgFVrJJLmE3tFOvODSVFF.ttf", + "200": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLFj_V1tvFP-KUEg.ttf", + "200italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLmv1plEN2PQEhcqw.ttf", + "300": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLDz8V1tvFP-KUEg.ttf", + "300italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLm21llEN2PQEhcqw.ttf", + "regular": "https://fonts.gstatic.com/s/poppins/v24/pxiEyp8kv8JHgFVrFJDUc1NECPY.ttf", + "italic": "https://fonts.gstatic.com/s/poppins/v24/pxiGyp8kv8JHgFVrJJLed3FBGPaTSQ.ttf", + "500": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLGT9V1tvFP-KUEg.ttf", + "500italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLmg1hlEN2PQEhcqw.ttf", + "600": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLEj6V1tvFP-KUEg.ttf", + "600italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLmr19lEN2PQEhcqw.ttf", + "700": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLCz7V1tvFP-KUEg.ttf", + "700italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLmy15lEN2PQEhcqw.ttf", + "800": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLDD4V1tvFP-KUEg.ttf", + "800italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLm111lEN2PQEhcqw.ttf", + "900": "https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLBT5V1tvFP-KUEg.ttf", + "900italic": "https://fonts.gstatic.com/s/poppins/v24/pxiDyp8kv8JHgFVrJJLm81xlEN2PQEhcqw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/poppins/v24/pxiEyp8kv8JHgFVrJJHedw.ttf" + }, + { + "family": "Port Lligat Sans", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/portlligatsans/v24/kmKmZrYrGBbdN1aV7Vokow6Lw4s4l7N0Tx4xEcQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/portlligatsans/v24/kmKmZrYrGBbdN1aV7Vokow6Lw4s4p7J-Sw.ttf" + }, + { + "family": "Port Lligat Slab", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/portlligatslab/v27/LDIpaoiQNgArA8kR7ulhZ8P_NYOss7ob9yGLmfI.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/portlligatslab/v27/LDIpaoiQNgArA8kR7ulhZ8P_NYOsg7sR8w.ttf" + }, + { + "family": "Potta One", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/pottaone/v19/FeVSS05Bp6cy7xI-YfxQ3Z5nm29Gww.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pottaone/v19/FeVSS05Bp6cy7xI-Yfxg3JRj.ttf" + }, + { + "family": "Pragati Narrow", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/pragatinarrow/v15/vm8vdRf0T0bS1ffgsPB7WZ-mD17_ytN3M48a.ttf", + "700": "https://fonts.gstatic.com/s/pragatinarrow/v15/vm8sdRf0T0bS1ffgsPB7WZ-mD2ZD5fd_GJMTlo_4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pragatinarrow/v15/vm8vdRf0T0bS1ffgsPB7WZ-mD27-wNc.ttf" + }, + { + "family": "Praise", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/praise/v9/qkBUXvUZ-cnFXcFyDvO67L9XmQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/praise/v9/qkBUXvUZ-cnFXcFCD_m-.ttf" + }, + { + "family": "Prata", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/prata/v22/6xKhdSpbNNCT-vWIAG_5LWwJ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/prata/v22/6xKhdSpbNNCT-sWJCms.ttf" + }, + { + "family": "Preahvihear", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v32", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/preahvihear/v32/6NUS8F-dNQeEYhzj7uluxswE49FJf8Wv.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/preahvihear/v32/6NUS8F-dNQeEYhzj7uluxvwF6dU.ttf" + }, + { + "family": "Press Start 2P", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/pressstart2p/v16/e3t4euO8T-267oIAQAu6jDQyK0nSgPJE4580.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pressstart2p/v16/e3t4euO8T-267oIAQAu6jDQyK3nTivY.ttf" + }, + { + "family": "Pridi", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc1SiE0jRUG0AqUc.ttf", + "300": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc02i00jRUG0AqUc.ttf", + "regular": "https://fonts.gstatic.com/s/pridi/v15/2sDQZG5JnZLfkfWao2krbl29.ttf", + "500": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc1uik0jRUG0AqUc.ttf", + "600": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc1CjU0jRUG0AqUc.ttf", + "700": "https://fonts.gstatic.com/s/pridi/v15/2sDdZG5JnZLfkc0mjE0jRUG0AqUc.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/pridi/v15/2sDQZG5JnZLfkcWbqW0.ttf" + }, + { + "family": "Princess Sofia", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/princesssofia/v27/qWczB6yguIb8DZ_GXZst16n7GRz7mDUoupoI.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/princesssofia/v27/qWczB6yguIb8DZ_GXZst16n7GSz6kjE.ttf" + }, + { + "family": "Prociono", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v28", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/prociono/v28/r05YGLlR-KxAf9GGO8upyDYtStiJ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/prociono/v28/r05YGLlR-KxAf9GGO_uowjI.ttf" + }, + { + "family": "Prompt", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/prompt/v12/-W_9XJnvUD7dzB2CA9oYREcjeo0k.ttf", + "100italic": "https://fonts.gstatic.com/s/prompt/v12/-W_7XJnvUD7dzB2KZeJ8TkMBf50kbiM.ttf", + "200": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Cr_s4bmkvc5Q9dw.ttf", + "200italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeLQb2MrUZEtdzow.ttf", + "300": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Cy_g4bmkvc5Q9dw.ttf", + "300italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeK0bGMrUZEtdzow.ttf", + "regular": "https://fonts.gstatic.com/s/prompt/v12/-W__XJnvUD7dzB26Z9AcZkIzeg.ttf", + "italic": "https://fonts.gstatic.com/s/prompt/v12/-W_9XJnvUD7dzB2KZdoYREcjeo0k.ttf", + "500": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Ck_k4bmkvc5Q9dw.ttf", + "500italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeLsbWMrUZEtdzow.ttf", + "600": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Cv_44bmkvc5Q9dw.ttf", + "600italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeLAamMrUZEtdzow.ttf", + "700": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2C2_84bmkvc5Q9dw.ttf", + "700italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeKka2MrUZEtdzow.ttf", + "800": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2Cx_w4bmkvc5Q9dw.ttf", + "800italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeK4aGMrUZEtdzow.ttf", + "900": "https://fonts.gstatic.com/s/prompt/v12/-W_8XJnvUD7dzB2C4_04bmkvc5Q9dw.ttf", + "900italic": "https://fonts.gstatic.com/s/prompt/v12/-W_6XJnvUD7dzB2KZeKcaWMrUZEtdzow.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/prompt/v12/-W__XJnvUD7dzB2KZtoY.ttf" + }, + { + "family": "Prosto One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/prostoone/v21/OpNJno4VhNfK-RgpwWWxpipfWhXD00c.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/prostoone/v21/OpNJno4VhNfK-RgpwWWxlitVXg.ttf" + }, + { + "family": "Protest Guerrilla", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/protestguerrilla/v2/Qw3HZR5PDSL6K3irtrY-VJB2YzARHV0koJ8y_eiS.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/protestguerrilla/v2/Qw3HZR5PDSL6K3irtrY-VJB2YzARHW0lqps.ttf" + }, + { + "family": "Protest Revolution", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/protestrevolution/v2/11hcGofZ0kXBbxQXFB7MJsjtqnVw6Z2s8PIzTG1nQw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/protestrevolution/v2/11hcGofZ0kXBbxQXFB7MJsjtqnVw6Z2c8fg3.ttf" + }, + { + "family": "Protest Riot", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/protestriot/v2/d6lPkaOxWMKm7TdezXFmpkrM1_JgjmRpOA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/protestriot/v2/d6lPkaOxWMKm7TdezXFmpkr81vhk.ttf" + }, + { + "family": "Protest Strike", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/proteststrike/v2/0QI5MXdf4Y67Rn6vBog67ZjFlpzW0gZOs7BX.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/proteststrike/v2/0QI5MXdf4Y67Rn6vBog67ZjFlqzX2AI.ttf" + }, + { + "family": "Proza Libre", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/prozalibre/v9/LYjGdGHgj0k1DIQRyUEyyHovftvXWYyz.ttf", + "italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjEdGHgj0k1DIQRyUEyyEotdN_1XJyz7zc.ttf", + "500": "https://fonts.gstatic.com/s/prozalibre/v9/LYjbdGHgj0k1DIQRyUEyyELbV__fcpC69i6N.ttf", + "500italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjZdGHgj0k1DIQRyUEyyEotTCvceJSY8z6Np1k.ttf", + "600": "https://fonts.gstatic.com/s/prozalibre/v9/LYjbdGHgj0k1DIQRyUEyyEL3UP_fcpC69i6N.ttf", + "600italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjZdGHgj0k1DIQRyUEyyEotTAfbeJSY8z6Np1k.ttf", + "700": "https://fonts.gstatic.com/s/prozalibre/v9/LYjbdGHgj0k1DIQRyUEyyEKTUf_fcpC69i6N.ttf", + "700italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjZdGHgj0k1DIQRyUEyyEotTGPaeJSY8z6Np1k.ttf", + "800": "https://fonts.gstatic.com/s/prozalibre/v9/LYjbdGHgj0k1DIQRyUEyyEKPUv_fcpC69i6N.ttf", + "800italic": "https://fonts.gstatic.com/s/prozalibre/v9/LYjZdGHgj0k1DIQRyUEyyEotTH_ZeJSY8z6Np1k.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/prozalibre/v9/LYjGdGHgj0k1DIQRyUEyyEoudN8.ttf" + }, + { + "family": "Public Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuFpi5ww0pX189fg.ttf", + "200": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymulpm5ww0pX189fg.ttf", + "300": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuSJm5ww0pX189fg.ttf", + "regular": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuFpm5ww0pX189fg.ttf", + "500": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuJJm5ww0pX189fg.ttf", + "600": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuyJ65ww0pX189fg.ttf", + "700": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymu8Z65ww0pX189fg.ttf", + "800": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymulp65ww0pX189fg.ttf", + "900": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuv565ww0pX189fg.ttf", + "100italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tpRgQctfVotfj7j.ttf", + "200italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673trRgActfVotfj7j.ttf", + "300italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673toPgActfVotfj7j.ttf", + "italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tpRgActfVotfj7j.ttf", + "500italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tpjgActfVotfj7j.ttf", + "600italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tqPhwctfVotfj7j.ttf", + "700italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tq2hwctfVotfj7j.ttf", + "800italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673trRhwctfVotfj7j.ttf", + "900italic": "https://fonts.gstatic.com/s/publicsans/v21/ijwAs572Xtc6ZYQws9YVwnNDZpDyNjGolS673tr4hwctfVotfj7j.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/publicsans/v21/ijwGs572Xtc6ZYQws9YVwllKVG8qX1oyOymuFpmJwgct.ttf" + }, + { + "family": "Puppies Play", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/puppiesplay/v11/wlp2gwHZEV99rG6M3NR9uB9vaAJSA_JN3Q.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/puppiesplay/v11/wlp2gwHZEV99rG6M3NR9uB9faQhW.ttf" + }, + { + "family": "Puritan", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/puritan/v25/845YNMgkAJ2VTtIo9JrwRdaI50M.ttf", + "italic": "https://fonts.gstatic.com/s/puritan/v25/845aNMgkAJ2VTtIoxJj6QfSN90PfXA.ttf", + "700": "https://fonts.gstatic.com/s/puritan/v25/845dNMgkAJ2VTtIozCbfYd6j-0rGRes.ttf", + "700italic": "https://fonts.gstatic.com/s/puritan/v25/845fNMgkAJ2VTtIoxJjC_dup_2jDVevnLQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/puritan/v25/845YNMgkAJ2VTtIoxJv6QQ.ttf" + }, + { + "family": "Purple Purse", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/purplepurse/v25/qWctB66gv53iAp-Vfs4My6qyeBb_ujA4ug.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/purplepurse/v25/qWctB66gv53iAp-Vfs4My6qCeRz7.ttf" + }, + { + "family": "Qahiri", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin" + ], + "version": "v11", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/qahiri/v11/tsssAp1RZy0C_hGuU3Chrnmupw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/qahiri/v11/tsssAp1RZy0C_hGeUnql.ttf" + }, + { + "family": "Quando", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/quando/v18/xMQVuFNaVa6YuW0pC6WzKX_QmA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/quando/v18/xMQVuFNaVa6YuW0ZCq-3.ttf" + }, + { + "family": "Quantico", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/quantico/v19/rax-HiSdp9cPL3KIF4xsLjxSmlLZ.ttf", + "italic": "https://fonts.gstatic.com/s/quantico/v19/rax4HiSdp9cPL3KIF7xuJDhwn0LZ6T8.ttf", + "700": "https://fonts.gstatic.com/s/quantico/v19/rax5HiSdp9cPL3KIF7TQARhasU7Q8Cad.ttf", + "700italic": "https://fonts.gstatic.com/s/quantico/v19/rax7HiSdp9cPL3KIF7xuHIRfu0ry9TadML4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/quantico/v19/rax-HiSdp9cPL3KIF7xtJDg.ttf" + }, + { + "family": "Quattrocento", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/quattrocento/v24/OZpEg_xvsDZQL_LKIF7q4jPHxGL7f4jFuA.ttf", + "700": "https://fonts.gstatic.com/s/quattrocento/v24/OZpbg_xvsDZQL_LKIF7q4jP_eE3fd6PZsXcM9w.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/quattrocento/v24/OZpEg_xvsDZQL_LKIF7q4jP3xWj_.ttf" + }, + { + "family": "Quattrocento Sans", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9c4lja2NVIDdIAAoMR5MfuElaRB3zOvU7eHGHJ.ttf", + "italic": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9a4lja2NVIDdIAAoMR5MfuElaRB0zMt0r8GXHJkLI.ttf", + "700": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9Z4lja2NVIDdIAAoMR5MfuElaRB0RykmrWN33AiasJ.ttf", + "700italic": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9X4lja2NVIDdIAAoMR5MfuElaRB0zMj_bTPXnijLsJV7E.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/quattrocentosans/v22/va9c4lja2NVIDdIAAoMR5MfuElaRB0zPt0o.ttf" + }, + { + "family": "Questrial", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/questrial/v19/QdVUSTchPBm7nuUeVf7EuStkm20oJA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/questrial/v19/QdVUSTchPBm7nuUeVf70uCFg.ttf" + }, + { + "family": "Quicksand", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v37", + "lastModified": "2025-09-02", + "files": { + "300": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkKEo18G0wx40QDw.ttf", + "regular": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o18G0wx40QDw.ttf", + "500": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkM0o18G0wx40QDw.ttf", + "600": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkCEv18G0wx40QDw.ttf", + "700": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkBgv18G0wx40QDw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/quicksand/v37/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o58C-xw.ttf" + }, + { + "family": "Quintessential", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/quintessential/v24/fdNn9sOGq31Yjnh3qWU14DdtjY5wS7kmAyxM.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/quintessential/v24/fdNn9sOGq31Yjnh3qWU14Ddtjb5xQb0.ttf" + }, + { + "family": "Qwigley", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/qwigley/v20/1cXzaU3UGJb5tGoCuVxsi1mBmcE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/qwigley/v20/1cXzaU3UGJb5tGoCiV1mjw.ttf" + }, + { + "family": "Qwitcher Grypen", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/qwitchergrypen/v8/pxicypclp9tDilN9RrC5BSI1dZmrSGNAom-wpw.ttf", + "700": "https://fonts.gstatic.com/s/qwitchergrypen/v8/pxiZypclp9tDilN9RrC5BSI1dZmT9ExkqkSsrvNXiA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/qwitchergrypen/v8/pxicypclp9tDilN9RrC5BSI1dZmbSWlE.ttf" + }, + { + "family": "REM", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPMLrrToUbIqIfBU.ttf", + "200": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPELqrToUbIqIfBU.ttf", + "300": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPJzqrToUbIqIfBU.ttf", + "regular": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPMLqrToUbIqIfBU.ttf", + "500": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPPDqrToUbIqIfBU.ttf", + "600": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPBztrToUbIqIfBU.ttf", + "700": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPCXtrToUbIqIfBU.ttf", + "800": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPELtrToUbIqIfBU.ttf", + "900": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPGvtrToUbIqIfBU.ttf", + "100italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpRXgeaKiNbBVWkw.ttf", + "200italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpxXkeaKiNbBVWkw.ttf", + "300italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpG3keaKiNbBVWkw.ttf", + "italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpRXkeaKiNbBVWkw.ttf", + "500italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpd3keaKiNbBVWkw.ttf", + "600italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpm34eaKiNbBVWkw.ttf", + "700italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpon4eaKiNbBVWkw.ttf", + "800italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqpxX4eaKiNbBVWkw.ttf", + "900italic": "https://fonts.gstatic.com/s/rem/v4/WnzmHAIoSDytZCogaeLNP7XTKQqp7H4eaKiNbBVWkw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rem/v4/WnzgHAIoSDyHbRjfsYumpRvUPMLqnTseaA.ttf" + }, + { + "family": "Racing Sans One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/racingsansone/v17/sykr-yRtm7EvTrXNxkv5jfKKyDCwL3rmWpIBtA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/racingsansone/v17/sykr-yRtm7EvTrXNxkv5jfKKyDCALnDi.ttf" + }, + { + "family": "Radio Canada", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "canadian-aboriginal", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nESkQPIJOdSSfOT.ttf", + "regular": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nFMkQPIJOdSSfOT.ttf", + "500": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nF-kQPIJOdSSfOT.ttf", + "600": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nGSlgPIJOdSSfOT.ttf", + "700": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nGrlgPIJOdSSfOT.ttf", + "300italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0rWLLuNwTOOTa9k.ttf", + "italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0uuLLuNwTOOTa9k.ttf", + "500italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0tmLLuNwTOOTa9k.ttf", + "600italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0jWMLuNwTOOTa9k.ttf", + "700italic": "https://fonts.gstatic.com/s/radiocanada/v26/XRX33ISXn0dBMcibU6jlAqrdcwAMBJuK9IgQn4bfnSrKcMQM2cGQ1WSE0gyMLuNwTOOTa9k.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/radiocanada/v26/XRX13ISXn0dBMcibU6jlAqr3ejLv5OLZYiYXik6db2P4jxxlsls-0nFMkTPJLuM.ttf" + }, + { + "family": "Radio Canada Big", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6nNRY3p2pcheCsG.ttf", + "500": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6n_RY3p2pcheCsG.ttf", + "600": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6kTQo3p2pcheCsG.ttf", + "700": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6kqQo3p2pcheCsG.ttf", + "italic": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjqdHrinEImAoQewU0hyTsPFra4SJaI_D54b8U_WLwFBmWq0JMDfTsGdMc.ttf", + "500italic": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjqdHrinEImAoQewU0hyTsPFra4SJaI_D54b8U_WLwFBleq0JMDfTsGdMc.ttf", + "600italic": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjqdHrinEImAoQewU0hyTsPFra4SJaI_D54b8U_WLwFBrut0JMDfTsGdMc.ttf", + "700italic": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjqdHrinEImAoQewU0hyTsPFra4SJaI_D54b8U_WLwFBoKt0JMDfTsGdMc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/radiocanadabig/v3/LYjUdHrinEImAoQewU0hyTsPFra4Yp-6A-YRBF-RX6nNRb3o0JM.ttf" + }, + { + "family": "Radley", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/radley/v24/LYjDdGzinEIjCN19oAlEpVs3VQ.ttf", + "italic": "https://fonts.gstatic.com/s/radley/v24/LYjBdGzinEIjCN1NogNAh14nVcfe.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/radley/v24/LYjDdGzinEIjCN1NoQNA.ttf" + }, + { + "family": "Rajdhani", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/rajdhani/v17/LDI2apCSOBg7S-QT7pasEcOsc-bGkqIw.ttf", + "regular": "https://fonts.gstatic.com/s/rajdhani/v17/LDIxapCSOBg7S-QT7q4AOeekWPrP.ttf", + "500": "https://fonts.gstatic.com/s/rajdhani/v17/LDI2apCSOBg7S-QT7pb0EMOsc-bGkqIw.ttf", + "600": "https://fonts.gstatic.com/s/rajdhani/v17/LDI2apCSOBg7S-QT7pbYF8Osc-bGkqIw.ttf", + "700": "https://fonts.gstatic.com/s/rajdhani/v17/LDI2apCSOBg7S-QT7pa8FsOsc-bGkqIw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rajdhani/v17/LDIxapCSOBg7S-QT7p4BM-M.ttf" + }, + { + "family": "Rakkas", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/rakkas/v22/Qw3cZQlNHiblL3j_lttPOeMcCw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rakkas/v22/Qw3cZQlNHiblL3jPl9FL.ttf" + }, + { + "family": "Raleway", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v37", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvao4CPNLA3JC9c.ttf", + "200": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVtaooCPNLA3JC9c.ttf", + "300": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVuEooCPNLA3JC9c.ttf", + "regular": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaooCPNLA3JC9c.ttf", + "500": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvoooCPNLA3JC9c.ttf", + "600": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVsEpYCPNLA3JC9c.ttf", + "700": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVs9pYCPNLA3JC9c.ttf", + "800": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVtapYCPNLA3JC9c.ttf", + "900": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVtzpYCPNLA3JC9c.ttf", + "100italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4WjNPrQVIT9c2c8.ttf", + "200italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4ejMPrQVIT9c2c8.ttf", + "300italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4TbMPrQVIT9c2c8.ttf", + "italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4WjMPrQVIT9c2c8.ttf", + "500italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4VrMPrQVIT9c2c8.ttf", + "600italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4bbLPrQVIT9c2c8.ttf", + "700italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4Y_LPrQVIT9c2c8.ttf", + "800italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4ejLPrQVIT9c2c8.ttf", + "900italic": "https://fonts.gstatic.com/s/raleway/v37/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4cHLPrQVIT9c2c8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/raleway/v37/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCOPrQ.ttf" + }, + { + "family": "Raleway Dots", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/ralewaydots/v19/6NUR8FifJg6AfQvzpshgwJ8kyf9Fdty2ew.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ralewaydots/v19/6NUR8FifJg6AfQvzpshgwJ8UyPVB.ttf" + }, + { + "family": "Ramabhadra", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/ramabhadra/v17/EYq2maBOwqRW9P1SQ83LehNGX5uWw3o.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ramabhadra/v17/EYq2maBOwqRW9P1SQ83LShJMWw.ttf" + }, + { + "family": "Ramaraja", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/ramaraja/v17/SlGTmQearpYAYG1CABIkqnB6aSQU.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ramaraja/v17/SlGTmQearpYAYG1CACIloHQ.ttf" + }, + { + "family": "Rambla", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/rambla/v14/snfrs0ip98hx6mr0I7IONthkwQ.ttf", + "italic": "https://fonts.gstatic.com/s/rambla/v14/snfps0ip98hx6mrEIbgKFN10wYKa.ttf", + "700": "https://fonts.gstatic.com/s/rambla/v14/snfos0ip98hx6mrMn50qPvN4yJuDYQ.ttf", + "700italic": "https://fonts.gstatic.com/s/rambla/v14/snfus0ip98hx6mrEIYC2O_l86p6TYS-Y.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rambla/v14/snfrs0ip98hx6mrEIrgK.ttf" + }, + { + "family": "Rammetto One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/rammettoone/v21/LhWiMV3HOfMbMetJG3lQDpp9Mvuciu-_SQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rammettoone/v21/LhWiMV3HOfMbMetJG3lQDppNM_GY.ttf" + }, + { + "family": "Rampart One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/rampartone/v13/K2F1fZFGl_JSR1tAWNG9R6qgLS76ZHOM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rampartone/v13/K2F1fZFGl_JSR1tAWNG9R5qhJyo.ttf" + }, + { + "family": "Ranchers", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/ranchers/v19/zrfm0H3Lx-P2Xvs2AoDYDC79XTHv.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ranchers/v19/zrfm0H3Lx-P2Xvs2ArDZBio.ttf" + }, + { + "family": "Rancho", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/rancho/v22/46kulbzmXjLaqZRlbWXgd0RY1g.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rancho/v22/46kulbzmXjLaqZRVbG_k.ttf" + }, + { + "family": "Ranga", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-04-23", + "files": { + "regular": "https://fonts.gstatic.com/s/ranga/v22/C8ct4cYisGb28p6CLDwZwmGE.ttf", + "700": "https://fonts.gstatic.com/s/ranga/v22/C8cg4cYisGb28qY-AxgR6X2NZAn2.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ranga/v22/C8ct4cYisGb28q6DJjg.ttf" + }, + { + "family": "Rasa", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN4YJW41fcvN2KT4.ttf", + "regular": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN5GJW41fcvN2KT4.ttf", + "500": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN50JW41fcvN2KT4.ttf", + "600": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN6YIm41fcvN2KT4.ttf", + "700": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN6hIm41fcvN2KT4.ttf", + "300italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZth2d8_v3bT4Ycc.ttf", + "italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZoZ2d8_v3bT4Ycc.ttf", + "500italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZrR2d8_v3bT4Ycc.ttf", + "600italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZlhxd8_v3bT4Ycc.ttf", + "700italic": "https://fonts.gstatic.com/s/rasa/v27/xn78YHIn1mWmfqBOmQhln0Bne8uOZmFxd8_v3bT4Ycc.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rasa/v27/xn76YHIn1mWmVKl8ZtAM9NrJfN5GJV40d88.ttf" + }, + { + "family": "Rationale", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/rationale/v30/9XUnlJ92n0_JFxHIfHcsdlFMzLC2Zw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rationale/v30/9XUnlJ92n0_JFxHIfHccd1tI.ttf" + }, + { + "family": "Ravi Prakash", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v21", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/raviprakash/v21/gokpH6fsDkVrF9Bv9X8SOAKHmNZEq6TTFw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/raviprakash/v21/gokpH6fsDkVrF9Bv9X8SOAK3mdxA.ttf" + }, + { + "family": "Readex Pro", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTCYUSmgmsglvjkag.ttf", + "300": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTCv0Smgmsglvjkag.ttf", + "regular": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTC4USmgmsglvjkag.ttf", + "500": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTC00Smgmsglvjkag.ttf", + "600": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTCP0Omgmsglvjkag.ttf", + "700": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTCBkOmgmsglvjkag.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/readexpro/v27/SLXnc1bJ7HE5YDoGPuzj_dh8uc7wUy8ZQQyX2KY8TL0kGZN6blTC4USWg2Ek.ttf" + }, + { + "family": "Recursive", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v44", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck018vwxjDJCL.ttf", + "regular": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk018vwxjDJCL.ttf", + "500": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk018vwxjDJCL.ttf", + "600": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclE18vwxjDJCL.ttf", + "700": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllE18vwxjDJCL.ttf", + "800": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClE18vwxjDJCL.ttf", + "900": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlE18vwxjDJCL.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/recursive/v44/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk319tQg.ttf" + }, + { + "family": "Red Hat Display", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbjKWckg5-Xecg3w.ttf", + "regular": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbmyWckg5-Xecg3w.ttf", + "500": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbl6Wckg5-Xecg3w.ttf", + "600": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbrKRckg5-Xecg3w.ttf", + "700": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbouRckg5-Xecg3w.ttf", + "800": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbuyRckg5-Xecg3w.ttf", + "900": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbsWRckg5-Xecg3w.ttf", + "300italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVxAsz_VWZk3zJGg.ttf", + "italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVmgsz_VWZk3zJGg.ttf", + "500italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVqAsz_VWZk3zJGg.ttf", + "600italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVRAwz_VWZk3zJGg.ttf", + "700italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVfQwz_VWZk3zJGg.ttf", + "800italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVGgwz_VWZk3zJGg.ttf", + "900italic": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIh7wUr0m80wwYf0QCXZzYzUoTg-CSvZX4Vlf1fe6TVMwwz_VWZk3zJGg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redhatdisplay/v21/8vIf7wUr0m80wwYf0QCXZzYzUoTK8RZQvRd-D1NYbmyWQkkz_Q.ttf" + }, + { + "family": "Red Hat Mono", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQQPI-7HNuW4QuKI.ttf", + "regular": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQV3I-7HNuW4QuKI.ttf", + "500": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQW_I-7HNuW4QuKI.ttf", + "600": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQYPP-7HNuW4QuKI.ttf", + "700": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQbrP-7HNuW4QuKI.ttf", + "300italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWLTfLHvUwVqKIJuw.ttf", + "italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWLE_LHvUwVqKIJuw.ttf", + "500italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWLIfLHvUwVqKIJuw.ttf", + "600italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWLzfXHvUwVqKIJuw.ttf", + "700italic": "https://fonts.gstatic.com/s/redhatmono/v16/jVye7nDnA2uf2zVvFAhhzEsUXfZc_vk45Kb3VJWL9PXHvUwVqKIJuw.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redhatmono/v16/jVyY7nDnA2uf2zVvFAhhzEs-VMSjJpBTfgjwQV3Iy7DHvQ.ttf" + }, + { + "family": "Red Hat Text", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML-ZwVrbacYVFtIY.ttf", + "regular": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML7hwVrbacYVFtIY.ttf", + "500": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML4pwVrbacYVFtIY.ttf", + "600": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML2Z3VrbacYVFtIY.ttf", + "700": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML193VrbacYVFtIY.ttf", + "300italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAz4PXQdadApIYv_g.ttf", + "italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAzvvXQdadApIYv_g.ttf", + "500italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAzjPXQdadApIYv_g.ttf", + "600italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAzYPLQdadApIYv_g.ttf", + "700italic": "https://fonts.gstatic.com/s/redhattext/v19/RrQEbohi_ic6B3yVSzGBrMxQbb0jEzlRoOOLOnAzWfLQdadApIYv_g.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redhattext/v19/RrQCbohi_ic6B3yVSzGBrMx6ZI_cy1A6Ok2ML7hwZrfQdQ.ttf" + }, + { + "family": "Red Rose", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8y8_sDcjSsYUVUjg.ttf", + "regular": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8yrfsDcjSsYUVUjg.ttf", + "500": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8yn_sDcjSsYUVUjg.ttf", + "600": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8yc_wDcjSsYUVUjg.ttf", + "700": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8ySvwDcjSsYUVUjg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redrose/v25/QdVISTYiLBjouPgEUajvsfWwDtc3MH8yrfszcz6o.ttf" + }, + { + "family": "Redacted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/redacted/v11/Z9XVDmdRShme2O_7aITe4u2El6GC.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redacted/v11/Z9XVDmdRShme2O_7aLTf6Ok.ttf" + }, + { + "family": "Redacted Script", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-17", + "files": { + "300": "https://fonts.gstatic.com/s/redactedscript/v12/ypvEbXGRglhokR7dcC3d1-R6zmxqHUzVmbI397ldkg.ttf", + "regular": "https://fonts.gstatic.com/s/redactedscript/v12/ypvBbXGRglhokR7dcC3d1-R6zmxSsWTxkZkr_g.ttf", + "700": "https://fonts.gstatic.com/s/redactedscript/v12/ypvEbXGRglhokR7dcC3d1-R6zmxqDUvVmbI397ldkg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redactedscript/v12/ypvBbXGRglhokR7dcC3d1-R6zmxisG71.ttf" + }, + { + "family": "Reddit Mono", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUQCYacnnYz7yQYA.ttf", + "300": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUniYacnnYz7yQYA.ttf", + "regular": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUwCYacnnYz7yQYA.ttf", + "500": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vU8iYacnnYz7yQYA.ttf", + "600": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUHiEacnnYz7yQYA.ttf", + "700": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUJyEacnnYz7yQYA.ttf", + "800": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUQCEacnnYz7yQYA.ttf", + "900": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUaSEacnnYz7yQYA.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redditmono/v5/oPWc_kRmmu4oQ88oo13o48DHbsqn28eR20vUwCYqc3Pc.ttf" + }, + { + "family": "Reddit Sans", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5ux7YxmAVfBiVMFlw.ttf", + "300": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxM4xmAVfBiVMFlw.ttf", + "regular": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxbYxmAVfBiVMFlw.ttf", + "500": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxX4xmAVfBiVMFlw.ttf", + "600": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxs4tmAVfBiVMFlw.ttf", + "700": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxiotmAVfBiVMFlw.ttf", + "800": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5ux7YtmAVfBiVMFlw.ttf", + "900": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxxItmAVfBiVMFlw.ttf", + "200italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc8OQl3Fq1YVlz5F.ttf", + "300italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc_QQl3Fq1YVlz5F.ttf", + "italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc-OQl3Fq1YVlz5F.ttf", + "500italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc-8Ql3Fq1YVlz5F.ttf", + "600italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc9QRV3Fq1YVlz5F.ttf", + "700italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc9pRV3Fq1YVlz5F.ttf", + "800italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc8ORV3Fq1YVlz5F.ttf", + "900italic": "https://fonts.gstatic.com/s/redditsans/v6/EYqmmaFOxq1T_-ETdN7EKQNuYZifL6vY-Zykpc8nRV3Fq1YVlz5F.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redditsans/v6/EYqgmaFOxq1T_-ETdN7EKSlnU2dHRsBCV5uxbYxWAF3F.ttf" + }, + { + "family": "Reddit Sans Condensed", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro9kKUpU4u7XDIuc.ttf", + "300": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJrowcKUpU4u7XDIuc.ttf", + "regular": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro1kKUpU4u7XDIuc.ttf", + "500": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro2sKUpU4u7XDIuc.ttf", + "600": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro4cNUpU4u7XDIuc.ttf", + "700": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro74NUpU4u7XDIuc.ttf", + "800": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro9kNUpU4u7XDIuc.ttf", + "900": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro_ANUpU4u7XDIuc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redditsanscondensed/v5/m8J_jepOc6WYkkm2Dey9A5QGAQXmuL3va5IfZsq2gyKtWVJro1kKYpQyvw.ttf" + }, + { + "family": "Redressed", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v32", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/redressed/v32/x3dickHUbrmJ7wMy9MsBfPACvy_1BA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/redressed/v32/x3dickHUbrmJ7wMy9MsxffoG.ttf" + }, + { + "family": "Reem Kufi", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v28", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQtuZnEGGf3qGuvM4.ttf", + "500": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQttRnEGGf3qGuvM4.ttf", + "600": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQtjhgEGGf3qGuvM4.ttf", + "700": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQtgFgEGGf3qGuvM4.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/reemkufi/v28/2sDPZGJLip7W2J7v7wQZZE1I0yCmYzzQtuZnIGCV2g.ttf" + }, + { + "family": "Reem Kufi Fun", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChoYj3nCgrvqZzZXq.ttf", + "500": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChoYR3nCgrvqZzZXq.ttf", + "600": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChob92XCgrvqZzZXq.ttf", + "700": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChobE2XCgrvqZzZXq.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/reemkufifun/v13/uK_m4rOFYukkmyUEbF43fIryZEk5qRZ8nrKChoYj3kChpP4.ttf", + "colorCapabilities": [ + "COLRv0" + ] + }, + { + "family": "Reem Kufi Ink", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v11", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/reemkufiink/v11/oPWJ_kJmmu8hCvB9iFumxZSnRj5dQnSX1ko.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/reemkufiink/v11/oPWJ_kJmmu8hCvB9iFumxZSndj9XRg.ttf", + "colorCapabilities": [ + "COLRv1", + "SVG" + ] + }, + { + "family": "Reenie Beanie", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/reeniebeanie/v22/z7NSdR76eDkaJKZJFkkjuvWxbP2_qoOgf_w.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/reeniebeanie/v22/z7NSdR76eDkaJKZJFkkjuvWxXPy1rg.ttf" + }, + { + "family": "Reggae One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/reggaeone/v19/7r3DqX5msMIkeuwJwOJt_a5L5uH-mts.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/reggaeone/v19/7r3DqX5msMIkeuwJwOJtza9B4g.ttf" + }, + { + "family": "Rethink Sans", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqkmFRCE7mma-aua4.ttf", + "500": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqklNRCE7mma-aua4.ttf", + "600": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45Dmqkr9WCE7mma-aua4.ttf", + "700": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqkoZWCE7mma-aua4.ttf", + "800": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqkuFWCE7mma-aua4.ttf", + "italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kS4A3snY2fqa7iVQ.ttf", + "500italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kS0g3snY2fqa7iVQ.ttf", + "600italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kSPgrsnY2fqa7iVQ.ttf", + "700italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kSBwrsnY2fqa7iVQ.ttf", + "800italic": "https://fonts.gstatic.com/s/rethinksans/v7/AMOFz4SDuXOMCPfdoglY9JQEUUK5wyyTfpeth6kSYArsnY2fqa7iVQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rethinksans/v7/AMODz4SDuXOMCPfdoglY9JQuWHBGG0X45DmqkmFROE_snQ.ttf" + }, + { + "family": "Revalia", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/revalia/v24/WwkexPimBE2-4ZPEeVruNIgJSNM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/revalia/v24/WwkexPimBE2-4ZPESVvkMA.ttf" + }, + { + "family": "Rhodium Libre", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/rhodiumlibre/v21/1q2AY5adA0tn_ukeHcQHqpx6pETLeo2gm2U.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rhodiumlibre/v21/1q2AY5adA0tn_ukeHcQHqpx6lEXBfg.ttf" + }, + { + "family": "Ribeye", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/ribeye/v27/L0x8DFMxk1MP9R3RvPCmRSlUig.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ribeye/v27/L0x8DFMxk1MP9R3hvfqi.ttf" + }, + { + "family": "Ribeye Marrow", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/ribeyemarrow/v26/GFDsWApshnqMRO2JdtRZ2d0vEAwTVWgKdtw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ribeyemarrow/v26/GFDsWApshnqMRO2JdtRZ2d0vIA0ZUQ.ttf" + }, + { + "family": "Righteous", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/righteous/v18/1cXxaUPXBpj2rGoU7C9mj3uEicG01A.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/righteous/v18/1cXxaUPXBpj2rGoU7C9WjnGA.ttf" + }, + { + "family": "Risque", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/risque/v24/VdGfAZUfHosahXxoCUYVBJ-T5g.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/risque/v24/VdGfAZUfHosahXxYCEwR.ttf" + }, + { + "family": "Road Rage", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/roadrage/v9/6NUU8F2fKAOBKjjr4ekvtMYAwdRZfw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/roadrage/v9/6NUU8F2fKAOBKjjr4ekftcwE.ttf" + }, + { + "family": "Roboto", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v50", + "lastModified": "2025-11-18", + "files": { + "100": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbGmTggvWl0Qn.ttf", + "200": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZEbWmTggvWl0Qn.ttf", + "300": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabWmTggvWl0Qn.ttf", + "regular": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbWmTggvWl0Qn.ttf", + "500": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bWmTggvWl0Qn.ttf", + "600": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYaammTggvWl0Qn.ttf", + "700": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjammTggvWl0Qn.ttf", + "800": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZEammTggvWl0Qn.ttf", + "900": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZtammTggvWl0Qn.ttf", + "100italic": "https://fonts.gstatic.com/s/roboto/v50/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLoHRiA_0klQnx24.ttf", + "200italic": "https://fonts.gstatic.com/s/roboto/v50/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLgHQiA_0klQnx24.ttf", + "300italic": "https://fonts.gstatic.com/s/roboto/v50/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLt_QiA_0klQnx24.ttf", + "italic": "https://fonts.gstatic.com/s/roboto/v50/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLoHQiA_0klQnx24.ttf", + "500italic": "https://fonts.gstatic.com/s/roboto/v50/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLrPQiA_0klQnx24.ttf", + "600italic": "https://fonts.gstatic.com/s/roboto/v50/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLl_XiA_0klQnx24.ttf", + "700italic": "https://fonts.gstatic.com/s/roboto/v50/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLmbXiA_0klQnx24.ttf", + "800italic": "https://fonts.gstatic.com/s/roboto/v50/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLgHXiA_0klQnx24.ttf", + "900italic": "https://fonts.gstatic.com/s/roboto/v50/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLijXiA_0klQnx24.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmSiA8.ttf" + }, + { + "family": "Roboto Condensed", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v31", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyWyo_BJ731BKMSK.ttf", + "200": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyUyovBJ731BKMSK.ttf", + "300": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyXsovBJ731BKMSK.ttf", + "regular": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyWyovBJ731BKMSK.ttf", + "500": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyWAovBJ731BKMSK.ttf", + "600": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyVspfBJ731BKMSK.ttf", + "700": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyVVpfBJ731BKMSK.ttf", + "800": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyUypfBJ731BKMSK.ttf", + "900": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyUbpfBJ731BKMSK.ttf", + "100italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64RgL5XljLdSK37o.ttf", + "200italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64ZgK5XljLdSK37o.ttf", + "300italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64UYK5XljLdSK37o.ttf", + "italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64RgK5XljLdSK37o.ttf", + "500italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64SoK5XljLdSK37o.ttf", + "600italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64cYN5XljLdSK37o.ttf", + "700italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64f8N5XljLdSK37o.ttf", + "800italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64ZgN5XljLdSK37o.ttf", + "900italic": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVW2ZhZI2eCN5jzbjEETS9weq8-19ehAyvMum7nfDB64bEN5XljLdSK37o.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/robotocondensed/v31/ieVo2ZhZI2eCN5jzbjEETS9weq8-_d6T_POl0fRJeyWyosBI5Xk.ttf" + }, + { + "family": "Roboto Flex", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v30", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/robotoflex/v30/NaNnepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jZktqc2V3Zs0KvDLdBP8SBZtOs2IifRuUZQMsPJtUsR4DEK6cULNeUx9XgTnH37Ha_FIAp4Fm0PP1hw45DntW2x0wZGzhPmr1YNMYKYn9_1IQXGwJAiUJVUMdN5YUW4O8HtSoXjC1z3QSabshNFVe3e0O5j3ZjrZCu23Qd4G0EBysQNK-QKavMl1cKq3tHXtXi8mzLjaAQbGunCNCKMY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/robotoflex/v30/NaNnepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jZktqc2V3Zs0KvDLdBP8SBZtOs2IifRuUZQMsPJtUsR4DEK6cULNeUx9XgTnH37Ha_FIAp4Fm0PP1hw45DntW2x0wZGzhPmr1YNMYKYn9_1IQXGwJAiUJVUMdN5YUW4O8HtSoXjC1z3QSabshNFVe3e0O5j3ZjrZCu23Qd4G0EBysQNK-QKavMl1cKq3tHXtXi8mzLjaAcbCkmA.ttf" + }, + { + "family": "Roboto Mono", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v31", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vuPQ--5Ip2sSQ.ttf", + "200": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_XvqPQ--5Ip2sSQ.ttf", + "300": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_gPqPQ--5Ip2sSQ.ttf", + "regular": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vqPQ--5Ip2sSQ.ttf", + "500": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_7PqPQ--5Ip2sSQ.ttf", + "600": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_AP2PQ--5Ip2sSQ.ttf", + "700": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_Of2PQ--5Ip2sSQ.ttf", + "100italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAeW9AJi8SZwt.ttf", + "200italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrnnAOW9AJi8SZwt.ttf", + "300italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrk5AOW9AJi8SZwt.ttf", + "italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAOW9AJi8SZwt.ttf", + "500italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlVAOW9AJi8SZwt.ttf", + "600italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrm5B-W9AJi8SZwt.ttf", + "700italic": "https://fonts.gstatic.com/s/robotomono/v31/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrmAB-W9AJi8SZwt.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/robotomono/v31/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QuW9.ttf" + }, + { + "family": "Roboto Serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEliosp6d2Af5fR4k.ttf", + "200": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElqotp6d2Af5fR4k.ttf", + "300": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElnQtp6d2Af5fR4k.ttf", + "regular": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEliotp6d2Af5fR4k.ttf", + "500": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElhgtp6d2Af5fR4k.ttf", + "600": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElvQqp6d2Af5fR4k.ttf", + "700": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEls0qp6d2Af5fR4k.ttf", + "800": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcElqoqp6d2Af5fR4k.ttf", + "900": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEloMqp6d2Af5fR4k.ttf", + "100italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuT-V8BdxaV4nUFw.ttf", + "200italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-Juz-R8BdxaV4nUFw.ttf", + "300italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuEeR8BdxaV4nUFw.ttf", + "italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuT-R8BdxaV4nUFw.ttf", + "500italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JufeR8BdxaV4nUFw.ttf", + "600italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JukeN8BdxaV4nUFw.ttf", + "700italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuqON8BdxaV4nUFw.ttf", + "800italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-Juz-N8BdxaV4nUFw.ttf", + "900italic": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-Ju5uN8BdxaV4nUFw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEliotl6Z8BQ.ttf" + }, + { + "family": "Roboto Slab", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v36", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjojIWWaG5iddG-1A.ttf", + "200": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoDISWaG5iddG-1A.ttf", + "300": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjo0oSWaG5iddG-1A.ttf", + "regular": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjojISWaG5iddG-1A.ttf", + "500": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjovoSWaG5iddG-1A.ttf", + "600": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoUoOWaG5iddG-1A.ttf", + "700": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoa4OWaG5iddG-1A.ttf", + "800": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoDIOWaG5iddG-1A.ttf", + "900": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoJYOWaG5iddG-1A.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/robotoslab/v36/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjojISmaWRm.ttf" + }, + { + "family": "Rochester", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/rochester/v24/6ae-4KCqVa4Zy6Fif-Uy31vWNTMwoQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rochester/v24/6ae-4KCqVa4Zy6Fif-UC3lHS.ttf" + }, + { + "family": "Rock 3D", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin" + ], + "version": "v13", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/rock3d/v13/yYLp0hrL0PCo651513SnwRnQyNI.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rock3d/v13/yYLp0hrL0PCo651553WtxQ.ttf" + }, + { + "family": "Rock Salt", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/rocksalt/v24/MwQ0bhv11fWD6QsAVOZbsEk7hbBWrA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rocksalt/v24/MwQ0bhv11fWD6QsAVOZrsUM_.ttf" + }, + { + "family": "RocknRoll One", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/rocknrollone/v16/kmK7ZqspGAfCeUiW6FFlmEC9guVhs7tfUxc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rocknrollone/v16/kmK7ZqspGAfCeUiW6FFlmEC9suRrtw.ttf" + }, + { + "family": "Rokkitt", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v39", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1rydpDLE76HvN6n.ttf", + "200": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1pyd5DLE76HvN6n.ttf", + "300": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1qsd5DLE76HvN6n.ttf", + "regular": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1ryd5DLE76HvN6n.ttf", + "500": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1rAd5DLE76HvN6n.ttf", + "600": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1oscJDLE76HvN6n.ttf", + "700": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1oVcJDLE76HvN6n.ttf", + "800": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1pycJDLE76HvN6n.ttf", + "900": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1pbcJDLE76HvN6n.ttf", + "100italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NHiJGbqluc6nu9E.ttf", + "200italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NPiIGbqluc6nu9E.ttf", + "300italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NCaIGbqluc6nu9E.ttf", + "italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NHiIGbqluc6nu9E.ttf", + "500italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NEqIGbqluc6nu9E.ttf", + "600italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NKaPGbqluc6nu9E.ttf", + "700italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NJ-PGbqluc6nu9E.ttf", + "800italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NPiPGbqluc6nu9E.ttf", + "900italic": "https://fonts.gstatic.com/s/rokkitt/v39/qFdV35qfgYFjGy5hkEOYeNY-EoKzjE86NNGPGbqluc6nu9E.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rokkitt/v39/qFdb35qfgYFjGy5hukqqhw5XeRgdi1ryd6DKGbo.ttf" + }, + { + "family": "Romanesco", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/romanesco/v22/w8gYH2ozQOY7_r_J7mSn3HwLqOqSBg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/romanesco/v22/w8gYH2ozQOY7_r_J7mSX3XYP.ttf" + }, + { + "family": "Ropa Sans", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/ropasans/v16/EYqxmaNOzLlWtsZSScyKWjloU5KP2g.ttf", + "italic": "https://fonts.gstatic.com/s/ropasans/v16/EYq3maNOzLlWtsZSScy6WDNscZef2mNE.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ropasans/v16/EYqxmaNOzLlWtsZSScy6WzNs.ttf" + }, + { + "family": "Rosario", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v35", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM69GCWczd-YnOzUD.ttf", + "regular": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM68YCWczd-YnOzUD.ttf", + "500": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM68qCWczd-YnOzUD.ttf", + "600": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM6_GDmczd-YnOzUD.ttf", + "700": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM6__Dmczd-YnOzUD.ttf", + "300italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQStFwfeIFPiUDn08.ttf", + "italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQSo9wfeIFPiUDn08.ttf", + "500italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQSr1wfeIFPiUDn08.ttf", + "600italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQSlF3feIFPiUDn08.ttf", + "700italic": "https://fonts.gstatic.com/s/rosario/v35/xfug0WDhWW_fOEoY2Fbnww42bCJhNLrQSmh3feIFPiUDn08.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rosario/v35/xfuu0WDhWW_fOEoY8l_VPNZfB7jPM68YCVcyfeI.ttf" + }, + { + "family": "Rosarivo", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/rosarivo/v24/PlI-Fl2lO6N9f8HaNAeC2nhMnNy5.ttf", + "italic": "https://fonts.gstatic.com/s/rosarivo/v24/PlI4Fl2lO6N9f8HaNDeA0Hxumcy5ZX8.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rosarivo/v24/PlI-Fl2lO6N9f8HaNDeD0Hw.ttf" + }, + { + "family": "Rouge Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/rougescript/v20/LYjFdGbiklMoCIQOw1Ep3S4PVPXbUJWq9g.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rougescript/v20/LYjFdGbiklMoCIQOw1Ep3S4_Vf_f.ttf" + }, + { + "family": "Rowdies", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/rowdies/v19/ptRMTieMYPNBAK219hth5O7yKQNute8.ttf", + "regular": "https://fonts.gstatic.com/s/rowdies/v19/ptRJTieMYPNBAK21zrdJwObZNQo.ttf", + "700": "https://fonts.gstatic.com/s/rowdies/v19/ptRMTieMYPNBAK219gtm5O7yKQNute8.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rowdies/v19/ptRJTieMYPNBAK21_rZDxA.ttf" + }, + { + "family": "Rozha One", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/rozhaone/v17/AlZy_zVFtYP12Zncg2khdXf4XB0Tow.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rozhaone/v17/AlZy_zVFtYP12Zncg2kRdH38.ttf" + }, + { + "family": "Rubik", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "arabic", + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v31", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-WYi1UE80V4bVkA.ttf", + "regular": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-B4i1UE80V4bVkA.ttf", + "500": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-NYi1UE80V4bVkA.ttf", + "600": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-2Y-1UE80V4bVkA.ttf", + "700": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-4I-1UE80V4bVkA.ttf", + "800": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-h4-1UE80V4bVkA.ttf", + "900": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-ro-1UE80V4bVkA.ttf", + "300italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8sDE0UwdYPFkJ1O.ttf", + "italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8tdE0UwdYPFkJ1O.ttf", + "500italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8tvE0UwdYPFkJ1O.ttf", + "600italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8uDFEUwdYPFkJ1O.ttf", + "700italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8u6FEUwdYPFkJ1O.ttf", + "800italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8vdFEUwdYPFkJ1O.ttf", + "900italic": "https://fonts.gstatic.com/s/rubik/v31/iJWbBXyIfDnIV7nEt3KSJbVDV49rz8v0FEUwdYPFkJ1O.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubik/v31/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-B4iFUUUw.ttf" + }, + { + "family": "Rubik 80s Fade", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubik80sfade/v2/U9MF6dW37nLSmnwZXyoV-uPXUhHwkbL8IHcK.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubik80sfade/v2/U9MF6dW37nLSmnwZXyoV-uPXUiHxm7Y.ttf" + }, + { + "family": "Rubik Beastly", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikbeastly/v11/0QImMXRd5oOmSC2ZQ7o9653X07z8_ApHqqk.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikbeastly/v11/0QImMXRd5oOmSC2ZQ7o9653X4732-A.ttf" + }, + { + "family": "Rubik Broken Fax", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikbrokenfax/v1/NGSvv4rXG042O-GzH9sg1cUgl8w8YW-WdmGi300.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikbrokenfax/v1/NGSvv4rXG042O-GzH9sg1cUgl8w8UW6ccg.ttf" + }, + { + "family": "Rubik Bubbles", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikbubbles/v3/JIA1UVdwbHFJtwA7Us1BPFbRNTENfDxyRXI.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikbubbles/v3/JIA1UVdwbHFJtwA7Us1BPFbRBTAHeA.ttf" + }, + { + "family": "Rubik Burned", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikburned/v1/Jqzk5TmOVOqQHihKqPpscqniHQuaCY5ZSg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikburned/v1/Jqzk5TmOVOqQHihKqPpscqnSHAGe.ttf" + }, + { + "family": "Rubik Dirt", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikdirt/v2/DtVmJxC7WLEj1uIXEWAdulwm6gDXvwE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikdirt/v2/DtVmJxC7WLEj1uIXEWAdil0s7g.ttf" + }, + { + "family": "Rubik Distressed", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikdistressed/v1/GFDxWBdsmnqAVqjtUsZf2dcrQ2ldcWAhatVBaGM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikdistressed/v1/GFDxWBdsmnqAVqjtUsZf2dcrQ2ldQWErbg.ttf" + }, + { + "family": "Rubik Doodle Shadow", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikdoodleshadow/v1/rP2bp3im_k8G_wTVdvvMdHqmXTR3lEaLyKuZ3KOY7Gw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikdoodleshadow/v1/rP2bp3im_k8G_wTVdvvMdHqmXTR3lEaL-KqT2A.ttf" + }, + { + "family": "Rubik Doodle Triangles", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikdoodletriangles/v1/esDA301BLOmMKxKspb3g-domRuLPeaSn2bTzdLi_slZxgWE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikdoodletriangles/v1/esDA301BLOmMKxKspb3g-domRuLPeaSn2bTzRLm1tg.ttf" + }, + { + "family": "Rubik Gemstones", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikgemstones/v1/zrf90HrL0-_8Xb4DFM2rUkWbOVrOiCnGqi1GMw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikgemstones/v1/zrf90HrL0-_8Xb4DFM2rUkWbOVr-iSPC.ttf" + }, + { + "family": "Rubik Glitch", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikglitch/v2/qkBSXv8b_srFRYQVYrDKh9ZvmC7HONiSFQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikglitch/v2/qkBSXv8b_srFRYQVYrDKh9ZfmSTD.ttf" + }, + { + "family": "Rubik Glitch Pop", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikglitchpop/v1/tDbX2pGHhFcM0gB3hN2elZLa3G-MOwStSUrV_BE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikglitchpop/v1/tDbX2pGHhFcM0gB3hN2elZLa3G-MCwWnTQ.ttf" + }, + { + "family": "Rubik Iso", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikiso/v2/x3dickHUfr-S4VAI4sABfPACvy_1BA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikiso/v2/x3dickHUfr-S4VAI4sAxffoG.ttf" + }, + { + "family": "Rubik Lines", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubiklines/v1/_gP81R3vsjYzVW2Y6xFF-GSxYPp7oSNy.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubiklines/v1/_gP81R3vsjYzVW2Y6xFF-FSwav4.ttf" + }, + { + "family": "Rubik Maps", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikmaps/v1/Gw6_wcjl80TZK9XxtbbejSYUChRqp9k.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikmaps/v1/Gw6_wcjl80TZK9XxtbbevSceDg.ttf" + }, + { + "family": "Rubik Marker Hatch", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikmarkerhatch/v1/QldTNSFQsh0B_bFXXWv6LAt-jswapJHQDL4iw0H6zw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikmarkerhatch/v1/QldTNSFQsh0B_bFXXWv6LAt-jswapJHgDbQm.ttf" + }, + { + "family": "Rubik Maze", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikmaze/v2/xMQRuF9ZVa2ftiJEavXSAX7inS-bxV4.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikmaze/v2/xMQRuF9ZVa2ftiJEavXSMX_omQ.ttf" + }, + { + "family": "Rubik Microbe", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikmicrobe/v2/UqyWK8oPP3hjw6ANS9rM3PsZcs8aaKgiauE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikmicrobe/v2/UqyWK8oPP3hjw6ANS9rM3PsZQs4QbA.ttf" + }, + { + "family": "Rubik Mono One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikmonoone/v20/UqyJK8kPP3hjw6ANTdfRk9YSN-8wRqQrc_j9.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikmonoone/v20/UqyJK8kPP3hjw6ANTdfRk9YSN98xTKA.ttf" + }, + { + "family": "Rubik Moonrocks", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikmoonrocks/v7/845ANMAmAI2VUZMLu_W0M7HqlDHnXcD7JGy1Sw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikmoonrocks/v7/845ANMAmAI2VUZMLu_W0M7HqlDHXXMr_.ttf" + }, + { + "family": "Rubik Pixels", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikpixels/v3/SlGXmQOaupkIeSx4CEpB7AdSaBYRagrQrA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikpixels/v3/SlGXmQOaupkIeSx4CEpB7AdiaRwV.ttf" + }, + { + "family": "Rubik Puddles", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikpuddles/v2/1Ptog8bYX_qGnkLkrU5MJsQcJfC0wVMT-aE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikpuddles/v2/1Ptog8bYX_qGnkLkrU5MJsQcFfG-xQ.ttf" + }, + { + "family": "Rubik Scribble", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikscribble/v1/snfzs0Cp48d67SuHQOpjXLsQpbqbSjORSo9W.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikscribble/v1/snfzs0Cp48d67SuHQOpjXLsQpYqaQDc.ttf" + }, + { + "family": "Rubik Spray Paint", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikspraypaint/v1/WnzhHBAoeBPUDTB4EWR82y6EXWPH-Ro-QoaBZQxP.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikspraypaint/v1/WnzhHBAoeBPUDTB4EWR82y6EXWPH-So_SII.ttf" + }, + { + "family": "Rubik Storm", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikstorm/v1/eLGYP-_uPgO5Ag7ju9JaouL9T2Xh9NQk.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikstorm/v1/eLGYP-_uPgO5Ag7ju9JaotL8RWE.ttf" + }, + { + "family": "Rubik Vinyl", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikvinyl/v1/iJWABXKIfDnIV4mQ5BfjvUXexox2ztOU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikvinyl/v1/iJWABXKIfDnIV4mQ5BfjvXXfzIg.ttf" + }, + { + "family": "Rubik Wet Paint", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "hebrew", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/rubikwetpaint/v2/HTx0L20uMDGHgdULcpTF3Oe4d_-F-zz313DuvQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rubikwetpaint/v2/HTx0L20uMDGHgdULcpTF3Oe4d_-1-jbz.ttf" + }, + { + "family": "Ruda", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v30", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaJFsi_-2KiSGg-H.ttf", + "500": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaJ3si_-2KiSGg-H.ttf", + "600": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaKbtS_-2KiSGg-H.ttf", + "700": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaKitS_-2KiSGg-H.ttf", + "800": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaLFtS_-2KiSGg-H.ttf", + "900": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaLstS_-2KiSGg-H.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ruda/v30/k3kKo8YQJOpFgHQ1mQ5VkEbUKaJFsh__0qw.ttf" + }, + { + "family": "Rufina", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/rufina/v17/Yq6V-LyURyLy-aKyoxRktOdClg.ttf", + "700": "https://fonts.gstatic.com/s/rufina/v17/Yq6W-LyURyLy-aKKHztAvMxenxE0SA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rufina/v17/Yq6V-LyURyLy-aKCoh5g.ttf" + }, + { + "family": "Ruge Boogie", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/rugeboogie/v30/JIA3UVFwbHRF_GIWSMhKNROiPzUveSxy.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rugeboogie/v30/JIA3UVFwbHRF_GIWSMhKNSOjNTE.ttf" + }, + { + "family": "Ruluko", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/ruluko/v22/xMQVuFNZVaODtm0pC6WzKX_QmA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ruluko/v22/xMQVuFNZVaODtm0ZCq-3.ttf" + }, + { + "family": "Rum Raisin", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/rumraisin/v24/nwpRtKu3Ih8D5avB4h2uJ3-IywA7eMM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rumraisin/v24/nwpRtKu3Ih8D5avB4h2uF36Czw.ttf" + }, + { + "family": "Ruslan Display", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v27", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/ruslandisplay/v27/Gw6jwczl81XcIZuckK_e3UpfdzxrldyFvm1n.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ruslandisplay/v27/Gw6jwczl81XcIZuckK_e3Upfdwxqn9g.ttf" + }, + { + "family": "Russo One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/russoone/v18/Z9XUDmZRWg6M1LvRYsH-yMOInrib9Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/russoone/v18/Z9XUDmZRWg6M1LvRYsHOycmM.ttf" + }, + { + "family": "Ruthie", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v28", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/ruthie/v28/gokvH63sGkdqXuU9lD53Q2u_mQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ruthie/v28/gokvH63sGkdqXuUNlTRz.ttf" + }, + { + "family": "Ruwudu", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/ruwudu/v4/syky-y1tj6UzRKfNlQCT9tPdpw.ttf", + "500": "https://fonts.gstatic.com/s/ruwudu/v4/sykx-y1tj6UzRKf1YSm3_vjBrlSILg.ttf", + "600": "https://fonts.gstatic.com/s/ruwudu/v4/sykx-y1tj6UzRKf1TS63_vjBrlSILg.ttf", + "700": "https://fonts.gstatic.com/s/ruwudu/v4/sykx-y1tj6UzRKf1KS-3_vjBrlSILg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ruwudu/v4/syky-y1tj6UzRKf9lAqX.ttf" + }, + { + "family": "Rye", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/rye/v17/r05XGLJT86YDFpTsXOqx4w.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/rye/v17/r05XGLJT86YzF57o.ttf" + }, + { + "family": "STIX Two Text", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5Yihg2SOYWxFMN1WD.ttf", + "500": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5YihS2SOYWxFMN1WD.ttf", + "600": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5Yii-3iOYWxFMN1WD.ttf", + "700": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5YiiH3iOYWxFMN1WD.ttf", + "italic": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Er02F12Xkf5whdwKf11l0p7uWhf8lJUzXZT2omsvbURVuMkWDmSo.ttf", + "500italic": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Er02F12Xkf5whdwKf11l0p7uWhf8lJUzXZT2omvnbURVuMkWDmSo.ttf", + "600italic": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Er02F12Xkf5whdwKf11l0p7uWhf8lJUzXZT2omhXcURVuMkWDmSo.ttf", + "700italic": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Er02F12Xkf5whdwKf11l0p7uWhf8lJUzXZT2omizcURVuMkWDmSo.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stixtwotext/v18/YA9Gr02F12Xkf5whdwKf11l0jbKkeidMTtZ5Yihg2ROZURU.ttf" + }, + { + "family": "SUSE", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-18", + "files": { + "100": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbGG71q9ZnJSZtQG.ttf", + "200": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbEG7lq9ZnJSZtQG.ttf", + "300": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbHY7lq9ZnJSZtQG.ttf", + "regular": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbGG7lq9ZnJSZtQG.ttf", + "500": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbG07lq9ZnJSZtQG.ttf", + "600": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbFY6Vq9ZnJSZtQG.ttf", + "700": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbFh6Vq9ZnJSZtQG.ttf", + "800": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbEG6Vq9ZnJSZtQG.ttf", + "900": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbEv6Vq9ZnJSZtQG.ttf", + "100italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrbL_bHZwY8QGjKU.ttf", + "200italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrTL-bHZwY8QGjKU.ttf", + "300italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrez-bHZwY8QGjKU.ttf", + "italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrbL-bHZwY8QGjKU.ttf", + "500italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrYD-bHZwY8QGjKU.ttf", + "600italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrWz5bHZwY8QGjKU.ttf", + "700italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrVX5bHZwY8QGjKU.ttf", + "800italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrTL5bHZwY8QGjKU.ttf", + "900italic": "https://fonts.gstatic.com/s/suse/v4/MwQqbhb078Wt2VpbM5qPYP6EiqROrRv5bHZwY8QGjKU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/suse/v4/MwQsbhb078Wt81NpzELmC2QqjbGG7mq8bHY.ttf" + }, + { + "family": "SUSE Mono", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v1", + "lastModified": "2025-09-18", + "files": { + "100": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB656x2gtcobW_gE0.ttf", + "200": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB6x6w2gtcobW_gE0.ttf", + "300": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB68Cw2gtcobW_gE0.ttf", + "regular": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB656w2gtcobW_gE0.ttf", + "500": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB66yw2gtcobW_gE0.ttf", + "600": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB60C32gtcobW_gE0.ttf", + "700": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB63m32gtcobW_gE0.ttf", + "800": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB6x632gtcobW_gE0.ttf", + "100italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzMklWpZe6kE2tPw.ttf", + "200italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzskhWpZe6kE2tPw.ttf", + "300italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzbEhWpZe6kE2tPw.ttf", + "italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzMkhWpZe6kE2tPw.ttf", + "500italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzAEhWpZe6kE2tPw.ttf", + "600italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbz7E9WpZe6kE2tPw.ttf", + "700italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbz1U9WpZe6kE2tPw.ttf", + "800italic": "https://fonts.gstatic.com/s/susemono/v1/y83IW4wN6yi9x2mTxJIcJgvKEIs6kUtG_lbzsk9WpZe6kE2tPw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/susemono/v1/y83KW4wN6yi9x2mTxJI2Lzk1yOJRC-VB656w6gpWpQ.ttf" + }, + { + "family": "Sacramento", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/sacramento/v17/buEzpo6gcdjy0EiZMBUG0CoV_NxLeiw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sacramento/v17/buEzpo6gcdjy0EiZMBUG4Csf-A.ttf" + }, + { + "family": "Sahitya", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/sahitya/v20/6qLAKZkOuhnuqlJAaScFPywEDnI.ttf", + "700": "https://fonts.gstatic.com/s/sahitya/v20/6qLFKZkOuhnuqlJAUZsqGyQvEnvSexI.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sahitya/v20/6qLAKZkOuhnuqlJAWSYPOw.ttf" + }, + { + "family": "Sail", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/sail/v17/DPEjYwiBxwYJFBTDADYAbvw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sail/v17/DPEjYwiBxwYJJBXJBA.ttf" + }, + { + "family": "Saira", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-11-18", + "files": { + "100": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA71rDosg7lwYmUVY.ttf", + "200": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA79rCosg7lwYmUVY.ttf", + "300": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA7wTCosg7lwYmUVY.ttf", + "regular": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA71rCosg7lwYmUVY.ttf", + "500": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA72jCosg7lwYmUVY.ttf", + "600": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA74TFosg7lwYmUVY.ttf", + "700": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA773Fosg7lwYmUVY.ttf", + "800": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA79rFosg7lwYmUVY.ttf", + "900": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA7_PFosg7lwYmUVY.ttf", + "100italic": "https://fonts.gstatic.com/s/saira/v23/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBSooxkyQjQVYmxA.ttf", + "200italic": "https://fonts.gstatic.com/s/saira/v23/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKByosxkyQjQVYmxA.ttf", + "300italic": "https://fonts.gstatic.com/s/saira/v23/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBFIsxkyQjQVYmxA.ttf", + "italic": "https://fonts.gstatic.com/s/saira/v23/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBSosxkyQjQVYmxA.ttf", + "500italic": "https://fonts.gstatic.com/s/saira/v23/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBeIsxkyQjQVYmxA.ttf", + "600italic": "https://fonts.gstatic.com/s/saira/v23/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBlIwxkyQjQVYmxA.ttf", + "700italic": "https://fonts.gstatic.com/s/saira/v23/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKBrYwxkyQjQVYmxA.ttf", + "800italic": "https://fonts.gstatic.com/s/saira/v23/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKByowxkyQjQVYmxA.ttf", + "900italic": "https://fonts.gstatic.com/s/saira/v23/memUYa2wxmKQyNkiV50dulWP7s95AqZTzZHcVdxWI9WH-pKB44wxkyQjQVYmxA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/saira/v23/memWYa2wxmKQyPMrZX79wwYZQMhsyuShhKMjjbU9uXuA71rCkskxkw.ttf" + }, + { + "family": "Saira Condensed", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRMQgErUN8XuHNEtX81i9TmEkrnwetA2omSrzS8.ttf", + "200": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnbcpg8Keepi2lHw.ttf", + "300": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnCclg8Keepi2lHw.ttf", + "regular": "https://fonts.gstatic.com/s/sairacondensed/v12/EJROQgErUN8XuHNEtX81i9TmEkrfpeFE-IyCrw.ttf", + "500": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnUchg8Keepi2lHw.ttf", + "600": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnfc9g8Keepi2lHw.ttf", + "700": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnGc5g8Keepi2lHw.ttf", + "800": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnBc1g8Keepi2lHw.ttf", + "900": "https://fonts.gstatic.com/s/sairacondensed/v12/EJRLQgErUN8XuHNEtX81i9TmEkrnIcxg8Keepi2lHw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sairacondensed/v12/EJROQgErUN8XuHNEtX81i9TmEkrvpOtA.ttf" + }, + { + "family": "Saira Extra Condensed", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFsOHYr-vcC7h8MklGBkrvmUG9rbpkisrTri0jx9i5ss3a3.ttf", + "200": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrJ2nR3ABgum-uoQ.ttf", + "300": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrQ2rR3ABgum-uoQ.ttf", + "regular": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFiOHYr-vcC7h8MklGBkrvmUG9rbpkisrTT70L11Ct8sw.ttf", + "500": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrG2vR3ABgum-uoQ.ttf", + "600": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrN2zR3ABgum-uoQ.ttf", + "700": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrU23R3ABgum-uoQ.ttf", + "800": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTrT27R3ABgum-uoQ.ttf", + "900": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFvOHYr-vcC7h8MklGBkrvmUG9rbpkisrTra2_R3ABgum-uoQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sairaextracondensed/v15/-nFiOHYr-vcC7h8MklGBkrvmUG9rbpkisrTj7kjx.ttf" + }, + { + "family": "Saira Semi Condensed", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MN6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXdvaOM8rXT-8V8.ttf", + "200": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXfDScMWg3j36Ebz.ttf", + "300": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXenSsMWg3j36Ebz.ttf", + "regular": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MD6c-2-nnJkHxyCjRcnMHcWVWV1cWRRU8LYuceqGT-.ttf", + "500": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXf_S8MWg3j36Ebz.ttf", + "600": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXfTTMMWg3j36Ebz.ttf", + "700": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXe3TcMWg3j36Ebz.ttf", + "800": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXerTsMWg3j36Ebz.ttf", + "900": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MM6c-2-nnJkHxyCjRcnMHcWVWV1cWRRXePT8MWg3j36Ebz.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sairasemicondensed/v15/U9MD6c-2-nnJkHxyCjRcnMHcWVWV1cWRRX8KaOM.ttf" + }, + { + "family": "Saira Stencil One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/sairastencilone/v18/SLXSc03I6HkvZGJ1GvvipLoYSTEL9AsMawif2YQ2.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sairastencilone/v18/SLXSc03I6HkvZGJ1GvvipLoYSTEL9DsNYQw.ttf" + }, + { + "family": "Salsa", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/salsa/v23/gNMKW3FiRpKj-imY8ncKEZez.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/salsa/v23/gNMKW3FiRpKj-hmZ-HM.ttf" + }, + { + "family": "Sanchez", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/sanchez/v17/Ycm2sZJORluHnXbITm5b_BwE1l0.ttf", + "italic": "https://fonts.gstatic.com/s/sanchez/v17/Ycm0sZJORluHnXbIfmxR-D4Bxl3gkw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sanchez/v17/Ycm2sZJORluHnXbIfm9R-A.ttf" + }, + { + "family": "Sancreek", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sancreek/v27/pxiHypAnsdxUm159X7D-XV9NEe-K.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sancreek/v27/pxiHypAnsdxUm159X4D_V1s.ttf" + }, + { + "family": "Sankofa Display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/sankofadisplay/v2/Ktk1ALSRd4LucUDghJ2rTqXOoh33F6mZVY9Y5w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sankofadisplay/v2/Ktk1ALSRd4LucUDghJ2rTqXOoh3HFqOd.ttf" + }, + { + "family": "Sansation", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "greek", + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-04-23", + "files": { + "300": "https://fonts.gstatic.com/s/sansation/v1/LYjFdGPjnEg8DNA0z01YAVgPVPXbUJWq9g.ttf", + "300italic": "https://fonts.gstatic.com/s/sansation/v1/LYjbdGPjnEg8DNA0z01Qr0KDVv_fcpC69i6N.ttf", + "regular": "https://fonts.gstatic.com/s/sansation/v1/LYjAdGPjnEg8DNA0z01grXArXN7HWQ.ttf", + "italic": "https://fonts.gstatic.com/s/sansation/v1/LYjGdGPjnEg8DNA0z01Qr3ovftvXWYyz.ttf", + "700": "https://fonts.gstatic.com/s/sansation/v1/LYjFdGPjnEg8DNA0z01YEV8PVPXbUJWq9g.ttf", + "700italic": "https://fonts.gstatic.com/s/sansation/v1/LYjbdGPjnEg8DNA0z01Qr0KTUf_fcpC69i6N.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sansation/v1/LYjAdGPjnEg8DNA0z01QrHov.ttf" + }, + { + "family": "Sansita", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/sansita/v12/QldONTRRphEb_-V7HBm7TXFf3qw.ttf", + "italic": "https://fonts.gstatic.com/s/sansita/v12/QldMNTRRphEb_-V7LBuxSVNazqx2xg.ttf", + "700": "https://fonts.gstatic.com/s/sansita/v12/QldLNTRRphEb_-V7JKWUaXl0wqVv3_g.ttf", + "700italic": "https://fonts.gstatic.com/s/sansita/v12/QldJNTRRphEb_-V7LBuJ9Xx-xodqz_joDQ.ttf", + "800": "https://fonts.gstatic.com/s/sansita/v12/QldLNTRRphEb_-V7JLmXaXl0wqVv3_g.ttf", + "800italic": "https://fonts.gstatic.com/s/sansita/v12/QldJNTRRphEb_-V7LBuJ6X9-xodqz_joDQ.ttf", + "900": "https://fonts.gstatic.com/s/sansita/v12/QldLNTRRphEb_-V7JJ2WaXl0wqVv3_g.ttf", + "900italic": "https://fonts.gstatic.com/s/sansita/v12/QldJNTRRphEb_-V7LBuJzX5-xodqz_joDQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sansita/v12/QldONTRRphEb_-V7LBixSQ.ttf" + }, + { + "family": "Sansita Swashed", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW-ppbToVehmEa4Q.ttf", + "regular": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW7RpbToVehmEa4Q.ttf", + "500": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW4ZpbToVehmEa4Q.ttf", + "600": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW2pubToVehmEa4Q.ttf", + "700": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW1NubToVehmEa4Q.ttf", + "800": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSWzRubToVehmEa4Q.ttf", + "900": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSWx1ubToVehmEa4Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sansitaswashed/v23/BXR8vFfZifTZgFlDDLgNkBydPKTt3pVCeYWqJnZSW7RpXTsffg.ttf" + }, + { + "family": "Sarabun", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/sarabun/v17/DtVhJx26TKEr37c9YHZJmnYI5gnOpg.ttf", + "100italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVnJx26TKEr37c9aBBx_nwMxAzephhN.ttf", + "200": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YNpoulwm6gDXvwE.ttf", + "200italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxUl0s7iLSrwFUlw.ttf", + "300": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YL5rulwm6gDXvwE.ttf", + "300italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxNl4s7iLSrwFUlw.ttf", + "regular": "https://fonts.gstatic.com/s/sarabun/v17/DtVjJx26TKEr37c9WBJDnlQN9gk.ttf", + "italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVhJx26TKEr37c9aBBJmnYI5gnOpg.ttf", + "500": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YOZqulwm6gDXvwE.ttf", + "500italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxbl8s7iLSrwFUlw.ttf", + "600": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YMptulwm6gDXvwE.ttf", + "600italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxQlgs7iLSrwFUlw.ttf", + "700": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YK5sulwm6gDXvwE.ttf", + "700italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxJlks7iLSrwFUlw.ttf", + "800": "https://fonts.gstatic.com/s/sarabun/v17/DtVmJx26TKEr37c9YLJvulwm6gDXvwE.ttf", + "800italic": "https://fonts.gstatic.com/s/sarabun/v17/DtVkJx26TKEr37c9aBBxOlos7iLSrwFUlw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sarabun/v17/DtVjJx26TKEr37c9aBNJmg.ttf" + }, + { + "family": "Sarala", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/sarala/v14/uK_y4riEZv4o1w9RCh0TMv6EXw.ttf", + "700": "https://fonts.gstatic.com/s/sarala/v14/uK_x4riEZv4o1w9ptjI3OtWYVkMpXA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sarala/v14/uK_y4riEZv4o1w9hCxcX.ttf" + }, + { + "family": "Sarina", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sarina/v25/-F6wfjF3ITQwasLhLkDUriBQxw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sarina/v25/-F6wfjF3ITQwasLRL0rQ.ttf" + }, + { + "family": "Sarpanch", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sarpanch/v15/hESy6Xt4NCpRuk6Pzh2ARIrX_20n.ttf", + "500": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziV0ba7f1HEuRHkM.ttf", + "600": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziVYaq7f1HEuRHkM.ttf", + "700": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziU8a67f1HEuRHkM.ttf", + "800": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziUgaK7f1HEuRHkM.ttf", + "900": "https://fonts.gstatic.com/s/sarpanch/v15/hES16Xt4NCpRuk6PziUEaa7f1HEuRHkM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sarpanch/v15/hESy6Xt4NCpRuk6Pzi2BTo4.ttf" + }, + { + "family": "Sassy Frass", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sassyfrass/v9/LhWhMVrGOe0FLb97BjhsE99dGNWQg_am.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sassyfrass/v9/LhWhMVrGOe0FLb97BjhsE-9cEtE.ttf" + }, + { + "family": "Satisfy", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/satisfy/v22/rP2Hp2yn6lkG50LoOZSCHBeHFl0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/satisfy/v22/rP2Hp2yn6lkG50LoCZWIGA.ttf" + }, + { + "family": "Savate", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJTdxRbgJdhapcUU.ttf", + "300": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJelxRbgJdhapcUU.ttf", + "regular": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJbdxRbgJdhapcUU.ttf", + "500": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJYVxRbgJdhapcUU.ttf", + "600": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJWl2RbgJdhapcUU.ttf", + "700": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJVB2RbgJdhapcUU.ttf", + "800": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJTd2RbgJdhapcUU.ttf", + "900": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJR52RbgJdhapcUU.ttf", + "200italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yLfsDcjSsYUVUjg.ttf", + "300italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8y8_sDcjSsYUVUjg.ttf", + "italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yrfsDcjSsYUVUjg.ttf", + "500italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yn_sDcjSsYUVUjg.ttf", + "600italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yc_wDcjSsYUVUjg.ttf", + "700italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8ySvwDcjSsYUVUjg.ttf", + "800italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yLfwDcjSsYUVUjg.ttf", + "900italic": "https://fonts.gstatic.com/s/savate/v5/QdVISTgjKAqpnvJnNqjvsfWwDtc3MH8yBPwDcjSsYUVUjg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/savate/v5/QdVKSTgjKAqpnvJNP5oQaZzblHkwJbdxdbkDcg.ttf" + }, + { + "family": "Sawarabi Gothic", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/sawarabigothic/v16/x3d4ckfVaqqa-BEj-I9mE65u3k3NBSk3E2YljQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sawarabigothic/v16/x3d4ckfVaqqa-BEj-I9mE65u3k39BCMz.ttf" + }, + { + "family": "Sawarabi Mincho", + "variants": [ + "regular" + ], + "subsets": [ + "braille", + "japanese", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/sawarabimincho/v20/8QIRdiDaitzr7brc8ahpxt6GcIJTLahP46UDUw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sawarabimincho/v20/8QIRdiDaitzr7brc8ahpxt6GcIJjLKJL.ttf" + }, + { + "family": "Scada", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/scada/v16/RLpxK5Pv5qumeWJoxzUobkvv.ttf", + "italic": "https://fonts.gstatic.com/s/scada/v16/RLp_K5Pv5qumeVJqzTEKa1vvffg.ttf", + "700": "https://fonts.gstatic.com/s/scada/v16/RLp8K5Pv5qumeVrU6BEgRVfmZOE5.ttf", + "700italic": "https://fonts.gstatic.com/s/scada/v16/RLp6K5Pv5qumeVJq9Y0lT1PEYfE5p6g.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/scada/v16/RLpxK5Pv5qumeVJpzTE.ttf" + }, + { + "family": "Scheherazade New", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaZrFhTvxVnHDvUkUiHg8jprP4DCwNsOl4p5Is.ttf", + "500": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaerFhTvxVnHDvUkUiHg8jprP4DM_dFHlYC-IKnoSE.ttf", + "600": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaerFhTvxVnHDvUkUiHg8jprP4DM9tCHlYC-IKnoSE.ttf", + "700": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaerFhTvxVnHDvUkUiHg8jprP4DM79DHlYC-IKnoSE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/scheherazadenew/v20/4UaZrFhTvxVnHDvUkUiHg8jprP4DOwJmPg.ttf" + }, + { + "family": "Schibsted Grotesk", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNIsEAT8JuXFGVOQ.ttf", + "500": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNEMEAT8JuXFGVOQ.ttf", + "600": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMN_MYAT8JuXFGVOQ.ttf", + "700": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNxcYAT8JuXFGVOQ.ttf", + "800": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNosYAT8JuXFGVOQ.ttf", + "900": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNi8YAT8JuXFGVOQ.ttf", + "italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oLoDMhqflSFOTXs.ttf", + "500italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oLaDMhqflSFOTXs.ttf", + "600italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oI2C8hqflSFOTXs.ttf", + "700italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oIPC8hqflSFOTXs.ttf", + "800italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oJoC8hqflSFOTXs.ttf", + "900italic": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzI5SSPQuCQF3t8uOwiUL-taUTtap9DcSQBg_nT9FQY6oJBC8hqflSFOTXs.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/schibstedgrotesk/v7/JqzK5SSPQuCQF3t8uOwiUL-taUTtarVKQ9vZ6pJJWlMNIsEwTshq.ttf" + }, + { + "family": "Schoolbell", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/schoolbell/v18/92zQtBZWOrcgoe-fgnJIVxIQ6mRqfiQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/schoolbell/v18/92zQtBZWOrcgoe-fgnJIZxMa7g.ttf" + }, + { + "family": "Science Gothic", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-11-20", + "files": { + "100": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92fNgmo9KvjVVuc-A.ttf", + "200": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92ftgio9KvjVVuc-A.ttf", + "300": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92faAio9KvjVVuc-A.ttf", + "regular": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92fNgio9KvjVVuc-A.ttf", + "500": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92fBAio9KvjVVuc-A.ttf", + "600": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92f6A-o9KvjVVuc-A.ttf", + "700": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92f0Q-o9KvjVVuc-A.ttf", + "800": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92ftg-o9KvjVVuc-A.ttf", + "900": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92fnw-o9KvjVVuc-A.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sciencegothic/v5/CHzuV-7EH1X7aiQh5jPNDTJnVUAvhrL0sQdjzDQhk11iTp6mX-ANuf1d_83dPfZJ7Lvcvg8EGYzcW57mXiXiVX33c92fNgiY9aHn.ttf" + }, + { + "family": "Scope One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/scopeone/v15/WBLnrEXKYFlGHrOKmGD1W0_MJMGxiQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/scopeone/v15/WBLnrEXKYFlGHrOKmGDFWkXI.ttf" + }, + { + "family": "Seaweed Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/seaweedscript/v17/bx6cNx6Tne2pxOATYE8C_Rsoe0WJ-KcGVbLW.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/seaweedscript/v17/bx6cNx6Tne2pxOATYE8C_Rsoe3WI8qM.ttf" + }, + { + "family": "Secular One", + "variants": [ + "regular" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/secularone/v14/8QINdiTajsj_87rMuMdKypDlMul7LJpK.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/secularone/v14/8QINdiTajsj_87rMuMdKyqDkOO0.ttf" + }, + { + "family": "Sedan", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/sedan/v1/Yq6a-L-VVyD6-eOSiTpovf5b.ttf", + "italic": "https://fonts.gstatic.com/s/sedan/v1/Yq6U-L-VVyD6-dOQgz5KuO5bjxE.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sedan/v1/Yq6a-L-VVyD6-dOTgz4.ttf" + }, + { + "family": "Sedan SC", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/sedansc/v2/yMJRMIlvYZ3Jn1Y30Dq8fSx5i814.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sedansc/v2/yMJRMIlvYZ3Jn1Y30Aq9dyg.ttf" + }, + { + "family": "Sedgwick Ave", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/sedgwickave/v13/uK_04rKEYuguzAcSYRdWTJq8Xmg1Vcf5JA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sedgwickave/v13/uK_04rKEYuguzAcSYRdWTJqMX2Ix.ttf" + }, + { + "family": "Sedgwick Ave Display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/sedgwickavedisplay/v23/xfuu0XPgU3jZPUoUo3ScvmPi-NapQ8OxM2czd-YnOzUD.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sedgwickavedisplay/v23/xfuu0XPgU3jZPUoUo3ScvmPi-NapQ8OxM1cyfeI.ttf" + }, + { + "family": "Sen", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISCq5H47KlD9q78A.ttf", + "500": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISBi5H47KlD9q78A.ttf", + "600": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISPS-H47KlD9q78A.ttf", + "700": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISM2-H47KlD9q78A.ttf", + "800": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISKq-H47KlD9q78A.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sen/v12/6xK0dSxYI9_dkN18-vZKK2EISCq5L4_AkA.ttf" + }, + { + "family": "Send Flowers", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/sendflowers/v7/If2PXTjtZS-0Xqy13uCQSULvxwjjouU1iw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sendflowers/v7/If2PXTjtZS-0Xqy13uCQSULfxgLn.ttf" + }, + { + "family": "Sevillana", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sevillana/v25/KFOlCnWFscmDt1Bfiy1vAx05IsDqlA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sevillana/v25/KFOlCnWFscmDt1Bfiy1fAhc9.ttf" + }, + { + "family": "Seymour One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/seymourone/v25/4iCp6Khla9xbjQpoWGGd0myIPYBvgpUI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/seymourone/v25/4iCp6Khla9xbjQpoWGGd0lyJN4Q.ttf" + }, + { + "family": "Shadows Into Light", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/shadowsintolight/v22/UqyNK9UOIntux_czAvDQx_ZcHqZXBNQDcsr4xzSMYA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shadowsintolight/v22/UqyNK9UOIntux_czAvDQx_ZcHqZXBNQzc8D8.ttf" + }, + { + "family": "Shadows Into Light Two", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/shadowsintolighttwo/v19/4iC86LVlZsRSjQhpWGedwyOoW-0A6_kpsyNmlAvNGLNnIF0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shadowsintolighttwo/v19/4iC86LVlZsRSjQhpWGedwyOoW-0A6_kpsyNmpArHHA.ttf" + }, + { + "family": "Shafarik", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "glagolitic", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/shafarik/v3/RWmLoKaF7PojpZXlW52sbsHKqLkD.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shafarik/v3/RWmLoKaF7PojpZXlW62tZMU.ttf" + }, + { + "family": "Shalimar", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/shalimar/v9/uU9MCBoE6I6iNWFUvTPx8PCOg0uX.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shalimar/v9/uU9MCBoE6I6iNWFUvQPw-vQ.ttf" + }, + { + "family": "Shantell Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYQiS2i2yPwxjyRN.ttf", + "regular": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYR8S2i2yPwxjyRN.ttf", + "500": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYROS2i2yPwxjyRN.ttf", + "600": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYSiTGi2yPwxjyRN.ttf", + "700": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYSbTGi2yPwxjyRN.ttf", + "800": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYT8TGi2yPwxjyRN.ttf", + "300italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CN71wvgTijRNYgQ.ttf", + "italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CID1wvgTijRNYgQ.ttf", + "500italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CLL1wvgTijRNYgQ.ttf", + "600italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CF7ywvgTijRNYgQ.ttf", + "700italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CGfywvgTijRNYgQ.ttf", + "800italic": "https://fonts.gstatic.com/s/shantellsans/v13/FeUcS0pCoLIo-lcdY7kjvNoQg2xkycTqsuA6bi9pTt8YiT-NXidjb_ee-maigL6R8nKVh8BbE1mv4wwmM0WUkSqmTpG0CADywvgTijRNYgQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shantellsans/v13/FeUaS0pCoLIo-lcdY7kjvNoQqWVWB0qWpl29ajppTuUTu_kJKmHesPOL-maYi4xZeHCNQ09eBlmv2QcUzJ39-rAISYR8S1i3wvg.ttf" + }, + { + "family": "Shanti", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/shanti/v25/t5thIREMM4uSDgzgU0ezpKfwzA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shanti/v25/t5thIREMM4uSDgzQUk23.ttf" + }, + { + "family": "Share", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/share/v20/i7dEIFliZjKNF5VNHLq2cV5d.ttf", + "italic": "https://fonts.gstatic.com/s/share/v20/i7dKIFliZjKNF6VPFr6UdE5dWFM.ttf", + "700": "https://fonts.gstatic.com/s/share/v20/i7dJIFliZjKNF63xM56-WkJUQUq7.ttf", + "700italic": "https://fonts.gstatic.com/s/share/v20/i7dPIFliZjKNF6VPLgK7UEZ2RFq7AwU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/share/v20/i7dEIFliZjKNF6VMFr4.ttf" + }, + { + "family": "Share Tech", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/sharetech/v23/7cHtv4Uyi5K0OeZ7bohUwHoDmTcibrA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sharetech/v23/7cHtv4Uyi5K0OeZ7bohU8HsJnQ.ttf" + }, + { + "family": "Share Tech Mono", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sharetechmono/v16/J7aHnp1uDWRBEqV98dVQztYldFc7pAsEIc3Xew.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sharetechmono/v16/J7aHnp1uDWRBEqV98dVQztYldFcLpQEA.ttf" + }, + { + "family": "Shippori Antique", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/shipporiantique/v11/-F6qfid3KC8pdMyzR0qRyFUht11v8ldPg-IUDNg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shipporiantique/v11/-F6qfid3KC8pdMyzR0qRyFUht11vwlZFhw.ttf" + }, + { + "family": "Shippori Antique B1", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/shipporiantiqueb1/v11/2Eb7L_JwClR7Zl_UAKZ0mUHw3oMKd40grRFCj9-5Y8Y.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shipporiantiqueb1/v11/2Eb7L_JwClR7Zl_UAKZ0mUHw3oMKd40gnRBIiw.ttf" + }, + { + "family": "Shippori Mincho", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGGAZweH5EbgHY6YExcZfDoj0BA2_-C7LoS7g.ttf", + "500": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGDAZweH5EbgHY6YExcZfDoj0B4L9am5JEO5--2zg.ttf", + "600": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGDAZweH5EbgHY6YExcZfDoj0B4A9Gm5JEO5--2zg.ttf", + "700": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGDAZweH5EbgHY6YExcZfDoj0B4Z9Cm5JEO5--2zg.ttf", + "800": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGDAZweH5EbgHY6YExcZfDoj0B4e9Om5JEO5--2zg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shipporimincho/v17/VdGGAZweH5EbgHY6YExcZfDoj0Bw2vWG.ttf" + }, + { + "family": "Shippori Mincho B1", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK2E2wCr44tulPdnn-xbIpJ9RgT9-nyjqBr1lO97Q.ttf", + "500": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK1E2wCr44tulPdnn-xbIpJ9RgT9-nKeolP3nih5H4Uug.ttf", + "600": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK1E2wCr44tulPdnn-xbIpJ9RgT9-nKVo5P3nih5H4Uug.ttf", + "700": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK1E2wCr44tulPdnn-xbIpJ9RgT9-nKMo9P3nih5H4Uug.ttf", + "800": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK1E2wCr44tulPdnn-xbIpJ9RgT9-nKLoxP3nih5H4Uug.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shipporiminchob1/v24/wXK2E2wCr44tulPdnn-xbIpJ9RgT9-nCj6pv.ttf" + }, + { + "family": "Shizuru", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin" + ], + "version": "v13", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/shizuru/v13/O4ZSFGfvnxFiCA3i30IJlgUTj2A.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shizuru/v13/O4ZSFGfvnxFiCA3i70MDkg.ttf" + }, + { + "family": "Shojumaru", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/shojumaru/v16/rax_HiWfutkLLnaKCtlMBBJek0vA8A.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shojumaru/v16/rax_HiWfutkLLnaKCtl8BRha.ttf" + }, + { + "family": "Short Stack", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/shortstack/v16/bMrzmS2X6p0jZC6EcmPFX-SScX8D0nq6.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shortstack/v16/bMrzmS2X6p0jZC6EcmPFX9STe3s.ttf" + }, + { + "family": "Shrikhand", + "variants": [ + "regular" + ], + "subsets": [ + "gujarati", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/shrikhand/v17/a8IbNovtLWfR7T7bMJwbBIiQ0zhMtA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/shrikhand/v17/a8IbNovtLWfR7T7bMJwrBYKU.ttf" + }, + { + "family": "Siemreap", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v30", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/siemreap/v30/Gg82N5oFbgLvHAfNl2YbnA8DLXpe.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/siemreap/v30/Gg82N5oFbgLvHAfNl1Yalgs.ttf" + }, + { + "family": "Sigmar", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sigmar/v9/hv-XlzJgIE8a85pUbWY3MTFgVg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sigmar/v9/hv-XlzJgIE8a85pkbGwz.ttf" + }, + { + "family": "Sigmar One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/sigmarone/v20/co3DmWZ8kjZuErj9Ta3dk6Pjp3Di8U0.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sigmarone/v20/co3DmWZ8kjZuErj9Ta3do6Lpow.ttf" + }, + { + "family": "Signika", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v29", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r93zuYzTMngt4xjw.ttf", + "regular": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9gTuYzTMngt4xjw.ttf", + "500": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9szuYzTMngt4xjw.ttf", + "600": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9XzyYzTMngt4xjw.ttf", + "700": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9ZjyYzTMngt4xjw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/signika/v29/vEF72_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX4zNpD8E4ASzH1r9gTuozDkj.ttf" + }, + { + "family": "Signika Negative", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v26", + "lastModified": "2025-09-02", + "files": { + "300": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAr5S73st9hiuEq8.ttf", + "regular": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAqnS73st9hiuEq8.ttf", + "500": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAqVS73st9hiuEq8.ttf", + "600": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAp5TL3st9hiuEq8.ttf", + "700": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RApATL3st9hiuEq8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/signikanegative/v26/E21x_cfngu7HiRpPX3ZpNE4kY5zKSPmJXkF0VDD2RAqnS43tvdw.ttf" + }, + { + "family": "Silkscreen", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/silkscreen/v6/m8JXjfVPf62XiF7kO-i9ULRvamODxdI.ttf", + "700": "https://fonts.gstatic.com/s/silkscreen/v6/m8JUjfVPf62XiF7kO-i9aAhATmuo2dudFvc.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/silkscreen/v6/m8JXjfVPf62XiF7kO-i9YLVlbg.ttf" + }, + { + "family": "Simonetta", + "variants": [ + "regular", + "italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/simonetta/v29/x3dickHVYrCU5BU15c4BfPACvy_1BA.ttf", + "italic": "https://fonts.gstatic.com/s/simonetta/v29/x3dkckHVYrCU5BU15c4xfvoGnSrlBBsy.ttf", + "900": "https://fonts.gstatic.com/s/simonetta/v29/x3dnckHVYrCU5BU15c45-N0mtwTpDQIrGg.ttf", + "900italic": "https://fonts.gstatic.com/s/simonetta/v29/x3d5ckHVYrCU5BU15c4xfsKCsA7tLwc7Gn88.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/simonetta/v29/x3dickHVYrCU5BU15c4xffoG.ttf" + }, + { + "family": "Single Day", + "variants": [ + "regular" + ], + "subsets": [ + "korean" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/singleday/v19/LYjHdGDjlEgoAcF95EI5jVoFUNfeQJU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/singleday/v19/LYjHdGDjlEgoAcF95EI5vVsPVA.ttf" + }, + { + "family": "Sintony", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sintony/v17/XoHm2YDqR7-98cVUITQnu98ojjs.ttf", + "700": "https://fonts.gstatic.com/s/sintony/v17/XoHj2YDqR7-98cVUGYgIn9cDkjLp6C8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sintony/v17/XoHm2YDqR7-98cVUETUtvw.ttf" + }, + { + "family": "Sirin Stencil", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v27", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/sirinstencil/v27/mem4YaWwznmLx-lzGfN7MdRydchGBq6al6o.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sirinstencil/v27/mem4YaWwznmLx-lzGfN7MdRyRclMAg.ttf" + }, + { + "family": "Sirivennela", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v2", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/sirivennela/v2/kmK5Zq0oHhbAYX-X6lgptg7YiOFDtqtf.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sirivennela/v2/kmK5Zq0oHhbAYX-X6lgptj7ZguU.ttf" + }, + { + "family": "Six Caps", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/sixcaps/v23/6ae_4KGrU7VR7bNmabcS9XXaPCop.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sixcaps/v23/6ae_4KGrU7VR7bNmaYcT_3E.ttf" + }, + { + "family": "Sixtyfour", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v3", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/sixtyfour/v3/OD5vuMCT1numDm3nakXtp2h4jg463t9haG_3mBkVsV20uFT3BAE5f73YnyS5ZuOV.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sixtyfour/v3/OD5vuMCT1numDm3nakXtp2h4jg463t9haG_3mBkVsV20uFT3BAE5f43ZlSA.ttf" + }, + { + "family": "Sixtyfour Convergence", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols" + ], + "version": "v5", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/sixtyfourconvergence/v5/m8IQjepPf7mIglv5K__zM9srGA7wurbybZMfZsqG2Q6EWlJro5FJSJ4acT9PoOPwGgieaK7zkSpdXP-GrR9Yw9Tg7E4HGLbUKPlOh102hotkk3grz3g.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sixtyfourconvergence/v5/m8IQjepPf7mIglv5K__zM9srGA7wurbybZMfZsqG2Q6EWlJro5FJSJ4acT9PoOPwGgieaK7zkSpdXP-GrR9Yw9Tg7E4HGLbUKPlOh102topulw.ttf", + "colorCapabilities": [ + "COLRv1" + ] + }, + { + "family": "Skranji", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/skranji/v14/OZpDg_dtriVFNerMYzuuklTm3Ek.ttf", + "700": "https://fonts.gstatic.com/s/skranji/v14/OZpGg_dtriVFNerMW4eBtlzNwED-b4g.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/skranji/v14/OZpDg_dtriVFNerMUzqklg.ttf" + }, + { + "family": "Slabo 13px", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/slabo13px/v17/11hEGp_azEvXZUdSBzzRcKer2wkYnvI.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/slabo13px/v17/11hEGp_azEvXZUdSBzzRQKah3w.ttf" + }, + { + "family": "Slabo 27px", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/slabo27px/v16/mFT0WbgBwKPR_Z4hGN2qsxgJ1EJ7i90.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/slabo27px/v16/mFT0WbgBwKPR_Z4hGN2qgxkD0A.ttf" + }, + { + "family": "Slackey", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v29", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/slackey/v29/N0bV2SdQO-5yM0-dKlRaJdbWgdY.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/slackey/v29/N0bV2SdQO-5yM0-dGlVQIQ.ttf" + }, + { + "family": "Slackside One", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/slacksideone/v14/EJRQQgMrXdcGsiBuvnRxodTwVy7VocNB6Iw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/slacksideone/v14/EJRQQgMrXdcGsiBuvnRxodTwZy_fpQ.ttf" + }, + { + "family": "Smokum", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v30", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/smokum/v30/TK3iWkUbAhopmrdGHjUHte5fKg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/smokum/v30/TK3iWkUbAhopmrd2Hz8D.ttf" + }, + { + "family": "Smooch", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/smooch/v9/o-0LIps4xW8U1xUBjqp_6hVdYg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/smooch/v9/o-0LIps4xW8U1xUxj6B7.ttf" + }, + { + "family": "Smooch Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiwUFodqIeNlzayg.ttf", + "200": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiQUBodqIeNlzayg.ttf", + "300": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oin0BodqIeNlzayg.ttf", + "regular": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiwUBodqIeNlzayg.ttf", + "500": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oi80BodqIeNlzayg.ttf", + "600": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiH0dodqIeNlzayg.ttf", + "700": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiJkdodqIeNlzayg.ttf", + "800": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiQUdodqIeNlzayg.ttf", + "900": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiaEdodqIeNlzayg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/smoochsans/v15/c4mz1n5uGsXss2LJh1QH6b129FZvxPj6I4oiwUBYd6ga.ttf" + }, + { + "family": "Smythe", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/smythe/v24/MwQ3bhT01--coT1BOLh_uGInjA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/smythe/v24/MwQ3bhT01--coT1xObJ7.ttf" + }, + { + "family": "Sniglet", + "variants": [ + "regular", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/sniglet/v18/cIf9MaFLtkE3UjaJxCmrYGkHgIs.ttf", + "800": "https://fonts.gstatic.com/s/sniglet/v18/cIf4MaFLtkE3UjaJ_ImHRGEsnIJkWL4.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sniglet/v18/cIf9MaFLtkE3UjaJ9CihZA.ttf" + }, + { + "family": "Snippet", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/snippet/v21/bWt47f7XfQH9Gupu2v_Afcp9QWc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/snippet/v21/bWt47f7XfQH9Gupu6v7KeQ.ttf" + }, + { + "family": "Snowburst One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/snowburstone/v21/MQpS-WezKdujBsXY3B7I-UT7eZ-UPyacPbo.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/snowburstone/v21/MQpS-WezKdujBsXY3B7I-UT7SZ6eOw.ttf" + }, + { + "family": "Sofadi One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/sofadione/v22/JIA2UVBxdnVBuElZaMFGcDOIETkmYDU.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sofadione/v22/JIA2UVBxdnVBuElZaMFGQDKCFQ.ttf" + }, + { + "family": "Sofia", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v15", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/sofia/v15/8QIHdirahM3j_vu-sowsrqjk.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sofia/v15/8QIHdirahM3j_su_uIg.ttf" + }, + { + "family": "Sofia Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69B6sa3trvKCXl8k.ttf", + "200": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69D6sK3trvKCXl8k.ttf", + "300": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69AksK3trvKCXl8k.ttf", + "regular": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69B6sK3trvKCXl8k.ttf", + "500": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69BIsK3trvKCXl8k.ttf", + "600": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69Ckt63trvKCXl8k.ttf", + "700": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69Cdt63trvKCXl8k.ttf", + "800": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69D6t63trvKCXl8k.ttf", + "900": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69DTt63trvKCXl8k.ttf", + "100italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy80WvpPagW08kdLY.ttf", + "200italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy88WupPagW08kdLY.ttf", + "300italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy8xuupPagW08kdLY.ttf", + "italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy80WupPagW08kdLY.ttf", + "500italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy83eupPagW08kdLY.ttf", + "600italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy85uppPagW08kdLY.ttf", + "700italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy86KppPagW08kdLY.ttf", + "800italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy88WppPagW08kdLY.ttf", + "900italic": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6G-LCVXSLy9uPBwlATrORgnBjYmSP97MWy8-yppPagW08kdLY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sofiasans/v20/Yq6E-LCVXSLy9uPBwlAThu1SY8Cx8rlT69B6sJ3spPY.ttf" + }, + { + "family": "Sofia Sans Condensed", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqh-Csl8QO3OfwQQ.ttf", + "200": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqB-Gsl8QO3OfwQQ.ttf", + "300": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUq2eGsl8QO3OfwQQ.ttf", + "regular": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqh-Gsl8QO3OfwQQ.ttf", + "500": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqteGsl8QO3OfwQQ.ttf", + "600": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqWeasl8QO3OfwQQ.ttf", + "700": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqYOasl8QO3OfwQQ.ttf", + "800": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqB-asl8QO3OfwQQ.ttf", + "900": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqLuasl8QO3OfwQQ.ttf", + "100italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6JE1c4K_uLgQZ_3.ttf", + "200italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6LE1M4K_uLgQZ_3.ttf", + "300italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6Ia1M4K_uLgQZ_3.ttf", + "italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6JE1M4K_uLgQZ_3.ttf", + "500italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6J21M4K_uLgQZ_3.ttf", + "600italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6Ka084K_uLgQZ_3.ttf", + "700italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6Kj084K_uLgQZ_3.ttf", + "800italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6LE084K_uLgQZ_3.ttf", + "900italic": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r053GKVS5aVKd567NYXawnFKJaTtoAuLnIcNvN_Vj6TYyQI_T6Lt084K_uLgQZ_3.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sofiasanscondensed/v6/r05xGKVS5aVKd567NYXawnFKJaTtoAuLnK0EjiAN5s9CZwUqh-Gcls4K.ttf" + }, + { + "family": "Sofia Sans Extra Condensed", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLmmmEfzmM356GxA.ttf", + "200": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLGmiEfzmM356GxA.ttf", + "300": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLxGiEfzmM356GxA.ttf", + "regular": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLmmiEfzmM356GxA.ttf", + "500": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLqGiEfzmM356GxA.ttf", + "600": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLRG-EfzmM356GxA.ttf", + "700": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLfW-EfzmM356GxA.ttf", + "800": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLGm-EfzmM356GxA.ttf", + "900": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLM2-EfzmM356GxA.ttf", + "100italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUitsPTOI_ZuWxFXe.ttf", + "200italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUivsPDOI_ZuWxFXe.ttf", + "300italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUisyPDOI_ZuWxFXe.ttf", + "italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUitsPDOI_ZuWxFXe.ttf", + "500italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUitePDOI_ZuWxFXe.ttf", + "600italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUiuyOzOI_ZuWxFXe.ttf", + "700italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUiuLOzOI_ZuWxFXe.ttf", + "800italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUivsOzOI_ZuWxFXe.ttf", + "900italic": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxfHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0fSrPEBUZv84WtaeUivFOzOI_ZuWxFXe.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sofiasansextracondensed/v6/raxdHjafvdAIOju4GcIfJH0i7zi50X3zRtuLNiMS0d6iDr-MD5Si9NGLmmi0fjOI.ttf" + }, + { + "family": "Sofia Sans Semi Condensed", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoobEO9TGahllIhN.ttf", + "200": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoqbEe9TGahllIhN.ttf", + "300": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvopFEe9TGahllIhN.ttf", + "regular": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoobEe9TGahllIhN.ttf", + "500": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoopEe9TGahllIhN.ttf", + "600": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvorFFu9TGahllIhN.ttf", + "700": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvor8Fu9TGahllIhN.ttf", + "800": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoqbFu9TGahllIhN.ttf", + "900": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoqyFu9TGahllIhN.ttf", + "100italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUgcRE6xHkZhNeas.ttf", + "200italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUocQE6xHkZhNeas.ttf", + "300italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUlkQE6xHkZhNeas.ttf", + "italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUgcQE6xHkZhNeas.ttf", + "500italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUjUQE6xHkZhNeas.ttf", + "600italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUtkXE6xHkZhNeas.ttf", + "700italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUuAXE6xHkZhNeas.ttf", + "800italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUocXE6xHkZhNeas.ttf", + "900italic": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kMlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURsWYu_G5idVi7uZ_TUq4XE6xHkZhNeas.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sofiasanssemicondensed/v8/46kOlaPnUDrQoNsWDCGXXxYlujh5Wv0nwP4RwxURm28cA7YLHsIVvoobEd9SE6w.ttf" + }, + { + "family": "Solitreo", + "variants": [ + "regular" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/solitreo/v2/r05YGLlS5a9KYsyNO8upyDYtStiJ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/solitreo/v2/r05YGLlS5a9KYsyNO_uowjI.ttf" + }, + { + "family": "Solway", + "variants": [ + "300", + "regular", + "500", + "700", + "800" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "300": "https://fonts.gstatic.com/s/solway/v19/AMOTz46Cs2uTAOCuLlgZms0QW3mqyg.ttf", + "regular": "https://fonts.gstatic.com/s/solway/v19/AMOQz46Cs2uTAOCWgnA9kuYMUg.ttf", + "500": "https://fonts.gstatic.com/s/solway/v19/AMOTz46Cs2uTAOCudlkZms0QW3mqyg.ttf", + "700": "https://fonts.gstatic.com/s/solway/v19/AMOTz46Cs2uTAOCuPl8Zms0QW3mqyg.ttf", + "800": "https://fonts.gstatic.com/s/solway/v19/AMOTz46Cs2uTAOCuIlwZms0QW3mqyg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/solway/v19/AMOQz46Cs2uTAOCmg3o5.ttf" + }, + { + "family": "Sometype Mono", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTAMGE9agQBbs7uG.ttf", + "500": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTA-GE9agQBbs7uG.ttf", + "600": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTDSH09agQBbs7uG.ttf", + "700": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTDrH09agQBbs7uG.ttf", + "italic": "https://fonts.gstatic.com/s/sometypemono/v4/70lEu745KGk_R3uxyq0WrROhKpG7T0e3JvPLoiXEW6cZiwR5tquGrxk.ttf", + "500italic": "https://fonts.gstatic.com/s/sometypemono/v4/70lEu745KGk_R3uxyq0WrROhKpG7T0e3JvPLoiXEW5UZiwR5tquGrxk.ttf", + "600italic": "https://fonts.gstatic.com/s/sometypemono/v4/70lEu745KGk_R3uxyq0WrROhKpG7T0e3JvPLoiXEW3keiwR5tquGrxk.ttf", + "700italic": "https://fonts.gstatic.com/s/sometypemono/v4/70lEu745KGk_R3uxyq0WrROhKpG7T0e3JvPLoiXEW0AeiwR5tquGrxk.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sometypemono/v4/70lGu745KGk_R3uxyq0WrROhAJiJsJ_eTWllpTAMGH9biwQ.ttf" + }, + { + "family": "Song Myung", + "variants": [ + "regular" + ], + "subsets": [ + "korean" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/songmyung/v22/1cX2aUDWAJH5-EIC7DIhr1GqhcitzeM.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/songmyung/v22/1cX2aUDWAJH5-EIC7DIhn1CggQ.ttf" + }, + { + "family": "Sono", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVNkWdEnR4qYeB4Q.ttf", + "300": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxV6EWdEnR4qYeB4Q.ttf", + "regular": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVtkWdEnR4qYeB4Q.ttf", + "500": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVhEWdEnR4qYeB4Q.ttf", + "600": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVaEKdEnR4qYeB4Q.ttf", + "700": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVUUKdEnR4qYeB4Q.ttf", + "800": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVNkKdEnR4qYeB4Q.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sono/v12/aFT97PNiY3U2Cqf_aYEN64CYaK18YWJEsV6u-QLiOsxVtkWtE358.ttf" + }, + { + "family": "Sonsie One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/sonsieone/v22/PbymFmP_EAnPqbKaoc18YVu80lbp8JM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sonsieone/v22/PbymFmP_EAnPqbKaoc18UVq21g.ttf" + }, + { + "family": "Sora", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSdSn3-KIwNhBti0.ttf", + "200": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSfSnn-KIwNhBti0.ttf", + "300": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmScMnn-KIwNhBti0.ttf", + "regular": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSdSnn-KIwNhBti0.ttf", + "500": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSdgnn-KIwNhBti0.ttf", + "600": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSeMmX-KIwNhBti0.ttf", + "700": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSe1mX-KIwNhBti0.ttf", + "800": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSfSmX-KIwNhBti0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sora/v17/xMQOuFFYT72X5wkB_18qmnndmSdSnk-LKQc.ttf" + }, + { + "family": "Sorts Mill Goudy", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/sortsmillgoudy/v16/Qw3GZR9MED_6PSuS_50nEaVrfzgEXH0OjpM75PE.ttf", + "italic": "https://fonts.gstatic.com/s/sortsmillgoudy/v16/Qw3AZR9MED_6PSuS_50nEaVrfzgEbH8EirE-9PGLfQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sortsmillgoudy/v16/Qw3GZR9MED_6PSuS_50nEaVrfzgEbHwEig.ttf" + }, + { + "family": "Sour Gummy", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1N88JU91CMD2tcoQ.ttf", + "200": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1Nc8NU91CMD2tcoQ.ttf", + "300": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NrcNU91CMD2tcoQ.ttf", + "regular": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1N88NU91CMD2tcoQ.ttf", + "500": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NwcNU91CMD2tcoQ.ttf", + "600": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NLcRU91CMD2tcoQ.ttf", + "700": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NFMRU91CMD2tcoQ.ttf", + "800": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1Nc8RU91CMD2tcoQ.ttf", + "900": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1NWsRU91CMD2tcoQ.ttf", + "100italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4C8tVqILW5MobGa.ttf", + "200italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4A8tFqILW5MobGa.ttf", + "300italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4DitFqILW5MobGa.ttf", + "italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4C8tFqILW5MobGa.ttf", + "500italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4COtFqILW5MobGa.ttf", + "600italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4Bis1qILW5MobGa.ttf", + "700italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4Bbs1qILW5MobGa.ttf", + "800italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4A8s1qILW5MobGa.ttf", + "900italic": "https://fonts.gstatic.com/s/sourgummy/v3/8AtIGs2gPYuNDii97MjjLLvpghcw76OXBoIHpHgGZt9gyUXamxpYO4AVs1qILW5MobGa.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sourgummy/v3/8AtGGs2gPYuNDii97MjjBrLbYfdJvDU5AZfP5opPVCC4oC5ANR1N88Nk9lqI.ttf" + }, + { + "family": "Source Code Pro", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v31", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DEyQhM5hTXUcdJg.ttf", + "300": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DJKQhM5hTXUcdJg.ttf", + "regular": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQhM5hTXUcdJg.ttf", + "500": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DP6QhM5hTXUcdJg.ttf", + "600": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DBKXhM5hTXUcdJg.ttf", + "700": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DCuXhM5hTXUcdJg.ttf", + "800": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DEyXhM5hTXUcdJg.ttf", + "900": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DGWXhM5hTXUcdJg.ttf", + "200italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTT7I1rSVcZZJiGpw.ttf", + "300italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTMo1rSVcZZJiGpw.ttf", + "italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTbI1rSVcZZJiGpw.ttf", + "500italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTXo1rSVcZZJiGpw.ttf", + "600italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTsoprSVcZZJiGpw.ttf", + "700italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTi4prSVcZZJiGpw.ttf", + "800italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTT7IprSVcZZJiGpw.ttf", + "900italic": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTxYprSVcZZJiGpw.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sourcecodepro/v31/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQtM9rSQ.ttf" + }, + { + "family": "Source Sans 3", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "200": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kw461EN_io6npfB.ttf", + "300": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kzm61EN_io6npfB.ttf", + "regular": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Ky461EN_io6npfB.ttf", + "500": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8KyK61EN_io6npfB.ttf", + "600": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kxm7FEN_io6npfB.ttf", + "700": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kxf7FEN_io6npfB.ttf", + "800": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Kw47FEN_io6npfB.ttf", + "900": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8KwR7FEN_io6npfB.ttf", + "200italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqDlO9C4Ym4fB3Ts.ttf", + "300italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqOdO9C4Ym4fB3Ts.ttf", + "italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqLlO9C4Ym4fB3Ts.ttf", + "500italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqItO9C4Ym4fB3Ts.ttf", + "600italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqGdJ9C4Ym4fB3Ts.ttf", + "700italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqF5J9C4Ym4fB3Ts.ttf", + "800italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqDlJ9C4Ym4fB3Ts.ttf", + "900italic": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpDtKy2OAdR1K-IwhWudF-R3woAa8opPOrG97lwqBBJ9C4Ym4fB3Ts.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Ky462EM9C4.ttf" + }, + { + "family": "Source Serif 4", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjipdqrhxXD-wGvjU.ttf", + "300": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjiklqrhxXD-wGvjU.ttf", + "regular": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjihdqrhxXD-wGvjU.ttf", + "500": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjiiVqrhxXD-wGvjU.ttf", + "600": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjisltrhxXD-wGvjU.ttf", + "700": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjivBtrhxXD-wGvjU.ttf", + "800": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjipdtrhxXD-wGvjU.ttf", + "900": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjir5trhxXD-wGvjU.ttf", + "200italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pxl9dC84DrjXEXw.ttf", + "300italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pGF9dC84DrjXEXw.ttf", + "italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pRl9dC84DrjXEXw.ttf", + "500italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pdF9dC84DrjXEXw.ttf", + "600italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pmFhdC84DrjXEXw.ttf", + "700italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98poVhdC84DrjXEXw.ttf", + "800italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pxlhdC84DrjXEXw.ttf", + "900italic": "https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98p71hdC84DrjXEXw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sourceserif4/v14/vEFy2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6OAVIJmeUDygwjihdqnh1dCw.ttf" + }, + { + "family": "Space Grotesk", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj62UUsjNsFjTDJK.ttf", + "regular": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj7oUUsjNsFjTDJK.ttf", + "500": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj7aUUsjNsFjTDJK.ttf", + "600": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj42VksjNsFjTDJK.ttf", + "700": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj4PVksjNsFjTDJK.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj7oUXsiPMU.ttf" + }, + { + "family": "Space Mono", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/spacemono/v17/i7dPIFZifjKcF5UAWdDRUEZ2RFq7AwU.ttf", + "italic": "https://fonts.gstatic.com/s/spacemono/v17/i7dNIFZifjKcF5UAWdDRYER8QHi-EwWMbg.ttf", + "700": "https://fonts.gstatic.com/s/spacemono/v17/i7dMIFZifjKcF5UAWdDRaPpZYFKQHwyVd3U.ttf", + "700italic": "https://fonts.gstatic.com/s/spacemono/v17/i7dSIFZifjKcF5UAWdDRYERE_FeaGy6QZ3WfYg.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/spacemono/v17/i7dPIFZifjKcF5UAWdDRYEd8QA.ttf" + }, + { + "family": "Special Elite", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/specialelite/v20/XLYgIZbkc4JPUL5CVArUVL0nhncESXFtUsM.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/specialelite/v20/XLYgIZbkc4JPUL5CVArUVL0ntnYOTQ.ttf" + }, + { + "family": "Special Gothic", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-07-30", + "files": { + "regular": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4bF8-SgLPIOkEp8.ttf", + "500": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4YN8-SgLPIOkEp8.ttf", + "600": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4W97-SgLPIOkEp8.ttf", + "700": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4VZ7-SgLPIOkEp8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/specialgothic/v3/1q2lY5WcG0Fg_v0fHc8BvIZ2537qdm1JEt9N3w2mJykOEnLhliLsitHN4bF8ySkBOA.ttf" + }, + { + "family": "Special Gothic Condensed One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-04-23", + "files": { + "regular": "https://fonts.gstatic.com/s/specialgothiccondensedone/v2/R70Njzwei_mJM7OsFDzX7EL9NBO6IPvd-Avolzh49w7PUZt_5YtxbX8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/specialgothiccondensedone/v2/R70Njzwei_mJM7OsFDzX7EL9NBO6IPvd-Avolzh49w7PYZp14Q.ttf" + }, + { + "family": "Special Gothic Expanded One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-04-23", + "files": { + "regular": "https://fonts.gstatic.com/s/specialgothicexpandedone/v2/IurO6Zxk74-YaYk1r3HOet4g75ENmBxUmOK61tA0Iu5gn5t-KhUVvQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/specialgothicexpandedone/v2/IurO6Zxk74-YaYk1r3HOet4g75ENmBxUmOK61tA0Iu5QnpF6.ttf" + }, + { + "family": "Spectral", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9v2s13GY_etWWIJ.ttf", + "200italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qrXHafOPXHIJErY.ttf", + "300": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9uSsF3GY_etWWIJ.ttf", + "300italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qtHEafOPXHIJErY.ttf", + "regular": "https://fonts.gstatic.com/s/spectral/v15/rnCr-xNNww_2s0amA-M-mHnOSOuk.ttf", + "italic": "https://fonts.gstatic.com/s/spectral/v15/rnCt-xNNww_2s0amA9M8kn3sTfukQHs.ttf", + "500": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9vKsV3GY_etWWIJ.ttf", + "500italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qonFafOPXHIJErY.ttf", + "600": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9vmtl3GY_etWWIJ.ttf", + "600italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qqXCafOPXHIJErY.ttf", + "700": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9uCt13GY_etWWIJ.ttf", + "700italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qsHDafOPXHIJErY.ttf", + "800": "https://fonts.gstatic.com/s/spectral/v15/rnCs-xNNww_2s0amA9uetF3GY_etWWIJ.ttf", + "800italic": "https://fonts.gstatic.com/s/spectral/v15/rnCu-xNNww_2s0amA9M8qt3AafOPXHIJErY.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/spectral/v15/rnCr-xNNww_2s0amA9M_kn0.ttf" + }, + { + "family": "Spectral SC", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-02", + "files": { + "200": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs1qwkTXPYeVXJZB.ttf", + "200italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg26zWN4O3WYZB_sU.ttf", + "300": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs0OwUTXPYeVXJZB.ttf", + "300italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg28jVN4O3WYZB_sU.ttf", + "regular": "https://fonts.gstatic.com/s/spectralsc/v15/KtkpALCRZonmalTgyPmRfvWi6WDfFpuc.ttf", + "italic": "https://fonts.gstatic.com/s/spectralsc/v15/KtkrALCRZonmalTgyPmRfsWg42T9E4ucRY8.ttf", + "500": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs1WwETXPYeVXJZB.ttf", + "500italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg25DUN4O3WYZB_sU.ttf", + "600": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs16x0TXPYeVXJZB.ttf", + "600italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg27zTN4O3WYZB_sU.ttf", + "700": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs0exkTXPYeVXJZB.ttf", + "700italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg29jSN4O3WYZB_sU.ttf", + "800": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk0ALCRZonmalTgyPmRfs0CxUTXPYeVXJZB.ttf", + "800italic": "https://fonts.gstatic.com/s/spectralsc/v15/Ktk2ALCRZonmalTgyPmRfsWg28TRN4O3WYZB_sU.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/spectralsc/v15/KtkpALCRZonmalTgyPmRfsWj42Q.ttf" + }, + { + "family": "Spicy Rice", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/spicyrice/v28/uK_24rSEd-Uqwk4jY1RyGv-2WkowRcc.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/spicyrice/v28/uK_24rSEd-Uqwk4jY1RyKv68Xg.ttf" + }, + { + "family": "Spinnaker", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/spinnaker/v21/w8gYH2oyX-I0_rvR6Hmn3HwLqOqSBg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/spinnaker/v21/w8gYH2oyX-I0_rvR6HmX3XYP.ttf" + }, + { + "family": "Spirax", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/spirax/v22/buE3poKgYNLy0F3cXktt-Csn-Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/spirax/v22/buE3poKgYNLy0F3sX0Fp.ttf" + }, + { + "family": "Splash", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/splash/v8/KtksAL2RZoDkbU6hpPPGNdS6wg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/splash/v8/KtksAL2RZoDkbU6RpfnC.ttf" + }, + { + "family": "Spline Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRpZlnYEtvlUfE2kw.ttf", + "regular": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRpOFnYEtvlUfE2kw.ttf", + "500": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRpClnYEtvlUfE2kw.ttf", + "600": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRp5l7YEtvlUfE2kw.ttf", + "700": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRp317YEtvlUfE2kw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/splinesans/v16/_6_sED73Uf-2WfU2LzycEZousNzn1a1lKWRpOFnoE9Hh.ttf" + }, + { + "family": "Spline Sans Mono", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGA8MrtVy4d4dGb1.ttf", + "regular": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGBiMrtVy4d4dGb1.ttf", + "500": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGBQMrtVy4d4dGb1.ttf", + "600": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGC8NbtVy4d4dGb1.ttf", + "700": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGCFNbtVy4d4dGb1.ttf", + "300italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcQ0WwYNacXb12MM.ttf", + "italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcVMWwYNacXb12MM.ttf", + "500italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcWEWwYNacXb12MM.ttf", + "600italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcY0RwYNacXb12MM.ttf", + "700italic": "https://fonts.gstatic.com/s/splinesansmono/v13/R70yjzAei_CDNLfgZxrW6wrZOF2WX5eDlm1vIsHjv3WqcbQRwYNacXb12MM.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/splinesansmono/v13/R70MjzAei_CDNLfgZxrW6wrZOF2WdZ6xabUGSVtNuGBiMotUwYM.ttf" + }, + { + "family": "Squada One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/squadaone/v20/BCasqZ8XsOrx4mcOk6MtWaA8WDBkHgs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/squadaone/v20/BCasqZ8XsOrx4mcOk6MtaaE2XA.ttf" + }, + { + "family": "Square Peg", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/squarepeg/v7/y83eW48Nzw6ZlUHc-phrBDHrHHfrFPE.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/squarepeg/v7/y83eW48Nzw6ZlUHc-phrNDDhGA.ttf" + }, + { + "family": "Sree Krushnadevaraya", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v23", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/sreekrushnadevaraya/v23/R70FjzQeifmPepmyQQjQ9kvwMkWYPfTA_EWb2FhQuXir.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sreekrushnadevaraya/v23/R70FjzQeifmPepmyQQjQ9kvwMkWYPfTA_HWa0lw.ttf" + }, + { + "family": "Sriracha", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/sriracha/v16/0nkrC9D4IuYBgWcI9ObYRQDioeb0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sriracha/v16/0nkrC9D4IuYBgWcI9NbZTwQ.ttf" + }, + { + "family": "Srisakdi", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/srisakdi/v18/yMJRMIlvdpDbkB0A-jq8fSx5i814.ttf", + "700": "https://fonts.gstatic.com/s/srisakdi/v18/yMJWMIlvdpDbkB0A-gIAUghxoNFxW0Hz.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/srisakdi/v18/yMJRMIlvdpDbkB0A-gq9dyg.ttf" + }, + { + "family": "Staatliches", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/staatliches/v15/HI_OiY8KO6hCsQSoAPmtMbectJG9O9PS.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/staatliches/v15/HI_OiY8KO6hCsQSoAPmtMYedvpU.ttf" + }, + { + "family": "Stack Sans Headline", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-11-04", + "files": { + "200": "https://fonts.gstatic.com/s/stacksansheadline/v1/1PtFg9jZXvmMnkLnuURbaukKZJTyrDV326uH6mSinjBIwc7tIgFHqgUA3ZCX.ttf", + "300": "https://fonts.gstatic.com/s/stacksansheadline/v1/1PtFg9jZXvmMnkLnuURbaukKZJTyrDV326uH6mSinjBIwc4zIgFHqgUA3ZCX.ttf", + "regular": "https://fonts.gstatic.com/s/stacksansheadline/v1/1PtFg9jZXvmMnkLnuURbaukKZJTyrDV326uH6mSinjBIwc5tIgFHqgUA3ZCX.ttf", + "500": "https://fonts.gstatic.com/s/stacksansheadline/v1/1PtFg9jZXvmMnkLnuURbaukKZJTyrDV326uH6mSinjBIwc5fIgFHqgUA3ZCX.ttf", + "600": "https://fonts.gstatic.com/s/stacksansheadline/v1/1PtFg9jZXvmMnkLnuURbaukKZJTyrDV326uH6mSinjBIwc6zJQFHqgUA3ZCX.ttf", + "700": "https://fonts.gstatic.com/s/stacksansheadline/v1/1PtFg9jZXvmMnkLnuURbaukKZJTyrDV326uH6mSinjBIwc6KJQFHqgUA3ZCX.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stacksansheadline/v1/1PtFg9jZXvmMnkLnuURbaukKZJTyrDV326uH6mSinjBIwc5tIjFGoAE.ttf" + }, + { + "family": "Stack Sans Notch", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-11-04", + "files": { + "200": "https://fonts.gstatic.com/s/stacksansnotch/v5/TwMY-JcVXlQd3ooGEx9EbUzgioTr5BY5lEpidqlSR8diuR2ZGGf6Bw3r.ttf", + "300": "https://fonts.gstatic.com/s/stacksansnotch/v5/TwMY-JcVXlQd3ooGEx9EbUzgioTr5BY5lEpidqlSR8e8uR2ZGGf6Bw3r.ttf", + "regular": "https://fonts.gstatic.com/s/stacksansnotch/v5/TwMY-JcVXlQd3ooGEx9EbUzgioTr5BY5lEpidqlSR8fiuR2ZGGf6Bw3r.ttf", + "500": "https://fonts.gstatic.com/s/stacksansnotch/v5/TwMY-JcVXlQd3ooGEx9EbUzgioTr5BY5lEpidqlSR8fQuR2ZGGf6Bw3r.ttf", + "600": "https://fonts.gstatic.com/s/stacksansnotch/v5/TwMY-JcVXlQd3ooGEx9EbUzgioTr5BY5lEpidqlSR8c8vh2ZGGf6Bw3r.ttf", + "700": "https://fonts.gstatic.com/s/stacksansnotch/v5/TwMY-JcVXlQd3ooGEx9EbUzgioTr5BY5lEpidqlSR8cFvh2ZGGf6Bw3r.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stacksansnotch/v5/TwMY-JcVXlQd3ooGEx9EbUzgioTr5BY5lEpidqlSR8fiuS2YEmM.ttf" + }, + { + "family": "Stack Sans Text", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-11-04", + "files": { + "200": "https://fonts.gstatic.com/s/stacksanstext/v1/kJEkBuAJ-Q0hiGPmzHEu345X1JJNBpRJ3RPan47MNo-KJO1yGgKF1a0.ttf", + "300": "https://fonts.gstatic.com/s/stacksanstext/v1/kJEkBuAJ-Q0hiGPmzHEu345X1JJNBpRJ3RPan47MNlGKJO1yGgKF1a0.ttf", + "regular": "https://fonts.gstatic.com/s/stacksanstext/v1/kJEkBuAJ-Q0hiGPmzHEu345X1JJNBpRJ3RPan47MNg-KJO1yGgKF1a0.ttf", + "500": "https://fonts.gstatic.com/s/stacksanstext/v1/kJEkBuAJ-Q0hiGPmzHEu345X1JJNBpRJ3RPan47MNj2KJO1yGgKF1a0.ttf", + "600": "https://fonts.gstatic.com/s/stacksanstext/v1/kJEkBuAJ-Q0hiGPmzHEu345X1JJNBpRJ3RPan47MNtGNJO1yGgKF1a0.ttf", + "700": "https://fonts.gstatic.com/s/stacksanstext/v1/kJEkBuAJ-Q0hiGPmzHEu345X1JJNBpRJ3RPan47MNuiNJO1yGgKF1a0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stacksanstext/v1/kJEkBuAJ-Q0hiGPmzHEu345X1JJNBpRJ3RPan47MNg-KFOx4Hg.ttf" + }, + { + "family": "Stalemate", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/stalemate/v24/taiIGmZ_EJq97-UfkZRpuqSs8ZQpaQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stalemate/v24/taiIGmZ_EJq97-UfkZRZu66o.ttf" + }, + { + "family": "Stalinist One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v58", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/stalinistone/v58/MQpS-WezM9W4Dd7D3B7I-UT7eZ-UPyacPbo.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stalinistone/v58/MQpS-WezM9W4Dd7D3B7I-UT7SZ6eOw.ttf" + }, + { + "family": "Stardos Stencil", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v15", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/stardosstencil/v15/X7n94bcuGPC8hrvEOHXOgaKCc2TR71R3tiSx0g.ttf", + "700": "https://fonts.gstatic.com/s/stardosstencil/v15/X7n44bcuGPC8hrvEOHXOgaKCc2TpU3tTvg-t29HSHw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stardosstencil/v15/X7n94bcuGPC8hrvEOHXOgaKCc2Th7l5z.ttf" + }, + { + "family": "Stick", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/stick/v20/Qw3TZQpMCyTtJSvfvPVDMPoF.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stick/v20/Qw3TZQpMCyTtJRvetvE.ttf" + }, + { + "family": "Stick No Bills", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "sinhala" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVP8Q7KriwKhcTKA.ttf", + "300": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcV4cQ7KriwKhcTKA.ttf", + "regular": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVv8Q7KriwKhcTKA.ttf", + "500": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVjcQ7KriwKhcTKA.ttf", + "600": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVYcM7KriwKhcTKA.ttf", + "700": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVWMM7KriwKhcTKA.ttf", + "800": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVP8M7KriwKhcTKA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sticknobills/v17/bWts7ffXZwHuAa9Uld-oEK4QKlxj9f9t_7uEmjcVv8QLK7K0.ttf" + }, + { + "family": "Stint Ultra Condensed", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/stintultracondensed/v25/-W_gXIrsVjjeyEnPC45qD2NoFPtBE0xCh2A-qhUO2cNvdg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stintultracondensed/v25/-W_gXIrsVjjeyEnPC45qD2NoFPtBE0xCh2AOqx8K.ttf" + }, + { + "family": "Stint Ultra Expanded", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/stintultraexpanded/v24/CSRg4yNNh-GbW3o3JkwoDcdvMKMf0oBAd0qoATQkWwam.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stintultraexpanded/v24/CSRg4yNNh-GbW3o3JkwoDcdvMKMf0oBAd3qpCzA.ttf" + }, + { + "family": "Stoke", + "variants": [ + "300", + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/stoke/v26/z7NXdRb7aTMfKNvFVgxC_pjcTeWU.ttf", + "regular": "https://fonts.gstatic.com/s/stoke/v26/z7NadRb7aTMfKONpfihK1YTV.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stoke/v26/z7NadRb7aTMfKNNodCw.ttf" + }, + { + "family": "Story Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v3", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/storyscript/v3/mem5YaSw02SQ0OlzDuR8Isk-VeJoCqeDjg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/storyscript/v3/mem5YaSw02SQ0OlzDuR8IskOVOhs.ttf" + }, + { + "family": "Strait", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/strait/v19/DtViJxy6WaEr1LZzeDhtkl0U7w.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/strait/v19/DtViJxy6WaEr1LZDeTJp.ttf" + }, + { + "family": "Style Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/stylescript/v13/vm8xdRX3SV7Z0aPa88xzW5npeFT76NZnMw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stylescript/v13/vm8xdRX3SV7Z0aPa88xzW5nZeV7_.ttf" + }, + { + "family": "Stylish", + "variants": [ + "regular" + ], + "subsets": [ + "korean" + ], + "version": "v25", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/stylish/v25/m8JSjfhPYriQkk7-fo35dLxEdmo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/stylish/v25/m8JSjfhPYriQkk7-TozzcA.ttf" + }, + { + "family": "Sue Ellen Francisco", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/sueellenfrancisco/v22/wXK3E20CsoJ9j1DDkjHcQ5ZL8xRaxru9ropF2lqk9H4.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sueellenfrancisco/v22/wXK3E20CsoJ9j1DDkjHcQ5ZL8xRaxru9notP3g.ttf" + }, + { + "family": "Suez One", + "variants": [ + "regular" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/suezone/v15/taiJGmd_EZ6rqscQgNFJkIqg-I0w.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/suezone/v15/taiJGmd_EZ6rqscQgOFImo4.ttf" + }, + { + "family": "Sulphur Point", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/sulphurpoint/v16/RLpkK5vv8KaycDcazWFPBj2afVU6n6kFUHPIFaU.ttf", + "regular": "https://fonts.gstatic.com/s/sulphurpoint/v16/RLp5K5vv8KaycDcazWFPBj2aRfkSu6EuTHo.ttf", + "700": "https://fonts.gstatic.com/s/sulphurpoint/v16/RLpkK5vv8KaycDcazWFPBj2afUU9n6kFUHPIFaU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sulphurpoint/v16/RLp5K5vv8KaycDcazWFPBj2adfgYvw.ttf" + }, + { + "family": "Sumana", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/sumana/v12/4UaDrE5TqRBjGj-G8Bji76zR4w.ttf", + "700": "https://fonts.gstatic.com/s/sumana/v12/4UaArE5TqRBjGj--TDfG54fN6ppsKg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sumana/v12/4UaDrE5TqRBjGj-28RLm.ttf" + }, + { + "family": "Sunflower", + "variants": [ + "300", + "500", + "700" + ], + "subsets": [ + "korean" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/sunflower/v18/RWmPoKeF8fUjqIj7Vc-06MfiqYsGBGBzCw.ttf", + "500": "https://fonts.gstatic.com/s/sunflower/v18/RWmPoKeF8fUjqIj7Vc-0sMbiqYsGBGBzCw.ttf", + "700": "https://fonts.gstatic.com/s/sunflower/v18/RWmPoKeF8fUjqIj7Vc-0-MDiqYsGBGBzCw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sunflower/v18/RWmPoKeF8fUjqIj7Vc-06MfSqIEC.ttf" + }, + { + "family": "Sunshiney", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/sunshiney/v24/LDIwapGTLBwsS-wT4vcgE8moUePWkg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sunshiney/v24/LDIwapGTLBwsS-wT4vcQEsOs.ttf" + }, + { + "family": "Supermercado One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/supermercadoone/v29/OpNXnpQWg8jc_xps_Gi14kVVEXOn60b3MClBRTs.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/supermercadoone/v29/OpNXnpQWg8jc_xps_Gi14kVVEXOn20f9NA.ttf" + }, + { + "family": "Sura", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/sura/v21/SZc23FL5PbyzFf5UWzXtjUM.ttf", + "700": "https://fonts.gstatic.com/s/sura/v21/SZc53FL5PbyzLUJ7fz3GkUrS8DI.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/sura/v21/SZc23FL5PbyzJf9eXw.ttf" + }, + { + "family": "Suranna", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v15", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/suranna/v15/gokuH6ztGkFjWe58tBRZT2KmgP0.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/suranna/v15/gokuH6ztGkFjWe58hBVTSw.ttf" + }, + { + "family": "Suravaram", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/suravaram/v23/_gP61R_usiY7SCym4xIAi261Qv9roQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/suravaram/v23/_gP61R_usiY7SCym4xIwimSx.ttf" + }, + { + "family": "Suwannaphum", + "variants": [ + "100", + "300", + "regular", + "700", + "900" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v33", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnAgHV7GtDvc8jbe8hXXL3B9cSWXx2VZmk.ttf", + "300": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnfgHV7GtDvc8jbe8hXXL0J1-S8cRGcf3Ai.ttf", + "regular": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnCgHV7GtDvc8jbe8hXXIWl_8C0Wg2V.ttf", + "700": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnfgHV7GtDvc8jbe8hXXL0Z0OS8cRGcf3Ai.ttf", + "900": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnfgHV7GtDvc8jbe8hXXL0h0uS8cRGcf3Ai.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/suwannaphum/v33/jAnCgHV7GtDvc8jbe8hXXLWk9cQ.ttf" + }, + { + "family": "Swanky and Moo Moo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/swankyandmoomoo/v24/flUlRrKz24IuWVI_WJYTYcqbEsMUZ3kUtbPkR64SYQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/swankyandmoomoo/v24/flUlRrKz24IuWVI_WJYTYcqbEsMUZ3kktLng.ttf" + }, + { + "family": "Syncopate", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/syncopate/v24/pe0sMIuPIYBCpEV5eFdyAv2-C99ycg.ttf", + "700": "https://fonts.gstatic.com/s/syncopate/v24/pe0pMIuPIYBCpEV5eFdKvtKaA_Rue1UwVg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/syncopate/v24/pe0sMIuPIYBCpEV5eFdCA_e6.ttf" + }, + { + "family": "Syne", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "greek", + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_04uT6kR47NCV5Z.ttf", + "500": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_0KuT6kR47NCV5Z.ttf", + "600": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_3mvj6kR47NCV5Z.ttf", + "700": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_3fvj6kR47NCV5Z.ttf", + "800": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_24vj6kR47NCV5Z.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/syne/v24/8vIS7w4qzmVxsWxjBZRjr0FKM_04uQ6lTYo.ttf" + }, + { + "family": "Syne Mono", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/synemono/v16/K2FzfZNHj_FHBmRbFvHzIqCkDyvqZA.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/synemono/v16/K2FzfZNHj_FHBmRbFvHDI6qg.ttf" + }, + { + "family": "Syne Tactile", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/synetactile/v16/11hGGpna2UTQKjMCVzjAPMKh3ysdjvKU8Q.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/synetactile/v16/11hGGpna2UTQKjMCVzjAPMKR3iEZ.ttf" + }, + { + "family": "TASA Explorer", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI6o7xnGirZPlnP-.ttf", + "500": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI6a7xnGirZPlnP-.ttf", + "600": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI526BnGirZPlnP-.ttf", + "700": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI5P6BnGirZPlnP-.ttf", + "800": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI4o6BnGirZPlnP-.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tasaexplorer/v2/K2FkfZdAt8xjBmxMCPK8UO_SPSH6kbsQNeItOI6o7ynHgLI.ttf" + }, + { + "family": "TASA Orbiter", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVH4C8py095IuGcc.ttf", + "500": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVEwC8py095IuGcc.ttf", + "600": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVKAF8py095IuGcc.ttf", + "700": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVJkF8py095IuGcc.ttf", + "800": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVP4F8py095IuGcc.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tasaorbiter/v2/3XF4Erw3860rsdSUVZx78hPcTvQoDGHxaFGfVH4Cwp2-8w.ttf" + }, + { + "family": "Tac One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/tacone/v5/ahcZv8Cj3zw7qDr8fO4hU-FwnU0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tacone/v5/ahcZv8Cj3zw7qDr8TO8rVw.ttf" + }, + { + "family": "Tagesschrift", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-04-23", + "files": { + "regular": "https://fonts.gstatic.com/s/tagesschrift/v2/pe0pMI6IOYlEuEZ7ZEA7ZKOaA_Rue1UwVg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tagesschrift/v2/pe0pMI6IOYlEuEZ7ZEA7ZKOqAv5q.ttf" + }, + { + "family": "Tai Heritage Pro", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "tai-viet", + "vietnamese" + ], + "version": "v9", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/taiheritagepro/v9/sZlfdQid-zgaNiNIYcUzJMU3IYyNoHxSENxuLuE.ttf", + "700": "https://fonts.gstatic.com/s/taiheritagepro/v9/sZlYdQid-zgaNiNIYcUzJMU3IYyNmMB9NNRFMuhjCXY.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/taiheritagepro/v9/sZlfdQid-zgaNiNIYcUzJMU3IYyNkH1YFA.ttf" + }, + { + "family": "Tajawal", + "variants": [ + "200", + "300", + "regular", + "500", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin" + ], + "version": "v12", + "lastModified": "2025-09-08", + "files": { + "200": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l_6gLrZjiLlJ-G0.ttf", + "300": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l5qjLrZjiLlJ-G0.ttf", + "regular": "https://fonts.gstatic.com/s/tajawal/v12/Iura6YBj_oCad4k1rzaLCr5IlLA.ttf", + "500": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l8KiLrZjiLlJ-G0.ttf", + "700": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l4qkLrZjiLlJ-G0.ttf", + "800": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l5anLrZjiLlJ-G0.ttf", + "900": "https://fonts.gstatic.com/s/tajawal/v12/Iurf6YBj_oCad4k1l7KmLrZjiLlJ-G0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tajawal/v12/Iura6YBj_oCad4k1nzeBDg.ttf" + }, + { + "family": "Tangerine", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/tangerine/v18/IurY6Y5j_oScZZow4VOBDpxNhLBQ4Q.ttf", + "700": "https://fonts.gstatic.com/s/tangerine/v18/Iurd6Y5j_oScZZow4VO5srNpjJtM6G0t9w.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tangerine/v18/IurY6Y5j_oScZZow4VOxD5ZJ.ttf" + }, + { + "family": "Tapestry", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/tapestry/v6/SlGTmQecrosEYXhaGBIkqnB6aSQU.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tapestry/v6/SlGTmQecrosEYXhaGCIloHQ.ttf" + }, + { + "family": "Taprom", + "variants": [ + "regular" + ], + "subsets": [ + "khmer", + "latin" + ], + "version": "v29", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/taprom/v29/UcCn3F82JHycULbFQyk3-0kvHg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/taprom/v29/UcCn3F82JHycULb1QiMz.ttf" + }, + { + "family": "Tauri", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/tauri/v20/TwMA-IISS0AM3IpVWHU_TBqO.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tauri/v20/TwMA-IISS0AM3LpUUnE.ttf" + }, + { + "family": "Taviraj", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v15", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/taviraj/v15/ahcbv8Cj3ylylTXzRIorV8N1jU2gog.ttf", + "100italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcdv8Cj3ylylTXzTOwTM8lxr0iwolLl.ttf", + "200": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRCYKd-lbgUS5u0s.ttf", + "200italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwTn-hRhWa8q0v8ag.ttf", + "300": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzREIJd-lbgUS5u0s.ttf", + "300italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwT--tRhWa8q0v8ag.ttf", + "regular": "https://fonts.gstatic.com/s/taviraj/v15/ahcZv8Cj3ylylTXzfO4hU-FwnU0.ttf", + "italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcbv8Cj3ylylTXzTOwrV8N1jU2gog.ttf", + "500": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRBoId-lbgUS5u0s.ttf", + "500italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwTo-pRhWa8q0v8ag.ttf", + "600": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRDYPd-lbgUS5u0s.ttf", + "600italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwTj-1RhWa8q0v8ag.ttf", + "700": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRFIOd-lbgUS5u0s.ttf", + "700italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwT6-xRhWa8q0v8ag.ttf", + "800": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRE4Nd-lbgUS5u0s.ttf", + "800italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwT9-9RhWa8q0v8ag.ttf", + "900": "https://fonts.gstatic.com/s/taviraj/v15/ahccv8Cj3ylylTXzRGoMd-lbgUS5u0s.ttf", + "900italic": "https://fonts.gstatic.com/s/taviraj/v15/ahcev8Cj3ylylTXzTOwT0-5RhWa8q0v8ag.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/taviraj/v15/ahcZv8Cj3ylylTXzTO8rVw.ttf" + }, + { + "family": "Teachers", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "greek-ext", + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBr3powY55O4AS32A.ttf", + "500": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBr7JowY55O4AS32A.ttf", + "600": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBrAJ0wY55O4AS32A.ttf", + "700": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBrOZ0wY55O4AS32A.ttf", + "800": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBrXp0wY55O4AS32A.ttf", + "italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-FtnYIJRKwgGn2JLo.ttf", + "500italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-FtnqIJRKwgGn2JLo.ttf", + "600italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-FtkGJ5RKwgGn2JLo.ttf", + "700italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-Ftk_J5RKwgGn2JLo.ttf", + "800italic": "https://fonts.gstatic.com/s/teachers/v6/H4c3BXKVncXVmUGsgRY40rCwdnYr0Dd-FtlYJ5RKwgGn2JLo.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/teachers/v6/H4c5BXKVncXVmUGsgTwx4E9oHx2xfjBr3poAYpRK.ttf" + }, + { + "family": "Teko", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN9JG7Sy3TKEvkCF.ttf", + "regular": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN8XG7Sy3TKEvkCF.ttf", + "500": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN8lG7Sy3TKEvkCF.ttf", + "600": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN_JHLSy3TKEvkCF.ttf", + "700": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN_wHLSy3TKEvkCF.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/teko/v23/LYjYdG7kmE0gV69VVPPdFl06VN8XG4Sz1zY.ttf" + }, + { + "family": "Tektur", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrwuVYtOY8P7TWd0.ttf", + "500": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrwcVYtOY8P7TWd0.ttf", + "600": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrzwUotOY8P7TWd0.ttf", + "700": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrzJUotOY8P7TWd0.ttf", + "800": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TryuUotOY8P7TWd0.ttf", + "900": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TryHUotOY8P7TWd0.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tektur/v6/XoHN2YHtS7q969kXCjzlV0aSkS_o8OacmTe0TYlYFot8TrwuVbtPacc.ttf" + }, + { + "family": "Telex", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/telex/v18/ieVw2Y1fKWmIO9fTB1piKFIf.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/telex/v18/ieVw2Y1fKWmIO-fSDV4.ttf" + }, + { + "family": "Tenali Ramakrishna", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v14", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/tenaliramakrishna/v14/raxgHj6Yt9gAN3LLKs0BZVMo8jmwn1-8KJXqUFFvtA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tenaliramakrishna/v14/raxgHj6Yt9gAN3LLKs0BZVMo8jmwn1-MKZ_u.ttf" + }, + { + "family": "Tenor Sans", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/tenorsans/v21/bx6ANxqUneKx06UkIXISr3JyC22IyqI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tenorsans/v21/bx6ANxqUneKx06UkIXISn3N4Dw.ttf" + }, + { + "family": "Text Me One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v26", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/textmeone/v26/i7dOIFdlayuLUvgoFvHQFWZcalayGhyV.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/textmeone/v26/i7dOIFdlayuLUvgoFvHQFVZdYFI.ttf" + }, + { + "family": "Texturina", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v32", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2eYG_Ug25riW1OD.ttf", + "200": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2cYGvUg25riW1OD.ttf", + "300": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2fGGvUg25riW1OD.ttf", + "regular": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2eYGvUg25riW1OD.ttf", + "500": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2eqGvUg25riW1OD.ttf", + "600": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2dGHfUg25riW1OD.ttf", + "700": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2d_HfUg25riW1OD.ttf", + "800": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2cYHfUg25riW1OD.ttf", + "900": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2cxHfUg25riW1OD.ttf", + "100italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWR1i0Z7AXkODN94.ttf", + "200italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWZ1j0Z7AXkODN94.ttf", + "300italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWUNj0Z7AXkODN94.ttf", + "italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWR1j0Z7AXkODN94.ttf", + "500italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWS9j0Z7AXkODN94.ttf", + "600italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWcNk0Z7AXkODN94.ttf", + "700italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWfpk0Z7AXkODN94.ttf", + "800italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWZ1k0Z7AXkODN94.ttf", + "900italic": "https://fonts.gstatic.com/s/texturina/v32/c4mO1nxpEtL3pXiAulR5mL129FhZmLj7I4oiSUJyfYDu7sB5zHJQWbRk0Z7AXkODN94.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/texturina/v32/c4mM1nxpEtL3pXiAulRTkY-HGmNEX1b9NspjMwhAgliHhVrXy2eYGsUh0Z4.ttf" + }, + { + "family": "Thasadith", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/thasadith/v13/mtG44_1TIqPYrd_f5R1YsEkU0CWuFw.ttf", + "italic": "https://fonts.gstatic.com/s/thasadith/v13/mtG-4_1TIqPYrd_f5R1oskMQ8iC-F1ZE.ttf", + "700": "https://fonts.gstatic.com/s/thasadith/v13/mtG94_1TIqPYrd_f5R1gDGYw2A6yHk9d8w.ttf", + "700italic": "https://fonts.gstatic.com/s/thasadith/v13/mtGj4_1TIqPYrd_f5R1osnus3QS2PEpN8zxA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/thasadith/v13/mtG44_1TIqPYrd_f5R1osUMQ.ttf" + }, + { + "family": "The Girl Next Door", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/thegirlnextdoor/v25/pe0zMJCIMIsBjFxqYBIcZ6_OI5oFHCYIV7t7w6bE2A.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/thegirlnextdoor/v25/pe0zMJCIMIsBjFxqYBIcZ6_OI5oFHCY4VrF_.ttf" + }, + { + "family": "The Nautigal", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/thenautigal/v8/VdGZAZ8ZH51Lvng9fQV2bfKr5wVk09Se5Q.ttf", + "700": "https://fonts.gstatic.com/s/thenautigal/v8/VdGGAZ8ZH51Lvng9fQV2bfKTWypA2_-C7LoS7g.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/thenautigal/v8/VdGZAZ8ZH51Lvng9fQV2bfKb5g9g.ttf" + }, + { + "family": "Tienne", + "variants": [ + "regular", + "700", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/tienne/v21/AYCKpX7pe9YCRP0LkEPHSFNyxw.ttf", + "700": "https://fonts.gstatic.com/s/tienne/v21/AYCJpX7pe9YCRP0zLGzjQHhuzvef5Q.ttf", + "900": "https://fonts.gstatic.com/s/tienne/v21/AYCJpX7pe9YCRP0zFG7jQHhuzvef5Q.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tienne/v21/AYCKpX7pe9YCRP07kUnD.ttf" + }, + { + "family": "TikTok Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-11", + "files": { + "300": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7VuH1pFroETJ6Rg.ttf", + "regular": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7COH1pFroETJ6Rg.ttf", + "500": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7OuH1pFroETJ6Rg.ttf", + "600": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo71ub1pFroETJ6Rg.ttf", + "700": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo77-b1pFroETJ6Rg.ttf", + "800": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7iOb1pFroETJ6Rg.ttf", + "900": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7oeb1pFroETJ6Rg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tiktoksans/v7/70kbu7g-Lm8OXGnh_Ow1sUfFMmlnhbRF425wxXH-UGeud7XItbaHtxhggMrrmAvSNAHtMV6x5PpBL2J5Rgbj-Bo7COHFpVDs.ttf" + }, + { + "family": "Tillana", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/tillana/v15/VuJxdNvf35P4qJ1OeKbXOIFneRo.ttf", + "500": "https://fonts.gstatic.com/s/tillana/v15/VuJ0dNvf35P4qJ1OQFL-HIlMZRNcp0o.ttf", + "600": "https://fonts.gstatic.com/s/tillana/v15/VuJ0dNvf35P4qJ1OQH75HIlMZRNcp0o.ttf", + "700": "https://fonts.gstatic.com/s/tillana/v15/VuJ0dNvf35P4qJ1OQBr4HIlMZRNcp0o.ttf", + "800": "https://fonts.gstatic.com/s/tillana/v15/VuJ0dNvf35P4qJ1OQAb7HIlMZRNcp0o.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tillana/v15/VuJxdNvf35P4qJ1OSKfdPA.ttf" + }, + { + "family": "Tilt Neon", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/tiltneon/v12/E21L_d7gguXdwD9LEFY2WCeElCNtd-eBqpHp1TzrkJSmwpj5ndxquXK9WualJ9DS.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tiltneon/v12/E21L_d7gguXdwD9LEFY2WCeElCNtd-eBqpHp1TzrkJSmwpj5ndxquUK8UOI.ttf" + }, + { + "family": "Tilt Prism", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/tiltprism/v16/5h11iZgyPHoZ3YikNzWGfWey2dCAZXT-bH9V4VGn-FJ7tLI25oc_rIbwoTSrn86NKw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tiltprism/v16/5h11iZgyPHoZ3YikNzWGfWey2dCAZXT-bH9V4VGn-FJ7tLI25oc_rIbAoD6v.ttf" + }, + { + "family": "Tilt Warp", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/tiltwarp/v18/AlZc_zVDs5XpmO7yn3w7flUoytXJp3z29uEwmEMLEJljLXvT8UJSZTBxAVfMGOPb.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tiltwarp/v18/AlZc_zVDs5XpmO7yn3w7flUoytXJp3z29uEwmEMLEJljLXvT8UJSZQBwC1M.ttf" + }, + { + "family": "Timmana", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "telugu" + ], + "version": "v14", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/timmana/v14/6xKvdShfL9yK-rvpCmvbKHwJUOM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/timmana/v14/6xKvdShfL9yK-rvpOmrRLA.ttf" + }, + { + "family": "Tinos", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/tinos/v25/buE4poGnedXvwgX8dGVh8TI-.ttf", + "italic": "https://fonts.gstatic.com/s/tinos/v25/buE2poGnedXvwjX-fmFD9CI-4NU.ttf", + "700": "https://fonts.gstatic.com/s/tinos/v25/buE1poGnedXvwj1AW0Fp2i43-cxL.ttf", + "700italic": "https://fonts.gstatic.com/s/tinos/v25/buEzpoGnedXvwjX-Rt1s0CoV_NxLeiw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tinos/v25/buE4poGnedXvwjX9fmE.ttf" + }, + { + "family": "Tiny5", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/tiny5/v3/KFOpCnmCvdGT7hw-z0hHAi88.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tiny5/v3/KFOpCnmCvdGT7iw_xUw.ttf" + }, + { + "family": "Tiro Bangla", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "bengali", + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/tirobangla/v6/IFSgHe1Tm95E3O8b5i2V8MG9-UPeuz4i.ttf", + "italic": "https://fonts.gstatic.com/s/tirobangla/v6/IFSiHe1Tm95E3O8b5i2V8PG_80f8vi4imBM.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tirobangla/v6/IFSgHe1Tm95E3O8b5i2V8PG880c.ttf" + }, + { + "family": "Tiro Devanagari Hindi", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/tirodevanagarihindi/v5/55xyezN7P8T4e0_CfIJrwdodg9HoYw0i-M9fSOkOfG0Y3A.ttf", + "italic": "https://fonts.gstatic.com/s/tirodevanagarihindi/v5/55x8ezN7P8T4e0_CfIJrwdodg9HoYw0i-M9vSuMKXmgI3F_o.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tirodevanagarihindi/v5/55xyezN7P8T4e0_CfIJrwdodg9HoYw0i-M9vSeMK.ttf" + }, + { + "family": "Tiro Devanagari Marathi", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/tirodevanagarimarathi/v5/fC1xPZBSZHrRhS3rd4M0MAPNJUHl4znXCxAkotDrDJYM2lAZ.ttf", + "italic": "https://fonts.gstatic.com/s/tirodevanagarimarathi/v5/fC1zPZBSZHrRhS3rd4M0MAPNJUHl4znXCxAkouDpBpIu30AZbUY.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tirodevanagarimarathi/v5/fC1xPZBSZHrRhS3rd4M0MAPNJUHl4znXCxAkouDqBpI.ttf" + }, + { + "family": "Tiro Devanagari Sanskrit", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/tirodevanagarisanskrit/v5/MCoAzBbr09vVUgVBM8FWu_yZdZkhkg-I0nUlb59pEoEqgtOh0w.ttf", + "italic": "https://fonts.gstatic.com/s/tirodevanagarisanskrit/v5/MCoGzBbr09vVUgVBM8FWu_yZdZkhkg-I0nUlb59ZEIsuoNax06MM.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tirodevanagarisanskrit/v5/MCoAzBbr09vVUgVBM8FWu_yZdZkhkg-I0nUlb59ZE4su.ttf" + }, + { + "family": "Tiro Gurmukhi", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "gurmukhi", + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/tirogurmukhi/v6/x3dmckXSYq-Uqjc048JUF7Jvly7HAQsyA2Y.ttf", + "italic": "https://fonts.gstatic.com/s/tirogurmukhi/v6/x3d4ckXSYq-Uqjc048JUF7JvpyzNBSk3E2YljQ.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tirogurmukhi/v6/x3dmckXSYq-Uqjc048JUF7Jvpy_NBQ.ttf" + }, + { + "family": "Tiro Kannada", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "kannada", + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/tirokannada/v6/CSR44ztKmvqaDxEDJFY7CIYKSPl6tOU9Eg.ttf", + "italic": "https://fonts.gstatic.com/s/tirokannada/v6/CSRm4ztKmvqaDxEDJFY7CIY6SvN-luAtEnKp.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tirokannada/v6/CSR44ztKmvqaDxEDJFY7CIY6SfN-.ttf" + }, + { + "family": "Tiro Tamil", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext", + "tamil" + ], + "version": "v11", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/tirotamil/v11/m8JXjfVIf7OT22n3M-S_ULRvamODxdI.ttf", + "italic": "https://fonts.gstatic.com/s/tirotamil/v11/m8JVjfVIf7OT22n3M-S_YLZlbkGG1dKEDw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tirotamil/v11/m8JXjfVIf7OT22n3M-S_YLVlbg.ttf" + }, + { + "family": "Tiro Telugu", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext", + "telugu" + ], + "version": "v7", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/tirotelugu/v7/aFTQ7PxlZWk2EPiSymjXdKSNQqn0X0BO.ttf", + "italic": "https://fonts.gstatic.com/s/tirotelugu/v7/aFTS7PxlZWk2EPiSymjXdJSPSK3WWlBOoas.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tirotelugu/v7/aFTQ7PxlZWk2EPiSymjXdJSMSK0.ttf" + }, + { + "family": "Tirra", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "tifinagh" + ], + "version": "v2", + "lastModified": "2025-08-26", + "files": { + "regular": "https://fonts.gstatic.com/s/tirra/v2/WBLrrEnNakREGrPF3AHdWn3J.ttf", + "500": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGosx9SXVcWHALdio.ttf", + "600": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGosd8iXVcWHALdio.ttf", + "700": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGot58yXVcWHALdio.ttf", + "800": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGotl8CXVcWHALdio.ttf", + "900": "https://fonts.gstatic.com/s/tirra/v2/WBLmrEnNakREGotB8SXVcWHALdio.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tirra/v2/WBLrrEnNakREGoPE1gU.ttf" + }, + { + "family": "Titan One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/titanone/v17/mFTzWbsGxbbS_J5cQcjykzIn2Etikg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/titanone/v17/mFTzWbsGxbbS_J5cQcjCkjgj.ttf" + }, + { + "family": "Titillium Web", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffAzHKIx5YrSYqWM.ttf", + "200italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPFcZTIAOhVxoMyOr9n_E7fdMbewI1zZpaduWMmxA.ttf", + "300": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffGjEKIx5YrSYqWM.ttf", + "300italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPFcZTIAOhVxoMyOr9n_E7fdMbepI5zZpaduWMmxA.ttf", + "regular": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPecZTIAOhVxoMyOr9n_E7fRMTsDIRSfr0.ttf", + "italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPAcZTIAOhVxoMyOr9n_E7fdMbmCKZXbr2BsA.ttf", + "600": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffBzCKIx5YrSYqWM.ttf", + "600italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPFcZTIAOhVxoMyOr9n_E7fdMbe0IhzZpaduWMmxA.ttf", + "700": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffHjDKIx5YrSYqWM.ttf", + "700italic": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPFcZTIAOhVxoMyOr9n_E7fdMbetIlzZpaduWMmxA.ttf", + "900": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPDcZTIAOhVxoMyOr9n_E7ffEDBKIx5YrSYqWM.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/titilliumweb/v19/NaPecZTIAOhVxoMyOr9n_E7fdMXmCA.ttf" + }, + { + "family": "Tomorrow", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/tomorrow/v19/WBLgrETNbFtZCeGqgR2xe2XiKMiokE4.ttf", + "100italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLirETNbFtZCeGqgRXXQwHoLOqtgE5h0A.ttf", + "200": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR0dWkXIBsShiVd4.ttf", + "200italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ63JDMCDjEd4yVY.ttf", + "300": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR15WUXIBsShiVd4.ttf", + "300italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ8nKDMCDjEd4yVY.ttf", + "regular": "https://fonts.gstatic.com/s/tomorrow/v19/WBLmrETNbFtZCeGqgSXVcWHALdio.ttf", + "italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLgrETNbFtZCeGqgRXXe2XiKMiokE4.ttf", + "500": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR0hWEXIBsShiVd4.ttf", + "500italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ5HLDMCDjEd4yVY.ttf", + "600": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR0NX0XIBsShiVd4.ttf", + "600italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ73MDMCDjEd4yVY.ttf", + "700": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR1pXkXIBsShiVd4.ttf", + "700italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ9nNDMCDjEd4yVY.ttf", + "800": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR11XUXIBsShiVd4.ttf", + "800italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ8XODMCDjEd4yVY.ttf", + "900": "https://fonts.gstatic.com/s/tomorrow/v19/WBLhrETNbFtZCeGqgR1RXEXIBsShiVd4.ttf", + "900italic": "https://fonts.gstatic.com/s/tomorrow/v19/WBLjrETNbFtZCeGqgRXXQ-HPDMCDjEd4yVY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tomorrow/v19/WBLmrETNbFtZCeGqgRXUe2U.ttf" + }, + { + "family": "Tourney", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GOQByZTp1I1LcGA.ttf", + "200": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GuQFyZTp1I1LcGA.ttf", + "300": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GZwFyZTp1I1LcGA.ttf", + "regular": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GOQFyZTp1I1LcGA.ttf", + "500": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GCwFyZTp1I1LcGA.ttf", + "600": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7G5wZyZTp1I1LcGA.ttf", + "700": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7G3gZyZTp1I1LcGA.ttf", + "800": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GuQZyZTp1I1LcGA.ttf", + "900": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GkAZyZTp1I1LcGA.ttf", + "100italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UKaJzBxAVfMGOPb.ttf", + "200italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UIaJjBxAVfMGOPb.ttf", + "300italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8ULEJjBxAVfMGOPb.ttf", + "italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UKaJjBxAVfMGOPb.ttf", + "500italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UKoJjBxAVfMGOPb.ttf", + "600italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UJEITBxAVfMGOPb.ttf", + "700italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UJ9ITBxAVfMGOPb.ttf", + "800italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UIaITBxAVfMGOPb.ttf", + "900italic": "https://fonts.gstatic.com/s/tourney/v16/AlZc_ztDtYzv1tzq_Q47flUUvI2wpXz29ilymEMLMNc3XHnT8UIzITBxAVfMGOPb.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tourney/v16/AlZa_ztDtYzv1tzq1wcJnbVt7xseomk-tNs7qrzTWbyt8n7GOQFCZDBx.ttf" + }, + { + "family": "Trade Winds", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/tradewinds/v18/AYCPpXPpYNIIT7h8-QenM3Jq7PKP5Z_G.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tradewinds/v18/AYCPpXPpYNIIT7h8-QenM0Jr5vY.ttf" + }, + { + "family": "Train One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/trainone/v16/gyB-hwkiNtc6KnxUVjWHOqbZRY7JVQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/trainone/v16/gyB-hwkiNtc6KnxUVjW3O6zd.ttf" + }, + { + "family": "Triodion", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin" + ], + "version": "v3", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/triodion/v3/IFSnHe5TgMVEmMQV5mr5u-W10l_X.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/triodion/v3/IFSnHe5TgMVEmMQV5lr4seE.ttf" + }, + { + "family": "Trirong", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "thai", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/trirong/v17/7r3EqXNgp8wxdOdOl-go3YRl6ujngw.ttf", + "100italic": "https://fonts.gstatic.com/s/trirong/v17/7r3CqXNgp8wxdOdOn44QuY5hyO33g8IY.ttf", + "200": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOl0QJ_a5L5uH-mts.ttf", + "200italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QFa9B4sP7itsB5g.ttf", + "300": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOlyAK_a5L5uH-mts.ttf", + "300italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QcaxB4sP7itsB5g.ttf", + "regular": "https://fonts.gstatic.com/s/trirong/v17/7r3GqXNgp8wxdOdOr4wi2aZg-ug.ttf", + "italic": "https://fonts.gstatic.com/s/trirong/v17/7r3EqXNgp8wxdOdOn44o3YRl6ujngw.ttf", + "500": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOl3gL_a5L5uH-mts.ttf", + "500italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QKa1B4sP7itsB5g.ttf", + "600": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOl1QM_a5L5uH-mts.ttf", + "600italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QBapB4sP7itsB5g.ttf", + "700": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOlzAN_a5L5uH-mts.ttf", + "700italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QYatB4sP7itsB5g.ttf", + "800": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOlywO_a5L5uH-mts.ttf", + "800italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QfahB4sP7itsB5g.ttf", + "900": "https://fonts.gstatic.com/s/trirong/v17/7r3DqXNgp8wxdOdOlwgP_a5L5uH-mts.ttf", + "900italic": "https://fonts.gstatic.com/s/trirong/v17/7r3BqXNgp8wxdOdOn44QWalB4sP7itsB5g.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/trirong/v17/7r3GqXNgp8wxdOdOn40o3Q.ttf" + }, + { + "family": "Trispace", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-08", + "files": { + "100": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbH9qoQl0zHugpt0.ttf", + "200": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbP9roQl0zHugpt0.ttf", + "300": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbCFroQl0zHugpt0.ttf", + "regular": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbH9roQl0zHugpt0.ttf", + "500": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbE1roQl0zHugpt0.ttf", + "600": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbKFsoQl0zHugpt0.ttf", + "700": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbJhsoQl0zHugpt0.ttf", + "800": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbP9soQl0zHugpt0.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/trispace/v27/Yq65-LKSQC3o56LxxgRrtA6yBqsrXL5GI5KI-IUZVGsxWFIlbH9rkQh-yA.ttf" + }, + { + "family": "Trocchi", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/trocchi/v19/qWcqB6WkuIDxDZLcDrtUvMeTYD0.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/trocchi/v19/qWcqB6WkuIDxDZLcPrpeuA.ttf" + }, + { + "family": "Trochut", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/trochut/v24/CHyjV-fDDlP9bDIw5nSIfVIPLns.ttf", + "italic": "https://fonts.gstatic.com/s/trochut/v24/CHyhV-fDDlP9bDIw1naCeXAKPns8jw.ttf", + "700": "https://fonts.gstatic.com/s/trochut/v24/CHymV-fDDlP9bDIw3sinWVokMnIllmA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/trochut/v24/CHyjV-fDDlP9bDIw1nWCeQ.ttf" + }, + { + "family": "Truculenta", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v27", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMlAjswcFHnJMMhg.ttf", + "200": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMtAiswcFHnJMMhg.ttf", + "300": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMg4iswcFHnJMMhg.ttf", + "regular": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMlAiswcFHnJMMhg.ttf", + "500": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMmIiswcFHnJMMhg.ttf", + "600": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMo4lswcFHnJMMhg.ttf", + "700": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMrclswcFHnJMMhg.ttf", + "800": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMtAlswcFHnJMMhg.ttf", + "900": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMvklswcFHnJMMhg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/truculenta/v27/LhWfMVvBKusVIfNYGi1-WvRVyDdZeeiySNppcu32Mb2f06y6Oa21F6XHi0VYDX_PzOupMlAigwYPGg.ttf" + }, + { + "family": "Trykker", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/trykker/v22/KtktALyWZJXudUPzhNnoOd2j22U.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/trykker/v22/KtktALyWZJXudUPztNjiPQ.ttf" + }, + { + "family": "Tsukimi Rounded", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoZ3LJNksWZO0LvnZwkF3HtoB7VkVsqN7MT3T9X8g.ttf", + "regular": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoc3LJNksWZO0LvnZwkF3HtoB7tPXMOP5gP1A.ttf", + "500": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoZ3LJNksWZO0LvnZwkF3HtoB7VyVoqN7MT3T9X8g.ttf", + "600": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoZ3LJNksWZO0LvnZwkF3HtoB7V5V0qN7MT3T9X8g.ttf", + "700": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoZ3LJNksWZO0LvnZwkF3HtoB7VgVwqN7MT3T9X8g.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tsukimirounded/v14/sJoc3LJNksWZO0LvnZwkF3HtoB7dPHkK.ttf" + }, + { + "family": "Tuffy", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "phoenician" + ], + "version": "v1", + "lastModified": "2025-04-23", + "files": { + "regular": "https://fonts.gstatic.com/s/tuffy/v1/1q2IY56bHkJl7rxzF4xmyfYe.ttf", + "italic": "https://fonts.gstatic.com/s/tuffy/v1/1q2GY56bHkJl7oxxHYhEzOYenEU.ttf", + "700": "https://fonts.gstatic.com/s/tuffy/v1/1q2FY56bHkJl7oTPOKhu4uoXhVzg.ttf", + "700italic": "https://fonts.gstatic.com/s/tuffy/v1/1q2DY56bHkJl7oxxJTRr6O41gEzgZoQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tuffy/v1/1q2IY56bHkJl7oxyHYg.ttf" + }, + { + "family": "Tulpen One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v26", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/tulpenone/v26/dFa6ZfeC474skLgesc0CWj0w_HyIRlE.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/tulpenone/v26/dFa6ZfeC474skLgesc0Cajw6-A.ttf" + }, + { + "family": "Turret Road", + "variants": [ + "200", + "300", + "regular", + "500", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0ONEdeLYk1Mq3ap.ttf", + "300": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0PpEteLYk1Mq3ap.ttf", + "regular": "https://fonts.gstatic.com/s/turretroad/v11/pxiAypMgpcBFjE84Zv-fE3tFOvODSVFF.ttf", + "500": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0OxE9eLYk1Mq3ap.ttf", + "700": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0P5FdeLYk1Mq3ap.ttf", + "800": "https://fonts.gstatic.com/s/turretroad/v11/pxidypMgpcBFjE84Zv-fE0PlFteLYk1Mq3ap.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/turretroad/v11/pxiAypMgpcBFjE84Zv-fE0tEMPc.ttf" + }, + { + "family": "Twinkle Star", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/twinklestar/v8/pe0pMI6IL4dPoFl9LGEmY6WaA_Rue1UwVg.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/twinklestar/v8/pe0pMI6IL4dPoFl9LGEmY6WqAv5q.ttf" + }, + { + "family": "Ubuntu", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-02", + "files": { + "300": "https://fonts.gstatic.com/s/ubuntu/v21/4iCv6KVjbNBYlgoC1CzTt2aMH4V_gg.ttf", + "300italic": "https://fonts.gstatic.com/s/ubuntu/v21/4iCp6KVjbNBYlgoKejZftWyIPYBvgpUI.ttf", + "regular": "https://fonts.gstatic.com/s/ubuntu/v21/4iCs6KVjbNBYlgo6eAT3v02QFg.ttf", + "italic": "https://fonts.gstatic.com/s/ubuntu/v21/4iCu6KVjbNBYlgoKeg7znUiAFpxm.ttf", + "500": "https://fonts.gstatic.com/s/ubuntu/v21/4iCv6KVjbNBYlgoCjC3Tt2aMH4V_gg.ttf", + "500italic": "https://fonts.gstatic.com/s/ubuntu/v21/4iCp6KVjbNBYlgoKejYHtGyIPYBvgpUI.ttf", + "700": "https://fonts.gstatic.com/s/ubuntu/v21/4iCv6KVjbNBYlgoCxCvTt2aMH4V_gg.ttf", + "700italic": "https://fonts.gstatic.com/s/ubuntu/v21/4iCp6KVjbNBYlgoKejZPsmyIPYBvgpUI.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ubuntu/v21/4iCs6KVjbNBYlgoKeQ7z.ttf" + }, + { + "family": "Ubuntu Condensed", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/ubuntucondensed/v17/u-4k0rCzjgs5J7oXnJcM_0kACGMtf-fVqvHoJXw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ubuntucondensed/v17/u-4k0rCzjgs5J7oXnJcM_0kACGMtT-bfrg.ttf" + }, + { + "family": "Ubuntu Mono", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/ubuntumono/v19/KFOjCneDtsqEr0keqCMhbBc9AMX6lJBP.ttf", + "italic": "https://fonts.gstatic.com/s/ubuntumono/v19/KFOhCneDtsqEr0keqCMhbCc_CsHYkYBPY3o.ttf", + "700": "https://fonts.gstatic.com/s/ubuntumono/v19/KFO-CneDtsqEr0keqCMhbC-BL-Hyv4xGemO1.ttf", + "700italic": "https://fonts.gstatic.com/s/ubuntumono/v19/KFO8CneDtsqEr0keqCMhbCc_Mn33tYhkf3O1GVg.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ubuntumono/v19/KFOjCneDtsqEr0keqCMhbCc8CsE.ttf" + }, + { + "family": "Ubuntu Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-02", + "files": { + "100": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbujzt7CfqLVLT9mgk.ttf", + "200": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj7t6CfqLVLT9mgk.ttf", + "300": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj2V6CfqLVLT9mgk.ttf", + "regular": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbujzt6CfqLVLT9mgk.ttf", + "500": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbujwl6CfqLVLT9mgk.ttf", + "600": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj-V9CfqLVLT9mgk.ttf", + "700": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj9x9CfqLVLT9mgk.ttf", + "800": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbuj7t9CfqLVLT9mgk.ttf", + "100italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM54biBUJb4iglIHg.ttf", + "200italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5YbmBUJb4iglIHg.ttf", + "300italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5v7mBUJb4iglIHg.ttf", + "italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM54bmBUJb4iglIHg.ttf", + "500italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM507mBUJb4iglIHg.ttf", + "600italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5P76BUJb4iglIHg.ttf", + "700italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5Br6BUJb4iglIHg.ttf", + "800italic": "https://fonts.gstatic.com/s/ubuntusans/v4/co3mmWd6mSRtB7_9UaLWwLPLmXPrAaRZFVxauS9FrCyI9sOpp8jpmvM5Yb6BUJb4iglIHg.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ubuntusans/v4/co3omWd6mSRtB7_9UaLWwJnCq5ALePfPu1tPcW235R53LqrCPWbujzt6OfuBUA.ttf" + }, + { + "family": "Ubuntu Sans Mono", + "variants": [ + "regular", + "500", + "600", + "700", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27Ev_kYRiqcZu3n0.ttf", + "500": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27Ed_kYRiqcZu3n0.ttf", + "600": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27Hx-UYRiqcZu3n0.ttf", + "700": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27HI-UYRiqcZu3n0.ttf", + "italic": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyi7mzgBHrR5yE7ZyRg0QRJMKI45g_SchUEkQgw3KTnva5SgKM7vmn0BLE.ttf", + "500italic": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyi7mzgBHrR5yE7ZyRg0QRJMKI45g_SchUEkQgw3KTnvZxSgKM7vmn0BLE.ttf", + "600italic": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyi7mzgBHrR5yE7ZyRg0QRJMKI45g_SchUEkQgw3KTnvXBVgKM7vmn0BLE.ttf", + "700italic": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyi7mzgBHrR5yE7ZyRg0QRJMKI45g_SchUEkQgw3KTnvUlVgKM7vmn0BLE.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ubuntusansmono/v3/jVyc7mzgBHrR5yE7ZyRg0QRJMKI4zAbgjc1t-pKe27Ev_nYQgKM.ttf" + }, + { + "family": "Uchen", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "tibetan" + ], + "version": "v11", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/uchen/v11/nKKZ-GokGZ1baIaSEQGodLxA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/uchen/v11/nKKZ-GokGZ1baLaTGwU.ttf" + }, + { + "family": "Ultra", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/ultra/v25/zOLy4prXmrtY-tT6yLOD6NxF.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ultra/v25/zOLy4prXmrtY-uT7wrc.ttf" + }, + { + "family": "Unbounded", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-11", + "files": { + "200": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG65jx043HgP6LR0Y.ttf", + "300": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG60bx043HgP6LR0Y.ttf", + "regular": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG6xjx043HgP6LR0Y.ttf", + "500": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG6yrx043HgP6LR0Y.ttf", + "600": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG68b2043HgP6LR0Y.ttf", + "700": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG6__2043HgP6LR0Y.ttf", + "800": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG65j2043HgP6LR0Y.ttf", + "900": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG67H2043HgP6LR0Y.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/unbounded/v12/Yq6F-LOTXCb04q32xlpat-6uR42XTqtG6xjx44zNhA.ttf" + }, + { + "family": "Uncial Antiqua", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/uncialantiqua/v22/N0bM2S5WOex4OUbESzoESK-i-PfRS5VBBSSF.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/uncialantiqua/v22/N0bM2S5WOex4OUbESzoESK-i-MfQQZE.ttf" + }, + { + "family": "Underdog", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/underdog/v24/CHygV-jCElj7diMroVSiU14GN2Il.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/underdog/v24/CHygV-jCElj7diMroWSjWVo.ttf" + }, + { + "family": "Unica One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/unicaone/v20/DPEuYwWHyAYGVTSmalshdtffuEY7FA.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/unicaone/v20/DPEuYwWHyAYGVTSmalsRd93b.ttf" + }, + { + "family": "UnifrakturCook", + "variants": [ + "700" + ], + "subsets": [ + "latin" + ], + "version": "v25", + "lastModified": "2025-09-05", + "files": { + "700": "https://fonts.gstatic.com/s/unifrakturcook/v25/IurA6Yli8YOdcoky-0PTTdkm56n05Uw13ILXs-h6.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/unifrakturcook/v25/IurA6Yli8YOdcoky-0PTTdkm56n05Xw01oY.ttf" + }, + { + "family": "UnifrakturMaguntia", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/unifrakturmaguntia/v22/WWXPlieVYwiGNomYU-ciRLRvEmK7oaVun2xNNgNa1A.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/unifrakturmaguntia/v22/WWXPlieVYwiGNomYU-ciRLRvEmK7oaVenmZJ.ttf" + }, + { + "family": "Unkempt", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v22", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/unkempt/v22/2EbnL-Z2DFZue0DSSYYf8z2Yt_c.ttf", + "700": "https://fonts.gstatic.com/s/unkempt/v22/2EbiL-Z2DFZue0DScTow1zWzq_5uT84.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/unkempt/v22/2EbnL-Z2DFZue0DSeYcV9w.ttf" + }, + { + "family": "Unlock", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v28", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/unlock/v28/7Au-p_8ykD-cDl7GKAjSwkUVOQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/unlock/v28/7Au-p_8ykD-cDl72KQLW.ttf" + }, + { + "family": "Unna", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/unna/v25/AYCEpXzofN0NCpgBlGHCWFM.ttf", + "italic": "https://fonts.gstatic.com/s/unna/v25/AYCKpXzofN0NOpoLkEPHSFNyxw.ttf", + "700": "https://fonts.gstatic.com/s/unna/v25/AYCLpXzofN0NMiQusGnpRFpr3vc.ttf", + "700italic": "https://fonts.gstatic.com/s/unna/v25/AYCJpXzofN0NOpozLGzjQHhuzvef5Q.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/unna/v25/AYCEpXzofN0NOpkLkA.ttf" + }, + { + "family": "UoqMunThenKhung", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "latin", + "symbols2" + ], + "version": "v1", + "lastModified": "2025-06-25", + "files": { + "regular": "https://fonts.gstatic.com/s/uoqmunthenkhung/v1/Y4GTYa1nVTQLt-D5LoLChg5aJjIjwLL9Th8YYA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/uoqmunthenkhung/v1/Y4GTYa1nVTQLt-D5LoLChg5aJjITwbj5.ttf" + }, + { + "family": "Updock", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/updock/v7/nuF4D_3dVZ70UI9SjLK3602XBw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/updock/v7/nuF4D_3dVZ70UI9ijbiz.ttf" + }, + { + "family": "Urbanist", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDyx8fFpOrS8SlKw.ttf", + "200": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDSx4fFpOrS8SlKw.ttf", + "300": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDlR4fFpOrS8SlKw.ttf", + "regular": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDyx4fFpOrS8SlKw.ttf", + "500": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqD-R4fFpOrS8SlKw.ttf", + "600": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDFRkfFpOrS8SlKw.ttf", + "700": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDLBkfFpOrS8SlKw.ttf", + "800": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDSxkfFpOrS8SlKw.ttf", + "900": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDYhkfFpOrS8SlKw.ttf", + "100italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA133VJmvacG1K4S1.ttf", + "200italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA113VZmvacG1K4S1.ttf", + "300italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA12pVZmvacG1K4S1.ttf", + "italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA133VZmvacG1K4S1.ttf", + "500italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA13FVZmvacG1K4S1.ttf", + "600italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA10pUpmvacG1K4S1.ttf", + "700italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA10QUpmvacG1K4S1.ttf", + "800italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA113UpmvacG1K4S1.ttf", + "900italic": "https://fonts.gstatic.com/s/urbanist/v18/L0xtDF02iFML4hGCyMqgdyNEf6or5L2WA11eUpmvacG1K4S1.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/urbanist/v18/L0xjDF02iFML4hGCyOCpRdycFsGxSrqDyx4vF5mv.ttf" + }, + { + "family": "VT323", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/vt323/v18/pxiKyp0ihIEF2hsYHpT2dkNE.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vt323/v18/pxiKyp0ihIEF2isZFJA.ttf" + }, + { + "family": "Vampiro One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/vampiroone/v19/gokqH6DoDl5yXvJytFsdLkqnsvhIor3K.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vampiroone/v19/gokqH6DoDl5yXvJytFsdLnqmuPw.ttf" + }, + { + "family": "Varela", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/varela/v17/DPEtYwqExx0AWHXJBBQFfvzDsQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/varela/v17/DPEtYwqExx0AWHX5BR4B.ttf" + }, + { + "family": "Varela Round", + "variants": [ + "regular" + ], + "subsets": [ + "hebrew", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/varelaround/v21/w8gdH283Tvk__Lua32TysjIvoMGOD9gxZw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/varelaround/v21/w8gdH283Tvk__Lua32TysjIfocuK.ttf" + }, + { + "family": "Varta", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "300": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x96j4EirE-9PGLfQ.ttf", + "regular": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9tD4EirE-9PGLfQ.ttf", + "500": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9hj4EirE-9PGLfQ.ttf", + "600": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9ajkEirE-9PGLfQ.ttf", + "700": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9UzkEirE-9PGLfQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/varta/v25/Qw3AZQpJHj_6LzHUngWbrFkDH1x9tD40i7s6.ttf" + }, + { + "family": "Vast Shadow", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/vastshadow/v21/pe0qMImKOZ1V62ZwbVY9dfe6Kdpickwp.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vastshadow/v21/pe0qMImKOZ1V62ZwbVY9dce7I94.ttf" + }, + { + "family": "Vazirmatn", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklWgyOReZ72DF_QY.ttf", + "200": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklegzOReZ72DF_QY.ttf", + "300": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklTYzOReZ72DF_QY.ttf", + "regular": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklWgzOReZ72DF_QY.ttf", + "500": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklVozOReZ72DF_QY.ttf", + "600": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklbY0OReZ72DF_QY.ttf", + "700": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklY80OReZ72DF_QY.ttf", + "800": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRkleg0OReZ72DF_QY.ttf", + "900": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklcE0OReZ72DF_QY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vazirmatn/v16/Dxx78j6PP2D_kU2muijPEe1n2vVbfJRklWgzCRaT6w.ttf" + }, + { + "family": "Vend Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v1", + "lastModified": "2025-08-26", + "files": { + "300": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqgeqzzfJQAJuEJw.ttf", + "regular": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqlmqzzfJQAJuEJw.ttf", + "500": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqmuqzzfJQAJuEJw.ttf", + "600": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqoetzzfJQAJuEJw.ttf", + "700": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqr6tzzfJQAJuEJw.ttf", + "300italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5HpeXTDRCBrAJz0nA.ttf", + "italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5HpJ3TDRCBrAJz0nA.ttf", + "500italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5HpFXTDRCBrAJz0nA.ttf", + "600italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5Hp-XPDRCBrAJz0nA.ttf", + "700italic": "https://fonts.gstatic.com/s/vendsans/v1/E210_d7ijufNwCJPEUscURVbAh5_70mGv5HpwHPDRCBrAJz0nA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vendsans/v1/E212_d7ijufNwCJPEUs2WCek2ncUdeeBqlmq_zbDRA.ttf" + }, + { + "family": "Vesper Libre", + "variants": [ + "regular", + "500", + "700", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6CNxyWnf-uxPdXDHUD_Rd4D0-N2qIWVQ.ttf", + "500": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6dNxyWnf-uxPdXDHUD_RdA-2ap0okKXKvPlw.ttf", + "700": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6dNxyWnf-uxPdXDHUD_RdAs2Cp0okKXKvPlw.ttf", + "900": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6dNxyWnf-uxPdXDHUD_RdAi2Kp0okKXKvPlw.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vesperlibre/v21/bx6CNxyWnf-uxPdXDHUD_RdIDkWJ.ttf" + }, + { + "family": "Viaoda Libre", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v20", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/viaodalibre/v20/vEFW2_lWCgoR6OKuRz9kcRVJb2IY2tOHXg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/viaodalibre/v20/vEFW2_lWCgoR6OKuRz9kcRV5bmgc.ttf" + }, + { + "family": "Vibes", + "variants": [ + "regular" + ], + "subsets": [ + "arabic", + "latin" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/vibes/v16/QdVYSTsmIB6tmbd3HpbsuBlh.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vibes/v16/QdVYSTsmIB6tmYd2FJI.ttf" + }, + { + "family": "Vibur", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/vibur/v24/DPEiYwmEzw0QRjTpLjoJd-Xa.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vibur/v24/DPEiYwmEzw0QRgToJD4.ttf" + }, + { + "family": "Victor Mono", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-05", + "files": { + "100": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyO8_NhNyOV0Y9bQ.ttf", + "200": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyu87NhNyOV0Y9bQ.ttf", + "300": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyZc7NhNyOV0Y9bQ.ttf", + "regular": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyO87NhNyOV0Y9bQ.ttf", + "500": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyCc7NhNyOV0Y9bQ.ttf", + "600": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCy5cnNhNyOV0Y9bQ.ttf", + "700": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCy3MnNhNyOV0Y9bQ.ttf", + "100italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen840lxtaKdUMtba8p.ttf", + "200italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen842lx9aKdUMtba8p.ttf", + "300italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen8417x9aKdUMtba8p.ttf", + "italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen840lx9aKdUMtba8p.ttf", + "500italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen840Xx9aKdUMtba8p.ttf", + "600italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen8437wNaKdUMtba8p.ttf", + "700italic": "https://fonts.gstatic.com/s/victormono/v5/Yq6B-LGQWyfv-LGy7lEO0_ZYrRskvW7bUNen843CwNaKdUMtba8p.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/victormono/v5/Yq6H-LGQWyfv-LGy7lEO09xRn-T81AVB_tCyO879hdaK.ttf" + }, + { + "family": "Vidaloka", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/vidaloka/v19/7cHrv4c3ipenMKlEass8yn4hnCci.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vidaloka/v19/7cHrv4c3ipenMKlEavs9wHo.ttf" + }, + { + "family": "Viga", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/viga/v15/xMQbuFFdSaiX_QIjD4e2OX8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/viga/v15/xMQbuFFdSaiXzQMpCw.ttf" + }, + { + "family": "Vina Sans", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/vinasans/v8/m8JQjfZKf6-d2273MP7zcJ5BZmqa3A.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vinasans/v8/m8JQjfZKf6-d2273MP7DcZRF.ttf" + }, + { + "family": "Voces", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/voces/v24/-F6_fjJyLyU8d4PBBG7YpzlJ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/voces/v24/-F6_fjJyLyU8d7PADmo.ttf" + }, + { + "family": "Volkhov", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v18", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/volkhov/v18/SlGQmQieoJcKemNeQTIOhHxzcD0.ttf", + "italic": "https://fonts.gstatic.com/s/volkhov/v18/SlGSmQieoJcKemNecTAEgF52YD0NYw.ttf", + "700": "https://fonts.gstatic.com/s/volkhov/v18/SlGVmQieoJcKemNeeY4hoHRYbDQUego.ttf", + "700italic": "https://fonts.gstatic.com/s/volkhov/v18/SlGXmQieoJcKemNecTA8PHFSaBYRagrQrA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/volkhov/v18/SlGQmQieoJcKemNecTMEgA.ttf" + }, + { + "family": "Vollkorn", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v30", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2MHGuGWOdEbD63w.ttf", + "500": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2AnGuGWOdEbD63w.ttf", + "600": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df27nauGWOdEbD63w.ttf", + "700": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df213auGWOdEbD63w.ttf", + "800": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2sHauGWOdEbD63w.ttf", + "900": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2mXauGWOdEbD63w.ttf", + "italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DJGWmmZM7Xq34g9.ttf", + "500italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DJ0WmmZM7Xq34g9.ttf", + "600italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DKYXWmZM7Xq34g9.ttf", + "700italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DKhXWmZM7Xq34g9.ttf", + "800italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DLGXWmZM7Xq34g9.ttf", + "900italic": "https://fonts.gstatic.com/s/vollkorn/v30/0ybuGDoxxrvAnPhYGxksckM2WMCpRjDj-DLvXWmZM7Xq34g9.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vollkorn/v30/0ybgGDoxxrvAnPhYGzMlQLzuMasz6Df2MHGeGGmZ.ttf" + }, + { + "family": "Vollkorn SC", + "variants": [ + "regular", + "600", + "700", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_v6-zQ3rXpceZj9cqnVhF5NH-iSq_E.ttf", + "600": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_y6-zQ3rXpceZj9cqnVimhGluqYbPN5Yjn.ttf", + "700": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_y6-zQ3rXpceZj9cqnVinFG1uqYbPN5Yjn.ttf", + "900": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_y6-zQ3rXpceZj9cqnVin9GVuqYbPN5Yjn.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vollkornsc/v12/j8_v6-zQ3rXpceZj9cqnViF4Pns.ttf" + }, + { + "family": "Voltaire", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v23", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/voltaire/v23/1Pttg8PcRfSblAvGvQooYKVnBOif.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/voltaire/v23/1Pttg8PcRfSblAvGvTopaqE.ttf" + }, + { + "family": "Vujahday Script", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v10", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/vujahdayscript/v10/RWmQoKGA8fEkrIPtSZ3_J7er2dUiDEtvAlaMKw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/vujahdayscript/v10/RWmQoKGA8fEkrIPtSZ3_J7er2dUSDUFr.ttf" + }, + { + "family": "WDXL Lubrifont JP N", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext", + "symbols2" + ], + "version": "v1", + "lastModified": "2025-06-12", + "files": { + "regular": "https://fonts.gstatic.com/s/wdxllubrifontjpn/v1/8At1GtSkFqazDiO949fzWta9_T-SVxJiIZctoLhFRNU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wdxllubrifontjpn/v1/8At1GtSkFqazDiO949fzWta9_T-SVxJiEZYnpA.ttf" + }, + { + "family": "WDXL Lubrifont SC", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-simplified", + "cyrillic", + "latin", + "latin-ext", + "symbols2" + ], + "version": "v1", + "lastModified": "2025-06-12", + "files": { + "regular": "https://fonts.gstatic.com/s/wdxllubrifontsc/v1/gNMeW2VmY6acu0XtugFrduDciOOyfny5mD9ASHz5.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wdxllubrifontsc/v1/gNMeW2VmY6acu0XtugFrduDciOOyfky4kjs.ttf" + }, + { + "family": "WDXL Lubrifont TC", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-traditional", + "cyrillic", + "latin", + "latin-ext", + "symbols2" + ], + "version": "v4", + "lastModified": "2025-06-18", + "files": { + "regular": "https://fonts.gstatic.com/s/wdxllubrifonttc/v4/nKKN-H4mPq1yJurnWXfJE8svQHonWc_-EqxyqaA8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wdxllubrifonttc/v4/nKKN-H4mPq1yJurnWXfJE8svQHonWf__GKg.ttf" + }, + { + "family": "Waiting for the Sunrise", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v23", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/waitingforthesunrise/v23/WBL1rFvOYl9CEv2i1mO6KUW8RKWJ2zoXoz5JsYZQ9h_ZYk5J.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/waitingforthesunrise/v23/WBL1rFvOYl9CEv2i1mO6KUW8RKWJ2zoXoz5JsbZR_Bs.ttf" + }, + { + "family": "Wallpoet", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v21", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/wallpoet/v21/f0X10em2_8RnXVVdUNbu7cXP8L8G.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wallpoet/v21/f0X10em2_8RnXVVdUObv58E.ttf" + }, + { + "family": "Walter Turncoat", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v24", + "lastModified": "2025-06-02", + "files": { + "regular": "https://fonts.gstatic.com/s/walterturncoat/v24/snfys0Gs98ln43n0d-14ULoToe67YB2dQ5ZPqQ.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/walterturncoat/v24/snfys0Gs98ln43n0d-14ULoToe6LYReZ.ttf" + }, + { + "family": "Warnes", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v29", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/warnes/v29/pONn1hc0GsW6sW5OpiC2o6Lkqg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/warnes/v29/pONn1hc0GsW6sW5-pyqy.ttf" + }, + { + "family": "Water Brush", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v6", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/waterbrush/v6/AYCPpXPqc8cJWLhp4hywKHJq7PKP5Z_G.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/waterbrush/v6/AYCPpXPqc8cJWLhp4hywKEJr5vY.ttf" + }, + { + "family": "Waterfall", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v8", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/waterfall/v8/MCoRzAfo293fACdFKcwY2rH8D_EZwA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/waterfall/v8/MCoRzAfo293fACdFKcwo27v4.ttf" + }, + { + "family": "Wavefont", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v19", + "lastModified": "2025-09-17", + "files": { + "100": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI3V0rDHXKtOXOg4.ttf", + "200": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI1V07DHXKtOXOg4.ttf", + "300": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI2L07DHXKtOXOg4.ttf", + "regular": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI3V07DHXKtOXOg4.ttf", + "500": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI3n07DHXKtOXOg4.ttf", + "600": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI0L1LDHXKtOXOg4.ttf", + "700": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI0y1LDHXKtOXOg4.ttf", + "800": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI1V1LDHXKtOXOg4.ttf", + "900": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI181LDHXKtOXOg4.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wavefont/v19/L0xFDF00m0cP6hefyOCpRezQNuizSrqDyx8FHbFu21B3L4m0SEzuQYwq-f_JJ8I1WI3V04DGVq8.ttf" + }, + { + "family": "Wellfleet", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/wellfleet/v25/nuF7D_LfQJb3VYgX6eyT42aLDhO2HA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wellfleet/v25/nuF7D_LfQJb3VYgX6eyj4myP.ttf" + }, + { + "family": "Wendy One", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v20", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/wendyone/v20/2sDcZGJOipXfgfXV5wgDb2-4C7wFZQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wendyone/v20/2sDcZGJOipXfgfXV5wgzbmW8.ttf" + }, + { + "family": "Whisper", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v7", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/whisper/v7/q5uHsoqtKftx74K9milCBxxdmYU.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/whisper/v7/q5uHsoqtKftx74K9qihIAw.ttf" + }, + { + "family": "WindSong", + "variants": [ + "regular", + "500" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/windsong/v13/KR1WBsyu-P-GFEW57r95HdG6vjH3.ttf", + "500": "https://fonts.gstatic.com/s/windsong/v13/KR1RBsyu-P-GFEW57oeNNPWylS3-jVXm.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/windsong/v13/KR1WBsyu-P-GFEW57o94F9U.ttf" + }, + { + "family": "Winky Rough", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bOSVuN7JB-KCmzg.ttf", + "regular": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bZyVuN7JB-KCmzg.ttf", + "500": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bVSVuN7JB-KCmzg.ttf", + "600": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8buSJuN7JB-KCmzg.ttf", + "700": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bgCJuN7JB-KCmzg.ttf", + "800": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8b5yJuN7JB-KCmzg.ttf", + "900": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bziJuN7JB-KCmzg.ttf", + "300italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2bYdLhF2qW2zneX.ttf", + "italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2aGdLhF2qW2zneX.ttf", + "500italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2a0dLhF2qW2zneX.ttf", + "600italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2ZYc7hF2qW2zneX.ttf", + "700italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2Zhc7hF2qW2zneX.ttf", + "800italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2YGc7hF2qW2zneX.ttf", + "900italic": "https://fonts.gstatic.com/s/winkyrough/v4/t5t1IRwIMoSXA0WSPBjQxLbq9zLnXksbwRgOr2Yvc7hF2qW2zneX.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/winkyrough/v4/t5tzIRwIMoSXA0WSPBjQxJzjxc0_NyCBbx8bZyVeNrhF.ttf" + }, + { + "family": "Winky Sans", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2025-09-02", + "files": { + "300": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGXUiD6F2TpBa98q.ttf", + "regular": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGWKiD6F2TpBa98q.ttf", + "500": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGW4iD6F2TpBa98q.ttf", + "600": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGVUjz6F2TpBa98q.ttf", + "700": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGVtjz6F2TpBa98q.ttf", + "800": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGUKjz6F2TpBa98q.ttf", + "900": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGUjjz6F2TpBa98q.ttf", + "300italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy4jG0z5jbs8qbts.ttf", + "italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy9bG0z5jbs8qbts.ttf", + "500italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy-TG0z5jbs8qbts.ttf", + "600italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCywjB0z5jbs8qbts.ttf", + "700italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCyzHB0z5jbs8qbts.ttf", + "800italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy1bB0z5jbs8qbts.ttf", + "900italic": "https://fonts.gstatic.com/s/winkysans/v3/ll8uK2SDUiG1Hpf2p06bN6gynQbuVYjYB3BCy3_B0z5jbs8qbts.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/winkysans/v3/ll8sK2SDUiG1Hpf2p06bHaEAYt6HPhJ2AGWKiA6E0z4.ttf" + }, + { + "family": "Wire One", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v30", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/wireone/v30/qFdH35Wah5htUhV75WGiWdrCwwcJ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wireone/v30/qFdH35Wah5htUhV75VGjU94.ttf" + }, + { + "family": "Wittgenstein", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61G4T_Bv7Z15J4ow.ttf", + "500": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61FwT_Bv7Z15J4ow.ttf", + "600": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61LAU_Bv7Z15J4ow.ttf", + "700": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61IkU_Bv7Z15J4ow.ttf", + "800": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61O4U_Bv7Z15J4ow.ttf", + "900": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61McU_Bv7Z15J4ow.ttf", + "italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQFFjxY3xM8ozHYA.ttf", + "500italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQJljxY3xM8ozHYA.ttf", + "600italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQyl_xY3xM8ozHYA.ttf", + "700italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQ81_xY3xM8ozHYA.ttf", + "800italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQlF_xY3xM8ozHYA.ttf", + "900italic": "https://fonts.gstatic.com/s/wittgenstein/v4/WBLxrEDOakJCHParhXGwMgvYLvqigLupTOw9waZQvV_xY3xM8ozHYA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wittgenstein/v4/WBL3rEDOakJCHParhXGwMgvyJ8hdWNLC1kI61G4TzBrxYw.ttf" + }, + { + "family": "Wix Madefor Display", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v12", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYFhYltkv_3HQKgh.ttf", + "500": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYFTYltkv_3HQKgh.ttf", + "600": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYG_ZVtkv_3HQKgh.ttf", + "700": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYGGZVtkv_3HQKgh.ttf", + "800": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYHhZVtkv_3HQKgh.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wixmadefordisplay/v12/SZcS3EX9IbbyeJ8aOluD52KXgUA_7Ed1I13G853Cp9duUYFhYmtltfk.ttf" + }, + { + "family": "Wix Madefor Text", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cK_NOeFgpRt9rN5.ttf", + "italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3dw_GiJBP86N53IY.ttf", + "500": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cKNNOeFgpRt9rN5.ttf", + "500italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3dz3GiJBP86N53IY.ttf", + "600": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cJhM-eFgpRt9rN5.ttf", + "600italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3d9HBiJBP86N53IY.ttf", + "700": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cJYM-eFgpRt9rN5.ttf", + "700italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3d-jBiJBP86N53IY.ttf", + "800": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cI_M-eFgpRt9rN5.ttf", + "800italic": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_WXI_oSymQ8Qj-Apx3HGN_Hu1RZiAL6QzqeqKx1td3d4_BiJBP86N53IY.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/wixmadefortext/v17/-W_oXI_oSymQ8Qj-Apx3HGN_Hu1RTCk5FtSDETgf0cK_NNeEiJA.ttf" + }, + { + "family": "Work Sans", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K0nWNigDp6_cOyA.ttf", + "200": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K8nXNigDp6_cOyA.ttf", + "300": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32KxfXNigDp6_cOyA.ttf", + "regular": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K0nXNigDp6_cOyA.ttf", + "500": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K3vXNigDp6_cOyA.ttf", + "600": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K5fQNigDp6_cOyA.ttf", + "700": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K67QNigDp6_cOyA.ttf", + "800": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K8nQNigDp6_cOyA.ttf", + "900": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K-DQNigDp6_cOyA.ttf", + "100italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGU3moJo43ZKyDSQQ.ttf", + "200italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUXmsJo43ZKyDSQQ.ttf", + "300italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUgGsJo43ZKyDSQQ.ttf", + "italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGU3msJo43ZKyDSQQ.ttf", + "500italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGU7GsJo43ZKyDSQQ.ttf", + "600italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUAGwJo43ZKyDSQQ.ttf", + "700italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUOWwJo43ZKyDSQQ.ttf", + "800italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUXmwJo43ZKyDSQQ.ttf", + "900italic": "https://fonts.gstatic.com/s/worksans/v24/QGY9z_wNahGAdqQ43Rh_ebrnlwyYfEPxPoGUd2wJo43ZKyDSQQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/worksans/v24/QGY_z_wNahGAdqQ43RhVcIgYT2Xz5u32K0nXBikJow.ttf" + }, + { + "family": "Workbench", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "math", + "symbols" + ], + "version": "v3", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/workbench/v3/FeV8S05Gp6Et7FcfbPFK1rynGd_MxtkvNFmoUDFhgF2VKTGQk6vapdOL0GKqgZyb.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/workbench/v3/FeV8S05Gp6Et7FcfbPFK1rynGd_MxtkvNFmoUDFhgF2VKTGQk6vapeOK2mY.ttf" + }, + { + "family": "Xanh Mono", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/xanhmono/v19/R70YjykVmvKCep-vWhSYmACQXzLhTg.ttf", + "italic": "https://fonts.gstatic.com/s/xanhmono/v19/R70ejykVmvKCep-vWhSomgqUfTfxTo24.ttf" + }, + "category": "monospace", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/xanhmono/v19/R70YjykVmvKCep-vWhSomQqU.ttf" + }, + { + "family": "Yaldevi", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "sinhala" + ], + "version": "v17", + "lastModified": "2025-09-10", + "files": { + "200": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpfxJzvobxLCBJkS.ttf", + "300": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpcvJzvobxLCBJkS.ttf", + "regular": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpdxJzvobxLCBJkS.ttf", + "500": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpdDJzvobxLCBJkS.ttf", + "600": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpevIDvobxLCBJkS.ttf", + "700": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpeWIDvobxLCBJkS.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yaldevi/v17/cY9afj6VW0NMrDWtDNzCOwlPMq9SLpdxJwvpZRY.ttf" + }, + { + "family": "Yanone Kaffeesatz", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v32", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftodtWpcGuLCnXkVA.ttf", + "300": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftoqNWpcGuLCnXkVA.ttf", + "regular": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIfto9tWpcGuLCnXkVA.ttf", + "500": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftoxNWpcGuLCnXkVA.ttf", + "600": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftoKNKpcGuLCnXkVA.ttf", + "700": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIftoEdKpcGuLCnXkVA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yanonekaffeesatz/v32/3y9I6aknfjLm_3lMKjiMgmUUYBs04aUXNxt9gW2LIfto9tWZcWGP.ttf" + }, + { + "family": "Yantramanav", + "variants": [ + "100", + "300", + "regular", + "500", + "700", + "900" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/yantramanav/v15/flU-Rqu5zY00QEpyWJYWN5-QXeNzDB41rZg.ttf", + "300": "https://fonts.gstatic.com/s/yantramanav/v15/flUhRqu5zY00QEpyWJYWN59Yf8NZIhI8tIHh.ttf", + "regular": "https://fonts.gstatic.com/s/yantramanav/v15/flU8Rqu5zY00QEpyWJYWN6f0V-dRCQ41.ttf", + "500": "https://fonts.gstatic.com/s/yantramanav/v15/flUhRqu5zY00QEpyWJYWN58AfsNZIhI8tIHh.ttf", + "700": "https://fonts.gstatic.com/s/yantramanav/v15/flUhRqu5zY00QEpyWJYWN59IeMNZIhI8tIHh.ttf", + "900": "https://fonts.gstatic.com/s/yantramanav/v15/flUhRqu5zY00QEpyWJYWN59wesNZIhI8tIHh.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yantramanav/v15/flU8Rqu5zY00QEpyWJYWN5f1XeM.ttf" + }, + { + "family": "Yarndings 12", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "math", + "symbols" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/yarndings12/v4/55xreyp2N8T5P2LJbZAlkY9c8ZLMI2VUnQ.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yarndings12/v4/55xreyp2N8T5P2LJbZAlkY9s8JjI.ttf" + }, + { + "family": "Yarndings 12 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "math", + "symbols" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/yarndings12charted/v4/eLGDP_DlKhO-DUfeqM4I_vDdJgmIh7hAvvbJ0t-dHaJH.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yarndings12charted/v4/eLGDP_DlKhO-DUfeqM4I_vDdJgmIh7hAvsbI2Ns.ttf" + }, + { + "family": "Yarndings 20", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "math", + "symbols" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/yarndings20/v4/TuGWUVlkUohEQu8l7K8b-vNFB380PMTK1w.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yarndings20/v4/TuGWUVlkUohEQu8l7K8b-vN1BnUw.ttf" + }, + { + "family": "Yarndings 20 Charted", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "math", + "symbols" + ], + "version": "v4", + "lastModified": "2025-09-17", + "files": { + "regular": "https://fonts.gstatic.com/s/yarndings20charted/v4/QldRNSdbpg0G8vh0W2qxe0l-hcUPtY2VaLQm4UTqz5V9.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yarndings20charted/v4/QldRNSdbpg0G8vh0W2qxe0l-hcUPtY2VaIQn60A.ttf" + }, + { + "family": "Yatra One", + "variants": [ + "regular" + ], + "subsets": [ + "devanagari", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/yatraone/v16/C8ch4copsHzj8p7NaF0xw1OBbRDvXw.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yatraone/v16/C8ch4copsHzj8p7NaF0BwlmF.ttf" + }, + { + "family": "Yellowtail", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v25", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/yellowtail/v25/OZpGg_pnoDtINPfRIlLotlzNwED-b4g.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yellowtail/v25/OZpGg_pnoDtINPfRIlLohl3HxA.ttf" + }, + { + "family": "Yeon Sung", + "variants": [ + "regular" + ], + "subsets": [ + "korean", + "latin" + ], + "version": "v22", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/yeonsung/v22/QldMNTpbohAGtsJvUn6xSVNazqx2xg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yeonsung/v22/QldMNTpbohAGtsJvUn6BSFle.ttf" + }, + { + "family": "Yeseva One", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v24", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/yesevaone/v24/OpNJno4ck8vc-xYpwWWxpipfWhXD00c.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yesevaone/v24/OpNJno4ck8vc-xYpwWWxlitVXg.ttf" + }, + { + "family": "Yesteryear", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/yesteryear/v21/dg4g_p78rroaKl8kRKo1r7wHTwonmyw.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yesteryear/v21/dg4g_p78rroaKl8kRKo1n70NSw.ttf" + }, + { + "family": "Yomogi", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v13", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/yomogi/v13/VuJwdNrS2ZL7rpoPWIz5NIh-YA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yomogi/v13/VuJwdNrS2ZL7rpo_WYb9.ttf" + }, + { + "family": "Young Serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-05-30", + "files": { + "regular": "https://fonts.gstatic.com/s/youngserif/v2/3qTpojO2nS2VtkB3KtkQZ2t61EcYaQ7F.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/youngserif/v2/3qTpojO2nS2VtkB3KtkQZ1t73kM.ttf" + }, + { + "family": "Yrsa", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "300italic", + "italic", + "500italic", + "600italic", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "vietnamese" + ], + "version": "v25", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCjASNNV9rRPfrKu.ttf", + "regular": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCieSNNV9rRPfrKu.ttf", + "500": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCisSNNV9rRPfrKu.ttf", + "600": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaChAT9NV9rRPfrKu.ttf", + "700": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCh5T9NV9rRPfrKu.ttf", + "300italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WC2UW_LBte6KuGEo.ttf", + "italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WCzsW_LBte6KuGEo.ttf", + "500italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WCwkW_LBte6KuGEo.ttf", + "600italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WC-UR_LBte6KuGEo.ttf", + "700italic": "https://fonts.gstatic.com/s/yrsa/v25/wlptgwnQFlxs1QnF94zlCfv0bz1WC9wR_LBte6KuGEo.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yrsa/v25/wlprgwnQFlxs_wD3CFSMYmFaaCieSONU_LA.ttf" + }, + { + "family": "Ysabeau", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v5", + "lastModified": "2025-09-11", + "files": { + "100": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7OWCTYwI8Gcw6Oi.ttf", + "200": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7MWCDYwI8Gcw6Oi.ttf", + "300": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7PICDYwI8Gcw6Oi.ttf", + "regular": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7OWCDYwI8Gcw6Oi.ttf", + "500": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7OkCDYwI8Gcw6Oi.ttf", + "600": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7NIDzYwI8Gcw6Oi.ttf", + "700": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7NxDzYwI8Gcw6Oi.ttf", + "800": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7MWDzYwI8Gcw6Oi.ttf", + "900": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7M_DzYwI8Gcw6Oi.ttf", + "100italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS95yKcW-xrOiIUw.ttf", + "200italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS15zKcW-xrOiIUw.ttf", + "300italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS4BzKcW-xrOiIUw.ttf", + "italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS95zKcW-xrOiIUw.ttf", + "500italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS-xzKcW-xrOiIUw.ttf", + "600italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeSwB0KcW-xrOiIUw.ttf", + "700italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeSzl0KcW-xrOiIUw.ttf", + "800italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS150KcW-xrOiIUw.ttf", + "900italic": "https://fonts.gstatic.com/s/ysabeau/v5/kmKsZqEiBAXLcnuMlD9_3CYscnjwsKZeS3d0KcW-xrOiIUw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ysabeau/v5/kmKiZqEiBAXLcnuMvjZNI_5FGeJet7OWCAYxKcU.ttf" + }, + { + "family": "Ysabeau Infant", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYFo4HK5ChLwKH6A.ttf", + "200": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYlo8HK5ChLwKH6A.ttf", + "300": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYSI8HK5ChLwKH6A.ttf", + "regular": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYFo8HK5ChLwKH6A.ttf", + "500": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYJI8HK5ChLwKH6A.ttf", + "600": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYyIgHK5ChLwKH6A.ttf", + "700": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQY8YgHK5ChLwKH6A.ttf", + "800": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYlogHK5ChLwKH6A.ttf", + "900": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYv4gHK5ChLwKH6A.ttf", + "100italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3szvaZqlDQeX6Dc5.ttf", + "200italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3sxvaJqlDQeX6Dc5.ttf", + "300italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3syxaJqlDQeX6Dc5.ttf", + "italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3szvaJqlDQeX6Dc5.ttf", + "500italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3szdaJqlDQeX6Dc5.ttf", + "600italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3swxb5qlDQeX6Dc5.ttf", + "700italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3swIb5qlDQeX6Dc5.ttf", + "800italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3sxvb5qlDQeX6Dc5.ttf", + "900italic": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-AlzpqOkkV94kBTQVdX1EWI_p9ZR4c8LTTNzMN3sxGb5qlDQeX6Dc5.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ysabeauinfant/v4/hv-ClzpqOkkV94kBTQVdX1EWI9B0V-HEmd9JmTQYFo83Kpql.ttf" + }, + { + "family": "Ysabeau Office", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-10", + "files": { + "100": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbh6IfYSfpQj7IGQ.ttf", + "200": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbB6MfYSfpQj7IGQ.ttf", + "300": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPb2aMfYSfpQj7IGQ.ttf", + "regular": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbh6MfYSfpQj7IGQ.ttf", + "500": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbtaMfYSfpQj7IGQ.ttf", + "600": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbWaQfYSfpQj7IGQ.ttf", + "700": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbYKQfYSfpQj7IGQ.ttf", + "800": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbB6QfYSfpQj7IGQ.ttf", + "900": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbLqQfYSfpQj7IGQ.ttf", + "100italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-D3Iy3tYDvYGbGh.ttf", + "200italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-B3Ii3tYDvYGbGh.ttf", + "300italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-CpIi3tYDvYGbGh.ttf", + "italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-D3Ii3tYDvYGbGh.ttf", + "500italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-DFIi3tYDvYGbGh.ttf", + "600italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-ApJS3tYDvYGbGh.ttf", + "700italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-AQJS3tYDvYGbGh.ttf", + "800italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-B3JS3tYDvYGbGh.ttf", + "900italic": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDIkapaZKhM9RuQIp8FmdYrPPPLMqbE5B_kXOvTOT-BeJS3tYDvYGbGh.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ysabeauoffice/v4/LDImapaZKhM9RuQIp8FmdYrPPNjFm07hbpKNlPPbh6MvYC3t.ttf" + }, + { + "family": "Ysabeau SC", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "cyrillic", + "cyrillic-ext", + "greek", + "latin", + "latin-ext", + "math", + "symbols", + "vietnamese" + ], + "version": "v4", + "lastModified": "2025-09-16", + "files": { + "100": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw98U1qEZ4EOmsT5.ttf", + "200": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw_8UlqEZ4EOmsT5.ttf", + "300": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw8iUlqEZ4EOmsT5.ttf", + "regular": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw98UlqEZ4EOmsT5.ttf", + "500": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw9OUlqEZ4EOmsT5.ttf", + "600": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw-iVVqEZ4EOmsT5.ttf", + "700": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw-bVVqEZ4EOmsT5.ttf", + "800": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw_8VVqEZ4EOmsT5.ttf", + "900": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw_VVVqEZ4EOmsT5.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/ysabeausc/v4/Noai6Uro3JCIKAbW46nMorJZyP7kKRflbw98UmqFbYU.ttf" + }, + { + "family": "Yuji Boku", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/yujiboku/v8/P5sAzZybeNzXsA9xj1Fkjb2r2dgvJA.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yujiboku/v8/P5sAzZybeNzXsA9xj1FUjLev.ttf" + }, + { + "family": "Yuji Hentaigana Akari", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/yujihentaiganaakari/v14/cY9bfiyVT0VB6QuhWKOrpr6z58lnb_zYFnLIRTzODYALaA.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yujihentaiganaakari/v14/cY9bfiyVT0VB6QuhWKOrpr6z58lnb_zYFnL4RDbK.ttf" + }, + { + "family": "Yuji Hentaigana Akebono", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v15", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/yujihentaiganaakebono/v15/EJRGQhkhRNwM-RtitGUwh930GU_f5KAlkuL0wQy9NKXRzrrF.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yujihentaiganaakebono/v15/EJRGQhkhRNwM-RtitGUwh930GU_f5KAlkuL0wTy8PqE.ttf" + }, + { + "family": "Yuji Mai", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/yujimai/v8/ZgNQjPxdJ7DEHrS0gC38hmHmNpCO.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yujimai/v8/ZgNQjPxdJ7DEHrS0gB39jGU.ttf" + }, + { + "family": "Yuji Syuku", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/yujisyuku/v8/BngNUXdTV3vO6Lw5ApOPqPfgwqiA-Rk.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yujisyuku/v8/BngNUXdTV3vO6Lw5ApOPmPbqxg.ttf" + }, + { + "family": "Yusei Magic", + "variants": [ + "regular" + ], + "subsets": [ + "japanese", + "latin", + "latin-ext" + ], + "version": "v16", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/yuseimagic/v16/yYLt0hbAyuCmoo5wlhPkpjHR-tdfcIT_.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/yuseimagic/v16/yYLt0hbAyuCmoo5wlhPkpgHQ8NM.ttf" + }, + { + "family": "ZCOOL KuaiLe", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-simplified", + "latin" + ], + "version": "v20", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2WpozzoXhC2g.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2mp4b3.ttf" + }, + { + "family": "ZCOOL QingKe HuangYou", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-simplified", + "latin" + ], + "version": "v16", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/zcoolqingkehuangyou/v16/2Eb5L_R5IXJEWhD3AOhSvFC554MOOahI4mRIi_28c8bHWA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zcoolqingkehuangyou/v16/2Eb5L_R5IXJEWhD3AOhSvFC554MOOahI4mR4ive4.ttf" + }, + { + "family": "ZCOOL XiaoWei", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-simplified", + "latin" + ], + "version": "v15", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/zcoolxiaowei/v15/i7dMIFFrTRywPpUVX9_RJyM1YFKQHwyVd3U.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zcoolxiaowei/v15/i7dMIFFrTRywPpUVX9_RJyM1UFOaGw.ttf" + }, + { + "family": "Zain", + "variants": [ + "200", + "300", + "300italic", + "regular", + "italic", + "700", + "800", + "900" + ], + "subsets": [ + "arabic", + "latin" + ], + "version": "v4", + "lastModified": "2025-10-29", + "files": { + "200": "https://fonts.gstatic.com/s/zain/v4/sykz-y9lm7soOBrstSq9-trEvlQ.ttf", + "300": "https://fonts.gstatic.com/s/zain/v4/sykz-y9lm7soOH7vtSq9-trEvlQ.ttf", + "300italic": "https://fonts.gstatic.com/s/zain/v4/sykx-y9lm7soMND1OSi3_vjBrlSILg.ttf", + "regular": "https://fonts.gstatic.com/s/zain/v4/syk8-y9lm7soANLHkSKW5tM.ttf", + "italic": "https://fonts.gstatic.com/s/zain/v4/syky-y9lm7soMNDNlQCT9tPdpw.ttf", + "700": "https://fonts.gstatic.com/s/zain/v4/sykz-y9lm7soOG7otSq9-trEvlQ.ttf", + "800": "https://fonts.gstatic.com/s/zain/v4/sykz-y9lm7soOHLrtSq9-trEvlQ.ttf", + "900": "https://fonts.gstatic.com/s/zain/v4/sykz-y9lm7soOFbqtSq9-trEvlQ.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zain/v4/syk8-y9lm7soMNPNlQ.ttf" + }, + { + "family": "Zalando Sans", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT-7PzkTYUMEgzhp.ttf", + "300": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT9lPzkTYUMEgzhp.ttf", + "regular": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT87PzkTYUMEgzhp.ttf", + "500": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT8JPzkTYUMEgzhp.ttf", + "600": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT_lODkTYUMEgzhp.ttf", + "700": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT_cODkTYUMEgzhp.ttf", + "800": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT-7ODkTYUMEgzhp.ttf", + "900": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT-SODkTYUMEgzhp.ttf", + "200italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfFFQa0cmhihp69o.ttf", + "300italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfI9Qa0cmhihp69o.ttf", + "italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfNFQa0cmhihp69o.ttf", + "500italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfONQa0cmhihp69o.ttf", + "600italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfA9Xa0cmhihp69o.ttf", + "700italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfDZXa0cmhihp69o.ttf", + "800italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfFFXa0cmhihp69o.ttf", + "900italic": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ47-Asy1Em_lq_aK3hpr-7p3m1_EcrANmrLqEupLPVedRVp2x5pirzfHhXa0cmhihp69o.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zalandosans/v2/FwZ67-Asy1Em_lq_aK3hpr-RrktWHD54lnesO2lsVvrnhgw8zPbXoT87PwkSa0c.ttf" + }, + { + "family": "Zalando Sans Expanded", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OPGIl41hcxm2zLI.ttf", + "300": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OC-Il41hcxm2zLI.ttf", + "regular": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OHGIl41hcxm2zLI.ttf", + "500": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OEOIl41hcxm2zLI.ttf", + "600": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OK-Pl41hcxm2zLI.ttf", + "700": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OJaPl41hcxm2zLI.ttf", + "800": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OPGPl41hcxm2zLI.ttf", + "900": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4ONiPl41hcxm2zLI.ttf", + "200italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnL_85rdzuz3LKaMA.ttf", + "300italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLIc5rdzuz3LKaMA.ttf", + "italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLf85rdzuz3LKaMA.ttf", + "500italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLTc5rdzuz3LKaMA.ttf", + "600italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLoclrdzuz3LKaMA.ttf", + "700italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnLmMlrdzuz3LKaMA.ttf", + "800italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnL_8lrdzuz3LKaMA.ttf", + "900italic": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU4jJci8Cy470GaeFwsix1hi3aTmrgRwU-zqVY1QYuEPgG_LbnL1slrdzuz3LKaMA.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zalandosansexpanded/v2/JTU6jJci8Cy470GaeFwsix1hi3aTmrgRwU-ZoGTKmeLvpK-4OHGIp4xrdw.ttf" + }, + { + "family": "Zalando Sans SemiExpanded", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v2", + "lastModified": "2025-09-16", + "files": { + "200": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkBbEnP9Fs7bOSO7.ttf", + "300": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkCFEnP9Fs7bOSO7.ttf", + "regular": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkDbEnP9Fs7bOSO7.ttf", + "500": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkDpEnP9Fs7bOSO7.ttf", + "600": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkAFFXP9Fs7bOSO7.ttf", + "700": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkA8FXP9Fs7bOSO7.ttf", + "800": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkBbFXP9Fs7bOSO7.ttf", + "900": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkByFXP9Fs7bOSO7.ttf", + "200italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTURu-HMr5PDO71Qs.ttf", + "300italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUcW-HMr5PDO71Qs.ttf", + "italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUZu-HMr5PDO71Qs.ttf", + "500italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUam-HMr5PDO71Qs.ttf", + "600italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUUW5HMr5PDO71Qs.ttf", + "700italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUXy5HMr5PDO71Qs.ttf", + "800italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTURu5HMr5PDO71Qs.ttf", + "900italic": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLjKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrE5xSReZeOtqQuDVUTUTK5HMr5PDO71Qs.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zalandosanssemiexpanded/v2/6qLhKYcHuh3msE9OaXROVVclRRa-ClZSEipa2hrEzR2jhk_n3T6ACkDbEkP8HMo.ttf" + }, + { + "family": "Zen Antique", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "greek", + "japanese", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/zenantique/v14/AYCPpXPnd91Ma_Zf-Ri2JXJq7PKP5Z_G.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zenantique/v14/AYCPpXPnd91Ma_Zf-Ri2JUJr5vY.ttf" + }, + { + "family": "Zen Antique Soft", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "greek", + "japanese", + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/zenantiquesoft/v14/DtV4JwqzSL1q_KwnEWMc_3xfgW6ihwBmkui5HNg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zenantiquesoft/v14/DtV4JwqzSL1q_KwnEWMc_3xfgW6itwFslg.ttf" + }, + { + "family": "Zen Dots", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v14", + "lastModified": "2025-09-05", + "files": { + "regular": "https://fonts.gstatic.com/s/zendots/v14/XRXX3ICfm00IGoesQeaETM_FcCIG.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zendots/v14/XRXX3ICfm00IGoesQdaFRss.ttf" + }, + { + "family": "Zen Kaku Gothic Antique", + "variants": [ + "300", + "regular", + "500", + "700", + "900" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLVKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22cM9TarWJtyZyGU.ttf", + "regular": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLQKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB21-g3RKjc4d7.ttf", + "500": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLVKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22dU9DarWJtyZyGU.ttf", + "700": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLVKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22cc8jarWJtyZyGU.ttf", + "900": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLVKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22ck8DarWJtyZyGU.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zenkakugothicantique/v18/6qLQKYkHvh-nlUpKPAdoVFBtfxDzIn1eCzpB22-h1xY.ttf" + }, + { + "family": "Zen Kaku Gothic New", + "variants": [ + "300", + "regular", + "500", + "700", + "900" + ], + "subsets": [ + "cyrillic", + "japanese", + "latin", + "latin-ext" + ], + "version": "v18", + "lastModified": "2025-09-16", + "files": { + "300": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMVW2drQpDw0GjzrVNFf_valaDBcznOqpdKaWTSTGlMyd8.ttf", + "regular": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMYW2drQpDw0GjzrVNFf_valaDBcznOkjtiTWz5UGA.ttf", + "500": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMVW2drQpDw0GjzrVNFf_valaDBcznOqs9LaWTSTGlMyd8.ttf", + "700": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMVW2drQpDw0GjzrVNFf_valaDBcznOqodNaWTSTGlMyd8.ttf", + "900": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMVW2drQpDw0GjzrVNFf_valaDBcznOqr9PaWTSTGlMyd8.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zenkakugothicnew/v18/gNMYW2drQpDw0GjzrVNFf_valaDBcznOojpoSQ.ttf" + }, + { + "family": "Zen Kurenaido", + "variants": [ + "regular" + ], + "subsets": [ + "cyrillic", + "greek", + "japanese", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/zenkurenaido/v19/3XFsEr0515BK2u6UUptu_gWJZfz22PRLd0U.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zenkurenaido/v19/3XFsEr0515BK2u6UUptu_gWJVf383A.ttf" + }, + { + "family": "Zen Loop", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/zenloop/v11/h0GrssK16UsnJwHsEK9zqwzX5vOG.ttf", + "italic": "https://fonts.gstatic.com/s/zenloop/v11/h0GtssK16UsnJwHsEJ9xoQj14-OGJ0w.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zenloop/v11/h0GrssK16UsnJwHsEJ9yoQg.ttf" + }, + { + "family": "Zen Maru Gothic", + "variants": [ + "300", + "regular", + "500", + "700", + "900" + ], + "subsets": [ + "cyrillic", + "greek", + "japanese", + "latin", + "latin-ext" + ], + "version": "v19", + "lastModified": "2025-06-25", + "files": { + "300": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0XIpIxzW5b-RxT-6A8jWAtCp-cQWpCPJqa_ajlvw.ttf", + "regular": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0SIpIxzW5b-RxT-6A8jWAtCp-k7UJmNLGG9A.ttf", + "500": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0XIpIxzW5b-RxT-6A8jWAtCp-cGWtCPJqa_ajlvw.ttf", + "700": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0XIpIxzW5b-RxT-6A8jWAtCp-cUW1CPJqa_ajlvw.ttf", + "900": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0XIpIxzW5b-RxT-6A8jWAtCp-caW9CPJqa_ajlvw.ttf" + }, + "category": "sans-serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zenmarugothic/v19/o-0SIpIxzW5b-RxT-6A8jWAtCp-U7Ehi.ttf" + }, + { + "family": "Zen Old Mincho", + "variants": [ + "regular", + "500", + "600", + "700", + "900" + ], + "subsets": [ + "cyrillic", + "greek", + "japanese", + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2025-09-02", + "files": { + "regular": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss0ApVaYytLwxTqcxfMyBveyYb3g31S2s8p.ttf", + "500": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss3ApVaYytLwxTqcxfMyBveyb4Dqlla8dMgPgBu.ttf", + "600": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss3ApVaYytLwxTqcxfMyBveyb4vrVla8dMgPgBu.ttf", + "700": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss3ApVaYytLwxTqcxfMyBveyb5LrFla8dMgPgBu.ttf", + "900": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss3ApVaYytLwxTqcxfMyBveyb5zrlla8dMgPgBu.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zenoldmincho/v13/tss0ApVaYytLwxTqcxfMyBveybb2iXk.ttf" + }, + { + "family": "Zen Tokyo Zoo", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2025-09-10", + "files": { + "regular": "https://fonts.gstatic.com/s/zentokyozoo/v8/NGSyv5ffC0J_BK6aFNtr6sRv8a1uRWe9amg.ttf" + }, + "category": "display", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zentokyozoo/v8/NGSyv5ffC0J_BK6aFNtr6sRvwaxkQQ.ttf" + }, + { + "family": "Zeyada", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v22", + "lastModified": "2025-09-16", + "files": { + "regular": "https://fonts.gstatic.com/s/zeyada/v22/11hAGpPTxVPUbgZDNGatWKaZ3g.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zeyada/v22/11hAGpPTxVPUbgZzNWyp.ttf" + }, + { + "family": "Zhi Mang Xing", + "variants": [ + "regular" + ], + "subsets": [ + "chinese-simplified", + "latin" + ], + "version": "v19", + "lastModified": "2025-09-08", + "files": { + "regular": "https://fonts.gstatic.com/s/zhimangxing/v19/f0Xw0ey79sErYFtWQ9a2rq-g0actfektIJ0.ttf" + }, + "category": "handwriting", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zhimangxing/v19/f0Xw0ey79sErYFtWQ9a2rq-g4aYneQ.ttf" + }, + { + "family": "Zilla Slab", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v12", + "lastModified": "2025-09-05", + "files": { + "300": "https://fonts.gstatic.com/s/zillaslab/v12/dFa5ZfeM_74wlPZtksIFYpEY2HSjWlhzbaw.ttf", + "300italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFanZfeM_74wlPZtksIFaj8CVHapXnp2fazkfg.ttf", + "regular": "https://fonts.gstatic.com/s/zillaslab/v12/dFa6ZfeM_74wlPZtksIFWj0w_HyIRlE.ttf", + "italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFa4ZfeM_74wlPZtksIFaj86-F6NVlFqdA.ttf", + "500": "https://fonts.gstatic.com/s/zillaslab/v12/dFa5ZfeM_74wlPZtksIFYskZ2HSjWlhzbaw.ttf", + "500italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFanZfeM_74wlPZtksIFaj8CDHepXnp2fazkfg.ttf", + "600": "https://fonts.gstatic.com/s/zillaslab/v12/dFa5ZfeM_74wlPZtksIFYuUe2HSjWlhzbaw.ttf", + "600italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFanZfeM_74wlPZtksIFaj8CIHCpXnp2fazkfg.ttf", + "700": "https://fonts.gstatic.com/s/zillaslab/v12/dFa5ZfeM_74wlPZtksIFYoEf2HSjWlhzbaw.ttf", + "700italic": "https://fonts.gstatic.com/s/zillaslab/v12/dFanZfeM_74wlPZtksIFaj8CRHGpXnp2fazkfg.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zillaslab/v12/dFa6ZfeM_74wlPZtksIFajw6-A.ttf" + }, + { + "family": "Zilla Slab Highlight", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v21", + "lastModified": "2025-09-11", + "files": { + "regular": "https://fonts.gstatic.com/s/zillaslabhighlight/v21/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxhtIY2DwSXlM.ttf", + "700": "https://fonts.gstatic.com/s/zillaslabhighlight/v21/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0TET4YmVF0Mb6.ttf" + }, + "category": "serif", + "kind": "webfonts#webfont", + "menu": "https://fonts.gstatic.com/s/zillaslabhighlight/v21/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitJaWQ.ttf" + } + ] +} \ No newline at end of file diff --git a/lawnchair/res/values-cs-rCZ/strings.xml b/lawnchair/res/values-cs-rCZ/strings.xml index 0254afcd14..a5fac84779 100644 --- a/lawnchair/res/values-cs-rCZ/strings.xml +++ b/lawnchair/res/values-cs-rCZ/strings.xml @@ -624,7 +624,7 @@ Soubory Photos and videos Audio files - All files + Všechny soubory Návrhy webu Search history Kalkulačka diff --git a/lawnchair/res/values-fr-rFR/strings.xml b/lawnchair/res/values-fr-rFR/strings.xml index 7994771b90..28510593cc 100644 --- a/lawnchair/res/values-fr-rFR/strings.xml +++ b/lawnchair/res/values-fr-rFR/strings.xml @@ -115,7 +115,7 @@ Afficher seulement les applis uniques Mon dossier - Pour effectuer certaines actions (telles que verrouiller votre téléphone) en un seul geste, Lawnchair a besoin des droits d\'accessibilité.\n\nMalgré que le privilège est accordé de force à tous les services d\'accessibilité, Lawnchair n\'observe pas les actions de l\'utilisateur et ignore tous les événements envoyés par le système.\n\nAfin de verrouiller votre téléphone ou ouvrir l\'écran Récents, Lawnchair utilise le service d\'accessibilité performGlobalAction. + Pour effectuer certaines actions (telles que verrouiller votre téléphone) en un seul geste, Lawnchair a besoin des droits d\'accessibilité.\n\nBien que le privilège soit accordé de force à tous les services d\'accessibilité, Lawnchair n\'observe pas les actions de l\'utilisateur et ignore tous les événements envoyés par le système.\n\nAfin de verrouiller votre téléphone ou ouvrir l\'écran Récents, Lawnchair utilise le service d\'accessibilité performGlobalAction. %1$s (%2$d) %1$d x %2$d %1$s et %2$s diff --git a/lawnchair/res/values-ru-rRU/strings.xml b/lawnchair/res/values-ru-rRU/strings.xml index f5e74f46a2..4762e26c6f 100644 --- a/lawnchair/res/values-ru-rRU/strings.xml +++ b/lawnchair/res/values-ru-rRU/strings.xml @@ -109,7 +109,7 @@ Изменить Применить Удалить - Смахните влево для редактирования, Смахните вправо для удаления или Коснитесь для обновления элементов + Смахните влево для редактирования, Смахните вправо для удаления или коснитесь для обновления элементов Скрыть приложения в папках Скрывать приложения в папках из общего списка приложений Показывать только неповторяющиеся приложения diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index 2834a9c6e7..f4f4139245 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -609,7 +609,10 @@ Wallpaper depth effect Zoom in and out of the wallpaper when transitioning between areas of the launcher Top shadow - + + Infinite scrolling + Swipe to loop between the first and last pages + Home screen grid Lock home screen Unlock home screen diff --git a/lawnchair/res/values/styles.xml b/lawnchair/res/values/styles.xml index b6acb9d504..bfef8a2586 100644 --- a/lawnchair/res/values/styles.xml +++ b/lawnchair/res/values/styles.xml @@ -159,6 +159,7 @@ - - @@ -347,67 +326,15 @@ 20sp - - - - - - - - - - - - - - - diff --git a/quickstep/res/xml/indexable_launcher_prefs.xml b/quickstep/res/xml/indexable_launcher_prefs.xml index cb31494b2e..b4740e5b51 100644 --- a/quickstep/res/xml/indexable_launcher_prefs.xml +++ b/quickstep/res/xml/indexable_launcher_prefs.xml @@ -29,11 +29,4 @@ android:defaultValue="false" android:persistent="true" /> - - diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 1a106a41e6..2b3690799e 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -40,7 +40,6 @@ import static com.android.app.animation.Interpolators.DECELERATE_1_5; import static com.android.app.animation.Interpolators.DECELERATE_1_7; import static com.android.app.animation.Interpolators.EXAGGERATED_EASE; import static com.android.app.animation.Interpolators.LINEAR; -import static com.android.internal.util.LatencyTracker.ACTION_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE; import static com.android.launcher3.BaseActivity.EVENT_DESTROYED; import static com.android.launcher3.BaseActivity.INVISIBLE_ALL; import static com.android.launcher3.BaseActivity.INVISIBLE_BY_APP_TRANSITIONS; @@ -80,6 +79,7 @@ import android.app.ActivityOptions; import android.app.WindowConfiguration; import android.app.role.RoleManager; import android.content.ComponentName; +import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Matrix; @@ -98,6 +98,7 @@ import android.provider.Settings; import android.util.Log; import android.util.Pair; import android.util.Size; +import android.view.CrossWindowBlurListeners; import android.view.IRemoteAnimationFinishedCallback; import android.view.RemoteAnimationAdapter; import android.view.RemoteAnimationDefinition; @@ -120,9 +121,7 @@ import androidx.annotation.Nullable; import androidx.core.graphics.ColorUtils; import com.android.app.animation.Animations; -import com.android.app.animation.Interpolators; import com.android.internal.jank.Cuj; -import com.android.internal.util.LatencyTracker; import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; import com.android.launcher3.LauncherAnimationRunner.RemoteAnimationFactory; import com.android.launcher3.anim.AnimationSuccessListener; @@ -132,6 +131,7 @@ import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.icons.FastBitmapDrawable; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.shortcuts.DeepShortcutView; +import com.android.launcher3.statehandlers.DepthController; import com.android.launcher3.taskbar.LauncherTaskbarUIController; import com.android.launcher3.testing.shared.ResourceUtils; import com.android.launcher3.touch.PagedOrientationHandler; @@ -235,7 +235,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private static final int MAX_NUM_TASKS = 5; - // Cross-fade duration between App Widget and App when launching from widget. + // Cross-fade duration between App Widget and App private static final int WIDGET_CROSSFADE_DURATION_MILLIS = 125; protected final QuickstepLauncher mLauncher; @@ -266,7 +266,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private RemoteTransition mLauncherOpenTransition; private final RemoteAnimationCoordinateTransfer mCoordinateTransfer; - private final LatencyTracker mLatencyTracker; private LauncherBackAnimationController mBackAnimationController; private final AnimatorListenerAdapter mForceInvisibleListener = new AnimatorListenerAdapter() { @@ -290,8 +289,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private final SystemUiProxy mSystemUiProxy; - public QuickstepTransitionManager(QuickstepLauncher launcher) { - mLauncher = launcher; + public QuickstepTransitionManager(Context context) { + mLauncher = Launcher.cast(Launcher.getLauncher(context)); mDragLayer = mLauncher.getDragLayer(); mHandler = new Handler(Looper.getMainLooper()); mDeviceProfile = mLauncher.getDeviceProfile(); @@ -317,12 +316,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener mSystemUiProxy.setStartingWindowListener(mStartingWindowListener); } - mOpeningXInterpolator = AnimationUtils.loadInterpolator( - launcher, R.interpolator.app_open_x); - mOpeningInterpolator = AnimationUtils.loadInterpolator( - launcher, R.interpolator.emphasized_interpolator); + mOpeningXInterpolator = AnimationUtils.loadInterpolator(context, R.interpolator.app_open_x); + mOpeningInterpolator = AnimationUtils.loadInterpolator(context, + R.interpolator.emphasized_interpolator); mCoordinateTransfer = new RemoteAnimationCoordinateTransfer(mLauncher); - mLatencyTracker = LatencyTracker.getInstance(launcher); } @Override @@ -377,7 +374,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener LauncherTaskbarUIController taskbarController = mLauncher.getTaskbarUIController(); if (syncAppLaunchWithTaskbarStash() && enableScalingRevealHomeAnimation() - && mLauncher.getStateManager().getState() == NORMAL && taskbarController != null) { taskbarController.setIgnoreInAppFlagForSync(true); mLauncher.addEventCallback(EVENT_DESTROYED, onEndCallback::executeAllAndDestroy); @@ -517,9 +513,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener target = t; break; } - final int widthPx = mDeviceProfile.getDeviceProperties().getWidthPx(); - final int heightPx = mDeviceProfile.getDeviceProperties().getHeightPx(); - if (target == null) return new Rect(0, 0, widthPx, heightPx); + if (target == null) return new Rect(0, 0, mDeviceProfile.widthPx, mDeviceProfile.heightPx); final Rect bounds = new Rect(target.screenSpaceBounds); if (target.localBounds != null) { bounds.set(target.localBounds); @@ -529,10 +523,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener if (rotationChange != 0) { if ((rotationChange % 2) == 1) { // undoing rotation, so our "original" parent size is actually flipped - Utilities.rotateBounds(bounds, heightPx, widthPx, + Utilities.rotateBounds(bounds, mDeviceProfile.heightPx, mDeviceProfile.widthPx, 4 - rotationChange); } else { - Utilities.rotateBounds(bounds, widthPx, heightPx, + Utilities.rotateBounds(bounds, mDeviceProfile.widthPx, mDeviceProfile.heightPx, 4 - rotationChange); } } @@ -571,8 +565,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final View appsView = mLauncher.getAppsView(); final float startAlpha = appsView.getAlpha(); final float startScale = SCALE_PROPERTY.get(appsView); - if (mDeviceProfile.getDeviceProperties().isTablet()) { - + if (mDeviceProfile.isTablet) { // AllApps should not fade at all in tablets. alphas = new float[]{1, 1}; } @@ -609,7 +602,13 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener endListener = composeViewContentAnimator(launcherAnimator, alphas, scales); } else { List viewsToAnimate = new ArrayList<>(); - viewsToAnimate.add(mLauncher.getWorkspace()); + Workspace workspace = mLauncher.getWorkspace(); + if (Flags.coordinateWorkspaceScale()) { + viewsToAnimate.add(workspace); + } else { + workspace.forEachVisiblePage( + view -> viewsToAnimate.add(((CellLayout) view).getShortcutsAndWidgets())); + } Hotseat hotseat = mLauncher.getHotseat(); // Do not scale hotseat as a whole when taskbar is present, and scale QSB only if it's @@ -625,19 +624,22 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener viewsToAnimate.forEach(view -> { view.setLayerType(View.LAYER_TYPE_HARDWARE, null); - // Start the animation from the current value, instead of assuming the views are - // in their resting state, so interrupted animations merge seamlessly. - // TODO(b/367591368): ideally these animations would be refactored to be - // controlled centrally so each instances doesn't need to care about this - // coordination. - float[] scale = new float[]{view.getScaleX(), scales[1]}; + float[] scale = scales; + if (Flags.coordinateWorkspaceScale()) { + // Start the animation from the current value, instead of assuming the views are + // in their resting state, so interrupted animations merge seamlessly. + // TODO(b/367591368): ideally these animations would be refactored to be + // controlled centrally so each instances doesn't need to care about this + // coordination. + scale = new float[]{view.getScaleX(), scales[1]}; - // Cancel any ongoing animations. This is necessary to avoid a conflict between - // e.g. the unfinished animation triggered when closing an app back to Home and - // this animation caused by a launch. - Animations.Companion.cancelOngoingAnimation(view); - // Make sure to cache the current animation, so it can be properly interrupted. - Animations.Companion.setOngoingAnimation(view, launcherAnimator); + // Cancel any ongoing animations. This is necessary to avoid a conflict between + // e.g. the unfinished animation triggered when closing an app back to Home and + // this animation caused by a launch. + Animations.Companion.cancelOngoingAnimation(view); + // Make sure to cache the current animation, so it can be properly interrupted. + Animations.Companion.setOngoingAnimation(view, launcherAnimator); + } ObjectAnimator scaleAnim = ObjectAnimator.ofFloat(view, SCALE_PROPERTY, scale) .setDuration(CONTENT_SCALE_DURATION); @@ -650,8 +652,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener SCALE_PROPERTY.set(view, 1f); view.setLayerType(View.LAYER_TYPE_NONE, null); - // Reset the cached animation. - Animations.Companion.setOngoingAnimation(view, null /* animation */); + if (Flags.coordinateWorkspaceScale()) { + // Reset the cached animation. + Animations.Companion.setOngoingAnimation(view, null /* animation */); + } }); mLauncher.resumeExpensiveViewUpdates(); }; @@ -694,7 +698,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private boolean shouldCropToInset(RemoteAnimationTarget target) { return enableDynamicInsetsForAppLaunch() - && mDeviceProfile.isTaskbarPresent && mDeviceProfile.isTaskbarPresentInApps && target != null && !target.willShowImeOnTarget && !isTransientTaskbar(mLauncher); @@ -801,7 +804,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final float initialWindowRadius = supportsRoundedCornersOnWindows(mLauncher.getResources()) ? Math.max(crop.width(), crop.height()) / 2f : 0f; - final float finalWindowRadius = mDeviceProfile.getDeviceProperties().isMultiWindowMode() + final float finalWindowRadius = mDeviceProfile.isMultiWindowMode ? 0 : getWindowCornerRadius(mLauncher); final float finalShadowRadius = appTargetsAreTranslucent ? 0 : mMaxShadowRadius; @@ -884,8 +887,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final int windowCropWidth = crop.width(); final int windowCropHeight = crop.height(); if (rotationChange != 0) { - Utilities.rotateBounds(crop, mDeviceProfile.getDeviceProperties().getWidthPx(), - mDeviceProfile.getDeviceProperties().getHeightPx(), rotationChange); + Utilities.rotateBounds(crop, mDeviceProfile.widthPx, + mDeviceProfile.heightPx, rotationChange); } // Scale the size of the icon to match the size of the window crop. @@ -932,14 +935,14 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener matrix.setScale(scale, scale); if (rotationChange == 1) { matrix.postTranslate(windowTransY0, - mDeviceProfile.getDeviceProperties().getWidthPx() - (windowTransX0 + scaledCropWidth)); + mDeviceProfile.widthPx - (windowTransX0 + scaledCropWidth)); } else if (rotationChange == 2) { matrix.postTranslate( - mDeviceProfile.getDeviceProperties().getWidthPx() - (windowTransX0 + scaledCropWidth), - mDeviceProfile.getDeviceProperties().getHeightPx() - (windowTransY0 + scaledCropHeight)); + mDeviceProfile.widthPx - (windowTransX0 + scaledCropWidth), + mDeviceProfile.heightPx - (windowTransY0 + scaledCropHeight)); } else if (rotationChange == 3) { matrix.postTranslate( - mDeviceProfile.getDeviceProperties().getHeightPx() - (windowTransY0 + scaledCropHeight), + mDeviceProfile.heightPx - (windowTransY0 + scaledCropHeight), windowTransX0); } else { matrix.postTranslate(windowTransX0, windowTransY0); @@ -1031,7 +1034,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener FloatingWidgetView.getDefaultBackgroundColor(mLauncher, openingTarget); } - final float finalWindowRadius = mDeviceProfile.getDeviceProperties().isMultiWindowMode() + final float finalWindowRadius = mDeviceProfile.isMultiWindowMode ? 0 : getWindowCornerRadius(mLauncher); final FloatingWidgetView floatingView = FloatingWidgetView.getFloatingWidgetView(mLauncher, v, widgetBackgroundBounds, @@ -1146,24 +1149,19 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener return animatorSet; } - /** Returns animator that controls depth/blur of the background during app/widget opening. */ - private Animator getBackgroundAnimator() { - if (Flags.allAppsBlur()) { - // Don't animate/blur the background for this launch, regardless of the launcher state. - // We have too many performance issues with the blur. - return new AnimatorSet(); - } - + /** + * Returns animator that controls depth/blur of the background. + */ + private ObjectAnimator getBackgroundAnimator() { // When launching an app from overview that doesn't map to a task, we still want to just // blur the wallpaper instead of the launcher surface as well - LauncherState launcherState = mLauncher.getStateManager().getState(); - boolean allowBlurringLauncher = - launcherState != OVERVIEW && BlurUtils.supportsBlursOnWindows(); + boolean allowBlurringLauncher = mLauncher.getStateManager().getState() != OVERVIEW + && BlurUtils.supportsBlursOnWindows(); - ObjectAnimator backgroundRadiusAnim = ObjectAnimator.ofFloat( - mLauncher.getDepthController().stateDepth, MULTI_PROPERTY_VALUE, - BACKGROUND_APP.getDepth(mLauncher)) - .setDuration(APP_LAUNCH_DURATION); + LaunchDepthController depthController = new LaunchDepthController(mLauncher); + ObjectAnimator backgroundRadiusAnim = ObjectAnimator.ofFloat(depthController.stateDepth, + MULTI_PROPERTY_VALUE, BACKGROUND_APP.getDepth(mLauncher)) + .setDuration(APP_LAUNCH_DURATION); if (allowBlurringLauncher) { // Create a temporary effect layer, that lives on top of launcher, so we can apply @@ -1184,14 +1182,18 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener .setEffectLayer() .build(); - backgroundRadiusAnim.addListener(AnimatorListeners.forEndCallback(() -> { - // Use try-with-resources to ensure the transaction gets closed. - try (SurfaceControl.Transaction transaction = new SurfaceControl.Transaction()) { - transaction.remove(dimLayer).apply(); - } - })); + backgroundRadiusAnim.addListener(AnimatorListeners.forEndCallback(() -> + new SurfaceControl.Transaction().remove(dimLayer).apply())); } + backgroundRadiusAnim.addListener( + AnimatorListeners.forEndCallback(() -> { + // reset the depth to match the main depth controller's depth + depthController.stateDepth + .setValue(mLauncher.getDepthController().stateDepth.getValue()); + depthController.dispose(); + })); + return backgroundRadiusAnim; } @@ -1429,9 +1431,9 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener DeviceProfile dp = mLauncher.getDeviceProfile(); final int halfIconSize = dp.iconSizePx / 2; float primaryDimension = orientationHandler - .getPrimaryValue(dp.getDeviceProperties().getAvailableWidthPx(), dp.getDeviceProperties().getAvailableHeightPx()); + .getPrimaryValue(dp.availableWidthPx, dp.availableHeightPx); float secondaryDimension = orientationHandler - .getSecondaryValue(dp.getDeviceProperties().getAvailableWidthPx(), dp.getDeviceProperties().getAvailableHeightPx()); + .getSecondaryValue(dp.availableWidthPx, dp.availableHeightPx); final float targetX = primaryDimension / 2f; final float targetY = secondaryDimension - dp.hotseatBarSizePx; return new RectF(targetX - halfIconSize, targetY - halfIconSize, @@ -1461,13 +1463,13 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener // Get floating view and target rect. boolean isInHotseat = false; if (launcherView instanceof LauncherAppWidgetHostView) { - Size windowSize = new Size(mDeviceProfile.getDeviceProperties().getAvailableWidthPx(), - mDeviceProfile.getDeviceProperties().getAvailableHeightPx()); + Size windowSize = new Size(mDeviceProfile.availableWidthPx, + mDeviceProfile.availableHeightPx); int fallbackBackgroundColor = FloatingWidgetView.getDefaultBackgroundColor(mLauncher, runningTaskTarget); floatingWidget = FloatingWidgetView.getFloatingWidgetView(mLauncher, (LauncherAppWidgetHostView) launcherView, targetRect, windowSize, - mDeviceProfile.getDeviceProperties().isMultiWindowMode() ? 0 : getWindowCornerRadius(mLauncher), + mDeviceProfile.isMultiWindowMode ? 0 : getWindowCornerRadius(mLauncher), isTransluscent, fallbackBackgroundColor); } else if (launcherView != null && !RemoveAnimationSettingsTracker.INSTANCE.get( mLauncher).isRemoveAnimationEnabled()) { @@ -1498,7 +1500,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener Rect closingWindowStartRect = new Rect(); closingWindowStartRectF.round(closingWindowStartRect); Rect closingWindowOriginalRect = - new Rect(0, 0, mDeviceProfile.getDeviceProperties().getWidthPx(), mDeviceProfile.getDeviceProperties().getHeightPx()); + new Rect(0, 0, mDeviceProfile.widthPx, mDeviceProfile.heightPx); if (floatingIconView != null) { anim.addAnimatorListener(floatingIconView); floatingIconView.setOnTargetChangeListener(anim::onTargetPositionChanged); @@ -1506,20 +1508,15 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener FloatingIconView finalFloatingIconView = floatingIconView; // We want the window alpha to be 0 once this threshold is met, so that the - // FloatingIconView can be seen morphing into the icon shape. + // FolderIconView can be seen morphing into the icon shape. final float windowAlphaThreshold = 1f - SHAPE_PROGRESS_DURATION; RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect, closingWindowStartRect, closingWindowOriginalRect, startWindowCornerRadius) { @Override public void onUpdate(RectF currentRectF, float progress) { - // We want the icon alpha to be 1 once this threshold is met, so that it can be - // seen morphing into the icon shape. But before the threshold, we want to limit - // the alpha to reduce the blur effect behind the window. - float iconAlpha = - Interpolators.clampToProgress(progress, 0f, windowAlphaThreshold); - finalFloatingIconView.update(iconAlpha, currentRectF, progress, - windowAlphaThreshold, getCornerRadius(progress), false); + finalFloatingIconView.update(1f, currentRectF, progress, windowAlphaThreshold, + getCornerRadius(progress), false); super.onUpdate(currentRectF, progress); } @@ -1576,7 +1573,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener Rect tmpRect = new Rect(); ValueAnimator closingAnimator = ValueAnimator.ofFloat(0, 1); int duration = CLOSING_TRANSITION_DURATION_MS; - float windowCornerRadius = mDeviceProfile.getDeviceProperties().isMultiWindowMode() + float windowCornerRadius = mDeviceProfile.isMultiWindowMode ? 0 : getWindowCornerRadius(mLauncher); float startShadowRadius = areAllTargetsTranslucent(appTargets) ? 0 : mMaxShadowRadius; closingAnimator.setDuration(duration); @@ -1646,20 +1643,14 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener } private void addCujInstrumentation(Animator anim, int cuj) { - anim.addListener(getCujAnimationSuccessListener(cuj, /* cujPreStartCallback= */null)); - } - - private void addCujInstrumentation(Animator anim, int cuj, Runnable cujPreStartCallback) { - anim.addListener(getCujAnimationSuccessListener(cuj, cujPreStartCallback)); + anim.addListener(getCujAnimationSuccessListener(cuj)); } private void addCujInstrumentation(RectFSpringAnim anim, int cuj) { - anim.addAnimatorListener( - getCujAnimationSuccessListener(cuj, /* cujPreStartCallback= */null)); + anim.addAnimatorListener(getCujAnimationSuccessListener(cuj)); } - private AnimationSuccessListener getCujAnimationSuccessListener( - int cuj, Runnable cujPreStartCallback) { + private AnimationSuccessListener getCujAnimationSuccessListener(int cuj) { return new AnimationSuccessListener() { @Override public void onAnimationStart(Animator animation) { @@ -1673,9 +1664,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener return; } mHandled = true; - if (cujPreStartCallback != null) { - cujPreStartCallback.run(); - } + InteractionJankMonitorWrapper.begin(mDragLayer, cuj); mDragLayer.post(() -> @@ -1783,6 +1772,12 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener true /* animateOverviewScrim */, launcherView).getAnimators()); } + if (!areAllTargetsTranslucent(appTargets)) { + anim.play(ObjectAnimator.ofFloat(mLauncher.getDepthController().stateDepth, + MULTI_PROPERTY_VALUE, + BACKGROUND_APP.getDepth(mLauncher), NORMAL.getDepth(mLauncher))); + } + // We play StaggeredWorkspaceAnim as a part of the closing window animation. playWorkspaceReveal = false; } @@ -1821,13 +1816,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener addCujInstrumentation(rectFSpringAnim, Cuj.CUJ_LAUNCHER_APP_CLOSE_TO_HOME); } else { if (isFreeformAnimation(appTargets)) { - addCujInstrumentation( - anim, - Cuj.CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE, - /* cujPreStartCallback= */ () -> { - mLatencyTracker.onActionEnd( - ACTION_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE); - }); + addCujInstrumentation(anim, + Cuj.CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE); } addCujInstrumentation(anim, playFallBackAnimation ? Cuj.CUJ_LAUNCHER_APP_CLOSE_TO_HOME_FALLBACK @@ -1864,7 +1854,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener } }); } else if (playWorkspaceReveal) { - anim.play(new WorkspaceRevealAnim(mLauncher, false).getAnimators()); + anim.play(new WorkspaceRevealAnim(mLauncher, false).getAnimators()); } } @@ -2266,20 +2256,17 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener boolean toLauncher, RectF resultRect) { final int taskRotation = target.windowConfiguration.getRotation(); final DeviceProfile profile = mLauncher.getDeviceProfile(); - final int rotation = profile.getDeviceProperties().getRotationHint(); - final int widthPx = profile.getDeviceProperties().getWidthPx(); - final int heightPx = profile.getDeviceProperties().getWidthPx(); final int rotationDelta = toLauncher - ? android.util.RotationUtils.deltaRotation(taskRotation, rotation) - : android.util.RotationUtils.deltaRotation(rotation, taskRotation); + ? android.util.RotationUtils.deltaRotation(taskRotation, profile.rotationHint) + : android.util.RotationUtils.deltaRotation(profile.rotationHint, taskRotation); if (rotationDelta != ROTATION_0) { // Get original display size when task is on top but with different rotation - if (rotationDelta % 2 != 0 && toLauncher && (rotation == ROTATION_0 - || rotation == ROTATION_180)) { - mDisplayRect.set(0, 0, heightPx, widthPx); + if (rotationDelta % 2 != 0 && toLauncher && (profile.rotationHint == ROTATION_0 + || profile.rotationHint == ROTATION_180)) { + mDisplayRect.set(0, 0, profile.heightPx, profile.widthPx); } else { - mDisplayRect.set(0, 0, widthPx, heightPx); + mDisplayRect.set(0, 0, profile.widthPx, profile.heightPx); } currentRect.round(mTmpResult); android.util.RotationUtils.rotateBounds(mTmpResult, mDisplayRect, rotationDelta); @@ -2418,4 +2405,19 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener return Utilities.mapToRange(progress, start, end, 1, 0, ACCELERATE_1_5); } } + + public static class LaunchDepthController extends DepthController { + public LaunchDepthController(QuickstepLauncher launcher) { + super(launcher); + try { + setCrossWindowBlursEnabled( + CrossWindowBlurListeners.getInstance().isCrossWindowBlurEnabled()); + } catch (Throwable t) { + // LC-Ignored + } + // Make sure that the starting value matches the current depth set by the main + // controller. + stateDepth.setValue(launcher.getDepthController().stateDepth.getValue()); + } + } } diff --git a/quickstep/src/com/android/launcher3/appprediction/AppsDividerView.java b/quickstep/src/com/android/launcher3/appprediction/AppsDividerView.java index 4404428f85..e1e3eec790 100644 --- a/quickstep/src/com/android/launcher3/appprediction/AppsDividerView.java +++ b/quickstep/src/com/android/launcher3/appprediction/AppsDividerView.java @@ -33,12 +33,10 @@ import android.view.accessibility.AccessibilityManager; import androidx.annotation.ColorInt; import androidx.annotation.VisibleForTesting; -import com.android.launcher3.Flags; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.allapps.FloatingHeaderRow; import com.android.launcher3.allapps.FloatingHeaderView; -import com.android.launcher3.util.Themes; /** * A view which shows a horizontal divider @@ -86,10 +84,9 @@ public class AppsDividerView extends View implements FloatingHeaderRow { getResources().getDimensionPixelSize(R.dimen.all_apps_divider_height) }; - mStrokeColor = Flags.allAppsBlur() - ? Themes.getAttrColor(context, R.attr.bottomSheetDragHandleColor) - : context.getColor(R.color.materialColorOutlineVariant); - mAllAppsLabelTextColor = context.getColor(R.color.materialColorOnSurface); + mStrokeColor = context.getColor(R.color.materialColorOutlineVariant); + + mAllAppsLabelTextColor = context.getColor(R.color.materialColorOnSurfaceVariant); mAccessibilityManager = AccessibilityManager.getInstance(context); setShowAllAppsLabel(!ALL_APPS_VISITED_COUNT.hasReachedMax(context)); @@ -214,8 +211,7 @@ public class AppsDividerView extends View implements FloatingHeaderRow { private Layout getAllAppsLabelLayout() { if (mAllAppsLabelLayout == null) { mPaint.setAntiAlias(true); - mPaint.setTypeface(Typeface.create(Flags.gsfRes() ? "variable-title-small" - : "google-sans", Typeface.NORMAL)); + mPaint.setTypeface(Typeface.create("google-sans", Typeface.NORMAL)); mPaint.setTextSize( getResources().getDimensionPixelSize(R.dimen.all_apps_label_text_size)); diff --git a/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java b/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java index b6d3146ffe..b329156cf3 100644 --- a/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java +++ b/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java @@ -143,10 +143,9 @@ public class PredictionRowView @Override public int getExpectedHeight() { DeviceProfile deviceProfile = mActivityContext.getDeviceProfile(); - int iconHeight = deviceProfile.getAllAppsProfile().getIconSizePx(); - int iconPadding = deviceProfile.getAllAppsProfile().getIconDrawablePaddingPx(); - int textHeight = Utilities.calculateTextHeight( - deviceProfile.getAllAppsProfile().getIconTextSizePx()); + int iconHeight = deviceProfile.allAppsIconSizePx; + int iconPadding = deviceProfile.allAppsIconDrawablePaddingPx; + int textHeight = Utilities.calculateTextHeight(deviceProfile.allAppsIconTextSizePx); int totalHeight = iconHeight + iconPadding + textHeight + mVerticalPadding * 2; // Prediction row height will be 4dp bigger than the regular apps in A-Z list when two line // is not enabled. Otherwise, the extra height will increase by just the textHeight. @@ -236,11 +235,7 @@ public class PredictionRowView lp.height = ViewGroup.LayoutParams.MATCH_PARENT; } else { // Ensure the all apps icon height matches the workspace icons in portrait mode. - lp.height = - mActivityContext - .getDeviceProfile() - .getAllAppsProfile() - .getCellHeightPx(); + lp.height = mActivityContext.getDeviceProfile().allAppsCellHeightPx; } lp.width = 0; lp.weight = 1; diff --git a/quickstep/src/com/android/launcher3/dagger/Modules.kt b/quickstep/src/com/android/launcher3/dagger/Modules.kt index 479c3eb82a..67994b0958 100644 --- a/quickstep/src/com/android/launcher3/dagger/Modules.kt +++ b/quickstep/src/com/android/launcher3/dagger/Modules.kt @@ -16,32 +16,22 @@ package com.android.launcher3.dagger -import com.android.launcher3.backuprestore.LauncherRestoreEventLogger -import com.android.launcher3.icons.LauncherIconProvider -import com.android.launcher3.icons.LauncherIconProviderImpl -import com.android.launcher3.logging.StatsLogManager.StatsLogManagerFactory +import app.lawnchair.factory.LawnchairWidgetHolder +import app.lawnchair.util.LawnchairWindowManagerProxy import com.android.launcher3.uioverrides.QuickstepWidgetHolder.QuickstepWidgetHolderFactory import com.android.launcher3.uioverrides.SystemApiWrapper import com.android.launcher3.uioverrides.plugins.PluginManagerWrapperImpl import com.android.launcher3.util.ApiWrapper -import com.android.launcher3.util.InstantAppResolver import com.android.launcher3.util.PluginManagerWrapper import com.android.launcher3.util.window.RefreshRateTracker import com.android.launcher3.util.window.WindowManagerProxy import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory -import com.android.quickstep.InstantAppResolverImpl -import com.android.quickstep.LauncherRestoreEventLoggerImpl -import com.android.quickstep.logging.StatsLogCompatManager.StatsLogCompatManagerFactory import com.android.quickstep.util.ChoreographerFrameRateTracker import com.android.quickstep.util.GestureExclusionManager -import com.android.systemui.shared.system.ActivityManagerWrapper import dagger.Binds import dagger.Module import dagger.Provides -import app.lawnchair.factory.LawnchairWidgetHolder -import app.lawnchair.util.LawnchairWindowManagerProxy - private object Modules {} @Module @@ -51,22 +41,7 @@ abstract class WindowManagerProxyModule { @Module abstract class ApiWrapperModule { - @Binds - abstract fun bindStatsLogManagerFactory( - impl: StatsLogCompatManagerFactory - ): StatsLogManagerFactory - @Binds abstract fun bindApiWrapper(systemApiWrapper: SystemApiWrapper): ApiWrapper - - @Binds - abstract fun bindIconProvider(iconProviderImpl: LauncherIconProviderImpl): LauncherIconProvider - - @Binds abstract fun bindInstantAppResolver(impl: InstantAppResolverImpl): InstantAppResolver - - @Binds - abstract fun bindRestoreEventLogger( - impl: LauncherRestoreEventLoggerImpl - ): LauncherRestoreEventLogger } @Module @@ -92,9 +67,4 @@ object StaticObjectModule { @Provides @JvmStatic fun provideRefreshRateTracker(): RefreshRateTracker = ChoreographerFrameRateTracker - - @Provides - @JvmStatic - fun provideActivityManagerWrapper(): ActivityManagerWrapper = - ActivityManagerWrapper.getInstance() } diff --git a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransition.kt b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransition.kt index 281d84677a..5a8934b9f5 100644 --- a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransition.kt +++ b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransition.kt @@ -81,13 +81,11 @@ constructor( val animators = mutableListOf() val animatorFinishedCallback: (Animator) -> Unit = { animator -> animators -= animator - if (animators.isEmpty()) { - RemoteRunnable.executeSafely(finishedCallback) - } + if (animators.isEmpty()) finishedCallback.run() } animators += animatorHelper.createAnimators(info, animatorFinishedCallback) if (animators.isEmpty()) { - RemoteRunnable.executeSafely(finishedCallback) + finishedCallback.run() return } animators.forEach { it.start() } diff --git a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManager.kt b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManager.kt index 1434168687..a72b5c43c5 100644 --- a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManager.kt +++ b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManager.kt @@ -19,7 +19,6 @@ package com.android.launcher3.desktop import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM import android.content.Context -import android.window.DesktopExperienceFlags import android.window.DesktopModeFlags import android.window.RemoteTransition import android.window.TransitionFilter @@ -85,9 +84,7 @@ class DesktopAppLaunchTransitionManager( mWindowingMode = WINDOWING_MODE_FREEFORM mModes = DesktopAppLaunchTransition.LAUNCH_CHANGE_MODES mMustBeTask = true - if (!DesktopExperienceFlags.ENABLE_DESKTOP_APP_LAUNCH_BUGFIX.isTrue) { - mOrder = CONTAINER_ORDER_TOP - } + mOrder = CONTAINER_ORDER_TOP } return TransitionFilter().apply { mTypeSet = DesktopAppLaunchTransition.LAUNCH_CHANGE_MODES diff --git a/quickstep/src/com/android/launcher3/desktop/DesktopRecentsTransitionController.kt b/quickstep/src/com/android/launcher3/desktop/DesktopRecentsTransitionController.kt index 32cf6d5d2d..a01846dda9 100644 --- a/quickstep/src/com/android/launcher3/desktop/DesktopRecentsTransitionController.kt +++ b/quickstep/src/com/android/launcher3/desktop/DesktopRecentsTransitionController.kt @@ -34,7 +34,7 @@ import com.android.quickstep.util.DesksUtils.Companion.areMultiDesksFlagsEnabled import com.android.quickstep.views.DesktopTaskView import com.android.quickstep.views.TaskContainer import com.android.quickstep.views.TaskView -import com.android.window.flags2.Flags +import com.android.window.flags.Flags import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource import java.util.function.Consumer @@ -46,14 +46,10 @@ class DesktopRecentsTransitionController( private val depthController: DepthController?, ) { - /** - * Launch desktop tasks from recents view and activate the new freeform task with id - * [taskIdToReorderToFront] if it's provided and already on the given desk. - */ + /** Launch desktop tasks from recents view */ fun launchDesktopFromRecents( desktopTaskView: DesktopTaskView, animated: Boolean, - taskIdToReorderToFront: Int? = null, callback: Consumer? = null, ) { val animRunner = @@ -66,13 +62,9 @@ class DesktopRecentsTransitionController( ) val transition = RemoteTransition(animRunner, appThread, "RecentsToDesktop") if (areMultiDesksFlagsEnabled()) { - systemUiProxy.activateDesk(desktopTaskView.deskId, transition, taskIdToReorderToFront) + systemUiProxy.activateDesk(desktopTaskView.deskId, transition) } else { - systemUiProxy.showDesktopApps( - desktopTaskView.displayId, - transition, - taskIdToReorderToFront, - ) + systemUiProxy.showDesktopApps(desktopTaskView.displayId, transition) } } diff --git a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduController.java b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduController.java index 7c53360ea4..b77c43fc2f 100644 --- a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduController.java +++ b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduController.java @@ -33,6 +33,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; +import com.android.launcher3.util.IntArray; import com.android.launcher3.views.ArrowTipView; import com.android.launcher3.views.Snackbar; @@ -56,6 +57,7 @@ public class HotseatEduController { private HotseatEduDialog mActiveDialog; private ArrayList mNewItems = new ArrayList<>(); + private IntArray mNewScreens = null; HotseatEduController(Launcher launcher) { mLauncher = launcher; @@ -94,6 +96,7 @@ public class HotseatEduController { } if (pageId == -1) { pageId = mLauncher.getModel().getModelDbController().getNewScreenId(); + mNewScreens = IntArray.wrap(pageId); } boolean isPortrait = !mLauncher.getDeviceProfile().isVerticalBarLayout(); int hotseatItemsNum = mLauncher.getDeviceProfile().numShownHotseatIcons; @@ -114,7 +117,18 @@ public class HotseatEduController { void moveHotseatItems() { mHotseat.removeAllViewsInLayout(); if (!mNewItems.isEmpty()) { - mLauncher.bindItemsAdded(mNewItems); + int lastPage = mNewItems.get(mNewItems.size() - 1).screenId; + ArrayList animated = new ArrayList<>(); + ArrayList nonAnimated = new ArrayList<>(); + + for (ItemInfo info : mNewItems) { + if (info.screenId == lastPage) { + animated.add(info); + } else { + nonAnimated.add(info); + } + } + mLauncher.bindAppsAdded(mNewScreens, nonAnimated, animated); } } diff --git a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java index 891397fe84..db225be4a9 100644 --- a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java +++ b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java @@ -38,6 +38,7 @@ import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.celllayout.CellLayoutLayoutParams; import com.android.launcher3.model.data.WorkspaceItemInfo; +import com.android.launcher3.uioverrides.PredictedAppIcon; import com.android.launcher3.views.AbstractSlideInView; import java.util.List; @@ -88,11 +89,11 @@ public class HotseatEduDialog extends AbstractSlideInView implements I mSampleHotseat = findViewById(R.id.sample_prediction); Context context = getContext(); - DeviceProfile dp = mActivityContext.getDeviceProfile(); - Rect padding = dp.getHotseatLayoutPadding(context); + DeviceProfile grid = mActivityContext.getDeviceProfile(); + Rect padding = grid.getHotseatLayoutPadding(context); - mSampleHotseat.getLayoutParams().height = dp.cellHeightPx; - mSampleHotseat.setGridSize(dp.numShownHotseatIcons, 1); + mSampleHotseat.getLayoutParams().height = grid.cellHeightPx; + mSampleHotseat.setGridSize(grid.numShownHotseatIcons, 1); mSampleHotseat.setPadding(padding.left, 0, padding.right, 0); Button turnOnBtn = findViewById(R.id.turn_predictions_on); @@ -102,8 +103,7 @@ public class HotseatEduDialog extends AbstractSlideInView implements I mDismissBtn.setOnClickListener(this::onDismiss); LinearLayout buttonContainer = findViewById(R.id.button_container); - int adjustedMarginEnd = - dp.getHotseatProfile().getBarEndOffset() - buttonContainer.getPaddingEnd(); + int adjustedMarginEnd = grid.hotseatBarEndOffset - buttonContainer.getPaddingEnd(); if (InvariantDeviceProfile.INSTANCE.get(context) .getDeviceProfile(context).isTaskbarPresent && adjustedMarginEnd > 0) { ((LinearLayout.LayoutParams) buttonContainer.getLayoutParams()).setMarginEnd( @@ -184,9 +184,10 @@ public class HotseatEduDialog extends AbstractSlideInView implements I private void populatePreview(List predictions) { for (int i = 0; i < mActivityContext.getDeviceProfile().numShownHotseatIcons; i++) { WorkspaceItemInfo info = predictions.get(i); - View icon = mActivityContext.getItemInflater().inflateItem(info, mSampleHotseat); + PredictedAppIcon icon = PredictedAppIcon.createIcon(mSampleHotseat, info); icon.setEnabled(false); icon.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); + icon.verifyHighRes(); CellLayoutLayoutParams lp = new CellLayoutLayoutParams(i, 0, 1, 1); mSampleHotseat.addViewToCellLayout(icon, i, info.getViewId(), lp, true); } diff --git a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java index af68545cc8..c2cabd0557 100644 --- a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java +++ b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java @@ -29,6 +29,7 @@ import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.ComponentName; +import android.util.Log; import android.view.HapticFeedbackConstants; import android.view.View; import android.view.ViewGroup; @@ -46,15 +47,14 @@ import com.android.launcher3.LauncherPrefs; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.anim.AnimationSuccessListener; -import com.android.launcher3.celllayout.CellLayoutLayoutParams; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.graphics.DragPreviewProvider; import com.android.launcher3.logger.LauncherAtom.ContainerInfo; import com.android.launcher3.logger.LauncherAtom.PredictedHotseatContainer; import com.android.launcher3.logging.InstanceId; +import com.android.launcher3.model.BgDataModel.FixedContainerItems; import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.model.data.PredictedContainerInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.pm.UserCache; import com.android.launcher3.popup.SystemShortcut; @@ -81,9 +81,11 @@ public class HotseatPredictionController implements DragController.DragListener, SystemShortcut.Factory, DeviceProfile.OnDeviceProfileChangeListener, DragSource, ViewGroup.OnHierarchyChangeListener { - private static final int FLAG_DRAG_IN_PROGRESS = 1 << 0; - private static final int FLAG_FILL_IN_PROGRESS = 1 << 1; - private static final int FLAG_REMOVING_PREDICTED_ICON = 1 << 2; + private static final String TAG = "HotseatPredictionController"; + private static final int FLAG_UPDATE_PAUSED = 1 << 0; + private static final int FLAG_DRAG_IN_PROGRESS = 1 << 1; + private static final int FLAG_FILL_IN_PROGRESS = 1 << 2; + private static final int FLAG_REMOVING_PREDICTED_ICON = 1 << 3; private int mHotSeatItemsCount; @@ -230,7 +232,7 @@ public class HotseatPredictionController implements DragController.DragListener, if (icon.applyFromWorkspaceItemWithAnimation(predictedItem, numViewsAnimated)) { numViewsAnimated++; } - finishBinding(icon); + icon.finishBinding(mPredictionLongClickListener); } else { newItems.add(predictedItem); } @@ -244,9 +246,9 @@ public class HotseatPredictionController implements DragController.DragListener, private void bindItems(List itemsToAdd, boolean animate) { AnimatorSet animationSet = new AnimatorSet(); for (WorkspaceItemInfo item : itemsToAdd) { - View icon = mLauncher.getItemInflater().inflateItem(item, mHotseat); + PredictedAppIcon icon = PredictedAppIcon.createIcon(mHotseat, item); mLauncher.getWorkspace().addInScreenFromBind(icon, item); - finishBinding(icon); + icon.finishBinding(mPredictionLongClickListener); if (animate) { animationSet.play(ObjectAnimator.ofFloat(icon, SCALE_PROPERTY, 0.2f, 1)); } @@ -260,11 +262,6 @@ public class HotseatPredictionController implements DragController.DragListener, } } - private void finishBinding(View view) { - view.setOnLongClickListener(mPredictionLongClickListener); - ((CellLayoutLayoutParams) view.getLayoutParams()).canReorder = false; - } - private void removeOutlineDrawings() { if (mOutlineDrawings.isEmpty()) return; for (PredictedAppIcon.PredictedIconOutlineDrawing outlineDrawing : mOutlineDrawings) { @@ -282,11 +279,33 @@ public class HotseatPredictionController implements DragController.DragListener, mLauncher.removeOnDeviceProfileChangeListener(this); } + /** + * start and pauses predicted apps update on the hotseat + */ + public void setPauseUIUpdate(boolean paused) { + mPauseFlags = paused + ? (mPauseFlags | FLAG_UPDATE_PAUSED) + : (mPauseFlags & ~FLAG_UPDATE_PAUSED); + if (!paused) { + fillGapsWithPrediction(); + } + } + + /** + * Ensures that if the flag FLAG_UPDATE_PAUSED is active we set it to false. + */ + public void verifyUIUpdateNotPaused() { + if ((mPauseFlags & FLAG_UPDATE_PAUSED) != 0) { + setPauseUIUpdate(false); + Log.e(TAG, "FLAG_UPDATE_PAUSED should not be set to true (see b/339700174)"); + } + } + /** * Sets or updates the predicted items */ - public void setPredictedItems(PredictedContainerInfo items) { - mPredictedItems = items.getContents(); + public void setPredictedItems(FixedContainerItems items) { + mPredictedItems = new ArrayList(items.items); if (mPredictedItems.isEmpty()) { HotseatRestoreHelper.restoreBackup(mLauncher); } @@ -484,18 +503,10 @@ public class HotseatPredictionController implements DragController.DragListener, private class PinPrediction extends SystemShortcut { private PinPrediction(QuickstepLauncher target, ItemInfo itemInfo, View originalView) { - super(getDrawableId(), R.string.pin_prediction, target, + super(R.drawable.ic_pin, R.string.pin_prediction, target, itemInfo, originalView); } - public static int getDrawableId() { - if (Flags.enableLauncherVisualRefresh()) { - return R.drawable.keep_24px; - } else { - return R.drawable.ic_pin; - } - } - @Override public void onClick(View view) { dismissTaskMenuView(); @@ -511,6 +522,7 @@ public class HotseatPredictionController implements DragController.DragListener, private static String getStateString(int flags) { StringJoiner str = new StringJoiner("|"); + appendFlag(str, flags, FLAG_UPDATE_PAUSED, "FLAG_UPDATE_PAUSED"); appendFlag(str, flags, FLAG_DRAG_IN_PROGRESS, "FLAG_DRAG_IN_PROGRESS"); appendFlag(str, flags, FLAG_FILL_IN_PROGRESS, "FLAG_FILL_IN_PROGRESS"); appendFlag(str, flags, FLAG_REMOVING_PREDICTED_ICON, diff --git a/quickstep/src/com/android/launcher3/model/AppEventProducer.java b/quickstep/src/com/android/launcher3/model/AppEventProducer.java index 880f1fd969..8ca1cd9e3d 100644 --- a/quickstep/src/com/android/launcher3/model/AppEventProducer.java +++ b/quickstep/src/com/android/launcher3/model/AppEventProducer.java @@ -22,8 +22,9 @@ import static android.app.prediction.AppTargetEvent.ACTION_UNDISMISS; import static android.app.prediction.AppTargetEvent.ACTION_UNPIN; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION; -import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS_PREDICTION; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_PREDICTION; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION; +import static com.android.launcher3.logger.LauncherAtomExtensions.ExtendedContainers.ContainerCase.DEVICE_SEARCH_RESULT_CONTAINER; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_DRAGDROP; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_TAP; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_DISMISS_PREDICTION_UNDO; @@ -41,7 +42,6 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASK_LAUNCH_SWIPE_DOWN; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASK_LAUNCH_TAP; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_WIDGET_ADD_BUTTON_TAP; -import static com.android.launcher3.model.PredictionHelper.getLocationString; import static com.android.launcher3.model.PredictionHelper.isTrackedForHotseatPrediction; import static com.android.launcher3.model.PredictionHelper.isTrackedForWidgetPrediction; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; @@ -65,6 +65,10 @@ import androidx.annotation.WorkerThread; import com.android.launcher3.Utilities; import com.android.launcher3.logger.LauncherAtom; +import com.android.launcher3.logger.LauncherAtom.ContainerInfo; +import com.android.launcher3.logger.LauncherAtom.FolderContainer; +import com.android.launcher3.logger.LauncherAtom.HotseatContainer; +import com.android.launcher3.logger.LauncherAtom.WorkspaceContainer; import com.android.launcher3.logging.StatsLogManager.EventEnum; import com.android.launcher3.pm.UserCache; import com.android.launcher3.shortcuts.ShortcutRequest; @@ -72,6 +76,7 @@ import com.android.launcher3.util.UserIconInfo; import com.android.quickstep.logging.StatsLogCompatManager.StatsLogConsumer; import com.android.systemui.shared.system.SysUiStatsLog; +import java.util.Locale; import java.util.Optional; import java.util.function.ObjIntConsumer; @@ -116,10 +121,7 @@ public class AppEventProducer implements StatsLogConsumer { // TODO: remove the running test check when b/231648228 is fixed. if (target != null && !Utilities.isRunningInTestHarness()) { AppTargetEvent event = new AppTargetEvent.Builder(target, eventId) - .setLaunchLocation(getLocationString( - locationInfo.getContainerInfo(), - locationInfo.getWidget().getSpanX(), - locationInfo.getWidget().getSpanY())) + .setLaunchLocation(getContainer(locationInfo)) .build(); mMessageHandler.obtainMessage(MSG_LAUNCH, targetPredictor, 0, event).sendToTarget(); } @@ -133,10 +135,10 @@ public class AppEventProducer implements StatsLogConsumer { || event == LAUNCHER_QUICKSWITCH_RIGHT || event == LAUNCHER_QUICKSWITCH_LEFT || event == LAUNCHER_APP_LAUNCH_DRAGDROP) { - sendEvent(atomInfo, ACTION_LAUNCH, CONTAINER_ALL_APPS_PREDICTION); + sendEvent(atomInfo, ACTION_LAUNCH, CONTAINER_PREDICTION); } else if (event == LAUNCHER_ITEM_DROPPED_ON_DONT_SUGGEST || event == LAUNCHER_SYSTEM_SHORTCUT_DONT_SUGGEST_APP_TAP) { - sendEvent(atomInfo, ACTION_DISMISS, CONTAINER_ALL_APPS_PREDICTION); + sendEvent(atomInfo, ACTION_DISMISS, CONTAINER_PREDICTION); } else if (event == LAUNCHER_ITEM_DRAG_STARTED) { mLastDragItem = atomInfo; } else if (event == LAUNCHER_ITEM_DROP_COMPLETED) { @@ -181,9 +183,9 @@ public class AppEventProducer implements StatsLogConsumer { AppTarget target = new AppTarget.Builder(new AppTargetId("launcher:launcher"), mContext.getPackageName(), Process.myUserHandle()) .build(); - sendEvent(target, atomInfo, ACTION_LAUNCH, CONTAINER_ALL_APPS_PREDICTION); + sendEvent(target, atomInfo, ACTION_LAUNCH, CONTAINER_PREDICTION); } else { - sendEvent(atomInfo, ACTION_LAUNCH, CONTAINER_ALL_APPS_PREDICTION); + sendEvent(atomInfo, ACTION_LAUNCH, CONTAINER_PREDICTION); } } else if (event == LAUNCHER_DISMISS_PREDICTION_UNDO) { sendEvent(atomInfo, ACTION_UNDISMISS, CONTAINER_HOTSEAT_PREDICTION); @@ -275,6 +277,68 @@ public class AppEventProducer implements StatsLogConsumer { } } + private String getContainer(LauncherAtom.ItemInfo info) { + ContainerInfo ci = info.getContainerInfo(); + switch (ci.getContainerCase()) { + case WORKSPACE: { + // In case the item type is not widgets, the spaceX and spanY default to 1. + int spanX = info.getWidget().getSpanX(); + int spanY = info.getWidget().getSpanY(); + return getWorkspaceContainerString(ci.getWorkspace(), spanX, spanY); + } + case HOTSEAT: { + return getHotseatContainerString(ci.getHotseat()); + } + case TASK_SWITCHER_CONTAINER: { + return "task-switcher"; + } + case ALL_APPS_CONTAINER: { + return "all-apps"; + } + case PREDICTED_HOTSEAT_CONTAINER: { + return "predictions/hotseat"; + } + case PREDICTION_CONTAINER: { + return "predictions"; + } + case SHORTCUTS_CONTAINER: { + return "deep-shortcuts"; + } + case TASK_BAR_CONTAINER: { + return "taskbar"; + } + case FOLDER: { + FolderContainer fc = ci.getFolder(); + switch (fc.getParentContainerCase()) { + case WORKSPACE: + return "folder/" + getWorkspaceContainerString(fc.getWorkspace(), 1, 1); + case HOTSEAT: + return "folder/" + getHotseatContainerString(fc.getHotseat()); + } + return "folder"; + } + case SEARCH_RESULT_CONTAINER: + return "search-results"; + case EXTENDED_CONTAINERS: { + if (ci.getExtendedContainers().getContainerCase() + == DEVICE_SEARCH_RESULT_CONTAINER) { + return "search-results"; + } + } + default: // fall out + } + return ""; + } + + private static String getWorkspaceContainerString(WorkspaceContainer wc, int spanX, int spanY) { + return String.format(Locale.ENGLISH, "workspace/%d/[%d,%d]/[%d,%d]", + wc.getPageIndex(), wc.getGridX(), wc.getGridY(), spanX, spanY); + } + + private static String getHotseatContainerString(HotseatContainer hc) { + return String.format(Locale.ENGLISH, "hotseat/%1$d/[%1$d,0]/[1,1]", hc.getIndex()); + } + private static ComponentName parseNullable(String componentNameString) { return TextUtils.isEmpty(componentNameString) ? null : ComponentName.unflattenFromString(componentNameString); diff --git a/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java b/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java index 1b6050d000..3544844bd2 100644 --- a/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java +++ b/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java @@ -18,6 +18,7 @@ package com.android.launcher3.model; import static com.android.launcher3.EncryptionType.ENCRYPTED; import static com.android.launcher3.LauncherPrefs.nonRestorableItem; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT; +import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG; import static com.android.quickstep.InstantAppResolverImpl.COMPONENT_CLASS_MARKER; import android.app.prediction.AppTarget; @@ -34,13 +35,13 @@ import com.android.launcher3.ConstantItem; import com.android.launcher3.LauncherModel.ModelUpdateTask; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.icons.IconCache; +import com.android.launcher3.model.BgDataModel.FixedContainerItems; +import com.android.launcher3.model.QuickstepModelDelegate.PredictorState; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.model.data.PredictedContainerInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -71,9 +72,8 @@ public class PredictionUpdateTask implements ModelUpdateTask { LauncherPrefs.get(context).put(LAST_PREDICTION_ENABLED, !mTargets.isEmpty()); Set usersForChangedShortcuts = - dataModel.itemsIdMap.getPredictedContents(mPredictorState.containerId).stream() - .filter(info -> info != null && - info.itemType == ITEM_TYPE_DEEP_SHORTCUT) + dataModel.extraItems.get(mPredictorState.containerId).items.stream() + .filter(info -> info.itemType == ITEM_TYPE_DEEP_SHORTCUT) .map(info -> info.user) .collect(Collectors.toSet()); @@ -107,7 +107,7 @@ public class PredictionUpdateTask implements ModelUpdateTask { return null; } AppInfo ai = new AppInfo(context, lai, user); - iconCache.getTitleAndIcon(ai, lai, mPredictorState.lookupFlag); + iconCache.getTitleAndIcon(ai, lai, DEFAULT_LOOKUP_FLAG); return ai.makeWorkspaceItem(context); }); @@ -120,12 +120,12 @@ public class PredictionUpdateTask implements ModelUpdateTask { items.add(itemInfo); } - PredictedContainerInfo pci = new PredictedContainerInfo(mPredictorState.containerId, items); - dataModel.updateAndDispatchItem(pci /* item */, null /* owner */); - taskController.bindUpdatedWorkspaceItems(Collections.singleton(pci)); + FixedContainerItems fci = new FixedContainerItems(mPredictorState.containerId, items); + dataModel.extraItems.put(fci.containerId, fci); + taskController.bindExtraContainerItems(fci); usersForChangedShortcuts.forEach(u -> dataModel.updateShortcutPinnedState(context, u)); // Save to disk - mPredictorState.storage.write(context, pci.getContents()); + mPredictorState.storage.write(context, fci.items); } } diff --git a/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java b/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java index 3a481a1a27..05ae150544 100644 --- a/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java +++ b/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java @@ -15,19 +15,21 @@ */ package com.android.launcher3.model; -import static android.Manifest.permission.PACKAGE_USAGE_STATS; import static android.text.format.DateUtils.DAY_IN_MILLIS; import static android.text.format.DateUtils.formatElapsedTime; import static com.android.launcher3.EncryptionType.ENCRYPTED; import static com.android.launcher3.LauncherPrefs.nonRestorableItem; -import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS_PREDICTION; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_PREDICTION; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION; import static com.android.launcher3.LauncherSettings.Favorites.DESKTOP_ICON_FLAG; +import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; +import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT; +import static com.android.launcher3.hybridhotseat.HotseatPredictionModel.convertDataModelToAppTargetBundle; import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG; -import static com.android.launcher3.model.PredictionHelper.getBundleForHotseatPredictions; -import static com.android.launcher3.model.PredictionHelper.getBundleForWidgetPredictions; +import static com.android.launcher3.model.PredictionHelper.getAppTargetFromItemInfo; +import static com.android.launcher3.model.PredictionHelper.wrapAppTargetWithItemLocation; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import android.Manifest; @@ -36,6 +38,8 @@ import static java.util.stream.Collectors.toCollection; import android.app.StatsManager; import android.app.prediction.AppPredictionContext; import android.app.prediction.AppPredictionManager; +import android.app.prediction.AppPredictor; +import android.app.prediction.AppTarget; import android.app.prediction.AppTargetEvent; import android.content.Context; import android.content.Intent; @@ -49,6 +53,8 @@ import android.text.TextUtils; import android.util.Log; import android.util.StatsEvent; +import androidx.annotation.AnyThread; +import androidx.annotation.CallSuper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -60,21 +66,33 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.Utilities; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.dagger.ApplicationContext; +import com.android.launcher3.icons.cache.CacheLookupFlag; import com.android.launcher3.logger.LauncherAtom; import com.android.launcher3.logging.InstanceId; import com.android.launcher3.logging.InstanceIdSequence; +import com.android.launcher3.model.BgDataModel.FixedContainerItems; +import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.CollectionInfo; import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.model.data.PredictedContainerInfo; -import com.android.launcher3.model.data.WorkspaceData; +import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.pm.UserCache; +import com.android.launcher3.shortcuts.ShortcutKey; +import com.android.launcher3.util.ApiWrapper; +import com.android.launcher3.util.Executors; import com.android.launcher3.util.IntSparseArrayMap; +import com.android.launcher3.util.PackageManagerHelper; +import com.android.launcher3.util.PersistedItemArray; import com.android.quickstep.logging.SettingsChangeLogger; import com.android.quickstep.logging.StatsLogCompatManager; import com.android.quickstep.util.ContextualSearchStateManager; import com.android.systemui.shared.system.SysUiStatsLog; import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.IntStream; import javax.inject.Inject; import javax.inject.Named; @@ -87,6 +105,7 @@ import app.lawnchair.compat.LawnchairQuickstepCompat; */ public class QuickstepModelDelegate extends ModelDelegate { + private static final String BUNDLE_KEY_ADDED_APP_WIDGETS = "added_app_widgets"; private static final int NUM_OF_RECOMMENDED_WIDGETS_PREDICATION = 20; private static final boolean IS_DEBUG = false; @@ -96,18 +115,17 @@ public class QuickstepModelDelegate extends ModelDelegate { nonRestorableItem("LAST_SNAPSHOT_TIME_MILLIS", 0L, ENCRYPTED); @VisibleForTesting - final PredictorState mAllPredictionAppsState = new PredictorState( - CONTAINER_ALL_APPS_PREDICTION, "all_apps_predictions", DEFAULT_LOOKUP_FLAG); + final PredictorState mAllAppsState = new PredictorState( + CONTAINER_PREDICTION, "all_apps_predictions", DEFAULT_LOOKUP_FLAG); @VisibleForTesting - final PredictorState mHotseatPredictionState = new PredictorState( + final PredictorState mHotseatState = new PredictorState( CONTAINER_HOTSEAT_PREDICTION, "hotseat_predictions", DESKTOP_ICON_FLAG); @VisibleForTesting final PredictorState mWidgetsRecommendationState = new PredictorState( CONTAINER_WIDGETS_PREDICTION, "widgets_prediction", DESKTOP_ICON_FLAG); private final InvariantDeviceProfile mIDP; - private final UserCache mUserCache; - private final PredictedItemFactory.Factory mItemParserFactory; + private final PackageManagerHelper mPmHelper; private final AppEventProducer mAppEventProducer; private final StatsManager mStatsManager; @@ -117,15 +135,11 @@ public class QuickstepModelDelegate extends ModelDelegate { @Inject public QuickstepModelDelegate(@ApplicationContext Context context, InvariantDeviceProfile idp, - UserCache userCache, - PredictedItemFactory.Factory itemParserFactory, + PackageManagerHelper pmHelper, @Nullable @Named("ICONS_DB") String dbFileName) { super(context); - - mIDP = idp; - mUserCache = userCache; - mItemParserFactory = itemParserFactory; + mPmHelper = pmHelper; mAppEventProducer = new AppEventProducer(context, this::onAppTargetEvent); StatsLogCompatManager.LOGS_CONSUMER.add(mAppEventProducer); @@ -136,26 +150,76 @@ public class QuickstepModelDelegate extends ModelDelegate { ? null : context.getSystemService(StatsManager.class); } + @CallSuper @Override - public void loadAndAddExtraModelItems(@NonNull IntSparseArrayMap outLoadedItems) { - loadAndBindPredictedItems( - mIDP.numDatabaseHotseatIcons, mHotseatPredictionState, outLoadedItems); - loadAndBindPredictedItems(mIDP.numDatabaseAllAppsColumns, mAllPredictionAppsState, - outLoadedItems); + public void loadAndBindWorkspaceItems(@NonNull UserManagerState ums, + @NonNull BgDataModel.Callbacks[] callbacks, + @NonNull Map pinnedShortcuts) { + loadAndBindItems(ums, pinnedShortcuts, callbacks, mIDP.numDatabaseHotseatIcons, + mHotseatState); + } - // Widgets prediction isn't used frequently. And thus, it is not persisted on disk. - PredictedContainerInfo widgetPredictionFCI = new PredictedContainerInfo( - mWidgetsRecommendationState.containerId, new ArrayList<>()); - outLoadedItems.put(mWidgetsRecommendationState.containerId, widgetPredictionFCI); + @CallSuper + @Override + public void loadAndBindAllAppsItems(@NonNull UserManagerState ums, + @NonNull BgDataModel.Callbacks[] callbacks, + @NonNull Map pinnedShortcuts) { + loadAndBindItems(ums, pinnedShortcuts, callbacks, mIDP.numDatabaseAllAppsColumns, + mAllAppsState); } @WorkerThread - private void loadAndBindPredictedItems(int numColumns, - @NonNull PredictorState state, @NonNull IntSparseArrayMap outLoadedItems) { - PredictedItemFactory parser = mItemParserFactory.newParser(numColumns, state); - PredictedContainerInfo fci = new PredictedContainerInfo(state.containerId, - state.storage.read(mContext, parser, mUserCache::getUserForSerialNumber)); - outLoadedItems.put(state.containerId, fci); + private void loadAndBindItems(@NonNull UserManagerState ums, + @NonNull Map pinnedShortcuts, + @NonNull BgDataModel.Callbacks[] callbacks, + int numColumns, @NonNull PredictorState state) { + // TODO: Implement caching and preloading + + WorkspaceItemFactory factory = + new WorkspaceItemFactory(mContext, ums, mPmHelper, pinnedShortcuts, numColumns, + state.containerId, state.lookupFlag); + FixedContainerItems fci = new FixedContainerItems(state.containerId, + state.storage.read(mContext, factory, ums.allUsers::get)); + mDataModel.extraItems.put(state.containerId, fci); + } + + @CallSuper + @Override + public void loadAndBindOtherItems(@NonNull BgDataModel.Callbacks[] callbacks) { + FixedContainerItems widgetPredictionFCI = new FixedContainerItems( + mWidgetsRecommendationState.containerId, new ArrayList<>()); + + // Widgets prediction isn't used frequently. And thus, it is not persisted on disk. + mDataModel.extraItems.put(mWidgetsRecommendationState.containerId, widgetPredictionFCI); + + bindPredictionItems(callbacks, widgetPredictionFCI); + loadStringCache(mDataModel.stringCache); + } + + @AnyThread + private void bindPredictionItems(@NonNull BgDataModel.Callbacks[] callbacks, + @NonNull FixedContainerItems fci) { + Executors.MAIN_EXECUTOR.execute(() -> { + for (BgDataModel.Callbacks c : callbacks) { + c.bindExtraContainerItems(fci); + } + }); + } + + @Override + @WorkerThread + public void bindAllModelExtras(@NonNull BgDataModel.Callbacks[] callbacks) { + Iterable containerItems; + synchronized (mDataModel.extraItems) { + containerItems = mDataModel.extraItems.clone(); + } + Executors.MAIN_EXECUTOR.execute(() -> { + for (BgDataModel.Callbacks c : callbacks) { + for (FixedContainerItems fci : containerItems) { + c.bindExtraContainerItems(fci); + } + } + }); } public void markActive() { @@ -190,9 +254,9 @@ public class QuickstepModelDelegate extends ModelDelegate { elapsedTime)); } } else { - WorkspaceData itemsIdMap; + IntSparseArrayMap itemsIdMap; synchronized (mDataModel) { - itemsIdMap = mDataModel.itemsIdMap.copy(); + itemsIdMap = mDataModel.itemsIdMap.clone(); } InstanceId instanceId = new InstanceIdSequence().newInstanceId(); for (ItemInfo info : itemsIdMap) { @@ -223,9 +287,9 @@ public class QuickstepModelDelegate extends ModelDelegate { MODEL_EXECUTOR, (i, eventList) -> { InstanceId instanceId = new InstanceIdSequence().newInstanceId(); - WorkspaceData itemsIdMap; + IntSparseArrayMap itemsIdMap; synchronized (mDataModel) { - itemsIdMap = mDataModel.itemsIdMap.copy(); + itemsIdMap = mDataModel.itemsIdMap.clone(); } for (ItemInfo info : itemsIdMap) { @@ -239,7 +303,7 @@ public class QuickstepModelDelegate extends ModelDelegate { Log.d(TAG, String.format( "Successfully logged %d workspace items with instanceId=%d", - eventList.size(), instanceId.getId())); + itemsIdMap.size(), instanceId.getId())); additionalSnapshotEvents(instanceId); SettingsChangeLogger.INSTANCE.get(mContext).logSnapshot(instanceId); return StatsManager.PULL_SUCCESS; @@ -253,7 +317,7 @@ public class QuickstepModelDelegate extends ModelDelegate { } private static CollectionInfo getContainer( - ItemInfo info, WorkspaceData itemsIdMap) { + ItemInfo info, IntSparseArrayMap itemsIdMap) { if (info.container > 0) { ItemInfo containerInfo = itemsIdMap.get(info.container); @@ -272,8 +336,12 @@ public class QuickstepModelDelegate extends ModelDelegate { @Override public void validateData() { super.validateData(); - mAllPredictionAppsState.requestPredictionUpdate(); - mWidgetsRecommendationState.requestPredictionUpdate(); + if (mAllAppsState.predictor != null) { + mAllAppsState.predictor.requestPredictionUpdate(); + } + if (mWidgetsRecommendationState.predictor != null) { + mWidgetsRecommendationState.predictor.requestPredictionUpdate(); + } } @WorkerThread @@ -293,8 +361,8 @@ public class QuickstepModelDelegate extends ModelDelegate { } private void destroyPredictors() { - mAllPredictionAppsState.destroyPredictor(); - mHotseatPredictionState.destroyPredictor(); + mAllAppsState.destroyPredictor(); + mHotseatState.destroyPredictor(); mWidgetsRecommendationState.destroyPredictor(); } @@ -309,82 +377,251 @@ public class QuickstepModelDelegate extends ModelDelegate { return; } - int usagePerm = mContext.checkCallingOrSelfPermission(PACKAGE_USAGE_STATS); + int usagePerm = mContext.checkCallingOrSelfPermission(Manifest.permission.PACKAGE_USAGE_STATS); if (usagePerm != PackageManager.PERMISSION_GRANTED) return; - mAllPredictionAppsState.registerPredictor(mContext, + registerPredictor(mAllAppsState, apm.createAppPredictionSession( new AppPredictionContext.Builder(mContext) - .setUiSurface("home") - .setPredictedTargetCount(mIDP.numDatabaseAllAppsColumns) - .build(), - mModel, - PredictionUpdateTask::new); - + .setUiSurface("home") + .setPredictedTargetCount(mIDP.numDatabaseAllAppsColumns) + .build())); // TODO: get bundle - registerHotseatPredictor(mContext); + registerHotseatPredictor(apm, mContext); - mWidgetsRecommendationState.registerPredictor(mContext, + registerWidgetsPredictor(apm.createAppPredictionSession( new AppPredictionContext.Builder(mContext) - .setUiSurface("widgets") - .setExtras(getBundleForWidgetPredictions(mContext, mDataModel)) - .setPredictedTargetCount(NUM_OF_RECOMMENDED_WIDGETS_PREDICATION) - .build(), - mModel, - WidgetsPredictionUpdateTask::new); + .setUiSurface("widgets") + .setExtras(getBundleForWidgetsOnWorkspace(mContext, mDataModel)) + .setPredictedTargetCount(NUM_OF_RECOMMENDED_WIDGETS_PREDICATION) + .build())); } @WorkerThread private void recreateHotseatPredictor() { - mHotseatPredictionState.destroyPredictor(); - - AppPredictionManager apm = mContext.getSystemService(AppPredictionManager.class); - if (apm == null) return; - - int usagePerm = mContext.checkCallingOrSelfPermission(PACKAGE_USAGE_STATS); - if (usagePerm != PackageManager.PERMISSION_GRANTED) return; - - if (mActive) { - registerHotseatPredictor(mContext); + mHotseatState.destroyPredictor(); + if (!mActive) { + return; } + AppPredictionManager apm = mContext.getSystemService(AppPredictionManager.class); + if (apm == null) { + return; + } + registerHotseatPredictor(apm, mContext); } - private void registerHotseatPredictor(Context context) { - mHotseatPredictionState.registerPredictor(context, + private void registerHotseatPredictor(AppPredictionManager apm, Context context) { + registerPredictor(mHotseatState, apm.createAppPredictionSession( new AppPredictionContext.Builder(context) - .setUiSurface("hotseat") - .setPredictedTargetCount(mIDP.numDatabaseHotseatIcons) - .setExtras(getBundleForHotseatPredictions(context, mDataModel)) - .build(), - mModel, PredictionUpdateTask::new); + .setUiSurface("hotseat") + .setPredictedTargetCount(mIDP.numDatabaseHotseatIcons) + .setExtras(convertDataModelToAppTargetBundle(context, mDataModel)) + .build())); + } + + private void registerPredictor(PredictorState state, AppPredictor predictor) { + state.setTargets(Collections.emptyList()); + state.predictor = predictor; + state.predictor.registerPredictionUpdates( + MODEL_EXECUTOR, t -> handleUpdate(state, t)); + state.predictor.requestPredictionUpdate(); + } + + private void handleUpdate(PredictorState state, List targets) { + if (state.setTargets(targets)) { + // No diff, skip + return; + } + mModel.enqueueModelUpdateTask(new PredictionUpdateTask(state, targets)); + } + + private void registerWidgetsPredictor(AppPredictor predictor) { + mWidgetsRecommendationState.predictor = predictor; + mWidgetsRecommendationState.predictor.registerPredictionUpdates( + MODEL_EXECUTOR, targets -> { + if (mWidgetsRecommendationState.setTargets(targets)) { + // No diff, skip + return; + } + mModel.enqueueModelUpdateTask( + new WidgetsPredictionUpdateTask(mWidgetsRecommendationState, targets)); + }); + mWidgetsRecommendationState.predictor.requestPredictionUpdate(); } @VisibleForTesting void onAppTargetEvent(AppTargetEvent event, int client) { PredictorState state; switch(client) { - case CONTAINER_ALL_APPS_PREDICTION: - state = mAllPredictionAppsState; + case CONTAINER_PREDICTION: + state = mAllAppsState; break; case CONTAINER_WIDGETS_PREDICTION: state = mWidgetsRecommendationState; break; case CONTAINER_HOTSEAT_PREDICTION: default: - state = mHotseatPredictionState; + state = mHotseatState; break; } + if (state.predictor != null) { + state.predictor.notifyAppTargetEvent(event); + Log.d(TAG, "notifyAppTargetEvent action=" + event.getAction() + + " launchLocation=" + event.getLaunchLocation()); + if (state == mHotseatState + && (event.getAction() == AppTargetEvent.ACTION_PIN + || event.getAction() == AppTargetEvent.ACTION_UNPIN)) { + // Recreate hot seat predictor when we need to query for hot seat due to pin or + // unpin app icons. + recreateHotseatPredictor(); + } + } + } - state.notifyAppTargetEvent(event); - Log.d(TAG, "notifyAppTargetEvent action=" + event.getAction() - + " launchLocation=" + event.getLaunchLocation()); - if (state == mHotseatPredictionState - && (event.getAction() == AppTargetEvent.ACTION_PIN - || event.getAction() == AppTargetEvent.ACTION_UNPIN)) { - // Recreate hot seat predictor when we need to query for hot seat due to pin or - // unpin app icons. - recreateHotseatPredictor(); + private Bundle getBundleForWidgetsOnWorkspace(Context context, BgDataModel dataModel) { + Bundle bundle = new Bundle(); + ArrayList widgetEvents = + dataModel.itemsIdMap.stream() + .filter(PredictionHelper::isTrackedForWidgetPrediction) + .map(item -> { + AppTarget target = getAppTargetFromItemInfo(context, item); + if (target == null) return null; + return wrapAppTargetWithItemLocation( + target, AppTargetEvent.ACTION_PIN, item); + }) + .filter(Objects::nonNull) + .collect(toCollection(ArrayList::new)); + bundle.putParcelableArrayList(BUNDLE_KEY_ADDED_APP_WIDGETS, widgetEvents); + return bundle; + } + + static class PredictorState { + + public final int containerId; + public final PersistedItemArray storage; + public AppPredictor predictor; + public CacheLookupFlag lookupFlag; + + private List mLastTargets; + + PredictorState(int containerId, String storageName, CacheLookupFlag lookupFlag) { + this.containerId = containerId; + storage = new PersistedItemArray<>(storageName); + mLastTargets = Collections.emptyList(); + this.lookupFlag = lookupFlag; + } + + public void destroyPredictor() { + if (predictor != null) { + predictor.destroy(); + predictor = null; + } + } + + /** + * Sets the new targets and returns true if it was the same as before. + */ + boolean setTargets(List newTargets) { + List oldTargets = mLastTargets; + mLastTargets = newTargets; + + int size = oldTargets.size(); + return size == newTargets.size() && IntStream.range(0, size) + .allMatch(i -> areAppTargetsSame(oldTargets.get(i), newTargets.get(i))); + } + } + + /** + * Compares two targets for the properties which we care about + */ + private static boolean areAppTargetsSame(AppTarget t1, AppTarget t2) { + if (!Objects.equals(t1.getPackageName(), t2.getPackageName()) + || !Objects.equals(t1.getUser(), t2.getUser()) + || !Objects.equals(t1.getClassName(), t2.getClassName())) { + return false; + } + + ShortcutInfo s1 = t1.getShortcutInfo(); + ShortcutInfo s2 = t2.getShortcutInfo(); + if (s1 != null) { + if (s2 == null || !Objects.equals(s1.getId(), s2.getId())) { + return false; + } + } else if (s2 != null) { + return false; + } + return true; + } + + private static class WorkspaceItemFactory implements PersistedItemArray.ItemFactory { + + private final Context mContext; + private final UserManagerState mUMS; + private final PackageManagerHelper mPmHelper; + private final Map mPinnedShortcuts; + private final int mMaxCount; + private final int mContainer; + private final CacheLookupFlag mLookupFlag; + + private int mReadCount = 0; + + protected WorkspaceItemFactory( + Context context, UserManagerState ums, + PackageManagerHelper pmHelper, Map pinnedShortcuts, + int maxCount, int container, CacheLookupFlag lookupFlag) { + mContext = context; + mUMS = ums; + mPmHelper = pmHelper; + mPinnedShortcuts = pinnedShortcuts; + mMaxCount = maxCount; + mContainer = container; + mLookupFlag = lookupFlag; + } + + @Nullable + @Override + public ItemInfo createInfo(int itemType, UserHandle user, Intent intent) { + if (mReadCount >= mMaxCount) { + return null; + } + switch (itemType) { + case ITEM_TYPE_APPLICATION: { + LauncherActivityInfo lai = mContext + .getSystemService(LauncherApps.class) + .resolveActivity(intent, user); + if (lai == null) { + return null; + } + AppInfo info = new AppInfo( + lai, + UserCache.INSTANCE.get(mContext).getUserInfo(user), + ApiWrapper.INSTANCE.get(mContext), + mPmHelper, + mUMS.isUserQuiet(user)); + info.container = mContainer; + LauncherAppState.getInstance(mContext).getIconCache() + .getTitleAndIcon(info, lai, mLookupFlag); + mReadCount++; + return info.makeWorkspaceItem(mContext); + } + case ITEM_TYPE_DEEP_SHORTCUT: { + ShortcutKey key = ShortcutKey.fromIntent(intent, user); + if (key == null) { + return null; + } + ShortcutInfo si = mPinnedShortcuts.get(key); + if (si == null) { + return null; + } + WorkspaceItemInfo wii = new WorkspaceItemInfo(si, mContext); + wii.container = mContainer; + LauncherAppState.getInstance(mContext).getIconCache().getShortcutIcon(wii, si); + mReadCount++; + return wii; + } + } + return null; } } } diff --git a/quickstep/src/com/android/launcher3/model/WellbeingModel.java b/quickstep/src/com/android/launcher3/model/WellbeingModel.java index c1d8c01230..09433c51a3 100644 --- a/quickstep/src/com/android/launcher3/model/WellbeingModel.java +++ b/quickstep/src/com/android/launcher3/model/WellbeingModel.java @@ -71,7 +71,7 @@ import javax.inject.Inject; public final class WellbeingModel implements SafeCloseable { private static final String TAG = "WellbeingModel"; private static final int[] RETRY_TIMES_MS = {5000, 15000, 30000}; - private static final boolean DEBUG = true; + private static final boolean DEBUG = false; // Welbeing contract private static final String PATH_ACTIONS = "actions"; @@ -181,7 +181,7 @@ public final class WellbeingModel implements SafeCloseable { // Work profile apps are not recognized by digital wellbeing. if (userId != UserHandle.myUserId()) { if (DEBUG || mIsInTest) { - Log.w(TAG, "getShortcutForApp [" + packageName + "]: not current user"); + Log.d(TAG, "getShortcutForApp [" + packageName + "]: not current user"); } return null; } @@ -191,12 +191,12 @@ public final class WellbeingModel implements SafeCloseable { final RemoteAction action = actionId != null ? mActionIdMap.get(actionId) : null; if (action == null) { if (DEBUG || mIsInTest) { - Log.w(TAG, "getShortcutForApp [" + packageName + "]: no action"); + Log.d(TAG, "getShortcutForApp [" + packageName + "]: no action"); } return null; } if (DEBUG || mIsInTest) { - Log.w(TAG, + Log.d(TAG, "getShortcutForApp [" + packageName + "]: action: '" + action.getTitle() + "'"); } diff --git a/quickstep/src/com/android/launcher3/model/WidgetsPredictionUpdateTask.java b/quickstep/src/com/android/launcher3/model/WidgetsPredictionUpdateTask.java index e234a1cb60..da55b40b19 100644 --- a/quickstep/src/com/android/launcher3/model/WidgetsPredictionUpdateTask.java +++ b/quickstep/src/com/android/launcher3/model/WidgetsPredictionUpdateTask.java @@ -31,8 +31,9 @@ import androidx.annotation.NonNull; import com.android.launcher3.LauncherModel.ModelUpdateTask; import com.android.launcher3.R; +import com.android.launcher3.model.BgDataModel.FixedContainerItems; +import com.android.launcher3.model.QuickstepModelDelegate.PredictorState; import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.model.data.PredictedContainerInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.widget.PendingAddWidgetInfo; import com.android.launcher3.widget.picker.WidgetRecommendationCategoryProvider; @@ -133,11 +134,11 @@ public final class WidgetsPredictionUpdateTask implements ModelUpdateTask { .map(it -> new PendingAddWidgetInfo(it.widgetInfo, CONTAINER_WIDGETS_PREDICTION, categoryProvider.getWidgetRecommendationCategory(context, it))) .collect(Collectors.toList()); - PredictedContainerInfo pci = - new PredictedContainerInfo(mPredictorState.containerId, items); + FixedContainerItems fixedContainerItems = + new FixedContainerItems(mPredictorState.containerId, items); - dataModel.updateAndDispatchItem(pci /* item */, null /* owner */); - taskController.bindUpdatedWorkspaceItems(Collections.singleton(pci)); + dataModel.extraItems.put(mPredictorState.containerId, fixedContainerItems); + taskController.bindExtraContainerItems(fixedContainerItems); // Don't store widgets prediction to disk because it is not used frequently. } diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java index dea771bc83..356cb771b8 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java @@ -33,12 +33,12 @@ import android.view.ViewTreeObserver; import androidx.annotation.VisibleForTesting; import com.android.launcher3.BaseActivity; +import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.Utilities; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.statemanager.StateManager.StateHandler; import com.android.launcher3.states.StateAnimationConfig; -import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.quickstep.util.BaseDepthController; import java.io.PrintWriter; @@ -68,13 +68,12 @@ public class DepthController extends BaseDepthController implements StateHandler // Ensure {@link mOnDrawListener} is added only once to avoid spamming DragLayer's mRunQueue // via {@link View#post(Runnable)} private boolean mIsOnDrawListenerAdded = false; - private boolean mRemoveOnDrawListenerCancelled = false; private final boolean mEnableDepth; - public DepthController(QuickstepLauncher launcher) { - super(launcher); - var pref = PreferenceManager2.getInstance(launcher).getWallpaperDepthEffect(); + public DepthController(Launcher l) { + super(l); + var pref = PreferenceManager2.getInstance(l).getWallpaperDepthEffect(); mEnableDepth = PreferenceExtensionsKt.firstBlocking(pref); } @@ -88,12 +87,7 @@ public class DepthController extends BaseDepthController implements StateHandler } catch (Throwable t) { // LC-Ignored } - mRemoveOnDrawListenerCancelled = false; - view.post(() -> { - if (!mRemoveOnDrawListenerCancelled) { - removeOnDrawListener(); - } - }); + view.post(this::removeOnDrawListener); } private void ensureDependencies() { @@ -165,7 +159,6 @@ public class DepthController extends BaseDepthController implements StateHandler } else { removeOnDrawListener(); setBaseSurface(null); - setEarlyWakeup(false); } } @@ -213,7 +206,6 @@ public class DepthController extends BaseDepthController implements StateHandler } private void addOnDrawListener() { - mRemoveOnDrawListenerCancelled = true; if (mIsOnDrawListenerAdded) { return; } @@ -222,7 +214,6 @@ public class DepthController extends BaseDepthController implements StateHandler } private void removeOnDrawListener() { - mRemoveOnDrawListenerCancelled = true; if (!mIsOnDrawListenerAdded) { return; } diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt index a654c603db..1ac2d7c13e 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt +++ b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt @@ -23,9 +23,7 @@ import android.util.SparseArray import android.view.Display.DEFAULT_DISPLAY import android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY import androidx.core.util.forEach -import com.android.internal.util.LatencyTracker import com.android.launcher3.LauncherState -//import com.android.launcher3.R import com.android.launcher3.dagger.ApplicationContext import com.android.launcher3.dagger.LauncherAppComponent import com.android.launcher3.dagger.LauncherAppSingleton @@ -48,8 +46,6 @@ import java.io.PrintWriter import java.lang.ref.WeakReference import javax.inject.Inject -import com.android.wm.shell.R as SharedR - /** * Controls the visibility of the workspace and the resumed / paused state when desktop mode is * enabled. @@ -179,7 +175,7 @@ constructor( private var desktopTaskListener: DesktopTaskListenerImpl? init { - desktopTaskListener = DesktopTaskListenerImpl(this, context) + desktopTaskListener = DesktopTaskListenerImpl(this, context, context.displayId) systemUiProxy.setDesktopTaskListener(desktopTaskListener) lifecycleTracker.addCloseable { @@ -547,16 +543,9 @@ constructor( return } - // Add the config for the desk if there is nothing yet, as the display can start without any - // desks. - if (getDisplayDeskConfig(displayId) == null) { - displaysDesksConfigsMap[displayId] = - DisplayDeskConfig(displayId, INACTIVE_DESK_ID, mutableSetOf(deskId)) - } else { - getDisplayDeskConfig(displayId)!!.also { - check(it.deskIds.add(deskId)) { - "Found a duplicate desk Id: $deskId on display: $displayId" - } + getDisplayDeskConfig(displayId)?.also { + check(it.deskIds.add(deskId)) { + "Found a duplicate desk Id: $deskId on display: $displayId" } } @@ -585,6 +574,8 @@ constructor( return } + val wasInDesktopMode = isInDesktopModeAndNotInOverview(displayId) + getDisplayDeskConfig(displayId)?.also { check(oldActiveDesk == it.activeDeskId) { "Mismatch between the Shell's oldActiveDesk: $oldActiveDesk, and Launcher's: ${it.activeDeskId}" @@ -599,20 +590,8 @@ constructor( notifyOnActiveDeskChanged(displayId, newActiveDesk, oldActiveDesk) } - if ( - (newActiveDesk == INACTIVE_DESK_ID || oldActiveDesk == INACTIVE_DESK_ID) && - !launcherAnimationRunning - ) { - val duration = context.resources.getInteger(SharedR.integer.to_desktop_animation_duration_ms) - if (oldActiveDesk == INACTIVE_DESK_ID && newActiveDesk != INACTIVE_DESK_ID) { - notifyTaskbarDesktopModeListenersForEntry(duration) - } else if (newActiveDesk == INACTIVE_DESK_ID && oldActiveDesk != INACTIVE_DESK_ID) { - notifyTaskbarDesktopModeListenersForExit(duration) - } else { - // do nothing because user switch between two desktop. - } - } else { - isNotifyingDesktopVisibilityPending = true + if (wasInDesktopMode != isInDesktopModeAndNotInOverview(displayId)) { + notifyIsInDesktopModeChanged(displayId, !wasInDesktopMode) } } @@ -666,9 +645,9 @@ constructor( private class DesktopTaskListenerImpl( controller: DesktopVisibilityController, @ApplicationContext private val context: Context, + private val displayId: Int, ) : Stub() { private val controller = WeakReference(controller) - private val displayId = context.displayId override fun onListenerConnected( displayDeskStates: Array, @@ -679,9 +658,7 @@ constructor( } } - @Deprecated("Not needed by multi-desks") override fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) { - if (enableMultipleDesktops(context)) return if (displayId != this.displayId) return MAIN_EXECUTOR.execute { controller.get()?.apply { @@ -711,9 +688,9 @@ constructor( } } - @Deprecated("Not needed by multi-desks") + // TODO: b/402496827 - The multi-desks backend needs to be updated to call this API only + // once, not between desk switches. override fun onEnterDesktopModeTransitionStarted(transitionDuration: Int) { - if (enableMultipleDesktops(context)) return val controller = controller.get() ?: return MAIN_EXECUTOR.execute { Log.d( @@ -722,19 +699,18 @@ constructor( "duration= " + transitionDuration), ) - if (!controller.isInDesktopModeDeprecated) { + if (enableMultipleDesktops(context)) { + controller.notifyTaskbarDesktopModeListenersForEntry(transitionDuration) + } else if (!controller.isInDesktopModeDeprecated) { controller.isInDesktopModeDeprecated = true controller.notifyTaskbarDesktopModeListenersForEntry(transitionDuration) } } } - @Deprecated("Not needed by multi-desks") - override fun onExitDesktopModeTransitionStarted( - transitionDuration: Int, - shouldEndUpAtHome: Boolean, - ) { - if (enableMultipleDesktops(context)) return + // TODO: b/402496827 - The multi-desks backend needs to be updated to call this API only + // once, not between desk switches. + override fun onExitDesktopModeTransitionStarted(transitionDuration: Int) { val controller = controller.get() ?: return MAIN_EXECUTOR.execute { Log.d( @@ -743,17 +719,9 @@ constructor( "duration= " + transitionDuration), ) - // If shouldEndUpAtHome is true, desktop mode is ending from the user - // closing/minimizing the last open window. If it's false, the display is - // probably transitioning to an app's full screen mode instead so this metric - // should not be logged. - if (shouldEndUpAtHome) { - LatencyTracker.getInstance(context) - .onActionStart( - LatencyTracker.ACTION_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE - ) - } - if (controller.isInDesktopModeDeprecated) { + if (enableMultipleDesktops(context)) { + controller.notifyTaskbarDesktopModeListenersForExit(transitionDuration) + } else if (controller.isInDesktopModeDeprecated) { controller.isInDesktopModeDeprecated = false controller.notifyTaskbarDesktopModeListenersForExit(transitionDuration) } diff --git a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java index a60efcaf3a..b82e6edd7c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java @@ -18,7 +18,6 @@ package com.android.launcher3.taskbar; import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; -import android.graphics.Point; import android.os.UserHandle; import android.view.LayoutInflater; @@ -33,29 +32,13 @@ import com.android.quickstep.SystemUiProxy; public abstract class BaseTaskbarContext extends BaseContext implements SystemShortcut.BubbleActivityStarter { - private final int mDisplayId; - private final boolean mIsPrimaryDisplay; protected final LayoutInflater mLayoutInflater; - public BaseTaskbarContext(Context windowContext, int displayId, boolean isPrimaryDisplay) { + public BaseTaskbarContext(Context windowContext, boolean isPrimaryDisplay) { super(windowContext, Themes.getActivityThemeRes(windowContext)); - mDisplayId = displayId; - mIsPrimaryDisplay = isPrimaryDisplay; mLayoutInflater = LayoutInflater.from(this).cloneInContext(this); } - @Override - public int getDisplayId() { - return mDisplayId; - } - - /** - * Returns whether the taskbar is displayed on primary or external display. - */ - public final boolean isPrimaryDisplay() { - return mIsPrimaryDisplay; - } - /** * Returns whether taskbar is transient or persistent. External displays will be persistent. * @@ -74,17 +57,10 @@ public abstract class BaseTaskbarContext extends BaseContext public abstract NavigationMode getNavigationMode(); /** - * Returns whether the taskbar is in desktop mode. Implies that some desktop tasks are currently - * visible. + * Returns whether the taskbar is in desktop mode. */ public abstract boolean isInDesktopMode(); - /** - * Returns whether the taskbar is showing desktop tasks, which may happen even outside desktop - * mode on freeform displays. - */ - public abstract boolean isTaskbarShowingDesktopTasks(); - /** * Returns whether the taskbar is forced to be pinned when home is visible. */ @@ -97,20 +73,9 @@ public abstract class BaseTaskbarContext extends BaseContext public abstract boolean showDesktopTaskbarForFreeformDisplay(); /** - * Returns screen size. + * Returns whether the taskbar is displayed on primary or external display. */ - public abstract Point getScreenSize(); - - /** - * Returns display height. - */ - public abstract int getDisplayHeight(); - - /** - * Notifies the context that the configuration has changed. - */ - public abstract void notifyConfigChanged(); - + public abstract boolean isPrimaryDisplay(); @Override public final LayoutInflater getLayoutInflater() { diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java index 2a73d61cd5..5b1e8593a1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java @@ -88,6 +88,10 @@ public class FallbackTaskbarUIController @Override protected void onDestroy() { super.onDestroy(); + RecentsView recentsView = getRecentsView(); + if (recentsView != null) { + recentsView.setTaskLaunchListener(null); + } mRecentsContainer.setTaskbarUIController(null); mRecentsContainer.getStateManager().removeStateListener(mStateListener); } diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java index 7174af30bc..16980502cd 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java @@ -15,10 +15,7 @@ */ package com.android.launcher3.taskbar; -import static android.window.DesktopModeFlags.ENABLE_TASKBAR_OVERFLOW; - -import static com.android.launcher3.taskbar.TaskbarDesktopExperienceFlags.enableAltTabKqsFlatenning; -import static com.android.launcher3.taskbar.TaskbarDesktopExperienceFlags.enableAltTabKqsOnConnectedDisplays; +import static com.android.launcher3.Flags.enableAltTabKqsOnConnectedDisplays; import android.app.ActivityManager; import android.content.ComponentName; @@ -29,6 +26,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import com.android.launcher3.Flags; import com.android.launcher3.R; import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext; import com.android.launcher3.taskbar.overlay.TaskbarOverlayDragLayer; @@ -42,17 +40,14 @@ import com.android.quickstep.util.SingleTask; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.wm.shell.shared.desktopmode.DesktopState; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * Handles initialization of the {@link KeyboardQuickSwitchViewController}. @@ -67,6 +62,9 @@ public final class KeyboardQuickSwitchController implements // Callback used to notify when the KQS view is closed. @Nullable private Runnable mOnClosed; + // Initialized on init + @Nullable private RecentsModel mModel; + // Used to keep track of the last requested task list id, so that we do not request to load the // tasks again if we have already requested it and the task list has not changed private int mTaskListChangeId = -1; @@ -81,8 +79,6 @@ public final class KeyboardQuickSwitchController implements // Initialized in init private TaskbarControllers mControllers; - @Nullable private RecentsModel mModel; - private boolean mIsProjectedMode; @Nullable private KeyboardQuickSwitchViewController mQuickSwitchViewController; @Nullable private TaskbarOverlayContext mOverlayContext; @@ -94,8 +90,6 @@ public final class KeyboardQuickSwitchController implements public void init(@NonNull TaskbarControllers controllers) { mControllers = controllers; mModel = RecentsModel.INSTANCE.get(controllers.taskbarActivityContext); - mIsProjectedMode = DesktopState.fromContext( - mControllers.taskbarActivityContext).isProjectedMode(); } void onConfigurationChanged(@ActivityInfo.Config int configChanges) { @@ -167,18 +161,16 @@ public final class KeyboardQuickSwitchController implements final boolean shouldShowDesktopTasks = mControllers.taskbarDesktopModeController .shouldShowDesktopTasksInTaskbar(); mExcludedTaskIds = taskIdsToExclude; - mTaskListChangeId = mModel.getTasks( - shouldShowDesktopTasks ? RecentsFilterState.EMPTY_FILTER - : RecentsFilterState.getDesktopTaskFilter(), - (tasks) -> { - processLoadedTasks(wasOpenedFromTaskbar, tasks, taskIdsToExclude); - mQuickSwitchViewController.updateQuickSwitchView( - mTasks, - wasOpenedFromTaskbar ? 0 : mNumHiddenTasks, - currentFocusIndexOverride, - mHasDesktopTask, - mWasDesktopTaskFilteredOut); - }); + mTaskListChangeId = mModel.getTasks((tasks) -> { + processLoadedTasks(tasks, taskIdsToExclude); + mQuickSwitchViewController.updateQuickSwitchView( + mTasks, + wasOpenedFromTaskbar ? 0 : mNumHiddenTasks, + currentFocusIndexOverride, + mHasDesktopTask, + mWasDesktopTaskFilteredOut); + }, shouldShowDesktopTasks ? RecentsFilterState.EMPTY_FILTER + : RecentsFilterState.getDesktopTaskFilter()); } mQuickSwitchViewController.updateLayoutForSurface(wasOpenedFromTaskbar, @@ -192,7 +184,7 @@ public final class KeyboardQuickSwitchController implements } mOverlayContext = mControllers.taskbarOverlayController.requestWindow(); - if (ENABLE_TASKBAR_OVERFLOW.isTrue()) { + if (Flags.taskbarOverflow()) { mOverlayContext.getDragLayer().addTouchController(this); } KeyboardQuickSwitchView keyboardQuickSwitchView = @@ -225,104 +217,46 @@ public final class KeyboardQuickSwitchController implements } mExcludedTaskIds = taskIdsToExclude; - mTaskListChangeId = mModel.getTasks( - shouldShowDesktopTasks ? RecentsFilterState.EMPTY_FILTER - : RecentsFilterState.getDesktopTaskFilter(), - (tasks) -> { - processLoadedTasks(wasOpenedFromTaskbar, tasks, taskIdsToExclude); - // Check if the first task is running after the recents model has updated so - // that we use the correct index. - mQuickSwitchViewController.openQuickSwitchView( - mTasks, - wasOpenedFromTaskbar ? 0 : mNumHiddenTasks, - /* updateTasks= */ true, - currentFocusedIndex == -1 && !mControllerCallbacks.isFirstTaskRunning() - ? 0 : currentFocusedIndex, - shouldShowDesktopTasks, - mHasDesktopTask, - mWasDesktopTaskFilteredOut, - wasOpenedFromTaskbar); - }); + mTaskListChangeId = mModel.getTasks((tasks) -> { + processLoadedTasks(tasks, taskIdsToExclude); + // Check if the first task is running after the recents model has updated so that we use + // the correct index. + mQuickSwitchViewController.openQuickSwitchView( + mTasks, + wasOpenedFromTaskbar ? 0 : mNumHiddenTasks, + /* updateTasks= */ true, + currentFocusedIndex == -1 && !mControllerCallbacks.isFirstTaskRunning() + ? 0 : currentFocusedIndex, + shouldShowDesktopTasks, + mHasDesktopTask, + mWasDesktopTaskFilteredOut, + wasOpenedFromTaskbar); + }, shouldShowDesktopTasks ? RecentsFilterState.EMPTY_FILTER + : RecentsFilterState.getDesktopTaskFilter()); } - private boolean shouldIncludeTask(GroupTask task, Set taskIdsToExclude) { - return !ENABLE_TASKBAR_OVERFLOW.isTrue() - || task.getTasks().stream().noneMatch(t -> taskIdsToExclude.contains(t.key.id)); + private boolean shouldExcludeTask(GroupTask task, Set taskIdsToExclude) { + return Flags.taskbarOverflow() && task.getTasks().stream().anyMatch( + t -> taskIdsToExclude.contains(t.key.id)); } - private void processLoadedTasks(boolean openedFromTaskbar, List tasks, - Set taskIdsToExclude) { + private void processLoadedTasks(List tasks, Set taskIdsToExclude) { mHasDesktopTask = false; mWasDesktopTaskFilteredOut = false; - - if (enableAltTabKqsFlatenning.isTrue() && !openedFromTaskbar) { - processLoadedTasksCombined(tasks, taskIdsToExclude); - } else if (mControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar()) { + if (mControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar()) { processLoadedTasksOnDesktop(tasks, taskIdsToExclude); } else { processLoadedTasksOutsideDesktop(tasks, taskIdsToExclude); } } - private void processLoadedTasksCombined(List tasks, Set taskIdsToExclude) { - List allTasks = tasks.stream() - .flatMap(task -> { - // In case of DesktopTasks, convert each contained task into a new DesktopTask - // this way the view controller will be able to show a thumbnail in KQS view. - if (task instanceof DesktopTask desktopTask) { - return desktopTask.getTasks().stream() - .map(singleTask -> new DesktopTask(desktopTask.getDeskId(), - desktopTask.getDisplayId(), List.of(singleTask))); - } - - return Stream.of(task); - }) - .filter(task -> shouldIncludeTask(task, taskIdsToExclude)) - .filter(this::shouldIncludeTaskBasedOnProjectedMode) - .toList(); - - mTasks = allTasks.stream() - .sorted(combinedTasksComparator()) - .limit(MAX_TASKS) - .toList(); - mNumHiddenTasks = Math.max(0, allTasks.size() - MAX_TASKS); - } - - private boolean shouldIncludeTaskBasedOnProjectedMode(GroupTask task) { - // When not in projected mode, include tasks from all displays - if (!mIsProjectedMode) { - return true; - } - - int primaryDisplayId = mControllers.taskbarActivityContext.getPrimaryDisplayId(); - - // When on primary device in projected mode, only show tasks from the primary device. - if (mControllers.taskbarActivityContext.isPrimaryDisplay()) { - return task.getDisplayId() == primaryDisplayId; - } - - // When on connected display with primary device in projected mode, only include tasks that - // are not on primary device. - return task.getDisplayId() != primaryDisplayId; - } - - private static Comparator combinedTasksComparator() { - return Comparator.comparingLong((GroupTask groupTask) -> - groupTask.getTasks().stream() - .map(task -> task.key.lastActiveTime) - .max(Comparator.naturalOrder()) - // Empty tasks list shouldn't be possible so return -1 in that case. - .orElse(-1L)) - .reversed(); - } - private void processLoadedTasksOutsideDesktop(List tasks, Set taskIdsToExclude) { // Only store MAX_TASK tasks, from most to least recent Collections.reverse(tasks); mTasks = tasks.stream() .filter(task -> !(task instanceof DesktopTask) - && shouldIncludeTask(task, taskIdsToExclude)) + && !shouldExcludeTask(task, taskIdsToExclude)) .limit(MAX_TASKS) .collect(Collectors.toList()); @@ -351,18 +285,18 @@ public final class KeyboardQuickSwitchController implements // multiple desktops flag disabled. So, until multiple desktops is implemented the following // should help with team-fooding Alt+tab on connected displays. Post multiple desktop, // further changes maybe required to support launching selected desktops. - if (enableAltTabKqsOnConnectedDisplays.isTrue()) { + if (enableAltTabKqsOnConnectedDisplays()) { mTasks = desktopTasks.stream() .flatMap(t -> t.getTasks().stream()) .map(SingleTask::new) - .filter(task -> shouldIncludeTask(task, taskIdsToExclude)) + .filter(task -> !shouldExcludeTask(task, taskIdsToExclude)) .collect(Collectors.toList()); mNumHiddenTasks = Math.max(0, tasks.size() - desktopTasks.size()); } else if (!desktopTasks.isEmpty()) { mTasks = desktopTasks.get(0).getTasks().stream() .map(SingleTask::new) - .filter(task -> shouldIncludeTask(task, taskIdsToExclude)) + .filter(task -> !shouldExcludeTask(task, taskIdsToExclude)) .collect(Collectors.toList()); // All other tasks, apart from the grouped desktop task, are hidden mNumHiddenTasks = Math.max(0, tasks.size() - 1); @@ -403,7 +337,7 @@ public final class KeyboardQuickSwitchController implements public boolean onControllerInterceptTouchEvent(MotionEvent ev) { if (mQuickSwitchViewController == null || mOverlayContext == null - || !ENABLE_TASKBAR_OVERFLOW.isTrue()) { + || !Flags.taskbarOverflow()) { return false; } @@ -499,7 +433,7 @@ public final class KeyboardQuickSwitchController implements } void onCloseComplete() { - if (ENABLE_TASKBAR_OVERFLOW.isTrue() && mOverlayContext != null) { + if (Flags.taskbarOverflow() && mOverlayContext != null) { mOverlayContext.getDragLayer() .removeTouchController(KeyboardQuickSwitchController.this); } @@ -527,7 +461,7 @@ public final class KeyboardQuickSwitchController implements boolean isAspectRatioSquare() { return mControllers != null && LayoutUtils.isAspectRatioSquare( - mControllers.taskbarActivityContext.getDeviceProfile().getDeviceProperties().getAspectRatio()); + mControllers.taskbarActivityContext.getDeviceProfile().aspectRatio); } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchTaskView.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchTaskView.java index bcaca16278..c49029daf9 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchTaskView.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchTaskView.java @@ -36,12 +36,12 @@ import androidx.constraintlayout.widget.ConstraintLayout; import com.android.launcher3.R; import com.android.launcher3.util.Preconditions; +import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds; import com.android.quickstep.util.BorderAnimator; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.wm.shell.shared.TypefaceUtils; import com.android.wm.shell.shared.TypefaceUtils.FontFamily; -import com.android.wm.shell.shared.split.SplitBounds; import kotlin.Unit; diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java index 7a17d6d2b9..515cfe2af0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java @@ -17,21 +17,14 @@ package com.android.launcher3.taskbar; import static androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID; -import static com.android.launcher3.taskbar.TaskbarDesktopExperienceFlags.enableAltTabKqsFlatenning; -import static com.android.launcher3.taskbar.TaskbarDesktopExperienceFlags.enableAltTabKqsOnConnectedDisplays; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.Resources; -import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Outline; -import android.graphics.Paint; import android.graphics.Rect; -import android.graphics.RectF; import android.icu.text.MessageFormat; import android.util.AttributeSet; import android.view.KeyEvent; @@ -57,12 +50,8 @@ import com.android.internal.jank.Cuj; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatedFloat; -import com.android.launcher3.icons.GraphicsUtils; import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.shared.TestProtocol; -import com.android.launcher3.util.Themes; -import com.android.quickstep.SystemUiProxy; -import com.android.quickstep.util.DesktopTask; import com.android.quickstep.util.GroupTask; import com.android.quickstep.util.SingleTask; import com.android.quickstep.util.SplitTask; @@ -109,11 +98,6 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { private static final long CONTENT_ALPHA_ANIMATION_DURATION_MS = 83; private static final long CONTENT_ALPHA_ANIMATION_START_DELAY_MS = 83; - private static final int DARK_THEME_STROKE_ALPHA = 51; - private static final int LIGHT_THEME_STROKE_ALPHA = 41; - private static final int DARK_THEME_SHADOW_ALPHA = 51; - private static final int LIGHT_THEME_SHADOW_ALPHA = 25; - private final AnimatedFloat mOutlineAnimationProgress = new AnimatedFloat( this::invalidateOutline); @@ -133,14 +117,6 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { private int mOutlineRadius; private boolean mIsRtl; - // Used to paint a background with a shadow. - private final Paint mBackgroundPaint = new Paint(); - private float mBackgroundShadowBlur; - private float mBackgroundShadowDistance; - private final Paint mStrokePaint = new Paint(); - private final RectF mLastBackgroundRect = new RectF(); - - private int mOverviewTaskIndex = -1; private int mDesktopTaskIndex = -1; @@ -203,47 +179,11 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { mIsRtl = Utilities.isRtl(resources); - mBackgroundPaint.setFlags(Paint.ANTI_ALIAS_FLAG); - mBackgroundPaint.setStyle(Paint.Style.FILL); - mBackgroundPaint.setColor( - Themes.getAttrColor(getContext(), R.attr.overviewScrimColorFallback)); - mBackgroundShadowBlur = resources.getDimension(R.dimen.transient_taskbar_shadow_blur); - mBackgroundShadowDistance = resources.getDimension( - R.dimen.transient_taskbar_key_shadow_distance); - - - mStrokePaint.setFlags(Paint.ANTI_ALIAS_FLAG); - mStrokePaint.setStyle(Paint.Style.STROKE); - mStrokePaint.setStrokeWidth( - getResources().getDimension(R.dimen.transient_taskbar_stroke_width)); - mStrokePaint.setColor( - getResources().getColor(R.color.taskbar_stroke, getContext().getTheme())); - TypefaceUtils.setTypeface( mNoRecentItemsPane.findViewById(R.id.no_recent_items_text), FontFamily.GSF_LABEL_LARGE); } - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - boolean isDarkTheme = Utilities.isDarkTheme(getContext()); - mStrokePaint.setAlpha(isDarkTheme ? DARK_THEME_STROKE_ALPHA : LIGHT_THEME_STROKE_ALPHA); - - // Draw shadow. - mBackgroundPaint.setShadowLayer( - mBackgroundShadowBlur, - 0, - mBackgroundShadowDistance, - GraphicsUtils.setColorAlphaBound(Color.BLACK, - isDarkTheme ? DARK_THEME_SHADOW_ALPHA : LIGHT_THEME_SHADOW_ALPHA)); - mLastBackgroundRect.set(0, 0, getWidth(), getHeight()); - - canvas.drawRoundRect(mLastBackgroundRect, mOutlineRadius, mOutlineRadius, mBackgroundPaint); - canvas.drawRoundRect(mLastBackgroundRect, mOutlineRadius, mOutlineRadius, mStrokePaint); - } - private void registerOnBackInvokedCallback() { OnBackInvokedDispatcher dispatcher = findOnBackInvokedDispatcher(); @@ -345,10 +285,6 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { } else if (groupTask instanceof SingleTask singleTask) { task1 = singleTask.getTask(); task2 = null; - } else if (enableAltTabKqsFlatenning.isTrue() - && groupTask instanceof DesktopTask desktopTask) { - task1 = desktopTask.getTasks().get(0); - task2 = null; } else { continue; } @@ -507,9 +443,6 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { // Unregister the back invoked callback after the view is closed and before the // mViewCallbacks is reset. unregisterOnBackInvokedCallback(); - if (enableAltTabKqsOnConnectedDisplays.isTrue()) { - SystemUiProxy.INSTANCE.get(getContext()).getFocusState().removeListener(mViewCallbacks); - } mViewCallbacks = null; } @@ -676,10 +609,6 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { displayedContent.setVisibility(VISIBLE); setVisibility(VISIBLE); requestFocus(); - if (enableAltTabKqsOnConnectedDisplays.isTrue()) { - SystemUiProxy.INSTANCE.get(getContext()).getFocusState().addListener( - mViewCallbacks); - } } @Override diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java index 5dc4fd142a..a312d5f70b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java @@ -15,10 +15,7 @@ */ package com.android.launcher3.taskbar; -import static android.window.DesktopModeFlags.ENABLE_TASKBAR_OVERFLOW; - import static com.android.launcher3.desktop.DesktopAppLaunchTransition.AppLaunchType.UNMINIMIZE; -import static com.android.launcher3.taskbar.TaskbarDesktopExperienceFlags.enableAltTabKqsFlatenning; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; @@ -37,6 +34,7 @@ import androidx.annotation.Nullable; import com.android.internal.jank.Cuj; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Flags; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatorListeners; @@ -44,9 +42,7 @@ import com.android.launcher3.desktop.DesktopAppLaunchTransition; import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext; import com.android.launcher3.taskbar.overlay.TaskbarOverlayDragLayer; import com.android.launcher3.views.BaseDragLayer; -import com.android.quickstep.FocusState; import com.android.quickstep.SystemUiProxy; -import com.android.quickstep.util.DesktopTask; import com.android.quickstep.util.GroupTask; import com.android.quickstep.util.SingleTask; import com.android.quickstep.util.SlideInRemoteTransition; @@ -54,7 +50,6 @@ import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.systemui.shared.system.QuickStepContract; -import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource; import com.android.wm.shell.shared.desktopmode.DesktopTaskToFrontReason; import java.io.PrintWriter; @@ -125,7 +120,7 @@ public class KeyboardQuickSwitchViewController { mWasDesktopTaskFilteredOut = wasDesktopTaskFilteredOut; mWasOpenedFromTaskbar = wasOpenedFromTaskbar; - if (ENABLE_TASKBAR_OVERFLOW.isTrue() && wasOpenedFromTaskbar) { + if (Flags.taskbarOverflow() && wasOpenedFromTaskbar) { mKeyboardQuickSwitchView.enableScrollArrowSupport(); } @@ -172,9 +167,8 @@ public class KeyboardQuickSwitchViewController { // Calculate the additional margin space that the KQS should move up for the transient // taskbar. The value of spaceForTaskbar is the distance between the bottom of the KQS // view with 0 bottom margin to the top of the transient taskbar view. - final int spaceForTaskbar = isTransientTaskbar ? dp.getTaskbarProfile().getHeight() - + dp.getTaskbarProfile().getBottomMargin() - - dp.getTaskbarProfile().getStashedTaskbarHeight() : 0; + final int spaceForTaskbar = isTransientTaskbar ? dp.taskbarHeight + dp.taskbarBottomMargin + - dp.stashedTaskbarHeight : 0; final int marginBottom = spaceForTaskbar + resources.getDimensionPixelSize( R.dimen.keyboard_quick_switch_margin_bottom); @@ -258,19 +252,23 @@ public class KeyboardQuickSwitchViewController { // first hidden non-desktop task view in recents view return mOnDesktop ? 1 : (mWasDesktopTaskFilteredOut ? index + 1 : index); } + Runnable onStartCallback = () -> InteractionJankMonitorWrapper.begin( + mKeyboardQuickSwitchView, Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_APP_LAUNCH); + Runnable onFinishCallback = () -> InteractionJankMonitorWrapper.end( + Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_APP_LAUNCH); TaskbarActivityContext context = mControllers.taskbarActivityContext; final RemoteTransition slideInTransition = new RemoteTransition(new SlideInRemoteTransition( Utilities.isRtl(mControllers.taskbarActivityContext.getResources()), - context.getDeviceProfile().getOverviewProfile().getPageSpacing(), + context.getDeviceProfile().overviewPageSpacing, QuickStepContract.getWindowCornerRadius(context), AnimationUtils.loadInterpolator( - context, android.R.interpolator.fast_out_extra_slow_in)), + context, android.R.interpolator.fast_out_extra_slow_in), + onStartCallback, + onFinishCallback), "SlideInTransition"); - SystemUiProxy systemUiProxy = SystemUiProxy.INSTANCE.get( - mKeyboardQuickSwitchView.getContext()); if (index == mKeyboardQuickSwitchView.getDesktopTaskIndex()) { UI_HELPER_EXECUTOR.execute(() -> - systemUiProxy + SystemUiProxy.INSTANCE.get(mKeyboardQuickSwitchView.getContext()) .showDesktopApps( mKeyboardQuickSwitchView.getDisplay().getDisplayId(), slideInTransition)); @@ -282,77 +280,35 @@ public class KeyboardQuickSwitchViewController { if (task == null) { return mOnDesktop ? 1 : Math.max(0, index); } - - if (enableAltTabKqsFlatenning.isTrue() - && tryLaunchingCombinedTask(task, slideInTransition, systemUiProxy)) { - return -1; - } - - // TODO b/414410702: move this check to before tryLaunchingCombinedTask() call. if (mControllerCallbacks.isTaskRunning(task)) { // Ignore attempts to run the selected task if it is already running. return -1; } - RemoteTransition remoteTransition = slideInTransition; boolean canUnminimizeDesktopTask = task instanceof SingleTask singleTask && mControllers.taskbarActivityContext.canUnminimizeDesktopTask( singleTask.getTask().key.id); if (mOnDesktop && canUnminimizeDesktopTask) { // This app is being unminimized - use our own transition runner. - remoteTransition = getUnminimizeTransition(); + remoteTransition = new RemoteTransition( + new DesktopAppLaunchTransition( + context, + UNMINIMIZE, + Cuj.CUJ_DESKTOP_MODE_KEYBOARD_QUICK_SWITCH_APP_LAUNCH, + MAIN_EXECUTOR + ), + "DesktopKeyboardQuickSwitchUnminimize"); } mControllers.taskbarActivityContext.handleGroupTaskLaunch( task, remoteTransition, mOnDesktop, - DesktopTaskToFrontReason.ALT_TAB); + DesktopTaskToFrontReason.ALT_TAB, + onStartCallback, + onFinishCallback); return -1; } - private boolean tryLaunchingCombinedTask(GroupTask task, RemoteTransition slideInTransition, - SystemUiProxy systemUiProxy) { - TaskbarActivityContext context = mControllers.taskbarActivityContext; - int taskId = task.getTasks().getFirst().key.id; - - // All DesktopTasks, irrespective of whether desktop mode is active, are launched here as - // the class DesktopTask is used in a special way by KQS view for showing thumbnails of - // freeform tasks. - if (task instanceof DesktopTask desktopTask) { - boolean canUnminimizeDesktopTask = context.canUnminimizeDesktopTask(taskId); - UI_HELPER_EXECUTOR.execute(() -> { - if (!mOnDesktop) { - systemUiProxy.activateDesk(desktopTask.getDeskId(), slideInTransition); - } - - systemUiProxy.showDesktopApp(taskId, - canUnminimizeDesktopTask ? getUnminimizeTransition() : null, - DesktopTaskToFrontReason.ALT_TAB); - }); - return true; - } else if (mOnDesktop && task instanceof SingleTask) { - // Use the special API if user wants to switch to a fullscreen app while in desktop. - UI_HELPER_EXECUTOR.execute( - () -> systemUiProxy.moveToFullscreen(taskId, - DesktopModeTransitionSource.KEYBOARD_SHORTCUT, slideInTransition)); - return true; - } - - // For all other cases, let TaskbarActivityContext handle launching the task. - return false; - } - - private RemoteTransition getUnminimizeTransition() { - return new RemoteTransition( - new DesktopAppLaunchTransition( - mControllers.taskbarActivityContext, - UNMINIMIZE, - Cuj.CUJ_DESKTOP_MODE_KEYBOARD_QUICK_SWITCH_APP_LAUNCH, - MAIN_EXECUTOR - ), - "DesktopKeyboardQuickSwitchUnminimize"); - } - private void onCloseComplete() { mCloseAnimation = null; // Reset the view callbacks to prevent `onDetachedFromWindow` getting called in response to @@ -387,7 +343,7 @@ public class KeyboardQuickSwitchViewController { return dl.isEventOverView(mKeyboardQuickSwitchView, ev); } - class ViewCallbacks implements FocusState.FocusChangeListener { + class ViewCallbacks { public final OnBackInvokedCallback onBackInvokedCallback = () -> closeQuickSwitchView(true); boolean onKeyUp(int keyCode, KeyEvent event, boolean isRTL, boolean allowTraversal) { @@ -458,12 +414,5 @@ public class KeyboardQuickSwitchViewController { closeQuickSwitchView(false); mDetachingFromWindow = false; } - - @Override - public void onFocusedDisplayChanged(int displayId) { - if (mControllers.taskbarActivityContext.getDisplayId() != displayId) { - closeQuickSwitchView(/* animate= */ true); - } - } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index e294f4ab9a..3d5e214391 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -48,19 +48,19 @@ import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.MultiPropertyFactory; import com.android.launcher3.util.OnboardingPrefs; -import com.android.quickstep.BaseContainerInterface; import com.android.quickstep.GestureState; import com.android.quickstep.HomeVisibilityState; import com.android.quickstep.LauncherActivityInterface; -import com.android.quickstep.OverviewComponentObserver; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.SystemUiProxy; -import com.android.quickstep.fallback.window.RecentsWindowManager; +import com.android.quickstep.fallback.window.RecentsDisplayModel; +import com.android.quickstep.fallback.window.RecentsWindowFlags; import com.android.quickstep.util.SplitTask; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.RecentsViewContainer; import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags; import com.android.wm.shell.shared.bubbles.BubbleBarLocation; +import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import java.io.PrintWriter; import java.util.Arrays; @@ -120,21 +120,23 @@ public class LauncherTaskbarUIController extends TaskbarUIController { mTaskbarLauncherStateController.init(mControllers, mLauncher, mControllers.getSharedState().sysuiStateFlags); final TaskbarActivityContext taskbarContext = mControllers.taskbarActivityContext; - int displayId = taskbarContext.getDisplayId(); - BaseContainerInterface containerInterface = OverviewComponentObserver.INSTANCE.get( - taskbarContext).getContainerInterface(displayId); - if (containerInterface != null - && containerInterface.getCreatedContainer() - instanceof RecentsWindowManager recentsWindowManager) { - mRecentsViewContainer = recentsWindowManager; - mRecentsViewContainer.setTaskbarUIController(this); - } else { + if (RecentsWindowFlags.getEnableOverviewInWindow()) { + mRecentsViewContainer = RecentsDisplayModel.getINSTANCE() + .get(taskbarContext).getRecentsWindowManager(taskbarContext.getDisplayId()); + } + if (mRecentsViewContainer == null) { mRecentsViewContainer = mLauncher; } mLauncher.setTaskbarUIController(this); + if (mRecentsViewContainer != mLauncher) { + mRecentsViewContainer.setTaskbarUIController(this); + } mHomeState.addListener(mVisibilityChangeListener); - onLauncherVisibilityChanged(mHomeState.isHomeVisible(), true /* fromInit */); + onLauncherVisibilityChanged( + Flags.useActivityOverlay() + ? mHomeState.isHomeVisible() : mLauncher.hasBeenResumed(), + true /* fromInit */); onStashedInAppChanged(mLauncher.getDeviceProfile()); mLauncher.addOnDeviceProfileChangeListener(mOnDeviceProfileChangeListener); @@ -222,10 +224,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController { */ @Override public void onLauncherVisibilityChanged(boolean isVisible) { - final TaskbarActivityContext taskbarContext = mControllers.taskbarActivityContext; - if (taskbarContext.showLockedTaskbarOnHome() - && !taskbarContext.showDesktopTaskbarForFreeformDisplay() - && taskbarContext.isPrimaryDisplay()) { + if (DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(mLauncher) + && mControllers.taskbarActivityContext.isPrimaryDisplay()) { DisplayController.INSTANCE.get(mLauncher).notifyConfigChange(); } @@ -273,8 +273,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController { } if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue() - && mControllers.taskbarDesktopModeController.isInDesktopModeAndNotInOverview( - mControllers.taskbarActivityContext.getDisplayId())) { + && mControllers.taskbarDesktopModeController + .isInDesktopModeAndNotInOverview(mLauncher.getDisplayId())) { // TODO: b/333533253 - Remove after flag rollout isVisible = false; } @@ -293,7 +293,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController { @Override public void refreshResumedState() { - onLauncherVisibilityChanged(mHomeState.isHomeVisible()); + onLauncherVisibilityChanged(Flags.useActivityOverlay() + ? mHomeState.isHomeVisible() : mLauncher.hasBeenResumed()); } @Override @@ -350,9 +351,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController { * app launch animation. */ public void setIgnoreInAppFlagForSync(boolean enabled) { - if (syncAppLaunchWithTaskbarStash() - && mControllers != null - && mControllers.taskbarStashController != null) { + if (syncAppLaunchWithTaskbarStash()) { mControllers.taskbarStashController.updateStateForFlag(FLAG_IGNORE_IN_APP, enabled); } } @@ -362,6 +361,15 @@ public class LauncherTaskbarUIController extends TaskbarUIController { mTaskbarLauncherStateController.applyState(); } + public boolean isDraggingItem() { + boolean bubblesDragging = false; + if (mControllers.bubbleControllers.isPresent()) { + bubblesDragging = + mControllers.bubbleControllers.get().bubbleDragController.isDragging(); + } + return mControllers.taskbarDragController.isDragging() || bubblesDragging; + } + @Override protected void onStashedInAppChanged() { onStashedInAppChanged(mLauncher.getDeviceProfile()); diff --git a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt index 2d6f1ee5be..bfd93dda31 100644 --- a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt +++ b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt @@ -225,7 +225,7 @@ class ManageWindowsTaskbarShortcut( // Calculate the Y position to place the carousel above the taskbar menuView.rootView.y = - deviceProfile.deviceProperties.availableHeightPx - + deviceProfile.availableHeightPx - menuView.menuHeight - controllers.taskbarStashController.touchableHeight - margin @@ -234,12 +234,9 @@ class ManageWindowsTaskbarShortcut( // but avoid clashing with the screen edge menuView.rootView.translationX = if (Utilities.isRtl(context.resources)) { - -(deviceProfile.deviceProperties.availableWidthPx - menuView.menuWidth) / 2f + -(deviceProfile.availableWidthPx - menuView.menuWidth) / 2f } else { - val maxX = - deviceProfile.deviceProperties.availableWidthPx - - menuView.menuWidth - - margin + val maxX = deviceProfile.availableWidthPx - menuView.menuWidth - margin minOf(originalView.x, maxX) } } diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index 323372be9d..4806ed8495 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -40,7 +40,6 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISMISS_IME; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DISABLE_GESTURE_SPLIT_INVOCATION; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_BUTTON_VISIBLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_VISIBLE; @@ -51,7 +50,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_Q import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SHORTCUT_HELPER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING; -import static com.android.window.flags2.Flags.predictiveBackThreeButtonNav; +import static com.android.window.flags.Flags.predictiveBackThreeButtonNav; import android.animation.Animator; import android.animation.ArgbEvaluator; @@ -73,6 +72,7 @@ import android.graphics.Region.Op; import android.graphics.drawable.Drawable; import android.graphics.drawable.PaintDrawable; import android.graphics.drawable.RotateDrawable; +import android.inputmethodservice.InputMethodService; import android.os.Bundle; import android.os.Handler; import android.os.SystemProperties; @@ -167,9 +167,6 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT FLAG_NOTIFICATION_SHADE_EXPANDED | FLAG_VOICE_INTERACTION_WINDOW_SHOWING; private static final String NAV_BUTTONS_SEPARATE_WINDOW_TITLE = "Taskbar Nav Buttons"; - private static final String SUW_THEME_SYSTEM_PROPERTY = "setupwizard.theme"; - private static final String GLIF_EXPRESSIVE_THEME = "glif_expressive"; - private static final String GLIF_EXPRESSIVE_LIGHT_THEME = "glif_expressive_light"; private static final double SQUARE_ASPECT_RATIO_BOTTOM_BOUND = 0.95; private static final double SQUARE_ASPECT_RATIO_UPPER_BOUND = 1.05; @@ -281,9 +278,9 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT if (mContext.isPhoneMode()) { mTaskbarTransitions = new TaskbarTransitions(mContext, mNavButtonsView); } - String SUWTheme = SystemProperties.get(SUW_THEME_SYSTEM_PROPERTY, ""); - mIsExpressiveThemeEnabled = SUWTheme.equals(GLIF_EXPRESSIVE_THEME) - || SUWTheme.equals(GLIF_EXPRESSIVE_LIGHT_THEME); + String SUWTheme = SystemProperties.get("setupwizard.theme", ""); + mIsExpressiveThemeEnabled = SUWTheme.equals("glif_expressive") + || SUWTheme.equals("glif_expressive_light"); } /** @@ -313,7 +310,13 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT } mNavButtonsView.setLayoutParams(navButtonsViewLayoutParams); - mIsImeRenderingNavButtons = mContext.imeDrawsImeNavBar(); + try { + mIsImeRenderingNavButtons = + InputMethodService.canImeRenderGesturalNavButtons() && mContext.imeDrawsImeNavBar(); + } catch (NoSuchMethodError e) { + // LC-Ignored: what? + mIsImeRenderingNavButtons = false; + } if (!mIsImeRenderingNavButtons) { // IME switcher final int switcherResId = Flags.imeSwitcherRevamp() @@ -347,10 +350,8 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT // Start at 1 because relevant flags are unset at init. mOnBackgroundNavButtonColorOverrideMultiplier.value = 1; - // Potentially force the back button to be visible during setup wizard. The back button - // won't show up if the expressive theme is enabled and simple view is disabled - boolean shouldShowInSetup = !mContext.isUserSetupComplete() - && (!mIsExpressiveThemeEnabled || mContext.isSimpleViewEnabled()); + // Potentially force the back button to be visible during setup wizard. + boolean shouldShowInSetup = !mContext.isUserSetupComplete() && !mIsExpressiveThemeEnabled; boolean isInKidsMode = mContext.isNavBarKidsModeActive(); boolean alwaysShowButtons = isThreeButtonNav || shouldShowInSetup; @@ -366,7 +367,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT flags -> (flags & flagsToRemoveTranslation) != 0, AnimatedFloat.VALUE, 1, 0)); // Center nav buttons in new height for IME. - float transForIme = (mContext.getDeviceProfile().getTaskbarProfile().getHeight() + float transForIme = (mContext.getDeviceProfile().taskbarHeight - mControllers.taskbarInsetsController.getTaskbarHeightForIme()) / 2f; // For gesture nav, nav buttons only show for IME anyway so keep them translated down. float defaultButtonTransY = alwaysShowButtons ? 0 : transForIme; @@ -394,6 +395,13 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT mControllers.taskbarDragLayerController.getNavbarBackgroundAlpha(), flags -> (flags & FLAG_ONLY_BACK_FOR_BOUNCER_VISIBLE) != 0)); } + } else if (!mIsImeRenderingNavButtons) { + View imeDownButton = addButton(R.drawable.ic_sysbar_back, BUTTON_BACK, + mStartContextualContainer, mControllers.navButtonController, R.id.back); + imeDownButton.setRotation(Utilities.isRtl(resources) ? 90 : -90); + // Only show when IME is visible. + mPropertyHolders.add(new StatePropertyHolder(imeDownButton, + flags -> (flags & FLAG_IME_VISIBLE) != 0)); } mFloatingRotationButton = new FloatingRotationButton( ENABLE_TASKBAR_NAVBAR_UNIFICATION ? mNavigationBarPanelContext : mContext, @@ -420,7 +428,6 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT mSeparateWindowParent = new BaseDragLayer<>(mContext, null, 0) { @Override public void recreateControllers() { - super.recreateControllers(); mControllers = new TouchController[0]; } @@ -505,13 +512,6 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT navButtonController.onButtonClick(BUTTON_RECENTS, v); mHitboxExtender.onRecentsButtonClicked(); }); - mRecentsButton.addOnLayoutChangeListener( - (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { - int[] location = v.getLocationOnScreen(); - Rect bounds = new Rect(location[0], location[1], location[0] + v.getWidth(), - location[1] + v.getHeight()); - navButtonController.onRecentsButtonLayoutChanged(bounds); - }); mPropertyHolders.add(new StatePropertyHolder(mRecentsButton, flags -> (flags & FLAG_KEYGUARD_VISIBLE) == 0 && (flags & FLAG_DISABLE_RECENTS) == 0 && !mContext.isNavBarKidsModeActive() && !mContext.isGestureNav())); @@ -529,20 +529,6 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT navButtonController.onButtonLongClick(BUTTON_SPACE, view)); } - /** - * Method to determine whether the Navigation Bar is viewable in Setup Wizard - * - * @return {@code true} if the device is in Setup Wizard, the expressive theme is enabled, - * and Simple View is NOT enabled - */ - boolean isNavbarHiddenInSUW() { - if (mContext == null) { - return false; - } - return !mContext.isUserSetupComplete() && mIsExpressiveThemeEnabled - && !mContext.isSimpleViewEnabled(); - } - /** * Method to determine whether to show the home button in lockscreen * @@ -566,9 +552,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT boolean isBackDismissIme = (sysUiStateFlags & SYSUI_STATE_BACK_DISMISS_IME) != 0; boolean a11yVisible = (sysUiStateFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0; boolean isHomeDisabled = (sysUiStateFlags & SYSUI_STATE_HOME_DISABLED) != 0; - // TODO: b/409075366 - ensure this signal is correctly set for external displays. - boolean isRecentsDisabled = mContext.isPrimaryDisplay() - && (sysUiStateFlags & SYSUI_STATE_OVERVIEW_DISABLED) != 0; + boolean isRecentsDisabled = (sysUiStateFlags & SYSUI_STATE_OVERVIEW_DISABLED) != 0; boolean isBackDisabled = (sysUiStateFlags & SYSUI_STATE_BACK_DISABLED) != 0; long shadeExpandedFlags = SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED | SYSUI_STATE_QUICK_SETTINGS_EXPANDED; @@ -578,8 +562,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT (sysUiStateFlags & SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING) != 0; boolean isKeyboardShortcutHelperShowing = (sysUiStateFlags & SYSUI_STATE_SHORTCUT_HELPER_SHOWING) != 0; - boolean splitAnimationRunning = - (sysUiStateFlags & SYSUI_STATE_DISABLE_GESTURE_SPLIT_INVOCATION) != 0; + updateStateForFlag(FLAG_IME_SWITCHER_BUTTON_VISIBLE, isImeSwitcherButtonVisible); updateStateForFlag(FLAG_IME_VISIBLE, isImeVisible); updateStateForFlag(FLAG_BACK_DISMISS_IME, isBackDismissIme); @@ -599,12 +582,6 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT mA11yButton.setLongClickable(a11yLongClickable); updateButtonLayoutSpacing(); } - - if (mNavButtonContainer.getChildCount() > 0) { - for (int i = 0; i < mNavButtonContainer.getChildCount(); i++) { - mNavButtonContainer.getChildAt(i).setEnabled(!splitAnimationRunning); - } - } } public void updateStateForSysuiFlags(@SystemUiStateFlags long systemUiStateFlags, @@ -672,8 +649,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT * Returns true if the recents (overview) button is disabled */ public boolean isRecentsDisabled() { - // TODO: b/409075366 - ensure this signal is correctly set for external displays. - return (mState & FLAG_DISABLE_RECENTS) != 0 && mContext.isPrimaryDisplay(); + return (mState & FLAG_DISABLE_RECENTS) != 0; } /** @@ -949,8 +925,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT navButtonController.onButtonLongClick(buttonType, view)); buttonView.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_DOWN) { - buttonView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + buttonView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); } return false; }); @@ -994,8 +969,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT hasSentDownEvent.set(false); mHandler.postDelayed(longPressTimeout, PREDICTIVE_BACK_TIMEOUT_MS); rect.set(0, 0, v.getWidth(), v.getHeight()); - buttonView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + buttonView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); } boolean isCancelled = motionEventAction == MotionEvent.ACTION_CANCEL || (!rect.contains(event.getX(), event.getY()) @@ -1043,15 +1017,15 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT if (mFloatingRotationButton != null) { mFloatingRotationButton.onConfigurationChanged(configChanges); } - if (!mContext.isUserSetupComplete() && !ENABLE_TASKBAR_NAVBAR_UNIFICATION) { + if (!mContext.isUserSetupComplete()) { handleSetupUi(); } updateButtonLayoutSpacing(); } private void handleSetupUi() { - // Setup wizard handles the UI when the expressive theme is enabled and Simple View isn't. - if (mIsExpressiveThemeEnabled && !mContext.isSimpleViewEnabled()) { + // Setup wizard handles the UI when the expressive theme is enabled. + if (mIsExpressiveThemeEnabled) { return; } // Since setup wizard only has back button enabled, it looks strange to be @@ -1070,9 +1044,9 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT // If SUW is on a large screen device that is landscape (or has a square aspect // ratio) the back button has to be placed accordingly - if ((deviceProfile.getDeviceProperties().isTablet() && deviceProfile.getDeviceProperties().isLandscape()) - || (deviceProfile.getDeviceProperties().getAspectRatio() > SQUARE_ASPECT_RATIO_BOTTOM_BOUND - && deviceProfile.getDeviceProperties().getAspectRatio() < SQUARE_ASPECT_RATIO_UPPER_BOUND)) { + if ((deviceProfile.isTablet && deviceProfile.isLandscape) + || (deviceProfile.aspectRatio > SQUARE_ASPECT_RATIO_BOTTOM_BOUND + && deviceProfile.aspectRatio < SQUARE_ASPECT_RATIO_UPPER_BOUND)) { navButtonsLayoutParams.setMarginStart( resources.getDimensionPixelSize(R.dimen.taskbar_back_button_suw_start_margin)); navButtonsViewLayoutParams.bottomMargin = resources.getDimensionPixelSize( @@ -1083,7 +1057,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT int phoneOrPortraitSetupMargin = resources.getDimensionPixelSize( R.dimen.taskbar_contextual_button_suw_margin); navButtonsLayoutParams.setMarginStart(phoneOrPortraitSetupMargin); - navButtonsLayoutParams.bottomMargin = !deviceProfile.getDeviceProperties().isLandscape() + navButtonsLayoutParams.bottomMargin = !deviceProfile.isLandscape ? 0 : phoneOrPortraitSetupMargin - (resources.getDimensionPixelSize( R.dimen.taskbar_nav_buttons_size) / 2); @@ -1254,9 +1228,9 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT public void onDestroy() { mPropertyHolders.clear(); + mControllers.rotationButtonController.unregisterListeners(); if (mFloatingRotationButton != null) { mFloatingRotationButton.hide(); - mFloatingRotationButton = null; } moveNavButtonsBackToTaskbarWindow(); @@ -1445,11 +1419,11 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT // Skip additional translations on the nav bar container while in SUW layout return 0; } else if (mContext.shouldStartAlignTaskbar()) { - int navBarSpacing = dp.getHotseatProfile().getInlineNavButtonsEndSpacingPx(); + int navBarSpacing = dp.inlineNavButtonsEndSpacingPx; // If the taskbar is start aligned the navigation bar is aligned to the start or end of // the container, depending on the bubble bar location if (isNavbarOnRight) { - navBarTargetStartX = dp.getDeviceProperties().getWidthPx() - navBarSpacing - mNavButtonContainer.getWidth(); + navBarTargetStartX = dp.widthPx - navBarSpacing - mNavButtonContainer.getWidth(); } else { navBarTargetStartX = navBarSpacing; } @@ -1462,7 +1436,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT if (isNavbarOnRight) { if (mNavButtonsView.isLayoutRtl()) { float taskBarEnd = taskbarBounds.right; - navBarTargetStartX = (dp.getDeviceProperties().getWidthPx() + taskBarEnd - navbarWidth) / 2; + navBarTargetStartX = (dp.widthPx + taskBarEnd - navbarWidth) / 2; } else { navBarTargetStartX = mNavButtonContainer.getLeft(); } @@ -1480,7 +1454,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT // screen. Rect transientTaskbarIconLayoutBoundsInParent = mControllers.taskbarViewController .getTransientTaskbarIconLayoutBoundsInParent(); - if (mContext.getDeviceProfile().getDeviceProperties().isPhone() + if (mContext.getDeviceProfile().isPhone || transientTaskbarIconLayoutBoundsInParent.isEmpty() || mNavButtonsView.getWidth() == 0) { return; diff --git a/quickstep/src/com/android/launcher3/taskbar/PinToTaskbarShortcut.kt b/quickstep/src/com/android/launcher3/taskbar/PinToTaskbarShortcut.kt index 0dce63a838..da6932fc16 100644 --- a/quickstep/src/com/android/launcher3/taskbar/PinToTaskbarShortcut.kt +++ b/quickstep/src/com/android/launcher3/taskbar/PinToTaskbarShortcut.kt @@ -19,11 +19,8 @@ package com.android.launcher3.taskbar import android.content.Context import android.util.SparseArray import android.view.View -import android.window.DesktopExperienceFlags -import androidx.annotation.VisibleForTesting import com.android.launcher3.DeviceProfile import com.android.launcher3.LauncherAppState -import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT import com.android.launcher3.R import com.android.launcher3.model.BgDataModel @@ -40,7 +37,7 @@ class PinToTaskbarShortcut( target: T, itemInfo: ItemInfo?, originalView: View, - @get:VisibleForTesting val mIsPin: Boolean, + private val mIsPin: Boolean, private val mPinnedInfoList: SparseArray, ) : SystemShortcut( @@ -63,18 +60,7 @@ class PinToTaskbarShortcut( .getWriter(true, mTarget!!.cellPosMapper, callbacks) if (!mIsPin) { - var infoToUnpin = mItemInfo - if (mItemInfo.container == CONTAINER_ALL_APPS) { - for (i in 0..( writer.addItemToDatabase(newInfo, CONTAINER_HOTSEAT, mItemInfo.screenId, cellX, cellY) } - - companion object { - fun isPinningAppWithContextMenuEnabled(context: TaskbarActivityContext): Boolean = - DesktopExperienceFlags.ENABLE_PINNING_APP_WITH_CONTEXT_MENU.isTrue && - context.isTaskbarShowingDesktopTasks - } } diff --git a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java index c19d883e96..6bd3d855e2 100644 --- a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java @@ -17,30 +17,27 @@ package com.android.launcher3.taskbar; import static android.view.Display.DEFAULT_DISPLAY; -import static com.android.launcher3.EncryptionType.ENCRYPTED; -import static com.android.launcher3.LauncherPrefs.nonRestorableItem; -import static com.android.launcher3.taskbar.Utilities.getShapedTaskbarRadius; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Outline; import android.graphics.Rect; import android.view.View; import android.view.ViewOutlineProvider; -import com.android.launcher3.ConstantItem; import com.android.launcher3.DeviceProfile; -import com.android.launcher3.Flags; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.R; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.anim.RevealOutlineAnimation; import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; import com.android.launcher3.util.Executors; +import com.android.launcher3.util.MultiPropertyFactory; import com.android.launcher3.util.MultiValueAlpha; import com.android.quickstep.NavHandle; import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags; @@ -58,8 +55,7 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT public static final int ALPHA_INDEX_HOME_DISABLED = 1; public static final int ALPHA_INDEX_ASSISTANT_INVOKED = 2; public static final int ALPHA_INDEX_HIDDEN_WHILE_DREAMING = 3; - public static final int ALPHA_INDEX_NUDGED = 4; - private static final int NUM_ALPHA_CHANNELS = 5; + private static final int NUM_ALPHA_CHANNELS = 4; // Values for long press animations, picked to most closely match navbar spec. private static final float SCALE_TOUCH_ANIMATION_SHRINK = 0.85f; @@ -71,11 +67,8 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT private static final String SHARED_PREFS_STASHED_HANDLE_REGION_DARK_KEY = "stashed_handle_region_is_dark"; - private static final ConstantItem STASHED_HANDLE_REGION_IS_DARK = - nonRestorableItem(SHARED_PREFS_STASHED_HANDLE_REGION_DARK_KEY, false, ENCRYPTED); - private final TaskbarActivityContext mActivity; - private final LauncherPrefs mPrefs; + private final SharedPreferences mPrefs; private final StashedHandleView mStashedHandleView; private int mStashedHandleWidth; private final int mStashedHandleHeight; @@ -109,12 +102,13 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT public StashedHandleViewController(TaskbarActivityContext activity, StashedHandleView stashedHandleView) { mActivity = activity; - mPrefs = LauncherPrefs.get(mActivity); + mPrefs = LauncherPrefs.getPrefs(mActivity); mStashedHandleView = stashedHandleView; mTaskbarStashedHandleAlpha = new MultiValueAlpha(mStashedHandleView, NUM_ALPHA_CHANNELS); mTaskbarStashedHandleAlpha.setUpdateVisibility(true); mStashedHandleView.updateHandleColor( - mPrefs.get(STASHED_HANDLE_REGION_IS_DARK), false /* animate */); + mPrefs.getBoolean(SHARED_PREFS_STASHED_HANDLE_REGION_DARK_KEY, false), + false /* animate */); final Resources resources = mActivity.getResources(); mStashedHandleHeight = resources.getDimensionPixelSize( R.dimen.taskbar_stashed_handle_height); @@ -130,11 +124,11 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT mStashedHandleWidth = resources.getDimensionPixelSize(R.dimen.taskbar_stashed_small_screen); } else { - mTaskbarSize = deviceProfile.getTaskbarProfile().getHeight(); + mTaskbarSize = deviceProfile.taskbarHeight; mStashedHandleWidth = resources .getDimensionPixelSize(R.dimen.taskbar_stashed_handle_width); } - int taskbarBottomMargin = deviceProfile.getTaskbarProfile().getBottomMargin(); + int taskbarBottomMargin = deviceProfile.taskbarBottomMargin; mStashedHandleView.getLayoutParams().height = mTaskbarSize + taskbarBottomMargin; mTaskbarStashedHandleAlpha.get(ALPHA_INDEX_STASHED).setValue( @@ -153,9 +147,7 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT stashedCenterX + mStashedHandleWidth / 2, stashedCenterY + mStashedHandleHeight / 2); mStashedHandleView.updateSampledRegion(mStashedHandleBounds); - mStashedHandleRadius = Flags.enableLauncherIconShapes() - ? getShapedTaskbarRadius(mActivity) - : view.getHeight() / 2f; + mStashedHandleRadius = view.getHeight() / 2f; outline.setRoundRect(mStashedHandleBounds, mStashedHandleRadius); } }); @@ -175,7 +167,6 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT /** * Returns the stashed handle bounds. - * * @param out The destination rect. */ public void getStashedHandleBounds(Rect out) { @@ -188,7 +179,8 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT @Override public void onRegionDarknessChanged(boolean isRegionDark) { mStashedHandleView.updateHandleColor(isRegionDark, true /* animate */); - mPrefs.put(STASHED_HANDLE_REGION_IS_DARK, isRegionDark); + mPrefs.edit().putBoolean(SHARED_PREFS_STASHED_HANDLE_REGION_DARK_KEY, + isRegionDark).apply(); } @Override @@ -206,7 +198,7 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT mRegionSamplingHelper = null; } - public MultiValueAlpha getStashedHandleAlpha() { + public MultiPropertyFactory getStashedHandleAlpha() { return mTaskbarStashedHandleAlpha; } @@ -229,9 +221,8 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT int heightDiff = (mTaskbarSize - visualBounds.height()) / 2; visualBounds.top -= heightDiff; visualBounds.bottom += heightDiff; - startRadius = Flags.enableLauncherIconShapes() - ? getShapedTaskbarRadius(mActivity) - : visualBounds.height() / 2f; + + startRadius = visualBounds.height() / 2f; } final RevealOutlineAnimation handleRevealProvider = new RoundedRectRevealOutlineProvider( diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index f7e760d44e..fc93d4a0ab 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -16,6 +16,7 @@ package com.android.launcher3.taskbar; import static android.os.Trace.TRACE_TAG_APP; +import static android.view.Display.DEFAULT_DISPLAY; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; @@ -32,6 +33,7 @@ import static com.android.launcher3.AbstractFloatingView.TYPE_ON_BOARD_POPUP; import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE; import static com.android.launcher3.AbstractFloatingView.TYPE_TASKBAR_OVERLAY_PROXY; import static com.android.launcher3.Flags.enableCursorHoverStates; +import static com.android.launcher3.Flags.removeExcludeFromScreenMagnificationFlagUsage; import static com.android.launcher3.Utilities.calculateTextHeight; import static com.android.launcher3.Utilities.isRunningInTestHarness; import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION; @@ -44,7 +46,6 @@ import static com.android.launcher3.taskbar.TaskbarStashController.SHOULD_BUBBLE import static com.android.launcher3.testing.shared.ResourceUtils.getBoolByName; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.quickstep.util.AnimUtils.completeRunnableListCallback; -import static com.android.quickstep.util.ExternalDisplaysKt.isExternalDisplay; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING; import static com.android.wm.shell.Flags.enableBubbleBar; @@ -63,7 +64,6 @@ import android.content.pm.ActivityInfo.Config; import android.content.pm.LauncherApps; import android.content.res.Resources; import android.graphics.PixelFormat; -import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.hardware.display.DisplayManager; @@ -113,7 +113,6 @@ import com.android.launcher3.icons.BitmapRenderer; import com.android.launcher3.icons.FastBitmapDrawable; import com.android.launcher3.logger.LauncherAtom; import com.android.launcher3.logging.StatsLogManager; -import com.android.launcher3.model.ModelWriter; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.AppPairInfo; import com.android.launcher3.model.data.FolderInfo; @@ -137,7 +136,6 @@ import com.android.launcher3.taskbar.bubbles.BubbleDismissController; import com.android.launcher3.taskbar.bubbles.BubbleDragController; import com.android.launcher3.taskbar.bubbles.BubblePinController; import com.android.launcher3.taskbar.bubbles.BubbleStashedHandleViewController; -import com.android.launcher3.taskbar.bubbles.DragToBubbleController; import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController; import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.TaskbarHotseatDimensionsProvider; import com.android.launcher3.taskbar.bubbles.stashing.DeviceProfileDimensionsProviderAdapter; @@ -208,8 +206,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { private static final String WINDOW_TITLE = "Taskbar"; - public static final String SIMPLE_VIEW_SETTINGS_KEY = "matcha_enable"; - protected static final DesktopModeFlag ENABLE_TASKBAR_BEHIND_SHADE = new DesktopModeFlag( Flags::enableTaskbarBehindShade, false); @@ -219,6 +215,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { private final TaskbarControllers mControllers; private final WindowManager mWindowManager; + private final boolean mIsPrimaryDisplay; private DeviceProfile mDeviceProfile; private WindowManager.LayoutParams mWindowLayoutParams; private WindowManager.LayoutParams mLastUpdatedLayoutParams; @@ -237,11 +234,13 @@ public class TaskbarActivityContext extends BaseTaskbarContext { private boolean mImeDrawsImeNavBar; private final boolean mIsSafeModeEnabled; - private boolean mIsUserSetupComplete; - private boolean mIsNavBarForceVisible; - private boolean mIsNavBarKidsMode; + private final boolean mIsUserSetupComplete; + private final boolean mIsNavBarForceVisible; + private final boolean mIsNavBarKidsMode; private boolean mIsDestroyed = false; + // The flag to know if the window is excluded from magnification region computation. + private boolean mIsExcludeFromMagnificationRegion = false; private boolean mAddedWindow = false; // The bounds of the taskbar items relative to TaskbarDragLayer @@ -254,7 +253,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { private DeviceProfile mPersistentTaskbarDeviceProfile; private final LauncherPrefs mLauncherPrefs; - private final int mPrimaryDisplayId; private final SystemUiProxy mSysUiProxy; private TaskbarFeatureEvaluator mTaskbarFeatureEvaluator; @@ -265,15 +263,15 @@ public class TaskbarActivityContext extends BaseTaskbarContext { private @Nullable View mTaskbarSnapshotView; private @Nullable TaskbarOverlayContext mTaskbarSnapshotOverlay; - public TaskbarActivityContext(int displayId, Context windowContext, + public TaskbarActivityContext(Context windowContext, @Nullable Context navigationBarPanelContext, DeviceProfile launcherDp, TaskbarNavButtonController buttonController, ScopedUnfoldTransitionProgressProvider unfoldTransitionProgressProvider, - boolean isPrimaryDisplay, int primaryDisplayId, SystemUiProxy sysUiProxy) { - super(windowContext, displayId, isPrimaryDisplay); + boolean isPrimaryDisplay, SystemUiProxy sysUiProxy) { + super(windowContext, isPrimaryDisplay); + mIsPrimaryDisplay = isPrimaryDisplay; mNavigationBarPanelContext = navigationBarPanelContext; mSysUiProxy = sysUiProxy; - mPrimaryDisplayId = primaryDisplayId; applyDeviceProfile(launcherDp); final Resources resources = getResources(); mTaskbarFeatureEvaluator = TaskbarFeatureEvaluator.getInstance(this); @@ -287,6 +285,15 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mIsSafeModeEnabled = TraceHelper.allowIpcs("isSafeMode", () -> getPackageManager().isSafeMode()); + // TODO(b/244231596) For shared Taskbar window, update this value in applyDeviceProfile() + // instead so to get correct value when recreating the taskbar + SettingsCache settingsCache = SettingsCache.INSTANCE.get(this); + mIsUserSetupComplete = settingsCache.getValue( + Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), 0); + mIsNavBarKidsMode = settingsCache.getValue( + Settings.Secure.getUriFor(Settings.Secure.NAV_BAR_KIDS_MODE), 0); + mIsNavBarForceVisible = mIsNavBarKidsMode; + // Get display and corners first, as views might use them in constructor. Context c = getApplicationContext(); mWindowManager = c.getSystemService(WindowManager.class); @@ -299,7 +306,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { TaskbarScrimView taskbarScrimView = mDragLayer.findViewById(R.id.taskbar_scrim); NearestTouchFrame navButtonsView = mDragLayer.findViewById(R.id.navbuttons_view); StashedHandleView stashedHandleView = mDragLayer.findViewById(R.id.stashed_handle); - NudgeView nudgeView = mDragLayer.findViewById(R.id.nudge_icon); BubbleBarView bubbleBarView = mDragLayer.findViewById(R.id.taskbar_bubbles); FrameLayout bubbleBarContainer = mDragLayer.findViewById(R.id.taskbar_bubbles_container); StashedHandleView bubbleHandleView = mDragLayer.findViewById(R.id.stashed_bubble_handle); @@ -310,9 +316,12 @@ public class TaskbarActivityContext extends BaseTaskbarContext { Optional bubbleControllersOptional = Optional.empty(); BubbleBarController.onTaskbarRecreated(); final boolean deviceBubbleBarEnabled = enableBubbleBarOnPhones() - || (!mDeviceProfile.getDeviceProperties().isPhone() && !mDeviceProfile.isVerticalBarLayout()); - if (BubbleBarController.isBubbleBarEnabled() && deviceBubbleBarEnabled - && bubbleBarView != null && isPrimaryDisplay) { + || (!mDeviceProfile.isPhone && !mDeviceProfile.isVerticalBarLayout()); + if (BubbleBarController.isBubbleBarEnabled() + && deviceBubbleBarEnabled + && bubbleBarView != null + && isPrimaryDisplay + ) { Optional bubbleHandleController = Optional.empty(); Optional bubbleBarSwipeController = Optional.empty(); if (isTransientTaskbar) { @@ -334,10 +343,11 @@ public class TaskbarActivityContext extends BaseTaskbarContext { bubbleHandleController, new BubbleDragController(this, mDragLayer), new BubbleDismissController(this, mDragLayer), - new BubbleBarPinController(this, bubbleBarContainer, this::getScreenSize), - new BubblePinController(this, bubbleBarContainer, this::getScreenSize), + new BubbleBarPinController(this, bubbleBarContainer, + () -> DisplayController.INSTANCE.get(this).getInfo().currentSize), + new BubblePinController(this, bubbleBarContainer, + () -> DisplayController.INSTANCE.get(this).getInfo().currentSize), bubbleBarSwipeController, - new DragToBubbleController(this, bubbleBarContainer), new BubbleCreator(this) )); } @@ -385,14 +395,13 @@ public class TaskbarActivityContext extends BaseTaskbarContext { bubbleControllersOptional, new TaskbarDesktopModeController(this, DesktopVisibilityController.INSTANCE.get(this)), - new NudgeController(this), - new NudgeViewController(this, nudgeView)); + new NudgeController(this)); mLauncherPrefs = LauncherPrefs.get(this); onViewCreated(); } - /** Updates {@link deviceprofile} instances for any Taskbar windows. */ + /** Updates {@link DeviceProfile} instances for any Taskbar windows. */ public void updateDeviceProfile(DeviceProfile launcherDp) { applyDeviceProfile(launcherDp); mControllers.taskbarOverlayController.updateLauncherDeviceProfile(launcherDp); @@ -408,13 +417,9 @@ public class TaskbarActivityContext extends BaseTaskbarContext { dispatchDeviceProfileChanged(); } - public final int getPrimaryDisplayId() { - return mPrimaryDisplayId; - } - @Override public boolean isTransientTaskbar() { - return DisplayController.isTransientTaskbar(this) && isPrimaryDisplay() && !isPhoneMode(); + return DisplayController.isTransientTaskbar(this) && mIsPrimaryDisplay && !isPhoneMode(); } @Override @@ -434,13 +439,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId()); } - @Override - public boolean isTaskbarShowingDesktopTasks() { - return mControllers != null - && mControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar( - getDisplayId()); - } - @Override public boolean showLockedTaskbarOnHome() { return DisplayController.showLockedTaskbarOnHome(this); @@ -452,18 +450,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } @Override - public Point getScreenSize() { - return DisplayController.INSTANCE.get(this).getInfo().currentSize; - } - - @Override - public int getDisplayHeight() { - return DisplayController.INSTANCE.get(this).getInfo().currentSize.y; - } - - @Override - public void notifyConfigChanged() { - DisplayController.INSTANCE.get(this).notifyConfigChange(); + public boolean isPrimaryDisplay() { + return mIsPrimaryDisplay; } /** @@ -478,7 +466,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { deviceProfile.hotseatQsbWidth = originDeviceProfile.hotseatQsbWidth; // Update icon size - deviceProfile.iconSizePx = deviceProfile.getTaskbarProfile().getIconSize(); + deviceProfile.iconSizePx = deviceProfile.taskbarIconSize; deviceProfile.updateIconSize(1f, this); }; mDeviceProfile = originDeviceProfile.toBuilder(this) @@ -500,13 +488,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { .build(); } mNavMode = getNavigationMode(); - - SettingsCache settingsCache = SettingsCache.INSTANCE.get(this); - mIsUserSetupComplete = settingsCache.getValue( - Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), 0); - mIsNavBarKidsMode = settingsCache.getValue( - Settings.Secure.getUriFor(Settings.Secure.NAV_BAR_KIDS_MODE), 0); - mIsNavBarForceVisible = mIsNavBarKidsMode; } /** Called when the visibility of the bubble bar changed. */ @@ -596,14 +577,10 @@ public class TaskbarActivityContext extends BaseTaskbarContext { */ public boolean isPhoneMode() { return ENABLE_TASKBAR_NAVBAR_UNIFICATION - && mDeviceProfile.getDeviceProperties().isPhone() + && mDeviceProfile.isPhone && !mDeviceProfile.isTaskbarPresent; } - public boolean isTaskbarInMinimalState() { - return mControllers.taskbarViewController.isTaskbarInMinimalState(); - } - /** * @return {@code true} if {@link #isPhoneMode()} is true and we're using 3 button-nav */ @@ -618,18 +595,13 @@ public class TaskbarActivityContext extends BaseTaskbarContext { return isPhoneMode() && !isThreeButtonNav(); } - /** Returns whether Taskbar draws its own background, vs being translucent for apps to draw. */ - public boolean drawsTaskbarBackground() { - return !isPhoneMode(); - } - /** Returns {@code true} iff a tiny version of taskbar is shown on phone. */ public boolean isTinyTaskbar() { - return enableTinyTaskbar() && mDeviceProfile.getDeviceProperties().isPhone() && mDeviceProfile.isTaskbarPresent; + return enableTinyTaskbar() && mDeviceProfile.isPhone && mDeviceProfile.isTaskbarPresent; } public boolean isBubbleBarOnPhone() { - return enableBubbleBarOnPhones() && enableBubbleBar() && mDeviceProfile.getDeviceProperties().isPhone(); + return enableBubbleBarOnPhones() && enableBubbleBar() && mDeviceProfile.isPhone; } /** @@ -757,7 +729,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { */ private WindowManager.LayoutParams createAllWindowParams() { final int windowType = - (ENABLE_TASKBAR_NAVBAR_UNIFICATION && isPrimaryDisplay()) ? TYPE_NAVIGATION_BAR + (ENABLE_TASKBAR_NAVBAR_UNIFICATION && mIsPrimaryDisplay) ? TYPE_NAVIGATION_BAR : TYPE_NAVIGATION_BAR_PANEL; WindowManager.LayoutParams windowLayoutParams = createDefaultWindowLayoutParams(windowType, TaskbarActivityContext.WINDOW_TITLE); @@ -822,7 +794,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { /** Returns whether taskbar should start align. */ public boolean shouldStartAlignTaskbar() { - return isThreeButtonNav() && mDeviceProfile.getTaskbarProfile().isStartAlignTaskbar(); + return isThreeButtonNav() && mDeviceProfile.startAlignTaskbar; } public boolean isGestureNav() { @@ -857,11 +829,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { return mControllers.taskbarDragController; } - @Override - public ModelWriter getModelWriter() { - return mControllers.taskbarViewController.getModelWriter(); - } - @Nullable public BubbleControllers getBubbleControllers() { return mControllers.bubbleControllers.orElse(null); @@ -1062,7 +1029,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { */ public void onDestroy() { onViewDestroyed(); - removeTaskbarSnapshot(); mIsDestroyed = true; mTaskbarFeatureEvaluator.onDestroy(); setUIController(TaskbarUIController.DEFAULT); @@ -1071,6 +1037,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mWindowManager.removeViewImmediate(mDragLayer); mAddedWindow = false; } + mTaskbarSnapshotView = null; + mTaskbarSnapshotOverlay = null; } public boolean isDestroyed() { @@ -1147,8 +1115,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } private void updateTaskbarSnapshot(AnimatorSet anim, boolean isExpanded) { - if (!ENABLE_TASKBAR_BEHIND_SHADE.isTrue() - || isPhoneMode()) { + if (!ENABLE_TASKBAR_BEHIND_SHADE.isTrue()) { return; } if (mTaskbarSnapshotView == null) { @@ -1158,7 +1125,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { if (!mTaskbarSnapshotView.isAttachedToWindow() && mDragLayer.isAttachedToWindow() && mDragLayer.isLaidOut() - && mDragLayer.isVisibleToUser() && mTaskbarSnapshotView.getParent() == null) { NearestTouchFrame navButtonsView = mDragLayer.findViewById(R.id.navbuttons_view); int oldNavButtonsVisibility = navButtonsView.getVisibility(); @@ -1198,29 +1164,28 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mTaskbarSnapshotOverlay.getDragLayer().addView(mTaskbarSnapshotView, layoutParams); } } else { + Runnable removeSnapshotView = () -> { + if (mTaskbarSnapshotOverlay != null) { + mTaskbarSnapshotOverlay.getDragLayer().removeView(mTaskbarSnapshotView); + mTaskbarSnapshotView = null; + mTaskbarSnapshotOverlay = null; + } + }; if (mTaskbarSnapshotView.isAttachedToWindow()) { mTaskbarSnapshotView.setAlpha(0f); anim.end(); if (Utilities.isRunningInTestHarness()) { - removeTaskbarSnapshot(); + removeSnapshotView.run(); } else { ViewRootSync.synchronizeNextDraw(mDragLayer, mTaskbarSnapshotView, - this::removeTaskbarSnapshot); + removeSnapshotView); } } else { - removeTaskbarSnapshot(); + removeSnapshotView.run(); } } } - private void removeTaskbarSnapshot() { - if (mTaskbarSnapshotOverlay != null) { - mTaskbarSnapshotOverlay.getDragLayer().removeView(mTaskbarSnapshotView); - } - mTaskbarSnapshotView = null; - mTaskbarSnapshotOverlay = null; - } - public void onRotationProposal(int rotation, boolean isValid) { mControllers.rotationButtonController.onRotationProposal(rotation, isValid); } @@ -1296,10 +1261,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { && !AbstractFloatingView.hasOpenView( this, TYPE_ALL & ~TYPE_TASKBAR_OVERLAY_PROXY)) { // Reverts Taskbar window to its original size - Runnable resetTaskbarFullscreen = () -> setTaskbarWindowFullscreen(false); - mControllers.bubbleControllers.ifPresentOrElse( - bc -> bc.dragToBubbleController.runAfterDropTargetsHidden( - resetTaskbarFullscreen), resetTaskbarFullscreen); + setTaskbarWindowFullscreen(false); } setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_DRAGGING, isDragInProgress); @@ -1315,13 +1277,13 @@ public class TaskbarActivityContext extends BaseTaskbarContext { public void setTaskbarWindowSize(int size) { // In landscape phone button nav mode, we should set the task bar width instead of height // because this is the only case in which the nav bar is not on the display bottom. - boolean landscapePhoneButtonNav = isPhoneButtonNavMode() && mDeviceProfile.getDeviceProperties().isLandscape(); + boolean landscapePhoneButtonNav = isPhoneButtonNavMode() && mDeviceProfile.isLandscape; if ((landscapePhoneButtonNav ? mWindowLayoutParams.width : mWindowLayoutParams.height) == size || mIsDestroyed) { return; } if (size == MATCH_PARENT) { - size = mDeviceProfile.getDeviceProperties().getHeightPx(); + size = mDeviceProfile.heightPx; } else { mLastRequestedNonFullscreenSize = size; if (mIsFullscreen || mIsTaskbarSizeFrozenForAnimatingBubble) { @@ -1373,8 +1335,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { ).orElse(0); int taskbarWindowSize; boolean shouldTreatAsTransient = - isTransientTaskbar() || (enableTaskbarPinning() - && mTaskbarFeatureEvaluator.getSupportsTransitionToTransientTaskbar()); + isTransientTaskbar() || (enableTaskbarPinning() && !isThreeButtonNav()); int extraHeightForTaskbarTooltips = enableCursorHoverStates() ? resources.getDimensionPixelSize(R.dimen.arrow_toast_arrow_height) @@ -1389,15 +1350,15 @@ public class TaskbarActivityContext extends BaseTaskbarContext { DeviceProfile transientTaskbarDp = mDeviceProfile.toBuilder(this) .setIsTransientTaskbar(true).build(); - taskbarWindowSize = transientTaskbarDp.getTaskbarProfile().getHeight() - + (2 * transientTaskbarDp.getTaskbarProfile().getBottomMargin()) + taskbarWindowSize = transientTaskbarDp.taskbarHeight + + (2 * transientTaskbarDp.taskbarBottomMargin) + Math.max(extraHeightForTaskbarTooltips, resources.getDimensionPixelSize( R.dimen.transient_taskbar_shadow_blur)); return Math.max(taskbarWindowSize, bubbleBarTop); } - taskbarWindowSize = mDeviceProfile.getTaskbarProfile().getHeight() + taskbarWindowSize = mDeviceProfile.taskbarHeight + getCornerRadius() + extraHeightForTaskbarTooltips; return Math.max(taskbarWindowSize, bubbleBarTop); @@ -1494,28 +1455,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mControllers.uiController.startSplitSelection(splitSelectSource); } - // If in overview, and a desktop task is available, launches the overview desktop task and - // schedules the provided runnable. - // Returns whether the runnable has been posted. - private boolean runAfterLaunchingDesktopTaskIfInOverview( - RecentsView recents, - Runnable runnableToRun) { - if (recents == null || !isTaskbarShowingDesktopTasks() - || !mControllers.uiController.isInOverviewUi()) { - return false; - } - - RunnableList runnableList = recents.launchRunningDesktopTaskView(); - // Wrapping it in runnable so we post after DW is ready for the app - // launch. - if (runnableList == null) { - return false; - } - - runnableList.add(() -> UI_HELPER_EXECUTOR.execute(runnableToRun)); - return true; - } - protected void onTaskbarIconClicked(View view) { TaskbarUIController taskbarUIController = mControllers.uiController; RecentsView recents = taskbarUIController.getRecentsView(); @@ -1527,17 +1466,25 @@ public class TaskbarActivityContext extends BaseTaskbarContext { // TODO: b/316004172, b/343289567: Handle `DesktopTask` and `SplitTask`. if (tag instanceof SingleTask singleTask) { RemoteTransition remoteTransition = - (isTaskbarShowingDesktopTasks() && canUnminimizeDesktopTask( + (isInDesktopMode() && canUnminimizeDesktopTask( singleTask.getTask().key.id)) ? createDesktopAppLaunchRemoteTransition(AppLaunchType.UNMINIMIZE, Cuj.CUJ_DESKTOP_MODE_APP_LAUNCH_FROM_ICON) : null; - Runnable launchTask = () -> handleGroupTaskLaunch(singleTask, remoteTransition, - isTaskbarShowingDesktopTasks(), DesktopTaskToFrontReason.TASKBAR_TAP); - if (!runAfterLaunchingDesktopTaskIfInOverview(recents, launchTask)) { - launchTask.run(); + if (isInDesktopMode() && mControllers.uiController.isInOverviewUi()) { + RunnableList runnableList = recents.launchRunningDesktopTaskView(); + // Wrapping it in runnable so we post after DW is ready for the app + // launch. + if (runnableList != null) { + runnableList.add(() -> UI_HELPER_EXECUTOR.execute( + () -> handleGroupTaskLaunch(singleTask, remoteTransition, + isInDesktopMode(), + DesktopTaskToFrontReason.TASKBAR_TAP))); + } + } else { + handleGroupTaskLaunch(singleTask, remoteTransition, isInDesktopMode(), + DesktopTaskToFrontReason.TASKBAR_TAP); } - mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true); } else if (tag instanceof FolderInfo) { // Tapping an expandable folder icon on Taskbar @@ -1560,12 +1507,24 @@ public class TaskbarActivityContext extends BaseTaskbarContext { AppLaunchType.UNMINIMIZE, Cuj.CUJ_DESKTOP_MODE_APP_LAUNCH_FROM_ICON) : null; - Runnable launchTask = () -> - SystemUiProxy.INSTANCE.get(this).showDesktopApp( - info.getTaskId(), remoteTransition, - DesktopTaskToFrontReason.TASKBAR_TAP); - if (!runAfterLaunchingDesktopTaskIfInOverview(recents, launchTask)) { - UI_HELPER_EXECUTOR.execute(launchTask); + + if (isInDesktopMode() && mControllers.uiController.isInOverviewUi()) { + RunnableList runnableList = recents.launchRunningDesktopTaskView(); + if (runnableList != null) { + runnableList.add(() -> + // wrapped it in runnable here since we need the post for DW to be + // ready. if we don't other DW will be gone and only the launched + // task will show. + UI_HELPER_EXECUTOR.execute(() -> + SystemUiProxy.INSTANCE.get(this).showDesktopApp( + info.getTaskId(), remoteTransition, + DesktopTaskToFrontReason.TASKBAR_TAP))); + } + } else { + UI_HELPER_EXECUTOR.execute(() -> + SystemUiProxy.INSTANCE.get(this).showDesktopApp( + info.getTaskId(), remoteTransition, + DesktopTaskToFrontReason.TASKBAR_TAP)); } mControllers.taskbarStashController.updateAndAnimateTransientTaskbar( @@ -1654,6 +1613,15 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } } + public void handleGroupTaskLaunch( + GroupTask task, + @Nullable RemoteTransition remoteTransition, + boolean onDesktop, + DesktopTaskToFrontReason toFrontReason) { + handleGroupTaskLaunch(task, remoteTransition, onDesktop, toFrontReason, + /* onStartCallback= */ null, /* onFinishCallback= */ null); + } + /** * Launches the given GroupTask with the following behavior: * - If the GroupTask is a DesktopTask, launch the tasks in that Desktop. @@ -1669,18 +1637,26 @@ public class TaskbarActivityContext extends BaseTaskbarContext { GroupTask task, @Nullable RemoteTransition remoteTransition, boolean onDesktop, - DesktopTaskToFrontReason toFrontReason) { + DesktopTaskToFrontReason toFrontReason, + @Nullable Runnable onStartCallback, + @Nullable Runnable onFinishCallback) { if (task instanceof DesktopTask) { - UI_HELPER_EXECUTOR.execute( - () -> SystemUiProxy.INSTANCE.get(this).showDesktopApps(getDisplayId(), + UI_HELPER_EXECUTOR.execute(() -> + SystemUiProxy.INSTANCE.get(this).showDesktopApps(getDisplay().getDisplayId(), remoteTransition)); return; } if (onDesktop && task instanceof SingleTask singleTask) { boolean useRemoteTransition = canUnminimizeDesktopTask(singleTask.getTask().key.id); UI_HELPER_EXECUTOR.execute(() -> { + if (onStartCallback != null) { + onStartCallback.run(); + } SystemUiProxy.INSTANCE.get(this).showDesktopApp(singleTask.getTask().key.id, useRemoteTransition ? remoteTransition : null, toFrontReason); + if (onFinishCallback != null) { + onFinishCallback.run(); + } }); return; } @@ -1740,7 +1716,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { @Nullable View launchingIconView, List itemInfos) { boolean launchedFromExternalDisplay = DesktopExperienceFlags.ENABLE_TASKBAR_CONNECTED_DISPLAYS.isTrue() - && !isPrimaryDisplay(); + && !mIsPrimaryDisplay; if (recents == null && !launchedFromExternalDisplay) { return; } @@ -1805,10 +1781,17 @@ public class TaskbarActivityContext extends BaseTaskbarContext { .launchAppPair((AppPairIcon) launchingIconView, -1 /*cuj*/))); } else { - Runnable launchTask = - () -> startItemInfoActivity(itemInfos.get(0), foundTask); - if (!runAfterLaunchingDesktopTaskIfInOverview(recents, launchTask)) { - launchTask.run(); + if (isInDesktopMode() + && mControllers.uiController.isInOverviewUi()) { + RunnableList runnableList = recents.launchRunningDesktopTaskView(); + // Wrapping it in runnable so we post after DW is ready for the app + // launch. + if (runnableList != null) { + runnableList.add(() -> UI_HELPER_EXECUTOR.execute( + () -> startItemInfoActivity(itemInfos.get(0), foundTask))); + } + } else { + startItemInfoActivity(itemInfos.get(0), foundTask); } } } @@ -1831,7 +1814,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { intent.getComponent(), info.user, intent.getSourceBounds(), null); return; } - int displayId = getDisplayId(); + int displayId = getDisplay() == null ? DEFAULT_DISPLAY : getDisplay().getDisplayId(); // TODO(b/216683257): Use startActivityForResult for search results that require it. if (taskInRecents != null) { // Re launch instance from recents @@ -1844,7 +1827,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext { return; } } - if (shouldLaunchInDesktop(displayId, info)) { + if (isInDesktopMode() + && DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX.isTrue()) { launchDesktopApp(intent, info, displayId); } else { startActivity(intent, null); @@ -1856,21 +1840,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } } - private boolean shouldLaunchInDesktop(int displayId, ItemInfo info) { - if (!DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX.isTrue()) { - return false; - } - if (DesktopExperienceFlags.ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX.isTrue() - && DisplayController.isInDesktopFirstMode(this) - && mControllers.taskbarRecentAppsController.hasSingleTask(info)) { - // Keep the fullscreen mode in desktop-first mode. - return false; - } - // Always launch in freeform if in external display. - return (DesktopExperienceFlags.ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS.isTrue() - && isExternalDisplay(displayId)) || isTaskbarShowingDesktopTasks(); - } - private void launchDesktopApp(Intent intent, ItemInfo info, int displayId) { TaskbarRecentAppsController.TaskState taskState = mControllers.taskbarRecentAppsController.getDesktopItemState(info); @@ -1953,12 +1922,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mControllers.uiController.onSwipeToUnstashTaskbar(); boolean wasStashed = mControllers.taskbarStashController.isStashed(); - if (isTransientTaskbar()) { - mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(/* stash= */ false, - SHOULD_BUBBLES_FOLLOW_DEFAULT_VALUE, delayTaskbarBackground); - } else if (shouldAllowTaskbarToAutoStash()) { - mControllers.taskbarStashController.updateAndAnimatePinnedTaskbar(false); - } + mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(/* stash= */ false, + SHOULD_BUBBLES_FOLLOW_DEFAULT_VALUE, delayTaskbarBackground); boolean isStashed = mControllers.taskbarStashController.isStashed(); if (isStashed != wasStashed) { VibratorWrapper.INSTANCE.get(this).vibrateForTaskbarUnstash(); @@ -2013,13 +1978,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mControllers.taskbarStashController.startUnstashHint(animateForward); } - /** - * @return if we should allow taskbar to auto stash - */ - public boolean shouldAllowTaskbarToAutoStash() { - return mControllers.taskbarStashController.shouldAllowTaskbarToAutoStash(); - } - /** * Enables the auto timeout for taskbar stashing. This method should only be used for taskbar * testing. @@ -2053,18 +2011,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { return mIsUserSetupComplete; } - /** - * Checks if the simple view mode is enabled. - * - * Since Simple View puts the device in 3 button nav mode, we use that as a precursor to - * checking the actual value in Settings to avoid extra calls to Settings. - */ - public boolean isSimpleViewEnabled() { - return isThreeButtonNav() - && Settings.Secure.getInt(getContentResolver(), SIMPLE_VIEW_SETTINGS_KEY, 0) - > 0; - } - public boolean isNavBarKidsModeActive() { return mIsNavBarKidsMode && isThreeButtonNav(); } @@ -2117,6 +2063,31 @@ public class TaskbarActivityContext extends BaseTaskbarContext { return AnimatorPlaybackController.wrap(fullAnimation, duration); } + /** + * Called when we determine the touchable region. + * + * @param exclude {@code true} then the magnification region computation will omit the window. + */ + public void excludeFromMagnificationRegion(boolean exclude) { + if (mIsExcludeFromMagnificationRegion == exclude || isPhoneMode()) { + return; + } + + if (removeExcludeFromScreenMagnificationFlagUsage()) { + return; + } + + mIsExcludeFromMagnificationRegion = exclude; + if (exclude) { + mWindowLayoutParams.privateFlags |= + WindowManager.LayoutParams.PRIVATE_FLAG_EXCLUDE_FROM_SCREEN_MAGNIFICATION; + } else { + mWindowLayoutParams.privateFlags &= + ~WindowManager.LayoutParams.PRIVATE_FLAG_EXCLUDE_FROM_SCREEN_MAGNIFICATION; + } + notifyUpdateLayoutParams(); + } + void notifyUpdateLayoutParams() { if (mDragLayer.isAttachedToWindow()) { // Copy the current windowLayoutParams to mLastUpdatedLayoutParams and compare the diff. diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java index 03eef098dc..22796087e4 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java @@ -53,8 +53,6 @@ public class TaskbarAutohideSuspendController implements public static final int FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN = 1 << 7; // User has taskbar overflow open. public static final int FLAG_AUTOHIDE_SUSPEND_TASKBAR_OVERFLOW = 1 << 8; - // Growth Framework nudge overlay is open above the Taskbar. - public static final int FLAG_AUTOHIDE_SUSPEND_GROWTH_NUDGE_OPEN = 1 << 9; @IntDef(flag = true, value = { FLAG_AUTOHIDE_SUSPEND_FULLSCREEN, @@ -66,7 +64,6 @@ public class TaskbarAutohideSuspendController implements FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN, FLAG_AUTOHIDE_SUSPEND_TASKBAR_OVERFLOW, - FLAG_AUTOHIDE_SUSPEND_GROWTH_NUDGE_OPEN, }) @Retention(RetentionPolicy.SOURCE) public @interface AutohideSuspendFlag { @@ -151,8 +148,6 @@ public class TaskbarAutohideSuspendController implements "FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN"); appendFlag(str, flags, FLAG_AUTOHIDE_SUSPEND_TASKBAR_OVERFLOW, "FLAG_AUTOHIDE_SUSPEND_TASKBAR_OVERFLOW"); - appendFlag(str, flags, FLAG_AUTOHIDE_SUSPEND_GROWTH_NUDGE_OPEN, - "FLAG_AUTOHIDE_SUSPEND_GROWTH_NUDGE_OPEN"); return str.toString(); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt index bd33177bfa..5e02d81035 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt @@ -23,7 +23,6 @@ import android.graphics.Paint import android.graphics.Path import android.graphics.RectF import com.android.app.animation.Interpolators -import com.android.launcher3.Flags import com.android.launcher3.R import com.android.launcher3.Utilities import com.android.launcher3.Utilities.mapRange @@ -31,7 +30,6 @@ import com.android.launcher3.Utilities.mapToRange import com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound import com.android.launcher3.taskbar.TaskbarPinningController.Companion.PINNING_PERSISTENT import com.android.launcher3.taskbar.TaskbarPinningController.Companion.PINNING_TRANSIENT -import com.android.launcher3.taskbar.Utilities.getShapedTaskbarRadius import kotlin.math.min /** Helps draw the taskbar background, made up of a rectangle plus two inverted rounded corners. */ @@ -40,9 +38,9 @@ class TaskbarBackgroundRenderer(private val context: TaskbarActivityContext) { private val isInSetup: Boolean = !context.isUserSetupComplete private val maxTransientTaskbarHeight = - context.transientTaskbarDeviceProfile.taskbarProfile.height.toFloat() + context.transientTaskbarDeviceProfile.taskbarHeight.toFloat() private val maxPersistentTaskbarHeight = - context.persistentTaskbarDeviceProfile.taskbarProfile.height.toFloat() + context.persistentTaskbarDeviceProfile.taskbarHeight.toFloat() var backgroundProgress = if (context.isTransientTaskbar) { PINNING_TRANSIENT @@ -57,7 +55,7 @@ class TaskbarBackgroundRenderer(private val context: TaskbarActivityContext) { val paint = Paint() private val strokePaint = Paint() val lastDrawnTransientRect = RectF() - var backgroundHeight = context.deviceProfile.taskbarProfile.height.toFloat() + var backgroundHeight = context.deviceProfile.taskbarHeight.toFloat() var translationYForSwipe = 0f var translationYForStash = 0f var translationXForBubbleBar = 0f @@ -224,12 +222,7 @@ class TaskbarBackgroundRenderer(private val context: TaskbarActivityContext) { val newWidth = mapRange(progress, backgroundWidthWhileAnimating, fullWidth.toFloat()) val halfWidthDelta = (fullWidth - newWidth) / 2f - val radius = - if (Flags.enableLauncherIconShapes()) { - getShapedTaskbarRadius(context) - } else { - newBackgroundHeight / 2f - } + val radius = newBackgroundHeight / 2f val bottomMarginProgress = bottomMargin * ((1f - progress) / 2f) // Aligns the bottom with the bottom of the stashed handle. diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index f24bd28330..9e15a60ed1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -69,7 +69,6 @@ public class TaskbarControllers { public final Optional bubbleControllers; public final TaskbarDesktopModeController taskbarDesktopModeController; public final NudgeController nudgeController; - public final NudgeViewController nudgeViewController; @Nullable private LoggableTaskbarController[] mControllersToLog = null; @Nullable private BackgroundRendererController[] mBackgroundRendererControllers = null; @@ -119,8 +118,7 @@ public class TaskbarControllers { TaskbarPinningController taskbarPinningController, Optional bubbleControllers, TaskbarDesktopModeController taskbarDesktopModeController, - NudgeController nudgeController, - NudgeViewController nudgeViewController) { + NudgeController nudgeController) { this.taskbarActivityContext = taskbarActivityContext; this.taskbarDragController = taskbarDragController; this.navButtonController = navButtonController; @@ -149,7 +147,6 @@ public class TaskbarControllers { this.bubbleControllers = bubbleControllers; this.taskbarDesktopModeController = taskbarDesktopModeController; this.nudgeController = nudgeController; - this.nudgeViewController = nudgeViewController; } /** @@ -177,11 +174,10 @@ public class TaskbarControllers { taskbarOverlayController.init(this); taskbarAllAppsController.init(this, sharedState.allAppsVisible); navButtonController.init(this); - bubbleControllers.ifPresentOrElse(controllers -> controllers.init(sharedState, this), - sharedState::clearBubbleData); + bubbleControllers.ifPresent(controllers -> controllers.init(sharedState, this)); taskbarInsetsController.init(this); voiceInteractionWindowController.init(this); - taskbarRecentAppsController.init(this, sharedState.recentTasksBeforeTaskbarRecreate); + taskbarRecentAppsController.init(this); taskbarTranslationController.init(this); taskbarEduTooltipController.init(this); keyboardQuickSwitchController.init(this); @@ -249,7 +245,6 @@ public class TaskbarControllers { }, () -> uiController.onBubbleBarLocationUpdated(null)); // Notify that the ui controller has changed navbarButtonsViewController.onUiControllerChanged(); - taskbarViewController.onUiControllerChanged(); } @Nullable @@ -269,6 +264,7 @@ public class TaskbarControllers { */ public void onDestroy() { mAreAllControllersInitialized = false; + mSharedState = null; taskbarDragController.onDestroy(); navbarButtonsViewController.onDestroy(); @@ -278,7 +274,6 @@ public class TaskbarControllers { taskbarUnfoldAnimationController.onDestroy(); taskbarViewController.onDestroy(); stashedHandleViewController.onDestroy(); - nudgeViewController.onDestroy(); taskbarAutohideSuspendController.onDestroy(); taskbarPopupController.onDestroy(); taskbarForceVisibleImmersiveController.onDestroy(); @@ -294,7 +289,6 @@ public class TaskbarControllers { taskbarDesktopModeController.onDestroy(); mControllersToLog = null; mBackgroundRendererControllers = null; - mSharedState = null; } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt index ab502451ac..e96e67dfbc 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt @@ -16,21 +16,19 @@ package com.android.launcher3.taskbar +import android.content.Context import com.android.launcher3.statehandlers.DesktopVisibilityController import com.android.launcher3.statehandlers.DesktopVisibilityController.TaskbarDesktopModeListener import com.android.launcher3.taskbar.TaskbarBackgroundRenderer.Companion.MAX_ROUNDNESS /** Handles Taskbar in Desktop Windowing mode. */ class TaskbarDesktopModeController( - private val taskbarActivityContext: TaskbarActivityContext, + private val context: Context, private val desktopVisibilityController: DesktopVisibilityController, ) : TaskbarDesktopModeListener { private lateinit var taskbarControllers: TaskbarControllers private lateinit var taskbarSharedState: TaskbarSharedState - val isLauncherAnimationRunning: Boolean - get() = desktopVisibilityController.launcherAnimationRunning - fun init(controllers: TaskbarControllers, sharedState: TaskbarSharedState) { taskbarControllers = controllers taskbarSharedState = sharedState @@ -50,13 +48,10 @@ class TaskbarDesktopModeController( } fun shouldShowDesktopTasksInTaskbar(): Boolean { - return shouldShowDesktopTasksInTaskbar(taskbarActivityContext.displayId) - } - - fun shouldShowDesktopTasksInTaskbar(displayId: Int): Boolean { - return isInDesktopMode(displayId) || - taskbarActivityContext.showDesktopTaskbarForFreeformDisplay() || - (taskbarActivityContext.showLockedTaskbarOnHome() && + val activityContext = taskbarControllers.taskbarActivityContext + return isInDesktopMode(context.displayId) || + activityContext.showDesktopTaskbarForFreeformDisplay() || + (activityContext.showLockedTaskbarOnHome() && taskbarControllers.taskbarStashController.isOnHome) } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDividerPopupView.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarDividerPopupView.kt index 3ae06abea4..b66344413f 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDividerPopupView.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDividerPopupView.kt @@ -29,17 +29,14 @@ import android.view.MotionEvent import android.view.View import android.widget.LinearLayout import android.widget.Switch -import androidx.core.content.res.ResourcesCompat import androidx.core.view.postDelayed import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE import com.android.launcher3.Flags -import com.android.launcher3.LauncherPrefs import com.android.launcher3.R import com.android.launcher3.popup.ArrowPopup import com.android.launcher3.popup.RoundedArrowDrawable import com.android.launcher3.util.Themes import com.android.launcher3.views.ActivityContext -import com.android.wm.shell.Flags.enableGsf import kotlin.math.max import kotlin.math.min @@ -82,13 +79,8 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 private val minPaddingFromScreenEdge = resources.getDimension(R.dimen.taskbar_pinning_popup_menu_min_padding_from_screen_edge) - private var alwaysShowTaskbarOn = - if (taskbarActivityContext.isTaskbarShowingDesktopTasks) { - LauncherPrefs.TASKBAR_PINNING_IN_DESKTOP_MODE.get(context) - } else { - !taskbarActivityContext.isTransientTaskbar - } - + // TODO: add test for isTransientTaskbar & long presses divider and ensures the popup shows up. + private var alwaysShowTaskbarOn = !taskbarActivityContext.isTransientTaskbar private var didPreferenceChange = false private var verticalOffsetForPopupView = resources.getDimensionPixelSize(R.dimen.taskbar_pinning_popup_menu_vertical_margin) @@ -117,15 +109,6 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 val alwaysShowTaskbarSwitch = requireViewById(R.id.taskbar_pinning_switch) val taskbarVisibilityIcon = requireViewById(R.id.taskbar_pinning_visibility_icon) - if (enableGsf()) { - taskbarVisibilityIcon.background = - ResourcesCompat.getDrawable( - context.resources, - R.drawable.ic_visibility_filled, - context.theme, - ) - } - alwaysShowTaskbarSwitch.isChecked = alwaysShowTaskbarOn alwaysShowTaskbarSwitch.setOnTouchListener { view, event -> (view.parent as View).onTouchEvent(event) @@ -267,8 +250,8 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 } override fun getExtraVerticalOffset(): Int { - return (mActivityContext.deviceProfile.taskbarProfile.height - - mActivityContext.deviceProfile.taskbarProfile.iconSize) / 2 + verticalOffsetForPopupView + return (mActivityContext.deviceProfile.taskbarHeight - + mActivityContext.deviceProfile.taskbarIconSize) / 2 + verticalOffsetForPopupView } override fun onCreateCloseAnimation(anim: AnimatorSet?) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index eac264736e..4b977e0d23 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -18,7 +18,7 @@ package com.android.launcher3.taskbar; import static com.android.app.animation.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.AbstractFloatingView.TYPE_TASKBAR_ALL_APPS; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS; -import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS_PREDICTION; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_PREDICTION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_SEARCH_ACTION; import static com.android.launcher3.logger.LauncherAtom.ContainerInfo.ContainerCase.EXTENDED_CONTAINERS; @@ -131,14 +131,14 @@ public class TaskbarDragController extends DragController im public void init(TaskbarControllers controllers) { mControllers = controllers; - mControllers.runAfterInit(() -> mControllers.bubbleControllers.ifPresent( - c -> c.dragToBubbleController.addBubbleBarDropTargets(this))); + mControllers.bubbleControllers.ifPresent( + c -> c.bubbleBarViewController.addBubbleBarDropTargets(this)); } /** Called when the controller is destroyed. */ public void onDestroy() { mControllers.bubbleControllers.ifPresent( - c -> c.dragToBubbleController.removeBubbleBarDropTargets(this)); + c -> c.bubbleBarViewController.removeBubbleBarDropTargets(this)); } public void setDisallowGlobalDrag(boolean disallowGlobalDrag) { @@ -685,7 +685,7 @@ public class TaskbarDragController extends DragController im if (tag instanceof ItemInfo) { ItemInfo item = (ItemInfo) tag; if (item.container == CONTAINER_ALL_APPS - || item.container == CONTAINER_ALL_APPS_PREDICTION + || item.container == CONTAINER_PREDICTION || isInSearchResultContainer(item)) { if (mDisallowGlobalDrag) { // We're dragging in taskbarAllApps, we don't have folders or shortcuts diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java index 5fedee6a8d..f32569b32c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java @@ -127,7 +127,6 @@ public class TaskbarDragLayer extends BaseDragLayer { @Override public void recreateControllers() { - super.recreateControllers(); mControllers = mControllerCallbacks.getTouchControllers(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java index 8bd685b3d6..1e193f6817 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java @@ -163,14 +163,9 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa * @return Bounds (in TaskbarDragLayer coordinates) where an opened Folder can display. */ public Rect getFolderBoundingBox() { - Rect boundingBox = new Rect( - 0, - 0, - mTaskbarDragLayer.getWidth(), - mTaskbarDragLayer.getHeight() - - mActivity.getDeviceProfile().getTaskbarProfile().getHeight() - - mActivity.getDeviceProfile().getTaskbarProfile().getBottomMargin() - ); + Rect boundingBox = new Rect(0, 0, mTaskbarDragLayer.getWidth(), + mTaskbarDragLayer.getHeight() - mActivity.getDeviceProfile().taskbarHeight + - mActivity.getDeviceProfile().taskbarBottomMargin); boundingBox.inset(mFolderMargin, mFolderMargin); return boundingBox; } @@ -220,7 +215,7 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa } private void updateBackgroundAlpha() { - if (!mActivity.drawsTaskbarBackground() || mActivity.isDestroyed()) { + if (mActivity.isPhoneMode() || mActivity.isDestroyed()) { return; } @@ -357,7 +352,7 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa deviceProfile.getDisplayInfo().currentSize.y : taskbarDimensions.y; } else { - return deviceProfile.getTaskbarProfile().getHeight(); + return deviceProfile.taskbarHeight; } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt index eb2d1d98d1..4cfa0ea492 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt @@ -87,8 +87,8 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 // constraint to reduce the number of lines of text and hopefully free up some height. activityContext.dragLayer.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED) if ( - measuredHeight + activityContext.deviceProfile.taskbarProfile.height >= - activityContext.deviceProfile.deviceProperties.availableHeightPx + measuredHeight + activityContext.deviceProfile.taskbarHeight >= + activityContext.deviceProfile.availableHeightPx ) { updateLayoutParams { width = MATCH_PARENT } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt index 9a120f5611..038e374a64 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt @@ -168,8 +168,6 @@ open class TaskbarEduTooltipController(context: Context) : FontFamily.GSF_HEADLINE_SMALL_EMPHASIZED, ) val swipeAnimation = requireViewById(R.id.swipe_animation) - swipeAnimation.contentDescription = - context.getString(R.string.taskbar_edu_swipe_animation_description) swipeAnimation.supportLightTheme() handleEduAnimations(listOf(swipeAnimation)) show() @@ -194,14 +192,8 @@ open class TaskbarEduTooltipController(context: Context) : tooltip?.run { allowTouchDismissal = false val splitscreenAnim = requireViewById(R.id.splitscreen_animation) - splitscreenAnim.contentDescription = - context.getString(R.string.taskbar_edu_split_screen_animation_description) val suggestionsAnim = requireViewById(R.id.suggestions_animation) - suggestionsAnim.contentDescription = - context.getString(R.string.taskbar_edu_suggested_app_animation_description) val pinningAnim = requireViewById(R.id.pinning_animation) - pinningAnim.contentDescription = - context.getString(R.string.taskbar_edu_pinning_animation_description) val pinningEdu = requireViewById(R.id.pinning_edu) splitscreenAnim.supportLightTheme() suggestionsAnim.supportLightTheme() @@ -245,7 +237,7 @@ open class TaskbarEduTooltipController(context: Context) : else R.dimen.taskbar_edu_features_tooltip_width_with_two_features ) - bottomMargin += activityContext.deviceProfile.taskbarProfile.height + bottomMargin += activityContext.deviceProfile.taskbarHeight } else { width = resources.getDimensionPixelSize( @@ -293,13 +285,11 @@ open class TaskbarEduTooltipController(context: Context) : val pinningAnim = requireViewById(R.id.standalone_pinning_animation) - pinningAnim.contentDescription = - context.getString(R.string.taskbar_edu_pinning_animation_description) pinningAnim.supportLightTheme() handleEduAnimations(listOf(pinningAnim)) updateLayoutParams { if (activityContext.isTransientTaskbar) { - bottomMargin += activityContext.deviceProfile.taskbarProfile.height + bottomMargin += activityContext.deviceProfile.taskbarHeight } // Unlike other tooltips, we want to align with taskbar divider rather than center. gravity = Gravity.BOTTOM @@ -341,8 +331,6 @@ open class TaskbarEduTooltipController(context: Context) : tooltip?.run { allowTouchDismissal = true val searchEdu = requireViewById(R.id.search_edu_animation) - searchEdu.contentDescription = - context.getString(R.string.taskbar_edu_suggested_search_animation_description) searchEdu.supportLightTheme() handleEduAnimations(listOf(searchEdu)) val eduSubtitle: TextView = requireViewById(R.id.search_edu_text) @@ -356,7 +344,7 @@ open class TaskbarEduTooltipController(context: Context) : showDisclosureText(eduSubtitle) updateLayoutParams { if (activityContext.isTransientTaskbar) { - bottomMargin += activityContext.deviceProfile.taskbarProfile.height + bottomMargin += activityContext.deviceProfile.taskbarHeight } // Unlike other tooltips, we want to align with the all apps button rather than // center. diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java index 42ad5b2aa1..76489e0fa1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java @@ -26,7 +26,6 @@ import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLA import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.graphics.Rect; -import android.text.TextUtils; import android.view.ContextThemeWrapper; import android.view.MotionEvent; import android.view.View; @@ -51,6 +50,7 @@ public class TaskbarHoverToolTipController implements View.OnHoverListener { private final TaskbarView mTaskbarView; private final View mHoverView; private final ArrowTipView mHoverToolTipView; + private final String mToolTipText; private final int mYOffset; public TaskbarHoverToolTipController(TaskbarActivityContext activity, TaskbarView taskbarView, @@ -59,6 +59,17 @@ public class TaskbarHoverToolTipController implements View.OnHoverListener { mTaskbarView = taskbarView; mHoverView = hoverView; + if (mHoverView instanceof BubbleTextView) { + mToolTipText = ((BubbleTextView) mHoverView).getText().toString(); + } else if (mHoverView instanceof FolderIcon + && ((FolderIcon) mHoverView).mInfo.title != null) { + mToolTipText = ((FolderIcon) mHoverView).mInfo.title.toString(); + } else if (mHoverView instanceof AppPairIcon) { + mToolTipText = ((AppPairIcon) mHoverView).getTitleTextView().getText().toString(); + } else { + mToolTipText = null; + } + ContextThemeWrapper arrowContextWrapper = new ContextThemeWrapper(mActivity, R.style.ArrowTipTaskbarStyle); mHoverToolTipView = new ArrowTipView(arrowContextWrapper, /* isPointingUp = */ false, @@ -100,15 +111,9 @@ public class TaskbarHoverToolTipController implements View.OnHoverListener { } private void maybeRevealHoverToolTip() { - if (mHoverView == null) { + if (mHoverView == null || mToolTipText == null) { return; } - - final String toolTipText = getToolTipText(); - if (TextUtils.isEmpty(toolTipText)) { - return; - } - // Do not show tooltip if taskbar icons are transitioning to hotseat. if (mActivity.isIconAlignedWithHotseat()) { return; @@ -123,21 +128,7 @@ public class TaskbarHoverToolTipController implements View.OnHoverListener { } Rect iconViewBounds = Utilities.getViewBounds(mHoverView); - mHoverToolTipView.showAtLocation(toolTipText, iconViewBounds.centerX(), + mHoverToolTipView.showAtLocation(mToolTipText, iconViewBounds.centerX(), mTaskbarView.getTop() - mYOffset, /* shouldAutoClose= */ false); } - - private String getToolTipText() { - if (mHoverView instanceof BubbleTextView btv) { - return btv.getText().toString(); - } else if (mHoverView instanceof FolderIcon icon && icon.mInfo.title != null) { - return icon.mInfo.title.toString(); - } else if (mHoverView instanceof AppPairIcon icon) { - return icon.getTitleTextView().getText().toString(); - } else if (mHoverView instanceof TaskbarOverflowView icon) { - return icon.getTextForTooltipPopup(); - } else { - return null; - } - } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt index c07ae1d5b3..cc6cc645f5 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt @@ -32,10 +32,8 @@ import android.view.InsetsSource.FLAG_INSETS_ROUNDED_CORNER import android.view.InsetsSource.FLAG_SUPPRESS_SCRIM import android.view.Surface import android.view.ViewTreeObserver -import android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT import android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME import android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION -import android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE import android.view.WindowInsets import android.view.WindowInsets.Type.mandatorySystemGestures import android.view.WindowInsets.Type.navigationBars @@ -44,9 +42,7 @@ import android.view.WindowInsets.Type.tappableElement import android.view.WindowManager import android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD import android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION -import androidx.annotation.VisibleForTesting import androidx.core.graphics.toRegion - import com.android.internal.policy.GestureNavigationSettingsObserver import com.android.launcher3.DeviceProfile import com.android.launcher3.R @@ -54,14 +50,6 @@ import com.android.launcher3.anim.AlphaUpdateListener import com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION import com.android.launcher3.config.FeatureFlags.enableTaskbarNoRecreate import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController -import com.android.launcher3.taskbar.TaskbarInsetsController.DebugTouchableRegion.Companion.DEFAULT_TOUCH_REGION -import com.android.launcher3.taskbar.TaskbarInsetsController.DebugTouchableRegion.Companion.DRAG_LAYER_INVISIBLE -import com.android.launcher3.taskbar.TaskbarInsetsController.DebugTouchableRegion.Companion.FULLSCREEN_TASKBAR_WINDOW -import com.android.launcher3.taskbar.TaskbarInsetsController.DebugTouchableRegion.Companion.ICONS_INVISIBLE -import com.android.launcher3.taskbar.TaskbarInsetsController.DebugTouchableRegion.Companion.PHONE_MODE -import com.android.launcher3.taskbar.TaskbarInsetsController.DebugTouchableRegion.Companion.SYSTEM_DRAG_IN_PROGRESS -import com.android.launcher3.taskbar.TaskbarInsetsController.DebugTouchableRegion.Companion.TRANSIENT_IN_OVERVIEW -import com.android.launcher3.taskbar.TaskbarInsetsController.DebugTouchableRegion.Companion.UI_CONTROLLER_UNTOUCHABLE import com.android.launcher3.testing.shared.ResourceUtils import com.android.launcher3.util.Executors import java.io.PrintWriter @@ -73,7 +61,6 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas companion object { private const val INDEX_LEFT = 0 private const val INDEX_RIGHT = 1 - private const val TAG = "TaskbarInsetsController" private fun Region.addBoundsToRegion(bounds: Rect?) { bounds?.let { op(it, Region.Op.UNION) } @@ -95,7 +82,7 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas context, this::onTaskbarOrBubblebarWindowHeightOrInsetsChanged, ) - @VisibleForTesting val debugTouchableRegion = DebugTouchableRegion() + private val debugTouchableRegion = DebugTouchableRegion() // Initialized in init. private lateinit var controllers: TaskbarControllers @@ -116,81 +103,76 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas } fun onTaskbarOrBubblebarWindowHeightOrInsetsChanged() { - val taskbarStashController = controllers.taskbarStashController - val tappableHeight = taskbarStashController.tappableHeightToReportToApps - // We only report tappableElement height for unstashed, persistent taskbar, - // which is also when we draw the rounded corners above taskbar on tablets. - val insetsRoundedCornerFlag = - if (tappableHeight > 0 && context.drawsTaskbarBackground()) { - FLAG_INSETS_ROUNDED_CORNER - } else { - 0 - } - - windowLayoutParams.providedInsets = - if (enableTaskbarNoRecreate() && controllers.sharedState != null) { - getProvidedInsets( - controllers.sharedState!!.insetsFrameProviders, - insetsRoundedCornerFlag, - ) - } else { - getProvidedInsets(insetsRoundedCornerFlag) - } - - if (windowLayoutParams.paramsForRotation != null) { - for (layoutParams in windowLayoutParams.paramsForRotation) { - layoutParams.providedInsets = getProvidedInsets(insetsRoundedCornerFlag) - } + val taskbarStashController = controllers.taskbarStashController + val tappableHeight = taskbarStashController.tappableHeightToReportToApps + // We only report tappableElement height for unstashed, persistent taskbar, + // which is also when we draw the rounded corners above taskbar. + val insetsRoundedCornerFlag = + if (tappableHeight > 0) { + FLAG_INSETS_ROUNDED_CORNER + } else { + 0 } - val bubbleControllers = controllers.bubbleControllers.getOrNull() - val taskbarTouchableHeight = taskbarStashController.touchableHeight - val bubblesTouchableHeight = - bubbleControllers?.bubbleStashController?.getTouchableHeight() ?: 0 - // reset touch bounds - defaultTouchableRegion.setEmpty() - if (bubbleControllers != null) { - val bubbleBarViewController = bubbleControllers.bubbleBarViewController - val isBubbleBarVisible = - bubbleControllers.bubbleStashController.isBubbleBarVisible() - val isAnimatingNewBubble = bubbleBarViewController.isAnimatingNewBubble - // if bubble bar is visible or animating new bubble, add bar bounds to the touch - // region - if (isBubbleBarVisible || isAnimatingNewBubble) { - defaultTouchableRegion.addBoundsToRegion( - bubbleBarViewController.bubbleBarBounds - ) - defaultTouchableRegion.addBoundsToRegion(bubbleBarViewController.flyoutBounds) - } - } - if ( - taskbarStashController.isInApp || - controllers.uiController.isInOverviewUi || - context.showLockedTaskbarOnHome() - ) { - // only add the taskbar touch region if not on home - val bottom = windowLayoutParams.height - val top = bottom - taskbarTouchableHeight - val right = context.deviceProfile.deviceProperties.widthPx - defaultTouchableRegion.addBoundsToRegion(Rect(/* left= */ 0, top, right, bottom)) + windowLayoutParams.providedInsets = + if (enableTaskbarNoRecreate() && controllers.sharedState != null) { + getProvidedInsets( + controllers.sharedState!!.insetsFrameProviders, + insetsRoundedCornerFlag, + ) + } else { + getProvidedInsets(insetsRoundedCornerFlag) } - // Pre-calculate insets for different providers across different rotations for this - // gravity - for (rotation in Surface.ROTATION_0..Surface.ROTATION_270) { - // Add insets for navbar rotated params - val layoutParams = windowLayoutParams.paramsForRotation[rotation] - for (provider in layoutParams.providedInsets) { - setProviderInsets(provider, layoutParams.gravity, rotation) - } + if (windowLayoutParams.paramsForRotation != null) { + for (layoutParams in windowLayoutParams.paramsForRotation) { + layoutParams.providedInsets = getProvidedInsets(insetsRoundedCornerFlag) } - // Also set the parent providers (i.e. not in paramsForRotation). - for (provider in windowLayoutParams.providedInsets) { - setProviderInsets(provider, windowLayoutParams.gravity, context.display.rotation) - } - context.notifyUpdateLayoutParams() } + val bubbleControllers = controllers.bubbleControllers.getOrNull() + val taskbarTouchableHeight = taskbarStashController.touchableHeight + val bubblesTouchableHeight = + bubbleControllers?.bubbleStashController?.getTouchableHeight() ?: 0 + // reset touch bounds + defaultTouchableRegion.setEmpty() + if (bubbleControllers != null) { + val bubbleBarViewController = bubbleControllers.bubbleBarViewController + val isBubbleBarVisible = bubbleControllers.bubbleStashController.isBubbleBarVisible() + val isAnimatingNewBubble = bubbleBarViewController.isAnimatingNewBubble + // if bubble bar is visible or animating new bubble, add bar bounds to the touch region + if (isBubbleBarVisible || isAnimatingNewBubble) { + defaultTouchableRegion.addBoundsToRegion(bubbleBarViewController.bubbleBarBounds) + defaultTouchableRegion.addBoundsToRegion(bubbleBarViewController.flyoutBounds) + } + } + if ( + taskbarStashController.isInApp || + controllers.uiController.isInOverviewUi || + context.showLockedTaskbarOnHome() + ) { + // only add the taskbar touch region if not on home + val bottom = windowLayoutParams.height + val top = bottom - taskbarTouchableHeight + val right = context.deviceProfile.widthPx + defaultTouchableRegion.addBoundsToRegion(Rect(/* left= */ 0, top, right, bottom)) + } + + // Pre-calculate insets for different providers across different rotations for this gravity + for (rotation in Surface.ROTATION_0..Surface.ROTATION_270) { + // Add insets for navbar rotated params + val layoutParams = windowLayoutParams.paramsForRotation[rotation] + for (provider in layoutParams.providedInsets) { + setProviderInsets(provider, layoutParams.gravity, rotation) + } + } + // Also set the parent providers (i.e. not in paramsForRotation). + for (provider in windowLayoutParams.providedInsets) { + setProviderInsets(provider, windowLayoutParams.gravity, context.display.rotation) + } + context.notifyUpdateLayoutParams() + } + /** * This is for when ENABLE_TASKBAR_NO_RECREATION is enabled. We generate one instance of * providedInsets and use it across the entire lifecycle of TaskbarManager. The only thing we @@ -305,7 +287,7 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas ) if ( (context.isGestureNav || ENABLE_TASKBAR_NAVBAR_UNIFICATION) && - provider.type == tappableElement() + provider.type == tappableElement() ) { provider.insetsSizeOverrides = insetsSizeOverrideForTappableElement } else if (provider.type != systemGestures()) { @@ -362,10 +344,10 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas */ fun updateInsetsTouchability(insetsInfo: ViewTreeObserver.InternalInsetsInfo) { insetsInfo.touchableRegion.setEmpty() - val touchableInsets: Int val bubbleBarVisible = controllers.bubbleControllers.isPresent && controllers.bubbleControllers.get().bubbleBarViewController.isBubbleBarVisible() + var insetsIsTouchableRegion = true // Prevents the taskbar from taking touches and conflicting with setup wizard if ( context.isPhoneButtonNavMode && @@ -373,24 +355,34 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas (!controllers.navbarButtonsViewController.isImeVisible || !controllers.navbarButtonsViewController.isImeRenderingNavButtons) ) { - touchableInsets = TOUCHABLE_INSETS_FRAME - debugTouchableRegion.lastSetTouchableReason = PHONE_MODE + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_FRAME) + insetsIsTouchableRegion = false + debugTouchableRegion.lastSetTouchableReason = + "Phone button nav mode: Fullscreen touchable, IME not affecting nav buttons" } else if (context.dragLayer.alpha < AlphaUpdateListener.ALPHA_CUTOFF_THRESHOLD) { // Let touches pass through us. - touchableInsets = TOUCHABLE_INSETS_REGION - debugTouchableRegion.lastSetTouchableReason = DRAG_LAYER_INVISIBLE + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION) + debugTouchableRegion.lastSetTouchableReason = "Taskbar is invisible" + } else if ( + controllers.navbarButtonsViewController.isImeVisible && + controllers.taskbarStashController.isStashed + ) { + // Let touches pass through us. + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION) + debugTouchableRegion.lastSetTouchableReason = "Stashed over IME" } else if (!controllers.uiController.isTaskbarTouchable) { // Let touches pass through us. - touchableInsets = TOUCHABLE_INSETS_REGION - debugTouchableRegion.lastSetTouchableReason = UI_CONTROLLER_UNTOUCHABLE + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION) + debugTouchableRegion.lastSetTouchableReason = "Taskbar is not touchable" } else if (controllers.taskbarDragController.isSystemDragInProgress) { // Let touches pass through us. - touchableInsets = TOUCHABLE_INSETS_REGION - debugTouchableRegion.lastSetTouchableReason = SYSTEM_DRAG_IN_PROGRESS + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION) + debugTouchableRegion.lastSetTouchableReason = "System drag is in progress" } else if (context.isTaskbarWindowFullscreen) { // Intercept entire fullscreen window. - touchableInsets = TOUCHABLE_INSETS_FRAME - debugTouchableRegion.lastSetTouchableReason = FULLSCREEN_TASKBAR_WINDOW + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_FRAME) + insetsIsTouchableRegion = false + debugTouchableRegion.lastSetTouchableReason = "Taskbar is fullscreen" context.dragLayer.getBoundsInWindow(debugTouchableRegion.lastSetTouchableBounds, false) } else if ( controllers.taskbarViewController.areIconsVisible() || @@ -417,27 +409,27 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas region.addBoundsToRegion(bubbleBarBounds) } insetsInfo.touchableRegion.set(region) - debugTouchableRegion.lastSetTouchableReason = TRANSIENT_IN_OVERVIEW + debugTouchableRegion.lastSetTouchableReason = "Transient Taskbar is in Overview" debugTouchableRegion.lastSetTouchableBounds.set(region.bounds) } else { insetsInfo.touchableRegion.set(defaultTouchableRegion) - debugTouchableRegion.lastSetTouchableReason = DEFAULT_TOUCH_REGION + debugTouchableRegion.lastSetTouchableReason = "Using default touchable region" debugTouchableRegion.lastSetTouchableBounds.set(defaultTouchableRegion.bounds) } - touchableInsets = TOUCHABLE_INSETS_REGION + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION) + insetsIsTouchableRegion = false } else { - touchableInsets = TOUCHABLE_INSETS_REGION - debugTouchableRegion.lastSetTouchableReason = ICONS_INVISIBLE + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION) + debugTouchableRegion.lastSetTouchableReason = + "Icons are not visible, but other components such as 3 buttons might be" } // Always have nav buttons be touchable controllers.navbarButtonsViewController.addVisibleButtonsRegion( context.dragLayer, insetsInfo.touchableRegion, ) - - insetsInfo.setTouchableInsets(touchableInsets) - debugTouchableRegion.lastSetTouchableInsets = touchableInsets debugTouchableRegion.lastSetTouchableBounds.set(insetsInfo.touchableRegion.bounds) + context.excludeFromMagnificationRegion(insetsIsTouchableRegion) } /** Draws the last set touchableRegion as a red rectangle onto the given Canvas. */ @@ -468,42 +460,12 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas } pw.println() } - pw.println("$prefix\tdebugTouchableRegion=$debugTouchableRegion") + pw.println("$prefix\tlastSetTouchableBounds=${debugTouchableRegion.lastSetTouchableBounds}") + pw.println("$prefix\tlastSetTouchableReason=${debugTouchableRegion.lastSetTouchableReason}") } class DebugTouchableRegion { - - companion object { - const val PHONE_MODE = - "Phone button nav mode: Fullscreen touchable, IME not affecting nav buttons" - const val DRAG_LAYER_INVISIBLE = "Taskbar is invisible" - const val UI_CONTROLLER_UNTOUCHABLE = "Taskbar is not touchable" - const val SYSTEM_DRAG_IN_PROGRESS = "System drag is in progress" - const val FULLSCREEN_TASKBAR_WINDOW = "Taskbar is fullscreen" - const val TRANSIENT_IN_OVERVIEW = "Transient Taskbar is in Overview" - const val DEFAULT_TOUCH_REGION = "Using default touchable region" - const val ICONS_INVISIBLE = - "Icons are not visible, but other components such as 3 buttons might be" - } - val lastSetTouchableBounds = Rect() var lastSetTouchableReason = "" - var lastSetTouchableInsets = TOUCHABLE_INSETS_FRAME - - override fun toString(): String { - return "{lastSetTouchableBounds=$lastSetTouchableBounds" + - ", lastSetTouchableReason=\"$lastSetTouchableReason\"" + - ", lastSetTouchableInsets=${touchableInsetsToString()}" - } - - private fun touchableInsetsToString(): String { - return when (lastSetTouchableInsets) { - TOUCHABLE_INSETS_FRAME -> "TOUCHABLE_INSETS_FRAME" - TOUCHABLE_INSETS_CONTENT -> "TOUCHABLE_INSETS_CONTENT" - TOUCHABLE_INSETS_VISIBLE -> "TOUCHABLE_INSETS_VISIBLE" - TOUCHABLE_INSETS_REGION -> "TOUCHABLE_INSETS_REGION" - else -> "Unknown" - } - } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index bf87d3e0df..77c3e0a41c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -62,11 +62,11 @@ import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.BubbleLauncherState; import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.util.MultiPropertyFactory.MultiProperty; -import com.android.quickstep.BaseContainerInterface; -import com.android.quickstep.OverviewComponentObserver; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.RecentsAnimationController; import com.android.quickstep.fallback.RecentsState; +import com.android.quickstep.fallback.window.RecentsDisplayModel; +import com.android.quickstep.fallback.window.RecentsWindowFlags; import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.util.ScalingWorkspaceRevealAnim; import com.android.quickstep.util.SystemUiFlagUtils; @@ -80,7 +80,6 @@ import java.io.PrintWriter; import java.util.HashMap; import java.util.StringJoiner; import java.util.function.Consumer; -import java.util.function.Function; /** * Track LauncherState, RecentsAnimation, resumed state for task bar in one place here and animate @@ -361,16 +360,16 @@ public class TaskbarLauncherStateController { if (mTaskBarRecentsAnimationListener != null) { mTaskBarRecentsAnimationListener.endGestureStateOverride( - !isStateManagerInState(LauncherState.OVERVIEW), /* canceled= */ false); + !mLauncher.isInState(LauncherState.OVERVIEW), false /*canceled*/); } mTaskBarRecentsAnimationListener = new TaskBarRecentsAnimationListener(callbacks); callbacks.addListener(mTaskBarRecentsAnimationListener); RecentsView recentsView = mControllers.uiController.getRecentsView(); if (recentsView != null) { recentsView.setTaskLaunchListener(() -> mTaskBarRecentsAnimationListener - .endGestureStateOverride(/* finishedToApp= */ true, /* canceled= */ false)); + .endGestureStateOverride(true, false /*canceled*/)); recentsView.setTaskLaunchCancelledRunnable(() -> { - updateStateForUserFinishedToApp(/* finishedToApp= */ false); + updateStateForUserFinishedToApp(false /* finishedToApp */); }); } @@ -507,10 +506,6 @@ public class TaskbarLauncherStateController { + ", toAlignment: " + toAlignment); } mControllers.bubbleControllers.ifPresent(controllers -> { - // Ignore state changes when taskbar is destroyed - if (mControllers.taskbarActivityContext.isDestroyed()) { - return; - } // Show the bubble bar when on launcher home (hotseat icons visible) or in overview boolean onOverview = isInLauncher && mLauncherState == LauncherState.OVERVIEW; boolean hotseatIconsVisible = isInLauncher && mLauncherState.areElementsVisible( @@ -527,22 +522,11 @@ public class TaskbarLauncherStateController { stashController.updateStateForFlag(FLAG_IN_OVERVIEW, mLauncherState == LauncherState.OVERVIEW); - // Update taskbar stash flag here since we are skipping the playStateTransitionAnim below - if (isPinnedTaskbar) { - stashController.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE, - mLauncherState.isTaskbarStashed(mLauncher)); - } - AnimatorSet animatorSet = new AnimatorSet(); if (hasAnyFlag(changedFlags, FLAG_LAUNCHER_IN_STATE_TRANSITION)) { boolean launcherTransitionCompleted = !hasAnyFlag(FLAG_LAUNCHER_IN_STATE_TRANSITION); - - // We are skipping the taskbar stash animation for pinned taskbar, as we handle that now - // in setupPinnedTaskbarAnimation. - if (!isPinnedTaskbar) { - playStateTransitionAnim(animatorSet, duration, launcherTransitionCompleted); - } + playStateTransitionAnim(animatorSet, duration, launcherTransitionCompleted); if (launcherTransitionCompleted && mLauncherState == LauncherState.QUICK_SWITCH_FROM_HOME) { @@ -566,8 +550,6 @@ public class TaskbarLauncherStateController { @Override public void onAnimationStart(Animator animation) { mIsAnimatingToLauncher = isInLauncher; - // updateOverviewDragState uses mIsAnimatingToLauncher as well, so poke it. - updateOverviewDragState(mLauncherState); if (DEBUG) { Log.d(TAG, "onAnimationStart - FLAG_IN_APP: " + !isInLauncher); @@ -579,8 +561,6 @@ public class TaskbarLauncherStateController { @Override public void onAnimationEnd(Animator animation) { mIsAnimatingToLauncher = false; - // updateOverviewDragState uses mIsAnimatingToLauncher as well, so poke it. - updateOverviewDragState(mLauncherState); } }); @@ -634,7 +614,7 @@ public class TaskbarLauncherStateController { AnimatedFloat taskbarBgOffset = mControllers.taskbarDragLayerController.getTaskbarBackgroundOffset(); boolean showTaskbar = shouldShowTaskbar(mControllers.taskbarActivityContext, isInLauncher, - isInOverview) && !mControllers.taskbarStashController.isStashed(); + isInOverview); float taskbarBgOffsetEnd = showTaskbar ? 0f : 1f; float taskbarBgOffsetStart = showTaskbar ? 1f : 0f; @@ -783,7 +763,6 @@ public class TaskbarLauncherStateController { return !isInLauncher || isInOverview; } - // Used to stash/unstash pinned taskbar between home, overview, in app states. private void setupPinnedTaskbarAnimation(AnimatorSet animatorSet, boolean showTaskbar, AnimatedFloat taskbarBgOffset, float taskbarBgOffsetStart, float taskbarBgOffsetEnd, long duration, Animator taskbarBackgroundAlpha) { @@ -794,26 +773,19 @@ public class TaskbarLauncherStateController { ALPHA_CHANNEL_TASKBAR_ALIGNMENT); } - float targetTaskbarIconAlpha = showTaskbar ? 1f : 0f; - if (mTaskbarAlphaForHome.getValue() != targetTaskbarIconAlpha) { - animatorSet.play(mTaskbarAlphaForHome - .animateToValue(targetTaskbarIconAlpha) - .setDuration(duration)); - } if ((taskbarBgOffset.value != taskbarBgOffsetEnd && !taskbarBgOffset.isAnimating()) || taskbarBgOffset.isAnimatingToValue(taskbarBgOffsetStart)) { taskbarBgOffset.cancelAnimation(); + Animator taskbarIconAlpha = mTaskbarAlphaForHome.animateToValue( + showTaskbar ? 1f : 0f); AnimatedFloat taskbarIconTranslationYForHome = mControllers.taskbarViewController.mTaskbarIconTranslationYForHome; ObjectAnimator taskbarBackgroundOffset = taskbarBgOffset.animateToValue( taskbarBgOffsetStart, taskbarBgOffsetEnd); ObjectAnimator taskbarIconsYTranslation = null; - float taskbarHeight = mControllers - .taskbarActivityContext - .getDeviceProfile() - .getTaskbarProfile() - .getHeight(); + float taskbarHeight = + mControllers.taskbarActivityContext.getDeviceProfile().taskbarHeight; if (showTaskbar) { taskbarIconsYTranslation = taskbarIconTranslationYForHome.animateToValue( taskbarHeight, 0); @@ -822,9 +794,11 @@ public class TaskbarLauncherStateController { taskbarHeight); } + taskbarIconAlpha.setDuration(duration); taskbarIconsYTranslation.setDuration(duration); taskbarBackgroundOffset.setDuration(duration); + animatorSet.play(taskbarIconAlpha); animatorSet.play(taskbarIconsYTranslation); animatorSet.play(taskbarBackgroundOffset); } @@ -1082,12 +1056,6 @@ public class TaskbarLauncherStateController { translationXAnimation.start(); } - private boolean isStateManagerInState(@NonNull LauncherState state) { - return mLauncher.isInState(state) || state == getFromRecentsWindowManager( - recentsWindowManager -> - toLauncherState(recentsWindowManager.getStateManager().getState())); - } - private final class TaskBarRecentsAnimationListener implements RecentsAnimationCallbacks.RecentsAnimationListener { private final RecentsAnimationCallbacks mCallbacks; @@ -1098,13 +1066,18 @@ public class TaskbarLauncherStateController { @Override public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { - boolean isInOverview = isStateManagerInState(LauncherState.OVERVIEW); - endGestureStateOverride(!isInOverview, /* canceled= */ true); + boolean isInOverview = mLauncher.isInState(LauncherState.OVERVIEW); + endGestureStateOverride(!isInOverview, true /*canceled*/); } @Override public void onRecentsAnimationFinished(RecentsAnimationController controller) { - endGestureStateOverride(!controller.getFinishTargetIsLauncher(), /* canceled= */ false); + endGestureStateOverride(!controller.getFinishTargetIsLauncher(), + controller.getLauncherIsVisibleAtFinish(), false /*canceled*/); + } + + private void endGestureStateOverride(boolean finishedToApp, boolean canceled) { + endGestureStateOverride(finishedToApp, finishedToApp, canceled); } /** @@ -1114,35 +1087,45 @@ public class TaskbarLauncherStateController { * * @param finishedToApp {@code true} if the recents animation finished to showing an app and * not workspace or overview + * @param launcherIsVisible {code true} if launcher is visible at finish * @param canceled {@code true} if the recents animation was canceled instead of * finishing * to completion */ - private void endGestureStateOverride(boolean finishedToApp, boolean canceled) { + private void endGestureStateOverride(boolean finishedToApp, boolean launcherIsVisible, + boolean canceled) { mCallbacks.removeListener(this); mTaskBarRecentsAnimationListener = null; RecentsView recentsView = mControllers.uiController.getRecentsView(); if (recentsView != null) { recentsView.setTaskLaunchListener(null); - recentsView.setTaskLaunchCancelledRunnable(null); } if (mSkipNextRecentsAnimEnd && !canceled) { mSkipNextRecentsAnimEnd = false; return; } - updateStateForUserFinishedToApp(finishedToApp); + updateStateForUserFinishedToApp(finishedToApp, launcherIsVisible); } } + /** + * @see #updateStateForUserFinishedToApp(boolean, boolean) + */ + private void updateStateForUserFinishedToApp(boolean finishedToApp) { + updateStateForUserFinishedToApp(finishedToApp, !finishedToApp); + } + /** * Updates the visible state immediately to ensure a seamless handoff. * * @param finishedToApp True iff user is in an app. + * @param launcherIsVisible True iff launcher is still visible (ie. transparent app) */ - private void updateStateForUserFinishedToApp(boolean finishedToApp) { + private void updateStateForUserFinishedToApp(boolean finishedToApp, + boolean launcherIsVisible) { // Update the visible state immediately to ensure a seamless handoff - boolean launcherVisible = !finishedToApp; + boolean launcherVisible = !finishedToApp || launcherIsVisible; updateStateForFlag(FLAG_TRANSITION_TO_VISIBLE, false); updateStateForFlag(FLAG_VISIBLE, launcherVisible); applyState(); @@ -1151,7 +1134,7 @@ public class TaskbarLauncherStateController { if (DEBUG) { Log.d(TAG, "endGestureStateOverride - FLAG_IN_APP: " + finishedToApp); } - controller.updateStateForFlag(FLAG_IN_APP, finishedToApp); + controller.updateStateForFlag(FLAG_IN_APP, finishedToApp && !launcherIsVisible); controller.applyState(); } @@ -1159,24 +1142,14 @@ public class TaskbarLauncherStateController { * Helper function to run a callback on the RecentsWindowManager (if it exists). */ private void runForRecentsWindowManager(Consumer callback) { - getFromRecentsWindowManager(recentsWindowManager -> { - callback.accept(recentsWindowManager); - return null; - }); - } - - private @Nullable T getFromRecentsWindowManager( - Function function) { - final TaskbarActivityContext taskbarContext = mControllers.taskbarActivityContext; - int displayId = taskbarContext.getDisplayId(); - BaseContainerInterface containerInterface = OverviewComponentObserver.INSTANCE.get( - taskbarContext).getContainerInterface(displayId); - if (containerInterface == null - || !(containerInterface.getCreatedContainer() instanceof RecentsWindowManager - recentsWindowManager)) { - return null; + if (RecentsWindowFlags.getEnableOverviewInWindow()) { + final TaskbarActivityContext taskbarContext = mControllers.taskbarActivityContext; + RecentsWindowManager recentsWindowManager = RecentsDisplayModel.getINSTANCE() + .get(taskbarContext).getRecentsWindowManager(taskbarContext.getDisplayId()); + if (recentsWindowManager != null) { + callback.accept(recentsWindowManager); + } } - return function.apply(recentsWindowManager); } private static String getStateString(int flags) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java index 15807ae547..15c7a8d59d 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java @@ -15,26 +15,20 @@ */ package com.android.launcher3.taskbar; -import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS_PREDICTION; -import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT; -import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION; - import android.util.SparseArray; import android.view.View; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.annotation.UiThread; import com.android.launcher3.LauncherSettings.Favorites; -import com.android.launcher3.celllayout.CellInfo; import com.android.launcher3.model.BgDataModel; +import com.android.launcher3.model.BgDataModel.FixedContainerItems; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.model.data.PredictedContainerInfo; -import com.android.launcher3.model.data.WorkspaceData; -import com.android.launcher3.taskbar.TaskbarView.TaskbarLayoutParams; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.IntArray; +import com.android.launcher3.util.IntSet; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.LauncherBindableItemsContainer; import com.android.launcher3.util.PackageUserKey; @@ -42,6 +36,7 @@ import com.android.launcher3.util.Preconditions; import com.android.quickstep.util.GroupTask; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -67,6 +62,7 @@ public class TaskbarModelCallbacks implements // Used to defer any UI updates during the SUW unstash animation. private boolean mDeferUpdatesForSUW; private Runnable mDeferredUpdates; + private boolean mBindingItems = false; public TaskbarModelCallbacks( TaskbarActivityContext context, TaskbarView container) { @@ -79,25 +75,36 @@ public class TaskbarModelCallbacks implements } @Override - public void bindCompleteModel(WorkspaceData itemIdMap, boolean isBindingSync) { + public void startBinding() { + mBindingItems = true; mHotseatItems.clear(); - mPredictedItems = itemIdMap.getPredictedContents(CONTAINER_HOTSEAT_PREDICTION); - handleItemsAdded(itemIdMap); + mPredictedItems = Collections.emptyList(); + } - if (itemIdMap.get(CONTAINER_ALL_APPS_PREDICTION) instanceof PredictedContainerInfo pci) { - mControllers.taskbarAllAppsController.setPredictedApps(pci.getContents()); - } + @Override + public void finishBindingItems(IntSet pagesBoundFirst) { + mBindingItems = false; commitItemsToUI(); } @Override - public void bindItemsAdded(List items) { - if (handleItemsAdded(items)) { + public void bindAppsAdded(IntArray newScreens, ArrayList addNotAnimated, + ArrayList addAnimated) { + boolean add1 = handleItemsAdded(addNotAnimated); + boolean add2 = handleItemsAdded(addAnimated); + if (add1 || add2) { commitItemsToUI(); } } - private boolean handleItemsAdded(Iterable items) { + @Override + public void bindItems(List shortcuts, boolean forceAnimateIcons) { + if (handleItemsAdded(shortcuts)) { + commitItemsToUI(); + } + } + + private boolean handleItemsAdded(List items) { boolean modified = false; for (ItemInfo item : items) { if (item.container == Favorites.CONTAINER_HOTSEAT) { @@ -109,36 +116,8 @@ public class TaskbarModelCallbacks implements } @Override - public void bindItemsUpdated(@NonNull Set updates) { - Set itemsToRebind = updateContainerItems(updates, mContext); - boolean removed = handleItemsRemoved(ItemInfoMatcher.ofItems(itemsToRebind)); - boolean added = handleItemsAdded(itemsToRebind); - - boolean predictionsUpdated = false; - for (ItemInfo update: updates) { - if (update instanceof PredictedContainerInfo pci) { - if (pci.id == Favorites.CONTAINER_HOTSEAT_PREDICTION) { - mPredictedItems = pci.getContents(); - predictionsUpdated = true; - } else if (pci.id == CONTAINER_ALL_APPS_PREDICTION) { - mControllers.taskbarAllAppsController.setPredictedApps(pci.getContents()); - } - } - } - if (removed || added || predictionsUpdated) { - commitItemsToUI(); - } - } - - @Nullable - @Override - public CellInfo getCellInfoForView(@NonNull View view) { - return view.getLayoutParams() instanceof TaskbarLayoutParams tlp ? tlp.bindInfo : null; - } - - @Override - public boolean isContainerSupported(int container) { - return container == CONTAINER_HOTSEAT || container == CONTAINER_HOTSEAT_PREDICTION; + public void bindItemsUpdated(Set updates) { + updateContainerItems(updates, mContext); } @Override @@ -171,7 +150,30 @@ public class TaskbarModelCallbacks implements return modified; } + @Override + public void bindItemsModified(List items) { + boolean removed = handleItemsRemoved(ItemInfoMatcher.ofItems(items)); + boolean added = handleItemsAdded(items); + if (removed || added) { + commitItemsToUI(); + } + } + + @Override + public void bindExtraContainerItems(FixedContainerItems item) { + if (item.containerId == Favorites.CONTAINER_HOTSEAT_PREDICTION) { + mPredictedItems = item.items; + commitItemsToUI(); + } else if (item.containerId == Favorites.CONTAINER_PREDICTION) { + mControllers.taskbarAllAppsController.setPredictedApps(item.items); + } + } + private void commitItemsToUI() { + if (mBindingItems) { + return; + } + ItemInfo[] hotseatItemInfos = new ItemInfo[mContext.getDeviceProfile().numShownHotseatIcons]; int predictionSize = mPredictedItems.size(); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacksFactory.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacksFactory.kt index fbf8266e69..eb03b4abc5 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacksFactory.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacksFactory.kt @@ -17,11 +17,12 @@ package com.android.launcher3.taskbar import android.content.Context -import com.android.launcher3.dagger.LauncherComponentProvider -import javax.inject.Inject +import com.android.launcher3.R +import com.android.launcher3.util.ResourceBasedOverride +import com.android.launcher3.util.ResourceBasedOverride.Overrides /** Creates [TaskbarModelCallbacks] instances. */ -open class TaskbarModelCallbacksFactory @Inject constructor() { +open class TaskbarModelCallbacksFactory : ResourceBasedOverride { open fun create( activityContext: TaskbarActivityContext, @@ -31,7 +32,11 @@ open class TaskbarModelCallbacksFactory @Inject constructor() { companion object { @JvmStatic fun newInstance(context: Context): TaskbarModelCallbacksFactory { - return LauncherComponentProvider.get(context).getTaskbarModelCallbacksFactory() + return Overrides.getObject( + TaskbarModelCallbacksFactory::class.java, + context, + R.string.taskbar_model_callbacks_factory_class, + ) } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java index b19a19076f..e3452a2945 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java @@ -34,10 +34,9 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; -import static com.android.window.flags2.Flags.predictiveBackThreeButtonNav; +import static com.android.window.flags.Flags.predictiveBackThreeButtonNav; import android.content.Context; -import android.graphics.Rect; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; @@ -122,7 +121,6 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa private final SystemUiProxy mSystemUiProxy; private final Handler mHandler; private final ContextualSearchInvoker mContextualSearchInvoker; - private TaskbarControllers mControllers; @Nullable private StatsLogManager mStatsLogManager; private final Runnable mResetLongPress = this::resetScreenUnpin; @@ -155,8 +153,6 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa // prevent interactions with other buttons while back button is pressed return; } - // Provide the same haptic feedback that the system offers for virtual keys. - view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); switch (buttonType) { case BUTTON_BACK: executeBack(/* keyEvent */ null); @@ -190,9 +186,6 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa } } - /** - * Handles long clicks and plays haptics for user visible actions. - */ public boolean onButtonLongClick(@TaskbarButton int buttonType, View view) { if (buttonType == BUTTON_SPACE) { return false; @@ -211,39 +204,34 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa return false; } + // Provide the same haptic feedback that the system offers for long press. + // The haptic feedback from long pressing on the home button is handled by circle to search. + // There are no haptics for long pressing the back button if predictive back is enabled + if (buttonType != BUTTON_HOME + && (!predictiveBackThreeButtonNav || buttonType != BUTTON_BACK)) { + view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + } switch (buttonType) { case BUTTON_HOME: logEvent(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS); onLongPressHome(); - view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); return true; case BUTTON_A11Y: logEvent(LAUNCHER_TASKBAR_A11Y_BUTTON_LONGPRESS); notifyA11yClick(true /* longClick */); - view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); return true; case BUTTON_BACK: logEvent(LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS); - if (backRecentsLongpress(buttonType)) { - view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } + backRecentsLongpress(buttonType); return true; case BUTTON_RECENTS: logEvent(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS); - if (backRecentsLongpress(buttonType)) { - view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } + backRecentsLongpress(buttonType); return true; case BUTTON_IME_SWITCH: if (Flags.imeSwitcherRevamp()) { logEvent(LAUNCHER_TASKBAR_IME_SWITCHER_BUTTON_LONGPRESS); onImeSwitcherLongPress(); - view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); return true; } return false; @@ -273,13 +261,6 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa } } - /** - * Notifies SystemUI of the new bounds of the recents button in screen coordinates. - */ - public void onRecentsButtonLayoutChanged(Rect bounds) { - mSystemUiProxy.notifyRecentsButtonPositionChanged(bounds); - } - private boolean backRecentsLongpress(@TaskbarButton int buttonType) { mLongPressedButtons |= buttonType; return determineScreenUnpin(); @@ -336,8 +317,7 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa } public void init(TaskbarControllers taskbarControllers) { - mControllers = taskbarControllers; - mStatsLogManager = mControllers.getTaskbarActivityContext().getStatsLogManager(); + mStatsLogManager = taskbarControllers.getTaskbarActivityContext().getStatsLogManager(); } public void onDestroy() { @@ -358,7 +338,7 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa private void navigateHome() { TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY); - mCallbacks.onNavigateHome(mContext.getDisplayId()); + mCallbacks.onNavigateHome(); } private void navigateToOverview() { @@ -367,11 +347,11 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa } TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "onOverviewToggle"); TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS); - mCallbacks.onToggleOverview(mContext.getDisplayId()); + mCallbacks.onToggleOverview(); } public void hideOverview() { - mCallbacks.onHideOverview(mContext.getDisplayId()); + mCallbacks.onHideOverview(); } void sendBackKeyEvent(int action, boolean cancelled) { @@ -381,7 +361,6 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa } long time = SystemClock.uptimeMillis(); KeyEvent keyEvent = new KeyEvent(time, time, action, KeyEvent.KEYCODE_BACK, 0); - keyEvent.setDisplayId(mControllers.getTaskbarActivityContext().getDisplayId()); if (cancelled) { keyEvent.cancel(); } @@ -438,12 +417,12 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa /** Callbacks for navigation buttons on Taskbar. */ public interface TaskbarNavButtonCallbacks { /** Callback invoked when the home button is pressed. */ - default void onNavigateHome(int displayId) {} + default void onNavigateHome() {} /** Callback invoked when the overview button is pressed. */ - default void onToggleOverview(int displayId) {} + default void onToggleOverview() {} /** Callback invoken when a visible overview needs to be hidden. */ - default void onHideOverview(int displayId) { } + default void onHideOverview() { } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java index 34787641c2..d909d19fb8 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java @@ -39,7 +39,6 @@ import androidx.annotation.VisibleForTesting; import androidx.core.graphics.ColorUtils; import com.android.app.animation.Interpolators; -import com.android.launcher3.R; import com.android.launcher3.Reorderable; import com.android.launcher3.Utilities; import com.android.launcher3.icons.IconNormalizer; @@ -340,17 +339,6 @@ public class TaskbarOverflowView extends FrameLayout implements Reorderable { } } - /** - * @return Tooltip to be used for the taskbar overflow view - returns null if the view should - * not have a tooltip. - */ - public String getTextForTooltipPopup() { - if (mIsActive) { - return null; - } - return getResources().getString(R.string.taskbar_overflow_a11y_title); - } - /** * Returns the view's state (whether it shows a set of app icons or a leave-behind circle). */ diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt index 8d75eef314..7141bb8185 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt @@ -24,8 +24,6 @@ import com.android.app.animation.Interpolators import com.android.launcher3.LauncherPrefs import com.android.launcher3.LauncherPrefs.Companion.TASKBAR_PINNING import com.android.launcher3.LauncherPrefs.Companion.TASKBAR_PINNING_IN_DESKTOP_MODE -import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_DESKTOP_MODE_TASKBAR_PINNED -import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_DESKTOP_MODE_TASKBAR_UNPINNED import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_DIVIDER_MENU_CLOSE import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_DIVIDER_MENU_OPEN import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_PINNED @@ -58,26 +56,16 @@ class TaskbarPinningController(private val context: TaskbarActivityContext) : if (!didPreferenceChange) { return } - - if ( - controllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar( - context.displayId - ) - ) { - val shouldPinDesktopTaskbar = + val shouldPinTaskbar = + if ( + controllers.taskbarDesktopModeController.isInDesktopModeAndNotInOverview( + context.displayId + ) + ) { !launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE) - val logEvent = - if (shouldPinDesktopTaskbar) { - LAUNCHER_DESKTOP_MODE_TASKBAR_PINNED - } else { - LAUNCHER_DESKTOP_MODE_TASKBAR_UNPINNED - } - statsLogManager.logger().log(logEvent) - launcherPrefs.put(TASKBAR_PINNING_IN_DESKTOP_MODE, shouldPinDesktopTaskbar) - return - } - - val shouldPinTaskbar = !launcherPrefs.get(TASKBAR_PINNING) + } else { + !launcherPrefs.get(TASKBAR_PINNING) + } val animateToValue = if (shouldPinTaskbar) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java index 44832b52db..7f240bd781 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java @@ -23,7 +23,6 @@ import static com.android.launcher3.util.SplitConfigurationOptions.getLogEventFo import android.content.Intent; import android.content.pm.LauncherApps; import android.graphics.Point; -import android.os.UserHandle; import android.util.Pair; import android.util.SparseArray; import android.view.MotionEvent; @@ -31,7 +30,6 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.launcher3.AbstractFloatingView; @@ -55,7 +53,6 @@ import com.android.launcher3.views.ActivityContext; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.util.LogUtils; import com.android.quickstep.util.SingleTask; -import com.android.systemui.shared.recents.model.Task; import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; @@ -145,35 +142,25 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba return null; } - ItemInfo itemInfo = null; + ItemInfo itemInfo; if (icon.getTag() instanceof ItemInfo item && ShortcutUtil.supportsShortcuts(item)) { itemInfo = item; - } else if (PinToTaskbarShortcut.Companion.isPinningAppWithContextMenuEnabled(mContext) - && icon.getTag() instanceof SingleTask task) { - Task.TaskKey key = task.getTask().getKey(); - AppInfo appInfo = getApp( - new ComponentKey(key.getComponent(), UserHandle.of(key.userId))); - if (appInfo != null) { - WorkspaceItemInfo wif = appInfo.makeWorkspaceItem(icon.getContext()); - itemInfo = SingleTask.Companion.createTaskItemInfo(task, wif); - } - } - - if (itemInfo == null) { + } else if (icon.getTag() instanceof SingleTask task) { + itemInfo = SingleTask.Companion.createTaskItemInfo(task); + } else { return null; } PopupContainerWithArrow container; int deepShortcutCount = mPopupDataProvider.getShortcutCountForItem(itemInfo); // TODO(b/198438631): add support for INSTALL shortcut factory - final ItemInfo finalInfo = itemInfo; List systemShortcuts = getSystemShortcuts() - .map(s -> s.getShortcut(context, finalInfo, icon)) + .map(s -> s.getShortcut(context, itemInfo, icon)) .filter(Objects::nonNull) .collect(Collectors.toList()); // TODO(b/375648361): Revisit to see if this can be implemented within getSystemShortcuts(). - if (PinToTaskbarShortcut.Companion.isPinningAppWithContextMenuEnabled(mContext)) { + if (Flags.enablePinningAppWithContextMenu()) { SystemShortcut shortcut = createPinShortcut(context, itemInfo, icon); if (shortcut != null) { systemShortcuts.add(0, shortcut); @@ -181,7 +168,7 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba } container = (PopupContainerWithArrow) context.getLayoutInflater().inflate( - R.layout.popup_container, context.getDragLayer(), false); + R.layout.popup_container, context.getDragLayer(), false); container.populateAndShowRows(icon, itemInfo, deepShortcutCount, systemShortcuts); // TODO (b/198438631): configure for taskbar/context @@ -222,8 +209,7 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba } @Nullable - @VisibleForTesting - SystemShortcut createPinShortcut(BaseTaskbarContext target, ItemInfo itemInfo, + private SystemShortcut createPinShortcut(BaseTaskbarContext target, ItemInfo itemInfo, BubbleTextView originalView) { // Predicted items use {@code HotseatPredictionController.PinPrediction} shortcut to pin. if (itemInfo.isPredictedItem()) { @@ -233,18 +219,6 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba return new PinToTaskbarShortcut<>(target, itemInfo, originalView, false, mHotseatInfosList); } - - if (itemInfo.container == CONTAINER_ALL_APPS) { - // If the target ItemInfo is already pinned on taskbar. Show the unpin option instead. - for (int i = 0; i < mHotseatInfosList.size(); i++) { - if (Objects.equals(mHotseatInfosList.valueAt(i).getComponentKey(), - itemInfo.getComponentKey())) { - return new PinToTaskbarShortcut<>(target, itemInfo, originalView, false, - mHotseatInfosList); - } - } - } - if (mHotseatInfosList.size() < mContext.getTaskbarSpecsEvaluator().getNumShownHotseatIcons()) { return new PinToTaskbarShortcut<>(target, itemInfo, originalView, true, @@ -292,10 +266,7 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba // Move the icon to align with the center-top of the touch point Point iconShift = new Point(); iconShift.x = mIconLastTouchPos.x - sv.getIconCenter().x; - iconShift.y = mIconLastTouchPos.y - - mContext.getDeviceProfile() - .getTaskbarProfile() - .getIconSize(); + iconShift.y = mIconLastTouchPos.y - mContext.getDeviceProfile().taskbarIconSize; ((TaskbarDragController) ActivityContext.lookupContext( v.getContext()).getDragController()).startDragOnLongClick(sv, iconShift); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt index f4d0f15501..417ef7edef 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt @@ -16,8 +16,6 @@ package com.android.launcher3.taskbar import android.content.Context -import android.util.Log -import android.window.DesktopExperienceFlags import android.window.DesktopModeFlags import androidx.annotation.VisibleForTesting import com.android.launcher3.BubbleTextView.RunningAppState @@ -26,7 +24,6 @@ import com.android.launcher3.Flags.enableRecentsInTaskbar import com.android.launcher3.model.data.ItemInfo import com.android.launcher3.model.data.TaskItemInfo import com.android.launcher3.model.data.WorkspaceItemInfo -import com.android.launcher3.taskbar.PinToTaskbarShortcut.Companion.isPinningAppWithContextMenuEnabled import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController import com.android.launcher3.util.CancellableTask import com.android.quickstep.RecentsFilterState @@ -34,7 +31,6 @@ import com.android.quickstep.RecentsModel import com.android.quickstep.util.DesktopTask import com.android.quickstep.util.GroupTask import com.android.quickstep.util.SingleTask -import com.android.systemui.shared.recents.model.Task import com.android.wm.shell.shared.desktopmode.DesktopModeStatus import java.io.PrintWriter @@ -43,10 +39,8 @@ import java.io.PrintWriter * - When in Fullscreen mode: show the N most recent Tasks * - When in Desktop Mode: show the currently running (open) Tasks */ -class TaskbarRecentAppsController( - private val context: Context, - private val recentsModel: RecentsModel, -) : LoggableTaskbarController { +class TaskbarRecentAppsController(context: Context, private val recentsModel: RecentsModel) : + LoggableTaskbarController { var canShowRunningApps = DesktopModeStatus.canEnterDesktopMode(context) && @@ -55,20 +49,17 @@ class TaskbarRecentAppsController( set(isEnabledFromTest) { field = isEnabledFromTest if (!field && !canShowRecentApps) { - recentsModel.unregisterRecentTasksChangedListener(recentTasksChangedListener) + recentsModel.unregisterRecentTasksChangedListener() } } - val enableRecentTasksThrottle = - DesktopExperienceFlags.ENABLE_TASKBAR_RECENT_TASKS_THROTTLE_BUGFIX.isTrue - // TODO(b/343532825): Add a setting to disable Recents even when the flag is on. var canShowRecentApps = enableRecentsInTaskbar() @VisibleForTesting set(isEnabledFromTest) { field = isEnabledFromTest if (!field && !canShowRunningApps) { - recentsModel.unregisterRecentTasksChangedListener(recentTasksChangedListener) + recentsModel.unregisterRecentTasksChangedListener() } } @@ -79,7 +70,7 @@ class TaskbarRecentAppsController( private set private var allRecentTasks: List = emptyList() - private var desktopTasks: List = emptyList() + private var desktopTask: DesktopTask? = null // Keeps track of the order in which running tasks appear. private var orderedRunningTaskIds = emptyList() var shownTasks: List = emptyList() @@ -110,11 +101,9 @@ class TaskbarRecentAppsController( } private fun getDesktopTaskState(packageName: String, userId: Int): TaskState { - if (desktopTasks.isEmpty()) { - return TaskState(RunningAppState.NOT_RUNNING) - } + val tasks = desktopTask?.tasks ?: return TaskState(RunningAppState.NOT_RUNNING) val appTasks = - desktopTasks.filter { task -> + tasks.filter { task -> packageName == task.key.packageName && task.key.userId == userId } val runningTask = appTasks.find { getRunningAppState(it.key.id) == RunningAppState.RUNNING } @@ -138,19 +127,6 @@ class TaskbarRecentAppsController( } } - /** - * Returns `true` if recents has the single task (i.e., fullscreen) represented by the given - * [itemInfo]. - */ - fun hasSingleTask(itemInfo: ItemInfo?): Boolean { - val packageName = itemInfo?.targetPackage ?: return false - return allRecentTasks.any { task -> - task is SingleTask && - packageName == task.task.key.packageName && - task.task.key.userId == itemInfo.user.identifier - } - } - @VisibleForTesting val runningTaskIds: Set /** @@ -164,7 +140,8 @@ class TaskbarRecentAppsController( ) { return emptySet() } - return desktopTasks.map { it.key.id }.toSet() + val tasks = desktopTask?.tasks ?: return emptySet() + return tasks.map { task -> task.key.id }.toSet() } @VisibleForTesting @@ -179,6 +156,7 @@ class TaskbarRecentAppsController( ) { return emptySet() } + val desktopTasks = desktopTask?.tasks ?: return emptySet() return desktopTasks.filter { !it.isVisible }.map { task -> task.key.id }.toSet() } @@ -193,19 +171,8 @@ class TaskbarRecentAppsController( // tasks again if we have already requested it and the task list has not changed private var taskListChangeId = -1 - // Whether we're currently loading recents tasks - private var loadingRecentsTasks = false - // Whether we need to reload recents tasks when the current loading operation is finished - private var needsRecentsTasksReload = false - // Whether we've loaded recents tasks at least once - private var recentTasksLoaded = false - - fun init(taskbarControllers: TaskbarControllers, previousShownTasks: List) { + fun init(taskbarControllers: TaskbarControllers) { controllers = taskbarControllers - if (previousShownTasks.isNotEmpty()) { - shownTasks = previousShownTasks - fetchIcons() - } if (canShowRunningApps || canShowRecentApps) { recentsModel.registerRecentTasksChangedListener(recentTasksChangedListener) controllers.runAfterInit { reloadRecentTasksIfNeeded() } @@ -213,11 +180,7 @@ class TaskbarRecentAppsController( } fun onDestroy() { - controllers.sharedState?.recentTasksBeforeTaskbarRecreate?.clear() - if (shownTasks.isNotEmpty()) { - controllers.sharedState?.recentTasksBeforeTaskbarRecreate?.addAll(shownTasks) - } - recentsModel.unregisterRecentTasksChangedListener(recentTasksChangedListener) + recentsModel.unregisterRecentTasksChangedListener() iconLoadRequests.forEach { it.cancel() } iconLoadRequests.clear() } @@ -248,53 +211,41 @@ class TaskbarRecentAppsController( ) } - if (recentTasksLoaded) { - onRecentsOrHotseatChanged() - } + onRecentsOrHotseatChanged() return shownHotseatItems.toTypedArray() } private fun getOrderedAndWrappedDesktopTasks(): List { + val tasks = desktopTask?.tasks ?: emptyList() // We wrap each task in the Desktop as a `SingleTask`. val orderFromId = orderedRunningTaskIds.withIndex().associate { (index, id) -> id to index } - val sortedTasks = desktopTasks.sortedWith(compareBy(nullsLast()) { orderFromId[it.key.id] }) + val sortedTasks = tasks.sortedWith(compareBy(nullsLast()) { orderFromId[it.key.id] }) return sortedTasks.map { SingleTask(it) } } private fun reloadRecentTasksIfNeeded() { - if (recentsModel.isTaskListValid(taskListChangeId)) return - if (enableRecentTasksThrottle && loadingRecentsTasks) { - Log.v(TAG, "reloadRecentTasksIfNeeded: tried to reload while loading recents tasks") - needsRecentsTasksReload = true - return + if (!recentsModel.isTaskListValid(taskListChangeId)) { + taskListChangeId = + recentsModel.getTasks( + { tasks -> + allRecentTasks = tasks + val oldRunningTaskdIds = runningTaskIds + val oldMinimizedTaskIds = minimizedTaskIds + desktopTask = allRecentTasks.filterIsInstance().firstOrNull() + val runningTasksChanged = oldRunningTaskdIds != runningTaskIds + val minimizedTasksChanged = oldMinimizedTaskIds != minimizedTaskIds + if ( + onRecentsOrHotseatChanged() || + runningTasksChanged || + minimizedTasksChanged + ) { + controllers.taskbarViewController.commitRunningAppsToUI() + } + }, + RecentsFilterState.EMPTY_FILTER, + ) } - Log.v(TAG, "reloadRecentTasksIfNeeded: load recents tasks") - // Only indicate that recents tasks are loading if the enableRecentTasksThrottle flag is on - loadingRecentsTasks = enableRecentTasksThrottle - taskListChangeId = - recentsModel.getTasks(RecentsFilterState.EMPTY_FILTER) { tasks -> - loadingRecentsTasks = false - recentTasksLoaded = true - allRecentTasks = tasks - val oldRunningTaskdIds = runningTaskIds - val oldMinimizedTaskIds = minimizedTaskIds - desktopTasks = allRecentTasks.filterIsInstance().flatMap { it.tasks } - val runningTasksChanged = oldRunningTaskdIds != runningTaskIds - val minimizedTasksChanged = oldMinimizedTaskIds != minimizedTaskIds - - if ( - (onRecentsOrHotseatChanged() || runningTasksChanged || minimizedTasksChanged) && - !controllers.taskbarDesktopModeController.isLauncherAnimationRunning - ) { - controllers.taskbarViewController.commitRunningAppsToUI() - } - if (needsRecentsTasksReload) { - Log.v(TAG, "reloadRecentTasksIfNeeded: reload recents tasks") - needsRecentsTasksReload = false - reloadRecentTasksIfNeeded() - } - } } /** @@ -315,11 +266,7 @@ class TaskbarRecentAppsController( if (!shownTasksChanged) { return shownTasksChanged } - fetchIcons() - return shownTasksChanged - } - private fun fetchIcons() { for (groupTask in shownTasks) { for (task in groupTask.tasks) { val cancellableTask = @@ -337,6 +284,7 @@ class TaskbarRecentAppsController( } } } + return shownTasksChanged } private fun updateOrderedRunningTaskIds(): MutableList { @@ -366,19 +314,11 @@ class TaskbarRecentAppsController( if (Flags.enableMultiInstanceMenuTaskbar()) { val deduplicatedDesktopTasks = desktopTasks.distinctBy { Pair(it.task.key.packageName, it.task.key.userId) } - val activityContext = controllers.taskbarActivityContext shownTasks .filter { it is SingleTask && - it.task.key.id in deduplicatedDesktopTasks.map { it.task.key.id } && - (!isPinningAppWithContextMenuEnabled(activityContext) || - shownHotseatItems.none { hotseatItem -> - it.containsPackage( - hotseatItem.targetPackage, - hotseatItem.user.identifier, - ) - }) + it.task.key.id in deduplicatedDesktopTasks.map { it.task.key.id } } .toMutableList() .apply { @@ -489,7 +429,7 @@ class TaskbarRecentAppsController( pw.println("$prefix\tcanShowRecentApps=$canShowRecentApps") pw.println("$prefix\tshownHotseatItems=${shownHotseatItems.map{item->item.targetPackage}}") pw.println("$prefix\tallRecentTasks=${allRecentTasks.map { it.packageNames }}") - pw.println("$prefix\tdesktopTask=${desktopTasks.map { it.key.packageName }}") + pw.println("$prefix\tdesktopTask=${desktopTask?.packageNames}") pw.println("$prefix\tshownTasks=${shownTasks.map { it.packageNames }}") pw.println("$prefix\trunningTaskIds=$runningTaskIds") pw.println("$prefix\tminimizedTaskIds=$minimizedTaskIds") @@ -499,8 +439,6 @@ class TaskbarRecentAppsController( get() = tasks.map { task -> task.key.packageName } private companion object { - private val TAG = "TaskbarRecentAppsController" - const val MAX_RECENT_TASKS = 2 } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarSharedState.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarSharedState.java index 89016c8f45..f4a7d686c0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarSharedState.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarSharedState.java @@ -29,12 +29,10 @@ import android.os.Binder; import android.os.IBinder; import android.view.InsetsFrameProvider; -import com.android.quickstep.util.GroupTask; import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags; import com.android.wm.shell.shared.bubbles.BubbleBarLocation; import com.android.wm.shell.shared.bubbles.BubbleInfo; -import java.util.ArrayList; import java.util.List; /** @@ -49,8 +47,6 @@ public class TaskbarSharedState { // TaskbarManager#onSystemUiFlagsChanged @SystemUiStateFlags public long sysuiStateFlags; - // TaskBarStashController#init() - public boolean isTaskbarOnOverview; // TaskbarManager#disableNavBarElements() public int disableNavBarDisplayId; @@ -77,12 +73,6 @@ public class TaskbarSharedState { public boolean allAppsVisible = false; - public boolean bubbleBarExpanded = false; - - public boolean bubbleBarStashed = false; - - public String selectedBubbleKey; - public BubbleBarLocation bubbleBarLocation; public List bubbleInfoItems; @@ -94,16 +84,6 @@ public class TaskbarSharedState { return bubbleInfoItems != null && !bubbleInfoItems.isEmpty(); } - /** Clears stored bubble bar data. */ - public void clearBubbleData() { - bubbleInfoItems = null; - selectedBubbleKey = null; - bubbleBarLocation = null; - bubbleBarExpanded = false; - bubbleBarStashed = false; - suppressedBubbleInfoItems = null; - } - // LauncherTaskbarUIController#mTaskbarInAppDisplayProgressMultiProp public float[] inAppDisplayProgressMultiPropValues = new float[DISPLAY_PROGRESS_COUNT]; @@ -141,6 +121,4 @@ public class TaskbarSharedState { // should show corner radius on persistent taskbar when in desktop mode. public boolean showCornerRadiusInDesktopMode = false; - - public List recentTasksBeforeTaskbarRecreate = new ArrayList<>(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 6fa55799c3..f0f46771d9 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -62,7 +62,6 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.launcher3.Alarm; import com.android.launcher3.DeviceProfile; -import com.android.launcher3.LauncherPrefs; import com.android.launcher3.R; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.anim.AnimationSuccessListener; @@ -74,7 +73,6 @@ import com.android.quickstep.util.SystemUiFlagUtils; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.Objects; import java.util.StringJoiner; import java.util.function.LongPredicate; @@ -296,10 +294,6 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba private boolean mIsTaskbarSystemActionRegistered = false; private TaskbarSharedState mTaskbarSharedState; - // Used to mark whether we are in test mode to mark whether the nav bar shows in SUW - @VisibleForTesting - Boolean mNavbarHiddenOverrideForTest = null; - public TaskbarStashController(TaskbarActivityContext activity) { mActivity = activity; mSystemUiProxy = SystemUiProxy.INSTANCE.get(activity); @@ -323,11 +317,8 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba mStashedHeight = mActivity.getResources().getDimensionPixelSize( R.dimen.taskbar_stashed_size); } else { - mUnstashedHeight = mActivity.getDeviceProfile().getTaskbarProfile().getHeight(); - mStashedHeight = mActivity - .getDeviceProfile() - .getTaskbarProfile() - .getStashedTaskbarHeight(); + mUnstashedHeight = mActivity.getDeviceProfile().taskbarHeight; + mStashedHeight = mActivity.getDeviceProfile().stashedTaskbarHeight; } } @@ -373,7 +364,6 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba // For now, assume we're in an app, since LauncherTaskbarUIController won't be able to tell // us that we're paused until a bit later. This avoids flickering upon recreating taskbar. updateStateForFlag(FLAG_IN_APP, true); - updateStateForFlag(FLAG_IN_OVERVIEW, mTaskbarSharedState.isTaskbarOnOverview); updateStateForFlag(FLAG_STASHED_BUBBLE_BAR_ON_PHONE, mActivity.isBubbleBarOnPhone()); applyState(/* duration = */ 0); @@ -384,14 +374,11 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba mTaskbarBackgroundAlphaForStash.setValue(shouldHideTaskbarBackground ? 0 : 1); + if (mTaskbarSharedState.getTaskbarWasPinned() + || !mTaskbarSharedState.taskbarWasStashedAuto) { + tryStartTaskbarTimeout(); + } notifyStashChange(/* visible */ false, /* stashed */ isStashedInApp()); - - mControllers.runAfterInit(() -> { - // if taskbar should auto stash attempt to start timeout. - if (shouldAllowTaskbarToAutoStash()) { - tryStartTaskbarTimeout(); - } - }); } /** @@ -516,11 +503,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba public int getTouchableHeight() { return mIsStashed ? mStashedHeight - : (mUnstashedHeight - + mActivity.getDeviceProfile() - .getTaskbarProfile() - .getBottomMargin() - ); + : (mUnstashedHeight + mActivity.getDeviceProfile().taskbarBottomMargin); } /** @@ -537,14 +520,11 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba if (supportsVisualStashing() && hasAnyFlag(FLAGS_REPORT_STASHED_INSETS_TO_APP)) { DeviceProfile dp = mActivity.getDeviceProfile(); - // If the navigation bar is hidden in SUW, we can draw the SUW content lower so we avoid - // reporting a higher inset - if (hasAnyFlag(FLAG_STASHED_IN_APP_SETUP) - && (dp.isTaskbarPresent || mActivity.isPhoneGestureNavMode()) - && !isNavbarHiddeninSUW()) { - // When we show the back button in SUW, the SUW layout may not be wide enough to - // support overlapping the nav bar with its content in portrait. So we send - // different res values in portrait vs landscape + if (hasAnyFlag(FLAG_STASHED_IN_APP_SETUP) && (dp.isTaskbarPresent + || mActivity.isPhoneGestureNavMode())) { + // We always show the back button in SUW but in portrait the SUW layout may not + // be wide enough to support overlapping the nav bar with its content. + // We're sending different res values in portrait vs landscape return mActivity.getResources().getDimensionPixelSize(R.dimen.taskbar_suw_insets); } boolean isAnimating = mAnimator != null && mAnimator.isStarted(); @@ -562,17 +542,6 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba return mUnstashedHeight; } - /** - * Returns whether the navigation bar is visible during the Setup Wizard. - * - * {@link #mNavbarHiddenOverrideForTest} is only used by tests - */ - private boolean isNavbarHiddeninSUW() { - // Check if a test override is active - return Objects.requireNonNullElseGet(mNavbarHiddenOverrideForTest, - () -> mControllers.navbarButtonsViewController.isNavbarHiddenInSUW()); - } - /** * Returns the height that taskbar will inset when inside apps. * @@ -678,50 +647,10 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba /* shouldBubblesFollow= */ !bubbleBarExpanded); } - /** - * @return if we should allow taskbar to auto stash - */ - public boolean shouldAllowTaskbarToAutoStash() { - if (mActivity.isTransientTaskbar()) { - return true; - } - - boolean isTaskbarPinningOnInDesktopMode = LauncherPrefs.TASKBAR_PINNING_IN_DESKTOP_MODE.get( - mActivity); - return !isTaskbarPinningOnInDesktopMode && mActivity.isTaskbarShowingDesktopTasks(); - } - - /** - * Stashes pinned taskbar after it has timed out. - */ - public void updateAndAnimatePinnedTaskbarForTimeout() { - updateAndAnimatePinnedTaskbar(true); - } - - /** - * Handles stashing/un-stashing taskbar in desktop mode. - */ - public void updateAndAnimatePinnedTaskbar(boolean isStashed) { - boolean shouldApplyState = false; - if (hasAnyFlag(FLAG_STASHED_IN_APP_AUTO) != isStashed) { - updateStateForFlag(FLAG_STASHED_IN_APP_AUTO, isStashed); - shouldApplyState = true; - } - if (shouldApplyState) { - applyState(); - } - } - /** Toggles the Taskbar's stash state. */ public void toggleTaskbarStash() { - if (!shouldAllowTaskbarToAutoStash() || !hasAnyFlag(FLAGS_IN_APP)) { - return; - } - if (mActivity.isTransientTaskbar()) { - updateAndAnimateTransientTaskbar(!hasAnyFlag(FLAG_STASHED_IN_APP_AUTO)); - } else if (mActivity.isTaskbarShowingDesktopTasks()) { - updateAndAnimatePinnedTaskbar(!hasAnyFlag(FLAG_STASHED_IN_APP_AUTO)); - } + if (!mActivity.isTransientTaskbar() || !hasAnyFlag(FLAGS_IN_APP)) return; + updateAndAnimateTransientTaskbar(!hasAnyFlag(FLAG_STASHED_IN_APP_AUTO)); } /** @@ -798,8 +727,6 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba if (mActivity.isTransientTaskbar()) { createTransientAnimToIsStashed(mAnimator, isStashed, duration, shouldDelayBackground, animationType); - } else if (shouldAllowTaskbarToAutoStash()) { - createAnimToIsStashedPinnedTaskbar(mAnimator, isStashed, duration); } else { createAnimToIsStashed(mAnimator, isStashed, duration, stashTranslation, animationType); } @@ -829,16 +756,6 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba }); } - private void createAnimToIsStashedPinnedTaskbar(AnimatorSet as, boolean isStashed, - long duration) { - int stashTranslation = !isStashed ? 0 : mUnstashedHeight; - as.play(mIconTranslationYForStash.animateToValue(stashTranslation)); - as.play(mTaskbarBackgroundOffset.animateToValue(isStashed ? 1 : 0)); - as.play(mIconAlphaForStash.animateToValue(isStashed ? 0 : 1)); - as.play(mIconScaleForStash.animateToValue(1)); - as.setDuration(duration); - } - private void createAnimToIsStashed(AnimatorSet as, boolean isStashed, long duration, float stashTranslation, @StashAnimation int animationType) { AnimatorSet fullLengthAnimatorSet = new AnimatorSet(); @@ -1235,7 +1152,6 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba && mActivity.isTransientTaskbar(); updateStateForFlag(FLAG_STASHED_SYSUI, hasAnyFlag(systemUiStateFlags, SYSUI_STATE_SCREEN_PINNING) || stashForBubbles); - updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, SystemUiFlagUtils.isLocked(systemUiStateFlags)); @@ -1268,7 +1184,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba } // Do not stash if in small screen, with 3 button nav, and in landscape. if (mActivity.isPhoneMode() && mActivity.isThreeButtonNav() - && mActivity.getDeviceProfile().getDeviceProperties().isLandscape()) { + && mActivity.getDeviceProfile().isLandscape) { return false; } @@ -1390,7 +1306,6 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba mAnimator.cancel(); mAnimator = null; } - mTaskbarSharedState.isTaskbarOnOverview = hasAnyFlag(FLAG_IN_OVERVIEW); UI_HELPER_EXECUTOR.execute( () -> mAccessibilityManager.unregisterSystemAction(SYSTEM_ACTION_ID_TASKBAR)); } @@ -1411,7 +1326,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba * If false, attempts to re/start the timeout */ public void updateTaskbarTimeout(boolean isAutohideSuspended) { - if (!shouldAllowTaskbarToAutoStash()) { + if (!mActivity.isTransientTaskbar()) { return; } if (isAutohideSuspended) { @@ -1425,7 +1340,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba * Attempts to start timer to auto hide the taskbar based on time. */ private void tryStartTaskbarTimeout() { - if (!shouldAllowTaskbarToAutoStash() || mIsStashed || mEnableBlockingTimeoutDuringTests) { + if (!mActivity.isTransientTaskbar() || mIsStashed || mEnableBlockingTimeoutDuringTests) { return; } @@ -1447,11 +1362,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba if (mControllers.taskbarAutohideSuspendController.isTransientTaskbarStashingSuspended()) { return; } - if (mActivity.isTransientTaskbar()) { - updateAndAnimateTransientTaskbarForTimeout(); - } else if (shouldAllowTaskbarToAutoStash()) { - updateAndAnimatePinnedTaskbarForTimeout(); - } + updateAndAnimateTransientTaskbarForTimeout(); } @VisibleForTesting diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt index fd259223d2..df10d24d2a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt @@ -47,8 +47,7 @@ class TaskbarStashViaTouchController(val controllers: TaskbarControllers) : Touc private val maxVisualDisplacement = activity.resources.getDimensionPixelSize(R.dimen.transient_taskbar_bottom_margin).toFloat() /** How far the swipe could go, if user swiped from the very top of TaskbarView. */ - private val maxTouchDisplacement = - maxVisualDisplacement + activity.deviceProfile.taskbarProfile.height + private val maxTouchDisplacement = maxVisualDisplacement + activity.deviceProfile.taskbarHeight private val touchDisplacementToStash = activity.resources.getDimensionPixelSize(R.dimen.taskbar_to_nav_threshold).toFloat() @@ -69,8 +68,7 @@ class TaskbarStashViaTouchController(val controllers: TaskbarControllers) : Touc ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, activity.resources, ) - gestureHeightYThreshold = - (activity.deviceProfile.deviceProperties.heightPx - gestureHeight).toFloat() + gestureHeightYThreshold = (activity.deviceProfile.heightPx - gestureHeight).toFloat() } private fun createSwipeListener() = @@ -128,14 +126,6 @@ class TaskbarStashViaTouchController(val controllers: TaskbarControllers) : Touc if (ev.action == MotionEvent.ACTION_OUTSIDE) { controllers.taskbarStashController.updateAndAnimateTransientTaskbar(true) } else if (controllers.taskbarViewController.isEventOverAnyItem(screenCoordinatesEv)) { - // TODO (b/411155437) remove this once BubbleDragController implements TouchController - val bubbleBarDragInProgress = - controllers.bubbleControllers - .map { it.bubbleDragController.isDragging } - .orElse(false) - if (bubbleBarDragInProgress) { - return false - } swipeDownDetector.onTouchEvent(ev) if (swipeDownDetector.isDraggingState) { return true diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarThresholdUtils.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarThresholdUtils.java index d3d7f5e143..17516f3616 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarThresholdUtils.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarThresholdUtils.java @@ -38,7 +38,7 @@ public class TaskbarThresholdUtils { private static int getThreshold(Resources r, DeviceProfile dp, int thresholdDimen, int multiplierDimen) { - float landscapeScreenHeight = dp.getDeviceProperties().isLandscape() ? dp.getDeviceProperties().getHeightPx() : dp.getDeviceProperties().getWidthPx(); + float landscapeScreenHeight = dp.isLandscape ? dp.heightPx : dp.widthPx; float screenPart = (landscapeScreenHeight * SCREEN_UNITS); float defaultDp = dpiFromPx(screenPart, DisplayMetrics.DENSITY_DEVICE_STABLE); float thisDp = dpToPx(defaultDp); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java index 06057038f0..b567871b92 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java @@ -72,11 +72,6 @@ public class TaskbarUIController implements BubbleBarController.BubbleBarLocatio @CallSuper protected void onDestroy() { mControllers = null; - RecentsView recentsView = getRecentsView(); - if (recentsView != null) { - recentsView.setTaskLaunchListener(null); - recentsView.setTaskLaunchCancelledRunnable(null); - } } protected boolean isTaskbarTouchable() { @@ -167,13 +162,6 @@ public class TaskbarUIController implements BubbleBarController.BubbleBarLocatio mControllers.taskbarActivityContext.startTranslationSpring(); } - /** - * @return if we should allow taskbar to auto stash - */ - public boolean shouldAllowTaskbarToAutoStash() { - return mControllers.taskbarActivityContext.shouldAllowTaskbarToAutoStash(); - } - /** * @param ev MotionEvent in screen coordinates. * @return Whether any Taskbar item could handle the given MotionEvent if given the chance. @@ -234,15 +222,6 @@ public class TaskbarUIController implements BubbleBarController.BubbleBarLocatio } } - public boolean isDraggingItem() { - boolean bubblesDragging = false; - if (mControllers.bubbleControllers.isPresent()) { - bubblesDragging = - mControllers.bubbleControllers.get().bubbleDragController.isDragging(); - } - return mControllers.taskbarDragController.isDragging() || bubblesDragging; - } - @CallSuper protected void dumpLogs(String prefix, PrintWriter pw) { pw.println(String.format( diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index b55bf4a1ee..e196ab3ad2 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -16,7 +16,6 @@ package com.android.launcher3.taskbar; import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED; -import static android.window.DesktopModeFlags.ENABLE_TASKBAR_OVERFLOW; import static android.window.DesktopModeFlags.ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION; import static com.android.launcher3.BubbleTextView.DISPLAY_TASKBAR; @@ -39,7 +38,6 @@ import android.view.InputDevice; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.widget.FrameLayout; import androidx.annotation.LayoutRes; @@ -53,7 +51,6 @@ import com.android.launcher3.Insettable; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.apppairs.AppPairIcon; -import com.android.launcher3.celllayout.CellInfo; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.folder.PreviewBackground; import com.android.launcher3.model.data.AppPairInfo; @@ -120,14 +117,6 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar private int mNextViewIndex; - public int getIgnoreTaskbarIconCount() { - return mIgnoreTaskbarIconCount; - } - - // TODO: clean it up in follow up cl with removal of taskbar icon alignment. - // Only used for edge of 3 button navigation mode, where we need to hide icons which go - // beyond the bounds. - private int mIgnoreTaskbarIconCount = 0; /** * Whether the divider is between Hotseat icons and Recents, * instead of between All Apps button and Hotseat. @@ -177,11 +166,10 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar onDeviceProfileChanged(mActivityContext.getDeviceProfile()); int actualMargin = resources.getDimensionPixelSize(R.dimen.taskbar_icon_spacing); - int actualIconSize = - mActivityContext.getDeviceProfile().getTaskbarProfile().getIconSize(); - if (enableTaskbarPinning() && canTransitionToTransientTaskbar()) { + int actualIconSize = mActivityContext.getDeviceProfile().taskbarIconSize; + if (enableTaskbarPinning() && !mActivityContext.isThreeButtonNav()) { DeviceProfile deviceProfile = mActivityContext.getTransientTaskbarDeviceProfile(); - actualIconSize = deviceProfile.getTaskbarProfile().getIconSize(); + actualIconSize = deviceProfile.taskbarIconSize; } int visualIconSize = (int) (actualIconSize * ICON_VISIBLE_AREA_FACTOR); @@ -194,10 +182,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar // We always layout taskbar as a transient taskbar when we have taskbar pinning feature on, // then we scale and translate the icons to match persistent taskbar designs, so we use // taskbar icon size from current device profile to calculate correct item padding. - mItemPadding = (mIconTouchSize - mActivityContext - .getDeviceProfile() - .getTaskbarProfile() - .getIconSize()) / 2; + mItemPadding = (mIconTouchSize - mActivityContext.getDeviceProfile().taskbarIconSize) / 2; mFolderLeaveBehindColor = Themes.getAttrColor(mActivityContext, android.R.attr.textColorTertiary); @@ -213,7 +198,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar mTaskbarDividerContainer = new TaskbarDividerContainer(context); } - if (ENABLE_TASKBAR_OVERFLOW.isTrue()) { + if (Flags.taskbarOverflow()) { mTaskbarOverflowView = TaskbarOverflowView.inflateIcon( R.layout.taskbar_overflow_view, this, mIconTouchSize, mItemPadding); @@ -232,7 +217,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar */ private int calculateMaxNumIcons() { DeviceProfile deviceProfile = mActivityContext.getDeviceProfile(); - int availableWidth = deviceProfile.getDeviceProperties().getWidthPx(); + int availableWidth = deviceProfile.widthPx; int defaultEdgeMargin = (int) getResources().getDimension(deviceProfile.inv.inlineNavButtonsEndSpacing); int spaceForBubbleBar = @@ -240,12 +225,11 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar // Reserve space required for edge margins, or for navbar if shown. If task bar needs to be // center aligned with nav bar shown, reserve space on both sides. - availableWidth -= Math.max( - defaultEdgeMargin + spaceForBubbleBar, - deviceProfile.getHotseatProfile().getBarEndOffset()); + availableWidth -= + Math.max(defaultEdgeMargin + spaceForBubbleBar, deviceProfile.hotseatBarEndOffset); availableWidth -= Math.max( defaultEdgeMargin + (mShouldTryStartAlign ? 0 : spaceForBubbleBar), - mShouldTryStartAlign ? 0 : deviceProfile.getHotseatProfile().getBarEndOffset()); + mShouldTryStartAlign ? 0 : deviceProfile.hotseatBarEndOffset); // The space taken by an item icon used during layout. int iconSize = 2 * mItemMarginLeftRight + mIconTouchSize; @@ -262,7 +246,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar // All apps icon takes less space compared to normal icon size, reserve space for the icon // separately. boolean forceTransientTaskbarSize = - enableTaskbarPinning() && canTransitionToTransientTaskbar(); + enableTaskbarPinning() && !mActivityContext.isThreeButtonNav(); availableWidth -= iconSize - (int) getResources().getDimension( mAllAppsButtonContainer.getAllAppsButtonTranslationXOffset( forceTransientTaskbarSize || mActivityContext.isTransientTaskbar())); @@ -271,22 +255,13 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar return Math.floorDiv(availableWidth, iconSize) + additionalIcons; } - /** - * Whether the taskbar in the state context supports transition to a transient taskbar (e.g. - * using a popup menu). - */ - boolean canTransitionToTransientTaskbar() { - return mActivityContext.getTaskbarFeatureEvaluator() - .getSupportsTransitionToTransientTaskbar(); - } - /** * Recalculates the max number of icons the taskbar view can show without entering overflow. * Returns whether the max number of icons changed and the change affects the number of icons * that should be shown in the taskbar. */ boolean updateMaxNumIcons() { - if (!ENABLE_TASKBAR_OVERFLOW.isTrue()) { + if (!Flags.taskbarOverflow()) { return false; } int oldMaxNumIcons = mMaxNumIcons; @@ -379,35 +354,26 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar mIconLongClickListener = mControllerCallbacks.getIconOnLongClickListener(); mAllAppsButtonContainer.setUpCallbacks(callbacks); + if (mTaskbarDividerContainer != null + && mActivityContext.getTaskbarFeatureEvaluator().getSupportsPinningPopup()) { + mTaskbarDividerContainer.setUpCallbacks(callbacks); + } if (mTaskbarOverflowView != null) { mTaskbarOverflowView.setOnClickListener( mControllerCallbacks.getOverflowOnClickListener()); mTaskbarOverflowView.setOnLongClickListener( mControllerCallbacks.getOverflowOnLongClickListener()); - if (enableCursorHoverStates()) { - setHoverListenerForIcon(mTaskbarOverflowView); - } + } + if (Flags.showTaskbarPinningPopupFromAnywhere() + && mActivityContext.getTaskbarFeatureEvaluator().getSupportsPinningPopup()) { + setOnTouchListener(mControllerCallbacks.getTaskbarTouchListener()); } - if (ENABLE_TASKBAR_OVERFLOW.isTrue()) { + if (Flags.taskbarOverflow()) { mMaxNumIcons = calculateMaxNumIcons(); } } - void updatePinningPopupEventHandlers() { - boolean supportsPinningPopup = - mActivityContext.getTaskbarFeatureEvaluator().getSupportsPinningPopup(); - if (mTaskbarDividerContainer != null) { - mTaskbarDividerContainer.setUpCallbacks( - supportsPinningPopup ? mControllerCallbacks : null); - } - - if (Flags.showTaskbarPinningPopupFromAnywhere()) { - setOnTouchListener( - supportsPinningPopup ? mControllerCallbacks.getTaskbarTouchListener() : null); - } - } - private void removeAndRecycle(View view) { removeView(view); view.setOnClickListener(null); @@ -433,11 +399,6 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } else { updateItemsWithoutLayoutTransition(hotseatItemInfos, recentTasks); } - mAllAppsButtonContainer.updateTaskbarMinimalState(isTaskbarInMinimalState()); - } - - public boolean isTaskbarInMinimalState() { - return getIconViews().length <= 1; } private void updateItemsWithoutLayoutTransition( @@ -456,9 +417,6 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } removeView(mQsb); - mIgnoreTaskbarIconCount = getIgnoreCountForTaskbarIcons(recentTasks.size(), - hotseatItemInfos.length); - updateHotseatItems(hotseatItemInfos); if (mTaskbarDividerContainer != null && !recentTasks.isEmpty()) { @@ -496,9 +454,6 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar mNextViewIndex++; } - mIgnoreTaskbarIconCount = getIgnoreCountForTaskbarIcons(recentTasks.size(), - hotseatItemInfos.length); - // Update left section. if (mIsRtl) { updateRecents(recentTasks.reversed(), hotseatItemInfos.length); @@ -520,14 +475,8 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } // Recents divider takes priority. - if (!mAddedDividerForRecents) { - boolean allAppsDividerAllowed = !mActivityContext.isTaskbarShowingDesktopTasks(); - if (allAppsDividerAllowed) { - updateAllAppsDivider(); - } else if (getChildAt(getExpectedAllAppsDividerIndex()) == mTaskbarDividerContainer) { - removeView(mTaskbarDividerContainer); - } - + if (!mAddedDividerForRecents && !mActivityContext.isInDesktopMode()) { + updateAllAppsDivider(); } } @@ -550,7 +499,8 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar private void updateAllAppsDivider() { // Index where All Apps divider would be if it is already in Taskbar. - final int expectedAllAppsDividerIndex = getExpectedAllAppsDividerIndex(); + final int expectedAllAppsDividerIndex = + mIsRtl ? getChildCount() - mNumStaticViews - 1 : mNumStaticViews; if (getChildAt(expectedAllAppsDividerIndex) == mTaskbarDividerContainer && getChildCount() == mNumStaticViews + 1) { // Only static views with divider so remove divider. @@ -565,57 +515,6 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } } - private int getExpectedAllAppsDividerIndex() { - return mIsRtl ? getChildCount() - mNumStaticViews - 1 : mNumStaticViews; - } - - /** - * Calculate how many icon we need to not show in Taskbar that are present in hotseat. - */ - private int getIgnoreCountForTaskbarIcons(int recentsIcons, int hotseatIcons) { - - if (!mActivityContext.isThreeButtonNav() - || mActivityContext.getTaskbarFeatureEvaluator().isRecentsEnabled()) { - return 0; - } - - DeviceProfile deviceProfile = mActivityContext.getDeviceProfile(); - - // Add icon for all apps. - int icons = 1; - - // Only include divider line in count if will be added to Taskbar view which is in - // conditions below. - if (mActivityContext.isInDesktopMode() && recentsIcons > 0) { - icons += 1; - } else if (recentsIcons + hotseatIcons != 0) { - icons += 1; - } - int spaceNeeded = getIconLayoutWidth(icons + recentsIcons + hotseatIcons); - - boolean areBubblesVisible = - mControllerCallbacks.isBubbleBarEnabled() && mBubbleBarLocation != null; - int screenWidth = this.getResources().getDisplayMetrics().widthPixels; - int navSpaceNeeded = deviceProfile.getHotseatProfile().getBarEndOffset(); - - int ignoreCount = 0; - //Screen Width - nav space - int amountOfSpaceTaskbarIconsCanHave = screenWidth - navSpaceNeeded; - if (areBubblesVisible) { - // size of bubbles Icon and margin on the side. - int bubbleBarMargin = getResources().getDimensionPixelSize( - R.dimen.transient_taskbar_bottom_margin); - amountOfSpaceTaskbarIconsCanHave -= (mIconTouchSize + bubbleBarMargin); - } - int taskbarIconSpaceNeeded = spaceNeeded; - while (amountOfSpaceTaskbarIconsCanHave < taskbarIconSpaceNeeded) { - ignoreCount++; - int iconSpace = mIconTouchSize + (2 * mItemMarginLeftRight); - taskbarIconSpaceNeeded -= iconSpace; - } - return ignoreCount; - } - private void updateHotseatItems(ItemInfo[] hotseatItemInfos) { int numViewsAnimated = 0; @@ -675,7 +574,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } else { hotseatView = inflate(expectedLayoutResId); } - LayoutParams lp = new TaskbarLayoutParams(mIconTouchSize, mIconTouchSize); + LayoutParams lp = new LayoutParams(mIconTouchSize, mIconTouchSize); hotseatView.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding); addView(hotseatView, mNextViewIndex, lp); } else if (hotseatView instanceof FolderIcon fi) { @@ -683,13 +582,6 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar fi.getFolder().reapplyItemInfo(); } - if (hotseatView.getLayoutParams() instanceof TaskbarLayoutParams tlp) { - tlp.bindInfo = new CellInfo(hotseatView, - hotseatItemInfo.screenId, hotseatItemInfo.container, - hotseatItemInfo.cellX, hotseatItemInfo.cellY, - hotseatItemInfo.spanX, hotseatItemInfo.spanY); - } - // Apply the Hotseat ItemInfos, or hide the view if there is none for a given index. if (hotseatView instanceof BubbleTextView btv && hotseatItemInfo instanceof WorkspaceItemInfo workspaceInfo) { @@ -714,7 +606,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } private void updateRecents(List recentTasks, int hotseatSize) { - boolean supportsOverflow = ENABLE_TASKBAR_OVERFLOW.isTrue() && recentTasks.size() > 1; + boolean supportsOverflow = Flags.taskbarOverflow() && recentTasks.size() > 1; int overflowSize = 0; boolean hasOverflow = false; if (supportsOverflow && mTaskbarOverflowView != null) { @@ -808,7 +700,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar if (recentIcon == null) { // TODO(b/343289567 and b/316004172): support app pairs and desktop mode. recentIcon = inflate(expectedLayoutResId); - LayoutParams lp = new TaskbarLayoutParams(mIconTouchSize, mIconTouchSize); + LayoutParams lp = new LayoutParams(mIconTouchSize, mIconTouchSize); recentIcon.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding); addView(recentIcon, mNextViewIndex, lp); } @@ -857,7 +749,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar if (taskIcon != null) { taskIcon = taskIcon.getConstantState().newDrawable().mutate(); } - btv.applyIconAndLabel(taskIcon, task.title, task.titleDescription); + btv.applyIconAndLabel(taskIcon, task.titleDescription); btv.setTag(singleTask); } @@ -906,15 +798,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar return 0; } Rect iconsBounds = getTransientTaskbarIconLayoutBoundsInParent(); - - int translateXFromIgnoredIcons = - mIgnoreTaskbarIconCount * (mIconTouchSize + mItemMarginLeftRight); - // If bubble bar or right translate in opposite direction. - if (!location.isOnLeft(isLayoutRtl())) { - translateXFromIgnoredIcons *= -1; - } - return getTaskBarIconsEndForBubbleBarLocation(location) - iconsBounds.right - + translateXFromIgnoredIcons; + return getTaskBarIconsEndForBubbleBarLocation(location) - iconsBounds.right; } @Override @@ -922,12 +806,11 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar int spaceNeeded = getIconLayoutWidth(); boolean layoutRtl = isLayoutRtl(); DeviceProfile deviceProfile = mActivityContext.getDeviceProfile(); - int navSpaceNeeded = deviceProfile.getHotseatProfile().getBarEndOffset(); + int navSpaceNeeded = deviceProfile.hotseatBarEndOffset; int centerAlignIconEnd = (right + left + spaceNeeded) / 2; int iconEnd = centerAlignIconEnd; if (mShouldTryStartAlign) { - int startSpacingPx = - deviceProfile.getHotseatProfile().getInlineNavButtonsEndSpacingPx(); + int startSpacingPx = deviceProfile.inlineNavButtonsEndSpacingPx; if (mControllerCallbacks.isBubbleBarEnabled() && mBubbleBarLocation != null && mActivityContext.shouldStartAlignTaskbar()) { @@ -989,16 +872,6 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar iconEnd += mAllAppsButtonTranslationOffset; } - if (mActivityContext.isThreeButtonNav()) { - boolean navbarOnLeft = mBubbleBarLocation != null && !mBubbleBarLocation.isOnLeft( - layoutRtl); - if (navbarOnLeft && layoutRtl) { - iconEnd -= (mIconTouchSize + mItemMarginLeftRight) * mIgnoreTaskbarIconCount; - } else if (!navbarOnLeft && !layoutRtl) { - iconEnd += (mIconTouchSize + mItemMarginLeftRight) * mIgnoreTaskbarIconCount; - } - } - mControllerCallbacks.onPreLayoutChildren(); int count = getChildCount(); @@ -1014,8 +887,8 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar qsbEnd = iconEnd - mItemMarginLeftRight; qsbStart = qsbEnd - deviceProfile.hotseatQsbWidth; } - int qsbTop = (bottom - top - deviceProfile.getHotseatProfile().getQsbHeight()) / 2; - int qsbBottom = qsbTop + deviceProfile.getHotseatProfile().getQsbHeight(); + int qsbTop = (bottom - top - deviceProfile.hotseatQsbHeight) / 2; + int qsbBottom = qsbTop + deviceProfile.hotseatQsbHeight; child.layout(qsbStart, qsbTop, qsbEnd, qsbBottom); } else if (child == mTaskbarDividerContainer) { iconEnd += mItemMarginLeftRight; @@ -1101,17 +974,10 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } /** - * Returns the space used by the icons. + * Returns the space used by the icons */ private int getIconLayoutWidth() { - return getIconLayoutWidth(getChildCount()); - } - - /** - * Return the space needed based on the number of taskbar icons supplied vs existing children. - */ - private int getIconLayoutWidth(int expectedNumberOfTaskbarIcons) { - int countExcludingQsb = expectedNumberOfTaskbarIcons; + int countExcludingQsb = getChildCount(); DeviceProfile deviceProfile = mActivityContext.getDeviceProfile(); if (deviceProfile.isQsbInline) { countExcludingQsb--; @@ -1226,12 +1092,6 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } } - @Override - protected void dispatchDraw(Canvas canvas) { - if (mActivityContext.isDestroyed()) return; - super.dispatchDraw(canvas); - } - private View inflate(@LayoutRes int layoutResId) { return mActivityContext.getViewCache().getView(layoutResId, mActivityContext, this); } @@ -1261,43 +1121,11 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar private float getTaskBarIconsEndForBubbleBarLocation(BubbleBarLocation location) { DeviceProfile deviceProfile = mActivityContext.getDeviceProfile(); boolean navbarOnRight = location.isOnLeft(isLayoutRtl()); - int navSpaceNeeded = deviceProfile.getHotseatProfile().getBarEndOffset(); + int navSpaceNeeded = deviceProfile.hotseatBarEndOffset; if (navbarOnRight) { return getWidth() - navSpaceNeeded; } else { return navSpaceNeeded + getIconLayoutWidth(); } } - - @Override - protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { - return new TaskbarLayoutParams(lp); - } - - @Override - public LayoutParams generateLayoutParams(AttributeSet attrs) { - return new TaskbarLayoutParams(getContext(), attrs); - } - - @Override - protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { - return p instanceof TaskbarLayoutParams; - } - - public static class TaskbarLayoutParams extends FrameLayout.LayoutParams { - - @Nullable public CellInfo bindInfo; - - public TaskbarLayoutParams(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public TaskbarLayoutParams(ViewGroup.LayoutParams source) { - super(source); - } - - public TaskbarLayoutParams(int width, int height) { - super(width, height); - } - } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java index 59707f50d8..d0886e0ca1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java @@ -132,7 +132,7 @@ public class TaskbarViewCallbacks { * Notifies launcher to update icon alignment. */ public void notifyIconLayoutBoundsChanged() { - mControllers.taskbarViewController.notifyIconLayoutBoundsChanged(); + mControllers.uiController.onIconLayoutBoundsChanged(); } /** @@ -203,7 +203,7 @@ public class TaskbarViewCallbacks { mTaskbarView.getTaskbarOverflowView().getIsActive()); } mControllers.keyboardQuickSwitchController.toggleQuickSwitchViewForTaskbar( - mControllers.taskbarViewController.getShownTaskIds(), + mControllers.taskbarViewController.getTaskIdsForPinnedApps(), this::onKeyboardQuickSwitchViewClosed); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt index bca51e7e82..6e948894c2 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt @@ -18,14 +18,15 @@ package com.android.launcher3.taskbar import android.app.contextualsearch.ContextualSearchManager.ENTRYPOINT_LONG_PRESS_META import android.content.Context -import com.android.launcher3.dagger.LauncherComponentProvider +import com.android.launcher3.R import com.android.launcher3.logging.StatsLogManager +import com.android.launcher3.util.ResourceBasedOverride +import com.android.launcher3.util.ResourceBasedOverride.Overrides import com.android.quickstep.TopTaskTracker import com.android.quickstep.util.ContextualSearchInvoker -import javax.inject.Inject /** Creates [TaskbarViewCallbacks] instances. */ -open class TaskbarViewCallbacksFactory @Inject constructor() { +open class TaskbarViewCallbacksFactory : ResourceBasedOverride { open fun create( activity: TaskbarActivityContext, @@ -42,7 +43,7 @@ open class TaskbarViewCallbacksFactory @Inject constructor() { val runningPackage = TopTaskTracker.INSTANCE[activity].getCachedTopTask( /* filterOnlyVisibleRecents */ true, - activity.displayId, + activity.display.displayId, ) .getPackageName() activity.statsLogManager @@ -64,7 +65,11 @@ open class TaskbarViewCallbacksFactory @Inject constructor() { companion object { @JvmStatic fun newInstance(context: Context): TaskbarViewCallbacksFactory { - return LauncherComponentProvider.get(context).getTaskbarViewCallbacksFactory() + return Overrides.getObject( + TaskbarViewCallbacksFactory::class.java, + context, + R.string.taskbar_view_callbacks_factory_class, + ) } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index afcbc852c3..ce38e666f6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -20,13 +20,14 @@ import static android.animation.LayoutTransition.CHANGE_APPEARING; import static android.animation.LayoutTransition.CHANGE_DISAPPEARING; import static android.animation.LayoutTransition.DISAPPEARING; import static android.view.Display.DEFAULT_DISPLAY; -import static android.window.DesktopModeFlags.ENABLE_TASKBAR_OVERFLOW; import static android.window.DesktopModeFlags.ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION; import static com.android.app.animation.Interpolators.EMPHASIZED; import static com.android.app.animation.Interpolators.FINAL_FRAME; import static com.android.app.animation.Interpolators.LINEAR; +import static com.android.launcher3.BubbleTextView.LINE_INDICATOR_ANIM_DURATION; import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation; +import static com.android.launcher3.Flags.taskbarOverflow; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA; import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X; @@ -80,7 +81,6 @@ import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.RevealOutlineAnimation; import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.model.ModelWriter; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.TaskItemInfo; import com.android.launcher3.taskbar.bubbles.BubbleBarController; @@ -94,7 +94,6 @@ import com.android.launcher3.util.MultiPropertyFactory.MultiProperty; import com.android.launcher3.util.MultiTranslateDelegate; import com.android.launcher3.util.MultiValueAlpha; import com.android.launcher3.util.SandboxContext; -import com.android.launcher3.views.IconButtonView; import com.android.quickstep.util.GroupTask; import com.android.quickstep.util.SingleTask; import com.android.systemui.shared.recents.model.Task; @@ -137,9 +136,11 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar private static final float ERROR_POSITION_IN_HOTSEAT_NOT_FOUND = -100; private static final int TRANSITION_DELAY = 50; - static final int TRANSITION_DEFAULT_DURATION = 500; + private static final int TRANSITION_DEFAULT_DURATION = 500; private static final int TRANSITION_FADE_IN_DURATION = 167; private static final int TRANSITION_FADE_OUT_DURATION = 83; + private static final int APPEARING_LINE_INDICATOR_ANIM_DELAY = + TRANSITION_DEFAULT_DURATION - LINE_INDICATOR_ANIM_DURATION; private final TaskbarActivityContext mActivity; private @Nullable TaskbarDragLayerController mDragLayerController; @@ -163,9 +164,6 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar private final AnimatedFloat mTranslationXForBubbleBar = new AnimatedFloat( this::updateTranslationXForBubbleBar); - private final TransitionEndBoundsChangedNotifier mTransitionEndBoundsChangedNotifier = - new TransitionEndBoundsChangedNotifier(); - @Nullable private Animator mTaskbarShiftXAnim; @Nullable @@ -226,27 +224,24 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar private final float mTaskbarLeftRightMargin; - private final TaskbarRunningAppStateAnimationController mRunningStateController; - public TaskbarViewController(TaskbarActivityContext activity, TaskbarView taskbarView) { mActivity = activity; mTransientTaskbarDp = mActivity.getTransientTaskbarDeviceProfile(); mPersistentTaskbarDp = mActivity.getPersistentTaskbarDeviceProfile(); - mTransientIconSize = mTransientTaskbarDp.getTaskbarProfile().getIconSize(); - mPersistentIconSize = mPersistentTaskbarDp.getTaskbarProfile().getIconSize(); + mTransientIconSize = mTransientTaskbarDp.taskbarIconSize; + mPersistentIconSize = mPersistentTaskbarDp.taskbarIconSize; mTaskbarView = taskbarView; mTaskbarIconAlpha = new MultiValueAlpha(mTaskbarView, NUM_ALPHA_CHANNELS); mTaskbarIconAlpha.setUpdateVisibility(true); mModelCallbacks = TaskbarModelCallbacksFactory.newInstance(mActivity) .create(mActivity, mTaskbarView); - mTaskbarBottomMargin = activity.getDeviceProfile().getTaskbarProfile().getBottomMargin(); + mTaskbarBottomMargin = activity.getDeviceProfile().taskbarBottomMargin; mStashedHandleHeight = activity.getResources() .getDimensionPixelSize(R.dimen.taskbar_stashed_handle_height); mIsRtl = Utilities.isRtl(mTaskbarView.getResources()); mTaskbarLeftRightMargin = mActivity.getResources().getDimensionPixelSize( R.dimen.transient_taskbar_padding); - mRunningStateController = new TaskbarRunningAppStateAnimationController(mActivity); } /** @@ -267,12 +262,9 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar mTaskbarView.init(TaskbarViewCallbacksFactory.newInstance(mActivity).create( mActivity, mControllers, mTaskbarView)); - // Pinning popup feature availability depends on taskbar controllers, wait for the - // controllers state initialization before evaluating the feature. - mControllers.runAfterInit(mTaskbarView::updatePinningPopupEventHandlers); mTaskbarView.getLayoutParams().height = mActivity.isPhoneMode() ? mActivity.getResources().getDimensionPixelSize(R.dimen.taskbar_phone_size) - : mActivity.getDeviceProfile().getTaskbarProfile().getHeight(); + : mActivity.getDeviceProfile().taskbarHeight; mTaskbarIconScaleForStash.updateValue(1f); float pinningValue = @@ -306,14 +298,6 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar } } - /** - * Called whenever a new ui controller is set. - */ - public void onUiControllerChanged() { - // Pinning availability may depend on UI state when home has "locked" pinned taskbar. - mTaskbarView.updatePinningPopupEventHandlers(); - } - /** Adjusts start aligned taskbar layout accordingly to the bubble bar position. */ @Override public void onBubbleBarLocationUpdated(BubbleBarLocation location) { @@ -411,7 +395,6 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar } LauncherAppState.getInstance(mActivity).getModel().removeCallbacks(mModelCallbacks); mActivity.removeOnDeviceProfileChangeListener(mDeviceProfileChangeListener); - mRunningStateController.onDestroy(); } /** @@ -429,12 +412,6 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar return mTaskbarIconAlpha; } - /** Creates a ModelWriter for updating model properties */ - public ModelWriter getModelWriter() { - return LauncherAppState.getInstance(mActivity).getModel() - .getWriter(false, mActivity.getCellPosMapper(), mModelCallbacks); - } - /** * Should be called when the recents button is disabled, so we can hide Taskbar icons as well. */ @@ -586,7 +563,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar sizeDiffTranslationRange *= -1; } - if (!mTaskbarView.canTransitionToTransientTaskbar()) { + if (mActivity.isThreeButtonNav()) { mTaskbarView.getAllAppsButtonContainer() .setTranslationXForTaskbarAllAppsIcon(allAppIconTranslateRange); return; @@ -688,19 +665,17 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar // finally placing the icon in the middle of new taskbar background height. if (mControllers.getSharedState().startTaskbarVariantIsTransient) { float transY = - mTransientTaskbarDp.getTaskbarProfile().getBottomMargin() + ( - mTransientTaskbarDp.getTaskbarProfile().getHeight() + mTransientTaskbarDp.taskbarBottomMargin + (mTransientTaskbarDp.taskbarHeight - mTaskbarView.getTransientTaskbarIconLayoutBounds().bottom) - - (mPersistentTaskbarDp.getTaskbarProfile().getHeight() - - mTransientTaskbarDp.getTaskbarProfile().getIconSize()) / 2f; + - (mPersistentTaskbarDp.taskbarHeight + - mTransientTaskbarDp.taskbarIconSize) / 2f; taskbarIconTranslationYForPinningValue = mapRange(scale, 0f, transY); } else { float transY = - -mTransientTaskbarDp.getTaskbarProfile().getBottomMargin() + ( - mPersistentTaskbarDp.getTaskbarProfile().getHeight() + -mTransientTaskbarDp.taskbarBottomMargin + (mPersistentTaskbarDp.taskbarHeight - mTaskbarView.getTransientTaskbarIconLayoutBounds().bottom) - - (mTransientTaskbarDp.getTaskbarProfile().getHeight() - - mTransientTaskbarDp.getTaskbarProfile().getIconSize()) / 2f; + - (mTransientTaskbarDp.taskbarHeight + - mTransientTaskbarDp.taskbarIconSize) / 2f; taskbarIconTranslationYForPinningValue = mapRange(scale, transY, 0f); } return taskbarIconTranslationYForPinningValue; @@ -773,41 +748,33 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar } private boolean shouldUpdateIconContentDescription(BubbleTextView btv) { - boolean isInDesktopMode = - mControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar( - DEFAULT_DISPLAY); + boolean isInDesktopMode = mControllers.taskbarDesktopModeController.isInDesktopMode( + DEFAULT_DISPLAY); boolean isAllAppsButton = btv instanceof TaskbarAllAppsButtonContainer; boolean isDividerButton = btv instanceof TaskbarDividerContainer; return isInDesktopMode && !isAllAppsButton && !isDividerButton; } /** - * @return A set of Task ids shown in the taskbar - includes task ID for running tasks of pinned - * apps, and standalone running tasks. + * @return A set of Task ids of running apps that are pinned in the taskbar. */ - protected Set getShownTaskIds() { - if (!ENABLE_TASKBAR_OVERFLOW.isTrue()) { + protected Set getTaskIdsForPinnedApps() { + if (!taskbarOverflow()) { return Collections.emptySet(); } - Set shownTasks = new HashSet<>(); + Set pinnedAppsWithTasks = new HashSet<>(); for (View iconView : getIconViews()) { - if (iconView instanceof BubbleTextView btv) { - if (btv.getTag() instanceof TaskItemInfo itemInfo) { - shownTasks.add(itemInfo.getTaskId()); - } else if (btv.getTag() instanceof SingleTask task) { - shownTasks.add(task.getTask().getKey().id); - } + if (iconView instanceof BubbleTextView btv + && btv.getTag() instanceof TaskItemInfo itemInfo) { + pinnedAppsWithTasks.add(itemInfo.getTaskId()); } } - return shownTasks; + return pinnedAppsWithTasks; } private void updateRunningState(BubbleTextView btv) { - mRunningStateController.updateRunningState( - btv, - getRunningAppState(btv), - /* animate = */ mTaskbarView.getLayoutTransition() != null); + btv.updateRunningState(getRunningAppState(btv), mTaskbarView.getLayoutTransition() != null); } private BubbleTextView.RunningAppState getRunningAppState(BubbleTextView btv) { @@ -908,16 +875,6 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar as.play(reveal); } - void notifyIconLayoutBoundsChanged() { - final LayoutTransition layoutTransition = mTaskbarView.getLayoutTransition(); - if (layoutTransition != null && layoutTransition.isRunning()) { - // Defers notify until after transitions finish. - mTransitionEndBoundsChangedNotifier.mIsCanceled = false; - } else { - mControllers.uiController.onIconLayoutBoundsChanged(); - } - } - /** * Sets the Taskbar icon alignment relative to Launcher hotseat icons * @param alignmentRatio [0, 1] @@ -941,12 +898,6 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar mIsHotseatIconOnTopWhenAligned = isHotseatIconOnTopWhenAligned; mIsIconAlignedWithHotseat = isIconAlignedWithHotseat; mIsStashed = isStashed; - - final LayoutTransition layoutTransition = mTaskbarView.getLayoutTransition(); - if (layoutTransition != null && layoutTransition.isRunning()) { - mTransitionEndBoundsChangedNotifier.mIsCanceled = true; - layoutTransition.cancel(); - } mIconAlignControllerLazy = createIconAlignmentController(launcherDp); } mIconAlignControllerLazy.setPlayFraction(alignmentRatio); @@ -989,16 +940,12 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar Rect hotseatPadding = launcherDp.getHotseatLayoutPadding(mActivity); boolean isTransientTaskbar = mActivity.isTransientTaskbar(); - float scaleUp = ((float) launcherDp.iconSizePx) - / taskbarDp.getTaskbarProfile().getIconSize(); + float scaleUp = ((float) launcherDp.iconSizePx) / taskbarDp.taskbarIconSize; int borderSpacing = launcherDp.hotseatBorderSpace; int hotseatCellSize = DeviceProfile.calculateCellWidth( - launcherDp.getDeviceProperties().getAvailableWidthPx() - - hotseatPadding.left - - hotseatPadding.right, + launcherDp.availableWidthPx - hotseatPadding.left - hotseatPadding.right, borderSpacing, - launcherDp.numShownHotseatIcons - ); + launcherDp.numShownHotseatIcons); boolean isToHome = mControllers.uiController.isIconAlignedWithHotseat(); boolean isDeviceLocked = mControllers.taskbarStashController.isDeviceLocked(); @@ -1023,14 +970,13 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar } } int collapsedHeight = mActivity.getDefaultTaskbarWindowSize(); - int expandedHeight = Math.max(collapsedHeight, - taskbarDp.getTaskbarProfile().getHeight() + offsetY); + int expandedHeight = Math.max(collapsedHeight, taskbarDp.taskbarHeight + offsetY); setter.addOnFrameListener(anim -> mActivity.setTaskbarWindowSize( anim.getAnimatedFraction() > 0 ? expandedHeight : collapsedHeight)); mTaskbarBottomMargin = isTransientTaskbar - ? mTransientTaskbarDp.getTaskbarProfile().getBottomMargin() - : mPersistentTaskbarDp.getTaskbarProfile().getBottomMargin(); + ? mTransientTaskbarDp.taskbarBottomMargin + : mPersistentTaskbarDp.taskbarBottomMargin; int firstRecentTaskIndex = -1; int hotseatNavBarTranslationX = 0; @@ -1040,17 +986,12 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar hotseatNavBarTranslationX = taskbarDp .getHotseatTranslationXForNavBar(mActivity, isBubblesOnLeft); } - - int ignoreCount = mTaskbarView.getIgnoreTaskbarIconCount(); - for (int i = 0; i < mTaskbarView.getChildCount(); i++) { View child = mTaskbarView.getChildAt(i); boolean isAllAppsButton = child == mTaskbarView.getAllAppsButtonContainer(); boolean isTaskbarDividerView = child == mTaskbarView.getTaskbarDividerViewContainer(); boolean isTaskbarOverflowView = child == mTaskbarView.getTaskbarOverflowView(); boolean isRecentTask = child.getTag() instanceof GroupTask; - boolean isRtl = Utilities.isRtl(child.getResources()); - // TODO(b/343522351): show recents on the home screen. final boolean isRecentsInHotseat = false; if (!mIsHotseatIconOnTopWhenAligned) { @@ -1079,21 +1020,11 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar ? Interpolators.clampToProgress(LINEAR, 0f, 0.17f) : Interpolators.clampToProgress(LINEAR, 0.72f, 0.84f)); } - } else if (((!isRtl && mTaskbarView.getChildCount() - i <= ignoreCount) - || (isRtl && i < ignoreCount)) - && mIsHotseatIconOnTopWhenAligned - && !(child instanceof IconButtonView)) { - setter.addFloat(child, VIEW_ALPHA, 0f, 1f, - isToHome - ? Interpolators.clampToProgress(LINEAR, 0f, 0.35f) - : mActivity.getDeviceProfile().isQsbInline - ? Interpolators.clampToProgress(LINEAR, 0f, 1f) - : Interpolators.clampToProgress(LINEAR, 0.84f, 1f)); - setter.addOnFrameListener(animator -> AlphaUpdateListener.updateVisibility(child)); } if (child == mTaskbarView.getQsb()) { + boolean isRtl = Utilities.isRtl(child.getResources()); float hotseatIconCenter = isRtl - ? launcherDp.getDeviceProperties().getWidthPx() - hotseatPadding.right + borderSpacing + ? launcherDp.widthPx - hotseatPadding.right + borderSpacing + launcherDp.hotseatQsbWidth / 2f : hotseatPadding.left - borderSpacing - launcherDp.hotseatQsbWidth / 2f; if (taskbarDp.isQsbInline) { @@ -1105,10 +1036,9 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar INDEX_TASKBAR_PINNING_ANIM).getValue(); } float halfQsbIconWidthDiff = - (launcherDp.hotseatQsbWidth - taskbarDp.getTaskbarProfile().getIconSize()) - / 2f; - float scale = ((float) taskbarDp.getTaskbarProfile().getIconSize()) - / launcherDp.getHotseatProfile().getQsbVisualHeight(); + (launcherDp.hotseatQsbWidth - taskbarDp.taskbarIconSize) / 2f; + float scale = ((float) taskbarDp.taskbarIconSize) + / launcherDp.hotseatQsbVisualHeight; setter.addFloat(child, SCALE_PROPERTY, scale, 1f, interpolator); float fromX = isRtl ? -halfQsbIconWidthDiff : halfQsbIconWidthDiff; @@ -1255,12 +1185,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar ? R.dimen.taskbar_phone_size : R.dimen.taskbar_stashed_size); } else { - taskbarWindowSize = mActivity.getDefaultTaskbarWindowSize(); - } - if (mBubbleControllers != null) { - int bubbleBarMaxHeight = mBubbleControllers.bubbleBarViewController - .getBubbleBarWithFlyoutMaximumHeight(); - taskbarWindowSize = Math.max(taskbarWindowSize, bubbleBarMaxHeight); + taskbarWindowSize = deviceProfile.taskbarHeight + deviceProfile.getTaskbarOffsetY(); } mActivity.setTaskbarWindowSize(taskbarWindowSize); mTaskbarNavButtonTranslationY.updateValue(-deviceProfile.getTaskbarOffsetY()); @@ -1312,6 +1237,10 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar view.setAlpha(0f); view.setScaleX(0f); view.setScaleY(0f); + if (view instanceof BubbleTextView btv) { + // Defer so that app is mostly scaled in before showing indicator. + btv.setLineIndicatorAnimStartDelay(APPEARING_LINE_INDICATOR_ANIM_DELAY); + } } else if (type == DISAPPEARING && view instanceof BubbleTextView btv) { // Running state updates happen after removing this view, so update it here. updateRunningState(btv); @@ -1321,10 +1250,11 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar @Override public void endTransition( LayoutTransition transition, ViewGroup container, View view, int type) { - // Do nothing. + if (type == APPEARING && view instanceof BubbleTextView btv) { + btv.setLineIndicatorAnimStartDelay(0); + } } }); - layoutTransition.addTransitionListener(mTransitionEndBoundsChangedNotifier); // Appearing. AnimatorSet appearingSet = new AnimatorSet(); @@ -1383,10 +1313,6 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar return layoutTransition; } - public boolean isTaskbarInMinimalState() { - return mTaskbarView.isTaskbarInMinimalState(); - } - /** * To be called when the given Task is updated, so that we can tell TaskbarView to also update. * @param task The Task whose e.g. icon changed. @@ -1408,7 +1334,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar @Override public void dumpLogs(String prefix, PrintWriter pw) { pw.println(prefix + "TaskbarViewController:"); - pw.println(prefix + "\tignoreTaskbarIconCount=" + mTaskbarView.getIgnoreTaskbarIconCount()); + mTaskbarIconAlpha.dump( prefix + "\t", pw, @@ -1431,22 +1357,4 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar animator.setInterpolator(EMPHASIZED); return animator; } - - private class TransitionEndBoundsChangedNotifier implements TransitionListener { - private boolean mIsCanceled; - - @Override - public void startTransition( - LayoutTransition transition, ViewGroup container, View view, int type) { - // Do nothing. - } - - @Override - public void endTransition( - LayoutTransition transition, ViewGroup container, View view, int type) { - if (!transition.isRunning() && !mIsCanceled) { - mControllers.uiController.onIconLayoutBoundsChanged(); - } - } - } } diff --git a/quickstep/src/com/android/launcher3/taskbar/Utilities.java b/quickstep/src/com/android/launcher3/taskbar/Utilities.java index 9182e03175..47d6684727 100644 --- a/quickstep/src/com/android/launcher3/taskbar/Utilities.java +++ b/quickstep/src/com/android/launcher3/taskbar/Utilities.java @@ -16,18 +16,12 @@ package com.android.launcher3.taskbar; -import static com.android.launcher3.Utilities.dpToPx; - -import com.android.launcher3.graphics.ThemeManager; -import com.android.launcher3.taskbar.customization.TaskbarIconSpecs; - /** * Various utilities shared amongst the Taskbar's classes. */ public final class Utilities { - private Utilities() { - } + private Utilities() {} /** * Sets drag, long-click, and split selection behavior on 1P and 3P launchers with Taskbar @@ -42,22 +36,4 @@ public final class Utilities { controllers.taskbarPopupController.setAllowInitialSplitSelection( allowInitialSplitSelection); } - - /** - * Gives radius for Transient Taskbar based on selected Launcher Icon Shape. - * Transient Taskbar radius = (icon shape radius * icon size ratio) + padding. - * - * @return The radius for Transient Taskbar. - */ - static float getShapedTaskbarRadius(TaskbarActivityContext activityContext) { - float taskbarIconSize = - activityContext.getTaskbarSpecsEvaluator().getTaskbarIconSize().getSize(); - float maxIconSize = TaskbarIconSpecs.INSTANCE.getIconSize52dp().getSize(); - float iconShapeRadius = - ThemeManager.INSTANCE.get(activityContext).getIconState().getShapeRadius(); - float iconSizeRatio = taskbarIconSize / maxIconSize; - return dpToPx((iconShapeRadius * iconSizeRatio) - + TaskbarIconSpecs.INSTANCE.getDefaultTransientIconMargin().getSize(), - activityContext); - } } diff --git a/quickstep/src/com/android/launcher3/taskbar/VoiceInteractionWindowController.kt b/quickstep/src/com/android/launcher3/taskbar/VoiceInteractionWindowController.kt index c065d35528..c7d42b1b90 100644 --- a/quickstep/src/com/android/launcher3/taskbar/VoiceInteractionWindowController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/VoiceInteractionWindowController.kt @@ -67,7 +67,6 @@ class VoiceInteractionWindowController(val context: TaskbarActivityContext) : separateWindowForTaskbarBackground = object : BaseDragLayer(context, null, 0) { override fun recreateControllers() { - super.recreateControllers() mControllers = emptyArray() } diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java index 7ada818860..6c55b28845 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java @@ -133,7 +133,6 @@ public final class TaskbarAllAppsController { if (isOpen()) { mSlideInView.close(true); } else { - mControllers.taskbarEduTooltipController.hide(); mControllers.taskbarPopupController.maybeCloseMultiInstanceMenu(); show(true, showKeyboard); } diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java index 4a0aeabe6f..d947784860 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java @@ -15,14 +15,11 @@ */ package com.android.launcher3.taskbar.allapps; -import static android.os.Trace.TRACE_TAG_APP; - import static com.android.app.animation.Interpolators.DECELERATED_EASE; import static com.android.app.animation.Interpolators.EMPHASIZED; import static com.android.app.animation.Interpolators.LINEAR; import static com.android.launcher3.touch.AllAppsSwipeController.ALL_APPS_FADE_MANUAL; import static com.android.launcher3.touch.AllAppsSwipeController.SCRIM_FADE_MANUAL; -import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import android.animation.Animator; import android.content.Context; @@ -30,13 +27,9 @@ import android.graphics.Canvas; import android.graphics.Rect; import android.os.Handler; import android.os.Looper; -import android.os.Trace; import android.util.AttributeSet; -import android.util.Log; -import android.view.CrossWindowBlurListeners; import android.view.MotionEvent; import android.view.View; -import android.view.ViewRootImpl; import android.view.animation.Interpolator; import android.window.OnBackInvokedDispatcher; @@ -55,16 +48,11 @@ import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext; import com.android.launcher3.util.Themes; import com.android.launcher3.views.AbstractSlideInView; -import java.util.function.Consumer; - /** Wrapper for taskbar all apps with slide-in behavior. */ public class TaskbarAllAppsSlideInView extends AbstractSlideInView implements Insettable, DeviceProfile.OnDeviceProfileChangeListener { - private static final String TAG = "TaskbarAllAppsSlideInView"; - private final Handler mHandler; private final int mMaxBlurRadius; - private final Consumer mWindowBlurListener = blursEnabled -> invalidate(); private TaskbarAllAppsContainerView mAppsView; private float mShiftRange; @@ -115,16 +103,6 @@ public class TaskbarAllAppsSlideInView extends AbstractSlideInView { int index = mBubbleBarViewController.bubbleViewIndex(bubbleBarBubble.getView()); @@ -226,7 +223,6 @@ public class BubbleBarController extends IBubblesListener.Stub { mBubbleBarViewController.getBubbleBarLocation()); if (sBubbleBarEnabled) { mSystemUiProxy.setBubblesListener(this); - mSystemUiProxy.setHasBubbleBar(true); } }); } @@ -239,19 +235,8 @@ public class BubbleBarController extends IBubblesListener.Stub { mBubbleBarViewController.setHiddenForSysui(hideBubbleBar); boolean hideHandleView = (flags & MASK_HIDE_HANDLE_VIEW) != 0; - mBubbleStashedHandleViewController.ifPresent(controller -> { - controller.setHiddenForSysui(hideHandleView); - MultiPropertyFactory.MultiProperty handleViewAlpha = - mBubbleStashController.getHandleViewAlpha(); - boolean shouldShowHandleView = handleViewAlpha != null - && !hideHandleView - && mBubbleStashController.isStashed() - && mBubbleBarViewController.hasBubbles(); - if (shouldShowHandleView) { - // TODO: (b/273592694) animate it? - handleViewAlpha.setValue(1f); - } - }); + mBubbleStashedHandleViewController.ifPresent( + controller -> controller.setHiddenForSysui(hideHandleView)); boolean sysuiLocked = (flags & MASK_SYSUI_LOCKED) != 0; mBubbleStashController.setSysuiLocked(sysuiLocked); @@ -312,29 +297,12 @@ public class BubbleBarController extends IBubblesListener.Stub { if (sharedState.bubbleBarLocation != null) { updateBubbleBarLocationInternal(sharedState.bubbleBarLocation); } - List savedBubbles = sharedState.bubbleInfoItems; - boolean hasSavedBubbles = savedBubbles != null && !savedBubbles.isEmpty(); - if (hasSavedBubbles) { - restoreSavedBubbles(savedBubbles); - } + restoreSavedBubbles(sharedState.bubbleInfoItems); restoreSuppressed(sharedState.suppressedBubbleInfoItems); - if (hasSavedBubbles) { - setSelectedBubbleInternal(mBubbles.get(sharedState.selectedBubbleKey)); - if (sharedState.bubbleBarExpanded) { - // We don't want state restore to have side effects which update the Shell state. - // Use the method for setting expanded state from sysui as that won't trigger an - // update back to Shell. - mBubbleBarViewController.setExpandedFromSysui(/* isExpanded= */ true, - /* animate= */ false); - } else if (sharedState.bubbleBarStashed) { - mBubbleStashController.stashBubbleBarImmediate(); - } else { - mBubbleStashController.showBubbleBarImmediate(); - } - } } private void restoreSavedBubbles(List bubbleInfos) { + if (bubbleInfos == null || bubbleInfos.isEmpty()) return; // Iterate in reverse because new bubbles are added in front and the list is in order. for (int i = bubbleInfos.size() - 1; i >= 0; i--) { BubbleBarBubble bubble = mBubbleCreator.populateBubble(mContext, @@ -343,8 +311,7 @@ public class BubbleBarController extends IBubblesListener.Stub { Log.e(TAG, "Could not instantiate BubbleBarBubble for " + bubbleInfos.get(i)); continue; } - mBubbles.put(bubble.getKey(), bubble); - mBubbleBarViewController.restoreBubble(bubble); + addBubbleInternally(bubble, /* isExpanding= */ false, /* suppressAnimation= */ true); } } @@ -361,11 +328,6 @@ public class BubbleBarController extends IBubblesListener.Stub { } private void applyViewChanges(BubbleBarViewUpdate update) { - if (update.initialState) { - // it is possible that we tried to notify shell too early with the bubble bar bounds, - // so force update shell about the bubble bar bounds in the initial handshake. - onBubbleBarBoundsChanged(/* forceUpdate= */ true); - } final boolean isCollapsed = (update.expandedChanged && !update.expanded) || (!update.expandedChanged && !mBubbleBarViewController.isExpanded()); final boolean isExpanding = update.expandedChanged && update.expanded; @@ -392,6 +354,9 @@ public class BubbleBarController extends IBubblesListener.Stub { BubbleBarBubble newlySelected = mBubbles.get(update.selectedBubbleKey); if (newlySelected != null) { bubbleToSelect = newlySelected; + } else { + Log.w(TAG, "trying to select bubble that doesn't exist:" + + update.selectedBubbleKey); } } } @@ -460,9 +425,6 @@ public class BubbleBarController extends IBubblesListener.Stub { for (int i = update.currentBubbles.size() - 1; i >= 0; i--) { BubbleBarBubble bubble = update.currentBubbles.get(i); if (bubble != null) { - if (bubble.getKey().equals(update.selectedBubbleKey)) { - bubbleToSelect = bubble; - } addBubbleInternally(bubble, isExpanding, suppressAnimation); if (isCollapsed && bubbleToSelect == null) { // If we're collapsed, the most recently added bubble will be selected. @@ -533,19 +495,13 @@ public class BubbleBarController extends IBubblesListener.Stub { } if (bubbleToSelect != null) { setSelectedBubbleInternal(bubbleToSelect); - } else if (update.initialState && BubbleBarOverflow.KEY.equals(update.selectedBubbleKey)) { - // this is the initial update with the overflow selected which could happen after - // unfolding with the overflow expanded - setSelectedBubbleInternal(mBubbleBarViewController.getOverflowBubble()); } if (update.shouldShowEducation) { mBubbleBarViewController.prepareToShowEducation(); } if (update.expandedChanged) { if (update.expanded != mBubbleBarViewController.isExpanded()) { - // If we start as expanded, show bar immediately without waiting for animation. - boolean animate = !update.initialState; - mBubbleBarViewController.setExpandedFromSysui(update.expanded, animate); + mBubbleBarViewController.setExpandedFromSysui(update.expanded); } else { Log.w(TAG, "expansion was changed but is the same"); } @@ -571,8 +527,8 @@ public class BubbleBarController extends IBubblesListener.Stub { /** Tells WMShell to show the currently selected bubble. */ public void showSelectedBubble() { if (getSelectedBubbleKey() != null) { - mLastSentBubbleBarTopToScreenBottom = mBarView.getTopToScreenBottom(); - mSystemUiProxy.showBubble(getSelectedBubbleKey(), mLastSentBubbleBarTopToScreenBottom); + mLastSentBubbleBarTop = mBarView.getRestingTopPositionOnScreen(); + mSystemUiProxy.showBubble(getSelectedBubbleKey(), mLastSentBubbleBarTop); } else { Log.w(TAG, "Trying to show the selected bubble but it's null"); } @@ -636,9 +592,23 @@ public class BubbleBarController extends IBubblesListener.Stub { } @Override - public void showBubbleBarPillowAt(@Nullable BubbleBarLocation location) { + public void onDragItemOverBubbleBarDragZone(@NonNull BubbleBarLocation bubbleBarLocation) { MAIN_EXECUTOR.execute(() -> { - //TODO(b/411505605) add logic to show pillow and update taskbar + mBubbleBarViewController.onDragItemOverBubbleBarDragZone(bubbleBarLocation); + if (mBubbleBarViewController.isLocationUpdatedForDropTarget()) { + mBubbleBarLocationListener.onBubbleBarLocationAnimated(bubbleBarLocation); + } + }); + } + + @Override + public void onItemDraggedOutsideBubbleBarDropZone() { + MAIN_EXECUTOR.execute(() -> { + if (mBubbleBarViewController.isLocationUpdatedForDropTarget()) { + BubbleBarLocation original = mBubbleBarViewController.getBubbleBarLocation(); + mBubbleBarLocationListener.onBubbleBarLocationAnimated(original); + } + mBubbleBarViewController.onItemDraggedOutsideBubbleBarDropZone(); }); } @@ -652,14 +622,10 @@ public class BubbleBarController extends IBubblesListener.Stub { // private void onBubbleBarBoundsChanged() { - onBubbleBarBoundsChanged(/* forceUpdate= */ false); - } - - private void onBubbleBarBoundsChanged(boolean forceUpdate) { - int bubbleBarTopToScreenBottom = mBarView.getTopToScreenBottom(); - if (bubbleBarTopToScreenBottom != mLastSentBubbleBarTopToScreenBottom || forceUpdate) { - mLastSentBubbleBarTopToScreenBottom = bubbleBarTopToScreenBottom; - mSystemUiProxy.updateBubbleBarTopToScreenBottom(bubbleBarTopToScreenBottom); + int newTop = mBarView.getRestingTopPositionOnScreen(); + if (newTop != mLastSentBubbleBarTop) { + mLastSentBubbleBarTop = newTop; + mSystemUiProxy.updateBubbleBarTopOnScreen(newTop); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarLocationDropTarget.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarLocationDropTarget.kt index 5f80fd56fd..24e7d99187 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarLocationDropTarget.kt +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarLocationDropTarget.kt @@ -21,57 +21,72 @@ import android.view.View import com.android.launcher3.DropTarget import com.android.launcher3.dragndrop.DragOptions import com.android.launcher3.model.data.ItemInfo -import com.android.wm.shell.shared.bubbles.DragZoneFactory -import com.android.wm.shell.shared.bubbles.DropTargetManager +import com.android.wm.shell.shared.bubbles.BubbleBarLocation /** * Implementation of the {@link DropTarget} that handles drag and drop events over the bubble bar * locations. */ class BubbleBarLocationDropTarget( - private val bubbleBarDropTargetController: BubbleBarDropTargetController, - dragZoneFactory: DragZoneFactory, - private val dropTargetManager: DropTargetManager, - private val isLeftDropTarget: Boolean, + private val bubbleBarLocation: BubbleBarLocation, + private val bubbleBarDragListener: BubbleBarDragListener, ) : DropTarget { - interface BubbleBarDropTargetController { + /** Controller that takes care of the bubble bar drag events inside launcher process. */ + interface BubbleBarDragListener { - /** Return whether the item info can be dropped on the bubble bar drop target. */ - fun acceptDrop(itemInfo: ItemInfo): Boolean + /** Called when the drag event is over the bubble bar drop zone. */ + fun onLauncherItemDraggedOverBubbleBarDragZone(location: BubbleBarLocation) - /** Called after dragged item info drop on the bubble bar drop target. */ - fun onDrop(itemInfo: ItemInfo, isLeftDropTarget: Boolean) + /** Called when the drag event leaves the bubble bar drop zone. */ + fun onLauncherItemDraggedOutsideBubbleBarDropZone() + + /** Called when the drop event happens over the bubble bar drop zone. */ + fun onLauncherItemDroppedOverBubbleBarDragZone( + location: BubbleBarLocation, + itemInfo: ItemInfo, + ) + + /** Gets the hit [rect][android.graphics.Rect] of the bubble bar location. */ + fun getBubbleBarLocationHitRect(bubbleBarLocation: BubbleBarLocation, outRect: Rect) + + /** Provides the view that will accept the drop. */ + fun getDropView(): View } - private val dropRect = dragZoneFactory.getBubbleBarDropRect(isLeftDropTarget) + private var isShowingDropTarget = false override fun isDropEnabled(): Boolean = true override fun onDrop(dragObject: DropTarget.DragObject, options: DragOptions) { - bubbleBarDropTargetController.onDrop(dragObject.dragInfo, isLeftDropTarget) + val itemInfo = dragObject.dragInfo ?: return + bubbleBarDragListener.onLauncherItemDroppedOverBubbleBarDragZone( + bubbleBarLocation, + itemInfo, + ) } - override fun onDragEnter(dragObject: DropTarget.DragObject) { - dropTargetManager.onDragUpdated(dragObject.x, dragObject.y) - } + override fun onDragEnter(dragObject: DropTarget.DragObject) {} override fun onDragOver(dragObject: DropTarget.DragObject) { - dropTargetManager.onDragUpdated(dragObject.x, dragObject.y) + if (isShowingDropTarget) return + isShowingDropTarget = true + bubbleBarDragListener.onLauncherItemDraggedOverBubbleBarDragZone(bubbleBarLocation) } override fun onDragExit(dragObject: DropTarget.DragObject) { - dropTargetManager.onDragUpdated(dragObject.x, dragObject.y) + if (!isShowingDropTarget) return + isShowingDropTarget = false + bubbleBarDragListener.onLauncherItemDraggedOutsideBubbleBarDropZone() } - override fun acceptDrop(dragObject: DropTarget.DragObject): Boolean = - bubbleBarDropTargetController.acceptDrop(dragObject.dragInfo) + override fun acceptDrop(dragObject: DropTarget.DragObject): Boolean = true override fun prepareAccessibilityDrop() {} override fun getHitRectRelativeToDragLayer(outRect: Rect) { - outRect.set(dropRect) + bubbleBarDragListener.getBubbleBarLocationHitRect(bubbleBarLocation, outRect) } - override fun getDropView(): View? = null + override fun getDropView(): View = bubbleBarDragListener.getDropView() } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeController.kt index cdf90dd7c2..4b8924cde6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeController.kt @@ -210,8 +210,7 @@ class BubbleBarSwipeController { resources, taskbarActivityContext.deviceProfile, ) - maxOverscroll = - taskbarActivityContext.deviceProfile.deviceProperties.heightPx - unstashThreshold + maxOverscroll = taskbarActivityContext.deviceProfile.heightPx - unstashThreshold } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java index adfe59a93f..6380c2371b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java @@ -44,6 +44,7 @@ import com.android.launcher3.R; import com.android.launcher3.anim.AnimatorListeners; import com.android.launcher3.taskbar.BarsLocationAnimatorHelper; import com.android.launcher3.taskbar.bubbles.animation.BubbleAnimator; +import com.android.launcher3.util.DisplayController; import com.android.wm.shell.shared.bubbles.BubbleBarLocation; import java.io.PrintWriter; @@ -145,8 +146,7 @@ public class BubbleBarView extends FrameLayout { // An animator that represents the expansion state of the bubble bar, where 0 corresponds to the // collapsed state and 1 to the fully expanded state. - @Nullable - private ValueAnimator mWidthAnimator; + private ValueAnimator mWidthAnimator = createExpansionAnimator(/* expanding = */ false); @Nullable private ValueAnimator mDismissAnimator = null; @@ -652,15 +652,13 @@ public class BubbleBarView extends FrameLayout { } } - /** Get the distance between the bubble bar top coordinate and the bottom of the screen */ - public int getTopToScreenBottom() { - // the bottom of the bubble bar is aligned with the bottom of the screen. the distance - // between the top of the bubble bar and the bottom of the screen is the height of the - // bubble bar minus the y translation. since the bubble bar is always above the bottom of - // the screen, the translation is negative and the overall result is a positive value that - // represents the distance + /** + * Get bubble bar top coordinate on screen when bar is resting + */ + public int getRestingTopPositionOnScreen() { + int displayHeight = DisplayController.INSTANCE.get(getContext()).getInfo().currentSize.y; int bubbleBarHeight = getBubbleBarBounds().height(); - return bubbleBarHeight - (int) mController.getBubbleBarTranslationY(); + return displayHeight - bubbleBarHeight + (int) mController.getBubbleBarTranslationY(); } /** Returns the bounds with translation that may have been applied. */ @@ -717,8 +715,8 @@ public class BubbleBarView extends FrameLayout { } /** Add a new bubble to the bubble bar without updating the selected bubble. */ - public void addBubble(BubbleView bubble, boolean suppressAnimation) { - addBubble(bubble, /* bubbleToSelect = */ null, suppressAnimation); + public void addBubble(BubbleView bubble) { + addBubble(bubble, /* bubbleToSelect = */ null); } /** @@ -727,13 +725,12 @@ public class BubbleBarView extends FrameLayout { * @param bubble bubble to add * @param bubbleToSelect if {@code null}, then selected bubble does not change */ - public void addBubble(BubbleView bubble, @Nullable BubbleView bubbleToSelect, - boolean suppressAnimation) { + public void addBubble(BubbleView bubble, @Nullable BubbleView bubbleToSelect) { FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams((int) mIconSize, (int) mIconSize, Gravity.LEFT); final int index = bubble.isOverflow() ? getChildCount() : 0; - if (isExpanded() && !suppressAnimation) { + if (isExpanded()) { // if we're expanded scale the new bubble in bubble.setScaleX(0f); bubble.setScaleY(0f); @@ -1011,12 +1008,7 @@ public class BubbleBarView extends FrameLayout { * on the expanded state. */ private void updateBubblesLayoutProperties(BubbleBarLocation bubbleBarLocation) { - final float widthState; - if (mWidthAnimator == null) { - widthState = mIsBarExpanded ? 1f : 0f; - } else { - widthState = (float) mWidthAnimator.getAnimatedValue(); - } + final float widthState = (float) mWidthAnimator.getAnimatedValue(); final float currentWidth = getWidth(); final float expandedWidth = expandedWidth(); final float collapsedWidth = collapsedWidth(); @@ -1053,7 +1045,7 @@ public class BubbleBarView extends FrameLayout { bv.setZ(fullElevationForChild * elevationState); // only update the dot and badge scale if we're expanding or collapsing - if (mWidthAnimator != null && mWidthAnimator.isRunning()) { + if (mWidthAnimator.isRunning()) { // The dot for the selected bubble scales in the opposite direction of the expansion // animation. bv.showDotIfNeeded(bv == mSelectedBubbleView ? 1 - widthState : widthState); @@ -1169,7 +1161,7 @@ public class BubbleBarView extends FrameLayout { * Reorders the views to match the provided list. */ public void reorder(List viewOrder) { - if (isExpanded() || (mWidthAnimator != null && mWidthAnimator.isRunning())) { + if (isExpanded() || mWidthAnimator.isRunning()) { mReorderRunnable = () -> doReorder(viewOrder); } else { doReorder(viewOrder); @@ -1200,7 +1192,7 @@ public class BubbleBarView extends FrameLayout { mUpdateSelectedBubbleAfterCollapse = updateSelectedBubbleAfterCollapse; } - public void setController(Controller controller) { + void setController(Controller controller) { mController = controller; } @@ -1318,38 +1310,20 @@ public class BubbleBarView extends FrameLayout { } /** - * Update bubble bar expanded state. + * Sets whether the bubble bar is expanded or collapsed. */ public void setExpanded(boolean isBarExpanded) { - setExpandedInternal(isBarExpanded, false); - } - - /** - * Update bubble bar expanded state with animation. - *

- * Also triggers a talkback announcement for accessibility. - */ - public void animateExpanded(boolean isBarExpanded) { - setExpandedInternal(isBarExpanded, true); - } - - private void setExpandedInternal(boolean isBarExpanded, boolean animate) { - if (mIsBarExpanded == isBarExpanded) return; - mIsBarExpanded = isBarExpanded; - updateArrowForSelected(/* shouldAnimate= */ false); - setOrUnsetClickListener(); - if (animate) { + if (mIsBarExpanded != isBarExpanded) { + mIsBarExpanded = isBarExpanded; + updateArrowForSelected(/* shouldAnimate= */ false); + setOrUnsetClickListener(); mWidthAnimator = createExpansionAnimator(isBarExpanded); mWidthAnimator.start(); + updateBubbleAccessibilityStates(); announceExpandedStateChange(); - } else { - onExpandedChanged(); } - updateBubbleAccessibilityStates(); - mController.onBubbleBarExpandedStateChanged(mIsBarExpanded); } - /** * Returns whether the bubble bar is expanded. */ @@ -1361,7 +1335,7 @@ public class BubbleBarView extends FrameLayout { * Returns whether the bubble bar is expanding. */ public boolean isExpanding() { - return mWidthAnimator != null && mWidthAnimator.isRunning() && mIsBarExpanded; + return mWidthAnimator.isRunning() && mIsBarExpanded; } /** @@ -1610,7 +1584,26 @@ public class BubbleBarView extends FrameLayout { animator.setInterpolator(Interpolators.EMPHASIZED); addAnimationCallBacks(animator, /* onStart= */ () -> mBubbleBarBackground.showArrow(true), - /* onEnd= */ this::onExpandedChanged, + /* onEnd= */ () -> { + mBubbleBarBackground.showArrow(mIsBarExpanded); + if (!mIsBarExpanded && mReorderRunnable != null) { + mReorderRunnable.run(); + mReorderRunnable = null; + } + // If the bar was just collapsed and the overflow was the last bubble that was + // selected, set the first bubble as selected. + if (!mIsBarExpanded && mUpdateSelectedBubbleAfterCollapse != null + && mSelectedBubbleView != null + && mSelectedBubbleView.getBubble() instanceof BubbleBarOverflow) { + BubbleView firstBubble = (BubbleView) getChildAt(0); + mUpdateSelectedBubbleAfterCollapse.accept(firstBubble.getBubble().getKey()); + } + // If the bar was just expanded, remove the dot from the selected bubble. + if (mIsBarExpanded && mSelectedBubbleView != null) { + mSelectedBubbleView.markSeen(); + } + updateLayoutParams(); + }, /* onUpdate= */ anim -> { updateBubblesLayoutProperties(mBubbleBarLocation); invalidate(); @@ -1618,27 +1611,6 @@ public class BubbleBarView extends FrameLayout { return animator; } - private void onExpandedChanged() { - mBubbleBarBackground.showArrow(mIsBarExpanded); - if (!mIsBarExpanded && mReorderRunnable != null) { - mReorderRunnable.run(); - mReorderRunnable = null; - } - // If the bar was just collapsed and the overflow was the last bubble that was - // selected, set the first bubble as selected. - if (!mIsBarExpanded && mUpdateSelectedBubbleAfterCollapse != null - && mSelectedBubbleView != null - && mSelectedBubbleView.getBubble() instanceof BubbleBarOverflow) { - BubbleView firstBubble = (BubbleView) getChildAt(0); - mUpdateSelectedBubbleAfterCollapse.accept(firstBubble.getBubble().getKey()); - } - // If the bar was just expanded, remove the dot from the selected bubble. - if (mIsBarExpanded && mSelectedBubbleView != null) { - mSelectedBubbleView.markSeen(); - } - updateLayoutParams(); - } - /** * Returns the distance between the top left corner of the bubble bar to the center of the dot * of the selected bubble. @@ -1672,7 +1644,7 @@ public class BubbleBarView extends FrameLayout { } /** Interface for BubbleBarView to communicate with its controller. */ - public interface Controller { + interface Controller { /** Returns the translation Y that the bubble bar should have. */ float getBubbleBarTranslationY(); @@ -1692,8 +1664,5 @@ public class BubbleBarView extends FrameLayout { /** Notifies the controller that bubble bar is being dragged */ void setIsDragging(boolean dragging); - - /** Notifies the controller that bubble bar expanded state changed */ - void onBubbleBarExpandedStateChanged(boolean expanded); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java index 648ad9f2a2..2ed72d7824 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java @@ -43,25 +43,33 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.app.animation.Interpolators; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; + import com.android.launcher3.R; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; +import com.android.launcher3.dragndrop.DragController; +import com.android.launcher3.model.data.ItemInfo; +import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.taskbar.TaskbarActivityContext; import com.android.launcher3.taskbar.TaskbarControllers; import com.android.launcher3.taskbar.TaskbarInsetsController; import com.android.launcher3.taskbar.TaskbarSharedState; import com.android.launcher3.taskbar.TaskbarStashController; +import com.android.launcher3.taskbar.bubbles.BubbleBarLocationDropTarget.BubbleBarDragListener; import com.android.launcher3.taskbar.bubbles.animation.BubbleBarViewAnimator; import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutController; import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutPositioner; import com.android.launcher3.taskbar.bubbles.flyout.FlyoutCallbacks; import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController; +import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.MultiPropertyFactory; import com.android.launcher3.util.MultiValueAlpha; import com.android.quickstep.SystemUiProxy; import com.android.wm.shell.Flags; import com.android.wm.shell.shared.bubbles.BubbleBarLocation; +import com.android.wm.shell.shared.bubbles.DeviceConfig; import java.io.PrintWriter; import java.util.List; @@ -120,6 +128,60 @@ public class BubbleBarViewController { updateTranslationY(); setBubbleBarScaleAndPadding(pinningProgress); }); + private final BubbleBarDragListener mDragListener = new BubbleBarDragListener() { + + @Override + public void getBubbleBarLocationHitRect(@NonNull BubbleBarLocation bubbleBarLocation, + Rect outRect) { + Point screenSize = DisplayController.INSTANCE.get(mActivity).getInfo().currentSize; + outRect.top = screenSize.y - mBubbleBarDropTargetSize; + outRect.bottom = screenSize.y; + if (bubbleBarLocation.isOnLeft(mBarView.isLayoutRtl())) { + outRect.left = 0; + outRect.right = mBubbleBarDropTargetSize; + } else { + outRect.left = screenSize.x - mBubbleBarDropTargetSize; + outRect.right = screenSize.x; + } + } + + @Override + public void onLauncherItemDroppedOverBubbleBarDragZone(@NonNull BubbleBarLocation location, + @NonNull ItemInfo itemInfo) { + AbstractFloatingView.closeAllOpenViews(mActivity); + if (itemInfo instanceof WorkspaceItemInfo) { + ShortcutInfo shortcutInfo = ((WorkspaceItemInfo) itemInfo).getDeepShortcutInfo(); + if (shortcutInfo != null) { + mSystemUiProxy.showShortcutBubble(shortcutInfo, location); + return; + } + } + Intent itemIntent = itemInfo.getIntent(); + if (itemIntent != null && itemIntent.getComponent() != null) { + itemIntent.setPackage(itemIntent.getComponent().getPackageName()); + mSystemUiProxy.showAppBubble(itemIntent, itemInfo.user, location); + } + } + + @Override + public void onLauncherItemDraggedOutsideBubbleBarDropZone() { + onItemDraggedOutsideBubbleBarDropZone(); + mSystemUiProxy.showBubbleDropTarget(/* show = */ false); + } + + @Override + public void onLauncherItemDraggedOverBubbleBarDragZone( + @NonNull BubbleBarLocation location) { + onDragItemOverBubbleBarDragZone(location); + mSystemUiProxy.showBubbleDropTarget(/* show = */ true, location); + } + + @NonNull + @Override + public View getDropView() { + return mBarView; + } + }; // Modified when swipe up is happening on the bubble bar or task bar. private float mBubbleBarSwipeUpTranslationY; @@ -145,8 +207,11 @@ public class BubbleBarViewController { private BubbleBarFlyoutController mBubbleBarFlyoutController; private BubbleBarPinController mBubbleBarPinController; private TaskbarSharedState mTaskbarSharedState; + private final BubbleBarLocationDropTarget mBubbleBarLeftDropTarget; + private final BubbleBarLocationDropTarget mBubbleBarRightDropTarget; private final TimeSource mTimeSource = System::currentTimeMillis; private final int mTaskbarTranslationDelta; + private final int mBubbleBarDropTargetSize; @Nullable private BubbleBarBoundsChangeListener mBoundsChangeListener; @@ -164,6 +229,15 @@ public class BubbleBarViewController { R.dimen.bubblebar_transient_taskbar_min_distance); mDragElevation = res.getDimensionPixelSize(R.dimen.dragged_bubble_elevation); mTaskbarTranslationDelta = getBubbleBarTranslationDeltaForTaskbar(activity); + if (DeviceConfig.isSmallTablet(mActivity)) { + mBubbleBarDropTargetSize = res.getDimensionPixelSize(com.android.wm.shell.R.dimen.drag_zone_bubble_fold); + } else { + mBubbleBarDropTargetSize = res.getDimensionPixelSize(com.android.wm.shell.R.dimen.drag_zone_bubble_tablet); + } + mBubbleBarLeftDropTarget = new BubbleBarLocationDropTarget(BubbleBarLocation.LEFT, + mDragListener); + mBubbleBarRightDropTarget = new BubbleBarLocationDropTarget(BubbleBarLocation.RIGHT, + mDragListener); } /** Initializes controller. */ @@ -196,7 +270,7 @@ public class BubbleBarViewController { if (!mBubbleStashController.isTransientTaskBar()) { // TODO(b/380274085) for transient taskbar mode, the click is also handled by the input // consumer. This check can be removed once b/380274085 is fixed. - mBarView.setOnClickListener(v -> animateExpanded(!mBarView.isExpanded())); + mBarView.setOnClickListener(v -> setExpanded(!mBarView.isExpanded())); } mBarView.addOnLayoutChangeListener( (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { @@ -212,7 +286,7 @@ public class BubbleBarViewController { mBarView.setController(new BubbleBarView.Controller() { @Override public float getBubbleBarTranslationY() { - return mBubbleStashController.getTargetTranslationYForState(); + return mBubbleStashController.getBubbleBarTranslationY(); } @Override @@ -224,7 +298,7 @@ public class BubbleBarViewController { @Override public void expandBubbleBar() { - BubbleBarViewController.this.animateExpanded( + BubbleBarViewController.this.setExpanded( /* isExpanded= */ true, /* maybeShowEdu*/ true); } @@ -243,14 +317,6 @@ public class BubbleBarViewController { public void setIsDragging(boolean dragging) { mBubbleBarContainer.setElevation(dragging ? mDragElevation : 0); } - - @Override - public void onBubbleBarExpandedStateChanged(boolean expanded) { - if (expanded && !mTaskbarStashController.isStashed()) { - mTaskbarStashController.updateAndAnimateTransientTaskbar(true /* stash */, - false /* shouldBubblesFollow */); - } - } }); mBubbleViewController = new BubbleView.Controller() { @@ -280,6 +346,18 @@ public class BubbleBarViewController { }; } + /** Adds bubble bar locations drop zones to the drag controller. */ + public void addBubbleBarDropTargets(DragController dragController) { + dragController.addDropTarget(mBubbleBarLeftDropTarget); + dragController.addDropTarget(mBubbleBarRightDropTarget); + } + + /** Removes bubble bar locations drop zones to the drag controller. */ + public void removeBubbleBarDropTargets(DragController dragController) { + dragController.removeDropTarget(mBubbleBarLeftDropTarget); + dragController.removeDropTarget(mBubbleBarRightDropTarget); + } + /** Returns animated float property responsible for pinning transition animation. */ public AnimatedFloat getBubbleBarPinning() { return mBubbleBarPinning; @@ -346,7 +424,7 @@ public class BubbleBarViewController { @Override public void flyoutClicked() { interruptAnimationForTouch(); - animateExpanded(/* isExpanded= */ true, /* maybeShowEdu*/ true); + setExpanded(/* isExpanded= */ true, /* maybeShowEdu*/ true); } }; } @@ -360,11 +438,6 @@ public class BubbleBarViewController { }; } - /** Returns the overflow bubble. */ - public BubbleBarOverflow getOverflowBubble() { - return mOverflowBubble; - } - private void onBubbleClicked(BubbleView bubbleView) { if (mBubbleBarPinning.isAnimating()) return; bubbleView.markSeen(); @@ -389,7 +462,7 @@ public class BubbleBarViewController { } private void collapseBubbleBar() { - animateExpanded(false); + setExpanded(false); mBubbleStashController.stashBubbleBar(); } @@ -564,12 +637,6 @@ public class BubbleBarViewController { return mBarView.isShowingDropTarget(); } - /** Tells bubble bar view if it should show the drop target. */ - public void setShowingDropTarget(boolean showingDropTarget) { - mBarView.showDropTarget(showingDropTarget); - } - - //TODO(b/411505605) remove unused IPC calls and code /** * Notifies the controller that a drag event is over the Bubble Bar drop zone. The controller * will display the appropriate drop target and enter drop target mode. The controller will also @@ -665,8 +732,7 @@ public class BubbleBarViewController { public boolean isEventOverBubbleBar(MotionEvent event) { if (!isBubbleBarVisible()) return false; final Rect bounds = getBubbleBarBounds(); - final int bubbleBarTopOnScreen = - mActivity.getScreenSize().y - mBarView.getTopToScreenBottom(); + final int bubbleBarTopOnScreen = mBarView.getRestingTopPositionOnScreen(); final float x = event.getX(); return event.getRawY() >= bubbleBarTopOnScreen && x >= bounds.left && x <= bounds.right; } @@ -741,7 +807,7 @@ public class BubbleBarViewController { if (hidden) { mBarView.dismiss(() -> { updateVisibilityForStateChange(); - mBarView.animateExpanded(false); + mBarView.setExpanded(false); adjustTaskbarAndHotseatToBubbleBarState(/* isBubbleBarExpanded= */ false); mActivity.bubbleBarVisibilityChanged(/* isVisible= */ false); }); @@ -864,7 +930,7 @@ public class BubbleBarViewController { float mediumIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_MEDIUM_DP, dm); float smallMediumThreshold = (smallIconSize + mediumIconSize) / 2f; - int taskbarIconSize = deviceProfile.getTaskbarProfile().getIconSize(); + int taskbarIconSize = deviceProfile.taskbarIconSize; return taskbarIconSize <= smallMediumThreshold ? res.getDimensionPixelSize(R.dimen.bubblebar_icon_size_small) : res.getDimensionPixelSize(R.dimen.bubblebar_icon_size); @@ -882,7 +948,7 @@ public class BubbleBarViewController { float largeIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_LARGE_DP, dm); float mediumLargeThreshold = (mediumIconSize + largeIconSize) / 2f; - return deviceProfile.getTaskbarProfile().getIconSize() >= mediumLargeThreshold + return deviceProfile.taskbarIconSize >= mediumLargeThreshold ? res.getDimensionPixelSize(R.dimen.bubblebar_icon_spacing_large) : res.getDimensionPixelSize(R.dimen.bubblebar_icon_spacing); } @@ -959,11 +1025,9 @@ public class BubbleBarViewController { int persistentSpacingSize = res .getDimensionPixelSize(R.dimen.bubblebar_icon_spacing_persistent_taskbar); int persistentBubbleBarSize = persistentBubbleSize + persistentSpacingSize * 2; - int persistentTaskbarHeight = - activity.getPersistentTaskbarDeviceProfile().getTaskbarProfile().getHeight(); + int persistentTaskbarHeight = activity.getPersistentTaskbarDeviceProfile().taskbarHeight; int persistentBubbleBarY = (persistentTaskbarHeight - persistentBubbleBarSize) / 2; - int transientBubbleBarY = - activity.getTransientTaskbarDeviceProfile().getTaskbarProfile().getBottomMargin(); + int transientBubbleBarY = activity.getTransientTaskbarDeviceProfile().taskbarBottomMargin; return transientBubbleBarY - persistentBubbleBarY; } @@ -1037,7 +1101,7 @@ public class BubbleBarViewController { if (mOverflowAdded == showOverflow) return; mOverflowAdded = showOverflow; if (mOverflowAdded) { - mBarView.addBubble(mOverflowBubble.getView(), /* suppressAnimation= */ true); + mBarView.addBubble(mOverflowBubble.getView()); mOverflowBubble.getView().setOnClickListener(mBubbleClickListener); mOverflowBubble.getView().setController(mBubbleViewController); } else { @@ -1084,7 +1148,10 @@ public class BubbleBarViewController { if (b != null) { BubbleView bubbleToSelectView = bubbleToSelect == null ? null : bubbleToSelect.getView(); - addBubbleView(b.getView(), suppressAnimation, bubbleToSelectView); + mBarView.addBubble(b.getView(), bubbleToSelectView); + b.getView().setOnClickListener(mBubbleClickListener); + mBubbleDragController.setupBubbleView(b.getView()); + b.getView().setController(mBubbleViewController); if (suppressAnimation || !(b instanceof BubbleBarBubble bubble)) { // the bubble bar and handle are initialized as part of the first bubble animation. @@ -1092,8 +1159,7 @@ public class BubbleBarViewController { // ensure they've been initialized. if (mTaskbarStashController.isInApp() && mBubbleStashController.isTransientTaskBar() - && mTaskbarStashController.isStashed() - && !isExpanded()) { + && mTaskbarStashController.isStashed()) { mBubbleStashController.stashBubbleBarImmediate(); } else { mBubbleStashController.showBubbleBarImmediate(); @@ -1106,21 +1172,6 @@ public class BubbleBarViewController { } } - private void addBubbleView(BubbleView bubbleView, boolean suppressAnimation, - BubbleView selectedBubbleView) { - mBarView.addBubble(bubbleView, selectedBubbleView, suppressAnimation); - bubbleView.setOnClickListener(mBubbleClickListener); - mBubbleDragController.setupBubbleView(bubbleView); - bubbleView.setController(mBubbleViewController); - } - - /** - * Restore a previous bubble that is stored in {@link TaskbarSharedState}. - */ - public void restoreBubble(BubbleBarItem b) { - addBubbleView(b.getView(), /* suppressAnimation= */ true, /* bubbleToSelectView= */ null); - } - /** Animates the bubble bar to notify the user about a bubble change. */ public void animateBubbleNotification(BubbleBarBubble bubble, boolean isExpanding, boolean isUpdate) { @@ -1174,32 +1225,34 @@ public class BubbleBarViewController { mBarView.setSelectedBubble(newlySelected.getView()); } - /** @see #animateExpanded(boolean, boolean) */ - public void animateExpanded(boolean isExpanded) { - animateExpanded(isExpanded, /* maybeShowEdu= */ false); + /** @see #setExpanded(boolean, boolean) */ + public void setExpanded(boolean isExpanded) { + setExpanded(isExpanded, /* maybeShowEdu= */ false); } /** - * Sets whether the bubble bar should be animated to expanded state (not unstashed, but have - * the contents within it expanded). This method notifies SystemUI that the bubble bar is - * expanded and showing a selected bubble. This method should ONLY be called from UI events - * originating from Launcher. + * Sets whether the bubble bar should be expanded (not unstashed, but have the contents + * within it expanded). This method notifies SystemUI that the bubble bar is expanded and + * showing a selected bubble. This method should ONLY be called from UI events originating + * from Launcher. * * @param isExpanded whether the bar should be expanded * @param maybeShowEdu whether we should show the edu view before expanding */ - public void animateExpanded(boolean isExpanded, boolean maybeShowEdu) { + public void setExpanded(boolean isExpanded, boolean maybeShowEdu) { // if we're trying to expand try showing the edu view instead if (maybeShowEdu && isExpanded && !mBarView.isExpanded() && maybeShowEduView()) { return; } if (!mBubbleBarPinning.isAnimating() && isExpanded != mBarView.isExpanded()) { - mBarView.animateExpanded(isExpanded); + mBarView.setExpanded(isExpanded); adjustTaskbarAndHotseatToBubbleBarState(isExpanded); if (!isExpanded) { mSystemUiProxy.collapseBubbles(); } else { mBubbleBarController.showSelectedBubble(); + mTaskbarStashController.updateAndAnimateTransientTaskbar(true /* stash */, + false /* shouldBubblesFollow */); } } } @@ -1238,25 +1291,15 @@ public class BubbleBarViewController { * Sets whether the bubble bar should be expanded. This method is used in response to UI events * from SystemUI. */ - public void setExpandedFromSysui(boolean isExpanded, boolean animate) { + public void setExpandedFromSysui(boolean isExpanded) { if (isNewBubbleAnimationRunningOrPending() && isExpanded) { mBubbleBarViewAnimator.expandedWhileAnimating(); return; } - if (animate) { - if (!isExpanded) { - mBubbleStashController.stashBubbleBar(); - } else { - mBubbleStashController.showBubbleBar(true /* expand the bubbles */); - } + if (!isExpanded) { + mBubbleStashController.stashBubbleBar(); } else { - if (!isExpanded) { - mBubbleStashController.stashBubbleBarImmediate(); - } else { - mBubbleStashController.showBubbleBarImmediate(); - mBarView.setExpanded(true); - adjustTaskbarAndHotseatToBubbleBarState(true); - } + mBubbleStashController.showBubbleBar(true /* expand the bubbles */); } } @@ -1286,7 +1329,7 @@ public class BubbleBarViewController { * Notifies SystemUI to expand the selected bubble when the bubble is released. */ public void onBubbleDragRelease(BubbleBarLocation location) { - mSystemUiProxy.stopBubbleDrag(location, mBarView.getTopToScreenBottom()); + mSystemUiProxy.stopBubbleDrag(location, mBarView.getRestingTopPositionOnScreen()); } /** Handle given bubble being dismissed */ diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java index 083829bd57..c2118404e4 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java @@ -27,8 +27,6 @@ import com.android.launcher3.taskbar.bubbles.stashing.BubbleBarLocationOnDemandL import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController; import com.android.launcher3.util.MultiPropertyFactory; import com.android.launcher3.util.RunnableList; -import com.android.quickstep.SystemUiProxy; -import com.android.wm.shell.shared.bubbles.DragZoneFactory; import java.io.PrintWriter; import java.util.Optional; @@ -46,7 +44,6 @@ public class BubbleControllers { public final BubblePinController bubblePinController; public final Optional bubbleBarSwipeController; public final BubbleCreator bubbleCreator; - public final DragToBubbleController dragToBubbleController; private final RunnableList mPostInitRunnables = new RunnableList(); @@ -65,7 +62,6 @@ public class BubbleControllers { BubbleBarPinController bubbleBarPinController, BubblePinController bubblePinController, Optional bubbleBarSwipeController, - DragToBubbleController dragToBubbleController, BubbleCreator bubbleCreator) { this.bubbleBarController = bubbleBarController; this.bubbleBarViewController = bubbleBarViewController; @@ -77,7 +73,6 @@ public class BubbleControllers { this.bubblePinController = bubblePinController; this.bubbleBarSwipeController = bubbleBarSwipeController; this.bubbleCreator = bubbleCreator; - this.dragToBubbleController = dragToBubbleController; } /** @@ -120,30 +115,12 @@ public class BubbleControllers { .get(ALPHA_INDEX_BUBBLE_BAR); } }); - bubbleDragController.init(/* bubbleControllers = */ this, bubbleBarLocationListeners); + bubbleDragController.init(/* bubbleControllers = */ this); bubbleDismissController.init(/* bubbleControllers = */ this); bubbleBarPinController.init(this, bubbleBarLocationListeners); bubblePinController.init(this); bubbleBarSwipeController.ifPresent(c -> c.init(this)); - dragToBubbleController.init(bubbleBarViewController, - new DragZoneFactory.BubbleBarPropertiesProvider() { - @Override - public int getHeight() { - return (int) bubbleBarViewController.getBubbleBarCollapsedHeight(); - } - @Override - public int getWidth() { - return (int) bubbleBarViewController.getBubbleBarCollapsedWidth(); - } - - @Override - public int getBottomPadding() { - return -(int) bubbleStashController.getBubbleBarTranslationY(); - } - }, - bubbleBarLocationListeners, - SystemUiProxy.INSTANCE.get(taskbarControllers.taskbarActivityContext)); mPostInitRunnables.executeAllAndDestroy(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDismissViewExt.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDismissViewExt.kt index 27b30a1f3d..fdc9fb0b40 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDismissViewExt.kt +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDismissViewExt.kt @@ -18,7 +18,7 @@ package com.android.launcher3.taskbar.bubbles import com.android.launcher3.R -import com.android.wm.shell.R as SharedR // WM and WMShared are "shared" or linked together. +import com.android.wm.shell.R as SharedR import com.android.wm.shell.shared.bubbles.DismissView /** @@ -39,7 +39,6 @@ fun DismissView.setup() { floatingGradientColorResId = android.R.color.system_neutral1_900, backgroundResId = SharedR.drawable.floating_dismiss_background, iconResId = SharedR.drawable.floating_dismiss_ic_close, - applyMarginOverNavBarInset = false, ) ) } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java index 7535d366cc..3df10c0ce0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java @@ -30,14 +30,12 @@ import androidx.annotation.Nullable; import androidx.dynamicanimation.animation.FloatPropertyCompat; import com.android.launcher3.taskbar.TaskbarActivityContext; -import com.android.launcher3.taskbar.bubbles.BubbleBarController.BubbleBarLocationListener; import com.android.wm.shell.shared.bubbles.BaseBubblePinController.LocationChangeListener; import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper; import com.android.wm.shell.shared.bubbles.BubbleBarLocation; import com.android.wm.shell.shared.bubbles.DeviceConfig; import com.android.wm.shell.shared.bubbles.DragZone; import com.android.wm.shell.shared.bubbles.DragZoneFactory; -import com.android.wm.shell.shared.bubbles.DragZoneFactory.BubbleBarPropertiesProvider; import com.android.wm.shell.shared.bubbles.DragZoneFactory.DesktopWindowModeChecker; import com.android.wm.shell.shared.bubbles.DragZoneFactory.SplitScreenModeChecker; import com.android.wm.shell.shared.bubbles.DraggedObject; @@ -90,7 +88,6 @@ public class BubbleDragController { private BubbleDismissController mBubbleDismissController; private BubbleBarPinController mBubbleBarPinController; private BubblePinController mBubblePinController; - private BubbleBarLocationListener mBubbleBarLocationListener; private final DropTargetManager mDropTargetManager; private final DragZoneFactory mDragZoneFactory; private final BubbleDragZoneChangedListener mBubbleDragZoneChangedListener; @@ -116,25 +113,8 @@ public class BubbleDragController { return false; } }; - BubbleBarPropertiesProvider bubbleBarPropertiesProvider = - new BubbleBarPropertiesProvider() { - @Override - public int getHeight() { - return (int) mBubbleBarViewController.getBubbleBarCollapsedHeight(); - } - - @Override - public int getWidth() { - return (int) mBubbleBarViewController.getBubbleBarCollapsedWidth(); - } - - @Override - public int getBottomPadding() { - return (int) -mBubbleBarViewController.getBubbleBarTranslationY().value; - } - }; mDragZoneFactory = new DragZoneFactory(mActivity.getApplicationContext(), deviceConfig, - splitScreenModeChecker, desktopWindowModeChecker, bubbleBarPropertiesProvider); + splitScreenModeChecker, desktopWindowModeChecker); mBubbleDragZoneChangedListener = new BubbleDragZoneChangedListener(); mDropTargetManager = new DropTargetManager(mActivity.getApplicationContext(), dropTargetParent, mBubbleDragZoneChangedListener); @@ -145,14 +125,12 @@ public class BubbleDragController { * Should be careful to only access things that were created in constructors for now, as some * controllers may still be waiting for init(). */ - public void init(@NonNull BubbleControllers bubbleControllers, - BubbleBarLocationListener bubbleBarLocationListener) { + public void init(@NonNull BubbleControllers bubbleControllers) { mBubbleBarController = bubbleControllers.bubbleBarController; mBubbleBarViewController = bubbleControllers.bubbleBarViewController; mBubbleDismissController = bubbleControllers.bubbleDismissController; mBubbleBarPinController = bubbleControllers.bubbleBarPinController; mBubblePinController = bubbleControllers.bubblePinController; - mBubbleBarLocationListener = bubbleBarLocationListener; mBubbleDismissController.setListener( stuck -> { if (stuck) { @@ -216,7 +194,9 @@ public class BubbleDragController { protected void onDragUpdate(float x, float y, float newTx, float newTy) { bubbleView.setDragTranslationX(newTx); bubbleView.setTranslationY(newTy); - if (!BubbleAnythingFlagHelper.enableBubbleToFullscreen()) { + if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) { + mDropTargetManager.onDragUpdated((int) x, (int) y); + } else { mBubblePinController.onDragUpdate(x, y); } } @@ -325,7 +305,9 @@ public class BubbleDragController { protected void onDragUpdate(float x, float y, float newTx, float newTy) { bubbleBarView.setTranslationX(newTx); bubbleBarView.setTranslationY(newTy); - if (!BubbleAnythingFlagHelper.enableBubbleToFullscreen()) { + if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) { + mDropTargetManager.onDragUpdated((int) x, (int) y); + } else { mBubbleBarPinController.onDragUpdate(x, y); } } @@ -588,17 +570,7 @@ public class BubbleDragController { private void drag(@NonNull View view, @NonNull MotionEvent event, float dx, float dy, float x, float y) { - if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) { - // notify drop target manager about the new drag location regardless of whether we - // are in the dismiss zone so that it can keep track of the current zone and update - // the drop target view - mDropTargetManager.onDragUpdated((int) x, (int) y); - } - if (mBubbleDismissController.handleTouchEvent(event)) { - // if we're dragging within the dismiss target, return immediately; the dragged - // object is manipulated by the dismiss target - return; - } + if (mBubbleDismissController.handleTouchEvent(event)) return; final float newTx = mViewInitialPosition.x + dx; final float newTy = mViewInitialPosition.y + dy; onDragUpdate(x, y, newTx, newTy); @@ -626,7 +598,7 @@ public class BubbleDragController { } } else { mAnimator.animateToRestingState(getRestingPosition(), getCurrentVelocity(), - onComplete); + onComplete); } } mBubbleDismissController.hideDismissView(); @@ -678,7 +650,7 @@ public class BubbleDragController { } @Override - public void onInitialDragZoneSet(@Nullable DragZone dragZone) { + public void onInitialDragZoneSet(@NonNull DragZone dragZone) { mDragZone = dragZone; if (dragZone instanceof DragZone.Bubble.Left) { mBubbleBarLocation = BubbleBarLocation.LEFT; @@ -688,31 +660,25 @@ public class BubbleDragController { } @Override - public void onDragZoneChanged(@NonNull DraggedObject draggedObject, @Nullable DragZone from, - @Nullable DragZone to) { + public void onDragZoneChanged(@NonNull DraggedObject draggedObject, @NonNull DragZone from, + @NonNull DragZone to) { mDragZone = to; if (to instanceof DragZone.Bubble.Left && mBubbleBarLocation != BubbleBarLocation.LEFT) { if (draggedObject instanceof DraggedObject.Bubble) { - // listener will be notified by BubbleBarController mBubbleBarController.animateBubbleBarLocation(BubbleBarLocation.LEFT); - } else { - // otherwise notify listener manually - mBubbleBarLocationListener.onBubbleBarLocationAnimated(BubbleBarLocation.LEFT); } mBubbleBarLocation = BubbleBarLocation.LEFT; } else if (to instanceof DragZone.Bubble.Right && mBubbleBarLocation != BubbleBarLocation.RIGHT) { if (draggedObject instanceof DraggedObject.Bubble) { mBubbleBarController.animateBubbleBarLocation(BubbleBarLocation.RIGHT); - } else { - mBubbleBarLocationListener.onBubbleBarLocationAnimated(BubbleBarLocation.RIGHT); } mBubbleBarLocation = BubbleBarLocation.RIGHT; } } @Override - public void onDragEnded(@Nullable DragZone zone) {} + public void onDragEnded(@NonNull DragZone zone) {} } } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java index 7e2b139f2b..ec540e0088 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java @@ -85,6 +85,7 @@ public class BubbleStashedHandleViewController { mActivity = activity; mStashedHandleView = stashedHandleView; mStashedHandleAlpha = new MultiValueAlpha(mStashedHandleView, 1); + mStashedHandleAlpha.setUpdateVisibility(true); } /** Initialize controller. */ @@ -104,7 +105,7 @@ public class BubbleStashedHandleViewController { // Use values directly from device profile to avoid referencing other bubble controllers // during init flow. int maxTy = Math.max(deviceProfile.hotseatBarBottomSpacePx, - deviceProfile.getTaskbarProfile().getBottomMargin()); + deviceProfile.taskbarBottomMargin); // Adjust handle view size to accommodate the handle morphing into the bubble bar mStashedHandleView.getLayoutParams().height = barSize + maxTy; @@ -348,7 +349,7 @@ public class BubbleStashedHandleViewController { // the bounds of the handle only include the visible part, so we check that the Y coordinate // is anywhere within the stashed height of bubble bar (same as taskbar stashed height). - final int top = mActivity.getDeviceProfile().getDeviceProperties().getHeightPx() - mStashedBubbleBarHeight; + final int top = mActivity.getDeviceProfile().heightPx - mStashedBubbleBarHeight; final float x = ev.getRawX(); return ev.getRawY() >= top && x >= mStashedHandleBounds.left && x <= mStashedHandleBounds.right; diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt index 15fe35b3cc..622fea2928 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt @@ -728,7 +728,7 @@ constructor( } private fun expandBubbleBar() { - bubbleBarView.animateExpanded(true) + bubbleBarView.isExpanded = true onExpanded.run() } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutController.kt index 4a2f029fd5..fea40f9211 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutController.kt @@ -64,7 +64,6 @@ constructor( } fun setUpAndShowFlyout(message: BubbleBarFlyoutMessage, onInit: () -> Unit, onEnd: () -> Unit) { - animator?.cancel() flyout?.let(container::removeView) val flyout = BubbleBarFlyoutView(container.context, positioner, flyoutScheduler) diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt index 56622020e8..ec272ac873 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt @@ -186,14 +186,12 @@ interface BubbleStashController { fun getHandleViewAlpha(): MultiPropertyFactory.MultiProperty? = null /** - * Default implementation only analyse [isBubblesShowingOnHome] and return value is equal to - * [targetTranslationYForState]. + * Returns bubble bar Y position according to [isBubblesShowingOnHome] and + * [isBubblesShowingOnOverview] values. Default implementation only analyse + * [isBubblesShowingOnHome] and return translationY to align with the hotseat vertical center. + * For Other cases align bubbles with the taskbar. */ val bubbleBarTranslationY: Float - get() = targetTranslationYForState - - /** Returns bubble bar Y target position according to [isBubblesShowingOnHome] value. */ - val targetTranslationYForState: Float get() = if (isBubblesShowingOnHome) { bubbleBarTranslationYForHotseat diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/DeviceProfileDimensionsProviderAdapter.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/DeviceProfileDimensionsProviderAdapter.kt index 2408274c9f..886b9f02c2 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/DeviceProfileDimensionsProviderAdapter.kt +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/DeviceProfileDimensionsProviderAdapter.kt @@ -27,9 +27,9 @@ import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.Task class DeviceProfileDimensionsProviderAdapter( private val taskbarActivityContext: TaskbarActivityContext ) : TaskbarHotseatDimensionsProvider { - override fun getTaskbarBottomSpace(): Int = taskbarDp().taskbarProfile.bottomMargin + override fun getTaskbarBottomSpace(): Int = taskbarDp().taskbarBottomMargin - override fun getTaskbarHeight(): Int = taskbarDp().taskbarProfile.height + override fun getTaskbarHeight(): Int = taskbarDp().taskbarHeight private fun taskbarDp(): DeviceProfile = taskbarActivityContext.deviceProfile } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashController.kt index 5c8746cb8b..9d8c0ed970 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashController.kt @@ -60,10 +60,6 @@ class PersistentBubbleStashController( // if there are no bubbles, there's nothing to show, so just return. return } - if (transitionFromHome && inAppDisplayOverrideProgress != 0f) { - // was on -1 page and leaving it, - reset the inAppDisplayOverrideProgress - inAppDisplayOverrideProgress = 0f - } // If we're transitioning anywhere, bubble bar should be collapsed updateExpandedState(expand = false) if (transitionFromHome || field == BubbleLauncherState.HOME) { @@ -104,10 +100,6 @@ class PersistentBubbleStashController( return -bubbleBarVerticalCenterForHome + bubbleBarHeight / 2 } - /** - * Returns bubble bar Y target position according to [isBubblesShowingOnHome] value. Value could - * be adjusted to the display override progress. - */ override val bubbleBarTranslationY: Float get() = if (inAppDisplayOverrideProgress > 0f && launcherState == BubbleLauncherState.HOME) { @@ -120,7 +112,7 @@ class PersistentBubbleStashController( Interpolators.LINEAR, ) } else { - targetTranslationYForState + super.bubbleBarTranslationY } override var inAppDisplayOverrideProgress: Float = 0f @@ -246,7 +238,7 @@ class PersistentBubbleStashController( } if (bubbleBarViewController.isExpanded != expand) { val maybeShowEdu = expand && bubbleBarGesture - bubbleBarViewController.animateExpanded(expand, maybeShowEdu) + bubbleBarViewController.setExpanded(expand, maybeShowEdu) } } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt index 00e79029e2..82bb071bc3 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt @@ -115,16 +115,7 @@ class TransientBubbleStashController( } // Only stash if we're in an app, otherwise we're in home or overview where we should // be un-stashed - val stash = field == BubbleLauncherState.IN_APP - val expand = - if (stash) { - // Always collapse when we are stashing - false - } else { - // If unstashing, keep the current state - bubbleBarViewController.isExpanded - } - updateStashedAndExpandedState(stash, expand) + updateStashedAndExpandedState(field == BubbleLauncherState.IN_APP, expand = false) } override var isSysuiLocked: Boolean = false @@ -477,7 +468,7 @@ class TransientBubbleStashController( // reset stash translation translationYDuringStash.updateValue(0f) bubbleBarBubbleTranslationY.updateValue(0f) - bubbleBarViewController.animateExpanded(false) + bubbleBarViewController.isExpanded = false } taskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged() } @@ -565,7 +556,6 @@ class TransientBubbleStashController( ) { if (bubbleBarViewController.isHiddenForNoBubbles) { // If there are no bubbles the bar and handle are invisible, nothing to do here. - cancelAnimation() return } val isStashed = stash && !isBubblesShowingOnHome && !isBubblesShowingOnOverview @@ -587,7 +577,7 @@ class TransientBubbleStashController( } if (bubbleBarViewController.isExpanded != expand) { val maybeShowEdu = expand && bubbleBarGesture - bubbleBarViewController.animateExpanded(expand, maybeShowEdu) + bubbleBarViewController.setExpanded(expand, maybeShowEdu) } } diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt index 2807668107..a1df21fa04 100644 --- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt +++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt @@ -49,15 +49,11 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 private var allAppsTouchTriggered = false private var allAppsTouchRunnable: Runnable? = null private var allAppsButtonTouchDelayMs: Long = ViewConfiguration.getLongPressTimeout().toLong() - private var isTaskbarInMinimalState = false private lateinit var taskbarViewCallbacks: TaskbarViewCallbacks override val spaceNeeded: Int get() { - return dpToPx( - activityContext.taskbarSpecsEvaluator.taskbarIconSize.size.toFloat(), - activityContext, - ) + return dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconSize.size.toFloat()) } init { @@ -74,12 +70,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 backgroundTintList = ColorStateList.valueOf(TRANSPARENT) setIconDrawable(drawable) if (!activityContext.isTransientTaskbar) { - setPadding( - dpToPx( - (activityContext.taskbarSpecsEvaluator.taskbarIconPadding).toFloat(), - activityContext, - ) - ) + setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat())) } setForegroundTint(activityContext.getColor(R.color.all_apps_button_color)) } @@ -111,26 +102,29 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 return getAllAppsButtonForExpressiveTheme() } val shouldSelectTransientIcon = - isTransientTaskbar || - (enableTaskbarPinning() && - activityContext.taskbarFeatureEvaluator.supportsTransitionToTransientTaskbar) + isTransientTaskbar || (enableTaskbarPinning() && !activityContext.isThreeButtonNav) return if (shouldSelectTransientIcon) R.drawable.ic_transient_taskbar_all_apps_search_button else R.drawable.ic_taskbar_all_apps_search_button } @DrawableRes private fun getAllAppsButtonForExpressiveTheme(): Int { - return if (isTaskbarInMinimalState) { - R.drawable.ic_taskbar_minimal_state_all_apps_search_button_expressive_theme + return R.drawable.ic_taskbar_all_apps_search_button_expressive_theme + } + + @DimenRes + fun getAllAppsButtonTranslationXOffsetForExpressiveTheme(isTransientTaskbar: Boolean): Int { + return if (isTransientTaskbar) { + R.dimen.transient_taskbar_all_apps_button_translation_x_offset_for_expressive_theme } else { - R.drawable.ic_taskbar_all_apps_search_button_expressive_theme + R.dimen.taskbar_all_apps_search_button_translation_x_offset_for_expressive_theme } } @DimenRes fun getAllAppsButtonTranslationXOffset(isTransientTaskbar: Boolean): Int { if (Flags.enableGsf()) { - return R.dimen.taskbar_all_apps_search_button_translation_x_offset_for_expressive_theme + return getAllAppsButtonTranslationXOffsetForExpressiveTheme(isTransientTaskbar) } return if (isTransientTaskbar) { R.dimen.transient_taskbar_all_apps_button_translation_x_offset @@ -139,14 +133,6 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 } } - /** Taskbar minimal state is that taskbar does not host anything other than all apps button. */ - fun updateTaskbarMinimalState(isInMinimalState: Boolean) { - if (isTaskbarInMinimalState != isInMinimalState) { - isTaskbarInMinimalState = isInMinimalState - setUpIcon() - } - } - private fun onAllAppsButtonTouch(view: View, ev: MotionEvent): Boolean { when (ev.action) { MotionEvent.ACTION_DOWN -> { diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt index 96dc5c8447..08a1b48acf 100644 --- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt +++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt @@ -40,10 +40,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 override val spaceNeeded: Int get() { - return dpToPx( - activityContext.taskbarSpecsEvaluator.taskbarIconSize.size.toFloat(), - activityContext, - ) + return dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconSize.size.toFloat()) } init { @@ -56,12 +53,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 val drawable = getTaskbarDividerIcon() setIconDrawable(drawable) if (!activityContext.isTransientTaskbar) { - setPadding( - dpToPx( - activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat(), - activityContext, - ) - ) + setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat())) } } @@ -75,8 +67,8 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 } @SuppressLint("ClickableViewAccessibility") - fun setUpCallbacks(callbacks: TaskbarViewCallbacks?) { - setOnLongClickListener(callbacks?.taskbarDividerLongClickListener) - setOnTouchListener(callbacks?.taskbarDividerRightClickListener) + fun setUpCallbacks(callbacks: TaskbarViewCallbacks) { + setOnLongClickListener(callbacks.taskbarDividerLongClickListener) + setOnTouchListener(callbacks.taskbarDividerRightClickListener) } } diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarFeatureEvaluator.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarFeatureEvaluator.kt index 2de143e979..a14c5a47e6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarFeatureEvaluator.kt +++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarFeatureEvaluator.kt @@ -38,17 +38,11 @@ private constructor(private val taskbarActivityContext: TaskbarActivityContext) get() = taskbarActivityContext.isTransientTaskbar val isLandscape: Boolean - get() = taskbarActivityContext.deviceProfile.deviceProperties.isLandscape - - val isTnMinimalState: Boolean - get() = taskbarActivityContext.isTaskbarInMinimalState + get() = taskbarActivityContext.deviceProfile.isLandscape val supportsPinningPopup: Boolean get() = !hasNavButtons - val supportsTransitionToTransientTaskbar: Boolean - get() = !hasNavButtons && !taskbarActivityContext.showDesktopTaskbarForFreeformDisplay() - fun onDestroy() { taskbarFeatureEvaluator = null } diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarSpecsEvaluator.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarSpecsEvaluator.kt index 13c878ee6f..f1ed6c5ea0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarSpecsEvaluator.kt +++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarSpecsEvaluator.kt @@ -35,7 +35,7 @@ class TaskbarSpecsEvaluator( val taskbarIconPadding: Int = if ( TaskbarIconSpecs.transientOrPinnedTaskbarIconPaddingSize.size > taskbarIconSize.size && - taskbarFeatureEvaluator.supportsTransitionToTransientTaskbar + !taskbarFeatureEvaluator.hasNavButtons ) { (TaskbarIconSpecs.iconSize52dp.size - taskbarIconSize.size) / 2 } else { diff --git a/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt b/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt index 5c5990eb24..04e41bc3bd 100644 --- a/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt @@ -16,34 +16,15 @@ package com.android.launcher3.taskbar.growth import android.content.Context -import android.os.Bundle -import android.view.View -import android.view.View.GONE -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.view.ViewGroup.MarginLayoutParams -import android.view.accessibility.AccessibilityEvent -import android.view.accessibility.AccessibilityNodeInfo -import android.widget.Button -import android.widget.ImageView -import android.widget.TextView -import androidx.annotation.LayoutRes -import androidx.core.view.updateLayoutParams -import com.airbnb.lottie.LottieAnimationView -import com.android.launcher3.R import com.android.launcher3.Utilities import com.android.launcher3.taskbar.TaskbarActivityContext -import com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_GROWTH_NUDGE_OPEN import com.android.launcher3.taskbar.TaskbarControllers import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController +import com.android.launcher3.util.DisplayController import com.android.launcher3.views.ActivityContext -import com.android.quickstep.util.LottieAnimationColorUtils import java.io.PrintWriter -/** - * Controls nudge lifecycles. - * - * TODO: b/413718172 - Refactor to reduce code duplication with [TaskbarEduTooltipController]. - */ +/** Controls nudge lifecycles. */ class NudgeController(context: Context) : LoggableTaskbarController { protected val activityContext: TaskbarActivityContext = ActivityContext.lookupContext(context) @@ -55,184 +36,26 @@ class NudgeController(context: Context) : LoggableTaskbarController { !activityContext.isTinyTaskbar } - val isNudgeOpen: Boolean - get() = nudgeView?.isOpen == true - private lateinit var controllers: TaskbarControllers - private var nudgeView: NudgeView? = null - fun init(controllers: TaskbarControllers) { this.controllers = controllers } - fun maybeShow(model: NudgePayload) { - if (!isNudgeEnabled || !activityContext.isTransientTaskbar) { + fun maybeShow(payload: NudgePayload) { + if (!isNudgeEnabled || !DisplayController.isTransientTaskbar(activityContext)) { return } - - inflateNudgeContent(R.layout.growth_nudge) - nudgeView?.run { - allowTouchDismissal = false - - fun updateButton(button: Button, buttonPayload: ButtonPayload?) { - if (buttonPayload != null) { - button.apply { - text = buttonPayload.label - setOnClickListener { - ActionPerformers.performActions( - /*actions=*/ buttonPayload.actions, - /*context=*/ activityContext, - /*dismissCallback=*/ ::hide, - ) - } - } - } else { - button.visibility = GONE - } - } - - fun updateImage(image: Image?) { - val imageView = requireViewById(R.id.image_view) - when (image) { - is Image.ResourceId -> { - imageView.setImageDrawable(context.getDrawable(image.resId)) - } - null -> imageView.visibility = GONE - } - } - - fun updateContent() { - // Update content. - val title = requireViewById(R.id.title) - title.text = model.titleText - val body = requireViewById(R.id.body) - body.text = model.bodyText - updateButton(requireViewById(R.id.primary_button), model.primaryButton) - updateButton(requireViewById(R.id.secondary_button), model.secondaryButton) - updateImage(model.image) - } - - fun updateLayout() { - content.updateLayoutParams { width = MATCH_PARENT } - val sideSpacing = - resources.getDimensionPixelSize(R.dimen.nudge_default_position_side_spacing) - updateLayoutParams { - if (Utilities.isRtl(context.getResources())) { - rightMargin = sideSpacing - } else { - leftMargin = sideSpacing - } - width = resources.getDimensionPixelSize(R.dimen.nudge_width) - } - } - - updateContent() - updateLayout() - show() - } + // TODO: b/398033012 - create and show nudge view based on the payload. } /** Closes the current [nudgeView]. */ fun hide() { - nudgeView?.close(true) + // TODO: b/398033012 - hide the nudge view. } - /** Initializes [nudgeView] with content from [contentResId]. */ - private fun inflateNudgeContent(@LayoutRes contentResId: Int) { - val overlayContext = controllers.taskbarOverlayController.requestWindow() - val nudgeView = - overlayContext.layoutInflater.inflate( - R.layout.taskbar_nudge_container, - overlayContext.dragLayer, - false, - ) as NudgeView - - controllers.taskbarAutohideSuspendController.updateFlag( - FLAG_AUTOHIDE_SUSPEND_GROWTH_NUDGE_OPEN, - true, - ) - - nudgeView.onCloseCallback = { - this.nudgeView = null - controllers.taskbarAutohideSuspendController.updateFlag( - FLAG_AUTOHIDE_SUSPEND_GROWTH_NUDGE_OPEN, - false, - ) - controllers.taskbarStashController.updateAndAnimateTransientTaskbar(true) - } - nudgeView.accessibilityDelegate = createAccessibilityDelegate() - - overlayContext.layoutInflater.inflate(contentResId, nudgeView.content, true) - this.nudgeView = nudgeView - } - - private fun createAccessibilityDelegate() = - object : View.AccessibilityDelegate() { - override fun performAccessibilityAction( - host: View, - action: Int, - args: Bundle?, - ): Boolean { - if (action == R.id.close) { - hide() - return true - } - return super.performAccessibilityAction(host, action, args) - } - - override fun onPopulateAccessibilityEvent(host: View, event: AccessibilityEvent) { - super.onPopulateAccessibilityEvent(host, event) - if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { - event.text.add(host.context?.getText(R.string.nudge_a11y_title)) - } - } - - override fun onInitializeAccessibilityNodeInfo( - host: View, - info: AccessibilityNodeInfo, - ) { - super.onInitializeAccessibilityNodeInfo(host, info) - info.addAction( - AccessibilityNodeInfo.AccessibilityAction( - R.id.close, - host.context?.getText(R.string.nudge_a11y_close), - ) - ) - } - } - override fun dumpLogs(prefix: String?, pw: PrintWriter?) { pw?.println(prefix + "NudgeController:") pw?.println("$prefix\tisNudgeEnabled=$isNudgeEnabled") - pw?.println("$prefix\tisOpen=$isNudgeOpen") } } - -/** - * Maps colors in the dark-themed Lottie assets to their light-themed equivalents. - * - * For instance, `".blue100" to R.color.lottie_blue400` means objects that are material blue100 in - * dark theme should be changed to material blue400 in light theme. - */ -private val DARK_TO_LIGHT_COLORS = - mapOf( - ".blue100" to R.color.lottie_blue400, - ".blue400" to R.color.lottie_blue600, - ".green100" to R.color.lottie_green400, - ".green400" to R.color.lottie_green600, - ".grey300" to R.color.lottie_grey600, - ".grey400" to R.color.lottie_grey700, - ".grey800" to R.color.lottie_grey200, - ".red400" to R.color.lottie_red600, - ".yellow100" to R.color.lottie_yellow400, - ".yellow400" to R.color.lottie_yellow600, - ) - -private fun LottieAnimationView.supportLightTheme() { - if (Utilities.isDarkTheme(context)) { - return - } - - LottieAnimationColorUtils.updateToColorResources(this, DARK_TO_LIGHT_COLORS, context.theme) -} diff --git a/quickstep/src/com/android/launcher3/taskbar/growth/NudgePayload.kt b/quickstep/src/com/android/launcher3/taskbar/growth/NudgePayload.kt index 7c167b959d..7498cbc9b0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/growth/NudgePayload.kt +++ b/quickstep/src/com/android/launcher3/taskbar/growth/NudgePayload.kt @@ -26,6 +26,8 @@ sealed interface Action { sealed class Image { data class ResourceId(val resId: Int) : Image() + + data class Url(val url: String) : Image() } data class ButtonPayload(val label: String, val actions: List) diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/AbstractNavButtonLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/AbstractNavButtonLayoutter.kt index 918d5cf71e..3712a76eab 100644 --- a/quickstep/src/com/android/launcher3/taskbar/navbutton/AbstractNavButtonLayoutter.kt +++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/AbstractNavButtonLayoutter.kt @@ -90,7 +90,7 @@ abstract class AbstractNavButtonLayoutter( resources.getDimensionPixelSize(R.dimen.taskbar_contextual_button_suw_margin) nearestTouchFrameLayoutParams.marginStart = phoneOrPortraitSetupMargin nearestTouchFrameLayoutParams.bottomMargin = - if (!deviceProfile.deviceProperties.isLandscape) 0 + if (!deviceProfile.isLandscape) 0 else phoneOrPortraitSetupMargin - resources.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size) / 2 diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt index 17e63e8bd3..a199dba0bd 100644 --- a/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt +++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt @@ -90,7 +90,7 @@ class NavButtonLayoutFactory { ) } isPhoneNavMode -> { - if (!deviceProfile.deviceProperties.isLandscape) { + if (!deviceProfile.isLandscape) { navButtonsView.setIsVertical(false) PhonePortraitNavLayoutter( resources, diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneLandscapeNavLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneLandscapeNavLayoutter.kt index 00ba40c7f9..9f7f07e773 100644 --- a/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneLandscapeNavLayoutter.kt +++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneLandscapeNavLayoutter.kt @@ -25,7 +25,6 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.Space import com.android.launcher3.R -import com.android.launcher3.Utilities import com.android.launcher3.taskbar.TaskbarActivityContext open class PhoneLandscapeNavLayoutter( @@ -35,7 +34,7 @@ open class PhoneLandscapeNavLayoutter( startContextualContainer: ViewGroup, imeSwitcher: ImageView?, a11yButton: ImageView?, - space: Space?, + space: Space? ) : AbstractNavButtonLayoutter( resources, @@ -44,11 +43,11 @@ open class PhoneLandscapeNavLayoutter( startContextualContainer, imeSwitcher, a11yButton, - space, + space ) { override fun layoutButtons(context: TaskbarActivityContext, isA11yButtonPersistent: Boolean) { - val totalHeight = context.deviceProfile.deviceProperties.heightPx + val totalHeight = context.deviceProfile.heightPx val homeButtonHeight = resources.getDimensionPixelSize(R.dimen.taskbar_phone_home_button_size) val roundedCornerContentMargin = @@ -113,15 +112,9 @@ open class PhoneLandscapeNavLayoutter( open fun addThreeButtons() { // Swap recents and back button - if (Utilities.isRtl(resources)) { - navButtonContainer.addView(backButton) - navButtonContainer.addView(homeButton) - navButtonContainer.addView(recentsButton) - } else { - navButtonContainer.addView(recentsButton) - navButtonContainer.addView(homeButton) - navButtonContainer.addView(backButton) - } + navButtonContainer.addView(recentsButton) + navButtonContainer.addView(homeButton) + navButtonContainer.addView(backButton) } open fun repositionContextualButtons(buttonSize: Int) { @@ -136,14 +129,14 @@ open class PhoneLandscapeNavLayoutter( buttonSize, roundedCornerContentMargin + contentPadding, 0, - Gravity.TOP, + Gravity.TOP ) repositionContextualContainer( endContextualContainer, buttonSize, 0, roundedCornerContentMargin + contentPadding, - Gravity.BOTTOM, + Gravity.BOTTOM ) if (imeSwitcher != null) { @@ -162,7 +155,7 @@ open class PhoneLandscapeNavLayoutter( buttonSize: Int, barAxisMarginTop: Int, barAxisMarginBottom: Int, - gravity: Int, + gravity: Int ) { val contextualContainerParams = FrameLayout.LayoutParams(MATCH_PARENT, buttonSize) contextualContainerParams.apply { diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/PhonePortraitNavLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhonePortraitNavLayoutter.kt index 833a309e83..5b24ebfe1d 100644 --- a/quickstep/src/com/android/launcher3/taskbar/navbutton/PhonePortraitNavLayoutter.kt +++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhonePortraitNavLayoutter.kt @@ -34,7 +34,7 @@ class PhonePortraitNavLayoutter( startContextualContainer: ViewGroup, imeSwitcher: ImageView?, a11yButton: ImageView?, - space: Space?, + space: Space? ) : AbstractNavButtonLayoutter( resources, @@ -43,11 +43,11 @@ class PhonePortraitNavLayoutter( startContextualContainer, imeSwitcher, a11yButton, - space, + space ) { override fun layoutButtons(context: TaskbarActivityContext, isA11yButtonPersistent: Boolean) { - val totalWidth = context.deviceProfile.deviceProperties.widthPx + val totalWidth = context.deviceProfile.widthPx val homeButtonWidth = resources.getDimensionPixelSize(R.dimen.taskbar_phone_home_button_size) val roundedCornerContentMargin = @@ -63,7 +63,7 @@ class PhonePortraitNavLayoutter( val navContainerParams = FrameLayout.LayoutParams( navButtonContainerWidth.toInt(), - ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT ) navContainerParams.apply { topMargin = 0 @@ -120,14 +120,14 @@ class PhonePortraitNavLayoutter( contextualButtonWidth.toInt(), roundedCornerContentMargin + contentPadding, 0, - Gravity.START, + Gravity.START ) repositionContextualContainer( endContextualContainer, contextualButtonWidth.toInt(), 0, roundedCornerContentMargin + contentPadding, - Gravity.END, + Gravity.END ) startContextualContainer.addView(space, MATCH_PARENT, MATCH_PARENT) diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneSeascapeNavLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneSeascapeNavLayoutter.kt index cf6f89857a..f0b47f4caa 100644 --- a/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneSeascapeNavLayoutter.kt +++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneSeascapeNavLayoutter.kt @@ -24,7 +24,6 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.Space import com.android.launcher3.R -import com.android.launcher3.Utilities class PhoneSeascapeNavLayoutter( resources: Resources, @@ -33,7 +32,7 @@ class PhoneSeascapeNavLayoutter( startContextualContainer: ViewGroup, imeSwitcher: ImageView?, a11yButton: ImageView?, - space: Space?, + space: Space? ) : PhoneLandscapeNavLayoutter( resources, @@ -42,20 +41,14 @@ class PhoneSeascapeNavLayoutter( startContextualContainer, imeSwitcher, a11yButton, - space, + space ) { override fun addThreeButtons() { // Flip ordering of back and recents buttons - if (Utilities.isRtl(resources)) { - navButtonContainer.addView(recentsButton) - navButtonContainer.addView(homeButton) - navButtonContainer.addView(backButton) - } else { - navButtonContainer.addView(backButton) - navButtonContainer.addView(homeButton) - navButtonContainer.addView(recentsButton) - } + navButtonContainer.addView(backButton) + navButtonContainer.addView(homeButton) + navButtonContainer.addView(recentsButton) } override fun repositionContextualButtons(buttonSize: Int) { @@ -70,14 +63,14 @@ class PhoneSeascapeNavLayoutter( buttonSize, roundedCornerContentMargin + contentPadding, 0, - Gravity.TOP, + Gravity.TOP ) repositionContextualContainer( endContextualContainer, buttonSize, 0, roundedCornerContentMargin + contentPadding, - Gravity.BOTTOM, + Gravity.BOTTOM ) startContextualContainer.addView(space, MATCH_PARENT, MATCH_PARENT) diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/SetupNavLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/SetupNavLayoutter.kt index 24998d4178..eb3fdeb99e 100644 --- a/quickstep/src/com/android/launcher3/taskbar/navbutton/SetupNavLayoutter.kt +++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/SetupNavLayoutter.kt @@ -59,9 +59,7 @@ class SetupNavLayoutter( override fun layoutButtons(context: TaskbarActivityContext, isA11yButtonPersistent: Boolean) { val SUWTheme = SystemProperties.get(SUW_THEME_SYSTEM_PROPERTY, "") - val expressiveThemeEnabled = - SUWTheme == GLIF_EXPRESSIVE_THEME || SUWTheme == GLIF_EXPRESSIVE_LIGHT_THEME - if (expressiveThemeEnabled && !context.isSimpleViewEnabled) { + if (SUWTheme == GLIF_EXPRESSIVE_THEME || SUWTheme == GLIF_EXPRESSIVE_LIGHT_THEME) { return } // Since setup wizard only has back button enabled, it looks strange to be @@ -72,15 +70,15 @@ class SetupNavLayoutter( val deviceProfile: DeviceProfile = context.deviceProfile navButtonsLayoutParams.marginEnd = 0 - navButtonsLayoutParams.gravity = Gravity.START or Gravity.CENTER_VERTICAL + navButtonsLayoutParams.gravity = Gravity.START context.setTaskbarWindowSize(context.setupWindowSize) // If SUW is on a large screen device that is landscape (or has a square aspect // ratio) the back button has to be placed accordingly if ( - deviceProfile.deviceProperties.isTablet && deviceProfile.deviceProperties.isLandscape || - (deviceProfile.deviceProperties.aspectRatio > SQUARE_ASPECT_RATIO_BOTTOM_BOUND && - deviceProfile.deviceProperties.aspectRatio < SQUARE_ASPECT_RATIO_UPPER_BOUND) + deviceProfile.isTablet && deviceProfile.isLandscape || + (deviceProfile.aspectRatio > SQUARE_ASPECT_RATIO_BOTTOM_BOUND && + deviceProfile.aspectRatio < SQUARE_ASPECT_RATIO_UPPER_BOUND) ) { navButtonsLayoutParams.marginStart = resources.getDimensionPixelSize(R.dimen.taskbar_back_button_suw_start_margin) diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/TaskbarNavLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/TaskbarNavLayoutter.kt index bef432e668..a59e8a847b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/navbutton/TaskbarNavLayoutter.kt +++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/TaskbarNavLayoutter.kt @@ -35,7 +35,7 @@ class TaskbarNavLayoutter( startContextualContainer: ViewGroup, imeSwitcher: ImageView?, a11yButton: ImageView?, - space: Space?, + space: Space? ) : AbstractNavButtonLayoutter( resources, @@ -44,7 +44,7 @@ class TaskbarNavLayoutter( startContextualContainer, imeSwitcher, a11yButton, - space, + space ) { override fun layoutButtons(context: TaskbarActivityContext, isA11yButtonPersistent: Boolean) { @@ -69,7 +69,7 @@ class TaskbarNavLayoutter( val navButtonParams = FrameLayout.LayoutParams( FrameLayout.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT ) navButtonParams.apply { gravity = Gravity.END or Gravity.CENTER_VERTICAL @@ -101,7 +101,7 @@ class TaskbarNavLayoutter( endContextualContainer.removeAllViews() startContextualContainer.removeAllViews() - if (!context.deviceProfile.deviceProperties.isGestureMode) { + if (!context.deviceProfile.isGestureMode) { val contextualMargin = resources.getDimensionPixelSize(R.dimen.taskbar_contextual_button_padding) repositionContextualContainer(endContextualContainer, WRAP_CONTENT, 0, 0, Gravity.END) @@ -110,7 +110,7 @@ class TaskbarNavLayoutter( WRAP_CONTENT, contextualMargin, contextualMargin, - Gravity.START, + Gravity.START ) if (imeSwitcher != null) { @@ -122,7 +122,7 @@ class TaskbarNavLayoutter( val imeSwitcherButtonParams = FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT ) imeSwitcherButtonParams.apply { marginStart = imeStartMargin diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java index c964474912..6db300bf59 100644 --- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java @@ -16,14 +16,12 @@ package com.android.launcher3.taskbar.overlay; import android.content.Context; -import android.graphics.Point; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.DeviceProfile; -import com.android.launcher3.Flags; import com.android.launcher3.R; import com.android.launcher3.popup.PopupDataProvider; import com.android.launcher3.taskbar.BaseTaskbarContext; @@ -59,14 +57,13 @@ public class TaskbarOverlayContext extends BaseTaskbarContext { Context windowContext, TaskbarActivityContext taskbarContext, TaskbarControllers controllers) { - super(windowContext, taskbarContext.getDisplayId(), taskbarContext.isPrimaryDisplay()); + super(windowContext, taskbarContext.isPrimaryDisplay()); mTaskbarContext = taskbarContext; mOverlayController = controllers.taskbarOverlayController; mDragController = new TaskbarDragController(this); mDragController.init(controllers); mDragLayer = new TaskbarOverlayDragLayer(this); mStashedTaskbarHeight = controllers.taskbarStashController.getStashedHeight(); - updateBlurStyle(); mUiController = controllers.uiController; onViewCreated(); @@ -128,20 +125,6 @@ public class TaskbarOverlayContext extends BaseTaskbarContext { return mDragLayer.findViewById(R.id.apps_view); } - @Override - public boolean isAllAppsBackgroundBlurEnabled() { - return Flags.allAppsBlur() && mOverlayController != null - && mOverlayController.isBackgroundBlurEnabled(); - } - - /** Apply the blur or blur fallback style to the current theme. */ - private void updateBlurStyle() { - if (!Flags.allAppsBlur()) { - return; - } - getTheme().applyStyle(getAllAppsBlurStyleResId(), true); - } - @Override public View.OnClickListener getItemOnClickListener() { return mTaskbarContext.getItemOnClickListener(); @@ -183,11 +166,6 @@ public class TaskbarOverlayContext extends BaseTaskbarContext { return mTaskbarContext.isInDesktopMode(); } - @Override - public boolean isTaskbarShowingDesktopTasks() { - return mTaskbarContext.isTaskbarShowingDesktopTasks(); - } - @Override public boolean showLockedTaskbarOnHome() { return mTaskbarContext.showLockedTaskbarOnHome(); @@ -199,18 +177,8 @@ public class TaskbarOverlayContext extends BaseTaskbarContext { } @Override - public Point getScreenSize() { - return mTaskbarContext.getScreenSize(); - } - - @Override - public int getDisplayHeight() { - return mTaskbarContext.getDisplayHeight(); - } - - @Override - public void notifyConfigChanged() { - mTaskbarContext.notifyConfigChanged(); + public boolean isPrimaryDisplay() { + return mTaskbarContext.isPrimaryDisplay(); } @Override diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java index 4905287356..178fe9d6b6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java +++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java @@ -15,11 +15,9 @@ */ package com.android.launcher3.taskbar.overlay; -import static android.os.Trace.TRACE_TAG_APP; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_CONSUME_IME_INSETS; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; -import static android.window.DesktopModeFlags.ENABLE_TASKBAR_OVERFLOW; import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE; @@ -28,12 +26,8 @@ import static com.android.launcher3.LauncherState.ALL_APPS; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.PixelFormat; -import android.gui.EarlyWakeupInfo; -import android.os.Binder; -import android.os.Trace; import android.util.Log; import android.view.AttachedSurfaceControl; -import android.view.CrossWindowBlurListeners; import android.view.Gravity; import android.view.MotionEvent; import android.view.SurfaceControl; @@ -104,10 +98,6 @@ public final class TaskbarOverlayController { private TaskbarControllers mControllers; // Initialized in init. // True if we have alerted surface flinger of an expensive call for blur. private boolean mInEarlyWakeUp; - /** - * Token for early wakeup requests to SurfaceFlinger. - */ - private EarlyWakeupInfo mEarlyWakeupInfo = new EarlyWakeupInfo(); public TaskbarOverlayController( TaskbarActivityContext taskbarContext, DeviceProfile launcherDeviceProfile) { @@ -118,8 +108,6 @@ public final class TaskbarOverlayController { mLauncherDeviceProfile = launcherDeviceProfile; mMaxBlurRadius = mTaskbarContext.getResources().getDimensionPixelSize( R.dimen.max_depth_blur_radius_enhanced); - mEarlyWakeupInfo.token = new Binder(); - mEarlyWakeupInfo.trace = TaskbarOverlayController.class.getName(); } /** Initialize the controller. */ @@ -133,7 +121,7 @@ public final class TaskbarOverlayController { */ public TaskbarOverlayContext requestWindow() { if (mOverlayContext == null) { - mOverlayContext = TaskbarOverlayContextFactory.newInstance(mWindowContext).create( + mOverlayContext = new TaskbarOverlayContext( mWindowContext, mTaskbarContext, mControllers); } @@ -189,7 +177,7 @@ public final class TaskbarOverlayController { return mLauncherDeviceProfile; } - /** Updates {@link deviceprofile} instance for Taskbar's overlay window. */ + /** Updates {@link DeviceProfile} instance for Taskbar's overlay window. */ public void updateLauncherDeviceProfile(DeviceProfile dp) { mLauncherDeviceProfile = dp; Optional.ofNullable(mOverlayContext).ifPresent(c -> { @@ -239,11 +227,6 @@ public final class TaskbarOverlayController { radius = 0; // intentionally falling through in case a non-0 blur was previously set. } - if (!CrossWindowBlurListeners.getInstance().isCrossWindowBlurEnabled()) { - Log.d(TAG, "setBackgroundBlurRadius: disabled, setting to 0"); - radius = 0; - // intentionally falling through in case a non-0 blur was previously set. - } if (mOverlayContext == null) { Log.w(TAG, "setBackgroundBlurRadius: no overlay context"); return; @@ -269,42 +252,31 @@ public final class TaskbarOverlayController { return; } Log.v(TAG, "setBackgroundBlurRadius: " + radius); - final SurfaceControl.Transaction transaction = + SurfaceControl.Transaction transaction = new SurfaceControl.Transaction().setBackgroundBlurRadius(surfaceControl, radius); - try (transaction) { - // Set early wake-up flags when we know we're executing an expensive operation, this way - // SurfaceFlinger will adjust its internal offsets to avoid jank. - boolean wantsEarlyWakeUp = radius > 0 && radius < mMaxBlurRadius; - if (wantsEarlyWakeUp && !mInEarlyWakeUp) { - Log.d(TAG, "setBackgroundBlurRadius: setting early wakeup with token " - + mEarlyWakeupInfo); - Trace.instantForTrack(TRACE_TAG_APP, TAG, "notifyRendererForGpuLoadUp"); - dragLayerViewRoot.notifyRendererForGpuLoadUp("setBackgroundBlurRadius"); - try { - transaction.setEarlyWakeupStart(mEarlyWakeupInfo); - } catch (NoSuchMethodError e) { - // LC-Ignored: wtf? - } - mInEarlyWakeUp = true; - } else if (!wantsEarlyWakeUp && mInEarlyWakeUp) { - Log.d(TAG, "setBackgroundBlurRadius: clearing early wakeup with token " - + mEarlyWakeupInfo); - try { - transaction.setEarlyWakeupEnd(mEarlyWakeupInfo); - } catch (NoSuchMethodError e) { - // LC-Ignored: wtf? - } - mInEarlyWakeUp = false; + // Set early wake-up flags when we know we're executing an expensive operation, this way + // SurfaceFlinger will adjust its internal offsets to avoid jank. + boolean wantsEarlyWakeUp = radius > 0 && radius < mMaxBlurRadius; + if (wantsEarlyWakeUp && !mInEarlyWakeUp) { + Log.d(TAG, "setBackgroundBlurRadius: setting early wakeup"); + try { + transaction.setEarlyWakeupStart(); + } catch (NoSuchMethodError e) { + // LC-Ignored: wtf? } - - rootSurfaceControl.applyTransactionOnDraw(transaction); + mInEarlyWakeUp = true; + } else if (!wantsEarlyWakeUp && mInEarlyWakeUp) { + Log.d(TAG, "setBackgroundBlurRadius: clearing early wakeup"); + try { + transaction.setEarlyWakeupEnd(); + } catch (NoSuchMethodError e) { + // LC-Ignored: wtf? + } + mInEarlyWakeUp = false; } - } - boolean isBackgroundBlurEnabled() { - return BlurUtils.supportsBlursOnWindows() - && CrossWindowBlurListeners.getInstance().isCrossWindowBlurEnabled(); + rootSurfaceControl.applyTransactionOnDraw(transaction); } /** @@ -328,7 +300,7 @@ public final class TaskbarOverlayController { @Override protected void handleClose(boolean animate) { if (!mIsOpen) return; - if (ENABLE_TASKBAR_OVERFLOW.isTrue()) { + if (Flags.taskbarOverflow()) { // Mark the view closed before attempting to remove it, so the drag layer does not // schedule another call to close. Needed for taskbar overflow in case the KQS // view shown for taskbar overflow needs to be reshown - delayed close call would diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayDragLayer.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayDragLayer.java index 9ecffdc6b3..41694ecee5 100644 --- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayDragLayer.java +++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayDragLayer.java @@ -71,7 +71,6 @@ public class TaskbarOverlayDragLayer extends @Override public void recreateControllers() { - super.recreateControllers(); List controllers = new ArrayList<>(); controllers.add(mContainer.getDragController()); controllers.addAll(mTouchControllers); diff --git a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java index eec0009437..966ae8bff6 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java +++ b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java @@ -39,11 +39,14 @@ import android.util.AttributeSet; import android.util.FloatProperty; import android.util.Log; import android.util.Property; +import android.view.LayoutInflater; +import android.view.ViewGroup; import androidx.core.graphics.ColorUtils; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Flags; +import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.anim.AnimatorListeners; @@ -91,7 +94,7 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView { private final Paint mIconRingPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final Path mRingPath = new Path(); private final int mNormalizedIconSize; - private Path mShapePath; + private final Path mShapePath; private final Matrix mTmpMatrix = new Matrix(); private final BlurMaskFilter mShadowFilter; @@ -278,6 +281,16 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView { invalidate(); } + /** + * prepares prediction icon for usage after bind + */ + public void finishBinding(OnLongClickListener longClickListener) { + setOnLongClickListener(longClickListener); + ((CellLayoutLayoutParams) getLayoutParams()).canReorder = false; + setTextVisibility(false); + verifyHighRes(); + } + @Override public void getIconBounds(Rect outBounds) { super.getIconBounds(outBounds); @@ -326,9 +339,6 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView { } private void updateRingPath() { - mShapePath = ThemeManager.INSTANCE.get(mContext) - .getIconShape() - .getPath(mNormalizedIconSize); mRingPath.reset(); mTmpMatrix.reset(); mTmpMatrix.setTranslate(getOutlineOffsetX(), getOutlineOffsetY()); @@ -447,6 +457,19 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView { }; } + /** + * Creates and returns a new instance of PredictedAppIcon from WorkspaceItemInfo + */ + public static PredictedAppIcon createIcon(ViewGroup parent, WorkspaceItemInfo info) { + PredictedAppIcon icon = (PredictedAppIcon) LayoutInflater.from(parent.getContext()) + .inflate(R.layout.predicted_app_icon, parent, false); + icon.applyFromWorkspaceItem(info); + Launcher launcher = Launcher.getLauncher(parent.getContext()); + icon.setOnClickListener(launcher.getItemOnClickListener()); + icon.setOnFocusChangeListener(launcher.getFocusHandler()); + return icon; + } + private class AnimColorHolder { public final AnimatedFloat progress = new AnimatedFloat(this::onUpdate, 1); diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 2b67c232be..acec8d6b5a 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -16,7 +16,6 @@ package com.android.launcher3.uioverrides; import static android.app.ActivityTaskManager.INVALID_TASK_ID; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_OPTIMIZE_MEASURE; import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_FOCUSED; import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY; @@ -24,18 +23,15 @@ import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER import static com.android.app.animation.Interpolators.EMPHASIZED; import static com.android.internal.jank.Cuj.CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE; import static com.android.launcher3.Flags.enableExpressiveDismissTaskMotion; -import static com.android.launcher3.Flags.enableOverviewBackgroundWallpaperBlur; import static com.android.launcher3.Flags.enableUnfoldStateAnimation; import static com.android.launcher3.LauncherConstants.SavedInstanceKeys.PENDING_SPLIT_SELECT_INFO; import static com.android.launcher3.LauncherConstants.SavedInstanceKeys.RUNTIME_STATE; import static com.android.launcher3.LauncherSettings.Animation.DEFAULT_NO_ICON; import static com.android.launcher3.LauncherSettings.Animation.VIEW_BACKGROUND; -import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT; import static com.android.launcher3.LauncherState.ALL_APPS; -import static com.android.launcher3.LauncherState.FLAG_SKIP_STATE_ANNOUNCEMENT; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.NO_OFFSET; import static com.android.launcher3.LauncherState.OVERVIEW; @@ -55,7 +51,6 @@ import static com.android.launcher3.popup.SystemShortcut.BUBBLE_SHORTCUT; import static com.android.launcher3.popup.SystemShortcut.DONT_SUGGEST_APP; import static com.android.launcher3.popup.SystemShortcut.INSTALL; import static com.android.launcher3.popup.SystemShortcut.PRIVATE_PROFILE_INSTALL; -import static com.android.launcher3.popup.SystemShortcut.REMOVE; import static com.android.launcher3.popup.SystemShortcut.UNINSTALL_APP; import static com.android.launcher3.popup.SystemShortcut.WIDGETS; import static com.android.launcher3.taskbar.LauncherTaskbarUIController.ALL_APPS_PAGE_PROGRESS_INDEX; @@ -71,7 +66,6 @@ import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.quickstep.util.AnimUtils.completeRunnableListCallback; import static com.android.quickstep.util.SplitAnimationTimings.TABLET_HOME_TO_SPLIT; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY; -import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -87,12 +81,15 @@ import android.graphics.RectF; import android.hardware.display.DisplayManager; import android.media.permission.SafeCloseable; import android.os.Build; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.IRemoteCallback; import android.os.SystemProperties; import android.os.UserHandle; import android.text.TextUtils; import android.util.AttributeSet; +import android.view.Display; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.View; @@ -113,7 +110,6 @@ import com.android.app.viewcapture.ViewCaptureFactory; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Flags; -import com.android.launcher3.GestureNavContract; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherSettings.Favorites; @@ -135,9 +131,9 @@ import com.android.launcher3.hybridhotseat.HotseatPredictionController; import com.android.launcher3.logging.InstanceId; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.logging.StatsLogManager.StatsLogger; +import com.android.launcher3.model.BgDataModel.FixedContainerItems; import com.android.launcher3.model.WellbeingModel; import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.model.data.PredictedContainerInfo; import com.android.launcher3.popup.SystemShortcut; import com.android.launcher3.proxy.ProxyActivityStarter; import com.android.launcher3.statehandlers.DepthController; @@ -167,7 +163,6 @@ import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.ObjectWrapper; -import com.android.launcher3.util.OverviewCommandHelperProtoLogProxy; import com.android.launcher3.util.PendingRequestArgs; import com.android.launcher3.util.PendingSplitSelectInfo; import com.android.launcher3.util.RunnableList; @@ -178,7 +173,6 @@ import com.android.launcher3.util.StableViewInfo; import com.android.launcher3.util.StartActivityParams; import com.android.launcher3.util.TouchController; import com.android.launcher3.views.FloatingIconView; -import com.android.quickstep.LauncherActivityInterface; import com.android.quickstep.OverviewCommandHelper; import com.android.quickstep.OverviewComponentObserver; import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener; @@ -186,8 +180,6 @@ import com.android.quickstep.RecentsModel; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TaskUtils; import com.android.quickstep.TouchInteractionService.TISBinder; -import com.android.quickstep.fallback.window.RecentsWindowFlags; -import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.quickstep.util.AsyncClockEventDelegate; import com.android.quickstep.util.LauncherUnfoldAnimationController; @@ -206,7 +198,6 @@ import com.android.quickstep.views.RecentsViewContainer; import com.android.quickstep.views.TaskView; import com.android.systemui.animation.back.FlingOnBackAnimationCallback; import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.unfold.RemoteUnfoldSharedComponent; import com.android.systemui.unfold.UnfoldTransitionFactory; import com.android.systemui.unfold.UnfoldTransitionProgressProvider; @@ -218,7 +209,6 @@ import com.android.systemui.unfold.updates.RotationChangeProvider; import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper; import com.android.wm.shell.shared.bubbles.BubbleBarLocation; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; -import com.android.wm.shell.shared.desktopmode.DesktopState; import kotlin.Unit; @@ -246,7 +236,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, protected static final String RING_APPEAR_ANIMATION_PREFIX = "RingAppearAnimation\t"; - private PredictedContainerInfo mAllAppsPredictions; + private FixedContainerItems mAllAppsPredictions; private HotseatPredictionController mHotseatPredictionController; private DepthController mDepthController; private QuickstepTransitionManager mAppTransitionManager; @@ -284,8 +274,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, private final OverviewChangeListener mOverviewChangeListener = this::onOverviewTargetChanged; - private boolean mOverviewBlurEnabled; - private final TaskViewRecentsTouchContext mTaskViewRecentsTouchContext = new TaskViewRecentsTouchContext() { @Override @@ -305,16 +293,17 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } }; + public static QuickstepLauncher getLauncher(Context context) { + return fromContext(context); + } + @Override protected void setupViews() { getAppWidgetHolder().setOnViewCreationCallback(new QuickstepInteractionHandler(this)); - mDepthController = new DepthController(this); - mOverviewBlurEnabled = isOverviewBackgroundBlurEnabled(); - getTheme().applyStyle(getOverviewBlurStyleResId(), true); super.setupViews(); mActionsView = findViewById(R.id.overview_actions_view); - RecentsView overviewPanel = getOverviewPanel(); + RecentsView overviewPanel = getOverviewPanel(); SystemUiProxy systemUiProxy = SystemUiProxy.INSTANCE.get(this); mSplitSelectStateController = new SplitSelectStateController(this, getStateManager(), @@ -342,7 +331,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } mTISBindHelper = new TISBindHelper(this, this::onTISConnected); - + mDepthController = new DepthController(this); if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(this)) { mSplitSelectStateController.initSplitFromDesktopController(this); } @@ -371,16 +360,16 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, if (mAllAppsPredictions != null && (info.itemType == ITEM_TYPE_APPLICATION || info.itemType == ITEM_TYPE_DEEP_SHORTCUT)) { - List items = mAllAppsPredictions.getContents(); - int count = items.size(); + int count = mAllAppsPredictions.items.size(); for (int i = 0; i < count; i++) { - ItemInfo targetInfo = items.get(i); + ItemInfo targetInfo = mAllAppsPredictions.items.get(i); if (targetInfo.itemType == info.itemType && targetInfo.user.equals(info.user) && Objects.equals(targetInfo.getIntent(), info.getIntent())) { logger.withRank(i); break; } + } } logger.log(LAUNCHER_APP_LAUNCH_TAP); @@ -430,19 +419,31 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, @Override public RunnableList startActivitySafely(View v, Intent intent, ItemInfo item) { + // Only pause is taskbar controller is not present until the transition (if it exists) ends + mHotseatPredictionController.setPauseUIUpdate(getTaskbarUIController() == null); PredictionRowView predictionRowView = getAppsView().getFloatingHeaderView().findFixedRowByType(PredictionRowView.class); // Pause the prediction row updates until the transition (if it exists) ends. predictionRowView.setPredictionUiUpdatePaused(true); RunnableList result = super.startActivitySafely(v, intent, item); if (result == null) { + mHotseatPredictionController.setPauseUIUpdate(false); predictionRowView.setPredictionUiUpdatePaused(false); } else { - result.add(() -> predictionRowView.setPredictionUiUpdatePaused(false)); + result.add(() -> { + mHotseatPredictionController.setPauseUIUpdate(false); + predictionRowView.setPredictionUiUpdatePaused(false); + }); } return result; } + @Override + public void startBinding() { + super.startBinding(); + mHotseatPredictionController.verifyUIUpdateNotPaused(); + } + @Override protected void onActivityFlagsChanged(int changeBits) { if ((changeBits & ACTIVITY_STATE_STARTED) != 0) { @@ -468,31 +469,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, super.showAllAppsFromIntent(alreadyOnHome); } - @Override - public boolean isAllAppsBackgroundBlurEnabled() { - return mDepthController != null && mDepthController.isCrossWindowBlursEnabled() - && Flags.allAppsBlur(); - } - - @Override - public boolean isOverviewBackgroundBlurEnabled() { - return mDepthController != null && mDepthController.isCrossWindowBlursEnabled() - && enableOverviewBackgroundWallpaperBlur(); - } - - /** Apply the blur or blur fallback style to the current theme. */ - public void updateBlurStyle() { - if (enableOverviewBackgroundWallpaperBlur()) { - if (isOverviewBackgroundBlurEnabled() != mOverviewBlurEnabled) { - mWallpaperThemeManager.recreateToUpdateTheme(); - } - } else if (Flags.allAppsBlur()) { - // For all apps, we only need to update the scrim, which draws the panel. But if the - // activity was recreated above, this is unnecessary. - getAppsView().invalidateHeader(); - } - } - protected void onItemClicked(View view) { if (!mSplitToWorkspaceController.handleSecondAppSelectionForSplit(view)) { super.getItemOnClickListener().onClick(view); @@ -505,7 +481,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } @Override - public Stream getSupportedShortcuts(int container) { + public Stream getSupportedShortcuts() { // Order matters as it affects order of appearance in popup container List shortcuts = new ArrayList(Arrays.asList( APP_INFO, WellbeingModel.SHORTCUT_FACTORY, mHotseatPredictionController)); @@ -513,15 +489,12 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, shortcuts.addAll(getSplitShortcuts()); shortcuts.add(WIDGETS); shortcuts.add(INSTALL); - if (Flags.enableLongPressRemoveShortcut() - && (container == CONTAINER_HOTSEAT || container == CONTAINER_DESKTOP - || /* Folder */ container > 0)) { - shortcuts.add(REMOVE); - } - shortcuts.add(DONT_SUGGEST_APP); if (Flags.enablePrivateSpaceInstallShortcut()) { shortcuts.add(PRIVATE_PROFILE_INSTALL); } + if (Flags.enableShortcutDontSuggestApp()) { + shortcuts.add(DONT_SUGGEST_APP); + } if (Flags.enablePrivateSpace()) { shortcuts.add(UNINSTALL_APP); } @@ -532,7 +505,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } private List> getSplitShortcuts() { - if (!mDeviceProfile.getDeviceProperties().isTablet() || mSplitSelectStateController.isSplitSelectActive()) { + if (!mDeviceProfile.isTablet || mSplitSelectStateController.isSplitSelectActive()) { return Collections.emptyList(); } RecentsView recentsView = getOverviewPanel(); @@ -574,20 +547,17 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } @Override - public void bindPredictedContainerInfo(PredictedContainerInfo info) { - super.bindPredictedContainerInfo(info); - switch (info.id) { - case Favorites.CONTAINER_ALL_APPS_PREDICTION: - mAllAppsPredictions = info; - getAppsView().getFloatingHeaderView().findFixedRowByType( - PredictionRowView.class).setPredictedApps(info.getContents()); - break; - case Favorites.CONTAINER_HOTSEAT_PREDICTION: - mHotseatPredictionController.setPredictedItems(info); - break; - case Favorites.CONTAINER_WIDGETS_PREDICTION: - getWidgetPickerDataProvider().setWidgetRecommendations(info.getContents()); - break; + public void bindExtraContainerItems(FixedContainerItems item) { + if (item.containerId == Favorites.CONTAINER_PREDICTION) { + mAllAppsPredictions = item; + PredictionRowView predictionRowView = + getAppsView().getFloatingHeaderView().findFixedRowByType( + PredictionRowView.class); + predictionRowView.setPredictedApps(item.items); + } else if (item.containerId == Favorites.CONTAINER_HOTSEAT_PREDICTION) { + mHotseatPredictionController.setPredictedItems(item); + } else if (item.containerId == Favorites.CONTAINER_WIDGETS_PREDICTION) { + getWidgetPickerDataProvider().setWidgetRecommendations(item.items); } } @@ -689,15 +659,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } } - @Override - protected void setTitle(@NonNull LauncherState state) { - if (state.hasFlag(FLAG_SKIP_STATE_ANNOUNCEMENT)) { - // Prevent accessibility title update announcement - getWindow().getAttributes().accessibilityTitle = getString(state.getTitle()); - } - super.setTitle(state); - } - @Override public TouchController[] createTouchControllers() { NavigationMode mode = DisplayController.getNavigationMode(this); @@ -732,9 +693,8 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, break; } - if (!getDeviceProfile().getDeviceProperties().isMultiWindowMode()) { - list.add(new StatusBarTouchController( - this, () -> this.isInState(LauncherState.NORMAL))); + if (!getDeviceProfile().isMultiWindowMode) { + list.add(new StatusBarTouchController(this)); } if (enableExpressiveDismissTaskMotion()) { @@ -914,26 +874,11 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, @Override protected void onNewIntent(Intent intent) { - boolean intentHasGnc = GestureNavContract.canBuildFromIntent(intent); super.onNewIntent(intent); OverviewCommandHelper overviewCommandHelper = mTISBindHelper.getOverviewCommandHelper(); if (overviewCommandHelper != null) { overviewCommandHelper.clearPendingCommands(); } - if (RecentsWindowFlags.getEnableOverviewInWindow() && !intentHasGnc) { - RecentsWindowManager defaultRecentsWindowManager = - RecentsWindowManager.REPOSITORY_INSTANCE.get(this).get(DEFAULT_DISPLAY); - if (defaultRecentsWindowManager != null) { - defaultRecentsWindowManager.cleanupRecentsWindow(); - } - } - } - - @Override - protected void logOnNewIntent(boolean alreadyOnHome, boolean shouldMoveToDefaultScreen, - String action, boolean internalStateHandled) { - OverviewCommandHelperProtoLogProxy.logOnNewIntent(alreadyOnHome, shouldMoveToDefaultScreen, - action, internalStateHandled); } public QuickstepTransitionManager getAppTransitionManager() { @@ -952,9 +897,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, @Override protected void handleGestureContract(Intent intent) { - if (GestureNavContract.isContractEnabled(intent) - && (FeatureFlags.SEPARATE_RECENTS_ACTIVITY.get() - || RecentsWindowFlags.getEnableOverviewInWindow())) { + if (FeatureFlags.SEPARATE_RECENTS_ACTIVITY.get()) { super.handleGestureContract(intent); } } @@ -984,8 +927,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, onTaskbarInAppDisplayProgressUpdate(progress, WIDGETS_PAGE_PROGRESS_INDEX); if (mEnableWidgetDepth) { getDepthController().widgetDepth.setValue(Utilities.mapToRange( - progress, 0f, 1f, 0f, - getDeviceProfile().getBottomSheetProfile().getBottomSheetDepth(), EMPHASIZED)); + progress, 0f, 1f, 0f, getDeviceProfile().bottomSheetDepth, EMPHASIZED)); } } @@ -1029,7 +971,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, mActiveOnBackAnimationCallback.onBackStarted(backEvent); } - @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) @Override public void onBackInvokedCompat() { // Recreate mActiveOnBackAnimationCallback if necessary to avoid NPE @@ -1332,7 +1273,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } activityOptions.options.setLaunchDisplayId( (v != null && v.getDisplay() != null) ? v.getDisplay().getDisplayId() - : DEFAULT_DISPLAY); + : Display.DEFAULT_DISPLAY); Utilities.allowBGLaunch(activityOptions.options); return activityOptions; } @@ -1353,8 +1294,8 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, @Override @BinderThread - public void enterStageSplitFromRunningApp(boolean leftOrTop, int displayId) { - mSplitWithKeyboardShortcutController.enterStageSplit(leftOrTop, displayId); + public void enterStageSplitFromRunningApp(boolean leftOrTop) { + mSplitWithKeyboardShortcutController.enterStageSplit(leftOrTop); } @Override @@ -1443,11 +1384,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, .isInDesktopModeAndNotInOverview(getDisplayId()); } - @Override - public boolean shouldShowHomeBehindDesktop() { - return DesktopState.fromContext(this).getShouldShowHomeBehindDesktop(); - } - @Override public void dispatchDeviceProfileChanged() { super.dispatchDeviceProfileChanged(); @@ -1470,9 +1406,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT, /* callback= */ success -> mSplitSelectStateController.resetState(), /* freezeTaskList= */ false, - splitTask.getSplitBounds() == null - ? SNAP_TO_2_50_50 - : splitTask.getSplitBounds().snapPosition, + splitTask.getSplitBounds().snapPosition, remoteTransition); } @@ -1629,20 +1563,4 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, public void returnToHomescreen() { getStateManager().goToState(LauncherState.NORMAL); } - - @Override - public int getOverviewBlurStyleResId() { - return isOverviewBackgroundBlurEnabled() ? R.style.OverviewBlurStyle - : R.style.OverviewBlurFallbackStyle; - } - - @Override - public LauncherActivityInterface getContainerInterface() { - return LauncherActivityInterface.INSTANCE; - } - - @Override - public SplitSelectStateController getSplitSelectStateController() { - return mSplitSelectStateController; - } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java index 846c850a18..0d5ff2b67e 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java @@ -20,7 +20,6 @@ import static com.android.launcher3.uioverrides.QuickstepAppWidgetHostProvider.g import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.widget.ListenableAppWidgetHost.getWidgetHolderExecutor; -import android.appwidget.AppWidgetEvent; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; @@ -45,8 +44,6 @@ import dagger.assisted.AssistedInject; import java.util.Collections; import java.util.Set; import java.util.WeakHashMap; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import java.util.function.BiConsumer; /** @@ -60,10 +57,6 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder { AppWidgetHostView::updateAppWidget; private static final UpdateKey KEY_VIEW_DATA_CHANGED = AppWidgetHostView::onViewDataChanged; - private static final UpdateKey KEY_COLLECT_WIDGET_EVENT = - (view, event) -> { - event.merge(view.collectWidgetEvent()); - }; private static final SparseArray sListeners = new SparseArray<>(); @@ -273,25 +266,6 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder { executeOnMainExecutor(KEY_VIEW_DATA_CHANGED, viewId); } - @Nullable - @Override - public AppWidgetEvent collectWidgetEvent() { - if (!android.appwidget.flags.Flags.engagementMetrics()) return null; - - CompletableFuture future = new CompletableFuture<>(); - MAIN_EXECUTOR.execute(() -> { - AppWidgetEvent.Builder event = new AppWidgetEvent.Builder(); - mListeningHolders.forEach(holder -> - holder.onWidgetUpdate(mWidgetId, KEY_COLLECT_WIDGET_EVENT, event)); - future.complete(event.isEmpty() ? null : event.build()); - }); - try { - return future.get(); - } catch (InterruptedException | ExecutionException e) { - return null; - } - } - private void executeOnMainExecutor(UpdateKey key, T data) { MAIN_EXECUTOR.execute(() -> mListeningHolders.forEach(holder -> holder.onWidgetUpdate(mWidgetId, key, data))); diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt index 927d94c2f6..c9f791c6ee 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt +++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt @@ -21,6 +21,7 @@ import com.android.app.animation.Interpolators.FINAL_FRAME import com.android.app.animation.Interpolators.INSTANT import com.android.app.animation.Interpolators.LINEAR import com.android.launcher3.Flags.enableDesktopExplodedView +import com.android.launcher3.Flags.enableGridOnlyOverview import com.android.launcher3.Flags.enableLargeDesktopWindowingTile import com.android.launcher3.LauncherState import com.android.launcher3.anim.AnimatedFloat @@ -36,7 +37,6 @@ import com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE import com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_X import com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_Y import com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW -import com.android.launcher3.util.OverviewReleaseFlags.enableGridOnlyOverview import com.android.quickstep.util.AnimUtils import com.android.quickstep.views.AddDesktopButton import com.android.quickstep.views.ClearAllButton @@ -246,10 +246,7 @@ class RecentsViewStateController(private val launcher: QuickstepLauncher) : launcher.deviceProfile, ) - val timings = - AnimUtils.getDeviceOverviewToSplitTimings( - launcher.deviceProfile.getDeviceProperties().isTablet - ) + val timings = AnimUtils.getDeviceOverviewToSplitTimings(launcher.deviceProfile.isTablet) if (!goingToOverviewFromWorkspaceContextual) { // This animation is already done for the contextual case, don't redo it recentsView.createSplitSelectInitAnimation( diff --git a/quickstep/src/com/android/launcher3/uioverrides/SystemApiWrapper.kt b/quickstep/src/com/android/launcher3/uioverrides/SystemApiWrapper.kt index abe0e23432..f8e873a851 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/SystemApiWrapper.kt +++ b/quickstep/src/com/android/launcher3/uioverrides/SystemApiWrapper.kt @@ -23,11 +23,10 @@ import android.content.IIntentReceiver import android.content.IIntentSender import android.content.Intent import android.content.pm.ActivityInfo +import android.content.pm.ApplicationInfo import android.content.pm.LauncherActivityInfo import android.content.pm.LauncherApps import android.content.pm.ShortcutInfo -import android.graphics.Bitmap -import android.graphics.Rect import android.os.Build import android.os.Bundle import android.os.Flags.allowPrivateProfile @@ -35,26 +34,23 @@ import android.os.IBinder import android.os.UserHandle import android.os.UserManager import android.util.ArrayMap -import android.view.SurfaceControlViewHost import android.widget.Toast import android.window.RemoteTransition -import android.window.ScreenCapture -import com.android.launcher3.BaseActivity import androidx.annotation.RequiresApi import com.android.launcher3.Flags.enablePrivateSpace +import com.android.launcher3.Flags.enablePrivateSpaceInstallShortcut +import com.android.launcher3.Flags.privateSpaceAppInstallerButton import com.android.launcher3.Flags.privateSpaceSysAppsSeparation import com.android.launcher3.R import com.android.launcher3.Utilities import com.android.launcher3.dagger.ApplicationContext import com.android.launcher3.dagger.LauncherAppSingleton import com.android.launcher3.proxy.ProxyActivityStarter -import com.android.launcher3.uioverrides.touchcontrollers.StatusBarTouchController import com.android.launcher3.util.ApiWrapper import com.android.launcher3.util.Executors import com.android.launcher3.util.StartActivityParams import com.android.launcher3.util.UserIconInfo import com.android.quickstep.util.FadeOutRemoteTransition -import java.util.function.Supplier import javax.inject.Inject import app.lawnchair.LawnchairApp @@ -127,7 +123,10 @@ open class SystemApiWrapper @Inject constructor(@ApplicationContext context: Con override fun getAppMarketActivityIntent(packageName: String, user: UserHandle): Intent { return try { - if (allowPrivateProfile() && enablePrivateSpace()) + if ( + enablePrivateSpace() && + (privateSpaceAppInstallerButton() || enablePrivateSpaceInstallShortcut()) + ) ProxyActivityStarter.getLaunchIntent( mContext, StartActivityParams(null as PendingIntent?, 0).apply { @@ -153,7 +152,7 @@ open class SystemApiWrapper @Inject constructor(@ApplicationContext context: Con /** Returns an intent which can be used to open Private Space Settings. */ override fun getPrivateSpaceSettingsIntent(): Intent? { return try { - if (allowPrivateProfile() && enablePrivateSpace()) + if (enablePrivateSpace()) ProxyActivityStarter.getLaunchIntent( mContext, StartActivityParams(null as PendingIntent?, 0).apply { @@ -242,24 +241,11 @@ open class SystemApiWrapper @Inject constructor(@ApplicationContext context: Con } } - override fun createStatusBarTouchController( - launcher: BaseActivity, - isEnabledCheck: Supplier, - ): StatusBarTouchController? { - return StatusBarTouchController(launcher, isEnabledCheck) - } + override fun getApplicationInfoHash(appInfo: ApplicationInfo): String = + (appInfo.sourceDir?.hashCode() ?: 0).toString() + " " + appInfo.longVersionCode + + override fun getRoundIconRes(appInfo: ApplicationInfo) = appInfo.roundIconRes override fun isFileDrawable(shortcutInfo: ShortcutInfo) = shortcutInfo.hasIconFile() || shortcutInfo.hasIconUri() - - override fun captureSnapshot(host: SurfaceControlViewHost, width: Int, height: Int): Bitmap = - ScreenCapture.captureLayers( - ScreenCapture.LayerCaptureArgs.Builder(host.surfacePackage!!.surfaceControl) - .setSourceCrop(Rect(0, 0, width, height)) - .setAllowProtected(true) - .setHintForSeamlessTransition(true) - .build() - ) - .asBitmap() - .copy(Bitmap.Config.ARGB_8888, true) } diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java b/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java index e2a624d4ca..8a44f76c70 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java @@ -20,7 +20,6 @@ import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_ALLAPPS; import android.content.Context; -import android.graphics.Color; import com.android.internal.jank.Cuj; import com.android.launcher3.DeviceProfile; @@ -30,7 +29,6 @@ import com.android.launcher3.LauncherState; import com.android.launcher3.R; import com.android.launcher3.util.Themes; import com.android.launcher3.views.ActivityContext; -import com.android.launcher3.views.ScrimColors; import com.android.quickstep.util.BaseDepthController; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; @@ -139,7 +137,7 @@ public class AllAppsState extends LauncherState { protected float getDepthUnchecked(DEVICE_PROFILE_CONTEXT context) { if (context.getDeviceProfile().shouldShowAllAppsOnSheet()) { - return context.getDeviceProfile().getBottomSheetProfile().getBottomSheetDepth(); + return context.getDeviceProfile().bottomSheetDepth; } else { // The scrim fades in at approximately 50% of the swipe gesture. if (enableScalingRevealHomeAnimation()) { @@ -153,11 +151,6 @@ public class AllAppsState extends LauncherState { } } - @Override - public boolean shouldBlurWorkspace(LauncherState targetState) { - return targetState == ALL_APPS || targetState == NORMAL; - } - @Override public PageAlphaProvider getWorkspacePageAlphaProvider(Launcher launcher) { PageAlphaProvider superPageAlphaProvider = super.getWorkspacePageAlphaProvider(launcher); @@ -181,7 +174,8 @@ public class AllAppsState extends LauncherState { } private static boolean isWorkspaceVisible(DeviceProfile deviceProfile) { - return deviceProfile.getDeviceProperties().isTablet() || (Flags.allAppsSheetForHandheld() && Flags.allAppsBlur()); + // Currently we hide the workspace with the all apps blur flag for simplicity. + return deviceProfile.isTablet && !Flags.allAppsBlur(); } @Override @@ -204,24 +198,26 @@ public class AllAppsState extends LauncherState { @Override public boolean shouldFloatingSearchBarUsePillWhenUnfocused(Launcher launcher) { DeviceProfile dp = launcher.getDeviceProfile(); - return dp.getDeviceProperties().isPhone() && !dp.getDeviceProperties().isLandscape(); + return dp.isPhone && !dp.isLandscape; } @Override - public ScrimColors getWorkspaceScrimColor(Launcher launcher) { - int backgroundColor; + public LauncherState getHistoryForState(LauncherState previousState) { + return previousState == BACKGROUND_APP ? QUICK_SWITCH_FROM_HOME + : previousState == OVERVIEW ? OVERVIEW : NORMAL; + } + + @Override + public int getWorkspaceScrimColor(Launcher launcher) { if (!launcher.getDeviceProfile().shouldShowAllAppsOnSheet()) { - // Lawnchair-TODO-Colour: LawnchairUtilsKt.getAllAppsScrimColor(launcher) + materialColorSurfaceDim - // Always use an opaque scrim if there's no sheet. - backgroundColor = launcher.getResources().getColor(R.color.materialColorSurfaceDim); - } else if (!Flags.allAppsBlur()) { - // Lawnchair-TODO-Colour: LawnchairUtilsKt.getAllAppsScrimColor(launcher) + widgets_picker_scrim - // If there's a sheet but no blur, use the old scrim color. - backgroundColor = launcher.getResources().getColor(R.color.widgets_picker_scrim); - } else { // Lawnchair-TODO-Colour: LawnchairUtilsKt.getAllAppsScrimColor(launcher) + allAppsScrimColor - backgroundColor = Themes.getAttrColor(launcher, R.attr.allAppsScrimColor); + return Themes.getAttrColor(launcher, R.attr.allAppsScrimColor); } - return new ScrimColors(backgroundColor, /* foregroundColor */ Color.TRANSPARENT); + if (Flags.allAppsBlur()) { + // Lawnchair-TODO-Colour: LawnchairUtilsKt.getAllAppsScrimColor(launcher) + allAppsScrimColorOverBlur + return Themes.getAttrColor(launcher, R.attr.allAppsScrimColorOverBlur); + } + // Lawnchair-TODO-Colour: LawnchairUtilsKt.getAllAppsScrimColor(launcher) + widgets_picker_scrim + return launcher.getResources().getColor(R.color.widgets_picker_scrim); } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java b/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java index 508643afd7..a5b1ee7b53 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.uioverrides.states; +import static com.android.launcher3.Flags.enableDesktopWindowingCarouselDetach; import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKGROUND; @@ -24,7 +25,6 @@ import android.graphics.Color; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.allapps.AllAppsTransitionController; -import com.android.launcher3.views.ScrimColors; import com.android.quickstep.util.BaseDepthController; import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.views.RecentsView; @@ -35,8 +35,7 @@ import com.android.quickstep.views.RecentsView; public class BackgroundAppState extends OverviewState { private static final int STATE_FLAGS = FLAG_DISABLE_RESTORE | FLAG_RECENTS_VIEW_VISIBLE - | FLAG_WORKSPACE_INACCESSIBLE | FLAG_NON_INTERACTIVE | FLAG_CLOSE_POPUPS - | FLAG_SKIP_STATE_ANNOUNCEMENT; + | FLAG_WORKSPACE_INACCESSIBLE | FLAG_NON_INTERACTIVE | FLAG_CLOSE_POPUPS; public BackgroundAppState(int id) { this(id, LAUNCHER_STATE_BACKGROUND); @@ -56,7 +55,7 @@ public class BackgroundAppState extends OverviewState { launcher, launcher.getDeviceProfile(), recentsView.getPagedOrientationHandler(), - recentsView.getContainerInterface()); + recentsView.getSizeStrategy()); AllAppsTransitionController controller = launcher.getAllAppsController(); float scrollRange = Math.max(controller.getShiftRange(), 1); float progressDelta = (transitionLength / scrollRange); @@ -92,6 +91,11 @@ public class BackgroundAppState extends OverviewState { return true; } + @Override + public boolean detachDesktopCarousel() { + return enableDesktopWindowingCarouselDetach(); + } + @Override public boolean showExplodedDesktopView() { return false; @@ -110,10 +114,8 @@ public class BackgroundAppState extends OverviewState { } @Override - public ScrimColors getWorkspaceScrimColor(Launcher launcher) { - return new ScrimColors( - /* backgroundColor= */ Color.TRANSPARENT, - /* foregroundColor= */ Color.TRANSPARENT); + public int getWorkspaceScrimColor(Launcher launcher) { + return Color.TRANSPARENT; } @Override diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java index 7348fb2eda..ae82f82c01 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java @@ -15,7 +15,7 @@ */ package com.android.launcher3.uioverrides.states; -import static com.android.launcher3.util.OverviewReleaseFlags.enableGridOnlyOverview; +import static com.android.launcher3.Flags.enableGridOnlyOverview; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW; import android.graphics.Rect; diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java index 3cc9431cef..fe8ab36fe2 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java @@ -17,6 +17,7 @@ package com.android.launcher3.uioverrides.states; import static com.android.app.animation.Interpolators.DECELERATE_2; import static com.android.launcher3.Flags.enableDesktopExplodedView; +import static com.android.launcher3.Flags.enableOverviewBackgroundWallpaperBlur; import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW; @@ -24,8 +25,6 @@ import android.content.Context; import android.graphics.Rect; import android.os.SystemProperties; -import androidx.core.graphics.ColorUtils; - import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; @@ -33,11 +32,11 @@ import com.android.launcher3.R; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.Themes; import com.android.launcher3.views.ActivityContext; -import com.android.launcher3.views.ScrimColors; import com.android.quickstep.util.BaseDepthController; import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; +import com.android.systemui.shared.system.BlurUtils; import app.lawnchair.preferences.PreferenceManager; import app.lawnchair.theme.color.tokens.ColorTokens; @@ -88,7 +87,7 @@ public class OverviewState extends LauncherState { recentsView.getTaskSize(sTempRect); float scale; DeviceProfile deviceProfile = launcher.getDeviceProfile(); - if (deviceProfile.getDeviceProperties().isTwoPanels()) { + if (deviceProfile.isTwoPanels) { // In two panel layout, width does not include both panels or space between them, so // use height instead. We do not use height for handheld, as cell layout can be // shorter than a task and we want the workspace to scale down to task size. @@ -123,9 +122,9 @@ public class OverviewState extends LauncherState { int elements = CLEAR_ALL_BUTTON | OVERVIEW_ACTIONS | ADD_DESK_BUTTON; DeviceProfile dp = launcher.getDeviceProfile(); boolean showFloatingSearch; - if (dp.getDeviceProperties().isPhone()) { + if (dp.isPhone) { // Only show search in phone overview in portrait mode. - showFloatingSearch = !dp.getDeviceProperties().isLandscape(); + showFloatingSearch = !dp.isLandscape; } else { // Only show search in tablet overview if taskbar is not visible. showFloatingSearch = !dp.isTaskbarPresent || isTaskbarStashed(launcher); @@ -157,7 +156,7 @@ public class OverviewState extends LauncherState { @Override public boolean shouldFloatingSearchBarUsePillWhenUnfocused(Launcher launcher) { DeviceProfile dp = launcher.getDeviceProfile(); - return dp.getDeviceProperties().isPhone() && !dp.getDeviceProperties().isLandscape(); + return dp.isPhone && !dp.isLandscape; } @Override @@ -166,19 +165,22 @@ public class OverviewState extends LauncherState { } @Override - public ScrimColors getWorkspaceScrimColor(Launcher launcher) { + public int getWorkspaceScrimColor(Launcher launcher) { // Lawnchair-TODO-Colour: LawnchairUtilsKt.getAllAppsScrimColor(launcher) + allAppsScrimColorOverBlur // Lawnchair-TODO-Colour: LawnchairUtilsKt.getAllAppsScrimColor(launcher) + allAppsScrimColor - return new ScrimColors( - /* backgroundColor */ Themes.getAttrColor(launcher, R.attr.overviewScrimColor), - /* foregroundColor */ ColorUtils.compositeColors( - Themes.getAttrColor(launcher, R.attr.overviewScrimForegroundPrimary), - Themes.getAttrColor(launcher, R.attr.overviewScrimForegroundSecondary))); + return enableOverviewBackgroundWallpaperBlur() && BlurUtils.supportsBlursOnWindows() + ? Themes.getAttrColor(launcher, R.attr.overviewScrimColorOverBlur) + : Themes.getAttrColor(launcher, R.attr.overviewScrimColor); } @Override public boolean displayOverviewTasksAsGrid(DeviceProfile deviceProfile) { - return deviceProfile.getDeviceProperties().isTablet(); + return deviceProfile.isTablet; + } + + @Override + public boolean detachDesktopCarousel() { + return false; } @Override @@ -228,7 +230,7 @@ public class OverviewState extends LauncherState { public void onBackInvoked(Launcher launcher) { RecentsView recentsView = launcher.getOverviewPanel(); TaskView taskView = recentsView.getRunningTaskView(); - if (taskView != null && !taskView.isBeingDismissed()) { + if (taskView != null) { if (recentsView.isTaskViewFullyVisible(taskView)) { taskView.launchWithAnimation(); } else { diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/QuickSwitchState.java b/quickstep/src/com/android/launcher3/uioverrides/states/QuickSwitchState.java index 4058b55637..dfad4096bc 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/QuickSwitchState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/QuickSwitchState.java @@ -17,7 +17,12 @@ package com.android.launcher3.uioverrides.states; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKGROUND; +import android.graphics.Color; + +import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; +import com.android.launcher3.R; +import com.android.launcher3.util.Themes; /** * State to indicate we are about to launch a recent task. Note that this state is only used when @@ -38,6 +43,19 @@ public class QuickSwitchState extends BackgroundAppState { return new ScaleAndTranslation(0.9f, 0, translationY); } + @Override + public int getWorkspaceScrimColor(Launcher launcher) { + if (launcher.areDesktopTasksVisible()) { + // No scrim while desktop tasks are visible + return Color.TRANSPARENT; + } + DeviceProfile dp = launcher.getDeviceProfile(); + if (dp.isTaskbarPresentInApps) { + return launcher.getColor(R.color.taskbar_background); + } + return Themes.getAttrColor(launcher, R.attr.overviewScrimColor); + } + @Override public float getVerticalProgress(Launcher launcher) { // Don't move all apps shelf while quick-switching (just let it fade). @@ -58,9 +76,4 @@ public class QuickSwitchState extends BackgroundAppState { public boolean isTaskbarAlignedWithHotseat(Launcher launcher) { return false; } - - @Override - public boolean detachDesktopCarousel() { - return true; - } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java index 3a6de197ac..44f8bf1e07 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java @@ -220,7 +220,7 @@ public class QuickstepAtomicAnimationFactory extends } else if (fromState == NORMAL && toState == ALL_APPS) { AllAppsSwipeController.applyNormalToAllAppsAnimConfig(mContainer, config); } else if (fromState == OVERVIEW && toState == OVERVIEW_SPLIT_SELECT) { - SplitAnimationTimings timings = mContainer.getDeviceProfile().getDeviceProperties().isTablet() + SplitAnimationTimings timings = mContainer.getDeviceProfile().isTablet ? SplitAnimationTimings.TABLET_OVERVIEW_TO_SPLIT : SplitAnimationTimings.PHONE_OVERVIEW_TO_SPLIT; config.setInterpolator(ANIM_OVERVIEW_ACTIONS_FADE, clampToProgress(LINEAR, diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java b/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java index c2ec17ab3f..2631fbf0b6 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java @@ -43,7 +43,7 @@ public class SplitScreenSelectState extends OverviewState { @Override public int getTransitionDuration(ActivityContext context, boolean isToState) { - if (isToState && context.getDeviceProfile().getDeviceProperties().isTablet()) { + if (isToState && context.getDeviceProfile().isTablet) { return SplitAnimationTimings.TABLET_ENTER_DURATION; } else if (isToState) { return SplitAnimationTimings.PHONE_ENTER_DURATION; diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java index dce158f63f..a4f8b8135c 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java @@ -28,7 +28,6 @@ import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_HOME_GESTURE; import static com.android.launcher3.util.NavigationMode.THREE_BUTTONS; -import static com.android.launcher3.util.ScrollableLayoutManager.PREDICTIVE_BACK_MIN_SCALE; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import android.animation.AnimatorSet; @@ -45,6 +44,7 @@ import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.compat.AccessibilityManagerCompat; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.touch.SingleAxisSwipeDetector; import com.android.launcher3.util.DisplayController; @@ -136,7 +136,7 @@ public class NavBarToHomeTouchController implements TouchController, } private float getShiftRange() { - return mLauncher.getDeviceProfile().getDeviceProperties().getHeightPx(); + return mLauncher.getDeviceProfile().heightPx; } @Override @@ -157,16 +157,10 @@ public class NavBarToHomeTouchController implements TouchController, AbstractFloatingView.closeOpenContainer(mLauncher, AbstractFloatingView.TYPE_TASK_MENU); } else if (mStartState == ALL_APPS) { AllAppsTransitionController allAppsController = mLauncher.getAllAppsController(); - if (mLauncher.getDeviceProfile().shouldShowAllAppsOnSheet()) { - allAppsController.setShouldScaleHeader(true); - builder.addAnimatedFloat(allAppsController.getAllAppScale(), 1f, - PREDICTIVE_BACK_MIN_SCALE, PULLBACK_INTERPOLATOR); - } else { - builder.setFloat(allAppsController, ALL_APPS_PULL_BACK_TRANSLATION, - -mPullbackDistance, PULLBACK_INTERPOLATOR); - builder.setFloat(allAppsController, ALL_APPS_PULL_BACK_ALPHA, - 0.5f, PULLBACK_INTERPOLATOR); - } + builder.setFloat(allAppsController, ALL_APPS_PULL_BACK_TRANSLATION, + -mPullbackDistance, PULLBACK_INTERPOLATOR); + builder.setFloat(allAppsController, ALL_APPS_PULL_BACK_ALPHA, + 0.5f, PULLBACK_INTERPOLATOR); } AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(mLauncher); if (topView != null) { diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java index 8d907f4183..ff726e65d4 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java @@ -17,7 +17,7 @@ package com.android.launcher3.uioverrides.touchcontrollers; import static com.android.app.animation.Interpolators.ACCELERATE_DECELERATE; -import static com.android.launcher3.LauncherAnimUtils.SCRIM_COLORS; +import static com.android.launcher3.LauncherAnimUtils.VIEW_BACKGROUND_COLOR; import static com.android.launcher3.LauncherAnimUtils.newSingleUseCancelListener; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.HINT_STATE; @@ -47,7 +47,6 @@ import com.android.launcher3.taskbar.LauncherTaskbarUIController; import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.VibratorWrapper; -import com.android.launcher3.views.ScrimColorsEvaluator; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.util.AnimatorControllerWithResistance; import com.android.quickstep.util.MotionPauseDetector; @@ -63,8 +62,6 @@ import java.util.function.BiConsumer; * first home screen instead of to Overview. */ public class NoButtonNavbarToOverviewTouchController extends PortraitStatesTouchController { - - public static final String TAG = "NoButtonNavbarToOverviewTouchController"; private static final float ONE_HANDED_ACTIVATED_SLOP_MULTIPLIER = 2.5f; // How much of the movement to use for translating overview after swipe and hold. @@ -87,7 +84,7 @@ public class NoButtonNavbarToOverviewTouchController extends PortraitStatesTouch private AnimatorPlaybackController mOverviewResistYAnim; // Normal to Hint animation has flag SKIP_OVERVIEW, so we update this scrim with this animator. - private ValueAnimator mNormalToHintOverviewScrimAnimator; + private ObjectAnimator mNormalToHintOverviewScrimAnimator; private final QuickstepLauncher mLauncher; private boolean mIsTrackpadSwipe; @@ -137,7 +134,7 @@ public class NoButtonNavbarToOverviewTouchController extends PortraitStatesTouch float progressMultiplier = super.initCurrentAnimation(); if (mToState == HINT_STATE) { // Track the drag across the entire height of the screen. - progressMultiplier = -1f / mLauncher.getDeviceProfile().getDeviceProperties().getHeightPx(); + progressMultiplier = -1f / mLauncher.getDeviceProfile().heightPx; } return progressMultiplier; } @@ -164,10 +161,9 @@ public class NoButtonNavbarToOverviewTouchController extends PortraitStatesTouch } if (mFromState == NORMAL && mToState == HINT_STATE) { - mNormalToHintOverviewScrimAnimator = ObjectAnimator.ofObject( + mNormalToHintOverviewScrimAnimator = ObjectAnimator.ofArgb( mLauncher.getScrimView(), - SCRIM_COLORS, - ScrimColorsEvaluator.INSTANCE, + VIEW_BACKGROUND_COLOR, mFromState.getWorkspaceScrimColor(mLauncher), mToState.getWorkspaceScrimColor(mLauncher)); } @@ -176,11 +172,6 @@ public class NoButtonNavbarToOverviewTouchController extends PortraitStatesTouch mOverviewResistYAnim = null; } - @Override - public String dump() { - return TAG; - } - @Override protected void updateProgress(float fraction) { super.updateProgress(fraction); diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java index 416c8ab4fd..58b274a47c 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java @@ -51,7 +51,6 @@ import static com.android.launcher3.util.VibratorWrapper.OVERVIEW_HAPTIC; import static com.android.launcher3.util.window.RefreshRateTracker.getSingleFrameMs; import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET; import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA; -import static com.android.quickstep.views.RecentsView.DESKTOP_CAROUSEL_DETACH_PROGRESS; import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS; import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY; import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION; @@ -130,13 +129,13 @@ public class NoButtonQuickSwitchTouchController implements TouchController, mLauncher = launcher; mSwipeDetector = new BothAxesSwipeDetector(mLauncher, this); mRecentsView = mLauncher.getOverviewPanel(); - mXRange = mLauncher.getDeviceProfile().getDeviceProperties().getWidthPx() / 2f; + mXRange = mLauncher.getDeviceProfile().widthPx / 2f; mYRange = LayoutUtils.getShelfTrackingDistance( mLauncher, mLauncher.getDeviceProfile(), mRecentsView.getPagedOrientationHandler(), - mRecentsView.getContainerInterface()); - mMaxYProgress = mLauncher.getDeviceProfile().getDeviceProperties().getHeightPx() / mYRange; + mRecentsView.getSizeStrategy()); + mMaxYProgress = mLauncher.getDeviceProfile().heightPx / mYRange; mMotionPauseDetector = new MotionPauseDetector(mLauncher); mMotionPauseMinDisplacement = mLauncher.getResources().getDimension( R.dimen.motion_pause_detector_min_displacement_from_app); @@ -261,8 +260,6 @@ public class NoButtonQuickSwitchTouchController implements TouchController, RECENTS_SCALE_PROPERTY.set(mRecentsView, fromState.getOverviewScaleAndOffset(mLauncher)[0]); ADJACENT_PAGE_HORIZONTAL_OFFSET.set(mRecentsView, 1f); TASK_THUMBNAIL_SPLASH_ALPHA.set(mRecentsView, fromState.showTaskThumbnailSplash() ? 1f : 0); - DESKTOP_CAROUSEL_DETACH_PROGRESS.set(mRecentsView, - fromState.detachDesktopCarousel() ? 1f : 0); mRecentsView.setContentAlpha(1); mRecentsView.setFullscreenProgress(fromState.getOverviewFullscreenProgress()); mLauncher.getActionsView().getVisibilityAlpha().updateValue( @@ -278,9 +275,8 @@ public class NoButtonQuickSwitchTouchController implements TouchController, xAnim.setFloat(mRecentsView, ADJACENT_PAGE_HORIZONTAL_OFFSET, scaleAndOffset[1], LINEAR); // Use QuickSwitchState instead of OverviewState to determine scrim color, // since we need to take potential taskbar into account. - xAnim.setScrimColors(mLauncher.getScrimView(), - QUICK_SWITCH_FROM_HOME.getWorkspaceScrimColor(mLauncher), - LINEAR); + xAnim.setViewBackgroundColor(mLauncher.getScrimView(), + QUICK_SWITCH_FROM_HOME.getWorkspaceScrimColor(mLauncher), LINEAR); if (!mRecentsView.hasTaskViews()) { xAnim.addFloat(mRecentsView, CONTENT_ALPHA, 0f, 1f, LINEAR); } diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java index 22055821fa..a74b350a64 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java @@ -26,7 +26,6 @@ import android.view.MotionEvent; import com.android.app.animation.Interpolators; import com.android.internal.jank.Cuj; import com.android.launcher3.DeviceProfile; -import com.android.launcher3.Flags; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.allapps.AllAppsTransitionController; @@ -34,7 +33,6 @@ import com.android.launcher3.states.StateAnimationConfig; import com.android.launcher3.touch.AbstractStateChangeTouchController; import com.android.launcher3.touch.AllAppsSwipeController; import com.android.launcher3.touch.SingleAxisSwipeDetector; -import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.uioverrides.states.OverviewState; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.util.LayoutUtils; @@ -149,7 +147,7 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr mLauncher, mLauncher.getDeviceProfile(), recentsView.getPagedOrientationHandler(), - recentsView.getContainerInterface()); + recentsView.getSizeStrategy()); } else { mCurrentAnimation = mLauncher.getStateManager() .createAnimationToNewWorkspace(mToState, config); @@ -218,11 +216,6 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr @Override protected void onReinitToState(LauncherState newToState) { super.onReinitToState(newToState); - if (Flags.allAppsBlur() && mLauncher.isAllAppsBackgroundBlurEnabled() - && newToState == ALL_APPS) { - // About to start blurring during swipe to All Apps; prepare the renderer. - ((QuickstepLauncher) mLauncher).getDepthController().setEarlyWakeup(true); - } if (newToState != ALL_APPS) { InteractionJankMonitorWrapper.cancel(Cuj.CUJ_LAUNCHER_OPEN_ALL_APPS); } diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java index 14896e53c7..f582324f23 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java @@ -161,6 +161,6 @@ public class QuickSwitchTouchController extends AbstractStateChangeTouchControll @Override protected float getShiftRange() { - return mLauncher.getDeviceProfile().getDeviceProperties().getWidthPx() / 2f; + return mLauncher.getDeviceProfile().widthPx / 2f; } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java index 9d501ed116..16647a90b7 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java @@ -24,25 +24,24 @@ import static android.view.MotionEvent.ACTION_UP; import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY; import static com.android.launcher3.MotionEventsUtils.isTrackpadScroll; -import static com.android.launcher3.Utilities.shouldEnableMouseInteractionChanges; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SWIPE_DOWN_WORKSPACE_NOTISHADE_OPEN; import android.graphics.PointF; import android.util.SparseArray; -import android.view.InputDevice; import android.view.MotionEvent; import android.view.ViewConfiguration; import android.view.Window; import android.view.WindowManager; import com.android.launcher3.AbstractFloatingView; -import com.android.launcher3.BaseActivity; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherState; import com.android.launcher3.Utilities; import com.android.launcher3.util.TouchController; import com.android.quickstep.SystemUiProxy; -import java.util.function.Supplier; +import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException; import app.lawnchair.LawnchairAppKt; @@ -57,30 +56,29 @@ public class StatusBarTouchController implements TouchController { private static final String TAG = "StatusBarController"; - private final BaseActivity mLauncher; + private final Launcher mLauncher; private final SystemUiProxy mSystemUiProxy; private final float mTouchSlop; private int mLastAction; private final SparseArray mDownEvents; - private final Supplier mIsEnabledCheck; /* If {@code false}, this controller should not handle the input {@link MotionEvent}.*/ private boolean mCanIntercept; - public StatusBarTouchController(BaseActivity l, Supplier isEnabledCheck) { + public StatusBarTouchController(Launcher l) { mLauncher = l; mSystemUiProxy = SystemUiProxy.INSTANCE.get(mLauncher); // Guard against TAPs by increasing the touch slop. mTouchSlop = 2 * ViewConfiguration.get(l).getScaledTouchSlop(); mDownEvents = new SparseArray<>(); - mIsEnabledCheck = isEnabledCheck; } @Override - public String dump() { - return "mCanIntercept:" + mCanIntercept - + " , mLastAction:" + MotionEvent.actionToString(mLastAction) - + " , mSysUiProxy available:" + SystemUiProxy.INSTANCE.get(mLauncher).isActive(); + public void dump(String prefix, PrintWriter writer) { + writer.println(prefix + "mCanIntercept:" + mCanIntercept); + writer.println(prefix + "mLastAction:" + MotionEvent.actionToString(mLastAction)); + writer.println(prefix + "mSysUiProxy available:" + + SystemUiProxy.INSTANCE.get(mLauncher).isActive()); } private void dispatchTouchEvent(MotionEvent ev) { @@ -167,11 +165,9 @@ public class StatusBarTouchController implements TouchController { } private boolean canInterceptTouch(MotionEvent ev) { - if (isTrackpadScroll(ev) || !mIsEnabledCheck.get() + if (isTrackpadScroll(ev) || !mLauncher.isInState(LauncherState.NORMAL) || AbstractFloatingView.getTopOpenViewWithType(mLauncher, - AbstractFloatingView.TYPE_STATUS_BAR_SWIPE_DOWN_DISALLOW) != null || ( - shouldEnableMouseInteractionChanges(mLauncher.asContext()) - && ev.getSource() == InputDevice.SOURCE_MOUSE)) { + AbstractFloatingView.TYPE_STATUS_BAR_SWIPE_DOWN_DISALLOW) != null) { return false; } else { // For NORMAL state, only listen if the event originated above the navbar height diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt index a85f706f69..06e6734a37 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt @@ -28,41 +28,23 @@ import com.android.launcher3.Utilities.boundToRange import com.android.launcher3.Utilities.debugLog import com.android.launcher3.Utilities.isRtl import com.android.launcher3.Utilities.mapToRange -import com.android.launcher3.statemanager.BaseState -import com.android.launcher3.statemanager.StateManager.StateListener -import com.android.launcher3.statemanager.StatefulContainer import com.android.launcher3.touch.SingleAxisSwipeDetector import com.android.launcher3.util.MSDLPlayerWrapper import com.android.launcher3.util.TouchController -import com.android.mechanics.spec.Breakpoint -import com.android.mechanics.spec.Breakpoint.Companion.maxLimit -import com.android.mechanics.spec.Breakpoint.Companion.minLimit -import com.android.mechanics.spec.BreakpointKey -import com.android.mechanics.spec.DirectionalMotionSpec -import com.android.mechanics.spec.Guarantee -import com.android.mechanics.spec.InputDirection -import com.android.mechanics.spec.Mapping -import com.android.mechanics.spec.MotionSpec -import com.android.mechanics.spring.SpringParameters -import com.android.mechanics.view.DistanceGestureContext -import com.android.mechanics.view.ViewMotionValue -import com.android.quickstep.views.RecentsDismissUtils import com.android.quickstep.views.RecentsView import com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY import com.android.quickstep.views.RecentsViewContainer import com.android.quickstep.views.TaskView import com.google.android.msdl.data.model.MSDLToken import kotlin.math.abs -import kotlin.math.ceil /** Touch controller for handling task view card dismiss swipes */ -class TaskViewDismissTouchController>( +class TaskViewDismissTouchController( private val container: CONTAINER, private val taskViewRecentsTouchContext: TaskViewRecentsTouchContext, ) : TouchController, SingleAxisSwipeDetector.Listener where CONTAINER : Context, -CONTAINER : RecentsViewContainer, -CONTAINER : StatefulContainer { +CONTAINER : RecentsViewContainer { private val recentsView: RecentsView<*, *> = container.getOverviewPanel() private val detector: SingleAxisSwipeDetector = SingleAxisSwipeDetector( @@ -72,37 +54,17 @@ CONTAINER : StatefulContainer { ) private val isRtl = isRtl(container.resources) private val upDirection: Int = recentsView.pagedOrientationHandler.getUpDirection(isRtl) - private val maxUndershoot = - container.resources.getDimension(R.dimen.task_dismiss_max_undershoot) - private val detachThreshold = - container.resources.getDimension(R.dimen.task_dismiss_detach_threshold) - private val stateListener = - object : StateListener { - override fun onStateTransitionStart(toState: T) { - springAnimation?.cancel() - clearState() - } - } + private val tempTaskThumbnailBounds = Rect() private var taskBeingDragged: TaskView? = null - private var taskDragDisplacementValue: ViewMotionValue? = null - private var springAnimation: RecentsDismissUtils.SpringSet? = null + private var springAnimation: SpringAnimation? = null private var dismissLength: Int = 0 private var verticalFactor: Int = 0 private var hasDismissThresholdHapticRun = false private var initialDisplacement: Float = 0f private var recentsScaleAnimation: SpringAnimation? = null - private var canInterceptTouch = false - private var isDismissing = false - - init { - container.getStateManager().addStateListener(stateListener) - } - - override fun onTouchControllerDestroyed() { - container.getStateManager().removeStateListener(stateListener) - } + private var isBlockedDuringDismissal = false private fun canInterceptTouch(ev: MotionEvent): Boolean = when { @@ -128,12 +90,6 @@ CONTAINER : StatefulContainer { false } - // Do not allow dismiss while recents is scrolling. - !recentsView.scroller.isFinished -> { - debugLog(TAG, "Not intercepting touch, recents scrolling.") - false - } - else -> taskViewRecentsTouchContext.isRecentsInteractive.also { isRecentsInteractive -> if (!isRecentsInteractive) { @@ -143,22 +99,15 @@ CONTAINER : StatefulContainer { } override fun onControllerInterceptTouchEvent(ev: MotionEvent): Boolean { - // On consecutive events, end animation early so user can dismiss next task. - springAnimation?.speedUpSpringsToEnd() - if ((ev.action == MotionEvent.ACTION_UP || ev.action == MotionEvent.ACTION_CANCEL)) { clearState() } if (ev.action == MotionEvent.ACTION_DOWN) { - canInterceptTouch = onActionDown(ev) - if (!canInterceptTouch) { + if (!onActionDown(ev)) { return false } } - // Ignore other actions if touch intercepting has not been enabled in an ACTION_DOWN event. - if (!canInterceptTouch) { - return false - } + onControllerTouchEvent(ev) val upDirectionIsPositive = upDirection == SingleAxisSwipeDetector.DIRECTION_POSITIVE val wasInitialTouchUp = @@ -170,87 +119,42 @@ CONTAINER : StatefulContainer { override fun onControllerTouchEvent(ev: MotionEvent?): Boolean = detector.onTouchEvent(ev) private fun onActionDown(ev: MotionEvent): Boolean { + springAnimation?.cancel() + recentsScaleAnimation?.cancel() if (!canInterceptTouch(ev)) { return false } taskBeingDragged = - recentsView.taskViews.firstOrNull { - recentsView.isTaskViewVisible(it) && container.dragLayer.isEventOverView(it, ev) - } - // If event is not over a taskView, check if it would have been either over the - // currently dismissing task being dragged, or over where the next task will be. - ?: recentsView.taskViews.firstOrNull { taskView -> - if (!recentsView.isTaskViewVisible(taskView)) return@firstOrNull false - container.dragLayer.getDescendantRectRelativeToSelf( - taskView, - tempTaskThumbnailBounds, - ) - if (taskView == taskBeingDragged && !isDismissing) { - val secondaryTranslation = - -taskView.secondaryDismissTranslationProperty.get(taskView).toInt() - recentsView.pagedOrientationHandler.extendRectForSecondaryTranslation( - tempTaskThumbnailBounds, - secondaryTranslation, - ) - } else { - val primaryTranslation = - recentsView.taskViewsDismissPrimaryTranslations[taskView] ?: 0 - recentsView.pagedOrientationHandler.extendRectForPrimaryTranslation( - tempTaskThumbnailBounds, - primaryTranslation, - ) - } - tempTaskThumbnailBounds.contains(ev.x.toInt(), ev.y.toInt()) + recentsView.taskViews + .firstOrNull { + recentsView.isTaskViewVisible(it) && container.dragLayer.isEventOverView(it, ev) + } + ?.also { + val secondaryLayerDimension = + recentsView.pagedOrientationHandler.getSecondaryDimension( + container.dragLayer + ) + // Dismiss length as bottom of task so it is fully off screen when dismissed. + it.getThumbnailBounds(tempTaskThumbnailBounds, relativeToDragLayer = true) + dismissLength = + recentsView.pagedOrientationHandler.getTaskDismissLength( + secondaryLayerDimension, + tempTaskThumbnailBounds, + ) + verticalFactor = + recentsView.pagedOrientationHandler.getTaskDismissVerticalDirection() } - - if (taskBeingDragged == null) { - debugLog(TAG, "Not intercepting touch, null dragged task.") - return false - } - val secondaryLayerDimension = - recentsView.pagedOrientationHandler.getSecondaryDimension(container.dragLayer) - // Dismiss length as bottom of task so it is fully off screen when dismissed. - // Take into account the recents scale when fully zoomed out on dismiss. - taskBeingDragged?.getThumbnailBounds(tempTaskThumbnailBounds, relativeToDragLayer = true) - dismissLength = - ceil( - recentsView.pagedOrientationHandler.getTaskDismissLength( - secondaryLayerDimension, - tempTaskThumbnailBounds, - ) / RECENTS_SCALE_ON_DISMISS_SUCCESS - ) - .toInt() - verticalFactor = recentsView.pagedOrientationHandler.getTaskDismissVerticalDirection() - taskBeingDragged?.isBeingDraggedForDismissal = true - detector.setDetectableScrollConditions(upDirection, /* ignoreSlop= */ false) return true } override fun onDragStart(start: Boolean, startDisplacement: Float) { + if (isBlockedDuringDismissal) return val taskBeingDragged = taskBeingDragged ?: return debugLog(TAG, "Handling touch event.") initialDisplacement = taskBeingDragged.secondaryDismissTranslationProperty.get(taskBeingDragged) - taskDragDisplacementValue = - generateMotionValue( - initialDisplacement, - detachThreshold * verticalFactor, - container.asContext(), - ) { currentDisplacement -> - taskBeingDragged.secondaryDismissTranslationProperty.setValue( - taskBeingDragged, - currentDisplacement, - ) - if (taskBeingDragged.isRunningTask && recentsView.enableDrawingLiveTile) { - recentsView.runActionOnRemoteHandles { remoteTargetHandle -> - remoteTargetHandle.taskViewSimulator.taskSecondaryTranslation.value = - currentDisplacement - } - recentsView.redrawLiveTile() - } - } // Add a tiny bit of translation Z, so that it draws on top of other views. This is relevant // (e.g.) when we dismiss a task by sliding it upward: if there is a row of icons above, we @@ -259,26 +163,36 @@ CONTAINER : StatefulContainer { } override fun onDrag(displacement: Float): Boolean { - taskBeingDragged ?: return false + if (isBlockedDuringDismissal) return true + val taskBeingDragged = taskBeingDragged ?: return false val currentDisplacement = displacement + initialDisplacement val boundedDisplacement = boundToRange(abs(currentDisplacement), 0f, dismissLength.toFloat()) // When swiping below origin, allow slight undershoot to simulate resisting the movement. - val isAboveOrigin = - recentsView.pagedOrientationHandler.isGoingUp(currentDisplacement, isRtl) val totalDisplacement = - if (isAboveOrigin) boundedDisplacement * verticalFactor + if (recentsView.pagedOrientationHandler.isGoingUp(currentDisplacement, isRtl)) + boundedDisplacement * verticalFactor else mapToRange( boundedDisplacement, 0f, dismissLength.toFloat(), 0f, - maxUndershoot, + container.resources.getDimension(R.dimen.task_dismiss_max_undershoot), DECELERATE, ) * -verticalFactor + taskBeingDragged.secondaryDismissTranslationProperty.setValue( + taskBeingDragged, + totalDisplacement, + ) + if (taskBeingDragged.isRunningTask && recentsView.enableDrawingLiveTile) { + recentsView.runActionOnRemoteHandles { remoteTargetHandle -> + remoteTargetHandle.taskViewSimulator.taskSecondaryTranslation.value = + totalDisplacement + } + recentsView.redrawLiveTile() + } val dismissFraction = displacement / (dismissLength * verticalFactor).toFloat() - taskDragDisplacementValue?.input = totalDisplacement RECENTS_SCALE_PROPERTY.setValue(recentsView, getRecentsScale(dismissFraction)) playDismissThresholdHaptic(displacement) return true @@ -305,9 +219,8 @@ CONTAINER : StatefulContainer { } override fun onDragEnd(velocity: Float) { + if (isBlockedDuringDismissal) return val taskBeingDragged = taskBeingDragged ?: return - taskDragDisplacementValue?.dispose() - taskBeingDragged.isBeingDraggedForDismissal = false val currentDisplacement = taskBeingDragged.secondaryDismissTranslationProperty.get(taskBeingDragged) @@ -316,23 +229,23 @@ CONTAINER : StatefulContainer { val velocityIsGoingUp = recentsView.pagedOrientationHandler.isGoingUp(velocity, isRtl) val isFlingingTowardsDismiss = detector.isFling(velocity) && velocityIsGoingUp val isFlingingTowardsRestState = detector.isFling(velocity) && !velocityIsGoingUp - isDismissing = + val isDismissing = isFlingingTowardsDismiss || (isBeyondDismissThreshold && !isFlingingTowardsRestState) - val dismissThreshold = (DISMISS_THRESHOLD_FRACTION * dismissLength * verticalFactor).toInt() - val finalPosition = if (isDismissing) (dismissLength * verticalFactor).toFloat() else 0f springAnimation = - recentsView.runTaskDismissSettlingSpringAnimation( - taskBeingDragged, - isDismissing, - RecentsDismissUtils.DismissedTaskData( - startVelocity = velocity, - dismissLength = dismissLength, - finalPosition = finalPosition, - dismissThreshold = dismissThreshold, - ), - /* shouldRemoveTaskView= */ isDismissing, - /* isSplitSelection= */ false, - ) + recentsView + .createTaskDismissSettlingSpringAnimation( + taskBeingDragged, + velocity, + isDismissing, + dismissLength, + this::clearState, + ) + .apply { + animateToFinalPosition( + if (isDismissing) (dismissLength * verticalFactor).toFloat() else 0f + ) + } + isBlockedDuringDismissal = true recentsScaleAnimation = recentsView.animateRecentsScale(RECENTS_SCALE_DEFAULT).addEndListener { _, _, _, _ -> recentsScaleAnimation = null @@ -342,11 +255,10 @@ CONTAINER : StatefulContainer { private fun clearState() { detector.finishedScrolling() detector.setDetectableScrollConditions(0, false) - taskBeingDragged?.resetViewTransforms() + taskBeingDragged?.translationZ = 0f taskBeingDragged = null springAnimation = null - taskDragDisplacementValue = null - isDismissing = false + isBlockedDuringDismissal = false } private fun getRecentsScale(dismissFraction: Float): Float { @@ -388,43 +300,6 @@ CONTAINER : StatefulContainer { } } - private fun generateMotionValue( - initialDisplacement: Float, - detachThreshold: Float, - context: Context, - updateCallback: (Float) -> Unit, - ): ViewMotionValue { - val direction = if (initialDisplacement < 0) InputDirection.Max else InputDirection.Min - val distanceGestureContext = - DistanceGestureContext.create(context, initialDisplacement, direction) - val viewMotionValue = - ViewMotionValue( - initialDisplacement, - distanceGestureContext, - generateMotionSpec(detachThreshold), - label = "taskDismiss::displacement", - ) - - viewMotionValue.addUpdateCallback { motionValue -> updateCallback(motionValue.output) } - return viewMotionValue - } - - /** Motion spec for an initial magnetic detach. Track linearly otherwise. No reattach. */ - private fun generateMotionSpec(detachThreshold: Float): MotionSpec { - val spring = SpringParameters(stiffness = 800f, dampingRatio = 0.95f) - val detachKey = BreakpointKey("TaskDismiss::Detach") - val breakpoints = mutableListOf() - val mappings = mutableListOf() - - breakpoints.add(minLimit) - mappings.add(Mapping.Identity) - breakpoints.add(Breakpoint(detachKey, detachThreshold, spring, Guarantee.None)) - mappings.add(Mapping.Linear(MAGNETIC_DETACH_INTERPOLATION_FRACTION)) - breakpoints.add(maxLimit) - - return MotionSpec(DirectionalMotionSpec(breakpoints, mappings)) - } - companion object { private const val TAG = "TaskViewDismissTouchController" @@ -437,7 +312,5 @@ CONTAINER : StatefulContainer { private const val RECENTS_SCALE_FIRST_THRESHOLD_FRACTION = 0.2f private const val RECENTS_SCALE_DISMISS_THRESHOLD_FRACTION = 0.5f private const val RECENTS_SCALE_SECOND_THRESHOLD_FRACTION = 0.575f - - private const val MAGNETIC_DETACH_INTERPOLATION_FRACTION = 0.35f } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewLaunchTouchController.kt b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewLaunchTouchController.kt index 6225c47835..fe9cae55f9 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewLaunchTouchController.kt +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewLaunchTouchController.kt @@ -60,7 +60,6 @@ CONTAINER : RecentsViewContainer { private var launchEndDisplacement: Float = 0f private var playbackController: AnimatorPlaybackController? = null private var verticalFactor: Int = 0 - private var canInterceptTouch = false private fun canTaskLaunchTaskView(taskView: TaskView?) = taskView != null && @@ -93,12 +92,6 @@ CONTAINER : RecentsViewContainer { false } - // Do not allow launch while recents is scrolling. - !recentsView.scroller.isFinished -> { - debugLog(TAG, "Not intercepting touch, recents scrolling.") - false - } - else -> taskViewRecentsTouchContext.isRecentsInteractive.also { isRecentsInteractive -> if (!isRecentsInteractive) { @@ -115,16 +108,11 @@ CONTAINER : RecentsViewContainer { clearState() } if (ev.action == MotionEvent.ACTION_DOWN) { - canInterceptTouch = onActionDown(ev) - if (!canInterceptTouch) { + if (!onActionDown(ev)) { clearState() return false } } - // Ignore other actions if touch intercepting has not been enabled in an ACTION_DOWN event. - if (!canInterceptTouch) { - return false - } onControllerTouchEvent(ev) val downDirectionIsNegative = downDirection == SingleAxisSwipeDetector.DIRECTION_NEGATIVE val wasInitialTouchDown = diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java index d9b0366a40..c9d68a5e37 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java @@ -246,7 +246,7 @@ public class TaskViewTouchControllerDeprecated< pa = new PendingAnimation(maxDuration); mRecentsView.createTaskDismissAnimation(pa, mTaskBeingDragged, true /* animateTaskView */, true /* removeTask */, maxDuration, - false /* dismissingForSplitSelection*/, null /* gridEndData */); + false /* dismissingForSplitSelection*/, false /* isExpressiveDismiss */); mEndDisplacement = -secondaryTaskDimension; } else { diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TransposedQuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TransposedQuickSwitchTouchController.java index e7d2cd23c6..b70cabe76d 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TransposedQuickSwitchTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TransposedQuickSwitchTouchController.java @@ -39,6 +39,6 @@ public class TransposedQuickSwitchTouchController extends QuickSwitchTouchContro @Override protected float getShiftRange() { - return mLauncher.getDeviceProfile().getDeviceProperties().getHeightPx() / 2f; + return mLauncher.getDeviceProfile().heightPx / 2f; } } diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index aa81afb759..d9b90f5c73 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -16,7 +16,6 @@ package com.android.quickstep; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; -import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; @@ -31,6 +30,7 @@ import static com.android.launcher3.BaseActivity.EVENT_DESTROYED; import static com.android.launcher3.BaseActivity.EVENT_STARTED; import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER; import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS; +import static com.android.launcher3.Flags.enableAdditionalHomeAnimations; import static com.android.launcher3.Flags.enableGestureNavHorizontalTouchSlop; import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation; import static com.android.launcher3.Flags.msdlFeedback; @@ -98,7 +98,6 @@ import android.view.ViewTreeObserver.OnScrollChangedListener; import android.view.WindowInsets; import android.view.animation.Interpolator; import android.widget.Toast; -import android.window.DesktopExperienceFlags; import android.window.DesktopModeFlags; import android.window.PictureInPictureSurfaceTransaction; import android.window.TransitionInfo; @@ -137,7 +136,7 @@ import com.android.launcher3.util.VibratorWrapper; import com.android.launcher3.util.WindowBounds; import com.android.quickstep.GestureState.GestureEndTarget; import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle; -import com.android.quickstep.fallback.window.RecentsWindowManager; +import com.android.quickstep.fallback.window.RecentsWindowFlags; import com.android.quickstep.util.ActiveGestureErrorDetector; import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.ActiveGestureProtoLogProxy; @@ -169,10 +168,10 @@ import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; +import com.android.wm.shell.Flags; import com.android.wm.shell.shared.GroupedTaskInfo; import com.android.wm.shell.shared.TransactionPool; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; -import com.android.wm.shell.shared.pip.PipFlags; import com.android.wm.shell.shared.startingsurface.SplashScreenExitAnimationUtils; import com.google.android.msdl.data.model.MSDLToken; @@ -216,7 +215,6 @@ public abstract class AbsSwipeUpHandler< protected @Nullable RECENTS_CONTAINER mContainer; protected @Nullable RECENTS_VIEW mRecentsView; protected Runnable mGestureEndCallback; - protected Runnable mGestureAnimationEndCallback; protected MultiStateCallback mStateCallback; protected boolean mCanceled; private boolean mRecentsViewScrollLinked = false; @@ -349,7 +347,15 @@ public abstract class AbsSwipeUpHandler< private final SwipePipToHomeAnimator[] mSwipePipToHomeAnimators = new SwipePipToHomeAnimator[2]; - private final Runnable mLauncherOnDestroyCallback; + private final Runnable mLauncherOnDestroyCallback = () -> { + ActiveGestureProtoLogProxy.logLauncherDestroyed(); + mRecentsView.removeOnScrollChangedListener(mOnRecentsScrollListener); + mRecentsView = null; + mContainer = null; + mStateCallback.clearState(STATE_LAUNCHER_PRESENT); + mRecentsAnimationStartCallbacks.clear(); + mTaskAnimationManager.onLauncherDestroyed(); + }; // Interpolate RecentsView scale from start of quick switch scroll until this scroll threshold private final float mQuickSwitchScaleScrollThreshold; @@ -374,30 +380,16 @@ public abstract class AbsSwipeUpHandler< private final MSDLPlayerWrapper mMSDLPlayerWrapper; - private final RotationTouchHelper mRotationTouchHelper; - public AbsSwipeUpHandler(Context context, - TaskAnimationManager taskAnimationManager, RecentsAnimationDeviceState deviceState, - RotationTouchHelper rotationTouchHelper, GestureState gestureState, + TaskAnimationManager taskAnimationManager, GestureState gestureState, long touchTimeMs, boolean continuingLastGesture, InputConsumerController inputConsumer, MSDLPlayerWrapper msdlPlayerWrapper) { - super(context, gestureState, rotationTouchHelper); + super(context, gestureState); + mDeviceState = RecentsAnimationDeviceState.INSTANCE.get(mContext); mContainerInterface = gestureState.getContainerInterface(); mContextInitListener = mContainerInterface.createActivityInitListener(this::onActivityInit); - mLauncherOnDestroyCallback = () -> { - ActiveGestureProtoLogProxy.logLauncherDestroyed(); - mContextInitListener.unregister("AbsSwipeUpHandler.mLauncherOnDestroyCallback"); - if (mRecentsView != null) { - mRecentsView.removeOnScrollChangedListener(mOnRecentsScrollListener); - mRecentsView = null; - } - mContainer = null; - mStateCallback.clearState(STATE_LAUNCHER_PRESENT); - mRecentsAnimationStartCallbacks.clear(); - mTaskAnimationManager.onLauncherDestroyed(); - }; mInputConsumerProxy = new InputConsumerProxy(context, /* rotationSupplier = */ () -> { if (mRecentsView == null) { @@ -409,10 +401,8 @@ public abstract class AbsSwipeUpHandler< endLauncherTransitionController(); }, new InputProxyHandlerFactory(mContainerInterface, mGestureState)); mTaskAnimationManager = taskAnimationManager; - mDeviceState = deviceState; mTouchTimeMs = touchTimeMs; mContinuingLastGesture = continuingLastGesture; - mRotationTouchHelper = rotationTouchHelper; Resources res = context.getResources(); mQuickSwitchScaleScrollThreshold = res @@ -598,7 +588,7 @@ public abstract class AbsSwipeUpHandler< private void onLauncherStart() { final RECENTS_CONTAINER container = mContainerInterface.getCreatedContainer(); - if (container == null || mContainer != container || mRecentsView == null) { + if (container == null || mContainer != container) { return; } if (mStateCallback.hasStates(STATE_HANDLER_INVALIDATED)) { @@ -680,9 +670,9 @@ public abstract class AbsSwipeUpHandler< mGestureState.getContainerInterface().setOnDeferredActivityLaunchCallback( mOnDeferredActivityLaunch); - mGestureState.runOnceAtState(STATE_END_TARGET_SET, - () -> mRotationTouchHelper.onEndTargetCalculated(mGestureState.getEndTarget(), - mContainerInterface)); + mGestureState.runOnceAtState(STATE_END_TARGET_SET, () -> + RotationTouchHelper.INSTANCE.get(mContext) + .onEndTargetCalculated(mGestureState.getEndTarget(), mContainerInterface)); notifyGestureStarted(); } @@ -912,8 +902,7 @@ public abstract class AbsSwipeUpHandler< public Intent getLaunchIntent() { // todo differentiate intent based on if we are on home or in app for overview in window - boolean useHomeIntentForWindow = - mContainerInterface.getCreatedContainer() instanceof RecentsWindowManager; + boolean useHomeIntentForWindow = RecentsWindowFlags.getEnableOverviewInWindow(); return useHomeIntentForWindow ? getHomeIntent() : mGestureState.getOverviewIntent(); } /** @@ -973,21 +962,7 @@ public abstract class AbsSwipeUpHandler< public void onRecentsAnimationStart(RecentsAnimationController controller, RecentsAnimationTargets targets, @Nullable TransitionInfo transitionInfo) { super.onRecentsAnimationStart(controller, targets, transitionInfo); - boolean forDesktop; - if (DesktopModeStatus.enableMultipleDesktops(mContext)) { - GroupedTaskInfo groupedTaskInfo; - if (mGestureState.getRunningTask() != null - && (groupedTaskInfo = - mGestureState.getRunningTask().getPlaceholderGroupedTaskInfo( - /* splitTaskIds = */ null)) != null) { - forDesktop = groupedTaskInfo.isBaseType(GroupedTaskInfo.TYPE_DESK); - } else { - forDesktop = false; - } - } else { - forDesktop = targets.hasDesktopTasks(mContext); - } - if (forDesktop) { + if (targets.hasDesktopTasks(mContext)) { mRemoteTargetHandles = mTargetGluer.assignTargetsForDesktop(targets, transitionInfo); } else { int untrimmedAppCount = mRemoteTargetHandles.length; @@ -1018,11 +993,9 @@ public abstract class AbsSwipeUpHandler< .getOrientationState(); DeviceProfile dp = orientationState.getLauncherDeviceProfile( mGestureState.getDisplayId()); - Rect overviewStackBounds = mContainerInterface.getOverviewWindowBounds( - targets.minimizedHomeBounds, primaryTaskTarget); - if (overviewStackBounds != null - && !overviewStackBounds.isEmpty() - && primaryTaskTarget != null) { + if (targets.minimizedHomeBounds != null && primaryTaskTarget != null) { + Rect overviewStackBounds = mContainerInterface + .getOverviewWindowBounds(targets.minimizedHomeBounds, primaryTaskTarget); dp = dp.getMultiWindowProfile(mContext, new WindowBounds(overviewStackBounds, targets.homeContentInsets)); } else { @@ -1031,7 +1004,7 @@ public abstract class AbsSwipeUpHandler< } dp.updateInsets(targets.homeContentInsets); initTransitionEndpoints(dp); - orientationState.setMultiWindowMode(dp.getDeviceProperties().isMultiWindowMode()); + orientationState.setMultiWindowMode(dp.isMultiWindowMode); } // Notify when the animation starts @@ -1073,10 +1046,12 @@ public abstract class AbsSwipeUpHandler< } mHandled = true; - InteractionJankMonitorWrapper.begin( - rv, Cuj.CUJ_LAUNCHER_QUICK_SWITCH, /* timeoutMs= */ 2000); - InteractionJankMonitorWrapper.begin(rv, Cuj.CUJ_LAUNCHER_APP_CLOSE_TO_HOME); - InteractionJankMonitorWrapper.begin(rv, Cuj.CUJ_LAUNCHER_APP_SWIPE_TO_RECENTS); + InteractionJankMonitorWrapper.begin(mRecentsView, Cuj.CUJ_LAUNCHER_QUICK_SWITCH, + 2000 /* ms timeout */); + InteractionJankMonitorWrapper.begin(mRecentsView, + Cuj.CUJ_LAUNCHER_APP_CLOSE_TO_HOME); + InteractionJankMonitorWrapper.begin(mRecentsView, + Cuj.CUJ_LAUNCHER_APP_SWIPE_TO_RECENTS); rv.post(() -> rv.getViewTreeObserver().removeOnDrawListener(this)); } @@ -1544,7 +1519,7 @@ public abstract class AbsSwipeUpHandler< } private void doLogGesture(GestureEndTarget endTarget, @Nullable TaskView targetTaskView) { - if (mDp == null || !mDp.getDeviceProperties().isGestureMode()) { + if (mDp == null || !mDp.isGestureMode) { // We probably never received an animation controller, skip logging. return; } @@ -1687,26 +1662,21 @@ public abstract class AbsSwipeUpHandler< boolean hasValidLeash = runningTaskTarget != null && runningTaskTarget.leash != null && runningTaskTarget.leash.isValid(); - final boolean swipeUpInDesktopWindowing = - DesktopExperienceFlags.ENABLE_DESKTOP_WINDOWING_PIP.isTrue() - && runningTaskTarget != null - && runningTaskTarget.taskInfo.getWindowingMode() - == WINDOWING_MODE_FREEFORM; boolean appCanEnterPip = !mDeviceState.isPipActive() && hasValidLeash && runningTaskTarget.allowEnterPip && runningTaskTarget.taskInfo.pictureInPictureParams != null - && runningTaskTarget.taskInfo.pictureInPictureParams.isAutoEnterEnabled() - && !swipeUpInDesktopWindowing; + && runningTaskTarget.taskInfo.pictureInPictureParams.isAutoEnterEnabled(); HomeAnimationFactory homeAnimFactory = createHomeAnimationFactory( cookies, duration, isTranslucent, appCanEnterPip, runningTaskTarget, - mRecentsView == null + !enableAdditionalHomeAnimations() + || mRecentsView == null || mRecentsView.getCurrentPage() == mRecentsView.getRunningTaskIndex() - ? null : mRecentsView.getCurrentPageTaskView()); + ? null : mRecentsView.getCurrentPageTaskView()); SwipePipToHomeAnimator swipePipToHomeAnimator = !mIsSwipeForSplit && appCanEnterPip ? createWindowAnimationToPip(homeAnimFactory, runningTaskTarget, start) : null; @@ -1783,10 +1753,8 @@ public abstract class AbsSwipeUpHandler< mLauncherTransitionController = null; if (mRecentsView != null) { - AnimatorSet animatorSet = new AnimatorSet(); - mRecentsView.onPrepareGestureEndAnimation(animatorSet, mGestureState.getEndTarget(), - mRemoteTargetHandles, /* isHandlingAtomicEvent= */ true); - animatorSet.setDuration(0).start(); + mRecentsView.onPrepareGestureEndAnimation(null, mGestureState.getEndTarget(), + mRemoteTargetHandles); } } else { AnimatorSet animatorSet = new AnimatorSet(); @@ -1828,10 +1796,9 @@ public abstract class AbsSwipeUpHandler< animatorSet.play(windowAnim); if (mRecentsView != null) { mRecentsView.onPrepareGestureEndAnimation( - animatorSet, + mGestureState.isHandlingAtomicEvent() ? null : animatorSet, mGestureState.getEndTarget(), - mRemoteTargetHandles, - mGestureState.isHandlingAtomicEvent()); + mRemoteTargetHandles); } animatorSet.setDuration(duration).setInterpolator(interpolator); animatorSet.start(); @@ -1983,26 +1950,24 @@ public abstract class AbsSwipeUpHandler< private Rect getKeepClearAreaForHotseat() { Rect keepClearArea; - final int heightPx = mDp.getDeviceProperties().getHeightPx(); - final int widthPx = mDp.getDeviceProperties().getWidthPx(); // the keep clear area in global screen coordinates, in pixels - if (mDp.getDeviceProperties().isPhone()) { + if (mDp.isPhone) { if (mDp.isSeascape()) { // in seascape the Hotseat is on the left edge of the screen - keepClearArea = new Rect(0, 0, mDp.hotseatBarSizePx, heightPx); - } else if (mDp.getDeviceProperties().isLandscape()) { + keepClearArea = new Rect(0, 0, mDp.hotseatBarSizePx, mDp.heightPx); + } else if (mDp.isLandscape) { // in landscape the Hotseat is on the right edge of the screen - keepClearArea = new Rect(widthPx - mDp.hotseatBarSizePx, 0, - widthPx, heightPx); + keepClearArea = new Rect(mDp.widthPx - mDp.hotseatBarSizePx, 0, + mDp.widthPx, mDp.heightPx); } else { // in portrait mode the Hotseat is at the bottom of the screen - keepClearArea = new Rect(0, heightPx - mDp.hotseatBarSizePx, - widthPx, heightPx); + keepClearArea = new Rect(0, mDp.heightPx - mDp.hotseatBarSizePx, + mDp.widthPx, mDp.heightPx); } } else { // large screens have Hotseat always at the bottom of the screen - keepClearArea = new Rect(0, heightPx - mDp.hotseatBarSizePx, - widthPx, heightPx); + keepClearArea = new Rect(0, mDp.heightPx - mDp.hotseatBarSizePx, + mDp.widthPx, mDp.heightPx); } return keepClearArea; } @@ -2180,9 +2145,6 @@ public abstract class AbsSwipeUpHandler< if (mRecentsView != null) { mRecentsView.onGestureAnimationEnd(); } - if (mGestureAnimationEndCallback != null) { - mGestureAnimationEndCallback.run(); - } resetLauncherListeners(); } @@ -2343,7 +2305,7 @@ public abstract class AbsSwipeUpHandler< mSwipePipToHomeAnimator.getFinishTransaction(), mSwipePipToHomeAnimator.getContentOverlay()); mIsSwipingPipToHome = false; - } else if (mIsSwipeForSplit && !PipFlags.isPip2ExperimentEnabled()) { + } else if (mIsSwipeForSplit && !Flags.enablePip2()) { // Transaction to hide the task to avoid flicker for entering PiP from split-screen. // Note: PiP2 handles entering differently, so skip if enable_pip2=true PictureInPictureSurfaceTransaction tx = @@ -2403,10 +2365,6 @@ public abstract class AbsSwipeUpHandler< mGestureEndCallback = gestureEndCallback; } - public void setGestureAnimationEndCallback(Runnable gestureAnimationEndCallback) { - mGestureAnimationEndCallback = gestureAnimationEndCallback; - } - protected void linkRecentsViewScroll() { if (mRecentsView == null) { return; @@ -2722,8 +2680,7 @@ public abstract class AbsSwipeUpHandler< transaction.setAlpha(app.leash, 1f - fadeProgress); transaction.setPosition(app.leash, /* x= */ app.startBounds.left - + ( - mContainer.getDeviceProfile().getOverviewProfile().getPageSpacing() + + (mContainer.getDeviceProfile().overviewPageSpacing * (mRecentsView.isRtl() ? fadeProgress : -fadeProgress)), /* y= */ 0f); transaction.setScale(app.leash, 1f, 1f); @@ -2774,7 +2731,7 @@ public abstract class AbsSwipeUpHandler< // Scaling of RecentsView during quick switch based on amount of recents scroll private float getScaleProgressDueToScroll() { - if (mContainer == null || !mContainer.getDeviceProfile().getDeviceProperties().isTablet() || mRecentsView == null + if (mContainer == null || !mContainer.getDeviceProfile().isTablet || mRecentsView == null || !shouldLinkRecentsViewScroll()) { return 0; } @@ -2809,11 +2766,7 @@ public abstract class AbsSwipeUpHandler< */ @Override protected float overrideDisplacementForTransientTaskbar(float displacement) { - boolean shouldReturnDisplacement = mContainerInterface.getTaskbarController() == null - ? !mIsTransientTaskbar - : !mContainerInterface.getTaskbarController().shouldAllowTaskbarToAutoStash(); - - if (shouldReturnDisplacement) { + if (!mIsTransientTaskbar) { return displacement; } @@ -2844,7 +2797,6 @@ public abstract class AbsSwipeUpHandler< } public interface Factory { - @Nullable - AbsSwipeUpHandler newHandler(GestureState gestureState, long touchTimeMs); + AbsSwipeUpHandler newHandler(GestureState gestureState, long touchTimeMs); } } diff --git a/quickstep/src/com/android/quickstep/AllAppsActionManager.kt b/quickstep/src/com/android/quickstep/AllAppsActionManager.kt index 51a68d16da..b807a4bfe3 100644 --- a/quickstep/src/com/android/quickstep/AllAppsActionManager.kt +++ b/quickstep/src/com/android/quickstep/AllAppsActionManager.kt @@ -27,7 +27,6 @@ import android.view.accessibility.AccessibilityManager import com.android.launcher3.R import com.android.launcher3.util.SettingsCache import com.android.launcher3.util.SettingsCache.OnChangeListener -import com.android.quickstep.input.QuickstepKeyGestureEventsManager import java.util.concurrent.Executor private val USER_SETUP_COMPLETE_URI = Settings.Secure.getUriFor(USER_SETUP_COMPLETE) @@ -42,7 +41,6 @@ private val USER_SETUP_COMPLETE_URI = Settings.Secure.getUriFor(USER_SETUP_COMPL class AllAppsActionManager( private val context: Context, private val bgExecutor: Executor, - private val quickstepKeyGestureEventsManager: QuickstepKeyGestureEventsManager, private val createAllAppsPendingIntent: () -> PendingIntent, ) { @@ -94,22 +92,17 @@ class AllAppsActionManager( val accessibilityManager = context.getSystemService(AccessibilityManager::class.java) ?: return@execute if (shouldRegisterAction) { - val allAppsPendingIntent = createAllAppsPendingIntent() accessibilityManager.registerSystemAction( RemoteAction( Icon.createWithResource(context, R.drawable.ic_apps), context.getString(R.string.all_apps_label), context.getString(R.string.all_apps_label), - allAppsPendingIntent, + createAllAppsPendingIntent(), ), GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS, ) - quickstepKeyGestureEventsManager.registerAllAppsKeyGestureEvent( - allAppsPendingIntent - ) } else { accessibilityManager.unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS) - quickstepKeyGestureEventsManager.unregisterAllAppsKeyGestureEvent() } } } @@ -119,7 +112,6 @@ class AllAppsActionManager( context .getSystemService(AccessibilityManager::class.java) ?.unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS) - quickstepKeyGestureEventsManager.unregisterAllAppsKeyGestureEvent() SettingsCache.INSTANCE[context].unregister( USER_SETUP_COMPLETE_URI, onSettingsChangeListener, diff --git a/quickstep/src/com/android/quickstep/AspectRatioSystemShortcut.kt b/quickstep/src/com/android/quickstep/AspectRatioSystemShortcut.kt index 9013ff082b..68860ac91b 100644 --- a/quickstep/src/com/android/quickstep/AspectRatioSystemShortcut.kt +++ b/quickstep/src/com/android/quickstep/AspectRatioSystemShortcut.kt @@ -26,7 +26,7 @@ import com.android.launcher3.logging.StatsLogManager.LauncherEvent import com.android.launcher3.popup.SystemShortcut import com.android.quickstep.views.RecentsViewContainer import com.android.quickstep.views.TaskContainer -import com.android.window.flags2.Flags.universalResizableByDefault +import com.android.window.flags.Flags.universalResizableByDefault /** * System shortcut to change the application's aspect ratio compatibility mode. @@ -58,7 +58,8 @@ class AspectRatioSystemShortcut( } mTarget.startActivitySafely(view, intent, mItemInfo) - mTarget.statsLogManager + mTarget + .statsLogManager .logger() .withItemInfo(mItemInfo) .log(LauncherEvent.LAUNCHER_ASPECT_RATIO_SETTINGS_SYSTEM_SHORTCUT_TAP) @@ -80,7 +81,7 @@ class AspectRatioSystemShortcut( !universalResizableByDefault() -> null // The option is only shown on sw600dp+ screens (checked by isTablet) - !viewContainer.deviceProfile.deviceProperties.isTablet -> null + !viewContainer.deviceProfile.isTablet -> null else -> { listOf( diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java index c387856245..549c2f8e34 100644 --- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java +++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java @@ -18,7 +18,9 @@ package com.android.quickstep; import static com.android.app.animation.Interpolators.ACCELERATE_2; import static com.android.app.animation.Interpolators.INSTANT; import static com.android.app.animation.Interpolators.LINEAR; +import static com.android.launcher3.MotionEventsUtils.isTrackpadMultiFingerSwipe; import static com.android.quickstep.AbsSwipeUpHandler.RECENTS_ATTACH_DURATION; +import static com.android.quickstep.GestureState.GestureEndTarget.LAST_TASK; import static com.android.quickstep.util.RecentsAtomicAnimationFactory.INDEX_RECENTS_ATTACHED_ALPHA_ANIM; import static com.android.quickstep.util.RecentsAtomicAnimationFactory.INDEX_RECENTS_FADE_ANIM; import static com.android.quickstep.util.RecentsAtomicAnimationFactory.INDEX_RECENTS_TRANSLATE_X_ANIM; @@ -31,12 +33,14 @@ import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; +import android.view.MotionEvent; import androidx.annotation.Nullable; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.statehandlers.DepthController; +import com.android.launcher3.statehandlers.DesktopVisibilityController; import com.android.launcher3.statemanager.BaseState; import com.android.launcher3.statemanager.StatefulActivity; import com.android.launcher3.taskbar.TaskbarUIController; @@ -67,6 +71,37 @@ public abstract class BaseActivityInterface

    + * $ wwdebug (to turn on the logcat printout) + * $ wwlogcat (see logcat with grep filter on) + * $ statsd_testdrive (see how ww is writing the proto to statsd buffer) + *
+ */ +public class StatsLogCompatManager extends StatsLogManager { + + private static final String TAG = "StatsLog"; + private static final String LATENCY_TAG = "StatsLatencyLog"; + private static final String IMPRESSION_TAG = "StatsImpressionLog"; + private static final boolean IS_VERBOSE = Utilities.isPropertyEnabled(LogConfig.STATSLOG); + private static final boolean DEBUG = !Utilities.isRunningInTestHarness(); + private static final InstanceId DEFAULT_INSTANCE_ID = InstanceId.fakeInstanceId(0); + // LauncherAtom.ItemInfo.getDefaultInstance() should be used but until launcher proto migrates + // from nano to lite, bake constant to prevent robo test failure. + private static final int DEFAULT_PAGE_INDEX = -2; + private static final int FOLDER_HIERARCHY_OFFSET = 100; + private static final int SEARCH_RESULT_HIERARCHY_OFFSET = 200; + private static final int EXTENDED_CONTAINERS_HIERARCHY_OFFSET = 300; + private static final int ALL_APPS_HIERARCHY_OFFSET = 400; + + /** + * Flags for converting SearchAttribute to integer value. + */ + private static final int SEARCH_ATTRIBUTES_CORRECTED_QUERY = 1 << 0; + private static final int SEARCH_ATTRIBUTES_DIRECT_MATCH = 1 << 1; + private static final int SEARCH_ATTRIBUTES_ENTRY_STATE_ALL_APPS = 1 << 2; + private static final int SEARCH_ATTRIBUTES_ENTRY_STATE_QSB = 1 << 3; + private static final int SEARCH_ATTRIBUTES_ENTRY_STATE_OVERVIEW = 1 << 4; + private static final int SEARCH_ATTRIBUTES_ENTRY_STATE_TASKBAR = 1 << 5; + + public static final CopyOnWriteArrayList LOGS_CONSUMER = + new CopyOnWriteArrayList<>(); + + public StatsLogCompatManager(Context context) { + super(context); + } + + @Override + protected StatsLogger createLogger() { + return new StatsCompatLogger(mContext, mActivityContext); + } + + @Override + protected StatsLatencyLogger createLatencyLogger() { + return new StatsCompatLatencyLogger(); + } + + @Override + protected StatsImpressionLogger createImpressionLogger() { + return new StatsCompatImpressionLogger(); + } + + /** + * Synchronously writes an itemInfo to stats log + */ + @WorkerThread + public static void writeSnapshot(LauncherAtom.ItemInfo info, InstanceId instanceId) { + if (IS_VERBOSE) { + Log.d(TAG, String.format("\nwriteSnapshot(%d):\n%s", instanceId.getId(), info)); + } + if (Utilities.isRunningInTestHarness() || !Utilities.ATLEAST_R) { + return; + } + SysUiStatsLog.write(SysUiStatsLog.LAUNCHER_SNAPSHOT, + LAUNCHER_WORKSPACE_SNAPSHOT.getId() /* event_id */, + info.getItemCase().getNumber() /* target_id */, + instanceId.getId() /* instance_id */, + 0 /* uid */, + getPackageName(info) /* package_name */, + getComponentName(info) /* component_name */, + getGridX(info, false) /* grid_x */, + getGridY(info, false) /* grid_y */, + getPageId(info) /* page_id */, + getGridX(info, true) /* grid_x_parent */, + getGridY(info, true) /* grid_y_parent */, + getParentPageId(info) /* page_id_parent */, + getHierarchy(info) /* hierarchy */, + info.getIsWork() /* is_work_profile */, + 0 /* origin */, + getCardinality(info) /* cardinality */, + info.getWidget().getSpanX(), + info.getWidget().getSpanY(), + getFeatures(info), + getAttributes(info) /* attributes */ + ); + } + + private static byte[] getAttributes(LauncherAtom.ItemInfo itemInfo) { + LauncherAttributes.Builder responseBuilder = LauncherAttributes.newBuilder(); + itemInfo.getItemAttributesList().stream().map(Attribute::getNumber).forEach( + responseBuilder::addItemAttributes); + return responseBuilder.build().toByteArray(); + } + + /** + * Builds {@link StatsEvent} from {@link LauncherAtom.ItemInfo}. Used for pulled atom callback + * implementation. + */ + public static StatsEvent buildStatsEvent(LauncherAtom.ItemInfo info, + @Nullable InstanceId instanceId) { + return SysUiStatsLog.buildStatsEvent( + SysUiStatsLog.LAUNCHER_LAYOUT_SNAPSHOT, // atom ID, + LAUNCHER_WORKSPACE_SNAPSHOT.getId(), // event_id = 1; + info.getItemCase().getNumber(), // item_id = 2; + instanceId == null ? 0 : instanceId.getId(), //instance_id = 3; + 0, //uid = 4 [(is_uid) = true]; + getPackageName(info), // package_name = 5; + getComponentName(info), // component_name = 6; + getGridX(info, false), //grid_x = 7 [default = -1]; + getGridY(info, false), //grid_y = 8 [default = -1]; + getPageId(info), // page_id = 9 [default = -2]; + getGridX(info, true), //grid_x_parent = 10 [default = -1]; + getGridY(info, true), //grid_y_parent = 11 [default = -1]; + getParentPageId(info), //page_id_parent = 12 [default = -2]; + getHierarchy(info), // container_id = 13; + info.getIsWork(), // is_work_profile = 14; + 0, // attribute_id = 15; + getCardinality(info), // cardinality = 16; + info.getWidget().getSpanX(), // span_x = 17 [default = 1]; + info.getWidget().getSpanY(), // span_y = 18 [default = 1]; + getAttributes(info) /* attributes = 19 [(log_mode) = MODE_BYTES] */, + info.getIsKidsMode() /* is_kids_mode = 20 */ + ); + } + + /** + * Helps to construct and write statsd compatible log message. + */ + private static class StatsCompatLogger implements StatsLogger { + + private static final ItemInfo DEFAULT_ITEM_INFO = new ItemInfo(); + static { + DEFAULT_ITEM_INFO.itemType = ITEM_TYPE_NON_ACTIONABLE; + } + private final Context mContext; + private final Optional mActivityContext; + private ItemInfo mItemInfo = DEFAULT_ITEM_INFO; + private InstanceId mInstanceId = DEFAULT_INSTANCE_ID; + private OptionalInt mRank = OptionalInt.empty(); + private Optional mContainerInfo = Optional.empty(); + private int mSrcState = LAUNCHER_STATE_UNSPECIFIED; + private int mDstState = LAUNCHER_STATE_UNSPECIFIED; + private Optional mFromState = Optional.empty(); + private Optional mToState = Optional.empty(); + private Optional mEditText = Optional.empty(); + private SliceItem mSliceItem; + private LauncherAtom.Slice mSlice; + private Optional mCardinality = Optional.empty(); + private int mInputType = SysUiStatsLog.LAUNCHER_UICHANGED__INPUT_TYPE__UNKNOWN; + private Optional mFeatures = Optional.empty(); + private Optional mPackageName = Optional.empty(); + /** + * Indicates the current rotation of the display. Uses {@link android.view.Surface values.} + */ + private final int mDisplayRotation; + + StatsCompatLogger(Context context, ActivityContext activityContext) { + mContext = context; + mActivityContext = Optional.ofNullable(activityContext); + mDisplayRotation = DisplayController.INSTANCE.get(mContext).getInfo().rotation; + } + + @Override + public StatsLogger withItemInfo(ItemInfo itemInfo) { + if (mContainerInfo.isPresent()) { + throw new IllegalArgumentException( + "ItemInfo and ContainerInfo are mutual exclusive; cannot log both."); + } + this.mItemInfo = itemInfo; + return this; + } + + @Override + public StatsLogger withInstanceId(InstanceId instanceId) { + this.mInstanceId = instanceId; + return this; + } + + @Override + public StatsLogger withRank(int rank) { + this.mRank = OptionalInt.of(rank); + return this; + } + + @Override + public StatsLogger withSrcState(int srcState) { + this.mSrcState = srcState; + return this; + } + + @Override + public StatsLogger withDstState(int dstState) { + this.mDstState = dstState; + return this; + } + + @Override + public StatsLogger withContainerInfo(ContainerInfo containerInfo) { + checkState(mItemInfo == DEFAULT_ITEM_INFO, + "ItemInfo and ContainerInfo are mutual exclusive; cannot log both."); + this.mContainerInfo = Optional.of(containerInfo); + return this; + } + + @Override + public StatsLogger withFromState(FromState fromState) { + this.mFromState = Optional.of(fromState); + return this; + } + + @Override + public StatsLogger withToState(ToState toState) { + this.mToState = Optional.of(toState); + return this; + } + + @Override + public StatsLogger withEditText(String editText) { + this.mEditText = Optional.of(editText); + return this; + } + + @Override + public StatsLogger withSliceItem(@NonNull SliceItem sliceItem) { + checkState(mItemInfo == DEFAULT_ITEM_INFO && mSlice == null, + "ItemInfo, Slice and SliceItem are mutual exclusive; cannot set more than one" + + " of them."); + this.mSliceItem = checkNotNull(sliceItem, "expected valid sliceItem but received null"); + return this; + } + + @Override + public StatsLogger withSlice(LauncherAtom.Slice slice) { + checkState(mItemInfo == DEFAULT_ITEM_INFO && mSliceItem == null, + "ItemInfo, Slice and SliceItem are mutual exclusive; cannot set more than one" + + " of them."); + checkNotNull(slice, "expected valid slice but received null"); + checkNotNull(slice.getUri(), "expected valid slice uri but received null"); + this.mSlice = slice; + return this; + } + + @Override + public StatsLogger withCardinality(int cardinality) { + this.mCardinality = Optional.of(cardinality); + return this; + } + + @Override + public StatsLogger withInputType(int inputType) { + this.mInputType = inputType; + return this; + } + + @Override + public StatsLogger withFeatures(int feature) { + this.mFeatures = Optional.of(feature); + return this; + } + + @Override + public StatsLogger withPackageName(@Nullable String packageName) { + mPackageName = Optional.ofNullable(packageName); + return this; + } + + @Override + public void log(EventEnum event) { + if (DEBUG) { + String name = (event instanceof Enum) ? ((Enum) event).name() : + event.getId() + ""; + Log.d(TAG, name); + } + + if (mSlice == null && mSliceItem != null) { + mSlice = LauncherAtom.Slice.newBuilder().setUri( + mSliceItem.getSlice().getUri().toString()).build(); + } + + if (mSlice != null) { + Executors.MODEL_EXECUTOR.execute( + () -> { + LauncherAtom.ItemInfo.Builder itemInfoBuilder = + LauncherAtom.ItemInfo.newBuilder().setSlice(mSlice); + mContainerInfo.ifPresent(itemInfoBuilder::setContainerInfo); + write(event, applyOverwrites(itemInfoBuilder.build())); + }); + return; + } + + if (mItemInfo == null) { + return; + } + + // Item is inside a collection, fetch collection info in a BG thread + // and then write to StatsLog. + if (mItemInfo.container < 0) { + LauncherAppState.INSTANCE.get(mContext).getModel().enqueueModelUpdateTask( + (taskController, dataModel, apps) -> write(event, applyOverwrites( + mItemInfo.buildProto( + (CollectionInfo) dataModel.itemsIdMap + .get(mItemInfo.container), + mContext)))); + } + } + + @Override + public void sendToInteractionJankMonitor(EventEnum event, View view) { + if (!(event instanceof LauncherEvent)) { + return; + } + switch ((LauncherEvent) event) { + case LAUNCHER_ALLAPPS_VERTICAL_SWIPE_BEGIN: + InteractionJankMonitorWrapper.begin( + view, + Cuj.CUJ_LAUNCHER_ALL_APPS_SCROLL); + break; + case LAUNCHER_ALLAPPS_VERTICAL_SWIPE_END: + InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_ALL_APPS_SCROLL); + break; + case LAUNCHER_PRIVATE_SPACE_LOCK_ANIMATION_BEGIN: + InteractionJankMonitorWrapper.begin(view, Cuj.CUJ_LAUNCHER_PRIVATE_SPACE_LOCK); + break; + case LAUNCHER_PRIVATE_SPACE_LOCK_ANIMATION_END: + InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_PRIVATE_SPACE_LOCK); + break; + case LAUNCHER_PRIVATE_SPACE_UNLOCK_ANIMATION_BEGIN: + InteractionJankMonitorWrapper.begin( + view, + Cuj.CUJ_LAUNCHER_PRIVATE_SPACE_UNLOCK); + break; + case LAUNCHER_PRIVATE_SPACE_UNLOCK_ANIMATION_END: + InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_PRIVATE_SPACE_UNLOCK); + break; + case LAUNCHER_WORK_UTILITY_VIEW_EXPAND_ANIMATION_BEGIN: + InteractionJankMonitorWrapper.begin( + view, + Cuj.CUJ_LAUNCHER_WORK_UTILITY_VIEW_EXPAND); + break; + case LAUNCHER_WORK_UTILITY_VIEW_EXPAND_ANIMATION_END: + InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_WORK_UTILITY_VIEW_EXPAND); + break; + case LAUNCHER_WORK_UTILITY_VIEW_SHRINK_ANIMATION_BEGIN: + InteractionJankMonitorWrapper.begin( + view, + Cuj.CUJ_LAUNCHER_WORK_UTILITY_VIEW_SHRINK); + break; + case LAUNCHER_WORK_UTILITY_VIEW_SHRINK_ANIMATION_END: + InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_WORK_UTILITY_VIEW_SHRINK); + break; + default: + break; + } + } + + private LauncherAtom.ItemInfo applyOverwrites(LauncherAtom.ItemInfo atomInfo) { + LauncherAtom.ItemInfo.Builder itemInfoBuilder = atomInfo.toBuilder(); + + mRank.ifPresent(itemInfoBuilder::setRank); + mContainerInfo.ifPresent(itemInfoBuilder::setContainerInfo); + + mActivityContext.ifPresent(activityContext -> + activityContext.applyOverwritesToLogItem(itemInfoBuilder)); + + if (mFromState.isPresent() || mToState.isPresent() || mEditText.isPresent()) { + FolderIcon.Builder folderIconBuilder = itemInfoBuilder + .getFolderIcon() + .toBuilder(); + mFromState.ifPresent(folderIconBuilder::setFromLabelState); + mToState.ifPresent(folderIconBuilder::setToLabelState); + mEditText.ifPresent(folderIconBuilder::setLabelInfo); + itemInfoBuilder.setFolderIcon(folderIconBuilder); + } + return itemInfoBuilder.build(); + } + + @WorkerThread + private void write(EventEnum event, LauncherAtom.ItemInfo atomInfo) { + InstanceId instanceId = mInstanceId; + int srcState = mSrcState; + int dstState = mDstState; + int inputType = mInputType; + String packageName = mPackageName.orElseGet(() -> getPackageName(atomInfo)); + if (IS_VERBOSE) { + String name = (event instanceof Enum) ? ((Enum) event).name() : + event.getId() + ""; + StringBuilder logStringBuilder = new StringBuilder("\n"); + if (instanceId != DEFAULT_INSTANCE_ID) { + logStringBuilder.append(String.format("InstanceId:%s ", instanceId)); + } + logStringBuilder.append(name); + if (srcState != LAUNCHER_STATE_UNSPECIFIED + || dstState != LAUNCHER_STATE_UNSPECIFIED) { + logStringBuilder.append( + String.format("(State:%s->%s)", getStateString(srcState), + getStateString(dstState))); + } + if (atomInfo.hasContainerInfo()) { + logStringBuilder.append("\n").append(atomInfo); + } + if (!TextUtils.isEmpty(packageName)) { + logStringBuilder.append(String.format("\nPackage name: %s", packageName)); + } + Log.d(TAG, logStringBuilder.toString()); + } + + for (StatsLogConsumer consumer : LOGS_CONSUMER) { + consumer.consume(event, atomInfo); + } + + // TODO: remove this when b/231648228 is fixed. + if (Utilities.isRunningInTestHarness() || !Utilities.ATLEAST_R) { + return; + } + int cardinality = mCardinality.orElseGet(() -> getCardinality(atomInfo)); + int features = mFeatures.orElseGet(() -> getFeatures(atomInfo)); + SysUiStatsLog.write( + SysUiStatsLog.LAUNCHER_EVENT, + SysUiStatsLog.LAUNCHER_UICHANGED__ACTION__DEFAULT_ACTION /* deprecated */, + srcState, + dstState, + null /* launcher extensions, deprecated */, + false /* quickstep_enabled, deprecated */, + event.getId() /* event_id */, + atomInfo.getItemCase().getNumber() /* target_id */, + instanceId.getId() /* instance_id TODO */, + 0 /* uid TODO */, + packageName /* package_name */, + getComponentName(atomInfo) /* component_name */, + getGridX(atomInfo, false) /* grid_x */, + getGridY(atomInfo, false) /* grid_y */, + getPageId(atomInfo) /* page_id */, + getGridX(atomInfo, true) /* grid_x_parent */, + getGridY(atomInfo, true) /* grid_y_parent */, + getParentPageId(atomInfo) /* page_id_parent */, + getHierarchy(atomInfo) /* hierarchy */, + false /* is_work_profile, deprecated */, + atomInfo.getRank() /* rank */, + atomInfo.getFolderIcon().getFromLabelState().getNumber() /* fromState */, + atomInfo.getFolderIcon().getToLabelState().getNumber() /* toState */, + atomInfo.getFolderIcon().getLabelInfo() /* edittext */, + cardinality /* cardinality */, + features /* features */, + getSearchAttributes(atomInfo) /* searchAttributes */, + getAttributes(atomInfo) /* attributes */, + inputType /* input_type */, + atomInfo.getUserType() /* user_type */, + getDisplayRotation() /* display_rotation */, + getRecentsOrientationHandler(atomInfo) /* recents_orientation_handler */); + } + + private int getDisplayRotation() { + return switch (mDisplayRotation) { + case ROTATION_90 -> LAUNCHER_UICHANGED__DISPLAY_ROTATION__ROTATION_90; + case ROTATION_180 -> LAUNCHER_UICHANGED__DISPLAY_ROTATION__ROTATION_180; + case ROTATION_270 -> LAUNCHER_UICHANGED__DISPLAY_ROTATION__ROTATION_270; + default -> LAUNCHER_UICHANGED__DISPLAY_ROTATION__ROTATION_0; + }; + } + + private int getRecentsOrientationHandler(LauncherAtom.ItemInfo itemInfo) { + var orientationHandler = + itemInfo.getContainerInfo().getTaskSwitcherContainer().getOrientationHandler(); + return switch (orientationHandler) { + case PORTRAIT -> LAUNCHER_UICHANGED__RECENTS_ORIENTATION_HANDLER__PORTRAIT; + case LANDSCAPE -> LAUNCHER_UICHANGED__RECENTS_ORIENTATION_HANDLER__LANDSCAPE; + case SEASCAPE -> LAUNCHER_UICHANGED__RECENTS_ORIENTATION_HANDLER__SEASCAPE; + }; + } + } + + /** + * Helps to construct and log statsd compatible latency events. + */ + private static class StatsCompatLatencyLogger implements StatsLatencyLogger { + private InstanceId mInstanceId = DEFAULT_INSTANCE_ID; + private LatencyType mType = LatencyType.UNKNOWN; + private int mPackageId = 0; + private long mLatencyInMillis; + private int mQueryLength = -1; + private int mSubEventType = 0; + private int mCardinality = -1; + + @Override + public StatsLatencyLogger withInstanceId(InstanceId instanceId) { + this.mInstanceId = instanceId; + return this; + } + + @Override + public StatsLatencyLogger withType(LatencyType type) { + this.mType = type; + return this; + } + + @Override + public StatsLatencyLogger withPackageId(int packageId) { + this.mPackageId = packageId; + return this; + } + + @Override + public StatsLatencyLogger withLatency(long latencyInMillis) { + this.mLatencyInMillis = latencyInMillis; + return this; + } + + @Override + public StatsLatencyLogger withQueryLength(int queryLength) { + this.mQueryLength = queryLength; + return this; + } + + @Override + public StatsLatencyLogger withSubEventType(int type) { + this.mSubEventType = type; + return this; + } + + @Override + public StatsLatencyLogger withCardinality(int cardinality) { + this.mCardinality = cardinality; + return this; + } + + @Override + public void log(EventEnum event) { + if (IS_VERBOSE) { + String name = (event instanceof Enum) ? ((Enum) event).name() : + event.getId() + ""; + StringBuilder logStringBuilder = new StringBuilder("\n"); + logStringBuilder.append(String.format("InstanceId:%s ", mInstanceId)); + logStringBuilder.append(String.format("%s=%sms", name, mLatencyInMillis)); + Log.d(LATENCY_TAG, logStringBuilder.toString()); + } + + SysUiStatsLog.write(SysUiStatsLog.LAUNCHER_LATENCY, + event.getId(), // event_id + mInstanceId.getId(), // instance_id + mPackageId, // package_id + mLatencyInMillis, // latency_in_millis + mType.getId(), //type + mQueryLength, // query_length + mSubEventType, // sub_event_type + mCardinality // cardinality + ); + } + } + + /** + * Helps to construct and log statsd compatible impression events. + */ + private static class StatsCompatImpressionLogger implements StatsImpressionLogger { + private InstanceId mInstanceId = DEFAULT_INSTANCE_ID; + private State mLauncherState = State.UNKNOWN; + private int mQueryLength = -1; + + // Fields used for Impression Logging V2. + private int mResultType; + private boolean mAboveKeyboard = false; + private int mUid; + private int mResultSource; + + @Override + public StatsImpressionLogger withInstanceId(InstanceId instanceId) { + this.mInstanceId = instanceId; + return this; + } + + @Override + public StatsImpressionLogger withState(State state) { + this.mLauncherState = state; + return this; + } + + @Override + public StatsImpressionLogger withQueryLength(int queryLength) { + this.mQueryLength = queryLength; + return this; + } + + @Override + public StatsImpressionLogger withResultType(int resultType) { + mResultType = resultType; + return this; + } + + + @Override + public StatsImpressionLogger withAboveKeyboard(boolean aboveKeyboard) { + mAboveKeyboard = aboveKeyboard; + return this; + } + + @Override + public StatsImpressionLogger withUid(int uid) { + mUid = uid; + return this; + } + + @Override + public StatsImpressionLogger withResultSource(int resultSource) { + mResultSource = resultSource; + return this; + } + + @Override + public void log(EventEnum event) { + if (IS_VERBOSE) { + String name = (event instanceof Enum) ? ((Enum) event).name() : + event.getId() + ""; + StringBuilder logStringBuilder = new StringBuilder("\n"); + logStringBuilder.append(String.format("InstanceId:%s ", mInstanceId)); + logStringBuilder.append(String.format("ImpressionEvent:%s ", name)); + logStringBuilder.append(String.format("\n\tLauncherState = %s ", mLauncherState)); + logStringBuilder.append(String.format("\tQueryLength = %s ", mQueryLength)); + logStringBuilder.append(String.format( + "\n\t ResultType = %s is_above_keyboard = %s" + + " uid = %s result_source = %s", + mResultType, + mAboveKeyboard, mUid, mResultSource)); + + Log.d(IMPRESSION_TAG, logStringBuilder.toString()); + } + + + SysUiStatsLog.write(SysUiStatsLog.LAUNCHER_IMPRESSION_EVENT_V2, + event.getId(), // event_id + mInstanceId.getId(), // instance_id + mLauncherState.getLauncherState(), // state + mQueryLength, // query_length + mResultType, //result type + mAboveKeyboard, // above keyboard + mUid, // uid + mResultSource // result source + + ); + } + } + + private static int getCardinality(LauncherAtom.ItemInfo info) { + if (Utilities.isRunningInTestHarness()) { + return 0; + } + switch (info.getContainerInfo().getContainerCase()) { + case PREDICTED_HOTSEAT_CONTAINER: + return info.getContainerInfo().getPredictedHotseatContainer().getCardinality(); + case TASK_BAR_CONTAINER: + return info.getContainerInfo().getTaskBarContainer().getCardinality(); + case SEARCH_RESULT_CONTAINER: + return info.getContainerInfo().getSearchResultContainer().getQueryLength(); + case EXTENDED_CONTAINERS: + ExtendedContainers extendedCont = info.getContainerInfo().getExtendedContainers(); + if (extendedCont.getContainerCase() == DEVICE_SEARCH_RESULT_CONTAINER) { + DeviceSearchResultContainer deviceSearchResultCont = extendedCont + .getDeviceSearchResultContainer(); + return deviceSearchResultCont.hasQueryLength() ? deviceSearchResultCont + .getQueryLength() : -1; + } + default: + return switch (info.getItemCase()) { + case FOLDER_ICON -> info.getFolderIcon().getCardinality(); + case TASK_VIEW -> info.getTaskView().getCardinality(); + default -> 0; + }; + } + } + + private static String getPackageName(LauncherAtom.ItemInfo info) { + return switch (info.getItemCase()) { + case APPLICATION -> info.getApplication().getPackageName(); + case SHORTCUT -> info.getShortcut().getShortcutName(); + case WIDGET -> info.getWidget().getPackageName(); + case TASK -> info.getTask().getPackageName(); + case SEARCH_ACTION_ITEM -> info.getSearchActionItem().getPackageName(); + default -> null; + }; + } + + private static String getComponentName(LauncherAtom.ItemInfo info) { + return switch (info.getItemCase()) { + case APPLICATION -> info.getApplication().getComponentName(); + case SHORTCUT -> info.getShortcut().getShortcutName(); + case WIDGET -> info.getWidget().getComponentName(); + case TASK -> info.getTask().getComponentName(); + case TASK_VIEW -> info.getTaskView().getComponentName(); + case SEARCH_ACTION_ITEM -> info.getSearchActionItem().getTitle(); + case SLICE -> info.getSlice().getUri(); + default -> null; + }; + } + + private static int getGridX(LauncherAtom.ItemInfo info, boolean parent) { + ContainerInfo containerInfo = info.getContainerInfo(); + if (containerInfo.getContainerCase() == FOLDER) { + if (parent) { + return containerInfo.getFolder().getWorkspace().getGridX(); + } else { + return containerInfo.getFolder().getGridX(); + } + } else if (containerInfo.getContainerCase() == EXTENDED_CONTAINERS) { + return containerInfo.getExtendedContainers() + .getDeviceSearchResultContainer().getGridX(); + } else { + return containerInfo.getWorkspace().getGridX(); + } + } + + private static int getGridY(LauncherAtom.ItemInfo info, boolean parent) { + if (info.getContainerInfo().getContainerCase() == FOLDER) { + if (parent) { + return info.getContainerInfo().getFolder().getWorkspace().getGridY(); + } else { + return info.getContainerInfo().getFolder().getGridY(); + } + } else { + return info.getContainerInfo().getWorkspace().getGridY(); + } + } + + private static int getPageId(LauncherAtom.ItemInfo info) { + return switch (info.getItemCase()) { + case TASK -> info.getTask().getIndex(); + case TASK_VIEW -> info.getTaskView().getIndex(); + default -> getPageIdFromContainerInfo(info.getContainerInfo()); + }; + } + + private static int getPageIdFromContainerInfo(LauncherAtom.ContainerInfo containerInfo) { + return switch (containerInfo.getContainerCase()) { + case FOLDER -> containerInfo.getFolder().getPageIndex(); + case HOTSEAT -> containerInfo.getHotseat().getIndex(); + case PREDICTED_HOTSEAT_CONTAINER -> + containerInfo.getPredictedHotseatContainer().getIndex(); + case TASK_BAR_CONTAINER -> containerInfo.getTaskBarContainer().getIndex(); + default -> containerInfo.getWorkspace().getPageIndex(); + }; + } + + private static int getParentPageId(LauncherAtom.ItemInfo info) { + return switch (info.getContainerInfo().getContainerCase()) { + case FOLDER -> { + if (info.getContainerInfo().getFolder().getParentContainerCase() + == ParentContainerCase.HOTSEAT) { + yield info.getContainerInfo().getFolder().getHotseat().getIndex(); + } + yield info.getContainerInfo().getFolder().getWorkspace().getPageIndex(); + } + case SEARCH_RESULT_CONTAINER -> + info.getContainerInfo().getSearchResultContainer().getWorkspace() + .getPageIndex(); + default -> info.getContainerInfo().getWorkspace().getPageIndex(); + }; + } + + private static int getHierarchy(LauncherAtom.ItemInfo info) { + if (Utilities.isRunningInTestHarness()) { + return 0; + } + if (info.getContainerInfo().getContainerCase() == FOLDER) { + return info.getContainerInfo().getFolder().getParentContainerCase().getNumber() + + FOLDER_HIERARCHY_OFFSET; + } else if (info.getContainerInfo().getContainerCase() == SEARCH_RESULT_CONTAINER) { + return info.getContainerInfo().getSearchResultContainer().getParentContainerCase() + .getNumber() + SEARCH_RESULT_HIERARCHY_OFFSET; + } else if (info.getContainerInfo().getContainerCase() == EXTENDED_CONTAINERS) { + return info.getContainerInfo().getExtendedContainers().getContainerCase().getNumber() + + EXTENDED_CONTAINERS_HIERARCHY_OFFSET; + } else if (info.getContainerInfo().getContainerCase() == ALL_APPS_CONTAINER) { + return info.getContainerInfo().getAllAppsContainer().getParentContainerCase() + .getNumber() + ALL_APPS_HIERARCHY_OFFSET; + } else { + return info.getContainerInfo().getContainerCase().getNumber(); + } + } + + private static String getStateString(int state) { + return switch (state) { + case LAUNCHER_UICHANGED__DST_STATE__BACKGROUND -> "BACKGROUND"; + case LAUNCHER_UICHANGED__DST_STATE__HOME -> "HOME"; + case LAUNCHER_UICHANGED__DST_STATE__OVERVIEW -> "OVERVIEW"; + case LAUNCHER_UICHANGED__DST_STATE__ALLAPPS -> "ALLAPPS"; + default -> "INVALID"; + }; + } + + private static int getFeatures(LauncherAtom.ItemInfo info) { + return switch (info.getItemCase()) { + case WIDGET -> info.getWidget().getWidgetFeatures(); + case TASK_VIEW -> info.getTaskView().getType(); + default -> 0; + }; + } + + private static int getSearchAttributes(LauncherAtom.ItemInfo info) { + if (Utilities.isRunningInTestHarness()) { + return 0; + } + ContainerInfo containerInfo = info.getContainerInfo(); + if (containerInfo.getContainerCase() == EXTENDED_CONTAINERS + && containerInfo.getExtendedContainers().getContainerCase() + == DEVICE_SEARCH_RESULT_CONTAINER + && containerInfo.getExtendedContainers() + .getDeviceSearchResultContainer().hasSearchAttributes() + ) { + return searchAttributesToInt(containerInfo.getExtendedContainers() + .getDeviceSearchResultContainer().getSearchAttributes()); + } + return 0; + } + + private static int searchAttributesToInt(SearchAttributes searchAttributes) { + int response = 0; + if (searchAttributes.getCorrectedQuery()) { + response = response | SEARCH_ATTRIBUTES_CORRECTED_QUERY; + } + if (searchAttributes.getDirectMatch()) { + response = response | SEARCH_ATTRIBUTES_DIRECT_MATCH; + } + if (searchAttributes.getEntryState() == SearchAttributes.EntryState.ALL_APPS) { + response = response | SEARCH_ATTRIBUTES_ENTRY_STATE_ALL_APPS; + } else if (searchAttributes.getEntryState() == SearchAttributes.EntryState.QSB) { + response = response | SEARCH_ATTRIBUTES_ENTRY_STATE_QSB; + } else if (searchAttributes.getEntryState() == SearchAttributes.EntryState.OVERVIEW) { + response = response | SEARCH_ATTRIBUTES_ENTRY_STATE_OVERVIEW; + } else if (searchAttributes.getEntryState() == SearchAttributes.EntryState.TASKBAR) { + response = response | SEARCH_ATTRIBUTES_ENTRY_STATE_TASKBAR; + } + + return response; + } + + /** + * Interface to get stats log while it is dispatched to the system + */ + public interface StatsLogConsumer { + + @WorkerThread + void consume(EventEnum event, LauncherAtom.ItemInfo atomInfo); + } +} diff --git a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt index f9452f781e..4b9eb9e77f 100644 --- a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt +++ b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt @@ -37,9 +37,9 @@ import android.widget.LinearLayout import androidx.annotation.VisibleForTesting import androidx.core.util.component1 import androidx.core.util.component2 -import androidx.core.view.marginStart import androidx.core.view.updateLayoutParams import com.android.launcher3.DeviceProfile +import com.android.launcher3.Flags import com.android.launcher3.LauncherAnimUtils import com.android.launcher3.R import com.android.launcher3.Utilities @@ -48,16 +48,15 @@ import com.android.launcher3.touch.PagedOrientationHandler.ChildBounds import com.android.launcher3.touch.PagedOrientationHandler.Float2DAction import com.android.launcher3.touch.PagedOrientationHandler.Int2DAction import com.android.launcher3.touch.SingleAxisSwipeDetector -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED import com.android.launcher3.util.SplitConfigurationOptions.STAGE_TYPE_MAIN +import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption import com.android.launcher3.util.SplitConfigurationOptions.StagePosition import com.android.launcher3.views.BaseDragLayer import com.android.quickstep.views.IconAppChipView -import com.android.wm.shell.shared.split.SplitBounds import kotlin.math.max open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { @@ -84,9 +83,9 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { override fun fixBoundsForHomeAnimStartRect(outStartRect: RectF, deviceProfile: DeviceProfile) { // We don't need to check the "top" value here because the startRect is in the orientation // of the app, not of the fixed portrait launcher. - if (outStartRect.left > deviceProfile.deviceProperties.heightPx) { + if (outStartRect.left > deviceProfile.heightPx) { outStartRect.offsetTo(0f, outStartRect.top) - } else if (outStartRect.left < -deviceProfile.deviceProperties.heightPx) { + } else if (outStartRect.left < -deviceProfile.heightPx) { outStartRect.offsetTo(0f, outStartRect.top) } } @@ -119,8 +118,6 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { override fun getPrimarySize(rect: RectF): Float = rect.height() - override fun getSecondarySize(rect: RectF): Float = rect.width() - override fun getStart(rect: RectF): Float = rect.top override fun getEnd(rect: RectF): Float = rect.bottom @@ -183,12 +180,7 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { deviceProfile: DeviceProfile, taskInsetMargin: Float, taskViewIcon: View, - ): Float = - if (enableOverviewIconMenu()) { - x + (taskViewIcon as IconAppChipView).menuToCollapsedChipGap - } else { - thumbnailView.measuredWidth + x - taskInsetMargin - } + ): Float = thumbnailView.measuredWidth + x - taskInsetMargin override fun getTaskMenuY( y: Float, @@ -198,11 +190,6 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { taskInsetMargin: Float, taskViewIcon: View, ): Float { - if (enableOverviewIconMenu()) { - val marginStart = (taskViewIcon as IconAppChipView).backgroundMarginTopStart - return if (taskMenuView.isLayoutRtl) y - marginStart else y + marginStart - } - val layoutParams = taskMenuView.layoutParams as BaseDragLayer.LayoutParams var taskMenuY = y + taskInsetMargin @@ -213,19 +200,13 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { return taskMenuY } - override fun getAppChipMenuMarginX(appChipView: IconAppChipView, isRtl: Boolean): Int = - appChipView.menuToCollapsedChipGap - - override fun getAppChipMenuMarginY(appChipView: IconAppChipView, isRtl: Boolean): Int = - if (isRtl) appChipView.backgroundMarginTopStart else -appChipView.backgroundMarginTopStart - override fun getTaskMenuWidth( thumbnailView: View, deviceProfile: DeviceProfile, @StagePosition stagePosition: Int, ): Int = when { - enableOverviewIconMenu() -> + Flags.enableOverviewIconMenu() -> thumbnailView.resources.getDimensionPixelSize( R.dimen.task_thumbnail_icon_menu_expanded_width ) @@ -280,7 +261,7 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { if (isGroupedTaskView) { snapshotViewHeight } else { - taskViewHeight - deviceProfile.overviewProfile.taskThumbnailTopMarginPx + taskViewHeight - deviceProfile.overviewTaskThumbnailTopMarginPx } } } @@ -294,7 +275,7 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { desiredTaskId: Int, banner: View, ): Pair { - val snapshotParams = thumbnailViews[0].layoutParams as ViewGroup.MarginLayoutParams + val snapshotParams = thumbnailViews[0].layoutParams as FrameLayout.LayoutParams val translationX = banner.height.toFloat() val translationY: Float if (splitBounds == null) { @@ -338,22 +319,6 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { override fun getTaskLaunchLength(secondaryDimension: Int, taskThumbnailBounds: Rect): Int = taskThumbnailBounds.left - override fun extendRectForPrimaryTranslation(rect: Rect, translation: Int) { - if (translation < 0) { - rect.top += translation - } else { - rect.bottom += translation - } - } - - override fun extendRectForSecondaryTranslation(rect: Rect, translation: Int) { - if (translation < 0) { - rect.left += translation - } else { - rect.right += translation - } - } - /* -------------------- */ override fun getChildBounds( @@ -394,15 +359,15 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { ) { // In fake land/seascape, the placeholder always needs to go to the "top" of the device, // which is the same bounds as 0 rotation. - val width = dp.deviceProperties.widthPx + val width = dp.widthPx val insetSizeAdjustment = getPlaceholderSizeAdjustment(dp) out.set(0, 0, width, placeholderHeight + insetSizeAdjustment) out.inset(placeholderInset, 0) // Adjust the top to account for content off screen. This will help to animate the view in // with rounded corners. - val screenWidth = dp.deviceProperties.widthPx - val screenHeight = dp.deviceProperties.heightPx + val screenWidth = dp.widthPx + val screenHeight = dp.heightPx val totalHeight = (1.0f * screenHeight / 2 * (screenWidth - 2 * placeholderInset) / screenWidth).toInt() out.top -= totalHeight - placeholderHeight @@ -467,8 +432,8 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { out2: Rect, ) { // In fake land/seascape, the window bounds are always top and bottom half - val screenHeight = dp.deviceProperties.heightPx - val screenWidth = dp.deviceProperties.widthPx + val screenHeight = dp.heightPx + val screenWidth = dp.widthPx out1.set(0, 0, screenWidth, screenHeight / 2 - splitDividerSize) out2.set(0, screenHeight / 2 + splitDividerSize, screenWidth, screenHeight) } @@ -507,12 +472,12 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { val secondaryParams = secondarySnapshot.layoutParams as FrameLayout.LayoutParams // Swap the margins that are set in TaskView#setRecentsOrientedState() - secondaryParams.topMargin = dp.overviewProfile.taskThumbnailTopMarginPx + secondaryParams.topMargin = dp.overviewTaskThumbnailTopMarginPx primaryParams.topMargin = 0 // Measure and layout the thumbnails bottom up, since the primary is on the visual left // (portrait bottom) and secondary is on the right (portrait top) - val spaceAboveSnapshot = dp.overviewProfile.taskThumbnailTopMarginPx + val spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx val totalThumbnailHeight = parentHeight - spaceAboveSnapshot val dividerBar = getDividerBarSize(totalThumbnailHeight, splitBoundsConfig) @@ -538,7 +503,7 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { parentWidth: Int, parentHeight: Int, ): Pair { - val spaceAboveSnapshot = dp.overviewProfile.taskThumbnailTopMarginPx + val spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx val totalThumbnailHeight = parentHeight - spaceAboveSnapshot val dividerBar = getDividerBarSize(totalThumbnailHeight, splitBoundsConfig) @@ -623,7 +588,7 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { inSplitSelection: Boolean, oneIconHiddenDueToSmallWidth: Boolean, ) { - val spaceAboveSnapshot = deviceProfile.overviewProfile.taskThumbnailTopMarginPx + val spaceAboveSnapshot = deviceProfile.overviewTaskThumbnailTopMarginPx val totalThumbnailHeight = groupedTaskViewHeight - spaceAboveSnapshot val dividerBar: Int = getDividerBarSize(totalThumbnailHeight, splitConfig) @@ -633,7 +598,7 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { primarySnapshotHeight, totalThumbnailHeight, isRtl, - deviceProfile.overviewProfile.taskMarginPx, + deviceProfile.overviewTaskMarginPx, dividerBar, oneIconHiddenDueToSmallWidth, ) @@ -694,7 +659,7 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { dividerSize: Int, oneIconHiddenDueToSmallWidth: Boolean, ): SplitIconPositions { - return if (enableOverviewIconMenu()) { + return if (Flags.enableOverviewIconMenu()) { if (isRtl) { SplitIconPositions(-(totalThumbnailHeight - primarySnapshotHeight), 0) } else { @@ -730,7 +695,7 @@ open class LandscapePagedViewHandler : RecentsPagedOrientationHandler { open fun updateSplitIconsPosition(iconView: View, translationY: Int, isRtl: Boolean) { val layoutParams = iconView.layoutParams as FrameLayout.LayoutParams - if (enableOverviewIconMenu()) { + if (Flags.enableOverviewIconMenu()) { val appChipView = iconView as IconAppChipView layoutParams.gravity = if (isRtl) Gravity.BOTTOM or Gravity.START else Gravity.TOP or Gravity.END diff --git a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.kt index a51beead06..74ae688bd7 100644 --- a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.kt +++ b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.kt @@ -31,6 +31,7 @@ import android.widget.FrameLayout import android.widget.LinearLayout import androidx.core.view.updateLayoutParams import com.android.launcher3.DeviceProfile +import com.android.launcher3.Flags.enableOverviewIconMenu import com.android.launcher3.LauncherAnimUtils import com.android.launcher3.R import com.android.launcher3.Utilities @@ -39,12 +40,10 @@ import com.android.launcher3.touch.DefaultPagedViewHandler import com.android.launcher3.touch.PagedOrientationHandler.Float2DAction import com.android.launcher3.touch.PagedOrientationHandler.Int2DAction import com.android.launcher3.touch.SingleAxisSwipeDetector -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu import com.android.launcher3.util.SplitConfigurationOptions import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption import com.android.launcher3.util.SplitConfigurationOptions.StagePosition import com.android.quickstep.views.IconAppChipView -import com.android.wm.shell.shared.split.SplitBounds import kotlin.math.max import kotlin.math.min @@ -63,9 +62,9 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat } override fun fixBoundsForHomeAnimStartRect(outStartRect: RectF, deviceProfile: DeviceProfile) { - if (outStartRect.left > deviceProfile.deviceProperties.widthPx) { + if (outStartRect.left > deviceProfile.widthPx) { outStartRect.offsetTo(0f, outStartRect.top) - } else if (outStartRect.left < -deviceProfile.deviceProperties.widthPx) { + } else if (outStartRect.left < -deviceProfile.widthPx) { outStartRect.offsetTo(0f, outStartRect.top) } } @@ -84,8 +83,6 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat override fun getPrimarySize(rect: RectF): Float = rect.width() - override fun getSecondarySize(rect: RectF): Float = rect.height() - override fun getStart(rect: RectF): Float = rect.left override fun getEnd(rect: RectF): Float = rect.right @@ -136,16 +133,12 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat taskInsetMargin: Float, taskViewIcon: View, ): Float = - if (enableOverviewIconMenu()) { - x + if (deviceProfile.isLandscape) { + (x + + taskInsetMargin + + (thumbnailView.measuredWidth - thumbnailView.measuredHeight) / 2f) } else { - if (deviceProfile.deviceProperties.isLandscape) { - (x + - taskInsetMargin + - (thumbnailView.measuredWidth - thumbnailView.measuredHeight) / 2f) - } else { - x + taskInsetMargin - } + x + taskInsetMargin } override fun getTaskMenuY( @@ -155,19 +148,7 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat taskMenuView: View, taskInsetMargin: Float, taskViewIcon: View, - ): Float = - if (enableOverviewIconMenu()) { - taskViewIcon as IconAppChipView - y - taskViewIcon.menuToCollapsedChipGap - } else { - y + taskInsetMargin - } - - override fun getAppChipMenuMarginX(appChipView: IconAppChipView, isRtl: Boolean): Int = - if (isRtl) -appChipView.backgroundMarginTopStart else appChipView.backgroundMarginTopStart - - override fun getAppChipMenuMarginY(appChipView: IconAppChipView, isRtl: Boolean): Int = - appChipView.menuToCollapsedChipGap + ): Float = y + taskInsetMargin override fun getTaskMenuWidth( thumbnailView: View, @@ -181,8 +162,7 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat ) } - (deviceProfile.deviceProperties.isLandscape && - !deviceProfile.deviceProperties.isTablet) -> { + (deviceProfile.isLandscape && !deviceProfile.isTablet) -> { val padding = thumbnailView.resources.getDimensionPixelSize(R.dimen.task_menu_edge_padding) thumbnailView.measuredHeight - (2 * padding) @@ -201,7 +181,7 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat taskMenuX: Float, taskMenuY: Float, ): Int = - deviceProfile.deviceProperties.heightPx - + deviceProfile.heightPx - deviceProfile.insets.top - taskMenuY.toInt() - deviceProfile.overviewActionsClaimedSpaceBelow @@ -256,7 +236,7 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat override fun getDwbBannerTranslations( taskViewWidth: Int, taskViewHeight: Int, - splitBounds: SplitBounds?, + splitBounds: SplitConfigurationOptions.SplitBounds?, deviceProfile: DeviceProfile, thumbnailViews: Array, desiredTaskId: Int, @@ -275,8 +255,7 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat } } else { if (desiredTaskId == splitBounds.leftTopTaskId) { - val snapshotParams = - thumbnailViews[0].layoutParams as ViewGroup.MarginLayoutParams + val snapshotParams = thumbnailViews[0].layoutParams as FrameLayout.LayoutParams val bottomRightTaskPlusDividerPercent = (splitBounds.rightBottomTaskPercent + splitBounds.dividerPercent) translationY = @@ -313,30 +292,14 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat override fun getTaskLaunchLength(secondaryDimension: Int, taskThumbnailBounds: Rect): Int = secondaryDimension - taskThumbnailBounds.bottom - override fun extendRectForPrimaryTranslation(rect: Rect, translation: Int) { - if (translation < 0) { - rect.left += translation - } else { - rect.right += translation - } - } - - override fun extendRectForSecondaryTranslation(rect: Rect, translation: Int) { - if (translation < 0) { - rect.top += translation - } else { - rect.bottom += translation - } - } - /* -------------------- */ override fun getDistanceToBottomOfRect(dp: DeviceProfile, rect: Rect): Int = - dp.deviceProperties.heightPx - rect.bottom + dp.heightPx - rect.bottom override fun getSplitPositionOptions(dp: DeviceProfile): List = when { - dp.deviceProperties.isTablet -> { + dp.isTablet -> { Utilities.getSplitPositionOptions(dp) } @@ -382,8 +345,8 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat @StagePosition stagePosition: Int, out: Rect, ) { - val screenWidth = dp.deviceProperties.widthPx - val screenHeight = dp.deviceProperties.heightPx + val screenWidth = dp.widthPx + val screenHeight = dp.heightPx val pinToRight = stagePosition == SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT val insetSizeAdjustment = getPlaceholderSizeAdjustment(dp, pinToRight) @@ -467,7 +430,7 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat */ private fun getPlaceholderSizeAdjustment(dp: DeviceProfile, pinToRight: Boolean): Int { val insetThickness = - if (!dp.deviceProperties.isLandscape) { + if (!dp.isLandscape) { dp.insets.top } else { if (pinToRight) dp.insets.right else dp.insets.left @@ -485,8 +448,8 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat out.pivotY = splitInstructionsHeight.toFloat() out.rotation = degreesRotated val distanceToEdge = - if (dp.deviceProperties.isPhone) { - if (dp.deviceProperties.isLandscape) { + if (dp.isPhone) { + if (dp.isLandscape) { out.resources.getDimensionPixelSize( R.dimen.split_instructions_bottom_margin_phone_landscape ) @@ -517,8 +480,8 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat out1: Rect, out2: Rect, ) { - val screenHeight = dp.deviceProperties.heightPx - val screenWidth = dp.deviceProperties.widthPx + val screenHeight = dp.heightPx + val screenWidth = dp.widthPx out1.set(0, 0, screenWidth, screenHeight / 2 - splitDividerSize) out2.set(0, screenHeight / 2 + splitDividerSize, screenWidth, screenHeight) if (!dp.isLeftRightSplit) { @@ -550,19 +513,17 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat override fun setSplitTaskSwipeRect( dp: DeviceProfile, outRect: Rect, - splitInfo: SplitBounds, + splitInfo: SplitConfigurationOptions.SplitBounds, desiredStagePosition: Int, ) { val topLeftTaskPercent = splitInfo.leftTopTaskPercent val dividerBarPercent = splitInfo.dividerPercent - val taskbarHeight = - if (dp.taskbarProfile.isTransientTaskbar) 0 else dp.taskbarProfile.height - val scale = - outRect.height().toFloat() / (dp.deviceProperties.availableHeightPx - taskbarHeight) - val topTaskHeight = dp.deviceProperties.availableHeightPx * topLeftTaskPercent + val taskbarHeight = if (dp.isTransientTaskbar) 0 else dp.taskbarHeight + val scale = outRect.height().toFloat() / (dp.availableHeightPx - taskbarHeight) + val topTaskHeight = dp.availableHeightPx * topLeftTaskPercent val scaledTopTaskHeight = topTaskHeight * scale - val dividerHeight = dp.deviceProperties.availableHeightPx * dividerBarPercent + val dividerHeight = dp.availableHeightPx * dividerBarPercent val scaledDividerHeight = dividerHeight * scale if (desiredStagePosition == SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT) { @@ -591,12 +552,12 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat secondarySnapshot: View, parentWidth: Int, parentHeight: Int, - splitBoundsConfig: SplitBounds, + splitBoundsConfig: SplitConfigurationOptions.SplitBounds, dp: DeviceProfile, isRtl: Boolean, inSplitSelection: Boolean, ) { - val spaceAboveSnapshot = dp.overviewProfile.taskThumbnailTopMarginPx + val spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx val primaryParams = primarySnapshot.layoutParams as FrameLayout.LayoutParams val secondaryParams = secondarySnapshot.layoutParams as FrameLayout.LayoutParams @@ -650,11 +611,11 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat override fun getGroupedTaskViewSizes( dp: DeviceProfile, - splitBoundsConfig: SplitBounds, + splitBoundsConfig: SplitConfigurationOptions.SplitBounds, parentWidth: Int, parentHeight: Int, ): Pair { - val spaceAboveSnapshot = dp.overviewProfile.taskThumbnailTopMarginPx + val spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx val totalThumbnailHeight = parentHeight - spaceAboveSnapshot val dividerScale = splitBoundsConfig.dividerPercent val taskPercent = splitBoundsConfig.leftTopTaskPercent @@ -670,12 +631,9 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat secondTaskViewSize.x = parentWidth - firstTaskViewSize.x - scaledDividerBar secondTaskViewSize.y = totalThumbnailHeight } else { - val taskbarHeight = - if (dp.taskbarProfile.isTransientTaskbar) 0 else dp.taskbarProfile.height - val scale = - totalThumbnailHeight.toFloat() / - (dp.deviceProperties.availableHeightPx - taskbarHeight) - val topTaskHeight = dp.deviceProperties.availableHeightPx * taskPercent + val taskbarHeight = if (dp.isTransientTaskbar) 0 else dp.taskbarHeight + val scale = totalThumbnailHeight.toFloat() / (dp.availableHeightPx - taskbarHeight) + val topTaskHeight = dp.availableHeightPx * taskPercent val finalDividerHeight = Math.round(totalThumbnailHeight * dividerScale).toFloat() val scaledTopTaskHeight = topTaskHeight * scale firstTaskViewSize.x = parentWidth @@ -746,7 +704,7 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat groupedTaskViewWidth: Int, isRtl: Boolean, deviceProfile: DeviceProfile, - splitConfig: SplitBounds, + splitConfig: SplitConfigurationOptions.SplitBounds, inSplitSelection: Boolean, oneIconHiddenDueToSmallWidth: Boolean, ) { @@ -785,8 +743,7 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat .toInt() secondaryAppChipView.setSplitTranslationY( (primarySnapshotHeight + - (if (deviceProfile.deviceProperties.isTablet) 0 - else dividerThickness)) + (if (deviceProfile.isTablet) 0 else dividerThickness)) .toFloat() ) } @@ -799,11 +756,9 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat if (deviceProfile.isSeascape) deviceProfile.insets.right else deviceProfile.insets.left val fullscreenMidpointFromBottom = - ((deviceProfile.deviceProperties.widthPx - fullscreenInsetThickness) / 2) - val midpointFromEndPct = - fullscreenMidpointFromBottom.toFloat() / deviceProfile.deviceProperties.widthPx - val insetPct = - fullscreenInsetThickness.toFloat() / deviceProfile.deviceProperties.widthPx + ((deviceProfile.widthPx - fullscreenInsetThickness) / 2) + val midpointFromEndPct = fullscreenMidpointFromBottom.toFloat() / deviceProfile.widthPx + val insetPct = fullscreenInsetThickness.toFloat() / deviceProfile.widthPx val spaceAboveSnapshots = 0 val overviewThumbnailAreaThickness = groupedTaskViewWidth - spaceAboveSnapshots val bottomToMidpointOffset = @@ -904,9 +859,7 @@ class PortraitPagedViewHandler : DefaultPagedViewHandler(), RecentsPagedOrientat } override fun getDefaultSplitPosition(deviceProfile: DeviceProfile): Int { - check(deviceProfile.deviceProperties.isTablet) { - "Default position available only for large screens" - } + check(deviceProfile.isTablet) { "Default position available only for large screens" } return if (deviceProfile.isLeftRightSplit) { SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT } else { diff --git a/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.kt b/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.kt index 7313eebe8f..a7bc93b3d4 100644 --- a/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.kt +++ b/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.kt @@ -31,10 +31,10 @@ import com.android.launcher3.touch.PagedOrientationHandler import com.android.launcher3.touch.PagedOrientationHandler.Float2DAction import com.android.launcher3.touch.PagedOrientationHandler.Int2DAction import com.android.launcher3.touch.SingleAxisSwipeDetector +import com.android.launcher3.util.SplitConfigurationOptions import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption import com.android.launcher3.util.SplitConfigurationOptions.StagePosition import com.android.quickstep.views.IconAppChipView -import com.android.wm.shell.shared.split.SplitBounds /** * Abstraction layer to separate horizontal and vertical specific implementations for @@ -50,8 +50,6 @@ interface RecentsPagedOrientationHandler : PagedOrientationHandler { fun getPrimarySize(rect: RectF): Float - fun getSecondarySize(rect: RectF): Float - val secondaryTranslationDirectionFactor: Int val degreesRotated: Float @@ -175,7 +173,7 @@ interface RecentsPagedOrientationHandler : PagedOrientationHandler { fun setSplitTaskSwipeRect( dp: DeviceProfile, outRect: Rect, - splitInfo: SplitBounds, + splitInfo: SplitConfigurationOptions.SplitBounds, @StagePosition desiredStagePosition: Int, ) @@ -184,7 +182,7 @@ interface RecentsPagedOrientationHandler : PagedOrientationHandler { secondarySnapshot: View, parentWidth: Int, parentHeight: Int, - splitBoundsConfig: SplitBounds, + splitBoundsConfig: SplitConfigurationOptions.SplitBounds, dp: DeviceProfile, isRtl: Boolean, inSplitSelection: Boolean, @@ -198,7 +196,7 @@ interface RecentsPagedOrientationHandler : PagedOrientationHandler { */ fun getGroupedTaskViewSizes( dp: DeviceProfile, - splitBoundsConfig: SplitBounds, + splitBoundsConfig: SplitConfigurationOptions.SplitBounds, parentWidth: Int, parentHeight: Int, ): Pair @@ -238,7 +236,7 @@ interface RecentsPagedOrientationHandler : PagedOrientationHandler { groupedTaskViewWidth: Int, isRtl: Boolean, deviceProfile: DeviceProfile, - splitConfig: SplitBounds, + splitConfig: SplitConfigurationOptions.SplitBounds, inSplitSelection: Boolean, oneIconHiddenDueToSmallWidth: Boolean, ) @@ -266,10 +264,6 @@ interface RecentsPagedOrientationHandler : PagedOrientationHandler { taskViewIcon: View, ): Float - fun getAppChipMenuMarginX(appChipView: IconAppChipView, isRtl: Boolean): Int - - fun getAppChipMenuMarginY(appChipView: IconAppChipView, isRtl: Boolean): Int - fun getTaskMenuWidth( thumbnailView: View, deviceProfile: DeviceProfile, @@ -324,7 +318,7 @@ interface RecentsPagedOrientationHandler : PagedOrientationHandler { fun getDwbBannerTranslations( taskViewWidth: Int, taskViewHeight: Int, - splitBounds: SplitBounds?, + splitBounds: SplitConfigurationOptions.SplitBounds?, deviceProfile: DeviceProfile, thumbnailViews: Array, desiredTaskId: Int, @@ -357,12 +351,6 @@ interface RecentsPagedOrientationHandler : PagedOrientationHandler { /** @return the length to drag a task to full screen for launch. */ fun getTaskLaunchLength(secondaryDimension: Int, taskThumbnailBounds: Rect): Int - /** Extends the provided rect to account for task dismiss primary translation. */ - fun extendRectForPrimaryTranslation(rect: Rect, translation: Int) - - /** Extends the provided rect to account for task dismiss secondary translation. */ - fun extendRectForSecondaryTranslation(rect: Rect, translation: Int) - /** * Maps the velocity from the coordinate plane of the foreground app to that of Launcher's * (which now will always be portrait) diff --git a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt index 386ea5c22c..456115fdca 100644 --- a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt +++ b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt @@ -25,26 +25,24 @@ import android.view.Gravity import android.view.Surface import android.view.View import android.view.View.MeasureSpec -import android.view.ViewGroup import android.widget.FrameLayout import androidx.core.util.component1 import androidx.core.util.component2 -import androidx.core.view.marginStart import androidx.core.view.updateLayoutParams import com.android.launcher3.DeviceProfile +import com.android.launcher3.Flags import com.android.launcher3.R import com.android.launcher3.Utilities import com.android.launcher3.logger.LauncherAtom import com.android.launcher3.touch.SingleAxisSwipeDetector -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED import com.android.launcher3.util.SplitConfigurationOptions.STAGE_TYPE_MAIN +import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption import com.android.launcher3.views.BaseDragLayer import com.android.quickstep.views.IconAppChipView -import com.android.wm.shell.shared.split.SplitBounds class SeascapePagedViewHandler : LandscapePagedViewHandler() { override fun rotateInsets(insets: Rect, outInsets: Rect) { @@ -73,13 +71,7 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { deviceProfile: DeviceProfile, taskInsetMargin: Float, taskViewIcon: View, - ): Float = - if (enableOverviewIconMenu()) { - taskViewIcon as IconAppChipView - x - taskViewIcon.menuToCollapsedChipGap - } else { - x + taskInsetMargin - } + ): Float = x + taskInsetMargin override fun getTaskMenuY( y: Float, @@ -89,9 +81,8 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { taskInsetMargin: Float, taskViewIcon: View, ): Float { - if (enableOverviewIconMenu()) { - val marginStart = (taskViewIcon as IconAppChipView).backgroundMarginTopStart - return if (taskMenuView.isLayoutRtl) y + marginStart else y - marginStart + if (Flags.enableOverviewIconMenu()) { + return y } val lp = taskMenuView.layoutParams as BaseDragLayer.LayoutParams val taskMenuWidth = lp.width @@ -102,18 +93,12 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { } } - override fun getAppChipMenuMarginX(appChipView: IconAppChipView, isRtl: Boolean): Int = - -appChipView.menuToCollapsedChipGap - - override fun getAppChipMenuMarginY(appChipView: IconAppChipView, isRtl: Boolean): Int = - if (isRtl) -appChipView.backgroundMarginTopStart else appChipView.backgroundMarginTopStart - override fun getTaskMenuHeight( taskInsetMargin: Float, deviceProfile: DeviceProfile, taskMenuX: Float, taskMenuY: Float, - ): Int = (deviceProfile.deviceProperties.availableWidthPx - taskInsetMargin - taskMenuX).toInt() + ): Int = (deviceProfile.availableWidthPx - taskInsetMargin - taskMenuX).toInt() override fun setSplitTaskSwipeRect( dp: DeviceProfile, @@ -152,7 +137,7 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { if (isGroupedTaskView) { snapshotViewHeight } else { - taskViewHeight - deviceProfile.overviewProfile.taskThumbnailTopMarginPx + taskViewHeight - deviceProfile.overviewTaskThumbnailTopMarginPx } } } @@ -166,7 +151,7 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { desiredTaskId: Int, banner: View, ): Pair { - val snapshotParams = thumbnailViews[0].layoutParams as ViewGroup.MarginLayoutParams + val snapshotParams = thumbnailViews[0].layoutParams as FrameLayout.LayoutParams val translationX: Float = (taskViewWidth - banner.height).toFloat() val translationY: Float if (splitBounds == null) { @@ -187,7 +172,7 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { } override fun getDistanceToBottomOfRect(dp: DeviceProfile, rect: Rect): Int = - dp.deviceProperties.widthPx - rect.right + dp.widthPx - rect.right override fun getSplitPositionOptions(dp: DeviceProfile): List = // Add "right" option which is actually the top @@ -299,12 +284,12 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { val secondaryParams = secondarySnapshot.layoutParams as FrameLayout.LayoutParams // Swap the margins that are set in TaskView#setRecentsOrientedState() - secondaryParams.topMargin = dp.overviewProfile.taskThumbnailTopMarginPx + secondaryParams.topMargin = dp.overviewTaskThumbnailTopMarginPx primaryParams.topMargin = 0 // Measure and layout the thumbnails bottom up, since the primary is on the visual left // (portrait bottom) and secondary is on the right (portrait top) - val spaceAboveSnapshot = dp.overviewProfile.taskThumbnailTopMarginPx + val spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx val totalThumbnailHeight = parentHeight - spaceAboveSnapshot val dividerBar = getDividerBarSize(totalThumbnailHeight, splitBoundsConfig) @@ -331,7 +316,7 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { ): Pair { // Measure and layout the thumbnails bottom up, since the primary is on the visual left // (portrait bottom) and secondary is on the right (portrait top) - val spaceAboveSnapshot = dp.overviewProfile.taskThumbnailTopMarginPx + val spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx val totalThumbnailHeight = parentHeight - spaceAboveSnapshot val dividerBar = getDividerBarSize(totalThumbnailHeight, splitBoundsConfig) @@ -378,7 +363,7 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { dividerSize: Int, oneIconHiddenDueToSmallWidth: Boolean, ): SplitIconPositions { - return if (enableOverviewIconMenu()) { + return if (Flags.enableOverviewIconMenu()) { if (isRtl) { SplitIconPositions( topLeftY = totalThumbnailHeight - primarySnapshotHeight, @@ -420,7 +405,7 @@ class SeascapePagedViewHandler : LandscapePagedViewHandler() { override fun updateSplitIconsPosition(iconView: View, translationY: Int, isRtl: Boolean) { val layoutParams = iconView.layoutParams as FrameLayout.LayoutParams - if (enableOverviewIconMenu()) { + if (Flags.enableOverviewIconMenu()) { val appChipView = iconView as IconAppChipView layoutParams.gravity = if (isRtl) Gravity.TOP or Gravity.START else Gravity.BOTTOM or Gravity.END diff --git a/quickstep/src/com/android/quickstep/recents/data/RecentTasksRepository.kt b/quickstep/src/com/android/quickstep/recents/data/RecentTasksRepository.kt index f7b1674443..53969c5219 100644 --- a/quickstep/src/com/android/quickstep/recents/data/RecentTasksRepository.kt +++ b/quickstep/src/com/android/quickstep/recents/data/RecentTasksRepository.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.Flow interface RecentTasksRepository { /** Gets all the recent tasks, refreshing from data sources if [forceRefresh] is true. */ - fun getAllTaskData(displayId: Int, forceRefresh: Boolean = false): Flow> + fun getAllTaskData(forceRefresh: Boolean = false): Flow> /** * Gets the data associated with a task that has id [taskId]. Flow will settle on null if the @@ -46,5 +46,5 @@ interface RecentTasksRepository { * Sets the tasks that are visible, indicating that properties relating to visuals need to be * populated e.g. icons/thumbnails etc. */ - fun setVisibleTasks(displayId: Int, visibleTaskIdList: Set) + fun setVisibleTasks(visibleTaskIdList: Set) } diff --git a/quickstep/src/com/android/quickstep/recents/data/RecentsDeviceProfileRepositoryImpl.kt b/quickstep/src/com/android/quickstep/recents/data/RecentsDeviceProfileRepositoryImpl.kt index 5397638ce1..8450f09cea 100644 --- a/quickstep/src/com/android/quickstep/recents/data/RecentsDeviceProfileRepositoryImpl.kt +++ b/quickstep/src/com/android/quickstep/recents/data/RecentsDeviceProfileRepositoryImpl.kt @@ -29,7 +29,7 @@ class RecentsDeviceProfileRepositoryImpl(private val container: RecentsViewConta override fun getRecentsDeviceProfile() = with(container.deviceProfile) { RecentsDeviceProfile( - isLargeScreen = deviceProperties.isTablet, + isLargeScreen = isTablet, canEnterDesktopMode = DesktopModeStatus.canEnterDesktopMode(container.asContext()), ) } diff --git a/quickstep/src/com/android/quickstep/recents/data/TasksRepository.kt b/quickstep/src/com/android/quickstep/recents/data/TasksRepository.kt index 74aaeff09b..5274ef3266 100644 --- a/quickstep/src/com/android/quickstep/recents/data/TasksRepository.kt +++ b/quickstep/src/com/android/quickstep/recents/data/TasksRepository.kt @@ -18,8 +18,6 @@ package com.android.quickstep.recents.data import android.graphics.drawable.Drawable import android.util.Log -import android.util.SparseArray -import androidx.core.util.valueIterator import com.android.launcher3.util.coroutines.DispatcherProvider import com.android.quickstep.recents.data.TaskVisualsChangedDelegate.TaskIconChangedCallback import com.android.quickstep.recents.data.TaskVisualsChangedDelegate.TaskThumbnailChangedCallback @@ -48,36 +46,33 @@ class TasksRepository( private val dispatcherProvider: DispatcherProvider, ) : RecentTasksRepository { private val tasks = MutableStateFlow(MapForStateFlow(emptyMap())) - private var visibleTaskIdsPerDisplay = SparseArray>() private val taskRequests = HashMap>() - override fun getAllTaskData(displayId: Int, forceRefresh: Boolean): Flow> { - if (!visibleTaskIdsPerDisplay.contains(displayId)) { - visibleTaskIdsPerDisplay.put(displayId, emptySet()) - } + override fun getAllTaskData(forceRefresh: Boolean): Flow> { if (forceRefresh) { recentsModel.getTasks { newTaskList -> val recentTasks = - newTaskList.flatMap { groupTask -> groupTask.tasks }.associateBy { it.key.id } + newTaskList + .flatMap { groupTask -> groupTask.tasks } + .associateBy { it.key.id } + .also { newTaskMap -> + // Clean tasks that are not in the latest group tasks list. + val tasksNoLongerVisible = tasks.value.keys.subtract(newTaskMap.keys) + removeTasks(tasksNoLongerVisible) + } Log.d( TAG, "getAllTaskData: oldTasks ${tasks.value.keys}, newTasks: ${recentTasks.keys}", ) - tasks.update { oldTaskList -> - // Copy retrieved visuals to new Task objects - recentTasks.forEach { (taskId, task) -> - task.thumbnail = oldTaskList[taskId]?.thumbnail - task.icon = oldTaskList[taskId]?.icon - task.title = oldTaskList[taskId]?.title - task.titleDescription = oldTaskList[taskId]?.titleDescription - } - MapForStateFlow(recentTasks) - } + tasks.value = MapForStateFlow(recentTasks) - updateTaskRequests() + // Request data for tasks to prevent stale data. + // This will prevent thumbnail and icon from being replaced and null due to + // race condition. The new request will hit the cache and return immediately. + taskRequests.keys.forEach(::requestTaskData) } } - return tasks.map { it.values.filter { it.key.displayId == displayId }.toList() } + return tasks.map { it.values.toList() } } override fun getTaskDataById(taskId: Int) = tasks.map { it[taskId] } @@ -87,45 +82,30 @@ class TasksRepository( override fun getCurrentThumbnailById(taskId: Int) = tasks.value[taskId]?.thumbnail - override fun setVisibleTasks(displayId: Int, visibleTaskIdList: Set) { - if (visibleTaskIdList.isEmpty()) { - visibleTaskIdsPerDisplay.remove(displayId) - } else { - visibleTaskIdsPerDisplay.put(displayId, visibleTaskIdList) - } - updateTaskRequests() - } - - @Synchronized - private fun updateTaskRequests() { - val allVisibleTaskIds = - visibleTaskIdsPerDisplay.valueIterator().asSequence().flatMap { it }.toSet() - val requestsNeeded = allVisibleTaskIds.intersect(tasks.value.keys) - - val taskRequestIds = taskRequests.keys - val requestsNoLongerNeeded = taskRequestIds.subtract(requestsNeeded) - val newlyRequestedTasks = requestsNeeded.subtract(taskRequestIds) - if (requestsNoLongerNeeded.isNotEmpty() || newlyRequestedTasks.isNotEmpty()) { + override fun setVisibleTasks(visibleTaskIdList: Set) { + val tasksNoLongerVisible = taskRequests.keys.subtract(visibleTaskIdList) + val newlyVisibleTasks = visibleTaskIdList.subtract(taskRequests.keys) + if (tasksNoLongerVisible.isNotEmpty() || newlyVisibleTasks.isNotEmpty()) { Log.d( TAG, - "updateTaskRequests to: $requestsNeeded, " + - "removed: $requestsNoLongerNeeded, added: $newlyRequestedTasks", + "setVisibleTasks to: $visibleTaskIdList, " + + "removed: $tasksNoLongerVisible, added: $newlyVisibleTasks", ) } // Remove tasks are no longer visible - removeTasks(requestsNoLongerNeeded) + removeTasks(tasksNoLongerVisible) // Add new tasks to be requested - newlyRequestedTasks.forEach { taskId -> requestTaskData(taskId) } + newlyVisibleTasks.forEach { taskId -> requestTaskData(taskId) } } private fun requestTaskData(taskId: Int) { val task = tasks.value[taskId] ?: return - Log.i(TAG, "requestTaskData: $taskId") taskRequests[taskId] = Pair( task.key, - recentsCoroutineScope.launch(dispatcherProvider.lightweightBackground) { + recentsCoroutineScope.launch(dispatcherProvider.background) { + Log.i(TAG, "requestTaskData: $taskId") val thumbnailFetchDeferred = async { fetchThumbnail(task) } val iconFetchDeferred = async { fetchIcon(task) } awaitAll(thumbnailFetchDeferred, iconFetchDeferred) @@ -137,35 +117,33 @@ class TasksRepository( if (tasksToRemove.isEmpty()) return Log.i(TAG, "removeTasks: $tasksToRemove") - tasks.update { currentTasks -> - tasksToRemove.forEach { taskId -> - val request = taskRequests.remove(taskId) ?: return@forEach - val (taskKey, job) = request - job.cancel() + tasksToRemove.forEach { taskId -> + val request = taskRequests.remove(taskId) ?: return + val (taskKey, job) = request + job.cancel() - // un-registering callbacks - taskVisualsChangedDelegate.unregisterTaskIconChangedCallback(taskKey) - taskVisualsChangedDelegate.unregisterTaskThumbnailChangedCallback(taskKey) + // un-registering callbacks + taskVisualsChangedDelegate.unregisterTaskIconChangedCallback(taskKey) + taskVisualsChangedDelegate.unregisterTaskThumbnailChangedCallback(taskKey) - // Clearing Task to reduce memory footprint - currentTasks[taskId]?.apply { - thumbnail = null - icon = null - title = null - titleDescription = null - } + // Clearing Task to reduce memory footprint + tasks.value[taskId]?.apply { + thumbnail = null + icon = null + title = null + titleDescription = null } - MapForStateFlow(currentTasks) } + tasks.update { oldValue -> MapForStateFlow(oldValue) } } private suspend fun fetchIcon(task: Task) { - updateIcon(task.key.id, getIconFromDataSource(task)) + updateIcon(task.key.id, getIconFromDataSource(task)) // Fetch icon from cache taskVisualsChangedDelegate.registerTaskIconChangedCallback( task.key, object : TaskIconChangedCallback { override fun onTaskIconChanged() { - recentsCoroutineScope.launch(dispatcherProvider.lightweightBackground) { + recentsCoroutineScope.launch(dispatcherProvider.background) { updateIcon(task.key.id, getIconFromDataSource(task)) } } @@ -193,7 +171,7 @@ class TasksRepository( (isCurrentThumbnailLowRes && highResEnabled) if (!isRequestedResHigherThanCurrent) return - recentsCoroutineScope.launch(dispatcherProvider.lightweightBackground) { + recentsCoroutineScope.launch(dispatcherProvider.background) { updateThumbnail(task.key.id, getThumbnailFromDataSource(task)) } } @@ -202,30 +180,24 @@ class TasksRepository( } private fun updateIcon(taskId: Int, iconData: IconData) { - tasks.update { currentTasks -> - currentTasks[taskId]?.apply { - icon = iconData.icon - titleDescription = iconData.contentDescription - title = iconData.title - } - MapForStateFlow(currentTasks) - } + val task = tasks.value[taskId] ?: return + task.icon = iconData.icon + task.titleDescription = iconData.contentDescription + task.title = iconData.title + tasks.update { oldValue -> MapForStateFlow(oldValue + (taskId to task)) } } private fun updateThumbnail(taskId: Int, thumbnail: ThumbnailData?) { - tasks.update { currentTasks -> - currentTasks[taskId]?.thumbnail = thumbnail - MapForStateFlow(currentTasks) - } + val task = tasks.value[taskId] ?: return + task.thumbnail = thumbnail + tasks.update { oldValue -> MapForStateFlow(oldValue + (taskId to task)) } } private suspend fun getThumbnailFromDataSource(task: Task) = - withContext(dispatcherProvider.lightweightBackground) { - taskThumbnailDataSource.getThumbnail(task) - } + withContext(dispatcherProvider.background) { taskThumbnailDataSource.getThumbnail(task) } private suspend fun getIconFromDataSource(task: Task) = - withContext(dispatcherProvider.lightweightBackground) { + withContext(dispatcherProvider.background) { val iconCacheEntry = taskIconDataSource.getIcon(task) IconData(iconCacheEntry.icon, iconCacheEntry.contentDescription, iconCacheEntry.title) } diff --git a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt index da235eef51..00ef13bf0d 100644 --- a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt +++ b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt @@ -19,12 +19,12 @@ package com.android.quickstep.recents.di import android.content.Context import android.util.Log import com.android.launcher3.util.coroutines.DispatcherProvider +import com.android.launcher3.util.coroutines.ProductionDispatchers import com.android.quickstep.RecentsModel import com.android.quickstep.recents.data.RecentTasksRepository import com.android.quickstep.recents.data.TaskVisualsChangedDelegate import com.android.quickstep.recents.data.TaskVisualsChangedDelegateImpl import com.android.quickstep.recents.data.TasksRepository -import com.android.quickstep.recents.domain.usecase.GetRemainingAppTimerDurationUseCase import com.android.quickstep.recents.domain.usecase.GetSysUiStatusNavFlagsUseCase import com.android.quickstep.recents.domain.usecase.GetTaskUseCase import com.android.quickstep.recents.domain.usecase.GetThumbnailPositionUseCase @@ -38,14 +38,11 @@ import kotlinx.coroutines.SupervisorJob internal typealias RecentsScopeId = String -fun Any.toScopeId(): String = this as? RecentsScopeId ?: this.hashCode().toString() - -class RecentsDependencies -private constructor(appContext: Context, dispatcherProvider: DispatcherProvider) { +class RecentsDependencies private constructor(appContext: Context) { private val scopes = mutableMapOf() init { - startDefaultScope(appContext, dispatcherProvider) + startDefaultScope(appContext) } /** @@ -53,10 +50,11 @@ private constructor(appContext: Context, dispatcherProvider: DispatcherProvider) * are global while others are per-RecentsView. The scope is used to differentiate between * RecentsViews. */ - private fun startDefaultScope(appContext: Context, dispatcherProvider: DispatcherProvider) { + private fun startDefaultScope(appContext: Context) { Log.d(TAG, "startDefaultScope") createScope(DEFAULT_SCOPE_ID).apply { set(RecentsViewData::class.java.simpleName, RecentsViewData()) + val dispatcherProvider: DispatcherProvider = ProductionDispatchers val recentsCoroutineScope = CoroutineScope( SupervisorJob() + dispatcherProvider.unconfined + CoroutineName("RecentsView") @@ -80,7 +78,7 @@ private constructor(appContext: Context, dispatcherProvider: DispatcherProvider) iconCache, taskVisualsChangedDelegate, recentsCoroutineScope, - dispatcherProvider, + ProductionDispatchers, ) } set(RecentTasksRepository::class.java.simpleName, recentTasksRepository) @@ -94,7 +92,7 @@ private constructor(appContext: Context, dispatcherProvider: DispatcherProvider) * @return the scope id associated with the new RecentsDependenciesScope. */ fun createRecentsViewScope(viewContext: Context): String { - val scopeId = viewContext.toScopeId() + val scopeId = viewContext.hashCode().toString() Log.d(TAG, "createRecentsViewScope $scopeId") val scope = createScope(scopeId).apply { @@ -170,13 +168,16 @@ private constructor(appContext: Context, dispatcherProvider: DispatcherProvider) return instance } - fun getScope(scope: Any) = getScope(scope.toScopeId()) + fun getScope(scope: Any): RecentsDependenciesScope { + val scopeId: RecentsScopeId = scope as? RecentsScopeId ?: scope.hashCode().toString() + return getScope(scopeId) + } fun getScope(scopeId: RecentsScopeId): RecentsDependenciesScope = scopes[scopeId] ?: createScope(scopeId) fun removeScope(scope: Any) { - val scopeId = scope.toScopeId() + val scopeId: RecentsScopeId = scope as? RecentsScopeId ?: scope.hashCode().toString() scopes[scopeId]?.close() scopes.remove(scopeId) log("Scope $scopeId removed") @@ -196,13 +197,7 @@ private constructor(appContext: Context, dispatcherProvider: DispatcherProvider) when (modelClass) { IsThumbnailValidUseCase::class.java -> IsThumbnailValidUseCase(rotationStateRepository = inject(scopeId)) - GetRemainingAppTimerDurationUseCase::class.java -> - GetRemainingAppTimerDurationUseCase(appTimersRepository = inject(scopeId)) - GetTaskUseCase::class.java -> - GetTaskUseCase( - tasksRepository = inject(scopeId), - getRemainingAppTimerDurationUseCase = inject(scopeId), - ) + GetTaskUseCase::class.java -> GetTaskUseCase(repository = inject(scopeId)) GetSysUiStatusNavFlagsUseCase::class.java -> GetSysUiStatusNavFlagsUseCase() GetThumbnailPositionUseCase::class.java -> GetThumbnailPositionUseCase( @@ -247,25 +242,17 @@ private constructor(appContext: Context, dispatcherProvider: DispatcherProvider) @Volatile private var instance: RecentsDependencies? = null - private fun initialize( - context: Context, - dispatcherProvider: DispatcherProvider, - ): RecentsDependencies { + private fun initialize(context: Context): RecentsDependencies { Log.d(TAG, "initializing") synchronized(this) { - val newInstance = - RecentsDependencies(context.applicationContext, dispatcherProvider) + val newInstance = RecentsDependencies(context.applicationContext) instance = newInstance return newInstance } } - @JvmStatic - fun maybeInitialize( - context: Context, - dispatcherProvider: DispatcherProvider, - ): RecentsDependencies { - return instance ?: initialize(context, dispatcherProvider) + fun maybeInitialize(context: Context): RecentsDependencies { + return instance ?: initialize(context) } fun getInstance(): RecentsDependencies { @@ -280,7 +267,7 @@ private constructor(appContext: Context, dispatcherProvider: DispatcherProvider) fun destroy(viewContext: Context) { synchronized(this) { val localInstance = instance ?: return - val scopeId = viewContext.toScopeId() + val scopeId = viewContext.hashCode().toString() val scope = localInstance.scopes[scopeId] if (scope == null) { Log.e( @@ -303,12 +290,6 @@ private constructor(appContext: Context, dispatcherProvider: DispatcherProvider) } } } - - fun hasScope(scope: Any) = - synchronized(this) { - val localInstance = instance ?: return false - localInstance.scopes.containsKey(scope.toScopeId()) - } } } @@ -323,7 +304,8 @@ inline fun RecentsDependencies.Companion.get( extras: RecentsDependenciesExtras = RecentsDependenciesExtras(), noinline factory: ((extras: RecentsDependenciesExtras) -> T)? = null, ): T { - return getInstance().inject(scope.toScopeId(), extras, factory) + val scopeId: RecentsScopeId = scope as? RecentsScopeId ?: scope.hashCode().toString() + return getInstance().inject(scopeId, extras, factory) } inline fun RecentsDependencies.Companion.get( diff --git a/quickstep/src/com/android/quickstep/recents/domain/model/TaskModel.kt b/quickstep/src/com/android/quickstep/recents/domain/model/TaskModel.kt index 05959e1138..bf29b1d692 100644 --- a/quickstep/src/com/android/quickstep/recents/domain/model/TaskModel.kt +++ b/quickstep/src/com/android/quickstep/recents/domain/model/TaskModel.kt @@ -18,7 +18,6 @@ package com.android.quickstep.recents.domain.model import android.graphics.drawable.Drawable import com.android.systemui.shared.recents.model.ThumbnailData -import java.time.Duration /** * Data class representing a task in the application. @@ -27,7 +26,6 @@ import java.time.Duration * title, associated icon, optional thumbnail data, and background color. * * @property id The unique identifier for this task. Must be an integer. - * @property packageName top activity package for the task's app * @property title The display title of the task. * @property titleDescription A content description of the task. * @property icon An optional drawable resource representing an icon for the task. Can be null if no @@ -37,20 +35,15 @@ import java.time.Duration * @property backgroundColor The background color of the task, represented as an integer color * value. * @property isLocked Indicates whether the [Task] is locked. - * @property isMinimized Indicates whether the [Task] is minimized. - * @property remainingAppDuration time remaining on the app timer for the application. */ data class TaskModel( val id: TaskId, - val packageName: String, val title: String?, val titleDescription: String?, val icon: Drawable?, val thumbnail: ThumbnailData?, val backgroundColor: Int, val isLocked: Boolean, - val isMinimized: Boolean, - val remainingAppDuration: Duration?, ) typealias TaskId = Int diff --git a/quickstep/src/com/android/quickstep/recents/domain/usecase/GetTaskUseCase.kt b/quickstep/src/com/android/quickstep/recents/domain/usecase/GetTaskUseCase.kt index 72d4ca65ab..a60144ba38 100644 --- a/quickstep/src/com/android/quickstep/recents/domain/usecase/GetTaskUseCase.kt +++ b/quickstep/src/com/android/quickstep/recents/domain/usecase/GetTaskUseCase.kt @@ -16,46 +16,26 @@ package com.android.quickstep.recents.domain.usecase -import android.os.UserHandle -import com.android.launcher3.Flags.enableRefactorDigitalWellbeingToast import com.android.quickstep.recents.data.RecentTasksRepository import com.android.quickstep.recents.domain.model.TaskModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class GetTaskUseCase( - private val tasksRepository: RecentTasksRepository, - private val getRemainingAppTimerDurationUseCase: GetRemainingAppTimerDurationUseCase, -) { +class GetTaskUseCase(private val repository: RecentTasksRepository) { operator fun invoke(taskId: Int): Flow = - tasksRepository.getTaskDataById(taskId).map { task -> - if (task == null) return@map null - - val packageName = task.topComponent.packageName - - // TODO(b/405359794): If getTask for a single task ends up being called multiple - // times by the UI, explore alternatives of loading the timer info only once. - val remainingDuration = - if (enableRefactorDigitalWellbeingToast()) { - getRemainingAppTimerDurationUseCase( - packageName = packageName, - userHandle = UserHandle(task.key.userId), - ) - } else { - null - } - - TaskModel( - id = task.key.id, - packageName = packageName, - title = task.title, - titleDescription = task.titleDescription, - icon = task.icon, - thumbnail = task.thumbnail, - backgroundColor = task.colorBackground, - isLocked = task.isLocked, - isMinimized = task.isMinimized, - remainingAppDuration = remainingDuration, - ) + repository.getTaskDataById(taskId).map { task -> + if (task != null) { + TaskModel( + id = task.key.id, + title = task.title, + titleDescription = task.titleDescription, + icon = task.icon, + thumbnail = task.thumbnail, + backgroundColor = task.colorBackground, + isLocked = task.isLocked, + ) + } else { + null + } } } diff --git a/quickstep/src/com/android/quickstep/recents/domain/usecase/OrganizeDesktopTasksUseCase.kt b/quickstep/src/com/android/quickstep/recents/domain/usecase/OrganizeDesktopTasksUseCase.kt index 869677149f..4ea39d816e 100644 --- a/quickstep/src/com/android/quickstep/recents/domain/usecase/OrganizeDesktopTasksUseCase.kt +++ b/quickstep/src/com/android/quickstep/recents/domain/usecase/OrganizeDesktopTasksUseCase.kt @@ -19,7 +19,6 @@ package com.android.quickstep.recents.domain.usecase import android.graphics.Rect import android.graphics.RectF import androidx.core.graphics.toRect -import com.android.quickstep.recents.domain.model.DesktopLayoutConfig import com.android.quickstep.recents.domain.model.DesktopTaskBoundsData /** This usecase is responsible for organizing desktop windows in a non-overlapping way. */ @@ -34,10 +33,9 @@ class OrganizeDesktopTasksUseCase { * row height which is equivalent assuming fixed height), balanced rows and minimal wasted * space. */ - operator fun invoke( + fun run( desktopBounds: Rect, taskBounds: List, - layoutConfig: DesktopLayoutConfig, ): List { if (desktopBounds.isEmpty || taskBounds.isEmpty()) { return emptyList() @@ -50,43 +48,13 @@ class OrganizeDesktopTasksUseCase { return emptyList() } - // Assuming we can place all windows in one row, do one pass first to check whether all - // windows can fit. - var availableLayoutBounds = - desktopBounds.getLayoutEffectiveBounds( - singleRow = true, - taskNumber = taskBounds.size, - layoutConfig, - ) - var resultRects = - findOptimalHeightAndBalancedWidth( - availableLayoutBounds, - validTaskBounds, - layoutConfig, - singleRow = true, - ) - - if (!canFitInOneRow(resultRects)) { - availableLayoutBounds = - desktopBounds.getLayoutEffectiveBounds( - singleRow = true, - taskNumber = taskBounds.size, - layoutConfig, - ) - resultRects = - findOptimalHeightAndBalancedWidth( - availableLayoutBounds, - validTaskBounds, - layoutConfig, - singleRow = true, - ) - } + val availableLayoutBounds = desktopBounds.getLayoutEffectiveBounds() + val resultRects = findOptimalHeightAndBalancedWidth(availableLayoutBounds, validTaskBounds) centerTaskWindows( availableLayoutBounds, resultRects.maxOf { it.bottom }.toInt(), resultRects, - layoutConfig, ) val result = mutableListOf() @@ -97,39 +65,8 @@ class OrganizeDesktopTasksUseCase { } /** Calculates the effective bounds for layout by applying insets to the raw desktop bounds. */ - private fun Rect.getLayoutEffectiveBounds( - singleRow: Boolean, - taskNumber: Int, - layoutConfig: DesktopLayoutConfig, - ) = - Rect(this).apply { - val topInset = - if (singleRow) layoutConfig.topBottomMarginOneRow - else layoutConfig.topMarginMultiRows - val bottomInset = - if (singleRow) layoutConfig.topBottomMarginOneRow - else layoutConfig.bottomMarginMultiRows - val leftInset = - if (singleRow && taskNumber <= 1) layoutConfig.leftRightMarginOneRow - else layoutConfig.leftRightMarginMultiRows - val rightInset = - if (singleRow && taskNumber <= 1) leftInset - else (leftInset - layoutConfig.horizontalPaddingBetweenTasks) - - inset(leftInset, topInset, rightInset, bottomInset) - } - - /** Calculates the maximum height for a task window in the desktop tile in Overview. */ - private fun getMaxTaskHeight( - effectiveLayoutBounds: Rect, - layoutConfig: DesktopLayoutConfig, - singleRow: Boolean, - ) = - if (singleRow) { - effectiveLayoutBounds.height() - } else { - effectiveLayoutBounds.height() - 2 * layoutConfig.verticalPaddingBetweenTasks - } + private fun Rect.getLayoutEffectiveBounds() = + Rect(this).apply { inset(OVERVIEW_INSET_TOP_BOTTOM, OVERVIEW_INSET_LEFT_RIGHT) } /** * Determines the optimal height for task windows and balances the row widths to minimize wasted @@ -138,8 +75,6 @@ class OrganizeDesktopTasksUseCase { private fun findOptimalHeightAndBalancedWidth( availableLayoutBounds: Rect, validTaskBounds: List, - layoutConfig: DesktopLayoutConfig, - singleRow: Boolean, ): List { // Right bound of the narrowest row. var minRight: Int @@ -157,7 +92,7 @@ class OrganizeDesktopTasksUseCase { // Determine the optimal height bisecting between [lowHeight] and [highHeight]. Once this // optimal height is known, [heightFixed] is set to `true` and the rows are balanced by // repeatedly squeezing the widest row to cause windows to overflow to the subsequent rows. - var lowHeight = layoutConfig.verticalPaddingBetweenTasks + var lowHeight = VERTICAL_SPACE_BETWEEN_TASKS var highHeight = maxOf(lowHeight, availableLayoutBounds.height() + 1) var optimalHeight = 0.5f * (lowHeight + highHeight) var heightFixed = false @@ -178,11 +113,7 @@ class OrganizeDesktopTasksUseCase { fitWindowRectsInBounds( Rect(availableLayoutBounds).apply { right = rightBound }, validTaskBounds, - minOf( - getMaxTaskHeight(availableLayoutBounds, layoutConfig, singleRow), - optimalHeight.toInt(), - ), - layoutConfig, + minOf(MAXIMUM_TASK_HEIGHT, optimalHeight.toInt()), ) val allWindowsFit = fitWindowResult.allWindowsFit resultRects = fitWindowResult.calculatedBounds @@ -237,11 +168,7 @@ class OrganizeDesktopTasksUseCase { fitWindowRectsInBounds( Rect(availableLayoutBounds).apply { right = rightBound }, validTaskBounds, - minOf( - getMaxTaskHeight(availableLayoutBounds, layoutConfig, singleRow), - optimalHeight.toInt(), - ), - layoutConfig, + minOf(MAXIMUM_TASK_HEIGHT, optimalHeight.toInt()), ) resultRects = fitWindowResult.calculatedBounds } @@ -272,14 +199,10 @@ class OrganizeDesktopTasksUseCase { layoutBounds: Rect, taskBounds: List, optimalWindowHeight: Int, - layoutConfig: DesktopLayoutConfig, ): FitWindowResult { val numTasks = taskBounds.size val outRects = mutableListOf() - val verticalPadding = layoutConfig.verticalPaddingBetweenTasks - val horizontalPadding = layoutConfig.horizontalPaddingBetweenTasks - // Start in the top-left corner of [layoutBounds]. var left = layoutBounds.left var top = layoutBounds.top @@ -296,9 +219,9 @@ class OrganizeDesktopTasksUseCase { // Use the height to calculate the width val scale = optimalWindowHeight / taskBounds.height().toFloat() val width = (taskBounds.width() * scale).toInt() - val optimalRowHeight = optimalWindowHeight + verticalPadding + val optimalRowHeight = optimalWindowHeight + VERTICAL_SPACE_BETWEEN_TASKS - if (left + width + horizontalPadding > layoutBounds.right) { + if ((left + width + HORIZONTAL_SPACE_BETWEEN_TASKS) > layoutBounds.right) { // Move to the next row if possible. minRight = minOf(minRight, left) maxRight = maxOf(maxRight, left) @@ -308,7 +231,8 @@ class OrganizeDesktopTasksUseCase { // row does not fit within the available width. if ( (top + optimalRowHeight) > layoutBounds.bottom || - layoutBounds.left + width + horizontalPadding > layoutBounds.right + layoutBounds.left + width + HORIZONTAL_SPACE_BETWEEN_TASKS > + layoutBounds.right ) { allWindowsFit = false break @@ -327,7 +251,7 @@ class OrganizeDesktopTasksUseCase { ) // Increment horizontal position. - left += (width + horizontalPadding) + left += (width + HORIZONTAL_SPACE_BETWEEN_TASKS) } // Update the narrowest and widest row width for the last row. @@ -338,12 +262,7 @@ class OrganizeDesktopTasksUseCase { } /** Centers task windows in the center of Overview. */ - private fun centerTaskWindows( - layoutBounds: Rect, - maxBottom: Int, - outWindowRects: List, - layoutConfig: DesktopLayoutConfig, - ) { + private fun centerTaskWindows(layoutBounds: Rect, maxBottom: Int, outWindowRects: List) { if (outWindowRects.isEmpty()) { return } @@ -352,14 +271,11 @@ class OrganizeDesktopTasksUseCase { var currentRowY = outWindowRects[0].top var currentRowFirstItemIndex = 0 val offsetY = (layoutBounds.bottom - maxBottom) / 2f - val horizontal_padding = - if (outWindowRects.size == 1) 0 else layoutConfig.horizontalPaddingBetweenTasks // Batch process to center overview desktop task windows within the same row. fun batchCenterDesktopTaskWindows(endIndex: Int) { // Calculate the shift amount required to center the desktop task items. - val rangeCenterX = - (currentRowUnionRange.left + currentRowUnionRange.right + horizontal_padding) / 2f + val rangeCenterX = (currentRowUnionRange.left + currentRowUnionRange.right) / 2f val currentDiffX = (layoutBounds.centerX() - rangeCenterX).coerceAtLeast(0f) for (j in currentRowFirstItemIndex until endIndex) { outWindowRects[j].offset(currentDiffX, offsetY) @@ -385,13 +301,11 @@ class OrganizeDesktopTasksUseCase { batchCenterDesktopTaskWindows(outWindowRects.size) } - /** Returns true if all task windows can fit in one row. */ - private fun canFitInOneRow(resultRect: List): Boolean { - if (resultRect.isEmpty()) { - return true - } - - val firstTop = resultRect.first().top - return resultRect.all { it.top == firstTop } + private companion object { + const val VERTICAL_SPACE_BETWEEN_TASKS = 24 + const val HORIZONTAL_SPACE_BETWEEN_TASKS = 24 + const val OVERVIEW_INSET_TOP_BOTTOM = 16 + const val OVERVIEW_INSET_LEFT_RIGHT = 16 + const val MAXIMUM_TASK_HEIGHT = 800 } } diff --git a/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt b/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt index e035015070..619075ff83 100644 --- a/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt +++ b/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt @@ -17,53 +17,17 @@ package com.android.quickstep.recents.ui.mapper import android.view.View.OnClickListener -import com.android.launcher3.Flags.enableDesktopExplodedView -import com.android.launcher3.R -import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT import com.android.quickstep.recents.ui.viewmodel.TaskData -import com.android.quickstep.task.apptimer.TaskAppTimerUiState -import com.android.quickstep.task.thumbnail.TaskHeaderUiState import com.android.quickstep.task.thumbnail.TaskThumbnailUiState import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.BackgroundOnly import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.LiveTile import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Snapshot import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.SnapshotSplash +import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.ThumbnailHeader import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized object TaskUiStateMapper { - /** - * Converts a [TaskData] object into a [TaskHeaderUiState] for display in the UI. - * - * This function handles different types of [TaskData] and determines the appropriate UI state - * based on the data and provided flags. - * - * @param taskData The [TaskData] to convert. Can be null or a specific subclass. - * @param hasHeader A flag indicating whether the UI should display a header. - * @param clickCloseListener A callback when the close button in the UI is clicked. - * @return A [TaskHeaderUiState] representing the UI state for the given task data. - */ - fun toTaskHeaderState( - taskData: TaskData?, - hasHeader: Boolean, - clickCloseListener: OnClickListener?, - ): TaskHeaderUiState = - when { - taskData !is TaskData.Data -> TaskHeaderUiState.HideHeader - canHeaderBeCreated(taskData, hasHeader, clickCloseListener) -> { - TaskHeaderUiState.ShowHeader( - TaskHeaderUiState.ThumbnailHeader( - // TODO(http://b/353965691): figure out what to do when `icon` or - // `titleDescription` is null. - taskData.icon!!, - taskData.titleDescription!!, - clickCloseListener!!, - ) - ) - } - else -> TaskHeaderUiState.HideHeader - } - /** * Converts a [TaskData] object into a [TaskThumbnailUiState] for display in the UI. * @@ -72,26 +36,48 @@ object TaskUiStateMapper { * * @param taskData The [TaskData] to convert. Can be null or a specific subclass. * @param isLiveTile A flag indicating whether the task data represents live tile. + * @param hasHeader A flag indicating whether the UI should display a header. + * @param clickCloseListener A callback when the close button in the UI is clicked. * @return A [TaskThumbnailUiState] representing the UI state for the given task data. */ - fun toTaskThumbnailUiState(taskData: TaskData?): TaskThumbnailUiState = + fun toTaskThumbnailUiState( + taskData: TaskData?, + isLiveTile: Boolean, + hasHeader: Boolean, + clickCloseListener: OnClickListener?, + ): TaskThumbnailUiState = when { taskData !is TaskData.Data -> Uninitialized - taskData.isLiveTile -> LiveTile + isLiveTile -> createLiveTileState(taskData, hasHeader, clickCloseListener) isBackgroundOnly(taskData) -> BackgroundOnly(taskData.backgroundColor) isSnapshotSplash(taskData) -> SnapshotSplash( - Snapshot( - taskData.thumbnailData?.thumbnail!!, - taskData.thumbnailData.rotation, - taskData.backgroundColor, - ), + createSnapshotState(taskData, hasHeader, clickCloseListener), taskData.icon, ) - else -> Uninitialized } + private fun createSnapshotState( + taskData: TaskData.Data, + hasHeader: Boolean, + clickCloseListener: OnClickListener?, + ): Snapshot = + if (canHeaderBeCreated(taskData, hasHeader, clickCloseListener)) { + Snapshot.WithHeader( + taskData.thumbnailData?.thumbnail!!, + taskData.thumbnailData.rotation, + taskData.backgroundColor, + ThumbnailHeader(taskData.icon!!, taskData.titleDescription!!, clickCloseListener!!), + ) + } else { + Snapshot.WithoutHeader( + taskData.thumbnailData?.thumbnail!!, + taskData.thumbnailData.rotation, + taskData.backgroundColor, + ) + } + private fun isBackgroundOnly(taskData: TaskData.Data) = taskData.isLocked || taskData.thumbnailData == null @@ -103,42 +89,21 @@ object TaskUiStateMapper { hasHeader: Boolean, clickCloseListener: OnClickListener?, ) = - enableDesktopExplodedView() && - hasHeader && + hasHeader && taskData.icon != null && taskData.titleDescription != null && clickCloseListener != null - /** - * Converts a [TaskData] object into a [TaskAppTimerUiState] for displaying an app timer toast - * - * @property taskData The [TaskData] to convert. Can be null or a specific sub-class. - * @property stagePosition the position of this task when shown as a group - * @return a [TaskAppTimerUiState] representing state for the information displayed in the app - * timer toast. - */ - fun toTaskAppTimerUiState( - canShowAppTimer: Boolean, - stagePosition: Int, - taskData: TaskData?, - ): TaskAppTimerUiState = - when { - taskData !is TaskData.Data -> TaskAppTimerUiState.Uninitialized - - !canShowAppTimer || taskData.remainingAppTimerDuration == null -> - TaskAppTimerUiState.NoTimer(taskDescription = taskData.titleDescription) - - else -> - TaskAppTimerUiState.Timer( - taskDescription = taskData.titleDescription, - timeRemaining = taskData.remainingAppTimerDuration, - taskPackageName = taskData.packageName, - accessibilityActionId = - if (stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT) { - R.id.action_digital_wellbeing_bottom_right - } else { - R.id.action_digital_wellbeing_top_left - }, - ) - } + private fun createLiveTileState( + taskData: TaskData.Data, + hasHeader: Boolean, + clickCloseListener: OnClickListener?, + ) = + if (canHeaderBeCreated(taskData, hasHeader, clickCloseListener)) { + // TODO(http://b/353965691): figure out what to do when `icon` or `titleDescription` is + // null. + LiveTile.WithHeader( + ThumbnailHeader(taskData.icon!!, taskData.titleDescription!!, clickCloseListener!!) + ) + } else LiveTile.WithoutHeader } diff --git a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/DesktopTaskViewModel.kt b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/DesktopTaskViewModel.kt index 4e0e9609d0..4de0b90045 100644 --- a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/DesktopTaskViewModel.kt +++ b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/DesktopTaskViewModel.kt @@ -18,7 +18,6 @@ package com.android.quickstep.recents.ui.viewmodel import android.graphics.Rect import android.util.Size -import com.android.quickstep.recents.domain.model.DesktopLayoutConfig import com.android.quickstep.recents.domain.model.DesktopTaskBoundsData import com.android.quickstep.recents.domain.usecase.OrganizeDesktopTasksUseCase @@ -35,18 +34,12 @@ class DesktopTaskViewModel(private val organizeDesktopTasksUseCase: OrganizeDesk * * @param desktopSize the size available for organizing the tasks. * @param defaultPositions the tasks and their bounds as they appear on a desktop. - * @param layoutConfig the pre-scaled dimension configuration for the desktop layout. */ - fun organizeDesktopTasks( - desktopSize: Size, - defaultPositions: List, - layoutConfig: DesktopLayoutConfig, - ) { + fun organizeDesktopTasks(desktopSize: Size, defaultPositions: List) { organizedDesktopTaskPositions = - organizeDesktopTasksUseCase( + organizeDesktopTasksUseCase.run( desktopBounds = Rect(0, 0, desktopSize.width, desktopSize.height), taskBounds = defaultPositions, - layoutConfig = layoutConfig, ) } } diff --git a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt index ad6024a1cf..863d30b2e4 100644 --- a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt +++ b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt @@ -18,7 +18,6 @@ package com.android.quickstep.recents.ui.viewmodel import android.graphics.drawable.Drawable import com.android.systemui.shared.recents.model.ThumbnailData -import java.time.Duration /** * This class represents the UI state to be consumed by TaskView, GroupTaskView and DesktopTaskView. @@ -34,6 +33,7 @@ import java.time.Duration */ data class TaskTileUiState( val tasks: List, + val isLiveTile: Boolean, val hasHeader: Boolean, val sysUiStatusNavFlags: Int, val taskOverlayEnabled: Boolean, @@ -50,26 +50,20 @@ sealed class TaskData { * This class provides UI information related to a Task (App) to be displayed within a TaskView. * * @property taskId Identifier of the task - * @property packageName package name for the task * @property title App title * @property titleDescription App content description * @property icon App icon * @property thumbnailData Information related to the last snapshot retrieved from the app * @property backgroundColor The background color of the task. * @property isLocked Indicates whether the task is locked or not. - * @property isLiveTile Indicates whether the task is shown with a live tile or not. - * @property remainingAppTimerDuration time remaining on the app timer for the application. */ data class Data( override val taskId: Int, - val packageName: String, val title: String?, val titleDescription: String?, val icon: Drawable?, val thumbnailData: ThumbnailData?, val backgroundColor: Int, val isLocked: Boolean, - val isLiveTile: Boolean, - val remainingAppTimerDuration: Duration?, ) : TaskData() } diff --git a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt index 8e67c10e6c..fac0c0a0bb 100644 --- a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt +++ b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt @@ -19,7 +19,6 @@ package com.android.quickstep.recents.ui.viewmodel import android.annotation.ColorInt import android.util.Log import androidx.core.graphics.ColorUtils -import com.android.launcher3.Flags.enableCoroutineThreadingImprovements import com.android.launcher3.util.coroutines.DispatcherProvider import com.android.quickstep.recents.domain.model.TaskId import com.android.quickstep.recents.domain.model.TaskModel @@ -35,10 +34,8 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map @@ -56,7 +53,7 @@ class TaskViewModel( private val getThumbnailPositionUseCase: GetThumbnailPositionUseCase, dispatcherProvider: DispatcherProvider, ) { - private val taskIds = MutableStateFlow(emptySet()) + private var taskIds = MutableStateFlow(emptySet()) private val isLiveTile = combine( @@ -77,86 +74,24 @@ class TaskViewModel( private val taskData = taskIds.flatMapLatest { ids -> // Combine Tasks requests - val taskFlows = - ids.map { id -> getTaskUseCase(id).map { taskModel -> id to taskModel } } - val combinedTaskFlows = combine(taskFlows) { taskArray -> taskArray } - combine(combinedTaskFlows, isLiveTile, ::mapToTaskData) - } - - private val taskModels = - taskIds.flatMapLatest { ids -> - // Combine Tasks requests - val taskFlows = - ids.map { id -> - getTaskUseCase(id).distinctUntilChanged().map { taskModel -> id to taskModel } - } - combine(taskFlows) { taskArray -> taskArray } + combine( + ids.map { id -> getTaskUseCase(id).map { taskModel -> id to taskModel } }, + ::mapToTaskData, + ) } private val overlayEnabled = - when (taskViewType) { - TaskViewType.SINGLE -> - combine( - recentsViewData.overlayEnabled, - recentsViewData.settledFullyVisibleTaskIds, - ) { isOverlayEnabled, settledFullyVisibleTaskIds -> - isOverlayEnabled && settledFullyVisibleTaskIds.any { it in taskIds.value } - } - .distinctUntilChanged() - else -> flowOf(false) - } - - private val preThreadingImprovedState: Flow = - combine(taskData, overlayEnabled, isCentralTask, ::mapToTaskTile) - - private val threadingImprovedState: Flow = - com.android.launcher3.util.coroutines.combine( - taskModels, - recentsViewData.runningTaskIds, - recentsViewData.runningTaskShowScreenshot, - recentsViewData.overlayEnabled, - recentsViewData.settledFullyVisibleTaskIds, - recentsViewData.centralTaskIds, - ) { - taskModels: Array>, - runningTaskIds: Set, - runningTaskShowScreenshot: Boolean, - isOverlayEnabled: Boolean, - settledFullyVisibleTaskIds: Set, - centralTaskIds: Set -> - val taskIds = taskModels.map { it.first }.toSet() - val isCentralTask = taskIds == centralTaskIds - val overlayEnabled = - when (taskViewType) { - TaskViewType.SINGLE -> { - isOverlayEnabled && settledFullyVisibleTaskIds.any { it in taskIds } - } - else -> false - } - val isLiveTile = runningTaskIds == taskIds && !runningTaskShowScreenshot - val taskData = mapToTaskData(taskModels, isLiveTile) - - mapToTaskTile(taskData, overlayEnabled, isCentralTask) - } - - private val taskTileUiStateFlow = - if (enableCoroutineThreadingImprovements()) threadingImprovedState - else preThreadingImprovedState + combine(recentsViewData.overlayEnabled, recentsViewData.settledFullyVisibleTaskIds) { + isOverlayEnabled, + settledFullyVisibleTaskIds -> + isOverlayEnabled && settledFullyVisibleTaskIds.any { it in taskIds.value } + } + .distinctUntilChanged() val state: Flow = - taskTileUiStateFlow + combine(taskData, isLiveTile, overlayEnabled, isCentralTask, ::mapToTaskTile) .distinctUntilChanged() - .debounce { state -> - // Debouncing only when thumbnails are not present gives the best results. - // This is because thumbnail loading is a decent predictor of there being no more - // emissions to come as they are typically the last emission for a TaskView. - if (state.tasks.any { (it as? TaskData.Data)?.thumbnailData?.thumbnail == null }) { - DEBOUNCE_DELAY_MS - } else { - 0 - } - } - .flowOn(dispatcherProvider.lightweightBackground) + .flowOn(dispatcherProvider.background) fun bind(vararg taskId: TaskId) { taskIds.value = taskId.toSet().also { Log.d(TAG, "bind: $it") } @@ -180,12 +115,14 @@ class TaskViewModel( private fun mapToTaskTile( tasks: List, + isLiveTile: Boolean, overlayEnabled: Boolean, isCentralTask: Boolean, ): TaskTileUiState { val firstThumbnailData = (tasks.firstOrNull() as? TaskData.Data)?.thumbnailData return TaskTileUiState( tasks = tasks, + isLiveTile = isLiveTile, hasHeader = taskViewType == TaskViewType.DESKTOP, sysUiStatusNavFlags = getSysUiStatusNavFlagsUseCase(firstThumbnailData), taskOverlayEnabled = overlayEnabled, @@ -193,24 +130,19 @@ class TaskViewModel( ) } - private fun mapToTaskData( - result: Array>, - isLiveTile: Boolean, - ): List = result.map { mapToTaskData(it.first, it.second, isLiveTile) } + private fun mapToTaskData(result: Array>): List = + result.map { mapToTaskData(it.first, it.second) } - private fun mapToTaskData(taskId: TaskId, result: TaskModel?, isLiveTile: Boolean): TaskData = + private fun mapToTaskData(taskId: TaskId, result: TaskModel?): TaskData = result?.let { TaskData.Data( taskId = taskId, - packageName = result.packageName, title = result.title, titleDescription = result.titleDescription, icon = result.icon, thumbnailData = result.thumbnail, backgroundColor = result.backgroundColor.removeAlpha(), isLocked = result.isLocked, - isLiveTile = isLiveTile && !result.isMinimized, - remainingAppTimerDuration = result.remainingAppDuration, ) } ?: TaskData.NoData(taskId) @@ -218,6 +150,5 @@ class TaskViewModel( private companion object { const val TAG = "TaskViewModel" - const val DEBOUNCE_DELAY_MS = 16L } } diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt index ec8736a6ef..4d168c7476 100644 --- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt +++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt @@ -25,17 +25,13 @@ import kotlinx.coroutines.flow.first class RecentsViewModel( private val recentsTasksRepository: RecentTasksRepository, private val recentsViewData: RecentsViewData, - private val displayId: Int, ) { - private var visibleTaskIds = emptySet() - fun refreshAllTaskData() { - recentsTasksRepository.getAllTaskData(displayId, true) + recentsTasksRepository.getAllTaskData(true) } fun updateVisibleTasks(visibleTaskIdList: List) { - visibleTaskIds = visibleTaskIdList.toSet() - recentsTasksRepository.setVisibleTasks(displayId, visibleTaskIds) + recentsTasksRepository.setVisibleTasks(visibleTaskIdList.toSet()) } fun updateTasksFullyVisible(taskIds: Set) { @@ -51,10 +47,9 @@ class RecentsViewModel( } suspend fun waitForThumbnailsToUpdate(updatedThumbnails: Map?) { - val visibleThumbnails = updatedThumbnails?.filterKeys { it in visibleTaskIds } - if (visibleThumbnails.isNullOrEmpty()) return + if (updatedThumbnails.isNullOrEmpty()) return combine( - visibleThumbnails.map { + updatedThumbnails.map { recentsTasksRepository.getThumbnailById(it.key).filter { thumbnailData -> thumbnailData?.snapshotId == it.value.snapshotId } diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt index a5c9ac032f..db593d34d3 100644 --- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt +++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt @@ -19,6 +19,7 @@ package com.android.quickstep.task.thumbnail import android.graphics.Bitmap import android.graphics.drawable.Drawable import android.view.Surface +import android.view.View.OnClickListener import androidx.annotation.ColorInt sealed class TaskThumbnailUiState { @@ -26,14 +27,37 @@ sealed class TaskThumbnailUiState { data class BackgroundOnly(@ColorInt val backgroundColor: Int) : TaskThumbnailUiState() - data object LiveTile : TaskThumbnailUiState() - data class SnapshotSplash(val snapshot: Snapshot, val splash: Drawable?) : TaskThumbnailUiState() - data class Snapshot( - val bitmap: Bitmap, - @Surface.Rotation val thumbnailRotation: Int, - @ColorInt val backgroundColor: Int, + sealed class LiveTile : TaskThumbnailUiState() { + data class WithHeader(val header: ThumbnailHeader) : LiveTile() + + data object WithoutHeader : LiveTile() + } + + sealed class Snapshot { + abstract val bitmap: Bitmap + abstract val thumbnailRotation: Int + abstract val backgroundColor: Int + + data class WithHeader( + override val bitmap: Bitmap, + @Surface.Rotation override val thumbnailRotation: Int, + @ColorInt override val backgroundColor: Int, + val header: ThumbnailHeader, + ) : Snapshot() + + data class WithoutHeader( + override val bitmap: Bitmap, + @Surface.Rotation override val thumbnailRotation: Int, + @ColorInt override val backgroundColor: Int, + ) : Snapshot() + } + + data class ThumbnailHeader( + val icon: Drawable, + val title: String, + val clickCloseListener: OnClickListener, ) } diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt index b6928ae67b..0edbacc710 100644 --- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt +++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt @@ -25,12 +25,13 @@ import android.graphics.Rect import android.graphics.drawable.ShapeDrawable import android.util.AttributeSet import android.util.Log +import android.view.LayoutInflater import android.view.View import android.view.ViewOutlineProvider import android.widget.FrameLayout import androidx.annotation.ColorInt import androidx.core.view.isInvisible -import com.android.launcher3.Flags.enableRefactorTaskContentView +import com.android.launcher3.Flags.enableDesktopExplodedView import com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA import com.android.launcher3.R import com.android.launcher3.util.MultiPropertyFactory @@ -41,6 +42,7 @@ import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Snapshot import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.SnapshotSplash import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized import com.android.quickstep.views.FixedSizeImageView +import com.android.quickstep.views.TaskThumbnailViewHeader class TaskThumbnailView : FrameLayout, ViewPool.Reusable { private val scrimView: View by lazy { findViewById(R.id.task_thumbnail_scrim) } @@ -54,6 +56,8 @@ class TaskThumbnailView : FrameLayout, ViewPool.Reusable { private val outlinePath = Path() private var onSizeChanged: ((width: Int, height: Int) -> Unit)? = null + private var taskThumbnailViewHeader: TaskThumbnailViewHeader? = null + private var uiState: TaskThumbnailUiState = Uninitialized /** @@ -83,11 +87,13 @@ class TaskThumbnailView : FrameLayout, ViewPool.Reusable { defStyleAttr: Int, ) : super(context, attrs, defStyleAttr) + override fun onFinishInflate() { + super.onFinishInflate() + maybeCreateHeader() + } + override fun onAttachedToWindow() { super.onAttachedToWindow() - if (enableRefactorTaskContentView()) { - return - } clipToOutline = true outlineProvider = object : ViewOutlineProvider() { @@ -112,10 +118,8 @@ class TaskThumbnailView : FrameLayout, ViewPool.Reusable { override fun onRecycle() { uiState = Uninitialized - if (!enableRefactorTaskContentView()) { - onSizeChanged = null - outlineBounds = null - } + onSizeChanged = null + outlineBounds = null resetViews() } @@ -126,7 +130,7 @@ class TaskThumbnailView : FrameLayout, ViewPool.Reusable { resetViews() when (state) { is Uninitialized -> {} - is LiveTile -> drawLiveWindow() + is LiveTile -> drawLiveWindow(state) is SnapshotSplash -> drawSnapshotSplash(state) is BackgroundOnly -> drawBackground(state.backgroundColor) } @@ -152,16 +156,10 @@ class TaskThumbnailView : FrameLayout, ViewPool.Reusable { } fun doOnSizeChange(action: (width: Int, height: Int) -> Unit) { - if (enableRefactorTaskContentView()) { - return - } onSizeChanged = action } override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { - if (enableRefactorTaskContentView()) { - return - } super.onSizeChanged(w, h, oldw, oldh) onSizeChanged?.invoke(width, height) bounds.set(0, 0, w, h) @@ -169,52 +167,40 @@ class TaskThumbnailView : FrameLayout, ViewPool.Reusable { } override fun setScaleX(scaleX: Float) { - if (enableRefactorTaskContentView()) { - return - } super.setScaleX(scaleX) // Splash icon should ignore scale on TTV splashIcon.scaleX = 1 / scaleX } override fun setScaleY(scaleY: Float) { - if (enableRefactorTaskContentView()) { - return - } super.setScaleY(scaleY) // Splash icon should ignore scale on TTV splashIcon.scaleY = 1 / scaleY } - fun parentScaleXUpdated(scaleX: Float) { - // Splash icon should ignore scale on TTV - splashIcon.scaleX = 1 / scaleX - } - - fun parentScaleYUpdated(scaleY: Float) { - // Splash icon should ignore scale on TTV - splashIcon.scaleY = 1 / scaleY - } - private fun resetViews() { liveTileView.isInvisible = true thumbnailView.isInvisible = true thumbnailView.setImageBitmap(null) splashBackground.alpha = 0f - splashBackground.setBackgroundColor(Color.TRANSPARENT) splashIcon.alpha = 0f splashIcon.setImageDrawable(null) scrimView.alpha = 0f - alpha = 1.0f - setBackgroundColor(Color.TRANSPARENT) + setBackgroundColor(Color.BLACK) + taskThumbnailViewHeader?.isInvisible = true } private fun drawBackground(@ColorInt background: Int) { setBackgroundColor(background) } - private fun drawLiveWindow() { + private fun drawLiveWindow(liveTile: LiveTile) { liveTileView.isInvisible = false + + if (liveTile is LiveTile.WithHeader) { + taskThumbnailViewHeader?.isInvisible = false + taskThumbnailViewHeader?.setHeader(liveTile.header) + } } private fun drawSnapshotSplash(snapshotSplash: SnapshotSplash) { @@ -226,8 +212,11 @@ class TaskThumbnailView : FrameLayout, ViewPool.Reusable { } private fun drawSnapshot(snapshot: Snapshot) { - // Always draw the background since the snapshots might be translucent or partially empty - // E.g. reparented tasks from drag-to-dismiss split screen. + if (snapshot is Snapshot.WithHeader) { + taskThumbnailViewHeader?.isInvisible = false + taskThumbnailViewHeader?.setHeader(snapshot.header) + } + drawBackground(snapshot.backgroundColor) thumbnailView.setImageBitmap(snapshot.bitmap) thumbnailView.isInvisible = false @@ -243,6 +232,16 @@ class TaskThumbnailView : FrameLayout, ViewPool.Reusable { Log.d(TAG, "[TaskThumbnailView@${Integer.toHexString(hashCode())}] $message") } + private fun maybeCreateHeader() { + if (enableDesktopExplodedView() && taskThumbnailViewHeader == null) { + taskThumbnailViewHeader = + LayoutInflater.from(context) + .inflate(R.layout.task_thumbnail_view_header, this, false) + as TaskThumbnailViewHeader + addView(taskThumbnailViewHeader) + } + } + private companion object { const val TAG = "TaskThumbnailView" private const val MAX_SCRIM_ALPHA = 0.4f diff --git a/quickstep/src/com/android/quickstep/util/ActivityPreloadUtil.kt b/quickstep/src/com/android/quickstep/util/ActivityPreloadUtil.kt index 239230c123..cf0f281a24 100644 --- a/quickstep/src/com/android/quickstep/util/ActivityPreloadUtil.kt +++ b/quickstep/src/com/android/quickstep/util/ActivityPreloadUtil.kt @@ -46,8 +46,7 @@ object ActivityPreloadUtil { try { if (!LockedUserState.get(ctx).isUserUnlocked) return - val deviceState = - RecentsAnimationDeviceState.REPOSITORY_INSTANCE.get(ctx)[ctx.displayId] ?: return + val deviceState = RecentsAnimationDeviceState.INSTANCE[ctx] val overviewCompObserver = OverviewComponentObserver.INSTANCE[ctx] // Prevent the overview from being started before the real home on first boot @@ -63,7 +62,7 @@ object ActivityPreloadUtil { // have the latest state. if ( fromInit && - overviewCompObserver.getContainerInterface(DEFAULT_DISPLAY)?.createdContainer != + overviewCompObserver.getContainerInterface(DEFAULT_DISPLAY).createdContainer != null ) return diff --git a/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java b/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java index a2e0628da8..37d7030832 100644 --- a/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java +++ b/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java @@ -183,7 +183,7 @@ public class AnimatorControllerWithResistance { params.startTranslation, endTranslation, RECENTS_TRANSLATE_RESIST_INTERPOLATOR); float prevScaleRate = (fullscreenScale - params.startScale) - / (params.dp.getDeviceProperties().getHeightPx() - startRect.bottom); + / (params.dp.heightPx - startRect.bottom); // This is what the scale would be at the end of the drag if we didn't apply resistance. float endScale = params.startScale - prevScaleRate * distanceToCover; // Create an interpolator that resists the scale so the scale doesn't get smaller than @@ -256,7 +256,7 @@ public class AnimatorControllerWithResistance { this.scaleProperty = scaleProperty; this.translationTarget = translationTarget; this.translationProperty = translationProperty; - if (dp.getDeviceProperties().isTablet()) { + if (dp.isTablet) { resistanceParams = RecentsResistanceParams.FROM_APP_TABLET; } else { resistanceParams = RecentsResistanceParams.FROM_APP; diff --git a/quickstep/src/com/android/quickstep/util/AppPairsController.java b/quickstep/src/com/android/quickstep/util/AppPairsController.java index 3015ad8315..281be7dfa9 100644 --- a/quickstep/src/com/android/quickstep/util/AppPairsController.java +++ b/quickstep/src/com/android/quickstep/util/AppPairsController.java @@ -44,9 +44,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import com.android.app.displaylib.PerDisplayRepository; import com.android.internal.jank.Cuj; -import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.allapps.AllAppsStore; @@ -61,16 +59,14 @@ import com.android.launcher3.model.data.ItemInfoWithIcon; import com.android.launcher3.model.data.TaskViewItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.taskbar.TaskbarActivityContext; +import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.SplitConfigurationOptions.StagePosition; import com.android.launcher3.views.ActivityContext; -import com.android.quickstep.OverviewComponentObserver; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TaskUtils; import com.android.quickstep.TopTaskTracker; -import com.android.quickstep.fallback.window.RecentsWindowFlags; -import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.views.GroupedTaskView; import com.android.quickstep.views.TaskContainer; import com.android.quickstep.views.TaskView; @@ -114,12 +110,6 @@ public class AppPairsController { mContext = null; } - private Launcher getLauncher() { - return mContext == null || !OverviewComponentObserver.INSTANCE.get(mContext.asContext()) - .isHomeAndOverviewSame() - ? null : Launcher.ACTIVITY_TRACKER.getCreatedContext(); - } - /** * Returns whether the specified GroupedTaskView can be saved as an app pair. */ @@ -228,27 +218,19 @@ public class AppPairsController { iconCache.getTitleAndIcon(member, member.getMatchingLookupFlag()); }); MAIN_EXECUTOR.execute(() -> { - Launcher launcher = getLauncher(); - LauncherAccessibilityDelegate delegate = launcher == null - ? null : launcher.getAccessibilityDelegate(); - if (delegate == null) { - return; + LauncherAccessibilityDelegate delegate = QuickstepLauncher.getLauncher( + mContext.asContext()).getAccessibilityDelegate(); + if (delegate != null) { + delegate.addToWorkspace(newAppPair, true, (success) -> { + if (success) { + InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_SAVE_APP_PAIR); + } else { + InteractionJankMonitorWrapper.cancel(Cuj.CUJ_LAUNCHER_SAVE_APP_PAIR); + } + }); + mStatsLogManager.logger().withItemInfo(newAppPair) + .log(StatsLogManager.LauncherEvent.LAUNCHER_APP_PAIR_SAVE); } - if (RecentsWindowFlags.enableLauncherOverviewInWindow) { - PerDisplayRepository recentsWindowManagerRepository = - RecentsWindowManager.REPOSITORY_INSTANCE.get(mContext.asContext()); - recentsWindowManagerRepository.get(gtv.getDisplayId()) - .getStateManager().moveToRestState(); - } - delegate.addToWorkspace(newAppPair, true, (success) -> { - if (success) { - InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_SAVE_APP_PAIR); - } else { - InteractionJankMonitorWrapper.cancel(Cuj.CUJ_LAUNCHER_SAVE_APP_PAIR); - } - }); - mStatsLogManager.logger().withItemInfo(newAppPair) - .log(StatsLogManager.LauncherEvent.LAUNCHER_APP_PAIR_SAVE); }); }); } @@ -320,11 +302,8 @@ public class AppPairsController { */ @Nullable private AppInfo resolveAppInfoByComponent(@NonNull ComponentKey key) { - Launcher launcher = getLauncher(); - if (launcher == null) { - return null; - } - AllAppsStore appsStore = launcher.getAppsView().getAppsStore(); + AllAppsStore appsStore = ActivityContext.lookupContext(mContext.asContext()) + .getAppsView().getAppsStore(); // First look up the app info in order of: // - The exact activity for the recent task diff --git a/quickstep/src/com/android/quickstep/util/BackAnimState.kt b/quickstep/src/com/android/quickstep/util/BackAnimState.kt index 18cc98cd68..4c1e1ffacc 100644 --- a/quickstep/src/com/android/quickstep/util/BackAnimState.kt +++ b/quickstep/src/com/android/quickstep/util/BackAnimState.kt @@ -19,11 +19,8 @@ package com.android.quickstep.util import android.animation.AnimatorSet import android.content.Context import com.android.launcher3.Flags -import com.android.launcher3.Launcher import com.android.launcher3.LauncherAnimationRunner.AnimationResult -import com.android.launcher3.LauncherState import com.android.launcher3.anim.AnimatorListeners.forEndCallback -import com.android.launcher3.statemanager.StateManager import com.android.launcher3.util.RunnableList /** Interface to represent animation for back to Launcher transition */ @@ -33,7 +30,7 @@ interface BackAnimState { fun applyToAnimationResult(result: AnimationResult, c: Context) - fun start(stateManager: StateManager) + fun start() } class AnimatorBackState(private val springAnim: RectFSpringAnim?, private val anim: AnimatorSet?) : @@ -61,10 +58,7 @@ class AnimatorBackState(private val springAnim: RectFSpringAnim?, private val an result.setAnimation(anim, c) } - override fun start(stateManager: StateManager) { - if (anim != null) { - stateManager.setCurrentAnimation(anim) - } + override fun start() { anim?.start() } } @@ -79,5 +73,5 @@ class AlreadyStartedBackAnimState(private val onEndCallback: RunnableList) : Bac addOnAnimCompleteCallback(result::onAnimationFinished) } - override fun start(stateManager: StateManager) {} + override fun start() {} } diff --git a/quickstep/src/com/android/quickstep/util/BaseDepthController.java b/quickstep/src/com/android/quickstep/util/BaseDepthController.java index 0ea360115e..df7b148f7c 100644 --- a/quickstep/src/com/android/quickstep/util/BaseDepthController.java +++ b/quickstep/src/com/android/quickstep/util/BaseDepthController.java @@ -15,36 +15,22 @@ */ package com.android.quickstep.util; -import static android.os.Trace.TRACE_TAG_APP; - import static com.android.launcher3.Flags.enableOverviewBackgroundWallpaperBlur; import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation; import android.app.WallpaperManager; -import android.graphics.RenderEffect; -import android.graphics.Shader; -import android.gui.EarlyWakeupInfo; -import android.os.Binder; import android.os.IBinder; -import android.os.Trace; import android.util.FloatProperty; import android.util.Log; import android.view.AttachedSurfaceControl; -import android.view.CrossWindowBlurListeners; import android.view.SurfaceControl; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; -import com.android.app.animation.Interpolators; import com.android.launcher3.Flags; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherState; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.statemanager.StateManager; -import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.util.MultiPropertyFactory; import com.android.launcher3.util.MultiPropertyFactory.MultiProperty; import com.android.systemui.shared.system.BlurUtils; @@ -77,7 +63,7 @@ public class BaseDepthController { // b/291401432 private static final String TAG = "BaseDepthController"; - protected final QuickstepLauncher mLauncher; + protected final Launcher mLauncher; /** Property to set the depth for state transition. */ public final MultiProperty stateDepth; /** Property to set the depth for widget picker. */ @@ -110,6 +96,7 @@ public class BaseDepthController { /** * Last blur value, in pixels, that was applied. + * For debugging purposes. */ protected int mCurrentBlur; /** @@ -120,16 +107,10 @@ public class BaseDepthController { protected boolean mWaitingOnSurfaceValidity; private SurfaceControl mBlurSurface = null; - /** - * Info for early wakeup requests to SurfaceFlinger. - */ -// private EarlyWakeupInfo mEarlyWakeupInfo = new EarlyWakeupInfo(); - public BaseDepthController(QuickstepLauncher activity) { + public BaseDepthController(Launcher activity) { mLauncher = activity; - if (Flags.allAppsBlur() || enableOverviewBackgroundWallpaperBlur()) { - mCrossWindowBlursEnabled = - CrossWindowBlurListeners.getInstance().isCrossWindowBlurEnabled(); + if (Flags.allAppsBlur()) { mMaxBlurRadius = activity.getResources().getDimensionPixelSize( R.dimen.max_depth_blur_radius_enhanced); } else { @@ -141,24 +122,17 @@ public class BaseDepthController { new MultiPropertyFactory<>(this, DEPTH, DEPTH_INDEX_COUNT, Float::max); stateDepth = depthProperty.get(DEPTH_INDEX_STATE_TRANSITION); widgetDepth = depthProperty.get(DEPTH_INDEX_WIDGET); -// mEarlyWakeupInfo.token = new Binder(); -// mEarlyWakeupInfo.trace = BaseDepthController.class.getName(); - } + if (enableOverviewBackgroundWallpaperBlur()) { + mBlurSurface = new SurfaceControl.Builder() + .setName("Overview Blur") + .setHidden(false) + .build(); + } - /** - * Returns if cross window blurs are enabled. In other words, whether launcher should use blurs - * style UI or fallback style UI. - */ - public boolean isCrossWindowBlursEnabled() { - return mCrossWindowBlursEnabled; } protected void setCrossWindowBlursEnabled(boolean isEnabled) { - if (mCrossWindowBlursEnabled == isEnabled) { - return; - } mCrossWindowBlursEnabled = isEnabled; - mLauncher.updateBlurStyle(); applyDepthAndBlur(); } @@ -167,42 +141,22 @@ public class BaseDepthController { } public void pauseBlursOnWindows(boolean pause) { - if (mPauseBlurs == pause) { - return; + if (pause != mPauseBlurs) { + mPauseBlurs = pause; + applyDepthAndBlur(); } - mPauseBlurs = pause; - applyDepthAndBlur(); } protected void onInvalidSurface() { } protected void applyDepthAndBlur() { - applyDepthAndBlur(null, /* applyImmediately */ false, /* skipSimilarBlur */ true); - } - - /** - * Applies depth and blur to the launcher. - * - * @param transaction optional Surface to apply to the blur to. - * @param applyImmediately whether to apply the blur immediately or defer to the next frame. - */ - protected void applyDepthAndBlur(SurfaceControl.Transaction transaction, - boolean applyImmediately, boolean skipSimilarBlur) { - try (transaction) { - applyDepthAndBlurInternal(transaction, applyImmediately, skipSimilarBlur); - } - } - - private void applyDepthAndBlurInternal(SurfaceControl.Transaction transaction, - boolean applyImmediately, boolean skipSimilarBlur) { float depth = mDepth; IBinder windowToken = mLauncher.getRootView().getWindowToken(); if (windowToken != null) { if (enableScalingRevealHomeAnimation()) { mWallpaperManager.setWallpaperZoomOut(windowToken, depth); } else { - // The API's full zoom-out is three times larger than the zoom-out we apply - // to the + // The API's full zoom-out is three times larger than the zoom-out we apply to the // icons. To keep the two consistent throughout the animation while keeping // Launcher's concept of full depth unchanged, we divide the depth by 3 here. mWallpaperManager.setWallpaperZoomOut(windowToken, depth / 3); @@ -232,130 +186,55 @@ public class BaseDepthController { } else { blurAmount = depth; } - SurfaceControl blurSurface = - enableOverviewBackgroundWallpaperBlur() && mBlurSurface != null ? mBlurSurface - : mBaseSurface; + mCurrentBlur = !mCrossWindowBlursEnabled || hasOpaqueBg || mPauseBlurs + ? 0 : (int) (blurAmount * mMaxBlurRadius); - int previousBlur = mCurrentBlur; - int newBlur = mCrossWindowBlursEnabled && !hasOpaqueBg && !mPauseBlurs ? (int) (blurAmount - * mMaxBlurRadius) : 0; - int delta = Math.abs(newBlur - previousBlur); - if (skipSimilarBlur && delta < Utilities.dpToPx(1) && newBlur != 0 && previousBlur != 0 - && blurAmount != 1f) { - Log.d(TAG, "Skipping small blur delta. newBlur: " + newBlur + " previousBlur: " - + previousBlur + " delta: " + delta + " surface: " + blurSurface); - return; - } - mCurrentBlur = newBlur; - Log.v(TAG, "Applying blur: " + mCurrentBlur + " to " + blurSurface); - - final SurfaceControl.Transaction finalTransaction = - transaction == null ? createTransaction() : transaction; - try (finalTransaction) { - finalTransaction.setBackgroundBlurRadius(blurSurface, mCurrentBlur) - .setOpaque(blurSurface, isSurfaceOpaque); - // Set early wake-up flags when we know we're executing an expensive operation, this way - // SurfaceFlinger will adjust its internal offsets to avoid jank. - boolean wantsEarlyWakeUp = blurAmount > 0 && blurAmount < 1; - if (wantsEarlyWakeUp && !mInEarlyWakeUp) { - try { - setEarlyWakeup(finalTransaction, true); - } catch (NoSuchMethodError e) { - // LC-Ignored: wtf? - } - } else if (!wantsEarlyWakeUp && mInEarlyWakeUp) { - try { - setEarlyWakeup(finalTransaction, false); - } catch (NoSuchMethodError e) { - // LC-Ignored: wtf? - } - } - - if (applyImmediately) { - finalTransaction.apply(); + SurfaceControl.Transaction transaction = new SurfaceControl.Transaction(); + if (enableOverviewBackgroundWallpaperBlur() && mBlurSurface != null) { + // Reparent to launcher for full screen blur. + transaction.setBackgroundBlurRadius(mBlurSurface, mCurrentBlur) + .reparent(mBlurSurface, mBaseSurface); + // Set mBlurSurface to be 1 layer behind mBaseSurface or mBaseSurfaceOverride. + if (mBaseSurfaceOverride != null && mBaseSurfaceOverride.isValid()) { + transaction.setRelativeLayer(mBlurSurface, mBaseSurfaceOverride, -1); } else { - AttachedSurfaceControl rootSurfaceControl = - mLauncher.getRootView().getRootSurfaceControl(); - if (rootSurfaceControl != null) { - rootSurfaceControl.applyTransactionOnDraw(finalTransaction); - } + transaction.setRelativeLayer(mBlurSurface, mBaseSurface, -1); } - } - - blurWorkspaceDepthTargets(); - } - - /** - * Sets the early wakeup state. - * - * @param inEarlyWakeUp whether SurfaceFlinger's early wakeup timing should be active. - */ - public void setEarlyWakeup(boolean inEarlyWakeUp) { - if (mInEarlyWakeUp == inEarlyWakeUp) { - return; - } - try (SurfaceControl.Transaction transaction = createTransaction()) { - setEarlyWakeup(transaction, inEarlyWakeUp); - transaction.apply(); - } - } - - /** - * Sets the early wakeup state. - * - * @param transaction transaction to apply to. - * @param start whether to start or end the early wakeup. - */ - protected void setEarlyWakeup(@NonNull SurfaceControl.Transaction transaction, boolean start) { - if (mInEarlyWakeUp == start) { - return; - } - Log.d(TAG, "setEarlyWakeup: " + start); - if (start) { -// Trace.instantForTrack(TRACE_TAG_APP, TAG, "notifyRendererForGpuLoadUp"); -// mLauncher.getRootView().getViewRootImpl().notifyRendererForGpuLoadUp("applyBlur"); -// transaction.setEarlyWakeupStart(); } else { -// transaction.setEarlyWakeupEnd(); + transaction.setBackgroundBlurRadius(mBaseSurface, mCurrentBlur); } - mInEarlyWakeUp = start; - } - - /** @return {@code true} if the workspace should be blurred. */ - @VisibleForTesting - public boolean blurWorkspaceDepthTargets() { - if (!Flags.allAppsBlur()) { - return false; + transaction.setOpaque(mBaseSurface, isSurfaceOpaque); + // Set early wake-up flags when we know we're executing an expensive operation, this way + // SurfaceFlinger will adjust its internal offsets to avoid jank. + boolean wantsEarlyWakeUp = depth > 0 && depth < 1; + if (wantsEarlyWakeUp && !mInEarlyWakeUp) { + try { + transaction.setEarlyWakeupStart(); + } catch (NoSuchMethodError e) { + // LC-Ignored: wtf? + } + mInEarlyWakeUp = true; + } else if (!wantsEarlyWakeUp && mInEarlyWakeUp) { + try { + transaction.setEarlyWakeupEnd(); + } catch (NoSuchMethodError e) { + // LC-Ignored: wtf? + } + mInEarlyWakeUp = false; } - StateManager stateManager = mLauncher.getStateManager(); - LauncherState targetState = stateManager.getTargetState() != null - ? stateManager.getTargetState() : stateManager.getState(); - // Only blur workspace if the current state wants to blur based on the target state. - boolean shouldBlurWorkspace = - stateManager.getCurrentStableState().shouldBlurWorkspace(targetState); - RenderEffect blurEffect = shouldBlurWorkspace && mCurrentBlur > 0 - ? RenderEffect.createBlurEffect(mCurrentBlur, mCurrentBlur, Shader.TileMode.DECAL) - // If blur is not desired, clear the blur effect from the depth targets. - : null; - mLauncher.getDepthBlurTargets().forEach(target -> target.setRenderEffect(blurEffect)); - return shouldBlurWorkspace; + AttachedSurfaceControl rootSurfaceControl = + mLauncher.getRootView().getRootSurfaceControl(); + if (rootSurfaceControl != null) { + rootSurfaceControl.applyTransactionOnDraw(transaction); + } } private void setDepth(float depth) { depth = Utilities.boundToRange(depth, 0, 1); - // Depth of the Launcher state we are in or transitioning to. - float targetStateDepth = mLauncher.getStateManager().getState().getDepth(mLauncher); - - float depthF; - if (depth == targetStateDepth) { - // Always apply the target state depth. - depthF = depth; - } else { - // Round out the depth to dedupe frequent, non-perceptable updates - int depthI = (int) (depth * 256); - depthF = depthI / 256f; - } + // Round out the depth to dedupe frequent, non-perceptable updates + int depthI = (int) (depth * 256); + float depthF = depthI / 256f; if (Float.compare(mDepth, depthF) == 0) { return; } @@ -367,45 +246,13 @@ public class BaseDepthController { * Sets the lowest surface that should not be blurred. *

* Blur is applied to below {@link #mBaseSurfaceOverride}. When set to {@code null}, blur is - * applied to below {@link #mBaseSurface}. + * applied + * to below {@link #mBaseSurface}. *

*/ - public void setBaseSurfaceOverride(@Nullable SurfaceControl baseSurfaceOverride, - boolean applyOnDraw) { - if (mBaseSurfaceOverride != baseSurfaceOverride) { - boolean applyImmediately = mBaseSurfaceOverride != null && baseSurfaceOverride == null - && !applyOnDraw; - mBaseSurfaceOverride = baseSurfaceOverride; - Log.d(TAG, "setBaseSurfaceOverride: applying blur behind leash " + baseSurfaceOverride); - SurfaceControl.Transaction transaction = setupBlurSurface(); - applyDepthAndBlur(transaction, applyImmediately, /* skipSimilarBlur */ false); - } - } - - private @Nullable SurfaceControl.Transaction setupBlurSurface() { - SurfaceControl.Transaction transaction = null; - if (mBaseSurface != null && mBaseSurfaceOverride != null) { - transaction = createTransaction().setBackgroundBlurRadius(mBaseSurface, 0) - .setOpaque(mBaseSurface, false); - if (mBlurSurface == null) { - mBlurSurface = new SurfaceControl.Builder() - .setName("Overview Blur") - .setHidden(false) - .build(); - Log.d(TAG, - "setupBlurSurface: creating Overview Blur surface " + mBlurSurface); - transaction.reparent(mBlurSurface, mBaseSurface); - Log.d(TAG, - "setupBlurSurface: reparenting " + mBlurSurface + " to " + mBaseSurface); - } - transaction.setRelativeLayer(mBlurSurface, mBaseSurfaceOverride, -1); - Log.d(TAG, "setupBlurSurface: relayering to leash " + mBaseSurfaceOverride); - } else if (mBlurSurface != null) { - Log.d(TAG, "setupBlurSurface: removing blur surface " + mBlurSurface); - transaction = createTransaction().remove(mBlurSurface); - mBlurSurface = null; - } - return transaction; + public void setBaseSurfaceOverride(@Nullable SurfaceControl baseSurfaceOverride) { + this.mBaseSurfaceOverride = baseSurfaceOverride; + applyDepthAndBlur(); } /** @@ -416,12 +263,7 @@ public class BaseDepthController { mBaseSurface = baseSurface; Log.d(TAG, "setSurface:\n\tmWaitingOnSurfaceValidity: " + mWaitingOnSurfaceValidity + "\n\tmBaseSurface: " + mBaseSurface); - SurfaceControl.Transaction transaction = null; - if (enableOverviewBackgroundWallpaperBlur()) { - transaction = setupBlurSurface(); - } - applyDepthAndBlur(transaction, /* applyImmediately */ false, - /* skipSimilarBlur */ false); + applyDepthAndBlur(); } } @@ -430,10 +272,6 @@ public class BaseDepthController { * The blur percentage grows linearly with depth, and maxes out at 30% depth. */ private static float mapDepthToBlur(float depth) { - return Interpolators.clampToProgress(depth, 0, 0.3f); - } - - private SurfaceControl.Transaction createTransaction() { - return new SurfaceControl.Transaction(); + return Math.min(3 * depth, 1f); } } diff --git a/quickstep/src/com/android/quickstep/util/BorderAnimator.kt b/quickstep/src/com/android/quickstep/util/BorderAnimator.kt index ac6e1ccc27..d1d47b9fa5 100644 --- a/quickstep/src/com/android/quickstep/util/BorderAnimator.kt +++ b/quickstep/src/com/android/quickstep/util/BorderAnimator.kt @@ -63,7 +63,7 @@ private constructor( const val DEFAULT_BORDER_COLOR = Color.WHITE private const val DEFAULT_APPEARANCE_ANIMATION_DURATION_MS = 300L private const val DEFAULT_DISAPPEARANCE_ANIMATION_DURATION_MS = 133L - val DEFAULT_INTERPOLATOR = Interpolators.EMPHASIZED_DECELERATE + private val DEFAULT_INTERPOLATOR = Interpolators.EMPHASIZED_DECELERATE /** * Creates a BorderAnimator that simply draws the border outside the bound of the target diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt index aabea65917..e574cc7cdd 100644 --- a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt +++ b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt @@ -24,7 +24,6 @@ import android.util.Log import android.view.Display.DEFAULT_DISPLAY import androidx.annotation.VisibleForTesting import com.android.internal.app.AssistUtils -import com.android.launcher3.dagger.ApplicationContext import com.android.launcher3.logging.StatsLogManager import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_ASSISTANT_FAILED_SERVICE_ERROR import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_OMNI_ATTEMPTED_OVER_KEYGUARD @@ -40,7 +39,6 @@ import com.android.quickstep.SystemUiProxy import com.android.quickstep.TopTaskTracker import com.android.quickstep.views.RecentsView import com.android.systemui.shared.system.QuickStepContract -import javax.inject.Inject /** Handles invocations and checks for Contextual Search. */ class ContextualSearchInvoker @@ -65,24 +63,6 @@ internal constructor( context.getSystemService(ContextualSearchManager::class.java), ) - @Inject - constructor( - @ApplicationContext context: Context, - contextualSearchStateManager: ContextualSearchStateManager, - topTaskTracker: TopTaskTracker, - systemUiProxy: SystemUiProxy, - logManagerFactory: StatsLogManager.StatsLogManagerFactory, - hapticManager: ContextualSearchHapticManager, - ) : this( - context, - contextualSearchStateManager, - topTaskTracker, - systemUiProxy, - logManagerFactory.create(context), - hapticManager, - context.getSystemService(ContextualSearchManager::class.java), - ) - /** @return Array of AssistUtils.INVOCATION_TYPE_* that we want to handle instead of SysUI. */ fun getSysUiAssistOverrideInvocationTypes(): IntArray { val overrideInvocationTypes = com.android.launcher3.util.IntArray() @@ -183,7 +163,11 @@ internal constructor( statsLogManager.logger().log(LAUNCHER_LAUNCH_OMNI_FAILED_NOT_AVAILABLE) return false } - + if (isFakeLandscape()) { + // TODO (b/383421642): Fake landscape is to be removed in 25Q3 and this entire block + // can be removed when that happens. + return false + } return true } @@ -219,6 +203,13 @@ internal constructor( return true } + private fun isFakeLandscape(): Boolean = + getRecentsContainerInterface() + ?.getCreatedContainer() + ?.getOverviewPanel>() + ?.getPagedOrientationHandler() + ?.isLayoutNaturalToLauncher == false + private fun isInSplitscreen(): Boolean { return topTaskTracker.getRunningSplitTaskIds().isNotEmpty() } diff --git a/quickstep/src/com/android/quickstep/util/DesktopTask.kt b/quickstep/src/com/android/quickstep/util/DesktopTask.kt index e29c869c16..7c2729346c 100644 --- a/quickstep/src/com/android/quickstep/util/DesktopTask.kt +++ b/quickstep/src/com/android/quickstep/util/DesktopTask.kt @@ -24,8 +24,8 @@ import java.util.Objects * tasks list. Note that desktops can be empty with no tasks in them. The [deskId], [displayId] * makes sense only when the multiple desks feature is enabled. */ -class DesktopTask(val deskId: Int, desktopDisplayId: Int, tasks: List) : - GroupTask(tasks, desktopDisplayId, TaskViewType.DESKTOP) { +class DesktopTask(val deskId: Int, val displayId: Int, tasks: List) : + GroupTask(tasks, TaskViewType.DESKTOP) { override fun copy() = DesktopTask(deskId, displayId, tasks) diff --git a/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt b/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt index e60e9f3959..0aaca31f8b 100644 --- a/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt +++ b/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt @@ -23,11 +23,7 @@ import com.android.systemui.shared.recents.model.Task /** Whether this displayId belongs to an external display */ val Int.isExternalDisplay - get() = !isDefaultDisplay - -/** Whether this displayId belongs to the default display */ -val Int.isDefaultDisplay - get() = this == DEFAULT_DISPLAY + get() = this != DEFAULT_DISPLAY val Int?.safeDisplayId get() = diff --git a/quickstep/src/com/android/quickstep/util/GroupTask.kt b/quickstep/src/com/android/quickstep/util/GroupTask.kt index 9ba20673a1..2b754e2e0d 100644 --- a/quickstep/src/com/android/quickstep/util/GroupTask.kt +++ b/quickstep/src/com/android/quickstep/util/GroupTask.kt @@ -15,24 +15,19 @@ */ package com.android.quickstep.util +import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_TASK import com.android.launcher3.model.data.TaskItemInfo import com.android.launcher3.model.data.WorkspaceItemInfo import com.android.launcher3.util.SplitConfigurationOptions import com.android.quickstep.views.TaskViewType import com.android.systemui.shared.recents.model.Task -import com.android.wm.shell.shared.split.SplitBounds import java.util.Objects /** * An abstract class for creating [Task] containers that can be [SingleTask]s, [SplitTask]s, or * [DesktopTask]s in the recent tasks list. */ -abstract class GroupTask( - val tasks: List, - val displayId: Int, - @JvmField val taskViewType: TaskViewType, -) { - +abstract class GroupTask(val tasks: List, @JvmField val taskViewType: TaskViewType) { fun containsTask(taskId: Int) = tasks.any { it.key.id == taskId } /** @@ -40,9 +35,6 @@ abstract class GroupTask( */ fun containsPackage(packageName: String?) = tasks.any { it.key.packageName == packageName } - /** Returns true if a task in this group has the given displayId. */ - fun matchesDisplayId(displayId: Int) = displayId == this.displayId.safeDisplayId - /** * Returns true if a task in this group has a package name that matches the given `packageName`, * and its user ID matches the given `userId`. @@ -65,7 +57,7 @@ abstract class GroupTask( } /** A [Task] container that must contain exactly one task in the recent tasks list. */ -class SingleTask(task: Task) : GroupTask(listOf(task), task.key.displayId, TaskViewType.SINGLE) { +class SingleTask(task: Task) : GroupTask(listOf(task), TaskViewType.SINGLE) { val task: Task get() = tasks[0] @@ -82,9 +74,16 @@ class SingleTask(task: Task) : GroupTask(listOf(task), task.key.displayId, TaskV companion object { /** Creates a [TaskItemInfo] using the information of the SingleTask */ - fun createTaskItemInfo(task: SingleTask, wif: WorkspaceItemInfo): TaskItemInfo { + fun createTaskItemInfo(task: SingleTask): TaskItemInfo { // TODO: b/344657629 - Support GroupTask in addition to SingleTask. - return TaskItemInfo(task.task.key.id, wif) + val wii = + WorkspaceItemInfo().apply { + title = task.task.title + intent = task.task.key.baseIntent + itemType = ITEM_TYPE_TASK + contentDescription = task.task.titleDescription + } + return TaskItemInfo(task.task.key.id, wii) } } @@ -95,16 +94,11 @@ class SingleTask(task: Task) : GroupTask(listOf(task), task.key.displayId, TaskV * A [Task] container that must contain exactly two tasks and split bounds to represent an app-pair * in the recent tasks list. */ -class SplitTask(task1: Task, task2: Task, val splitBounds: SplitBounds?) : - GroupTask(listOf(task1, task2), task1.key.displayId, TaskViewType.GROUPED) { +class SplitTask(task1: Task, task2: Task, val splitBounds: SplitConfigurationOptions.SplitBounds) : + GroupTask(listOf(task1, task2), TaskViewType.GROUPED) { val topLeftTask: Task - get() = - when { - splitBounds == null -> tasks[0] - splitBounds.leftTopTaskId == tasks[0].key.id -> tasks[0] - else -> tasks[1] - } + get() = if (splitBounds.leftTopTaskId == tasks[0].key.id) tasks[0] else tasks[1] val bottomRightTask: Task get() = if (topLeftTask == tasks[0]) tasks[1] else tasks[0] diff --git a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java index e197a93093..32c1e89e79 100644 --- a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java +++ b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java @@ -163,7 +163,7 @@ public class LauncherUnfoldAnimationController implements OnDeviceProfileChangeL @Override public void onDeviceProfileChanged(DeviceProfile dp) { - if (mIsTablet != null && dp.getDeviceProperties().isTablet() != mIsTablet) { + if (mIsTablet != null && dp.isTablet != mIsTablet) { // We should preemptively start the animation only if: // - We changed to the unfolded screen // - SystemUI IPC connection is alive, so we won't end up in a situation that we won't @@ -173,7 +173,7 @@ public class LauncherUnfoldAnimationController implements OnDeviceProfileChangeL // if Launcher was not open during unfold, in this case we receive the configuration // change only after we went back to home screen and we don't want to start the // animation in this case. - if (dp.getDeviceProperties().isTablet() + if (dp.isTablet && SystemUiProxy.INSTANCE.get(mLauncher).isActive() && !mExternalTransitionStatusProvider.hasRun()) { // Preemptively start the unfold animation to make sure that we have drawn @@ -181,12 +181,12 @@ public class LauncherUnfoldAnimationController implements OnDeviceProfileChangeL preemptivelyStartAnimationOnNextFrame(); } - if (!dp.getDeviceProperties().isTablet()) { + if (!dp.isTablet) { mExternalTransitionStatusProvider.onFolded(); } } - mIsTablet = dp.getDeviceProperties().isTablet(); + mIsTablet = dp.isTablet; } private class QsbAnimationListener implements TransitionProgressListener { diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java index 70cbd26122..a8460c9d7c 100644 --- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java +++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java @@ -34,8 +34,7 @@ public class LayoutUtils { * The height for the swipe up motion */ public static float getDefaultSwipeHeight(Context context, DeviceProfile dp) { - float swipeHeight = dp.getAllAppsProfile().getCellHeightPx() - - dp.getAllAppsProfile().getIconTextSizePx(); + float swipeHeight = dp.allAppsCellHeightPx - dp.allAppsIconTextSizePx; if (DisplayController.getNavigationMode(context) == NavigationMode.NO_BUTTON) { swipeHeight -= dp.getInsets().bottom; } diff --git a/quickstep/src/com/android/quickstep/util/QuickstepOnboardingPrefs.java b/quickstep/src/com/android/quickstep/util/QuickstepOnboardingPrefs.java index a6da2e9e02..70ef47cc77 100644 --- a/quickstep/src/com/android/quickstep/util/QuickstepOnboardingPrefs.java +++ b/quickstep/src/com/android/quickstep/util/QuickstepOnboardingPrefs.java @@ -82,7 +82,7 @@ public class QuickstepOnboardingPrefs { public void onStateTransitionComplete(LauncherState finalState) { HotseatPredictionController client = launcher.getHotseatPredictionController(); if (mFromAllApps && finalState == NORMAL && client.hasPredictions()) { - if (!launcher.getDeviceProfile().getDeviceProperties().isTablet() + if (!launcher.getDeviceProfile().isTablet && HOTSEAT_DISCOVERY_TIP_COUNT.increment(launcher)) { client.showEdu(); stateManager.removeStateListener(this); diff --git a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java index 33fe83e1d0..9cdde01ef9 100644 --- a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java +++ b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java @@ -16,13 +16,13 @@ package com.android.quickstep.util; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.OrientationEventListener.ORIENTATION_UNKNOWN; import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_180; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; +import static com.android.launcher3.Flags.enableOverviewOnConnectedDisplays; import static com.android.launcher3.LauncherPrefs.ALLOW_ROTATION; import static com.android.launcher3.LauncherPrefs.FIXED_LANDSCAPE_MODE; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; @@ -56,6 +56,7 @@ import com.android.launcher3.util.SettingsCache; import com.android.quickstep.BaseContainerInterface; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TaskAnimationManager; +import com.android.quickstep.fallback.window.RecentsDisplayModel; import com.android.quickstep.orientation.RecentsPagedOrientationHandler; import java.lang.annotation.Retention; @@ -147,7 +148,7 @@ public class RecentsOrientedState implements LauncherPrefChangeListener { IntConsumer rotationChangeListener) { mContext = context; mContainerInterface = containerInterface; - mOrientationListener = new OrientationEventListener(mContext) { + mOrientationListener = new OrientationEventListener(context) { @Override public void onOrientationChanged(int degrees) { int newRotation = getRotationForUserDegreesRotated(degrees, mPreviousRotation); @@ -175,7 +176,7 @@ public class RecentsOrientedState implements LauncherPrefChangeListener { */ public void setDeviceProfile(DeviceProfile deviceProfile) { boolean oldMultipleOrientationsSupported = isMultipleOrientationSupportedByDevice(); - setFlag(FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_DENSITY, !deviceProfile.getDeviceProperties().isTablet()); + setFlag(FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_DENSITY, !deviceProfile.isTablet); if (mListenersInitialized) { boolean newMultipleOrientationsSupported = isMultipleOrientationSupportedByDevice(); // If isMultipleOrientationSupportedByDevice is changed, init or destroy listeners @@ -419,20 +420,6 @@ public class RecentsOrientedState implements LauncherPrefChangeListener { | FLAG_HOME_ROTATION_FORCE_ENABLED_FOR_TESTING)) != 0; } - /** - * Returns if we should show the action buttons on the recent view based on the orientation - * state. - */ - public boolean shouldHideActionButtons() { - // In fixed landscape always show the action buttons - return !isLauncherFixedLandscape() - // When not in fixed landscape, do not show actions buttons when using - // fake landscape which happens when the rotation is not ROTATION_0 unless - // rotation is allowed - && (getTouchRotation() != ROTATION_0 || getRecentsActivityRotation() != ROTATION_0) - && !isRecentsActivityRotationAllowed(); - } - /** * Enables or disables the rotation watcher for listening to rotation callbacks */ @@ -613,8 +600,9 @@ public class RecentsOrientedState implements LauncherPrefChangeListener { * Returns the device profile based on expected launcher rotation */ public DeviceProfile getLauncherDeviceProfile(int displayId) { - if (displayId != DEFAULT_DISPLAY) { - return mContainerInterface.getCreatedContainer().getDeviceProfile(); + if (enableOverviewOnConnectedDisplays()) { + return RecentsDisplayModel.getINSTANCE().get(mContext).getRecentsWindowManager( + displayId).getDeviceProfile(); } else { InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(mContext); Point currentSize = DisplayController.INSTANCE.get(mContext).getInfo().currentSize; diff --git a/quickstep/src/com/android/quickstep/util/RectFSpringAnim.java b/quickstep/src/com/android/quickstep/util/RectFSpringAnim.java index f56c7a27d5..00b40116f7 100644 --- a/quickstep/src/com/android/quickstep/util/RectFSpringAnim.java +++ b/quickstep/src/com/android/quickstep/util/RectFSpringAnim.java @@ -346,7 +346,7 @@ public class RectFSpringAnim extends ReleaseCheck { // Increase the stiffness for devices where we want the window size to transform // quicker. boolean shouldUseHigherStiffness = profile != null - && (profile.getDeviceProperties().isLandscape() || profile.getDeviceProperties().isTablet()); + && (profile.isLandscape || profile.isTablet); float stiffness = shouldUseHigherStiffness ? rp.getFloat(R.dimen.swipe_up_rect_scale_higher_stiffness) : rp.getFloat(R.dimen.swipe_up_rect_scale_stiffness); @@ -549,7 +549,7 @@ public class RectFSpringAnim extends ReleaseCheck { // Increase the stiffness for devices where we want the window size to transform // quicker. boolean shouldUseHigherStiffness = deviceProfile != null - && (deviceProfile.getDeviceProperties().isLandscape() || deviceProfile.getDeviceProperties().isTablet()); + && (deviceProfile.isLandscape || deviceProfile.isTablet); rectStiffness = shouldUseHigherStiffness ? rp.getFloat(R.dimen.swipe_up_rect_scale_higher_stiffness) : rp.getFloat(R.dimen.swipe_up_rect_scale_stiffness); @@ -562,11 +562,11 @@ public class RectFSpringAnim extends ReleaseCheck { ? TRACKING_BOTTOM : TRACKING_TOP; } else { - int heightPx = deviceProfile.getDeviceProperties().getHeightPx(); + int heightPx = deviceProfile.heightPx; Rect padding = deviceProfile.workspacePadding; final float topThreshold = heightPx / 3f; - final float bottomThreshold = deviceProfile.getDeviceProperties().getHeightPx() - padding.bottom; + final float bottomThreshold = deviceProfile.heightPx - padding.bottom; if (targetRect.bottom > bottomThreshold) { if (enableScalingRevealHomeAnimation()) { diff --git a/quickstep/src/com/android/quickstep/util/ScalingWorkspaceRevealAnim.kt b/quickstep/src/com/android/quickstep/util/ScalingWorkspaceRevealAnim.kt index 9928b35acb..63eae921b0 100644 --- a/quickstep/src/com/android/quickstep/util/ScalingWorkspaceRevealAnim.kt +++ b/quickstep/src/com/android/quickstep/util/ScalingWorkspaceRevealAnim.kt @@ -19,27 +19,21 @@ package com.android.quickstep.util import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.AnimatorSet -import android.animation.ValueAnimator import android.graphics.Matrix import android.graphics.Path import android.graphics.RectF import android.util.Log -import android.view.SurfaceControl import android.view.View import android.view.animation.PathInterpolator import androidx.core.graphics.transform -import androidx.core.view.isVisible import com.android.app.animation.Animations import com.android.app.animation.Interpolators -import com.android.app.animation.Interpolators.EMPHASIZED import com.android.app.animation.Interpolators.LINEAR import com.android.launcher3.Flags import com.android.launcher3.LauncherAnimUtils.HOTSEAT_SCALE_PROPERTY_FACTORY import com.android.launcher3.LauncherAnimUtils.SCALE_INDEX_WORKSPACE_STATE -import com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA import com.android.launcher3.LauncherAnimUtils.WORKSPACE_SCALE_PROPERTY_FACTORY import com.android.launcher3.LauncherState -import com.android.launcher3.R import com.android.launcher3.anim.AnimatorListeners import com.android.launcher3.anim.PendingAnimation import com.android.launcher3.anim.PropertySetter @@ -83,14 +77,9 @@ class ScalingWorkspaceRevealAnim( cubicTo(0.235f, 0.6855f, 0.235f, 1f, 1f, 1f) } ) - - val BLUR_INTERPOLATOR = Interpolators.clampToProgress(EMPHASIZED, 0f, 0.666f) } private val animation = PendingAnimation(SCALE_DURATION_MS) - private var blurLayer: SurfaceControl? = null - private var surfaceTransactionApplier: SurfaceTransactionApplier = - SurfaceTransactionApplier(launcher.dragLayer) init { // Make sure the starting state is right for the animation. @@ -108,18 +97,21 @@ class ScalingWorkspaceRevealAnim( LauncherState.BACKGROUND_APP, setupConfig, ) - addBlurLayer() val workspace = launcher.workspace val hotseat = launcher.hotseat - // Interrupt the current animation, if any. - Animations.cancelOngoingAnimation(workspace) - Animations.cancelOngoingAnimation(hotseat) + var fromSize = + if (Flags.coordinateWorkspaceScale()) { + // Interrupt the current animation, if any. + Animations.cancelOngoingAnimation(workspace) + Animations.cancelOngoingAnimation(hotseat) - val fromSize = - if (workspace.scaleX != MAX_SIZE) { - workspace.scaleX + if (workspace.scaleX != MAX_SIZE) { + workspace.scaleX + } else { + MIN_SIZE + } } else { MIN_SIZE } @@ -146,17 +138,12 @@ class ScalingWorkspaceRevealAnim( // it's popping into existence out of nowhere. val fadeClamp = FADE_DURATION_MS.toFloat() / SCALE_DURATION_MS workspace.alpha = MIN_ALPHA - animation.setFloat( + animation.setViewAlpha( workspace, - VIEW_ALPHA, MAX_ALPHA, Interpolators.clampToProgress(LINEAR, 0f, fadeClamp), ) hotseat.alpha = MIN_ALPHA - // This needs to use setViewAlpha instead of setFloat (like workspace). - // This is because hotseat visibility can also be changed based off of alpha in - // WorkspaceRevealAnim which also calls setViewAlpha. - // b/428257480 Ideally we should be settings MultiValueAlpha with 2 channels instead. animation.setViewAlpha( hotseat, MAX_ALPHA, @@ -165,33 +152,14 @@ class ScalingWorkspaceRevealAnim( } val transitionConfig = StateAnimationConfig() - transitionConfig.duration = SCALE_DURATION_MS - // Match the Wallpaper depth to the rest of the content. + // Match the Wallpaper animation to the rest of the content. val depthController = (launcher as? QuickstepLauncher)?.depthController transitionConfig.setInterpolator(StateAnimationConfig.ANIM_DEPTH, SCALE_INTERPOLATOR) - depthController?.pauseBlursOnWindows(true) // Blurring is handled by the scrim layer. - depthController?.stateDepth?.value = LauncherState.BACKGROUND_APP.getDepth(launcher) depthController?.setStateWithAnimation(LauncherState.NORMAL, transitionConfig, animation) - // Add a blur animation to the scrim layer. - var maxBlurRadius = - launcher.resources.getDimensionPixelSize( - if (Flags.allAppsBlur() || Flags.enableOverviewBackgroundWallpaperBlur()) { - R.dimen.max_depth_blur_radius_enhanced - } else { - R.integer.max_depth_blur_radius - } - ) - val blurAnimator = ValueAnimator.ofFloat(1f, 0f) - blurAnimator.setInterpolator(BLUR_INTERPOLATOR) - blurAnimator.addUpdateListener { - applyBlur(maxBlurRadius * blurAnimator.animatedValue as Float) - } - animation.add(blurAnimator) - - // Make sure that the contrast scrim animates correctly (alongside the blur) if needed. - transitionConfig.setInterpolator(StateAnimationConfig.ANIM_SCRIM_FADE, BLUR_INTERPOLATOR) + // Make sure that the contrast scrim animates correctly if needed. + transitionConfig.setInterpolator(StateAnimationConfig.ANIM_SCRIM_FADE, SCALE_INTERPOLATOR) launcher.workspace.stateTransitionAnimation.setScrim( animation, LauncherState.NORMAL, @@ -249,36 +217,24 @@ class ScalingWorkspaceRevealAnim( } } ) - animation.addListener( AnimatorListeners.forEndCallback( Runnable { - Log.d(TAG, "onAnimationEnd, workspace and hotseat are visible") - // Ensure that the workspace and the hotseat are visible at the end - // of the animation regardless of what happens with this animation - // itself. - workspace.alpha = MAX_ALPHA - hotseat.alpha = MAX_ALPHA - if (!hotseat.isVisible || !workspace.isVisible) { - Log.e( - TAG, - "Unexpected invisibility after animation end:" + - " workspace.isVisible=${workspace.isVisible}" + - ", workspace.alpha=${workspace.alpha}" + - ", hotseat.isVisible=${hotseat.isVisible}" + - ", hotseat.alpha=${hotseat.alpha}", - Exception(), - ) - } + // The workspace might stay at a transparent state when the animation is + // cancelled, and the alpha will not be recovered (this doesn't apply to scales + // somehow). Resetting the alpha for the workspace here. + workspace.alpha = 1.0F workspace.setLayerType(View.LAYER_TYPE_NONE, null) hotseat.setLayerType(View.LAYER_TYPE_NONE, null) - // Reset the cached animations. - Animations.setOngoingAnimation(workspace, animation = null) - Animations.setOngoingAnimation(hotseat, animation = null) - removeBlurLayer() - depthController?.pauseBlursOnWindows(false) + if (Flags.coordinateWorkspaceScale()) { + // Reset the cached animations. + Animations.setOngoingAnimation(workspace, animation = null) + Animations.setOngoingAnimation(hotseat, animation = null) + } + + Log.d(TAG, "alpha of workspace at the end of animation: ${workspace.alpha}") } ) ) @@ -290,58 +246,13 @@ class ScalingWorkspaceRevealAnim( fun start() { val animators = getAnimators() - // Make sure to cache the current animation, so it can be properly interrupted. - // TODO(b/367591368): ideally these animations would be refactored to be controlled - // centrally so each instances doesn't need to care about this coordination. - Animations.setOngoingAnimation(launcher.workspace, animators) - Animations.setOngoingAnimation(launcher.hotseat, animators) - launcher.stateManager.setCurrentAnimation(animators, LauncherState.NORMAL) + if (Flags.coordinateWorkspaceScale()) { + // Make sure to cache the current animation, so it can be properly interrupted. + // TODO(b/367591368): ideally these animations would be refactored to be controlled + // centrally so each instances doesn't need to care about this coordination. + Animations.setOngoingAnimation(launcher.workspace, animators) + Animations.setOngoingAnimation(launcher.hotseat, animators) + } animators.start() } - - private fun addBlurLayer() { - val parent = launcher.dragLayer.viewRootImpl?.surfaceControl ?: return - if (!parent.isValid) { - Log.e(TAG, "Parent surface is not ready at the moment. Can't apply blur.") - return - } - val blurLayer = - SurfaceControl.Builder() - .setName("Home to launcher blur layer") - .setCallsite("ScalingWorkspaceRevealAnim") - .setParent(parent) - .setOpaque(false) - .setHidden(false) - .build() - - // Schedule the initial setup of the blur layer. - val setupTransaction = SurfaceTransaction() - setupTransaction.forSurface(blurLayer).setAlpha(0f).setShow() - surfaceTransactionApplier.scheduleApply(setupTransaction) - - this.blurLayer = blurLayer - } - - private fun removeBlurLayer() { - blurLayer?.let { - if (it.isValid) { - // Schedule the removal of the blur layer. - val removalTransaction = SurfaceTransaction() - removalTransaction.forSurface(it).setRemove() - surfaceTransactionApplier.scheduleApply(removalTransaction) - } - } - blurLayer = null - } - - private fun applyBlur(blurRadius: Float) { - blurLayer?.let { - if (it.isValid) { - // Schedule the blur update. - val blurUpdateTransaction = SurfaceTransaction() - blurUpdateTransaction.forSurface(it).setBackgroundBlurRadius(blurRadius.toInt()) - surfaceTransactionApplier.scheduleApply(blurUpdateTransaction) - } - } - } } diff --git a/quickstep/src/com/android/quickstep/util/SlideInRemoteTransition.kt b/quickstep/src/com/android/quickstep/util/SlideInRemoteTransition.kt index 15f59e425f..ece958395f 100644 --- a/quickstep/src/com/android/quickstep/util/SlideInRemoteTransition.kt +++ b/quickstep/src/com/android/quickstep/util/SlideInRemoteTransition.kt @@ -36,6 +36,8 @@ class SlideInRemoteTransition( private val pageSpacing: Int, private val cornerRadius: Float, private val interpolator: TimeInterpolator, + private val onStartCallback: Runnable, + private val onFinishCallback: Runnable, ) : RemoteTransitionStub() { private val animationDurationMs = 500L @@ -43,7 +45,7 @@ class SlideInRemoteTransition( transition: IBinder, info: TransitionInfo, startT: Transaction, - finishCB: IRemoteTransitionFinishedCallback, + finishCB: IRemoteTransitionFinishedCallback ) { val anim = ValueAnimator.ofFloat(0f, 1f) anim.interpolator = interpolator @@ -68,6 +70,7 @@ class SlideInRemoteTransition( startT.setCrop(leash, chg.endAbsBounds).setCornerRadius(leash, cornerRadius) } } + onStartCallback.run() startT.apply() anim.addUpdateListener { @@ -97,6 +100,7 @@ class SlideInRemoteTransition( val t = Transaction() try { finishCB.onTransitionFinished(null, t) + onFinishCallback.run() } catch (e: RemoteException) { // Ignore } diff --git a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt index 55644bd3f3..8601350b8f 100644 --- a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt +++ b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt @@ -36,7 +36,6 @@ import android.view.RemoteAnimationTarget import android.view.SurfaceControl import android.view.SurfaceControl.Transaction import android.view.View -import android.view.WindowManager.TRANSIT_CHANGE import android.view.WindowManager.TRANSIT_OPEN import android.view.WindowManager.TRANSIT_TO_FRONT import android.window.TransitionInfo @@ -47,6 +46,7 @@ import androidx.core.util.component1 import androidx.core.util.component2 import com.android.app.animation.Interpolators import com.android.launcher3.DeviceProfile +import com.android.launcher3.Flags.enableOverviewIconMenu import com.android.launcher3.Flags.enableRefactorTaskThumbnail import com.android.launcher3.InsettableFrameLayout import com.android.launcher3.QuickstepTransitionManager @@ -60,13 +60,11 @@ import com.android.launcher3.model.data.WorkspaceItemInfo import com.android.launcher3.statehandlers.DepthController import com.android.launcher3.statemanager.StateManager import com.android.launcher3.taskbar.TaskbarActivityContext +import com.android.launcher3.uioverrides.QuickstepLauncher import com.android.launcher3.util.MultiPropertyFactory.MULTI_PROPERTY_VALUE -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource -import com.android.launcher3.views.ActivityContext import com.android.launcher3.views.BaseDragLayer import com.android.quickstep.TaskViewUtils -import com.android.quickstep.util.SplitScreenUtils.Companion.extractTopParentAndChildren import com.android.quickstep.views.FloatingAppPairView import com.android.quickstep.views.FloatingTaskView import com.android.quickstep.views.GroupedTaskView @@ -193,7 +191,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC taskViewHeight: Int, isPrimaryTaskSplitting: Boolean, ) { - val taskContentView = taskContainer.taskContentView + val snapshot = taskContainer.snapshotView val iconView: View = taskContainer.iconView.asView() if (enableRefactorTaskThumbnail()) { builder.add( @@ -242,11 +240,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC val centerThumbnailTranslationX: Float = (taskViewWidth - snapshotViewSize.x) / 2f val finalScaleX: Float = taskViewWidth.toFloat() / snapshotViewSize.x builder.add( - ObjectAnimator.ofFloat( - taskContentView, - View.TRANSLATION_X, - centerThumbnailTranslationX, - ) + ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_X, centerThumbnailTranslationX) ) if (!enableOverviewIconMenu()) { // icons are anchored from Gravity.END, so need to use negative translation @@ -255,20 +249,17 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC ObjectAnimator.ofFloat(iconView, View.TRANSLATION_X, -centerIconTranslationX) ) } - builder.add(ObjectAnimator.ofFloat(taskContentView, View.SCALE_X, finalScaleX)) + builder.add(ObjectAnimator.ofFloat(snapshot, View.SCALE_X, finalScaleX)) // Reset other dimensions // TODO(b/271468547), can't set Y translate to 0, need to account for top space - taskContentView.scaleY = 1f + snapshot.scaleY = 1f val translateYResetVal: Float = if (!isPrimaryTaskSplitting) 0f - else deviceProfile.overviewProfile.taskThumbnailTopMarginPx.toFloat() - builder.add( - ObjectAnimator.ofFloat(taskContentView, View.TRANSLATION_Y, translateYResetVal) - ) + else deviceProfile.overviewTaskThumbnailTopMarginPx.toFloat() + builder.add(ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_Y, translateYResetVal)) } else { - val thumbnailSize = - taskViewHeight - deviceProfile.overviewProfile.taskThumbnailTopMarginPx + val thumbnailSize = taskViewHeight - deviceProfile.overviewTaskThumbnailTopMarginPx // Center view first so scaling happens uniformly, alternatively we can move pivotY to 0 // primary thumbnail has layout margin above it, so secondary thumbnail needs to take // that into account. We should migrate to only using translations otherwise this @@ -283,28 +274,24 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC if (isPrimaryTaskSplitting) { centerThumbnailTranslationY = (thumbnailSize - snapshotViewSize.y) / 2f centerThumbnailTranslationY += - deviceProfile.overviewProfile.taskThumbnailTopMarginPx.toFloat() + deviceProfile.overviewTaskThumbnailTopMarginPx.toFloat() } else { centerThumbnailTranslationY = (thumbnailSize - snapshotViewSize.y) / 2f } val finalScaleY: Float = thumbnailSize.toFloat() / snapshotViewSize.y builder.add( - ObjectAnimator.ofFloat( - taskContentView, - View.TRANSLATION_Y, - centerThumbnailTranslationY, - ) + ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_Y, centerThumbnailTranslationY) ) if (!enableOverviewIconMenu()) { // icons are anchored from Gravity.END, so need to use negative translation builder.add(ObjectAnimator.ofFloat(iconView, View.TRANSLATION_X, 0f)) } - builder.add(ObjectAnimator.ofFloat(taskContentView, View.SCALE_Y, finalScaleY)) + builder.add(ObjectAnimator.ofFloat(snapshot, View.SCALE_Y, finalScaleY)) // Reset other dimensions - taskContentView.scaleX = 1f - builder.add(ObjectAnimator.ofFloat(taskContentView, View.TRANSLATION_X, 0f)) + snapshot.scaleX = 1f + builder.add(ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_X, 0f)) } } @@ -329,16 +316,14 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC // Make the scrim fullscreen val lp = scrim.layoutParams as InsettableFrameLayout.LayoutParams lp.topMargin = 0 - lp.height = dp.deviceProperties.heightPx - lp.width = dp.deviceProperties.widthPx + lp.height = dp.heightPx + lp.width = dp.widthPx scrim.alpha = 0f scrim.setBackgroundColor( container.asContext().resources.getColor(R.color.taskbar_background_dark) ) - val timings = - AnimUtils.getDeviceSplitToConfirmTimings(dp.deviceProperties.isTablet) - as SplitToConfirmTimings + val timings = AnimUtils.getDeviceSplitToConfirmTimings(dp.isTablet) as SplitToConfirmTimings pendingAnimation.setViewAlpha( scrim, 1f, @@ -431,10 +416,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC safeRemoveViewFromDragLayer(container, splitSelectStateController.splitInstructionsView) val splitInstructionsView = SplitInstructionsView.getSplitInstructionsView(container) splitSelectStateController.splitInstructionsView = splitInstructionsView - val timings = - AnimUtils.getDeviceOverviewToSplitTimings( - container.deviceProfile.deviceProperties.isTablet - ) + val timings = AnimUtils.getDeviceOverviewToSplitTimings(container.deviceProfile.isTablet) val anim = PendingAnimation(100 /*duration */) splitInstructionsView.alpha = 0f anim.setViewAlpha( @@ -477,7 +459,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC ) { val stagedTaskView = view as FloatingTaskView - val isTablet: Boolean = container.deviceProfile.deviceProperties.isTablet + val isTablet: Boolean = container.deviceProfile.isTablet val duration = if (isTablet) SplitAnimationTimings.TABLET_CONFIRM_DURATION else SplitAnimationTimings.PHONE_CONFIRM_DURATION @@ -741,13 +723,14 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC } // Else we are in Launcher and can launch with the full icon stretch-and-split animation. - val launcher: ActivityContext = ActivityContext.lookupContext(launchingIconView.context) + val launcher = QuickstepLauncher.getLauncher(launchingIconView.context) val dp = launcher.deviceProfile // Create an AnimatorSet that will run both shell and launcher transitions together val launchAnimation = AnimatorSet() - val splitRoots: Pair>? = extractTopParentAndChildren(transitionInfo) + val splitRoots: Pair>? = + SplitScreenUtils.extractTopParentAndChildren(transitionInfo) check(splitRoots != null) { "Could not find split roots" } // Will point to change (0) in diagram above @@ -833,7 +816,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC } // Else we are in Launcher and can launch with the full icon stretch-and-split animation. - val launcher: ActivityContext = ActivityContext.lookupContext(launchingIconView.context) + val launcher = QuickstepLauncher.getLauncher(launchingIconView.context) val dp = launcher.deviceProfile // Create an AnimatorSet that will run both shell and launcher transitions together @@ -890,14 +873,14 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC private fun getIconLaunchValueAnimator( t: Transaction, - dp: DeviceProfile, + dp: com.android.launcher3.DeviceProfile, finishCallback: Runnable, - launcher: ActivityContext, + launcher: QuickstepLauncher, floatingView: FloatingAppPairView, rootCandidate: Change, ): ValueAnimator { val progressUpdater = ValueAnimator.ofFloat(0f, 1f) - val timings = AnimUtils.getDeviceAppPairLaunchTimings(dp.deviceProperties.isTablet) + val timings = AnimUtils.getDeviceAppPairLaunchTimings(dp.isTablet) progressUpdater.setDuration(timings.getDuration().toLong()) progressUpdater.interpolator = Interpolators.LINEAR @@ -921,8 +904,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC var mDx = FloatProp( floatingView.startingPosition.left, - dp.deviceProperties.widthPx / 2f - - floatingView.startingPosition.width() / 2f, + dp.widthPx / 2f - floatingView.startingPosition.width() / 2f, Interpolators.clampToProgress( timings.getStagedRectXInterpolator(), timings.stagedRectSlideStartOffset, @@ -932,8 +914,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC var mDy = FloatProp( floatingView.startingPosition.top, - dp.deviceProperties.heightPx / 2f - - floatingView.startingPosition.height() / 2f, + dp.heightPx / 2f - floatingView.startingPosition.height() / 2f, Interpolators.clampToProgress( Interpolators.EMPHASIZED, timings.stagedRectSlideStartOffset, @@ -943,7 +924,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC var mScaleX = FloatProp( 1f /* start */, - dp.deviceProperties.widthPx / floatingView.startingPosition.width(), + dp.widthPx / floatingView.startingPosition.width(), Interpolators.clampToProgress( Interpolators.EMPHASIZED, timings.stagedRectSlideStartOffset, @@ -953,7 +934,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC var mScaleY = FloatProp( 1f /* start */, - dp.deviceProperties.heightPx / floatingView.startingPosition.height(), + dp.heightPx / floatingView.startingPosition.height(), Interpolators.clampToProgress( Interpolators.EMPHASIZED, timings.stagedRectSlideStartOffset, @@ -1000,18 +981,35 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC progressUpdater.setDuration(QuickstepTransitionManager.APP_LAUNCH_DURATION) progressUpdater.interpolator = Interpolators.EMPHASIZED - val splitTree: Pair>? = extractTopParentAndChildren(transitionInfo) - check(splitTree != null) { "Could not find a split root candidate" } - val rootCandidate = splitTree.first - val stageRootTaskIds: Set = splitTree.second.map { it.taskInfo!!.taskId }.toSet() - val leafTasks: List = - transitionInfo.changes - .filter { - (TransitionUtil.isOpeningMode(it.mode) || it.mode == TRANSIT_CHANGE) && - it.taskInfo != null && - it.taskInfo!!.parentTaskId in stageRootTaskIds - } - .toList() + var rootCandidate: Change? = null + + for (change in transitionInfo.changes) { + val taskInfo: RunningTaskInfo = change.taskInfo ?: continue + + // TODO (b/316490565): Replace this logic when SplitBounds is available to + // startAnimation() and we can know the precise taskIds of launching tasks. + if ( + taskInfo.windowingMode == windowingMode && + (change.mode == TRANSIT_OPEN || change.mode == TRANSIT_TO_FRONT) + ) { + // Found one! + rootCandidate = change + break + } + } + + // If we could not find a proper root candidate, something went wrong. + check(rootCandidate != null) { "Could not find a split root candidate" } + + // Recurse up the tree until parent is null, then we've found our root. + var parentToken: WindowContainerToken? = rootCandidate.parent + while (parentToken != null) { + rootCandidate = transitionInfo.getChange(parentToken) ?: break + parentToken = rootCandidate.parent + } + + // Make sure nothing weird happened, like getChange() returning null. + check(rootCandidate != null) { "Failed to find a root leash" } // Starting position is a 34% size tile centered in the middle of the screen. // Ending position is the full device screen. @@ -1045,42 +1043,6 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC override fun onAnimationEnd(animation: Animator) { finishCallback.run() } - - override fun onAnimationStart(animation: Animator) { - // Reset leaf and stage root tasks, animation can begin from freeform windows - for (leaf in leafTasks) { - val endAbsBounds = leaf.endAbsBounds - - t.setAlpha(leaf.leash, 1f) - t.setCrop( - leaf.leash, - 0f, - 0f, - endAbsBounds.width().toFloat(), - endAbsBounds.height().toFloat(), - ) - t.setPosition(leaf.leash, 0f, 0f) - } - - for (stageRoot in splitTree.second) { - val endAbsBounds = stageRoot.endAbsBounds - - t.setAlpha(stageRoot.leash, 1f) - t.setCrop( - stageRoot.leash, - 0f, - 0f, - endAbsBounds.width().toFloat(), - endAbsBounds.height().toFloat(), - ) - t.setPosition( - stageRoot.leash, - endAbsBounds.left.toFloat(), - endAbsBounds.top.toFloat(), - ) - } - t.apply() - } } ) @@ -1192,7 +1154,7 @@ class SplitAnimationController(val splitSelectStateController: SplitSelectStateC animator.start() } - private fun safeRemoveViewFromDragLayer(container: ActivityContext, view: View?) { + private fun safeRemoveViewFromDragLayer(container: RecentsViewContainer, view: View?) { if (view != null) { container.dragLayer.removeView(view) } diff --git a/quickstep/src/com/android/quickstep/util/SplitScreenUtils.kt b/quickstep/src/com/android/quickstep/util/SplitScreenUtils.kt index 2eb848216d..4005c5a813 100644 --- a/quickstep/src/com/android/quickstep/util/SplitScreenUtils.kt +++ b/quickstep/src/com/android/quickstep/util/SplitScreenUtils.kt @@ -17,18 +17,31 @@ package com.android.quickstep.util import android.util.Log -import android.view.WindowManager.TRANSIT_CHANGE +import android.view.WindowManager.TRANSIT_OPEN +import android.view.WindowManager.TRANSIT_TO_FRONT import android.window.TransitionInfo import android.window.TransitionInfo.Change import android.window.TransitionInfo.FLAG_FIRST_CUSTOM import com.android.launcher3.util.SplitConfigurationOptions -import com.android.wm.shell.shared.TransitionUtil import com.android.wm.shell.shared.split.SplitBounds +import java.lang.IllegalStateException class SplitScreenUtils { companion object { private const val TAG = "SplitScreenUtils" + // TODO(b/254378592): Remove these methods when the two classes are reunited + /** Converts the shell version of SplitBounds to the launcher version */ + @JvmStatic + fun convertShellSplitBoundsToLauncher(shellSplitBounds: SplitBounds) = + SplitConfigurationOptions.SplitBounds( + shellSplitBounds.leftTopBounds, + shellSplitBounds.rightBottomBounds, + shellSplitBounds.leftTopTaskId, + shellSplitBounds.rightBottomTaskId, + shellSplitBounds.snapPosition, + ) + /** * Given a TransitionInfo, generates the tree structure for those changes and extracts out * the top most root and it's two immediate children. Changes can be provided in any order. @@ -41,7 +54,14 @@ class SplitScreenUtils { ): Pair>? { val parentToChildren = mutableMapOf>() val hasParent = mutableSetOf() - val taskChanges: List = getNonClosingChanges(transitionInfo) + // filter out anything that isn't opening and the divider + val taskChanges: List = + transitionInfo.changes + .filter { change -> + (change.mode == TRANSIT_OPEN || change.mode == TRANSIT_TO_FRONT) && + change.flags < FLAG_FIRST_CUSTOM + } + .toList() // 1. Build Parent-Child Relationships for (change in taskChanges) { @@ -70,16 +90,5 @@ class SplitScreenUtils { null } } - - - /** @return includes only opening + [TRANSIT_CHANGE] changes and the divider */ - private fun getNonClosingChanges(transitionInfo: TransitionInfo): List { - return transitionInfo.changes - .filter { change -> - (TransitionUtil.isOpeningMode(change.mode) || change.mode == TRANSIT_CHANGE) - && change.flags < FLAG_FIRST_CUSTOM - } - .toList() - } } } diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java index fd30e2037c..08f2552157 100644 --- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java +++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java @@ -63,7 +63,6 @@ import android.window.IRemoteTransitionFinishedCallback; import android.window.RemoteTransition; import android.window.RemoteTransitionStub; import android.window.TransitionInfo; -import android.window.WindowContainerTransaction; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -303,10 +302,6 @@ public class SplitSelectStateController { if (task == null || task.key.id == mSplitSelectDataHolder.getInitialTaskId()) { return false; } - if (task.key.baseIntent.getComponent() == null) { - Log.w(TAG, "Task has null component."); - return false; - } return task.key.baseIntent.getComponent().equals(componentKey.componentName) && task.key.userId == componentKey.user.getIdentifier(); @@ -883,8 +878,7 @@ public class SplitSelectStateController { * @param taskBounds the bounds of the task, used for {@link FloatingTaskView} animation */ public void enterSplitSelect(ActivityManager.RunningTaskInfo taskInfo, - int splitPosition, Rect taskBounds, boolean startRecents, - @Nullable WindowContainerTransaction withRecentsWct) { + int splitPosition, Rect taskBounds) { mTaskInfo = taskInfo; String packageName = mTaskInfo.realActivity.getPackageName(); PackageManager pm = mLauncher.getApplicationContext().getPackageManager(); @@ -895,72 +889,53 @@ public class SplitSelectStateController { } catch (PackageManager.NameNotFoundException e) { Log.w(TAG, "Package not found: " + packageName, e); } + RecentsAnimationCallbacks callbacks = new RecentsAnimationCallbacks( + SystemUiProxy.INSTANCE.get(mLauncher.getApplicationContext())); - final DesktopSplitRecentsAnimation animation = new DesktopSplitRecentsAnimation( - splitPosition, taskBounds); - final Runnable updateTaskbarRunnable = () -> { - final LauncherTaskbarUIController c = mLauncher.getTaskbarUIController(); - if (c != null) { - c.updateTaskbarLauncherStateGoingHome(); - } - }; - if (startRecents) { - RecentsAnimationCallbacks callbacks = new RecentsAnimationCallbacks(mContainer); - callbacks.addListener(new RecentsAnimationCallbacks.RecentsAnimationListener() { - @Override - public void onRecentsAnimationStart(RecentsAnimationController controller, - RecentsAnimationTargets targets, - @Nullable TransitionInfo transitionInfo) { - animation.start(() -> { - controller.finish( - true /* toRecents */, - updateTaskbarRunnable, - false /* sendUserLeaveHint */); - }); - } - }); - UI_HELPER_EXECUTOR.execute(() -> { - // Transition from app to enter stage split in launcher with recents animation - final ActivityOptions options = ActivityOptions.makeBasic(); - options.setPendingIntentBackgroundActivityStartMode( - ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS); - options.setTransientLaunch(); - SystemUiProxy.INSTANCE.get(mLauncher.getApplicationContext()) - .startRecentsActivity( - mOverviewComponentObserver.getOverviewIntent(), options, - callbacks, false /* useSyntheticRecentsTransition */, - withRecentsWct, - ExternalDisplaysKt.getSafeDisplayId(taskInfo)); - }); - } else { - animation.start(updateTaskbarRunnable); - } + DesktopSplitRecentsAnimationListener listener = + new DesktopSplitRecentsAnimationListener(splitPosition, taskBounds); + + callbacks.addListener(listener); + UI_HELPER_EXECUTOR.execute(() -> { + // Transition from app to enter stage split in launcher with recents animation + final ActivityOptions options = ActivityOptions.makeBasic(); + options.setPendingIntentBackgroundActivityStartMode( + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS); + options.setTransientLaunch(); + SystemUiProxy.INSTANCE.get(mLauncher.getApplicationContext()) + .startRecentsActivity( + mOverviewComponentObserver.getOverviewIntent(), options, + callbacks, false /* useSyntheticRecentsTransition */); + }); } - private class DesktopSplitRecentsAnimation { + private class DesktopSplitRecentsAnimationListener implements + RecentsAnimationCallbacks.RecentsAnimationListener { private final Rect mTempRect = new Rect(); private final RectF mTaskBounds = new RectF(); private final int mSplitPosition; - DesktopSplitRecentsAnimation(int splitPosition, Rect taskBounds) { + DesktopSplitRecentsAnimationListener(int splitPosition, Rect taskBounds) { mSplitPosition = splitPosition; mTaskBounds.set(taskBounds); } - void start(@NonNull Runnable onAnimationStart) { - final StatsLogManager.LauncherEvent launcherDesktopSplitEvent = + @Override + public void onRecentsAnimationStart(RecentsAnimationController controller, + RecentsAnimationTargets targets, TransitionInfo transitionInfo) { + StatsLogManager.LauncherEvent launcherDesktopSplitEvent = mSplitPosition == STAGE_POSITION_BOTTOM_OR_RIGHT ? - LAUNCHER_DESKTOP_MODE_SPLIT_RIGHT_BOTTOM : - LAUNCHER_DESKTOP_MODE_SPLIT_LEFT_TOP; + LAUNCHER_DESKTOP_MODE_SPLIT_RIGHT_BOTTOM : + LAUNCHER_DESKTOP_MODE_SPLIT_LEFT_TOP; setInitialTaskSelect(mTaskInfo, mSplitPosition, null, launcherDesktopSplitEvent); - final RecentsView recentsView = mLauncher.getOverviewPanel(); + RecentsView recentsView = mLauncher.getOverviewPanel(); recentsView.getPagedOrientationHandler().getInitialSplitPlaceholderBounds( mSplitPlaceholderSize, mSplitPlaceholderInset, mLauncher.getDeviceProfile(), getActiveSplitStagePosition(), mTempRect); - final PendingAnimation anim = new PendingAnimation( + PendingAnimation anim = new PendingAnimation( SplitAnimationTimings.TABLET_HOME_TO_SPLIT.getDuration()); final FloatingTaskView floatingTaskView = FloatingTaskView.getFloatingTaskView( mLauncher, mLauncher.getDragLayer(), @@ -978,7 +953,17 @@ public class SplitSelectStateController { anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { - onAnimationStart.run(); + controller.finish( + true /* toRecents */, + () -> { + LauncherTaskbarUIController controller = + mLauncher.getTaskbarUIController(); + if (controller != null) { + controller.updateTaskbarLauncherStateGoingHome(); + } + + }, + false /* sendUserLeaveHint */); } @Override public void onAnimationEnd(Animator animation) { @@ -1021,12 +1006,10 @@ public class SplitSelectStateController { @Override public boolean onRequestSplitSelect(ActivityManager.RunningTaskInfo taskInfo, - int splitPosition, Rect taskBounds, boolean startRecents, - @Nullable WindowContainerTransaction withRecentsWct) { + int splitPosition, Rect taskBounds) { MAIN_EXECUTOR.execute(() -> { if (mController != null) { - mController.enterSplitSelect(taskInfo, splitPosition, taskBounds, - startRecents, withRecentsWct); + mController.enterSplitSelect(taskInfo, splitPosition, taskBounds); } }); return true; diff --git a/quickstep/src/com/android/quickstep/util/SplitToWorkspaceController.java b/quickstep/src/com/android/quickstep/util/SplitToWorkspaceController.java index abd24588d4..d3390b4ed9 100644 --- a/quickstep/src/com/android/quickstep/util/SplitToWorkspaceController.java +++ b/quickstep/src/com/android/quickstep/util/SplitToWorkspaceController.java @@ -157,7 +157,7 @@ public class SplitToWorkspaceController { private void startWorkspaceAnimation(@NonNull View view, @Nullable Bitmap bitmap, @Nullable Drawable icon) { DeviceProfile dp = mLauncher.getDeviceProfile(); - boolean isTablet = dp.getDeviceProperties().isTablet(); + boolean isTablet = dp.isTablet; SplitAnimationTimings timings = AnimUtils.getDeviceSplitToConfirmTimings(isTablet); PendingAnimation pendingAnimation = new PendingAnimation(timings.getDuration()); diff --git a/quickstep/src/com/android/quickstep/util/SplitWithKeyboardShortcutController.java b/quickstep/src/com/android/quickstep/util/SplitWithKeyboardShortcutController.java index e3fc56178e..0e2713981d 100644 --- a/quickstep/src/com/android/quickstep/util/SplitWithKeyboardShortcutController.java +++ b/quickstep/src/com/android/quickstep/util/SplitWithKeyboardShortcutController.java @@ -37,7 +37,6 @@ import com.android.launcher3.R; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.taskbar.LauncherTaskbarUIController; import com.android.launcher3.uioverrides.QuickstepLauncher; -import com.android.quickstep.BaseContainerInterface; import com.android.quickstep.OverviewComponentObserver; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.RecentsAnimationController; @@ -73,18 +72,13 @@ public class SplitWithKeyboardShortcutController { } @BinderThread - public void enterStageSplit(boolean leftOrTop, int displayId) { + public void enterStageSplit(boolean leftOrTop) { if (TopTaskTracker.INSTANCE.get(mLauncher).getRunningSplitTaskIds().length == 2) { // Do not enter stage split from keyboard shortcuts if the user is already in split return; } - BaseContainerInterface containerInterface = - mOverviewComponentObserver.getContainerInterface(displayId); - if (containerInterface == null) { - return; - } RecentsAnimationCallbacks callbacks = new RecentsAnimationCallbacks( - containerInterface.getCreatedContainer()); + SystemUiProxy.INSTANCE.get(mLauncher.getApplicationContext())); SplitWithKeyboardShortcutRecentsAnimationListener listener = new SplitWithKeyboardShortcutRecentsAnimationListener(leftOrTop); @@ -100,7 +94,7 @@ public class SplitWithKeyboardShortcutController { SystemUiProxy.INSTANCE.get(mLauncher.getApplicationContext()) .startRecentsActivity(mOverviewComponentObserver.getOverviewIntent(), ActivityOptions.makeBasic(), callbacks, - false /* useSyntheticRecentsTransition */, null, displayId); + false /* useSyntheticRecentsTransition */); }); }); } diff --git a/quickstep/src/com/android/quickstep/util/SurfaceTransaction.java b/quickstep/src/com/android/quickstep/util/SurfaceTransaction.java index f29df91e28..8006a97936 100644 --- a/quickstep/src/com/android/quickstep/util/SurfaceTransaction.java +++ b/quickstep/src/com/android/quickstep/util/SurfaceTransaction.java @@ -111,15 +111,6 @@ public class SurfaceTransaction { return this; } - /** - * @param radius The radius for the background blur to apply to the surface. - * @return this Builder - */ - public SurfaceProperties setBackgroundBlurRadius(int radius) { - mTransaction.setBackgroundBlurRadius(mSurface, radius); - return this; - } - /** * Requests to show the given surface. * @return this Builder @@ -128,15 +119,6 @@ public class SurfaceTransaction { mTransaction.show(mSurface); return this; } - - /** - * Requests to remove the given surface. - * @return this Builder - */ - public SurfaceProperties setRemove() { - mTransaction.remove(mSurface); - return this; - } } /** @@ -149,7 +131,6 @@ public class SurfaceTransaction { public Rect windowCrop = null; public float cornerRadius = 0; public float shadowRadius = 0; - public int backgroundBlurRadius = 0; protected MockProperties() { super(null); @@ -190,20 +171,9 @@ public class SurfaceTransaction { return this; } - @Override - public SurfaceProperties setBackgroundBlurRadius(int radius) { - this.backgroundBlurRadius = radius; - return this; - } - @Override public SurfaceProperties setShow() { return this; } - - @Override - public SurfaceProperties setRemove() { - return this; - } } } diff --git a/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java b/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java index 6e2c6daa6b..b3ab4df1b6 100644 --- a/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java +++ b/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java @@ -25,7 +25,6 @@ import android.view.DisplayCutout; import android.view.Surface; import android.view.WindowManager; import android.view.WindowMetrics; -import android.window.DesktopExperienceFlags; import com.android.internal.policy.SystemBarUtils; import com.android.launcher3.dagger.LauncherAppSingleton; @@ -35,9 +34,8 @@ import com.android.launcher3.util.WindowBounds; import com.android.launcher3.util.window.CachedDisplayInfo; import com.android.launcher3.util.window.WindowManagerProxy; import com.android.quickstep.SystemUiProxy; -import com.android.quickstep.fallback.window.RecentsWindowFlags; +import com.android.window.flags.Flags; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; -import com.android.wm.shell.shared.desktopmode.DesktopState; import java.util.Collections; import java.util.List; @@ -53,15 +51,12 @@ public class SystemWindowManagerProxy extends WindowManagerProxy { // LC-Note: This is pretty much unused by Launcher3, see [LawnchairWindowManagerProxy] private final DesktopVisibilityController mDesktopVisibilityController; - private final SystemUiProxy mSystemUiProxy; + @Inject - public SystemWindowManagerProxy( - DesktopVisibilityController desktopVisibilityController, - SystemUiProxy systemUiProxy) { + public SystemWindowManagerProxy(DesktopVisibilityController desktopVisibilityController) { super(true); mDesktopVisibilityController = desktopVisibilityController; - mSystemUiProxy = systemUiProxy; } @Override @@ -85,15 +80,6 @@ public class SystemWindowManagerProxy extends WindowManagerProxy { return mDesktopVisibilityController.isInDesktopMode(displayId); } - @Override - public boolean isDisplayDesktopFirst(Context displayInfoContext) { - if (!DesktopState.fromContext(displayInfoContext).canEnterDesktopMode()) { - return false; - } - return displayInfoContext.getResources().getConfiguration() - .windowConfiguration.getWindowingMode() == WINDOWING_MODE_FREEFORM; - } - @Override public boolean showLockedTaskbarOnHome(Context displayInfoContext) { if (!DesktopModeStatus.canEnterDesktopMode(displayInfoContext)) { @@ -102,8 +88,9 @@ public class SystemWindowManagerProxy extends WindowManagerProxy { if (!DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(displayInfoContext)) { return false; } - - return isDisplayDesktopFirst(displayInfoContext); + final boolean isFreeformDisplay = displayInfoContext.getResources().getConfiguration() + .windowConfiguration.getWindowingMode() == WINDOWING_MODE_FREEFORM; + return isFreeformDisplay; } @Override @@ -116,16 +103,18 @@ public class SystemWindowManagerProxy extends WindowManagerProxy { return false; } - if (!DesktopExperienceFlags.ENABLE_DESKTOP_TASKBAR_ON_FREEFORM_DISPLAYS.isTrue()) { + if (!Flags.enableDesktopTaskbarOnFreeformDisplays()) { return false; } - return isDisplayDesktopFirst(displayInfoContext); + final boolean isFreeformDisplay = displayInfoContext.getResources().getConfiguration() + .windowConfiguration.getWindowingMode() == WINDOWING_MODE_FREEFORM; + return isFreeformDisplay; } @Override - public boolean isHomeVisible() { - return mSystemUiProxy.getHomeVisibilityState().isHomeVisible(); + public boolean isHomeVisible(Context context) { + return SystemUiProxy.INSTANCE.get(context).getHomeVisibilityState().isHomeVisible(); } @Override @@ -167,9 +156,4 @@ public class SystemWindowManagerProxy extends WindowManagerProxy { int fromRotation, int toRotation) { return original.getRotated(startWidth, startHeight, fromRotation, toRotation); } - - @Override - public boolean enableOverviewOnConnectedDisplays() { - return RecentsWindowFlags.enableOverviewOnConnectedDisplays(); - } } diff --git a/quickstep/src/com/android/quickstep/util/TaskGridNavHelper.kt b/quickstep/src/com/android/quickstep/util/TaskGridNavHelper.kt index bf60b87b89..0e788015cd 100644 --- a/quickstep/src/com/android/quickstep/util/TaskGridNavHelper.kt +++ b/quickstep/src/com/android/quickstep/util/TaskGridNavHelper.kt @@ -59,10 +59,6 @@ class TaskGridNavHelper( cycle: Boolean, ): Int { val inTop = topRowIds.contains(currentPageTaskViewId) - val inBottom = bottomRowIds.contains(currentPageTaskViewId) - if (!inTop && !inBottom) { - return currentPageTaskViewId - } val index = if (inTop) topRowIds.indexOf(currentPageTaskViewId) else bottomRowIds.indexOf(currentPageTaskViewId) diff --git a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java index bb140676fd..58d8b78962 100644 --- a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java +++ b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java @@ -17,15 +17,15 @@ package com.android.quickstep.util; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static com.android.launcher3.Flags.enableGridOnlyOverview; import static com.android.launcher3.states.RotationHelper.deltaRotation; import static com.android.launcher3.touch.PagedOrientationHandler.MATRIX_POST_TRANSLATE; -import static com.android.launcher3.util.OverviewReleaseFlags.enableGridOnlyOverview; +import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT; +import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT; +import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED; +import static com.android.launcher3.util.SplitConfigurationOptions.StagePosition; import static com.android.quickstep.util.RecentsOrientedState.postDisplayRotation; import static com.android.quickstep.util.RecentsOrientedState.preDisplayRotation; -import static com.android.wm.shell.Flags.enableFlexibleTwoAppSplit; -import static com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; -import static com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; -import static com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED; import android.animation.TimeInterpolator; import android.content.Context; @@ -45,6 +45,7 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.anim.PendingAnimation; +import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.BaseActivityInterface; import com.android.quickstep.BaseContainerInterface; @@ -54,8 +55,6 @@ import com.android.quickstep.TaskAnimationManager; import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.recents.utilities.PreviewPositionHelper; -import com.android.wm.shell.shared.split.SplitBounds; -import com.android.wm.shell.shared.split.SplitScreenConstants; /** * A utility class which emulates the layout behavior of TaskView and RecentsView @@ -82,8 +81,8 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { private PointF mPivotOverride = null; private final PointF mPivot = new PointF(); private DeviceProfile mDp; - @SplitScreenConstants.SplitPosition - private int mSplitPosition = SPLIT_POSITION_UNDEFINED; + @StagePosition + private int mStagePosition = STAGE_POSITION_UNDEFINED; private final Matrix mMatrix = new Matrix(); private final Matrix mMatrixTmp = new Matrix(); @@ -116,11 +115,12 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { private int mOrientationStateId; private SplitBounds mSplitBounds; private Boolean mDrawsBelowRecents = null; - private Boolean mDrawAboveOtherApps = null; private boolean mIsGridTask; private final boolean mIsDesktopTask; private boolean mIsAnimatingToCarousel = false; - private final int mDesktopTaskIndex; + private int mTaskRectTranslationX; + private int mTaskRectTranslationY; + private int mDesktopTaskIndex = 0; @Nullable private Matrix mTaskRectTransform = null; @@ -152,15 +152,12 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { mLayoutValid = false; mOrientationState.setDeviceProfile(dp); if (enableGridOnlyOverview()) { - mIsGridTask = dp.getDeviceProperties().isTablet() && !mIsDesktopTask; + mIsGridTask = dp.isTablet && !mIsDesktopTask; } calculateTaskSize(); } - /** - * Updates the task size. - */ - public void calculateTaskSize() { + private void calculateTaskSize() { if (mDp == null) { return; } @@ -186,7 +183,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { // sized task space bounds mTaskRect.set(mFullTaskSize); mOrientationState.getOrientationHandler() - .setSplitTaskSwipeRect(mDp, mTaskRect, mSplitBounds, mSplitPosition); + .setSplitTaskSwipeRect(mDp, mTaskRect, mSplitBounds, mStagePosition); } else if (mIsDesktopTask) { // For desktop, tasks can take up only part of the screen size. // Full task size represents the whole screen size, but scaled down to fit in recents. @@ -212,6 +209,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { } else { mTaskRect.set(mFullTaskSize); } + mTaskRect.offset(mTaskRectTranslationX, mTaskRectTranslationY); } /** @@ -229,8 +227,11 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { if (mDp == null) { return 1; } - float scale = mOrientationState.getFullScreenScaleAndPivot( - mIsAnimatingToCarousel ? mCarouselTaskSize : mFullTaskSize, mDp, mPivot); + // Copy mFullTaskSize instead of updating it directly so it could be reused next time + // without recalculating + Rect scaleRect = new Rect(mIsAnimatingToCarousel ? mCarouselTaskSize : mFullTaskSize); + scaleRect.offset(mTaskRectTranslationX, mTaskRectTranslationY); + float scale = mOrientationState.getFullScreenScaleAndPivot(scaleRect, mDp, mPivot); if (mPivotOverride != null) { mPivot.set(mPivotOverride); } @@ -258,13 +259,10 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { setPreview(runningTarget); mSplitBounds = splitInfo; if (mSplitBounds == null) { - mSplitPosition = SPLIT_POSITION_UNDEFINED; + mStagePosition = STAGE_POSITION_UNDEFINED; } else { - mSplitPosition = runningTarget.taskId == splitInfo.leftTopTaskId - ? SPLIT_POSITION_TOP_OR_LEFT : SPLIT_POSITION_BOTTOM_OR_RIGHT; - if (enableFlexibleTwoAppSplit()) { - mPositionHelper.setSplitBounds(mSplitBounds, mSplitPosition); - } + mStagePosition = runningTarget.taskId == splitInfo.leftTopTaskId + ? STAGE_POSITION_TOP_OR_LEFT : STAGE_POSITION_BOTTOM_OR_RIGHT; } calculateTaskSize(); } @@ -292,10 +290,6 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { mDrawsBelowRecents = drawsBelowRecents; } - public boolean getDrawsBelowRecents() { - return mDrawsBelowRecents != null ? mDrawsBelowRecents : false; - } - /** * Sets whether the task is part of overview grid and not being focused. */ @@ -304,12 +298,13 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { } /** - * Sets whether drawing this app above other apps during animation. It's currently used when - * activating an app window from the exploded desktop view which will launch the desktop tile - * and exit Overview. + * Apply translations on TaskRect's starting location. */ - public void setDrawsAboveOtherApps(boolean drawsAboveOtherApps) { - mDrawAboveOtherApps = drawsAboveOtherApps; + public void setTaskRectTranslation(int taskRectTranslationX, int taskRectTranslationY) { + mTaskRectTranslationX = taskRectTranslationX; + mTaskRectTranslationY = taskRectTranslationY; + // Re-calculate task size after changing translation + calculateTaskSize(); } /** @@ -323,10 +318,9 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { /** * Adds animation for all the components corresponding to transition from an app to carousel. */ - public void addAppToCarouselAnim(PendingAnimation pa, Interpolator interpolator, - boolean isHandlingAtomicEvent) { + public void addAppToCarouselAnim(PendingAnimation pa, Interpolator interpolator) { pa.addFloat(fullScreenProgress, AnimatedFloat.VALUE, 1, 0, interpolator); - if (enableGridOnlyOverview() && mDp.getDeviceProperties().isTablet() && !isHandlingAtomicEvent) { + if (enableGridOnlyOverview() && mDp.isTablet && mDp.isGestureMode) { mIsAnimatingToCarousel = true; carouselScale.value = mCarouselTaskSize.width() / (float) mFullTaskSize.width(); } @@ -358,7 +352,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { public RectF getCurrentRect() { RectF result = getCurrentCropRect(); mMatrixTmp.set(mMatrix); - preDisplayRotation(mOrientationState.getDisplayRotation(), mDp.getDeviceProperties().getWidthPx(), mDp.getDeviceProperties().getHeightPx(), + preDisplayRotation(mOrientationState.getDisplayRotation(), mDp.widthPx, mDp.heightPx, mMatrixTmp); mMatrixTmp.mapRect(result); return result; @@ -412,11 +406,11 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { * window coordinate space. */ public void applyWindowToHomeRotation(Matrix matrix) { - matrix.postTranslate(mDp.getDeviceProperties().getWindowX(), mDp.getDeviceProperties().getWindowY()); + matrix.postTranslate(mDp.windowX, mDp.windowY); postDisplayRotation(deltaRotation( mOrientationState.getRecentsActivityRotation(), mOrientationState.getDisplayRotation()), - mDp.getDeviceProperties().getWidthPx(), mDp.getDeviceProperties().getHeightPx(), matrix); + mDp.widthPx, mDp.heightPx, matrix); } /** @@ -451,7 +445,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { boolean isRtlEnabled = !mIsRecentsRtl; mPositionHelper.updateThumbnailMatrix( mThumbnailPosition, mThumbnailData, mTaskRect.width(), mTaskRect.height(), - mDp.getDeviceProperties().isTablet(), mOrientationState.getRecentsActivityRotation(), isRtlEnabled); + mDp.isTablet, mOrientationState.getRecentsActivityRotation(), isRtlEnabled); mPositionHelper.getMatrix().invert(mInversePositionMatrix); if (DEBUG) { Log.d(TAG, " taskRect: " + mTaskRect); @@ -542,22 +536,15 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { .setWindowCrop(mTmpCropRect) .setCornerRadius(getCurrentCornerRadius()); - if (mDrawsBelowRecents == null && mDrawAboveOtherApps == null) { - // No reordering will be enforced. - return; - } - - // In shell transitions, the animation leashes are reparented to an animation container - // so we can bump layers as needed. - int baseLayer = app.prefixOrderIndex - mDesktopTaskIndex; - // 1000/2000 are arbitrary numbers to give room for multiple layers. + // If mDrawsBelowRecents is unset, no reordering will be enforced. if (mDrawsBelowRecents != null) { - baseLayer += mDrawsBelowRecents ? Integer.MIN_VALUE + 2000 : Integer.MAX_VALUE - 2000; + // In shell transitions, the animation leashes are reparented to an animation container + // so we can bump layers as needed. + builder.setLayer(mDrawsBelowRecents + // 1000 is an arbitrary number to give room for multiple layers. + ? Integer.MIN_VALUE + 1000 + app.prefixOrderIndex - mDesktopTaskIndex + : Integer.MAX_VALUE - 1000 + app.prefixOrderIndex - mDesktopTaskIndex); } - if (mDrawAboveOtherApps != null && mDrawAboveOtherApps) { - baseLayer += 1000; - } - builder.setLayer(baseLayer); } /** diff --git a/quickstep/src/com/android/quickstep/util/TransformParams.java b/quickstep/src/com/android/quickstep/util/TransformParams.java index c70061f635..cb591ed035 100644 --- a/quickstep/src/com/android/quickstep/util/TransformParams.java +++ b/quickstep/src/com/android/quickstep/util/TransformParams.java @@ -26,7 +26,7 @@ import androidx.annotation.VisibleForTesting; import com.android.quickstep.RemoteAnimationTargets; import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties; -import com.android.window.flags2.Flags; +import com.android.window.flags.Flags; import java.util.function.Supplier; @@ -257,4 +257,4 @@ public class TransformParams { void onBuildTargetParams(SurfaceProperties builder, RemoteAnimationTarget app, TransformParams params); } -} +} \ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/util/unfold/LauncherUnfoldTransitionController.kt b/quickstep/src/com/android/quickstep/util/unfold/LauncherUnfoldTransitionController.kt index 6fc450a01b..915c9e5305 100644 --- a/quickstep/src/com/android/quickstep/util/unfold/LauncherUnfoldTransitionController.kt +++ b/quickstep/src/com/android/quickstep/util/unfold/LauncherUnfoldTransitionController.kt @@ -56,7 +56,7 @@ class LauncherUnfoldTransitionController( } override fun onDeviceProfileChanged(dp: DeviceProfile) { - if (isTablet != null && dp.getDeviceProperties().isTablet != isTablet) { + if (isTablet != null && dp.isTablet != isTablet) { // We should preemptively start the animation only if: // - We changed to the unfolded screen // - SystemUI IPC connection is alive, so we won't end up in a situation that we won't @@ -66,24 +66,20 @@ class LauncherUnfoldTransitionController( // if Launcher was not open during unfold, in this case we receive the configuration // change only after we went back to home screen and we don't want to start the // animation in this case. - if ( - dp.getDeviceProperties().isTablet && - progressProvider.isActive && - !hasUnfoldTransitionStarted - ) { + if (dp.isTablet && progressProvider.isActive && !hasUnfoldTransitionStarted) { // Preemptively start the unfold animation to make sure that we have drawn // the first frame of the animation before the screen gets unblocked onTransitionStarted() Trace.beginAsyncSection("$TAG#startedPreemptively", 0) timeoutAlarm.setAlarm(PREEMPTIVE_UNFOLD_TIMEOUT_MS) } - if (!dp.getDeviceProperties().isTablet) { + if (!dp.isTablet) { // Reset unfold transition status when folded hasUnfoldTransitionStarted = false } } - isTablet = dp.getDeviceProperties().isTablet + isTablet = dp.isTablet } override fun onTransitionStarted() { diff --git a/quickstep/src/com/android/quickstep/views/AddDesktopButton.kt b/quickstep/src/com/android/quickstep/views/AddDesktopButton.kt index ff20378b8b..37359a1b35 100644 --- a/quickstep/src/com/android/quickstep/views/AddDesktopButton.kt +++ b/quickstep/src/com/android/quickstep/views/AddDesktopButton.kt @@ -16,18 +16,12 @@ package com.android.quickstep.views -import android.animation.AnimatorSet -import android.animation.ObjectAnimator import android.content.Context import android.graphics.Canvas import android.graphics.Rect -import android.graphics.drawable.Drawable import android.util.AttributeSet import android.util.FloatProperty import android.widget.ImageButton -import androidx.core.animation.addListener -import com.android.app.animation.Interpolators.LINEAR -import com.android.launcher3.LauncherAnimUtils.DRAWABLE_ALPHA import com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X import com.android.launcher3.R import com.android.launcher3.util.KFloatProperty @@ -47,7 +41,6 @@ class AddDesktopButton @JvmOverloads constructor(context: Context, attrs: Attrib private val addDeskButtonAlpha = MultiValueAlpha(this, Alpha.entries.size) var contentAlpha by MultiPropertyDelegate(addDeskButtonAlpha, Alpha.CONTENT) var visibilityAlpha by MultiPropertyDelegate(addDeskButtonAlpha, Alpha.VISIBILITY) - var clickAlpha by MultiPropertyDelegate(addDeskButtonAlpha, Alpha.CLICK) private val multiTranslationX = MultiPropertyFactory(this, VIEW_TRANSLATE_X, TranslationX.entries.size) { a: Float, b: Float @@ -80,37 +73,6 @@ class AddDesktopButton @JvmOverloads constructor(context: Context, attrs: Attrib focusBorderAnimator.setBorderVisibility(visible = field && isFocused, animated = true) } - @JvmOverloads - fun animateVisibility(toVisible: Boolean, onAnimationEndAction: Runnable? = null) { - val targetButtonAlpha = if (toVisible) 1f else 0f - val targetDrawableAlpha = if (toVisible) 255 else 0 - - val iconDrawable: Drawable = this.drawable.mutate() - val fadeDuration = - context.resources.getInteger(R.integer.add_desktop_button_fade_duration).toLong() - val fadeDelay = - context.resources.getInteger(R.integer.add_desktop_button_fade_delay).toLong() - - val buttonFadeAnimator = - ObjectAnimator.ofFloat(this, CLICK_ALPHA, targetButtonAlpha).apply { - duration = fadeDuration - startDelay = fadeDelay - interpolator = LINEAR - } - - val iconFadeAnimator = - ObjectAnimator.ofInt(iconDrawable, DRAWABLE_ALPHA, targetDrawableAlpha).apply { - duration = fadeDuration - interpolator = LINEAR - } - - AnimatorSet().apply { - playTogether(buttonFadeAnimator, iconFadeAnimator) - addListener(onEnd = { onAnimationEndAction?.run() }) - start() - } - } - public override fun onFocusChanged( gainFocus: Boolean, direction: Int, @@ -138,7 +100,6 @@ class AddDesktopButton @JvmOverloads constructor(context: Context, attrs: Attrib private enum class Alpha { CONTENT, VISIBILITY, - CLICK, } private enum class TranslationX { @@ -149,8 +110,5 @@ class AddDesktopButton @JvmOverloads constructor(context: Context, attrs: Attrib @JvmField val VISIBILITY_ALPHA: FloatProperty = KFloatProperty(AddDesktopButton::visibilityAlpha) - - private val CLICK_ALPHA: FloatProperty = - KFloatProperty(AddDesktopButton::clickAlpha) } } diff --git a/quickstep/src/com/android/quickstep/views/AllAppsEduView.java b/quickstep/src/com/android/quickstep/views/AllAppsEduView.java index 166ed7916c..121d8ede11 100644 --- a/quickstep/src/com/android/quickstep/views/AllAppsEduView.java +++ b/quickstep/src/com/android/quickstep/views/AllAppsEduView.java @@ -267,8 +267,8 @@ public class AllAppsEduView extends AbstractFloatingView { DeviceProfile grid = launcher.getDeviceProfile(); DragLayer.LayoutParams lp = new DragLayer.LayoutParams(mWidthPx, mMaxHeightPx); lp.ignoreInsets = true; - lp.leftMargin = (grid.getDeviceProperties().getWidthPx() - mWidthPx) / 2; - lp.topMargin = grid.getDeviceProperties().getHeightPx() - grid.hotseatBarSizePx - mMaxHeightPx; + lp.leftMargin = (grid.widthPx - mWidthPx) / 2; + lp.topMargin = grid.heightPx - grid.hotseatBarSizePx - mMaxHeightPx; setLayoutParams(lp); } diff --git a/quickstep/src/com/android/quickstep/views/BlurUtils.kt b/quickstep/src/com/android/quickstep/views/BlurUtils.kt index 318a0437f3..d6b2a055b7 100644 --- a/quickstep/src/com/android/quickstep/views/BlurUtils.kt +++ b/quickstep/src/com/android/quickstep/views/BlurUtils.kt @@ -22,48 +22,42 @@ import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle /** Applies blur either behind launcher surface or live tile app. */ class BlurUtils(private val recentsView: RecentsView<*, *>) { - private fun getLiveTileRemoteTargetHandles() = - if ( - recentsView.remoteTargetHandles != null && - recentsView.recentsAnimationController != null - ) - recentsView.remoteTargetHandles - else null - - private fun Array.setDrawBelowRecents(drawBelowRecents: Boolean) { - forEach { it.taskViewSimulator.drawsBelowRecents = drawBelowRecents } - } - - /** - * Controls if live tile should be above or below Recents layer, and update the base layer to - * apply blur to in BaseDepthController. - */ fun setDrawLiveTileBelowRecents(drawBelowRecents: Boolean) { - getLiveTileRemoteTargetHandles()?.setDrawBelowRecents(drawBelowRecents) - updateBlurLayer() + val liveTileRemoteTargetHandles = + if ( + recentsView.remoteTargetHandles != null && + recentsView.recentsAnimationController != null + ) + recentsView.remoteTargetHandles + else null + setDrawBelowRecents(drawBelowRecents, liveTileRemoteTargetHandles) } /** - * Set surface in [remoteTargetHandles] to be above Recents layer, and update the base layer to - * apply blur to in BaseDepthController. + * Set surface in [remoteTargetHandles] to be above or below Recents layer, and update the base + * layer to apply blur to in BaseDepthController. */ - fun setDrawAboveRecents(remoteTargetHandles: Array) { - remoteTargetHandles.setDrawBelowRecents(false) - updateBlurLayer(drawingAboveRecents = true) - } - - private fun updateBlurLayer(drawingAboveRecents: Boolean = false) { - if (!enableOverviewBackgroundWallpaperBlur()) return - // Blurs behind lowest live tile surface that's below recents or Launcher if there - // are none. - recentsView.depthController?.setBaseSurfaceOverride( - getLiveTileRemoteTargetHandles() - ?.asSequence() - ?.filter { it.taskViewSimulator.drawsBelowRecents } - ?.flatMap { it.transformParams.targetSet.apps.asIterable() } - ?.map { it.leash } - ?.maxByOrNull { it.layerId }, - /* applyOnDraw= */ drawingAboveRecents, - ) + fun setDrawBelowRecents( + drawBelowRecents: Boolean, + remoteTargetHandles: Array? = null, + ) { + remoteTargetHandles?.forEach { it.taskViewSimulator.setDrawsBelowRecents(drawBelowRecents) } + if (enableOverviewBackgroundWallpaperBlur()) { + recentsView.depthController?.setBaseSurfaceOverride( + // Blurs behind launcher layer. + if (!drawBelowRecents || remoteTargetHandles == null) { + null + } else { + // Blurs behind live tile. blur will be applied behind window + // which farthest from user in case of desktop and split apps. + remoteTargetHandles + .maxByOrNull { it.transformParams.targetSet.firstAppTarget.leash.layerId } + ?.transformParams + ?.targetSet + ?.firstAppTarget + ?.leash + } + ) + } } } diff --git a/quickstep/src/com/android/quickstep/views/ClearAllButton.kt b/quickstep/src/com/android/quickstep/views/ClearAllButton.kt index 48aa999b3e..69c85eeaeb 100644 --- a/quickstep/src/com/android/quickstep/views/ClearAllButton.kt +++ b/quickstep/src/com/android/quickstep/views/ClearAllButton.kt @@ -31,14 +31,8 @@ import com.android.quickstep.util.BorderAnimator.Companion.createSimpleBorderAni import kotlin.math.abs import kotlin.math.min -class ClearAllButton -@JvmOverloads -constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - defStyleRes: Int = 0, -) : Button(context, attrs, defStyleAttr, defStyleRes) { +class ClearAllButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : + Button(context, attrs) { private val clearAllButtonAlpha = object : MultiValueAlpha(this, Alpha.entries.size) { diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt index 4d179f5446..ef044f4fda 100644 --- a/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt +++ b/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt @@ -37,7 +37,6 @@ constructor(context: Context, attrs: AttributeSet? = null) : FrameLayout(context init { clipToOutline = true - clipChildren = false outlineProvider = object : ViewOutlineProvider() { override fun getOutline(view: View, outline: Outline) { diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt index a6b9d9adec..bbd06be365 100644 --- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt +++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt @@ -15,9 +15,6 @@ */ package com.android.quickstep.views -import android.animation.Animator -import android.animation.AnimatorListenerAdapter -import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.content.Context import android.graphics.Matrix @@ -26,7 +23,6 @@ import android.graphics.Rect import android.graphics.Rect.intersects import android.graphics.RectF import android.util.AttributeSet -import android.util.FloatProperty import android.util.Log import android.util.Size import android.view.Display.INVALID_DISPLAY @@ -37,14 +33,12 @@ import androidx.core.content.res.ResourcesCompat import androidx.core.view.updateLayoutParams import com.android.internal.hidden_from_bootclasspath.com.android.window.flags.Flags.enableDesktopRecentsTransitionsCornersBugfix import com.android.launcher3.Flags.enableDesktopExplodedView -import com.android.launcher3.Flags.enableRefactorTaskContentView +import com.android.launcher3.Flags.enableOverviewIconMenu import com.android.launcher3.Flags.enableRefactorTaskThumbnail import com.android.launcher3.R import com.android.launcher3.statehandlers.DesktopVisibilityController import com.android.launcher3.testing.TestLogging import com.android.launcher3.testing.shared.TestProtocol -import com.android.launcher3.util.KFloatProperty -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu import com.android.launcher3.Utilities import com.android.launcher3.util.RunnableList import com.android.launcher3.util.SplitConfigurationOptions @@ -60,11 +54,9 @@ import com.android.quickstep.TaskOverlayFactory import com.android.quickstep.ViewUtils import com.android.quickstep.recents.di.RecentsDependencies import com.android.quickstep.recents.di.get -import com.android.quickstep.recents.domain.model.DesktopLayoutConfig import com.android.quickstep.recents.domain.model.DesktopTaskBoundsData import com.android.quickstep.recents.ui.viewmodel.DesktopTaskViewModel import com.android.quickstep.recents.ui.viewmodel.TaskData -import com.android.quickstep.task.thumbnail.TaskContentView import com.android.quickstep.task.thumbnail.TaskThumbnailView import com.android.quickstep.util.DesktopTask import com.android.quickstep.util.RecentsOrientedState @@ -81,12 +73,11 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu type = TaskViewType.DESKTOP, thumbnailFullscreenParams = DesktopFullscreenDrawParams(context), ) { - private val desktopTask: DesktopTask? - get() = groupTask as? DesktopTask - val deskId get() = desktopTask?.deskId ?: DesktopVisibilityController.INACTIVE_DESK_ID + private var desktopTask: DesktopTask? = null + private val contentViewFullscreenParams = FullscreenDrawParams(context) private val taskThumbnailViewDeprecatedPool = @@ -111,17 +102,6 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu ) } else null - private val taskContentViewPool = - if (enableRefactorTaskContentView()) { - ViewPool( - context, - this, - R.layout.task_content_view, - VIEW_POOL_MAX_SIZE, - VIEW_POOL_INITIAL_SIZE, - ) - } else null - private val tempPointF = PointF() private val lastComputedTaskSize = Rect() private lateinit var iconView: TaskViewIcon @@ -136,12 +116,6 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu */ private var fullscreenTaskPositions: List = emptyList() - /** - * Holds the previous organized task positions. This is used to animate between two sets of - * organized task positions when a task is being dismissed. - */ - private var previousOrganizedDesktopTaskPositions: List? = null - /** * When enableDesktopExplodedView is enabled, this controls the gradual transition from the * default positions to the organized non-overlapping positions. @@ -152,24 +126,10 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu positionTaskWindows() } - /** - * When enableDesktopExplodedView is enabled, and a task is removed, this controls the gradual - * transition from the previous organized task positions to the new. - */ - private var taskRemoveProgress = 0.0f - set(value) { - field = value - positionTaskWindows() - } - - private var taskRemoveAnimator: ObjectAnimator? = null - var remoteTargetHandles: Array? = null set(value) { field = value - if (value != null) { - positionTaskWindows() - } + positionTaskWindows() } override val displayId: Int @@ -187,10 +147,22 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu override fun onFinishInflate() { super.onFinishInflate() + iconView = + (findViewById(R.id.icon) as TaskViewIcon).apply { + setIcon( + this, + ResourcesCompat.getDrawable( + context.resources, + R.drawable.ic_desktop_with_bg, + context.theme, + ), + ) + setText(resources.getText(R.string.recent_task_desktop)) + } contentView = findViewById(R.id.desktop_content).apply { updateLayoutParams { - topMargin = container.deviceProfile.overviewProfile.taskThumbnailTopMarginPx + topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx } cornerRadius = contentViewFullscreenParams.currentCornerRadius backgroundView = findViewById(R.id.background) @@ -210,55 +182,52 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu ?.inflate() } - private fun positionTaskWindows(updateLayout: Boolean = false) { + private fun positionTaskWindows() { if (taskContainers.isEmpty()) { return } - val (widthScale, heightScale) = getScreenScaleFactors() - taskContainers.forEach { taskContainer -> - val taskId = taskContainer.task.key.id - val fullscreenTaskBounds = - fullscreenTaskPositions.firstOrNull { it.taskId == taskId }?.bounds ?: return - val overviewTaskBounds = + val thumbnailTopMarginPx = container.deviceProfile.overviewTaskThumbnailTopMarginPx + + val taskViewWidth = layoutParams.width + val taskViewHeight = layoutParams.height - thumbnailTopMarginPx + + BaseContainerInterface.getTaskDimension(mContext, container.deviceProfile, tempPointF) + + val screenWidth = tempPointF.x.toInt() + val screenHeight = tempPointF.y.toInt() + val screenRect = Rect(0, 0, screenWidth, screenHeight) + val scaleWidth = taskViewWidth / screenWidth.toFloat() + val scaleHeight = taskViewHeight / screenHeight.toFloat() + + taskContainers.forEach { + val taskId = it.task.key.id + val fullscreenTaskPosition = + fullscreenTaskPositions.firstOrNull { it.taskId == taskId } ?: return + val overviewTaskPosition = if (enableDesktopExplodedView()) { viewModel!! .organizedDesktopTaskPositions .firstOrNull { it.taskId == taskId } - ?.bounds ?: fullscreenTaskBounds + ?.let { organizedPosition -> + TEMP_OVERVIEW_TASK_POSITION.apply { + lerpRect( + fullscreenTaskPosition.bounds, + organizedPosition.bounds, + explodeProgress, + ) + } + } ?: fullscreenTaskPosition.bounds } else { - fullscreenTaskBounds - } - val currentTaskBounds = - if (enableDesktopExplodedView()) { - TEMP_OVERVIEW_TASK_POSITION.apply { - // When removing a task, interpolate between its old organized bounds and - // [overviewTaskBounds]. - val previousOrganizedTaskBounds = - previousOrganizedDesktopTaskPositions - ?.firstOrNull { it.taskId == taskId } - ?.bounds - if (previousOrganizedTaskBounds != null) { - lerpRect( - previousOrganizedTaskBounds, - overviewTaskBounds, - taskRemoveProgress, - ) - } else { - set(overviewTaskBounds) - } - lerpRect(fullscreenTaskBounds, this, explodeProgress) - } - } else { - fullscreenTaskBounds + fullscreenTaskPosition.bounds } if (enableDesktopExplodedView()) { getRemoteTargetHandle(taskId)?.let { remoteTargetHandle -> val fromRect = TEMP_FROM_RECTF.apply { - set(fullscreenTaskBounds) - scale(widthScale) + set(fullscreenTaskPosition.bounds) + scale(scaleWidth) offset( lastComputedTaskSize.left.toFloat(), lastComputedTaskSize.top.toFloat(), @@ -266,8 +235,8 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu } val toRect = TEMP_TO_RECTF.apply { - set(currentTaskBounds) - scale(widthScale) + set(overviewTaskPosition) + scale(scaleWidth) offset( lastComputedTaskSize.left.toFloat(), lastComputedTaskSize.top.toFloat(), @@ -278,76 +247,61 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu remoteTargetHandle.taskViewSimulator.setTaskRectTransform(transform) remoteTargetHandle.taskViewSimulator.apply(remoteTargetHandle.transformParams) } - - (taskContainer.taskContentView as? TaskContentView)?.setTaskHeaderAlpha( - explodeProgress - ) } - val overviewTaskLeft = overviewTaskBounds.left * widthScale - val overviewTaskTop = overviewTaskBounds.top * heightScale - val overviewTaskWidth = overviewTaskBounds.width() * widthScale - val overviewTaskHeight = overviewTaskBounds.height() * heightScale + val taskLeft = overviewTaskPosition.left * scaleWidth + val taskTop = overviewTaskPosition.top * scaleHeight + val taskWidth = overviewTaskPosition.width() * scaleWidth + val taskHeight = overviewTaskPosition.height() * scaleHeight + // TODO(b/394660950): Revisit the choice to update the layout when explodeProgress == 1. + // To run the explode animation in reverse, it may be simpler to use translation/scale + // for all cases where the progress is non-zero. + if (explodeProgress == 0.0f || explodeProgress == 1.0f) { + // Reset scaling and translation that may have been applied during animation. + it.snapshotView.apply { + scaleX = 1.0f + scaleY = 1.0f + translationX = 0.0f + translationY = 0.0f + } - if (updateLayout) { // Position the task to the same position as it would be on the desktop - taskContainer.taskContentView.updateLayoutParams { + it.snapshotView.updateLayoutParams { gravity = Gravity.LEFT or Gravity.TOP - width = overviewTaskWidth.toInt() - height = overviewTaskHeight.toInt() - leftMargin = overviewTaskLeft.toInt() - topMargin = overviewTaskTop.toInt() + width = taskWidth.toInt() + height = taskHeight.toInt() + leftMargin = taskLeft.toInt() + topMargin = taskTop.toInt() } - } - if (enableDesktopRecentsTransitionsCornersBugfix() && enableRefactorTaskThumbnail()) { - // When exploded view is disabled, these scale factors will be 1.0. This secondary - // scale factor is needed because a scale transform is applied to the thumbnail. - val thumbnailScaleWidth = - overviewTaskBounds.width().toFloat() / currentTaskBounds.width() - val thumbnailScaleHeight = - overviewTaskBounds.height().toFloat() / currentTaskBounds.height() - val screenRect = getScreenRect() - val contentOutlineBounds = - if (intersects(currentTaskBounds, screenRect)) - Rect(currentTaskBounds).apply { - intersectUnchecked(screenRect) - // Offset to 0,0 to transform into TaskThumbnailView's coordinate - // system. - offset(-currentTaskBounds.left, -currentTaskBounds.top) - left = (left * widthScale * thumbnailScaleWidth).roundToInt() - top = (top * heightScale * thumbnailScaleHeight).roundToInt() - right = (right * widthScale * thumbnailScaleWidth).roundToInt() - bottom = (bottom * heightScale * thumbnailScaleHeight).roundToInt() - } - else null - - if (enableRefactorTaskContentView()) { - (taskContainer.taskContentView as TaskContentView).outlineBounds = - contentOutlineBounds - } else { - taskContainer.thumbnailView.outlineBounds = contentOutlineBounds + if ( + enableDesktopRecentsTransitionsCornersBugfix() && enableRefactorTaskThumbnail() + ) { + it.thumbnailView.outlineBounds = + if (intersects(overviewTaskPosition, screenRect)) + Rect(overviewTaskPosition).apply { + intersectUnchecked(screenRect) + // Offset to 0,0 to transform into TaskThumbnailView's coordinate + // system. + offset(-overviewTaskPosition.left, -overviewTaskPosition.top) + left = (left * scaleWidth).roundToInt() + top = (top * scaleHeight).roundToInt() + right = (right * scaleWidth).roundToInt() + bottom = (bottom * scaleHeight).roundToInt() + } + else null + } + } else { + // During the animation, apply translation and scale such that the view is + // transformed to where we want, without triggering layout. + it.snapshotView.apply { + pivotX = 0.0f + pivotY = 0.0f + translationX = taskLeft - left + translationY = taskTop - top + scaleX = taskWidth / width.toFloat() + scaleY = taskHeight / height.toFloat() } - } - - val currentTaskLeft = currentTaskBounds.left * widthScale - val currentTaskTop = currentTaskBounds.top * heightScale - val currentTaskWidth = currentTaskBounds.width() * widthScale - val currentTaskHeight = currentTaskBounds.height() * heightScale - // During the animation, apply translation and scale such that the view is transformed - // to where we want, without triggering layout. - taskContainer.taskContentView.apply { - pivotX = 0.0f - pivotY = 0.0f - translationX = currentTaskLeft - overviewTaskLeft - translationY = currentTaskTop - overviewTaskTop - scaleX = if (overviewTaskWidth != 0f) currentTaskWidth / overviewTaskWidth else 1f - scaleY = - if (overviewTaskHeight != 0f) currentTaskHeight / overviewTaskHeight else 1f - } - - if (taskContainer.task.isMinimized) { - taskContainer.taskContentView.alpha = explodeProgress } } } @@ -358,14 +312,11 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu orientedState: RecentsOrientedState, taskOverlayFactory: TaskOverlayFactory, ) { - this.groupTask = desktopTask - // Minimized tasks are shown in Overview when exploded view is enabled. - val tasks = - if (enableDesktopExplodedView()) { - desktopTask.tasks - } else { - desktopTask.tasks.filterNot { it.isMinimized } - } + this.desktopTask = desktopTask + // TODO(b/370495260): Minimized tasks should not be filtered with desktop exploded view + // support. + // Minimized tasks should not be shown in Overview. + val tasks = desktopTask.tasks.filterNot { it.isMinimized } if (DEBUG) { val sb = StringBuilder() sb.append("bind tasks=").append(tasks.size).append("\n") @@ -373,50 +324,21 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu Log.d(TAG, sb.toString()) } - iconView = - (findViewById(R.id.icon) as TaskViewIcon).apply { - setIcon( - this, - ResourcesCompat.getDrawable( - context.resources, - R.drawable.ic_desktop_with_bg, - context.theme, - ), - ) - setText(resources.getText(R.string.recent_task_desktop)) - } - cancelPendingLoadTasks() val backgroundViewIndex = contentView.indexOfChild(backgroundView) taskContainers = tasks.map { task -> - val taskContentView = - when { - enableRefactorTaskContentView() -> taskContentViewPool!!.view - enableRefactorTaskThumbnail() -> taskThumbnailViewPool!!.view - else -> taskThumbnailViewDeprecatedPool!!.view - } - contentView.addView(taskContentView, backgroundViewIndex + 1) val snapshotView = - if (enableRefactorTaskContentView()) { - taskContentView.findViewById(R.id.snapshot) + if (enableRefactorTaskThumbnail()) { + taskThumbnailViewPool!!.view } else { - taskContentView + taskThumbnailViewDeprecatedPool!!.view } - if (enableDesktopExplodedView()) { - taskContentView.setOnClickListener { - launchTaskWithDesktopController(animated = true, task.key.id) - } - if (taskContentView is TaskContentView) { - taskContentView.isFocusable = true - taskContentView.isHoverable = true - } - } + contentView.addView(snapshotView, backgroundViewIndex + 1) TaskContainer( this, task, - taskContentView, snapshotView, iconView, TransformingTouchDelegate(iconView.asView()), @@ -440,16 +362,11 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu override fun onRecycle() { super.onRecycle() + desktopTask = null explodeProgress = 0.0f - taskRemoveProgress = 0.0f - previousOrganizedDesktopTaskPositions = null viewModel = null visibility = VISIBLE taskContainers.forEach { removeAndRecycleThumbnailView(it) } - if (enableOverviewIconMenu()) { - (iconView as IconAppChipView).reset() - } - remoteTargetHandles = null } override fun setOrientationState(orientationState: RecentsOrientedState) { @@ -495,15 +412,7 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu } } - /** - * Launches the desktop task and activate the task with [taskIdToReorderToFront] if it's - * provided and already on the desktop. It will exit Overview to desktop and activate the - * according new task afterwards if applicable. - */ - private fun launchTaskWithDesktopController( - animated: Boolean, - taskIdToReorderToFront: Int? = null, - ): RunnableList? { + private fun launchTaskWithDesktopController(animated: Boolean): RunnableList? { val recentsView = recentsView ?: return null TestLogging.recordEvent( TestProtocol.SEQUENCE_MAIN, @@ -513,31 +422,8 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu val endCallback = RunnableList() val desktopController = recentsView.desktopRecentsController checkNotNull(desktopController) { "recentsController is null" } - - if (taskIdToReorderToFront != null) { - // The to-be-activated window should animate on top of other apps during shell - // transition. - val remoteTargetHandle = getRemoteTargetHandle(taskIdToReorderToFront) - // The layer swapping is only applied after [createRecentsWindowAnimator] starts, which - // will bring the [remoteTargetHandles] above Recents, therefore this call won't affect - // the base surface in [DepthController]. - remoteTargetHandle?.taskViewSimulator?.setDrawsAboveOtherApps(true) - } - val launchDesktopFromRecents = { - desktopController.launchDesktopFromRecents(this, animated, taskIdToReorderToFront) { - endCallback.executeAllAndDestroy() - } - } - if (enableMultipleDesktops(context) && desktopTask?.tasks?.isEmpty() == true) { - recentsView.switchToScreenshot { - recentsView.finishRecentsAnimation( - /* toRecents= */ true, - /* shouldPip= */ false, - launchDesktopFromRecents, - ) - } - } else { - launchDesktopFromRecents() + desktopController.launchDesktopFromRecents(this, animated) { + endCallback.executeAllAndDestroy() } Log.d( TAG, @@ -566,7 +452,6 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu override fun onFullscreenProgressChanged(fullscreenProgress: Float) { backgroundView.alpha = 1 - fullscreenProgress - updateSettledProgressFullscreen(fullscreenProgress) } override fun updateFullscreenParams() { @@ -599,43 +484,18 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu if (taskContainers.isEmpty()) { recentsView?.dismissTaskView(this, animate, /* removeTask= */ true) } else { - // If this task has a live window, then hide it. - // TODO(b/413120214) The dismissed view should fade out. - getRemoteTargetHandle(taskId)?.let { - it.taskViewSimulator.setTaskRectTransform(Matrix().apply { postScale(0.0f, 0.0f) }) - it.taskViewSimulator.apply(it.transformParams) - } - - // TODO(b/413130378) Nicer handling of multiple quick task dismissals. - taskRemoveAnimator?.cancel() - taskRemoveAnimator = - ObjectAnimator.ofFloat(this, TASK_REMOVE_PROGRESS, 0f, 1f).apply { - addListener( - object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animator: Animator) { - previousOrganizedDesktopTaskPositions = null - taskRemoveAnimator = null - } - } - ) - start() - } - - // Store the current organized positions before computing new ones. This allows us to - // animate from the current layout to the new. - previousOrganizedDesktopTaskPositions = viewModel!!.organizedDesktopTaskPositions + // Otherwise, re-position the remaining task windows. + // TODO(b/353949276): Implement the re-layout animations. updateTaskPositions() } } private fun removeAndRecycleThumbnailView(taskContainer: TaskContainer) { - contentView.removeView(taskContainer.taskContentView) - when { - enableRefactorTaskContentView() -> - taskContentViewPool!!.recycle(taskContainer.taskContentView as TaskContentView) - enableRefactorTaskThumbnail() -> - taskThumbnailViewPool!!.recycle(taskContainer.taskContentView as TaskThumbnailView) - else -> taskThumbnailViewDeprecatedPool!!.recycle(taskContainer.thumbnailViewDeprecated) + contentView.removeView(taskContainer.snapshotView) + if (enableRefactorTaskThumbnail()) { + taskThumbnailViewPool!!.recycle(taskContainer.thumbnailView) + } else { + taskThumbnailViewDeprecatedPool!!.recycle(taskContainer.thumbnailViewDeprecated) } } @@ -650,70 +510,9 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu } if (enableDesktopExplodedView()) { - val (widthScale, heightScale) = getScreenScaleFactors() - val res = context.resources - val layoutConfig = - DesktopLayoutConfig( - topBottomMarginOneRow = - (res.getDimensionPixelSize(R.dimen.desktop_top_bottom_margin_one_row) / - heightScale) - .toInt(), - topMarginMultiRows = - (res.getDimensionPixelSize(R.dimen.desktop_top_margin_multi_rows) / - heightScale) - .toInt(), - bottomMarginMultiRows = - (res.getDimensionPixelSize(R.dimen.desktop_bottom_margin_multi_rows) / - heightScale) - .toInt(), - leftRightMarginOneRow = - (res.getDimensionPixelSize(R.dimen.desktop_left_right_margin_one_row) / - widthScale) - .toInt(), - leftRightMarginMultiRows = - (res.getDimensionPixelSize(R.dimen.desktop_left_right_margin_multi_rows) / - widthScale) - .toInt(), - horizontalPaddingBetweenTasks = - (res.getDimensionPixelSize( - R.dimen.desktop_horizontal_padding_between_tasks - ) / widthScale) - .toInt(), - verticalPaddingBetweenTasks = - (res.getDimensionPixelSize(R.dimen.desktop_vertical_padding_between_tasks) / - heightScale) - .toInt(), - ) - - viewModel?.organizeDesktopTasks(desktopSize, fullscreenTaskPositions, layoutConfig) + viewModel?.organizeDesktopTasks(desktopSize, fullscreenTaskPositions) } - positionTaskWindows(updateLayout = true) - } - - /** - * Calculates the scale factors for the desktop task view's width and height. This is determined - * by comparing the available task view dimensions (after accounting for margins like - * [thumbnailTopMarginPx]) against the total screen dimensions. - * - * @return A [Pair] where the first value is the scale factor for width and the second is for - * height. - */ - private fun getScreenScaleFactors(): Pair { - val thumbnailTopMarginPx = container.deviceProfile.overviewProfile.taskThumbnailTopMarginPx - val taskViewWidth = layoutParams.width - val taskViewHeight = layoutParams.height - thumbnailTopMarginPx - - val screenRect = getScreenRect() - val widthScale = taskViewWidth / screenRect.width().toFloat() - val heightScale = taskViewHeight / screenRect.height().toFloat() - - return Pair(widthScale, heightScale) - } - - /** Returns the dimensions of the screen. */ - private fun getScreenRect(): Rect { - BaseContainerInterface.getTaskDimension(mContext, container.deviceProfile, tempPointF) - return Rect(0, 0, tempPointF.x.toInt(), tempPointF.y.toInt()) + positionTaskWindows() } companion object { @@ -728,7 +527,5 @@ class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: Attribu private val TEMP_OVERVIEW_TASK_POSITION = Rect() private val TEMP_FROM_RECTF = RectF() private val TEMP_TO_RECTF = RectF() - private val TASK_REMOVE_PROGRESS: FloatProperty = - KFloatProperty(DesktopTaskView::taskRemoveProgress) } } diff --git a/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.kt b/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.kt index 8c7f4830db..5c4a35da63 100644 --- a/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.kt +++ b/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.kt @@ -24,6 +24,9 @@ import android.content.pm.LauncherApps import android.content.pm.LauncherApps.AppUsageLimit import android.graphics.Outline import android.graphics.Paint +import android.icu.text.MeasureFormat +import android.icu.util.Measure +import android.icu.util.MeasureUnit import android.os.UserHandle import android.provider.Settings import android.util.AttributeSet @@ -32,6 +35,7 @@ import android.view.View import android.view.ViewOutlineProvider import android.view.accessibility.AccessibilityNodeInfo import android.widget.TextView +import androidx.annotation.StringRes import androidx.annotation.VisibleForTesting import androidx.core.util.component1 import androidx.core.util.component2 @@ -39,14 +43,14 @@ import androidx.core.view.isVisible import com.android.launcher3.R import com.android.launcher3.Utilities import com.android.launcher3.util.Executors +import com.android.launcher3.util.SplitConfigurationOptions import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED import com.android.launcher3.util.SplitConfigurationOptions.StagePosition import com.android.quickstep.TaskUtils -import com.android.quickstep.task.apptimer.DurationFormatter import com.android.systemui.shared.recents.model.Task -import com.android.wm.shell.shared.split.SplitBounds import java.time.Duration +import java.util.Locale @SuppressLint("AppCompatCustomView") class DigitalWellBeingToast @@ -79,11 +83,10 @@ constructor( } } - var isDestroyed = false - private set + private var isDestroyed = false var hasLimit = false - var splitBounds: SplitBounds? = null + var splitBounds: SplitConfigurationOptions.SplitBounds? = null var bannerOffsetPercentage = 0f set(value) { if (field != value) { @@ -178,7 +181,7 @@ constructor( val splitBounds = splitBounds return when { splitBounds == null || - !recentsViewContainer.deviceProfile.deviceProperties.isTablet || + !recentsViewContainer.deviceProfile.isTablet || taskView.isLargeTile -> SplitBannerConfig.SPLIT_BANNER_FULLSCREEN // For portrait grid only height of task changes, not width. So we keep the text the // same @@ -196,6 +199,37 @@ constructor( } } + private fun getReadableDuration( + duration: Duration, + @StringRes durationLessThanOneMinuteStringId: Int, + ): String { + val hours = Math.toIntExact(duration.toHours()) + val minutes = Math.toIntExact(duration.minusHours(hours.toLong()).toMinutes()) + return when { + // Apply FormatWidth.WIDE if both the hour part and the minute part are non-zero. + hours > 0 && minutes > 0 -> + MeasureFormat.getInstance(Locale.getDefault(), MeasureFormat.FormatWidth.NARROW) + .formatMeasures( + Measure(hours, MeasureUnit.HOUR), + Measure(minutes, MeasureUnit.MINUTE), + ) + // Apply FormatWidth.WIDE if only the hour part is non-zero (unless forced). + hours > 0 -> + MeasureFormat.getInstance(Locale.getDefault(), MeasureFormat.FormatWidth.WIDE) + .formatMeasures(Measure(hours, MeasureUnit.HOUR)) + // Apply FormatWidth.WIDE if only the minute part is non-zero (unless forced). + minutes > 0 -> + MeasureFormat.getInstance(Locale.getDefault(), MeasureFormat.FormatWidth.WIDE) + .formatMeasures(Measure(minutes, MeasureUnit.MINUTE)) + // Use a specific string for usage less than one minute but non-zero. + duration > Duration.ZERO -> context.getString(durationLessThanOneMinuteStringId) + // Otherwise, return 0-minute string. + else -> + MeasureFormat.getInstance(Locale.getDefault(), MeasureFormat.FormatWidth.WIDE) + .formatMeasures(Measure(0, MeasureUnit.MINUTE)) + } + } + /** * Returns text to show for the banner depending on [.getSplitBannerConfig] If {@param * forContentDesc} is `true`, this will always return the full string corresponding to @@ -214,8 +248,7 @@ constructor( else remainingTime ) val readableDuration = - DurationFormatter.format( - context, + getReadableDuration( duration, R.string.shorter_duration_less_than_one_minute, /* forceFormatWidth */ ) @@ -270,7 +303,7 @@ constructor( snapshotWidth = taskView.layoutParams.width snapshotHeight = taskView.layoutParams.height - - recentsViewContainer.deviceProfile.overviewProfile.taskThumbnailTopMarginPx + recentsViewContainer.deviceProfile.overviewTaskThumbnailTopMarginPx } else { val groupedTaskSize = taskView.pagedOrientationHandler.getGroupedTaskViewSizes( @@ -305,7 +338,7 @@ constructor( taskView.layoutParams.height, splitBounds, recentsViewContainer.deviceProfile, - taskView.taskContentViews, + taskView.snapshotViews, task.key.id, this, ) diff --git a/quickstep/src/com/android/quickstep/views/FloatingAppPairBackground.kt b/quickstep/src/com/android/quickstep/views/FloatingAppPairBackground.kt index 4361a33aa5..6bbd6b2c15 100644 --- a/quickstep/src/com/android/quickstep/views/FloatingAppPairBackground.kt +++ b/quickstep/src/com/android/quickstep/views/FloatingAppPairBackground.kt @@ -37,12 +37,12 @@ import com.android.systemui.shared.system.QuickStepContract * increase in size during the animation. */ open class FloatingAppPairBackground( - context: Context, - // the view that we will draw this background on - protected val floatingView: FloatingAppPairView, - private val appIcon1: Drawable, - private val appIcon2: Drawable?, - dividerPos: Int, + context: Context, + // the view that we will draw this background on + protected val floatingView: FloatingAppPairView, + private val appIcon1: Drawable, + private val appIcon2: Drawable?, + dividerPos: Int ) : Drawable() { companion object { // Design specs -- app icons start small and expand during the animation @@ -79,44 +79,41 @@ open class FloatingAppPairBackground( backgroundPaint.color = ta.getColor(R.styleable.FolderIconPreview_folderPreviewColor, 0) ta.recycle() // Set up timings and interpolators - val timings = - AnimUtils.getDeviceAppPairLaunchTimings( - container.deviceProfile.deviceProperties.isTablet - ) + val timings = AnimUtils.getDeviceAppPairLaunchTimings(container.deviceProfile.isTablet) expandXInterpolator = Interpolators.clampToProgress( timings.getStagedRectScaleXInterpolator(), timings.stagedRectSlideStartOffset, - timings.stagedRectSlideEndOffset, + timings.stagedRectSlideEndOffset ) expandYInterpolator = Interpolators.clampToProgress( timings.getStagedRectScaleYInterpolator(), timings.stagedRectSlideStartOffset, - timings.stagedRectSlideEndOffset, + timings.stagedRectSlideEndOffset ) cellSplitInterpolator = Interpolators.clampToProgress( timings.cellSplitInterpolator, timings.cellSplitStartOffset, - timings.cellSplitEndOffset, + timings.cellSplitEndOffset ) iconFadeInterpolator = Interpolators.clampToProgress( timings.iconFadeInterpolator, timings.iconFadeStartOffset, - timings.iconFadeEndOffset, + timings.iconFadeEndOffset ) // Find device-specific measurements val resources = context.resources deviceCornerRadius = QuickStepContract.getWindowCornerRadius(context) deviceHalfDividerSize = - resources.getDimensionPixelSize(R.dimen.multi_window_task_divider_size) / 2f + resources.getDimensionPixelSize(R.dimen.multi_window_task_divider_size) / 2f val dividerCenterPos = dividerPos + deviceHalfDividerSize desiredSplitRatio = - if (dp.isLeftRightSplit) dividerCenterPos / dp.deviceProperties.widthPx - else dividerCenterPos / dp.deviceProperties.heightPx + if (dp.isLeftRightSplit) dividerCenterPos / dp.widthPx + else dividerCenterPos / dp.heightPx dividerPaint.color = resources.getColor(R.color.taskbar_background_dark, null /*theme*/) } @@ -160,13 +157,8 @@ open class FloatingAppPairBackground( // The right half of the background image val rightSide = RectF(dividerCenterPos + changingDividerSize, 0f, width, height) // Middle part is for divider background - val middleRect = - RectF( - leftSide.right - deviceHalfDividerSize, - 0f, - rightSide.left + deviceHalfDividerSize, - height, - ) + val middleRect = RectF(leftSide.right - deviceHalfDividerSize, 0f, + rightSide.left + deviceHalfDividerSize, height) // Draw background canvas.drawRect(middleRect, dividerPaint) @@ -182,7 +174,7 @@ open class FloatingAppPairBackground( changingInnerRadiusY, cornerRadiusX, cornerRadiusY, - ), + ) ) drawCustomRoundedRect( canvas, @@ -196,7 +188,7 @@ open class FloatingAppPairBackground( cornerRadiusY, changingInnerRadiusX, changingInnerRadiusY, - ), + ) ) // Calculate changing measurements for icons. @@ -267,13 +259,8 @@ open class FloatingAppPairBackground( // The bottom half of the background image val bottomSide = RectF(0f, dividerCenterPos + changingDividerSize, width, height) // Middle part is for divider background - val middleRect = - RectF( - 0f, - topSide.bottom - deviceHalfDividerSize, - width, - bottomSide.top + deviceHalfDividerSize, - ) + val middleRect = RectF(0f, topSide.bottom - deviceHalfDividerSize, + width, bottomSide.top + deviceHalfDividerSize) // Draw background canvas.drawRect(middleRect, dividerPaint) @@ -288,8 +275,8 @@ open class FloatingAppPairBackground( changingInnerRadiusX, changingInnerRadiusY, changingInnerRadiusX, - changingInnerRadiusY, - ), + changingInnerRadiusY + ) ) drawCustomRoundedRect( canvas, @@ -302,8 +289,8 @@ open class FloatingAppPairBackground( cornerRadiusX, cornerRadiusY, cornerRadiusX, - cornerRadiusY, - ), + cornerRadiusY + ) ) // Calculate changing measurements for icons. diff --git a/quickstep/src/com/android/quickstep/views/FloatingAppPairView.kt b/quickstep/src/com/android/quickstep/views/FloatingAppPairView.kt index 668413817a..e8d1cc1e36 100644 --- a/quickstep/src/com/android/quickstep/views/FloatingAppPairView.kt +++ b/quickstep/src/com/android/quickstep/views/FloatingAppPairView.kt @@ -27,7 +27,7 @@ import android.view.ViewGroup import android.widget.FrameLayout import com.android.launcher3.R import com.android.launcher3.Utilities -import com.android.launcher3.views.ActivityContext +import com.android.launcher3.statemanager.StatefulActivity import com.android.launcher3.views.BaseDragLayer /** @@ -38,11 +38,11 @@ class FloatingAppPairView @JvmOverloads constructor(context: Context, attrs: Att FrameLayout(context, attrs) { companion object { fun getFloatingAppPairView( - launcher: ActivityContext, + launcher: StatefulActivity<*>, originalView: View, appIcon1: Drawable?, appIcon2: Drawable?, - dividerPos: Int, + dividerPos: Int ): FloatingAppPairView { val dragLayer: ViewGroup = launcher.getDragLayer() val floatingView = @@ -62,11 +62,11 @@ class FloatingAppPairView @JvmOverloads constructor(context: Context, attrs: Att /** Initializes the view, copying the bounds and location of the original icon view. */ fun init( - launcher: ActivityContext, + launcher: StatefulActivity<*>, originalView: View, appIcon1: Drawable?, appIcon2: Drawable?, - dividerPos: Int, + dividerPos: Int ) { val viewBounds = Rect(0, 0, originalView.width, originalView.height) Utilities.getBoundsForViewInDragLayer( @@ -75,12 +75,12 @@ class FloatingAppPairView @JvmOverloads constructor(context: Context, attrs: Att viewBounds, false /* ignoreTransform */, null /* recycle */, - startingPosition, + startingPosition ) val lp = BaseDragLayer.LayoutParams( Math.round(startingPosition.width()), - Math.round(startingPosition.height()), + Math.round(startingPosition.height()) ) lp.ignoreInsets = true @@ -92,14 +92,14 @@ class FloatingAppPairView @JvmOverloads constructor(context: Context, attrs: Att layoutParams = lp // Prepare to draw app pair icon background - background = - if (appIcon1 == null || appIcon2 == null) { - val iconToAnimate = appIcon1 ?: appIcon2 - checkNotNull(iconToAnimate) - FloatingFullscreenAppPairBackground(context, this, iconToAnimate, dividerPos) - } else { - FloatingAppPairBackground(context, this, appIcon1, appIcon2, dividerPos) - } + background = if (appIcon1 == null || appIcon2 == null) { + val iconToAnimate = appIcon1 ?: appIcon2 + checkNotNull(iconToAnimate) + FloatingFullscreenAppPairBackground(context, this, iconToAnimate, + dividerPos) + } else { + FloatingAppPairBackground(context, this, appIcon1, appIcon2, dividerPos) + } background.setBounds(0, 0, lp.width, lp.height) } diff --git a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java index 72a823efe1..acbb2eccbb 100644 --- a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java +++ b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java @@ -239,7 +239,7 @@ public class FloatingTaskView extends FrameLayout { // Position the floating view exactly on top of the original lp.topMargin = Math.round(pos.top); if (mIsRtl) { - lp.setMarginStart(mContainer.getDeviceProfile().getDeviceProperties().getWidthPx() - Math.round(pos.right)); + lp.setMarginStart(mContainer.getDeviceProfile().widthPx - Math.round(pos.right)); } else { lp.setMarginStart(Math.round(pos.left)); } @@ -256,7 +256,7 @@ public class FloatingTaskView extends FrameLayout { */ public void addStagingAnimation(PendingAnimation animation, RectF startingBounds, Rect endBounds, boolean fadeWithThumbnail, boolean isStagedTask) { - boolean isTablet = mContainer.getDeviceProfile().getDeviceProperties().isTablet(); + boolean isTablet = mContainer.getDeviceProfile().isTablet; boolean splittingFromOverview = fadeWithThumbnail; SplitAnimationTimings timings; @@ -280,7 +280,7 @@ public class FloatingTaskView extends FrameLayout { public void addConfirmAnimation(PendingAnimation animation, RectF startingBounds, Rect endBounds, boolean fadeWithThumbnail, boolean isStagedTask) { SplitAnimationTimings timings = - AnimUtils.getDeviceSplitToConfirmTimings(mContainer.getDeviceProfile().getDeviceProperties().isTablet()); + AnimUtils.getDeviceSplitToConfirmTimings(mContainer.getDeviceProfile().isTablet); addAnimation(animation, startingBounds, endBounds, fadeWithThumbnail, isStagedTask, timings); diff --git a/quickstep/src/com/android/quickstep/views/FloatingWidgetView.java b/quickstep/src/com/android/quickstep/views/FloatingWidgetView.java index 7bddc23231..b719ee5b73 100644 --- a/quickstep/src/com/android/quickstep/views/FloatingWidgetView.java +++ b/quickstep/src/com/android/quickstep/views/FloatingWidgetView.java @@ -50,6 +50,7 @@ public class FloatingWidgetView extends FrameLayout implements AnimatorListener, OnGlobalLayoutListener, FloatingView { private static final Matrix sTmpMatrix = new Matrix(); + private final QuickstepLauncher mLauncher; private final ListenerView mListenerView; private final FloatingWidgetBackgroundView mBackgroundView; private final RectF mBackgroundOffset = new RectF(); @@ -80,6 +81,7 @@ public class FloatingWidgetView extends FrameLayout implements AnimatorListener, public FloatingWidgetView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + mLauncher = QuickstepLauncher.getLauncher(context); mListenerView = new ListenerView(context, attrs); mBackgroundView = new FloatingWidgetBackgroundView(context, attrs, defStyleAttr); addView(mBackgroundView); @@ -153,8 +155,7 @@ public class FloatingWidgetView extends FrameLayout implements AnimatorListener, } } - private void init(QuickstepLauncher launcher, DragLayer dragLayer, - LauncherAppWidgetHostView originalView, + private void init(DragLayer dragLayer, LauncherAppWidgetHostView originalView, RectF widgetBackgroundPosition, Size windowSize, float windowCornerRadius, boolean appTargetIsTranslucent, int fallbackBackgroundColor) { mAppWidgetView = originalView; @@ -162,7 +163,7 @@ public class FloatingWidgetView extends FrameLayout implements AnimatorListener, mAppWidgetView.beginDeferringUpdates(); mBackgroundPosition = widgetBackgroundPosition; mAppTargetIsTranslucent = appTargetIsTranslucent; - mEndRunnable = () -> finish(launcher, dragLayer); + mEndRunnable = () -> finish(dragLayer); mAppWidgetBackgroundView = RoundedCornerEnforcement.findBackground(mAppWidgetView); if (mAppWidgetBackgroundView == null) { @@ -270,7 +271,7 @@ public class FloatingWidgetView extends FrameLayout implements AnimatorListener, return positionsChanged; } - private void finish(QuickstepLauncher launcher, DragLayer dragLayer) { + private void finish(DragLayer dragLayer) { mAppWidgetView.setAlpha(1f); GhostView.removeGhost(mAppWidgetView); ((ViewGroup) dragLayer.getParent()).removeView(this); @@ -279,7 +280,7 @@ public class FloatingWidgetView extends FrameLayout implements AnimatorListener, // Removing GhostView must occur before ending deferrals. See b/190818220 mAppWidgetView.endDeferringUpdates(); recycle(); - launcher.getViewCache().recycleView(R.layout.floating_widget_view, this); + mLauncher.getViewCache().recycleView(R.layout.floating_widget_view, this); } public float getInitialCornerRadius() { @@ -322,7 +323,7 @@ public class FloatingWidgetView extends FrameLayout implements AnimatorListener, launcher.getViewCache().getView(R.layout.floating_widget_view, launcher, parent); floatingView.recycle(); - floatingView.init(launcher, dragLayer, originalView, widgetBackgroundPosition, windowSize, + floatingView.init(dragLayer, originalView, widgetBackgroundPosition, windowSize, windowCornerRadius, appTargetsAreTranslucent, fallbackBackgroundColor); parent.addView(floatingView); return floatingView; diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt index 7a8a6c59fd..faa9e2893b 100644 --- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt +++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt @@ -23,23 +23,21 @@ import android.util.Log import android.view.View import android.view.ViewStub import com.android.internal.jank.Cuj -import com.android.launcher3.Flags.enableRefactorDigitalWellbeingToast -import com.android.launcher3.Flags.enableRefactorTaskContentView +import com.android.launcher3.Flags.enableOverviewIconMenu import com.android.launcher3.Flags.enableRefactorTaskThumbnail import com.android.launcher3.R import com.android.launcher3.Utilities -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu import com.android.launcher3.util.RunnableList +import com.android.launcher3.util.SplitConfigurationOptions import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED import com.android.quickstep.TaskOverlayFactory import com.android.quickstep.util.RecentsOrientedState import com.android.quickstep.util.SplitSelectStateController -import com.android.quickstep.util.SplitTask +import com.android.systemui.shared.recents.model.Task import com.android.systemui.shared.system.InteractionJankMonitorWrapper import com.android.wm.shell.Flags.enableFlexibleTwoAppSplit -import com.android.wm.shell.shared.split.SplitBounds import com.android.wm.shell.shared.split.SplitScreenConstants.PersistentSnapPosition /** @@ -55,7 +53,7 @@ import com.android.wm.shell.shared.split.SplitScreenConstants.PersistentSnapPosi class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : TaskView(context, attrs, type = TaskViewType.GROUPED) { - private val MINIMUM_RATIO_TO_SHOW_ICON = 0.25f + private val MINIMUM_RATIO_TO_SHOW_ICON = 0.2f val leftTopTaskContainer: TaskContainer get() = taskContainers[0] @@ -64,7 +62,7 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu get() = taskContainers[1] // TODO(b/336612373): Support new TTV for GroupedTaskView - var splitBoundsConfig: SplitBounds? = null + var splitBoundsConfig: SplitConfigurationOptions.SplitBounds? = null private set @get:PersistentSnapPosition @@ -80,8 +78,8 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu val splitBoundsConfig = splitBoundsConfig ?: return val inSplitSelection = getThisTaskCurrentlyInSplitSelection() != INVALID_TASK_ID pagedOrientationHandler.measureGroupedTaskViewThumbnailBounds( - leftTopTaskContainer.taskContentView, - rightBottomTaskContainer.taskContentView, + leftTopTaskContainer.snapshotView, + rightBottomTaskContainer.snapshotView, widthSize, heightSize, splitBoundsConfig, @@ -97,17 +95,11 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu override fun inflateViewStubs() { super.inflateViewStubs() - findViewById(R.id.bottomright_task_content_view) + findViewById(R.id.bottomright_snapshot) ?.apply { - inflatedId = - if (enableRefactorTaskContentView()) R.id.bottomright_task_content_view - else R.id.bottomright_snapshot layoutResource = - when { - enableRefactorTaskContentView() -> R.layout.task_content_view - enableRefactorTaskThumbnail() -> R.layout.task_thumbnail - else -> R.layout.task_thumbnail_deprecated - } + if (enableRefactorTaskThumbnail()) R.layout.task_thumbnail + else R.layout.task_thumbnail_deprecated } ?.inflate() findViewById(R.id.bottomRight_icon) @@ -117,11 +109,6 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu else R.layout.icon_view } ?.inflate() - if (!enableRefactorDigitalWellbeingToast()) { - findViewById(R.id.bottomRight_digital_wellbeing_toast) - ?.apply { layoutResource = R.layout.digital_wellbeing_toast } - ?.inflate() - } } override fun onRecycle() { @@ -130,17 +117,17 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu } fun bind( - splitTask: SplitTask, + primaryTask: Task, + secondaryTask: Task, orientedState: RecentsOrientedState, taskOverlayFactory: TaskOverlayFactory, + splitBoundsConfig: SplitConfigurationOptions.SplitBounds?, ) { - this.groupTask = splitTask cancelPendingLoadTasks() taskContainers = listOf( createTaskContainer( - splitTask.topLeftTask, - R.id.task_content_view, + primaryTask, R.id.snapshot, R.id.icon, R.id.show_windows, @@ -149,10 +136,8 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu taskOverlayFactory, ), createTaskContainer( - splitTask.bottomRightTask, - R.id.bottomright_task_content_view, - if (enableRefactorTaskContentView()) R.id.snapshot - else R.id.bottomright_snapshot, + secondaryTask, + R.id.bottomright_snapshot, R.id.bottomRight_icon, R.id.show_windows_right, R.id.bottomRight_digital_wellbeing_toast, @@ -160,7 +145,7 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu taskOverlayFactory, ), ) - this.splitBoundsConfig = splitTask.splitBounds + this.splitBoundsConfig = splitBoundsConfig taskContainers.forEach { it.digitalWellBeingToast?.splitBounds = splitBoundsConfig } onBind(orientedState) } @@ -199,7 +184,7 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu private fun updateIconPlacement() { val splitBoundsConfig = splitBoundsConfig ?: return val deviceProfile = container.deviceProfile - val taskIconHeight = deviceProfile.overviewProfile.taskIconSizePx + val taskIconHeight = deviceProfile.overviewTaskIconSizePx val inSplitSelection = getThisTaskCurrentlyInSplitSelection() != INVALID_TASK_ID var oneIconHiddenDueToSmallWidth = false @@ -255,8 +240,8 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu leftTopTaskContainer.iconView.asView(), rightBottomTaskContainer.iconView.asView(), taskIconHeight, - leftTopTaskContainer.taskContentView.measuredWidth, - leftTopTaskContainer.taskContentView.measuredHeight, + leftTopTaskContainer.snapshotView.measuredWidth, + leftTopTaskContainer.snapshotView.measuredHeight, measuredHeight, measuredWidth, isLayoutRtl, @@ -268,7 +253,7 @@ class GroupedTaskView @JvmOverloads constructor(context: Context, attrs: Attribu } } - fun updateSplitBoundsConfig(splitBounds: SplitBounds?) { + fun updateSplitBoundsConfig(splitBounds: SplitConfigurationOptions.SplitBounds?) { splitBoundsConfig = splitBounds taskContainers.forEach { it.digitalWellBeingToast?.splitBounds = splitBoundsConfig diff --git a/quickstep/src/com/android/quickstep/views/IconAppChipView.kt b/quickstep/src/com/android/quickstep/views/IconAppChipView.kt index e14e6effe2..f4fd12792a 100644 --- a/quickstep/src/com/android/quickstep/views/IconAppChipView.kt +++ b/quickstep/src/com/android/quickstep/views/IconAppChipView.kt @@ -20,22 +20,16 @@ import android.animation.ObjectAnimator import android.animation.RectEvaluator import android.animation.ValueAnimator import android.content.Context -import android.graphics.Canvas import android.graphics.Outline import android.graphics.Rect import android.graphics.drawable.Drawable -import android.text.TextUtils.TruncateAt import android.util.AttributeSet -import android.view.Gravity -import android.view.KeyEvent import android.view.View import android.view.ViewAnimationUtils import android.view.ViewOutlineProvider import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView -import androidx.core.animation.addListener -import androidx.core.view.updateLayoutParams import com.android.app.animation.Interpolators import com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY import com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X @@ -45,8 +39,6 @@ import com.android.launcher3.Utilities import com.android.launcher3.util.MultiPropertyFactory import com.android.launcher3.util.MultiPropertyFactory.FloatBiFunction import com.android.launcher3.util.MultiValueAlpha -import com.android.quickstep.util.BorderAnimator -import com.android.quickstep.util.BorderAnimator.Companion.createSimpleBorderAnimator import com.android.quickstep.util.RecentsOrientedState import kotlin.math.max import kotlin.math.min @@ -64,10 +56,9 @@ constructor( private var iconView: IconView? = null private var iconArrowView: ImageView? = null private var menuAnchorView: View? = null - // Two textview so we can ellipsize the collapsed view and crossfade on expand to the full name. - private var appTitle: TextView? = null - private var isLayoutNaturalToLauncher = true + private var iconTextCollapsedView: TextView? = null + private var iconTextExpandedView: TextView? = null private val backgroundRelativeLtrLocation = Rect() private val backgroundAnimationRectEvaluator = RectEvaluator(backgroundRelativeLtrLocation) @@ -87,35 +78,26 @@ constructor( resources.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_expanded_gap) // Background dimensions - val backgroundMarginTopStart: Int = + private val backgroundMarginTopStart: Int = resources.getDimensionPixelSize( R.dimen.task_thumbnail_icon_menu_background_margin_top_start ) // Contents dimensions - private val appNameHorizontalMarginCollapsed = + private val appNameHorizontalMargin = resources.getDimensionPixelSize( R.dimen.task_thumbnail_icon_menu_app_name_margin_horizontal_collapsed ) - private val appNameHorizontalMarginExpanded = - resources.getDimensionPixelSize( - R.dimen.task_thumbnail_icon_menu_app_name_margin_horizontal_expanded - ) private val arrowMarginEnd = resources.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_arrow_margin) private val iconViewMarginStart = resources.getDimensionPixelSize(R.dimen.task_thumbnail_icon_view_start_margin) private val appIconSize = resources.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_app_icon_collapsed_size) - private val iconMenuElevation = - resources.getDimension(R.dimen.task_thumbnail_icon_menu_elevation) private val arrowSize = resources.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_arrow_size) private val iconViewDrawableExpandedSize = resources.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_app_icon_expanded_size) - private val focusBorderWidth = - resources.getDimensionPixelSize(R.dimen.app_chip_keyboard_border_width) - private val cornerRadius = resources.getDimensionPixelSize(R.dimen.app_chip_round_corner_radius) private var animator: AnimatorSet? = null @@ -128,10 +110,7 @@ constructor( private val viewTranslationY: MultiPropertyFactory = MultiPropertyFactory(this, VIEW_TRANSLATE_Y, INDEX_COUNT_TRANSLATION, SUM_AGGREGATOR) - // Width showing only the app icon and arrow. Max width should not be set to less than - // this. - private val minWidthAllowed = iconViewMarginStart + appIconSize + arrowSize + arrowMarginEnd - var maxWidth = Integer.MAX_VALUE + var maxWidth = Int.MAX_VALUE /** * Sets the maximum width of this Icon Menu. This is usually used when space is limited for * split screen. @@ -139,137 +118,47 @@ constructor( set(value) { // Width showing only the app icon and arrow. Max width should not be set to less than // this. - field = max(value, minWidthAllowed) + val minMaxWidth = iconViewMarginStart + appIconSize + arrowSize + arrowMarginEnd + field = max(value, minMaxWidth) } var status: AppChipStatus = AppChipStatus.Collapsed private set - val menuToCollapsedChipGap: Int = - getExpandedBackgroundLtrBounds().bottom - - getCollapsedBackgroundLtrBounds().bottom - - menuToChipGap - - private val focusBorderAnimator: BorderAnimator = - createSimpleBorderAnimator( - borderRadiusPx = cornerRadius, - borderWidthPx = focusBorderWidth, - boundsBuilder = { bounds -> - bounds.set(backgroundRelativeLtrLocation) - if (status == AppChipStatus.Expanded) { - // Draws the border inside the chip to avoid overlap with the task menu. - var inset = focusBorderWidth - 1 - bounds.inset(inset, inset) - } - }, - targetView = this, - borderColor = - context - .obtainStyledAttributes(attrs, R.styleable.IconAppChip) - .getColor( - R.styleable.IconAppChip_focusBorderColor, - BorderAnimator.DEFAULT_BORDER_COLOR, - ), - ) - - private var focusAnimator: AnimatorSet? = null - - private fun animateFocusBorder(isAppearing: Boolean) { - focusAnimator?.cancel() - focusAnimator = null - val borderAnimator = focusBorderAnimator.buildAnimator(isAppearing) - - val initialBackground = Rect(backgroundRelativeLtrLocation) - val targetBackground: Rect = - when { - // Background animator to increase the clipping size to show the focus border. - isAppearing -> - Rect(backgroundRelativeLtrLocation).apply { - if (status == AppChipStatus.Collapsed) - inset(-focusBorderWidth + 1, -focusBorderWidth + 1) - } - // Background animator to restore the outline size to hide the focus border - status == AppChipStatus.Expanded -> getExpandedBackgroundLtrBounds() - else -> getCollapsedBackgroundLtrBounds() - } - val backgroundAnimator = - ValueAnimator.ofObject( - backgroundAnimationRectEvaluator, - initialBackground, - targetBackground, - ) - .apply { addUpdateListener { invalidateOutline() } } - - focusAnimator = - AnimatorSet().apply { - playTogether(borderAnimator, backgroundAnimator) - duration = borderAnimator.duration - interpolator = borderAnimator.interpolator - start() - } - } - - public override fun onFocusChanged( - gainFocus: Boolean, - direction: Int, - previouslyFocusedRect: Rect?, - ) { - super.onFocusChanged(gainFocus, direction, previouslyFocusedRect) - animateFocusBorder(isAppearing = gainFocus) - } - - override fun draw(canvas: Canvas) { - super.draw(canvas) - focusBorderAnimator.drawBorder(canvas) - } - override fun onFinishInflate() { super.onFinishInflate() iconView = findViewById(R.id.icon_view) - appTitle = findViewById(R.id.icon_title) + iconTextCollapsedView = findViewById(R.id.icon_text_collapsed) + iconTextExpandedView = findViewById(R.id.icon_text_expanded) iconArrowView = findViewById(R.id.icon_arrow) menuAnchorView = findViewById(R.id.icon_view_menu_anchor) } override fun setText(text: CharSequence?) { - if (text == appTitle?.text) return - appTitle?.text = text + iconTextCollapsedView?.text = text + iconTextExpandedView?.text = text } override fun getDrawable(): Drawable? = iconView?.drawable - private var currentIconDrawableHash: Int = 0 - override fun setDrawable(icon: Drawable?) { - if (icon.hashCode() == currentIconDrawableHash) return iconView?.drawable = icon - currentIconDrawableHash = icon.hashCode() } override fun setDrawableSize(iconWidth: Int, iconHeight: Int) { iconView?.setDrawableSize(iconWidth, iconHeight) } - override fun getMinimumWidth(): Int = min(maxWidth, collapsedMenuDefaultWidth) - override fun setIconOrientation(orientationState: RecentsOrientedState, isGridTask: Boolean) { val orientationHandler = orientationState.orientationHandler - isLayoutNaturalToLauncher = orientationHandler.isLayoutNaturalToLauncher // Layout params for anchor view val anchorLayoutParams = menuAnchorView!!.layoutParams as LayoutParams - if (orientationHandler.isLayoutNaturalToLauncher) { - anchorLayoutParams.gravity = Gravity.START - anchorLayoutParams.marginStart = backgroundMarginTopStart - } else { - anchorLayoutParams.gravity = Gravity.LEFT - anchorLayoutParams.marginStart = 0 - } anchorLayoutParams.topMargin = expandedMenuDefaultHeight + menuToChipGap menuAnchorView!!.layoutParams = anchorLayoutParams // Layout Params for the Menu View (this) val iconMenuParams = layoutParams as LayoutParams - iconMenuParams.width = getChipWidth() + iconMenuParams.width = expandedMenuDefaultWidth iconMenuParams.height = expandedMenuDefaultHeight orientationHandler.setIconAppChipMenuParams( this, @@ -295,7 +184,7 @@ constructor( } outline.setRoundRect( mRtlAppliedOutlineBounds, - resources.getDimension(R.dimen.app_chip_round_corner_radius), + mRtlAppliedOutlineBounds.height() / 2f, ) } } @@ -310,12 +199,31 @@ constructor( // Layout Params for the collapsed Icon Text View val textMarginStart = - iconMarginStartRelativeToParent + appIconSize + appNameHorizontalMarginCollapsed - val iconTextCollapsedParams = appTitle!!.layoutParams as LayoutParams + iconMarginStartRelativeToParent + appIconSize + appNameHorizontalMargin + val iconTextCollapsedParams = iconTextCollapsedView!!.layoutParams as LayoutParams orientationHandler.setIconAppChipChildrenParams(iconTextCollapsedParams, textMarginStart) - iconTextCollapsedParams.width = - calculateCollapsedTextWidth(collapsedBackgroundBounds.width()) - appTitle?.layoutParams = iconTextCollapsedParams + val collapsedTextWidth = + (collapsedBackgroundBounds.width() - + iconViewMarginStart - + appIconSize - + arrowSize - + appNameHorizontalMargin - + arrowMarginEnd) + iconTextCollapsedParams.width = collapsedTextWidth + iconTextCollapsedView!!.layoutParams = iconTextCollapsedParams + iconTextCollapsedView!!.alpha = 1f + + // Layout Params for the expanded Icon Text View + val iconTextExpandedParams = iconTextExpandedView!!.layoutParams as LayoutParams + orientationHandler.setIconAppChipChildrenParams(iconTextExpandedParams, textMarginStart) + iconTextExpandedView!!.layoutParams = iconTextExpandedParams + iconTextExpandedView!!.alpha = 0f + iconTextExpandedView!!.setRevealClip( + true, + 0f, + appIconSize / 2f, + collapsedTextWidth.toFloat(), + ) // Layout Params for the Icon Arrow View val iconArrowParams = iconArrowView!!.layoutParams as LayoutParams @@ -335,46 +243,6 @@ constructor( ) } - private fun enableMarquee(isEnabled: Boolean) { - // Marquee should not be enabled when is running test harness. - val isMarqueeEnabled = isEnabled && !Utilities.isRunningInTestHarness() - appTitle?.let { - it.ellipsize = if (isMarqueeEnabled) TruncateAt.MARQUEE else null - it.isSelected = isMarqueeEnabled - } - } - - /** - * Calculates the width available for the collapsed text (app name) within the view. - * - * This function determines the maximum width that the app name can occupy when the view is in - * its collapsed state. It considers various factors such as the maximum allowed width, the - * bounds of the collapsed background, the size of the app icon, the arrow, and the margins - * around these elements. - * - * @return The calculated width available for the collapsed text (app name). - */ - private fun calculateCollapsedTextWidth(width: Int): Int { - val collapsedTextWidth = - (width - - iconViewMarginStart - - appIconSize - - arrowSize - - appNameHorizontalMarginCollapsed - - arrowMarginEnd) - - val spaceLeftForText = maxWidth - minWidthAllowed - return minOf(collapsedTextWidth, spaceLeftForText).coerceAtLeast(0) - } - - private fun calculateExpandedTextWidth(width: Int): Int = - width - - iconViewMarginStart - - iconViewDrawableExpandedSize - - arrowSize - - appNameHorizontalMarginExpanded - - arrowMarginEnd - override fun setIconColorTint(color: Int, amount: Float) { // RecentsView's COLOR_TINT animates between 0 and 0.5f, we want to hide the app chip menu. val colorTintAlpha = Utilities.mapToRange(amount, 0f, 0.5f, 1f, 0f, Interpolators.LINEAR) @@ -431,16 +299,25 @@ constructor( fun getMenuTranslationY(): MultiPropertyFactory.MultiProperty = viewTranslationY[INDEX_MENU_TRANSLATION] - internal fun revealAnim(isRevealing: Boolean, animated: Boolean = true): AnimatorSet { + internal fun revealAnim(isRevealing: Boolean, animated: Boolean = true) { cancelInProgressAnimations() val collapsedBackgroundBounds = getCollapsedBackgroundLtrBounds() val expandedBackgroundBounds = getExpandedBackgroundLtrBounds() val initialBackground = Rect(backgroundRelativeLtrLocation) animator = AnimatorSet() - val isRtl = isLayoutRtl if (isRevealing) { + val isRtl = isLayoutRtl bringToFront() + // Clip expanded text with reveal animation so it doesn't go beyond the edge of the menu + val expandedTextRevealAnim = + ViewAnimationUtils.createCircularReveal( + iconTextExpandedView, + 0, + iconTextExpandedView!!.height / 2, + iconTextCollapsedView!!.width.toFloat(), + iconTextExpandedView!!.width.toFloat(), + ) // Animate background clipping val backgroundAnimator = ValueAnimator.ofObject( @@ -453,19 +330,31 @@ constructor( val iconViewScaling = iconViewDrawableExpandedSize / appIconSize.toFloat() val arrowTranslationX = (expandedBackgroundBounds.right - collapsedBackgroundBounds.right).toFloat() - val iconCenterToTextCollapsed = appIconSize / 2f + appNameHorizontalMarginCollapsed + val iconCenterToTextCollapsed = appIconSize / 2f + appNameHorizontalMargin val iconCenterToTextExpanded = - iconViewDrawableExpandedSize / 2f + appNameHorizontalMarginCollapsed + iconViewDrawableExpandedSize / 2f + appNameHorizontalMargin val textTranslationX = iconCenterToTextExpanded - iconCenterToTextCollapsed val textTranslationXWithRtl = if (isRtl) -textTranslationX else textTranslationX val arrowTranslationWithRtl = if (isRtl) -arrowTranslationX else arrowTranslationX animator!!.playTogether( + expandedTextRevealAnim, backgroundAnimator, ObjectAnimator.ofFloat(iconView, SCALE_X, iconViewScaling), ObjectAnimator.ofFloat(iconView, SCALE_Y, iconViewScaling), - ObjectAnimator.ofFloat(appTitle, TRANSLATION_X, textTranslationXWithRtl), + ObjectAnimator.ofFloat( + iconTextCollapsedView, + TRANSLATION_X, + textTranslationXWithRtl, + ), + ObjectAnimator.ofFloat( + iconTextExpandedView, + TRANSLATION_X, + textTranslationXWithRtl, + ), + ObjectAnimator.ofFloat(iconTextCollapsedView, ALPHA, 0f), + ObjectAnimator.ofFloat(iconTextExpandedView, ALPHA, 1f), ObjectAnimator.ofFloat(iconArrowView, TRANSLATION_X, arrowTranslationWithRtl), ObjectAnimator.ofFloat(iconArrowView, SCALE_Y, -1f), ) @@ -475,11 +364,11 @@ constructor( // Clip expanded text with reveal animation so it doesn't go beyond the edge of the menu val expandedTextClipAnim = ViewAnimationUtils.createCircularReveal( - appTitle, - if (isRtl) appTitle!!.width else 0, - appTitle!!.height / 2, - appTitle!!.width.toFloat(), - calculateCollapsedTextWidth(collapsedBackgroundBounds.width()).toFloat(), + iconTextExpandedView, + 0, + iconTextExpandedView!!.height / 2, + iconTextExpandedView!!.width.toFloat(), + iconTextCollapsedView!!.width.toFloat(), ) // Animate background clipping @@ -497,75 +386,25 @@ constructor( expandedTextClipAnim, backgroundAnimator, ObjectAnimator.ofFloat(iconView, SCALE_PROPERTY, 1f), - ObjectAnimator.ofFloat(appTitle, TRANSLATION_X, 0f), + ObjectAnimator.ofFloat(iconTextCollapsedView, TRANSLATION_X, 0f), + ObjectAnimator.ofFloat(iconTextExpandedView, TRANSLATION_X, 0f), + ObjectAnimator.ofFloat(iconTextCollapsedView, ALPHA, 1f), + ObjectAnimator.ofFloat(iconTextExpandedView, ALPHA, 0f), ObjectAnimator.ofFloat(iconArrowView, TRANSLATION_X, 0f), ObjectAnimator.ofFloat(iconArrowView, SCALE_Y, 1f), ) animator!!.duration = MENU_BACKGROUND_HIDE_DURATION.toLong() status = AppChipStatus.Collapsed - sendToBack() } if (!animated) animator!!.duration = 0 animator!!.interpolator = Interpolators.EMPHASIZED - - // Increase the chip and appTitle size before the animation starts when it's expanding. - // And decrease the size after the animation when is collapsing. - animator!!.addListener( - onStart = { - // Hide focused border during expanding/collapsing animation - if (isFocused) { - focusBorderAnimator.setBorderVisibility(visible = false, animated = false) - } - when (status) { - AppChipStatus.Expanded -> updateChipSize() - // Disable marquee before chip is collapsed - AppChipStatus.Collapsed -> enableMarquee(false) - } - }, - onEnd = { - if (isFocused) animateFocusBorder(isAppearing = true) - when (status) { - AppChipStatus.Collapsed -> updateChipSize() - // Enable marquee after chip is fully expanded - AppChipStatus.Expanded -> enableMarquee(true) - } - }, - ) - return animator!! - } - - /** - * Updates the width of the app title based on the current [AppChipStatus]. - * - * This function dynamically adjusts the width of the `appTitle` TextView depending on whether - * the app chip is in an expanded or collapsed state. - * - When the chip is [AppChipStatus.Expanded], the title width is set to - * [expandedMaxTextWidth], allowing the title to potentially take up more space. - * - When the chip is [AppChipStatus.Collapsed], the title width is calculated based on the - * width of the collapsed background. This ensures the title fits within the smaller, - * collapsed chip boundaries. The width is then determined by calling - * [calculateCollapsedTextWidth]. - */ - private fun updateChipSize() { - val chipWidth = getChipWidth() - when (status) { - AppChipStatus.Expanded -> { - updateLayoutParams { width = chipWidth } - appTitle!!.updateLayoutParams { width = calculateExpandedTextWidth(chipWidth) } - } - AppChipStatus.Collapsed -> { - appTitle!!.updateLayoutParams { - val collapsedBackgroundWidth = getCollapsedBackgroundLtrBounds().width() - width = calculateCollapsedTextWidth(collapsedBackgroundWidth) - } - updateLayoutParams { width = chipWidth } - } - } + animator!!.start() } private fun getCollapsedBackgroundLtrBounds(): Rect { - val bounds = Rect(0, 0, minimumWidth, collapsedMenuDefaultHeight) + val bounds = + Rect(0, 0, min(maxWidth, collapsedMenuDefaultWidth), collapsedMenuDefaultHeight) bounds.offset(backgroundMarginTopStart, backgroundMarginTopStart) return bounds } @@ -573,18 +412,6 @@ constructor( private fun getExpandedBackgroundLtrBounds() = Rect(0, 0, expandedMenuDefaultWidth, expandedMenuDefaultHeight) - private fun getCollapsedBackgroundWidth() = getCollapsedBackgroundLtrBounds().right - - private fun getChipWidth(): Int { - // TODO(b/292269949): When in fake orientation, the width of the chip remains expanded - // to prevent wrong translation due to chip rotation and anchor. - if (!isLayoutNaturalToLauncher) return expandedMenuDefaultWidth - return when (status) { - AppChipStatus.Expanded -> expandedMenuDefaultWidth - AppChipStatus.Collapsed -> getCollapsedBackgroundWidth() - } - } - private fun cancelInProgressAnimations() { // We null the `AnimatorSet` because it holds references to the `Animators` which aren't // expecting to be mutable and will cause a crash if they are re-used. @@ -594,62 +421,20 @@ constructor( } } - override fun bringToFront() { - super.bringToFront() - z = iconMenuElevation + Z_INDEX_FRONT - updateParentZIndex(Z_INDEX_FRONT) - } - - private fun sendToBack() { - z = iconMenuElevation - updateParentZIndex(0f) - } - - private fun updateParentZIndex(zIndex: Float) { - val parentView = parent as? TaskView - if (parentView?.isOnGridBottomRow == true) { - parentView.z = zIndex - } - } - override fun focusSearch(direction: Int): View? { if (mParent == null) return null return when (direction) { FOCUS_RIGHT, - FOCUS_DOWN -> mParent.focusSearch(this, FOCUS_FORWARD) + FOCUS_DOWN -> mParent.focusSearch(this, View.FOCUS_FORWARD) FOCUS_UP, - FOCUS_LEFT -> mParent.focusSearch(this, FOCUS_BACKWARD) + FOCUS_LEFT -> mParent.focusSearch(this, View.FOCUS_BACKWARD) else -> super.focusSearch(direction) } } - /** - * We need to over-ride here due to liveTile mode, the [OverviewInputConsumer] is added, which - * consumes all [InputEvent]'s and focus isn't moved correctly. - */ - override fun dispatchKeyEvent(event: KeyEvent): Boolean { - if (event.action != KeyEvent.ACTION_DOWN) return super.dispatchKeyEvent(event) - - val currentFocus = findFocus() ?: return super.dispatchKeyEvent(event) - - val nextFocus = - when (event.keyCode) { - KeyEvent.KEYCODE_DPAD_UP -> focusSearch(currentFocus, FOCUS_BACKWARD) - KeyEvent.KEYCODE_DPAD_DOWN -> focusSearch(currentFocus, FOCUS_FORWARD) - KeyEvent.KEYCODE_TAB -> - focusSearch( - currentFocus, - if (event.isShiftPressed) FOCUS_BACKWARD else FOCUS_FORWARD, - ) - else -> null - } - - return nextFocus?.requestFocus() ?: super.dispatchKeyEvent(event) - } - fun reset() { setText(null) - drawable = null + setDrawable(null) } override fun asView(): View = this @@ -665,8 +450,6 @@ constructor( private const val MENU_BACKGROUND_REVEAL_DURATION = 417 private const val MENU_BACKGROUND_HIDE_DURATION = 333 - private const val Z_INDEX_FRONT = 10f - private const val NUM_ALPHA_CHANNELS = 4 private const val INDEX_CONTENT_ALPHA = 0 private const val INDEX_COLOR_FILTER_ALPHA = 1 diff --git a/quickstep/src/com/android/quickstep/views/IconView.kt b/quickstep/src/com/android/quickstep/views/IconView.kt index 04f9537617..cb69b22de0 100644 --- a/quickstep/src/com/android/quickstep/views/IconView.kt +++ b/quickstep/src/com/android/quickstep/views/IconView.kt @@ -157,20 +157,20 @@ class IconView : View, TaskViewIcon { val deviceProfile: DeviceProfile = (ActivityContext.lookupContext(context) as ActivityContext).getDeviceProfile() orientationHandler.setTaskIconParams( - iconParams = layoutParams as FrameLayout.LayoutParams, - taskIconMargin = deviceProfile.overviewProfile.taskMarginPx, - taskIconHeight = deviceProfile.overviewProfile.taskIconSizePx, - thumbnailTopMargin = deviceProfile.overviewProfile.taskThumbnailTopMarginPx, + iconParams = getLayoutParams() as FrameLayout.LayoutParams, + taskIconMargin = deviceProfile.overviewTaskMarginPx, + taskIconHeight = deviceProfile.overviewTaskIconSizePx, + thumbnailTopMargin = deviceProfile.overviewTaskThumbnailTopMarginPx, isRtl = layoutDirection == LAYOUT_DIRECTION_RTL, ) updateLayoutParams { - height = deviceProfile.overviewProfile.taskIconSizePx + height = deviceProfile.overviewTaskIconSizePx width = height } setRotation(orientationHandler.degreesRotated) val iconDrawableSize = - if (isGridTask) deviceProfile.overviewProfile.taskIconDrawableSizeGridPx - else deviceProfile.overviewProfile.taskIconDrawableSizePx + if (isGridTask) deviceProfile.overviewTaskIconDrawableSizeGridPx + else deviceProfile.overviewTaskIconDrawableSizePx setDrawableSize(iconDrawableSize, iconDrawableSize) } diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index e8753b9702..a6be3f789a 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -18,14 +18,14 @@ package com.android.quickstep.views; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY; -import static com.android.launcher3.LauncherState.ADD_DESK_BUTTON; +import static com.android.launcher3.Flags.enableGridOnlyOverview; import static com.android.launcher3.LauncherState.CLEAR_ALL_BUTTON; +import static com.android.launcher3.LauncherState.ADD_DESK_BUTTON; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.LauncherState.OVERVIEW_MODAL_TASK; import static com.android.launcher3.LauncherState.OVERVIEW_SPLIT_SELECT; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SPLIT_SELECTION_EXIT_HOME; -import static com.android.launcher3.util.OverviewReleaseFlags.enableGridOnlyOverview; import android.annotation.TargetApi; import android.content.Context; @@ -49,7 +49,9 @@ import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.util.PendingSplitSelectInfo; import com.android.launcher3.util.SplitConfigurationOptions; import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource; +import com.android.quickstep.BaseContainerInterface; import com.android.quickstep.GestureState; +import com.android.quickstep.LauncherActivityInterface; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.util.AnimUtils; import com.android.quickstep.util.SplitSelectStateController; @@ -166,8 +168,6 @@ public class LauncherRecentsView extends RecentsView getContainerInterface(int displayId) { + return LauncherActivityInterface.INSTANCE; + } + @Override protected void onDismissAnimationEnds() { super.onDismissAnimationEnds(); @@ -298,7 +303,8 @@ public class LauncherRecentsView extends RecentsView extends FrameLayo public static final String TAG = "OverviewActionsView"; private final Rect mInsets = new Rect(); - /** - * We need to over-ride here due to liveTile mode, the [OverviewInputConsumer] is added, which - * consumes all [InputEvent]'s and focus isn't moved correctly. - */ - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (event.getAction() != KeyEvent.ACTION_DOWN) return super.dispatchKeyEvent(event); - - View currentFocus = findFocus(); - if (currentFocus == null) return super.dispatchKeyEvent(event); - - View nextFocus = null; - switch (event.getKeyCode()) { - case KeyEvent.KEYCODE_DPAD_LEFT -> nextFocus = focusSearch(currentFocus, - FOCUS_BACKWARD); - case KeyEvent.KEYCODE_DPAD_RIGHT -> nextFocus = focusSearch(currentFocus, - FOCUS_FORWARD); - case KeyEvent.KEYCODE_TAB -> nextFocus = focusSearch(currentFocus, - event.isShiftPressed() ? FOCUS_BACKWARD : FOCUS_FORWARD); - } - - if (nextFocus != null) { - return nextFocus.requestFocus(); - } - - return super.dispatchKeyEvent(event); - } - @IntDef(flag = true, value = { HIDDEN_NON_ZERO_ROTATION, HIDDEN_NO_TASKS, @@ -304,7 +274,7 @@ public class OverviewActionsView extends FrameLayo private void updateForIsTablet() { assert mDp != null; // Update flags to see if split button should be hidden. - updateSplitButtonHiddenFlags(FLAG_SMALL_SCREEN_HIDE_SPLIT, !mDp.getDeviceProperties().isTablet()); + updateSplitButtonHiddenFlags(FLAG_SMALL_SCREEN_HIDE_SPLIT, !mDp.isTablet); updateActionButtonsVisibility(); } @@ -313,7 +283,7 @@ public class OverviewActionsView extends FrameLayo return; } boolean showSingleTaskActions = !mIsGroupedTask; - boolean showGroupActions = mIsGroupedTask && mDp.getDeviceProperties().isTablet() && mCanSaveAppPair; + boolean showGroupActions = mIsGroupedTask && mDp.isTablet && mCanSaveAppPair; Log.d(TAG, "updateActionButtonsVisibility() called: showSingleTaskActions = [" + showSingleTaskActions + "], showGroupActions = [" + showGroupActions + "]"); getActionsAlphas().get(INDEX_GROUPED_ALPHA).setValue(showSingleTaskActions ? 1 : 0); @@ -406,7 +376,7 @@ public class OverviewActionsView extends FrameLayo LayoutParams actionParams = (LayoutParams) actionBar.getLayoutParams(); actionParams.setMargins( - actionParams.leftMargin, mDp.getOverviewProfile().getActionsTopMarginPx(), + actionParams.leftMargin, mDp.overviewActionsTopMarginPx, actionParams.rightMargin, getBottomMargin()); } @@ -415,15 +385,13 @@ public class OverviewActionsView extends FrameLayo return 0; } - if (mDp.getDeviceProperties().isTablet() && enableGridOnlyOverview()) { - return mDp.getTaskbarProfile().getStashedTaskbarHeight(); + if (mDp.isTablet && Flags.enableGridOnlyOverview()) { + return mDp.stashedTaskbarHeight; } // Align to bottom of task Rect. - return mDp.getDeviceProperties().getHeightPx() - - mTaskSize.bottom - - mDp.getOverviewProfile().getActionsTopMarginPx() - - mDp.getOverviewProfile().getActionsHeight(); + return mDp.heightPx - mTaskSize.bottom - mDp.overviewActionsTopMarginPx + - mDp.overviewActionsHeight; } /** diff --git a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt index 972f187680..6acaeae8db 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt +++ b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt @@ -16,42 +16,21 @@ package com.android.quickstep.views -import android.app.ActivityTaskManager.INVALID_TASK_ID -import android.view.View -import androidx.core.graphics.toRectF -import androidx.core.view.children -import androidx.core.view.contains +import android.os.VibrationAttributes import androidx.dynamicanimation.animation.FloatPropertyCompat import androidx.dynamicanimation.animation.FloatValueHolder import androidx.dynamicanimation.animation.SpringAnimation import androidx.dynamicanimation.animation.SpringForce -import com.android.internal.jank.Cuj -import com.android.launcher3.PagedView +import com.android.launcher3.Flags.enableGridOnlyOverview import com.android.launcher3.R -import com.android.launcher3.concurrent.annotations.LightweightBackground -import com.android.launcher3.concurrent.annotations.LightweightBackgroundPriority -import com.android.launcher3.logging.StatsLogManager.LauncherEvent +import com.android.launcher3.Utilities.boundToRange import com.android.launcher3.util.DynamicResource import com.android.launcher3.util.MSDLPlayerWrapper -import com.android.launcher3.util.OverviewReleaseFlags.enableGridOnlyOverview -import com.android.launcher3.views.ActivityContext -import com.android.quickstep.SystemUiProxy -import com.android.quickstep.util.DesksUtils.Companion.areMultiDesksFlagsEnabled import com.android.quickstep.util.TaskGridNavHelper -import com.android.quickstep.util.isDefaultDisplay -import com.android.quickstep.util.isExternalDisplay import com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY -import com.android.quickstep.views.RecentsViewUtils.OnDeskAddedListener -import com.android.quickstep.views.TaskView.Companion.GRID_END_TRANSLATION_X -import com.android.systemui.shared.system.ActivityManagerWrapper -import com.android.systemui.shared.system.InteractionJankMonitorWrapper import com.google.android.msdl.data.model.MSDLToken -import com.google.common.util.concurrent.ListeningExecutorService -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject +import com.google.android.msdl.domain.InteractionProperties import kotlin.math.abs -import kotlin.math.max import kotlin.math.roundToInt import kotlin.math.sign @@ -59,349 +38,179 @@ import kotlin.math.sign * Helper class for [RecentsView]. This util class contains refactored and extracted functions from * RecentsView related to TaskView dismissal. */ -class RecentsDismissUtils -@AssistedInject -constructor( - @Assisted private val recentsView: RecentsView<*, *>, - private val systemUiProxy: SystemUiProxy, - @LightweightBackground(LightweightBackgroundPriority.UI) - private val uiHelperExecutor: ListeningExecutorService, - private val activityManagerWrapper: ActivityManagerWrapper, - private val msdlPlayerWrapper: MSDLPlayerWrapper, -) { - @AssistedFactory - interface Factory { - fun create(recentsView: RecentsView<*, *>): RecentsDismissUtils - } +class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) { /** - * [OnDeskAddedListener] which launches the new desk right after it is created. - * - * This is mainly used for clearing all desks via the clear all button in the recent view or the - * removal of the last task in a desk. - */ - private val launchNewDeskListener = - object : OnDeskAddedListener { - override fun onDeskAdded(desktopTaskView: DesktopTaskView) { - desktopTaskView.launchWithAnimation() - recentsView.mUtils.removeOnDeskAddedListener(this) - } - } - - /** - * Runs the default spring animation when a dismissed task view in overview is released. + * Creates the spring animations which run when a dragged task view in overview is released. * *

When a task dismiss is cancelled, the task will return to its original position via a * spring animation. As it passes the threshold of its settling state, its neighbors will spring * in response to the perceived impact of the settling task. */ - fun createTaskDismissSpringAnimation( - dismissedTaskView: TaskView?, - shouldRemoveTaskView: Boolean, - isSplitSelection: Boolean, - ): SpringSet? { - if (dismissedTaskView == null || isSplitSelection) { - return createTaskDismissSpringAnimation( - dismissedTaskView, - isDismissing = true, - DismissedTaskData( - startVelocity = 0f, - dismissLength = 0, - dismissThreshold = 0, - finalPosition = 0f, - ), - shouldRemoveTaskView, - isSplitSelection, - ) - } - return createTaskDismissSpringAnimation( - dismissedTaskView, - isDismissing = true, - getDefaultDismissedTaskData(dismissedTaskView), - shouldRemoveTaskView, - isSplitSelection, - ) - } - - /** - * Runs the spring animations when a dismissed task view in overview is released. - * - *

When a task dismiss is cancelled, the task will return to its original position via a - * spring animation. As it passes the threshold of its settling state, its neighbors will spring - * in response to the perceived impact of the settling task. - */ - fun createTaskDismissSpringAnimation( - dismissedTaskView: TaskView?, + fun createTaskDismissSettlingSpringAnimation( + draggedTaskView: TaskView?, + velocity: Float, isDismissing: Boolean, - dismissedTaskData: DismissedTaskData, - shouldRemoveTaskView: Boolean, - isSplitSelection: Boolean, - ): SpringSet? { - val gridEndData = getGridEndData(dismissedTaskView) - val dismissedTaskSecondaryDimension = - if (dismissedTaskView == null) - recentsView.pagedOrientationHandler.getSecondarySize( - recentsView.mLastComputedTaskSize.toRectF() - ) - else { - recentsView.pagedOrientationHandler - .getSecondaryDimension(dismissedTaskView) - .toFloat() - } - val verticalFactor = - recentsView.pagedOrientationHandler.getTaskDismissVerticalDirection().toFloat() - val startVelocity = - abs(dismissedTaskData.startVelocity).coerceAtLeast(dismissedTaskSecondaryDimension) * - dismissedTaskData.startVelocity.sign - - // Spring that animates the dismissed task. - val dismissedTaskViewSpring = - if (isSplitSelection || dismissedTaskView == null) null - else { - createDismissedTaskViewSpringAnimation( - dismissedTaskView, - isDismissing, - DismissedTaskData( - startVelocity = startVelocity, - dismissLength = dismissedTaskData.dismissLength, - finalPosition = dismissedTaskData.finalPosition, - dismissThreshold = dismissedTaskData.dismissThreshold, - ), - ) - } - - // SpringSet tracking all dismiss springs before running end-snapping and relayout. - var springSet = - dismissedTaskViewSpring?.let { SpringSet(it, dismissedTaskData.finalPosition) } - - if (isDismissing) { - // The spring set that will reflow the tasks to fill the gap left by the dismissed task. - val reflowSpringSet = - createTaskGridReflowSpringSet( - dismissedTaskView, - getDismissedTaskGapForReflow(dismissedTaskView, isSplitSelection), - gridEndData, - isSplitSelection, - ) - if (springSet == null) { - // Only reflow, as there is no dismissed task to animate. - springSet = reflowSpringSet - } else if (reflowSpringSet != null) { - springSet.playAfterThreshold( - driverThreshold = dismissedTaskSecondaryDimension * verticalFactor, - triggeredSpringSet = reflowSpringSet, - ) - } - } else if (springSet != null && dismissedTaskView != null) { - // Neighbor settling spring animations. - val neighborSettlingSpringSet = - createNeighborSettlingSpringSet(dismissedTaskView, isSpringDirectionVertical = true) - springSet.playAfterThreshold( - driverThreshold = dismissedTaskData.finalPosition, - triggeredSpringSet = neighborSettlingSpringSet, - minVelocity = startVelocity, - ) - springSet.addEndListener { - InteractionJankMonitorWrapper.cancel(Cuj.CUJ_LAUNCHER_OVERVIEW_TASK_DISMISS) - } - } - - if (!isSplitSelection) { - springSet?.addStartListener { - InteractionJankMonitorWrapper.begin( - recentsView, - Cuj.CUJ_LAUNCHER_OVERVIEW_TASK_DISMISS, - ) - } - } - val endRunnable = { - if (isDismissing) { - onEndSnappingAndRelayout( - dismissedTaskView, - shouldRemoveTaskView, - isSplitSelection, - gridEndData, - ) - } else { - recentsView.onDismissAnimationEnds() - } - } - if (springSet == null) { - endRunnable() - return null - } - return springSet.addEndListener(endRunnable).start() - } - - /** Default dismissed task view spring animation. */ - private fun createDismissedTaskViewSpringAnimation( - dismissedTaskView: TaskView - ): SpringAnimation? { - return createDismissedTaskViewSpringAnimation( - dismissedTaskView, - isDismissing = true, - getDefaultDismissedTaskData(dismissedTaskView), - ) - } - - /** Dismissed task view spring animation. */ - private fun createDismissedTaskViewSpringAnimation( - dismissedTaskView: TaskView, - isDismissing: Boolean, - dismissedTaskData: DismissedTaskData, + dismissLength: Int, + onEndRunnable: () -> Unit, ): SpringAnimation? { + draggedTaskView ?: return null val taskDismissFloatProperty = FloatPropertyCompat.createFloatPropertyCompat( - dismissedTaskView.secondaryDismissTranslationProperty + draggedTaskView.secondaryDismissTranslationProperty ) - var previousDisplacement = taskDismissFloatProperty.getValue(dismissedTaskView) - // Animate dismissed task towards dismissal or rest state. - val dismissedTaskViewSpringAnimation = - SpringAnimation(dismissedTaskView, taskDismissFloatProperty) - .setSpring( - createExpressiveDismissSpringForce() - .setFinalPosition(dismissedTaskData.finalPosition) - ) - .setStartVelocity(dismissedTaskData.startVelocity) - .addUpdateListener { animation, currentDisplacement, _ -> - // Play haptic as task crosses dismiss threshold from above or below. - val previousBeyondThreshold = - abs(previousDisplacement) >= abs(dismissedTaskData.dismissThreshold) - val currentBeyondThreshold = - abs(currentDisplacement) >= abs(dismissedTaskData.dismissThreshold) - if (previousBeyondThreshold != currentBeyondThreshold) { - msdlPlayerWrapper.playToken(MSDLToken.SWIPE_THRESHOLD_INDICATOR) - } - previousDisplacement = currentDisplacement - - if (dismissedTaskView.isRunningTask && recentsView.enableDrawingLiveTile) { + val minVelocity = + recentsView.pagedOrientationHandler.getSecondaryDimension(draggedTaskView).toFloat() + val startVelocity = abs(velocity).coerceAtLeast(minVelocity) * velocity.sign + // Animate dragged task towards dismissal or rest state. + val draggedTaskViewSpringAnimation = + SpringAnimation(draggedTaskView, taskDismissFloatProperty) + .setSpring(createExpressiveDismissSpringForce()) + .setStartVelocity(startVelocity) + .addUpdateListener { animation, value, _ -> + if (isDismissing && abs(value) >= abs(dismissLength)) { + animation.cancel() + } else if (draggedTaskView.isRunningTask && recentsView.enableDrawingLiveTile) { recentsView.runActionOnRemoteHandles { remoteTargetHandle -> remoteTargetHandle.taskViewSimulator.taskSecondaryTranslation.value = - taskDismissFloatProperty.getValue(dismissedTaskView) + taskDismissFloatProperty.getValue(draggedTaskView) } recentsView.redrawLiveTile() } - // End dismissed task animation once beyond the screen so next animations play. - if ( - isDismissing && - abs(currentDisplacement) >= abs(dismissedTaskData.dismissLength) - ) { - (animation as SpringAnimation).skipToEnd() + } + .addEndListener { _, _, _, _ -> + if (isDismissing) { + if (!recentsView.showAsGrid() || enableGridOnlyOverview()) { + runTaskGridReflowSpringAnimation( + draggedTaskView, + getDismissedTaskGapForReflow(draggedTaskView), + onEndRunnable, + ) + } else { + recentsView.dismissTaskView( + draggedTaskView, + /* animateTaskView = */ false, + /* removeTask = */ true, + ) + onEndRunnable() + } + } else { + recentsView.onDismissAnimationEnds() + onEndRunnable() } } - return dismissedTaskViewSpringAnimation + if (!isDismissing) { + addNeighborSettlingSpringAnimations( + draggedTaskView, + draggedTaskViewSpringAnimation, + driverProgressThreshold = 0f, + isSpringDirectionVertical = true, + minVelocity = startVelocity, + ) + } + return draggedTaskViewSpringAnimation } - private fun getDefaultDismissedTaskData(dismissedTaskView: TaskView): DismissedTaskData { - with(recentsView) { - dismissedTaskView.getThumbnailBounds(mTempRect, /* relativeToDragLayer= */ true) - val secondaryLayerDimension = - pagedOrientationHandler.getSecondaryDimension( - (mContainer as ActivityContext).getDragLayer() - ) - val verticalFactor = pagedOrientationHandler.getTaskDismissVerticalDirection().toFloat() - val dismissLength = - (pagedOrientationHandler.getTaskDismissLength(secondaryLayerDimension, mTempRect) * - verticalFactor) - .toInt() - val dismissThreshold = (dismissLength * DEFAULT_DISMISS_THRESHOLD_FRACTION).toInt() - val startVelocity = mTempRect.height().toFloat() - val finalPosition = dismissLength.toFloat() - return DismissedTaskData( - startVelocity = startVelocity, - dismissLength = dismissLength, - finalPosition = finalPosition, - dismissThreshold = dismissThreshold, + private fun addNeighborSettlingSpringAnimations( + draggedTaskView: TaskView, + springAnimationDriver: SpringAnimation, + tasksToExclude: List = emptyList(), + driverProgressThreshold: Float, + isSpringDirectionVertical: Boolean, + minVelocity: Float, + ) { + // Empty spring animation exists for conditional start, and to drive neighboring springs. + val neighborsToSettle = + SpringAnimation(FloatValueHolder()).setSpring(createExpressiveDismissSpringForce()) + + // Add tasks before dragged index, fanning out from the dragged task. + // The order they are added matters, as each spring drives the next. + var previousNeighbor = neighborsToSettle + getTasksOffsetPairAdjacentToDraggedTask(draggedTaskView, towardsStart = true) + .filter { (taskView, _) -> !tasksToExclude.contains(taskView) } + .forEach { (taskView, offset) -> + previousNeighbor = + createNeighboringTaskViewSpringAnimation( + taskView, + offset * ADDITIONAL_DISMISS_DAMPING_RATIO, + previousNeighbor, + isSpringDirectionVertical, + ) + } + // Add tasks after dragged index, fanning out from the dragged task. + // The order they are added matters, as each spring drives the next. + previousNeighbor = neighborsToSettle + getTasksOffsetPairAdjacentToDraggedTask(draggedTaskView, towardsStart = false) + .filter { (taskView, _) -> !tasksToExclude.contains(taskView) } + .forEach { (taskView, offset) -> + previousNeighbor = + createNeighboringTaskViewSpringAnimation( + taskView, + offset * ADDITIONAL_DISMISS_DAMPING_RATIO, + previousNeighbor, + isSpringDirectionVertical, + ) + } + + val isCurrentDisplacementAboveOrigin = + recentsView.pagedOrientationHandler.isGoingUp( + draggedTaskView.secondaryDismissTranslationProperty.get(draggedTaskView), + recentsView.isRtl, ) + addThresholdSpringAnimationTrigger( + springAnimationDriver, + progressThreshold = driverProgressThreshold, + neighborsToSettle, + isCurrentDisplacementAboveOrigin, + minVelocity, + ) + } + + /** As spring passes threshold for the first time, run conditional spring with velocity. */ + private fun addThresholdSpringAnimationTrigger( + springAnimationDriver: SpringAnimation, + progressThreshold: Float, + conditionalSpring: SpringAnimation, + isCurrentDisplacementAboveOrigin: Boolean, + minVelocity: Float, + ) { + val runSettlingAtVelocity = { velocity: Float -> + conditionalSpring.setStartVelocity(velocity).animateToFinalPosition(0f) + playDismissSettlingHaptic(velocity) + } + if (isCurrentDisplacementAboveOrigin) { + var lastPosition = 0f + var startSettling = false + springAnimationDriver.addUpdateListener { _, value, velocity -> + // We do not compare to the threshold directly, as the update listener + // does not necessarily hit every value. Do not check again once it has started + // settling, as a spring can bounce past the end value multiple times. + if (startSettling) return@addUpdateListener + if ( + lastPosition < progressThreshold && value >= progressThreshold || + lastPosition > progressThreshold && value <= progressThreshold + ) { + startSettling = true + } + lastPosition = value + if (startSettling) { + runSettlingAtVelocity(velocity) + } + } + } else { + // Run settling animations immediately when displacement is already below settled state. + runSettlingAtVelocity(minVelocity) } } - /** Dismisses all */ - fun dismissAllTasks() { - val allDismissSprings = - recentsView.mUtils.taskViews - .reversed() - .filter { taskView -> recentsView.isTaskViewVisible(taskView) } - .mapNotNull { createDismissedTaskViewSpringAnimation(it) } - SpringSet(SpringAnimation(FloatValueHolder()).setSpring(SpringForce(1f))) - .playTogether(allDismissSprings) - .addEndListener { - with(recentsView) { - // Remove desktops first, since desks can be empty (so they have no recent - // tasks), and closing all tasks on a desk doesn't always necessarily mean that - // the desk will be removed. So, there are no guarantees that the below call to - // `ActivityManagerWrapper::removeAllRecentTasks()` will be enough. - if (areMultiDesksFlagsEnabled() && context.displayId.isExternalDisplay) { - mUtils.addOnDeskAddedListener(launchNewDeskListener) - } - systemUiProxy.removeAllDesks() - - // Remove all the task views now - finishRecentsAnimation(/* toRecents */ true, /* shouldPip */ false) { - uiHelperExecutor.execute { activityManagerWrapper.removeAllRecentTasks() } - removeAllTaskViews() - if (context.displayId.isDefaultDisplay || !areMultiDesksFlagsEnabled()) { - startHome() - } - } - } - } - .start() - } - - /** Bounce neighboring tasks due to a canceled dismiss or the reflow of tasks after dismiss. */ - private fun createNeighborSettlingSpringSet( - dismissedTaskView: TaskView, - tasksToExclude: List = emptyList(), - isSpringDirectionVertical: Boolean, - ): SpringSet { - // Empty spring animation exists for conditional start, and to drive neighboring springs. - val neighborsToSettle = - SpringAnimation(FloatValueHolder()) - .setSpring(createExpressiveDismissSpringForce().setFinalPosition(0f)) - val neighborSettlingSpringSet = SpringSet(neighborsToSettle) - - // Add tasks before dismissed index, fanning out from the dismissed task. - // The order they are added matters, as each spring drives the next. - var previousNeighbor = neighborsToSettle - getTasksOffsetPairAdjacentToDismissedTask(dismissedTaskView, towardsStart = true) - .filter { (taskView, _) -> !tasksToExclude.contains(taskView) } - .forEach { (taskView, offset) -> - previousNeighbor = - createNeighboringTaskViewSpringAnimation( - taskView, - offset * ADDITIONAL_DISMISS_DAMPING_RATIO, - previousNeighbor, - isSpringDirectionVertical, - neighborSettlingSpringSet, - ) - } - // Add tasks after dismissed index, fanning out from the dismissed task. - // The order they are added matters, as each spring drives the next. - previousNeighbor = neighborsToSettle - getTasksOffsetPairAdjacentToDismissedTask(dismissedTaskView, towardsStart = false) - .filter { (taskView, _) -> !tasksToExclude.contains(taskView) } - .forEach { (taskView, offset) -> - previousNeighbor = - createNeighboringTaskViewSpringAnimation( - taskView, - offset * ADDITIONAL_DISMISS_DAMPING_RATIO, - previousNeighbor, - isSpringDirectionVertical, - neighborSettlingSpringSet, - ) - } - return neighborSettlingSpringSet - } - /** - * Gets pairs of (TaskView, offset) adjacent the dismissed task in visual order. + * Gets pairs of (TaskView, offset) adjacent the dragged task in visual order. * - *

Gets tasks either before or after the dismissed task along with their offset from it. The + *

Gets tasks either before or after the dragged task along with their offset from it. The * offset is the distance between indices for carousels, or distance between columns for grids. */ - private fun getTasksOffsetPairAdjacentToDismissedTask( - dismissedTaskView: TaskView, + private fun getTasksOffsetPairAdjacentToDraggedTask( + draggedTaskView: TaskView, towardsStart: Boolean, ): Sequence> { if (recentsView.showAsGrid()) { @@ -414,7 +223,7 @@ constructor( ) return taskGridNavHelper .gridTaskViewIdOffsetPairInTabOrderSequence( - dismissedTaskView.taskViewId, + draggedTaskView.taskViewId, towardsStart, ) .mapNotNull { (taskViewId, columnOffset) -> @@ -424,18 +233,17 @@ constructor( } } else { val taskViewList = recentsView.mUtils.taskViews.toList() - val dismissedTaskViewIndex = taskViewList.indexOf(dismissedTaskView) - if (taskViewList.isEmpty() || dismissedTaskViewIndex == -1) return emptySequence() + val draggedTaskViewIndex = taskViewList.indexOf(draggedTaskView) return if (towardsStart) { taskViewList - .take(dismissedTaskViewIndex) + .take(draggedTaskViewIndex) .reversed() .mapIndexed { index, taskView -> Pair(taskView, index + 1) } .asSequence() } else { taskViewList - .takeLast(taskViewList.size - dismissedTaskViewIndex - 1) + .takeLast(taskViewList.size - draggedTaskViewIndex - 1) .mapIndexed { index, taskView -> Pair(taskView, index + 1) } .asSequence() } @@ -448,7 +256,6 @@ constructor( dampingOffsetRatio: Float, previousNeighborSpringAnimation: SpringAnimation, springingDirectionVertical: Boolean, - neighborSettlingSpringSet: SpringSet, ): SpringAnimation { val springProperty = if (springingDirectionVertical) taskView.secondaryDismissTranslationProperty @@ -471,7 +278,6 @@ constructor( recentsView.redrawLiveTile() } } - neighborSettlingSpringSet.trackSpring(neighboringTaskViewSpringAnimation) // Drive current neighbor's spring with the previous neighbor's. previousNeighborSpringAnimation.addUpdateListener { _, value, _ -> neighboringTaskViewSpringAnimation.animateToFinalPosition(value) @@ -479,679 +285,50 @@ constructor( return neighboringTaskViewSpringAnimation } - /** Animates with springs the TaskViews beyond the dismissed task to fill the gap it left. */ - private fun createTaskGridReflowSpringSet( - dismissedTaskView: TaskView?, - dismissedTaskGap: Float, - gridEndData: GridEndData, - isSplitSelection: Boolean, - ): SpringSet? { - val towardsStart = if (recentsView.isRtl) dismissedTaskGap < 0 else dismissedTaskGap > 0 - // Grid end translation to run after all reflow animations have completed. - val gridEndSpringSet = createGridEndTranslationSpringSet(gridEndData) - val tasksWithOffsetsToReflow = getTasksToReflow(dismissedTaskView, towardsStart) - if (tasksWithOffsetsToReflow.isEmpty()) { - return gridEndSpringSet - } else { - // Empty spring exists for conditional start, and to drive neighboring springs. - val reflowSpringAnimationDriver = - SpringAnimation(FloatValueHolder()) - .setSpring( - createExpressiveGridReflowSpringForce(finalPosition = dismissedTaskGap) - ) - recentsView.mTaskViewsDismissPrimaryTranslations.clear() - // Separate spring end manager for reflow to coordinate start of grid end springs. - val reflowSpringSet = SpringSet(reflowSpringAnimationDriver, dismissedTaskGap) - buildDismissReflowSpringAnimationChain( - tasksWithOffsetsToReflow, - dismissedTaskGap, - previousSpring = reflowSpringAnimationDriver, - reflowSpringSet, - isSplitSelection, + private fun createExpressiveDismissSpringForce(dampingRatioOffset: Float = 0f): SpringForce { + val resourceProvider = DynamicResource.provider(recentsView.mContainer) + return SpringForce() + .setDampingRatio( + resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_y_damping_ratio) + + dampingRatioOffset + ) + .setStiffness( + resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_y_stiffness) ) - - // Animate the settling of the neighbors as reflow tasks settle into place. - if (dismissedTaskView != null) { - val neighborSettlingSpringSet = - createNeighborSettlingSpringSet( - dismissedTaskView, - tasksToExclude = tasksWithOffsetsToReflow.map { (taskView, _) -> taskView }, - isSpringDirectionVertical = false, - ) - reflowSpringSet.playAfterThreshold( - driverThreshold = dismissedTaskGap, - triggeredSpringSet = neighborSettlingSpringSet, - ) - } - if (gridEndSpringSet != null) { - reflowSpringSet.playAfterThreshold( - driverThreshold = dismissedTaskGap, - triggeredSpringSet = gridEndSpringSet, - ) - } - return reflowSpringSet - } } - private fun getDismissedTaskGapForReflow( - dismissedTaskView: TaskView?, - isSplitSelection: Boolean, - ): Float { - with(recentsView) { - val dismissedTaskGap = - if (dismissedTaskView == null) { - 0f - } else { - // If current page beyond last TaskView's index, use last TaskView to calculate - // offset. - val lastTaskViewIndex = indexOfChild(mUtils.getLastTaskView()) - val currentPage = currentPage.coerceAtMost(lastTaskViewIndex) - val dismissHorizontalFactor = - when { - dismissedTaskView.isGridTask -> 1f - currentPage == lastTaskViewIndex -> -1f - indexOfChild(dismissedTaskView) < currentPage -> -1f - else -> 1f - } * (if (isRtl) 1f else -1f) - (pagedOrientationHandler.getPrimarySize(dismissedTaskView) + pageSpacing) * - dismissHorizontalFactor - } - // Sliding translation for splitting tasks with large tiles present. - val slidingTranslation = - if (isSplitSelection && currentPageTaskView is DesktopTaskView) { - val nextSnappedPage = indexOfChild(mUtils.getFirstNonDesktopTaskView()) - val newClearAllShortTotalWidthTranslation = - getGridEndData(dismissedTaskView = null) - .newClearAllShortTotalWidthTranslation - pagedOrientationHandler.getPrimaryScroll(this) - - getScrollForPage(nextSnappedPage) + - if (isRtl) newClearAllShortTotalWidthTranslation - else -newClearAllShortTotalWidthTranslation - } else { - 0f - } - return dismissedTaskGap + if (isRtl) slidingTranslation else -slidingTranslation - } - } - - private fun getTasksToReflow( - dismissedTaskView: TaskView?, - towardsStart: Boolean, - ): List> { - // Null if splitting tasks while Desktop tasks are visible. Reflow all remaining grid tasks. - if (dismissedTaskView == null) { - return (recentsView.mUtils.getTopRowTaskViews().mapIndexed { index, taskView -> - taskView to index - } + - recentsView.mUtils.getBottomRowTaskViews().mapIndexed { index, taskView -> - taskView to index - }) - .sortedBy { it.second } - } - val isDismissedTaskViewOnTopRow = recentsView.isOnGridTopRow(dismissedTaskView) - val isDismissedTaskViewOnBottomRow = recentsView.isOnGridBottomRow(dismissedTaskView) - return getTasksOffsetPairAdjacentToDismissedTask(dismissedTaskView, towardsStart) - .filter { (taskView, _) -> - when { - isDismissedTaskViewOnBottomRow -> recentsView.isOnGridBottomRow(taskView) - isDismissedTaskViewOnTopRow -> recentsView.isOnGridTopRow(taskView) - else -> true - } - } - .toList() - } - - private fun willTaskBeVisibleAfterDismiss(taskView: TaskView, taskTranslation: Int): Boolean { - val screenStart = recentsView.pagedOrientationHandler.getPrimaryScroll(recentsView) - val screenEnd = - screenStart + recentsView.pagedOrientationHandler.getMeasuredSize(recentsView) - return recentsView.isTaskViewWithinBounds( - taskView, - screenStart, - screenEnd, - /* taskViewTranslation = */ taskTranslation, - ) - } - - /** Builds a chain of spring animations for task reflow after dismissal */ - private fun buildDismissReflowSpringAnimationChain( - taskViewOffsetPairs: List>, - dismissedTaskGap: Float, - previousSpring: SpringAnimation, - reflowSpringSet: SpringSet, - isSplitSelection: Boolean, - ): SpringAnimation { - if (taskViewOffsetPairs.isEmpty()) return previousSpring - var lastTaskViewSpring = previousSpring - var previousColumnDriverSpring = previousSpring - var lastColumnOffset = taskViewOffsetPairs.first().second - taskViewOffsetPairs - .filter { (taskView, _) -> - willTaskBeVisibleAfterDismiss(taskView, dismissedTaskGap.roundToInt()) - } - .forEach { (taskView, column) -> - val startValue = - if ( - isSplitSelection && - taskView !is DesktopTaskView && - recentsView.currentPageTaskView is DesktopTaskView && - !recentsView.isTaskViewVisible(taskView) - ) { - dismissedTaskGap + - (if (recentsView.isRtl) -recentsView.mLastComputedTaskSize.right - else recentsView.mLastComputedTaskSize.right) - } else 0f - val taskViewSpringAnimation = - SpringAnimation( - taskView, - FloatPropertyCompat.createFloatPropertyCompat( - taskView.primaryDismissTranslationProperty - ), - ) - .setSpring(createExpressiveGridReflowSpringForce(dismissedTaskGap)) - .setStartValue(startValue) - // Update live tile on spring animation. - if (taskView.isRunningTask && recentsView.enableDrawingLiveTile) { - taskViewSpringAnimation.addUpdateListener { _, _, _ -> - recentsView.runActionOnRemoteHandles { remoteTargetHandle -> - remoteTargetHandle.taskViewSimulator.taskPrimaryTranslation.value = - taskView.primaryDismissTranslationProperty.get(taskView) - } - recentsView.redrawLiveTile() - } - } - // For grid overview, if we are animating tasks in the same column offset, they - // should both be pulled by the previous spring at the same time. - if (column != lastColumnOffset) { - previousColumnDriverSpring = lastTaskViewSpring - lastColumnOffset = column - } - previousColumnDriverSpring.addUpdateListener { _, value, _ -> - taskViewSpringAnimation.animateToFinalPosition(value) - } - lastTaskViewSpring = taskViewSpringAnimation - reflowSpringSet.trackSpring(taskViewSpringAnimation, dismissedTaskGap) - recentsView.mTaskViewsDismissPrimaryTranslations[taskView] = - dismissedTaskGap.toInt() - } - return lastTaskViewSpring - } - - /** Animates the grid to compensate the clear all gap after dismissal. */ - private fun createGridEndTranslationSpringSet(gridEndData: GridEndData): SpringSet? { - val gridEndOffset = gridEndData.gridEndOffset - if (gridEndOffset == 0f) { - return null - } - - // Create spring animation to drive all task view grid translations simultaneously. - val gridEndSpring = - SpringAnimation(FloatValueHolder()) - .setSpring(createExpressiveGridReflowSpringForce(finalPosition = gridEndOffset)) - val gridEndSpringSet = SpringSet(gridEndSpring, gridEndOffset) - recentsView.mUtils.taskViews.forEach { taskView -> - val taskViewGridEndSpringAnimation = - SpringAnimation( - taskView, - FloatPropertyCompat.createFloatPropertyCompat(GRID_END_TRANSLATION_X), - ) - .setSpring(createExpressiveGridReflowSpringForce(gridEndOffset)) - // Update live tile on spring animation. - if (taskView.isRunningTask && recentsView.enableDrawingLiveTile) { - taskViewGridEndSpringAnimation.addUpdateListener { _, _, _ -> - recentsView.runActionOnRemoteHandles { remoteTargetHandle -> - remoteTargetHandle.taskViewSimulator.taskPrimaryTranslation.value = - GRID_END_TRANSLATION_X.get(taskView) - } - recentsView.redrawLiveTile() - } - } - gridEndSpringSet.trackSpring(taskViewGridEndSpringAnimation, gridEndOffset) - gridEndSpring.addUpdateListener { _, value, _ -> - taskViewGridEndSpringAnimation.animateToFinalPosition(value) - } - } - // Animate alpha of clear all if translating grid to hide it. - if (recentsView.isClearAllHidden) { - SpringAnimation( - recentsView.clearAllButton, - FloatPropertyCompat.createFloatPropertyCompat(ClearAllButton.DISMISS_ALPHA), - ) - .setSpring(createExpressiveDismissAlphaSpringForce()) - .addEndListener { _, _, _, _ -> recentsView.clearAllButton.dismissAlpha = 1f } - .animateToFinalPosition(0f) - } - return gridEndSpringSet - } - - /** Returns the distance between the end of the grid and clear all button after dismissal. */ - fun getGridEndData( - dismissedTaskView: TaskView?, - isExpressiveDismiss: Boolean = true, - isFocusedTaskDismissed: Boolean = false, - nextFocusedTaskView: TaskView? = null, - isStagingFocusedTask: Boolean = false, - nextFocusedTaskFromTop: Boolean = false, - nextFocusedTaskWidth: Float = 0f, - ): GridEndData { - var gridEndOffset = 0f - var snapToLastTask = false - var newClearAllShortTotalWidthTranslation: Float - var currentPageSnapsToEndOfGrid: Boolean - with(recentsView) { - val lastGridTaskView = if (showAsGrid()) lastGridTaskView else null - val currentPageScroll = getScrollForPage(currentPage) - val lastGridTaskScroll = getScrollForPage(indexOfChild(lastGridTaskView)) - currentPageSnapsToEndOfGrid = currentPageScroll == lastGridTaskScroll - var topGridRowCount = mTopRowIdSet.size() - var bottomGridRowCount = - taskViewCount - mTopRowIdSet.size() - mUtils.getLargeTileCount() - val topRowLonger = topGridRowCount > bottomGridRowCount - val bottomRowLonger = bottomGridRowCount > topGridRowCount - val dismissedFromTop = - dismissedTaskView != null && mTopRowIdSet.contains(dismissedTaskView.taskViewId) - val dismissedFromBottom = - dismissedTaskView != null && !dismissedFromTop && !dismissedTaskView.isLargeTile - if (dismissedFromTop || (isFocusedTaskDismissed && nextFocusedTaskFromTop)) { - topGridRowCount-- - } - if (dismissedFromBottom || (isFocusedTaskDismissed && !nextFocusedTaskFromTop)) { - bottomGridRowCount-- - } - newClearAllShortTotalWidthTranslation = - getNewClearAllShortTotalWidthTranslation( - topGridRowCount, - bottomGridRowCount, - isStagingFocusedTask, - ) - val isLastGridTaskViewVisibleForDismiss = - when { - lastGridTaskView == null -> false - isExpressiveDismiss -> - isTaskViewVisible(lastGridTaskView) || lastGridTaskView == dismissedTaskView - else -> lastGridTaskView.isVisibleToUser - } - if (!isLastGridTaskViewVisibleForDismiss) { - return GridEndData( - gridEndOffset, - snapToLastTask, - newClearAllShortTotalWidthTranslation, - currentPageSnapsToEndOfGrid, - ) - } - val dismissedTaskWidth = - if (dismissedTaskView == null) 0f - else (dismissedTaskView.layoutParams.width + pageSpacing).toFloat() - val gapWidth = - when { - (topRowLonger && dismissedFromTop) || - (bottomRowLonger && dismissedFromBottom) -> dismissedTaskWidth - nextFocusedTaskView != null && - ((topRowLonger && nextFocusedTaskFromTop) || - (bottomRowLonger && !nextFocusedTaskFromTop)) -> nextFocusedTaskWidth - else -> 0f - } - if (gapWidth > 0) { - if (clearAllShortTotalWidthTranslation == 0) { - val gapCompensation = gapWidth - newClearAllShortTotalWidthTranslation - gridEndOffset += if (isRtl) -gapCompensation else gapCompensation - } - if (isClearAllHidden) { - // If ClearAllButton isn't fully shown, snap to the last task. - snapToLastTask = true - } - } - val isLeftRightSplit = - (mContainer as ActivityContext).getDeviceProfile().isLeftRightSplit && - isSplitSelectionActive - if (isLeftRightSplit && !isStagingFocusedTask) { - // LastTask's scroll is the minimum scroll in split select, if current scroll is - // beyond that, we'll need to snap to last task instead. - getLastGridTaskView()?.let { lastTask -> - val primaryScroll = pagedOrientationHandler.getPrimaryScroll(this) - val lastTaskScroll = getScrollForPage(indexOfChild(lastTask)) - if ( - (isRtl && primaryScroll < lastTaskScroll) || - (!isRtl && primaryScroll > lastTaskScroll) - ) { - snapToLastTask = true - } - } - } - if (snapToLastTask) { - gridEndOffset += snapToLastTaskScrollDiff.toFloat() - } else if (isLeftRightSplit && currentPageSnapsToEndOfGrid) { - // Use last task as reference point for scroll diff and snapping calculation as it's - // the only invariant point in landscape split screen. - snapToLastTask = true - } - - // Handle large tile scroll when dismissing the last small task. - if (mUtils.getGridTaskCount() == 1 && dismissedTaskView?.isGridTask == true) { - mUtils.getLastLargeTaskView()?.let { lastLargeTile -> - val primaryScroll = pagedOrientationHandler.getPrimaryScroll(this) - val lastLargeTileScroll = getScrollForPage(indexOfChild(lastLargeTile)) - gridEndOffset = (primaryScroll - lastLargeTileScroll).toFloat() - - if (!isClearAllHidden) { - // If ClearAllButton is visible, reduce the distance by scroll difference - // between ClearAllButton and the last task. - gridEndOffset += - getLastTaskScroll( - /*clearAllScroll=*/ 0, - pagedOrientationHandler.getPrimarySize(clearAllButton), - ) - .toFloat() - } - } - } - } - return GridEndData( - gridEndOffset, - snapToLastTask, - newClearAllShortTotalWidthTranslation, - currentPageSnapsToEndOfGrid, - ) - } - - private fun getNewClearAllShortTotalWidthTranslation( - topGridRowCount: Int, - bottomGridRowCount: Int, - isStagingFocusedTask: Boolean, - ): Float { - with(recentsView) { - if (clearAllShortTotalWidthTranslation != 0) { - return 0f - } - // If first task is not in the expected position (mLastComputedTaskSize) and too - // close to ClearAllButton, then apply extra translation to ClearAllButton. - var longRowWidth = - max(topGridRowCount, bottomGridRowCount) * - (mLastComputedGridTaskSize.width() + pageSpacing) - if (!enableGridOnlyOverview() && !isStagingFocusedTask) { - longRowWidth += mLastComputedTaskSize.width() + pageSpacing - } - val firstTaskStart = mLastComputedGridSize.left + longRowWidth - val expectedFirstTaskStart = mLastComputedTaskSize.right - // Compensate the removed gap if we don't already have shortTotalCompensation, - // and adjust accordingly to the new shortTotalCompensation after dismiss. - return if (firstTaskStart < expectedFirstTaskStart) { - (expectedFirstTaskStart - firstTaskStart).toFloat() - } else { - 0f - } - } - } - - private fun onEndSnappingAndRelayout( - dismissedTaskView: TaskView?, - shouldRemoveTask: Boolean, - dismissingForSplitSelection: Boolean, - gridEndData: GridEndData, - ) { - with(recentsView) { - if (pageCount == 0) { - return@with - } - updateCurveProperties() - loadVisibleTaskData(TaskView.FLAG_UPDATE_ALL) - - // Page snapping and relayout to run after all animations have completed. - val onFinishComplete = { - // Reset task translations as they may have updated via the dismiss animations. - resetTaskVisuals() - - // Denote if any task has been dismissed for grid rebalancing. - mAnyTaskHasBeenDismissed = true - // Cache group task before removing. - handleGroupTaskRemoval(dismissedTaskView, shouldRemoveTask) - - // Get page to snap to before removing dismissed task. - val dismissedTaskViewId = dismissedTaskView?.taskViewId ?: INVALID_TASK_ID - val pageToSnapTo = - when { - (dismissedTaskView != null && - (!showAsGrid() || dismissedTaskView.isLargeTile)) -> { - getPageToSnapTo(dismissedTaskView) - } - showAsGrid() -> { - getPageToSnapToForGrid(gridEndData, dismissedTaskViewId) - } - else -> { - currentPage - } - } - - // Remove dismissed task. - removeViewInLayout(dismissedTaskView) - mTopRowIdSet.remove(dismissedTaskViewId) - - // Update the UI after removal and snap to page. - updateUiAfterTaskRemoval(dismissedTaskView, pageToSnapTo) - - if (!dismissingForSplitSelection) { - InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_OVERVIEW_TASK_DISMISS) - } - } - - // Run the final page snapping and relayout - if (enableDrawingLiveTile && dismissedTaskView?.isRunningTask == true) { - finishRecentsAnimation( - /* toRecents */ true, - /* shouldPip */ false, - onFinishComplete, - ) - } else { - onFinishComplete() - } - } + private fun createExpressiveGridReflowSpringForce( + finalPosition: Float = Float.MAX_VALUE + ): SpringForce { + val resourceProvider = DynamicResource.provider(recentsView.mContainer) + return SpringForce(finalPosition) + .setDampingRatio( + resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_x_damping_ratio) + ) + .setStiffness( + resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_x_stiffness) + ) } /** - * Caches the groupTask before removing it. As the deskId might become invalid by - * removeViewInLayout called on the dismissed task. It might happen before - * removeGroupTaskInternal which runs on a helper thread. + * Plays a haptic as the dragged task view settles back into its rest state. + * + *

Haptic intensity is proportional to velocity. */ - private fun handleGroupTaskRemoval(dismissedTaskView: TaskView?, shouldRemoveTask: Boolean) { - with(recentsView) { - if (shouldRemoveTask && dismissedTaskView != null) { - val groupTask = dismissedTaskView.groupTask - if (groupTask != null) { - // For the multi desk case, the launcher should switch to the new desk once the - // last task of the previous desk is removed. - if ( - areMultiDesksFlagsEnabled() && - context.displayId.isExternalDisplay && - taskViewCount == 1 && - contains(dismissedTaskView) - ) { - mUtils.addOnDeskAddedListener(launchNewDeskListener) - } - if (dismissedTaskView.isRunningTask) { - finishRecentsAnimation(/* toRecents */ true, /* shouldPip */ false) { - removeGroupTaskInternal(groupTask) - } - } else { - removeGroupTaskInternal(groupTask) - } - (mContainer as ActivityContext) - .statsLogManager - .logger() - .withItemInfo(dismissedTaskView.itemInfo) - .log(LauncherEvent.LAUNCHER_TASK_DISMISS_SWIPE_UP) - } - } - } - } - - private fun getPageToSnapTo(dismissedTaskView: TaskView?): Int { - with(recentsView) { - var pageToSnapTo = currentPage - if ( - indexOfChild(dismissedTaskView) < pageToSnapTo || - pageToSnapTo == indexOfChild(mUtils.getLastTaskView()) - ) { - pageToSnapTo-- - } - return pageToSnapTo - } - } - - private fun getPageToSnapToForGrid(gridEndData: GridEndData, dismissedTaskViewId: Int): Int { - with(recentsView) { - var pageToSnapTo = currentPage - var taskViewIdToSnapTo = -1 - currentPageScrollDiff = 0 - - if (gridEndData.gridEndOffset != 0f) { - if (gridEndData.snapToLastTask) { - // Last task will be determined after removing dismissed task. - pageToSnapTo = -1 - } else if (taskViewCount > 2) { - pageToSnapTo = indexOfChild(clearAllButton) - } else if (isClearAllHidden) { - // Snap to focused task if clear all is hidden. - pageToSnapTo = firstTaskViewIndex - } - } else { - val snappedTaskView = currentPageTaskView - if (snappedTaskView != null && !gridEndData.snapToLastTask) { - val snappedTaskViewId = snappedTaskView.taskViewId - val isSnappedTaskInTopRow = mTopRowIdSet.contains(snappedTaskViewId) - val taskViewIdArray = - if (isSnappedTaskInTopRow) { - mUtils.getTopRowIdArray() - } else { - mUtils.getBottomRowIdArray() - } - val snappedIndex = taskViewIdArray.indexOf(snappedTaskViewId) - taskViewIdArray.removeValue(dismissedTaskViewId) - if (snappedIndex >= 0 && snappedIndex < taskViewIdArray.size()) { - taskViewIdToSnapTo = taskViewIdArray[snappedIndex] - } else if (snappedIndex == taskViewIdArray.size()) { - val inverseRowTaskViewIdArray = - if (isSnappedTaskInTopRow) { - mUtils.getBottomRowIdArray() - } else { - mUtils.getTopRowIdArray() - } - if (snappedIndex < inverseRowTaskViewIdArray.size()) { - taskViewIdToSnapTo = inverseRowTaskViewIdArray[snappedIndex] - } - } - } - val primaryScroll = pagedOrientationHandler.getPrimaryScroll(this) - val currentPageScroll = getScrollForPage(currentPage) - currentPageScrollDiff = primaryScroll - currentPageScroll - } - - // Calculate page to snap to as if the dismissed task view is removed from the grid. - val topRowIdArray = mUtils.getTopRowIdArray() - val bottomRowIdArray = mUtils.getBottomRowIdArray() - topRowIdArray.removeValue(dismissedTaskViewId) - bottomRowIdArray.removeValue(dismissedTaskViewId) - val children = - children.filter { child -> child != getTaskViewFromTaskViewId(dismissedTaskViewId) } - if (gridEndData.snapToLastTask) { - val lastGridTaskView = getLastGridTaskView(topRowIdArray, bottomRowIdArray) - pageToSnapTo = - if (lastGridTaskView == null) PagedView.INVALID_PAGE - else children.indexOf(lastGridTaskView as View) - if (pageToSnapTo == PagedView.INVALID_PAGE) { - val lastLargeTaskView = mUtils.getLastLargeTaskView() - pageToSnapTo = - if (lastLargeTaskView == null) PagedView.INVALID_PAGE - else children.indexOf(lastLargeTaskView as View) - } - } else if (taskViewIdToSnapTo != -1) { - // If snapping to another page due to indices rearranging, find - // the new index after dismissal & rearrange using the TaskView ID. - pageToSnapTo = - children.indexOf(getTaskViewFromTaskViewId(taskViewIdToSnapTo) as View) - if (!gridEndData.currentPageSnapsToEndOfGrid) { - val dismissedTaskViewIndex = - indexOfChild(getTaskViewFromTaskViewId(dismissedTaskViewId)) - currentPageScrollDiff += - getOffsetFromScrollPosition( - pageToSnapTo, - topRowIdArray, - bottomRowIdArray, - dismissedTaskViewIndex, - ) - } - } - return pageToSnapTo - } - } - - private fun updateUiAfterTaskRemoval(dismissedTaskView: TaskView?, pageToSnapTo: Int) { - with(recentsView) { - if (taskViewCount == 0) { - if (!isSplitSelectionActive) { - removeViewInLayout(clearAllButton) - removeViewInLayout(addDeskButton) - if (dismissedTaskView === homeTaskView) { - updateEmptyMessage() - } else { - if (!areMultiDesksFlagsEnabled() || context.displayId.isDefaultDisplay) { - startHome() - } - } - } - } else { - updateTaskSize() - mUtils.updateChildTaskOrientations() - updateScrollSynchronously() - - val highestVisibleTaskView = getHighestVisibleTaskView() - if (showAsGrid() && highestVisibleTaskView != null) { - rebalanceTasksInGrid(highestVisibleTaskView) - } - pageBeginTransition() - currentPage = pageToSnapTo - dispatchScrollChanged() - updateActionsViewFocusedScroll() - if ( - isClearAllHidden && - !(mContainer as ActivityContext) - .getDeviceProfile() - .deviceProperties - .isTablet - ) { - actionsView.updateDisabledFlags(OverviewActionsView.DISABLED_SCROLLING, false) - } - } - updateCurrentTaskActionsVisibility() - onDismissAnimationEnds() - mTaskViewsDismissPrimaryTranslations.clear() - } - } - - private fun rebalanceTasksInGrid(highestVisibleTaskView: TaskView) { - with(recentsView) { - val screenStart = pagedOrientationHandler.getPrimaryScroll(this) - val taskStart = - (pagedOrientationHandler.getChildStart(highestVisibleTaskView) + - highestVisibleTaskView.getOffsetAdjustment(true).toInt()) - - val shouldRebalance = - if (isRtl) { - taskStart <= screenStart + pageSpacing - } else { - val screenEnd = (screenStart + pagedOrientationHandler.getMeasuredSize(this)) - val taskSize = - (pagedOrientationHandler.getMeasuredSize(highestVisibleTaskView) * - highestVisibleTaskView.getSizeAdjustment(false)) - .toInt() - val taskEnd = taskStart + taskSize - taskEnd >= screenEnd - pageSpacing - } - - if (shouldRebalance) { - updateGridProperties(highestVisibleTaskView) - updateScrollSynchronously() - } - } + private fun playDismissSettlingHaptic(velocity: Float) { + val maxDismissSettlingVelocity = + recentsView.pagedOrientationHandler.getSecondaryDimension(recentsView) + MSDLPlayerWrapper.INSTANCE.get(recentsView.context) + ?.playToken( + MSDLToken.CANCEL, + InteractionProperties.DynamicVibrationScale( + boundToRange(abs(velocity) / maxDismissSettlingVelocity, 0f, 1f), + VibrationAttributes.Builder() + .setUsage(VibrationAttributes.USAGE_TOUCH) + .setFlags(VibrationAttributes.FLAG_PIPELINED_EFFECT) + .build(), + ), + ) } /** Animates RecentsView's scale to the provided value, using spring animations. */ @@ -1182,206 +359,228 @@ constructor( .apply { animateToFinalPosition(RECENTS_SCALE_SPRING_MULTIPLIER * scale) } } - private fun createExpressiveDismissSpringForce(dampingRatioOffset: Float = 0f): SpringForce { - val resourceProvider = DynamicResource.provider(recentsView.mContainer) - return SpringForce() - .setDampingRatio( - resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_y_damping_ratio) + - dampingRatioOffset - ) - .setStiffness( - resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_y_stiffness) + /** Animates with springs the TaskViews beyond the dismissed task to fill the gap it left. */ + private fun runTaskGridReflowSpringAnimation( + dismissedTaskView: TaskView, + dismissedTaskGap: Float, + onEndRunnable: () -> Unit, + ) { + // Empty spring animation exists for conditional start, and to drive neighboring springs. + val springAnimationDriver = + SpringAnimation(FloatValueHolder()) + .setSpring(createExpressiveGridReflowSpringForce(finalPosition = dismissedTaskGap)) + val towardsStart = if (recentsView.isRtl) dismissedTaskGap < 0 else dismissedTaskGap > 0 + + var tasksToReflow: List + // Build the chains of Spring Animations + when { + !recentsView.showAsGrid() -> { + tasksToReflow = + getTasksToReflow( + recentsView.mUtils.taskViews.toList(), + dismissedTaskView, + towardsStart, + ) + buildDismissReflowSpringAnimationChain( + tasksToReflow, + dismissedTaskGap, + previousSpring = springAnimationDriver, + ) + } + dismissedTaskView.isLargeTile -> { + tasksToReflow = + getTasksToReflow( + recentsView.mUtils.getLargeTaskViews(), + dismissedTaskView, + towardsStart, + ) + val lastSpringAnimation = + buildDismissReflowSpringAnimationChain( + tasksToReflow, + dismissedTaskGap, + previousSpring = springAnimationDriver, + ) + // Add all top and bottom grid tasks when animating towards the end of the grid. + if (!towardsStart) { + tasksToReflow += recentsView.mUtils.getTopRowTaskViews() + tasksToReflow += recentsView.mUtils.getBottomRowTaskViews() + buildDismissReflowSpringAnimationChain( + recentsView.mUtils.getTopRowTaskViews(), + dismissedTaskGap, + previousSpring = lastSpringAnimation, + ) + buildDismissReflowSpringAnimationChain( + recentsView.mUtils.getBottomRowTaskViews(), + dismissedTaskGap, + previousSpring = lastSpringAnimation, + ) + } + } + recentsView.isOnGridBottomRow(dismissedTaskView) -> { + tasksToReflow = + getTasksToReflow( + recentsView.mUtils.getBottomRowTaskViews(), + dismissedTaskView, + towardsStart, + ) + buildDismissReflowSpringAnimationChain( + tasksToReflow, + dismissedTaskGap, + previousSpring = springAnimationDriver, + ) + } + else -> { + tasksToReflow = + getTasksToReflow( + recentsView.mUtils.getTopRowTaskViews(), + dismissedTaskView, + towardsStart, + ) + buildDismissReflowSpringAnimationChain( + tasksToReflow, + dismissedTaskGap, + previousSpring = springAnimationDriver, + ) + } + } + + if (tasksToReflow.isNotEmpty()) { + addNeighborSettlingSpringAnimations( + dismissedTaskView, + springAnimationDriver, + tasksToExclude = tasksToReflow, + driverProgressThreshold = dismissedTaskGap, + isSpringDirectionVertical = false, + minVelocity = 0f, ) + } else { + springAnimationDriver.addEndListener { _, _, _, _ -> + // Play the same haptic as when neighbors spring into place. + MSDLPlayerWrapper.INSTANCE.get(recentsView.context)?.playToken(MSDLToken.CANCEL) + } + } + + // Start animations and remove the dismissed task at the end, dismiss immediately if no + // neighboring tasks exist. + val runGridEndAnimationAndRelayout = { + recentsView.expressiveDismissTaskView(dismissedTaskView, onEndRunnable) + } + springAnimationDriver?.apply { + addEndListener { _, _, _, _ -> runGridEndAnimationAndRelayout() } + animateToFinalPosition(dismissedTaskGap) + } ?: runGridEndAnimationAndRelayout() } - private fun createExpressiveGridReflowSpringForce( - finalPosition: Float = Float.MAX_VALUE - ): SpringForce { - val resourceProvider = DynamicResource.provider(recentsView.mContainer) - return SpringForce(finalPosition) - .setDampingRatio( - resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_x_damping_ratio) - ) - .setStiffness( - resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_x_stiffness) - ) + private fun getDismissedTaskGapForReflow(dismissedTaskView: TaskView): Float { + val screenStart = recentsView.pagedOrientationHandler.getPrimaryScroll(recentsView) + val screenEnd = + screenStart + recentsView.pagedOrientationHandler.getMeasuredSize(recentsView) + val taskStart = + recentsView.pagedOrientationHandler.getChildStart(dismissedTaskView) + + dismissedTaskView.getOffsetAdjustment(recentsView.showAsGrid()) + val taskSize = + recentsView.pagedOrientationHandler.getMeasuredSize(dismissedTaskView) * + dismissedTaskView.getSizeAdjustment(recentsView.showAsFullscreen()) + val taskEnd = taskStart + taskSize + + val isDismissedTaskBeyondEndOfScreen = + if (recentsView.isRtl) taskEnd > screenEnd else taskStart < screenStart + if ( + dismissedTaskView.isLargeTile && + isDismissedTaskBeyondEndOfScreen && + recentsView.mUtils.getLargeTileCount() == 1 + ) { + return with(recentsView) { + pagedOrientationHandler.getPrimaryScroll(this) - + getScrollForPage(indexOfChild(mUtils.getFirstNonDesktopTaskView())) + } + .toFloat() + } + + // If current page is beyond last TaskView's index, use last TaskView to calculate offset. + val lastTaskViewIndex = recentsView.indexOfChild(recentsView.mUtils.getLastTaskView()) + val currentPage = recentsView.currentPage.coerceAtMost(lastTaskViewIndex) + val dismissHorizontalFactor = + when { + dismissedTaskView.isGridTask -> 1f + currentPage == lastTaskViewIndex -> -1f + recentsView.indexOfChild(dismissedTaskView) < currentPage -> -1f + else -> 1f + } * (if (recentsView.isRtl) 1f else -1f) + + return (recentsView.pagedOrientationHandler.getPrimarySize(dismissedTaskView) + + recentsView.pageSpacing) * dismissHorizontalFactor } - private fun createExpressiveDismissAlphaSpringForce(): SpringForce { - val resourceProvider = DynamicResource.provider(recentsView.mContainer) - return SpringForce() - .setDampingRatio( - resourceProvider.getFloat(R.dimen.expressive_dismiss_effects_damping_ratio) - ) - .setStiffness(resourceProvider.getFloat(R.dimen.expressive_dismiss_effects_stiffness)) - } - - /** - * Plays a set of {@link SpringAnimation} objects in the specified order. - * - *

Animations can play together, in sequence, or after a specified threshold is passed. - */ - class SpringSet(private val driverSpring: SpringAnimation, driverSpringThreshold: Float = 0f) { - private val trackedSprings = mutableSetOf() - private val trackedSpringSets = mutableSetOf() - private var runningSpringCount = 0 - private val startListenerSet = mutableSetOf<() -> Unit>() - private val endListenerSet = mutableSetOf<() -> Unit>() - private var hasStarted = false - private var hasEnded = false - - init { - trackSpring(driverSpring, driverSpringThreshold) + private fun getTasksToReflow( + taskViews: List, + dismissedTaskView: TaskView, + towardsStart: Boolean, + ): List { + val dismissedTaskViewIndex = taskViews.indexOf(dismissedTaskView) + if (dismissedTaskViewIndex == -1) { + return emptyList() } - - fun start(): SpringSet { - if (hasStarted) { - return this - } - hasStarted = true - if (trackedSprings.isEmpty()) { - onEnd() - return this - } - driverSpring.start() - startListenerSet.forEach { it() } - return this - } - - private fun onEnd() { - if (hasEnded) { - return - } - hasEnded = true - endListenerSet.forEach { it() } - } - - fun cancel(): SpringSet { - driverSpring.cancel() - trackedSprings.forEach { it.cancel() } - trackedSpringSets.forEach { it.cancel() } - onEnd() - return this - } - - /** - * Increase spring constants to force animations to end quickly. - * - *

A high stiffness applies more force to the object to bring it to its end value. A - * damping ratio of 1f is critically damped, and the object will return to equilibrium - * within the shortest amount of time. - */ - fun speedUpSpringsToEnd(): SpringSet { - trackedSprings.forEach { - it.spring.setStiffness(SPEED_UP_STIFFNESS).setDampingRatio(1f) - } - trackedSpringSets.forEach { it.speedUpSpringsToEnd() } - return this - } - - fun addStartListener(startListener: () -> Unit): SpringSet { - startListenerSet.add(startListener) - return this - } - - fun addEndListener(endRunnable: () -> Unit): SpringSet { - endListenerSet.add(endRunnable) - return this - } - - fun trackSpring(spring: SpringAnimation, minimumDistance: Float = 0f): SpringSet { - if (trackedSprings.contains(spring)) { - throw IllegalArgumentException("SpringSet already contains this spring.") - } - trackedSprings.add(spring) - runningSpringCount++ - var canSpringEnd = false - spring.addUpdateListener { _, value, _ -> - // Do not allow end listener to fire until we have passed the minimum distance. - if (!canSpringEnd && abs(value - minimumDistance) < spring.minimumVisibleChange) { - canSpringEnd = true - } - } - spring.addEndListener { _, _, _, _ -> - if (!canSpringEnd || runningSpringCount == 0) { - return@addEndListener - } - if (--runningSpringCount == 0) { - onEnd() - } - } - return this - } - - private fun trackSpringSet(springSet: SpringSet): SpringSet { - runningSpringCount++ - trackedSpringSets.add(springSet) - springSet.addEndListener { - if (--runningSpringCount == 0) { - onEnd() - } - } - return this - } - - fun playAfterThreshold( - driverThreshold: Float, - triggeredSpringSet: SpringSet, - minVelocity: Float = 0f, - ): SpringSet { - trackSpringSet(triggeredSpringSet) - var lastPosition = 0f - var isTriggered = false - driverSpring.addUpdateListener { _, value, velocity -> - // We do not compare to the threshold directly, as the update listener - // does not necessarily hit every value. Do not check again once it has started - // settling, as a spring can bounce past the end value multiple times. - if (isTriggered) return@addUpdateListener - if ( - lastPosition < driverThreshold && value >= driverThreshold || - lastPosition > driverThreshold && value <= driverThreshold - ) { - isTriggered = true - } - lastPosition = value - if (isTriggered) { - val startVelocity = - abs(velocity).coerceAtLeast(abs(minVelocity)) * velocity.sign - triggeredSpringSet.driverSpring.setStartVelocity(startVelocity) - triggeredSpringSet.start() - } - } - return this - } - - fun playTogether(springs: List): SpringSet { - springs.forEach { - trackSpring(it) - addStartListener { it.start() } - } - return this + return if (towardsStart) { + taskViews.take(dismissedTaskViewIndex).reversed() + } else { + taskViews.takeLast(taskViews.size - dismissedTaskViewIndex - 1) } } - data class GridEndData( - val gridEndOffset: Float, - val snapToLastTask: Boolean, - val newClearAllShortTotalWidthTranslation: Float, - val currentPageSnapsToEndOfGrid: Boolean, - ) + private fun willTaskBeVisibleAfterDismiss(taskView: TaskView, taskTranslation: Int): Boolean { + val screenStart = recentsView.pagedOrientationHandler.getPrimaryScroll(recentsView) + val screenEnd = + screenStart + recentsView.pagedOrientationHandler.getMeasuredSize(recentsView) + return recentsView.isTaskViewWithinBounds( + taskView, + screenStart, + screenEnd, + /* taskViewTranslation = */ taskTranslation, + ) + } - data class DismissedTaskData( - val startVelocity: Float, - val dismissLength: Int, - val finalPosition: Float, - val dismissThreshold: Int, - ) + /** Builds a chain of spring animations for task reflow after dismissal */ + private fun buildDismissReflowSpringAnimationChain( + taskViews: Iterable, + dismissedTaskGap: Float, + previousSpring: SpringAnimation, + ): SpringAnimation { + var lastTaskViewSpring = previousSpring + taskViews + .filter { taskView -> + willTaskBeVisibleAfterDismiss(taskView, dismissedTaskGap.roundToInt()) + } + .forEach { taskView -> + val taskViewSpringAnimation = + SpringAnimation( + taskView, + FloatPropertyCompat.createFloatPropertyCompat( + taskView.primaryDismissTranslationProperty + ), + ) + .setSpring(createExpressiveGridReflowSpringForce(dismissedTaskGap)) + // Update live tile on spring animation. + if (taskView.isRunningTask && recentsView.enableDrawingLiveTile) { + taskViewSpringAnimation.addUpdateListener { _, _, _ -> + recentsView.runActionOnRemoteHandles { remoteTargetHandle -> + remoteTargetHandle.taskViewSimulator.taskPrimaryTranslation.value = + taskView.primaryDismissTranslationProperty.get(taskView) + } + recentsView.redrawLiveTile() + } + } + lastTaskViewSpring.addUpdateListener { _, value, _ -> + taskViewSpringAnimation.animateToFinalPosition(value) + } + lastTaskViewSpring = taskViewSpringAnimation + } + return lastTaskViewSpring + } private companion object { // The additional damping to apply to tasks further from the dismissed task. private const val ADDITIONAL_DISMISS_DAMPING_RATIO = 0.15f private const val RECENTS_SCALE_SPRING_MULTIPLIER = 1000f - private const val DEFAULT_DISMISS_THRESHOLD_FRACTION = 0.5f - private const val SPEED_UP_STIFFNESS = 100_000f } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 4c3b0ae953..63bb799c97 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -19,6 +19,7 @@ package com.android.quickstep.views; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.os.Trace.traceBegin; import static android.os.Trace.traceEnd; +import static android.view.Surface.ROTATION_0; import static android.view.View.MeasureSpec.EXACTLY; import static android.view.View.MeasureSpec.makeMeasureSpec; @@ -34,12 +35,14 @@ import static com.android.app.animation.Interpolators.LINEAR; import static com.android.app.animation.Interpolators.clampToProgress; import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE; import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS; -import static com.android.launcher3.Flags.enableCoroutineThreadingImprovements; +import static com.android.launcher3.Flags.enableAdditionalHomeAnimations; import static com.android.launcher3.Flags.enableDesktopExplodedView; -import static com.android.launcher3.Flags.enableExpressiveDismissTaskMotion; +import static com.android.launcher3.Flags.enableDesktopTaskAlphaAnimation; +import static com.android.launcher3.Flags.enableGridOnlyOverview; import static com.android.launcher3.Flags.enableLargeDesktopWindowingTile; import static com.android.launcher3.Flags.enableOverviewBackgroundWallpaperBlur; import static com.android.launcher3.Flags.enableRefactorTaskThumbnail; +import static com.android.launcher3.Flags.enableSeparateExternalDisplayTasks; import static com.android.launcher3.LauncherAnimUtils.SUCCESS_TRANSITION_PROGRESS; import static com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA; import static com.android.launcher3.LauncherAnimUtils.VIEW_BACKGROUND_COLOR; @@ -60,7 +63,6 @@ import static com.android.launcher3.touch.PagedOrientationHandler.CANVAS_TRANSLA import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.launcher3.util.MultiPropertyFactory.MULTI_PROPERTY_VALUE; -import static com.android.launcher3.util.OverviewReleaseFlags.enableGridOnlyOverview; import static com.android.launcher3.util.SystemUiController.UI_STATE_FULLSCREEN_TASK; import static com.android.quickstep.BaseContainerInterface.getTaskDimension; import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId; @@ -79,6 +81,8 @@ import static com.android.quickstep.views.TaskView.SPLIT_ALPHA; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; +import android.animation.LayoutTransition; +import android.animation.LayoutTransition.TransitionListener; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; @@ -87,7 +91,6 @@ import android.app.WindowConfiguration; import android.content.Context; import android.content.Intent; import android.content.LocusId; -import android.content.pm.LauncherApps; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.BlendMode; @@ -99,6 +102,7 @@ import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.RectF; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.SystemClock; @@ -108,7 +112,6 @@ import android.os.VibrationEffect; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; -import android.util.ArraySet; import android.util.AttributeSet; import android.util.FloatProperty; import android.util.Log; @@ -121,6 +124,7 @@ import android.view.MotionEvent; import android.view.RemoteAnimationTarget; import android.view.View; import android.view.ViewDebug; +import android.view.ViewGroup; import android.view.ViewTreeObserver.OnScrollChangedListener; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -141,9 +145,8 @@ import androidx.dynamicanimation.animation.SpringAnimation; import com.android.internal.jank.Cuj; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseActivity.MultiWindowModeChangedListener; -import com.android.launcher3.BuildConfig; -import com.android.launcher3.BuildConfigs; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Flags; import com.android.launcher3.Insettable; import com.android.launcher3.PagedView; import com.android.launcher3.R; @@ -155,9 +158,7 @@ import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.SpringProperty; import com.android.launcher3.compat.AccessibilityManagerCompat; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.dagger.LauncherComponentProvider; import com.android.launcher3.desktop.DesktopRecentsTransitionController; -import com.android.launcher3.deviceprofile.OverviewProfile; import com.android.launcher3.logger.LauncherAtom; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.data.ItemInfo; @@ -175,19 +176,20 @@ import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.ResourceBasedOverride.Overrides; import com.android.launcher3.util.RunnableList; +import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds; import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource; import com.android.launcher3.util.SplitConfigurationOptions.StagePosition; +import com.android.launcher3.util.Themes; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.util.TranslateEdgeEffect; import com.android.launcher3.util.VibratorWrapper; import com.android.launcher3.util.ViewPool; import com.android.launcher3.util.coroutines.DispatcherProvider; -import com.android.launcher3.util.coroutines.ProductionDispatchers; +import com.android.launcher3.util.window.WindowManagerProxy.DesktopVisibilityListener; import com.android.quickstep.BaseContainerInterface; import com.android.quickstep.GestureState; import com.android.quickstep.HighResLoadingState; import com.android.quickstep.OverviewCommandHelper; -import com.android.quickstep.OverviewComponentObserver; import com.android.quickstep.RecentsAnimationController; import com.android.quickstep.RecentsAnimationTargets; import com.android.quickstep.RecentsFilterState; @@ -202,10 +204,8 @@ import com.android.quickstep.TaskOverlayFactory; import com.android.quickstep.TaskViewUtils; import com.android.quickstep.TopTaskTracker; import com.android.quickstep.ViewUtils; -import com.android.quickstep.fallback.window.RecentsWindowManager; +import com.android.quickstep.fallback.window.RecentsWindowFlags; import com.android.quickstep.orientation.RecentsPagedOrientationHandler; -import com.android.quickstep.recents.data.AppTimersRepository; -import com.android.quickstep.recents.data.AppTimersRepositoryImpl; import com.android.quickstep.recents.data.RecentTasksRepository; import com.android.quickstep.recents.data.RecentsDeviceProfileRepository; import com.android.quickstep.recents.data.RecentsDeviceProfileRepositoryImpl; @@ -217,7 +217,6 @@ import com.android.quickstep.recents.viewmodel.RecentsViewModel; import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.quickstep.util.AnimUtils; import com.android.quickstep.util.DesktopTask; -import com.android.quickstep.util.FontUtils; import com.android.quickstep.util.GroupTask; import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.util.RecentsAtomicAnimationFactory; @@ -247,11 +246,10 @@ import com.android.wm.shell.common.pip.IPipAnimationListener; import com.android.wm.shell.shared.GroupedTaskInfo; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource; -import com.android.wm.shell.shared.pip.PipFlags; -import com.android.wm.shell.shared.split.SplitBounds; import kotlin.Unit; import kotlin.collections.CollectionsKt; +import kotlin.jvm.functions.Function0; import kotlinx.coroutines.CoroutineScope; @@ -262,12 +260,11 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.stream.Collectors; - /** * A list of recent tasks. * @@ -278,7 +275,7 @@ public abstract class RecentsView< CONTAINER_TYPE extends Context & RecentsViewContainer & StatefulContainer, STATE_TYPE extends BaseState> extends PagedView implements Insettable, HighResLoadingState.HighResLoadingStateChangedCallback, - TaskVisualsChangeListener { + TaskVisualsChangeListener, DesktopVisibilityListener { protected static final String TAG = "RecentsView"; private static final boolean DEBUG = false; @@ -520,7 +517,7 @@ public abstract class RecentsView< private static final float FOREGROUND_SCRIM_TINT = 0.32f; protected final RecentsOrientedState mOrientationState; - protected final BaseContainerInterface mContainerInterface; + protected final BaseContainerInterface mSizeStrategy; @Nullable protected RecentsAnimationController mRecentsAnimationController; @Nullable @@ -550,7 +547,7 @@ public abstract class RecentsView< private final PointF mTempPointF = new PointF(); private final Matrix mTempMatrix = new Matrix(); private final float[] mTempFloat = new float[1]; - private final ArraySet mScrollListeners = new ArraySet<>(); + private final List mScrollListeners = new ArrayList<>(); // The threshold at which we update the SystemUI flags when animating from the task into the app public static final float UPDATE_SYSUI_FLAGS_THRESHOLD = 0.85f; @@ -630,7 +627,8 @@ public abstract class RecentsView< private int mKeyboardTaskFocusSnapAnimationDuration; private int mKeyboardTaskFocusIndex = INVALID_PAGE; - protected Map mTaskViewsDismissPrimaryTranslations = new HashMap<>(); + private Map mTaskViewsDismissPrimaryTranslations = + new HashMap(); /** * TODO: Call reloadIdNeeded in onTaskStackChanged. @@ -659,9 +657,8 @@ public abstract class RecentsView< return; } - // Only invalidate task list but don't trigger the reload, so that the list is only - // updated the next time user enters Overview - invalidateTaskList(); + reloadIfNeeded(); + enableLayoutTransitions(); } @Override @@ -690,8 +687,7 @@ public abstract class RecentsView< if (taskRemoved) { dismissTask(taskId, /*animate=*/true, /*removeTask=*/false); } - }, RecentsFilterState.getFilter(mFilterState.getPackageNameToFilter(), - mContainer.getDisplayId())); + }, RecentsFilterState.getFilter(mFilterState.getPackageNameToFilter())); } })); } @@ -704,7 +700,7 @@ public abstract class RecentsView< // Used to keep track of the last requested task list id, so that we do not request to load the // tasks again if we have already requested it and the task list has not changed - private int mAppliedTaskListChangeId = -1; + private int mTaskListChangeId = -1; // Only valid until the launcher state changes to NORMAL /** @@ -730,6 +726,8 @@ public abstract class RecentsView< @Nullable private PendingAnimation mPendingAnimation; + @Nullable + private LayoutTransition mLayoutTransition; @ViewDebug.ExportedProperty(category = "launcher") protected float mContentAlpha = 1; @@ -761,7 +759,6 @@ public abstract class RecentsView< /** * Placeholder view indicating where the first split screen selected app will be placed */ - @Nullable protected SplitSelectStateController mSplitSelectStateController; /** @@ -829,8 +826,6 @@ public abstract class RecentsView< @Nullable private DesktopRecentsTransitionController mDesktopRecentsTransitionController; - private boolean mIs3PLauncher = false; - private MultiWindowModeChangedListener mMultiWindowModeChangedListener = new MultiWindowModeChangedListener() { @Override @@ -864,13 +859,12 @@ public abstract class RecentsView< * RecentsView being open and displayed to the user. It is reset in the {@link #reset()} method * i.e. when RecentsView closes. */ - protected boolean mAnyTaskHasBeenDismissed; + private boolean mAnyTaskHasBeenDismissed; protected final RecentsViewModel mRecentsViewModel; private final RecentsViewModelHelper mHelper; protected final RecentsViewUtils mUtils = new RecentsViewUtils(this); - protected final RecentsDismissUtils mDismissUtils = LauncherComponentProvider.get( - getContext()).getRecentsDismissUtilsFactory().create(this); + protected final RecentsDismissUtils mDismissUtils = new RecentsDismissUtils(this); private final Matrix mTmpMatrix = new Matrix(); @@ -883,31 +877,27 @@ public abstract class RecentsView< return mUtils.getFirstTaskView(); } - public int getFirstTaskViewIndex() { - return indexOfChild(getFirstTaskView()); - } - public RecentsView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setEnableFreeScroll(true); mContainer = RecentsViewContainer.containerFromContext(context); - mContainerInterface = mContainer.getContainerInterface(); + mSizeStrategy = getContainerInterface(mContainer.getDisplayId()); + mOrientationState = new RecentsOrientedState( - context, mContainerInterface, this::animateRecentsRotationInPlace); + context, mSizeStrategy, this::animateRecentsRotationInPlace); final int rotation; rotation = Utilities.ATLEAST_R ? mContainer.getDisplay().getRotation() : WindowConfiguration.ROTATION_UNDEFINED; mOrientationState.setRecentsRotation(rotation); // Start Recents Dependency graph if (enableRefactorTaskThumbnail()) { - RecentsDependencies recentsDependencies = - RecentsDependencies.maybeInitialize(context, ProductionDispatchers.INSTANCE); + RecentsDependencies recentsDependencies = RecentsDependencies.Companion.maybeInitialize( + context); String scopeId = recentsDependencies.createRecentsViewScope(context); mRecentsViewModel = new RecentsViewModel( recentsDependencies.inject(RecentTasksRepository.class, scopeId), - recentsDependencies.inject(RecentsViewData.class, scopeId), - mContainer.getDisplayId() + recentsDependencies.inject(RecentsViewData.class, scopeId) ); mHelper = new RecentsViewModelHelper( mRecentsViewModel, @@ -920,12 +910,6 @@ public abstract class RecentsView< recentsDependencies.provide(RecentsDeviceProfileRepository.class, scopeId, () -> new RecentsDeviceProfileRepositoryImpl(mContainer)); - - recentsDependencies.provide(AppTimersRepository.class, scopeId, - () -> new AppTimersRepositoryImpl( - context.getApplicationContext().getSystemService(LauncherApps.class), - recentsDependencies.inject(DispatcherProvider.class, scopeId) - )); } else { mRecentsViewModel = null; mHelper = null; @@ -941,22 +925,12 @@ public abstract class RecentsView< .inflate(R.layout.overview_clear_all_button, this, false); mClearAllButton.setOnClickListener(this::dismissAllTasks); - if (DesktopModeStatus.isMultipleDesktopFrontendEnabledOnDisplay(mContext, - mContainer.getDisplay())) { + if (DesktopModeStatus.enableMultipleDesktops(context)) { mAddDesktopButton = (AddDesktopButton) LayoutInflater.from(context).inflate( R.layout.overview_add_desktop_button, this, false); - mAddDesktopButton.setOnClickListener(view -> { - AddDesktopButton button = (AddDesktopButton) view; - button.animateVisibility(/* toVisible = */ false, () -> { - createDesk(view); - button.animateVisibility(/* toVisible = */ true); - }); - }); + mAddDesktopButton.setOnClickListener(this::createDesk); - mDesktopVisibilityController = DesktopVisibilityController.INSTANCE.get(mContext); - // Update its visibility based on whether we can create a desk or not. - mUtils.onCanCreateDesksChanged( - mDesktopVisibilityController.getCanCreateDesks()); + mDesktopVisibilityController = DesktopVisibilityController.INSTANCE.get(context); } mTaskViewPool = new ViewPool<>(context, this, R.layout.task, 20 /* max size */, @@ -964,7 +938,7 @@ public abstract class RecentsView< int groupedViewPoolInitialSize = enableRefactorTaskThumbnail() ? 2 : 10; mGroupedTaskViewPool = new ViewPool<>(context, this, R.layout.task_grouped, 20 /* max size */, groupedViewPoolInitialSize); - int desktopViewPoolInitialSize = DesktopModeStatus.canEnterDesktopMode(mContext) ? 1 : 0; + int desktopViewPoolInitialSize = DesktopModeStatus.canEnterDesktopMode(context) ? 1 : 0; mDesktopTaskViewPool = new ViewPool<>(context, this, R.layout.task_desktop, 5 /* max size */, desktopViewPoolInitialSize); @@ -979,16 +953,18 @@ public abstract class RecentsView< mClampedScrollOffsetBound = getResources().getDimensionPixelSize( R.dimen.transient_taskbar_clamped_offset_bound); - mEmptyIcon = context.getDrawable(R.drawable.ic_view_carousel); + mEmptyIcon = context.getDrawable(R.drawable.ic_empty_recents); mEmptyIcon.setCallback(this); mEmptyMessage = context.getText(R.string.recents_empty_message); mEmptyMessagePaint = new TextPaint(); - mEmptyMessagePaint.setColor( - getResources().getColor(R.color.materialColorOnSurface, context.getTheme())); - + mEmptyMessagePaint.setColor(Themes.getAttrColor(context, android.R.attr.textColorPrimary)); mEmptyMessagePaint.setTextSize(getResources() .getDimension(R.dimen.recents_empty_message_text_size)); - mEmptyMessagePaint.setTypeface(FontUtils.getTypeFace(getResources())); + Typeface typeface = Typeface.create( + Typeface.create(Themes.getDefaultBodyFont(context), Typeface.NORMAL), + getFontWeight(), + false); + mEmptyMessagePaint.setTypeface(typeface); mEmptyMessagePaint.setAntiAlias(true); mEmptyMessagePadding = getResources() .getDimensionPixelSize(R.dimen.recents_empty_message_text_padding); @@ -1071,7 +1047,7 @@ public abstract class RecentsView< * Invalidates the list of tasks so that an update occurs to the list of tasks if requested. */ private void invalidateTaskList() { - mAppliedTaskListChangeId = -1; + mTaskListChangeId = -1; } public OverScroller getScroller() { @@ -1234,11 +1210,10 @@ public abstract class RecentsView< public void init(OverviewActionsView actionsView, SplitSelectStateController splitController, @Nullable DesktopRecentsTransitionController desktopRecentsTransitionController) { - mIs3PLauncher = !OverviewComponentObserver.INSTANCE.get(mContext).isHomeAndOverviewSame(); mActionsView = actionsView; mActionsView.updateHiddenFlags(HIDDEN_NO_TASKS, !hasTaskViews()); // Update flags for 1p/3p launchers - mActionsView.updateFor3pLauncher(mIs3PLauncher); + mActionsView.updateFor3pLauncher(!supportsAppPairs()); mSplitSelectStateController = splitController; mDesktopRecentsTransitionController = desktopRecentsTransitionController; mActionsView.setClearAllClickListener(this::dismissAllTasks); @@ -1249,8 +1224,7 @@ public abstract class RecentsView< } public boolean isSplitSelectionActive() { - return mSplitSelectStateController != null - && mSplitSelectStateController.isSplitSelectActive(); + return mSplitSelectStateController.isSplitSelectActive(); } /** @@ -1280,7 +1254,7 @@ public abstract class RecentsView< mTaskOverlayFactory.initListeners(); mSplitSelectStateController.registerSplitListener(mSplitSelectionListener); if (mDesktopVisibilityController != null) { - mDesktopVisibilityController.registerDesktopVisibilityListener(mUtils); + mDesktopVisibilityController.registerDesktopVisibilityListener(this); } } @@ -1303,10 +1277,8 @@ public abstract class RecentsView< mTaskOverlayFactory.removeListeners(); mSplitSelectStateController.unregisterSplitListener(mSplitSelectionListener); if (mDesktopVisibilityController != null) { - mDesktopVisibilityController.unregisterDesktopVisibilityListener(mUtils); + mDesktopVisibilityController.unregisterDesktopVisibilityListener(this); } - mTaskLaunchListener = null; - mOnTaskLaunchCancelledRunnable = null; reset(); } @@ -1366,13 +1338,7 @@ public abstract class RecentsView< if (child instanceof TaskView) { mTaskViewCount++; } - if (mAddDesktopButton != null && child instanceof AddDesktopButton) { - mAddDesktopButton.setContentAlpha(mContentAlpha); - } else if (child instanceof ClearAllButton) { - mClearAllButton.setContentAlpha(mContentAlpha); - } else { - child.setAlpha(mContentAlpha); - } + child.setAlpha(mContentAlpha); // RecentsView is set to RTL in the constructor when system is using LTR. Here we set the // child direction back to match system settings. child.setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_LTR : View.LAYOUT_DIRECTION_RTL); @@ -1480,9 +1446,9 @@ public abstract class RecentsView< for (int i = apps.length - 1; i >= 0; --i) { RemoteAnimationTarget app = apps[i]; - float dx = mContainer.getDeviceProfile().getDeviceProperties().getWidthPx() * (1 - percent) / 2 + float dx = mContainer.getDeviceProfile().widthPx * (1 - percent) / 2 + app.screenSpaceBounds.left * percent; - float dy = mContainer.getDeviceProfile().getDeviceProperties().getHeightPx() * (1 - percent) / 2 + float dy = mContainer.getDeviceProfile().heightPx * (1 - percent) / 2 + app.screenSpaceBounds.top * percent; matrix.setScale(percent, percent); matrix.postTranslate(dx, dy); @@ -1509,7 +1475,8 @@ public abstract class RecentsView< anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - finishRecentsAnimation(false /* toRecents */, true /*shouldPip*/, null); + finishRecentsAnimation(false /* toRecents */, true /*shouldPip*/, + allAppsAreTranslucent(apps), null); } }); } else { @@ -1520,6 +1487,18 @@ public abstract class RecentsView< anim.start(); } + private boolean allAppsAreTranslucent(RemoteAnimationTarget[] apps) { + if (apps == null) { + return false; + } + for (int i = apps.length - 1; i >= 0; --i) { + if (!apps[i].isTranslucent) { + return false; + } + } + return true; + } + public boolean isTaskViewVisible(TaskView tv) { if (showAsGrid()) { int screenStart = getPagedOrientationHandler().getPrimaryScroll(this); @@ -1543,12 +1522,12 @@ public abstract class RecentsView< } @Nullable - protected TaskView getLastGridTaskView() { + private TaskView getLastGridTaskView() { return getLastGridTaskView(mUtils.getTopRowIdArray(), mUtils.getBottomRowIdArray()); } @Nullable - protected TaskView getLastGridTaskView(IntArray topRowIdArray, IntArray bottomRowIdArray) { + private TaskView getLastGridTaskView(IntArray topRowIdArray, IntArray bottomRowIdArray) { if (topRowIdArray.isEmpty() && bottomRowIdArray.isEmpty()) { return null; } @@ -1557,7 +1536,7 @@ public abstract class RecentsView< return getTaskViewFromTaskViewId(lastTaskViewId); } - protected int getSnapToLastTaskScrollDiff() { + private int getSnapToLastTaskScrollDiff() { // Snap to a position where ClearAll is just invisible. int screenStart = getPagedOrientationHandler().getPrimaryScroll(this); int clearAllScroll = getScrollForPage(indexOfChild(mClearAllButton)); @@ -1566,7 +1545,7 @@ public abstract class RecentsView< return screenStart - lastTaskScroll; } - protected int getLastTaskScroll(int clearAllScroll, int clearAllWidth) { + private int getLastTaskScroll(int clearAllScroll, int clearAllWidth) { int distance = clearAllWidth + getClearAllExtraPageSpacing(); return clearAllScroll + (mIsRtl ? distance : -distance); } @@ -1719,7 +1698,7 @@ public abstract class RecentsView< @Override protected void onPageBeginTransition() { super.onPageBeginTransition(); - if (!mContainer.getDeviceProfile().getDeviceProperties().isTablet()) { + if (!mContainer.getDeviceProfile().isTablet) { mActionsView.updateDisabledFlags(OverviewActionsView.DISABLED_SCROLLING, true); } if (mOverviewStateEnabled) { // only when in overview @@ -1731,7 +1710,7 @@ public abstract class RecentsView< protected void onPageEndTransition() { super.onPageEndTransition(); ActiveGestureProtoLogProxy.logOnPageEndTransition(getNextPage()); - if (!mContainer.getDeviceProfile().getDeviceProperties().isTablet()) { + if (isClearAllHidden() && !mContainer.getDeviceProfile().isTablet) { mActionsView.updateDisabledFlags(OverviewActionsView.DISABLED_SCROLLING, false); } if (getNextPage() > 0) { @@ -1743,12 +1722,21 @@ public abstract class RecentsView< @Override protected boolean isSignificantMove(float absoluteDelta, int pageOrientedSize) { DeviceProfile deviceProfile = mContainer.getDeviceProfile(); - if (!deviceProfile.getDeviceProperties().isTablet()) { + if (!deviceProfile.isTablet) { return super.isSignificantMove(absoluteDelta, pageOrientedSize); } return absoluteDelta - > deviceProfile.getDeviceProperties().getAvailableWidthPx() * SIGNIFICANT_MOVE_SCREEN_WIDTH_PERCENTAGE; + > deviceProfile.availableWidthPx * SIGNIFICANT_MOVE_SCREEN_WIDTH_PERCENTAGE; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + boolean intercept = super.onInterceptTouchEvent(ev); + if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { + Log.d("b/318590728", "onInterceptTouchEvent: " + ev); + } + return intercept; } @Override @@ -1841,19 +1829,11 @@ public abstract class RecentsView< return; } TaskView taskView = getTaskViewAt(mNextPage); - boolean shouldSnapToLargeTask = taskView != null && taskView.isLargeTile(); - boolean shouldSnapToSmallTask = enableGridOnlyOverview() && taskView != null - && taskView == mUtils.getFirstSmallTaskView(); + boolean shouldSnapToLargeTask = taskView != null && taskView.isLargeTile() + && !mUtils.isAnySmallTaskFullyVisible(); boolean shouldSnapToClearAll = mNextPage == indexOfChild(mClearAllButton); - boolean shouldSnapToLastTask = - enableGridOnlyOverview() && taskView != null && getScrollForPage( - indexOfChild(taskView)) == getScrollForPage(indexOfChild( - getLastGridTaskView(mUtils.getTopRowIdArray(), - mUtils.getBottomRowIdArray()))); - boolean shouldSnap = - shouldSnapToLargeTask || shouldSnapToClearAll || shouldSnapToSmallTask - || shouldSnapToLastTask; - if (!shouldSnap) { + // Snap to large tile when grid tasks aren't fully visible or the clear all button. + if (!shouldSnapToLargeTask && !shouldSnapToClearAll) { return; } } @@ -1935,19 +1915,10 @@ public abstract class RecentsView< return super.isPageScrollsInitialized() && mLoadPlanEverApplied; } - protected void applyLoadPlan(List taskGroups, int taskListChangeId) { - if (enableRefactorTaskThumbnail() && !(isAttachedToWindow() - && RecentsDependencies.Companion.hasScope(mContext))) { - // This can happen if a TaskView callback is triggered after the view is destroyed - // (b/404920951). Prevent crashes by returning immediately. - Log.d(TAG, "applyLoadPlan - view invalid, isAttachedToWindow: " + isAttachedToWindow() - + ", hasScope: " + RecentsDependencies.Companion.hasScope(mContext)); - return; - } + protected void applyLoadPlan(List taskGroups) { if (mPendingAnimation != null) { final List finalTaskGroups = taskGroups; - mPendingAnimation.addEndListener( - success -> applyLoadPlan(finalTaskGroups, taskListChangeId)); + mPendingAnimation.addEndListener(success -> applyLoadPlan(finalTaskGroups)); return; } @@ -2039,7 +2010,9 @@ public abstract class RecentsView< if (enableLargeDesktopWindowingTile()) { taskGroups = mUtils.sortDesktopTasksToFront(taskGroups); } - taskGroups = mUtils.sortExternalDisplayTasksToFront(taskGroups); + if (enableSeparateExternalDisplayTasks()) { + taskGroups = mUtils.sortExternalDisplayTasksToFront(taskGroups); + } if (mAddDesktopButton != null) { // Add `mAddDesktopButton` as the first child. @@ -2071,7 +2044,10 @@ public abstract class RecentsView< traceEnd(Trace.TRACE_TAG_APP); traceBegin(Trace.TRACE_TAG_APP, "RecentsView.applyLoadPlan.forLoop.bind"); if (taskView instanceof GroupedTaskView groupedTaskView) { - groupedTaskView.bind((SplitTask) groupTask, mOrientationState, mTaskOverlayFactory); + var splitTask = (SplitTask) groupTask; + groupedTaskView.bind(splitTask.getTopLeftTask(), + splitTask.getBottomRightTask(), mOrientationState, + mTaskOverlayFactory, splitTask.getSplitBounds()); } else if (taskView instanceof DesktopTaskView desktopTaskView) { desktopTaskView.bind((DesktopTask) groupTask, mOrientationState, mTaskOverlayFactory); @@ -2079,9 +2055,10 @@ public abstract class RecentsView< Task task = splitTask.getTopLeftTask().key.id == stagedTaskIdToBeRemoved ? splitTask.getBottomRightTask() : splitTask.getTopLeftTask(); - taskView.bind(new SingleTask(task), mOrientationState, mTaskOverlayFactory); + taskView.bind(task, mOrientationState, mTaskOverlayFactory); } else { - taskView.bind((SingleTask) groupTask, mOrientationState, mTaskOverlayFactory); + taskView.bind(((SingleTask) groupTask).getTask(), mOrientationState, + mTaskOverlayFactory); } traceEnd(Trace.TRACE_TAG_APP); traceBegin(Trace.TRACE_TAG_APP, "RecentsView.applyLoadPlan.forLoop.addTaskView"); @@ -2159,7 +2136,17 @@ public abstract class RecentsView< } if (targetPage != -1 && mCurrentPage != targetPage) { int finalTargetPage = targetPage; - runOnPageScrollsInitialized(() -> setCurrentPage(finalTargetPage)); + runOnPageScrollsInitialized(() -> { + // TODO(b/246283207): Remove logging once root cause of flake detected. + if (Utilities.isRunningInTestHarness()) { + Log.d("b/246283207", "RecentsView#applyLoadPlan() -> " + + "previousCurrentPage: " + previousCurrentPage + + ", targetPage: " + finalTargetPage + + ", getScrollForPage(targetPage): " + + getScrollForPage(finalTargetPage)); + } + setCurrentPage(finalTargetPage); + }); } traceBegin(Trace.TRACE_TAG_APP, "RecentsView.applyLoadPlan.cleanupStates"); @@ -2171,7 +2158,6 @@ public abstract class RecentsView< mIgnoreResetTaskId = INVALID_TASK_ID; } - mAppliedTaskListChangeId = taskListChangeId; resetTaskVisuals(); onTaskStackUpdated(); updateEnabledOverlays(); @@ -2192,7 +2178,7 @@ public abstract class RecentsView< return mModel.isLoadingTasksInBackground(); } - protected void removeAllTaskViews() { + private void removeAllTaskViews() { // This handles an edge case where applyLoadPlan happens during a gesture when the only // Task is one with excludeFromRecents, in which case we should not remove it. CollectionsKt @@ -2305,9 +2291,9 @@ public abstract class RecentsView< setOverviewGridEnabled( getStateManager().getState().displayOverviewTasksAsGrid(dp)); if (enableGridOnlyOverview()) { - mActionsView.updateHiddenFlags(HIDDEN_ACTIONS_IN_MENU, dp.getDeviceProperties().isTablet()); + mActionsView.updateHiddenFlags(HIDDEN_ACTIONS_IN_MENU, dp.isTablet); } - setPageSpacing(dp.getOverviewProfile().getPageSpacing()); + setPageSpacing(dp.overviewPageSpacing); // Propagate DeviceProfile change event. runActionOnRemoteHandles( @@ -2350,10 +2336,10 @@ public abstract class RecentsView< } } - mActionsView.updateHiddenFlags( - HIDDEN_NON_ZERO_ROTATION, - mOrientationState.shouldHideActionButtons() - ); + boolean isInLandscape = mOrientationState.getTouchRotation() != ROTATION_0 + || mOrientationState.getRecentsActivityRotation() != ROTATION_0; + mActionsView.updateHiddenFlags(HIDDEN_NON_ZERO_ROTATION, + !mOrientationState.isRecentsActivityRotationAllowed() && isInLandscape); // Recalculate DeviceProfile dependent layout. updateSizeAndPadding(); @@ -2382,19 +2368,18 @@ public abstract class RecentsView< mTaskWidth = mLastComputedTaskSize.width(); mTaskHeight = mLastComputedTaskSize.height(); setPadding(mLastComputedTaskSize.left - mInsets.left, - mLastComputedTaskSize.top - dp.getOverviewProfile().getTaskThumbnailTopMarginPx() - - mInsets.top, - dp.getDeviceProperties().getWidthPx() - mInsets.right - mLastComputedTaskSize.right, - dp.getDeviceProperties().getHeightPx() - mInsets.bottom - mLastComputedTaskSize.bottom); + mLastComputedTaskSize.top - dp.overviewTaskThumbnailTopMarginPx - mInsets.top, + dp.widthPx - mInsets.right - mLastComputedTaskSize.right, + dp.heightPx - mInsets.bottom - mLastComputedTaskSize.bottom); - mContainerInterface.calculateGridSize(dp, mContainer, mLastComputedGridSize); - mContainerInterface.calculateGridTaskSize(mContainer, dp, mLastComputedGridTaskSize, + mSizeStrategy.calculateGridSize(dp, mContainer, mLastComputedGridSize); + mSizeStrategy.calculateGridTaskSize(mContainer, dp, mLastComputedGridTaskSize, getPagedOrientationHandler()); mTaskGridVerticalDiff = mLastComputedGridTaskSize.top - mLastComputedTaskSize.top; - mTopBottomRowHeightDiff = mLastComputedGridTaskSize.height() - + dp.getOverviewProfile().getTaskThumbnailTopMarginPx() - + dp.getOverviewProfile().getRowSpacing(); + mTopBottomRowHeightDiff = + mLastComputedGridTaskSize.height() + dp.overviewTaskThumbnailTopMarginPx + + dp.overviewRowSpacing; // Force TaskView to update size from thumbnail updateTaskSize(); @@ -2404,7 +2389,7 @@ public abstract class RecentsView< /** * Updates TaskView scaling and translation required to support variable width. */ - protected void updateTaskSize() { + private void updateTaskSize() { if (!hasTaskViews()) { return; } @@ -2431,7 +2416,7 @@ public abstract class RecentsView< } public void getTaskSize(Rect outRect) { - mContainerInterface.calculateTaskSize(mContainer, mContainer.getDeviceProfile(), outRect, + mSizeStrategy.calculateTaskSize(mContainer, mContainer.getDeviceProfile(), outRect, getPagedOrientationHandler()); } @@ -2467,10 +2452,10 @@ public abstract class RecentsView< */ private float getTaskAlignmentTranslationY() { DeviceProfile deviceProfile = mContainer.getDeviceProfile(); - if (deviceProfile.getDeviceProperties().isTablet()) { - return deviceProfile.getOverviewProfile().getRowSpacing(); + if (deviceProfile.isTablet) { + return deviceProfile.overviewRowSpacing; } - return deviceProfile.getOverviewProfile().getTaskThumbnailTopMarginPx() / 2.0f; + return deviceProfile.overviewTaskThumbnailTopMarginPx / 2.0f; } protected Rect getTaskBounds(TaskView taskView) { @@ -2498,8 +2483,8 @@ public abstract class RecentsView< /** Gets the task size for modal state. */ public void getModalTaskSize(Rect outRect) { - mContainerInterface.calculateModalTaskSize(mContainer, mContainer.getDeviceProfile(), - outRect, getPagedOrientationHandler()); + mSizeStrategy.calculateModalTaskSize(mContainer, mContainer.getDeviceProfile(), outRect, + getPagedOrientationHandler()); } @Override @@ -2525,7 +2510,7 @@ public abstract class RecentsView< return scrolling; } - protected void updateActionsViewFocusedScroll() { + private void updateActionsViewFocusedScroll() { if (showAsGrid()) { float actionsViewAlphaValue = isFocusedTaskInExpectedScrollPosition() ? 1 : 0; // If animation is already in progress towards the same end value, do not restart. @@ -2538,10 +2523,6 @@ public abstract class RecentsView< } } - protected OverviewActionsView getActionsView() { - return mActionsView; - } - private void animateActionsViewAlpha(float alphaValue, long duration) { mActionsViewAlphaAnimator = ObjectAnimator.ofFloat(mActionsView.getVisibilityAlpha(), AnimatedFloat.VALUE, alphaValue); @@ -2568,7 +2549,7 @@ public abstract class RecentsView< @Override protected int getDestinationPage(int scaledScroll) { - if (!mContainer.getDeviceProfile().getDeviceProperties().isTablet()) { + if (!mContainer.getDeviceProfile().isTablet) { return super.getDestinationPage(scaledScroll); } if (!isPageScrollsInitialized()) { @@ -2603,7 +2584,7 @@ public abstract class RecentsView< */ public void loadVisibleTaskData(@TaskView.TaskDataChanges int dataChanges) { boolean hasLeftOverview = !mOverviewStateEnabled && mScroller.isFinished(); - if (hasLeftOverview || mAppliedTaskListChangeId == -1) { + if (hasLeftOverview || mTaskListChangeId == -1) { // Skip loading visible task data if we've already left the overview state, or if the // task list hasn't been loaded yet (the task views will not reflect the task list) return; @@ -2615,9 +2596,9 @@ public abstract class RecentsView< int pageOrientedSize = getPagedOrientationHandler().getMeasuredSize(this); // For GRID_ONLY_OVERVIEW, use +/- 1 task column as visible area for preloading // adjacent thumbnails, otherwise use +/-50% screen width - int extraWidth = enableGridOnlyOverview() - ? getLastComputedGridTaskSize().width() + getPageSpacing() - : pageOrientedSize / 2; + int extraWidth = + enableGridOnlyOverview() ? getLastComputedTaskSize().width() + getPageSpacing() + : pageOrientedSize / 2; lowerIndex = upperIndex = 0; visibleStart = screenStart - extraWidth; visibleEnd = screenStart + pageOrientedSize + extraWidth; @@ -2756,10 +2737,9 @@ public abstract class RecentsView< setCurrentTask(-1); mCurrentPageScrollDiff = 0; mIgnoreResetTaskId = -1; - mAppliedTaskListChangeId = -1; + mTaskListChangeId = -1; setFocusedTaskViewId(INVALID_TASK_ID); mAnyTaskHasBeenDismissed = false; - setTaskIconVisible(true); if (enableRefactorTaskThumbnail()) { // TODO(b/353917593): RecentsView is never destroyed, so its dependencies need to @@ -2781,19 +2761,9 @@ public abstract class RecentsView< setEnableDrawingLiveTile(false); } mBlurUtils.setDrawLiveTileBelowRecents(false); - - if (enableCoroutineThreadingImprovements()) { - // TODO(b/391842220): This should not need to be explicitly called from here. When TVs - // are added and removed with the RecentsView lifecycle, this can be removed. - // This is was added because without it cancelling jobs was happening after work was - // scheduled for those jobs resulting in delays. - mUtils.getTaskViews().forEach(TaskView::cancelJobs); - } // These are relatively expensive and don't need to be done this frame (RecentsView isn't // visible anyway), so defer by a frame to get off the critical path, e.g. app to home. - // Defer onto the main thread rather than the view message queue since this will not always - // be called in the Recents In Window case. - MAIN_EXECUTOR.getHandler().post(this::onReset); + post(this::onReset); } private void onReset() { @@ -2894,29 +2864,27 @@ public abstract class RecentsView< return tv == null ? -1 : indexOfChild(tv); } - protected int getClearAllShortTotalWidthTranslation() { - return mClearAllShortTotalWidthTranslation; - } - /** * Reloads the view if anything in recents changed. */ public void reloadIfNeeded() { - if (!mModel.isTaskListValid(mAppliedTaskListChangeId)) { - mModel.getTasks(this::applyLoadPlan, RecentsFilterState - .getFilter(mFilterState.getPackageNameToFilter(), mContainer.getDisplayId())); - Log.d(TAG, "reloadIfNeeded - getTasks: " + mAppliedTaskListChangeId); + if (!mModel.isTaskListValid(mTaskListChangeId)) { + mTaskListChangeId = mModel.getTasks(this::applyLoadPlan, RecentsFilterState + .getFilter(mFilterState.getPackageNameToFilter())); + Log.d(TAG, "reloadIfNeeded - getTasks: " + mTaskListChangeId); if (enableRefactorTaskThumbnail()) { mRecentsViewModel.refreshAllTaskData(); } } else { - Log.d(TAG, "reloadIfNeeded - task list still valid: " + mAppliedTaskListChangeId); + Log.d(TAG, "reloadIfNeeded - task list still valid: " + mTaskListChangeId); } } /** * Called when a gesture from an app is starting. */ + // TODO: b/401582344 - Implement a way to exclude the `DesktopWallpaperActivity` from being + // considered in Overview. public void onGestureAnimationStart(GroupedTaskInfo groupedTaskInfo) { Log.d(TAG, "onGestureAnimationStart - groupedTaskInfo: " + groupedTaskInfo); mActiveGestureGroupedTaskInfo = groupedTaskInfo; @@ -2940,7 +2908,7 @@ public abstract class RecentsView< * Returns whether the running task's attach alpha should be updated during the attach animation */ public boolean shouldUpdateRunningTaskAlpha() { - return getRunningTaskView() instanceof DesktopTaskView; + return enableDesktopTaskAlphaAnimation() && getRunningTaskView() instanceof DesktopTaskView; } private boolean isGestureActive() { @@ -2957,8 +2925,7 @@ public abstract class RecentsView< } private void animateRecentsRotationInPlace(int newRotation) { - if (mOrientationState.isRecentsActivityRotationAllowed() - || mOrientationState.isLauncherFixedLandscape()) { + if (mOrientationState.isRecentsActivityRotationAllowed()) { // Let system take care of the rotation return; } @@ -2996,10 +2963,87 @@ public abstract class RecentsView< * Called when a gesture from an app has finished, and an end target has been determined. */ public void onPrepareGestureEndAnimation( - AnimatorSet animatorSet, GestureState.GestureEndTarget endTarget, - RemoteTargetHandle[] remoteTargetHandles, boolean isHandlingAtomicEvent) { - mUtils.onPrepareGestureEndAnimation(animatorSet, endTarget, remoteTargetHandles, - isHandlingAtomicEvent); + @Nullable AnimatorSet animatorSet, GestureState.GestureEndTarget endTarget, + RemoteTargetHandle[] remoteTargetHandles) { + Log.d(TAG, "onPrepareGestureEndAnimation - endTarget: " + endTarget); + mCurrentGestureEndTarget = endTarget; + boolean isOverviewEndTarget = endTarget == GestureState.GestureEndTarget.RECENTS; + if (isOverviewEndTarget) { + updateGridProperties(); + } + + BaseState endState = mSizeStrategy.stateFromGestureEndTarget(endTarget); + // Starting the desk exploded animation when the gesture from an app is released. + if (enableDesktopExplodedView()) { + if (animatorSet == null) { + mUtils.setDeskExplodeProgress(endState.showExplodedDesktopView() ? 1f : 0f); + } else { + animatorSet.play( + ObjectAnimator.ofFloat(this, DESK_EXPLODE_PROGRESS, + endState.showExplodedDesktopView() ? 1f : 0f)); + } + + for (TaskView taskView : getTaskViews()) { + if (taskView instanceof DesktopTaskView desktopTaskView) { + desktopTaskView.setRemoteTargetHandles(remoteTargetHandles); + } + } + } + + if (endState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) { + TaskView runningTaskView = getRunningTaskView(); + float runningTaskGridTranslationX = 0; + float runningTaskGridTranslationY = 0; + if (runningTaskView != null) { + // Apply the grid translation to running task unless it's being snapped to + // and removes the current translation applied to the running task. + runningTaskGridTranslationX = runningTaskView.getGridTranslationX() + - runningTaskView.getNonGridTranslationX(); + runningTaskGridTranslationY = runningTaskView.getGridTranslationY(); + } + for (RemoteTargetHandle remoteTargetHandle : remoteTargetHandles) { + TaskViewSimulator tvs = remoteTargetHandle.getTaskViewSimulator(); + if (animatorSet == null) { + setGridProgress(1); + if (enableGridOnlyOverview()) { + tvs.taskGridTranslationX.value = runningTaskGridTranslationX; + tvs.taskGridTranslationY.value = runningTaskGridTranslationY; + } else { + tvs.taskPrimaryTranslation.value = runningTaskGridTranslationX; + tvs.taskSecondaryTranslation.value = runningTaskGridTranslationY; + } + } else { + animatorSet.play(ObjectAnimator.ofFloat(this, RECENTS_GRID_PROGRESS, 1)); + if (enableGridOnlyOverview()) { + animatorSet.play(tvs.carouselScale.animateToValue(1)); + animatorSet.play(tvs.taskGridTranslationX.animateToValue( + runningTaskGridTranslationX)); + animatorSet.play(tvs.taskGridTranslationY.animateToValue( + runningTaskGridTranslationY)); + } else { + animatorSet.play(tvs.taskPrimaryTranslation.animateToValue( + runningTaskGridTranslationX)); + animatorSet.play(tvs.taskSecondaryTranslation.animateToValue( + runningTaskGridTranslationY)); + } + } + } + } + int splashAlpha = endState.showTaskThumbnailSplash() ? 1 : 0; + if (animatorSet == null) { + setTaskThumbnailSplashAlpha(splashAlpha); + } else { + animatorSet.play( + ObjectAnimator.ofFloat(this, TASK_THUMBNAIL_SPLASH_ALPHA, splashAlpha)); + } + if (enableLargeDesktopWindowingTile()) { + if (animatorSet != null) { + animatorSet.play( + ObjectAnimator.ofFloat(this, DESKTOP_CAROUSEL_DETACH_PROGRESS, 0f)); + } else { + DESKTOP_CAROUSEL_DETACH_PROGRESS.set(this, 0f); + } + } } /** @@ -3016,7 +3060,6 @@ public abstract class RecentsView< Log.d(TAG, "onGestureAnimationEnd - mEnableDrawingLiveTile: " + mEnableDrawingLiveTile); setRunningTaskHidden(false); startIconFadeInOnGestureComplete(); - setTaskIconVisible(true); animateActionsViewIn(); if (mEnableDrawingLiveTile) { @@ -3044,11 +3087,29 @@ public abstract class RecentsView< } /** - * Returns true to avoid adding a stub task even when [getRunningTaskViewFromGroupedTaskInfo] - * cannot find a [runningTaskView]. + * Returns true if we should add a stub taskView for the running task id */ - protected boolean shouldAvoidAddingStubTaskView(GroupedTaskInfo groupedTaskInfo) { - return false; + protected boolean shouldAddStubTaskView(GroupedTaskInfo groupedTaskInfo) { + int[] runningTaskIds; + if (groupedTaskInfo != null) { + runningTaskIds = groupedTaskInfo.getTaskInfoList().stream().mapToInt( + taskInfo -> taskInfo.taskId).toArray(); + } else { + runningTaskIds = new int[0]; + } + TaskView matchingTaskView = null; + if (groupedTaskInfo != null && groupedTaskInfo.isBaseType(GroupedTaskInfo.TYPE_DESK) + && runningTaskIds.length == 1) { + // TODO(b/342635213): Unsure if it's expected, desktop runningTasks only have a single + // taskId, therefore we match any DesktopTaskView that contains the runningTaskId. + TaskView taskview = getTaskViewByTaskId(runningTaskIds[0]); + if (taskview instanceof DesktopTaskView) { + matchingTaskView = taskview; + } + } else { + matchingTaskView = getTaskViewByTaskIds(runningTaskIds); + } + return matchingTaskView == null; } /** @@ -3063,11 +3124,8 @@ public abstract class RecentsView< return; } - final int runningTaskViewId; - TaskView runningTaskView = mUtils.getRunningTaskViewFromGroupTaskInfo(groupedTaskInfo); - if (runningTaskView != null) { - runningTaskViewId = runningTaskView.getTaskViewId(); - } else if (!shouldAvoidAddingStubTaskView(groupedTaskInfo)) { + int runningTaskViewId = -1; + if (shouldAddStubTaskView(groupedTaskInfo)) { boolean wasEmpty = getChildCount() == 0; // Add an empty view for now until the task plan is loaded and applied final TaskView taskView; @@ -3078,14 +3136,13 @@ public abstract class RecentsView< // When we create a placeholder task view mSplitBoundsConfig will be null, but with // the actual app running we won't need to show the thumbnail until all the tasks // load later anyways - ((GroupedTaskView) taskView).bind( - new SplitTask(Task.from(groupedTaskInfo.getTaskInfo1()), - Task.from(groupedTaskInfo.getTaskInfo2()), mSplitBoundsConfig), - mOrientationState, mTaskOverlayFactory); + ((GroupedTaskView) taskView).bind(Task.from(groupedTaskInfo.getTaskInfo1()), + Task.from(groupedTaskInfo.getTaskInfo2()), mOrientationState, + mTaskOverlayFactory, mSplitBoundsConfig); } else { taskView = getTaskViewFromPool(TaskViewType.SINGLE); - taskView.bind(new SingleTask(Task.from(groupedTaskInfo.getTaskInfo1())), - mOrientationState, mTaskOverlayFactory); + taskView.bind(Task.from(groupedTaskInfo.getTaskInfo1()), mOrientationState, + mTaskOverlayFactory); } if (mAddDesktopButton != null && wasEmpty) { addView(mAddDesktopButton); @@ -3102,7 +3159,10 @@ public abstract class RecentsView< makeMeasureSpec(getMeasuredHeight(), EXACTLY)); layout(getLeft(), getTop(), getRight(), getBottom()); } else { - runningTaskViewId = -1; + var runningTaskView = getTaskViewByTaskId(groupedTaskInfo.getTaskInfo1().taskId); + if (runningTaskView != null) { + runningTaskViewId = runningTaskView.getTaskViewId(); + } } boolean runningTaskTileHidden = mRunningTaskTileHidden; @@ -3245,7 +3305,7 @@ public abstract class RecentsView< * * Skips rebalance. */ - protected void updateGridProperties() { + private void updateGridProperties() { updateGridProperties(null); } @@ -3259,13 +3319,13 @@ public abstract class RecentsView< * @param lastVisibleTaskViewDuringDismiss which TaskView to start rebalancing from. Use * `null` to skip rebalance. */ - protected void updateGridProperties(TaskView lastVisibleTaskViewDuringDismiss) { + private void updateGridProperties(TaskView lastVisibleTaskViewDuringDismiss) { if (!hasTaskViews()) { return; } DeviceProfile deviceProfile = mContainer.getDeviceProfile(); - int taskTopMargin = deviceProfile.getOverviewProfile().getTaskThumbnailTopMarginPx(); + int taskTopMargin = deviceProfile.overviewTaskThumbnailTopMarginPx; int topRowWidth = 0; int bottomRowWidth = 0; @@ -3284,9 +3344,7 @@ public abstract class RecentsView< int snappedPage = isKeyboardTaskFocusPending() ? mKeyboardTaskFocusIndex : getNextPage(); TaskView snappedTaskView = getTaskViewAt(snappedPage); TaskView homeTaskView = getHomeTaskView(); - // Determine the currentTaskView when going from Home to Overview, and ensure it can be - // snapped to its expected position. - TaskView expectedCurrentTaskView = mUtils.getExpectedCurrentTask(/* runningTaskView= */null, + TaskView expectedCurrentTaskView = mUtils.getExpectedCurrentTask(getRunningTaskView(), getFocusedTaskView()); TaskView nextFocusedTaskView = null; @@ -3497,8 +3555,8 @@ public abstract class RecentsView< int minimumDistance = (mIsRtl ? mLastComputedTaskSize.left - : deviceProfile.getDeviceProperties().getWidthPx() - mLastComputedTaskSize.right) - - deviceProfile.getOverviewProfile().getGridSideMargin() - mPageSpacing + : deviceProfile.widthPx - mLastComputedTaskSize.right) + - deviceProfile.overviewGridSideMargin - mPageSpacing + (mTaskWidth - snappedTaskView.getLayoutParams().width) - mClearAllShortTotalWidthTranslation; if (distanceFromClearAll < minimumDistance) { @@ -3569,6 +3627,34 @@ public abstract class RecentsView< } } + private void enableLayoutTransitions() { + if (mLayoutTransition == null) { + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.enableTransitionType(LayoutTransition.APPEARING); + mLayoutTransition.setDuration(ADDITION_TASK_DURATION); + mLayoutTransition.setStartDelay(LayoutTransition.APPEARING, 0); + + mLayoutTransition.addTransitionListener(new TransitionListener() { + @Override + public void startTransition(LayoutTransition transition, ViewGroup viewGroup, + View view, int i) { + } + + @Override + public void endTransition(LayoutTransition transition, ViewGroup viewGroup, + View view, int i) { + // When the unpinned task is added, snap to first page and disable transitions + if (view instanceof TaskView) { + snapToPage(0); + setLayoutTransition(null); + } + + } + }); + } + setLayoutTransition(mLayoutTransition); + } + public void setSwipeDownShouldLaunchApp(boolean swipeDownShouldLaunchApp) { mSwipeDownShouldLaunchApp = swipeDownShouldLaunchApp; } @@ -3626,7 +3712,7 @@ public abstract class RecentsView< mSplitPlaceholderInset, mContainer.getDeviceProfile(), mSplitSelectStateController.getActiveSplitStagePosition(), mTempRect); SplitAnimationTimings timings = - AnimUtils.getDeviceOverviewToSplitTimings(mContainer.getDeviceProfile().getDeviceProperties().isTablet()); + AnimUtils.getDeviceOverviewToSplitTimings(mContainer.getDeviceProfile().isTablet); RectF startingTaskRect = new RectF(); safeRemoveDragLayerView(mSplitSelectStateController.getFirstFloatingTaskView()); @@ -3655,7 +3741,7 @@ public abstract class RecentsView< firstFloatingTaskView.setOnClickListener(view -> mSplitSelectStateController.getSplitAnimationController(). playAnimPlaceholderToFullscreen(mContainer, view, - Optional.of(() -> mSplitSelectStateController.resetState()))); + Optional.of(() -> resetFromSplitSelectionState()))); firstFloatingTaskView.setContentDescription(splitAnimInitProps.getContentDescription()); // SplitInstructionsView: animate in @@ -3677,9 +3763,14 @@ public abstract class RecentsView< anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { - switchToScreenshot( - () -> finishRecentsAnimation(true /* toRecents */, - false /* shouldPip */, null /* onFinishComplete */)); + if (mSplitHiddenTaskView == getRunningTaskView()) { + finishRecentsAnimation(true /* toRecents */, false /* shouldPip */, + null /* onFinishComplete */); + } else { + switchToScreenshot( + () -> finishRecentsAnimation(true /* toRecents */, + false /* shouldPip */, null /* onFinishComplete */)); + } } }); anim.addEndListener(success -> { @@ -3706,14 +3797,13 @@ public abstract class RecentsView< * @param duration duration of the animation * @param dismissingForSplitSelection task dismiss animation is used for entering split * selection state from app icon - * @param gridEndData used to compute any gap left between the end of the - * grid and the clear all button. + * @param isExpressiveDismiss runs expressive animations controlled via + * {@link RecentsDismissUtils} */ public void createTaskDismissAnimation(PendingAnimation anim, @Nullable TaskView dismissedTaskView, boolean animateTaskView, boolean shouldRemoveTask, long duration, - boolean dismissingForSplitSelection, - @Nullable RecentsDismissUtils.GridEndData gridEndData) { + boolean dismissingForSplitSelection, boolean isExpressiveDismiss) { if (mPendingAnimation != null) { mPendingAnimation.createPlaybackController().dispatchOnCancel().dispatchOnEnd(); } @@ -3732,7 +3822,7 @@ public abstract class RecentsView< // Grid specific properties. boolean isFocusedTaskDismissed = false; boolean isStagingFocusedTask = false; - boolean isSlidingTasks; + boolean isSlidingTasks = false; TaskView nextFocusedTaskView = null; boolean nextFocusedTaskFromTop = false; float dismissedTaskWidth = 0; @@ -3792,73 +3882,160 @@ public abstract class RecentsView< float dismissTranslationInterpolationEnd = 1; boolean closeGapBetweenClearAll = false; boolean isClearAllHidden = isClearAllHidden(); + boolean snapToLastTask = false; + boolean isLeftRightSplit = + mContainer.getDeviceProfile().isLeftRightSplit && isSplitSelectionActive(); + TaskView lastGridTaskView = showAsGrid ? getLastGridTaskView() : null; + int currentPageScroll = getScrollForPage(mCurrentPage); + int lastGridTaskScroll = getScrollForPage(indexOfChild(lastGridTaskView)); + boolean currentPageSnapsToEndOfGrid = currentPageScroll == lastGridTaskScroll; - if (gridEndData == null) { - gridEndData = mDismissUtils.getGridEndData(dismissedTaskView, - false /* isExpressiveDismiss */, isFocusedTaskDismissed, nextFocusedTaskView, - isStagingFocusedTask, nextFocusedTaskFromTop, nextFocusedTaskWidth); + int topGridRowSize = mTopRowIdSet.size(); + int numLargeTiles = mUtils.getLargeTileCount(); + int bottomGridRowSize = taskCount - mTopRowIdSet.size() - numLargeTiles; + boolean topRowLonger = topGridRowSize > bottomGridRowSize; + boolean bottomRowLonger = bottomGridRowSize > topGridRowSize; + boolean dismissedTaskFromTop = mTopRowIdSet.contains(dismissedTaskViewId); + boolean dismissedTaskFromBottom = !dismissedTaskFromTop && !isFocusedTaskDismissed; + if (dismissedTaskFromTop || (isFocusedTaskDismissed && nextFocusedTaskFromTop)) { + topGridRowSize--; } - float longGridRowWidthDiff = gridEndData.getGridEndOffset(); - boolean snapToLastTask = gridEndData.getSnapToLastTask(); - float newClearAllShortTotalWidthTranslation = - gridEndData.getNewClearAllShortTotalWidthTranslation(); - boolean currentPageSnapsToEndOfGrid = gridEndData.getCurrentPageSnapsToEndOfGrid(); - if (longGridRowWidthDiff != 0f) { - closeGapBetweenClearAll = true; + if (dismissedTaskFromBottom || (isFocusedTaskDismissed && !nextFocusedTaskFromTop)) { + bottomGridRowSize--; } + int longRowWidth = Math.max(topGridRowSize, bottomGridRowSize) + * (mLastComputedGridTaskSize.width() + mPageSpacing); + if (!enableGridOnlyOverview() && !isStagingFocusedTask) { + longRowWidth += mLastComputedTaskSize.width() + mPageSpacing; + } + // Compensate the removed gap if we don't already have shortTotalCompensation, + // and adjust accordingly to the new shortTotalCompensation after dismiss. + int newClearAllShortTotalWidthTranslation = 0; + if (mClearAllShortTotalWidthTranslation == 0) { + // If first task is not in the expected position (mLastComputedTaskSize) and being too + // close to ClearAllButton, then apply extra translation to ClearAllButton. + int firstTaskStart = mLastComputedGridSize.left + longRowWidth; + int expectedFirstTaskStart = mLastComputedTaskSize.right; + if (firstTaskStart < expectedFirstTaskStart) { + newClearAllShortTotalWidthTranslation = expectedFirstTaskStart - firstTaskStart; + } + } + if (lastGridTaskView != null && ( + (!isExpressiveDismiss && lastGridTaskView.isVisibleToUser()) || (isExpressiveDismiss + && (isTaskViewVisible(lastGridTaskView) + || lastGridTaskView == dismissedTaskView)))) { + // After dismissal, animate translation of the remaining tasks to fill any gap left + // between the end of the grid and the clear all button. Only animate if the clear + // all button is visible or would become visible after dismissal. + float longGridRowWidthDiff = 0; - // After dismissal, animate translation of the remaining tasks to fill any gap left - // between the end of the grid and the clear all button. Only animate if the clear - // all button is visible or would become visible after dismissal. - if (longGridRowWidthDiff != 0) { - // If we need to animate the grid to compensate the clear all gap, we split the - // second half of the dismiss pending animation (in which the non-dismissed tasks - // slide into place) in half again, making the first quarter the existing - // non-dismissal sliding and the second quarter this new animation of gap filling. - // This is due to the fact that PendingAnimation is a single animation, not a - // sequence of animations, so we fake it using interpolation. Stagger the offsets of - // each additional task for a delayed animation. We use half here as this animation is - // half of half of an animation (1/4th). - float halfAdditionalDismissTranslationOffset = - (0.5f * ADDITIONAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET); - dismissTranslationInterpolationEnd = Utilities.boundToRange( - END_DISMISS_TRANSLATION_INTERPOLATION_OFFSET - + (taskCount - 1) * halfAdditionalDismissTranslationOffset, - END_DISMISS_TRANSLATION_INTERPOLATION_OFFSET, 1); - for (TaskView taskView : getTaskViews()) { - anim.setFloat(taskView, TaskView.GRID_END_TRANSLATION_X, - longGridRowWidthDiff, - clampToProgress(LINEAR, dismissTranslationInterpolationEnd, 1)); - dismissTranslationInterpolationEnd = Utilities.boundToRange( - dismissTranslationInterpolationEnd - - halfAdditionalDismissTranslationOffset, - END_DISMISS_TRANSLATION_INTERPOLATION_OFFSET, 1); - if (mEnableDrawingLiveTile && taskView.isRunningTask()) { - anim.addOnFrameCallback(() -> { - runActionOnRemoteHandles(remoteTargetHandle -> - remoteTargetHandle.getTaskViewSimulator() - .taskPrimaryTranslation.value = - TaskView.GRID_END_TRANSLATION_X.get(taskView)); - redrawLiveTile(); - }); + float gapWidth = 0; + if ((topRowLonger && dismissedTaskFromTop) + || (bottomRowLonger && dismissedTaskFromBottom)) { + gapWidth = dismissedTaskWidth; + } else if (nextFocusedTaskView != null + && ((topRowLonger && nextFocusedTaskFromTop) + || (bottomRowLonger && !nextFocusedTaskFromTop))) { + gapWidth = nextFocusedTaskWidth; + } + if (gapWidth > 0) { + if (mClearAllShortTotalWidthTranslation == 0) { + float gapCompensation = gapWidth - newClearAllShortTotalWidthTranslation; + longGridRowWidthDiff += mIsRtl ? -gapCompensation : gapCompensation; + } + if (isClearAllHidden) { + // If ClearAllButton isn't fully shown, snap to the last task. + snapToLastTask = true; + } + } + if (isLeftRightSplit && !isStagingFocusedTask) { + // LastTask's scroll is the minimum scroll in split select, if current scroll is + // beyond that, we'll need to snap to last task instead. + TaskView lastTask = getLastGridTaskView(); + if (lastTask != null) { + int primaryScroll = getPagedOrientationHandler().getPrimaryScroll(this); + int lastTaskScroll = getScrollForPage(indexOfChild(lastTask)); + if ((mIsRtl && primaryScroll < lastTaskScroll) + || (!mIsRtl && primaryScroll > lastTaskScroll)) { + snapToLastTask = true; + } + } + } + if (snapToLastTask) { + longGridRowWidthDiff += getSnapToLastTaskScrollDiff(); + } else if (isLeftRightSplit && currentPageSnapsToEndOfGrid) { + // Use last task as reference point for scroll diff and snapping calculation as it's + // the only invariant point in landscape split screen. + snapToLastTask = true; + } + if (mUtils.getGridTaskCount() == 1 && dismissedTaskView.isGridTask()) { + TaskView lastLargeTile = mUtils.getLastLargeTaskView(); + if (lastLargeTile != null) { + // Calculate the distance to put last large tile back to middle of the screen. + int primaryScroll = getPagedOrientationHandler().getPrimaryScroll(this); + int lastLargeTileScroll = getScrollForPage(indexOfChild(lastLargeTile)); + longGridRowWidthDiff = primaryScroll - lastLargeTileScroll; + + if (!isClearAllHidden) { + // If ClearAllButton is visible, reduce the distance by scroll difference + // between ClearAllButton and the last task. + longGridRowWidthDiff += getLastTaskScroll(/*clearAllScroll=*/0, + getPagedOrientationHandler().getPrimarySize(mClearAllButton)); + } } } - // Change alpha of clear all if translating grid to hide it - if (isClearAllHidden) { - anim.setFloat(mClearAllButton, DISMISS_ALPHA, 0, LINEAR); - anim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - mClearAllButton.setDismissAlpha(1); + // If we need to animate the grid to compensate the clear all gap, we split the second + // half of the dismiss pending animation (in which the non-dismissed tasks slide into + // place) in half again, making the first quarter the existing non-dismissal sliding + // and the second quarter this new animation of gap filling. This is due to the fact + // that PendingAnimation is a single animation, not a sequence of animations, so we + // fake it using interpolation. + if (longGridRowWidthDiff != 0) { + closeGapBetweenClearAll = true; + // Stagger the offsets of each additional task for a delayed animation. We use + // half here as this animation is half of half of an animation (1/4th). + float halfAdditionalDismissTranslationOffset = + (0.5f * ADDITIONAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET); + dismissTranslationInterpolationEnd = Utilities.boundToRange( + END_DISMISS_TRANSLATION_INTERPOLATION_OFFSET + + (taskCount - 1) * halfAdditionalDismissTranslationOffset, + END_DISMISS_TRANSLATION_INTERPOLATION_OFFSET, 1); + for (TaskView taskView : getTaskViews()) { + anim.setFloat(taskView, TaskView.GRID_END_TRANSLATION_X, longGridRowWidthDiff, + clampToProgress(LINEAR, dismissTranslationInterpolationEnd, 1)); + dismissTranslationInterpolationEnd = Utilities.boundToRange( + dismissTranslationInterpolationEnd + - halfAdditionalDismissTranslationOffset, + END_DISMISS_TRANSLATION_INTERPOLATION_OFFSET, 1); + if (mEnableDrawingLiveTile && taskView.isRunningTask()) { + anim.addOnFrameCallback(() -> { + runActionOnRemoteHandles( + remoteTargetHandle -> + remoteTargetHandle.getTaskViewSimulator() + .taskPrimaryTranslation.value = + TaskView.GRID_END_TRANSLATION_X.get(taskView)); + redrawLiveTile(); + }); } - }); + } + + // Change alpha of clear all if translating grid to hide it + if (isClearAllHidden) { + anim.setFloat(mClearAllButton, DISMISS_ALPHA, 0, LINEAR); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + mClearAllButton.setDismissAlpha(1); + } + }); + } } } SplitAnimationTimings splitTimings = - AnimUtils.getDeviceOverviewToSplitTimings(mContainer.getDeviceProfile().getDeviceProperties().isTablet()); + AnimUtils.getDeviceOverviewToSplitTimings(mContainer.getDeviceProfile().isTablet); int distanceFromDismissedTask = 1; int slidingTranslation = 0; @@ -3886,12 +4063,14 @@ public abstract class RecentsView< lastTaskViewIndex); int scrollDiff = newScroll[i] - oldScroll[i] + offset; if (scrollDiff != 0) { - translateTaskWhenDismissed( - child, - Math.abs(i - dismissedIndex), - scrollDiff, - anim, - splitTimings); + if (!isExpressiveDismiss) { + translateTaskWhenDismissed( + child, + Math.abs(i - dismissedIndex), + scrollDiff, + anim, + splitTimings); + } if (child instanceof TaskView taskView) { mTaskViewsDismissPrimaryTranslations.put(taskView, scrollDiffPerPage); } @@ -3979,13 +4158,16 @@ public abstract class RecentsView< : finalTranslation + (mIsRtl ? -mLastComputedTaskSize.right : mLastComputedTaskSize.right); } - Animator dismissAnimator = ObjectAnimator.ofFloat(taskView, - taskView.getPrimaryDismissTranslationProperty(), - startTranslation, finalTranslation); - dismissAnimator.setInterpolator( - clampToProgress(dismissInterpolator, animationStartProgress, - animationEndProgress)); - anim.add(dismissAnimator); + // Expressive dismiss will animate the translations of taskViews itself. + if (!isExpressiveDismiss) { + Animator dismissAnimator = ObjectAnimator.ofFloat(taskView, + taskView.getPrimaryDismissTranslationProperty(), + startTranslation, finalTranslation); + dismissAnimator.setInterpolator( + clampToProgress(dismissInterpolator, animationStartProgress, + animationEndProgress)); + anim.add(dismissAnimator); + } mTaskViewsDismissPrimaryTranslations.put(taskView, (int) finalTranslation); distanceFromDismissedTask++; } @@ -4035,17 +4217,12 @@ public abstract class RecentsView< if (success) { mAnyTaskHasBeenDismissed = true; - // Caches the [groupTask] before removing it. As the [deskId] might become - // invalid by [removeViewInLayout] on the [dismissedTaskView] below. It might - // happen before [removeGroupTaskInternal] that runs on a helper thread. - final GroupTask groupTask; - if (shouldRemoveTask && dismissedTaskView != null - && (groupTask = dismissedTaskView.getGroupTask()) != null) { + if (shouldRemoveTask && dismissedTaskView != null) { if (dismissedTaskView.isRunningTask()) { finishRecentsAnimation(true /* toRecents */, false /* shouldPip */, - () -> removeGroupTaskInternal(groupTask)); + () -> removeTaskInternal(dismissedTaskView)); } else { - removeGroupTaskInternal(groupTask); + removeTaskInternal(dismissedTaskView); } mContainer.getStatsLogManager().logger() .withItemInfo(dismissedTaskView.getItemInfo()) @@ -4064,7 +4241,7 @@ public abstract class RecentsView< pageToSnapTo = indexOfChild(mClearAllButton); } else if (isClearAllHidden) { // Snap to focused task if clear all is hidden. - pageToSnapTo = getFirstTaskViewIndex(); + pageToSnapTo = indexOfChild(getFirstTaskView()); } } else { // Get the id of the task view we will snap to based on the current @@ -4082,7 +4259,7 @@ public abstract class RecentsView< } else { // Won't focus next task in split select, so snap to the // first task. - pageToSnapTo = getFirstTaskViewIndex(); + pageToSnapTo = indexOfChild(getFirstTaskView()); calculateScrollDiff = false; } } else { @@ -4131,14 +4308,12 @@ public abstract class RecentsView< mTopRowIdSet.remove(dismissedTaskViewId); if (taskCount == 1) { - if (!isSplitSelectionActive()) { - removeViewInLayout(mClearAllButton); - removeViewInLayout(mAddDesktopButton); - if (isHomeTaskDismissed) { - updateEmptyMessage(); - } else { - startHome(); - } + removeViewInLayout(mClearAllButton); + removeViewInLayout(mAddDesktopButton); + if (isHomeTaskDismissed) { + updateEmptyMessage(); + } else if (!mSplitSelectStateController.isSplitSelectActive()) { + startHome(); } } else { // Update focus task and its size. @@ -4223,7 +4398,7 @@ public abstract class RecentsView< // Update various scroll-dependent UI. dispatchScrollChanged(); updateActionsViewFocusedScroll(); - if (!mContainer.getDeviceProfile().getDeviceProperties().isTablet()) { + if (isClearAllHidden() && !mContainer.getDeviceProfile().isTablet) { mActionsView.updateDisabledFlags(OverviewActionsView.DISABLED_SCROLLING, false); } @@ -4337,7 +4512,7 @@ public abstract class RecentsView< * * Focused view is a single app * * Device is large screen */ - protected void updateCurrentTaskActionsVisibility() { + private void updateCurrentTaskActionsVisibility() { TaskView taskView = getCurrentPageTaskView(); boolean isCurrentSplit = taskView instanceof GroupedTaskView; GroupedTaskView groupedTaskView = isCurrentSplit ? (GroupedTaskView) taskView : null; @@ -4345,23 +4520,26 @@ public abstract class RecentsView< mActionsView.updateHiddenFlags(HIDDEN_SPLIT_SELECT_ACTIVE, isSplitSelectionActive()); // Update flags to see if actions bar should show buttons for a single task or a pair of // tasks. - boolean canSaveAppPair = isCurrentSplit - && !mIs3PLauncher - && getSplitSelectController().getAppPairsController().canSaveAppPair( - groupedTaskView); + boolean canSaveAppPair = isCurrentSplit && supportsAppPairs() && + getSplitSelectController().getAppPairsController().canSaveAppPair(groupedTaskView); mActionsView.updateForGroupedTask(isCurrentSplit, canSaveAppPair); boolean isCurrentDesktop = taskView instanceof DesktopTaskView; mActionsView.updateHiddenFlags(HIDDEN_DESKTOP, isCurrentDesktop); } + /** Returns if app pairs are supported in this launcher. Overridden in subclasses. */ + public boolean supportsAppPairs() { + return true; + } + /** * Iterate the grid by columns instead of by TaskView index, starting after the focused task and * up to the last balanced column. * * @return the highest visible TaskView between both rows */ - protected TaskView getHighestVisibleTaskView() { + private TaskView getHighestVisibleTaskView() { if (mTopRowIdSet.isEmpty()) return null; // return earlier TaskView lastVisibleTaskView = null; @@ -4384,31 +4562,34 @@ public abstract class RecentsView< return lastVisibleTaskView; } - protected void removeGroupTaskInternal(@NonNull GroupTask groupTask) { + private void removeTaskInternal(@NonNull TaskView dismissedTaskView) { UI_HELPER_EXECUTOR .getHandler() .post( () -> { - if (groupTask instanceof DesktopTask desktopTask) { - if (areMultiDesksFlagsEnabled()) { - SystemUiProxy.INSTANCE - .get(getContext()) - .removeDesk(desktopTask.getDeskId()); - } else if (DesktopModeFlags - .ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) { - SystemUiProxy.INSTANCE - .get(getContext()) - .removeDefaultDeskInDisplay( - mContainer.getDisplay().getDisplayId()); - } + if (dismissedTaskView instanceof DesktopTaskView desktopTaskView) { + removeDesktopTaskView(desktopTaskView); } else { - for (Task task : groupTask.getTasks()) { - ActivityManagerWrapper.getInstance().removeTask(task.key.id); + for (int taskId : dismissedTaskView.getTaskIds()) { + ActivityManagerWrapper.getInstance().removeTask(taskId); } } }); } + private void removeDesktopTaskView(DesktopTaskView desktopTaskView) { + if (areMultiDesksFlagsEnabled()) { + SystemUiProxy.INSTANCE + .get(getContext()) + .removeDesk(desktopTaskView.getDeskId()); + } else if (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) { + SystemUiProxy.INSTANCE + .get(getContext()) + .removeDefaultDeskInDisplay( + mContainer.getDisplay().getDisplayId()); + } + } + protected void onDismissAnimationEnds() { AccessibilityManagerCompat.sendTestProtocolEventToTest(getContext(), DISMISS_ANIMATION_ENDS_MESSAGE); @@ -4532,25 +4713,24 @@ public abstract class RecentsView< /** Dismisses the entire [taskView]. */ public void dismissTaskView(TaskView taskView, boolean animateTaskView, boolean removeTask) { - if (enableExpressiveDismissTaskMotion() && (!showAsGrid() || enableGridOnlyOverview())) { - mDismissUtils.createTaskDismissSpringAnimation(taskView, removeTask, - false /* isSplitSelection */); - } else { - PendingAnimation pa = new PendingAnimation(DISMISS_TASK_DURATION); - createTaskDismissAnimation(pa, taskView, animateTaskView, removeTask, - DISMISS_TASK_DURATION, false /* dismissingForSplitSelection*/, - null /* gridEndData */); - runDismissAnimation(pa); - } + PendingAnimation pa = new PendingAnimation(DISMISS_TASK_DURATION); + createTaskDismissAnimation(pa, taskView, animateTaskView, removeTask, DISMISS_TASK_DURATION, + false /* dismissingForSplitSelection*/, false /* isExpressiveDismiss */); + runDismissAnimation(pa); + } + + protected void expressiveDismissTaskView(TaskView taskView, Function0 onEndRunnable) { + PendingAnimation pa = new PendingAnimation(DISMISS_TASK_DURATION); + createTaskDismissAnimation(pa, taskView, false /* animateTaskView */, true /* removeTask */, + DISMISS_TASK_DURATION, false /* dismissingForSplitSelection*/, + true /* isExpressiveDismiss */); + pa.addEndListener((success) -> onEndRunnable.invoke()); + runDismissAnimation(pa); } @SuppressWarnings("unused") private void dismissAllTasks(View view) { - if (enableExpressiveDismissTaskMotion()) { - mDismissUtils.dismissAllTasks(); - } else { - runDismissAnimation(createAllTasksDismissAnimation(DISMISS_TASK_DURATION)); - } + runDismissAnimation(createAllTasksDismissAnimation(DISMISS_TASK_DURATION)); mContainer.getStatsLogManager().logger().log(LAUNCHER_TASK_CLEAR_ALL); } @@ -4573,21 +4753,14 @@ public abstract class RecentsView< return super.dispatchKeyEvent(event); } - if (mUtils.taskMenuIsOpen()) { + if (mUtils.shouldInterceptKeyEvent(event)) { return super.dispatchKeyEvent(event); } switch (event.getKeyCode()) { - case KeyEvent.KEYCODE_TAB: { - View currentFocus = findFocus(); - if (currentFocus == null) return super.dispatchKeyEvent(event); - - View nextFocus = focusSearch(currentFocus, - event.isShiftPressed() ? FOCUS_BACKWARD : FOCUS_FORWARD); - if (nextFocus != null) { - return nextFocus.requestFocus(); - } - } + case KeyEvent.KEYCODE_TAB: + return snapToPageRelative(event.isShiftPressed() ? -1 : 1, true /* cycle */, + TaskGridNavHelper.TaskNavDirection.TAB); case KeyEvent.KEYCODE_DPAD_RIGHT: return snapToPageRelative(mIsRtl ? -1 : 1, true /* cycle */, TaskGridNavHelper.TaskNavDirection.RIGHT); @@ -4640,8 +4813,6 @@ public abstract class RecentsView< if (alpha == mContentAlpha) { return; } - - traceBegin(Trace.TRACE_TAG_APP, "RecentsView.setContentAlpha"); alpha = Utilities.boundToRange(alpha, 0, 1); mContentAlpha = alpha; @@ -4663,7 +4834,6 @@ public abstract class RecentsView< } else if (!mFreezeViewVisibility) { setVisibility(INVISIBLE); } - traceEnd(Trace.TRACE_TAG_APP); } /** @@ -4710,12 +4880,9 @@ public abstract class RecentsView< } public void reapplyActiveRotation() { - RotationTouchHelper rotationTouchHelper = RotationTouchHelper.REPOSITORY_INSTANCE.get( - getContext()).get(mContainer.getDisplayId()); - if (rotationTouchHelper != null) { - setLayoutRotation(rotationTouchHelper.getCurrentActiveRotation(), - rotationTouchHelper.getDisplayRotation()); - } + RotationTouchHelper rotationTouchHelper = RotationTouchHelper.INSTANCE.get(getContext()); + setLayoutRotation(rotationTouchHelper.getCurrentActiveRotation(), + rotationTouchHelper.getDisplayRotation()); } public void setLayoutRotation(int touchRotation, int displayRotation) { @@ -4742,21 +4909,15 @@ public abstract class RecentsView< return getTaskViewAt(getRunningTaskIndex() - 1); } - @Nullable - public TaskView getFirstNonDesktopTaskView() { - return mUtils.getFirstNonDesktopTaskView(); - } - - @Nullable - public TaskView getLastDesktopTaskView() { - return mUtils.getLastDesktopTaskView(); - } - @Nullable public TaskView getLastLargeTaskView() { return mUtils.getLastLargeTaskView(); } + public int getLargeTilesCount() { + return mUtils.getLargeTileCount(); + } + @Nullable public TaskView getCurrentPageTaskView() { return getTaskViewAt(getCurrentPage()); @@ -4767,14 +4928,6 @@ public abstract class RecentsView< return getTaskViewAt(getNextPage()); } - protected int getCurrentPageScrollDiff() { - return mCurrentPageScrollDiff; - } - - protected void setCurrentPageScrollDiff(int currentPageScrollDiff) { - mCurrentPageScrollDiff = currentPageScrollDiff; - } - @Nullable public TaskView getTaskViewNearestToCenterOfScreen() { return getTaskViewAt(getPageNearestToCenterOfScreen()); @@ -4801,7 +4954,7 @@ public abstract class RecentsView< } public void updateEmptyMessage() { - boolean isEmpty = !hasTaskViews() && !isSplitSelectionActive(); + boolean isEmpty = !hasTaskViews(); boolean hasSizeChanged = mLastMeasureSize.x != getWidth() || mLastMeasureSize.y != getHeight(); if (isEmpty == mShowEmptyMessage && !hasSizeChanged) { @@ -4864,6 +5017,9 @@ public abstract class RecentsView< * than the running task, when updating page offsets. */ public void setOffsetMidpointIndexOverride(int offsetMidpointIndexOverride) { + if (!enableAdditionalHomeAnimations()) { + return; + } mOffsetMidpointIndexOverride = offsetMidpointIndexOverride; updatePageOffsets(); } @@ -4895,14 +5051,8 @@ public abstract class RecentsView< float leftOffsetSize = midpoint - 1 >= 0 ? getHorizontalOffsetSize(midpoint - 1, midpoint, offset) : 0; - int rightOffsetReferenceIndex; - if (areMultiDesksFlagsEnabled() && midpoint == INVALID_PAGE) { - rightOffsetReferenceIndex = getFirstViewIndex(); - } else { - rightOffsetReferenceIndex = midpoint + 1; - } - float rightOffsetSize = rightOffsetReferenceIndex >= 0 && rightOffsetReferenceIndex < count - ? getHorizontalOffsetSize(rightOffsetReferenceIndex, midpoint, offset) + float rightOffsetSize = midpoint + 1 < count + ? getHorizontalOffsetSize(midpoint + 1, midpoint, offset) : 0; float modalMidpointOffsetSize = 0; @@ -4958,10 +5108,11 @@ public abstract class RecentsView< float modalTranslation = i == modalMidpoint ? modalMidpointOffsetSize : showAsGrid - ? mIsRtl ? gridOffsetSize : -gridOffsetSize + ? gridOffsetSize : i < modalMidpoint ? modalLeftOffsetSize : modalRightOffsetSize; - boolean skipTranslationOffset = - i == getRunningTaskIndex() && child instanceof DesktopTaskView; + boolean skipTranslationOffset = enableDesktopTaskAlphaAnimation() + && i == getRunningTaskIndex() + && child instanceof DesktopTaskView; float totalTranslationX = (skipTranslationOffset ? 0f : translation) + modalTranslation + carouselHiddenOffsetSize; if (child instanceof TaskView taskView) { @@ -5000,10 +5151,7 @@ public abstract class RecentsView< TaskView taskView = (TaskView) child; outRect.offset(taskView.getPersistentTranslationX(), taskView.getPersistentTranslationY()); - outRect.top += mContainer - .getDeviceProfile() - .getOverviewProfile() - .getTaskThumbnailTopMarginPx(); + outRect.top += mContainer.getDeviceProfile().overviewTaskThumbnailTopMarginPx; mTempMatrix.reset(); float persistentScale = taskView.getPersistentScale(); @@ -5021,8 +5169,7 @@ public abstract class RecentsView< * * @param offsetProgress From 0 to 1 where 0 means no offset and 1 means offset offscreen. */ - protected float getHorizontalOffsetSize(int childIndex, int midpointIndex, - float offsetProgress) { + private float getHorizontalOffsetSize(int childIndex, int midpointIndex, float offsetProgress) { if (offsetProgress == 0) { // Don't bother calculating everything below if we won't offset anyway. return 0; @@ -5124,7 +5271,7 @@ public abstract class RecentsView< if (isTopShift) { distanceToOffscreen = -taskPosition.bottom; } else if (isBottomShift) { - distanceToOffscreen = mContainer.getDeviceProfile().getDeviceProperties().getHeightPx() - taskPosition.top; + distanceToOffscreen = mContainer.getDeviceProfile().heightPx - taskPosition.top; } return distanceToOffscreen * offsetProgress; } @@ -5173,10 +5320,6 @@ public abstract class RecentsView< } } - protected void resetShareUIState() { - mUtils.resetShareUIState(); - } - /** * Primarily used by overview actions to initiate split from focused task, logs the source * of split invocation as such. @@ -5229,7 +5372,7 @@ public abstract class RecentsView< public void handleDesktopTaskInSplitSelectState(PendingAnimation builder, Interpolator deskTopFadeInterPolator) { SplitAnimationTimings timings = AnimUtils.getDeviceOverviewToSplitTimings( - mContainer.getDeviceProfile().getDeviceProperties().isTablet()); + mContainer.getDeviceProfile().isTablet); if (enableLargeDesktopWindowingTile()) { getTaskViews().forEachWithIndexInParent((index, taskView) -> { if (taskView instanceof DesktopTaskView) { @@ -5307,51 +5450,26 @@ public abstract class RecentsView< mSplitHiddenTaskView.updateFullscreenParams(); }); } else if (isInitiatingSplitFromTaskView) { - mSplitHiddenTaskView.setBorderEnabled(false); - // Splitting from Overview for fullscreen task - if (enableExpressiveDismissTaskMotion() - && (!showAsGrid() || enableGridOnlyOverview())) { - runExpressiveSplit(builder, mSplitHiddenTaskView); - } else { - createTaskDismissAnimation(builder, mSplitHiddenTaskView, true, false, duration, - true /* dismissingForSplitSelection*/, null /* gridEndData */); + if (Flags.enableHoverOfChildElementsInTaskview()) { + mSplitHiddenTaskView.setBorderEnabled(false); } + // Splitting from Overview for fullscreen task + createTaskDismissAnimation(builder, mSplitHiddenTaskView, true, false, duration, + true /* dismissingForSplitSelection*/, false /* isExpressiveDismiss */); } else { // Splitting from Home TaskView currentPageTaskView = getTaskViewAt(mCurrentPage); // When current page is a Desktop task it needs special handling to // display correct animation in split mode if (currentPageTaskView instanceof DesktopTaskView) { - if (enableExpressiveDismissTaskMotion() - && (!showAsGrid() || enableGridOnlyOverview())) { - runExpressiveSplit(builder, /* taskView= */ null); - } else { - createTaskDismissAnimation(builder, null, true, false, duration, - true /* dismissingForSplitSelection*/, null /* gridEndData */); - } + createTaskDismissAnimation(builder, null, true, false, duration, + true /* dismissingForSplitSelection*/, false /* isExpressiveDismiss */); } else { createInitialSplitSelectAnimation(builder); } } } - private void runExpressiveSplit(PendingAnimation builder, @Nullable TaskView taskView) { - createInitialSplitSelectAnimation(builder); - AtomicBoolean hasRunDismiss = new AtomicBoolean(false); - builder.addOnFrameListener((animator) -> { - SplitAnimationTimings splitTimings = - AnimUtils.getDeviceOverviewToSplitTimings( - mContainer.getDeviceProfile().getDeviceProperties().isTablet()); - if (animator.getAnimatedFraction() > splitTimings.getGridSlideStartOffset() - && !hasRunDismiss.get()) { - mDismissUtils.createTaskDismissSpringAnimation( - taskView, false /* shouldRemoveTaskView */, - true /* isSplitSelection */); - hasRunDismiss.set(true); - } - }); - } - /** * Confirms the selection of the next split task. The extra data is passed through because the * user may be selecting a subtask in a group. @@ -5407,7 +5525,7 @@ public abstract class RecentsView< Rect firstTaskStartingBounds = new Rect(); Rect firstTaskEndingBounds = mTempRect; - boolean isTablet = mContainer.getDeviceProfile().getDeviceProperties().isTablet(); + boolean isTablet = mContainer.getDeviceProfile().isTablet; SplitAnimationTimings timings = AnimUtils.getDeviceSplitToConfirmTimings(isTablet); PendingAnimation pendingAnimation = new PendingAnimation(timings.getDuration()); @@ -5464,7 +5582,7 @@ public abstract class RecentsView< } @SuppressLint("WrongCall") - private void resetFromSplitSelectionState() { + protected void resetFromSplitSelectionState() { safeRemoveDragLayerView(mSplitSelectStateController.getFirstFloatingTaskView()); safeRemoveDragLayerView(mSecondFloatingTaskView); safeRemoveDragLayerView(mSplitSelectStateController.getSplitInstructionsView()); @@ -5487,7 +5605,7 @@ public abstract class RecentsView< if (mSplitHiddenTaskViewIndex == -1) { return; } - if (!mContainer.getDeviceProfile().getDeviceProperties().isTablet()) { + if (!mContainer.getDeviceProfile().isTablet) { int pageToSnapTo = mCurrentPage; if (mSplitHiddenTaskViewIndex <= pageToSnapTo) { pageToSnapTo += 1; @@ -5511,11 +5629,6 @@ public abstract class RecentsView< } mSplitHiddenTaskView = null; } - - // Recents doesn't receive activity callback, so we cleanup manually - if (mContainer instanceof RecentsWindowManager manager) { - manager.cleanupRecentsWindow(); - } } private void safeRemoveDragLayerView(@Nullable View viewToRemove) { @@ -5537,11 +5650,11 @@ public abstract class RecentsView< int direction = orientationHandler.getSplitTranslationDirectionFactor( splitPosition, deviceProfile); - if (deviceProfile.getDeviceProperties().isTablet() && deviceProfile.isLeftRightSplit) { + if (deviceProfile.isTablet && deviceProfile.isLeftRightSplit) { // Only shift TaskViews if there is not enough space on the side of // mLastComputedTaskSize to minimize motion. int sideSpace = mIsRtl - ? deviceProfile.getDeviceProperties().getWidthPx() - mLastComputedTaskSize.right + ? deviceProfile.widthPx - mLastComputedTaskSize.right : mLastComputedTaskSize.left; int extraSpace = splitPlaceholderSize + mPageSpacing - sideSpace; if (extraSpace <= 0f) { @@ -5828,8 +5941,7 @@ public abstract class RecentsView< finishRecentsAnimation(false /* toRecents */, null); onTaskLaunchAnimationEnd(true /* success */); } else { - finishRecentsAnimation(true /* toRecents */, - () -> taskView.launchWithoutAnimation(this::onTaskLaunchAnimationEnd)); + taskView.launchWithoutAnimation(this::onTaskLaunchAnimationEnd); } mContainer.getStatsLogManager().logger().withItemInfo(taskView.getItemInfo()) .log(LAUNCHER_TASK_LAUNCH_SWIPE_DOWN); @@ -5865,11 +5977,6 @@ public abstract class RecentsView< } } - @Override - protected void pageBeginTransition() { - super.pageBeginTransition(); - } - @Override protected String getCurrentPageDescription() { return ""; @@ -5877,19 +5984,36 @@ public abstract class RecentsView< @Override public void addChildrenForAccessibility(ArrayList outChildren) { - outChildren.addAll(mUtils.getAccessibilityChildren()); + outChildren.addAll(getAccessibilityChildren()); + } + + public List getAccessibilityChildren() { + return mUtils.getAccessibilityChildren(); } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); - // We only care about TaskView's for the `CollectionInfo` that Talkback uses to read out. final AccessibilityNodeInfo.CollectionInfo collectionInfo = new AccessibilityNodeInfo.CollectionInfo( - 1, getTaskViewCount(), false); + 1, getAccessibilityChildren().size(), false); info.setCollectionInfo(collectionInfo); } + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setScrollable(hasTaskViews()); + + if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { + final List accessibilityChildren = getAccessibilityChildren(); + final int[] visibleTasks = getVisibleChildrenRange(); + event.setFromIndex(accessibilityChildren.indexOf(getChildAt(visibleTasks[1]))); + event.setToIndex(accessibilityChildren.indexOf(getChildAt(visibleTasks[0]))); + event.setItemCount(accessibilityChildren.size()); + } + } + @Override public CharSequence getAccessibilityClassName() { // To hear position-in-list related feedback from Talkback. @@ -5923,6 +6047,7 @@ public abstract class RecentsView< return mRemoteTargetHandles; } + // TODO: To be removed in a follow up CL public void setRecentsAnimationTargets(RecentsAnimationController recentsAnimationController, RecentsAnimationTargets recentsAnimationTargets) { Log.d(TAG, "setRecentsAnimationTargets " @@ -5934,19 +6059,15 @@ public abstract class RecentsView< return; } - boolean forDesktop; - if (DesktopModeStatus.enableMultipleDesktops(getContext())) { - forDesktop = mActiveGestureGroupedTaskInfo != null - && mActiveGestureGroupedTaskInfo.isBaseType(GroupedTaskInfo.TYPE_DESK); - } else { - forDesktop = recentsAnimationTargets.hasDesktopTasks(mContext); - } - RemoteTargetGluer gluer = new RemoteTargetGluer(getContext(), getContainerInterface(), - recentsAnimationTargets, forDesktop); - if (forDesktop) { + RemoteTargetGluer gluer; + if (recentsAnimationTargets.hasDesktopTasks(mContext)) { + gluer = new RemoteTargetGluer(getContext(), getSizeStrategy(), recentsAnimationTargets, + true /* forDesktop */); mRemoteTargetHandles = gluer.assignTargetsForDesktop( - recentsAnimationTargets, /* transitionInfo = */ null); + recentsAnimationTargets, /* transitionInfo= */ null); } else { + gluer = new RemoteTargetGluer(getContext(), getSizeStrategy(), recentsAnimationTargets, + false); mRemoteTargetHandles = gluer.assignTargetsForSplitScreen(recentsAnimationTargets); } mSplitBoundsConfig = gluer.getSplitBounds(); @@ -5956,7 +6077,7 @@ public abstract class RecentsView< // mSyncTransactionApplier doesn't get transferred over runActionOnRemoteHandles(remoteTargetHandle -> { final TransformParams params = remoteTargetHandle.getTransformParams(); - if (mContainer instanceof RecentsWindowManager manager) { + if (RecentsWindowFlags.Companion.getEnableOverviewInWindow()) { params.setHomeBuilderProxy((builder, app, transformParams) -> { mTmpMatrix.setScale( 1f, 1f, app.localBounds.exactCenterX(), app.localBounds.exactCenterY()); @@ -6003,12 +6124,19 @@ public abstract class RecentsView< finishRecentsAnimation(toRecents, true /* shouldPip */, onFinishComplete); } + /** + * Finish recents animation. + */ + public void finishRecentsAnimation(boolean toRecents, boolean shouldPip, + @Nullable Runnable onFinishComplete) { + finishRecentsAnimation(toRecents, shouldPip, false, onFinishComplete); + } /** * NOTE: Whatever value gets passed through to the toRecents param may need to also be set on * {@link #mRecentsAnimationController#setWillFinishToHome}. */ public void finishRecentsAnimation(boolean toRecents, boolean shouldPip, - @Nullable Runnable onFinishComplete) { + boolean allAppTargetsAreTranslucent, @Nullable Runnable onFinishComplete) { Log.d(TAG, "finishRecentsAnimation - mRecentsAnimationController: " + mRecentsAnimationController); // TODO(b/197232424#comment#10) Move this back into onRecentsAnimationComplete(). Maybe? @@ -6022,7 +6150,7 @@ public abstract class RecentsView< } final boolean sendUserLeaveHint = toRecents && shouldPip; - if (sendUserLeaveHint && !PipFlags.isPip2ExperimentEnabled()) { + if (sendUserLeaveHint && !com.android.wm.shell.Flags.enablePip2()) { // Notify the SysUI to use fade-in animation when entering PiP from live tile. // Note: PiP2 handles entering differently, so skip if enable_pip2=true. final SystemUiProxy systemUiProxy = SystemUiProxy.INSTANCE.get(getContext()); @@ -6041,10 +6169,7 @@ public abstract class RecentsView< tx, null /* overlay */); } } - if (enableOverviewBackgroundWallpaperBlur()) { - mBlurUtils.setDrawLiveTileBelowRecents(false); - } - mRecentsAnimationController.finish(toRecents, () -> { + mRecentsAnimationController.finish(toRecents, allAppTargetsAreTranslucent, () -> { if (onFinishComplete != null) { onFinishComplete.run(); } @@ -6115,9 +6240,9 @@ public abstract class RecentsView< } protected int getClearAllExtraPageSpacing() { - OverviewProfile overviewProfile = mContainer.getDeviceProfile().getOverviewProfile(); return showAsGrid() - ? Math.max(overviewProfile.getGridSideMargin() - mPageSpacing, 0) : 0; + ? Math.max(mContainer.getDeviceProfile().overviewGridSideMargin - mPageSpacing, 0) + : 0; } @Override @@ -6368,12 +6493,6 @@ public abstract class RecentsView< private int getOffsetFromScrollPosition( int pageIndex, IntArray topRowIdArray, IntArray bottomRowIdArray) { - return getOffsetFromScrollPosition(pageIndex, topRowIdArray, bottomRowIdArray, - /* removedPageIndex= */ INVALID_PAGE); - } - - protected int getOffsetFromScrollPosition(int pageIndex, IntArray topRowIdArray, - IntArray bottomRowIdArray, int removedPageIndex) { if (!showAsGrid()) { return 0; } @@ -6388,12 +6507,7 @@ public abstract class RecentsView< return 0; } - int lastGridTaskViewIndex = indexOfChild(lastGridTaskView); - // When computing offset, account for a removed page if provided. - if (removedPageIndex != INVALID_PAGE && removedPageIndex < lastGridTaskViewIndex) { - lastGridTaskViewIndex--; - } - if (getScrollForPage(pageIndex) != getScrollForPage(lastGridTaskViewIndex)) { + if (getScrollForPage(pageIndex) != getScrollForPage(indexOfChild(lastGridTaskView))) { return 0; } @@ -6432,13 +6546,6 @@ public abstract class RecentsView< && !taskView.isLargeTile(); } - /** - * @return true if the task in on the top of the grid - */ - public boolean isOnGridTopRow(TaskView taskView) { - return showAsGrid() && mTopRowIdSet.contains(taskView.getTaskViewId()); - } - public Consumer getEventDispatcher(float navbarRotation) { float degreesRotated; if (navbarRotation == 0) { @@ -6604,10 +6711,9 @@ public abstract class RecentsView< getCurrentPageTaskView().setModalness(modalness); } // Only show actions view when it's modal for in-place landscape mode. - mActionsView.updateHiddenFlags( - HIDDEN_NON_ZERO_ROTATION, modalness < 1 - && mOrientationState.shouldHideActionButtons() - ); + boolean inPlaceLandscape = !mOrientationState.isRecentsActivityRotationAllowed() + && mOrientationState.getTouchRotation() != ROTATION_0; + mActionsView.updateHiddenFlags(HIDDEN_NON_ZERO_ROTATION, modalness < 1 && inPlaceLandscape); } @Nullable @@ -6627,10 +6733,16 @@ public abstract class RecentsView< return mTaskOverlayFactory; } - public BaseContainerInterface getContainerInterface() { - return mContainerInterface; + public BaseContainerInterface getSizeStrategy() { + return mSizeStrategy; } + + /** + * Returns the container interface + */ + protected abstract BaseContainerInterface getContainerInterface(int displayId); + /** * Set all the task views to color tint scrim mode, dimming or tinting them all. Allows the * tasks to be dimmed while other elements in the recents view are left alone. @@ -6681,7 +6793,7 @@ public abstract class RecentsView< /** Returns {@code true} if the overview tasks are displayed as a grid. */ public boolean showAsGrid() { return mOverviewGridEnabled || (mCurrentGestureEndTarget != null - && mContainerInterface.stateFromGestureEndTarget(mCurrentGestureEndTarget) + && mSizeStrategy.stateFromGestureEndTarget(mCurrentGestureEndTarget) .displayOverviewTasksAsGrid(mContainer.getDeviceProfile())); } @@ -6711,14 +6823,6 @@ public abstract class RecentsView< * Adds a listener for scroll changes */ public void addOnScrollChangedListener(OnScrollChangedListener listener) { - if (mScrollListeners.contains(listener)) { - if (BuildConfigs.IS_STUDIO_BUILD) { - throw new IllegalStateException( - "Should not add duplicated OnScrollChangedListener"); - } else { - mScrollListeners.remove(listener); - } - } mScrollListeners.add(listener); } @@ -6849,11 +6953,11 @@ public abstract class RecentsView< super.requestChildFocus(child, focused); } - protected void dispatchScrollChanged() { + private void dispatchScrollChanged() { runActionOnRemoteHandles(remoteTargetHandle -> remoteTargetHandle.getTaskViewSimulator().setScroll(getScrollOffset())); for (int i = mScrollListeners.size() - 1; i >= 0; i--) { - mScrollListeners.valueAt(i).onScrollChanged(); + mScrollListeners.get(i).onScrollChanged(); } } @@ -6893,16 +6997,78 @@ public abstract class RecentsView< public void onExpandPip() { MAIN_EXECUTOR.execute(() -> { if (mRecentsView == null - || mRecentsView.mContainerInterface.getTaskbarController() == null) { + || mRecentsView.mSizeStrategy.getTaskbarController() == null) { return; } // Hide the task bar when leaving PiP to prevent it from flickering once // the app settles in full-screen mode. - mRecentsView.mContainerInterface.getTaskbarController().onExpandPip(); + mRecentsView.mSizeStrategy.getTaskbarController().onExpandPip(); }); } } + @Override + public void onCanCreateDesksChanged(boolean canCreateDesks) { + // TODO: b/389209338 - update the AddDesktopButton's visibility on this. + } + + @Override + public void onDeskAdded(int displayId, int deskId) { + // Ignore desk changes that don't belong to this display. + if (displayId != mContainer.getDisplay().getDisplayId()) { + return; + } + + if (mUtils.getDesktopTaskViewForDeskId(deskId) != null) { + Log.e(TAG, "A task view for this desk has already been added."); + return; + } + + TaskView currentTaskView = getTaskViewAt(mCurrentPage); + + // We assume that a newly added desk is always empty and gets added to the left of the + // `AddNewDesktopButton`. + DesktopTaskView desktopTaskView = + (DesktopTaskView) getTaskViewFromPool(TaskViewType.DESKTOP); + desktopTaskView.bind(new DesktopTask(deskId, displayId, new ArrayList<>()), + mOrientationState, mTaskOverlayFactory); + + Objects.requireNonNull(mAddDesktopButton); + final int insertionIndex = 1 + indexOfChild(mAddDesktopButton); + addView(desktopTaskView, insertionIndex); + + updateTaskSize(); + mUtils.updateChildTaskOrientations(); + updateScrollSynchronously(); + + // Set Current Page based on the stored TaskView. + if (currentTaskView != null) { + setCurrentPage(indexOfChild(currentTaskView)); + } + } + + @Override + public void onDeskRemoved(int displayId, int deskId) { + // Ignore desk changes that don't belong to this display. + if (displayId != mContainer.getDisplay().getDisplayId()) { + return; + } + + // We need to distinguish between desk removals that are triggered from outside of overview + // vs. the ones that were initiated from overview by dismissing the corresponding desktop + // task view. + var taskView = mUtils.getDesktopTaskViewForDeskId(deskId); + if (taskView != null) { + dismissTaskView(taskView, true, true); + } + } + + @Override + public void onActiveDeskChanged(int displayId, int newActiveDesk, int oldActiveDesk) { + // TODO: b/400870600 - We may need to add code here to special case when an empty desk gets + // activated, since `RemoteDesktopLaunchTransitionRunner` doesn't always get triggered. + } + /** Get the color used for foreground scrimming the RecentsView for sharing. */ public static int getForegroundScrimDimColor(Context context) { return context.getColor(R.color.overview_foreground_scrim_color); @@ -6941,7 +7107,7 @@ public abstract class RecentsView< public void moveTaskToDesktop(TaskContainer taskContainer, DesktopModeTransitionSource transitionSource, Runnable successCallback) { - if (!DesktopModeStatus.canEnterDesktopMode(mContext)) { + if (!DesktopModeStatus.canEnterDesktopMode(getContext())) { return; } switchToScreenshot(() -> finishRecentsAnimation(/* toRecents= */true, /* shouldPip= */false, @@ -6974,7 +7140,6 @@ public abstract class RecentsView< return; } mDesktopRecentsTransitionController.moveToExternalDisplay(taskContainer.getTask().key.id); - dismissTaskView(taskContainer.getTaskView(), /*animate*/true, /*removeTask*/false); successCallback.run(); } @@ -6997,19 +7162,26 @@ public abstract class RecentsView< } } + private int getFontWeight() { + int fontWeightAdjustment = getResources().getConfiguration().fontWeightAdjustment; + if (fontWeightAdjustment != Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED) { + return Typeface.Builder.NORMAL_WEIGHT + fontWeightAdjustment; + } + return Typeface.Builder.NORMAL_WEIGHT; + } + /** - * Runs the spring animations as a task dismisses or settles back into its place in overview. + * Creates the spring animations which run as a task settles back into its place in overview. * *

When a task dismiss is cancelled, the task will return to its original position via a * spring animation. As it passes the threshold of its settling state, its neighbors will * spring in response to the perceived impact of the settling task. */ - public RecentsDismissUtils.SpringSet runTaskDismissSettlingSpringAnimation( - TaskView draggedTaskView, boolean isDismissing, - RecentsDismissUtils.DismissedTaskData dismissedTaskData, boolean shouldRemoveTaskView, - boolean isSplitSelection) { - return mDismissUtils.createTaskDismissSpringAnimation(draggedTaskView, isDismissing, - dismissedTaskData, shouldRemoveTaskView, isSplitSelection); + public SpringAnimation createTaskDismissSettlingSpringAnimation(TaskView draggedTaskView, + float velocity, boolean isDismissing, int dismissLength, + Function0 onEndRunnable) { + return mDismissUtils.createTaskDismissSettlingSpringAnimation(draggedTaskView, velocity, + isDismissing, dismissLength, onEndRunnable); } /** @@ -7024,15 +7196,13 @@ public abstract class RecentsView< } /** - * Draws the remote animation targets above the recents view. + * Sets whether the remote animation targets should draw below the recents view. * + * @param drawBelowRecents whether the surface should draw below Recents. * @param remoteTargetHandles collection of remoteTargetHandles in Recents. */ - public void setDrawAboveRecents(RemoteTargetHandle[] remoteTargetHandles) { - mBlurUtils.setDrawAboveRecents(remoteTargetHandles); - } - - public Map getTaskViewsDismissPrimaryTranslations() { - return mTaskViewsDismissPrimaryTranslations; + public void setDrawBelowRecents(boolean drawBelowRecents, + RemoteTargetHandle[] remoteTargetHandles) { + mBlurUtils.setDrawBelowRecents(drawBelowRecents, remoteTargetHandles); } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index 031158d886..e61d402698 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -32,8 +32,6 @@ import com.android.launcher3.logger.LauncherAtom; import com.android.launcher3.taskbar.TaskbarUIController; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.ScrimView; -import com.android.quickstep.BaseContainerInterface; -import com.android.quickstep.util.SplitSelectStateController; /** * Interface to be implemented by the parent view of RecentsView @@ -59,11 +57,6 @@ public interface RecentsViewContainer extends ActivityContext { */ ScrimView getScrimView(); - /** - * Returns the BaseContainerInterface to interact with RecentsViewContainer. - */ - > T getContainerInterface(); - /** * Returns the Overview Panel as a View */ @@ -174,7 +167,7 @@ public interface RecentsViewContainer extends ActivityContext { * Enter staged split directly from the current running app. * @param leftOrTop if the staged split will be positioned left or top. */ - default void enterStageSplitFromRunningApp(boolean leftOrTop, int displayId) {} + default void enterStageSplitFromRunningApp(boolean leftOrTop){} /** * Overwrites any logged item in Launcher that doesn't have a container with the @@ -205,9 +198,4 @@ public interface RecentsViewContainer extends ActivityContext { void setTaskbarUIController(@Nullable TaskbarUIController taskbarUIController); @Nullable TaskbarUIController getTaskbarUIController(); - - /** - * Returns the Split Select State Controller - */ - SplitSelectStateController getSplitSelectStateController(); } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewModelHelper.kt b/quickstep/src/com/android/quickstep/views/RecentsViewModelHelper.kt index d420bc056e..ff711da70f 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewModelHelper.kt +++ b/quickstep/src/com/android/quickstep/views/RecentsViewModelHelper.kt @@ -21,6 +21,7 @@ import com.android.quickstep.ViewUtils import com.android.quickstep.recents.viewmodel.RecentsViewModel import com.android.systemui.shared.recents.model.ThumbnailData import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -43,10 +44,10 @@ class RecentsViewModelHelper( // Update recentsViewModel and apply the thumbnailOverride ASAP, before waiting inside // viewAttachedScope. recentsViewModel.setRunningTaskShowScreenshot(true) - recentsCoroutineScope.launch(dispatcherProvider.lightweightBackground) { + recentsCoroutineScope.launch(dispatcherProvider.background) { recentsViewModel.waitForRunningTaskShowScreenshotToUpdate() recentsViewModel.waitForThumbnailsToUpdate(updatedThumbnails) - withContext(dispatcherProvider.main) { + withContext(Dispatchers.Main.immediate) { ViewUtils.postFrameDrawn(taskView, onFinishRunnable) } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt index abd9787e5b..b265b13393 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt +++ b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt @@ -16,53 +16,32 @@ package com.android.quickstep.views -import android.animation.AnimatorSet -import android.animation.ObjectAnimator import android.graphics.PointF import android.graphics.Rect import android.util.FloatProperty -import android.util.Log -import android.util.Property +import android.view.KeyEvent import android.view.View import android.view.View.LAYOUT_DIRECTION_LTR import android.view.View.LAYOUT_DIRECTION_RTL import androidx.core.view.children -import androidx.core.view.isInvisible -import androidx.dynamicanimation.animation.FloatPropertyCompat -import androidx.dynamicanimation.animation.SpringAnimation -import androidx.dynamicanimation.animation.SpringForce import com.android.launcher3.AbstractFloatingView.TYPE_TASK_MENU import com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType -import com.android.launcher3.Flags.enableDesktopExplodedView +import com.android.launcher3.Flags.enableGridOnlyOverview import com.android.launcher3.Flags.enableLargeDesktopWindowingTile -import com.android.launcher3.Flags.enableOverviewOnConnectedDisplays -import com.android.launcher3.PagedView.INVALID_PAGE -import com.android.launcher3.R +import com.android.launcher3.Flags.enableOverviewIconMenu +import com.android.launcher3.Flags.enableSeparateExternalDisplayTasks import com.android.launcher3.Utilities.getPivotsForScalingRectToRect import com.android.launcher3.statehandlers.DesktopVisibilityController import com.android.launcher3.statehandlers.DesktopVisibilityController.Companion.INACTIVE_DESK_ID -import com.android.launcher3.statemanager.BaseState import com.android.launcher3.util.IntArray -import com.android.launcher3.util.OverviewReleaseFlags.enableGridOnlyOverview -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu -import com.android.launcher3.util.window.WindowManagerProxy.DesktopVisibilityListener -import com.android.quickstep.GestureState -import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle import com.android.quickstep.util.DesksUtils.Companion.areMultiDesksFlagsEnabled import com.android.quickstep.util.DesktopTask import com.android.quickstep.util.GroupTask import com.android.quickstep.util.isExternalDisplay -import com.android.quickstep.views.RecentsView.DESKTOP_CAROUSEL_DETACH_PROGRESS -import com.android.quickstep.views.RecentsView.RECENTS_GRID_PROGRESS import com.android.quickstep.views.RecentsView.RUNNING_TASK_ATTACH_ALPHA -import com.android.quickstep.views.RecentsView.TAG -import com.android.quickstep.views.RecentsView.TASK_THUMBNAIL_SPLASH_ALPHA -import com.android.quickstep.views.TaskView.Companion.FLAG_UPDATE_ALL import com.android.systemui.shared.recents.model.Task import com.android.systemui.shared.recents.model.ThumbnailData import com.android.wm.shell.shared.GroupedTaskInfo -import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.enableMultipleDesktops -import java.util.concurrent.CopyOnWriteArrayList import java.util.function.BiConsumer import kotlin.math.min import kotlin.reflect.KMutableProperty1 @@ -71,21 +50,9 @@ import kotlin.reflect.KMutableProperty1 * Helper class for [RecentsView]. This util class contains refactored and extracted functions from * RecentsView to facilitate the implementation of unit tests. */ -class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisibilityListener { +class RecentsViewUtils(private val recentsView: RecentsView<*, *>) { val taskViews = TaskViewsIterable(recentsView) - /** Callback to be invoked when a new desk is added. */ - interface OnDeskAddedListener { - /** - * Called when a new desk is added. - * - * @param desktopTaskView The [DesktopTaskView] of the new desk. - */ - fun onDeskAdded(desktopTaskView: DesktopTaskView) - } - - private val onDeskAddedListeners = CopyOnWriteArrayList() - /** Takes a screenshot of all [taskView] and return map of taskId to the screenshot */ fun screenshotTasks(taskView: TaskView): Map { val recentsAnimationController = recentsView.recentsAnimationController ?: return emptyMap() @@ -140,27 +107,21 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisi /** Returns a list of all large TaskViews [TaskView]s */ fun getLargeTaskViews(): List = taskViews.filter { it.isLargeTile } - /** Returns a list of all non-large TaskViews [TaskView]s */ - fun getSmallTaskViews(): List = taskViews.filter { !it.isLargeTile } - /** Returns all the TaskViews in the top row, without the focused task */ fun getTopRowTaskViews(): List = taskViews.filter { recentsView.mTopRowIdSet.contains(it.taskViewId) } /** Returns all the task Ids in the top row, without the focused task */ - fun getTopRowIdArray(): IntArray = - getTopRowTaskViews().map { it.taskViewId }.toLauncher3IntArray() + fun getTopRowIdArray(): IntArray = getTopRowTaskViews().map { it.taskViewId }.toIntArray() /** Returns all the TaskViews in the bottom row, without the focused task */ fun getBottomRowTaskViews(): List = taskViews.filter { !recentsView.mTopRowIdSet.contains(it.taskViewId) && !it.isLargeTile } /** Returns all the task Ids in the bottom row, without the focused task */ - fun getBottomRowIdArray(): IntArray = - getBottomRowTaskViews().map { it.taskViewId }.toLauncher3IntArray() + fun getBottomRowIdArray(): IntArray = getBottomRowTaskViews().map { it.taskViewId }.toIntArray() - private fun List.toLauncher3IntArray() = - IntArray(size).apply { this@toLauncher3IntArray.forEach(::add) } + private fun List.toIntArray() = IntArray(size).apply { this@toIntArray.forEach(::add) } /** Counts [TaskView]s that are large tiles. */ fun getLargeTileCount(): Int = taskViews.count { it.isLargeTile } @@ -195,8 +156,6 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisi if (enableLargeDesktopWindowingTile()) taskViews.firstOrNull { it !is DesktopTaskView } else taskViews.firstOrNull() - fun getLastDesktopTaskView(): TaskView? = taskViews.lastOrNull { it is DesktopTaskView } - /** * Returns the [TaskView] that should be the current page during task binding, in the following * priorities: @@ -211,7 +170,7 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisi ?: focusedTaskView ?: taskViews.firstOrNull { it !is DesktopTaskView && - (enableOverviewOnConnectedDisplays() || !it.isExternalDisplay) + !(enableSeparateExternalDisplayTasks() && it.isExternalDisplay) } ?: taskViews.lastOrNull() @@ -230,18 +189,22 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisi if (desktopTaskView != null) return recentsView.indexOfChild(desktopTaskView) } val firstTaskViewIndex = recentsView.indexOfChild(getFirstTaskView()) - return if (getDeviceProfile().deviceProperties.isTablet) { + return if (getDeviceProfile().isTablet) { var index = firstTaskViewIndex if (enableLargeDesktopWindowingTile() && runningTaskView !is DesktopTaskView) { // For fullsreen tasks, skip over Desktop tasks in its section index += - if (runningTaskView.isExternalDisplay) { - taskViews.count { it is DesktopTaskView && it.isExternalDisplay } + if (enableSeparateExternalDisplayTasks()) { + if (runningTaskView.isExternalDisplay) { + taskViews.count { it is DesktopTaskView && it.isExternalDisplay } + } else { + taskViews.count { it is DesktopTaskView && !it.isExternalDisplay } + } } else { - taskViews.count { it is DesktopTaskView && !it.isExternalDisplay } + getDesktopTaskViewCount() } } - if (!runningTaskView.isExternalDisplay) { + if (enableSeparateExternalDisplayTasks() && !runningTaskView.isExternalDisplay) { // For main display section, skip over external display tasks index += taskViews.count { it.isExternalDisplay } } @@ -269,102 +232,6 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisi /** Returns the last TaskView that should be displayed as a large tile. */ fun getLastLargeTaskView(): TaskView? = taskViews.lastOrNull { it.isLargeTile } - override fun onCanCreateDesksChanged(canCreateDesks: Boolean) { - recentsView.addDeskButton?.isInvisible = !canCreateDesks - } - - private fun animateDesktopTaskViewSpringIn(desktopTaskView: DesktopTaskView) { - val taskDismissFloatProperty = - FloatPropertyCompat.createFloatPropertyCompat( - desktopTaskView.primaryDismissTranslationProperty - ) - - with(recentsView) { - // Calculate initial translation to bring it offscreen. - val desktopTaskViewIndex = indexOfChild(desktopTaskView) - val midpointIndex = - if (getTaskViewAt(desktopTaskViewIndex + 1) != null) desktopTaskViewIndex + 1 - else INVALID_PAGE - var offscreenTranslationX = - getHorizontalOffsetSize(desktopTaskViewIndex, midpointIndex, 1f) - - // Add 40dp to the offscreen translation. - val additionalOffsetPx = - context.resources.getDimensionPixelSize( - R.dimen.newly_created_desktop_offscreen_position - ) - offscreenTranslationX += if (isRtl) additionalOffsetPx else -additionalOffsetPx - desktopTaskView.primaryDismissTranslationProperty.set( - desktopTaskView, - offscreenTranslationX, - ) - desktopTaskView.isInvisible = false - - val dampingRatio = - context.resources.getFloat(R.dimen.newly_created_desktop_spring_damping_ratio) - val stiffness = - context.resources.getFloat(R.dimen.newly_created_desktop_spring_stiffness) - - SpringAnimation(desktopTaskView, taskDismissFloatProperty) - .setSpring(SpringForce(0f).setDampingRatio(dampingRatio).setStiffness(stiffness)) - .start() - } - } - - override fun onDeskAdded(displayId: Int, deskId: Int) { - with(recentsView) { - // Ignore desk changes that don't belong to this display. - if (displayId != mContainer.displayId) { - return - } - - if (getDesktopTaskViewForDeskId(deskId) != null) { - Log.e(TAG, "A task view for this desk has already been added.") - return - } - - val currentTaskView = currentPageTaskView - - // We assume that a newly added desk is always empty and gets added to the left of the - // `AddNewDesktopButton`. - val desktopTaskView = getTaskViewFromPool(TaskViewType.DESKTOP) as DesktopTaskView - desktopTaskView.bind( - DesktopTask(deskId, displayId, emptyList()), - pagedViewOrientedState, - taskOverlayFactory, - ) - desktopTaskView.isInvisible = true - - val insertionIndex = 1 + indexOfChild(addDeskButton!!) - addView(desktopTaskView, insertionIndex) - updateTaskSize() - updateChildTaskOrientations() - updateScrollSynchronously() - animateDesktopTaskViewSpringIn(desktopTaskView) - - // Set Current Page based on the stored TaskView. - currentTaskView?.let { setCurrentPage(indexOfChild(it)) } - - onDeskAddedListeners.forEach { it.onDeskAdded(desktopTaskView) } - } - } - - override fun onDeskRemoved(displayId: Int, deskId: Int) { - with(recentsView) { - // Ignore desk changes that don't belong to this display. - if (displayId != mContainer.displayId) { - return - } - - // We need to distinguish between desk removals that are triggered from outside of - // overview vs. the ones that were initiated from overview by dismissing the - // corresponding desktop task view. - getDesktopTaskViewForDeskId(deskId)?.let { - dismissTaskView(it, /* animateTaskView= */ true, /* removeTask= */ true) - } - } - } - /** * Gets the list of accessibility children. Currently all the children of RecentsViews are * added, and in the reverse order to the list. @@ -461,7 +328,7 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisi outTopRowRect: Rect, outBottomRowRect: Rect, ) { - if (!getDeviceProfile().deviceProperties.isTablet) { + if (!getDeviceProfile().isTablet) { getRowRect(getFirstTaskView(), getLastTaskView(), outTaskViewRowRect) return } @@ -502,9 +369,9 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisi private fun getTaskMenu(): TaskMenuView? = getTopOpenViewWithType(recentsView.mContainer, TYPE_TASK_MENU) as? TaskMenuView - fun taskMenuIsOpen(): Boolean { + fun shouldInterceptKeyEvent(event: KeyEvent): Boolean { if (enableOverviewIconMenu()) { - return getTaskMenu()?.isOpen == true + return getTaskMenu()?.isOpen == true || event.keyCode == KeyEvent.KEYCODE_TAB } return false } @@ -527,7 +394,7 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisi } fun updateCentralTask() { - val isTablet: Boolean = getDeviceProfile().deviceProperties.isTablet + val isTablet: Boolean = getDeviceProfile().isTablet val actionsViewCanRelateToTaskView = !(isTablet && enableGridOnlyOverview()) val focusedTaskView = recentsView.focusedTaskView val currentPageTaskView = recentsView.currentPageTaskView @@ -610,154 +477,6 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) : DesktopVisi return desktopTaskView } - fun getRunningTaskViewFromGroupTaskInfo(groupedTaskInfo: GroupedTaskInfo) = - if (enableMultipleDesktops(recentsView.context)) { - if (groupedTaskInfo.isBaseType(GroupedTaskInfo.TYPE_DESK)) { - getDesktopTaskViewForDeskId(groupedTaskInfo.deskId) - } else { - val runningTaskIds = groupedTaskInfo.taskInfoList.map { it.taskId }.toIntArray() - val taskView = recentsView.getTaskViewByTaskIds(runningTaskIds) - if (taskView?.type == groupedTaskInfo.getTaskViewType()) taskView else null - } - } else { - if ( - groupedTaskInfo.isBaseType(GroupedTaskInfo.TYPE_DESK) && - groupedTaskInfo.taskInfoList.size == 1 - ) { - recentsView.getTaskViewByTaskId(groupedTaskInfo.taskInfo1!!.taskId) - as? DesktopTaskView - } else { - val runningTaskIds = groupedTaskInfo.taskInfoList.map { it.taskId }.toIntArray() - recentsView.getTaskViewByTaskIds(runningTaskIds) - } - } - - private fun GroupedTaskInfo.getTaskViewType() = - when { - isBaseType(GroupedTaskInfo.TYPE_FULLSCREEN) -> TaskViewType.SINGLE - isBaseType(GroupedTaskInfo.TYPE_SPLIT) -> TaskViewType.GROUPED - isBaseType(GroupedTaskInfo.TYPE_DESK) -> TaskViewType.DESKTOP - else -> null - } - - fun onPrepareGestureEndAnimation( - animatorSet: AnimatorSet, - endTarget: GestureState.GestureEndTarget, - remoteTargetHandles: Array, - isHandlingAtomicEvent: Boolean, - ) { - // Create ObjectAnimator that immediately settles on [endStateValue] when - // [isHandlingAtomicEvent] is true. - fun immediateObjectAnimator( - target: T, - property: Property, - endStateValue: Float, - ) = - if (isHandlingAtomicEvent) - ObjectAnimator.ofFloat(target, property, endStateValue, endStateValue) - else ObjectAnimator.ofFloat(target, property, endStateValue) - - with(recentsView) { - Log.d(TAG, "onPrepareGestureEndAnimation - endTarget: $endTarget") - mCurrentGestureEndTarget = endTarget - val endState: BaseState<*> = mContainerInterface.stateFromGestureEndTarget(endTarget) - - // Starting the desk exploded animation when the gesture from an app is released. - if (enableDesktopExplodedView()) { - animatorSet.play( - ObjectAnimator.ofFloat( - this, - DESK_EXPLODE_PROGRESS, - if (endState.showExplodedDesktopView()) 1f else 0f, - ) - ) - taskViews.filterIsInstance().forEach { - it.remoteTargetHandles = remoteTargetHandles - } - } - - if (endState.displayOverviewTasksAsGrid(getDeviceProfile())) { - updateGridProperties() - animatorSet.play(immediateObjectAnimator(this, RECENTS_GRID_PROGRESS, 1f)) - - val runningTaskView = runningTaskView - var runningTaskGridTranslationX = 0f - var runningTaskGridTranslationY = 0f - if (runningTaskView != null) { - // Apply the grid translation to running task unless it's being snapped to - // and removes the current translation applied to the running task. - runningTaskGridTranslationX = - (runningTaskView.gridTranslationX - runningTaskView.nonGridTranslationX) - runningTaskGridTranslationY = runningTaskView.gridTranslationY - } - remoteTargetHandles.forEach { remoteTargetHandle -> - val taskViewSimulator = remoteTargetHandle.taskViewSimulator - if (enableGridOnlyOverview()) { - animatorSet.play(taskViewSimulator.carouselScale.animateToValue(1f)) - animatorSet.play( - taskViewSimulator.taskGridTranslationX.animateToValue( - runningTaskGridTranslationX - ) - ) - animatorSet.play( - taskViewSimulator.taskGridTranslationY.animateToValue( - runningTaskGridTranslationY - ) - ) - } else { - animatorSet.play( - taskViewSimulator.taskPrimaryTranslation.animateToValue( - runningTaskGridTranslationX - ) - ) - animatorSet.play( - taskViewSimulator.taskSecondaryTranslation.animateToValue( - runningTaskGridTranslationY - ) - ) - } - } - } - animatorSet.play( - immediateObjectAnimator( - this, - TASK_THUMBNAIL_SPLASH_ALPHA, - if (endState.showTaskThumbnailSplash()) 1f else 0f, - ) - ) - if (enableLargeDesktopWindowingTile()) { - animatorSet.play(ObjectAnimator.ofFloat(this, DESKTOP_CAROUSEL_DETACH_PROGRESS, 0f)) - } - - if (enableGridOnlyOverview()) { - // Reload visible tasks according to new [mCurrentGestureEndTarget] value. - loadVisibleTaskData(FLAG_UPDATE_ALL) - } - } - } - - fun resetShareUIState() { - taskViews.flatMap { it.taskContainers }.forEach { it.overlay.resetShareUI() } - } - - /** - * Adds a listener to be notified when a new desk is added. - * - * @param onDeskAddedListener The listener to add. - */ - fun addOnDeskAddedListener(onDeskAddedListener: OnDeskAddedListener) { - onDeskAddedListeners += onDeskAddedListener - } - - /** - * Removes a listener that was previously added to be notified when a new desk is added. - * - * @param onDeskAddedListener The listener to remove. - */ - fun removeOnDeskAddedListener(onDeskAddedListener: OnDeskAddedListener) { - onDeskAddedListeners -= onDeskAddedListener - } - companion object { class RecentsViewFloatProperty( private val utilsProperty: KMutableProperty1 diff --git a/quickstep/src/com/android/quickstep/views/TaskContainer.kt b/quickstep/src/com/android/quickstep/views/TaskContainer.kt index 80f3913b91..086ac774f1 100644 --- a/quickstep/src/com/android/quickstep/views/TaskContainer.kt +++ b/quickstep/src/com/android/quickstep/views/TaskContainer.kt @@ -18,12 +18,12 @@ package com.android.quickstep.views import android.graphics.Bitmap import android.graphics.Matrix +import android.util.Log import android.view.View import android.view.View.OnClickListener -import com.android.launcher3.Flags.enableRefactorTaskContentView +import com.android.launcher3.Flags.enableOverviewIconMenu import com.android.launcher3.Flags.enableRefactorTaskThumbnail import com.android.launcher3.model.data.TaskViewItemInfo -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu import com.android.launcher3.util.SplitConfigurationOptions import com.android.launcher3.util.TransformingTouchDelegate import com.android.quickstep.TaskOverlayFactory @@ -31,7 +31,6 @@ import com.android.quickstep.ViewUtils.addAccessibleChildToList import com.android.quickstep.recents.domain.usecase.ThumbnailPosition import com.android.quickstep.recents.ui.mapper.TaskUiStateMapper import com.android.quickstep.recents.ui.viewmodel.TaskData -import com.android.quickstep.task.thumbnail.TaskContentView import com.android.quickstep.task.thumbnail.TaskThumbnailView import com.android.systemui.shared.recents.model.Task import com.android.systemui.shared.recents.model.ThumbnailData @@ -40,8 +39,6 @@ import com.android.systemui.shared.recents.model.ThumbnailData class TaskContainer( val taskView: TaskView, val task: Task, - // TODO(b/409248525): Upon flag cleanup, use the `TaskContentView` type - val taskContentView: View, val snapshotView: View, val iconView: TaskViewIcon, /** @@ -62,19 +59,10 @@ class TaskContainer( private var overlayEnabledStatus = false init { - when { - enableRefactorTaskContentView() -> { - require(taskContentView is TaskContentView) - require(snapshotView is TaskThumbnailView) - } - enableRefactorTaskThumbnail() -> { - require(taskContentView is TaskThumbnailView) - require(snapshotView is TaskThumbnailView) - } - else -> { - require(taskContentView is TaskThumbnailViewDeprecated) - require(snapshotView is TaskThumbnailViewDeprecated) - } + if (enableRefactorTaskThumbnail()) { + require(snapshotView is TaskThumbnailView) + } else { + require(snapshotView is TaskThumbnailViewDeprecated) } } @@ -120,8 +108,8 @@ class TaskContainer( fun destroy() = { digitalWellBeingToast?.destroy() - taskContentView.scaleX = 1f - taskContentView.scaleY = 1f + snapshotView.scaleX = 1f + snapshotView.scaleY = 1f overlay.reset() if (enableRefactorTaskThumbnail()) { isThumbnailValid = false @@ -131,7 +119,7 @@ class TaskContainer( thumbnailViewDeprecated.setShowSplashForSplitSelection(false) } - if (enableOverviewIconMenu() && taskView.type != TaskViewType.DESKTOP) { + if (enableOverviewIconMenu()) { (iconView as IconAppChipView).reset() } } @@ -142,7 +130,7 @@ class TaskContainer( } } - fun setOverlayEnabled(enabled: Boolean, thumbnailPosition: ThumbnailPosition) { + fun setOverlayEnabled(enabled: Boolean, thumbnailPosition: ThumbnailPosition?) { if (enableRefactorTaskThumbnail()) { if (overlayEnabledStatus != enabled || this.thumbnailPosition != thumbnailPosition) { overlayEnabledStatus = enabled @@ -152,26 +140,27 @@ class TaskContainer( } } - fun refreshOverlay(thumbnailPosition: ThumbnailPosition) = { + fun refreshOverlay(thumbnailPosition: ThumbnailPosition?) = { this.thumbnailPosition = thumbnailPosition - if (overlayEnabledStatus) { - overlay.initOverlay( - task, - thumbnailData?.thumbnail, - thumbnailPosition.matrix, - thumbnailPosition.isRotated, - ) - } else { - overlay.reset() + when { + !overlayEnabledStatus -> overlay.reset() + thumbnailPosition == null -> { + Log.e(TAG, "Thumbnail position was null during overlay refresh", Exception()) + overlay.reset() + } + else -> + overlay.initOverlay( + task, + thumbnailData?.thumbnail, + thumbnailPosition.matrix, + thumbnailPosition.isRotated, + ) } } fun addChildForAccessibility(outChildren: ArrayList) { addAccessibleChildToList(iconView.asView(), outChildren) - addAccessibleChildToList( - if (enableRefactorTaskContentView()) taskContentView else snapshotView, - outChildren, - ) + addAccessibleChildToList(snapshotView, outChildren) showWindowsView?.let { addAccessibleChildToList(it, outChildren) } digitalWellBeingToast?.let { addAccessibleChildToList(it, outChildren) } overlay.addChildForAccessibility(outChildren) @@ -179,23 +168,19 @@ class TaskContainer( fun setState( state: TaskData?, + liveTile: Boolean, hasHeader: Boolean, - canShowAppTimer: Boolean, clickCloseListener: OnClickListener?, ) = { - if (enableRefactorTaskContentView()) { - (taskContentView as TaskContentView).setState( - TaskUiStateMapper.toTaskHeaderState(state, hasHeader, clickCloseListener), - TaskUiStateMapper.toTaskThumbnailUiState(state), - TaskUiStateMapper.toTaskAppTimerUiState(canShowAppTimer, stagePosition, state), - state?.taskId, - ) - } else { - thumbnailView.setState( - TaskUiStateMapper.toTaskThumbnailUiState(state), - state?.taskId, - ) - } + thumbnailView.setState( + TaskUiStateMapper.toTaskThumbnailUiState( + state, + liveTile, + hasHeader, + clickCloseListener, + ), + state?.taskId, + ) thumbnailData = if (state is TaskData.Data) state.thumbnailData else null overlay.setThumbnailState(thumbnailData) } diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.kt b/quickstep/src/com/android/quickstep/views/TaskMenuView.kt index 24924c13a4..f7cb7bef78 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.kt +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.kt @@ -18,7 +18,6 @@ package com.android.quickstep.views import android.animation.Animator import android.animation.AnimatorSet import android.animation.ObjectAnimator -import android.animation.TimeInterpolator import android.animation.ValueAnimator import android.content.Context import android.graphics.Outline @@ -35,24 +34,21 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.res.ResourcesCompat import com.android.app.animation.Interpolators -import com.android.app.animation.Interpolators.clampToProgress import com.android.launcher3.AbstractFloatingView +import com.android.launcher3.Flags.enableOverviewIconMenu import com.android.launcher3.Flags.enableRefactorTaskThumbnail import com.android.launcher3.R import com.android.launcher3.anim.AnimationSuccessListener import com.android.launcher3.anim.RoundedRectRevealOutlineProvider import com.android.launcher3.popup.SystemShortcut import com.android.launcher3.util.MultiPropertyFactory -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu import com.android.launcher3.util.SplitConfigurationOptions import com.android.launcher3.views.BaseDragLayer import com.android.quickstep.TaskOverlayFactory import com.android.quickstep.TaskUtils -import com.android.quickstep.orientation.RecentsPagedOrientationHandler import com.android.quickstep.util.TaskCornerRadius import java.util.function.Consumer import kotlin.math.max -import kotlin.math.roundToInt /** Contains options for a recent task when long-pressing its icon. */ class TaskMenuView @@ -67,7 +63,6 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : private var openCloseAnimator: AnimatorSet? = null private var revealAnimator: ValueAnimator? = null private var onClosingStartCallback: Runnable? = null - private lateinit var orientationHandler: RecentsPagedOrientationHandler private lateinit var taskView: TaskView private lateinit var taskContainer: TaskContainer private var menuTranslationXBeforeOpen = 0f @@ -75,11 +70,14 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : // Spaced claimed below Overview (taskbar and insets) private val taskbarTop by lazy { - recentsViewContainer.deviceProfile.deviceProperties.heightPx - + recentsViewContainer.deviceProfile.heightPx - recentsViewContainer.deviceProfile.overviewActionsClaimedSpaceBelow } - private val minMenuTop by lazy { taskContainer.iconView.asView().height.toFloat() } - private val maxMenuBottom by lazy { taskbarTop - recentsViewContainer.dragLayer.insets.top } + private val minMenuTop by lazy { taskContainer.iconView.height.toFloat() } + // TODO(b/401476868): Replace overviewRowSpacing with correct margin to the taskbarTop. + private val maxMenuBottom by lazy { + (taskbarTop - recentsViewContainer.deviceProfile.overviewRowSpacing).toFloat() + } init { clipToOutline = true @@ -97,7 +95,7 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : } override fun handleClose(animate: Boolean) { - animateOpenOrClosed(closing = true, animated = false) + animateOpenOrClosed(true, animated = false) } override fun isOfType(type: Int): Boolean = (type and TYPE_TASK_MENU) != 0 @@ -173,6 +171,12 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : R.drawable.app_chip_menu_item_bg, context.theme, ) + menuOptionView.foreground = + ResourcesCompat.getDrawable( + resources, + R.drawable.app_chip_menu_item_fg, + context.theme, + ) } menuOption.setIconAndLabelFor( menuOptionView.findViewById(R.id.icon), @@ -192,7 +196,7 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : private fun orientAroundTaskView(taskContainer: TaskContainer) { val recentsView = recentsViewContainer.getOverviewPanel>() - orientationHandler = recentsView.pagedOrientationHandler + val orientationHandler = recentsView.pagedOrientationHandler measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED) // Get Position @@ -202,7 +206,7 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : else taskContainer.snapshotView, tempRect, ) - val insets = recentsViewContainer.dragLayer.insets + val insets = recentsViewContainer.dragLayer.getInsets() val params = layoutParams as BaseDragLayer.LayoutParams params.width = orientationHandler.getTaskMenuWidth( @@ -211,10 +215,7 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : taskContainer.stagePosition, ) // Gravity set to Left instead of Start as sTempRect.left measures Left distance not Start - params.gravity = - if (enableOverviewIconMenu() && orientationHandler.isLayoutNaturalToLauncher) - Gravity.START - else Gravity.LEFT + params.gravity = Gravity.LEFT layoutParams = params scaleX = taskView.scaleX scaleY = taskView.scaleY @@ -232,10 +233,6 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : } else { null } - if (enableOverviewIconMenu()) { - background = - ResourcesCompat.getDrawable(resources, R.drawable.app_chip_menu_bg, context.theme) - } orientationHandler.setTaskOptionsMenuLayoutOrientation( deviceProfile, @@ -243,15 +240,7 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : dividerSpacing, divider, ) - - val thumbnailAlignedX = - if ( - enableOverviewIconMenu() && - orientationHandler.isLayoutNaturalToLauncher && - isLayoutRtl - ) - -(recentsViewContainer.dragLayer.width - tempRect.right - insets.right).toFloat() - else (tempRect.left - insets.left).toFloat() + val thumbnailAlignedX = (tempRect.left - insets.left).toFloat() val thumbnailAlignedY = (tempRect.top - insets.top).toFloat() // Changing pivot to make computations easier @@ -261,35 +250,37 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : pivotY = 0f rotation = orientationHandler.degreesRotated - var taskInsetMargin = resources.getDimension(R.dimen.task_card_margin) if (enableOverviewIconMenu()) { elevation = resources.getDimension(R.dimen.task_thumbnail_icon_menu_elevation) - taskInsetMargin = 0f + translationX = thumbnailAlignedX + translationY = thumbnailAlignedY + } else { + // Margin that insets the menuView inside the taskView + val taskInsetMargin = resources.getDimension(R.dimen.task_card_margin) + translationX = + orientationHandler.getTaskMenuX( + thumbnailAlignedX, + this.taskContainer.snapshotView, + deviceProfile, + taskInsetMargin, + iconView, + ) + translationY = + orientationHandler.getTaskMenuY( + thumbnailAlignedY, + this.taskContainer.snapshotView, + this.taskContainer.stagePosition, + this, + taskInsetMargin, + iconView, + ) } - - translationX = - orientationHandler.getTaskMenuX( - thumbnailAlignedX, - this.taskContainer.snapshotView, - deviceProfile, - taskInsetMargin, - iconView, - ) - translationY = - orientationHandler.getTaskMenuY( - thumbnailAlignedY, - this.taskContainer.snapshotView, - this.taskContainer.stagePosition, - this, - taskInsetMargin, - iconView, - ) } private fun animateOpen() { menuTranslationYBeforeOpen = translationY menuTranslationXBeforeOpen = translationX - animateOpenOrClosed(closing = false) + animateOpenOrClosed(false) mIsOpen = true } @@ -298,73 +289,60 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : private fun animateOpenOrClosed(closing: Boolean, animated: Boolean = true) { openCloseAnimator?.let { if (it.isRunning) it.cancel() } - // If we're opening, we just start from the beginning as a new `TaskMenuView` is - // created - // each time we do the open animation so there will never be a partial value - // here. + openCloseAnimator = AnimatorSet() + // If we're opening, we just start from the beginning as a new `TaskMenuView` is created + // each time we do the open animation so there will never be a partial value here. var revealAnimationStartProgress = 0f - if (closing) revealAnimator?.let { revealAnimationStartProgress = 1f - it.animatedFraction } + if (closing && revealAnimator != null) { + revealAnimationStartProgress = 1f - revealAnimator!!.animatedFraction + } revealAnimator = createOpenCloseOutlineProvider() .createRevealAnimator(this, closing, revealAnimationStartProgress) - .apply { - interpolator = - if (enableOverviewIconMenu()) Interpolators.EMPHASIZED - else Interpolators.DECELERATE - - if (enableRefactorTaskThumbnail()) { - addUpdateListener { animation: ValueAnimator -> - val animatedFraction = animation.animatedFraction - val openProgress = - if (closing) (1 - animatedFraction) else animatedFraction - taskContainer.updateMenuOpenProgress(openProgress) - } - } + revealAnimator!!.interpolator = + if (enableOverviewIconMenu()) Interpolators.EMPHASIZED else Interpolators.DECELERATE + val openCloseAnimatorBuilder = openCloseAnimator!!.play(revealAnimator) + if (enableOverviewIconMenu()) { + animateOpenOrCloseAppChip(closing, openCloseAnimatorBuilder) + } + openCloseAnimatorBuilder.with( + ObjectAnimator.ofFloat(this, ALPHA, (if (closing) 0 else 1).toFloat()) + ) + if (enableRefactorTaskThumbnail()) { + revealAnimator?.addUpdateListener { animation: ValueAnimator -> + val animatedFraction = animation.animatedFraction + val openProgress = if (closing) (1 - animatedFraction) else animatedFraction + taskContainer.updateMenuOpenProgress(openProgress) + } + } else { + openCloseAnimatorBuilder.with( + ObjectAnimator.ofFloat( + taskContainer.thumbnailViewDeprecated, + TaskThumbnailViewDeprecated.DIM_ALPHA, + if (closing) 0f else TaskView.MAX_PAGE_SCRIM_ALPHA, + ) + ) + } + openCloseAnimator!!.addListener( + object : AnimationSuccessListener() { + override fun onAnimationStart(animation: Animator) { + visibility = VISIBLE + if (closing) onClosingStartCallback?.run() } - openCloseAnimator = - AnimatorSet() - .apply { - duration = - when { - animated && closing -> REVEAL_CLOSE_DURATION - animated && !closing -> REVEAL_OPEN_DURATION - else -> 0L - } - addListener( - object : AnimationSuccessListener() { - override fun onAnimationStart(animation: Animator) { - visibility = VISIBLE - if (closing) onClosingStartCallback?.run() - } - override fun onAnimationSuccess(animator: Animator) { - if (closing) closeComplete() - } - } - ) - } - .also { animator -> - val animatorBuilder = animator.play(revealAnimator) - if (enableOverviewIconMenu()) { - animateOpenOrCloseAppChip(closing, animatorBuilder) - } else { - animatorBuilder.with( - ObjectAnimator.ofFloat(this, ALPHA, (if (closing) 0 else 1).toFloat()) - ) - } - - if (!enableRefactorTaskThumbnail()) { - animatorBuilder.with( - ObjectAnimator.ofFloat( - taskContainer.thumbnailViewDeprecated, - TaskThumbnailViewDeprecated.DIM_ALPHA, - if (closing) 0f else TaskView.MAX_PAGE_SCRIM_ALPHA, - ) - ) - } - - animator.start() + override fun onAnimationSuccess(animator: Animator) { + if (closing) closeComplete() } + } + ) + val animationDuration = + when { + animated && closing -> REVEAL_CLOSE_DURATION + animated && !closing -> REVEAL_OPEN_DURATION + else -> 0L + } + openCloseAnimator!!.setDuration(animationDuration) + openCloseAnimator!!.start() } private fun TaskView.isOnGridBottomRow(): Boolean = @@ -378,19 +356,13 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : private fun createOpenCloseOutlineProvider(): RoundedRectRevealOutlineProvider { val radius = TaskCornerRadius.get(mContext) - val fromRect = - if (enableOverviewIconMenu()) { - Rect( - /* left = */ if (isLayoutRtl) width - iconView.minimumWidth else 0, - /* top = */ 0, - /* right = */ if (isLayoutRtl) width else iconView.minimumWidth, - /* bottom = */ (height * CONTAINER_SCALE_PERCENTAGE).roundToInt(), - ) - } else { - Rect(0, 0, width, 0) - } - + Rect( + if (enableOverviewIconMenu() && isLayoutRtl) width else 0, + 0, + if (enableOverviewIconMenu() && !isLayoutRtl) 0 else width, + 0, + ) val toRect = Rect(0, 0, width, height) return RoundedRectRevealOutlineProvider(radius, radius, fromRect, toRect) } @@ -417,35 +389,22 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : } private fun animateOpenOrCloseAppChip(closing: Boolean, animatorBuilder: AnimatorSet.Builder) { - if (!closing) { - alpha = 0f - optionLayout.apply { - pivotX = if (isLayoutRtl) optionLayout.width.toFloat() else 0f - pivotY = 0f - scaleX = CONTAINER_SCALE_PERCENTAGE - scaleY = CONTAINER_SCALE_PERCENTAGE - alpha = 0f - } - } - val iconAppChip = taskContainer.iconView.asView() as IconAppChipView // Animate menu up for enough room to display full menu when task on bottom row. var additionalTranslationY = 0f - val translationYMargin = orientationHandler.getAppChipMenuMarginY(iconAppChip, isLayoutRtl) if (taskView.isOnGridBottomRow()) { - val expandedMenuPosition = menuTranslationYBeforeOpen + translationYMargin - val currentMenuBottom: Float = expandedMenuPosition + height + val currentMenuBottom: Float = menuTranslationYBeforeOpen + height additionalTranslationY = if (currentMenuBottom < maxMenuBottom) 0f // Translate menu up for enough room to display full menu when task on bottom row. else maxMenuBottom - currentMenuBottom - val currentMenuTop = expandedMenuPosition + additionalTranslationY + val currentMenuTop = menuTranslationYBeforeOpen + additionalTranslationY // If it translate above the min accepted, it translates to the top of the screen if (currentMenuTop < minMenuTop) { // It subtracts the menuTranslation to make it 0 (top of the screen) + chip size. - additionalTranslationY = -expandedMenuPosition + minMenuTop + additionalTranslationY = -menuTranslationYBeforeOpen + minMenuTop } } @@ -454,7 +413,7 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : this, TRANSLATION_Y, if (closing) menuTranslationYBeforeOpen - else menuTranslationYBeforeOpen + translationYMargin + additionalTranslationY, + else menuTranslationYBeforeOpen + additionalTranslationY, ) translationYAnim.interpolator = Interpolators.EMPHASIZED animatorBuilder.with(translationYAnim) @@ -470,15 +429,13 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : var additionalTranslationX = 0f if ( - taskView.pagedOrientationHandler.isLayoutNaturalToLauncher && - taskContainer.stagePosition == - SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT + taskContainer.stagePosition == SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT ) { // Animate menu and icon when split task would display off the side of the screen. additionalTranslationX = max( (translationX + width - - (recentsViewContainer.deviceProfile.deviceProperties.widthPx - + (recentsViewContainer.deviceProfile.widthPx - resources.getDimensionPixelSize( R.dimen.task_menu_edge_padding ) * 2)) @@ -488,13 +445,12 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : .toFloat() } - val translationXMargin = orientationHandler.getAppChipMenuMarginX(iconAppChip, isLayoutRtl) val translationXAnim = ObjectAnimator.ofFloat( this, TRANSLATION_X, if (closing) menuTranslationXBeforeOpen - else menuTranslationXBeforeOpen - translationXMargin - additionalTranslationX, + else menuTranslationXBeforeOpen - additionalTranslationX, ) translationXAnim.interpolator = Interpolators.EMPHASIZED animatorBuilder.with(translationXAnim) @@ -507,38 +463,6 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : ) menuTranslationXAnim.interpolator = Interpolators.EMPHASIZED animatorBuilder.with(menuTranslationXAnim) - - // Scaling the container inside the menu - val toScaleX = if (closing) CONTAINER_SCALE_PERCENTAGE else 1f - val animatorScaleX = ObjectAnimator.ofFloat(optionLayout, SCALE_X, toScaleX) - animatorScaleX.interpolator = Interpolators.EMPHASIZED - animatorBuilder.with(animatorScaleX) - - val toScaleY = if (closing) CONTAINER_SCALE_PERCENTAGE else 1f - val animatorScaleY = ObjectAnimator.ofFloat(optionLayout, SCALE_Y, toScaleY) - animatorScaleY.interpolator = Interpolators.EMPHASIZED - animatorBuilder.with(animatorScaleY) - - val alphaValue = if (closing) 0f else 1f - val optionLayoutAlphaAnimator = - ObjectAnimator.ofFloat(optionLayout, ALPHA, alphaValue).apply { - interpolator = TimeInterpolator { - clampToProgress(Interpolators.EMPHASIZED.getInterpolation(it), .75f, 1f) - } - } - animatorBuilder.with(optionLayoutAlphaAnimator) - - val menuAlphaAnimator = - ObjectAnimator.ofFloat(this, ALPHA, alphaValue).apply { - interpolator = TimeInterpolator { - clampToProgress(Interpolators.EMPHASIZED.getInterpolation(it), .48f, .74f) - } - } - animatorBuilder.with(menuAlphaAnimator) - - val recentsView = recentsViewContainer.getOverviewPanel>() - val isAnimated = !recentsView.isSplitSelectionActive - animatorBuilder.with(iconAppChip.revealAnim(isRevealing = !closing, isAnimated)) } override fun dispatchKeyEvent(event: KeyEvent): Boolean { @@ -554,22 +478,6 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : ) { iconView.requestFocus() return true - } else { - val currentFocus = findFocus() ?: return super.dispatchKeyEvent(event) - - val nextFocus = - when (event.keyCode) { - KeyEvent.KEYCODE_DPAD_UP -> focusSearch(currentFocus, FOCUS_BACKWARD) - KeyEvent.KEYCODE_DPAD_DOWN -> focusSearch(currentFocus, FOCUS_FORWARD) - KeyEvent.KEYCODE_TAB -> - focusSearch( - currentFocus, - if (event.isShiftPressed) FOCUS_BACKWARD else FOCUS_FORWARD, - ) - else -> null - } - - return nextFocus?.requestFocus() ?: super.dispatchKeyEvent(event) } } return super.dispatchKeyEvent(event) @@ -578,7 +486,6 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) : companion object { private val REVEAL_OPEN_DURATION = if (enableOverviewIconMenu()) 417L else 150L private val REVEAL_CLOSE_DURATION = if (enableOverviewIconMenu()) 333L else 100L - private const val CONTAINER_SCALE_PERCENTAGE = .8f /** Show a task menu for the given taskContainer. */ /** Show a task menu for the given taskContainer. */ diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuViewWithArrow.kt b/quickstep/src/com/android/quickstep/views/TaskMenuViewWithArrow.kt index 78730ec3c7..833683b59e 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuViewWithArrow.kt +++ b/quickstep/src/com/android/quickstep/views/TaskMenuViewWithArrow.kt @@ -276,8 +276,8 @@ class TaskMenuViewWithArrow : ArrowPopup where T : RecentsViewContainer, T IconView(context).apply { layoutParams = FrameLayout.LayoutParams( - taskContainer.iconView.asView().width, - taskContainer.iconView.asView().height + taskContainer.iconView.width, + taskContainer.iconView.height ) x = mTempRect.left.toFloat() - insets.left y = mTempRect.top.toFloat() - insets.top diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java index 859feb2ec5..74d76e6432 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java @@ -469,7 +469,7 @@ public class TaskThumbnailViewDeprecated extends View implements ViewPool.Reusab int currentRotation = mTaskView.getOrientedState().getRecentsActivityRotation(); boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL; mPreviewPositionHelper.updateThumbnailMatrix(mPreviewRect, mThumbnailData, - getMeasuredWidth(), getMeasuredHeight(), dp.getDeviceProperties().isTablet(), currentRotation, isRtl); + getMeasuredWidth(), getMeasuredHeight(), dp.isTablet, currentRotation, isRtl); mBitmapShader.setLocalMatrix(mPreviewPositionHelper.getMatrix()); mPaint.setShader(mBitmapShader); diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt index 1364821676..97bbe87d45 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.kt +++ b/quickstep/src/com/android/quickstep/views/TaskView.kt @@ -46,13 +46,14 @@ import androidx.annotation.VisibleForTesting import androidx.core.view.updateLayoutParams import com.android.app.animation.Interpolators import com.android.launcher3.AbstractFloatingView -import com.android.launcher3.Flags.enableCoroutineThreadingImprovements import com.android.launcher3.Flags.enableCursorHoverStates import com.android.launcher3.Flags.enableDesktopExplodedView +import com.android.launcher3.Flags.enableGridOnlyOverview +import com.android.launcher3.Flags.enableHoverOfChildElementsInTaskview import com.android.launcher3.Flags.enableLargeDesktopWindowingTile -import com.android.launcher3.Flags.enableRefactorDigitalWellbeingToast -import com.android.launcher3.Flags.enableRefactorTaskContentView +import com.android.launcher3.Flags.enableOverviewIconMenu import com.android.launcher3.Flags.enableRefactorTaskThumbnail +import com.android.launcher3.Flags.enableSeparateExternalDisplayTasks import com.android.launcher3.R import com.android.launcher3.Utilities import com.android.launcher3.anim.AnimatedFloat @@ -67,8 +68,6 @@ import com.android.launcher3.util.KFloatProperty import com.android.launcher3.util.MultiPropertyDelegate import com.android.launcher3.util.MultiPropertyFactory import com.android.launcher3.util.MultiValueAlpha -import com.android.launcher3.util.OverviewReleaseFlags.enableGridOnlyOverview -import com.android.launcher3.util.OverviewReleaseFlags.enableOverviewIconMenu import com.android.launcher3.util.RunnableList import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED import com.android.launcher3.util.SplitConfigurationOptions.StagePosition @@ -83,7 +82,6 @@ import com.android.quickstep.RemoteAnimationTargets import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle import com.android.quickstep.TaskOverlayFactory import com.android.quickstep.TaskViewUtils -import com.android.quickstep.fallback.window.RecentsWindowFlags.enableOverviewOnConnectedDisplays import com.android.quickstep.orientation.RecentsPagedOrientationHandler import com.android.quickstep.recents.di.RecentsDependencies import com.android.quickstep.recents.di.get @@ -92,14 +90,11 @@ import com.android.quickstep.recents.domain.usecase.ThumbnailPosition import com.android.quickstep.recents.ui.viewmodel.TaskData import com.android.quickstep.recents.ui.viewmodel.TaskTileUiState import com.android.quickstep.recents.ui.viewmodel.TaskViewModel -import com.android.quickstep.task.thumbnail.TaskContentView import com.android.quickstep.util.ActiveGestureErrorDetector import com.android.quickstep.util.ActiveGestureLog import com.android.quickstep.util.BorderAnimator import com.android.quickstep.util.BorderAnimator.Companion.createSimpleBorderAnimator -import com.android.quickstep.util.GroupTask import com.android.quickstep.util.RecentsOrientedState -import com.android.quickstep.util.SingleTask import com.android.quickstep.util.TaskCornerRadius import com.android.quickstep.util.TaskRemovedDuringLaunchListener import com.android.quickstep.util.isExternalDisplay @@ -138,8 +133,6 @@ constructor( @IntDef(FLAG_UPDATE_ALL, FLAG_UPDATE_ICON, FLAG_UPDATE_THUMBNAIL, FLAG_UPDATE_CORNER_RADIUS) annotation class TaskDataChanges - var groupTask: GroupTask? = null - val taskIds: IntArray /** Returns a copy of integer array containing taskIds of all tasks in the TaskView. */ get() = taskContainers.map { it.task.key.id }.toIntArray() @@ -151,12 +144,9 @@ constructor( val snapshotViews: Array get() = taskContainers.map { it.snapshotView }.toTypedArray() - val taskContentViews: Array - get() = taskContainers.map { it.taskContentView }.toTypedArray() - val isGridTask: Boolean /** Returns whether the task is part of overview grid and not being focused. */ - get() = container.deviceProfile.getDeviceProperties().isTablet && !isLargeTile + get() = container.deviceProfile.isTablet && !isLargeTile val isRunningTask: Boolean get() = this === recentsView?.runningTaskView @@ -174,7 +164,7 @@ constructor( get() = this == recentsView?.focusedTaskView || (enableLargeDesktopWindowingTile() && type == TaskViewType.DESKTOP) || - (isExternalDisplay && !enableOverviewOnConnectedDisplays()) + (enableSeparateExternalDisplayTasks() && isExternalDisplay) val recentsView: RecentsView<*, *>? get() = parent as? RecentsView<*, *> @@ -192,9 +182,6 @@ constructor( val firstItemInfo: ItemInfo? get() = firstTaskContainer?.itemInfo - val isOnGridBottomRow: Boolean - get() = recentsView?.isOnGridBottomRow(this) == true - /** * A [TaskViewItemInfo] of this TaskView. The [firstTaskContainer] will be used to get some * specific information like user, title etc of the Task. However, these task specific @@ -322,10 +309,6 @@ constructor( var taskViewId = UNBOUND_TASK_VIEW_ID var isEndQuickSwitchCuj = false - var isBeingDraggedForDismissal = false - val isBeingDismissed - get() = secondaryDismissTranslationProperty.get(this) != 0f - var sysUiStatusNavFlags: Int = 0 get() = if (enableRefactorTaskThumbnail()) field @@ -441,7 +424,7 @@ constructor( } // The following grid translations scales with mGridProgress. - var gridTranslationX = 0f + protected var gridTranslationX = 0f set(value) { field = value applyTranslationX() @@ -462,7 +445,7 @@ constructor( // Applied as a complement to gridTranslation, for adjusting the carousel overview and quick // switch. - var nonGridTranslationX = 0f + protected var nonGridTranslationX = 0f set(value) { field = value applyTranslationX() @@ -551,18 +534,7 @@ constructor( private var settledProgressDismiss by MultiPropertyDelegate(settledProgressPropertyFactory, SettledProgress.Dismiss) - private val viewModel = - if (enableRefactorTaskThumbnail()) { - TaskViewModel( - taskViewType = type, - recentsViewData = RecentsDependencies.get(context), - getTaskUseCase = RecentsDependencies.get(context), - getSysUiStatusNavFlagsUseCase = RecentsDependencies.get(context), - isThumbnailValidUseCase = RecentsDependencies.get(context), - getThumbnailPositionUseCase = RecentsDependencies.get(context), - dispatcherProvider = RecentsDependencies.get(context), - ) - } else null + private var viewModel: TaskViewModel? = null private val dispatcherProvider: DispatcherProvider by RecentsDependencies.inject() private val coroutineScope: CoroutineScope by RecentsDependencies.inject() private val coroutineJobs = mutableListOf() @@ -616,11 +588,17 @@ constructor( if (borderEnabled) { when (event.action) { MotionEvent.ACTION_HOVER_ENTER -> { - getThumbnailBounds(thumbnailBounds) - hoverBorderVisible = event.isWithinThumbnailBounds() + hoverBorderVisible = + if (enableHoverOfChildElementsInTaskview()) { + getThumbnailBounds(thumbnailBounds) + event.isWithinThumbnailBounds() + } else { + true + } } MotionEvent.ACTION_HOVER_MOVE -> - hoverBorderVisible = event.isWithinThumbnailBounds() + if (enableHoverOfChildElementsInTaskview()) + hoverBorderVisible = event.isWithinThumbnailBounds() MotionEvent.ACTION_HOVER_EXIT -> hoverBorderVisible = false else -> {} } @@ -628,6 +606,10 @@ constructor( return super.onHoverEvent(event) } + override fun onInterceptHoverEvent(event: MotionEvent): Boolean = + if (enableHoverOfChildElementsInTaskview()) super.onInterceptHoverEvent(event) + else if (enableCursorHoverStates()) true else super.onInterceptHoverEvent(event) + override fun dispatchTouchEvent(ev: MotionEvent): Boolean { val recentsView = recentsView ?: return false val splitSelectStateController = recentsView.splitSelectController @@ -673,7 +655,9 @@ constructor( it.right = width it.bottom = height } - getThumbnailBounds(thumbnailBounds) + if (enableHoverOfChildElementsInTaskview()) { + getThumbnailBounds(thumbnailBounds) + } } private fun updatePivots() { @@ -682,9 +666,8 @@ constructor( pivotX = modalPivot.x pivotY = modalPivot.y } else { - val thumbnailTopMargin = - container.deviceProfile.overviewProfile.taskThumbnailTopMarginPx - if (container.deviceProfile.getDeviceProperties().isTablet) { + val thumbnailTopMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx + if (container.deviceProfile.isTablet) { pivotX = (if (layoutDirection == LAYOUT_DIRECTION_RTL) 0 else right - left).toFloat() pivotY = thumbnailTopMargin.toFloat() @@ -696,12 +679,9 @@ constructor( } override fun onRecycle() { - isBeingDraggedForDismissal = false resetPersistentViewTransforms() - groupTask = null - // Bind ViewModel to no taskIds - viewModel?.bind() + viewModel = null attachAlpha = 1f splitAlpha = 1f splitSplashAlpha = 0f @@ -747,14 +727,7 @@ constructor( // Add DWB accessibility action at the end of the list taskContainers.forEach { - if ( - enableRefactorDigitalWellbeingToast() && - it.taskContentView is TaskContentView - ) { - it.taskContentView.getSupportedAccessibilityActions().forEach(::addAction) - } else { - it.digitalWellBeingToast?.getDWBAccessibilityAction()?.let(::addAction) - } + it.digitalWellBeingToast?.getDWBAccessibilityAction()?.let(::addAction) } } @@ -763,9 +736,7 @@ constructor( AccessibilityNodeInfo.CollectionItemInfo( 0, 1, - // We only care about TaskView's for the `CollectionInfo` that Talkback uses - // to read out. - it.taskViews.reversed().indexOf(this@TaskView), + it.getAccessibilityChildren().indexOf(this@TaskView), 1, false, ) @@ -776,14 +747,8 @@ constructor( override fun performAccessibilityAction(action: Int, arguments: Bundle?): Boolean { // TODO(b/343708271): Add support for multiple tasks per action. taskContainers.forEach { - if (enableRefactorDigitalWellbeingToast() && it.taskContentView is TaskContentView) { - if (it.taskContentView.handleAccessibilityAction(action)) { - return true - } - } else { - if (it.digitalWellBeingToast?.handleAccessibilityAction(action) == true) { - return true - } + if (it.digitalWellBeingToast?.handleAccessibilityAction(action) == true) { + return true } TaskOverlayFactory.getEnabledShortcuts(this, it).forEach { shortcut -> @@ -803,19 +768,13 @@ constructor( } protected open fun inflateViewStubs() { - findViewById(R.id.task_content_view) + findViewById(R.id.snapshot) ?.apply { - inflatedId = - if (enableRefactorTaskContentView()) R.id.task_content_view else R.id.snapshot layoutResource = - when { - enableRefactorTaskContentView() -> R.layout.task_content_view - enableRefactorTaskThumbnail() -> R.layout.task_thumbnail - else -> R.layout.task_thumbnail_deprecated - } + if (enableRefactorTaskThumbnail()) R.layout.task_thumbnail + else R.layout.task_thumbnail_deprecated } ?.inflate() - findViewById(R.id.icon) ?.apply { layoutResource = @@ -823,20 +782,14 @@ constructor( else R.layout.icon_view } ?.inflate() - - if (!enableRefactorDigitalWellbeingToast()) { - findViewById(R.id.digital_wellbeing_toast) - ?.apply { layoutResource = R.layout.digital_wellbeing_toast } - ?.inflate() - } } override fun onAttachedToWindow() { super.onAttachedToWindow() if (enableRefactorTaskThumbnail()) { - // TaskView binds the ViewModel during onBind, and unbinds it in onRecycle. So it - // should start listening here. - // TV Lifecycle: onBind -> onAttachedToWindow -> onDetachFromWindow -> onRecycle + // The TaskView lifecycle is starts the ViewModel during onBind, and cleans it in + // onRecycle. So it should be initialized at this point. TaskView Lifecycle: + // `bind` -> `onBind` -> onAttachedToWindow() -> onDetachFromWindow -> onRecycle coroutineJobs += coroutineScope.launch(dispatcherProvider.main) { viewModel!!.state.collectLatest(::updateTaskViewState) @@ -853,12 +806,10 @@ constructor( val taskId = container.task.key.id val containerState = mapOfTasks[taskId] val shouldHaveHeader = (type == TaskViewType.DESKTOP) && enableDesktopExplodedView() - val shouldShowAppTimer = - (type == TaskViewType.SINGLE || type == TaskViewType.GROUPED) container.setState( state = containerState, + liveTile = state.isLiveTile, hasHeader = shouldHaveHeader, - canShowAppTimer = shouldShowAppTimer, clickCloseListener = if (shouldHaveHeader) { { @@ -884,7 +835,10 @@ constructor( container.setOverlayEnabled(state.taskOverlayEnabled, thumbnailPosition) if (state.isCentralTask) { this.container.actionsView.let { - it.updateDisabledFlags(DISABLED_ROTATED, thumbnailPosition.isRotated) + it.updateDisabledFlags( + DISABLED_ROTATED, + thumbnailPosition?.isRotated ?: false, + ) it.updateDisabledFlags( DISABLED_NO_THUMBNAIL, state.tasks.any { taskData -> @@ -896,24 +850,17 @@ constructor( if (enableOverviewIconMenu()) { setIconState(container, containerState) - if ( - containerState is TaskData && - container.digitalWellBeingToast?.isDestroyed == false && - container.task.titleDescription != null - ) { - container.digitalWellBeingToast.initialize() - } } } } private fun updateThumbnailValidity(container: TaskContainer) { container.isThumbnailValid = - viewModel!!.isThumbnailValid( + viewModel?.isThumbnailValid( thumbnail = container.thumbnailData, width = container.thumbnailView.width, height = container.thumbnailView.height, - ) + ) ?: return applyThumbnailSplashAlpha() } @@ -932,52 +879,23 @@ constructor( container: TaskContainer, width: Int, height: Int, - ): ThumbnailPosition { + ): ThumbnailPosition? { val thumbnailPosition = - viewModel!!.getThumbnailPosition( - container.thumbnailData, - width, - height, - isLayoutRtl, - ) + viewModel?.getThumbnailPosition(container.thumbnailData, width, height, isLayoutRtl) + ?: return null container.updateThumbnailMatrix(thumbnailPosition.matrix) return thumbnailPosition } override fun onDetachedFromWindow() { super.onDetachedFromWindow() - cancelJobs() - } - - fun cancelJobs() { - if (enableRefactorTaskThumbnail()) { - // The jobs are being cancelled in the background thread. So we make a copy of the - // list to prevent cleaning a new job that might be added to this list during - // onAttach or another moment in the lifecycle. - val coroutineJobsToCancel = coroutineJobs.toList() - coroutineJobs.clear() - if (coroutineJobsToCancel.isEmpty()) return - - if (enableCoroutineThreadingImprovements()) { - // TODO(b/391842220): This should ideally be handled in the completion block of the - // jobs above to be cancelled. - taskContainers.forEach { - it.setState( - state = null, - hasHeader = false, - canShowAppTimer = false, - clickCloseListener = null, - ) - // Do not set icon to null if we are actively in split selection. The task - // appears to have been offloaded as we remove it during split, but we still - // need the icon to show over the split task. - if (enableOverviewIconMenu() && recentsView?.isSplitSelectionActive == false) { - setIconState(it, null) - } - } - } - - coroutineScope.launch(dispatcherProvider.lightweightBackground) { + if (enableRefactorTaskThumbnail()) { + // The jobs are being cancelled in the background thread. So we make a copy of the + // list to prevent cleaning a new job that might be added to this list during + // onAttach or another moment in the lifecycle. + val coroutineJobsToCancel = coroutineJobs.toList() + coroutineJobs.clear() + coroutineScope.launch(dispatcherProvider.background) { coroutineJobsToCancel.forEach { it.cancel("TaskView detaching from window") } @@ -987,18 +905,16 @@ constructor( /** Updates this task view to the given {@param task}. */ open fun bind( - singleTask: SingleTask, + task: Task, orientedState: RecentsOrientedState, taskOverlayFactory: TaskOverlayFactory, ) { - this.groupTask = singleTask cancelPendingLoadTasks() this.orientedState = orientedState // Needed for dependencies taskContainers = listOf( createTaskContainer( - singleTask.task, - R.id.task_content_view, + task, R.id.snapshot, R.id.icon, R.id.show_windows, @@ -1012,21 +928,24 @@ constructor( protected open fun onBind(orientedState: RecentsOrientedState) { if (enableRefactorTaskThumbnail()) { - Log.d(TAG, "onBind $context ${orientedState.containerInterface}") - viewModel!!.bind(*taskIds) + val scopeId = context + Log.d(TAG, "onBind $scopeId ${orientedState.containerInterface}") + viewModel = + TaskViewModel( + taskViewType = type, + recentsViewData = RecentsDependencies.get(scopeId), + getTaskUseCase = RecentsDependencies.get(scopeId), + getSysUiStatusNavFlagsUseCase = RecentsDependencies.get(scopeId), + isThumbnailValidUseCase = RecentsDependencies.get(scopeId), + getThumbnailPositionUseCase = RecentsDependencies.get(scopeId), + dispatcherProvider = RecentsDependencies.get(scopeId), + ) + .apply { bind(*taskIds) } } taskContainers.forEach { container -> container.bind() - if (enableRefactorTaskContentView()) { - (container.taskContentView as TaskContentView).cornerRadius = - thumbnailFullscreenParams.currentCornerRadius - container.taskContentView.doOnSizeChange { width, height -> - updateThumbnailValidity(container) - val thumbnailPosition = updateThumbnailMatrix(container, width, height) - container.refreshOverlay(thumbnailPosition) - } - } else if (enableRefactorTaskThumbnail()) { + if (enableRefactorTaskThumbnail()) { container.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius container.thumbnailView.doOnSizeChange { width, height -> @@ -1056,7 +975,6 @@ constructor( protected fun createTaskContainer( task: Task, - @IdRes taskContentViewId: Int, @IdRes thumbnailViewId: Int, @IdRes iconViewId: Int, @IdRes showWindowViewId: Int, @@ -1065,28 +983,14 @@ constructor( taskOverlayFactory: TaskOverlayFactory, ): TaskContainer { val iconView = findViewById(iconViewId) as TaskViewIcon - val taskContentView = - if (enableRefactorTaskContentView()) findViewById(taskContentViewId) - else findViewById(thumbnailViewId) - val snapshotView = - if (enableRefactorTaskContentView()) taskContentView.findViewById(thumbnailViewId) - else taskContentView - - val digitalWellBeingToast: DigitalWellBeingToast? = - if (enableRefactorDigitalWellbeingToast()) { - null - } else { - findViewById(digitalWellbeingBannerId)!! - } return TaskContainer( this, task, - taskContentView, - snapshotView, + findViewById(thumbnailViewId), iconView, TransformingTouchDelegate(iconView.asView()), stagePosition, - digitalWellBeingToast, + findViewById(digitalWellbeingBannerId)!!, findViewById(showWindowViewId)!!, taskOverlayFactory, ) @@ -1121,14 +1025,14 @@ constructor( * ensuring TaskView fits into screen in fullscreen. */ open fun updateTaskSize(lastComputedTaskSize: Rect, lastComputedGridTaskSize: Rect) { - val thumbnailPadding = container.deviceProfile.overviewProfile.taskThumbnailTopMarginPx + val thumbnailPadding = container.deviceProfile.overviewTaskThumbnailTopMarginPx val taskWidth = lastComputedTaskSize.width() val taskHeight = lastComputedTaskSize.height() val nonGridScale: Float val boxTranslationY: Float val expectedWidth: Int val expectedHeight: Int - if (container.deviceProfile.getDeviceProperties().isTablet) { + if (container.deviceProfile.isTablet) { val boxWidth: Int val boxHeight: Int @@ -1170,8 +1074,8 @@ constructor( protected open fun updateThumbnailSize() { // TODO(b/271468547), we should default to setting translations only on the snapshot instead // of a hybrid of both margins and translations - firstTaskContainer?.taskContentView?.updateLayoutParams { - topMargin = container.deviceProfile.overviewProfile.taskThumbnailTopMarginPx + firstTaskContainer?.snapshotView?.updateLayoutParams { + topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx } taskContainers.forEach { it.digitalWellBeingToast?.setupLayout() } } @@ -1184,11 +1088,11 @@ constructor( val thumbnailBounds = Rect() if (relativeToDragLayer) { container.dragLayer.getDescendantRectRelativeToSelf( - it.taskContentView, + it.snapshotView, thumbnailBounds, ) } else { - thumbnailBounds.set(it.taskContentView) + thumbnailBounds.set(it.snapshotView) } bounds.union(thumbnailBounds) } @@ -1230,10 +1134,7 @@ constructor( } } } - if ( - needsUpdate(changes, FLAG_UPDATE_ICON) && - !(enableOverviewIconMenu() && enableRefactorTaskThumbnail()) - ) { + if (needsUpdate(changes, FLAG_UPDATE_ICON) && !enableOverviewIconMenu()) { taskContainers.forEach { if (visible) { recentsModel.iconCache @@ -1269,6 +1170,7 @@ constructor( if (state is TaskData.Data) { setIcon(container.iconView, state.icon) container.iconView.setText(state.title) + container.digitalWellBeingToast?.initialize() } else { setIcon(container.iconView, null) container.iconView.setText(null) @@ -1295,19 +1197,19 @@ constructor( with(iconView) { if (icon != null) { setDrawable(icon) - asView().setOnClickListener { + setOnClickListener { if (!confirmSecondSplitSelectApp()) { showTaskMenu(this) } } - asView().setOnLongClickListener { + setOnLongClickListener { requestDisallowInterceptTouchEvent(true) showTaskMenu(this) } } else { setDrawable(null) - asView().setOnClickListener(null) - asView().setOnLongClickListener(null) + setOnClickListener(null) + setOnLongClickListener(null) } } } @@ -1508,10 +1410,6 @@ constructor( isQuickSwitch: Boolean = false, callback: (launched: Boolean) -> Unit, ) { - val callbackWithLogging = { launchSuccess: Boolean -> - Log.d(TAG, "launchWithoutAnimation - callback: launchSuccess: $launchSuccess") - callback(launchSuccess) - } val firstTaskContainer = firstTaskContainer ?: return TestLogging.recordEvent( TestProtocol.SEQUENCE_MAIN, @@ -1535,7 +1433,7 @@ constructor( // checking whether to handle resume, but that can come in before // startHome() changes the state, so force-refresh here to ensure the // taskbar is updated - it.mContainerInterface.taskbarController?.refreshResumedState() + it.mSizeStrategy.taskbarController?.refreshResumedState() } } } @@ -1546,9 +1444,8 @@ constructor( 0, 0, Executors.MAIN_EXECUTOR.handler, - { callbackWithLogging(true) }, + { callback(true) }, ) { - Log.d(TAG, "launchWithoutAnimation: launch animation finished") failureListener.onTransitionFinished() } .apply { @@ -1560,24 +1457,22 @@ constructor( disableStartingWindow = firstTaskContainer.shouldShowSplashView } Executors.UI_HELPER_EXECUTOR.execute { - Log.d( - TAG, - "launchWithoutAnimation(isQuickSwitch: $isQuickSwitch) - " + - "startActivityFromRecents: ${taskIds.contentToString()}", - ) if ( !ActivityManagerWrapper.getInstance() .startActivityFromRecents(firstTaskContainer.task.key, if (Utilities.ATLEAST_Q) opts else null) ) { - Log.d(TAG, "launchWithoutAnimation - task launch failed") // If the call to start activity failed, then post the result immediately, // otherwise, wait for the animation start callback from the activity options // above Executors.MAIN_EXECUTOR.post { notifyTaskLaunchFailed("launchTask") - callbackWithLogging(false) + callback(false) } } + Log.d( + TAG, + "launchWithoutAnimation - startActivityFromRecents: ${taskIds.contentToString()}", + ) } } @@ -1627,9 +1522,7 @@ constructor( // Don't show menu when selecting second split screen app return true } - if ( - !container.deviceProfile.getDeviceProperties().isTablet && !recentsView.isClearAllHidden - ) { + if (!container.deviceProfile.isTablet && !recentsView.isClearAllHidden) { recentsView.snapToPage(recentsView.indexOfChild(this)) return false } @@ -1657,19 +1550,28 @@ constructor( private fun showTaskMenuWithContainer(menuContainer: TaskContainer): Boolean { val recentsView = recentsView ?: return false - // Disable hover on all TaskView's whilst menu is showing. - recentsView.setTaskBorderEnabled(false) + if (enableHoverOfChildElementsInTaskview()) { + // Disable hover on all TaskView's whilst menu is showing. + recentsView.setTaskBorderEnabled(false) + } return if (enableOverviewIconMenu() && menuContainer.iconView is IconAppChipView) { if (menuContainer.iconView.status == AppChipStatus.Expanded) { closeTaskMenu() } else { - TaskMenuView.showForTask(menuContainer) { recentsView.setTaskBorderEnabled(true) } + menuContainer.iconView.revealAnim(/* isRevealing= */ true) + TaskMenuView.showForTask(menuContainer) { + val isAnimated = !recentsView.isSplitSelectionActive + menuContainer.iconView.revealAnim(/* isRevealing= */ false, isAnimated) + if (enableHoverOfChildElementsInTaskview()) { + recentsView.setTaskBorderEnabled(true) + } + } } - } else if (container.deviceProfile.getDeviceProperties().isTablet) { + } else if (container.deviceProfile.isTablet) { val alignedOptionIndex = if ( recentsView.isOnGridBottomRow(menuContainer.taskView) && - container.deviceProfile.deviceProperties.isLandscape + container.deviceProfile.isLandscape ) { if (enableGridOnlyOverview()) { // With no focused task, there is less available space below the tasks, so @@ -1684,10 +1586,16 @@ constructor( 0 } TaskMenuViewWithArrow.showForTask(menuContainer, alignedOptionIndex) { - recentsView.setTaskBorderEnabled(true) + if (enableHoverOfChildElementsInTaskview()) { + recentsView.setTaskBorderEnabled(true) + } } } else { - TaskMenuView.showForTask(menuContainer) { recentsView.setTaskBorderEnabled(true) } + TaskMenuView.showForTask(menuContainer) { + if (enableHoverOfChildElementsInTaskview()) { + recentsView.setTaskBorderEnabled(true) + } + } } } @@ -1712,8 +1620,8 @@ constructor( tempCenterCoordinates: FloatArray, transformingTouchDelegate: TransformingTouchDelegate, ) { - val viewHalfWidth = view.asView().width / 2f - val viewHalfHeight = view.asView().height / 2f + val viewHalfWidth = view.width / 2f + val viewHalfHeight = view.height / 2f Utilities.getDescendantCoordRelativeToAncestor( view.asView(), container.dragLayer, @@ -1773,11 +1681,7 @@ constructor( private fun onSettledProgressUpdated(settledProgress: Float) { taskContainers.forEach { it.iconView.setContentAlpha(settledProgress) - if (enableRefactorDigitalWellbeingToast() && it.taskContentView is TaskContentView) { - it.taskContentView.onParentAnimationProgress(settledProgress) - } else { - it.digitalWellBeingToast?.bannerOffsetPercentage = 1f - settledProgress - } + it.digitalWellBeingToast?.bannerOffsetPercentage = 1f - settledProgress } } @@ -1825,7 +1729,7 @@ constructor( open fun setThumbnailVisibility(visibility: Int, taskId: Int) { taskContainers.forEach { if (visibility == VISIBLE || it.task.key.id == taskId) { - it.taskContentView.visibility = visibility + it.snapshotView.visibility = visibility it.digitalWellBeingToast?.visibility = visibility it.showWindowsView?.visibility = visibility it.overlay.setVisibility(visibility) @@ -1887,26 +1791,19 @@ constructor( protected open fun onFullscreenProgressChanged(fullscreenProgress: Float) { taskContainers.forEach { if (!enableOverviewIconMenu()) { - it.iconView.asView().visibility = if (fullscreenProgress < 1) VISIBLE else INVISIBLE + it.iconView.setVisibility(if (fullscreenProgress < 1) VISIBLE else INVISIBLE) } it.overlay.setFullscreenProgress(fullscreenProgress) } - updateSettledProgressFullscreen(fullscreenProgress) - updateFullscreenParams() - } - - protected fun updateSettledProgressFullscreen(fullscreenProgress: Float) { settledProgressFullscreen = SETTLED_PROGRESS_FAST_OUT_INTERPOLATOR.getInterpolation(1 - fullscreenProgress) + updateFullscreenParams() } protected open fun updateFullscreenParams() { updateFullscreenParams(thumbnailFullscreenParams) taskContainers.forEach { - if (enableRefactorTaskContentView()) { - (it.taskContentView as TaskContentView).cornerRadius = - thumbnailFullscreenParams.currentCornerRadius - } else if (enableRefactorTaskThumbnail()) { + if (enableRefactorTaskThumbnail()) { it.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius } else { it.thumbnailViewDeprecated.setFullscreenParams(thumbnailFullscreenParams) @@ -1923,11 +1820,7 @@ constructor( isClickable = modalness == 0f taskContainers.forEach { it.iconView.setModalAlpha(1f - modalness) - if (enableRefactorDigitalWellbeingToast() && it.taskContentView is TaskContentView) { - it.taskContentView.onParentAnimationProgress(1f - modalness) - } else { - it.digitalWellBeingToast?.bannerOffsetPercentage = modalness - } + it.digitalWellBeingToast?.bannerOffsetPercentage = modalness } if (enableGridOnlyOverview()) { modalAlpha = if (isSelectedTask) 1f else (1f - modalness) @@ -1948,18 +1841,14 @@ constructor( } fun resetViewTransforms() { - // Dismiss translation shouldn't reset if actively being dragged - if (!isBeingDraggedForDismissal) { - secondaryDismissTranslationProperty.setValue(this, 0f) - } - primaryDismissTranslationProperty.setValue(this, 0f) - // fullscreenTranslation and accumulatedTranslation should not be reset, as // resetViewTransforms is called during QuickSwitch scrolling. + dismissTranslationX = 0f taskOffsetTranslationX = 0f taskResistanceTranslationX = 0f splitSelectTranslationX = 0f gridEndTranslationX = 0f + dismissTranslationY = 0f taskOffsetTranslationY = 0f taskResistanceTranslationY = 0f if (recentsView?.isSplitSelectionActive != true) { diff --git a/quickstep/src/com/android/quickstep/views/TaskViewIcon.java b/quickstep/src/com/android/quickstep/views/TaskViewIcon.java index 04776e067d..80e3a2b932 100644 --- a/quickstep/src/com/android/quickstep/views/TaskViewIcon.java +++ b/quickstep/src/com/android/quickstep/views/TaskViewIcon.java @@ -27,6 +27,16 @@ import com.android.quickstep.util.RecentsOrientedState; */ public interface TaskViewIcon { + /** + * Returns the width of this icon view. + */ + int getWidth(); + + /** + * Returns the height of this icon view. + */ + int getHeight(); + /** * Sets the opacity of the view. */ @@ -52,6 +62,26 @@ public interface TaskViewIcon { */ void setDrawable(@Nullable Drawable icon); + /** + * Register a callback to be invoked when this view is clicked. + */ + void setOnClickListener(@Nullable View.OnClickListener l); + + /** + * Register a callback to be invoked when this view is clicked and held. + */ + void setOnLongClickListener(@Nullable View.OnLongClickListener l); + + /** + * Returns the LayoutParams associated with this view. + */ + ViewGroup.LayoutParams getLayoutParams(); + + /** + * Sets the layout parameters associated with this view. + */ + void setLayoutParams(ViewGroup.LayoutParams params); + /** * Sets the degrees that the view is rotated around the pivot point. */ @@ -67,6 +97,11 @@ public interface TaskViewIcon { */ void setIconOrientation(RecentsOrientedState orientationState, boolean isGridTask); + /** + * Sets the visibility state of this view. + */ + void setVisibility(int visibility); + /** * Sets the tint color of the icon, useful for scrimming or dimming. * @@ -75,6 +110,11 @@ public interface TaskViewIcon { */ void setIconColorTint(int color, float amount); + /** + * Gets the opacity of the view. + */ + float getAlpha(); + /** * Returns the width of this icon view's drawable. */ @@ -85,6 +125,16 @@ public interface TaskViewIcon { */ int getDrawableHeight(); + /** + * Directly calls any attached OnClickListener. + */ + boolean callOnClick(); + + /** + * Calls this view's OnLongClickListener. + */ + boolean performLongClick(); + /** * Sets the text for this icon view if any text view is associated. */ diff --git a/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java b/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java index 8221629aeb..cb7254f1fe 100644 --- a/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java @@ -62,12 +62,6 @@ public class StateManagerProtoLogProxy { ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.onStateTransitionEnd: state: %s", state); } - public static void logOnRepeatStateSetAborted(@NonNull Object state) { - if (!ENABLE_STATE_MANAGER_PROTO_LOG.isTrue() || !isProtoLogInitialized()) return; - ProtoLog.d(LAUNCHER_STATE_MANAGER, - "StateManager.onRepeatStateSetAborted: state: %s", state); - } - public static void logCancelAnimation(boolean animationOngoing, @NonNull String trace) { if (!ENABLE_STATE_MANAGER_PROTO_LOG.isTrue() || !isProtoLogInitialized()) return; ProtoLog.d(LAUNCHER_STATE_MANAGER, diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureErrorDetector.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureErrorDetector.java index 799ba77a36..ab10979927 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureErrorDetector.java +++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureErrorDetector.java @@ -36,12 +36,11 @@ public class ActiveGestureErrorDetector { SET_END_TARGET_NEW_TASK, SET_END_TARGET_ALL_APPS, ON_SETTLED_ON_END_TARGET, ON_START_RECENTS_ANIMATION, ON_FINISH_RECENTS_ANIMATION, ON_CANCEL_RECENTS_ANIMATION, START_RECENTS_ANIMATION, FINISH_RECENTS_ANIMATION, CANCEL_RECENTS_ANIMATION, - SET_ON_PAGE_TRANSITION_END_CALLBACK, CANCEL_CURRENT_ANIMATION, + SET_ON_PAGE_TRANSITION_END_CALLBACK, CANCEL_CURRENT_ANIMATION, CLEANUP_SCREENSHOT, SCROLLER_ANIMATION_ABORTED, TASK_APPEARED, EXPECTING_TASK_APPEARED, FLAG_USING_OTHER_ACTIVITY_INPUT_CONSUMER, LAUNCHER_DESTROYED, RECENT_TASKS_MISSING, INVALID_VELOCITY_ON_SWIPE_UP, RECENTS_ANIMATION_START_PENDING, QUICK_SWITCH_FROM_HOME_FALLBACK, QUICK_SWITCH_FROM_HOME_FAILED, NAVIGATION_MODE_SWITCHED, - RECENTS_ANIMATION_START_TIMEOUT, /** * These GestureEvents are specifically associated to state flags that get set in @@ -127,6 +126,15 @@ public class ActiveGestureErrorDetector { + "before/without startRecentsAnimation.", writer); break; + case CLEANUP_SCREENSHOT: + errorDetected |= printErrorIfTrue( + !encounteredEvents.contains(GestureEvent.STATE_SCREENSHOT_CAPTURED), + prefix, + /* errorMessage= */ "recents activity screenshot was " + + "cleaned up before/without STATE_SCREENSHOT_CAPTURED " + + "being set.", + writer); + break; case SCROLLER_ANIMATION_ABORTED: errorDetected |= printErrorIfTrue( encounteredEvents.contains(GestureEvent.SET_END_TARGET_HOME) @@ -298,13 +306,6 @@ public class ActiveGestureErrorDetector { /* errorMessage= */ "Navigation mode switched mid-gesture.", writer); break; - case RECENTS_ANIMATION_START_TIMEOUT: - errorDetected |= printErrorIfTrue( - true, - prefix, - /* errorMessage= */ "Recents animation start timed out.", - writer); - break; case EXPECTING_TASK_APPEARED: case MOTION_DOWN: case SET_END_TARGET: @@ -419,6 +420,15 @@ public class ActiveGestureErrorDetector { + "wasn't called and STATE_HANDLER_INVALIDATED wasn't set.", writer); + errorDetected |= printErrorIfTrue( + /* condition= */ encounteredEvents.contains( + GestureEvent.STATE_RECENTS_ANIMATION_CANCELED) + && !encounteredEvents.contains(GestureEvent.CLEANUP_SCREENSHOT), + prefix, + /* errorMessage= */ "STATE_RECENTS_ANIMATION_CANCELED was set but " + + "the task screenshot wasn't cleaned up.", + writer); + errorDetected |= printErrorIfTrue( /* condition= */ encounteredEvents.contains( GestureEvent.EXPECTING_TASK_APPEARED) diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java index 1990c348b5..1c8656c54b 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java @@ -17,6 +17,7 @@ package com.android.quickstep.util; import static android.view.MotionEvent.ACTION_DOWN; +import static com.android.launcher3.Flags.enableActiveGestureProtoLog; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.CANCEL_RECENTS_ANIMATION; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.FINISH_RECENTS_ANIMATION; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.INVALID_VELOCITY_ON_SWIPE_UP; @@ -32,7 +33,6 @@ import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.QUICK_SWITCH_FROM_HOME_FAILED; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.QUICK_SWITCH_FROM_HOME_FALLBACK; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.RECENTS_ANIMATION_START_PENDING; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.RECENTS_ANIMATION_START_TIMEOUT; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.RECENT_TASKS_MISSING; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.SET_END_TARGET; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.START_RECENTS_ANIMATION; @@ -71,7 +71,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( /* event= */ "AbsSwipeUpHandler.onRecentsAnimationCanceled", /* gestureEvent= */ CANCEL_RECENTS_ANIMATION); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.onRecentsAnimationCanceled"); } @@ -79,7 +79,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( /* event= */ "RecentsAnimationCallbacks.onAnimationFinished", ON_FINISH_RECENTS_ANIMATION); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.onAnimationFinished"); } @@ -87,27 +87,27 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( "AbsSwipeUpHandler.cancelCurrentAnimation", ActiveGestureErrorDetector.GestureEvent.CANCEL_CURRENT_ANIMATION); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.cancelCurrentAnimation"); } public static void logAbsSwipeUpHandlerOnTasksAppeared() { ActiveGestureLog.INSTANCE.addLog("AbsSwipeUpHandler.onTasksAppeared: " + "force finish recents animation complete; clearing state callback."); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.onTasksAppeared: " + "force finish recents animation complete; clearing state callback."); } public static void logHandOffAnimation() { ActiveGestureLog.INSTANCE.addLog("AbsSwipeUpHandler.handOffAnimation"); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.handOffAnimation"); } public static void logFinishRecentsAnimationOnTasksAppeared() { ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimationOnTasksAppeared"); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRecentsAnimationOnTasksAppeared"); } @@ -115,14 +115,14 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( /* event= */ "RecentsAnimationCallbacks.onAnimationCanceled", /* gestureEvent= */ ON_CANCEL_RECENTS_ANIMATION); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onAnimationCanceled"); } public static void logRecentsAnimationCallbacksOnTasksAppeared() { ActiveGestureLog.INSTANCE.addLog("RecentsAnimationCallbacks.onTasksAppeared", ActiveGestureErrorDetector.GestureEvent.TASK_APPEARED); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onTasksAppeared"); } @@ -130,32 +130,32 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( /* event= */ "TaskAnimationManager.startRecentsAnimation", /* gestureEvent= */ START_RECENTS_ANIMATION); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager.startRecentsAnimation"); } public static void logLaunchingSideTaskFailed() { ActiveGestureLog.INSTANCE.addLog("Unable to launch side task (no recents)"); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Unable to launch side task (no recents)"); } public static void logContinueRecentsAnimation() { ActiveGestureLog.INSTANCE.addLog(/* event= */ "continueRecentsAnimation"); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "continueRecentsAnimation"); } public static void logCleanUpRecentsAnimationSkipped() { ActiveGestureLog.INSTANCE.addLog( /* event= */ "cleanUpRecentsAnimation skipped due to wrong callbacks"); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "cleanUpRecentsAnimation skipped due to wrong callbacks"); } public static void logCleanUpRecentsAnimation() { ActiveGestureLog.INSTANCE.addLog(/* event= */ "cleanUpRecentsAnimation"); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "cleanUpRecentsAnimation"); } @@ -163,7 +163,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "TIS.onInputEvent(displayId=%d): Cannot process input event: user is locked", displayId)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onInputEvent(displayId=%d): Cannot process input event: user is locked", displayId); @@ -175,7 +175,7 @@ public class ActiveGestureProtoLogProxy { + "but a previously-requested recents animation hasn't started. " + "Ignoring all following motion events.", displayId), RECENTS_ANIMATION_START_PENDING); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onMotionEvent(displayId=%d): A new gesture has been started, " + "but a previously-requested recents animation hasn't started. " @@ -186,7 +186,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "TIS.onInputEvent(displayId=%d): Cannot process input event: " + "using 3-button nav and event is not a trackpad event", displayId)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onInputEvent(displayId=%d): Cannot process input event: " + "using 3-button nav and event is not a trackpad event", displayId); @@ -194,40 +194,46 @@ public class ActiveGestureProtoLogProxy { public static void logPreloadRecentsAnimation() { ActiveGestureLog.INSTANCE.addLog("preloadRecentsAnimation"); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "preloadRecentsAnimation"); } public static void logRecentTasksMissing() { ActiveGestureLog.INSTANCE.addLog("Null mRecentTasks", RECENT_TASKS_MISSING); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Null mRecentTasks"); } + public static void logExecuteHomeCommand() { + ActiveGestureLog.INSTANCE.addLog("OverviewCommandHelper.executeCommand(HOME)"); + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "OverviewCommandHelper.executeCommand(HOME)"); + } + public static void logFinishRecentsAnimationCallback() { ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation-callback"); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRecentsAnimation-callback"); } public static void logOnScrollerAnimationAborted() { ActiveGestureLog.INSTANCE.addLog("scroller animation aborted", ActiveGestureErrorDetector.GestureEvent.SCROLLER_ANIMATION_ABORTED); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "scroller animation aborted"); } public static void logInputConsumerBecameActive(@NonNull String consumerName) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "%s became active", consumerName)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "%s became active", consumerName); } public static void logTaskLaunchFailed(int launchedTaskId) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Launch failed, task (id=%d) finished mid transition", launchedTaskId)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Launch failed, task (id=%d) finished mid transition", launchedTaskId); } @@ -235,7 +241,7 @@ public class ActiveGestureProtoLogProxy { public static void logOnPageEndTransition(int nextPageIndex) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "onPageEndTransition: current page index updated: %d", nextPageIndex)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onPageEndTransition: current page index updated: %d", nextPageIndex); } @@ -245,7 +251,7 @@ public class ActiveGestureProtoLogProxy { "Quick switch from home fallback case: The TaskView at index %d is missing.", taskIndex), QUICK_SWITCH_FROM_HOME_FALLBACK); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Quick switch from home fallback case: The TaskView at index %d is missing.", taskIndex); @@ -256,7 +262,7 @@ public class ActiveGestureProtoLogProxy { "Quick switch from home failed: TaskViews at indices %d and 0 are missing.", taskIndex), QUICK_SWITCH_FROM_HOME_FAILED); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Quick switch from home failed: TaskViews at indices %d and 0 are missing.", taskIndex); @@ -266,42 +272,42 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "finishRecentsAnimation: %b", toRecents), /* gestureEvent= */ FINISH_RECENTS_ANIMATION); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRecentsAnimation: %b", toRecents); } public static void logSetEndTarget(@NonNull String target) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "setEndTarget %s", target), /* gestureEvent= */ SET_END_TARGET); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "setEndTarget %s", target); } public static void logStartHomeIntent(@NonNull String reason) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "OverviewComponentObserver.startHomeIntent: %s", reason)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "OverviewComponentObserver.startHomeIntent: %s", reason); } public static void logRunningTaskPackage(@NonNull String packageName) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Current running task package name=%s", packageName)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Current running task package name=%s", packageName); } public static void logSysuiStateFlags(@NonNull String stateFlags) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Current SystemUi state flags=%s", stateFlags)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Current SystemUi state flags=%s", stateFlags); } public static void logSetInputConsumer(@NonNull String consumerName, @NonNull String reason) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "setInputConsumer: %s. reason(s):%s", consumerName, reason)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "setInputConsumer: %s. reason(s):%s", consumerName, reason); } @@ -313,7 +319,7 @@ public class ActiveGestureProtoLogProxy { + "one (%s) was excluded from recents", otherTaskPackage, runningTaskPackage)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Changing active task to %s because the previous task running on top of this " + "one (%s) was excluded from recents", @@ -334,7 +340,7 @@ public class ActiveGestureProtoLogProxy { /* gestureEvent= */ action == ACTION_DOWN ? MOTION_DOWN : MOTION_UP); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onMotionEvent(%d, %d): %s, %s, displayId=%d", x, @@ -356,7 +362,7 @@ public class ActiveGestureProtoLogProxy { pointerCount, displayId), MOTION_MOVE); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onMotionEvent: %s, %s, pointerCount: %d, displayId=%d", action, @@ -369,7 +375,7 @@ public class ActiveGestureProtoLogProxy { @NonNull String action, @NonNull String classification, int displayId) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "onMotionEvent: %s, %s, displayId=%d", action, classification, displayId)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onMotionEvent: %s, %s, displayId=%d", action, classification, displayId); } @@ -383,7 +389,7 @@ public class ActiveGestureProtoLogProxy { startNavMode, currentNavMode), NAVIGATION_MODE_SWITCHED); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onInputEvent(displayId=%d): Navigation mode switched mid-gesture (%s -> %s); " + "cancelling gesture.", @@ -396,7 +402,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "TIS.onInputEvent(displayId=%d): Cannot process input event: " + "received unknown event %s", displayId, event)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onInputEvent(displayId=%d): Cannot process input event: " + "received unknown event %s", displayId, event); @@ -405,14 +411,14 @@ public class ActiveGestureProtoLogProxy { public static void logFinishRunningRecentsAnimation(boolean toHome) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "finishRunningRecentsAnimation: %b", toHome)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRunningRecentsAnimation: %b", toHome); } public static void logOnRecentsAnimationStartCancelled() { ActiveGestureLog.INSTANCE.addLog("RecentsAnimationCallbacks.onAnimationStart (canceled): 0", /* gestureEvent= */ ON_START_RECENTS_ANIMATION); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onAnimationStart (canceled): 0"); } @@ -420,7 +426,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "RecentsAnimationCallbacks.onAnimationStart: %d", appCount), /* gestureEvent= */ ON_START_RECENTS_ANIMATION); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onAnimationStart: %d", appCount); } @@ -430,7 +436,7 @@ public class ActiveGestureProtoLogProxy { "TaskAnimationManager.startRecentsAnimation(%s): " + "Setting mRecentsAnimationStartPending = false", callback)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager.startRecentsAnimation(%s): " + "Setting mRecentsAnimationStartPending = false", @@ -442,7 +448,7 @@ public class ActiveGestureProtoLogProxy { "TaskAnimationManager.startRecentsAnimation: " + "Setting mRecentsAnimationStartPending = %b", value)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager.startRecentsAnimation: " + "Setting mRecentsAnimationStartPending = %b", @@ -452,7 +458,7 @@ public class ActiveGestureProtoLogProxy { public static void logLaunchingSideTask(int taskId) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Launching side task id=%d", taskId)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Launching side task id=%d", taskId); } @@ -460,7 +466,7 @@ public class ActiveGestureProtoLogProxy { int displayId, @NonNull ActiveGestureLog.CompoundString reason) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "TIS.onMotionEvent(displayId=%d): ", displayId).append(reason)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onMotionEvent(displayId=%d): %s", displayId, reason.toString()); } @@ -468,14 +474,14 @@ public class ActiveGestureProtoLogProxy { public static void logStartNewTask(@NonNull ActiveGestureLog.CompoundString tasks) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Launching task: ").append(tasks)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onMotionEvent: %s", tasks.toString()); } public static void logMotionPauseDetectorEvent(@NonNull ActiveGestureLog.CompoundString event) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "MotionPauseDetector: ").append(event)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "MotionPauseDetector: %s", event.toString()); } @@ -483,7 +489,7 @@ public class ActiveGestureProtoLogProxy { @NonNull ActiveGestureLog.CompoundString reason) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "handleTaskAppeared check failed: ").append(reason)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "handleTaskAppeared check failed: %s", reason.toString()); } @@ -495,7 +501,7 @@ public class ActiveGestureProtoLogProxy { @NonNull String string, @Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) { ActiveGestureLog.INSTANCE.addLog(string, gestureEvent); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "%s", string); } @@ -503,7 +509,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "onSettledOnEndTarget %s", endTarget), /* gestureEvent= */ ON_SETTLED_ON_END_TARGET); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onSettledOnEndTarget %s", endTarget); } @@ -514,7 +520,7 @@ public class ActiveGestureProtoLogProxy { velocityY, angle), velocityX == 0 && velocityY == 0 ? INVALID_VELOCITY_ON_SWIPE_UP : null); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "calculateEndTarget: velocities=(x=%fdp/ms, y=%fdp/ms), angle=%f", velocityX, @@ -527,7 +533,7 @@ public class ActiveGestureProtoLogProxy { "Forcefully finishing recents animation: Unexpected task appeared id=%d, pkg=%s", taskId, packageName)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Forcefully finishing recents animation: Unexpected task appeared id=%d, pkg=%s", taskId, @@ -537,7 +543,7 @@ public class ActiveGestureProtoLogProxy { public static void logCreateTouchRegionForDisplay(int displayRotation, @NonNull Point displaySize, @NonNull RectF swipeRegion, @NonNull RectF ohmRegion, int gesturalHeight, int largerGesturalHeight, @NonNull String reason) { - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "OrientationTouchTransformer.createRegionForDisplay: " + "dispRot=%d, dispSize=%s, swipeRegion=%s, ohmRegion=%s, " @@ -550,25 +556,16 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "TaskAnimationManager not available for displayId=%d", displayId)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager not available for displayId=%d", displayId); } - public static void logOnAbsSwipeUpHandlerNotAvailable(int displayId) { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( - "AbsSwipeUpHandler not available for displayId=%d", - displayId)); - if (!isProtoLogInitialized()) return; - ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler not available for displayId=%d", - displayId); - } - public static void logGestureStartSwipeHandler(@NonNull String interactionHandler) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "OtherActivityInputConsumer.startTouchTrackingForWindowAnimation: " + "interactionHandler=%s", interactionHandler)); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "OtherActivityInputConsumer.startTouchTrackingForWindowAnimation: " + "interactionHandler=%s", interactionHandler); @@ -578,17 +575,8 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog("Launcher destroyed while mRecentsAnimationStartPending ==" + " true, queuing a callback to clean the pending animation up on start", /* gestureEvent= */ ON_START_RECENTS_ANIMATION); - if (!isProtoLogInitialized()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Launcher destroyed while mRecentsAnimationStartPending ==" + " true, queuing a callback to clean the pending animation up on start"); } - - public static void logRecentsAnimationStartTimedOut() { - ActiveGestureLog.INSTANCE.addLog("Recents animation start has timed out; forcefully " - + "cleaning up the recents animation.", - /* gestureEvent= */ RECENTS_ANIMATION_START_TIMEOUT); - if (!isProtoLogInitialized()) return; - ProtoLog.d(ACTIVE_GESTURE_LOG, "Recents animation start has timed out; forcefully " - + "cleaning up the recents animation."); - } } diff --git a/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java b/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java index 7696a70a07..2327cfcf1d 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java +++ b/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java @@ -30,9 +30,7 @@ public enum QuickstepProtoLogGroup implements IProtoLogGroup { ACTIVE_GESTURE_LOG(true, true, Constants.DEBUG_ACTIVE_GESTURE, "ActiveGestureLog"), RECENTS_WINDOW(true, true, Constants.DEBUG_RECENTS_WINDOW, "RecentsWindow"), - LAUNCHER_STATE_MANAGER(true, true, Constants.DEBUG_STATE_MANAGER, "LauncherStateManager"), - OVERVIEW_COMMAND_HELPER(true, true, Constants.DEBUG_OVERVIEW_COMMAND_HELPER, - "OverviewCommandHelper"); + LAUNCHER_STATE_MANAGER(true, true, Constants.DEBUG_STATE_MANAGER, "LauncherStateManager"); private final boolean mEnabled; private volatile boolean mLogToProto; @@ -127,7 +125,6 @@ public enum QuickstepProtoLogGroup implements IProtoLogGroup { private static final boolean DEBUG_ACTIVE_GESTURE = false; private static final boolean DEBUG_RECENTS_WINDOW = false; private static final boolean DEBUG_STATE_MANAGER = true; // b/279059025, b/325463989 - private static final boolean DEBUG_OVERVIEW_COMMAND_HELPER = true; private static final int LOG_START_ID = (int) (UUID.nameUUIDFromBytes(QuickstepProtoLogGroup.class.getName().getBytes()) diff --git a/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java index 41e9cefbc1..99888fb2a3 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java @@ -19,7 +19,7 @@ package com.android.quickstep.util; import static com.android.quickstep.util.QuickstepProtoLogGroup.RECENTS_WINDOW; import static com.android.quickstep.util.QuickstepProtoLogGroup.isProtoLogInitialized; -import android.window.DesktopExperienceFlags; +import android.window.DesktopModeFlags; import androidx.annotation.NonNull; @@ -37,13 +37,8 @@ import com.android.launcher3.Flags; * method. Or, if an existing entry needs to be modified, simply update it here. */ public class RecentsWindowProtoLogProxy { - private static final DesktopExperienceFlags.DesktopExperienceFlag - ENABLE_RECENTS_WINDOW_PROTO_LOG = - new DesktopExperienceFlags.DesktopExperienceFlag( - Flags::enableRecentsWindowProtoLog, - false, - Flags.FLAG_ENABLE_RECENTS_WINDOW_PROTO_LOG); - + private static final DesktopModeFlags.DesktopModeFlag ENABLE_RECENTS_WINDOW_PROTO_LOG = + new DesktopModeFlags.DesktopModeFlag(Flags::enableRecentsWindowProtoLog, true); public static void logOnStateSetStart(@NonNull String stateName) { if (!ENABLE_RECENTS_WINDOW_PROTO_LOG.isTrue() || !isProtoLogInitialized()) return; ProtoLog.d(RECENTS_WINDOW, "onStateSetStart: %s", stateName); @@ -54,11 +49,6 @@ public class RecentsWindowProtoLogProxy { ProtoLog.d(RECENTS_WINDOW, "onStateSetEnd: %s", stateName); } - public static void logOnRepeatStateSetAborted(@NonNull String stateName) { - if (!ENABLE_RECENTS_WINDOW_PROTO_LOG.isTrue() || !isProtoLogInitialized()) return; - ProtoLog.d(RECENTS_WINDOW, "onRepeatStateSetAborted: %s", stateName); - } - public static void logStartRecentsWindow(boolean isShown, boolean windowViewIsNull) { if (!ENABLE_RECENTS_WINDOW_PROTO_LOG.isTrue() || !isProtoLogInitialized()) return; ProtoLog.d(RECENTS_WINDOW, diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewScreenshotTest.kt index 3d83740163..b5a418b04d 100644 --- a/quickstep/tests/multivalentScreenshotTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewScreenshotTest.kt +++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewScreenshotTest.kt @@ -26,7 +26,7 @@ import android.widget.FrameLayout.LayoutParams.WRAP_CONTENT import androidx.activity.ComponentActivity import androidx.test.core.app.ApplicationProvider import com.android.launcher3.R -import com.android.wm.shell.shared.bubbles.BubbleBarLocation +import com.android.launcher3.taskbar.bubbles.testing.FakeBubbleViewFactory import com.google.android.apps.nexuslauncher.imagecomparison.goldenpathmanager.ViewScreenshotGoldenPathManager import org.junit.Rule import org.junit.Test @@ -69,7 +69,7 @@ class BubbleBarViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { screenshotRule.screenshotTest("bubbleBarView_collapsed_oneBubble") { activity -> activity.actionBar?.hide() setupBubbleBarView() - bubbleBarView.addBubble(createBubble("key1", Color.GREEN), false) + bubbleBarView.addBubble(createBubble("key1", Color.GREEN)) val container = FrameLayout(context) val lp = FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT) container.layoutParams = lp @@ -83,8 +83,8 @@ class BubbleBarViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { screenshotRule.screenshotTest("bubbleBarView_collapsed_twoBubbles") { activity -> activity.actionBar?.hide() setupBubbleBarView() - bubbleBarView.addBubble(createBubble("key1", Color.GREEN), true) - bubbleBarView.addBubble(createBubble("key2", Color.CYAN), true) + bubbleBarView.addBubble(createBubble("key1", Color.GREEN)) + bubbleBarView.addBubble(createBubble("key2", Color.CYAN)) val container = FrameLayout(context) val lp = FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT) container.layoutParams = lp @@ -105,14 +105,14 @@ class BubbleBarViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { ) { activity -> activity.actionBar?.hide() setupBubbleBarView() - bubbleBarView.addBubble(createBubble("key1", Color.GREEN), false) - bubbleBarView.addBubble(createBubble("key2", Color.CYAN), false) - bubbleBarView.addBubble(createBubble("key3", Color.MAGENTA), false) + bubbleBarView.addBubble(createBubble("key1", Color.GREEN)) + bubbleBarView.addBubble(createBubble("key2", Color.CYAN)) + bubbleBarView.addBubble(createBubble("key3", Color.MAGENTA)) val container = FrameLayout(context) val lp = FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT) container.layoutParams = lp container.addView(bubbleBarView) - bubbleBarView.animateExpanded(true) + bubbleBarView.isExpanded = true container } } @@ -124,23 +124,6 @@ class BubbleBarViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { val paddingTop = context.resources.getDimensionPixelSize(R.dimen.bubblebar_pointer_visible_size) bubbleBarView.setPadding(0, paddingTop, 0, 0) - bubbleBarView.setController( - object : BubbleBarView.Controller { - override fun getBubbleBarTranslationY(): Float = 0f - - override fun onBubbleBarTouched() {} - - override fun expandBubbleBar() {} - - override fun dismissBubbleBar() {} - - override fun updateBubbleBarLocation(location: BubbleBarLocation?, source: Int) {} - - override fun setIsDragging(dragging: Boolean) {} - - override fun onBubbleBarExpandedStateChanged(expanded: Boolean) {} - } - ) bubbleBarView.visibility = View.VISIBLE bubbleBarView.alpha = 1f } diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/launcher3/taskbar/bubbles/BubbleViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/launcher3/taskbar/bubbles/BubbleViewScreenshotTest.kt index 0661a99dbd..47f393ffc1 100644 --- a/quickstep/tests/multivalentScreenshotTests/src/com/android/launcher3/taskbar/bubbles/BubbleViewScreenshotTest.kt +++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/launcher3/taskbar/bubbles/BubbleViewScreenshotTest.kt @@ -18,6 +18,7 @@ package com.android.launcher3.taskbar.bubbles import android.content.Context import android.graphics.Color import androidx.test.core.app.ApplicationProvider +import com.android.launcher3.taskbar.bubbles.testing.FakeBubbleViewFactory import com.google.android.apps.nexuslauncher.imagecomparison.goldenpathmanager.ViewScreenshotGoldenPathManager import org.junit.Rule import org.junit.Test diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt index 86bfdcb22a..80b2c16e10 100644 --- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt +++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt @@ -16,23 +16,21 @@ package com.android.quickstep.task.thumbnail import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas import android.graphics.Color import android.graphics.Matrix +import android.graphics.Paint import android.graphics.drawable.BitmapDrawable -import android.platform.test.flag.junit.SetFlagsRule import android.view.LayoutInflater import android.view.Surface.ROTATION_0 -import com.android.launcher3.Flags +import androidx.core.graphics.set import com.android.launcher3.R -import com.android.launcher3.util.rule.setFlags -import com.android.quickstep.task.thumbnail.SplashHelper.createBitmap -import com.android.quickstep.task.thumbnail.SplashHelper.createSplash import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.BackgroundOnly import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Snapshot import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.SnapshotSplash import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized import com.google.android.apps.nexuslauncher.imagecomparison.goldenpathmanager.ViewScreenshotGoldenPathManager -import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -47,20 +45,13 @@ import platform.test.screenshot.getEmulatedDevicePathConfig @RunWith(ParameterizedAndroidJunit4::class) class TaskThumbnailViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { - @get:Rule(order = 0) val setFlagsRule = SetFlagsRule() - - @get:Rule(order = 1) + @get:Rule val screenshotRule = ViewScreenshotTestRule( emulationSpec, ViewScreenshotGoldenPathManager(getEmulatedDevicePathConfig(emulationSpec)), ) - @Before - fun setUp() { - setFlagsRule.setFlags(false, Flags.FLAG_ENABLE_REFACTOR_TASK_CONTENT_VIEW) - } - @Test fun taskThumbnailView_uninitializedByDefault() { screenshotRule.screenshotTest("taskThumbnailView_uninitialized") { activity -> @@ -74,7 +65,6 @@ class TaskThumbnailViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { screenshotRule.screenshotTest("taskThumbnailView_uninitialized") { activity -> activity.actionBar?.hide() val taskThumbnailView = createTaskThumbnailView(activity) - taskThumbnailView.setState(BackgroundOnly(Color.YELLOW)) taskThumbnailView.setState(Uninitialized) taskThumbnailView } @@ -100,25 +90,23 @@ class TaskThumbnailViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { } @Test - fun taskThumbnailView_liveTile() { + fun taskThumbnailView_liveTile_withoutHeader() { screenshotRule.screenshotTest("taskThumbnailView_liveTile") { activity -> activity.actionBar?.hide() - createTaskThumbnailView(activity).apply { setState(TaskThumbnailUiState.LiveTile) } + createTaskThumbnailView(activity).apply { + setState(TaskThumbnailUiState.LiveTile.WithoutHeader) + } } } @Test - fun taskThumbnailView_image() { + fun taskThumbnailView_image_withoutHeader() { screenshotRule.screenshotTest("taskThumbnailView_image") { activity -> activity.actionBar?.hide() createTaskThumbnailView(activity).apply { setState( SnapshotSplash( - Snapshot( - createBitmap(VIEW_ENV_WIDTH, VIEW_ENV_HEIGHT), - ROTATION_0, - Color.DKGRAY, - ), + Snapshot.WithoutHeader(createBitmap(), ROTATION_0, Color.DKGRAY), null, ) ) @@ -127,14 +115,14 @@ class TaskThumbnailViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { } @Test - fun taskThumbnailView_image_withImageMatrix() { + fun taskThumbnailView_image_withoutHeader_withImageMatrix() { screenshotRule.screenshotTest("taskThumbnailView_image_withMatrix") { activity -> activity.actionBar?.hide() createTaskThumbnailView(activity).apply { val lessThanHeightMatchingAspectRatio = (VIEW_ENV_HEIGHT / 2) - 200 setState( SnapshotSplash( - Snapshot( + Snapshot.WithoutHeader( createBitmap( width = VIEW_ENV_WIDTH / 2, height = lessThanHeightMatchingAspectRatio, @@ -151,17 +139,13 @@ class TaskThumbnailViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { } @Test - fun taskThumbnailView_splash() { + fun taskThumbnailView_splash_withoutHeader() { screenshotRule.screenshotTest("taskThumbnailView_partial_splash") { activity -> activity.actionBar?.hide() createTaskThumbnailView(activity).apply { setState( SnapshotSplash( - Snapshot( - createBitmap(VIEW_ENV_WIDTH, VIEW_ENV_HEIGHT), - ROTATION_0, - Color.DKGRAY, - ), + Snapshot.WithoutHeader(createBitmap(), ROTATION_0, Color.DKGRAY), BitmapDrawable(activity.resources, createSplash()), ) ) @@ -171,14 +155,14 @@ class TaskThumbnailViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { } @Test - fun taskThumbnailView_splash_withImageMatrix() { + fun taskThumbnailView_splash_withoutHeader_withImageMatrix() { screenshotRule.screenshotTest("taskThumbnailView_partial_splash_withMatrix") { activity -> activity.actionBar?.hide() createTaskThumbnailView(activity).apply { val lessThanHeightMatchingAspectRatio = (VIEW_ENV_HEIGHT / 2) - 200 setState( SnapshotSplash( - Snapshot( + Snapshot.WithoutHeader( createBitmap( width = VIEW_ENV_WIDTH / 2, height = lessThanHeightMatchingAspectRatio, @@ -249,6 +233,27 @@ class TaskThumbnailViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { return taskThumbnailView } + private fun createSplash() = createBitmap(width = 20, height = 20, rectColorRotation = 1) + + private fun createBitmap( + width: Int = VIEW_ENV_WIDTH, + height: Int = VIEW_ENV_HEIGHT, + rectColorRotation: Int = 0, + ) = + Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply { + Canvas(this).apply { + val paint = Paint() + paint.color = BITMAP_RECT_COLORS[rectColorRotation % 4] + drawRect(0f, 0f, width / 2f, height / 2f, paint) + paint.color = BITMAP_RECT_COLORS[(1 + rectColorRotation) % 4] + drawRect(width / 2f, 0f, width.toFloat(), height / 2f, paint) + paint.color = BITMAP_RECT_COLORS[(2 + rectColorRotation) % 4] + drawRect(0f, height / 2f, width / 2f, height.toFloat(), paint) + paint.color = BITMAP_RECT_COLORS[(3 + rectColorRotation) % 4] + drawRect(width / 2f, height / 2f, width.toFloat(), height.toFloat(), paint) + } + } + companion object { @Parameters(name = "{0}") @JvmStatic @@ -260,6 +265,7 @@ class TaskThumbnailViewScreenshotTest(emulationSpec: DeviceEmulationSpec) { ) const val CORNER_RADIUS = 56f + val BITMAP_RECT_COLORS = listOf(Color.GREEN, Color.RED, Color.BLUE, Color.CYAN) const val VIEW_ENV_WIDTH = 1440 const val VIEW_ENV_HEIGHT = 3120 } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManagerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManagerTest.kt index ee5b841ed2..7ebef45d27 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManagerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManagerTest.kt @@ -25,13 +25,10 @@ import android.platform.test.flag.junit.SetFlagsRule import android.view.WindowManager.TRANSIT_OPEN import android.view.WindowManager.TRANSIT_TO_FRONT import android.window.TransitionFilter -import android.window.TransitionFilter.CONTAINER_ORDER_ANY -import android.window.TransitionFilter.CONTAINER_ORDER_TOP import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.quickstep.SystemUiProxy -import com.android.window.flags2.Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_BUGFIX -import com.android.window.flags2.Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX +import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX import com.android.wm.shell.shared.desktopmode.DesktopModeStatus import com.google.common.truth.Truth.assertThat import org.junit.Before @@ -80,8 +77,7 @@ class DesktopAppLaunchTransitionManagerTest { @Test @EnableFlags(FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX) - @DisableFlags(FLAG_ENABLE_DESKTOP_APP_LAUNCH_BUGFIX) - fun registerTransitions_usesCorrectFilter_flagDisabled() { + fun registerTransitions_usesCorrectFilter() { transitionManager.registerTransitions() val filterArgumentCaptor = argumentCaptor() @@ -96,29 +92,5 @@ class DesktopAppLaunchTransitionManagerTest { assertThat(launchRequirement.mModes).isEqualTo(intArrayOf(TRANSIT_OPEN, TRANSIT_TO_FRONT)) assertThat(launchRequirement.mActivityType).isEqualTo(ACTIVITY_TYPE_STANDARD) assertThat(launchRequirement.mWindowingMode).isEqualTo(WINDOWING_MODE_FREEFORM) - assertThat(launchRequirement.mOrder).isEqualTo(CONTAINER_ORDER_TOP) - } - - @Test - @EnableFlags( - FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX, - FLAG_ENABLE_DESKTOP_APP_LAUNCH_BUGFIX, - ) - fun registerTransitions_usesCorrectFilter_flagEnabled() { - transitionManager.registerTransitions() - val filterArgumentCaptor = argumentCaptor() - - verify(systemUiProxy, times(1)) - .registerRemoteTransition(any(), filterArgumentCaptor.capture()) - - assertThat(filterArgumentCaptor.lastValue).isNotNull() - assertThat(filterArgumentCaptor.lastValue.mTypeSet) - .isEqualTo(intArrayOf(TRANSIT_OPEN, TRANSIT_TO_FRONT)) - assertThat(filterArgumentCaptor.lastValue.mRequirements).hasLength(1) - val launchRequirement = filterArgumentCaptor.lastValue.mRequirements!![0] - assertThat(launchRequirement.mModes).isEqualTo(intArrayOf(TRANSIT_OPEN, TRANSIT_TO_FRONT)) - assertThat(launchRequirement.mActivityType).isEqualTo(ACTIVITY_TYPE_STANDARD) - assertThat(launchRequirement.mWindowingMode).isEqualTo(WINDOWING_MODE_FREEFORM) - assertThat(launchRequirement.mOrder).isEqualTo(CONTAINER_ORDER_ANY) } } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/QuickstepModelDelegateTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/QuickstepModelDelegateTest.kt index a2b0338ab4..1c7af14667 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/QuickstepModelDelegateTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/QuickstepModelDelegateTest.kt @@ -19,16 +19,15 @@ import android.app.prediction.AppPredictor import android.app.prediction.AppTarget import android.app.prediction.AppTargetEvent import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.android.launcher3.LauncherAppState -import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS_PREDICTION import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION +import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_PREDICTION import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WALLPAPERS import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION -import com.android.launcher3.util.SandboxApplication +import com.android.launcher3.util.LauncherModelHelper +import org.junit.After import org.junit.Assert.assertNotSame import org.junit.Assert.assertSame import org.junit.Before -import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock @@ -36,50 +35,46 @@ import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations -import org.mockito.kotlin.mock /** Unit tests for [QuickstepModelDelegate]. */ @RunWith(AndroidJUnit4::class) class QuickstepModelDelegateTest { - @get:Rule val context = SandboxApplication().withModelDependency() - private lateinit var underTest: QuickstepModelDelegate + private lateinit var modelHelper: LauncherModelHelper @Mock private lateinit var target: AppTarget @Mock private lateinit var mockedAppTargetEvent: AppTargetEvent @Mock private lateinit var allAppsPredictor: AppPredictor @Mock private lateinit var hotseatPredictor: AppPredictor @Mock private lateinit var widgetRecommendationPredictor: AppPredictor - @Mock private lateinit var itemParserFactory: PredictedItemFactory.Factory @Before fun setUp() { MockitoAnnotations.initMocks(this) + modelHelper = LauncherModelHelper() underTest = QuickstepModelDelegate( - context, - context.appComponent.idp, - context.appComponent.userCache, - itemParserFactory, + modelHelper.sandboxContext, + modelHelper.sandboxContext.appComponent.idp, + modelHelper.sandboxContext.appComponent.packageManagerHelper, "", /* dbFileName */ ) - underTest.mAllPredictionAppsState.predictor = allAppsPredictor - underTest.mHotseatPredictionState.predictor = hotseatPredictor + underTest.mAllAppsState.predictor = allAppsPredictor + underTest.mHotseatState.predictor = hotseatPredictor underTest.mWidgetsRecommendationState.predictor = widgetRecommendationPredictor - underTest.mModel = LauncherAppState.getInstance(context).model - underTest.mDataModel = - BgDataModel( - WidgetsModel(context), - /* homeDataProvider */ { null }, - /* dumpManager */ mock(), - /* DaggerSingletonTracker */ mock(), - ) + underTest.mModel = modelHelper.model + underTest.mDataModel = BgDataModel(WidgetsModel(modelHelper.sandboxContext)) + } + + @After + fun tearDown() { + modelHelper.destroy() } @Test fun onAppTargetEvent_notifyTarget() { - underTest.onAppTargetEvent(mockedAppTargetEvent, CONTAINER_ALL_APPS_PREDICTION) + underTest.onAppTargetEvent(mockedAppTargetEvent, CONTAINER_PREDICTION) verify(allAppsPredictor).notifyAppTargetEvent(mockedAppTargetEvent) verifyNoMoreInteractions(hotseatPredictor) @@ -115,38 +110,38 @@ class QuickstepModelDelegateTest { @Test fun hotseatActionPin_recreateHotSeat() { - assertSame(underTest.mHotseatPredictionState.predictor, hotseatPredictor) + assertSame(underTest.mHotseatState.predictor, hotseatPredictor) val appTargetEvent = AppTargetEvent.Builder(target, AppTargetEvent.ACTION_PIN).build() underTest.markActive() underTest.onAppTargetEvent(appTargetEvent, CONTAINER_HOTSEAT_PREDICTION) verify(hotseatPredictor).destroy() - assertNotSame(underTest.mHotseatPredictionState.predictor, hotseatPredictor) + assertNotSame(underTest.mHotseatState.predictor, hotseatPredictor) } @Test fun hotseatActionUnpin_recreateHotSeat() { - assertSame(underTest.mHotseatPredictionState.predictor, hotseatPredictor) + assertSame(underTest.mHotseatState.predictor, hotseatPredictor) underTest.markActive() val appTargetEvent = AppTargetEvent.Builder(target, AppTargetEvent.ACTION_UNPIN).build() underTest.onAppTargetEvent(appTargetEvent, CONTAINER_HOTSEAT_PREDICTION) verify(hotseatPredictor).destroy() - assertNotSame(underTest.mHotseatPredictionState.predictor, hotseatPredictor) + assertNotSame(underTest.mHotseatState.predictor, hotseatPredictor) } @Test fun container_actionPin_notRecreateHotSeat() { - assertSame(underTest.mHotseatPredictionState.predictor, hotseatPredictor) + assertSame(underTest.mHotseatState.predictor, hotseatPredictor) val appTargetEvent = AppTargetEvent.Builder(target, AppTargetEvent.ACTION_UNPIN).build() underTest.markActive() - underTest.onAppTargetEvent(appTargetEvent, CONTAINER_ALL_APPS_PREDICTION) + underTest.onAppTargetEvent(appTargetEvent, CONTAINER_PREDICTION) verify(allAppsPredictor, never()).destroy() verify(hotseatPredictor, never()).destroy() - assertSame(underTest.mHotseatPredictionState.predictor, hotseatPredictor) + assertSame(underTest.mHotseatState.predictor, hotseatPredictor) } } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt index 61c0a1b54b..42adfec82c 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt @@ -30,13 +30,11 @@ import com.android.launcher3.pm.UserCache import com.android.launcher3.util.AllModulesForTest import com.android.launcher3.util.SandboxContext import com.android.launcher3.util.SplitConfigurationOptions -import com.android.launcher3.util.TestDispatcherProvider import com.android.launcher3.util.TransformingTouchDelegate import com.android.launcher3.util.UserIconInfo import com.android.quickstep.TaskOverlayFactory import com.android.quickstep.TaskOverlayFactory.TaskOverlay import com.android.quickstep.recents.di.RecentsDependencies -import com.android.quickstep.task.thumbnail.TaskContentView import com.android.quickstep.task.thumbnail.TaskThumbnailView import com.android.quickstep.views.RecentsView import com.android.quickstep.views.TaskContainer @@ -49,7 +47,6 @@ import com.android.systemui.shared.recents.model.Task.TaskKey import com.google.common.truth.Truth.assertThat import dagger.BindsInstance import dagger.Component -import kotlinx.coroutines.test.StandardTestDispatcher import org.junit.After import org.junit.Before import org.junit.Test @@ -67,7 +64,6 @@ class TaskViewItemInfoTest { private val overlayFactory = mock() private val userCache = mock() private val userInfo = mock() - private val dispatcher = StandardTestDispatcher() @Before fun setUp() { @@ -80,7 +76,7 @@ class TaskViewItemInfoTest { context.initDaggerComponent( DaggerTaskViewItemInfoTest_TestComponent.builder().bindUserCache(userCache) ) - RecentsDependencies.maybeInitialize(context, TestDispatcherProvider(dispatcher)) + RecentsDependencies.maybeInitialize(context) } @After @@ -202,7 +198,6 @@ class TaskViewItemInfoTest { return TaskContainer( taskView, task, - mock(), if (enableRefactorTaskThumbnail()) mock() else mock(), mock(), diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt index bfd5d76923..52d288a723 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt @@ -60,7 +60,6 @@ abstract class TaskbarBaseTestCase { @Mock lateinit var optionalBubbleControllers: Optional @Mock lateinit var taskbarDesktopModeController: TaskbarDesktopModeController @Mock lateinit var nudgeController: NudgeController - @Mock lateinit var nudgeViewController: NudgeViewController lateinit var taskbarControllers: TaskbarControllers @@ -104,7 +103,6 @@ abstract class TaskbarBaseTestCase { optionalBubbleControllers, taskbarDesktopModeController, nudgeController, - nudgeViewController ) } } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt index 529174a253..d2b9fcf2c5 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt @@ -147,15 +147,6 @@ class TaskbarHoverToolTipControllerTest { assertThat(isHoverToolTipOpen).isFalse() } - @Test - fun onHover_emptyTitle_noTooltip() { - runOnMainSync { - iconView.text = "" - iconView.dispatchGenericMotionEvent(HOVER_ENTER) - } - assertThat(isHoverToolTipOpen).isFalse() - } - companion object { private val HOVER_EXIT = MotionEvent.obtain(0, 0, ACTION_HOVER_EXIT, 0f, 0f, 0) private val HOVER_ENTER = MotionEvent.obtain(0, 0, ACTION_HOVER_ENTER, 0f, 0f, 0) diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java index d53f2b8519..a8f3500a72 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java @@ -15,7 +15,7 @@ import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_IM import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_RECENTS; import static com.android.launcher3.taskbar.TaskbarNavButtonController.SCREEN_PIN_LONG_PRESS_THRESHOLD; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; -import static com.android.window.flags2.Flags.FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV; +import static com.android.window.flags.Flags.FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV; import static com.google.common.truth.Truth.assertThat; @@ -29,7 +29,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.graphics.Rect; import android.os.Handler; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; @@ -88,12 +87,12 @@ public class TaskbarNavButtonControllerTest { private int mOverviewToggleCount; private final TaskbarNavButtonCallbacks mCallbacks = new TaskbarNavButtonCallbacks() { @Override - public void onNavigateHome(int displayId) { + public void onNavigateHome() { mHomePressCount++; } @Override - public void onToggleOverview(int displayId) { + public void onToggleOverview() { mOverviewToggleCount++; } }; @@ -111,7 +110,6 @@ public class TaskbarNavButtonControllerTest { when(mockTaskbarControllers.getTaskbarActivityContext()) .thenReturn(mockTaskbarActivityContext); doReturn(mockStatsLogManager).when(mockTaskbarActivityContext).getStatsLogManager(); - when(mockTaskbarActivityContext.getDisplayId()).thenReturn(DISPLAY_ID); mNavButtonController = new TaskbarNavButtonController( mockService, mCallbacks, @@ -345,7 +343,6 @@ public class TaskbarNavButtonControllerTest { @Test @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV) public void testPredictiveBackInvoked() { - mNavButtonController.init(mockTaskbarControllers); ArgumentCaptor keyEventCaptor = ArgumentCaptor.forClass(KeyEvent.class); mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN, false); mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP, false); @@ -357,7 +354,6 @@ public class TaskbarNavButtonControllerTest { @Test @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV) public void testPredictiveBackCancelled() { - mNavButtonController.init(mockTaskbarControllers); ArgumentCaptor keyEventCaptor = ArgumentCaptor.forClass(KeyEvent.class); mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN, false); mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP, true); @@ -369,7 +365,6 @@ public class TaskbarNavButtonControllerTest { @Test @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV) public void testButtonsDisabledWhileBackPressed() { - mNavButtonController.init(mockTaskbarControllers); mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN, false); mNavButtonController.onButtonClick(BUTTON_HOME, mockView); mNavButtonController.onButtonClick(BUTTON_RECENTS, mockView); @@ -382,14 +377,6 @@ public class TaskbarNavButtonControllerTest { verify(mockSystemUiProxy, never()).onImeSwitcherPressed(); } - @Test - public void testOnRecentsButtonLayoutChanged() { - Rect rect = new Rect(10, 20, 30, 40); - mNavButtonController.init(mockTaskbarControllers); - mNavButtonController.onRecentsButtonLayoutChanged(rect); - verify(mockSystemUiProxy).notifyRecentsButtonPositionChanged(eq(rect)); - } - private void verifyKeyEvent(KeyEvent keyEvent, int action, boolean isCancelled) { assertEquals(isCancelled, keyEvent.isCanceled()); assertEquals(action, KeyEvent.ACTION_DOWN, keyEvent.getAction()); diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt index a56da92225..c589415196 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt @@ -17,31 +17,24 @@ package com.android.launcher3.taskbar import android.animation.AnimatorTestRule -import android.app.WindowConfiguration import android.content.ComponentName import android.content.Intent import android.os.Process import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule +import android.view.Display.DEFAULT_DISPLAY import androidx.test.core.app.ApplicationProvider -import com.android.launcher3.BubbleTextView import com.android.launcher3.Flags.FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR +import com.android.launcher3.Flags.FLAG_TASKBAR_OVERFLOW import com.android.launcher3.R import com.android.launcher3.dagger.LauncherAppSingleton -import com.android.launcher3.dagger.LauncherComponentProvider.appComponent -import com.android.launcher3.model.BgDataModel import com.android.launcher3.model.data.ItemInfo -import com.android.launcher3.model.data.TaskItemInfo -import com.android.launcher3.model.data.WorkspaceData -import com.android.launcher3.model.data.WorkspaceItemInfo -import com.android.launcher3.popup.SystemShortcut -import com.android.launcher3.statehandlers.DesktopVisibilityController import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatItems import com.android.launcher3.taskbar.bubbles.BubbleBarViewController import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController -import com.android.launcher3.taskbar.rules.AllTaskbarSandboxModules +import com.android.launcher3.taskbar.rules.DisplayControllerModule import com.android.launcher3.taskbar.rules.MockedRecentsModelHelper import com.android.launcher3.taskbar.rules.MockedRecentsModelTestRule import com.android.launcher3.taskbar.rules.SandboxParams @@ -53,27 +46,22 @@ import com.android.launcher3.taskbar.rules.TaskbarSandboxComponent import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext +import com.android.launcher3.util.AllModulesForTest +import com.android.launcher3.util.FakePrefsModule import com.android.launcher3.util.LauncherMultivalentJUnit import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices -import com.android.launcher3.util.Preconditions.assertNotNull import com.android.launcher3.util.TestUtil.getOnUiThread import com.android.quickstep.RecentsModel import com.android.quickstep.SystemUiProxy import com.android.quickstep.util.DesktopTask -import com.android.quickstep.util.GroupTask -import com.android.quickstep.util.SingleTask -import com.android.quickstep.util.SingleTask.Companion.createTaskItemInfo import com.android.systemui.shared.recents.model.Task -import com.android.window.flags2.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE -import com.android.window.flags2.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_TASKBAR_RUNNING_APPS -import com.android.window.flags2.Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU -import com.android.window.flags2.Flags.FLAG_ENABLE_TASKBAR_OVERFLOW +import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE +import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_TASKBAR_RUNNING_APPS import com.android.wm.shell.Flags.FLAG_ENABLE_BUBBLE_BAR import com.android.wm.shell.desktopmode.IDesktopTaskListener import com.google.common.truth.Truth.assertThat import dagger.BindsInstance import dagger.Component -import java.util.function.Predicate import org.junit.Before import org.junit.Rule import org.junit.Test @@ -86,10 +74,10 @@ import org.mockito.kotlin.whenever @RunWith(LauncherMultivalentJUnit::class) @EmulatedDevices(["pixelTablet2023"]) @EnableFlags( + FLAG_TASKBAR_OVERFLOW, FLAG_ENABLE_DESKTOP_WINDOWING_TASKBAR_RUNNING_APPS, FLAG_ENABLE_DESKTOP_WINDOWING_MODE, FLAG_ENABLE_BUBBLE_BAR, - FLAG_ENABLE_TASKBAR_OVERFLOW, ) @DisableFlags(FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR) class TaskbarOverflowTest { @@ -128,14 +116,7 @@ class TaskbarOverflowTest { @InjectController lateinit var bubbleStashController: BubbleStashController @InjectController lateinit var keyboardQuickSwitchController: KeyboardQuickSwitchController - private val desktopVisibilityController: DesktopVisibilityController - get() = DesktopVisibilityController.INSTANCE[context] - private var desktopTaskListener: IDesktopTaskListener? = null - private val modelCallback = ModelCallbacks() - - private val taskbarContext: TaskbarActivityContext - get() = taskbarUnitTestRule.activityContext private var currentControllerInitCallback: () -> Unit = {} set(value) { @@ -148,10 +129,7 @@ class TaskbarOverflowTest { if (!recentAppsController.canShowRunningApps) { recentAppsController.onDestroy() recentAppsController.canShowRunningApps = true - recentAppsController.init( - taskbarUnitTestRule.activityContext.controllers, - emptyList(), - ) + recentAppsController.init(taskbarUnitTestRule.activityContext.controllers) } currentControllerInitCallback.invoke() @@ -160,7 +138,6 @@ class TaskbarOverflowTest { @Before fun ensureRunningAppsShowing() { - whenever(desktopVisibilityController.isInDesktopMode(context.displayId)).thenReturn(true) runOnMainSync { recentsModel.resolvePendingTaskRequests() } } @@ -369,8 +346,6 @@ class TaskbarOverflowTest { createDesktopTask(createdTasks) assertThat(taskbarOverflowIconIndex).isEqualTo(initialIconCount) - assertThat(getOverflowIconTooltipText()).isEqualTo("Other recent apps") - tapOverflowIcon() // Keyboard quick switch view is shown only after list of recent task is asynchronously // retrieved from the recents model. @@ -378,12 +353,10 @@ class TaskbarOverflowTest { assertThat(getOnUiThread { keyboardQuickSwitchController.isShownFromTaskbar }).isTrue() assertThat(getOnUiThread { keyboardQuickSwitchController.shownTaskIds() }) - .containsExactlyElementsIn(0..targetOverflowSize) - assertThat(getOverflowIconTooltipText()).isNull() + .containsExactlyElementsIn(0..), - recentAppsController.shownTasks, - ) - } - - tapOverflowIcon() - // Keyboard quick switch view is shown only after list of recent task is asynchronously - // retrieved from the recents model. - runOnMainSync { recentsModel.resolvePendingTaskRequests() } - - assertThat(getOnUiThread { keyboardQuickSwitchController.isShownFromTaskbar }).isTrue() - // Taskbar is in overflow by `targetOverflowSize`, so overflow UI should have - // `targetOverflowSize + 1` items, to account for a spot in taskbar taken by the overflow - // icon. Task IDs for running desktop apps start at 1 - 0 is used for fullscreen task. - assertThat(getOnUiThread { keyboardQuickSwitchController.shownTaskIds() }) - .containsExactlyElementsIn(listOf(1) + (3..targetOverflowSize + 2).toList()) - } - - @Test - @TaskbarMode(PINNED) - @EnableFlags(FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU) - fun pinToTaskbarShortcut_unpinPinnedItem() { - // Create two tasks and two pinned items. - createDesktopTask(2) - val hotseatItems = createHotseatItems(2) - var shortcut: SystemShortcut<*>? = null - var hotseatIcon: BubbleTextView? = null - runOnMainSync { - val taskbarView = setUpTaskbarAndModelCallback(hotseatItems) - hotseatIcon = - taskbarView.iconViews.filterIsInstance().first { - it.tag is WorkspaceItemInfo - } - shortcut = - taskbarContext.controllers.taskbarPopupController.createPinShortcut( - taskbarContext, - hotseatIcon!!.tag as ItemInfo, - hotseatIcon, - ) as SystemShortcut<*> - } - assertNotNull(shortcut) - runOnMainSync { shortcut?.onClick(hotseatIcon) } - // After unpinning the first item, only the second app is left. - assertThat(modelCallback.hotseatItems.map { info -> info.title }) - .isEqualTo(listOf("Test App 1")) - // The unpinned app doesn't have a task so the shown tasks won't change. - assertThat(recentAppsController.shownTasks.map { it.tasks[0].key.id }) - .isEqualTo(listOf(0, 1)) - } - - @Test - @TaskbarMode(PINNED) - @EnableFlags(FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU) - fun pinToTaskbarShortcut_unpinPinnedItemWithTask() { - // Create two hotseat items with a task for both of them respectively. - var hotseatItems = - createHotseatItems(2).mapIndexed { idx, item -> TaskItemInfo(idx, item) }.toTypedArray() - createDesktopTaskWithTasksFromPackages(hotseatItems.mapNotNull { it.targetPackage }) - var shortcut: SystemShortcut<*>? = null - var hotseatIcon: BubbleTextView? = null - runOnMainSync { - val taskbarView = setUpTaskbarAndModelCallback(hotseatItems.map { it }.toTypedArray()) - hotseatIcon = - taskbarView.iconViews.filterIsInstance().first { - it.tag is WorkspaceItemInfo - } - shortcut = - taskbarContext.controllers.taskbarPopupController.createPinShortcut( - taskbarContext, - hotseatIcon!!.tag as ItemInfo, - hotseatIcon, - ) as SystemShortcut<*> - } - // Before unpinning the app, both of the apps should be pinned and no shown task available. - assertThat(modelCallback.hotseatItems.map { info -> info.title }) - .isEqualTo(listOf("Test App 0", "Test App 1")) - assertThat(recentAppsController.shownTasks.map { it.tasks[0].key.id }) - .isEqualTo(emptyList()) - assertNotNull(shortcut) - runOnMainSync { shortcut?.onClick(hotseatIcon) } - // After unpinning the app, app 0 is removed and its task is shown as a recent task. - assertThat(modelCallback.hotseatItems.map { info -> info.title }) - .isEqualTo(listOf("Test App 1")) - assertThat(recentAppsController.shownTasks.map { it.tasks[0].key.id }).isEqualTo(listOf(0)) - } - - @Test - @TaskbarMode(PINNED) - @EnableFlags(FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU) - fun pinToTaskbarShortcut_pinRecentTask() { - // Create two tasks and two pinned items. - createDesktopTask(2) - val hotseatItems = createHotseatItems(2) - - var shortcut: SystemShortcut<*>? = null - var recentTaskIcon: BubbleTextView? = null - runOnMainSync { - val taskbarView = setUpTaskbarAndModelCallback(hotseatItems) - // Get the first recent task icon - recentTaskIcon = - taskbarView.iconViews.filterIsInstance().first { - it.tag is GroupTask - } - val recentTaskInfo = - createTaskItemInfo( - recentTaskIcon!!.tag as SingleTask, - WorkspaceItemInfo().apply { - title = "Test App 2" - intent = Intent().apply { `package` = "fake" } - }, - ) - shortcut = - taskbarContext.controllers.taskbarPopupController.createPinShortcut( - taskbarContext, - recentTaskInfo, - recentTaskIcon, - ) as SystemShortcut<*> - } - assertNotNull(shortcut) - runOnMainSync { shortcut?.onClick(recentTaskIcon) } - - // After pinning the recent task, it should be included in the hotseat items. - assertThat(modelCallback.hotseatItems.map { info -> info.title }) - .isEqualTo(listOf("Test App 0", "Test App 1", "Test App 2")) - // As the task is pinned, the shown tasks should remove it from the list - assertThat(recentAppsController.shownTasks.map { it.tasks[0].key.id }).isEqualTo(listOf(1)) - } - - private fun setUpTaskbarAndModelCallback(hotseatItems: Array): TaskbarView { - val taskbarView: TaskbarView = - taskbarUnitTestRule.activityContext.dragLayer.findViewById(R.id.taskbar_view) - taskbarView.updateItems(hotseatItems, recentAppsController.shownTasks) - modelCallback.recentAppsController = recentAppsController - context.baseContext.appComponent.launcherAppState.model.addCallbacks(modelCallback) - modelCallback.bindItemsAdded(hotseatItems.toList()) - return taskbarView + .containsExactlyElementsIn(listOf(0) + (2..) { - createFullscreenAndDesktopTasksFromPackages(emptyList(), packages) - } - - private fun createFullscreenAndDesktopTasksFromPackages( - fullscreenPackages: List, - desktopPackages: List, - ) { - val defaultDisplayId = context.displayId - val tasks: List = - fullscreenPackages.mapIndexed({ index, p -> - SingleTask( - Task( - Task.TaskKey( - index, - WindowConfiguration.WINDOWING_MODE_FULLSCREEN, - Intent().apply { `package` = p }, - ComponentName(p, ""), - Process.myUserHandle().identifier, - 2000, - ) - ) - ) - }) - - val desktopTasks = - desktopPackages.mapIndexed({ index, p -> + val tasks = + packages.mapIndexed({ index, p -> Task( Task.TaskKey( - index + fullscreenPackages.size, - WindowConfiguration.WINDOWING_MODE_FREEFORM, + index, + 0, Intent().apply { `package` = p }, ComponentName(p, ""), Process.myUserHandle().identifier, @@ -658,11 +447,12 @@ class TaskbarOverflowTest { ) }) - recentsModel.updateRecentTasks( - tasks + listOf(DesktopTask(deskId = 0, defaultDisplayId, desktopTasks)) - ) - for (task in 1..desktopTasks.size) { - desktopTaskListener?.onTasksVisibilityChanged(defaultDisplayId, task) + recentsModel.updateRecentTasks(listOf(DesktopTask(deskId = 0, DEFAULT_DISPLAY, tasks))) + for (task in 1..tasks.size) { + desktopTaskListener?.onTasksVisibilityChanged( + context.virtualDisplay.display.displayId, + task, + ) } runOnMainSync { recentsModel.resolvePendingTaskRequests() } } @@ -692,8 +482,7 @@ class TaskbarOverflowTest { return getOnUiThread { val iconLayoutBounds = taskbarViewController.transientTaskbarIconLayoutBoundsInParent - val availableWidth = - taskbarUnitTestRule.activityContext.deviceProfile.deviceProperties.widthPx + val availableWidth = taskbarUnitTestRule.activityContext.deviceProfile.widthPx iconLayoutBounds.left - (availableWidth - iconLayoutBounds.right) < 2 } } @@ -701,7 +490,7 @@ class TaskbarOverflowTest { private val taskbarEndMargin: Int get() { return getOnUiThread { - taskbarUnitTestRule.activityContext.deviceProfile.deviceProperties.widthPx - + taskbarUnitTestRule.activityContext.deviceProfile.widthPx - taskbarViewController.transientTaskbarIconLayoutBoundsInParent.right } } @@ -728,14 +517,6 @@ class TaskbarOverflowTest { } } - private fun getOverflowIconTooltipText(): String? { - return getOnUiThread { - val overflowIcon = - taskbarViewController.iconViews.firstOrNull { it is TaskbarOverflowView } - (overflowIcon as? TaskbarOverflowView)?.getTextForTooltipPopup() - } - } - /** * Adds enough running apps for taskbar to enter overflow of `targetOverflowSize`, and verifies * * max number of icons in the taskbar remains unchanged @@ -763,42 +544,13 @@ class TaskbarOverflowTest { } return maxNumIconViews } - - private class ModelCallbacks : BgDataModel.Callbacks { - var hotseatItems = mutableListOf() - var recentAppsController: TaskbarRecentAppsController? = null - - override fun bindCompleteModel(itemIdMap: WorkspaceData, isBindingSync: Boolean) = - bindItemsAdded(itemIdMap.toList()) - - override fun bindItemsAdded(items: List) { - runOnMainSync { - items - .filter { item -> - item is WorkspaceItemInfo && - !hotseatItems.any { it.targetPackage == item.targetPackage } - } - .forEach { item -> hotseatItems.add(item as WorkspaceItemInfo) } - recentAppsController?.updateHotseatItemInfos(hotseatItems.toTypedArray()) - } - } - - override fun bindWorkspaceComponentsRemoved(matcher: Predicate) { - runOnMainSync { - for (i in hotseatItems.size - 1 downTo 0) { - if (matcher.test(hotseatItems[i])) { - hotseatItems.removeAt(i) - } - } - recentAppsController?.updateHotseatItemInfos(hotseatItems.toTypedArray()) - } - } - } } /** TaskbarOverflowComponent used to bind the RecentsModel. */ @LauncherAppSingleton -@Component(modules = [AllTaskbarSandboxModules::class]) +@Component( + modules = [AllModulesForTest::class, FakePrefsModule::class, DisplayControllerModule::class] +) interface TaskbarOverflowComponent : TaskbarSandboxComponent { @Component.Builder diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarPopupControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarPopupControllerTest.kt index 6809f7f2f8..6bb3205007 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarPopupControllerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarPopupControllerTest.kt @@ -16,44 +16,32 @@ package com.android.launcher3.taskbar -import android.content.ComponentName -import android.content.Intent import android.platform.test.annotations.DisableFlags -import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule -import android.util.SparseArray import com.android.launcher3.AbstractFloatingView import com.android.launcher3.BubbleTextView import com.android.launcher3.Flags.FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR -import com.android.launcher3.LauncherSettings +import com.android.launcher3.Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU import com.android.launcher3.R -import com.android.launcher3.model.data.AppInfo -import com.android.launcher3.model.data.ItemInfo import com.android.launcher3.model.data.WorkspaceItemInfo -import com.android.launcher3.statehandlers.DesktopVisibilityController import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatWorkspaceItem import com.android.launcher3.taskbar.TaskbarViewTestUtil.createRecents -import com.android.launcher3.taskbar.TaskbarViewTestUtil.createTestWorkspaceItem import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext import com.android.launcher3.util.LauncherMultivalentJUnit import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices import com.android.quickstep.util.GroupTask -import com.android.window.flags2.Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU import com.google.common.truth.Truth.assertThat -import org.junit.Assert import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Mockito -import org.mockito.kotlin.whenever @RunWith(LauncherMultivalentJUnit::class) @EmulatedDevices(["pixelFoldable2023", "pixelTablet2023"]) -@DisableFlags(FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR) +@DisableFlags(FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR, FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU) class TaskbarPopupControllerTest { @get:Rule(order = 0) val setFlagsRule = SetFlagsRule() @@ -66,9 +54,6 @@ class TaskbarPopupControllerTest { private val taskbarContext: TaskbarActivityContext get() = taskbarUnitTestRule.activityContext - private val desktopVisibilityController: DesktopVisibilityController - get() = DesktopVisibilityController.INSTANCE[context] - private lateinit var taskbarView: TaskbarView private lateinit var hotseatIcon: BubbleTextView private lateinit var recentTaskIcon: BubbleTextView @@ -79,12 +64,6 @@ class TaskbarPopupControllerTest { runOnMainSync { taskbarView = taskbarContext.dragLayer.findViewById(R.id.taskbar_view) } val hotseatItems = arrayOf(createHotseatWorkspaceItem()) - popupController.setApps( - hotseatItems - .map { item -> AppInfo(item.targetComponent, item.title, item.user, item.intent) } - .toTypedArray() - ) - popupController.setHotseatInfosList(SparseArray()) val recentItems = createRecents(2) runOnMainSync { taskbarView.updateItems(hotseatItems, recentItems) @@ -107,52 +86,12 @@ class TaskbarPopupControllerTest { } @Test - @EnableFlags(FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU) fun showForIcon_recentTask() { - whenever(desktopVisibilityController.isInDesktopMode(context.displayId)).thenReturn(true) assertThat(hasPopupMenu()).isFalse() runOnMainSync { popupController.showForIcon(recentTaskIcon) } assertThat(hasPopupMenu()).isTrue() } - @Test - fun createPinShortcut_itemAlreadyPinned_returnsUnpinShortcut() { - val hotseatItems = SparseArray() - val appUser = android.os.Process.myUserHandle() - val appAIntent = Intent().setComponent(ComponentName("com.example.app", "AppAActivity")) - - val itemFromAllApps = - createTestWorkspaceItem( - 0, - "AppA", - appAIntent, - appUser, - LauncherSettings.Favorites.CONTAINER_ALL_APPS, - ) - - val pinnedItemInHotseat = - createTestWorkspaceItem( - 1, - "AppA", - appAIntent, - appUser, - LauncherSettings.Favorites.CONTAINER_HOTSEAT, - ) - - hotseatItems.put(0, pinnedItemInHotseat) - popupController.setHotseatInfosList(hotseatItems) - val allAppsAppIcon = Mockito.mock(BubbleTextView::class.java) - - val shortcut = - popupController.createPinShortcut(taskbarContext, itemFromAllApps, allAppsAppIcon) - Assert.assertNotNull("Shortcut should not be null", shortcut) - Assert.assertTrue( - "Shortcut should be PinToTaskbarShortcut", - shortcut is PinToTaskbarShortcut<*>, - ) - Assert.assertFalse((shortcut as PinToTaskbarShortcut<*>).mIsPin) - } - private fun hasPopupMenu(): Boolean { return AbstractFloatingView.hasOpenView( taskbarContext, diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt index 505c415213..334d8ab061 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt @@ -24,9 +24,7 @@ import android.content.res.Resources import android.graphics.Rect import android.os.Process import android.os.UserHandle -import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags -import android.platform.test.flag.junit.SetFlagsRule import android.view.Display.DEFAULT_DISPLAY import androidx.test.annotation.UiThreadTest import com.android.internal.R @@ -40,6 +38,7 @@ import com.android.launcher3.model.data.TaskItemInfo import com.android.launcher3.model.data.WorkspaceItemInfo import com.android.launcher3.taskbar.TaskbarRecentAppsController.TaskState import com.android.launcher3.util.LauncherMultivalentJUnit +import com.android.launcher3.util.SplitConfigurationOptions import com.android.quickstep.RecentsModel import com.android.quickstep.RecentsModel.RecentTasksChangedListener import com.android.quickstep.TaskIconCache @@ -48,7 +47,6 @@ import com.android.quickstep.util.GroupTask import com.android.quickstep.util.SingleTask import com.android.quickstep.util.SplitTask import com.android.systemui.shared.recents.model.Task -import com.android.wm.shell.shared.split.SplitBounds import com.android.wm.shell.shared.split.SplitScreenConstants import com.google.common.truth.Truth.assertThat import java.util.function.Consumer @@ -62,7 +60,6 @@ import org.mockito.ArgumentCaptor import org.mockito.Mock import org.mockito.junit.MockitoJUnit import org.mockito.kotlin.any -import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doAnswer import org.mockito.kotlin.never import org.mockito.kotlin.times @@ -75,7 +72,6 @@ import org.mockito.kotlin.whenever class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { @get:Rule val mockitoRule = MockitoJUnit.rule() - @get:Rule val setFlagsRule = SetFlagsRule() @get:Rule val disableControllerForCertainTestsWatcher = object : TestWatcher() { @@ -115,25 +111,14 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { whenever(mockResources.getBoolean(R.bool.config_isDesktopModeSupported)).thenReturn(true) whenever(mockRecentsModel.iconCache).thenReturn(mockIconCache) - whenever(mockRecentsModel.unregisterRecentTasksChangedListener(any())).then { + whenever(mockRecentsModel.unregisterRecentTasksChangedListener()).then { recentTasksChangedListener = null it } - whenever(taskbarDesktopModeController.isLauncherAnimationRunning).thenReturn(false) recentAppsController = TaskbarRecentAppsController(mockContext, mockRecentsModel) recentAppsController.canShowRunningApps = canShowRunningAndRecentAppsAtInit recentAppsController.canShowRecentApps = canShowRunningAndRecentAppsAtInit - - // To ensure the initial getTasks() call is not seen as "loading" for the rest of the test, - // execute its callback. - doAnswer { - val callback: Consumer> = it.getArgument(1) - callback.accept(arrayListOf()) - taskListChangeId - } - .whenever(mockRecentsModel) - .getTasks(any(), any>>()) - recentAppsController.init(taskbarControllers, emptyList()) + recentAppsController.init(taskbarControllers) taskbarControllers.onPostInit() recentTasksChangedListener = @@ -163,13 +148,13 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { runningTasks = listOf(createTask(1, RUNNING_APP_PACKAGE_1)), recentTaskPackages = listOf(RECENT_PACKAGE_1, RECENT_PACKAGE_2), ) - verify(mockRecentsModel, never()).getTasks(any(), any>>()) + verify(mockRecentsModel, never()).getTasks(any>>()) } @Test fun canShowRunningAndRecentAppsIsFalseAfterInit_getTasksOnlyCalledInInit() { // getTasks() should have been called once from init(). - verify(mockRecentsModel, times(1)).getTasks(any(), any>>()) + verify(mockRecentsModel, times(1)).getTasks(any>>(), any()) recentAppsController.canShowRunningApps = false recentAppsController.canShowRecentApps = false prepareHotseatAndRunningAndRecentApps( @@ -178,83 +163,7 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { recentTaskPackages = listOf(RECENT_PACKAGE_1, RECENT_PACKAGE_2), ) // Verify that getTasks() was not called again after the init(). - verify(mockRecentsModel, times(1)).getTasks(any(), any>>()) - } - - @Test - @EnableFlags(com.android.window.flags2.Flags.FLAG_ENABLE_TASKBAR_RECENT_TASKS_THROTTLE_BUGFIX) - fun recentTasksChanged_duringGetTasksLoading_dontCallGetTasks() { - // getTasks() should have been called once from init(). - verify(mockRecentsModel, times(1)).getTasks(any(), any>>()) - // Override the mock answer for getTasks() so it doesn't call the callback immediately. - doAnswer { taskListChangeId } - .whenever(mockRecentsModel) - .getTasks(any(), any>>()) - recentTasksChangedListener?.onRecentTasksChanged() - // By not invoking the callback passed to getTasks() we here emulate getTasks() loading. - - recentTasksChangedListener?.onRecentTasksChanged() - - // getTasks() is only called two times overall (init + once more). - verify(mockRecentsModel, times(2)).getTasks(any(), any>>()) - } - - @Test - @EnableFlags(com.android.window.flags2.Flags.FLAG_ENABLE_TASKBAR_RECENT_TASKS_THROTTLE_BUGFIX) - fun recentTasksChanged_duringGetTasksLoading_getTasksCalledWhenLoadingDone() { - val callbackCaptor = argumentCaptor>>() - // getTasks() should have been called once from init(). - verify(mockRecentsModel, times(1)).getTasks(any(), callbackCaptor.capture()) - // Override the mock answer for getTasks() so it doesn't call the callback immediately. - doAnswer { taskListChangeId } - .whenever(mockRecentsModel) - .getTasks(any(), any>>()) - recentTasksChangedListener?.onRecentTasksChanged() - // By not invoking the callback passed to getTasks() we here emulate getTasks() loading. - - recentTasksChangedListener?.onRecentTasksChanged() - callbackCaptor.lastValue.accept(emptyList()) - - // getTasks() is called again now that the first getTasks() call finished. - verify(mockRecentsModel, times(3)).getTasks(any(), any>>()) - } - - @Test - @DisableFlags(com.android.window.flags2.Flags.FLAG_ENABLE_TASKBAR_RECENT_TASKS_THROTTLE_BUGFIX) - fun recentTasksChanged_duringGetTasksLoading_flagDisabled_callGetTasks() { - // getTasks() should have been called once from init(). - verify(mockRecentsModel, times(1)).getTasks(any(), any>>()) - // Override the mock answer for getTasks() so it doesn't call the callback immediately. - doAnswer { taskListChangeId } - .whenever(mockRecentsModel) - .getTasks(any(), any>>()) - recentTasksChangedListener?.onRecentTasksChanged() - // By not invoking the callback passed to getTasks() we here emulate getTasks() loading. - - recentTasksChangedListener?.onRecentTasksChanged() - - // getTasks() is called once per onRecentTasksChanged() invocation (and once at init) - verify(mockRecentsModel, times(3)).getTasks(any(), any>>()) - } - - @Test - @DisableFlags(com.android.window.flags2.Flags.FLAG_ENABLE_TASKBAR_RECENT_TASKS_THROTTLE_BUGFIX) - fun recentTasksChanged_duringGetTasksLoading_flagDisabled_getTasksNotCalledWhenLoadingDone() { - val callbackCaptor = argumentCaptor>>() - // getTasks() should have been called once from init(). - verify(mockRecentsModel, times(1)).getTasks(any(), callbackCaptor.capture()) - // Override the mock answer for getTasks() so it doesn't call the callback immediately. - doAnswer { taskListChangeId } - .whenever(mockRecentsModel) - .getTasks(any(), any>>()) - recentTasksChangedListener?.onRecentTasksChanged() - recentTasksChangedListener?.onRecentTasksChanged() - verify(mockRecentsModel, times(3)).getTasks(any(), any>>()) - - callbackCaptor.lastValue.accept(emptyList()) - - // getTasks() is called once per onRecentTasksChanged() invocation (and once at init) - verify(mockRecentsModel, times(3)).getTasks(any(), any>>()) + verify(mockRecentsModel, times(1)).getTasks(any>>(), any()) } @Test @@ -281,11 +190,7 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { @Test fun getDesktopItemState_matchingVisibleTask_returnsVisible() { setInDesktopMode(true) - val visibleTask = - PerDisplayRunningApps( - listOf(createTask(id = 1, "visiblePackage", isVisible = true)), - DEFAULT_DISPLAY, - ) + val visibleTask = createTask(id = 1, "visiblePackage", isVisible = true) updateRecentTasks(runningTasks = listOf(visibleTask), recentTaskPackages = emptyList()) val taskState = recentAppsController.getDesktopItemState(createItemInfo("visiblePackage")) @@ -293,37 +198,10 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { assertThat(taskState).isEqualTo(TaskState(RunningAppState.RUNNING, taskId = 1)) } - @Test - fun getDesktopItemState_matchingVisibleTaskOnSecondaryDisplay_returnsVisible() { - setInDesktopMode(true) - val visibleTask1 = - PerDisplayRunningApps( - listOf(createTask(id = 1, "visiblePackage1", isVisible = false)), - DEFAULT_DISPLAY, - ) - val visibleTask2 = - PerDisplayRunningApps( - listOf(createTask(id = 2, "visiblePackage2", isVisible = true)), - DEFAULT_DISPLAY + 1, - ) - updateRecentTasks( - runningTasks = listOf(visibleTask1, visibleTask2), - recentTaskPackages = emptyList(), - ) - - val taskState = recentAppsController.getDesktopItemState(createItemInfo("visiblePackage2")) - - assertThat(taskState).isEqualTo(TaskState(RunningAppState.RUNNING, taskId = 2)) - } - @Test fun getDesktopItemState_matchingMinimizedTask_returnsMinimized() { setInDesktopMode(true) - val minimizedTask = - PerDisplayRunningApps( - listOf(createTask(id = 1, "minimizedPackage", isVisible = false)), - DEFAULT_DISPLAY, - ) + val minimizedTask = createTask(id = 1, "minimizedPackage", isVisible = false) updateRecentTasks(runningTasks = listOf(minimizedTask), recentTaskPackages = emptyList()) val taskState = recentAppsController.getDesktopItemState(createItemInfo("minimizedPackage")) @@ -331,42 +209,14 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { assertThat(taskState).isEqualTo(TaskState(RunningAppState.MINIMIZED, taskId = 1)) } - @Test - fun getDesktopItemState_matchingMinimizedTaskOnSecondaryDisplay_returnsVisible() { - setInDesktopMode(true) - val visibleTask1 = - PerDisplayRunningApps( - listOf(createTask(id = 1, "visiblePackage1", isVisible = false)), - DEFAULT_DISPLAY, - ) - val visibleTask2 = - PerDisplayRunningApps( - listOf(createTask(id = 2, "visiblePackage2", isVisible = false)), - DEFAULT_DISPLAY + 1, - ) - updateRecentTasks( - runningTasks = listOf(visibleTask1, visibleTask2), - recentTaskPackages = emptyList(), - ) - - val taskState = recentAppsController.getDesktopItemState(createItemInfo("visiblePackage2")) - - assertThat(taskState).isEqualTo(TaskState(RunningAppState.MINIMIZED, taskId = 2)) - } - @Test fun getDesktopItemState_matchingMinimizedAndRunningTask_returnsVisible() { setInDesktopMode(true) updateRecentTasks( runningTasks = listOf( - PerDisplayRunningApps( - listOf( - createTask(id = 1, "package", isVisible = false), - createTask(id = 2, "package", isVisible = true), - ), - DEFAULT_DISPLAY, - ) + createTask(id = 1, "package", isVisible = false), + createTask(id = 2, "package", isVisible = true), ), recentTaskPackages = emptyList(), ) @@ -382,13 +232,8 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { updateRecentTasks( runningTasks = listOf( - PerDisplayRunningApps( - listOf( - createTask(id = 1, "package", isVisible = false, USER_HANDLE_1), - createTask(id = 2, "package", isVisible = true, USER_HANDLE_1), - ), - DEFAULT_DISPLAY, - ) + createTask(id = 1, "package", isVisible = false, USER_HANDLE_1), + createTask(id = 2, "package", isVisible = true, USER_HANDLE_1), ), recentTaskPackages = emptyList(), ) @@ -413,50 +258,20 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { setInDesktopMode(true) val task1 = createTask(id = 1, packageName = RUNNING_APP_PACKAGE_1, isVisible = false) val task2 = createTask(id = 2, packageName = RUNNING_APP_PACKAGE_1, isVisible = true) - updateRecentTasks( - runningTasks = listOf(PerDisplayRunningApps(listOf(task1, task2), DEFAULT_DISPLAY)), - recentTaskPackages = emptyList(), - ) + updateRecentTasks(runningTasks = listOf(task1, task2), recentTaskPackages = emptyList()) assertThat(recentAppsController.getRunningAppState(taskId = 1)) .isEqualTo(RunningAppState.MINIMIZED) } @Test - fun getRunningAppState_taskNotVisible_returnsMinimizedForSecondaryDisplay() { + fun getRunningAppState_taskVisible_returnsRunning() { setInDesktopMode(true) val task1 = createTask(id = 1, packageName = RUNNING_APP_PACKAGE_1, isVisible = false) val task2 = createTask(id = 2, packageName = RUNNING_APP_PACKAGE_1, isVisible = true) - val task3 = createTask(id = 3, packageName = RUNNING_APP_PACKAGE_3, isVisible = false) - updateRecentTasks( - runningTasks = - listOf( - PerDisplayRunningApps(listOf(task1, task2), DEFAULT_DISPLAY), - PerDisplayRunningApps(listOf(task3), DEFAULT_DISPLAY + 1), - ), - recentTaskPackages = emptyList(), - ) + updateRecentTasks(runningTasks = listOf(task1, task2), recentTaskPackages = emptyList()) - assertThat(recentAppsController.getRunningAppState(taskId = 3)) - .isEqualTo(RunningAppState.MINIMIZED) - } - - @Test - fun getRunningAppState_taskVisible_returnsRunningForSecondaryDisplay() { - setInDesktopMode(true) - val task1 = createTask(id = 1, packageName = RUNNING_APP_PACKAGE_1, isVisible = false) - val task2 = createTask(id = 2, packageName = RUNNING_APP_PACKAGE_1, isVisible = true) - val task3 = createTask(id = 3, packageName = RUNNING_APP_PACKAGE_3, isVisible = true) - updateRecentTasks( - runningTasks = - listOf( - PerDisplayRunningApps(listOf(task1, task2), DEFAULT_DISPLAY), - PerDisplayRunningApps(listOf(task3), DEFAULT_DISPLAY + 1), - ), - recentTaskPackages = emptyList(), - ) - - assertThat(recentAppsController.getRunningAppState(taskId = 3)) + assertThat(recentAppsController.getRunningAppState(taskId = 2)) .isEqualTo(RunningAppState.RUNNING) } @@ -1024,7 +839,7 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { val hotseatPackageUser = PackageUser(HOTSEAT_PACKAGE_1, USER_HANDLE_2) val hotseatPackageUsers = listOf(hotseatPackageUser) val runningTask = createTask(id = 1, HOTSEAT_PACKAGE_1, localUserHandle = USER_HANDLE_1) - val runningTasks = listOf(PerDisplayRunningApps(listOf(runningTask), DEFAULT_DISPLAY)) + val runningTasks = listOf(runningTask) prepareHotseatAndRunningAndRecentAppsInternal( hotseatPackageUsers = hotseatPackageUsers, runningTasks = runningTasks, @@ -1034,145 +849,6 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { assertThat(recentAppsController.runningTaskIds).containsExactlyElementsIn(listOf(1)) } - @Test - fun onRecentTasksChanged_inDesktopMode_multipleDesktops() { - setInDesktopMode(true) - val hotseatPackageUsers = listOf(PackageUser(HOTSEAT_PACKAGE_1, USER_HANDLE_1)) - val defaultDisplayRunningTask = - createTask(id = 1, HOTSEAT_PACKAGE_1, localUserHandle = USER_HANDLE_1) - val secondaryDisplayRunningTask = - createTask(id = 2, RUNNING_APP_PACKAGE_1, localUserHandle = USER_HANDLE_1) - val runningTasks = - listOf( - PerDisplayRunningApps(listOf(defaultDisplayRunningTask), DEFAULT_DISPLAY), - PerDisplayRunningApps(listOf(secondaryDisplayRunningTask), DEFAULT_DISPLAY + 1), - ) - prepareHotseatAndRunningAndRecentAppsInternal( - hotseatPackageUsers = hotseatPackageUsers, - runningTasks = runningTasks, - recentTaskPackages = emptyList(), - ) - assertThat(recentShownTasks).containsExactly(secondaryDisplayRunningTask) - assertThat(recentAppsController.runningTaskIds).containsExactlyElementsIn(listOf(1, 2)) - } - - @Test - fun onRecentTasksChanged_inDesktopMode_multipleDesktops_appsNotInHotseat() { - setInDesktopMode(true) - val hotseatPackageUsers = listOf(PackageUser(HOTSEAT_PACKAGE_1, USER_HANDLE_1)) - val defaultDisplayRunningTask = - createTask(id = 1, RUNNING_APP_PACKAGE_1, localUserHandle = USER_HANDLE_1) - val secondaryDisplayRunningTask = - createTask(id = 2, RUNNING_APP_PACKAGE_2, localUserHandle = USER_HANDLE_1) - val runningTasks = - listOf( - PerDisplayRunningApps(listOf(defaultDisplayRunningTask), DEFAULT_DISPLAY), - PerDisplayRunningApps(listOf(secondaryDisplayRunningTask), DEFAULT_DISPLAY + 1), - ) - prepareHotseatAndRunningAndRecentAppsInternal( - hotseatPackageUsers = hotseatPackageUsers, - runningTasks = runningTasks, - recentTaskPackages = emptyList(), - ) - assertThat(recentShownTasks) - .containsExactly(defaultDisplayRunningTask, secondaryDisplayRunningTask) - assertThat(recentAppsController.runningTaskIds).containsExactlyElementsIn(listOf(1, 2)) - } - - @Test - fun onRecentTasksChanged_inDesktopMode_multipleDesktops_multipleAppInstances() { - setInDesktopMode(true) - val hotseatPackageUsers = listOf(PackageUser(HOTSEAT_PACKAGE_1, USER_HANDLE_1)) - val defaultDisplayRunningTask1 = - createTask(id = 1, HOTSEAT_PACKAGE_1, localUserHandle = USER_HANDLE_1) - val defaultDisplayRunningTask2 = - createTask(id = 2, RUNNING_APP_PACKAGE_1, localUserHandle = USER_HANDLE_1) - - val secondaryDisplayRunningTask1 = - createTask(id = 3, RUNNING_APP_PACKAGE_1, localUserHandle = USER_HANDLE_1) - val secondaryDisplayRunningTask2 = - createTask(id = 4, HOTSEAT_PACKAGE_1, localUserHandle = USER_HANDLE_1) - - val runningTasks = - listOf( - PerDisplayRunningApps( - listOf(defaultDisplayRunningTask1, defaultDisplayRunningTask2), - DEFAULT_DISPLAY, - ), - PerDisplayRunningApps( - listOf(secondaryDisplayRunningTask1, secondaryDisplayRunningTask2), - DEFAULT_DISPLAY + 1, - ), - ) - prepareHotseatAndRunningAndRecentAppsInternal( - hotseatPackageUsers = hotseatPackageUsers, - runningTasks = runningTasks, - recentTaskPackages = emptyList(), - ) - - assertThat(recentShownTasks).hasSize(1) - assertThat(recentShownTasks) - .containsAnyOf(defaultDisplayRunningTask2, secondaryDisplayRunningTask1) - - assertThat(recentAppsController.runningTaskIds) - .containsExactlyElementsIn(listOf(1, 2, 3, 4)) - } - - @Test - fun hasSingleTask_noTargetPackage_returnsFalse() { - prepareHotseatAndRunningAndRecentApps( - hotseatPackages = emptyList(), - runningTasks = emptyList(), - recentTaskPackages = listOf(RECENT_PACKAGE_1), - ) - assertThat(recentAppsController.hasSingleTask(ItemInfo())).isFalse() - } - - @Test - fun hasSingleTask_noRecentTasks_returnsFalse() { - prepareHotseatAndRunningAndRecentApps( - hotseatPackages = emptyList(), - runningTasks = emptyList(), - recentTaskPackages = emptyList(), - ) - val itemInfo = createItemInfo(RECENT_PACKAGE_1) - assertThat(recentAppsController.hasSingleTask(itemInfo)).isFalse() - } - - @Test - fun hasSingleTask_noMatchingSingleTask_returnsFalse() { - prepareHotseatAndRunningAndRecentApps( - hotseatPackages = emptyList(), - runningTasks = emptyList(), - recentTaskPackages = listOf(RECENT_PACKAGE_1), - ) - val itemInfo = createItemInfo(RECENT_PACKAGE_2) - assertThat(recentAppsController.hasSingleTask(itemInfo)).isFalse() - } - - @Test - fun hasSingleTask_matchingSingleTask_returnsTrue() { - prepareHotseatAndRunningAndRecentApps( - hotseatPackages = emptyList(), - runningTasks = emptyList(), - recentTaskPackages = listOf(RECENT_PACKAGE_1, RECENT_PACKAGE_2), - ) - val itemInfo = createItemInfo(RECENT_PACKAGE_1) - assertThat(recentAppsController.hasSingleTask(itemInfo)).isTrue() - } - - @Test - fun hasSingleTask_matchingSingleTaskDifferentUser_returnsFalse() { - prepareHotseatAndRunningAndRecentApps( - hotseatPackages = emptyList(), - runningTasks = emptyList(), - recentTaskPackages = listOf(RECENT_PACKAGE_1), - ) - // RECENT_PACKAGE_1 is created with myUserHandle in createRecentTasksFromPackageNames - val itemInfo = createItemInfo(RECENT_PACKAGE_1, USER_HANDLE_1) - assertThat(recentAppsController.hasSingleTask(itemInfo)).isFalse() - } - private fun prepareHotseatAndRunningAndRecentApps( hotseatPackages: List, runningTasks: List, @@ -1181,14 +857,14 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { val hotseatPackageUsers = hotseatPackages.map { PackageUser(it, myUserHandle) } return prepareHotseatAndRunningAndRecentAppsInternal( hotseatPackageUsers, - listOf(PerDisplayRunningApps(runningTasks, DEFAULT_DISPLAY)), + runningTasks, recentTaskPackages, ) } private fun prepareHotseatAndRunningAndRecentAppsInternal( hotseatPackageUsers: List, - runningTasks: List, + runningTasks: List, recentTaskPackages: List, ): Array { val hotseatItems = createHotseatItemsFromPackageUsers(hotseatPackageUsers) @@ -1197,25 +873,22 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { return recentAppsController.shownHotseatItems.toTypedArray() } - private fun updateRecentTasks( - runningTasks: List, - recentTaskPackages: List, - ) { + private fun updateRecentTasks(runningTasks: List, recentTaskPackages: List) { val recentTasks = createRecentTasksFromPackageNames(recentTaskPackages) val allTasks = ArrayList().apply { - runningTasks.forEach { - add(DesktopTask(deskId = 0, it.displayId, ArrayList(it.tasks))) + if (!runningTasks.isEmpty()) { + add(DesktopTask(deskId = 0, DEFAULT_DISPLAY, ArrayList(runningTasks))) } addAll(recentTasks) } doAnswer { - val callback: Consumer> = it.getArgument(1) + val callback: Consumer> = it.getArgument(0) callback.accept(allTasks) taskListChangeId } .whenever(mockRecentsModel) - .getTasks(any(), any>>()) + .getTasks(any>>(), any()) recentTasksChangedListener?.onRecentTasksChanged() } @@ -1249,11 +922,11 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { SplitTask( createTask(100, splitPackages[0]), createTask(101, splitPackages[1]), - SplitBounds( + SplitConfigurationOptions.SplitBounds( /* leftTopBounds = */ Rect(), /* rightBottomBounds = */ Rect(), - /* leftTopTaskId = */ 1, - /* rightBottomTaskId = */ 2, + /* leftTopTaskId = */ -1, + /* rightBottomTaskId = */ -1, /* snapPosition = */ SplitScreenConstants.SNAP_TO_2_50_50, ), ) @@ -1318,6 +991,4 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() { } data class PackageUser(val packageName: String, val userHandle: UserHandle) - - data class PerDisplayRunningApps(val tasks: List, val displayId: Int) } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarStashControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarStashControllerTest.kt index 1575e23cac..021e1e417c 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarStashControllerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarStashControllerTest.kt @@ -17,17 +17,12 @@ package com.android.launcher3.taskbar import android.animation.AnimatorTestRule -import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation -import com.android.launcher3.Flags -import com.android.launcher3.LauncherPrefs import com.android.launcher3.LauncherPrefs.Companion.TASKBAR_PINNING -import com.android.launcher3.LauncherPrefs.Companion.TASKBAR_PINNING_IN_DESKTOP_MODE import com.android.launcher3.QuickstepTransitionManager.PINNED_TASKBAR_TRANSITION_DURATION import com.android.launcher3.R -import com.android.launcher3.statehandlers.DesktopVisibilityController import com.android.launcher3.taskbar.StashedHandleViewController.ALPHA_INDEX_STASHED import com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_EDU_OPEN import com.android.launcher3.taskbar.TaskbarControllerTestUtil.asProperty @@ -55,7 +50,6 @@ import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.UserSetupMode import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext -import com.android.launcher3.taskbar.rules.displayControllerSpy import com.android.launcher3.util.LauncherMultivalentJUnit import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED @@ -67,9 +61,6 @@ import org.junit.After import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.spy -import org.mockito.kotlin.whenever @RunWith(LauncherMultivalentJUnit::class) @EnableFlags(FLAG_ENABLE_BUBBLE_BAR) @@ -89,9 +80,6 @@ class TaskbarStashControllerTest { @InjectController lateinit var bubbleBarViewController: BubbleBarViewController @InjectController lateinit var bubbleStashController: BubbleStashController - private val desktopVisibilityController: DesktopVisibilityController - get() = DesktopVisibilityController.INSTANCE[context] - private val activityContext by taskbarUnitTestRule::activityContext @After fun cancelTimeoutIfExists() = stashController.cancelTimeoutIfExists() @@ -130,27 +118,7 @@ class TaskbarStashControllerTest { } @Test - @DisableFlags(Flags.FLAG_ENABLE_OVERVIEW_ON_CONNECTED_DISPLAYS) - fun testRecreateAsTransient_withoutOverviewOnConnectedDisplays_timeoutStarted() { - context.displayControllerSpy?.setupTaskbarPinningPrefListener(context.displayId) - - testRecreateAsTransient_timeoutStarted() - } - - @Test - @EnableFlags(Flags.FLAG_ENABLE_OVERVIEW_ON_CONNECTED_DISPLAYS) - fun testRecreateAsTransient_withOverviewOnConnectedDisplay_timeoutStarted() { - context.displayControllerSpy?.let { controller -> - controller.setupTaskbarPinningPrefListener(context.displayId) - controller.infoModifierForDisplay = { - spy(it) { on { it?.isTransientTaskbar } doReturn true } - } - } - - testRecreateAsTransient_timeoutStarted() - } - - private fun testRecreateAsTransient_timeoutStarted() { + fun testRecreateAsTransient_timeoutStarted() { var isPinned by TASKBAR_PINNING.asProperty(context) isPinned = true activityContext.controllers.sharedState?.taskbarWasPinned = true @@ -325,7 +293,7 @@ class TaskbarStashControllerTest { } val expectedHeight = - activityContext.deviceProfile.taskbarProfile.run { height + bottomMargin } + activityContext.deviceProfile.run { taskbarHeight + taskbarBottomMargin } assertThat(stashController.touchableHeight).isEqualTo(expectedHeight) } @@ -333,7 +301,7 @@ class TaskbarStashControllerTest { @TaskbarMode(PINNED) fun testGetTouchableHeight_pinnedMode_taskbarHeight() { assertThat(stashController.touchableHeight) - .isEqualTo(activityContext.deviceProfile.taskbarProfile.height) + .isEqualTo(activityContext.deviceProfile.taskbarHeight) } @Test @@ -347,33 +315,22 @@ class TaskbarStashControllerTest { @TaskbarMode(THREE_BUTTONS) fun testGetContentHeightToReportToApps_threeButtonsMode_taskbarHeight() { assertThat(stashController.contentHeightToReportToApps) - .isEqualTo(activityContext.deviceProfile.taskbarProfile.height) + .isEqualTo(activityContext.deviceProfile.taskbarHeight) } @Test @TaskbarMode(PINNED) fun testGetContentHeightToReportToApps_pinnedMode_taskbarHeight() { assertThat(stashController.contentHeightToReportToApps) - .isEqualTo(activityContext.deviceProfile.taskbarProfile.height) + .isEqualTo(activityContext.deviceProfile.taskbarHeight) } @Test @TaskbarMode(PINNED) @UserSetupMode fun testGetContentHeightToReportToApps_pinnedInSetupMode_setupWizardInsets() { - stashController.mNavbarHiddenOverrideForTest = false assertThat(stashController.contentHeightToReportToApps) .isEqualTo(context.resources.getDimensionPixelSize(R.dimen.taskbar_suw_insets)) - stashController.mNavbarHiddenOverrideForTest = null - } - - @Test - @UserSetupMode - fun testGetContentHeightToReportToApps_inExpressiveTheme_setupWizardInsets() { - stashController.mNavbarHiddenOverrideForTest = true - assertThat(stashController.contentHeightToReportToApps) - .isEqualTo(stashController.stashedHeight) - stashController.mNavbarHiddenOverrideForTest = null } @Test @@ -408,7 +365,7 @@ class TaskbarStashControllerTest { @TaskbarMode(PINNED) fun testGetTappableHeightToReportToApps_pinnedMode_taskbarHeight() { assertThat(stashController.tappableHeightToReportToApps) - .isEqualTo(activityContext.deviceProfile.taskbarProfile.height) + .isEqualTo(activityContext.deviceProfile.taskbarHeight) } @Test @@ -430,41 +387,6 @@ class TaskbarStashControllerTest { assertThat(stashController.timeoutAlarm.alarmPending()).isTrue() } - @Test - @TaskbarMode(PINNED) - fun testUpdateTaskbarTimeout_unPinnedTaskbarInDesktopMode_startsTaskbarTimeout() { - LauncherPrefs.get(context).put(TASKBAR_PINNING_IN_DESKTOP_MODE, false) - whenever(desktopVisibilityController.isInDesktopMode(context.displayId)).thenReturn(true) - stashController.updateTaskbarTimeout(false) - assertThat(stashController.timeoutAlarm.alarmPending()).isTrue() - } - - @Test - @TaskbarMode(PINNED) - fun testUpdateTaskbarTimeout_pinnedTaskbarInDesktopMode_shouldNotStartsTaskbarTimeout() { - LauncherPrefs.get(context).put(TASKBAR_PINNING_IN_DESKTOP_MODE, true) - whenever(desktopVisibilityController.isInDesktopMode(context.displayId)).thenReturn(true) - stashController.updateTaskbarTimeout(false) - assertThat(stashController.timeoutAlarm.alarmPending()).isFalse() - } - - @Test - @TaskbarMode(TRANSIENT) - fun shouldAllowTaskbarToAutoStash_transientTaskbar() { - assertThat(stashController.shouldAllowTaskbarToAutoStash()).isTrue() - } - - @Test - @TaskbarMode(PINNED) - fun toggleTaskbarStash_autoStashedDesktopModeTaskbar() { - LauncherPrefs.get(context).put(TASKBAR_PINNING_IN_DESKTOP_MODE, false) - whenever(desktopVisibilityController.isInDesktopMode(context.displayId)).thenReturn(true) - - getInstrumentation().runOnMainSync { stashController.toggleTaskbarStash() } - - assertThat(stashController.isStashed).isTrue() - } - @Test @TaskbarMode(TRANSIENT) fun testUpdateAndAnimateTransientTaskbar_finishTaskbarTimeout_taskbarStashes() { @@ -546,7 +468,7 @@ class TaskbarStashControllerTest { fun testUpdateAndAnimateTransientTaskbar_bubbleBarExpandedBeforeTimeout_expandedAfterwards() { getInstrumentation().runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) - bubbleBarViewController.animateExpanded(true) + bubbleBarViewController.isExpanded = true stashController.updateAndAnimateTransientTaskbar(false) animatorTestRule.advanceTimeBy(stashController.stashDuration) } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt index fb32179f20..24ed81f4fa 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt @@ -33,7 +33,7 @@ import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.ForceRtl import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext import com.android.launcher3.util.LauncherMultivalentJUnit.Companion.isRunningInRobolectric -import com.android.window.flags2.Flags.FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION +import com.android.window.flags.Flags.FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION import org.junit.Before import org.junit.Rule import org.junit.Test diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt index 9cd09dc76d..92abbbaa0a 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt @@ -21,8 +21,8 @@ import android.content.Intent import android.graphics.Bitmap import android.graphics.Bitmap.createBitmap import android.os.Process -import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT import com.android.launcher3.icons.BitmapInfo +import com.android.launcher3.model.data.AppInfo import com.android.launcher3.model.data.AppPairInfo import com.android.launcher3.model.data.FolderInfo import com.android.launcher3.model.data.ItemInfo @@ -50,37 +50,19 @@ object TaskbarViewTestUtil { } /** Creates an array of fake hotseat items. */ - fun createHotseatItems(size: Int): Array { + fun createHotseatItems(size: Int): Array { return Array(size) { createHotseatWorkspaceItem(it) } } fun createHotseatWorkspaceItem(id: Int = 0): WorkspaceItemInfo { - return createTestWorkspaceItem( - id, - "Test App $id", - testIntent(id), - Process.myUserHandle(), - CONTAINER_HOTSEAT, - ) - } - - // Helper to create a test WorkspaceItemInfo - fun createTestWorkspaceItem( - id: Int, - title: String, - intent: Intent, - user: android.os.UserHandle, - container: Int, - ): WorkspaceItemInfo { - val item = WorkspaceItemInfo() - item.id = id - item.title = title - item.intent = intent - item.user = user - item.container = container - // Create a placeholder icon so that the test doesn't try to load a high-res icon. - item.bitmap = BitmapInfo.fromBitmap(createBitmap(1, 1, Bitmap.Config.ALPHA_8)) - return item + return WorkspaceItemInfo( + AppInfo(TEST_COMPONENT, "Test App $id", Process.myUserHandle(), Intent()) + ) + .apply { + this.id = id + // Create a placeholder icon so that the test doesn't try to load a high-res icon. + this.bitmap = BitmapInfo.fromBitmap(createBitmap(1, 1, Bitmap.Config.ALPHA_8)) + } } fun createHotseatAppPairsItem(): AppPairInfo { @@ -101,23 +83,21 @@ object TaskbarViewTestUtil { /** Creates a list of fake recent tasks. */ fun createRecents(size: Int): List { - return List(size) { createRecentTask(it) } - } - - fun createRecentTask(id: Int = 0): GroupTask { - return SingleTask( - Task().apply { - key = - TaskKey( - id, - 5, - testIntent(id), - testComponent(id), - Process.myUserHandle().identifier, - System.currentTimeMillis(), - ) - } - ) + return List(size) { + SingleTask( + Task().apply { + key = + TaskKey( + it, + 5, + TEST_INTENT, + TEST_COMPONENT, + Process.myUserHandle().identifier, + System.currentTimeMillis(), + ) + } + ) + } } } @@ -167,10 +147,5 @@ enum class TaskbarIconType { } private const val TEST_PACKAGE = "com.android.launcher3.taskbar" -private val testComponent = { i: Int -> ComponentName(TEST_PACKAGE, "Activity $i") } -private val testIntent = { i: Int -> - Intent().apply { - `package` = TEST_PACKAGE - component = testComponent(i) - } -} +private val TEST_COMPONENT = ComponentName(TEST_PACKAGE, "Activity") +private val TEST_INTENT = Intent().apply { `package` = TEST_PACKAGE } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt index 3ad302cf9e..2df4fab457 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt @@ -19,6 +19,7 @@ package com.android.launcher3.taskbar import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule import android.view.View +import com.android.launcher3.Flags.FLAG_TASKBAR_OVERFLOW import com.android.launcher3.R import com.android.launcher3.statehandlers.DesktopVisibilityController import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync @@ -35,8 +36,7 @@ import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.ForceRtl import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext import com.android.launcher3.util.LauncherMultivalentJUnit import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices -import com.android.window.flags2.Flags.FLAG_ENABLE_TASKBAR_OVERFLOW -import com.android.window.flags2.Flags.FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION +import com.android.window.flags.Flags.FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Rule @@ -46,7 +46,7 @@ import org.mockito.kotlin.whenever @RunWith(LauncherMultivalentJUnit::class) @EmulatedDevices(["pixelFoldable2023", "pixelTablet2023"]) -@EnableFlags(FLAG_ENABLE_TASKBAR_OVERFLOW, FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION) +@EnableFlags(FLAG_ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION, FLAG_TASKBAR_OVERFLOW) class TaskbarViewWithLayoutTransitionTest { @get:Rule(order = 0) val setFlagsRule = SetFlagsRule() @@ -243,17 +243,6 @@ class TaskbarViewWithLayoutTransitionTest { assertThat(taskbarView).hasIconTypes(ALL_APPS, HOTSEAT) } - @Test - fun testUpdateItems_desktopMode_hotseatItem_noDividerAfterDesktopModeChange() { - whenever(desktopVisibilityController.isInDesktopMode(context.displayId)).thenReturn(false) - runOnMainSync { taskbarView.updateItems(createHotseatItems(1), emptyList()) } - - whenever(desktopVisibilityController.isInDesktopMode(context.displayId)).thenReturn(true) - runOnMainSync { taskbarView.updateItems(createHotseatItems(2), emptyList()) } - - assertThat(taskbarView).hasIconTypes(ALL_APPS, HOTSEAT, HOTSEAT) - } - @Test @ForceRtl fun testUpdateItems_rtlAndDesktopMode_hotseatItem_noDivider() { diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarInputConsumerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarInputConsumerTest.kt index d5a8baf368..c8f50f70d5 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarInputConsumerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarInputConsumerTest.kt @@ -50,7 +50,6 @@ class BubbleBarInputConsumerTest { @Mock private lateinit var bubbleBarPinController: BubbleBarPinController @Mock private lateinit var bubblePinController: BubblePinController @Mock private lateinit var bubbleBarSwipeController: BubbleBarSwipeController - @Mock private lateinit var dragToBubbleController: DragToBubbleController @Mock private lateinit var bubbleCreator: BubbleCreator @Mock private lateinit var motionEvent: MotionEvent @@ -70,7 +69,6 @@ class BubbleBarInputConsumerTest { bubbleBarPinController, bubblePinController, Optional.of(bubbleBarSwipeController), - dragToBubbleController, bubbleCreator, ) } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeControllerTest.kt index 5865dcdb2f..024ec4c060 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeControllerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeControllerTest.kt @@ -69,7 +69,6 @@ class BubbleBarSwipeControllerTest { @Mock private lateinit var bubbleDismissController: BubbleDismissController @Mock private lateinit var bubbleBarPinController: BubbleBarPinController @Mock private lateinit var bubblePinController: BubblePinController - @Mock private lateinit var dragToBubbleController: DragToBubbleController @Mock private lateinit var bubbleCreator: BubbleCreator @Before @@ -95,7 +94,6 @@ class BubbleBarSwipeControllerTest { bubbleBarPinController, bubblePinController, Optional.of(bubbleBarSwipeController), - dragToBubbleController, bubbleCreator, ) diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashControllerTest.kt index 0421a13aec..88b39d3653 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashControllerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashControllerTest.kt @@ -29,7 +29,6 @@ import com.android.launcher3.taskbar.bubbles.BubbleBarView import com.android.launcher3.taskbar.bubbles.BubbleBarViewController import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.BubbleLauncherState import com.android.launcher3.util.MultiValueAlpha -import com.android.wm.shell.shared.bubbles.BubbleBarLocation import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Rule @@ -354,7 +353,7 @@ class PersistentBubbleStashControllerTest { bubbleBarGesture = true, ) - verify(bubbleBarViewController).animateExpanded(true, true) + verify(bubbleBarViewController).setExpanded(true, true) } @Test @@ -367,7 +366,7 @@ class PersistentBubbleStashControllerTest { bubbleBarGesture = false, ) - verify(bubbleBarViewController).animateExpanded(true, false) + verify(bubbleBarViewController).setExpanded(true, false) } @Test @@ -380,7 +379,7 @@ class PersistentBubbleStashControllerTest { bubbleBarGesture = true, ) - verify(bubbleBarViewController, never()).animateExpanded(any(), any()) + verify(bubbleBarViewController, never()).setExpanded(any(), any()) } private fun advanceTimeBy(advanceMs: Long) { @@ -392,26 +391,6 @@ class PersistentBubbleStashControllerTest { getInstrumentation().runOnMainSync { bubbleBarView = BubbleBarView(context) bubbleBarView.layoutParams = FrameLayout.LayoutParams(0, 0) - bubbleBarView.setController( - object : BubbleBarView.Controller { - override fun getBubbleBarTranslationY(): Float = 0f - - override fun onBubbleBarTouched() {} - - override fun expandBubbleBar() {} - - override fun dismissBubbleBar() {} - - override fun updateBubbleBarLocation( - location: BubbleBarLocation?, - source: Int, - ) {} - - override fun setIsDragging(dragging: Boolean) {} - - override fun onBubbleBarExpandedStateChanged(expanded: Boolean) {} - } - ) } } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashControllerTest.kt index 3b6412d787..b24926beca 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashControllerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashControllerTest.kt @@ -38,7 +38,6 @@ import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.Bubb import com.android.launcher3.util.MultiValueAlpha import com.android.wm.shell.shared.animation.PhysicsAnimator import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils -import com.android.wm.shell.shared.bubbles.BubbleBarLocation import com.google.common.collect.Range import com.google.common.truth.Truth.assertThat import org.junit.Before @@ -376,7 +375,7 @@ class TransientBubbleStashControllerTest { ) } - verify(bubbleBarViewController).animateExpanded(true, true) + verify(bubbleBarViewController).setExpanded(true, true) } @Test @@ -393,7 +392,7 @@ class TransientBubbleStashControllerTest { ) } - verify(bubbleBarViewController).animateExpanded(true, false) + verify(bubbleBarViewController).setExpanded(true, false) } @Test @@ -410,7 +409,7 @@ class TransientBubbleStashControllerTest { ) } - verify(bubbleBarViewController, never()).animateExpanded(any(), any()) + verify(bubbleBarViewController, never()).setExpanded(any(), any()) } @Test @@ -557,28 +556,8 @@ class TransientBubbleStashControllerTest { bubbleBarView = BubbleBarView(context) bubbleBarView.layoutParams = FrameLayout.LayoutParams(BUBBLE_BAR_WIDTH, BUBBLE_BAR_HEIGHT) - bubbleBarView.setController( - object : BubbleBarView.Controller { - override fun getBubbleBarTranslationY(): Float = 0f - - override fun onBubbleBarTouched() {} - - override fun expandBubbleBar() {} - - override fun dismissBubbleBar() {} - - override fun updateBubbleBarLocation( - location: BubbleBarLocation?, - source: Int, - ) {} - - override fun setIsDragging(dragging: Boolean) {} - - override fun onBubbleBarExpandedStateChanged(expanded: Boolean) {} - } - ) bubbleView = BubbleView(context) - bubbleBarView.addBubble(bubbleView, false) + bubbleBarView.addBubble(bubbleView) bubbleBarView.layout(0, 0, BUBBLE_BAR_WIDTH, BUBBLE_BAR_HEIGHT) } } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactoryTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactoryTest.kt index 579c10f712..c8f79463b1 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactoryTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactoryTest.kt @@ -14,7 +14,6 @@ import androidx.test.runner.AndroidJUnit4 import com.android.launcher3.DeviceProfile import com.android.launcher3.R import com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION -import com.android.launcher3.deviceprofile.DeviceProperties import com.android.launcher3.taskbar.navbutton.LayoutResourceHelper.ID_END_CONTEXTUAL_BUTTONS import com.android.launcher3.taskbar.navbutton.LayoutResourceHelper.ID_END_NAV_BUTTONS import com.android.launcher3.taskbar.navbutton.LayoutResourceHelper.ID_START_CONTEXTUAL_BUTTONS @@ -51,8 +50,6 @@ class NavButtonLayoutFactoryTest { whenever(mockNavLayout.findViewById(R.id.back)).thenReturn(mockBackButton) whenever(mockNavLayout.findViewById(R.id.home)).thenReturn(mockHomeButton) whenever(mockNavLayout.findViewById(R.id.recent_apps)).thenReturn(mockRecentsButton) - val devicePropertiesMock: DeviceProperties = mock() - whenever(mockDeviceProfile.deviceProperties).thenReturn(devicePropertiesMock) // Init top level layout whenever(mockParentButtonContainer.requireViewById(ID_END_NAV_BUTTONS)) @@ -76,7 +73,7 @@ class NavButtonLayoutFactoryTest { isInSetup = false, isThreeButtonNav = false, phoneMode = false, - surfaceRotation = surfaceRotation, + surfaceRotation = surfaceRotation ) assert(layoutter is KidsNavLayoutter) } @@ -91,7 +88,7 @@ class NavButtonLayoutFactoryTest { isInSetup = true, isThreeButtonNav = false, phoneMode = false, - surfaceRotation = surfaceRotation, + surfaceRotation = surfaceRotation ) assert(layoutter is SetupNavLayoutter) } @@ -106,7 +103,7 @@ class NavButtonLayoutFactoryTest { isInSetup = false, isThreeButtonNav = false, phoneMode = false, - surfaceRotation = surfaceRotation, + surfaceRotation = surfaceRotation ) assert(layoutter is TaskbarNavLayoutter) } @@ -120,7 +117,7 @@ class NavButtonLayoutFactoryTest { isInSetup = false, isThreeButtonNav = false, phoneMode = false, - surfaceRotation = surfaceRotation, + surfaceRotation = surfaceRotation ) } @@ -134,7 +131,7 @@ class NavButtonLayoutFactoryTest { isInSetup = false, isThreeButtonNav = true, phoneMode = true, - surfaceRotation = surfaceRotation, + surfaceRotation = surfaceRotation ) assert(layoutter is PhonePortraitNavLayoutter) } @@ -150,7 +147,7 @@ class NavButtonLayoutFactoryTest { isInSetup = false, isThreeButtonNav = true, phoneMode = true, - surfaceRotation = surfaceRotation, + surfaceRotation = surfaceRotation ) assert(layoutter is PhoneLandscapeNavLayoutter) } @@ -166,7 +163,7 @@ class NavButtonLayoutFactoryTest { isInSetup = false, isThreeButtonNav = true, phoneMode = true, - surfaceRotation = ROTATION_270, + surfaceRotation = ROTATION_270 ) assert(layoutter is PhoneSeascapeNavLayoutter) } @@ -181,13 +178,16 @@ class NavButtonLayoutFactoryTest { isInSetup = false, isThreeButtonNav = false, phoneMode = true, - surfaceRotation = surfaceRotation, + surfaceRotation = surfaceRotation ) assert(layoutter is PhoneGestureLayoutter) } private fun setDeviceProfileLandscape() { - whenever(mockDeviceProfile.deviceProperties.isLandscape).thenReturn(true) + // Use reflection to modify landscape field + val landscapeField = mockDeviceProfile.javaClass.getDeclaredField("isLandscape") + landscapeField.isAccessible = true + landscapeField.set(mockDeviceProfile, true) } private fun getLayoutter( @@ -195,7 +195,7 @@ class NavButtonLayoutFactoryTest { isInSetup: Boolean, isThreeButtonNav: Boolean, phoneMode: Boolean, - @Rotation surfaceRotation: Int, + @Rotation surfaceRotation: Int ): NavButtonLayoutFactory.NavButtonLayoutter { return NavButtonLayoutFactory.getUiLayoutter( deviceProfile = mockDeviceProfile, diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/MockedRecentsModelHelper.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/MockedRecentsModelHelper.kt index 6b34cef3b1..5f7b360bdf 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/MockedRecentsModelHelper.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/MockedRecentsModelHelper.kt @@ -21,7 +21,6 @@ import com.android.quickstep.RecentsModel.RecentTasksChangedListener import com.android.quickstep.TaskIconCache import com.android.quickstep.TaskThumbnailCache import com.android.quickstep.util.GroupTask -import java.util.function.BiConsumer import java.util.function.Consumer import org.mockito.kotlin.any import org.mockito.kotlin.anyOrNull @@ -43,28 +42,16 @@ class MockedRecentsModelHelper { on { thumbnailCache } doReturn mockThumbnailCache - on { unregisterRecentTasksChangedListener(any()) } doAnswer - { - recentTasksChangedListener = null - } + on { unregisterRecentTasksChangedListener() } doAnswer { recentTasksChangedListener = null } on { registerRecentTasksChangedListener(any()) } doAnswer { recentTasksChangedListener = it.getArgument(0) } - on { getTasks(anyOrNull, Int>>(), anyOrNull()) } doAnswer + on { getTasks(anyOrNull(), anyOrNull()) } doAnswer { - val request = it.getArgument, Int>?>(0) - if (request != null) { - taskRequests.add { response -> request.accept(response, taskListId) } - } - taskListId - } - - on { getTasks(anyOrNull(), anyOrNull>>()) } doAnswer - { - val request = it.getArgument>?>(1) + val request = it.getArgument>?>(0) if (request != null) { taskRequests.add { response -> request.accept(response) } } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarModeRuleTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarModeRuleTest.kt index d4a3fa62e6..0dd1324c0f 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarModeRuleTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarModeRuleTest.kt @@ -49,8 +49,8 @@ class TaskbarModeRuleTest { @TaskbarMode(TRANSIENT) fun testTaskbarMode_transient_overridesDeviceProfile() { val dp = InvariantDeviceProfile.INSTANCE.get(context).getDeviceProfile(context) - assertThat(dp.taskbarProfile.isTransientTaskbar).isTrue() - assertThat(dp.deviceProperties.isGestureMode).isTrue() + assertThat(dp.isTransientTaskbar).isTrue() + assertThat(dp.isGestureMode).isTrue() } @Test @@ -65,8 +65,8 @@ class TaskbarModeRuleTest { @TaskbarMode(PINNED) fun testTaskbarMode_pinned_overridesDeviceProfile() { val dp = InvariantDeviceProfile.INSTANCE.get(context).getDeviceProfile(context) - assertThat(dp.taskbarProfile.isTransientTaskbar).isFalse() - assertThat(dp.deviceProperties.isGestureMode).isTrue() + assertThat(dp.isTransientTaskbar).isFalse() + assertThat(dp.isGestureMode).isTrue() } @Test @@ -82,7 +82,7 @@ class TaskbarModeRuleTest { @TaskbarMode(THREE_BUTTONS) fun testTaskbarMode_threeButtons_overridesDeviceProfile() { val dp = InvariantDeviceProfile.INSTANCE.get(context).getDeviceProfile(context) - assertThat(dp.taskbarProfile.isTransientTaskbar).isFalse() - assertThat(dp.deviceProperties.isGestureMode).isFalse() + assertThat(dp.isTransientTaskbar).isFalse() + assertThat(dp.isGestureMode).isFalse() } } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt index 9ac19e1392..19c88240d9 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt @@ -26,18 +26,15 @@ import androidx.test.platform.app.InstrumentationRegistry import com.android.launcher3.LauncherAppState import com.android.launcher3.taskbar.TaskbarActivityContext import com.android.launcher3.taskbar.TaskbarControllers -import com.android.launcher3.taskbar.TaskbarManagerImpl +import com.android.launcher3.taskbar.TaskbarManager import com.android.launcher3.taskbar.TaskbarNavButtonController.TaskbarNavButtonCallbacks import com.android.launcher3.taskbar.TaskbarUIController import com.android.launcher3.taskbar.bubbles.BubbleControllers import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR import com.android.launcher3.util.TestUtil -import com.android.launcher3.util.coroutines.ProductionDispatchers import com.android.quickstep.AllAppsActionManager -import com.android.quickstep.LauncherDisplaysWithDecorationsRepositoryCompat -import com.android.quickstep.fallback.window.RecentsWindowManager -import com.android.quickstep.input.QuickstepKeyGestureEventsManager +import com.android.quickstep.fallback.window.RecentsDisplayModel import java.lang.reflect.Field import java.lang.reflect.ParameterizedType import java.util.Locale @@ -46,10 +43,6 @@ import org.junit.Assume.assumeTrue import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runners.model.Statement -import org.mockito.kotlin.any -import org.mockito.kotlin.doNothing -import org.mockito.kotlin.spy -import org.mockito.kotlin.whenever /** * Manages the Taskbar lifecycle for unit tests. @@ -85,7 +78,7 @@ class TaskbarUnitTestRule( private val instrumentation = InstrumentationRegistry.getInstrumentation() - private lateinit var taskbarManager: TaskbarManagerImpl + private lateinit var taskbarManager: TaskbarManager val activityContext: TaskbarActivityContext get() { @@ -110,38 +103,16 @@ class TaskbarUnitTestRule( context.settingsCacheSandbox[getUriFor(NAV_BAR_KIDS_MODE)] = if (description.getAnnotation(NavBarKidsMode::class.java) != null) 1 else 0 - val quickstepKeyGestureEventsManagerSpy = - spy(QuickstepKeyGestureEventsManager(context)) - doNothing() - .whenever(quickstepKeyGestureEventsManagerSpy) - .registerAllAppsKeyGestureEvent(any()) - doNothing() - .whenever(quickstepKeyGestureEventsManagerSpy) - .unregisterAllAppsKeyGestureEvent() - doNothing() - .whenever(quickstepKeyGestureEventsManagerSpy) - .registerOverviewKeyGestureEvent(any()) - doNothing() - .whenever(quickstepKeyGestureEventsManagerSpy) - .unregisterOverviewKeyGestureEvent() taskbarManager = TestUtil.getOnUiThread { object : - TaskbarManagerImpl( + TaskbarManager( context, - AllAppsActionManager( - context, - UI_HELPER_EXECUTOR, - quickstepKeyGestureEventsManagerSpy, - ) { + AllAppsActionManager(context, UI_HELPER_EXECUTOR) { PendingIntent(IIntentSender.Default()) }, object : TaskbarNavButtonCallbacks {}, - RecentsWindowManager.REPOSITORY_INSTANCE.get(context), - LauncherDisplaysWithDecorationsRepositoryCompat.INSTANCE.get( - context - ), - ProductionDispatchers.main, + RecentsDisplayModel.INSTANCE.get(context), ) { override fun recreateTaskbars() { super.recreateTaskbars() @@ -152,18 +123,6 @@ class TaskbarUnitTestRule( controllerInjectionCallback.invoke() } } - - override fun recreateTaskbarForDisplay(displayId: Int, duration: Int) { - super.recreateTaskbarForDisplay(displayId, duration) - if ( - displayId == context.displayId && currentActivityContext != null - ) { - injectControllers() - // TODO(b/346394875): we should test a non-default uiController. - activityContext.setUIController(TaskbarUIController.DEFAULT) - controllerInjectionCallback.invoke() - } - } } } @@ -184,7 +143,6 @@ class TaskbarUnitTestRule( base.evaluate() } finally { instrumentation.runOnMainSync { taskbarManager.destroy() } - context.displayControllerSpy?.cleanup() } } } diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarWindowSandboxContext.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarWindowSandboxContext.kt index 64a6902c38..d96e06eca5 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarWindowSandboxContext.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarWindowSandboxContext.kt @@ -20,18 +20,34 @@ import android.content.Context import android.content.ContextWrapper import android.hardware.display.DisplayManager import android.hardware.display.VirtualDisplay -import android.view.Display import android.view.Display.DEFAULT_DISPLAY import androidx.test.core.app.ApplicationProvider +import com.android.launcher3.LauncherPrefs +import com.android.launcher3.dagger.ApplicationContext +import com.android.launcher3.dagger.LauncherAppComponent +import com.android.launcher3.dagger.LauncherAppSingleton +import com.android.launcher3.statehandlers.DesktopVisibilityController +import com.android.launcher3.util.AllModulesMinusWMProxy +import com.android.launcher3.util.DaggerSingletonTracker +import com.android.launcher3.util.DisplayController +import com.android.launcher3.util.FakePrefsModule import com.android.launcher3.util.SandboxApplication +import com.android.launcher3.util.SettingsCache import com.android.launcher3.util.SettingsCacheSandbox +import com.android.launcher3.util.window.WindowManagerProxy import com.android.quickstep.SystemUiProxy +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import javax.inject.Inject import org.junit.rules.ExternalResource import org.junit.rules.RuleChain import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runners.model.Statement -import org.mockito.kotlin.whenever +import org.mockito.kotlin.spy /** * [SandboxApplication] for running Taskbar tests. @@ -53,20 +69,6 @@ private constructor( override fun after() = virtualDisplay.release() } - // Filter out DEFAULT_DISPLAY in case code accesses displays property. The primary virtual - // display has a different ID. - private val sandboxDisplayManagerRule = - object : ExternalResource() { - override fun before() { - val dm = base.spyService(DisplayManager::class.java) - whenever(dm.displays).thenAnswer { i -> - @Suppress("UNCHECKED_CAST") - val displays = i.callRealMethod() as? Array ?: emptyArray() - displays.filter { it.displayId != DEFAULT_DISPLAY }.toTypedArray() - } - } - } - private val singletonSetupRule = object : ExternalResource() { override fun before() { @@ -82,7 +84,6 @@ private constructor( override fun apply(statement: Statement, description: Description): Statement { return RuleChain.outerRule(virtualDisplayRule) .around(base) - .around(sandboxDisplayManagerRule) .around(singletonSetupRule) .apply(statement, description) } @@ -108,7 +109,7 @@ private constructor( } return TaskbarWindowSandboxContext( - SandboxApplication(base = base.createDisplayContext(virtualDisplay.display)), + SandboxApplication(base.createDisplayContext(virtualDisplay.display)), virtualDisplay, params, ) @@ -116,6 +117,64 @@ private constructor( } } +/** A wrapper over display controller which allows modifying the underlying info */ +@LauncherAppSingleton +class DisplayControllerSpy +@Inject +constructor( + @ApplicationContext context: Context, + wmProxy: WindowManagerProxy, + prefs: LauncherPrefs, + lifecycle: DaggerSingletonTracker, +) : DisplayController(context, wmProxy, prefs, lifecycle) { + + var infoModifier: ((Info) -> Info)? = null + + override fun getInfo(): Info = infoModifier?.invoke(super.getInfo()) ?: super.getInfo() +} + +@Module +abstract class DisplayControllerModule { + @Binds abstract fun bindDisplayController(controller: DisplayControllerSpy): DisplayController +} + +@Module +object DesktopVisibilityControllerModule { + @JvmStatic + @Provides + @LauncherAppSingleton + fun provideDesktopVisibilityController( + @ApplicationContext context: Context, + systemUiProxy: SystemUiProxy, + lifecycleTracker: DaggerSingletonTracker, + ): DesktopVisibilityController { + return spy(DesktopVisibilityController(context, systemUiProxy, lifecycleTracker)) + } +} + +@LauncherAppSingleton +@Component( + modules = + [ + AllModulesMinusWMProxy::class, + FakePrefsModule::class, + DisplayControllerModule::class, + TaskbarSandboxModule::class, + DesktopVisibilityControllerModule::class, + ] +) +interface TaskbarSandboxComponent : LauncherAppComponent { + + @Component.Builder + interface Builder : LauncherAppComponent.Builder { + @BindsInstance fun bindSystemUiProxy(proxy: SystemUiProxy): Builder + + @BindsInstance fun bindSettingsCache(settingsCache: SettingsCache): Builder + + override fun build(): TaskbarSandboxComponent + } +} + /** Include additional bindings when building a [TaskbarSandboxComponent]. */ data class SandboxParams( val systemUiProxyProvider: (Context) -> SystemUiProxy = { SystemUiProxy(it) }, diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java index ec49237e96..6adb7b4052 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java @@ -18,16 +18,12 @@ package com.android.quickstep; import static android.view.Display.DEFAULT_DISPLAY; -import static com.android.launcher3.BaseActivity.EVENT_DESTROYED; -import static com.android.launcher3.statehandlers.DesktopVisibilityController.INACTIVE_DESK_ID; import static com.android.quickstep.AbsSwipeUpHandler.STATE_HANDLER_INVALIDATED; import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_CAN_HAND_OFF_ANIMATION; import static com.android.wm.shell.shared.split.SplitBounds.KEY_EXTRA_SPLIT_BOUNDS; import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50; -import static junit.framework.Assert.assertNotNull; import static junit.framework.TestCase.assertFalse; -import static junit.framework.TestCase.assertNull; import static junit.framework.TestCase.assertTrue; import static org.mockito.ArgumentMatchers.any; @@ -37,9 +33,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -57,6 +51,7 @@ import android.os.SystemClock; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; +import android.view.Display; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.view.ViewTreeObserver; @@ -68,10 +63,9 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherRootView; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.statemanager.BaseState; -import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.statemanager.StatefulContainer; +import com.android.launcher3.util.LauncherModelHelper; import com.android.launcher3.util.MSDLPlayerWrapper; -import com.android.launcher3.util.SandboxApplication; import com.android.launcher3.util.SystemUiController; import com.android.quickstep.util.ContextInitListener; import com.android.quickstep.util.MotionPauseDetector; @@ -84,7 +78,6 @@ import com.android.wm.shell.shared.split.SplitBounds; import com.google.android.msdl.data.model.MSDLToken; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -102,23 +95,17 @@ public abstract class AbsSwipeUpHandlerTestCase< SWIPE_HANDLER extends AbsSwipeUpHandler, CONTAINER_INTERFACE extends BaseContainerInterface> { - @Rule - public final MockitoRule mMockitoRule = MockitoJUnit.rule(); - - @Rule - public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - - @Rule - public final SandboxApplication mContext = new SandboxApplication(); - + protected final LauncherModelHelper mLauncherModelHelper = new LauncherModelHelper(); + protected final LauncherModelHelper.SandboxModelContext mContext = + mLauncherModelHelper.sandboxContext; protected final InputConsumerController mInputConsumerController = InputConsumerController.getRecentsAnimationInputConsumer(); protected final ActivityManager.RunningTaskInfo mRunningTaskInfo = new ActivityManager.RunningTaskInfo(); protected final TopTaskTracker.CachedTaskInfo mCachedTaskInfo = new TopTaskTracker.CachedTaskInfo( - Collections.singletonList(mRunningTaskInfo), mContext, DEFAULT_DISPLAY, - INACTIVE_DESK_ID); + Collections.singletonList(mRunningTaskInfo), /* canEnterDesktop = */ false, + DEFAULT_DISPLAY); protected final RemoteAnimationTarget mRemoteAnimationTarget = new RemoteAnimationTarget( /* taskId= */ 0, /* mode= */ RemoteAnimationTarget.MODE_CLOSING, @@ -137,45 +124,8 @@ public abstract class AbsSwipeUpHandlerTestCase< /* taskInfo= */ mRunningTaskInfo, /* allowEnterPip= */ false); - protected final RemoteAnimationTarget mRemoteAnimationLeftTop = new RemoteAnimationTarget( - /* taskId= */ 1, - /* mode= */ RemoteAnimationTarget.MODE_CLOSING, - /* leash= */ new SurfaceControl(), - /* isTranslucent= */ false, - /* clipRect= */ null, - /* contentInsets= */ null, - /* prefixOrderIndex= */ 0, - /* position= */ null, - /* localBounds= */ null, - /* screenSpaceBounds= */ null, - new Configuration().windowConfiguration, - /* isNotInRecents= */ false, - /* startLeash= */ null, - /* startBounds= */ null, - /* taskInfo= */ mRunningTaskInfo, - /* allowEnterPip= */ false); - - protected final RemoteAnimationTarget mRemoteAnimationRightBottom = new RemoteAnimationTarget( - /* taskId= */ 2, - /* mode= */ RemoteAnimationTarget.MODE_CLOSING, - /* leash= */ new SurfaceControl(), - /* isTranslucent= */ false, - /* clipRect= */ null, - /* contentInsets= */ null, - /* prefixOrderIndex= */ 0, - /* position= */ null, - /* localBounds= */ null, - /* screenSpaceBounds= */ null, - new Configuration().windowConfiguration, - /* isNotInRecents= */ false, - /* startLeash= */ null, - /* startBounds= */ null, - /* taskInfo= */ mRunningTaskInfo, - /* allowEnterPip= */ false); - protected RecentsAnimationTargets mRecentsAnimationTargets; protected TaskAnimationManager mTaskAnimationManager; - protected StateManager mStateManager; @Mock protected CONTAINER_INTERFACE mActivityInterface; @Mock protected ContextInitListener mContextInitListener; @@ -187,9 +137,12 @@ public abstract class AbsSwipeUpHandlerTestCase< @Mock protected SystemUiController mSystemUiController; @Mock protected GestureState mGestureState; @Mock protected MSDLPlayerWrapper mMSDLPlayerWrapper; - @Mock protected RecentsAnimationDeviceState mDeviceState; - @Mock protected RotationTouchHelper mRotationTouchHelper; - @Mock protected StateManager.AtomicAnimationFactory mAtomicAnimationFactory; + + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Before public void setUpAnimationTargets() { @@ -198,12 +151,12 @@ public abstract class AbsSwipeUpHandlerTestCase< extras.putParcelable(KEY_EXTRA_SPLIT_BOUNDS, new SplitBounds( /* leftTopBounds = */ new Rect(), /* rightBottomBounds = */ new Rect(), - /* leftTopTaskId = */ mRemoteAnimationLeftTop.taskId, - /* rightBottomTaskId = */ mRemoteAnimationRightBottom.taskId, + /* leftTopTaskId = */ -1, + /* rightBottomTaskId = */ -1, /* snapPosition = */ SNAP_TO_2_50_50)); mRecentsAnimationTargets = new RecentsAnimationTargets( - new RemoteAnimationTarget[] {mRemoteAnimationLeftTop}, - new RemoteAnimationTarget[] {mRemoteAnimationRightBottom}, + new RemoteAnimationTarget[] {mRemoteAnimationTarget}, + new RemoteAnimationTarget[] {mRemoteAnimationTarget}, new RemoteAnimationTarget[] {mRemoteAnimationTarget}, /* homeContentInsets= */ new Rect(), /* minimizedHomeBounds= */ null, @@ -240,8 +193,9 @@ public abstract class AbsSwipeUpHandlerTestCase< @Before public void setUpRecentsContainer() { - mTaskAnimationManager = spy(new TaskAnimationManager(mContext, DEFAULT_DISPLAY)); - RECENTS_CONTAINER recentsContainer = getRecentsContainer(); + mTaskAnimationManager = new TaskAnimationManager(mContext, + RecentsAnimationDeviceState.INSTANCE.get(mContext), DEFAULT_DISPLAY); + RecentsViewContainer recentsContainer = getRecentsContainer(); RECENTS_VIEW recentsView = getRecentsView(); when(recentsContainer.getDeviceProfile()).thenReturn(new DeviceProfile()); @@ -249,7 +203,6 @@ public abstract class AbsSwipeUpHandlerTestCase< when(recentsContainer.getDragLayer()).thenReturn(mDragLayer); when(recentsContainer.getRootView()).thenReturn(mRootView); when(recentsContainer.getSystemUiController()).thenReturn(mSystemUiController); - when(recentsContainer.createAtomicAnimationFactory()).thenReturn(mAtomicAnimationFactory); when(mActivityInterface.createActivityInitListener(any())) .thenReturn(mContextInitListener); doReturn(recentsContainer).when(mActivityInterface).getCreatedContainer(); @@ -257,10 +210,6 @@ public abstract class AbsSwipeUpHandlerTestCase< answer.getArgument(0).run(); return this; }).when(recentsContainer).runOnBindToTouchInteractionService(any()); - - mStateManager = spy(new StateManager<>(recentsContainer, getBaseState())); - - doReturn(mStateManager).when(recentsContainer).getStateManager(); } @Test @@ -370,24 +319,6 @@ public abstract class AbsSwipeUpHandlerTestCase< }); } - @Test - @Ignore("b/418979038") - public void invalidateHandlerWithLauncher_runsGestureAnimationEndCallback() { - SWIPE_HANDLER handler = createSwipeHandler(); - Runnable onGestureAnimationEndCallback = mock(Runnable.class); - handler.setGestureAnimationEndCallback(onGestureAnimationEndCallback); - handler.onActivityInit(true); // Sets STATE_LAUNCHER_PRESENT - - // Use onConsumerAboutToBeSwitched to call reset(),to sets STATE_HANDLER_INVALIDATED. This - // will then call invalidateHandlerWithLauncher. This will hit the reset() in the else - // condition of onConsumerAboutToBeSwitched, as the gesture state is a mock and will - // return false for the booleans checked in the if-condition. - handler.onConsumerAboutToBeSwitched(); - - verify(getRecentsView()).onGestureAnimationEnd(); - verify(onGestureAnimationEndCallback).run(); - } - @Test @EnableFlags(com.android.launcher3.Flags.FLAG_MSDL_FEEDBACK) public void onMotionPauseDetected_playsSwipeThresholdToken() { @@ -399,39 +330,6 @@ public abstract class AbsSwipeUpHandlerTestCase< verifyNoMoreInteractions(mMSDLPlayerWrapper); } - @Test - public void testOnContainerDestroy_cleansUpSwipeHandler() { - SWIPE_HANDLER swipeHandler = createSwipeHandler(); - - swipeHandler.onActivityInit(true); - - RECENTS_CONTAINER container = getRecentsContainer(); - ArgumentCaptor onContainerDestroyCallbackCaptor = - ArgumentCaptor.forClass(Runnable.class); - - verify(container) - .addEventCallback(eq(EVENT_DESTROYED), onContainerDestroyCallbackCaptor.capture()); - - assertNotNull(swipeHandler.mRecentsView); - assertNotNull(swipeHandler.mContainer); - - onContainerDestroyCallbackCaptor.getValue().run(); - - assertNull(swipeHandler.mRecentsView); - assertNull(swipeHandler.mContainer); - verify(mTaskAnimationManager).onLauncherDestroyed(); - runOnMainSync(() -> verify(mContextInitListener) - .unregister(eq("AbsSwipeUpHandler.mLauncherOnDestroyCallback"))); - } - - @Test - public void test_noActivityInit_doesNotThrowException() { - // Do not trigger onActivityInit to ensure AbsSwipeUpHandler.mRecentsView and - // AbsSwipeUpHandler.mContainer are null - createSwipeUpHandlerForGesture( - GestureState.GestureEndTarget.HOME, /* triggerOnActivityInit= */ false); - } - /** * Verifies that RecentsAnimationController#finish() is called, and captures and runs any * callback that was passed to it. This ensures that STATE_CURRENT_TASK_FINISHED is correctly @@ -453,20 +351,13 @@ public abstract class AbsSwipeUpHandlerTestCase< } private SWIPE_HANDLER createSwipeUpHandlerForGesture(GestureState.GestureEndTarget endTarget) { - return createSwipeUpHandlerForGesture(endTarget, true); - } - - private SWIPE_HANDLER createSwipeUpHandlerForGesture( - GestureState.GestureEndTarget endTarget, boolean triggerOnActivityInit) { boolean isQuickSwitch = endTarget == GestureState.GestureEndTarget.NEW_TASK; doReturn(mState).when(mActivityInterface).stateFromGestureEndTarget(any()); SWIPE_HANDLER swipeHandler = createSwipeHandler(SystemClock.uptimeMillis(), isQuickSwitch); - if (triggerOnActivityInit) { - swipeHandler.onActivityInit(/* alreadyOnHome= */ false); - } + swipeHandler.onActivityInit(/* alreadyOnHome= */ false); swipeHandler.onGestureStarted(isQuickSwitch); onRecentsAnimationStart(swipeHandler); @@ -487,7 +378,7 @@ public abstract class AbsSwipeUpHandlerTestCase< private void onRecentsAnimationStart(SWIPE_HANDLER absSwipeUpHandler) { runOnMainSync(() -> absSwipeUpHandler.onRecentsAnimationStart( - mRecentsAnimationController, mRecentsAnimationTargets, /* transitionInfo= */ null)); + mRecentsAnimationController, mRecentsAnimationTargets, /* transitionInfo= */null)); } protected static void runOnMainSync(Runnable runnable) { @@ -504,11 +395,8 @@ public abstract class AbsSwipeUpHandlerTestCase< long touchTimeMs, boolean continuingLastGesture); @NonNull - protected abstract RECENTS_CONTAINER getRecentsContainer(); + protected abstract RecentsViewContainer getRecentsContainer(); @NonNull protected abstract RECENTS_VIEW getRecentsView(); - - @NonNull - protected abstract STATE_TYPE getBaseState(); } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt index acfa9b40eb..a1bd107caf 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt @@ -18,7 +18,6 @@ package com.android.quickstep import android.app.PendingIntent import android.content.IIntentSender -import android.hardware.input.InputManager import android.provider.Settings import android.provider.Settings.Secure.USER_SETUP_COMPLETE import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -30,7 +29,6 @@ import com.android.launcher3.util.SandboxApplication import com.android.launcher3.util.SettingsCache import com.android.launcher3.util.SettingsCacheSandbox import com.android.launcher3.util.TestUtil -import com.android.quickstep.input.QuickstepKeyGestureEventsManager import com.google.common.truth.Truth.assertThat import dagger.BindsInstance import dagger.Component @@ -41,11 +39,6 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Mockito.spy -import org.mockito.Mockito.verify -import org.mockito.kotlin.any -import org.mockito.kotlin.doNothing -import org.mockito.kotlin.whenever private const val TIMEOUT = 5L private val USER_SETUP_COMPLETE_URI = Settings.Secure.getUriFor(USER_SETUP_COMPLETE) @@ -56,30 +49,24 @@ class AllAppsActionManagerTest { private val bgExecutor = UI_HELPER_EXECUTOR @get:Rule val context = SandboxApplication() - private val inputManager = context.spyService(InputManager::class.java) private val settingsCacheSandbox = SettingsCacheSandbox().also { it[USER_SETUP_COMPLETE_URI] = 1 } - private val quickstepKeyGestureEventsManager by - lazy(LazyThreadSafetyMode.NONE) { spy(QuickstepKeyGestureEventsManager(context)) } private val allAppsActionManager by lazy(LazyThreadSafetyMode.NONE) { - AllAppsActionManager(context, bgExecutor, quickstepKeyGestureEventsManager) { + AllAppsActionManager(context, bgExecutor) { callbackSemaphore.release() PendingIntent(IIntentSender.Default()) } } @Before - fun setUp() { + fun initDaggerComponent() { context.initDaggerComponent( DaggerAllAppsActionManagerTestComponent.builder() .bindSettingsCache(settingsCacheSandbox.cache) ) - - doNothing().whenever(inputManager).registerKeyGestureEventHandler(any(), any()) - doNothing().whenever(inputManager).unregisterKeyGestureEventHandler(any()) } @After fun destroyManager() = allAppsActionManager.onDestroy() @@ -87,19 +74,15 @@ class AllAppsActionManagerTest { @Test fun taskbarPresent_actionRegistered() { allAppsActionManager.isTaskbarPresent = true - TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to register. assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue() assertThat(allAppsActionManager.isActionRegistered).isTrue() - verify(quickstepKeyGestureEventsManager).registerAllAppsKeyGestureEvent(any()) } @Test fun homeAndOverviewSame_actionRegistered() { allAppsActionManager.isHomeAndOverviewSame = true - TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to register. assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue() assertThat(allAppsActionManager.isActionRegistered).isTrue() - verify(quickstepKeyGestureEventsManager).registerAllAppsKeyGestureEvent(any()) } @Test @@ -110,7 +93,6 @@ class AllAppsActionManagerTest { allAppsActionManager.isTaskbarPresent = false TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to unregister. assertThat(allAppsActionManager.isActionRegistered).isFalse() - verify(quickstepKeyGestureEventsManager).unregisterAllAppsKeyGestureEvent() } @Test @@ -121,7 +103,6 @@ class AllAppsActionManagerTest { TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to unregister. assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue() assertThat(allAppsActionManager.isActionRegistered).isFalse() - verify(quickstepKeyGestureEventsManager).unregisterAllAppsKeyGestureEvent() } @Test @@ -155,10 +136,8 @@ class AllAppsActionManagerTest { allAppsActionManager.isTaskbarPresent = true settingsCacheSandbox[USER_SETUP_COMPLETE_URI] = 1 - TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to register. assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue() assertThat(allAppsActionManager.isActionRegistered).isTrue() - verify(quickstepKeyGestureEventsManager).registerAllAppsKeyGestureEvent(any()) } @Test @@ -167,17 +146,8 @@ class AllAppsActionManagerTest { allAppsActionManager.isTaskbarPresent = true allAppsActionManager.isSetupUiVisible = false - TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to register. assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue() assertThat(allAppsActionManager.isActionRegistered).isTrue() - verify(quickstepKeyGestureEventsManager).registerAllAppsKeyGestureEvent(any()) - } - - @Test - fun onDestroy_shouldUnregisterAllAppsKeyGestureHandler() { - allAppsActionManager.onDestroy() - - verify(quickstepKeyGestureEventsManager).unregisterAllAppsKeyGestureEvent() } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/DisplayModelTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/DisplayModelTest.kt index 3aab528437..fa7907fa4b 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/DisplayModelTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/DisplayModelTest.kt @@ -21,23 +21,16 @@ import android.view.Display import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import com.android.app.displaylib.DisplaysWithDecorationsRepositoryCompat import java.io.PrintWriter -import kotlinx.coroutines.test.StandardTestDispatcher import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Test import org.junit.runner.RunWith -import org.mockito.kotlin.mock @SmallTest @RunWith(AndroidJUnit4::class) class DisplayModelTest { private val context: Context = ApplicationProvider.getApplicationContext() - private val systemDecorationChangeObserver = - SystemDecorationChangeObserver.INSTANCE.get(context) - private val displayRepositoryCompat = mock() - private val dispatcher = StandardTestDispatcher() class TestableResource : DisplayModel.DisplayResource() { var isCleanupCalled = false @@ -52,13 +45,7 @@ class DisplayModelTest { } private val testableDisplayModel = - object : - DisplayModel( - context, - systemDecorationChangeObserver, - displayRepositoryCompat, - dispatcher, - ) { + object : DisplayModel(context) { override fun createDisplayResource(display: Display): TestableResource { return TestableResource() } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/FallbackSwipeHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/FallbackSwipeHandlerTestCase.java index 109a52e2df..3489519e74 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/FallbackSwipeHandlerTestCase.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/FallbackSwipeHandlerTestCase.java @@ -45,8 +45,6 @@ public class FallbackSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase< return new FallbackSwipeHandler( mContext, mTaskAnimationManager, - mDeviceState, - mRotationTouchHelper, mGestureState, touchTimeMs, continuingLastGesture, @@ -65,10 +63,4 @@ public class FallbackSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase< protected FallbackRecentsView getRecentsView() { return mRecentsView; } - - @NonNull - @Override - protected RecentsState getBaseState() { - return RecentsState.BG_LAUNCHER; - } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/HotseatWidthCalculationTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/HotseatWidthCalculationTest.kt index a2435188a1..a38851098e 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/HotseatWidthCalculationTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/HotseatWidthCalculationTest.kt @@ -39,7 +39,7 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { val dp = newDP() dp.isTaskbarPresentInApps = true - assertThat(dp.hotseatProfile.barEndOffset).isEqualTo(510) + assertThat(dp.hotseatBarEndOffset).isEqualTo(510) assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.hotseatBorderSpace).isEqualTo(70) assertThat(dp.hotseatColumnSpan).isEqualTo(6) @@ -63,7 +63,7 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { val dp = newDP() dp.isTaskbarPresentInApps = true - assertThat(dp.hotseatProfile.barEndOffset).isEqualTo(510) + assertThat(dp.hotseatBarEndOffset).isEqualTo(510) assertThat(dp.numShownHotseatIcons).isEqualTo(4) assertThat(dp.hotseatBorderSpace).isEqualTo(40) assertThat(dp.hotseatColumnSpan).isEqualTo(6) @@ -86,7 +86,7 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { val dp = newDP() dp.isTaskbarPresentInApps = true - assertThat(dp.hotseatProfile.barEndOffset).isEqualTo(705) + assertThat(dp.hotseatBarEndOffset).isEqualTo(705) assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.hotseatBorderSpace).isEqualTo(54) assertThat(dp.hotseatColumnSpan).isEqualTo(6) @@ -110,7 +110,7 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { val dp = newDP() dp.isTaskbarPresentInApps = true - assertThat(dp.hotseatProfile.barEndOffset).isEqualTo(660) + assertThat(dp.hotseatBarEndOffset).isEqualTo(660) assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.hotseatBorderSpace).isEqualTo(100) assertThat(dp.hotseatColumnSpan).isEqualTo(6) @@ -131,7 +131,7 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { val dp = newDP() dp.isTaskbarPresentInApps = true - assertThat(dp.hotseatProfile.barEndOffset).isEqualTo(660) + assertThat(dp.hotseatBarEndOffset).isEqualTo(660) assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.hotseatBorderSpace).isEqualTo(34) assertThat(dp.hotseatColumnSpan).isEqualTo(4) @@ -155,7 +155,7 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { val dp = newDP() dp.isTaskbarPresentInApps = true - assertThat(dp.hotseatProfile.barEndOffset).isEqualTo(660) + assertThat(dp.hotseatBarEndOffset).isEqualTo(660) assertThat(dp.numShownHotseatIcons).isEqualTo(5) assertThat(dp.hotseatBorderSpace).isEqualTo(36) assertThat(dp.hotseatColumnSpan).isEqualTo(4) @@ -174,7 +174,7 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { val dp = newDP() dp.isTaskbarPresentInApps = true - assertThat(dp.hotseatProfile.barEndOffset).isEqualTo(600) + assertThat(dp.hotseatBarEndOffset).isEqualTo(600) assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.hotseatBorderSpace).isEqualTo(48) assertThat(dp.hotseatColumnSpan).isEqualTo(8) diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherRestoreEventLoggerImplTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherRestoreEventLoggerImplTest.kt index d4d76c1e76..24f9696437 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherRestoreEventLoggerImplTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherRestoreEventLoggerImplTest.kt @@ -22,8 +22,10 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.launcher3.Flags import com.android.launcher3.LauncherSettings.Favorites -import com.android.launcher3.util.SandboxApplication +import com.android.launcher3.util.LauncherModelHelper +import com.android.launcher3.util.LauncherModelHelper.SandboxModelContext import com.google.common.truth.Truth.assertThat +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -35,8 +37,9 @@ import org.junit.runner.RunWith class LauncherRestoreEventLoggerImplTest { @get:Rule val setFlagsRule = SetFlagsRule() - @get:Rule val mSandboxContext = SandboxApplication() + private val mLauncherModelHelper = LauncherModelHelper() + private val mSandboxContext: SandboxModelContext = mLauncherModelHelper.sandboxContext private lateinit var loggerUnderTest: LauncherRestoreEventLoggerImpl @Before @@ -44,6 +47,12 @@ class LauncherRestoreEventLoggerImplTest { loggerUnderTest = LauncherRestoreEventLoggerImpl(mSandboxContext) } + @After + fun teardown() { + loggerUnderTest.restoreEventLogger.clearData() + mLauncherModelHelper.destroy() + } + @Test fun `logLauncherItemsRestoreFailed logs multiple items as failing restore`() { // Given @@ -53,7 +62,7 @@ class LauncherRestoreEventLoggerImplTest { loggerUnderTest.logLauncherItemsRestoreFailed( dataType = expectedDataType, count = 5, - error = expectedError, + error = expectedError ) // Then val actualResult = loggerUnderTest.restoreEventLogger.loggingResults.first() @@ -99,7 +108,7 @@ class LauncherRestoreEventLoggerImplTest { // When loggerUnderTest.logSingleFavoritesItemRestoreFailed( favoritesId = Favorites.ITEM_TYPE_APPWIDGET, - error = expectedError, + error = expectedError ) // Then val actualResult = loggerUnderTest.restoreEventLogger.loggingResults.first() @@ -118,7 +127,7 @@ class LauncherRestoreEventLoggerImplTest { loggerUnderTest.logFavoritesItemsRestoreFailed( favoritesId = Favorites.ITEM_TYPE_DEEP_SHORTCUT, count = 5, - error = expectedError, + error = expectedError ) // Then val actualResult = loggerUnderTest.restoreEventLogger.loggingResults.first() diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt index 8a7361f325..5661dcf699 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt @@ -29,8 +29,8 @@ import com.android.launcher3.R import com.android.launcher3.dagger.LauncherAppComponent import com.android.launcher3.dagger.LauncherAppModule import com.android.launcher3.dagger.LauncherAppSingleton +import com.android.launcher3.util.LauncherModelHelper import com.android.launcher3.util.MSDLPlayerWrapper -import com.android.launcher3.util.SandboxApplication import com.android.systemui.contextualeducation.GestureType import com.android.systemui.shared.system.InputConsumerController import dagger.BindsInstance @@ -39,8 +39,8 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Answers.RETURNS_DEEP_STUBS import org.mockito.Mock +import org.mockito.Mockito.mock import org.mockito.Mockito.spy import org.mockito.junit.MockitoJUnit import org.mockito.kotlin.eq @@ -53,28 +53,25 @@ class LauncherSwipeHandlerV2Test { @Mock private lateinit var taskAnimationManager: TaskAnimationManager - @Mock private lateinit var deviceState: RecentsAnimationDeviceState - private lateinit var gestureState: GestureState @Mock private lateinit var inputConsumerController: InputConsumerController - @Mock(answer = RETURNS_DEEP_STUBS) private lateinit var systemUiProxy: SystemUiProxy - - @Mock(answer = RETURNS_DEEP_STUBS) private lateinit var recentsModel: RecentsModel + @Mock private lateinit var systemUiProxy: SystemUiProxy @Mock private lateinit var msdlPlayerWrapper: MSDLPlayerWrapper - @Mock private lateinit var rotationTouchHelper: RotationTouchHelper - private lateinit var underTest: LauncherSwipeHandlerV2 @get:Rule val mockitoRule = MockitoJUnit.rule() - @get:Rule val sandboxContext = SandboxApplication() + + private val launcherModelHelper = LauncherModelHelper() + private val sandboxContext = launcherModelHelper.sandboxContext private val flingSpeed = -(sandboxContext.resources.getDimension(R.dimen.quickstep_fling_threshold_speed) + 1) - private lateinit var displayManager: DisplayManager + private val displayManager: DisplayManager = + sandboxContext.spyService(DisplayManager::class.java) @Before fun setup() { @@ -85,14 +82,14 @@ class LauncherSwipeHandlerV2Test { DisplayInfo(), DEFAULT_DISPLAY_ADJUSTMENTS, ) - displayManager = sandboxContext.spyService(DisplayManager::class.java) whenever(displayManager.getDisplay(eq(DEFAULT_DISPLAY))).thenReturn(display) whenever(displayManager.displays).thenReturn(arrayOf(display)) sandboxContext.initDaggerComponent( DaggerTestComponent.builder() .bindSystemUiProxy(systemUiProxy) - .bindRecentsModel(recentsModel) + .bindRotationHelper(mock(RotationTouchHelper::class.java)) + .bindRecentsState(mock(RecentsAnimationDeviceState::class.java)) ) gestureState = spy( @@ -107,8 +104,6 @@ class LauncherSwipeHandlerV2Test { LauncherSwipeHandlerV2( sandboxContext, taskAnimationManager, - deviceState, - rotationTouchHelper, gestureState, 0, false, @@ -139,9 +134,11 @@ class LauncherSwipeHandlerV2Test { interface TestComponent : LauncherAppComponent { @Component.Builder interface Builder : LauncherAppComponent.Builder { - @BindsInstance fun bindSystemUiProxy(systemUiProxy: SystemUiProxy): Builder + @BindsInstance fun bindSystemUiProxy(proxy: SystemUiProxy): Builder - @BindsInstance fun bindRecentsModel(recentsModel: RecentsModel): Builder + @BindsInstance fun bindRotationHelper(helper: RotationTouchHelper): Builder + + @BindsInstance fun bindRecentsState(state: RecentsAnimationDeviceState): Builder override fun build(): TestComponent } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2TestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2TestCase.java index 0051a370dc..66c4ab5ce3 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2TestCase.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2TestCase.java @@ -76,8 +76,6 @@ public class LauncherSwipeHandlerV2TestCase extends AbsSwipeUpHandlerTestCase< return new LauncherSwipeHandlerV2( mContext, mTaskAnimationManager, - mDeviceState, - mRotationTouchHelper, mGestureState, touchTimeMs, continuingLastGesture, @@ -96,10 +94,4 @@ public class LauncherSwipeHandlerV2TestCase extends AbsSwipeUpHandlerTestCase< protected RecentsView getRecentsView() { return mRecentsView; } - - @NonNull - @Override - protected LauncherState getBaseState() { - return LauncherState.NORMAL; - } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/OverviewCommandHelperTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/OverviewCommandHelperTest.kt index d98cb989b5..11e0ee88b6 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/OverviewCommandHelperTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/OverviewCommandHelperTest.kt @@ -16,29 +16,20 @@ package com.android.quickstep -import android.content.Intent +import android.platform.test.flag.junit.SetFlagsRule import android.view.Display.DEFAULT_DISPLAY import androidx.test.filters.SmallTest -import com.android.app.displaylib.DisplayRepository -import com.android.app.displaylib.fakes.FakePerDisplayRepository -import com.android.app.displaylib.PerDisplayRepository -import com.android.launcher3.LauncherState -import com.android.launcher3.statemanager.StateManager -import com.android.launcher3.statemanager.StatefulActivity -import com.android.launcher3.uioverrides.QuickstepLauncher +import com.android.launcher3.Flags import com.android.launcher3.util.LauncherMultivalentJUnit -import com.android.launcher3.util.RunnableList import com.android.launcher3.util.TestDispatcherProvider +import com.android.launcher3.util.rule.setFlags import com.android.quickstep.OverviewCommandHelper.CommandInfo import com.android.quickstep.OverviewCommandHelper.CommandInfo.CommandStatus import com.android.quickstep.OverviewCommandHelper.CommandType -import com.android.quickstep.OverviewCommandHelper.Companion.TOGGLE_PREVIOUS_TIMEOUT_MS -import com.android.quickstep.views.RecentsView -import com.android.quickstep.views.TaskView +import com.android.quickstep.fallback.window.RecentsDisplayModel import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.StandardTestDispatcher @@ -47,80 +38,64 @@ import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.doAnswer import org.mockito.Mockito.spy import org.mockito.kotlin.any -import org.mockito.kotlin.doNothing import org.mockito.kotlin.mock -import org.mockito.kotlin.verify import org.mockito.kotlin.whenever @SmallTest @RunWith(LauncherMultivalentJUnit::class) @OptIn(ExperimentalCoroutinesApi::class) class OverviewCommandHelperTest { + @get:Rule val setFlagsRule: SetFlagsRule = SetFlagsRule() + private lateinit var sut: OverviewCommandHelper private val dispatcher = StandardTestDispatcher() private val testScope = TestScope(dispatcher) private var pendingCallbacksWithDelays = mutableListOf() - private val displayRepository: DisplayRepository = mock() + private val recentsDisplayModel: RecentsDisplayModel = mock() + private val defaultDisplayResource: RecentsDisplayModel.RecentsDisplayResource = mock() + private val secondaryDisplayResource: RecentsDisplayModel.RecentsDisplayResource = mock() private val executeCommandDisplayIds = mutableListOf() - private val recentView: RecentsView<*, *> = mock() - private val stateManager: StateManager> = mock() - private val containerInterface: BaseActivityInterface = mock() - private val taskAnimationManager: TaskAnimationManager = mock() - private val touchInteractionService: TouchInteractionService = mock() - private var elapsedRealtime = 100L - private fun setupDefaultDisplay() { - whenever(displayRepository.displayIds).thenReturn(MutableStateFlow(setOf(DEFAULT_DISPLAY))) + whenever(defaultDisplayResource.displayId).thenReturn(DEFAULT_DISPLAY) + whenever(recentsDisplayModel.activeDisplayResources) + .thenReturn(listOf(defaultDisplayResource)) } private fun setupMultipleDisplays() { - whenever(displayRepository.displayIds) - .thenReturn(MutableStateFlow(setOf(DEFAULT_DISPLAY, 1))) + whenever(defaultDisplayResource.displayId).thenReturn(DEFAULT_DISPLAY) + whenever(secondaryDisplayResource.displayId).thenReturn(1) + whenever(recentsDisplayModel.activeDisplayResources) + .thenReturn(listOf(defaultDisplayResource, secondaryDisplayResource)) } @Suppress("UNCHECKED_CAST") @Before fun setup() { - setupDefaultDisplay() + setFlagsRule.setFlags(true, Flags.FLAG_ENABLE_OVERVIEW_COMMAND_HELPER_TIMEOUT) - val overviewComponentObserver = mock() - whenever(overviewComponentObserver.getContainerInterface(any())) - .thenReturn(containerInterface) - whenever(overviewComponentObserver.getHomeIntent(any())).thenReturn(mock()) - whenever(recentView.getStateManager()).thenReturn(stateManager) - whenever(containerInterface.switchToRecentsIfVisible(any())).thenReturn(true) - whenever(taskAnimationManager.maybeStartHomeAction(any())).thenAnswer { invocation -> - invocation.getArgument(0).run() - } + setupDefaultDisplay() sut = spy( OverviewCommandHelper( - touchInteractionService = touchInteractionService, - overviewComponentObserver = overviewComponentObserver, + touchInteractionService = mock(), + overviewComponentObserver = mock(), dispatcherProvider = TestDispatcherProvider(dispatcher), - displayRepository = displayRepository, + recentsDisplayModel = recentsDisplayModel, + focusState = mock(), taskbarManager = mock(), - taskAnimationManagerRepository = - FakePerDisplayRepository { _ -> taskAnimationManager }, - elapsedRealtime = ::elapsedRealtime, ) ) - } - private fun addCallbackDelay(delayInMillis: Long = 0) { - pendingCallbacksWithDelays.add(delayInMillis) - } - - private fun mockExecuteCommand() { doAnswer { invocation -> val pendingCallback = invocation.arguments[1] as () -> Unit @@ -141,10 +116,13 @@ class OverviewCommandHelperTest { .executeCommand(any(), any()) } + private fun addCallbackDelay(delayInMillis: Long = 0) { + pendingCallbacksWithDelays.add(delayInMillis) + } + @Test fun whenFirstCommandIsAdded_executeCommandImmediately() = testScope.runTest { - mockExecuteCommand() // Add command to queue val commandInfo: CommandInfo = sut.addCommand(CommandType.HOME)!! assertThat(commandInfo.status).isEqualTo(CommandStatus.IDLE) @@ -155,7 +133,6 @@ class OverviewCommandHelperTest { @Test fun whenFirstCommandIsAdded_executeCommandImmediately_WithCallbackDelay() = testScope.runTest { - mockExecuteCommand() addCallbackDelay(100) // Add command to queue @@ -173,7 +150,6 @@ class OverviewCommandHelperTest { @Test fun whenFirstCommandIsPendingCallback_NextCommandWillWait() = testScope.runTest { - mockExecuteCommand() // Add command to queue addCallbackDelay(100) val commandType1 = CommandType.HOME @@ -181,7 +157,7 @@ class OverviewCommandHelperTest { assertThat(commandInfo1.status).isEqualTo(CommandStatus.IDLE) addCallbackDelay(100) - val commandType2 = CommandType.SHOW_ALT_TAB + val commandType2 = CommandType.SHOW val commandInfo2: CommandInfo = sut.addCommand(commandType2)!! assertThat(commandInfo2.status).isEqualTo(CommandStatus.IDLE) @@ -200,7 +176,6 @@ class OverviewCommandHelperTest { @Test fun whenCommandTakesTooLong_TriggerTimeout_AndExecuteNextCommand() = testScope.runTest { - mockExecuteCommand() // Add command to queue addCallbackDelay(QUEUE_TIMEOUT) val commandType1 = CommandType.HOME @@ -208,7 +183,7 @@ class OverviewCommandHelperTest { assertThat(commandInfo1.status).isEqualTo(CommandStatus.IDLE) addCallbackDelay(100) - val commandType2 = CommandType.SHOW_ALT_TAB + val commandType2 = CommandType.SHOW val commandInfo2: CommandInfo = sut.addCommand(commandType2)!! assertThat(commandInfo2.status).isEqualTo(CommandStatus.IDLE) @@ -227,7 +202,6 @@ class OverviewCommandHelperTest { @Test fun whenAllDisplaysCommandIsAdded_singleCommandProcessedForDefaultDisplay() = testScope.runTest { - mockExecuteCommand() executeCommandDisplayIds.clear() // Add command to queue val commandInfo: CommandInfo = sut.addCommandsForAllDisplays(CommandType.HOME)!! @@ -240,7 +214,6 @@ class OverviewCommandHelperTest { @Test fun whenAllDisplaysCommandIsAdded_multipleCommandsProcessedForMultipleDisplays() = testScope.runTest { - mockExecuteCommand() setupMultipleDisplays() executeCommandDisplayIds.clear() // Add command to queue @@ -255,7 +228,6 @@ class OverviewCommandHelperTest { @Test fun whenAllExceptDisplayCommandIsAdded_otherDisplayProcessed() = testScope.runTest { - mockExecuteCommand() setupMultipleDisplays() executeCommandDisplayIds.clear() // Add command to queue @@ -270,7 +242,6 @@ class OverviewCommandHelperTest { @Test fun whenSingleDisplayCommandIsAdded_thatDisplayIsProcessed() = testScope.runTest { - mockExecuteCommand() executeCommandDisplayIds.clear() val displayId = 5 // Add command to queue @@ -281,151 +252,6 @@ class OverviewCommandHelperTest { assertThat(executeCommandDisplayIds).containsExactly(displayId) } - @Test - fun recentViewNotVisible_toggleOverviewPrev_goToOverview() = - testScope.runTest { - whenever(containerInterface.getVisibleRecentsView>()).thenReturn(null) - sut.addCommand(CommandType.TOGGLE_OVERVIEW_PREVIOUS)!! - runCurrent() - verify(containerInterface).switchToRecentsIfVisible(any()) - } - - @Test - fun recentViewVisible_toggleOverviewPrev_goToHome() = - testScope.runTest { - whenever(containerInterface.getVisibleRecentsView>()) - .thenReturn(recentView) - sut.addCommand(CommandType.TOGGLE_OVERVIEW_PREVIOUS)!! - runCurrent() - verify(recentView).startHome() - } - - @Test - fun recentViewVisible_hasRunningTask_toggleOverviewPrev_goToPrevTask() = - testScope.runTest { - whenever(containerInterface.getVisibleRecentsView>()) - .thenReturn(recentView) - val mockTask = mock() - whenever(recentView.runningTaskView).thenReturn(mockTask) - - sut.addCommand(CommandType.TOGGLE_OVERVIEW_PREVIOUS)!! - runCurrent() - - verify(mockTask).launchWithAnimation() - } - - @Test - fun recentViewVisible_hasRunningTask_toggle() = - testScope.runTest { - val callbackList = RunnableList() - - fun getMockTask(vararg elements: Int) = - mock().apply { - whenever(taskIdSet).thenReturn(elements.toSet()) - whenever(recentView.getTaskViewByTaskIds(elements)).thenReturn(this) - whenever(launchWithAnimation()).thenReturn(callbackList) - } - val mockTask1 = getMockTask(1, 2, 3) - val mockTask2 = getMockTask(4, 5) - val mockTask3 = getMockTask(6, 7) - - // TOGGLE with a runningTaskView should go to nextTaskView - whenever(containerInterface.getVisibleRecentsView>()) - .thenReturn(recentView) - whenever(recentView.runningTaskView).thenReturn(mockTask1) - whenever(recentView.nextTaskView).thenReturn(mockTask2) - sut.addCommand(CommandType.TOGGLE) - runCurrent() - verify(mockTask2).launchWithAnimation() - callbackList.executeAllAndDestroy() - - // Next TOGGLE with runningTaskView will return to previous runningTaskView - whenever(recentView.runningTaskView).thenReturn(mockTask2) - whenever(recentView.nextTaskView).thenReturn(mockTask3) - sut.addCommand(CommandType.TOGGLE) - runCurrent() - verify(mockTask1).launchWithAnimation() - callbackList.executeAllAndDestroy() - - // After TOGGLE_PREVIOUS_TIMEOUT_MS has passed, subsequent TOGGLE will go to - // nextTaskView again. - whenever(recentView.runningTaskView).thenReturn(mockTask1) - whenever(recentView.nextTaskView).thenReturn(mockTask3) - sut.addCommand(CommandType.TOGGLE) - elapsedRealtime += TOGGLE_PREVIOUS_TIMEOUT_MS - runCurrent() - verify(mockTask3).launchWithAnimation() - } - - @Test - fun recentViewVisible_noRunningTask_toggle_goToFirstNonDesktopTaskView() = - testScope.runTest { - val firstNonDesktopTaskView = mock() - val lastDesktopTaskView = mock() - val previousTaskView = mock() - val nextTaskView = mock() - - whenever(containerInterface.getVisibleRecentsView>()) - .thenReturn(recentView) - whenever(recentView.runningTaskView).thenReturn(null) - whenever(recentView.firstNonDesktopTaskView).thenReturn(firstNonDesktopTaskView) - whenever(recentView.lastDesktopTaskView).thenReturn(lastDesktopTaskView) - whenever(recentView.previousTaskView).thenReturn(previousTaskView) - whenever(recentView.nextTaskView).thenReturn(nextTaskView) - sut.addCommand(CommandType.TOGGLE) - runCurrent() - verify(firstNonDesktopTaskView).launchWithAnimation() - } - - @Test - fun recentViewVisible_noRunningTask_toggle_goToLastDesktopTaskView() = - testScope.runTest { - val firstNonDesktopTaskView = mock() - val lastDesktopTaskView = mock() - val firstTaskView = mock() - val previousTaskView = mock() - val nextTaskView = mock() - - whenever(containerInterface.getVisibleRecentsView>()) - .thenReturn(recentView) - whenever(recentView.runningTaskView).thenReturn(null) - whenever(recentView.firstNonDesktopTaskView).thenReturn(null) - whenever(recentView.lastDesktopTaskView).thenReturn(lastDesktopTaskView) - whenever(recentView.firstTaskView).thenReturn(firstTaskView) - whenever(recentView.previousTaskView).thenReturn(previousTaskView) - whenever(recentView.nextTaskView).thenReturn(nextTaskView) - sut.addCommand(CommandType.TOGGLE) - runCurrent() - verify(lastDesktopTaskView).launchWithAnimation() - } - - @Test - fun recentViewVisible_hasRunningTask_toggle_goToPreviousTaskView() = - testScope.runTest { - val runningTaskView = mock() - val firstTaskView = mock() - val previousTaskView = mock() - - whenever(containerInterface.getVisibleRecentsView>()) - .thenReturn(recentView) - whenever(recentView.runningTaskView).thenReturn(runningTaskView) - whenever(recentView.firstTaskView).thenReturn(firstTaskView) - whenever(recentView.previousTaskView).thenReturn(previousTaskView) - whenever(recentView.nextTaskView).thenReturn(null) - sut.addCommand(CommandType.TOGGLE) - runCurrent() - verify(previousTaskView).launchWithAnimation() - } - - @Test - fun whenHomeCommandIsAdded_executeHomeAction() = - testScope.runTest { - sut.addCommand(CommandType.HOME) - runCurrent() - verify(taskAnimationManager).maybeStartHomeAction(any()) - verify(touchInteractionService).startActivity(any()) - } - private companion object { const val QUEUE_TIMEOUT = 5001L const val EXTERNAL_DISPLAY_ID = 1 diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java index 220f2d7090..1e4315a040 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java @@ -18,7 +18,8 @@ package com.android.quickstep; import static android.view.Display.DEFAULT_DISPLAY; -import static com.android.window.flags2.Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND; +import static com.android.launcher3.Flags.FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS; +import static com.android.window.flags.Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND; import static com.google.common.truth.Truth.assertThat; @@ -48,8 +49,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.internal.R; +import com.android.launcher3.statehandlers.DesktopVisibilityController; import com.android.launcher3.util.DaggerSingletonTracker; -import com.android.launcher3.util.Executors; import com.android.launcher3.util.LooperExecutor; import com.android.quickstep.util.DesktopTask; import com.android.quickstep.util.GroupTask; @@ -94,7 +95,7 @@ public class RecentTasksListTest { @Before public void setup() { MockitoAnnotations.initMocks(this); - LooperExecutor mainThreadExecutor = Executors.MAIN_EXECUTOR; + LooperExecutor mockMainThreadExecutor = mock(LooperExecutor.class); KeyguardManager mockKeyguardManager = mock(KeyguardManager.class); // Set desktop mode supported @@ -103,8 +104,9 @@ public class RecentTasksListTest { when(mResources.getBoolean(R.bool.config_canInternalDisplayHostDesktops)) .thenReturn(true); - mRecentTasksList = new RecentTasksList(mContext, mainThreadExecutor, + mRecentTasksList = new RecentTasksList(mContext, mockMainThreadExecutor, mockKeyguardManager, mSystemUiProxy, mTopTaskTracker, + mock(DesktopVisibilityController.class), mock(DaggerSingletonTracker.class)); } @@ -121,8 +123,8 @@ public class RecentTasksListTest { new RecentTaskInfo(), new RecentTaskInfo(), new SplitBounds( /* leftTopBounds = */ new Rect(), /* rightBottomBounds = */ new Rect(), - /* leftTopTaskId = */ 1, - /* rightBottomTaskId = */ 2, + /* leftTopTaskId = */ -1, + /* rightBottomTaskId = */ -1, /* snapPosition = */ SplitScreenConstants.SNAP_TO_2_50_50)); when(mSystemUiProxy.getRecentTasks(anyInt(), anyInt())) .thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos))); @@ -217,8 +219,8 @@ public class RecentTasksListTest { new SplitBounds( /* leftTopBounds = */ new Rect(), /* rightBottomBounds = */ new Rect(), - /* leftTopTaskId = */ 1, - /* rightBottomTaskId = */ 2, + /* leftTopTaskId = */ -1, + /* rightBottomTaskId = */ -1, /* snapPosition = */ SplitScreenConstants.SNAP_TO_2_50_50)); when(mSystemUiProxy.getRecentTasks(anyInt(), anyInt())) .thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos))); @@ -234,6 +236,39 @@ public class RecentTasksListTest { } @Test + @DisableFlags({FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS, + FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND}) + public void loadTasksInBackground_freeformTask_createsDesktopTask() throws Exception { + List tasks = Arrays.asList( + createRecentTaskInfo(1 /* taskId */, DEFAULT_DISPLAY), + createRecentTaskInfo(4 /* taskId */, DEFAULT_DISPLAY), + createRecentTaskInfo(5 /* taskId */, 1 /* displayId */), + createRecentTaskInfo(6 /* taskId */, 1 /* displayId */)); + GroupedTaskInfo recentTaskInfos = GroupedTaskInfo.forDeskTasks( + 0 /* deskId */, DEFAULT_DISPLAY, tasks, + Collections.emptySet() /* minimizedTaskIds */); + when(mSystemUiProxy.getRecentTasks(anyInt(), anyInt())) + .thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos))); + + List taskList = mRecentTasksList.loadTasksInBackground( + Integer.MAX_VALUE /* numTasks */, -1 /* requestId */, false /* loadKeysOnly */); + + assertEquals(1, taskList.size()); + assertEquals(TaskViewType.DESKTOP, taskList.get(0).taskViewType); + List actualFreeformTasks = taskList.get(0).getTasks(); + assertEquals(4, actualFreeformTasks.size()); + assertEquals(1, actualFreeformTasks.get(0).key.id); + assertFalse(actualFreeformTasks.get(0).isMinimized); + assertEquals(4, actualFreeformTasks.get(1).key.id); + assertFalse(actualFreeformTasks.get(1).isMinimized); + assertEquals(5, actualFreeformTasks.get(2).key.id); + assertFalse(actualFreeformTasks.get(2).isMinimized); + assertEquals(6, actualFreeformTasks.get(3).key.id); + assertFalse(actualFreeformTasks.get(3).isMinimized); + } + + @Test + @EnableFlags(FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS) @DisableFlags(FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) public void loadTasksInBackground_freeformTask_createsDesktopTaskPerDisplay() throws Exception { List tasks = Arrays.asList( diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt index ba9e238c0d..a7370b02e9 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt @@ -1,6 +1,6 @@ package com.android.quickstep -import android.view.Display.DEFAULT_DISPLAY +import android.view.Display import androidx.test.annotation.UiThreadTest import androidx.test.filters.SmallTest import com.android.launcher3.dagger.LauncherComponentProvider @@ -14,9 +14,9 @@ import com.android.launcher3.util.LauncherMultivalentJUnit import com.android.launcher3.util.NavigationMode import com.android.launcher3.util.SandboxApplication import com.android.quickstep.util.GestureExclusionManager +import com.android.systemui.shared.system.QuickStepContract import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DREAMING -import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DISABLE_GESTURE_PIP_ANIMATING import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DISABLE_GESTURE_SPLIT_INVOCATION import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_MAGNIFICATION_OVERLAP @@ -50,7 +50,6 @@ class RecentsAnimationDeviceStateTest { @Mock private lateinit var exclusionManager: GestureExclusionManager @Mock private lateinit var info: Info - @Mock private lateinit var rotationTouchHelper: RotationTouchHelper private lateinit var underTest: RecentsAnimationDeviceState @@ -62,11 +61,10 @@ class RecentsAnimationDeviceStateTest { underTest = RecentsAnimationDeviceState( context, - DEFAULT_DISPLAY, - rotationTouchHelper, exclusionManager, component.displayController, component.contextualSearchStateManager, + component.rotationTouchHelper, component.settingsCache, component.daggerSingletonTracker, ) @@ -154,7 +152,7 @@ class RecentsAnimationDeviceStateTest { allSysUiStates().forEach { state -> val canStartGesture = !disablingStates.contains(state) - underTest.setSysUIStateFlags(state) + underTest.setSysUIStateFlagsForDisplay(state, Display.DEFAULT_DISPLAY) assertThat(underTest.canStartTrackpadGesture()).isEqualTo(canStartGesture) } } @@ -170,7 +168,7 @@ class RecentsAnimationDeviceStateTest { ) stateToExpectedResult.forEach { (state, allowed) -> - underTest.setSysUIStateFlags(state) + underTest.setSysUIStateFlagsForDisplay(state, Display.DEFAULT_DISPLAY) assertThat(underTest.canStartTrackpadGesture()).isEqualTo(allowed) } } @@ -181,7 +179,7 @@ class RecentsAnimationDeviceStateTest { allSysUiStates().forEach { state -> val canStartGesture = !disablingStates.contains(state) - underTest.setSysUIStateFlags(state) + underTest.setSysUIStateFlagsForDisplay(state, Display.DEFAULT_DISPLAY) assertThat(underTest.canStartSystemGesture()).isEqualTo(canStartGesture) } } @@ -201,21 +199,40 @@ class RecentsAnimationDeviceStateTest { ) stateToExpectedResult.forEach { (state, gestureAllowed) -> - underTest.setSysUIStateFlags(state) + underTest.setSysUIStateFlagsForDisplay(state, Display.DEFAULT_DISPLAY) assertThat(underTest.canStartSystemGesture()).isEqualTo(gestureAllowed) } } @Test - fun startOverviewCommandForDisallowedSysUiState() { - val disallowedStates = GESTURE_DISABLING_SYSUI_STATES + SYSUI_STATE_OVERVIEW_DISABLED + fun getSystemUiStateFlags_defaultAwake() { + val NOT_EXISTENT_DISPLAY = 2 + assertThat(underTest.getSystemUiStateFlags(NOT_EXISTENT_DISPLAY)) + .isEqualTo(QuickStepContract.SYSUI_STATE_AWAKE) + } - allSysUiStates().forEach { state -> - underTest.setSysUIStateFlags(state) + @Test + fun clearSysUIStateFlagsForDisplay_displayNotReturnedAnymore() { + underTest.setSysUIStateFlagsForDisplay(1, /* displayId= */ 1) - val isAllowed = !disallowedStates.contains(state) - assertThat(underTest.canStartOverviewCommand()).isEqualTo(isAllowed) - } + assertThat(underTest.displaysWithSysUIState).contains(1) + assertThat(underTest.getSystemUiStateFlags(1)).isEqualTo(1) + + underTest.clearSysUIStateFlagsForDisplay(1) + + assertThat(underTest.displaysWithSysUIState).doesNotContain(1) + assertThat(underTest.getSystemUiStateFlags(1)) + .isEqualTo(QuickStepContract.SYSUI_STATE_AWAKE) + } + + @Test + fun setSysUIStateFlagsForDisplay_setsCorrectly() { + underTest.setSysUIStateFlagsForDisplay(1, /* displayId= */ 1) + underTest.setSysUIStateFlagsForDisplay(2, /* displayId= */ 2) + + assertThat(underTest.getSystemUiStateFlags(1)).isEqualTo(1) + assertThat(underTest.getSystemUiStateFlags(2)).isEqualTo(2) + assertThat(underTest.displaysWithSysUIState).containsAtLeast(1, 2) } private fun allSysUiStates(): List { @@ -232,7 +249,6 @@ class RecentsAnimationDeviceStateTest { SYSUI_STATE_MAGNIFICATION_OVERLAP, SYSUI_STATE_DEVICE_DREAMING, SYSUI_STATE_DISABLE_GESTURE_SPLIT_INVOCATION, - SYSUI_STATE_DISABLE_GESTURE_PIP_ANIMATING, ) private const val SYSUI_STATES_COUNT = 33 private const val DEFAULT_STATE = 0L diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsModelTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsModelTest.java index 42c585e1cf..2eb2e4c2ca 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsModelTest.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsModelTest.java @@ -45,11 +45,11 @@ import com.android.launcher3.graphics.ThemeManager; import com.android.launcher3.icons.IconProvider; import com.android.launcher3.util.DaggerSingletonTracker; import com.android.launcher3.util.LockedUserState; +import com.android.launcher3.util.SplitConfigurationOptions; import com.android.quickstep.util.GroupTask; import com.android.quickstep.util.SplitTask; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.TaskStackChangeListeners; -import com.android.wm.shell.shared.split.SplitBounds; import com.android.wm.shell.shared.split.SplitScreenConstants; import org.junit.Before; @@ -74,7 +74,6 @@ public class RecentsModelTest { @Mock private RecentTasksList mTasksList; - private RecentsModel.RecentTasksChangedListener mRegisteredTaskListListener = null; @Mock private HighResLoadingState mHighResLoadingState; @@ -104,20 +103,6 @@ public class RecentsModelTest { callback.accept(mTaskResult); return null; }).when(mTasksList).getTaskKeys(anyInt(), any()); - doAnswer(invocation -> { - mRegisteredTaskListListener = invocation.getArgument(0); - return null; - }).when(mTasksList).registerRecentTasksChangedListener(any()); - doAnswer(invocation -> { - mRegisteredTaskListListener = null; - return null; - }).when(mTasksList).unregisterRecentTasksChangedListener(); - doAnswer(invocation -> { - if (mRegisteredTaskListListener != null) { - mRegisteredTaskListListener.onRecentTasksChanged(); - } - return null; - }).when(mTasksList).onRecentTasksChanged(); when(mHighResLoadingState.isEnabled()).thenReturn(true); when(mThumbnailCache.getHighResLoadingState()).thenReturn(mHighResLoadingState); @@ -201,38 +186,6 @@ public class RecentsModelTest { verify(mThemeManager, times(1)).addChangeListener(any()); } - @Test - public void recentTaskListChangesNotiftListeners() { - RecentsModel.RecentTasksChangedListener listener1 = mock( - RecentsModel.RecentTasksChangedListener.class); - RecentsModel.RecentTasksChangedListener listener2 = mock( - RecentsModel.RecentTasksChangedListener.class); - - mRecentsModel.registerRecentTasksChangedListener(listener1); - - mTasksList.onRecentTasksChanged(); - verify(listener1, times(1)).onRecentTasksChanged(); - verify(listener2, times(0)).onRecentTasksChanged(); - - mRecentsModel.registerRecentTasksChangedListener(listener2); - - mTasksList.onRecentTasksChanged(); - verify(listener1, times(2)).onRecentTasksChanged(); - verify(listener2, times(1)).onRecentTasksChanged(); - - mRecentsModel.unregisterRecentTasksChangedListener(listener1); - - mTasksList.onRecentTasksChanged(); - verify(listener1, times(2)).onRecentTasksChanged(); - verify(listener2, times(2)).onRecentTasksChanged(); - - mRecentsModel.unregisterRecentTasksChangedListener(listener2); - - mTasksList.onRecentTasksChanged(); - verify(listener1, times(2)).onRecentTasksChanged(); - verify(listener2, times(2)).onRecentTasksChanged(); - } - private RecentTasksList.TaskLoadResult getTaskResult() { RecentTasksList.TaskLoadResult allTasks = new RecentTasksList.TaskLoadResult(0, false, 1); ActivityManager.RecentTaskInfo taskInfo1 = new ActivityManager.RecentTaskInfo(); @@ -244,11 +197,11 @@ public class RecentsModelTest { Task task2 = Task.from(taskKey2, taskInfo2, false); allTasks.add( - new SplitTask(task1, task2, new SplitBounds( + new SplitTask(task1, task2, new SplitConfigurationOptions.SplitBounds( /* leftTopBounds = */ new Rect(), /* rightBottomBounds = */ new Rect(), - /* leftTopTaskId = */ 1, - /* rightBottomTaskId = */ 2, + /* leftTopTaskId = */ -1, + /* rightBottomTaskId = */ -1, /* snapPosition = */ SplitScreenConstants.SNAP_TO_2_50_50))); return allTasks; } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsWindowSwipeHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsWindowSwipeHandlerTestCase.java index 399709d8a9..c1be1cee9b 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsWindowSwipeHandlerTestCase.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsWindowSwipeHandlerTestCase.java @@ -19,12 +19,21 @@ package com.android.quickstep; import androidx.annotation.NonNull; import androidx.test.filters.SmallTest; +import com.android.launcher3.dagger.LauncherAppComponent; +import com.android.launcher3.dagger.LauncherAppSingleton; +import com.android.launcher3.util.AllModulesForTest; import com.android.launcher3.util.LauncherMultivalentJUnit; import com.android.quickstep.fallback.FallbackRecentsView; import com.android.quickstep.fallback.RecentsState; +import com.android.quickstep.fallback.window.RecentsDisplayModel; import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.fallback.window.RecentsWindowSwipeHandler; +import com.android.quickstep.views.RecentsViewContainer; +import dagger.BindsInstance; +import dagger.Component; + +import org.junit.Before; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -37,9 +46,16 @@ public class RecentsWindowSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase RecentsWindowSwipeHandler, FallbackWindowInterface> { + @Mock private RecentsDisplayModel mRecentsDisplayModel; @Mock private FallbackRecentsView mRecentsView; @Mock private RecentsWindowManager mRecentsWindowManager; + @Before + public void setRecentsDisplayModel() { + mContext.initDaggerComponent(DaggerRecentsWindowSwipeHandlerTestCase_TestComponent.builder() + .bindRecentsDisplayModel(mRecentsDisplayModel)); + } + @NonNull @Override protected RecentsWindowSwipeHandler createSwipeHandler(long touchTimeMs, @@ -47,9 +63,6 @@ public class RecentsWindowSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase return new RecentsWindowSwipeHandler( mContext, mTaskAnimationManager, - mDeviceState, - mRotationTouchHelper, - mRecentsWindowManager, mGestureState, touchTimeMs, continuingLastGesture, @@ -59,7 +72,7 @@ public class RecentsWindowSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase @NonNull @Override - protected RecentsWindowManager getRecentsContainer() { + protected RecentsViewContainer getRecentsContainer() { return mRecentsWindowManager; } @@ -69,9 +82,13 @@ public class RecentsWindowSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase return mRecentsView; } - @NonNull - @Override - protected RecentsState getBaseState() { - return RecentsState.BG_LAUNCHER; + @LauncherAppSingleton + @Component(modules = {AllModulesForTest.class}) + interface TestComponent extends LauncherAppComponent { + @Component.Builder + interface Builder extends LauncherAppComponent.Builder { + @BindsInstance Builder bindRecentsDisplayModel(RecentsDisplayModel model); + @Override LauncherAppComponent build(); + } } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java index 04785abd91..75b59d734a 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java @@ -16,18 +16,12 @@ package com.android.quickstep; -import static com.android.quickstep.TaskAnimationManager.RECENTS_ANIMATION_START_TIMEOUT_MS; - import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -38,10 +32,6 @@ import android.content.Intent; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Bundle; -import android.os.SystemClock; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; -import android.platform.test.flag.junit.SetFlagsRule; import android.view.Display; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; @@ -52,10 +42,8 @@ import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; -import com.android.window.flags2.Flags; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -65,7 +53,7 @@ import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidJUnit4.class) public class TaskAnimationManagerTest { - private static final int EXTERNAL_DISPLAY_ID = 1; + protected final Context mContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); @@ -73,27 +61,17 @@ public class TaskAnimationManagerTest { private SystemUiProxy mSystemUiProxy; private TaskAnimationManager mTaskAnimationManager; - private TaskAnimationManager mTaskAnimationManagerWithExternalDisplay; - - @Rule - public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Before public void setUp() { MockitoAnnotations.initMocks(this); - mTaskAnimationManager = new TaskAnimationManager(mContext, Display.DEFAULT_DISPLAY) { + mTaskAnimationManager = new TaskAnimationManager(mContext, + RecentsAnimationDeviceState.INSTANCE.get(mContext), Display.DEFAULT_DISPLAY) { @Override SystemUiProxy getSystemUiProxy() { return mSystemUiProxy; } }; - mTaskAnimationManagerWithExternalDisplay = - new TaskAnimationManager(mContext, EXTERNAL_DISPLAY_ID) { - @Override - SystemUiProxy getSystemUiProxy() { - return mSystemUiProxy; - } - }; } @Test @@ -108,15 +86,14 @@ public class TaskAnimationManagerTest { final ArgumentCaptor optionsCaptor = ArgumentCaptor.forClass(ActivityOptions.class); verify(mSystemUiProxy) - .startRecentsActivity(any(), optionsCaptor.capture(), any(), anyBoolean(), - any(), anyInt()); + .startRecentsActivity(any(), optionsCaptor.capture(), any(), anyBoolean()); assertEquals(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS, optionsCaptor.getValue().getPendingIntentBackgroundActivityStartMode()); } @Test public void testLauncherDestroyed_whileRecentsAnimationStartPending_finishesAnimation() { - final GestureState gestureState = buildMockGestureState(); + final GestureState gestureState = mock(GestureState.class); final ArgumentCaptor listenerCaptor = ArgumentCaptor.forClass(RecentsAnimationCallbacks.class); final RecentsAnimationControllerCompat controllerCompat = @@ -139,20 +116,17 @@ public class TaskAnimationManagerTest { /* taskInfo= */ new ActivityManager.RunningTaskInfo(), /* allowEnterPip= */ false); + doReturn(mock(LauncherActivityInterface.class)).when(gestureState).getContainerInterface(); when(mSystemUiProxy - .startRecentsActivity(any(), any(), listenerCaptor.capture(), anyBoolean(), any(), - anyInt())) + .startRecentsActivity(any(), any(), listenerCaptor.capture(), anyBoolean())) .thenReturn(true); + when(gestureState.getRunningTaskIds(anyBoolean())).thenReturn(new int[0]); runOnMainSync(() -> { mTaskAnimationManager.startRecentsAnimation( gestureState, new Intent(), mock(RecentsAnimationCallbacks.RecentsAnimationListener.class)); - - // Simulate multiple launcher destroyed events before the recents animation start - mTaskAnimationManager.onLauncherDestroyed(); - mTaskAnimationManager.onLauncherDestroyed(); mTaskAnimationManager.onLauncherDestroyed(); listenerCaptor.getValue().onAnimationStart( controllerCompat, @@ -163,80 +137,11 @@ public class TaskAnimationManagerTest { new Bundle(), new TransitionInfo(0, 0)); }); - - // Verify checks that finish was only called once runOnMainSync(() -> verify(controllerCompat) .finish(/* toHome= */ eq(false), anyBoolean(), any())); } - @Test - public void testRecentsAnimationStartTimeout_cleansUpRecentsAnimation() { - final GestureState gestureState = buildMockGestureState(); - when(mSystemUiProxy - .startRecentsActivity(any(), any(), any(), anyBoolean(), any(), anyInt())) - .thenReturn(true); - - runOnMainSync(() -> { - assertNull("Recents animation was started prematurely:", - mTaskAnimationManager.getCurrentCallbacks()); - - mTaskAnimationManager.startRecentsAnimation( - gestureState, - new Intent(), - mock(RecentsAnimationCallbacks.RecentsAnimationListener.class)); - - assertNotNull("TaskAnimationManager was cleaned up prematurely:", - mTaskAnimationManager.getCurrentCallbacks()); - }); - - SystemClock.sleep(RECENTS_ANIMATION_START_TIMEOUT_MS); - - runOnMainSync(() -> assertNull("TaskAnimationManager was not cleaned up after the timeout:", - mTaskAnimationManager.getCurrentCallbacks())); - } - protected static void runOnMainSync(Runnable runnable) { InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable); } - - private GestureState buildMockGestureState() { - final GestureState gestureState = mock(GestureState.class); - - doReturn(mock(LauncherActivityInterface.class)).when(gestureState).getContainerInterface(); - when(gestureState.getRunningTaskIds(anyBoolean())).thenReturn(new int[0]); - - return gestureState; - } - - /** - * Invokes maybeStartHomeAction on the given TaskAnimationManager and verifies whether the - * provided Runnable was invoked, based on the expectedResult. - * - * @param taskAnimationManager The TaskAnimationManager instance to test. - * @param expectedResult True if the Runnable is expected to be invoked, false otherwise. - */ - private void verifyCanStartHomeAction(TaskAnimationManager taskAnimationManager, - Boolean expectedResult) { - Runnable mockRunnable = mock(Runnable.class); - taskAnimationManager.maybeStartHomeAction(mockRunnable); - if (expectedResult) { - verify(mockRunnable).run(); - } else { - verify(mockRunnable, never()).run(); - } - } - - @Test - @EnableFlags(Flags.FLAG_ENABLE_REJECT_HOME_TRANSITION) - public void maybeStartHomeAction_withRejectHomeTransitionEnabled() { - verifyCanStartHomeAction(mTaskAnimationManager, true); - verifyCanStartHomeAction(mTaskAnimationManagerWithExternalDisplay, false); - } - - @Test - @DisableFlags(Flags.FLAG_ENABLE_REJECT_HOME_TRANSITION) - public void maybeStartHomeAction_withRejectHomeTransitionDisabled() { - verifyCanStartHomeAction(mTaskAnimationManager, true); - verifyCanStartHomeAction(mTaskAnimationManagerWithExternalDisplay, true); - } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandlerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandlerTest.java index f8a0c080a6..9018775316 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandlerTest.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandlerTest.java @@ -20,7 +20,6 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import android.content.Context; @@ -28,14 +27,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; -import com.android.launcher3.logging.StatsLogManager; -import com.android.launcher3.util.VibratorWrapper; import com.android.quickstep.DeviceConfigWrapper; import com.android.quickstep.NavHandle; -import com.android.quickstep.TopTaskTracker; -import com.android.quickstep.util.ContextualSearchHapticManager; -import com.android.quickstep.util.ContextualSearchInvoker; -import com.android.quickstep.util.ContextualSearchStateManager; import com.android.quickstep.util.TestExtensions; import org.junit.Before; @@ -50,24 +43,12 @@ public class NavHandleLongPressHandlerTest { private NavHandleLongPressHandler mLongPressHandler; @Mock private NavHandle mNavHandle; - @Mock VibratorWrapper mVibratorWrapper; - @Mock ContextualSearchHapticManager mContextualSearchHapticManager; - @Mock TopTaskTracker mTopTaskTracker; - @Mock StatsLogManager.StatsLogManagerFactory mStatsLogManagerFactory; - @Mock StatsLogManager mStatsLogManager; - @Mock ContextualSearchStateManager mContextualSearchStateManager; - @Mock ContextualSearchInvoker mContextualSearchInvoker; - @Before public void setUp() { MockitoAnnotations.initMocks(this); - Context context = InstrumentationRegistry.getInstrumentation() - .getTargetContext().getApplicationContext(); - when(mStatsLogManagerFactory.create(context)).thenReturn(mStatsLogManager); - mLongPressHandler = new NavHandleLongPressHandler(context, mVibratorWrapper, - mContextualSearchHapticManager, mTopTaskTracker, mStatsLogManagerFactory, - mContextualSearchStateManager, mContextualSearchInvoker); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + mLongPressHandler = new NavHandleLongPressHandler(context); } @Test diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt index 5e22012b45..14570b54ec 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt @@ -40,37 +40,29 @@ import com.android.launcher3.util.SettingsCache import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before -import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Answers import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock -import org.mockito.junit.MockitoJUnit +import org.mockito.MockitoAnnotations +import org.mockito.kotlin.any import org.mockito.kotlin.atLeastOnce -import org.mockito.kotlin.capture import org.mockito.kotlin.doReturn import org.mockito.kotlin.verify import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) class SettingsChangeLoggerTest { - - @get:Rule val mockito = MockitoJUnit.rule() - private val mContext: Context = ApplicationProvider.getApplicationContext() private val mInstanceId = InstanceId.fakeInstanceId(1) private lateinit var mSystemUnderTest: SettingsChangeLogger - @Mock private lateinit var mStatsLogFactory: StatsLogManager.StatsLogManagerFactory - @Mock private lateinit var mStatsLogManager: StatsLogManager - @Mock(answer = Answers.RETURNS_SELF) - private lateinit var mMockLogger: StatsLogManager.StatsLogger + @Mock private lateinit var mMockLogger: StatsLogManager.StatsLogger @Mock private lateinit var mTracker: DaggerSingletonTracker private var displayController: DisplayController = DisplayController.INSTANCE.get(mContext) private var settingsCache: SettingsCache = SettingsCache.INSTANCE.get(mContext) @@ -85,8 +77,10 @@ class SettingsChangeLoggerTest { @Before fun setUp() { - whenever(mStatsLogFactory.create(mContext)).doReturn(mStatsLogManager) + MockitoAnnotations.initMocks(this) + whenever(mStatsLogManager.logger()).doReturn(mMockLogger) + whenever(mStatsLogManager.logger().withInstanceId(any())).doReturn(mMockLogger) mDefaultThemedIcons = themeManager.isMonoThemeEnabled mDefaultAllowRotation = LauncherPrefs.get(mContext).get(ALLOW_ROTATION) // To match the default value of THEMED_ICONS @@ -97,10 +91,10 @@ class SettingsChangeLoggerTest { mSystemUnderTest = SettingsChangeLogger( mContext, + mStatsLogManager, mTracker, displayController, settingsCache, - mStatsLogFactory, ) } @@ -115,16 +109,17 @@ class SettingsChangeLoggerTest { val systemUnderTest = SettingsChangeLogger( mContext, + mStatsLogManager, mTracker, displayController, settingsCache, - mStatsLogFactory, ) assertThat(systemUnderTest.loggingPrefs[ALLOW_ROTATION_PREFERENCE_KEY]!!.defaultValue) .isFalse() assertThat(systemUnderTest.loggingPrefs[ADD_ICON_PREFERENCE_KEY]!!.defaultValue).isTrue() assertThat(systemUnderTest.loggingPrefs[OVERVIEW_SUGGESTED_ACTIONS]!!.defaultValue).isTrue() + assertThat(systemUnderTest.loggingPrefs[SMARTSPACE_ON_HOME_SCREEN]!!.defaultValue).isTrue() assertThat(systemUnderTest.loggingPrefs[KEY_ENABLE_MINUS_ONE]!!.defaultValue).isTrue() } @@ -132,7 +127,7 @@ class SettingsChangeLoggerTest { fun logSnapshot_defaultValue() { mSystemUnderTest.logSnapshot(mInstanceId) - verify(mMockLogger, atLeastOnce()).log(capture(mEventCaptor)) + verify(mMockLogger, atLeastOnce()).log(mEventCaptor.capture()) val capturedEvents = mEventCaptor.allValues assertThat(capturedEvents.isNotEmpty()).isTrue() verifyDefaultEvent(capturedEvents) @@ -145,10 +140,10 @@ class SettingsChangeLoggerTest { LauncherPrefs.get(mContext).put(item = ALLOW_ROTATION, value = true) // This a new object so the values of mLoggablePrefs will be different - SettingsChangeLogger(mContext, mTracker, displayController, settingsCache, mStatsLogFactory) + SettingsChangeLogger(mContext, mStatsLogManager, mTracker, displayController, settingsCache) .logSnapshot(mInstanceId) - verify(mMockLogger, atLeastOnce()).log(capture(mEventCaptor)) + verify(mMockLogger, atLeastOnce()).log(mEventCaptor.capture()) val capturedEvents = mEventCaptor.allValues assertThat(capturedEvents.isNotEmpty()).isTrue() verifyDefaultEvent(capturedEvents) @@ -173,6 +168,7 @@ class SettingsChangeLoggerTest { companion object { private const val KEY_ENABLE_MINUS_ONE = "pref_enable_minus_one" private const val OVERVIEW_SUGGESTED_ACTIONS = "pref_overview_action_suggestions" + private const val SMARTSPACE_ON_HOME_SCREEN = "pref_smartspace_home_screen" private const val LAUNCHER_GOOGLE_APP_SWIPE_LEFT_ENABLED = 617 } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskIconDataSource.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskIconDataSource.kt index ce36715ad9..f6f158f546 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskIconDataSource.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskIconDataSource.kt @@ -21,7 +21,7 @@ import com.android.quickstep.TaskIconCache.TaskCacheEntry import com.android.quickstep.task.thumbnail.data.TaskIconDataSource import com.android.systemui.shared.recents.model.Task import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.delay +import kotlinx.coroutines.yield import org.mockito.kotlin.mock import org.mockito.kotlin.whenever @@ -34,8 +34,7 @@ class FakeTaskIconDataSource : TaskIconDataSource { /** Retrieves and sets an icon on [task] from [taskIdToDrawable]. */ override suspend fun getIcon(task: Task): TaskCacheEntry { while (task.key.id in completionPrevented) { - // yield doesn't work here with an UnconfinedTestDispatcher - delay(1L) + yield() } return TaskCacheEntry( taskIdToDrawable.getValue(task.key.id), diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskThumbnailDataSource.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskThumbnailDataSource.kt index 71996c7835..40d5e0264c 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskThumbnailDataSource.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskThumbnailDataSource.kt @@ -20,7 +20,7 @@ import android.graphics.Bitmap import com.android.quickstep.task.thumbnail.data.TaskThumbnailDataSource import com.android.systemui.shared.recents.model.Task import com.android.systemui.shared.recents.model.ThumbnailData -import kotlinx.coroutines.delay +import kotlinx.coroutines.yield import org.mockito.kotlin.mock class FakeTaskThumbnailDataSource : TaskThumbnailDataSource { @@ -37,8 +37,7 @@ class FakeTaskThumbnailDataSource : TaskThumbnailDataSource { getThumbnailCalls[task.key.id] = (getThumbnailCalls[task.key.id] ?: 0) + 1 while (task.key.id in completionPrevented) { - // yield doesn't work here with an UnconfinedTestDispatcher - delay(1L) + yield() } return ThumbnailData( thumbnail = taskIdToBitmap[task.key.id], @@ -55,8 +54,4 @@ class FakeTaskThumbnailDataSource : TaskThumbnailDataSource { fun completeLoadingForTask(taskId: Int) { completionPrevented.remove(taskId) } - - fun completeLoading() { - completionPrevented.clear() - } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTasksRepository.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTasksRepository.kt index c00ff15ced..35af29f2c6 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTasksRepository.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTasksRepository.kt @@ -17,30 +17,24 @@ package com.android.quickstep.recents.data import android.graphics.drawable.Drawable -import androidx.core.util.forEach -import androidx.core.util.putAll import com.android.systemui.shared.recents.model.Task import com.android.systemui.shared.recents.model.ThumbnailData import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.update class FakeTasksRepository : RecentTasksRepository { private var thumbnailDataMap: Map = emptyMap() private var taskIconDataMap: Map = emptyMap() private var tasks: MutableStateFlow> = MutableStateFlow(emptyList()) - private var visibleTasks: MutableStateFlow>> = MutableStateFlow(mapOf()) + private var visibleTasks: MutableStateFlow> = MutableStateFlow(emptySet()) - override fun getAllTaskData(displayId: Int, forceRefresh: Boolean): Flow> = - tasks.map { it.filter { it.key.displayId == displayId }.toList() } + override fun getAllTaskData(forceRefresh: Boolean): Flow> = tasks override fun getTaskDataById(taskId: Int): Flow = - combine(tasks, visibleTasks) { taskList, visibleTasks -> - val allVisibleTasks = mutableSetOf() - visibleTasks.forEach { _, value -> allVisibleTasks.addAll(value) } - taskList.filter { allVisibleTasks.contains(it.key.id) } + combine(getAllTaskData(), visibleTasks) { taskList, visibleTasks -> + taskList.filter { visibleTasks.contains(it.key.id) } } .map { taskList -> val task = taskList.firstOrNull { it.key.id == taskId } ?: return@map null @@ -58,13 +52,8 @@ class FakeTasksRepository : RecentTasksRepository { override fun getCurrentThumbnailById(taskId: Int): ThumbnailData? = tasks.value.firstOrNull { it.key.id == taskId }?.thumbnail - override fun setVisibleTasks(displayId: Int, visibleTaskIdList: Set) { - visibleTasks.update { - val newVisibleTasks = mutableMapOf>() - newVisibleTasks.putAll(it) - newVisibleTasks[displayId] = visibleTaskIdList - newVisibleTasks - } + override fun setVisibleTasks(visibleTaskIdList: Set) { + visibleTasks.value = visibleTaskIdList tasks.value = tasks.value.map { it.apply { diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt index e7f1d18e85..e22892c9cc 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt @@ -23,13 +23,13 @@ import android.graphics.Rect import android.graphics.drawable.Drawable import android.view.Display.DEFAULT_DISPLAY import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.launcher3.util.SplitConfigurationOptions import com.android.launcher3.util.TestDispatcherProvider import com.android.quickstep.util.DesktopTask import com.android.quickstep.util.SingleTask import com.android.quickstep.util.SplitTask import com.android.systemui.shared.recents.model.Task import com.android.systemui.shared.recents.model.ThumbnailData -import com.android.wm.shell.shared.split.SplitBounds import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50 import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -39,9 +39,7 @@ import kotlinx.coroutines.flow.toList import kotlinx.coroutines.launch import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.UnconfinedTestDispatcher -import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest -import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.spy @@ -53,39 +51,22 @@ import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) class TasksRepositoryTest { private val tasks = (0..5).map(::createTaskWithId) - private val secondaryTasks = (6..11).map(::createTaskWithIdForSecondaryDisplay) private val defaultTaskList = listOf( SingleTask(tasks[0]), SplitTask( tasks[1], tasks[2], - SplitBounds( + SplitConfigurationOptions.SplitBounds( /* leftTopBounds = */ Rect(), /* rightBottomBounds = */ Rect(), - /* leftTopTaskId = */ 1, - /* rightBottomTaskId = */ 2, + /* leftTopTaskId = */ -1, + /* rightBottomTaskId = */ -1, /* snapPosition = */ SNAP_TO_2_50_50, ), ), DesktopTask(deskId = 0, DEFAULT_DISPLAY, tasks.subList(3, 6)), ) - private val secondaryTaskList = - listOf( - SingleTask(secondaryTasks[0]), - SplitTask( - secondaryTasks[1], - secondaryTasks[2], - SplitBounds( - /* leftTopBounds = */ Rect(), - /* rightBottomBounds = */ Rect(), - /* leftTopTaskId = */ 7, - /* rightBottomTaskId = */ 8, - /* snapPosition = */ SNAP_TO_2_50_50, - ), - ), - DesktopTask(deskId = 1, SECONDARY_DISPLAY, secondaryTasks.subList(3, 6)), - ) private val recentsModel = FakeRecentTasksDataSource() private val taskThumbnailDataSource = FakeTaskThumbnailDataSource() private val taskIconDataSource = FakeTaskIconDataSource() @@ -106,25 +87,18 @@ class TasksRepositoryTest { TestDispatcherProvider(dispatcher), ) - @Before - fun cleanupDataSources() { - taskThumbnailDataSource.completeLoading() - taskIconDataSource.completeLoading() - } - @Test fun getAllTaskDataReturnsFlattenedListOfTasks() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - assertThat(systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true).first()) - .isEqualTo(tasks) + assertThat(systemUnderTest.getAllTaskData(forceRefresh = true).first()).isEqualTo(tasks) } @Test fun getTaskDataByIdReturnsSpecificTask() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) assertThat(systemUnderTest.getTaskDataById(2).first()).isEqualTo(tasks[2]) } @@ -133,7 +107,7 @@ class TasksRepositoryTest { fun getThumbnailByIdReturnsNullWithNoLoadedThumbnails() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) assertThat(systemUnderTest.getThumbnailById(1).first()).isNull() } @@ -142,7 +116,7 @@ class TasksRepositoryTest { fun getCurrentThumbnailByIdReturnsNullWithNoLoadedThumbnails() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) assertThat(systemUnderTest.getCurrentThumbnailById(1)).isNull() } @@ -151,10 +125,10 @@ class TasksRepositoryTest { fun getThumbnailByIdReturnsThumbnailWithLoadedThumbnails() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) val bitmap1 = taskThumbnailDataSource.taskIdToBitmap[1] - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.setVisibleTasks(setOf(1)) assertThat(systemUnderTest.getThumbnailById(1).first()!!.thumbnail).isEqualTo(bitmap1) } @@ -163,55 +137,33 @@ class TasksRepositoryTest { fun whenThumbnailIsLoaded_getAllTaskData_usesPreviousLoadedThumbnailAndIcon() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) val bitmap1 = taskThumbnailDataSource.taskIdToBitmap[1] - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.setVisibleTasks(setOf(1)) assertThat(systemUnderTest.getThumbnailById(1).first()!!.thumbnail).isEqualTo(bitmap1) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) assertThat(systemUnderTest.getThumbnailById(1).first()!!.thumbnail).isEqualTo(bitmap1) } - @Test - fun getAllTaskData_copiesPreviouslyLoadedImagesForTasksStillPresent() = - testScope.runTest { - recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(0, 1)) - - // Seed new task with same id - val newTask0 = SingleTask(createTaskWithId(0)) - val newSeededTasks = - defaultTaskList.map { - if (it is SingleTask && it.task.key.id == 0) newTask0 else it - } - recentsModel.seedTasks(newSeededTasks) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) - - // Assert no additional loads, assert images present - assertThat(systemUnderTest.getThumbnailById(0).first()?.thumbnail) - .isEqualTo(taskThumbnailDataSource.taskIdToBitmap[0]) - assertThat(taskThumbnailDataSource.getNumberOfGetThumbnailCalls(0)).isEqualTo(1) - } - @Test fun getAllTaskData_clearsPreviouslyLoadedImagesForRemovedTasks() = testScope.runTest { // Setup data recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) val bitmap1 = taskThumbnailDataSource.taskIdToBitmap[1] // Load images for task 1 - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.setVisibleTasks(setOf(1)) assertThat(systemUnderTest.getThumbnailById(1).first()!!.thumbnail).isEqualTo(bitmap1) // Remove task 1 from "all data" recentsModel.seedTasks( defaultTaskList.filterNot { groupTask -> groupTask.tasks.any { it.key.id == 1 } } ) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) // Assert task 1 was fully removed assertThat(systemUnderTest.getThumbnailById(1).first()?.thumbnail).isNull() @@ -222,10 +174,10 @@ class TasksRepositoryTest { fun getCurrentThumbnailByIdReturnsThumbnailWithLoadedThumbnails() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) val bitmap1 = taskThumbnailDataSource.taskIdToBitmap[1] - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.setVisibleTasks(setOf(1)) assertThat(systemUnderTest.getCurrentThumbnailById(1)?.thumbnail).isEqualTo(bitmap1) } @@ -236,9 +188,9 @@ class TasksRepositoryTest { recentsModel.seedTasks(defaultTaskList) val bitmap1 = taskThumbnailDataSource.taskIdToBitmap[1] val bitmap2 = taskThumbnailDataSource.taskIdToBitmap[2] - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1, 2)) + systemUnderTest.setVisibleTasks(setOf(1, 2)) assertThat(systemUnderTest.getTaskDataById(1).first()!!.thumbnail!!.thumbnail) .isEqualTo(bitmap1) @@ -250,9 +202,9 @@ class TasksRepositoryTest { fun setVisibleTasksPopulatesIcons() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1, 2)) + systemUnderTest.setVisibleTasks(setOf(1, 2)) systemUnderTest .getTaskDataById(1) @@ -269,16 +221,16 @@ class TasksRepositoryTest { testScope.runTest { recentsModel.seedTasks(defaultTaskList) val bitmap2 = taskThumbnailDataSource.taskIdToBitmap[2] - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1, 2)) + systemUnderTest.setVisibleTasks(setOf(1, 2)) assertThat(systemUnderTest.getTaskDataById(2).first()!!.thumbnail!!.thumbnail) .isEqualTo(bitmap2) // Prevent new loading of Bitmaps taskThumbnailDataSource.preventThumbnailLoad(2) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(2, 3)) + systemUnderTest.setVisibleTasks(setOf(2, 3)) assertThat(systemUnderTest.getTaskDataById(2).first()!!.thumbnail!!.thumbnail) .isEqualTo(bitmap2) @@ -288,9 +240,9 @@ class TasksRepositoryTest { fun changingVisibleTasksContainsAlreadyPopulatedIcons() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1, 2)) + systemUnderTest.setVisibleTasks(setOf(1, 2)) systemUnderTest .getTaskDataById(2) @@ -299,7 +251,7 @@ class TasksRepositoryTest { // Prevent new loading of Drawables taskIconDataSource.preventIconLoad(2) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(2, 3)) + systemUnderTest.setVisibleTasks(setOf(2, 3)) systemUnderTest .getTaskDataById(2) @@ -312,15 +264,15 @@ class TasksRepositoryTest { testScope.runTest { recentsModel.seedTasks(defaultTaskList) val bitmap2 = taskThumbnailDataSource.taskIdToBitmap[2] - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1, 2)) + systemUnderTest.setVisibleTasks(setOf(1, 2)) val task2 = systemUnderTest.getTaskDataById(2).first()!! assertThat(task2.thumbnail!!.thumbnail).isEqualTo(bitmap2) task2.assertHasIconDataFromSource(taskIconDataSource) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(0, 1)) + systemUnderTest.setVisibleTasks(setOf(0, 1)) val task2AfterVisibleTasksChanged = systemUnderTest.getTaskDataById(2).first()!! assertThat(task2AfterVisibleTasksChanged.thumbnail).isNull() @@ -337,7 +289,7 @@ class TasksRepositoryTest { val bitmap2 = taskThumbnailDataSource.taskIdToBitmap[2] // Setup TasksRepository - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) val task2DataFlow = systemUnderTest.getTaskDataById(2) val task2BitmapValues = mutableListOf() @@ -348,7 +300,7 @@ class TasksRepositoryTest { // Check for first emission assertThat(task2BitmapValues.single()).isNull() - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(2)) + systemUnderTest.setVisibleTasks(setOf(2)) // Check for second emission assertThat(task2BitmapValues).isEqualTo(listOf(null, bitmap2)) } @@ -357,8 +309,8 @@ class TasksRepositoryTest { fun onTaskThumbnailChanged_setsNewThumbnailDataOnTask() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.getAllTaskData(forceRefresh = true) + systemUnderTest.setVisibleTasks(setOf(1)) val expectedThumbnailData = createThumbnailData() val expectedPreviousBitmap = taskThumbnailDataSource.taskIdToBitmap[1] @@ -379,9 +331,9 @@ class TasksRepositoryTest { testScope.runTest { taskThumbnailDataSource.highResEnabled = false recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.setVisibleTasks(setOf(1)) val expectedBitmap = mock() val expectedPreviousBitmap = taskThumbnailDataSource.taskIdToBitmap[1] @@ -410,9 +362,9 @@ class TasksRepositoryTest { testScope.runTest { taskThumbnailDataSource.highResEnabled = false recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.setVisibleTasks(setOf(1)) val invisibleTaskId = 2 val taskDataFlow = systemUnderTest.getTaskDataById(invisibleTaskId) @@ -434,9 +386,9 @@ class TasksRepositoryTest { testScope.runTest { taskThumbnailDataSource.highResEnabled = true recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.setVisibleTasks(setOf(1)) val expectedBitmap = mock() val expectedPreviousBitmap = taskThumbnailDataSource.taskIdToBitmap[1] @@ -464,9 +416,9 @@ class TasksRepositoryTest { fun onTaskIconChanged_setsNewIconOnTask() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.setVisibleTasks(setOf(1)) val expectedIcon = FakeTaskIconDataSource.mockCopyableDrawable() val expectedPreviousIcon = taskIconDataSource.taskIdToDrawable[1] @@ -487,7 +439,7 @@ class TasksRepositoryTest { fun setVisibleTasks_multipleTimesWithDifferentTasks_reusesThumbnailRequests() = testScope.runTest { recentsModel.seedTasks(defaultTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) + systemUnderTest.getAllTaskData(forceRefresh = true) val taskDataFlow = systemUnderTest.getTaskDataById(1) val task1IconValues = mutableListOf() @@ -495,115 +447,16 @@ class TasksRepositoryTest { taskDataFlow.map { it?.icon }.toList(task1IconValues) } - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) + systemUnderTest.setVisibleTasks(setOf(1)) assertThat(taskThumbnailDataSource.getNumberOfGetThumbnailCalls(1)).isEqualTo(1) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1, 2)) + systemUnderTest.setVisibleTasks(setOf(1, 2)) assertThat(taskThumbnailDataSource.getNumberOfGetThumbnailCalls(1)).isEqualTo(1) } - @Test - fun getTaskData_forSecondaryDisplay() = - testScope.runTest { - recentsModel.seedTasks(defaultTaskList + secondaryTaskList) - - assertThat(systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true).first()) - .isEqualTo(tasks) - assertThat( - systemUnderTest.getAllTaskData(SECONDARY_DISPLAY, forceRefresh = true).first() - ) - .isEqualTo(secondaryTasks) - } - - @Test - fun setVisibleTasks_secondaryDisplayConnected() = - testScope.runTest { - recentsModel.seedTasks(defaultTaskList + secondaryTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) - systemUnderTest.getAllTaskData(SECONDARY_DISPLAY, forceRefresh = true) - val bitmap1 = taskThumbnailDataSource.taskIdToBitmap[1] - val bitmap6 = taskThumbnailDataSource.taskIdToBitmap[6] - - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) - systemUnderTest.setVisibleTasks(SECONDARY_DISPLAY, setOf(6)) - - val actualThumbnails = - (0..11).map { systemUnderTest.getThumbnailById(it).first()?.thumbnail }.toList() - val expectedThumbnails = - arrayOfNulls(12) - .apply { - set(1, bitmap1) - set(6, bitmap6) - } - .toList() - assertThat(actualThumbnails).isEqualTo(expectedThumbnails) - } - - @Test - fun setVisibleTasks_displayDisconnectedBeforeImageReturns_doesNotPopulateThumbnailOrIcon() = - testScope.runTest { - recentsModel.seedTasks(defaultTaskList + secondaryTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) - systemUnderTest.getAllTaskData(SECONDARY_DISPLAY, forceRefresh = true) - taskThumbnailDataSource.preventThumbnailLoad(6) - taskIconDataSource.preventIconLoad(6) - - val task6DataFlow = systemUnderTest.getTaskDataById(6) - val task6Values = mutableListOf>() - testScope.backgroundScope.launch { - task6DataFlow.map { Pair(it?.thumbnail?.thumbnail, it?.icon) }.toList(task6Values) - } - - launch { systemUnderTest.setVisibleTasks(SECONDARY_DISPLAY, setOf(6)) } - // Check we prevented the resources from loading - assertThat(task6Values.distinct()).isEqualTo(listOf(Pair(null, null))) - // Display disconnects - launch { systemUnderTest.setVisibleTasks(SECONDARY_DISPLAY, emptySet()) } - taskThumbnailDataSource.completeLoadingForTask(6) - taskIconDataSource.completeLoadingForTask(6) - testScope.advanceUntilIdle() - // Still should not be loaded - assertThat(task6Values.distinct()).isEqualTo(listOf(Pair(null, null))) - } - - @Test - fun onDisplayRemoved_removesAllDataForDisplay() = - testScope.runTest { - recentsModel.seedTasks(defaultTaskList + secondaryTaskList) - systemUnderTest.getAllTaskData(DEFAULT_DISPLAY, forceRefresh = true) - systemUnderTest.getAllTaskData(SECONDARY_DISPLAY, forceRefresh = true) - systemUnderTest.setVisibleTasks(DEFAULT_DISPLAY, setOf(1)) - systemUnderTest.setVisibleTasks(SECONDARY_DISPLAY, setOf(6)) - - recentsModel.seedTasks(defaultTaskList) - systemUnderTest.setVisibleTasks(SECONDARY_DISPLAY, emptySet()) - - for (t in 6..11) { - assertThat(systemUnderTest.getThumbnailById(t).first()?.thumbnail).isNull() - assertThat(systemUnderTest.getTaskDataById(t).first()?.icon).isNull() - } - } - private fun createTaskWithId(taskId: Int) = Task(Task.TaskKey(taskId, 0, Intent(), ComponentName("", ""), 0, 2000)) - private fun createTaskWithIdForSecondaryDisplay(taskId: Int) = - Task( - Task.TaskKey( - taskId, - 0, - Intent(), - ComponentName("", ""), - 0, - 2000, - SECONDARY_DISPLAY, - null, - 0, - false, - false, - ) - ) - private fun createThumbnailData(): ThumbnailData { val bitmap = mock() whenever(bitmap.width).thenReturn(THUMBNAIL_WIDTH) @@ -615,6 +468,5 @@ class TasksRepositoryTest { companion object { const val THUMBNAIL_WIDTH = 100 const val THUMBNAIL_HEIGHT = 200 - const val SECONDARY_DISPLAY = 1 } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetTaskUseCaseTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetTaskUseCaseTest.kt index d29183f62f..b036bceea7 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetTaskUseCaseTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetTaskUseCaseTest.kt @@ -20,166 +20,70 @@ import android.content.ComponentName import android.content.Intent import android.graphics.Color import android.graphics.drawable.ShapeDrawable -import android.os.UserHandle -import android.platform.test.annotations.DisableFlags -import android.platform.test.annotations.EnableFlags -import android.platform.test.flag.junit.SetFlagsRule -import android.view.Display.DEFAULT_DISPLAY import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.android.launcher3.Flags -import com.android.quickstep.recents.data.FakeAppTimersRepository import com.android.quickstep.recents.data.FakeTasksRepository import com.android.quickstep.recents.domain.model.TaskModel import com.android.systemui.shared.recents.model.Task import com.google.common.truth.Truth.assertThat -import java.time.Duration import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import org.junit.Before -import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Mockito.anyString -import org.mockito.Mockito.spy -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.kotlin.any @OptIn(ExperimentalCoroutinesApi::class) @RunWith(AndroidJUnit4::class) class GetTaskUseCaseTest { - @get:Rule val setFlagsRule = SetFlagsRule() - private val unconfinedTestDispatcher = UnconfinedTestDispatcher() private val testScope = TestScope(unconfinedTestDispatcher) private val tasksRepository = FakeTasksRepository() - private val timersRepository = FakeAppTimersRepository() - private val getRemainingAppTimerDurationUseCase = - spy(GetRemainingAppTimerDurationUseCase(timersRepository)) - private val sut = - GetTaskUseCase( - tasksRepository = tasksRepository, - getRemainingAppTimerDurationUseCase = getRemainingAppTimerDurationUseCase, - ) + private val sut = GetTaskUseCase(repository = tasksRepository) @Before fun setUp() { tasksRepository.seedTasks(listOf(TASK_1)) - timersRepository.setTimer(PACKAGE_1, UserHandle(USER_1), REMAINING_APP_DURATION) } @Test - @EnableFlags(Flags.FLAG_ENABLE_REFACTOR_DIGITAL_WELLBEING_TOAST) fun taskNotSeeded_returnsNull() = testScope.runTest { val result = sut.invoke(NOT_FOUND_TASK_ID).firstOrNull() - assertThat(result).isNull() - verify(getRemainingAppTimerDurationUseCase, times(0)) - .invoke(anyString(), any()) } @Test - @EnableFlags(Flags.FLAG_ENABLE_REFACTOR_DIGITAL_WELLBEING_TOAST) fun taskNotVisible_returnsNull() = testScope.runTest { val result = sut.invoke(TASK_1_ID).firstOrNull() - assertThat(result).isNull() } @Test - @EnableFlags(Flags.FLAG_ENABLE_REFACTOR_DIGITAL_WELLBEING_TOAST) fun taskVisible_returnsData() = testScope.runTest { - tasksRepository.setVisibleTasks(DEFAULT_DISPLAY, setOf(TASK_1_ID)) - - val result = sut.invoke(TASK_1_ID).firstOrNull() - - assertThat(result) - .isEqualTo( - TaskModel( - id = TASK_1_ID, - packageName = PACKAGE_1, - title = "Title $TASK_1_ID", - titleDescription = "Content Description $TASK_1_ID", - icon = TASK_1_ICON, - thumbnail = null, - backgroundColor = Color.BLACK, - isLocked = false, - isMinimized = false, - remainingAppDuration = ROUNDED_REMAINING_APP_DURATION, - ) + tasksRepository.setVisibleTasks(setOf(TASK_1_ID)) + val expectedResult = + TaskModel( + id = TASK_1_ID, + title = "Title $TASK_1_ID", + titleDescription = "Content Description $TASK_1_ID", + icon = TASK_1_ICON, + thumbnail = null, + backgroundColor = Color.BLACK, + isLocked = false, ) - } - - @Test - @EnableFlags(Flags.FLAG_ENABLE_REFACTOR_DIGITAL_WELLBEING_TOAST) - fun taskVisible_noAppTimer_returnsDataWithoutTimer() = - testScope.runTest { - tasksRepository.setVisibleTasks(DEFAULT_DISPLAY, setOf(TASK_1_ID)) - timersRepository.resetTimer(PACKAGE_1, UserHandle(USER_1)) - val result = sut.invoke(TASK_1_ID).firstOrNull() - - assertThat(result) - .isEqualTo( - TaskModel( - id = TASK_1_ID, - packageName = PACKAGE_1, - title = "Title $TASK_1_ID", - titleDescription = "Content Description $TASK_1_ID", - icon = TASK_1_ICON, - thumbnail = null, - backgroundColor = Color.BLACK, - isLocked = false, - isMinimized = false, - remainingAppDuration = null, - ) - ) - verify(getRemainingAppTimerDurationUseCase, times(1)) - .invoke(anyString(), any()) - } - - @Test - @DisableFlags(Flags.FLAG_ENABLE_REFACTOR_DIGITAL_WELLBEING_TOAST) - fun taskVisible_dwbFlagOff_doesNotFetchTimer() = - testScope.runTest { - tasksRepository.setVisibleTasks(DEFAULT_DISPLAY, setOf(TASK_1_ID)) - - val result = sut.invoke(TASK_1_ID).firstOrNull() - - assertThat(result) - .isEqualTo( - TaskModel( - id = TASK_1_ID, - packageName = PACKAGE_1, - title = "Title $TASK_1_ID", - titleDescription = "Content Description $TASK_1_ID", - icon = TASK_1_ICON, - thumbnail = null, - backgroundColor = Color.BLACK, - isLocked = false, - isMinimized = false, - remainingAppDuration = null, - ) - ) - verify(getRemainingAppTimerDurationUseCase, times(0)) - .invoke(anyString(), any()) + assertThat(result).isEqualTo(expectedResult) } private companion object { const val NOT_FOUND_TASK_ID = 404 private const val TASK_1_ID = 1 - private const val PACKAGE_1 = "com.test.1" - private const val USER_1 = 1 private val TASK_1_ICON = ShapeDrawable() - private val REMAINING_APP_DURATION = Duration.ofHours(2).plusMillis(10) - private val ROUNDED_REMAINING_APP_DURATION = Duration.ofHours(2).plusMinutes(1) private val TASK_1 = Task( Task.TaskKey( @@ -187,7 +91,7 @@ class GetTaskUseCaseTest { /* windowingMode = */ 0, /* intent = */ Intent(), /* sourceComponent = */ ComponentName("", ""), - /* userId = */ USER_1, + /* userId = */ 0, /* lastActiveTime = */ 2000, ) ) @@ -198,8 +102,6 @@ class GetTaskUseCaseTest { icon = TASK_1_ICON thumbnail = null isLocked = false - isMinimized = false - topActivity = ComponentName(PACKAGE_1, "SomeClass") } } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapperTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapperTest.kt index db78449b2f..7ca194afcf 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapperTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapperTest.kt @@ -19,49 +19,55 @@ package com.android.quickstep.recents.ui.mapper import android.graphics.Bitmap import android.graphics.Color import android.graphics.drawable.ShapeDrawable -import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags -import android.platform.test.flag.junit.SetFlagsRule import android.view.Surface import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.launcher3.Flags -import com.android.launcher3.R -import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT -import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT import com.android.quickstep.recents.ui.viewmodel.TaskData -import com.android.quickstep.task.apptimer.TaskAppTimerUiState -import com.android.quickstep.task.thumbnail.TaskHeaderUiState import com.android.quickstep.task.thumbnail.TaskThumbnailUiState import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.LiveTile import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Snapshot +import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.ThumbnailHeader import com.android.systemui.shared.recents.model.ThumbnailData import com.google.common.truth.Truth.assertThat -import java.time.Duration -import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class TaskUiStateMapperTest { - @get:Rule val mSetFlagsRule = SetFlagsRule() - - /** TaskHeaderUiState */ @Test - fun taskData_isNull_returns_HideHeader() { + fun taskData_isNull_returns_Uninitialized() { val result = - TaskUiStateMapper.toTaskHeaderState( + TaskUiStateMapper.toTaskThumbnailUiState( taskData = null, + isLiveTile = false, hasHeader = false, clickCloseListener = null, ) - assertThat(result).isEqualTo(TaskHeaderUiState.HideHeader) + assertThat(result).isEqualTo(TaskThumbnailUiState.Uninitialized) } - @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW) @Test - fun explodedFlagDisabled_returnsHideHeader() { + fun taskData_isLiveTile_returns_LiveTile() { + val inputs = + listOf(TASK_DATA, TASK_DATA.copy(thumbnailData = null), TASK_DATA.copy(isLocked = true)) + inputs.forEach { input -> + val result = + TaskUiStateMapper.toTaskThumbnailUiState( + taskData = input, + isLiveTile = true, + hasHeader = false, + clickCloseListener = null, + ) + assertThat(result).isEqualTo(LiveTile.WithoutHeader) + } + } + + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW) + @Test + fun taskData_isLiveTileWithHeader_returns_LiveTileWithHeader() { val inputs = listOf( TASK_DATA, @@ -70,42 +76,15 @@ class TaskUiStateMapperTest { TASK_DATA.copy(title = null), ) val closeCallback = View.OnClickListener {} - val expected = TaskHeaderUiState.HideHeader - inputs.forEach { taskData -> - val result = - TaskUiStateMapper.toTaskHeaderState( - taskData = taskData, - hasHeader = true, - clickCloseListener = closeCallback, - ) - assertThat(result).isEqualTo(expected) - } - } - - @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW) - @Test - fun taskData_hasHeader_and_taskData_returnsShowHeader() { - val inputs = - listOf( - TASK_DATA.copy(isLiveTile = true), - TASK_DATA.copy(isLiveTile = true, thumbnailData = null), - TASK_DATA.copy(isLiveTile = true, isLocked = true), - TASK_DATA.copy(isLiveTile = true, title = null), - ) - val closeCallback = View.OnClickListener {} val expected = - TaskHeaderUiState.ShowHeader( - header = - TaskHeaderUiState.ThumbnailHeader( - TASK_ICON, - TASK_TITLE_DESCRIPTION, - closeCallback, - ) + LiveTile.WithHeader( + header = ThumbnailHeader(TASK_ICON, TASK_TITLE_DESCRIPTION, closeCallback) ) inputs.forEach { taskData -> val result = - TaskUiStateMapper.toTaskHeaderState( + TaskUiStateMapper.toTaskThumbnailUiState( taskData = taskData, + isLiveTile = true, hasHeader = true, clickCloseListener = closeCallback, ) @@ -115,54 +94,40 @@ class TaskUiStateMapperTest { @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW) @Test - fun taskData_hasHeader_emptyTaskData_returns_HideHeader() { + fun taskData_isLiveTileWithHeader_missingHeaderData_returns_LiveTileWithoutHeader() { val inputs = listOf( - TASK_DATA.copy(isLiveTile = true, icon = null), - TASK_DATA.copy(isLiveTile = true, titleDescription = null), - TASK_DATA.copy(isLiveTile = true, icon = null, titleDescription = null), + TASK_DATA.copy(icon = null), + TASK_DATA.copy(titleDescription = null), + TASK_DATA.copy(icon = null, titleDescription = null), ) inputs.forEach { taskData -> val result = - TaskUiStateMapper.toTaskHeaderState( + TaskUiStateMapper.toTaskThumbnailUiState( taskData = taskData, + isLiveTile = true, hasHeader = true, clickCloseListener = {}, ) - assertThat(result).isEqualTo(TaskHeaderUiState.HideHeader) - } - } - - /** TaskThumbnailUiState */ - @Test - fun taskData_isNull_returns_Uninitialized() { - val result = TaskUiStateMapper.toTaskThumbnailUiState(taskData = null) - assertThat(result).isEqualTo(TaskThumbnailUiState.Uninitialized) - } - - @Test - fun taskData_isLiveTile_returns_LiveTile() { - val inputs = - listOf( - TASK_DATA.copy(isLiveTile = true), - TASK_DATA.copy(isLiveTile = true, thumbnailData = null), - TASK_DATA.copy(isLiveTile = true, isLocked = true), - ) - inputs.forEach { input -> - val result = TaskUiStateMapper.toTaskThumbnailUiState(taskData = input) - assertThat(result).isEqualTo(LiveTile) + assertThat(result).isEqualTo(LiveTile.WithoutHeader) } } @Test fun taskData_isStaticTile_returns_SnapshotSplash() { - val result = TaskUiStateMapper.toTaskThumbnailUiState(taskData = TASK_DATA) + val result = + TaskUiStateMapper.toTaskThumbnailUiState( + taskData = TASK_DATA, + isLiveTile = false, + hasHeader = false, + clickCloseListener = null, + ) val expected = TaskThumbnailUiState.SnapshotSplash( snapshot = - Snapshot( + Snapshot.WithoutHeader( backgroundColor = TASK_BACKGROUND_COLOR, bitmap = TASK_THUMBNAIL, thumbnailRotation = Surface.ROTATION_0, @@ -173,11 +138,72 @@ class TaskUiStateMapperTest { assertThat(result).isEqualTo(expected) } + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW) + @Test + fun taskData_isStaticTile_withHeader_returns_SnapshotSplashWithHeader() { + val inputs = listOf(TASK_DATA, TASK_DATA.copy(title = null)) + val closeCallback = View.OnClickListener {} + val expected = + TaskThumbnailUiState.SnapshotSplash( + snapshot = + Snapshot.WithHeader( + backgroundColor = TASK_BACKGROUND_COLOR, + bitmap = TASK_THUMBNAIL, + thumbnailRotation = Surface.ROTATION_0, + header = ThumbnailHeader(TASK_ICON, TASK_TITLE_DESCRIPTION, closeCallback), + ), + splash = TASK_ICON, + ) + inputs.forEach { taskData -> + val result = + TaskUiStateMapper.toTaskThumbnailUiState( + taskData = taskData, + isLiveTile = false, + hasHeader = true, + clickCloseListener = closeCallback, + ) + assertThat(result).isEqualTo(expected) + } + } + + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW) + @Test + fun taskData_isStaticTile_missingHeaderData_returns_SnapshotSplashWithoutHeader() { + val inputs = + listOf( + TASK_DATA.copy(titleDescription = null, icon = null), + TASK_DATA.copy(titleDescription = null), + TASK_DATA.copy(icon = null), + ) + val expected = + Snapshot.WithoutHeader( + backgroundColor = TASK_BACKGROUND_COLOR, + thumbnailRotation = Surface.ROTATION_0, + bitmap = TASK_THUMBNAIL, + ) + inputs.forEach { taskData -> + val result = + TaskUiStateMapper.toTaskThumbnailUiState( + taskData = taskData, + isLiveTile = false, + hasHeader = true, + clickCloseListener = {}, + ) + + assertThat(result).isInstanceOf(TaskThumbnailUiState.SnapshotSplash::class.java) + result as TaskThumbnailUiState.SnapshotSplash + assertThat(result.snapshot).isEqualTo(expected) + } + } + @Test fun taskData_thumbnailIsNull_returns_BackgroundOnly() { val result = TaskUiStateMapper.toTaskThumbnailUiState( - taskData = TASK_DATA.copy(thumbnailData = null) + taskData = TASK_DATA.copy(thumbnailData = null), + isLiveTile = false, + hasHeader = false, + clickCloseListener = null, ) val expected = TaskThumbnailUiState.BackgroundOnly(TASK_BACKGROUND_COLOR) @@ -187,125 +213,34 @@ class TaskUiStateMapperTest { @Test fun taskData_isLocked_returns_BackgroundOnly() { val result = - TaskUiStateMapper.toTaskThumbnailUiState(taskData = TASK_DATA.copy(isLocked = true)) + TaskUiStateMapper.toTaskThumbnailUiState( + taskData = TASK_DATA.copy(isLocked = true), + isLiveTile = false, + hasHeader = false, + clickCloseListener = null, + ) val expected = TaskThumbnailUiState.BackgroundOnly(TASK_BACKGROUND_COLOR) assertThat(result).isEqualTo(expected) } - @Test - fun toTaskAppTimer_nullTaskData_returnsUninitialized() { - val result = - TaskUiStateMapper.toTaskAppTimerUiState( - canShowAppTimer = true, - stagePosition = STAGE_POSITION_DEFAULT, - taskData = null, - ) - - val expected = TaskAppTimerUiState.Uninitialized - assertThat(result).isEqualTo(expected) - } - - @Test - fun toTaskAppTimer_noTaskData_returnsUninitialized() { - val result = - TaskUiStateMapper.toTaskAppTimerUiState( - canShowAppTimer = true, - stagePosition = STAGE_POSITION_DEFAULT, - taskData = TaskData.NoData(TASK_ID), - ) - - val expected = TaskAppTimerUiState.Uninitialized - assertThat(result).isEqualTo(expected) - } - - @Test - fun toTaskAppTimer_canShowAppTimerFalse_returnsNoTimer() { - val result = - TaskUiStateMapper.toTaskAppTimerUiState( - canShowAppTimer = false, - stagePosition = STAGE_POSITION_DEFAULT, - taskData = TASK_DATA, - ) - - val expected = TaskAppTimerUiState.NoTimer(taskDescription = TASK_TITLE_DESCRIPTION) - assertThat(result).isEqualTo(expected) - } - - @Test - fun toTaskAppTimer_timerNullAndCanShow_returnsNoTimer() { - val result = - TaskUiStateMapper.toTaskAppTimerUiState( - canShowAppTimer = false, - stagePosition = STAGE_POSITION_DEFAULT, - taskData = TASK_DATA.copy(remainingAppTimerDuration = null), - ) - - val expected = TaskAppTimerUiState.NoTimer(taskDescription = TASK_TITLE_DESCRIPTION) - assertThat(result).isEqualTo(expected) - } - - @Test - fun toTaskAppTimer_timerPresentAndCanShow_returnsTimer() { - val result = - TaskUiStateMapper.toTaskAppTimerUiState( - canShowAppTimer = true, - stagePosition = STAGE_POSITION_DEFAULT, - taskData = TASK_DATA.copy(remainingAppTimerDuration = TASK_APP_TIMER_DURATION), - ) - - val expected = - TaskAppTimerUiState.Timer( - timeRemaining = TASK_APP_TIMER_DURATION, - taskDescription = TASK_DATA.titleDescription, - taskPackageName = TASK_DATA.packageName, - accessibilityActionId = R.id.action_digital_wellbeing_top_left, - ) - assertThat(result).isEqualTo(expected) - } - - @Test - fun toTaskAppTimer_stagePositionBottomOrRight_returnsTimerWithCorrectActionId() { - val result = - TaskUiStateMapper.toTaskAppTimerUiState( - canShowAppTimer = true, - stagePosition = STAGE_POSITION_BOTTOM_OR_RIGHT, - taskData = TASK_DATA.copy(remainingAppTimerDuration = TASK_APP_TIMER_DURATION), - ) - - val expected = - TaskAppTimerUiState.Timer( - timeRemaining = TASK_APP_TIMER_DURATION, - taskDescription = TASK_DATA.titleDescription, - taskPackageName = TASK_DATA.packageName, - accessibilityActionId = R.id.action_digital_wellbeing_bottom_right, - ) - assertThat(result).isEqualTo(expected) - } - private companion object { const val TASK_TITLE_DESCRIPTION = "Title Description 1" var TASK_ID = 1 - var PACKAGE_NAME = "com.test" val TASK_ICON = ShapeDrawable() val TASK_THUMBNAIL = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) val TASK_THUMBNAIL_DATA = ThumbnailData(thumbnail = TASK_THUMBNAIL, rotation = Surface.ROTATION_0) val TASK_BACKGROUND_COLOR = Color.rgb(1, 2, 3) - val TASK_APP_TIMER_DURATION: Duration = Duration.ofMillis(30) - val STAGE_POSITION_DEFAULT = STAGE_POSITION_TOP_OR_LEFT val TASK_DATA = TaskData.Data( TASK_ID, - packageName = PACKAGE_NAME, title = "Task 1", titleDescription = TASK_TITLE_DESCRIPTION, icon = TASK_ICON, thumbnailData = TASK_THUMBNAIL_DATA, backgroundColor = TASK_BACKGROUND_COLOR, isLocked = false, - isLiveTile = false, - remainingAppTimerDuration = TASK_APP_TIMER_DURATION, ) } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt index b499a1d66e..333c2856e6 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt @@ -35,7 +35,6 @@ import com.android.quickstep.recents.viewmodel.RecentsViewData import com.android.quickstep.views.TaskViewType import com.android.systemui.shared.recents.model.ThumbnailData import com.google.common.truth.Truth.assertThat -import java.time.Duration import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flow @@ -71,8 +70,6 @@ class TaskViewModelTest { whenever(getTaskUseCase.invoke(TASK_MODEL_1.id)).thenReturn(flow { emit(TASK_MODEL_1) }) whenever(getTaskUseCase.invoke(TASK_MODEL_2.id)).thenReturn(flow { emit(TASK_MODEL_2) }) whenever(getTaskUseCase.invoke(TASK_MODEL_3.id)).thenReturn(flow { emit(TASK_MODEL_3) }) - whenever(getTaskUseCase.invoke(TASK_MODEL_MINIMIZED.id)) - .thenReturn(flow { emit(TASK_MODEL_MINIMIZED) }) whenever(getTaskUseCase.invoke(INVALID_TASK_ID)).thenReturn(flow { emit(null) }) recentsViewData.runningTaskIds.value = emptySet() } @@ -84,6 +81,7 @@ class TaskViewModelTest { val expectedResult = TaskTileUiState( tasks = listOf(TASK_MODEL_1.toUiState()), + isLiveTile = false, hasHeader = false, sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME, taskOverlayEnabled = false, @@ -131,6 +129,7 @@ class TaskViewModelTest { TASK_MODEL_3.toUiState(), TaskData.NoData(INVALID_TASK_ID), ), + isLiveTile = false, hasHeader = false, sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME, taskOverlayEnabled = false, @@ -150,34 +149,11 @@ class TaskViewModelTest { TaskTileUiState( tasks = listOf( - TASK_MODEL_1.toUiState(isLiveTile = true), - TASK_MODEL_2.toUiState(isLiveTile = true), - TASK_MODEL_3.toUiState(isLiveTile = true), - ), - hasHeader = false, - sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME, - taskOverlayEnabled = false, - isCentralTask = false, - ) - assertThat(sut.state.first()).isEqualTo(expectedResult) - } - - @Test - fun isMixedLiveTile_when_oneTaskIsMinimized() = - testScope.runTest { - recentsViewData.runningTaskShowScreenshot.value = false - recentsViewData.runningTaskIds.value = - setOf(TASK_MODEL_1.id, TASK_MODEL_2.id, TASK_MODEL_3.id, TASK_MODEL_MINIMIZED.id) - sut.bind(TASK_MODEL_1.id, TASK_MODEL_2.id, TASK_MODEL_3.id, TASK_MODEL_MINIMIZED.id) - val expectedResult = - TaskTileUiState( - tasks = - listOf( - TASK_MODEL_1.toUiState(isLiveTile = true), - TASK_MODEL_2.toUiState(isLiveTile = true), - TASK_MODEL_3.toUiState(isLiveTile = true), - TASK_MODEL_MINIMIZED.toUiState(isLiveTile = false), + TASK_MODEL_1.toUiState(), + TASK_MODEL_2.toUiState(), + TASK_MODEL_3.toUiState(), ), + isLiveTile = true, hasHeader = false, sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME, taskOverlayEnabled = false, @@ -201,6 +177,7 @@ class TaskViewModelTest { TASK_MODEL_2.toUiState(), TASK_MODEL_3.toUiState(), ), + isLiveTile = false, hasHeader = false, sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME, taskOverlayEnabled = false, @@ -223,6 +200,7 @@ class TaskViewModelTest { TASK_MODEL_2.toUiState(), TASK_MODEL_3.toUiState(), ), + isLiveTile = false, hasHeader = false, sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME, taskOverlayEnabled = false, @@ -241,6 +219,7 @@ class TaskViewModelTest { val expectedResult = TaskTileUiState( tasks = listOf(TASK_MODEL_1.toUiState(), TASK_MODEL_2.toUiState()), + isLiveTile = false, hasHeader = false, sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME, taskOverlayEnabled = false, @@ -256,6 +235,7 @@ class TaskViewModelTest { val expectedResult = TaskTileUiState( listOf(TaskData.NoData(INVALID_TASK_ID)), + isLiveTile = false, hasHeader = false, sysUiStatusNavFlags = FLAGS_APPEARANCE_DEFAULT, taskOverlayEnabled = false, @@ -294,28 +274,6 @@ class TaskViewModelTest { assertThat(sut.state.first().taskOverlayEnabled).isFalse() } - @Test - fun taskOverlayDisabled_when_OverlayIsEnabledForVisibleDesktopTask() = - testScope.runTest { - sut = createTaskViewModel(TaskViewType.DESKTOP) - sut.bind(TASK_MODEL_1.id) - recentsViewData.overlayEnabled.value = true - recentsViewData.settledFullyVisibleTaskIds.value = setOf(1) - - assertThat(sut.state.first().taskOverlayEnabled).isFalse() - } - - @Test - fun taskOverlayDisabled_when_OverlayIsEnabledForVisibleGroupedTask() = - testScope.runTest { - sut = createTaskViewModel(TaskViewType.GROUPED) - sut.bind(TASK_MODEL_1.id) - recentsViewData.overlayEnabled.value = true - recentsViewData.settledFullyVisibleTaskIds.value = setOf(1) - - assertThat(sut.state.first().taskOverlayEnabled).isFalse() - } - @Test fun isCentralTask_when_CentralTaskIdsMatchTaskIds() = testScope.runTest { @@ -340,18 +298,15 @@ class TaskViewModelTest { verify(isThumbnailValidUseCase).invoke(anyOrNull(), anyInt(), anyInt()) } - private fun TaskModel.toUiState(isLiveTile: Boolean = false) = + private fun TaskModel.toUiState() = TaskData.Data( taskId = id, - packageName = packageName, title = title, titleDescription = titleDescription, icon = icon!!, thumbnailData = thumbnail, backgroundColor = backgroundColor, isLocked = isLocked, - isLiveTile = isLiveTile, - remainingAppTimerDuration = remainingAppDuration, ) private fun createTaskViewModel(taskViewType: TaskViewType) = @@ -366,7 +321,6 @@ class TaskViewModelTest { ) private companion object { - const val PACKAGE_NAME = "com.test" const val INVALID_TASK_ID = -1 const val FLAGS_APPEARANCE_LIGHT_THEME = FLAG_LIGHT_STATUS or FLAG_LIGHT_NAV const val FLAGS_APPEARANCE_DEFAULT = 0 @@ -378,54 +332,32 @@ class TaskViewModelTest { val TASK_MODEL_1 = TaskModel( 1, - PACKAGE_NAME, "Title 1", "Content Description 1", ShapeDrawable(), ThumbnailData(appearance = APPEARANCE_LIGHT_THEME), Color.BLACK, - /* isLocked= */ false, - /* isMinimized= */ false, - /*remainingAppDuration= */ Duration.ofMillis(30), + false, ) val TASK_MODEL_2 = TaskModel( 2, - PACKAGE_NAME, "Title 2", "Content Description 2", ShapeDrawable(), ThumbnailData(appearance = APPEARANCE_LIGHT_THEME), Color.RED, - /* isLocked= */ true, - /* isMinimized= */ false, - /*remainingAppDuration= */ Duration.ofHours(5).plusMinutes(2), + true, ) val TASK_MODEL_3 = TaskModel( 3, - PACKAGE_NAME, "Title 3", "Content Description 3", ShapeDrawable(), ThumbnailData(appearance = APPEARANCE_LIGHT_THEME), Color.BLUE, - /* isLocked= */ false, - /* isMinimized= */ false, - /* remainingAppDuration= */ null, - ) - val TASK_MODEL_MINIMIZED = - TaskModel( - 4, - PACKAGE_NAME, - "Title 4", - "Content Description 4", - ShapeDrawable(), - ThumbnailData(appearance = APPEARANCE_LIGHT_THEME), - Color.BLUE, - /* isLocked= */ false, - /* isMinimized= */ true, - /* remainingAppDuration= */ null, + false, ) } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/viewmodel/RecentsViewModelTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/viewmodel/RecentsViewModelTest.kt index c53f20ffdc..a32e07dedf 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/viewmodel/RecentsViewModelTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/viewmodel/RecentsViewModelTest.kt @@ -20,7 +20,6 @@ import android.content.ComponentName import android.content.Intent import android.graphics.Bitmap import android.graphics.Color -import android.view.Display.DEFAULT_DISPLAY import android.view.Surface import com.android.quickstep.recents.data.FakeTasksRepository import com.android.systemui.shared.recents.model.Task @@ -35,8 +34,7 @@ import org.mockito.kotlin.whenever class RecentsViewModelTest { private val tasksRepository = FakeTasksRepository() private val recentsViewData = RecentsViewData() - private val systemUnderTest = - RecentsViewModel(tasksRepository, recentsViewData, DEFAULT_DISPLAY) + private val systemUnderTest = RecentsViewModel(tasksRepository, recentsViewData) private val tasks = (0..5).map(::createTaskWithId) @@ -99,7 +97,7 @@ class RecentsViewModelTest { ) // setVisibleTasks forces FakeTasksRepository to update the flows returned by // getThumbnailById - tasksRepository.setVisibleTasks(DEFAULT_DISPLAY, setOf(1, 2)) + tasksRepository.setVisibleTasks(setOf(1, 2)) // Then wait for thumbnailData should complete, and the previous getThumbnailById flow // should return updated values diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/taskbar/controllers/TaskbarPinningControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/taskbar/controllers/TaskbarPinningControllerTest.kt index f95d2f7d22..26418d876a 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/taskbar/controllers/TaskbarPinningControllerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/taskbar/controllers/TaskbarPinningControllerTest.kt @@ -76,19 +76,6 @@ class TaskbarPinningControllerTest : TaskbarBaseTestCase() { ) ) .thenAnswer { _ -> isInDesktopMode } - whenever( - taskbarControllers.taskbarDesktopModeController.isInDesktopMode( - taskbarActivityContext.displayId - ) - ) - .thenAnswer { _ -> isInDesktopMode } - whenever( - taskbarControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar( - taskbarActivityContext.displayId - ) - ) - .thenAnswer { _ -> isInDesktopMode } - pinningController = spy(TaskbarPinningController(taskbarActivityContext)) pinningController.init(taskbarControllers, taskbarSharedState) } @@ -130,14 +117,6 @@ class TaskbarPinningControllerTest : TaskbarBaseTestCase() { verify(pinningController, times(1)).animateTaskbarPinning(PINNING_PERSISTENT) } - @Test - fun testOnCloseCallback_whenLauncherPreferenceChanged_shouldNotAnimateToTaskbarInDesktopMode() { - isInDesktopMode = true - whenever(launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE)).thenReturn(false) - pinningController.onCloseCallback(true) - verify(pinningController, never()).animateTaskbarPinning(any()) - } - @Test fun testOnCloseCallback_whenLauncherPreferenceChanged_shouldAnimateToTransientTaskbar() { whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(true) @@ -232,4 +211,13 @@ class TaskbarPinningControllerTest : TaskbarBaseTestCase() { assertThat(pinningController.isAnimatingTaskbarPinning).isFalse() verify(launcherPrefs, times(1)).put(TASKBAR_PINNING, true) } + + @Test + fun testRecreateTaskbarAndUpdatePinningValue_whenAnimationEnds_shouldUpdateTaskbarPinningDesktopModePref() { + isInDesktopMode = true + pinningController.recreateTaskbarAndUpdatePinningValue() + verify(taskbarDragLayer, times(1)).setAnimatingTaskbarPinning(false) + assertThat(pinningController.isAnimatingTaskbarPinning).isFalse() + verify(launcherPrefs, times(1)).put(TASKBAR_PINNING_IN_DESKTOP_MODE, true) + } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java index 88774be33c..61971b1fc8 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java @@ -52,6 +52,7 @@ import com.android.quickstep.BaseContainerInterface; import com.android.quickstep.DeviceConfigWrapper; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TopTaskTracker; +import com.android.quickstep.orientation.RecentsPagedOrientationHandler; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.RecentsViewContainer; @@ -82,6 +83,7 @@ public class ContextualSearchInvokerTest { private @Mock BaseContainerInterface mMockContainerInterface; private @Mock RecentsViewContainer mMockRecentsViewContainer; private @Mock RecentsView mMockRecentsView; + private @Mock RecentsPagedOrientationHandler mMockOrientationHandler; private ContextualSearchInvoker mContextualSearchInvoker; @Before @@ -189,6 +191,15 @@ public class ContextualSearchInvokerTest { verify(mMockStatsLogger).log(LAUNCHER_LAUNCH_OMNI_ATTEMPTED_SPLITSCREEN); } + @Test + public void runContextualSearchInvocationChecksAndLogFailures_isFakeLandscape() { + when(mMockRecentsView.getPagedOrientationHandler()).thenReturn(mMockOrientationHandler); + when(mMockOrientationHandler.isLayoutNaturalToLauncher()).thenReturn(false); + assertFalse("Expect invocation checks to fail in fake landscape.", + mContextualSearchInvoker.runContextualSearchInvocationChecksAndLogFailures()); + verifyNoMoreInteractions(mMockStatsLogManager); + } + @Test public void invokeContextualSearchUncheckedWithHaptic_cssIsAvailable_commitHapticEnabled() { try (AutoCloseable flag = overrideSearchHapticCommitFlag(true)) { diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GestureExclusionManagerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GestureExclusionManagerTest.kt index cbe397b4a1..555e62bead 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GestureExclusionManagerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GestureExclusionManagerTest.kt @@ -131,7 +131,7 @@ class GestureExclusionManagerTest { } private fun awaitTasksCompleted() { - Executors.UI_HELPER_EXECUTOR.submit { null }.get() - Executors.MAIN_EXECUTOR.submit { null }.get() + Executors.UI_HELPER_EXECUTOR.submit { null }.get() + Executors.MAIN_EXECUTOR.submit { null }.get() } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GroupTaskTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GroupTaskTest.kt index f745134109..9f491717c4 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GroupTaskTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GroupTaskTest.kt @@ -20,11 +20,9 @@ import android.content.ComponentName import android.content.Intent import android.graphics.Rect import android.view.Display.DEFAULT_DISPLAY -import android.view.Display.INVALID_DISPLAY import com.android.launcher3.util.LauncherMultivalentJUnit import com.android.launcher3.util.SplitConfigurationOptions import com.android.systemui.shared.recents.model.Task -import com.android.wm.shell.shared.split.SplitBounds import com.android.wm.shell.shared.split.SplitScreenConstants import com.google.common.truth.Truth.assertThat import org.junit.Test @@ -63,7 +61,7 @@ class GroupTaskTest { @Test fun testGroupTask_equalSplitTasks_isEqual() { val splitBounds = - SplitBounds( + SplitConfigurationOptions.SplitBounds( Rect(), Rect(), 1, @@ -78,7 +76,7 @@ class GroupTaskTest { @Test fun testGroupTask_differentSplitTasks_isNotEqual() { val splitBounds1 = - SplitBounds( + SplitConfigurationOptions.SplitBounds( Rect(), Rect(), 1, @@ -86,7 +84,7 @@ class GroupTaskTest { SplitScreenConstants.SNAP_TO_2_50_50, ) val splitBounds2 = - SplitBounds( + SplitConfigurationOptions.SplitBounds( Rect(), Rect(), 1, @@ -105,86 +103,7 @@ class GroupTaskTest { assertThat(task1).isNotEqualTo(task2) } - @Test - fun testDesktopTask_matchesDisplayId() { - val task1 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, listOf(createTask(1, INVALID_DISPLAY))) - assertThat(task1.matchesDisplayId(DEFAULT_DISPLAY)).isTrue() - assertThat(task1.matchesDisplayId(DISPLAY_2)).isFalse() - val task2 = DesktopTask(deskId = 0, DISPLAY_2, listOf(createTask(1, DISPLAY_2))) - assertThat(task2.matchesDisplayId(DEFAULT_DISPLAY)).isFalse() - assertThat(task2.matchesDisplayId(DISPLAY_2)).isTrue() - val task3 = DesktopTask(deskId = 0, DISPLAY_2, listOf(createTask(1, INVALID_DISPLAY))) - assertThat(task3.matchesDisplayId(DEFAULT_DISPLAY)).isFalse() - assertThat(task3.matchesDisplayId(DISPLAY_2)).isTrue() - } - - @Test - fun testSingleTask_matchesDisplayId() { - val task1 = SingleTask(createTask(1, INVALID_DISPLAY)) - assertThat(task1.matchesDisplayId(DEFAULT_DISPLAY)).isTrue() - assertThat(task1.matchesDisplayId(DISPLAY_2)).isFalse() - val task2 = SingleTask(createTask(1, DISPLAY_2)) - assertThat(task2.matchesDisplayId(DEFAULT_DISPLAY)).isFalse() - assertThat(task2.matchesDisplayId(DISPLAY_2)).isTrue() - val task3 = SingleTask(createTask(1, DEFAULT_DISPLAY)) - assertThat(task3.matchesDisplayId(DEFAULT_DISPLAY)).isTrue() - assertThat(task3.matchesDisplayId(DISPLAY_2)).isFalse() - } - - @Test - fun testSplitTask_matchesDisplayId() { - val splitBounds = - SplitBounds( - Rect(), - Rect(), - 1, - 2, - SplitScreenConstants.SNAP_TO_2_50_50, - ) - val task1 = - SplitTask(createTask(1, INVALID_DISPLAY), createTask(2, INVALID_DISPLAY), splitBounds) - assertThat(task1.matchesDisplayId(DEFAULT_DISPLAY)).isTrue() - assertThat(task1.matchesDisplayId(DISPLAY_2)).isFalse() - val task2 = SplitTask(createTask(1, INVALID_DISPLAY), createTask(2, DISPLAY_2), splitBounds) - assertThat(task2.matchesDisplayId(DEFAULT_DISPLAY)).isTrue() - assertThat(task2.matchesDisplayId(DISPLAY_2)).isFalse() - val task3 = SplitTask(createTask(1, DISPLAY_2), createTask(2, INVALID_DISPLAY), splitBounds) - assertThat(task3.matchesDisplayId(DEFAULT_DISPLAY)).isFalse() - assertThat(task3.matchesDisplayId(DISPLAY_2)).isTrue() - val task4 = - SplitTask(createTask(1, DEFAULT_DISPLAY), createTask(2, DEFAULT_DISPLAY), splitBounds) - assertThat(task4.matchesDisplayId(DEFAULT_DISPLAY)).isTrue() - assertThat(task4.matchesDisplayId(DISPLAY_2)).isFalse() - val task5 = SplitTask(createTask(1, DEFAULT_DISPLAY), createTask(2, DISPLAY_2), splitBounds) - assertThat(task5.matchesDisplayId(DEFAULT_DISPLAY)).isTrue() - assertThat(task5.matchesDisplayId(DISPLAY_2)).isFalse() - val task6 = SplitTask(createTask(1, DISPLAY_2), createTask(2, DEFAULT_DISPLAY), splitBounds) - assertThat(task6.matchesDisplayId(DEFAULT_DISPLAY)).isFalse() - assertThat(task6.matchesDisplayId(DISPLAY_2)).isTrue() - } - - private fun createTask(id: Int, displayId: Int = INVALID_DISPLAY, pkg: String? = null): Task { - val intent = Intent() - pkg.let { intent.setPackage(it) } - return Task( - Task.TaskKey( - id, - 0, - intent, - ComponentName(pkg ?: "", ""), - 0, - 0, - displayId, - null, - 0, - false, - false, - ) - ) - } - - companion object { - const val DISPLAY_2 = 2 - const val PACKAGE = "com.android.launcher3" + private fun createTask(id: Int): Task { + return Task(Task.TaskKey(id, 0, Intent(), ComponentName("", ""), 0, 0)) } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt index d6f150c8e2..e4bdba510f 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt @@ -39,7 +39,6 @@ import com.android.quickstep.util.SplitSelectStateController.SplitFromDesktopCon import com.android.quickstep.views.RecentsView import com.android.quickstep.views.RecentsViewContainer import com.android.systemui.shared.recents.model.Task -import com.android.wm.shell.shared.split.SplitBounds import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50 import java.util.function.Consumer import org.junit.Assert.assertEquals @@ -664,7 +663,7 @@ class SplitSelectStateControllerTest { return SplitTask( task1, task2, - SplitBounds( + SplitConfigurationOptions.SplitBounds( /* leftTopBounds = */ Rect(), /* rightBottomBounds = */ Rect(), /* leftTopTaskId = */ task1.key.id, @@ -702,7 +701,7 @@ class SplitSelectStateControllerTest { return SplitTask( task1, task2, - SplitBounds( + SplitConfigurationOptions.SplitBounds( /* leftTopBounds = */ Rect(), /* rightBottomBounds = */ Rect(), /* leftTopTaskId = */ task1.key.id, diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskGridNavHelperTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskGridNavHelperTest.kt index f776b94cd0..cb088fda56 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskGridNavHelperTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskGridNavHelperTest.kt @@ -786,17 +786,6 @@ class TaskGridNavHelperTest { .isEqualTo(ADD_DESK_PLACEHOLDER_ID) } - /* - 5 3 1 | - CLEAR_ALL | Invalid ID: - 6 4 2 | [25] --> [25] - */ - @Test - fun nextGridPage_invalidId_pressTab_noCycle_returnsCurrentPage() { - assertThat(getNextGridPage(currentPageTaskViewId = 25, TAB, delta = -1, cycle = false)) - .isEqualTo(25) - } - // Col offset: 0 1 2 // ----------- // ID grid: 4 2 0 start diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java index 060f13f1e2..be76f9e86d 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java @@ -40,9 +40,9 @@ import com.android.launcher3.dagger.LauncherAppSingleton; import com.android.launcher3.util.AllModulesMinusWMProxy; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.Info; +import com.android.launcher3.util.LauncherModelHelper; import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.RotationUtils; -import com.android.launcher3.util.SandboxApplication; import com.android.launcher3.util.WindowBounds; import com.android.launcher3.util.window.CachedDisplayInfo; import com.android.launcher3.util.window.WindowManagerProxy; @@ -55,7 +55,6 @@ import dagger.Component; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; import org.junit.Assert; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -66,8 +65,6 @@ import java.util.List; @RunWith(AndroidJUnit4.class) public class TaskViewSimulatorTest { - @Rule public final SandboxApplication app = new SandboxApplication(); - @Test public void taskProperlyScaled_portrait_noRotation_sameInsets1() { new TaskMatrixVerifier() @@ -126,7 +123,7 @@ public class TaskViewSimulatorTest { .verifyNoTransforms(); } - private class TaskMatrixVerifier extends TransformParams { + private static class TaskMatrixVerifier extends TransformParams { private Point mDisplaySize = new Point(); private int mDensityDpi = DisplayMetrics.DENSITY_DEFAULT; @@ -166,67 +163,73 @@ public class TaskViewSimulatorTest { } void verifyNoTransforms() { - DisplayController mockController = mock(DisplayController.class); + LauncherModelHelper helper = new LauncherModelHelper(); + try { + DisplayController mockController = mock(DisplayController.class); - app.initDaggerComponent( - DaggerTaskViewSimulatorTest_TaskViewSimulatorTestComponent.builder() - .bindDisplayController(mockController)); - int rotation = mDisplaySize.x > mDisplaySize.y - ? Surface.ROTATION_90 : Surface.ROTATION_0; - CachedDisplayInfo cdi = new CachedDisplayInfo(mDisplaySize, rotation); - WindowBounds wm = new WindowBounds( - new Rect(0, 0, mDisplaySize.x, mDisplaySize.y), - mDisplayInsets); - List allBounds = new ArrayList<>(4); - for (int i = 0; i < 4; i++) { - Rect boundsR = new Rect(wm.bounds); - Rect insetsR = new Rect(wm.insets); + helper.sandboxContext.initDaggerComponent( + DaggerTaskViewSimulatorTest_TaskViewSimulatorTestComponent.builder() + .bindDisplayController(mockController)); + int rotation = mDisplaySize.x > mDisplaySize.y + ? Surface.ROTATION_90 : Surface.ROTATION_0; + CachedDisplayInfo cdi = new CachedDisplayInfo(mDisplaySize, rotation); + WindowBounds wm = new WindowBounds( + new Rect(0, 0, mDisplaySize.x, mDisplaySize.y), + mDisplayInsets); + List allBounds = new ArrayList<>(4); + for (int i = 0; i < 4; i++) { + Rect boundsR = new Rect(wm.bounds); + Rect insetsR = new Rect(wm.insets); - RotationUtils.rotateRect(insetsR, RotationUtils.deltaRotation(rotation, i)); - RotationUtils.rotateRect(boundsR, RotationUtils.deltaRotation(rotation, i)); - boundsR.set(0, 0, Math.abs(boundsR.width()), Math.abs(boundsR.height())); - allBounds.add(new WindowBounds(boundsR, insetsR)); + RotationUtils.rotateRect(insetsR, RotationUtils.deltaRotation(rotation, i)); + RotationUtils.rotateRect(boundsR, RotationUtils.deltaRotation(rotation, i)); + boundsR.set(0, 0, Math.abs(boundsR.width()), Math.abs(boundsR.height())); + allBounds.add(new WindowBounds(boundsR, insetsR)); + } + + WindowManagerProxy wmProxy = mock(WindowManagerProxy.class); + doReturn(cdi).when(wmProxy).getDisplayInfo(any()); + doReturn(wm).when(wmProxy).getRealBounds(any(), any()); + doReturn(NavigationMode.NO_BUTTON).when(wmProxy).getNavigationMode(any()); + + ArrayMap> perDisplayBoundsCache = + new ArrayMap<>(); + perDisplayBoundsCache.put(cdi.normalize(wmProxy), allBounds); + + Configuration configuration = new Configuration(); + configuration.densityDpi = mDensityDpi; + Context configurationContext = helper.sandboxContext.createConfigurationContext( + configuration); + + DisplayController.Info info = new Info( + configurationContext, wmProxy, perDisplayBoundsCache); + when(mockController.getInfo()).thenReturn(info); + + mDeviceProfile = InvariantDeviceProfile.INSTANCE.get(helper.sandboxContext) + .getBestMatch(mAppBounds.width(), mAppBounds.height(), rotation); + mDeviceProfile.updateInsets(mLauncherInsets); + + TaskViewSimulator tvs = new TaskViewSimulator(helper.sandboxContext, + FallbackActivityInterface.INSTANCE, false, 0); + tvs.setDp(mDeviceProfile); + + int launcherRotation = info.rotation; + if (mAppRotation < 0) { + mAppRotation = launcherRotation; + } + + tvs.getOrientationState().update(launcherRotation, mAppRotation); + if (mAppInsets == null) { + mAppInsets = new Rect(mLauncherInsets); + } + tvs.setPreviewBounds(mAppBounds, mAppInsets); + + tvs.fullScreenProgress.value = 1; + tvs.recentsViewScale.value = tvs.getFullScreenScale(); + tvs.apply(this); + } finally { + helper.destroy(); } - - WindowManagerProxy wmProxy = mock(WindowManagerProxy.class); - doReturn(cdi).when(wmProxy).getDisplayInfo(any()); - doReturn(wm).when(wmProxy).getRealBounds(any(), any()); - doReturn(NavigationMode.NO_BUTTON).when(wmProxy).getNavigationMode(any()); - - ArrayMap> perDisplayBoundsCache = - new ArrayMap<>(); - perDisplayBoundsCache.put(cdi.normalize(wmProxy), allBounds); - - Configuration configuration = new Configuration(); - configuration.densityDpi = mDensityDpi; - Context configurationContext = app.createConfigurationContext(configuration); - - DisplayController.Info info = new Info( - configurationContext, false, wmProxy, perDisplayBoundsCache, mDensityDpi); - when(mockController.getInfo()).thenReturn(info); - - mDeviceProfile = InvariantDeviceProfile.INSTANCE.get(app) - .getBestMatch(mAppBounds.width(), mAppBounds.height(), rotation); - mDeviceProfile.updateInsets(mLauncherInsets); - - TaskViewSimulator tvs = new TaskViewSimulator(app, - FallbackActivityInterface.INSTANCE, false, 0); - tvs.setDp(mDeviceProfile); - - int launcherRotation = info.rotation; - if (mAppRotation < 0) { - mAppRotation = launcherRotation; - } - - tvs.getOrientationState().update(launcherRotation, mAppRotation); - if (mAppInsets == null) { - mAppInsets = new Rect(mLauncherInsets); - } - tvs.setPreviewBounds(mAppBounds, mAppInsets); - - tvs.fullScreenProgress.value = 1; - tvs.recentsViewScale.value = tvs.getFullScreenScale(); - tvs.apply(this); } @Override diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TransformParamsTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TransformParamsTest.kt index e1b31543a8..6dbb667a22 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TransformParamsTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TransformParamsTest.kt @@ -34,7 +34,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.quickstep.RemoteAnimationTargets import com.android.quickstep.util.TransformParams.BuilderProxy.NO_OP -import com.android.window.flags2.Flags.FLAG_ENABLE_DESKTOP_RECENTS_TRANSITIONS_CORNERS_BUGFIX +import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_RECENTS_TRANSITIONS_CORNERS_BUGFIX import org.junit.Before import org.junit.Rule import org.junit.Test diff --git a/quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java b/quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java index 69499fbb76..59ce6370ea 100644 --- a/quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java +++ b/quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java @@ -48,22 +48,18 @@ import android.platform.test.annotations.DisableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.text.TextUtils; -import androidx.annotation.NonNull; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.launcher3.Flags; -import com.android.launcher3.LauncherAppState; -import com.android.launcher3.LauncherModel; -import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.model.data.PredictedContainerInfo; +import com.android.launcher3.model.BgDataModel.FixedContainerItems; +import com.android.launcher3.model.QuickstepModelDelegate.PredictorState; import com.android.launcher3.util.LauncherLayoutBuilder; -import com.android.launcher3.util.ModelTestExtensions; -import com.android.launcher3.util.SandboxApplication; -import com.android.launcher3.util.rule.LayoutProviderRule; +import com.android.launcher3.util.LauncherModelHelper; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; import com.android.launcher3.widget.PendingAddWidgetInfo; +import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -73,7 +69,6 @@ import org.mockito.junit.MockitoRule; import java.util.Arrays; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; @SmallTest @@ -86,10 +81,6 @@ public final class WidgetsPredicationUpdateTaskTest { @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - @Rule public SandboxApplication mContext = new SandboxApplication().withModelDependency(); - @Rule public LayoutProviderRule mLayoutProvider = new LayoutProviderRule(mContext); - - private AppWidgetProviderInfo mApp1Provider1; private AppWidgetProviderInfo mApp1Provider2; private AppWidgetProviderInfo mApp2Provider1; @@ -100,6 +91,7 @@ public final class WidgetsPredicationUpdateTaskTest { private List allWidgets; private FakeBgDataModelCallback mCallback = new FakeBgDataModelCallback(); + private LauncherModelHelper mModelHelper; private UserHandle mUserHandle; private LauncherApps mLauncherApps; @@ -107,6 +99,7 @@ public final class WidgetsPredicationUpdateTaskTest { @Before public void setup() throws Exception { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_CATEGORIZED_WIDGET_SUGGESTIONS); + mModelHelper = new LauncherModelHelper(); mUserHandle = myUserHandle(); mApp1Provider1 = createAppWidgetProviderInfo( @@ -130,7 +123,7 @@ public final class WidgetsPredicationUpdateTaskTest { allWidgets = Arrays.asList(mApp1Provider1, mApp1Provider2, mApp2Provider1, mApp4Provider1, mApp4Provider2, mApp5Provider1, mApp6PinOnlyProvider1); - mLauncherApps = mContext.spyService(LauncherApps.class); + mLauncherApps = mModelHelper.sandboxContext.spyService(LauncherApps.class); doAnswer(i -> { String pkg = i.getArgument(0); ApplicationInfo applicationInfo = new ApplicationInfo(); @@ -142,7 +135,7 @@ public final class WidgetsPredicationUpdateTaskTest { return applicationInfo; }).when(mLauncherApps).getApplicationInfo(anyString(), anyInt(), any()); - AppWidgetManager manager = mContext.spyService(AppWidgetManager.class); + AppWidgetManager manager = mModelHelper.sandboxContext.spyService(AppWidgetManager.class); doReturn(allWidgets).when(manager).getInstalledProviders(); doReturn(allWidgets).when(manager).getInstalledProvidersForProfile(eq(myUserHandle())); doAnswer(i -> { @@ -155,9 +148,14 @@ public final class WidgetsPredicationUpdateTaskTest { LauncherLayoutBuilder builder = new LauncherLayoutBuilder() .atWorkspace(0, 1, 2).putWidget("app4", "provider1", 1, 1) .atWorkspace(0, 1, 3).putWidget("app5", "provider1", 1, 1); - mLayoutProvider.setupDefaultLayoutProvider(builder); - MAIN_EXECUTOR.submit(() -> getModel().addCallbacks(mCallback)).get(); - ModelTestExtensions.INSTANCE.loadModelSync(getModel()); + mModelHelper.setupDefaultLayoutProvider(builder); + MAIN_EXECUTOR.submit(() -> mModelHelper.getModel().addCallbacks(mCallback)).get(); + mModelHelper.loadModelSync(); + } + + @After + public void tearDown() { + mModelHelper.destroy(); } @Test @@ -177,7 +175,7 @@ public final class WidgetsPredicationUpdateTaskTest { AppTarget app5 = new AppTarget(new AppTargetId("app5"), "app5", "provider1", mUserHandle); mCallback.mRecommendedWidgets = null; - getModel().enqueueModelUpdateTask( + mModelHelper.getModel().enqueueModelUpdateTask( newWidgetsPredicationTask(List.of(app5, app3, app2, app4, app1))); runOnExecutorSync(MAIN_EXECUTOR, () -> { }); @@ -187,8 +185,7 @@ public final class WidgetsPredicationUpdateTaskTest { // 2. app3 doesn't have a widget. // 3. only 1 widget is picked from app1 because we only want to promote one widget // per app. - List recommendedWidgets = mCallback.mRecommendedWidgets - .getContents() + List recommendedWidgets = mCallback.mRecommendedWidgets.items .stream() .map(itemInfo -> (PendingAddWidgetInfo) itemInfo) .collect(Collectors.toList()); @@ -219,13 +216,12 @@ public final class WidgetsPredicationUpdateTaskTest { mUserHandle); mCallback.mRecommendedWidgets = null; - getModel().enqueueModelUpdateTask( + mModelHelper.getModel().enqueueModelUpdateTask( newWidgetsPredicationTask(List.of(widget5, widget3, widget4, widget1))); runOnExecutorSync(MAIN_EXECUTOR, () -> { }); // Only widgets suggested by prediction system are returned. - List recommendedWidgets = mCallback.mRecommendedWidgets - .getContents() + List recommendedWidgets = mCallback.mRecommendedWidgets.items .stream() .map(itemInfo -> (PendingAddWidgetInfo) itemInfo) .collect(Collectors.toList()); @@ -245,13 +241,12 @@ public final class WidgetsPredicationUpdateTaskTest { mUserHandle); mCallback.mRecommendedWidgets = null; - getModel().enqueueModelUpdateTask( + mModelHelper.getModel().enqueueModelUpdateTask( newWidgetsPredicationTask(List.of(widget1, widget6))); runOnExecutorSync(MAIN_EXECUTOR, () -> { }); // Only widget 1 (and no widget 6 as its meant to be hidden from picker). - List recommendedWidgets = mCallback.mRecommendedWidgets - .getContents() + List recommendedWidgets = mCallback.mRecommendedWidgets.items .stream() .map(itemInfo -> (PendingAddWidgetInfo) itemInfo) .collect(Collectors.toList()); @@ -273,22 +268,13 @@ public final class WidgetsPredicationUpdateTaskTest { appTargets); } - private LauncherModel getModel() { - return LauncherAppState.getInstance(mContext).getModel(); - } - private final class FakeBgDataModelCallback implements BgDataModel.Callbacks { - private PredictedContainerInfo mRecommendedWidgets = null; + private FixedContainerItems mRecommendedWidgets = null; @Override - public void bindItemsUpdated(@NonNull Set updates) { - for (ItemInfo update : updates) { - if (update.id == CONTAINER_WIDGETS_PREDICTION - && update instanceof PredictedContainerInfo pci) { - mRecommendedWidgets = pci; - } - } + public void bindExtraContainerItems(FixedContainerItems item) { + mRecommendedWidgets = item; } } } diff --git a/quickstep/tests/src/com/android/launcher3/statehandlers/DepthControllerTest.kt b/quickstep/tests/src/com/android/launcher3/statehandlers/DepthControllerTest.kt index a91ee3a0f4..17cca0b7d9 100644 --- a/quickstep/tests/src/com/android/launcher3/statehandlers/DepthControllerTest.kt +++ b/quickstep/tests/src/com/android/launcher3/statehandlers/DepthControllerTest.kt @@ -17,20 +17,12 @@ package com.android.launcher3.statehandlers import android.content.res.Resources -import android.platform.test.annotations.EnableFlags import android.view.ViewTreeObserver import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import com.android.launcher3.Flags import com.android.launcher3.Launcher -import com.android.launcher3.LauncherState import com.android.launcher3.R import com.android.launcher3.dragndrop.DragLayer -import com.android.launcher3.statemanager.StateManager -import com.android.launcher3.uioverrides.QuickstepLauncher -import java.util.Collections -import junit.framework.TestCase.assertFalse -import junit.framework.TestCase.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -47,8 +39,7 @@ import org.mockito.MockitoAnnotations class DepthControllerTest { private lateinit var underTest: DepthController - @Mock private lateinit var launcher: QuickstepLauncher - @Mock private lateinit var stateManager: StateManager + @Mock private lateinit var launcher: Launcher @Mock private lateinit var resource: Resources @Mock private lateinit var dragLayer: DragLayer @Mock private lateinit var viewTreeObserver: ViewTreeObserver @@ -60,8 +51,6 @@ class DepthControllerTest { `when`(resource.getInteger(R.integer.max_depth_blur_radius)).thenReturn(30) `when`(launcher.dragLayer).thenReturn(dragLayer) `when`(dragLayer.viewTreeObserver).thenReturn(viewTreeObserver) - `when`(launcher.stateManager).thenReturn(stateManager) - `when`(launcher.depthBlurTargets).thenReturn(Collections.emptyList()) underTest = DepthController(launcher) } @@ -113,96 +102,4 @@ class DepthControllerTest { // We should only call addOnDrawListener 1 time verify(viewTreeObserver).addOnDrawListener(same(underTest.mOnDrawListener)) } - - @Test - @EnableFlags(Flags.FLAG_ALL_APPS_BLUR) - fun test_blurWorkspaceDepthTargets() { - // Transitioning to ALL_APPS from any state should blur the workspace depth targets. - - `when`(stateManager.currentStableState).thenReturn(LauncherState.NORMAL) - `when`(stateManager.state).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.state).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.SPRING_LOADED) - `when`(stateManager.state).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.EDIT_MODE) - `when`(stateManager.state).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.BACKGROUND_APP) - `when`(stateManager.state).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - // Returning from ALL_APPS to NORMAL should continue blurring the workspace depth targets. - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.state).thenReturn(LauncherState.NORMAL) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - // Exiting ALL_APPS to other states such as drag-and-drop should not blur the workspace. - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.state).thenReturn(LauncherState.SPRING_LOADED) - assertFalse(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.state).thenReturn(LauncherState.EDIT_MODE) - assertFalse(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.state).thenReturn(LauncherState.OVERVIEW) - assertFalse(underTest.blurWorkspaceDepthTargets()) - } - - @Test - @EnableFlags(Flags.FLAG_ALL_APPS_BLUR) - fun test_blurWorkspaceDepthTargets_withTargetState() { - // Transitioning to ALL_APPS from any state should blur the workspace depth targets. - - `when`(stateManager.currentStableState).thenReturn(LauncherState.NORMAL) - `when`(stateManager.targetState).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.targetState).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.SPRING_LOADED) - `when`(stateManager.targetState).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.EDIT_MODE) - `when`(stateManager.targetState).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.BACKGROUND_APP) - `when`(stateManager.targetState).thenReturn(LauncherState.ALL_APPS) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - // Returning from ALL_APPS to NORMAL should continue blurring the workspace depth targets. - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.targetState).thenReturn(LauncherState.NORMAL) - assertTrue(underTest.blurWorkspaceDepthTargets()) - - // Exiting ALL_APPS to other states such as drag-and-drop should not blur the workspace. - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.targetState).thenReturn(LauncherState.SPRING_LOADED) - assertFalse(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.targetState).thenReturn(LauncherState.EDIT_MODE) - assertFalse(underTest.blurWorkspaceDepthTargets()) - - `when`(stateManager.currentStableState).thenReturn(LauncherState.ALL_APPS) - `when`(stateManager.targetState).thenReturn(LauncherState.OVERVIEW) - assertFalse(underTest.blurWorkspaceDepthTargets()) - } } diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt b/quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt index 0a9ee2c8b6..8f26795045 100644 --- a/quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt +++ b/quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt @@ -1396,23 +1396,6 @@ class BubbleBarViewAnimatorTest { private fun setUpBubbleBar() { bubbleBarView = BubbleBarView(context) - bubbleBarView.setController( - object : BubbleBarView.Controller { - override fun getBubbleBarTranslationY(): Float = 0f - - override fun onBubbleBarTouched() {} - - override fun expandBubbleBar() {} - - override fun dismissBubbleBar() {} - - override fun updateBubbleBarLocation(location: BubbleBarLocation?, source: Int) {} - - override fun setIsDragging(dragging: Boolean) {} - - override fun onBubbleBarExpandedStateChanged(expanded: Boolean) {} - } - ) InstrumentationRegistry.getInstrumentation().runOnMainSync { bubbleBarView.layoutParams = FrameLayout.LayoutParams(0, 0) val inflater = LayoutInflater.from(context) diff --git a/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java b/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java index dc5db4bd59..c215ff2227 100644 --- a/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java +++ b/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java @@ -16,25 +16,20 @@ package com.android.quickstep; -import static com.android.quickstep.fallback.RecentsStateUtilsKt.hasEquivalentRecentsState; -import static com.android.quickstep.fallback.RecentsStateUtilsKt.toLauncherState; - import static org.junit.Assert.assertTrue; import android.os.SystemProperties; -import androidx.annotation.Nullable; import androidx.test.uiautomator.By; import androidx.test.uiautomator.Until; -import com.android.launcher3.LauncherState; import com.android.launcher3.tapl.LaunchedAppState; import com.android.launcher3.tapl.TestHelpers; +import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.util.TestUtil; import com.android.launcher3.util.Wait; -import com.android.launcher3.util.ui.AbstractLauncherUiTest; -import com.android.quickstep.fallback.window.RecentsWindowFlags; +import com.android.quickstep.fallback.RecentsState; import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.views.RecentsView; @@ -48,8 +43,7 @@ import java.util.function.Supplier; /** * Base class for all instrumentation tests that deal with Quickstep. */ -public abstract class AbstractQuickStepTest - extends AbstractLauncherUiTest> { +public abstract class AbstractQuickStepTest extends AbstractLauncherUiTest { public static final boolean ENABLE_SHELL_TRANSITIONS = SystemProperties.getBoolean("persist.wm.debug.shell_transit", true); @Override @@ -62,16 +56,19 @@ public abstract class AbstractQuickStepTest @Override protected void onLauncherActivityClose(QuickstepLauncher launcher) { - super.onLauncherActivityClose(launcher); - if (RecentsWindowFlags.enableLauncherOverviewInWindow) { - executeOnRecentsWindowIfPresent(RecentsWindowManager::cleanupRecentsWindow); - } RecentsView recentsView = launcher.getOverviewPanel(); if (recentsView != null) { recentsView.finishRecentsAnimation(false /* toRecents */, null); } } + // Cannot be used in TaplTests between a Tapl call injecting a gesture and a tapl call + // expecting the results of that gesture because the wait can hide flakeness. + protected void waitForRecentsWindowState(String message, Supplier state) { + waitForRecentsWindowCondition(message, recentsWindow -> + recentsWindow.getStateManager().getCurrentStableState() == state.get()); + } + // Cannot be used in TaplTests after injecting any gesture using Tapl because this can hide // flakiness. protected void waitForRecentsWindowCondition(String @@ -79,6 +76,15 @@ public abstract class AbstractQuickStepTest waitForRecentsWindowCondition(message, condition, TestUtil.DEFAULT_UI_TIMEOUT); } + protected T getFromRecentsWindow(Function f) { + if (!TestHelpers.isInLauncherProcess()) return null; + return getOnUiThread(() -> { + RecentsWindowManager recentsWindowManager = + RecentsWindowManager.getRecentsWindowTracker().getCreatedContext(); + return recentsWindowManager != null ? f.apply(recentsWindowManager) : null; + }); + } + // Cannot be used in TaplTests after injecting any gesture using Tapl because this can hide // flakiness. protected void waitForRecentsWindowCondition( @@ -88,68 +94,10 @@ public abstract class AbstractQuickStepTest Wait.atMost(message, () -> getFromRecentsWindow(condition), mLauncher, timeout); } - protected T getFromRecentsWindowIfPresent(Function f) { - if (!TestHelpers.isInLauncherProcess()) return null; - return getFromRecentsWindow(recentsWindowManager -> - recentsWindowManager == null ? null : f.apply(recentsWindowManager)); - } - - protected T getFromRecentsWindow(Function f) { - if (!TestHelpers.isInLauncherProcess()) return null; - return getOnUiThread(() -> - f.apply(RecentsWindowManager.getRecentsWindowTracker().getCreatedContext())); - } - - protected void executeOnRecentsWindowIfPresent(Consumer f) { - if (!TestHelpers.isInLauncherProcess()) return; - getFromRecentsWindowIfPresent(recentsWindowManager -> { - f.accept(recentsWindowManager); - return null; - }); - } - - @Override - protected boolean isInState(Supplier state) { + protected boolean isInRecentsWindowState(Supplier state) { if (!TestHelpers.isInLauncherProcess()) return true; - if (!RecentsWindowFlags.enableLauncherOverviewInWindow - || !hasEquivalentRecentsState(state.get())) { - return super.isInState(state); - } - return getFromRecentsWindow(recentsWindowManager -> - recentsWindowManager != null && toLauncherState( - recentsWindowManager.getStateManager().getState()) == state.get()); - } - - @Override - protected void waitForState( - boolean forInitialization, String message, Supplier state) { - if (!TestHelpers.isInLauncherProcess()) return; - if (!RecentsWindowFlags.enableLauncherOverviewInWindow - || !hasEquivalentRecentsState(state.get()) - || (forInitialization - && RecentsWindowManager.getRecentsWindowTracker().getCreatedContext() == null)) { - super.waitForState(forInitialization, message, state); - return; - } - waitForRecentsWindowCondition(message, recentsWindowManager -> - recentsWindowManager != null && toLauncherState( - recentsWindowManager.getStateManager().getState()) == state.get()); - } - - @Override - @Nullable - protected RecentsView getOverviewPanel() { - if (!TestHelpers.isInLauncherProcess()) return null; - if (!RecentsWindowFlags.enableLauncherOverviewInWindow) { - return super.getOverviewPanel(); - } - return getFromRecentsWindowIfPresent(RecentsWindowManager::getOverviewPanel); - } - - @Override - protected boolean useNullOverview() { - return super.useNullOverview() - && !RecentsWindowFlags.enableLauncherOverviewInWindow; + return getFromRecentsWindow( + recentsWindow -> recentsWindow.getStateManager().getState() == state.get()); } protected void assertTestActivityIsRunning(int activityNumber, String message) { diff --git a/quickstep/tests/src/com/android/quickstep/AbstractTaplTestsTaskbar.java b/quickstep/tests/src/com/android/quickstep/AbstractTaplTestsTaskbar.java index a3a12bfba0..0ccc76b24e 100644 --- a/quickstep/tests/src/com/android/quickstep/AbstractTaplTestsTaskbar.java +++ b/quickstep/tests/src/com/android/quickstep/AbstractTaplTestsTaskbar.java @@ -24,10 +24,10 @@ import android.content.Intent; import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.tapl.Taskbar; +import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.LauncherLayoutBuilder; import com.android.launcher3.util.TestUtil; -import com.android.launcher3.util.ui.AbstractLauncherUiTest; import org.junit.After; import org.junit.Assume; diff --git a/quickstep/tests/src/com/android/quickstep/AspectRatioSystemShortcutTests.kt b/quickstep/tests/src/com/android/quickstep/AspectRatioSystemShortcutTests.kt index 7d6323cb6e..10e85e6a1b 100644 --- a/quickstep/tests/src/com/android/quickstep/AspectRatioSystemShortcutTests.kt +++ b/quickstep/tests/src/com/android/quickstep/AspectRatioSystemShortcutTests.kt @@ -33,7 +33,6 @@ import android.view.ViewGroup.LayoutParams.MATCH_PARENT import androidx.test.platform.app.InstrumentationRegistry import com.android.launcher3.AbstractFloatingView import com.android.launcher3.AbstractFloatingViewHelper -import com.android.launcher3.Flags.enableRefactorTaskContentView import com.android.launcher3.Flags.enableRefactorTaskThumbnail import com.android.launcher3.InvariantDeviceProfile import com.android.launcher3.R @@ -43,18 +42,15 @@ import com.android.launcher3.logging.StatsLogManager.StatsLogger import com.android.launcher3.model.data.ItemInfo import com.android.launcher3.model.data.TaskViewItemInfo import com.android.launcher3.util.RunnableList -import com.android.launcher3.util.SandboxContext import com.android.launcher3.util.SplitConfigurationOptions import com.android.launcher3.util.TransformingTouchDelegate import com.android.launcher3.util.WindowBounds -import com.android.quickstep.TaskViewTestDIHelpers.initializeRecentsDependencies -import com.android.quickstep.TaskViewTestDIHelpers.mockRecentsModel import com.android.quickstep.orientation.LandscapePagedViewHandler +import com.android.quickstep.recents.data.RecentsDeviceProfileRepository +import com.android.quickstep.recents.data.RecentsRotationStateRepository import com.android.quickstep.recents.di.RecentsDependencies -import com.android.quickstep.task.thumbnail.TaskContentView import com.android.quickstep.task.thumbnail.TaskThumbnailView import com.android.quickstep.util.RecentsOrientedState -import com.android.quickstep.util.SingleTask import com.android.quickstep.views.LauncherRecentsView import com.android.quickstep.views.RecentsViewContainer import com.android.quickstep.views.TaskContainer @@ -63,6 +59,7 @@ import com.android.quickstep.views.TaskView import com.android.quickstep.views.TaskViewIcon import com.android.systemui.shared.recents.model.Task import com.android.systemui.shared.recents.model.Task.TaskKey +import com.android.window.flags.Flags import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before @@ -70,6 +67,7 @@ import org.junit.Rule import org.junit.Test import org.mockito.Mockito import org.mockito.Mockito.eq +import org.mockito.Mockito.isNull import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doReturn @@ -85,7 +83,6 @@ class AspectRatioSystemShortcutTests { /** Spy on a concrete Context so we can reference real View, Layout, and Display properties. */ private val context: Context = spy(InstrumentationRegistry.getInstrumentation().targetContext) - private val applicationContext = SandboxContext(context) /** * RecentsViewContainer and its super-interface ActivityContext contain methods to convert @@ -126,7 +123,9 @@ class AspectRatioSystemShortcutTests { private val statsLogger = mock() private val orientedState: RecentsOrientedState = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) - private lateinit var taskView: TaskView + private val taskView: TaskView = + LayoutInflater.from(context).cloneInContext(launcher).inflate(R.layout.task, null) as + TaskView @Before fun setUp() { @@ -137,17 +136,22 @@ class AspectRatioSystemShortcutTests { whenever(statsLogger.withItemInfo(any())).thenReturn(statsLogger) whenever(orientedState.orientationHandler).thenReturn(LandscapePagedViewHandler()) + taskView.setLayoutParams(ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)) if (enableRefactorTaskThumbnail()) { - applicationContext.initDaggerComponent( - DaggerTaskViewTestComponent.builder().bindRecentsModel(mockRecentsModel()) + val recentsDependencies = RecentsDependencies.maybeInitialize(launcher) + val scopeId = recentsDependencies.createRecentsViewScope(launcher) + recentsDependencies.provide( + RecentsRotationStateRepository::class.java, + scopeId, + { mock() } + ) + recentsDependencies.provide( + RecentsDeviceProfileRepository::class.java, + scopeId, + { mock() } ) - initializeRecentsDependencies(launcher) } - taskView = - LayoutInflater.from(context).cloneInContext(launcher).inflate(R.layout.task, null) - as TaskView - taskView.setLayoutParams(ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)) } @After @@ -161,14 +165,14 @@ class AspectRatioSystemShortcutTests { * When the corresponding feature flag is off, there will not be an option to open aspect ratio * settings. */ - @DisableFlags(com.android.window.flags2.Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT) + @DisableFlags(com.android.window.flags.Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT) @Test fun createShortcut_flaggedOff_notCreated() { val task = createTask() val taskContainer = createTaskContainer(task) setScreenSizeDp(widthDp = 1200, heightDp = 800) - taskView.bind(SingleTask(task), orientedState, taskOverlayFactory) + taskView.bind(task, orientedState, taskOverlayFactory) assertThat(factory.getShortcuts(launcher, taskContainer)).isNull() } @@ -177,14 +181,14 @@ class AspectRatioSystemShortcutTests { * When the screen doesn't meet or exceed sw600dp (eg. phone, watch), there will not be an * option to open aspect ratio settings. */ - @EnableFlags(com.android.window.flags2.Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT) + @EnableFlags(com.android.window.flags.Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT) @Test fun createShortcut_sw599dp_notCreated() { val task = createTask() val taskContainer = createTaskContainer(task) setScreenSizeDp(widthDp = 599, heightDp = 599) - taskView.bind(SingleTask(task), orientedState, taskOverlayFactory) + taskView.bind(task, orientedState, taskOverlayFactory) assertThat(factory.getShortcuts(launcher, taskContainer)).isNull() } @@ -193,7 +197,7 @@ class AspectRatioSystemShortcutTests { * When the screen does meet or exceed sw600dp (eg. tablet, inner foldable screen, home cinema) * there will be an option to open aspect ratio settings. */ - @EnableFlags(com.android.window.flags2.Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT) + @EnableFlags(com.android.window.flags.Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT) @Test fun createShortcut_sw800dp_created_andOpensSettings() { val task = createTask() @@ -202,7 +206,7 @@ class AspectRatioSystemShortcutTests { doReturn(taskViewItemInfo).whenever(taskContainer).itemInfo setScreenSizeDp(widthDp = 1200, heightDp = 800) - taskView.bind(SingleTask(task), orientedState, taskOverlayFactory) + taskView.bind(task, orientedState, taskOverlayFactory) val shortcuts = factory.getShortcuts(launcher, taskContainer) assertThat(shortcuts).hasSize(1) @@ -269,11 +273,6 @@ class AspectRatioSystemShortcutTests { TaskContainer( taskView, task, - when { - enableRefactorTaskContentView() -> mock() - enableRefactorTaskThumbnail() -> mock() - else -> mock() - }, if (enableRefactorTaskThumbnail()) mock() else mock(), mock(), diff --git a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt index 3e8e0717d9..8a2393d539 100644 --- a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt +++ b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt @@ -16,9 +16,11 @@ package com.android.quickstep +import android.Manifest.permission.SYSTEM_ALERT_WINDOW import android.content.ComponentName import android.content.Context import android.content.Intent +import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags @@ -30,8 +32,6 @@ import com.android.dx.mockito.inline.extended.StaticMockitoSession import com.android.internal.R import com.android.launcher3.AbstractFloatingView import com.android.launcher3.AbstractFloatingViewHelper -import com.android.launcher3.Flags -import com.android.launcher3.Flags.enableRefactorTaskContentView import com.android.launcher3.Flags.enableRefactorTaskThumbnail import com.android.launcher3.logging.StatsLogManager import com.android.launcher3.logging.StatsLogManager.LauncherEvent @@ -39,7 +39,6 @@ import com.android.launcher3.model.data.TaskViewItemInfo import com.android.launcher3.util.SplitConfigurationOptions import com.android.launcher3.util.TransformingTouchDelegate import com.android.quickstep.TaskOverlayFactory.TaskOverlay -import com.android.quickstep.task.thumbnail.TaskContentView import com.android.quickstep.task.thumbnail.TaskThumbnailView import com.android.quickstep.views.LauncherRecentsView import com.android.quickstep.views.RecentsViewContainer @@ -50,16 +49,16 @@ import com.android.quickstep.views.TaskViewIcon import com.android.quickstep.views.TaskViewType import com.android.systemui.shared.recents.model.Task import com.android.systemui.shared.recents.model.Task.TaskKey -import com.android.window.flags2.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY +import com.android.window.flags.Flags import com.android.wm.shell.shared.desktopmode.DesktopModeStatus import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource import com.google.common.truth.Truth.assertThat -import kotlin.test.assertIs -import kotlin.test.assertNotNull import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.ArgumentMatchers.anyString import org.mockito.Mockito.`when` import org.mockito.kotlin.any import org.mockito.kotlin.doReturn @@ -98,7 +97,6 @@ class DesktopSystemShortcutTest { .startMocking() whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true) whenever(overlayFactory.createOverlay(any())).thenReturn(mock>()) - doReturn(DEFAULT_DISPLAY).whenever(context).displayId whenever(launcher.asContext()).thenReturn(context) } @@ -118,29 +116,8 @@ class DesktopSystemShortcutTest { } @Test - @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) - fun createDesktopTaskShortcutFactory_noDisplayActivity() { - val baseComponent = ComponentName("", /* class */ "") - val taskKey = - TaskKey( - /* id */ 1, - /* windowingMode */ 0, - Intent(), - baseComponent, - /* userId */ 0, - /* lastActiveTime */ 2000, - DEFAULT_DISPLAY, - baseComponent, - /* numActivities */ 1, - /* isTopActivityNoDisplay */ true, - /* isActivityStackTransparent */ false, - ) - val taskContainer = createTaskContainer(Task(taskKey)) - val shortcuts = factory.getShortcuts(launcher, taskContainer) - } - - @Test - @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) + @DisableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION) fun createDesktopTaskShortcutFactory_transparentTask() { val baseComponent = ComponentName("", /* class */ "") val taskKey = @@ -163,7 +140,65 @@ class DesktopSystemShortcutTest { } @Test - @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) + @EnableFlags( + Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY, + Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION, + ) + fun createDesktopTaskShortcutFactoryPermissionEnabledAllowed_transparentTask() { + val packageManager: PackageManager = mock() + setUpTransparentPermission(packageManager, isAllowed = true) + val baseComponent = ComponentName("", /* class */ "") + val taskKey = + TaskKey( + /* id */ 1, + /* windowingMode */ 0, + Intent(), + baseComponent, + /* userId */ 0, + /* lastActiveTime */ 2000, + DEFAULT_DISPLAY, + baseComponent, + /* numActivities */ 1, + /* isTopActivityNoDisplay */ false, + /* isActivityStackTransparent */ true, + ) + val taskContainer = createTaskContainer(Task(taskKey)) + val shortcuts = factory.getShortcuts(launcher, taskContainer) + assertThat(shortcuts).isNull() + } + + @Test + @EnableFlags( + Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY, + Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION, + ) + fun createDesktopTaskShortcutFactoryPermissionEnabledNotAllowed_transparentTask() { + val packageManager: PackageManager = mock() + setUpTransparentPermission(packageManager, isAllowed = false) + val baseComponent = ComponentName("", /* class */ "") + val homeActivities = ComponentName("defaultHomePackage", /* class */ "") + whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities) + val taskKey = + TaskKey( + /* id */ 1, + /* windowingMode */ 0, + Intent(), + baseComponent, + /* userId */ 0, + /* lastActiveTime */ 2000, + DEFAULT_DISPLAY, + baseComponent, + /* numActivities */ 1, + /* isTopActivityNoDisplay */ false, + /* isActivityStackTransparent */ true, + ) + val taskContainer = createTaskContainer(Task(taskKey).apply { isDockable = true }) + val shortcuts = factory.getShortcuts(launcher, taskContainer) + assertThat(shortcuts).isNotEmpty() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) fun createDesktopTaskShortcutFactory_systemUiTask() { val sysUiPackageName: String = context.resources.getString(R.string.config_systemUi) val baseComponent = ComponentName(sysUiPackageName, /* class */ "") @@ -187,7 +222,7 @@ class DesktopSystemShortcutTest { } @Test - @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) fun createDesktopTaskShortcutFactory_defaultHomeTask() { val packageManager: PackageManager = mock() whenever(context.packageManager).thenReturn(packageManager) @@ -222,11 +257,10 @@ class DesktopSystemShortcutTest { } @Test - fun desktopSystemShortcutClickedWithoutDesktopModeOnDisplay() { + fun desktopSystemShortcutClicked() { val task = createTask() val taskContainer = spy(createTaskContainer(task)) - whenever(DesktopModeStatus.isDesktopModeSupportedOnDisplay(any(), any())).thenReturn(false) whenever(launcher.getOverviewPanel()).thenReturn(recentsView) whenever(launcher.statsLogManager).thenReturn(statsLogManager) whenever(statsLogManager.logger()).thenReturn(statsLogger) @@ -240,29 +274,10 @@ class DesktopSystemShortcutTest { doReturn(taskViewItemInfo).whenever(taskContainer).itemInfo val shortcuts = factory.getShortcuts(launcher, taskContainer) - assertThat(shortcuts).isNull() - } + assertThat(shortcuts).isNotNull() + assertThat(shortcuts!!.single()).isInstanceOf(DesktopSystemShortcut::class.java) - @Test - fun desktopSystemShortcutClickedWithDesktopModeOnDisplay() { - val task = createTask() - val taskContainer = spy(createTaskContainer(task)) - - whenever(DesktopModeStatus.isDesktopModeSupportedOnDisplay(any(), any())).thenReturn(true) - whenever(launcher.getOverviewPanel()).thenReturn(recentsView) - whenever(launcher.statsLogManager).thenReturn(statsLogManager) - whenever(statsLogManager.logger()).thenReturn(statsLogger) - whenever(statsLogger.withItemInfo(any())).thenReturn(statsLogger) - whenever(taskView.context).thenReturn(context) - whenever(recentsView.moveTaskToDesktop(any(), any(), any())).thenAnswer { - val successCallback = it.getArgument(2) - successCallback.run() - } - val taskViewItemInfo = mock() - doReturn(taskViewItemInfo).whenever(taskContainer).itemInfo - - val shortcuts = assertNotNull(factory.getShortcuts(launcher, taskContainer)) - val desktopShortcut = assertIs(shortcuts.single()) + val desktopShortcut = shortcuts.single() as DesktopSystemShortcut desktopShortcut.onClick(taskView) @@ -279,20 +294,7 @@ class DesktopSystemShortcutTest { verify(statsLogger).log(LauncherEvent.LAUNCHER_SYSTEM_SHORTCUT_DESKTOP_TAP) } - @Test - @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_MENU_ON_SECONDARY_DISPLAY_BUGFIX) - fun createDesktopTaskShortcutFactoryOnSecondaryDisplayWithoutFlag() { - `when`(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true) - `when`(DesktopModeStatus.isDesktopModeSupportedOnDisplay(any(), any())).thenReturn(true) - doReturn(SECONDARY_DISPLAY).whenever(context).displayId - - val taskContainer = createTaskContainer(createTask(displayId = SECONDARY_DISPLAY)) - - val shortcuts = factory.getShortcuts(launcher, taskContainer) - assertThat(shortcuts).isNull() - } - - private fun createTask(displayId: Int = DEFAULT_DISPLAY) = + private fun createTask() = Task( TaskKey( /* id */ 1, @@ -301,7 +303,7 @@ class DesktopSystemShortcutTest { ComponentName("", ""), /* userId */ 0, /* lastActiveTime */ 2000, - displayId, + DEFAULT_DISPLAY, ComponentName("", ""), /* numActivities */ 1, /* isTopActivityNoDisplay */ false, @@ -314,11 +316,6 @@ class DesktopSystemShortcutTest { TaskContainer( taskView, task, - when { - enableRefactorTaskContentView() -> mock() - enableRefactorTaskThumbnail() -> mock() - else -> mock() - }, if (enableRefactorTaskThumbnail()) mock() else mock(), mock(), @@ -329,14 +326,26 @@ class DesktopSystemShortcutTest { overlayFactory, ) + private fun setUpTransparentPermission(packageManager: PackageManager, isAllowed: Boolean) { + val packageInfo: PackageInfo = mock() + if (isAllowed) { + packageInfo.requestedPermissions = arrayOf(SYSTEM_ALERT_WINDOW) + } + whenever(context.packageManager).thenReturn(packageManager) + whenever( + packageManager.getPackageInfoAsUser( + anyString(), + eq(PackageManager.GET_PERMISSIONS), + anyInt(), + ) + ) + .thenReturn(packageInfo) + } + private fun createTaskViewMock(): TaskView { val taskView: TaskView = mock() whenever(taskView.type).thenReturn(TaskViewType.SINGLE) whenever(taskView.context).thenReturn(context) return taskView } - - private companion object { - const val SECONDARY_DISPLAY = 13 - } } diff --git a/quickstep/tests/src/com/android/quickstep/DigitalWellBeingToastTest.java b/quickstep/tests/src/com/android/quickstep/DigitalWellBeingToastTest.java index fb3d7d6b19..07d8f61992 100644 --- a/quickstep/tests/src/com/android/quickstep/DigitalWellBeingToastTest.java +++ b/quickstep/tests/src/com/android/quickstep/DigitalWellBeingToastTest.java @@ -15,33 +15,24 @@ */ package com.android.quickstep; -import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; - -import static com.android.launcher3.util.TestUtil.resolveSystemAppInfo; +import static androidx.test.InstrumentationRegistry.getInstrumentation; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import android.app.PendingIntent; import android.app.usage.UsageStatsManager; import android.content.Intent; -import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherState; -import com.android.launcher3.uioverrides.QuickstepLauncher; -import com.android.launcher3.util.BaseLauncherActivityTest; -import com.android.launcher3.util.rule.ScreenRecordRule; import com.android.quickstep.views.DigitalWellBeingToast; import com.android.quickstep.views.RecentsView; -import com.android.quickstep.views.TaskContainer; import com.android.quickstep.views.TaskView; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -49,50 +40,41 @@ import java.time.Duration; @LargeTest @RunWith(AndroidJUnit4.class) -public class DigitalWellBeingToastTest extends BaseLauncherActivityTest { - - @Rule - public ScreenRecordRule mScreenRecordRule = new ScreenRecordRule(); - - - public final String calculatorPackage = - resolveSystemAppInfo(Intent.CATEGORY_APP_CALCULATOR).packageName; +public class TaplDigitalWellBeingToastTest extends AbstractQuickStepTest { + private static final String CALCULATOR_PACKAGE = + resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR); @Test - public void testToast() { - startAppFast(calculatorPackage); + public void testToast() throws Exception { + startAppFast(CALCULATOR_PACKAGE); final UsageStatsManager usageStatsManager = - targetContext().getSystemService(UsageStatsManager.class); + mTargetContext.getSystemService(UsageStatsManager.class); final int observerId = 0; try { - final String[] packages = new String[]{calculatorPackage}; + final String[] packages = new String[]{CALCULATOR_PACKAGE}; // Set time limit for app. runWithShellPermission(() -> usageStatsManager.registerAppUsageLimitObserver(observerId, packages, Duration.ofSeconds(600), Duration.ofSeconds(300), - PendingIntent.getActivity(targetContext(), -1, new Intent() - .setPackage(targetContext().getPackageName()), + PendingIntent.getActivity(mTargetContext, -1, new Intent() + .setPackage(mTargetContext.getPackageName()), PendingIntent.FLAG_MUTABLE))); - // b/324261526 when removing BaseLauncherActivityTest we should be able to tell test - // by test test if they should start the activity from the start or wait, and that - // should get rid of this. - getLauncherActivity().close(); - loadLauncherSync(); + mLauncher.goHome(); final DigitalWellBeingToast toast = getToast(); - waitForLauncherCondition("Toast is not visible", launcher -> toast.getHasLimit()); - assertEquals("Toast text: ", "5 minutes left today", toast.getBannerText()); + waitForLauncherCondition("Toast is not visible", launcher -> toast.hasLimit()); + assertEquals("Toast text: ", "5 minutes left today", toast.getText()); // Unset time limit for app. runWithShellPermission( () -> usageStatsManager.unregisterAppUsageLimitObserver(observerId)); - getLauncherActivity().goToState(LauncherState.NORMAL); - assertFalse("Toast is visible", getToast().getHasLimit()); + mLauncher.goHome(); + assertFalse("Toast is visible", getToast().hasLimit()); } finally { runWithShellPermission( () -> usageStatsManager.unregisterAppUsageLimitObserver(observerId)); @@ -100,23 +82,19 @@ public class DigitalWellBeingToastTest extends BaseLauncherActivityTest getLatestTask(launcher) - ); + mLauncher.getWorkspace().switchToOverview(); + final TaskView task = getOnceNotNull("No latest task", launcher -> getLatestTask(launcher)); - return getLauncherActivity().getFromLauncher(launcher -> { - TaskContainer taskContainer = task.getFirstTaskContainer(); - assertNotNull(taskContainer); - assertTrue("Latest task is not Calculator", calculatorPackage.equals( + return getFromLauncher(launcher -> { + TaskView.TaskContainer taskContainer = task.getTaskContainers().get(0); + assertTrue("Latest task is not Calculator", CALCULATOR_PACKAGE.equals( taskContainer.getTask().getTopComponent().getPackageName())); return taskContainer.getDigitalWellBeingToast(); }); } private TaskView getLatestTask(Launcher launcher) { - return launcher.getOverviewPanel().getFirstTaskView(); + return launcher.getOverviewPanel().getTaskViewAt(0); } private void runWithShellPermission(Runnable action) { @@ -126,5 +104,6 @@ public class DigitalWellBeingToastTest extends BaseLauncherActivityTest mock() - enableRefactorTaskThumbnail() -> mock() - else -> mock() - }, if (enableRefactorTaskThumbnail()) mock() else mock(), mock(), diff --git a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java index 2485208e83..a4c9ef2d5c 100644 --- a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java +++ b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java @@ -16,21 +16,21 @@ package com.android.quickstep; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; -import static android.view.Display.DEFAULT_DISPLAY; import static androidx.test.InstrumentationRegistry.getInstrumentation; +import static com.android.launcher3.Flags.enableFallbackOverviewInWindow; import static com.android.launcher3.tapl.LauncherInstrumentation.WAIT_TIME_MS; import static com.android.launcher3.tapl.TestHelpers.getHomeIntentInPackage; import static com.android.launcher3.tapl.TestHelpers.getLauncherInMyProcess; +import static com.android.launcher3.ui.AbstractLauncherUiTest.DEFAULT_BROADCAST_TIMEOUT_SECS; +import static com.android.launcher3.ui.AbstractLauncherUiTest.resolveSystemApp; +import static com.android.launcher3.ui.AbstractLauncherUiTest.startAppFast; +import static com.android.launcher3.ui.AbstractLauncherUiTest.startTestActivity; import static com.android.launcher3.ui.TaplTestsLauncher3Test.getAppPackageName; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.rule.ShellCommandRule.disableHeadsUpNotification; import static com.android.launcher3.util.rule.ShellCommandRule.getLauncherCommand; -import static com.android.launcher3.util.ui.AbstractLauncherUiTest.DEFAULT_BROADCAST_TIMEOUT_SECS; -import static com.android.launcher3.util.ui.AbstractLauncherUiTest.resolveSystemApp; -import static com.android.launcher3.util.ui.AbstractLauncherUiTest.startAppFast; -import static com.android.launcher3.util.ui.AbstractLauncherUiTest.startTestActivity; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -41,7 +41,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.RemoteException; -import android.platform.test.rule.ExtendedLongPressTimeoutRule; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; @@ -55,17 +54,17 @@ import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.tapl.OverviewTask; import com.android.launcher3.tapl.TestHelpers; import com.android.launcher3.testcomponent.TestCommandReceiver; +import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.util.TestUtil; import com.android.launcher3.util.Wait; +import com.android.launcher3.util.rule.ExtendedLongPressTimeoutRule; import com.android.launcher3.util.rule.FailureWatcher; import com.android.launcher3.util.rule.SamplerRule; import com.android.launcher3.util.rule.ScreenRecordRule; -import com.android.launcher3.util.rule.SkipAfterTimeOutRule; import com.android.launcher3.util.rule.TestIsolationRule; import com.android.launcher3.util.rule.TestStabilityRule; -import com.android.launcher3.util.ui.AbstractLauncherUiTest; +import com.android.launcher3.util.rule.ViewCaptureRule; import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener; -import com.android.quickstep.fallback.window.RecentsWindowFlags; import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.RecentsViewContainer; @@ -111,9 +110,6 @@ public class FallbackRecentsTest { @Rule public ExtendedLongPressTimeoutRule mLongPressTimeoutRule = new ExtendedLongPressTimeoutRule(); - @Rule(order = -1000) // This should be the outermost rule - public SkipAfterTimeOutRule mSkipAfterTimeOutRule = new SkipAfterTimeOutRule(); - public FallbackRecentsTest() throws RemoteException { Instrumentation instrumentation = getInstrumentation(); Context context = instrumentation.getContext(); @@ -136,7 +132,6 @@ public class FallbackRecentsTest { getLauncherCommand(mOtherLauncherActivity)); updateHandler.mChangeCounter .await(DEFAULT_BROADCAST_TIMEOUT_SECS, TimeUnit.SECONDS); - mLauncher.setTestLauncherPackage(mOtherLauncherActivity.packageName); try { base.evaluate(); } finally { @@ -144,17 +139,19 @@ public class FallbackRecentsTest { TestCommandReceiver.callCommand(TestCommandReceiver.DISABLE_TEST_LAUNCHER); UiDevice.getInstance(getInstrumentation()).executeShellCommand( getLauncherCommand(getLauncherInMyProcess())); - mLauncher.setTestLauncherPackage(null); pressHomeAndWaitForOverviewClose(); } } }; + final ViewCaptureRule viewCaptureRule = new ViewCaptureRule( + RecentsActivity.ACTIVITY_TRACKER::getCreatedContext); mOrderSensitiveRules = RuleChain .outerRule(new SamplerRule()) .around(new TestStabilityRule()) .around(new NavigationModeSwitchRule(mLauncher)) - .around(new FailureWatcher(mLauncher)) + .around(new FailureWatcher(mLauncher, viewCaptureRule::getViewCaptureData)) + // .around(viewCaptureRule) b/315482167 .around(new TestIsolationRule(mLauncher, false)) .around(setLauncherCommand); @@ -214,10 +211,9 @@ public class FallbackRecentsTest { if (!TestHelpers.isInLauncherProcess()) return null; Object[] result = new Object[1]; Wait.atMost("Failed to get from recents", () -> MAIN_EXECUTOR.submit(() -> { - RecentsViewContainer recentsViewContainer = - RecentsWindowFlags.enableFallbackOverviewInWindow.isTrue() - ? RecentsWindowManager.getRecentsWindowTracker().getCreatedContext() - : RecentsActivity.ACTIVITY_TRACKER.getCreatedContext(); + RecentsViewContainer recentsViewContainer = enableFallbackOverviewInWindow() + ? RecentsWindowManager.getRecentsWindowTracker().getCreatedContext() + : RecentsActivity.ACTIVITY_TRACKER.getCreatedContext(); if (recentsViewContainer == null) { return false; } @@ -240,10 +236,9 @@ public class FallbackRecentsTest { private void waitForRecentsClosed() { try { final boolean isRecentsContainerNUll = MAIN_EXECUTOR.submit(() -> { - RecentsViewContainer recentsViewContainer = - RecentsWindowFlags.enableFallbackOverviewInWindow.isTrue() - ? RecentsWindowManager.getRecentsWindowTracker().getCreatedContext() - : RecentsActivity.ACTIVITY_TRACKER.getCreatedContext(); + RecentsViewContainer recentsViewContainer = enableFallbackOverviewInWindow() + ? RecentsWindowManager.getRecentsWindowTracker().getCreatedContext() + : RecentsActivity.ACTIVITY_TRACKER.getCreatedContext(); return recentsViewContainer == null; }).get(); @@ -345,7 +340,7 @@ public class FallbackRecentsTest { Context ctx = getInstrumentation().getTargetContext(); mObserver = OverviewComponentObserver.INSTANCE.get(ctx); mChangeCounter = new CountDownLatch(1); - if (mObserver.getHomeIntent(DEFAULT_DISPLAY).getComponent() + if (mObserver.getHomeIntent().getComponent() .getPackageName().equals(mOtherLauncherActivity.packageName)) { // Home already same mChangeCounter.countDown(); diff --git a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java index bc34471acf..655560c0a6 100644 --- a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java +++ b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java @@ -55,7 +55,6 @@ import com.android.launcher3.taskbar.bubbles.BubbleDismissController; import com.android.launcher3.taskbar.bubbles.BubbleDragController; import com.android.launcher3.taskbar.bubbles.BubblePinController; import com.android.launcher3.taskbar.bubbles.BubbleStashedHandleViewController; -import com.android.launcher3.taskbar.bubbles.DragToBubbleController; import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController; import com.android.launcher3.util.LockedUserState; import com.android.launcher3.util.SandboxApplication; @@ -114,7 +113,6 @@ public class InputConsumerUtilsTest { @NonNull @Mock private TaskbarActivityContext mTaskbarActivityContext; @NonNull @Mock private OverviewComponentObserver mOverviewComponentObserver; @NonNull @Mock private RecentsAnimationDeviceState mDeviceState; - @NonNull @Mock private RotationTouchHelper mRotationTouchHelper; @NonNull @Mock private AbsSwipeUpHandler.Factory mSwipeUpHandlerFactory; @NonNull @Mock private TaskbarManager mTaskbarManager; @NonNull @Mock private OverviewCommandHelper mOverviewCommandHelper; @@ -130,7 +128,7 @@ public class InputConsumerUtilsTest { @Before public void setupTaskAnimationManager() { - mTaskAnimationManager = new TaskAnimationManager(mContext, mDisplayId); + mTaskAnimationManager = new TaskAnimationManager(mContext, mDeviceState, mDisplayId); } @Before @@ -138,7 +136,8 @@ public class InputConsumerUtilsTest { mContext.initDaggerComponent(DaggerInputConsumerUtilsTest_TestComponent .builder() .bindLockedState(mLockedUserState) - ); + .bindRotationHelper(mock(RotationTouchHelper.class)) + .bindRecentsState(mDeviceState)); } @Before @@ -202,10 +201,8 @@ public class InputConsumerUtilsTest { @After public void cleanUp() { - runOnMainSync(() -> { - mInputMonitorCompat.dispose(); - mInputEventReceiver.dispose(); - }); + mInputMonitorCompat.dispose(); + mInputEventReceiver.dispose(); } @Test @@ -298,8 +295,7 @@ public class InputConsumerUtilsTest { @Test public void testNewBaseConsumer_launcherChildActivityResumed_returnsDefaultInputConsumer() { when(mRunningTask.isHomeTask()).thenReturn(true); - when(mOverviewComponentObserver.isHomeAndOverviewSame()).thenReturn(true); - when(mContainerInterface.isLauncherOverlayShowing()).thenReturn(true); + when(mOverviewComponentObserver.isHomeAndOverviewSameActivity()).thenReturn(true); assertEqualsDefaultInputConsumer(this::createBaseInputConsumer); } @@ -506,8 +502,7 @@ public class InputConsumerUtilsTest { mTaskbarManager, mSwipeUpProxyProvider, mOverviewCommandHelper, - event, - mRotationTouchHelper); + event); event.recycle(); @@ -530,8 +525,7 @@ public class InputConsumerUtilsTest { otherActivityInputConsumer -> {}, mInputEventReceiver, event, - ActiveGestureLog.CompoundString.NO_OP, - mRotationTouchHelper); + ActiveGestureLog.CompoundString.NO_OP); event.recycle(); @@ -603,7 +597,6 @@ public class InputConsumerUtilsTest { BubbleBarPinController bubbleBarPinController = mock(BubbleBarPinController.class); BubblePinController bubblePinController = mock(BubblePinController.class); BubbleBarSwipeController bubbleBarSwipeController = mock(BubbleBarSwipeController.class); - DragToBubbleController dragToBubbleController = mock(DragToBubbleController.class); BubbleCreator bubbleCreator = mock(BubbleCreator.class); BubbleControllers bubbleControllers = new BubbleControllers( bubbleBarController, @@ -615,7 +608,6 @@ public class InputConsumerUtilsTest { bubbleBarPinController, bubblePinController, Optional.of(bubbleBarSwipeController), - dragToBubbleController, bubbleCreator); when(bubbleBarViewController.hasBubbles()).thenReturn(true); @@ -633,6 +625,8 @@ public class InputConsumerUtilsTest { @Component.Builder interface Builder extends LauncherAppComponent.Builder { @BindsInstance Builder bindLockedState(LockedUserState state); + @BindsInstance Builder bindRotationHelper(RotationTouchHelper helper); + @BindsInstance Builder bindRecentsState(RecentsAnimationDeviceState state); @Override TestComponent build(); diff --git a/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java b/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java index 212f933798..c713c3dc9a 100644 --- a/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java +++ b/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java @@ -33,10 +33,10 @@ import androidx.test.uiautomator.UiDevice; import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.tapl.TestHelpers; +import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.Wait; import com.android.launcher3.util.rule.FailureWatcher; -import com.android.launcher3.util.ui.AbstractLauncherUiTest; import com.android.systemui.shared.system.QuickStepContract; import org.junit.rules.TestRule; @@ -205,16 +205,12 @@ public class NavigationModeSwitchRule implements TestRule { private static void assertTrue(LauncherInstrumentation launcher, String message, boolean condition, Description description) { - try { - launcher.checkForAnomaly(true, true); - if (!condition) { - throw new AssertionError(message); - } - } catch (Throwable e) { + launcher.checkForAnomaly(true, true); + if (!condition) { if (description != null) { FailureWatcher.onError(launcher, description); } - throw e; + throw new AssertionError(message); } } } diff --git a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java index cd8dd6e00c..154d86d977 100644 --- a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java +++ b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java @@ -339,8 +339,7 @@ public class OrientationTouchTransformerTest { ArrayMap> internalDisplayBounds = new ArrayMap<>(); doReturn(internalDisplayBounds).when(wmProxy).estimateInternalDisplayBounds(any()); return new DisplayController.Info( - getApplicationContext(), false, wmProxy, new ArrayMap<>(), - DisplayMetrics.DENSITY_DEFAULT); + getApplicationContext(), wmProxy, new ArrayMap<>()); } private float generateTouchRegionHeight(Size screenSize, int rotation) { diff --git a/quickstep/tests/src/com/android/quickstep/TaplOverviewIconTest.java b/quickstep/tests/src/com/android/quickstep/TaplOverviewIconTest.java index 7aa4fb65f9..2c275f45ee 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplOverviewIconTest.java +++ b/quickstep/tests/src/com/android/quickstep/TaplOverviewIconTest.java @@ -24,6 +24,8 @@ import android.platform.test.annotations.PlatinumTest; import com.android.launcher3.tapl.Overview; import com.android.launcher3.tapl.OverviewTask.OverviewTaskContainer; import com.android.launcher3.tapl.OverviewTaskMenu; +import com.android.launcher3.ui.AbstractLauncherUiTest; +import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.quickstep.util.SplitScreenTestUtils; import org.junit.Test; @@ -32,7 +34,7 @@ import org.junit.Test; * This test run in both Out of process (Oop) and in-process (Ipc). * Tests the app Icon in overview. */ -public class TaplOverviewIconTest extends AbstractQuickStepTest { +public class TaplOverviewIconTest extends AbstractLauncherUiTest { private static final String CALCULATOR_APP_PACKAGE = resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR); diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java b/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java index 210c94d8c6..3c4f1d9c6c 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java @@ -16,13 +16,11 @@ package com.android.quickstep; import android.content.Intent; -import android.platform.test.annotations.DisableFlags; import androidx.annotation.NonNull; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import com.android.launcher3.Flags; import com.android.launcher3.tapl.KeyboardQuickSwitch; import com.android.launcher3.taskbar.KeyboardQuickSwitchController; @@ -88,7 +86,6 @@ public class TaplTestsKeyboardQuickSwitch extends AbstractQuickStepTest { } @Test - @DisableFlags(value = Flags.FLAG_ENABLE_WIDGET_PICKER_REFACTOR) public void testDismiss_fromWidgets() { runTest(TestSurface.WIDGETS, TestCase.DISMISS); } @@ -109,7 +106,6 @@ public class TaplTestsKeyboardQuickSwitch extends AbstractQuickStepTest { } @Test - @DisableFlags(value = Flags.FLAG_ENABLE_WIDGET_PICKER_REFACTOR) public void testLaunchLastTask_fromWidgets() { runTest(TestSurface.WIDGETS, TestCase.LAUNCH_LAST_APP); } @@ -130,7 +126,6 @@ public class TaplTestsKeyboardQuickSwitch extends AbstractQuickStepTest { } @Test - @DisableFlags(value = Flags.FLAG_ENABLE_WIDGET_PICKER_REFACTOR) public void testLaunchSelectedTask_fromWidgets() { runTest(TestSurface.WIDGETS, TestCase.LAUNCH_SELECTED_APP); } @@ -151,14 +146,13 @@ public class TaplTestsKeyboardQuickSwitch extends AbstractQuickStepTest { } @Test - @DisableFlags(value = Flags.FLAG_ENABLE_WIDGET_PICKER_REFACTOR) public void testLaunchOverviewTask_fromWidgets() { runTest(TestSurface.WIDGETS, TestCase.LAUNCH_OVERVIEW); } @Test public void testLaunchSingleRecentTask() { - clearAllRecentTasks(); + mLauncher.getLaunchedAppState().switchToOverview().dismissAllTasks(); startAppFast(CALCULATOR_APP_PACKAGE); mLauncher.goHome().showQuickSwitchView().launchFocusedAppTask(CALCULATOR_APP_PACKAGE); } diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsLockedTaskbar.java b/quickstep/tests/src/com/android/quickstep/TaplTestsLockedTaskbar.java index ce6efe4569..b2617dd803 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsLockedTaskbar.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsLockedTaskbar.java @@ -35,11 +35,11 @@ import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.tapl.HomeAllApps; +import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape; import com.android.launcher3.util.rule.SetPropRule; -import com.android.launcher3.util.ui.PortraitLandscapeRunner.PortraitLandscape; import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch; import com.android.quickstep.TaskbarModeSwitchRule.TaskbarModeSwitch; -import com.android.window.flags2.Flags; +import com.android.window.flags.Flags; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import org.junit.Assume; diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt b/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt index d68a50e9e4..75947abd1b 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt @@ -23,8 +23,10 @@ import androidx.test.uiautomator.Until import com.android.launcher3.BuildConfig import com.android.launcher3.tapl.LaunchedAppState import com.android.launcher3.tapl.OverviewTask +import com.android.launcher3.ui.AbstractLauncherUiTest +import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape +import com.android.launcher3.uioverrides.QuickstepLauncher import com.android.launcher3.util.TestUtil -import com.android.launcher3.util.ui.PortraitLandscapeRunner.PortraitLandscape import com.google.common.truth.Truth.assertWithMessage import org.junit.Before import org.junit.Test @@ -32,10 +34,13 @@ import org.junit.Test /** Test Desktop windowing in Overview. */ @AllowedDevices(allowed = [DeviceProduct.CF_TABLET, DeviceProduct.TANGORPRO]) @IgnoreLimit(ignoreLimit = BuildConfig.IS_STUDIO_BUILD) -class TaplTestsOverviewDesktop : AbstractQuickStepTest() { +class TaplTestsOverviewDesktop : AbstractLauncherUiTest() { @Before fun setup() { - clearAllRecentTasks() + val overview = mLauncher.goHome().switchToOverview() + if (overview.hasTasks()) { + overview.dismissAllTasks() + } startTestAppsWithCheck() mLauncher.goHome() } diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java index f8a123c918..b207d4ac8f 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java @@ -16,6 +16,9 @@ package com.android.quickstep; +import static com.android.launcher3.Flags.enableLauncherOverviewInWindow; +import static com.android.launcher3.util.rule.TestStabilityRule.LOCAL; +import static com.android.launcher3.util.rule.TestStabilityRule.PLATFORM_POSTSUBMIT; import static com.android.quickstep.TaskbarModeSwitchRule.Mode.TRANSIENT; import static org.junit.Assert.assertEquals; @@ -28,7 +31,6 @@ import static org.junit.Assume.assumeTrue; import android.content.Intent; import android.content.res.Configuration; -import android.platform.test.annotations.EnableFlags; import androidx.annotation.NonNull; import androidx.test.filters.LargeTest; @@ -37,7 +39,6 @@ import androidx.test.runner.AndroidJUnit4; import androidx.test.uiautomator.By; import androidx.test.uiautomator.Until; -import com.android.launcher3.Flags; import com.android.launcher3.LauncherState; import com.android.launcher3.tapl.BaseOverview; import com.android.launcher3.tapl.LaunchedAppState; @@ -47,20 +48,25 @@ import com.android.launcher3.tapl.OverviewActions; import com.android.launcher3.tapl.OverviewTask; import com.android.launcher3.tapl.SelectModeButtons; import com.android.launcher3.tapl.Workspace; +import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape; import com.android.launcher3.util.TestUtil; import com.android.launcher3.util.Wait; -import com.android.launcher3.util.ui.PortraitLandscapeRunner.PortraitLandscape; +import com.android.launcher3.util.rule.ScreenRecordRule; +import com.android.launcher3.util.rule.TestStabilityRule; import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch; import com.android.quickstep.TaskbarModeSwitchRule.TaskbarModeSwitch; +import com.android.quickstep.fallback.RecentsState; import com.android.quickstep.views.RecentsView; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Comparator; -import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; @LargeTest @RunWith(AndroidJUnit4.class) @@ -71,17 +77,32 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { private static final String READ_DEVICE_CONFIG_PERMISSION = "android.permission.READ_DEVICE_CONFIG"; + private enum ExpectedState { + + HOME(LauncherState.NORMAL, RecentsState.HOME), + OVERVIEW(LauncherState.OVERVIEW, RecentsState.DEFAULT); + + private final LauncherState mLauncherState; + private final RecentsState mRecentsState; + + ExpectedState(LauncherState launcherState, RecentsState recentsState) { + this.mLauncherState = launcherState; + this.mRecentsState = recentsState; + } + } + @Before public void setUp() throws Exception { super.setUp(); - executeOnOverview(recentsView -> + runOnRecentsView(recentsView -> recentsView.getPagedViewOrientedState().forceAllowRotationForTesting(true)); } @After public void tearDown() { - executeOnOverview(/* forTearDown= */ true, recentsView -> - recentsView.getPagedViewOrientedState().forceAllowRotationForTesting(false)); + runOnRecentsView(recentsView -> + recentsView.getPagedViewOrientedState().forceAllowRotationForTesting(false), + /* forTearDown= */ true); } public static void startTestApps() throws Exception { @@ -107,26 +128,24 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // mLauncher.pressHome() also tests an important case of pressing home while in background. Overview overview = mLauncher.goHome().switchToOverview(); assertIsInState( - "Launcher internal state didn't switch to Overview", LauncherState.OVERVIEW); - executeOnOverview(recentsView -> assertTrue("Don't have at least 3 tasks", + "Launcher internal state didn't switch to Overview", ExpectedState.OVERVIEW); + runOnRecentsView(recentsView -> assertTrue("Don't have at least 3 tasks", recentsView.getTaskViewCount() >= 3)); // Test flinging forward and backward. - executeOnOverview(recentsView -> assertEquals("Current task in Overview is not first", - recentsView.indexOfChild(recentsView.getFirstTaskView()), - recentsView.getCurrentPage())); + runOnRecentsView(recentsView -> assertEquals("Current task in Overview is not 0", + 0, recentsView.getCurrentPage())); overview.flingForward(); - assertIsInState("Launcher internal state is not Overview", LauncherState.OVERVIEW); + assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); final Integer currentTaskAfterFlingForward = - getFromOverview(RecentsView::getCurrentPage); - executeOnOverview(recentsView -> assertTrue("Current task in Overview is still 0", - currentTaskAfterFlingForward > recentsView.indexOfChild( - recentsView.getFirstTaskView()))); + getFromRecentsView(RecentsView::getCurrentPage); + runOnRecentsView(recentsView -> assertTrue("Current task in Overview is still 0", + currentTaskAfterFlingForward > 0)); overview.flingBackward(); - assertIsInState("Launcher internal state is not Overview", LauncherState.OVERVIEW); - executeOnOverview(recentsView -> assertTrue("Flinging back in Overview did nothing", + assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); + runOnRecentsView(recentsView -> assertTrue("Flinging back in Overview did nothing", recentsView.getCurrentPage() < currentTaskAfterFlingForward)); // Test opening a task. @@ -141,19 +160,19 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // Test dismissing a task. overview = mLauncher.goHome().switchToOverview(); assertIsInState("Launcher internal state didn't switch to Overview", - LauncherState.OVERVIEW); - final Integer numTasks = getFromOverview(RecentsView::getTaskViewCount); + ExpectedState.OVERVIEW); + final Integer numTasks = getFromRecentsView(RecentsView::getTaskViewCount); task = overview.getCurrentTask(); assertNotNull("overview.getCurrentTask() returned null (2)", task); task.dismiss(); - executeOnOverview(recentsView -> assertEquals( + runOnRecentsView(recentsView -> assertEquals( "Dismissing a task didn't remove 1 task from Overview", numTasks - 1, recentsView.getTaskViewCount())); // Test dismissing all tasks. mLauncher.goHome().switchToOverview().dismissAllTasks(); - assertIsInState("Launcher internal state is not Home", LauncherState.NORMAL); - executeOnOverview(recentsView -> assertEquals("Still have tasks after dismissing all", + assertIsInState("Launcher internal state is not Home", ExpectedState.HOME); + runOnRecentsView(recentsView -> assertEquals("Still have tasks after dismissing all", 0, recentsView.getTaskViewCount())); } @@ -176,10 +195,10 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { public void testDismissOverviewWithEscKey() throws Exception { startTestAppsWithCheck(); final Overview overview = mLauncher.goHome().switchToOverview(); - assertIsInState("Launcher internal state is not Overview", LauncherState.OVERVIEW); + assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); overview.dismissByEscKey(); - assertIsInState("Launcher internal state is not Home", LauncherState.NORMAL); + assertIsInState("Launcher internal state is not Home", ExpectedState.HOME); } @Test @@ -195,15 +214,14 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { selectModeButtons = overview.getOverviewActions().clickSelect(); } - assertIsInState( - "Launcher internal state is not Overview Modal Task", - LauncherState.OVERVIEW_MODAL_TASK); + assertTrue("Launcher internal state is not Overview Modal Task", + isInState(() -> LauncherState.OVERVIEW_MODAL_TASK)); selectModeButtons.dismissByEscKey(); - assertIsInState("Launcher internal state is not Overview", LauncherState.OVERVIEW); + assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); overview.dismissByEscKey(); - assertIsInState("Launcher internal state is not Home", LauncherState.NORMAL); + assertIsInState("Launcher internal state is not Home", ExpectedState.HOME); } @Test @@ -211,11 +229,11 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { startTestAppsWithCheck(); startAppFast(CALCULATOR_APP_PACKAGE); // Ensure Calculator is last opened app. Workspace home = mLauncher.goHome(); - assertIsInState("Launcher state is not Home", LauncherState.NORMAL); + assertIsInState("Launcher state is not Home", ExpectedState.HOME); Overview overview = home.openOverviewFromActionPlusTabKeyboardShortcut(); - assertIsInState("Launcher state is not Overview", LauncherState.OVERVIEW); + assertIsInState("Launcher state is not Overview", ExpectedState.OVERVIEW); overview.launchFocusedTaskByEnterKey(CALCULATOR_APP_PACKAGE); // Assert app is focused. } @@ -224,11 +242,11 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { startTestAppsWithCheck(); startAppFast(CALCULATOR_APP_PACKAGE); // Ensure Calculator is last opened app. Workspace home = mLauncher.goHome(); - assertIsInState("Launcher state is not Home", LauncherState.NORMAL); + assertIsInState("Launcher state is not Home", ExpectedState.HOME); Overview overview = home.openOverviewFromRecentsKeyboardShortcut(); - assertIsInState("Launcher state is not Overview", LauncherState.OVERVIEW); + assertIsInState("Launcher state is not Overview", ExpectedState.OVERVIEW); overview.launchFocusedTaskByEnterKey(CALCULATOR_APP_PACKAGE); // Assert app is focused. } @@ -240,7 +258,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { assertNotNull("Workspace.switchToOverview() returned null", mLauncher.goHome().switchToOverview()); assertIsInState( - "Launcher internal state didn't switch to Overview", LauncherState.OVERVIEW); + "Launcher internal state didn't switch to Overview", ExpectedState.OVERVIEW); } @Test @@ -266,12 +284,13 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { assertNotNull("Background.switchToOverview() returned null", launchedAppState.switchToOverview()); assertIsInState( - "Launcher internal state didn't switch to Overview", LauncherState.OVERVIEW); + "Launcher internal state didn't switch to Overview", ExpectedState.OVERVIEW); } @Test @NavigationModeSwitch @PortraitLandscape + @TestStabilityRule.Stability(flavors = LOCAL | PLATFORM_POSTSUBMIT) // b/325659406 public void testQuickSwitchFromApp() throws Exception { startTestActivity(2); startTestActivity(3); @@ -358,11 +377,77 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // Debug if we need to goHome to prevent wrong previous state b/315525621 mLauncher.goHome(); mLauncher.getWorkspace().switchToAllApps().pressBackToWorkspace(); - waitForState("Launcher internal state didn't switch to Home", LauncherState.NORMAL); + waitForState("Launcher internal state didn't switch to Home", ExpectedState.HOME); startAppFast(CALCULATOR_APP_PACKAGE); mLauncher.getLaunchedAppState().pressBackToWorkspace(); - waitForState("Launcher internal state didn't switch to Home", LauncherState.NORMAL); + waitForState("Launcher internal state didn't switch to Home", ExpectedState.HOME); + } + + @Test + @PortraitLandscape + @TaskbarModeSwitch() + @Ignore("b/315376057") + public void testOverviewForTablet() throws Exception { + assumeTrue(mLauncher.isTablet()); + + for (int i = 2; i <= 14; i++) { + startTestActivity(i); + } + + Overview overview = mLauncher.goHome().switchToOverview(); + runOnRecentsView(recentsView -> assertTrue("Don't have at least 13 tasks", + recentsView.getTaskViewCount() >= 13)); + + // Test scroll the first task off screen + overview.scrollCurrentTaskOffScreen(); + assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); + runOnRecentsView(recentsView -> assertTrue("Current task in Overview is still 0", + recentsView.getCurrentPage() > 0)); + + // Test opening the task. + overview.getCurrentTask().open(); + assertTrue("Test activity didn't open from Overview", + mDevice.wait(Until.hasObject(By.pkg(getAppPackageName()).text( + mLauncher.isGridOnlyOverviewEnabled() ? "TestActivity12" + : "TestActivity13")), + TestUtil.DEFAULT_UI_TIMEOUT)); + + // Scroll the task offscreen as it is now first + overview = mLauncher.goHome().switchToOverview(); + overview.scrollCurrentTaskOffScreen(); + assertIsInState( + "Launcher internal state is not Overview", ExpectedState.OVERVIEW); + runOnRecentsView(recentsView -> assertTrue("Current task in Overview is still 0", + recentsView.getCurrentPage() > 0)); + + // Test dismissing the later task. + final Integer numTasks = getFromRecentsView(RecentsView::getTaskViewCount); + overview.getCurrentTask().dismiss(); + runOnRecentsView(recentsView -> assertEquals( + "Dismissing a task didn't remove 1 task from Overview", + numTasks - 1, recentsView.getTaskViewCount())); + runOnRecentsView(recentsView -> assertTrue("Grid did not rebalance after dismissal", + (Math.abs(recentsView.getTopRowTaskCountForTablet() + - recentsView.getBottomRowTaskCountForTablet()) <= 1))); + + // Test dismissing more tasks. + assertIsInState( + "Launcher internal state didn't remain in Overview", ExpectedState.OVERVIEW); + overview.getCurrentTask().dismiss(); + assertIsInState( + "Launcher internal state didn't remain in Overview", ExpectedState.OVERVIEW); + overview.getCurrentTask().dismiss(); + runOnRecentsView(recentsView -> assertTrue( + "Grid did not rebalance after multiple dismissals", + (Math.abs(recentsView.getTopRowTaskCountForTablet() + - recentsView.getBottomRowTaskCountForTablet()) <= 1))); + + // Test dismissing all tasks. + mLauncher.goHome().switchToOverview().dismissAllTasks(); + assertIsInState("Launcher internal state is not Home", ExpectedState.HOME); + runOnRecentsView(recentsView -> assertEquals("Still have tasks after dismissing all", + 0, recentsView.getTaskViewCount())); } @Test @@ -371,18 +456,18 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { startTestAppsWithCheck(); Overview overview = mLauncher.goHome().switchToOverview(); - assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); - executeOnOverview(recentsView -> assertTrue("Should have at least 3 tasks", + assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); + runOnRecentsView(recentsView -> assertTrue("Should have at least 3 tasks", recentsView.getTaskViewCount() >= 3)); // It should not dismiss overview when tapping between tasks overview.touchBetweenTasks(); overview = mLauncher.getOverview(); - assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); + assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); // Dismiss when tapping to the right of the focused task overview.touchOutsideFirstTask(); - assertIsInState("Launcher internal state should be Home", LauncherState.NORMAL); + assertIsInState("Launcher internal state should be Home", ExpectedState.HOME); } @Test @@ -394,28 +479,28 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { startTestAppsWithCheck(); Overview overview = mLauncher.goHome().switchToOverview(); - assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); - executeOnOverview(recentsView -> assertTrue("Should have at least 3 tasks", + assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); + runOnRecentsView(recentsView -> assertTrue("Should have at least 3 tasks", recentsView.getTaskViewCount() >= 3)); if (mLauncher.isTransientTaskbar()) { // On transient taskbar, it should dismiss when tapping outside taskbar bounds. overview.touchTaskbarBottomCorner(/* tapRight= */ false); - assertIsInState("Launcher internal state should be Normal", LauncherState.NORMAL); + assertIsInState("Launcher internal state should be Normal", ExpectedState.HOME); overview = mLauncher.getWorkspace().switchToOverview(); // On transient taskbar, it should dismiss when tapping outside taskbar bounds. overview.touchTaskbarBottomCorner(/* tapRight= */ true); - assertIsInState("Launcher internal state should be Normal", LauncherState.NORMAL); + assertIsInState("Launcher internal state should be Normal", ExpectedState.HOME); } else { // On persistent taskbar, it should not dismiss when tapping the taskbar overview.touchTaskbarBottomCorner(/* tapRight= */ false); - assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); + assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); // On persistent taskbar, it should not dismiss when tapping the taskbar overview.touchTaskbarBottomCorner(/* tapRight= */ true); - assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); + assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); } } @@ -456,159 +541,77 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { @Test @PortraitLandscape + @ScreenRecordRule.ScreenRecord // TODO(b/396447643): Remove screen record. public void testDismissCancel() throws Exception { startTestAppsWithCheck(); Overview overview = mLauncher.goHome().switchToOverview(); assertIsInState("Launcher internal state didn't switch to Overview", - LauncherState.OVERVIEW); - final Integer numTasks = getFromOverview(RecentsView::getTaskViewCount); + ExpectedState.OVERVIEW); + final Integer numTasks = getFromRecentsView(RecentsView::getTaskViewCount); OverviewTask task = overview.getCurrentTask(); assertNotNull("overview.getCurrentTask() returned null (2)", task); task.dismissCancel(); - executeOnOverview(recentsView -> assertEquals( + runOnRecentsView(recentsView -> assertEquals( "Canceling dismissing a task removed a task from Overview", numTasks == null ? 0 : numTasks, recentsView.getTaskViewCount())); } @Test @PortraitLandscape - @EnableFlags(value = Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW) public void testDismissBottomRow() throws Exception { assumeTrue(mLauncher.isTablet()); - clearAllRecentTasks(); + mLauncher.goHome().switchToOverview().dismissAllTasks(); startTestAppsWithCheck(); - Overview overview = mLauncher.goHome().switchToOverview(); assertIsInState("Launcher internal state didn't switch to Overview", - LauncherState.OVERVIEW); - final Integer numTasks = getFromOverview(RecentsView::getTaskViewCount); - Optional bottomTask = overview.getCurrentTasksForTablet().stream().max( - Comparator.comparingInt(OverviewTask::getTaskCenterY)); - assertTrue("bottomTask null", bottomTask.isPresent()); + ExpectedState.OVERVIEW); + final Integer numTasks = getFromRecentsView(RecentsView::getTaskViewCount); + OverviewTask bottomTask = overview.getCurrentTasksForTablet().stream().max( + Comparator.comparingInt(OverviewTask::getTaskCenterY)).get(); + assertNotNull("bottomTask null", bottomTask); - bottomTask.get().dismiss(); - executeOnOverview(recentsView -> assertEquals( + bottomTask.dismiss(); + + runOnRecentsView(recentsView -> assertEquals( "Dismissing a bottomTask didn't remove 1 bottomTask from Overview", numTasks - 1, recentsView.getTaskViewCount())); } @Test @PortraitLandscape - @EnableFlags(value = Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW) public void testDismissLastGridRow() throws Exception { assumeTrue(mLauncher.isTablet()); - clearAllRecentTasks(); + mLauncher.goHome().switchToOverview().dismissAllTasks(); startTestAppsWithCheck(); startTestActivity(3); startTestActivity(4); - executeOnOverview(recentsView -> assertNotEquals( - "Grid overview should have unequal row counts", - recentsView.getTopRowTaskCountForTablet(), - recentsView.getBottomRowTaskCountForTablet())); + runOnRecentsView( + recentsView -> assertNotEquals("Grid overview should have unequal row counts", + recentsView.getTopRowTaskCountForTablet(), + recentsView.getBottomRowTaskCountForTablet())); Overview overview = mLauncher.goHome().switchToOverview(); assertIsInState("Launcher internal state didn't switch to Overview", - LauncherState.OVERVIEW); - + ExpectedState.OVERVIEW); overview.flingForwardUntilClearAllVisible(); assertTrue("Clear All not visible.", overview.isClearAllVisible()); - final Integer numTasks = getFromOverview(RecentsView::getTaskViewCount); - Optional lastGridTask = overview.getCurrentTasksForTablet().stream().min( - Comparator.comparingInt(OverviewTask::getTaskCenterX)); - assertTrue("lastGridTask null.", lastGridTask.isPresent()); + final Integer numTasks = getFromRecentsView(RecentsView::getTaskViewCount); + OverviewTask lastGridTask = overview.getCurrentTasksForTablet().stream().min( + Comparator.comparingInt(OverviewTask::getTaskCenterX)).get(); + assertNotNull("lastGridTask null.", lastGridTask); - lastGridTask.get().dismiss(); - executeOnOverview(recentsView -> { - assertEquals( - "Dismissing a lastGridTask didn't remove 1 lastGridTask from Overview", - numTasks - 1, recentsView.getTaskViewCount()); - assertEquals( - "Grid overview should have equal row counts.", - recentsView.getTopRowTaskCountForTablet(), - recentsView.getBottomRowTaskCountForTablet()); - }); + lastGridTask.dismiss(); + + runOnRecentsView(recentsView -> assertEquals( + "Dismissing a lastGridTask didn't remove 1 lastGridTask from Overview", + numTasks - 1, recentsView.getTaskViewCount())); + runOnRecentsView(recentsView -> assertEquals("Grid overview should have equal row counts.", + recentsView.getTopRowTaskCountForTablet(), + recentsView.getBottomRowTaskCountForTablet())); assertTrue("Clear All not visible.", overview.isClearAllVisible()); } - @Test - @PortraitLandscape - @EnableFlags(value = Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW) - // When dismissing multiple apps, the apps off screen should "re-balance" i.e. re-arrange - // themselves evenly across both top and bottom rows. - public void gridRebalancesOffScreenAfterDismissingMultipleApps() throws Exception { - assumeTrue(mLauncher.isTablet()); - clearAllRecentTasks(); - // Launch enough apps so some are offscreen. - for (int i = 2; i <= 12; i++) { - startTestActivity(i); - } - Overview overview = mLauncher.goHome().switchToOverview(); - executeOnOverview(recentsView -> assertTrue("11 tasks should be open", - recentsView.getTaskViewCount() >= 11)); - - // Dismiss 2 tasks from the top row. - assertIsInState( - "Launcher internal state didn't remain in Overview", LauncherState.OVERVIEW); - overview.getCurrentTask().dismiss(); - assertIsInState( - "Launcher internal state didn't remain in Overview", LauncherState.OVERVIEW); - overview.getCurrentTask().dismiss(); - - // Assert that the two row counts are no more than 1 apart, therefore were re-balanced. - executeOnOverview(recentsView -> assertTrue( - "Grid did not re-balance after multiple dismissals", - (Math.abs(recentsView.getTopRowTaskCountForTablet() - - recentsView.getBottomRowTaskCountForTablet()) <= 1))); - } - - @Test - @PortraitLandscape - @EnableFlags(value = Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW) - // When dismissing multiple apps, the apps on screen should not "re-balance" i.e. dismissing - // 2 apps from the top row, will move the top row along 2 and so it will not be balanced - // across the bottom row. - public void gridDoesNotRebalanceOnScreenAfterDismissingMultipleApps() throws Exception { - assumeTrue(mLauncher.isTablet()); - clearAllRecentTasks(); - // Launch 6 apps so 3 are in each row. - int appsInBothRowsCount = 6; - int appsInEachRowCount = appsInBothRowsCount / 2; - for (int i = 2; i <= appsInBothRowsCount + 1; i++) { - startTestActivity(i); - } - Overview overview = mLauncher.goHome().switchToOverview(); - executeOnOverview(recentsView -> { - assertEquals(appsInBothRowsCount + " tasks should be open", - appsInBothRowsCount, recentsView.getTaskViewCount()); - assertEquals("Grid should have " + appsInEachRowCount + " tasks on the top row", - appsInEachRowCount, - recentsView.getTopRowTaskCountForTablet()); - assertEquals("Grid should have " + appsInEachRowCount + " tasks on the bottom row", - appsInEachRowCount, - recentsView.getBottomRowTaskCountForTablet()); - }); - - // Dismiss 2 tasks from the top row. - assertIsInState("Launcher internal state didn't remain in Overview", - LauncherState.OVERVIEW); - overview.getCurrentTask().dismiss(); - assertIsInState("Launcher internal state didn't remain in Overview", - LauncherState.OVERVIEW); - overview.getCurrentTask().dismiss(); - - executeOnOverview(recentsView -> { - int expectedTopRowCount = appsInEachRowCount - 2; - assertEquals( - "Grid should have " + expectedTopRowCount + " tasks on the top row", - expectedTopRowCount, - recentsView.getTopRowTaskCountForTablet()); - assertEquals("Grid should have " + appsInEachRowCount + " tasks on the bottom row", - appsInEachRowCount, - recentsView.getBottomRowTaskCountForTablet()); - }); - } - private void startTestAppsWithCheck() throws Exception { startTestApps(); expectLaunchedAppState(); @@ -633,13 +636,19 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { } private void assertIsInState( - @NonNull String failureMessage, @NonNull LauncherState expectedState) { - assertTrue(failureMessage, isInState(() -> expectedState)); + @NonNull String failureMessage, @NonNull ExpectedState expectedState) { + assertTrue(failureMessage, enableLauncherOverviewInWindow() + ? isInRecentsWindowState(() -> expectedState.mRecentsState) + : isInState(() -> expectedState.mLauncherState)); } private void waitForState( - @NonNull String failureMessage, @NonNull LauncherState expectedState) { - waitForState(failureMessage, () -> expectedState); + @NonNull String failureMessage, @NonNull ExpectedState expectedState) { + if (enableLauncherOverviewInWindow()) { + waitForRecentsWindowState(failureMessage, () -> expectedState.mRecentsState); + } else { + waitForState(failureMessage, () -> expectedState.mLauncherState); + } } private void expectLaunchedAppState() { @@ -648,4 +657,33 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { + "one", isInLaunchedApp(launcher))); } + + private T getFromRecentsView(Function f) { + return getFromRecentsView(f, false); + } + + private T getFromRecentsView(Function f, boolean forTearDown) { + if (enableLauncherOverviewInWindow()) { + return getFromRecentsWindow(recentsWindowManager -> + (forTearDown && recentsWindowManager == null) + ? null : f.apply(recentsWindowManager.getOverviewPanel())); + } else { + return getFromLauncher(launcher -> (forTearDown && launcher == null) + ? null : f.apply(launcher.getOverviewPanel())); + } + } + + private void runOnRecentsView(Consumer f) { + runOnRecentsView(f, false); + } + + private void runOnRecentsView(Consumer f, boolean forTearDown) { + getFromRecentsView(recentsView -> { + if (forTearDown && recentsView == null) { + return null; + } + f.accept(recentsView); + return null; + }, forTearDown); + } } diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java b/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java index 0d1d2bd16c..ec245ee0f3 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java @@ -23,7 +23,7 @@ import static com.android.quickstep.TaplTestsTaskbar.TaskbarMode.TRANSIENT; import androidx.test.filters.LargeTest; -import com.android.launcher3.util.ui.PortraitLandscapeRunner.PortraitLandscape; +import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsTrackpad.java b/quickstep/tests/src/com/android/quickstep/TaplTestsTrackpad.java index 8cb1c622df..710ad6f6dc 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsTrackpad.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsTrackpad.java @@ -29,7 +29,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.tapl.LauncherInstrumentation.TrackpadGestureType; import com.android.launcher3.tapl.Workspace; -import com.android.launcher3.util.ui.PortraitLandscapeRunner.PortraitLandscape; +import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape; import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch; import org.junit.After; diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsTransientTaskbar.java b/quickstep/tests/src/com/android/quickstep/TaplTestsTransientTaskbar.java index 821d14fd35..4b20d600dc 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsTransientTaskbar.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsTransientTaskbar.java @@ -18,7 +18,6 @@ package com.android.quickstep; import static com.android.launcher3.Flags.enableCursorHoverStates; import static com.android.launcher3.util.TestConstants.AppNames.TEST_APP_NAME; import static com.android.quickstep.TaskbarModeSwitchRule.Mode.TRANSIENT; -import static com.android.systemui.shared.Flags.cursorHotCorner; import static org.junit.Assume.assumeTrue; @@ -42,6 +41,14 @@ public class TaplTestsTransientTaskbar extends AbstractTaplTestsTaskbar { mLauncher.getLaunchedAppState().hoverToShowTaskbarUnstashHint(); } + @Test + @TaskbarModeSwitch(mode = TRANSIENT) + public void testUnstashTaskbarOnScreenBottomEdgeHover() { + assumeTrue(enableCursorHoverStates()); + getTaskbar().getAppIcon(TEST_APP_NAME).launch(TEST_APP_PACKAGE); + mLauncher.getLaunchedAppState().hoverScreenBottomEdgeToUnstashTaskbar(); + } + @Test @TaskbarModeSwitch(mode = TRANSIENT) public void testHoverBelowHintedTaskbarToUnstash() { @@ -64,31 +71,4 @@ public class TaplTestsTransientTaskbar extends AbstractTaplTestsTaskbar { getTaskbar().swipeDownToStash(); mLauncher.getLaunchedAppState().swipeUpToUnstashTaskbar(); } - - @Test - @TaskbarModeSwitch(mode = TRANSIENT) - public void testUnstashTaskbarOnScreenBottomEdgeHover() { - assumeTrue(enableCursorHoverStates()); - getTaskbar().getAppIcon(TEST_APP_NAME).launch(TEST_APP_PACKAGE); - mLauncher.getLaunchedAppState().hoverScreenBottomEdgeToUnstashTaskbar(); - mLauncher.getLaunchedAppState().assertTaskbarVisible(); - } - - @Test - @TaskbarModeSwitch(mode = TRANSIENT) - public void testUnstashTaskbarOnScreenBottomEdgeOutsideActionCornerHover() { - assumeTrue(cursorHotCorner()); - getTaskbar().getAppIcon(TEST_APP_NAME).launch(TEST_APP_PACKAGE); - mLauncher.getLaunchedAppState().hoverScreenBottomEdgeOutsideActionCornerToUnstashTaskbar(); - mLauncher.getLaunchedAppState().assertTaskbarVisible(); - } - - @Test - @TaskbarModeSwitch(mode = TRANSIENT) - public void testNotShowTaskbarOnActionCornerPaddingHover() { - assumeTrue(cursorHotCorner()); - getTaskbar().getAppIcon(TEST_APP_NAME).launch(TEST_APP_PACKAGE); - mLauncher.getLaunchedAppState().hoverScreenBottomCornerToTryUnstashTaskbar(); - mLauncher.getLaunchedAppState().assertTaskbarHidden(); - } } diff --git a/quickstep/tests/src/com/android/quickstep/TaskViewTest.java b/quickstep/tests/src/com/android/quickstep/TaskViewTest.java index 6b87f94cf8..dc1da69342 100644 --- a/quickstep/tests/src/com/android/quickstep/TaskViewTest.java +++ b/quickstep/tests/src/com/android/quickstep/TaskViewTest.java @@ -16,9 +16,6 @@ package com.android.quickstep; -import static com.android.quickstep.TaskViewTestDIHelpers.initializeRecentsDependencies; -import static com.android.quickstep.TaskViewTestDIHelpers.mockRecentsModel; - import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -38,15 +35,11 @@ import android.util.DisplayMetrics; import android.view.MotionEvent; import androidx.test.filters.SmallTest; -import androidx.test.platform.app.InstrumentationRegistry; import com.android.launcher3.uioverrides.QuickstepLauncher; -import com.android.launcher3.util.SandboxContext; -import com.android.quickstep.recents.di.RecentsDependencies; import com.android.quickstep.util.BorderAnimator; import com.android.quickstep.views.TaskView; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; @@ -55,8 +48,6 @@ import org.mockito.MockitoAnnotations; @SmallTest public class TaskViewTest { - private final SandboxContext mApplicationContext = - new SandboxContext(InstrumentationRegistry.getInstrumentation().getTargetContext()); @Mock private QuickstepLauncher mContext; @Mock @@ -78,19 +69,10 @@ public class TaskViewTest { when(mContext.getApplicationInfo()).thenReturn(mock(ApplicationInfo.class)); when(mContext.obtainStyledAttributes(any(), any(), anyInt(), anyInt())).thenReturn( mock(TypedArray.class)); - when(mContext.getApplicationContext()).thenReturn(mApplicationContext); - mApplicationContext.initDaggerComponent( - DaggerTaskViewTestComponent.builder().bindRecentsModel(mockRecentsModel())); - initializeRecentsDependencies(mContext); mTaskView = new TaskView(mContext, null, 0, 0, mFocusAnimator, mHoverAnimator); } - @After - public void tearDown() { - RecentsDependencies.destroy(mContext); - } - @Test public void notShowBorderOnBorderDisabled() { presetBorderStatus(/* enabled= */ true); diff --git a/quickstep/tests/src/com/android/quickstep/TaskbarModeSwitchRule.java b/quickstep/tests/src/com/android/quickstep/TaskbarModeSwitchRule.java index 87cda25c3c..84ceb332d9 100644 --- a/quickstep/tests/src/com/android/quickstep/TaskbarModeSwitchRule.java +++ b/quickstep/tests/src/com/android/quickstep/TaskbarModeSwitchRule.java @@ -27,9 +27,9 @@ import android.util.Log; import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.tapl.TestHelpers; +import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.rule.FailureWatcher; -import com.android.launcher3.util.ui.AbstractLauncherUiTest; import org.junit.rules.TestRule; import org.junit.runner.Description; diff --git a/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchAnimatorHelperTest.kt b/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchAnimatorHelperTest.kt index eb053cd032..daa77d2a31 100644 --- a/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchAnimatorHelperTest.kt +++ b/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchAnimatorHelperTest.kt @@ -40,7 +40,7 @@ import com.android.internal.jank.Cuj import com.android.launcher3.desktop.DesktopAppLaunchAnimatorHelper import com.android.launcher3.desktop.DesktopAppLaunchTransition.AppLaunchType import com.android.launcher3.util.Executors.MAIN_EXECUTOR -import com.android.window.flags2.Flags +import com.android.window.flags.Flags import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Rule diff --git a/quickstep/tests/src/com/android/quickstep/util/SplitScreenTestUtils.kt b/quickstep/tests/src/com/android/quickstep/util/SplitScreenTestUtils.kt index 15fa84c6b1..99c74bec15 100644 --- a/quickstep/tests/src/com/android/quickstep/util/SplitScreenTestUtils.kt +++ b/quickstep/tests/src/com/android/quickstep/util/SplitScreenTestUtils.kt @@ -20,7 +20,7 @@ import androidx.test.uiautomator.By import com.android.launcher3.tapl.LauncherInstrumentation import com.android.launcher3.tapl.Overview import com.android.launcher3.tapl.OverviewTask -import com.android.launcher3.util.ui.AbstractLauncherUiTest +import com.android.launcher3.ui.AbstractLauncherUiTest object SplitScreenTestUtils { diff --git a/quickstep/tests/src/com/android/quickstep/util/SplitSelectDataHolderTest.kt b/quickstep/tests/src/com/android/quickstep/util/SplitSelectDataHolderTest.kt index faac190bec..b4f1692604 100644 --- a/quickstep/tests/src/com/android/quickstep/util/SplitSelectDataHolderTest.kt +++ b/quickstep/tests/src/com/android/quickstep/util/SplitSelectDataHolderTest.kt @@ -22,13 +22,12 @@ import android.app.ActivityTaskManager.INVALID_TASK_ID import android.content.Context import android.content.ContextWrapper import android.content.Intent -import android.os.Process import android.os.UserHandle import androidx.test.platform.app.InstrumentationRegistry import com.android.launcher3.model.data.ItemInfo import com.android.launcher3.shortcuts.ShortcutKey +import com.android.launcher3.ui.AbstractLauncherUiTest import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT -import com.android.launcher3.util.ui.AbstractLauncherUiTest import com.android.quickstep.util.SplitSelectDataHolder.Companion.SPLIT_PENDINGINTENT_PENDINGINTENT import com.android.quickstep.util.SplitSelectDataHolder.Companion.SPLIT_PENDINGINTENT_TASK import com.android.quickstep.util.SplitSelectDataHolder.Companion.SPLIT_SHORTCUT_TASK @@ -55,7 +54,7 @@ class SplitSelectDataHolderTest { private val sampleTaskInfo = RunningTaskInfo() private val sampleTaskId = 10 private val sampleTaskId2 = 11 - private val sampleUser = UserHandle(Process.myUserHandle().identifier) + private val sampleUser = UserHandle(0) private val sampleIntent = Intent() private val sampleIntent2 = Intent() private val sampleShortcut = Intent() @@ -85,7 +84,7 @@ class SplitSelectDataHolderTest { sampleTaskInfo, STAGE_POSITION_TOP_OR_LEFT, null, - null, + null ) assertTrue(splitSelectDataHolder.isSplitSelectActive()) } @@ -97,7 +96,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - INVALID_TASK_ID, + INVALID_TASK_ID ) assertTrue(splitSelectDataHolder.isSplitSelectActive()) } @@ -109,7 +108,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - sampleTaskId, + sampleTaskId ) assertTrue(splitSelectDataHolder.isSplitSelectActive()) } @@ -121,7 +120,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - INVALID_TASK_ID, + INVALID_TASK_ID ) assertTrue(splitSelectDataHolder.isSplitSelectActive()) } @@ -133,7 +132,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - INVALID_TASK_ID, + INVALID_TASK_ID ) splitSelectDataHolder.setSecondTask(sampleTaskId, sampleItemInfo2) assertTrue(splitSelectDataHolder.isBothSplitAppsConfirmed()) @@ -145,7 +144,7 @@ class SplitSelectDataHolderTest { sampleTaskInfo, STAGE_POSITION_TOP_OR_LEFT, null, - null, + null ) splitSelectDataHolder.setSecondTask(sampleIntent, sampleUser, sampleItemInfo2) assertTrue(splitSelectDataHolder.isBothSplitAppsConfirmed()) @@ -158,7 +157,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - INVALID_TASK_ID, + INVALID_TASK_ID ) splitSelectDataHolder.setSecondTask(sampleShortcut, sampleUser, sampleItemInfo2) assertTrue(splitSelectDataHolder.isBothSplitAppsConfirmed()) @@ -170,7 +169,7 @@ class SplitSelectDataHolderTest { sampleTaskInfo, STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, - null, + null ) splitSelectDataHolder.setSecondTask(sampleTaskId2, sampleItemInfo2) val launchData = splitSelectDataHolder.getSplitLaunchData() @@ -194,7 +193,7 @@ class SplitSelectDataHolderTest { sampleTaskInfo, STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, - null, + null ) splitSelectDataHolder.setSecondTask(sampleIntent, sampleUser, sampleItemInfo2) val launchData = splitSelectDataHolder.getSplitLaunchData() @@ -218,7 +217,7 @@ class SplitSelectDataHolderTest { sampleTaskInfo, STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, - null, + null ) splitSelectDataHolder.setSecondTask(sampleShortcut, sampleUser, sampleItemInfo2) val launchData = splitSelectDataHolder.getSplitLaunchData() @@ -243,7 +242,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - INVALID_TASK_ID, + INVALID_TASK_ID ) splitSelectDataHolder.setSecondTask(sampleTaskId, sampleItemInfo2) val launchData = splitSelectDataHolder.getSplitLaunchData() @@ -268,7 +267,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - INVALID_TASK_ID, + INVALID_TASK_ID ) splitSelectDataHolder.setSecondTask(sampleTaskId, sampleItemInfo2) val launchData = splitSelectDataHolder.getSplitLaunchData() @@ -293,7 +292,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - INVALID_TASK_ID, + INVALID_TASK_ID ) splitSelectDataHolder.setSecondTask(sampleIntent2, sampleUser, sampleItemInfo2) val launchData = splitSelectDataHolder.getSplitLaunchData() @@ -317,7 +316,7 @@ class SplitSelectDataHolderTest { sampleTaskInfo, STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, - null, + null ) val launchData = splitSelectDataHolder.getFullscreenLaunchData() @@ -341,7 +340,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - INVALID_TASK_ID, + INVALID_TASK_ID ) val launchData = splitSelectDataHolder.getFullscreenLaunchData() @@ -365,7 +364,7 @@ class SplitSelectDataHolderTest { STAGE_POSITION_TOP_OR_LEFT, sampleItemInfo, null, - INVALID_TASK_ID, + INVALID_TASK_ID ) val launchData = splitSelectDataHolder.getFullscreenLaunchData() @@ -388,7 +387,7 @@ class SplitSelectDataHolderTest { sampleTaskInfo, STAGE_POSITION_TOP_OR_LEFT, null, - null, + null ) splitSelectDataHolder.setSecondTask(sampleIntent, sampleUser, sampleItemInfo2) splitSelectDataHolder.resetState() @@ -398,11 +397,11 @@ class SplitSelectDataHolderTest { @Test fun clearState_intent() { splitSelectDataHolder.setInitialTaskSelect( - sampleIntent, - STAGE_POSITION_TOP_OR_LEFT, - sampleItemInfo, - null, - INVALID_TASK_ID, + sampleIntent, + STAGE_POSITION_TOP_OR_LEFT, + sampleItemInfo, + null, + INVALID_TASK_ID ) splitSelectDataHolder.setSecondTask(sampleIntent, sampleUser, sampleItemInfo2) splitSelectDataHolder.resetState() diff --git a/res/drawable/all_apps_tabs_background_unselected.xml b/res/drawable/all_apps_tabs_background_unselected.xml index 6c0adf13a5..4004021dfd 100644 --- a/res/drawable/all_apps_tabs_background_unselected.xml +++ b/res/drawable/all_apps_tabs_background_unselected.xml @@ -21,7 +21,7 @@ android:top="@dimen/all_apps_tabs_focus_vertical_inset"> - + \ No newline at end of file diff --git a/res/drawable/all_apps_tabs_background_unselected_focused.xml b/res/drawable/all_apps_tabs_background_unselected_focused.xml index 83038926ba..3564a0763e 100644 --- a/res/drawable/all_apps_tabs_background_unselected_focused.xml +++ b/res/drawable/all_apps_tabs_background_unselected_focused.xml @@ -28,7 +28,7 @@ android:top="@dimen/all_apps_tabs_focus_border"> - + diff --git a/res/drawable/bg_ps_mask_left_corner.xml b/res/drawable/bg_ps_mask_left_corner.xml index f87c497751..43eeedb0b4 100644 --- a/res/drawable/bg_ps_mask_left_corner.xml +++ b/res/drawable/bg_ps_mask_left_corner.xml @@ -24,7 +24,7 @@ + android:fillColor="?attr/allAppsScrimColor" /> \ No newline at end of file diff --git a/res/drawable/bg_ps_mask_right_corner.xml b/res/drawable/bg_ps_mask_right_corner.xml index 7a4c0d80c6..d63b866f9c 100644 --- a/res/drawable/bg_ps_mask_right_corner.xml +++ b/res/drawable/bg_ps_mask_right_corner.xml @@ -24,7 +24,7 @@ + android:fillColor="?attr/allAppsScrimColor" /> \ No newline at end of file diff --git a/res/drawable/bg_rounded_corner_bottom_sheet_handle.xml b/res/drawable/bg_rounded_corner_bottom_sheet_handle.xml index bf5d842577..b0bd33bb51 100644 --- a/res/drawable/bg_rounded_corner_bottom_sheet_handle.xml +++ b/res/drawable/bg_rounded_corner_bottom_sheet_handle.xml @@ -16,6 +16,6 @@ - + diff --git a/res/drawable/ic_bubble_button.xml b/res/drawable/ic_bubble_button.xml index 143c5c93fe..1ed212e09a 100644 --- a/res/drawable/ic_bubble_button.xml +++ b/res/drawable/ic_bubble_button.xml @@ -15,11 +15,11 @@ ~ limitations under the License. --> - + android:width="20dp" + android:height="20dp" + android:viewportWidth="24" + android:viewportHeight="24"> + diff --git a/res/drawable/ic_taskbar_all_apps_search_button_expressive_theme.xml b/res/drawable/ic_taskbar_all_apps_search_button_expressive_theme.xml index 852a077221..ed4a821c79 100644 --- a/res/drawable/ic_taskbar_all_apps_search_button_expressive_theme.xml +++ b/res/drawable/ic_taskbar_all_apps_search_button_expressive_theme.xml @@ -20,6 +20,6 @@ android:viewportWidth="52" android:viewportHeight="52"> \ No newline at end of file diff --git a/res/drawable/inset_rounded_action_button.xml b/res/drawable/inset_rounded_action_button.xml index 7b4c4d03c0..8ae40c07bb 100644 --- a/res/drawable/inset_rounded_action_button.xml +++ b/res/drawable/inset_rounded_action_button.xml @@ -21,10 +21,10 @@ android:insetRight="@dimen/inset_rounded_action_button"> - + + android:color="@color/materialColorSurfaceContainerLow" /> diff --git a/res/drawable/private_space_app_divider.xml b/res/drawable/private_space_app_divider.xml index 81cb4017b0..f92dca73d5 100644 --- a/res/drawable/private_space_app_divider.xml +++ b/res/drawable/private_space_app_divider.xml @@ -16,6 +16,6 @@ - + \ No newline at end of file diff --git a/res/drawable/ps_settings_background.xml b/res/drawable/ps_settings_background.xml index 7d568dc68e..7746012d40 100644 --- a/res/drawable/ps_settings_background.xml +++ b/res/drawable/ps_settings_background.xml @@ -18,6 +18,6 @@ android:inset="4dp"> - + \ No newline at end of file diff --git a/res/drawable/work_card.xml b/res/drawable/work_card.xml index ff66971af0..0e37d4f7b9 100644 --- a/res/drawable/work_card.xml +++ b/res/drawable/work_card.xml @@ -17,7 +17,7 @@ - + diff --git a/res/layout/add_item_confirmation_activity.xml b/res/layout/add_item_confirmation_activity.xml index 44c95c9816..2bb2eb3097 100644 --- a/res/layout/add_item_confirmation_activity.xml +++ b/res/layout/add_item_confirmation_activity.xml @@ -42,7 +42,7 @@ android:orientation="vertical" > + style="?android:attr/borderlessButtonStyle" />