diff --git a/core/modules/block/config/optional/tour.tour.block-layout.yml b/core/modules/block/config/optional/tour.tour.block-layout.yml
index c580d9c3ff..e5995a28b5 100644
--- a/core/modules/block/config/optional/tour.tour.block-layout.yml
+++ b/core/modules/block/config/optional/tour.tour.block-layout.yml
@@ -21,21 +21,21 @@ tips:
     plugin: text
     label: 'Place Blocks'
     weight: 2
-    selector: .button--small
+    selector: '.button--small'
     body: 'Any custom or contributed block can be added to a particular region by clicking on a button Place block. A new block can also be created by clicking on Place Block'
   block-region:
     id: block-region
     plugin: text
     label: 'Block Region'
     weight: 3
-    selector: .block-region-select
+    selector: '.block-region-select'
     body: 'Assign or change the region of a block by clicking here. A dropdown list with all the regions will appear.You can place one block in multiple regions.'
   configure-block:
     id: configure-block
     plugin: text
     label: 'Configure Block'
     weight: 4
-    selector: .dropbutton-widget
+    selector: '.dropbutton-widget'
     body: 'By Clicking on "Configure" you can go ahead and edit the contents of the block, deal with the visibility settings and even change the placement of where it is on your theme.'
   custom-block-library:
     id: custom-block-library
diff --git a/core/modules/language/config/optional/tour.tour.language.yml b/core/modules/language/config/optional/tour.tour.language.yml
index 08f2ede4ff..43eb19b21f 100644
--- a/core/modules/language/config/optional/tour.tour.language.yml
+++ b/core/modules/language/config/optional/tour.tour.language.yml
@@ -21,28 +21,28 @@ tips:
     plugin: text
     label: 'Adding languages'
     weight: 2
-    selector: .button-action
+    selector: '.button-action'
     body: '<p>To add more languages to your site, click the "Add language" button.</p><p>Added languages will be displayed in the language list and can then be edited or deleted.</p>'
   language-reorder:
     id: language-reorder
     plugin: text
     label: 'Reordering languages'
     weight: 3
-    selector: .draggable
+    selector: '.draggable'
     body: '<p>To reorder the languages on your site, use the drag icons next to each language.</p><p>The order shown here is the display order for language lists on the site such as in the language switcher blocks provided by the Interface Translation and Content Translation modules.</p><p>When you are done with reordering the languages, click the "Save configuration" button for the changes to take effect.</p>'
   language-default:
     id: language-default
     plugin: text
     label: 'Set a language as default'
     weight: 4
-    selector: .js-form-item-site-default-language
+    selector: '.js-form-item-site-default-language'
     body: '<p>You can change the default language of the site by choosing one of your configured languages as default. The site will use the default language in situations where no choice is made but a language should be set, for example as the language of the displayed interface.</p>'
   language-operations:
     id: language-operations
     plugin: text
     label: 'Modifying languages'
     weight: 5
-    selector: .dropbutton-wrapper
+    selector: '.dropbutton-wrapper'
     body: '<p>Operations are provided for editing and deleting your languages.</p><p>You can edit the name and the direction of the language.</p><p>Deleted languages can be added back at a later time. Deleting a language will remove all interface translations associated with it, and content in this language will be set to be language neutral. Note that you cannot delete the default language of the site.</p>'
   language-continue:
     id: language-continue
diff --git a/core/modules/locale/config/optional/tour.tour.locale.yml b/core/modules/locale/config/optional/tour.tour.locale.yml
index e79a088cfb..4ad9371c2a 100644
--- a/core/modules/locale/config/optional/tour.tour.locale.yml
+++ b/core/modules/locale/config/optional/tour.tour.locale.yml
@@ -49,7 +49,7 @@ tips:
     plugin: text
     label: Translate
     weight: 6
-    selector: .js-form-type-textarea
+    selector: '.js-form-type-textarea'
     body: 'You can write your own translation in the text fields of the right column. Try to figure out in which context the text will be used in order to translate it in the appropriate way.'
   locale-validate:
     id: locale-validate
diff --git a/core/modules/tour/config/schema/tour.schema.yml b/core/modules/tour/config/schema/tour.schema.yml
index e9c137cf48..d8ffed2133 100644
--- a/core/modules/tour/config/schema/tour.schema.yml
+++ b/core/modules/tour/config/schema/tour.schema.yml
@@ -42,23 +42,12 @@ tour.tip:
     weight:
       type: integer
       label: 'Weight'
-    location:
-      deprecated: "The tour.tip 'location' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead use 'position'. The value must be a valid placement accepted by PopperJS. See https://www.drupal.org/node/3204093"
-      type: string
-      label: 'Location'
     position:
       type: string
       label: 'Position'
     selector:
       type: string
       label: 'Selector'
-    attributes:
-      deprecated: "The tour.tip 'attributes' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead of 'data-class' and 'data-id' attributes, use 'selector' to specify the element a tip attaches to. See https://www.drupal.org/node/3204093"
-      type: sequence
-      label: 'Attributes'
-      sequence:
-        type: string
-        label: 'Attribute'
 
 tour.tip.text:
   type: tour.tip
diff --git a/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php b/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php
index f82b95eb4f..8b3a6eb50e 100644
--- a/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php
+++ b/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php
@@ -70,14 +70,4 @@ public function getBody(): array {
     ];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getOutput() {
-    // Call parent to trigger error when calling this function.
-    parent::getOutput();
-    $output = '<p class="tour-tip-body">' . $this->token->replace($this->get('body')) . '</p>';
-    return ['#markup' => $output];
-  }
-
 }
diff --git a/core/modules/tour/src/TipPluginBase.php b/core/modules/tour/src/TipPluginBase.php
index 01c7683dee..c72ae64eb3 100644
--- a/core/modules/tour/src/TipPluginBase.php
+++ b/core/modules/tour/src/TipPluginBase.php
@@ -28,28 +28,6 @@
    */
   protected $weight;
 
-  /**
-   * The attributes that will be applied to the markup of this tip.
-   *
-   * @var array
-   *
-   * @deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. There is no
-   *   direct replacement. Note that this was never actually used.
-   *
-   * @see https://www.drupal.org/node/3204096
-   */
-  protected $attributes;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    if (!$this instanceof TourTipPluginInterface) {
-      @trigger_error('Implementing ' . __NAMESPACE__ . '\TipPluginInterface without also implementing ' . __NAMESPACE__ . '\TourTipPluginInterface is deprecated in drupal:9.2.0. See https://www.drupal.org/node/3204096', E_USER_DEPRECATED);
-    }
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -71,38 +49,6 @@ public function getWeight() {
     return $this->get('weight');
   }
 
-  /**
-   * {@inheritdoc}
-   *
-   * @todo remove in https://drupal.org/node/3195193
-   */
-  public function getAttributes() {
-    // This method is deprecated and rewritten to be as backwards compatible as
-    // possible with pre-existing uses. Due to the flexibility of tip plugins,
-    // this backwards compatibility can't be fully guaranteed. Because of this,
-    // we trigger a warning to caution the use of this function. This warning
-    // does not stop page execution, but will be logged.
-    trigger_error(__NAMESPACE__ . '\TipPluginInterface::getAttributes is deprecated. Tour tip plugins should implement ' . __NAMESPACE__ . '\TourTipPluginInterface and Tour configs should use the \'selector\' property instead of \'attributes\' to target an element.', E_USER_WARNING);
-
-    // The _tour_update_joyride() updates the deprecated 'attributes' property
-    // to the current 'selector' property. It's possible that additional
-    // attributes not supported by Drupal core exist and these need to merged
-    // in.
-    $attributes = $this->get('attributes') ?: [];
-
-    // Convert the selector property to the expected structure.
-    $selector = $this->get('selector');
-    $first_char = substr($selector, 0, 1);
-    if ($first_char === '#') {
-      $attributes['data-id'] = substr($selector, 1);
-    }
-    elseif ($first_char === '.') {
-      $attributes['data-class'] = substr($selector, 1);
-    }
-
-    return $attributes;
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -119,30 +65,6 @@ public function set($key, $value) {
     $this->configuration[$key] = $value;
   }
 
-  /**
-   * This method should not be used. It is deprecated from TipPluginInterface.
-   *
-   * @return array
-   *   An intentionally empty array.
-   *
-   * @todo remove in https://drupal.org/node/3195193
-   */
-  public function getOutput() {
-    // The getOutput() method was a requirement of TipPluginInterface, but was
-    // not part of TipPluginBase prior to it being deprecated. As a result, all
-    // tip plugins have their own implementations of getOutput() making it
-    // unlikely that this implementation will be called. If it does get called,
-    // however, the tour tip will have no content due to this method returning
-    // an empty array. To help tour tips from unexpectedly having no content, a
-    // warning is triggered. This warning does not stop page
-    // execution, but will be logged.
-    trigger_error(__NAMESPACE__ . 'TipPluginInterface::getOutput is deprecated. Use getBody() instead. See https://www.drupal.org/node/3204096', E_USER_WARNING);
-
-    // This class must implement TipPluginInterface, but this method is
-    // deprecated. An empty array is returned to meet interface requirements.
-    return [];
-  }
-
   /**
    * Determines the placement of the tip relative to the element.
    *
diff --git a/core/modules/tour/src/TipPluginInterface.php b/core/modules/tour/src/TipPluginInterface.php
index a7fa22c366..e55b0771dc 100644
--- a/core/modules/tour/src/TipPluginInterface.php
+++ b/core/modules/tour/src/TipPluginInterface.php
@@ -36,18 +36,6 @@ public function getLabel();
    */
   public function getWeight();
 
-  /**
-   * Returns an array of attributes for the tip wrapper.
-   *
-   * @deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. The
-   *   attributes property is no longer used.
-   * @see https://www.drupal.org/node/3204093
-   *
-   * @return array
-   *   An array of classes and values.
-   */
-  public function getAttributes();
-
   /**
    * Used for returning values by key.
    *
@@ -70,17 +58,4 @@ public function get($key);
    */
   public function set($key, $value);
 
-  /**
-   * Returns a renderable array.
-   *
-   * @deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use
-   *   getBody() instead, and do not include the tip label in the returned
-   *   output.
-   * @see https://www.drupal.org/node/3195234
-   *
-   * @return array
-   *   A renderable array.
-   */
-  public function getOutput();
-
 }
diff --git a/core/modules/tour/src/TourTipPluginInterface.php b/core/modules/tour/src/TourTipPluginInterface.php
index ad2807cc51..005f857d13 100644
--- a/core/modules/tour/src/TourTipPluginInterface.php
+++ b/core/modules/tour/src/TourTipPluginInterface.php
@@ -9,9 +9,6 @@
  * @see \Drupal\tour\TipPluginBase
  * @see \Drupal\tour\TipPluginManager
  * @see plugin_api
- *
- * @todo move all methods to TipPluginInterface and deprecate this interface in
- *   https://drupal.org/node/3195193
  */
 interface TourTipPluginInterface extends TipPluginInterface {
 
diff --git a/core/modules/tour/src/TourViewBuilder.php b/core/modules/tour/src/TourViewBuilder.php
index d9b7c658f1..cafd4dd0c8 100644
--- a/core/modules/tour/src/TourViewBuilder.php
+++ b/core/modules/tour/src/TourViewBuilder.php
@@ -39,66 +39,14 @@ public function viewMultiple(array $entities = [], $view_mode = 'full', $langcod
         $selector = $tip->getSelector();
         $location = $tip->getLocation();
 
-        // If $location is null, it's possible that a value is available
-        // by directly accessing the `location` property. This can occur if
-        // a tour with the deprecated `location` property was installed and
-        // tour_post_update_joyride_selectors_to_selector_property() has not run
-        // with it installed.
-        // @see tour_post_update_joyride_selectors_to_selector_property()
-
-        if (!$location && $location = $tip->get('location')) {
-          // If the `location` property still has a value, this means the tip
-          // is configured for Joyride. The position value must be appended with
-          // '-start' to provide the same experience as Joyride.
-          $location = $location . '-start';
-        }
-
-        // @todo remove conditional in https://drupal.org/node/3195193, as all
-        //   instances will already be instances of TourTipPluginInterface.
-        if ($tip instanceof TourTipPluginInterface) {
-          $body_render_array = $tip->getBody();
-          $body = (string) \Drupal::service('renderer')->renderPlain($body_render_array);
-          $output = [
-            'body' => $body,
-            'title' => Html::escape($tip->getLabel()),
-          ];
-
-          $selector = $tip->getSelector();
-        }
-        else {
-          // This condition is met if the tip does not implement
-          // TourTipPluginInterface. This means the tour tip must be constructed
-          // with the deprecated getOutput() method. The resulting tour tip
-          // should be largely identical, with the following exceptions:
-          // - If the tour tip `attributes` property included anything other
-          //   than `data-class` or `data-id`, these additional attributes
-          //   will not be available in the resulting tour tip. Note that such
-          //   uses are uncommon.
-          // - Although the tour tip content is identical, the markup structure
-          //   will be different due to being rendered by Shepherd instead of
-          //   Joyride. Themes extending Stable or Stable 9 will not experience
-          //   these changes as a script is provided that reconstructs each tip
-          //   to match Joyride's markup structure.
-          $attributes = (array) $tip->get('attributes');
-          if (array_diff(['data-class', 'data-id'], array_keys($attributes + ['data-class', 'data-id']))) {
-            trigger_error('The tour tips only support data-class and data-id attributes and they will have to be upgraded manually. See https://www.drupal.org/node/3204093', E_USER_WARNING);
-          }
-          $tour_render_array = $tip->getOutput();
-          if (!empty($tour_render_array)) {
-            // The output render array intentionally omits title. The deprecated
-            // getOutput() returns a render array with the title and main
-            // content.
-            $output = [
-              'body' => (string) \Drupal::service('renderer')->renderPlain($tour_render_array),
-            ];
+        $body_render_array = $tip->getBody();
+        $body = (string) \Drupal::service('renderer')->renderPlain($body_render_array);
+        $output = [
+          'body' => $body,
+          'title' => Html::escape($tip->getLabel()),
+        ];
 
-            // Add a class so JavaScript in Stable themes can identify deprecated
-            // tip plugins. The logic used to make markup backwards compatible
-            // with Joyride is different depending on the type of
-            // plugin used.
-            $classes[] = 'tip-uses-get-output';
-          }
-        }
+        $selector = $tip->getSelector();
 
         if ($output) {
           $items[] = [
diff --git a/core/modules/tour/tests/fixtures/addTourLegacyConfig.php b/core/modules/tour/tests/fixtures/addTourLegacyConfig.php
deleted file mode 100644
index 8d37c90d02..0000000000
--- a/core/modules/tour/tests/fixtures/addTourLegacyConfig.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-/**
- * @file
- * Adds deprecated tour config for testing updates.
- *
- * @see https://www.drupal.org/node/3022401
- */
-
-use Drupal\Core\Database\Database;
-use Drupal\Core\Serialization\Yaml;
-
-$connection = Database::getConnection();
-
-$tour_with_location = Yaml::decode(file_get_contents(__DIR__ . '/legacy_config/tour.tour.tour-test-legacy-location.yml'));
-$connection->insert('config')
-  ->fields([
-    'collection',
-    'name',
-    'data',
-  ])
-  ->values([
-    'collection' => '',
-    'name' => 'tour.tour.tour-test-legacy-location',
-    'data' => serialize($tour_with_location),
-  ])
-  ->execute();
diff --git a/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy-location.yml b/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy-location.yml
deleted file mode 100644
index 6de9d25fe6..0000000000
--- a/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy-location.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-id: tour-test-legacy-location
-module: tour_test
-label: 'Tour test the location property'
-routes:
-  - route_name: some_tour_route
-tips:
-  location-test-top:
-    id: location-test-top
-    plugin: text
-    label: 'Top position'
-    body: 'Top that, top that'
-    location: top
-  location-test-bottom:
-    id: location-test-bottom
-    plugin: text
-    label: 'Bottom position'
-    body: 'You can give all that you can, but you will never top that'
-    location: bottom
-  location-test-left:
-    id: location-test-left
-    plugin: text
-    label: 'Left position'
-    body: "You can dream until you're blue but you can never top that, huh-huh!"
-    location: left
-  location-test-right:
-    id: location-test-right
-    plugin: text
-    label: 'Right position'
-    body: "I don't really give a [pause] about trying to top that"
-    location: right
diff --git a/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy.yml b/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy.yml
deleted file mode 100644
index 51ab1397fa..0000000000
--- a/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-id: tour-test-legacy
-module: tour_test
-label: 'Tour test Legacy'
-langcode: en
-routes:
-  - route_name: tour_test.legacy
-tips:
-  tour-test-legacy-1:
-    id: tour-test-legacy-1
-    plugin: text_legacy
-    label: 'The first tip'
-    body: 'Is <a href="[site:url]">[site:name]</a> always the best dressed?'
-    weight: 1
-    attributes:
-      data-id: tour-test-1
-  tour-test-legacy-3:
-    id: tour-test-legacy-3
-    plugin: image_legacy
-    label: 'The awesome image'
-    url: 'http://local/image.png'
-    weight: 1
-  tour-test-legacy-6:
-    id: tour-test-legacy-6
-    plugin: text_legacy
-    label: 'Im a list'
-    body: '<p>Im all these things:</p><ul><li>Modal</li><li>Awesome</li></ul>'
-    weight: 6
-    attributes:
-      data-class: tour-test-5
diff --git a/core/modules/tour/tests/src/Functional/Update/TourTipDeprecatedConfigModuleInstallTest.php b/core/modules/tour/tests/src/Functional/Update/TourTipDeprecatedConfigModuleInstallTest.php
deleted file mode 100644
index 48777588b4..0000000000
--- a/core/modules/tour/tests/src/Functional/Update/TourTipDeprecatedConfigModuleInstallTest.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-namespace Drupal\Tests\tour\Functional\Update;
-
-use Drupal\Tests\BrowserTestBase;
-
-/**
- * Confirms that legacy tour tips are updated when module config is imported.
- *
- * @group tour
- * @group legacy
- */
-class TourTipDeprecatedConfigModuleInstallTest extends BrowserTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected static $modules = ['tour'];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $defaultTheme = 'stark';
-
-  /**
-   * Test ensuring that tour config is updated on config import.
-   */
-  public function testModuleInstall() {
-    $this->expectDeprecation("The tour.tip 'attributes' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead of 'data-class' and 'data-id' attributes, use 'selector' to specify the element a tip attaches to. See https://www.drupal.org/node/3204093");
-    $this->expectDeprecation("The tour.tip 'location' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead use 'position'. The value must be a valid placement accepted by PopperJS. See https://www.drupal.org/node/3204093");
-
-    $this->container->get('module_installer')->install(['tour_test', 'tour_legacy_test']);
-    $updated_legacy_tour_config = $this->container->get('config.factory')->get('tour.tour.tour-test-legacy');
-    $updated_tips = $updated_legacy_tour_config->get('tips');
-
-    // Confirm that tour-test-1 uses `selector` instead of `data-id`.
-    $this->assertSame('#tour-test-1', $updated_tips['tour-test-legacy-1']['selector']);
-    $this->assertArrayNotHasKey('attributes', $updated_tips['tour-test-legacy-1']);
-
-    // Confirm that tour-test-5 uses `selector` instead of `data-class`.
-    $this->assertSame('.tour-test-5', $updated_tips['tour-test-legacy-6']['selector']);
-    $this->assertArrayNotHasKey('attributes', $updated_tips['tour-test-legacy-6']);
-
-    // Confirm that tour-test-legacy-7 uses `selector` instead of `data-class`.
-    $this->assertSame('.tour-test-7', $updated_tips['tour-test-legacy-7']['selector']);
-    $this->assertSame(['foo' => 'bar'], $updated_tips['tour-test-legacy-7']['attributes']);
-
-    $updated_legacy_location_tour_config = $this->container->get('config.factory')->get('tour.tour.tour-test-legacy-location');
-    $updated_location_tips = $updated_legacy_location_tour_config->get('tips');
-
-    $this->assertSame('top-start', $updated_location_tips['location-test-top']['position']);
-    $this->assertArrayNotHasKey('location', $updated_location_tips['location-test-top']);
-    $this->assertEquals('bottom-start', $updated_location_tips['location-test-bottom']['position']);
-    $this->assertArrayNotHasKey('location', $updated_location_tips['location-test-bottom']);
-    $this->assertEquals('right-start', $updated_location_tips['location-test-right']['position']);
-    $this->assertArrayNotHasKey('location', $updated_location_tips['location-test-right']);
-    $this->assertEquals('left-start', $updated_location_tips['location-test-left']['position']);
-    $this->assertArrayNotHasKey('location', $updated_location_tips['location-test-left']);
-  }
-
-}
diff --git a/core/modules/tour/tests/src/FunctionalJavascript/TourLegacyTest.php b/core/modules/tour/tests/src/FunctionalJavascript/TourLegacyTest.php
deleted file mode 100644
index 6d781b894c..0000000000
--- a/core/modules/tour/tests/src/FunctionalJavascript/TourLegacyTest.php
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-
-namespace Drupal\Tests\tour\FunctionalJavascript;
-
-use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
-
-/**
- * Tests Tour's backwards compatible markup and legacy config.
- *
- * @group tour
- * @group legacy
- */
-class TourLegacyTest extends WebDriverTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected static $modules = [
-    'tour',
-    'tour_legacy_test',
-    'toolbar',
-  ];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $defaultTheme = 'stable';
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp(): void {
-    parent::setUp();
-
-    $admin_user = $this->drupalCreateUser([
-      'access toolbar',
-      'access tour',
-    ]);
-    $this->drupalLogin($admin_user);
-  }
-
-  /**
-   * Confirms backwards compatible markup.
-   *
-   * @param string $path
-   *   The path to check.
-   * @param string $theme
-   *   The theme used by the tests.
-   *
-   * @dataProvider providerTestTourTipMarkup
-   */
-  public function testTourTipMarkup(string $path, string $theme = NULL) {
-    // Install the specified theme and make it default if that is not already
-    // the case.
-    if ($theme) {
-      $theme_manager = $this->container->get('theme.manager');
-      $this->container->get('theme_installer')->install([$theme], TRUE);
-
-      $system_theme_config = $this->container->get('config.factory')->getEditable('system.theme');
-      $system_theme_config
-        ->set('default', $theme)
-        ->save();
-      $this->rebuildAll();
-      $this->assertSame($theme, $theme_manager->getActiveTheme()->getName());
-    }
-
-    $page = $this->getSession()->getPage();
-    $assert_session = $this->assertSession();
-    $this->drupalGet($path);
-
-    $assert_session->waitForElementVisible('css', '#toolbar-tab-tour button');
-    $page->find('css', '#toolbar-tab-tour button')->press();
-    $this->assertToolTipMarkup(0, 'top');
-    $page->find('css', '.joyride-tip-guide[data-index="0"]')->clickLink('Next');
-    $this->assertToolTipMarkup(1, '', 'image');
-    $page->find('css', '.joyride-tip-guide[data-index="1"]')->clickLink('Next');
-    $this->assertToolTipMarkup(2, 'top', 'body');
-    $tip_content = $assert_session->waitForElementVisible('css', '.joyride-tip-guide[data-index="2"] .joyride-content-wrapper');
-
-    $additional_paragraph = $tip_content->find('css', '.tour-tip-body + p');
-    $this->assertNotNull($additional_paragraph, 'Tip 3 has an additional paragraph that is a sibling to the main paragraph.');
-    $additional_list = $tip_content->find('css', '.tour-tip-body + p + ul');
-    $this->assertNotNull($additional_list, 'Tip 3 has an additional unordered list that is a sibling to the main paragraph.');
-  }
-
-  /**
-   * Asserts the markup structure of a tip.
-   *
-   * @param int $index
-   *   The position of the tip within the tour.
-   * @param string $nub_position
-   *   The expected position of the nub arrow.
-   * @param string $joyride_content_container_name
-   *   For identifying classnames specific to a tip type.
-   *
-   * @internal
-   */
-  private function assertToolTipMarkup(int $index, string $nub_position, string $joyride_content_container_name = 'body'): void {
-    $assert_session = $this->assertSession();
-    $tip = $assert_session->waitForElementVisible('css', ".joyride-tip-guide[data-index=\"$index\"]");
-    $this->assertNotNull($tip, 'The tour tip element is present.');
-
-    $nub = $tip->find('css', ".joyride-tip-guide[data-index=\"$index\"] > .joyride-nub");
-    $this->assertNotNull($nub, 'The nub element is present.');
-    if (!empty($nub_position)) {
-      $this->assertTrue($nub->hasClass($nub_position), 'The nub has a class that indicates its configured position.');
-    }
-
-    $content_wrapper = $tip->find('css', '.joyride-nub + .joyride-content-wrapper');
-    $this->assertNotNull($content_wrapper, 'The joyride content wrapper exists, and is the next sibling of the nub.');
-
-    $label = $tip->find('css', '.joyride-content-wrapper > h2.tour-tip-label:first-child');
-    $this->assertNotNull($label, 'The tour tip label is an h2, and is the first child of the content wrapper.');
-
-    $tip_content = $content_wrapper->find('css', "h2.tour-tip-label + p.tour-tip-$joyride_content_container_name");
-    $this->assertNotNull($tip_content, 'The tip\'s main paragraph is the next sibling of the label, and has the expected wrapper class.');
-
-    $tour_progress = $content_wrapper->find('css', "h2.tour-tip-label + p.tour-tip-$joyride_content_container_name ~ div.tour-progress");
-    $this->assertNotNull($tour_progress, 'The div containing tour progress info is present, and is the next sibling of the main paragraph.');
-
-    $next_item = $content_wrapper->find('css', ".tour-progress + a.joyride-next-tip.button.button--primary");
-    $this->assertNotNull($next_item, 'The "Next" link is present, and the next sibling of the div containing progress info.');
-
-    $close_tour = $content_wrapper->find('css', ".joyride-content-wrapper > a.joyride-close-tip:last-child");
-    $this->assertNotNull($close_tour, 'The "Close" link is present, is an immediate child of the content wrapper, and is the last child.');
-  }
-
-  /**
-   * Data Provider.
-   *
-   * @return \string[][]
-   *   An array with two potential items:
-   *   - The different path the test will run on.
-   *   - The active theme when running the tests.
-   */
-  public function providerTestTourTipMarkup() {
-    return [
-      'Using the the deprecated TipPlugin with Stable theme' => ['tour-test-legacy'],
-      'Using current TourTipPlugin with Stable theme' => ['tour-test-1'],
-      'Using the the deprecated TipPlugin with Stable 9 theme' => ['tour-test-legacy', 'stable9'],
-      'Using current TourTipPlugin with Stable 9 theme' => ['tour-test-1', 'stable9'],
-    ];
-  }
-
-}
diff --git a/core/modules/tour/tests/src/Kernel/TourPluginTest.php b/core/modules/tour/tests/src/Kernel/TourPluginTest.php
index 3cd3a2c634..d647716c2f 100644
--- a/core/modules/tour/tests/src/Kernel/TourPluginTest.php
+++ b/core/modules/tour/tests/src/Kernel/TourPluginTest.php
@@ -3,8 +3,6 @@
 namespace Drupal\Tests\tour\Kernel;
 
 use Drupal\KernelTests\KernelTestBase;
-use Drupal\tour\Entity\Tour;
-use PHPUnit\Framework\Error\Warning;
 
 /**
  * Tests the functionality of tour plugins.
@@ -44,60 +42,4 @@ public function testTourPlugins() {
     $this->assertCount(1, $this->pluginManager->getDefinitions(), 'Only tour plugins for the enabled modules were returned.');
   }
 
-  /**
-   * Test that warnings and deprecations are triggered.
-   *
-   * @group legacy
-   */
-  public function testDeprecatedMethodWarningsErrors() {
-    \Drupal::service('module_installer')->install(['tour_legacy_test']);
-    $tip = Tour::load('tour-test')->getTips()[0];
-
-    // These are E_USER_WARNING severity errors that supplement existing
-    // deprecation errors. These warnings are triggered when methods are called
-    // that are designed to be backwards compatible, but aren't able to 100%
-    // promise this due to the many ways that tip plugins can be extended.
-    try {
-      $tip->getOutput();
-      $this->fail('No getOutput() warning triggered.');
-    }
-    catch (Warning $e) {
-      $this->assertSame('Drupal\tourTipPluginInterface::getOutput is deprecated. Use getBody() instead. See https://www.drupal.org/node/3204096', $e->getMessage());
-    }
-
-    try {
-      $tip->getAttributes();
-      $this->fail('No getAttributes() warning triggered.');
-    }
-    catch (Warning $e) {
-      $this->assertSame('Drupal\tour\TipPluginInterface::getAttributes is deprecated. Tour tip plugins should implement Drupal\tour\TourTipPluginInterface and Tour configs should use the \'selector\' property instead of \'attributes\' to target an element.', $e->getMessage());
-    }
-
-    // Remove PHPUnits conversion of warning to exceptions.
-    set_error_handler(function () {});
-    $tip = Tour::load('tour-test-legacy')->getTips()[3];
-    $attributes = $tip->getAttributes();
-    restore_error_handler();
-    $this->assertSame([
-      'foo' => 'bar',
-      'data-class' => 'tour-test-7',
-      'data-aria-describedby' => 'tour-tip-tour-test-legacy-7-contents',
-      'data-aria-labelledby' => 'tour-tip-tour-test-legacy-7-label',
-    ], $attributes);
-
-    $this->expectDeprecation('Implementing Drupal\tour\TipPluginInterface without also implementing Drupal\tour\TourTipPluginInterface is deprecated in drupal:9.2.0. See https://www.drupal.org/node/3204096');
-    $this->expectDeprecation("The tour.tip 'attributes' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead of 'data-class' and 'data-id' attributes, use 'selector' to specify the element a tip attaches to. See https://www.drupal.org/node/3204093");
-    $this->expectDeprecation("The tour.tip 'location' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead use 'position'. The value must be a valid placement accepted by PopperJS. See https://www.drupal.org/node/3204093");
-
-    try {
-      \Drupal::entityTypeManager()
-        ->getViewBuilder('tour')
-        ->viewMultiple([Tour::load('tour-test-legacy')], 'full');
-      $this->fail('No deprecated interface warning triggered.');
-    }
-    catch (Warning $e) {
-      $this->assertSame('The tour tips only support data-class and data-id attributes and they will have to be upgraded manually. See https://www.drupal.org/node/3204093', $e->getMessage());
-    }
-  }
-
 }
diff --git a/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy-location.yml b/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy-location.yml
deleted file mode 100644
index 3113e47e26..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy-location.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-id: tour-test-legacy-location
-label: 'Tour test the location property'
-module: tour_test
-routes:
-  -
-    route_name: some_tour_route
-tips:
-  location-test-top:
-    id: location-test-top
-    plugin: text
-    label: 'Top position'
-    location: top
-    body: 'Top that, top that'
-  location-test-bottom:
-    id: location-test-bottom
-    plugin: text
-    label: 'Bottom position'
-    location: bottom
-    body: 'You can give all that you can, but you will never top that'
-  location-test-left:
-    id: location-test-left
-    plugin: text
-    label: 'Left position'
-    location: left
-    body: 'You can dream until you''re blue but you can never top that, huh-huh!'
-  location-test-right:
-    id: location-test-right
-    plugin: text
-    label: 'Right position'
-    location: right
-    body: 'I don''t really give a [pause] about trying to top that'
diff --git a/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy.yml b/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy.yml
deleted file mode 100644
index 2a1b021bbf..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-langcode: en
-id: tour-test-legacy
-label: 'Tour test Legacy'
-module: tour_test
-routes:
-  -
-    route_name: tour_test.legacy
-tips:
-  tour-test-legacy-1:
-    id: tour-test-legacy-1
-    plugin: text_legacy
-    label: 'The first legacy tip'
-    body: 'Is <a href="[site:url]">[site:name]</a> always the best dressed?'
-    weight: 1
-    attributes:
-      data-id: tour-test-1
-  tour-test-legacy-3:
-    id: tour-test-legacy-3
-    plugin: image_legacy
-    label: 'The awesome legacy image'
-    url: 'http://local/image.png'
-    weight: 1
-  tour-test-legacy-6:
-    id: tour-test-legacy-6
-    plugin: text_legacy
-    label: 'Im a legacy list'
-    body: '<p>Im all these things:</p><ul><li>Modal</li><li>Awesome</li></ul>'
-    weight: 6
-    attributes:
-      data-class: tour-test-5
-  tour-test-legacy-7:
-    id: tour-test-legacy-7
-    plugin: text_legacy
-    label: 'Im a legacy list with more attributes'
-    body: '<p>More attributes</p>'
-    weight: 8
-    attributes:
-      data-class: tour-test-7
-      foo: bar
diff --git a/core/modules/tour/tests/tour_legacy_test/config/schema/tour_legacy_test.schema.yml b/core/modules/tour/tests/tour_legacy_test/config/schema/tour_legacy_test.schema.yml
deleted file mode 100644
index 7e90ed43d1..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/config/schema/tour_legacy_test.schema.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-# Schema for the configuration files of the Tour Test Legacy module.
-
-tour.tip.image_legacy:
-  type: tour.tip
-  label: 'Image tour tip'
-  mapping:
-    url:
-      type: uri
-      label: 'Image URL'
-
-tour.tip.text_legacy:
-  type: tour.tip
-  label: 'Textual tour tip'
-  mapping:
-    body:
-      type: text
-      label: 'Body'
diff --git a/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.info.yml b/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.info.yml
deleted file mode 100644
index ecf2e051c0..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.info.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: Tour legacy plugin tests
-type: module
-description: Tests related to deprecated plugins.
-package: Testing
-version: VERSION
-dependencies:
-  - drupal:tour
-  - drupal:tour_test
diff --git a/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.routing.yml b/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.routing.yml
deleted file mode 100644
index a3eae77374..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.routing.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-tour_test.legacy:
-  path: '/tour-test-legacy'
-  defaults:
-    _controller: '\Drupal\tour_test\Controller\TourTestController::tourTest1'
-  options:
-    _admin_route: TRUE
-  requirements:
-    _access: 'TRUE'
diff --git a/core/modules/tour/tests/tour_test/config/install/tour.tour.tour-test.yml b/core/modules/tour/tests/tour_test/config/install/tour.tour.tour-test.yml
index 5ca1fa4899..018f1ce4c6 100644
--- a/core/modules/tour/tests/tour_test/config/install/tour.tour.tour-test.yml
+++ b/core/modules/tour/tests/tour_test/config/install/tour.tour.tour-test.yml
@@ -22,7 +22,7 @@ tips:
     plugin: text
     label: 'The action'
     weight: 2
-    selector: .button-action
+    selector: '.button-action'
     body: 'The action button of awesome'
   tour-test-3:
     id: tour-test-3
diff --git a/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginImageLegacy.php b/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginImageLegacy.php
index 303e33f5e3..ff793c099b 100644
--- a/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginImageLegacy.php
+++ b/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginImageLegacy.php
@@ -81,19 +81,4 @@ public function getConfigurationOrNot() {
     ];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getOutput() {
-    $prefix = '<h2 class="tour-tip-label" id="tour-tip-' . $this->get('ariaId') . '-label">' . Html::escape($this->get('label')) . '</h2>';
-    $prefix .= '<p class="tour-tip-image" id="tour-tip-' . $this->get('ariaId') . '-contents">';
-    return [
-      '#prefix' => $prefix,
-      '#theme' => 'image',
-      '#uri' => $this->get('url'),
-      '#alt' => $this->get('alt'),
-      '#suffix' => '</p>',
-    ];
-  }
-
 }
diff --git a/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginTextLegacy.php b/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginTextLegacy.php
index c610e0b16a..c9e505d14c 100644
--- a/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginTextLegacy.php
+++ b/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginTextLegacy.php
@@ -93,26 +93,4 @@ public function getBody() {
     return $this->get('body');
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getAttributes() {
-    $attributes = parent::getAttributes();
-    $attributes['data-aria-describedby'] = 'tour-tip-' . $this->getAriaId() . '-contents';
-    $attributes['data-aria-labelledby'] = 'tour-tip-' . $this->getAriaId() . '-label';
-    if ($location = $this->get('location')) {
-      $attributes['data-options'] = 'tipLocation:' . $location;
-    }
-    return $attributes;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getOutput() {
-    $output = '<h2 class="tour-tip-label" id="tour-tip-' . $this->getAriaId() . '-label">' . Html::escape($this->getLabel()) . '</h2>';
-    $output .= '<p class="tour-tip-body" id="tour-tip-' . $this->getAriaId() . '-contents">' . $this->token->replace($this->getBody()) . '</p>';
-    return ['#markup' => $output];
-  }
-
 }
diff --git a/core/modules/tour/tour.module b/core/modules/tour/tour.module
index 3430921877..e6bbd2ae63 100644
--- a/core/modules/tour/tour.module
+++ b/core/modules/tour/tour.module
@@ -114,82 +114,3 @@ function tour_tour_insert($entity) {
 function tour_tour_update($entity) {
   \Drupal::service('plugin.manager.tour.tip')->clearCachedDefinitions();
 }
-
-/**
- * Implements hook_ENTITY_TYPE_presave() for tour entities.
- *
- * @todo https://www.drupal.org/i/3195823 Remove once deprecated properties are
- *   no longer supported.
- */
-function tour_tour_presave(Tour $tour) {
-  _tour_update_joyride($tour);
-}
-
-/**
- * Updates a tour to make it compatible with the Shepherd library.
- *
- * @param \Drupal\tour\Entity\Tour $tour
- *   The tour to update.
- * @param bool $trigger_deprecation
- *   (optional) Whether to trigger deprecations. Defaults to TRUE.
- *
- * @return bool
- *   Whether or not the entity needs saving.
- *
- * @see tour_post_update_joyride_selectors_to_selector_property()
- *
- * @internal
- *
- * @todo https://www.drupal.org/i/3195823 Remove once deprecated properties are
- *   no longer supported.
- */
-function _tour_update_joyride(Tour $tour, bool $trigger_deprecation = TRUE): bool {
-  $needs_save = FALSE;
-
-  // Update jQuery Joyride based plugins into a new, more structured format that
-  // is compatible with Shepherd.
-  $tips = $tour->get('tips');
-  foreach ($tips as &$tip) {
-    if (isset($tip['attributes']['data-class']) || isset($tip['attributes']['data-id'])) {
-      if ($trigger_deprecation) {
-        @trigger_error("The tour.tip 'attributes' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead of 'data-class' and 'data-id' attributes, use 'selector' to specify the element a tip attaches to. See https://www.drupal.org/node/3204093", E_USER_DEPRECATED);
-      }
-
-      $needs_save = TRUE;
-      $selector = isset($tip['attributes']['data-class']) ? ".{$tip['attributes']['data-class']}" : NULL;
-      $selector = isset($tip['attributes']['data-id']) ? "#{$tip['attributes']['data-id']}" : $selector;
-      $tip['selector'] = $selector;
-
-      // Although the attributes property is deprecated, only the properties
-      // with 1:1 equivalents are unset.
-      unset($tip['attributes']['data-class'], $tip['attributes']['data-id']);
-      // Remove attributes if it is now empty.
-      if (empty($tip['attributes'])) {
-        unset($tip['attributes']);
-      }
-    }
-    if (isset($tip['location'])) {
-      if ($trigger_deprecation) {
-        @trigger_error("The tour.tip 'location' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead use 'position'. The value must be a valid placement accepted by PopperJS. See https://www.drupal.org/node/3204093", E_USER_DEPRECATED);
-      }
-      $needs_save = TRUE;
-
-      // Joyride only supports four location options: 'top', 'bottom',
-      // 'left', and 'right'. Shepherd also accepts these as options, but they
-      // result in different behavior. A given Joyride location option will
-      // provide the same results in Shepherd if '-start' is appended to it (
-      // e.g. the 'left-start' option in Shepherd positions the element the
-      // same way that 'left' does in Joyride.
-      //
-      // @see https://shepherdjs.dev/docs/Step.html
-      $tip['position'] = $tip['location'] . '-start';
-      unset($tip['location']);
-    }
-  }
-
-  if ($needs_save) {
-    $tour->set('tips', $tips);
-  }
-
-  return $needs_save;
-}
diff --git a/core/modules/tour/tour.post_update.php b/core/modules/tour/tour.post_update.php
deleted file mode 100644
index 9e31ddd9b2..0000000000
--- a/core/modules/tour/tour.post_update.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-/**
- * @file
- * Post update functions for Tour.
- */
-
-/**
- * Implements hook_removed_post_updates().
- */
-function tour_removed_post_updates() {
-  return [
-    'tour_post_update_joyride_selectors_to_selector_property' => '10.0.0',
-  ];
-}
diff --git a/core/modules/views_ui/config/optional/tour.tour.views-ui.yml b/core/modules/views_ui/config/optional/tour.tour.views-ui.yml
index 644b51f036..d6dc6b65d3 100644
--- a/core/modules/views_ui/config/optional/tour.tour.views-ui.yml
+++ b/core/modules/views_ui/config/optional/tour.tour.views-ui.yml
@@ -38,21 +38,21 @@ tips:
     plugin: text
     label: 'Output format'
     weight: 4
-    selector: .views-ui-display-tab-bucket.format
+    selector: '.views-ui-display-tab-bucket.format'
     body: 'Choose how to output results. E.g., choose <em>Content</em> to output each item completely, using your configured display settings. Or choose <em>Fields</em>, which allows you to output only specific fields for each result. Additional formats can be added by installing modules to <em>extend</em> Drupal''s base functionality.'
   views-ui-fields:
     id: views-ui-fields
     plugin: text
     label: Fields
     weight: 5
-    selector: .views-ui-display-tab-bucket.field
+    selector: '.views-ui-display-tab-bucket.field'
     body: 'If this view uses fields, they are listed here. You can click on a field to configure it.'
   views-ui-filter:
     id: views-ui-filter
     plugin: text
     label: 'Filter your view'
     weight: 6
-    selector: .views-ui-display-tab-bucket.filter
+    selector: '.views-ui-display-tab-bucket.filter'
     body: 'Add filters to limit the results in the output. E.g., to only show content that is <em>published</em>, you would add a filter for <em>Published</em> and select <em>Yes</em>.'
   views-ui-filter-operations:
     id: views-ui-filter-operations
@@ -66,7 +66,7 @@ tips:
     plugin: text
     label: 'Sort Criteria'
     weight: 8
-    selector: .views-ui-display-tab-bucket.sort
+    selector: '.views-ui-display-tab-bucket.sort'
     body: 'Control the order in which the results are output. Click on an active sort rule to configure it.'
   views-ui-sorts-operations:
     id: views-ui-sorts-operations
diff --git a/core/profiles/demo_umami/config/install/tour.tour.umami-front.yml b/core/profiles/demo_umami/config/install/tour.tour.umami-front.yml
index 219e88de87..67fd1e63ed 100644
--- a/core/profiles/demo_umami/config/install/tour.tour.umami-front.yml
+++ b/core/profiles/demo_umami/config/install/tour.tour.umami-front.yml
@@ -28,7 +28,7 @@ tips:
     label: Navigation
     weight: 3
     position: right
-    selector: .menu-main__link.is-active
+    selector: '.menu-main__link.is-active'
     body: 'This is the main navigation menu for the Umami website. It is simple to create and administer menus and you can create as many menus as your site requires. For example, this site provides this main navigation as well as the user navigation displayed above.'
   umami-theme:
     id: umami-theme
diff --git a/core/tests/Drupal/KernelTests/Core/Config/DefaultConfigTest.php b/core/tests/Drupal/KernelTests/Core/Config/DefaultConfigTest.php
index 32c13c720f..5b8af90f28 100644
--- a/core/tests/Drupal/KernelTests/Core/Config/DefaultConfigTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Config/DefaultConfigTest.php
@@ -40,10 +40,6 @@ class DefaultConfigTest extends KernelTestBase {
     'config_schema_test.someschema.somemodule.section_two.subsection',
     'config_schema_test.someschema.with_parents',
     'config_schema_test.someschema',
-    // Skip tour-test-legacy files as they intentionally have deprecated
-    // properties.
-    'tour.tour.tour-test-legacy',
-    'tour.tour.tour-test-legacy-location',
   ];
 
   /**
diff --git a/core/themes/stable/js/tour.es6.js b/core/themes/stable/js/tour.es6.js
index 6d5e66b506..3a565ee191 100644
--- a/core/themes/stable/js/tour.es6.js
+++ b/core/themes/stable/js/tour.es6.js
@@ -61,50 +61,20 @@
     );
     shepherdElement.querySelector('footer').remove();
 
-    // If the class list includes `tip-uses-get-output`, then the tip was created
-    // by a deprecated tip plugin. This means the markup has some differences
-    // that require some different steps to rebuild it as Joyride BC markup.
-    // @todo remove the contents of the 'if' in this conditional in
-    //   https://drupal.org/node/3195193.
-    if (shepherdElement.classList.contains('tip-uses-get-output')) {
-      // Move the next button.
-      shepherdText.appendChild(shepherdNext);
+    // Rearrange elements so their structure matches Joyride's.
+    shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
+    shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
+    shepherdContent.appendChild(shepherdCancel);
+    shepherdContent.querySelector('.shepherd-header').remove();
+    shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
+    shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
+    shepherdTitle.classList.add('tour-tip-label');
 
-      // Move the cancel button and remove the now unnecessary header.
-      shepherdText.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
+    // Convert elements to use the tags they used in Joyride.
+    changeTag(shepherdTitle, 'h2');
 
-      // Remove empty paragraphs from the text container markup.
-      Array.from(shepherdText.children).forEach((node) => {
-        if (
-          node.tagName === 'P' &&
-          node.textContent === '' &&
-          node.classList.length === 0
-        ) {
-          node.remove();
-        }
-      });
-
-      // Move the contents of shepherdText directly into shepherdContent to
-      // remove the now redundant `<p>` provided by TipPlugin. Shepherd already
-      // wraps its content in a `<p>`, so the Plugin provided tag is redundant.
-      shepherdContent.innerHTML = shepherdText.innerHTML;
-    } else {
-      // Rearrange elements so their structure matches Joyride's.
-      shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
-      shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
-      shepherdContent.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
-      shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
-      shepherdTitle.classList.add('tour-tip-label');
-
-      // Convert elements to use the tags they used in Joyride.
-      changeTag(shepherdTitle, 'h2');
-
-      // Remove the wrapper Shepherd adds for tip content.
-      shepherdText.outerHTML = shepherdText.innerHTML;
-    }
+    // Remove the wrapper Shepherd adds for tip content.
+    shepherdText.outerHTML = shepherdText.innerHTML;
 
     // Convert the next and cancel buttons to links so they match Joyride's
     // markup. They must be re-queried as they were potentially moved elsewhere
diff --git a/core/themes/stable/js/tour.js b/core/themes/stable/js/tour.js
index fb554afbae..7962bdfdf2 100644
--- a/core/themes/stable/js/tour.js
+++ b/core/themes/stable/js/tour.js
@@ -37,29 +37,15 @@
     shepherdCancel.setAttribute('role', 'button');
     shepherdElement.setAttribute('data-index', shepherdTour.currentStep.options.index);
     shepherdElement.querySelector('footer').remove();
-
-    if (shepherdElement.classList.contains('tip-uses-get-output')) {
-      shepherdText.appendChild(shepherdNext);
-      shepherdText.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      Array.from(shepherdText.children).forEach(node => {
-        if (node.tagName === 'P' && node.textContent === '' && node.classList.length === 0) {
-          node.remove();
-        }
-      });
-      shepherdContent.innerHTML = shepherdText.innerHTML;
-    } else {
-      shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
-      shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
-      shepherdContent.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
-      shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
-      shepherdTitle.classList.add('tour-tip-label');
-      changeTag(shepherdTitle, 'h2');
-      shepherdText.outerHTML = shepherdText.innerHTML;
-    }
-
+    shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
+    shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
+    shepherdContent.appendChild(shepherdCancel);
+    shepherdContent.querySelector('.shepherd-header').remove();
+    shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
+    shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
+    shepherdTitle.classList.add('tour-tip-label');
+    changeTag(shepherdTitle, 'h2');
+    shepherdText.outerHTML = shepherdText.innerHTML;
     changeTag(shepherdElement.querySelector('.joyride-close-tip'), 'a');
     changeTag(shepherdElement.querySelector('.joyride-next-tip'), 'a');
     const shepherdArrow = shepherdElement.querySelector('.shepherd-arrow');
diff --git a/core/themes/stable9/js/tour.es6.js b/core/themes/stable9/js/tour.es6.js
index 6d5e66b506..3a565ee191 100644
--- a/core/themes/stable9/js/tour.es6.js
+++ b/core/themes/stable9/js/tour.es6.js
@@ -61,50 +61,20 @@
     );
     shepherdElement.querySelector('footer').remove();
 
-    // If the class list includes `tip-uses-get-output`, then the tip was created
-    // by a deprecated tip plugin. This means the markup has some differences
-    // that require some different steps to rebuild it as Joyride BC markup.
-    // @todo remove the contents of the 'if' in this conditional in
-    //   https://drupal.org/node/3195193.
-    if (shepherdElement.classList.contains('tip-uses-get-output')) {
-      // Move the next button.
-      shepherdText.appendChild(shepherdNext);
+    // Rearrange elements so their structure matches Joyride's.
+    shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
+    shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
+    shepherdContent.appendChild(shepherdCancel);
+    shepherdContent.querySelector('.shepherd-header').remove();
+    shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
+    shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
+    shepherdTitle.classList.add('tour-tip-label');
 
-      // Move the cancel button and remove the now unnecessary header.
-      shepherdText.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
+    // Convert elements to use the tags they used in Joyride.
+    changeTag(shepherdTitle, 'h2');
 
-      // Remove empty paragraphs from the text container markup.
-      Array.from(shepherdText.children).forEach((node) => {
-        if (
-          node.tagName === 'P' &&
-          node.textContent === '' &&
-          node.classList.length === 0
-        ) {
-          node.remove();
-        }
-      });
-
-      // Move the contents of shepherdText directly into shepherdContent to
-      // remove the now redundant `<p>` provided by TipPlugin. Shepherd already
-      // wraps its content in a `<p>`, so the Plugin provided tag is redundant.
-      shepherdContent.innerHTML = shepherdText.innerHTML;
-    } else {
-      // Rearrange elements so their structure matches Joyride's.
-      shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
-      shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
-      shepherdContent.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
-      shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
-      shepherdTitle.classList.add('tour-tip-label');
-
-      // Convert elements to use the tags they used in Joyride.
-      changeTag(shepherdTitle, 'h2');
-
-      // Remove the wrapper Shepherd adds for tip content.
-      shepherdText.outerHTML = shepherdText.innerHTML;
-    }
+    // Remove the wrapper Shepherd adds for tip content.
+    shepherdText.outerHTML = shepherdText.innerHTML;
 
     // Convert the next and cancel buttons to links so they match Joyride's
     // markup. They must be re-queried as they were potentially moved elsewhere
diff --git a/core/themes/stable9/js/tour.js b/core/themes/stable9/js/tour.js
index fb554afbae..7962bdfdf2 100644
--- a/core/themes/stable9/js/tour.js
+++ b/core/themes/stable9/js/tour.js
@@ -37,29 +37,15 @@
     shepherdCancel.setAttribute('role', 'button');
     shepherdElement.setAttribute('data-index', shepherdTour.currentStep.options.index);
     shepherdElement.querySelector('footer').remove();
-
-    if (shepherdElement.classList.contains('tip-uses-get-output')) {
-      shepherdText.appendChild(shepherdNext);
-      shepherdText.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      Array.from(shepherdText.children).forEach(node => {
-        if (node.tagName === 'P' && node.textContent === '' && node.classList.length === 0) {
-          node.remove();
-        }
-      });
-      shepherdContent.innerHTML = shepherdText.innerHTML;
-    } else {
-      shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
-      shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
-      shepherdContent.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
-      shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
-      shepherdTitle.classList.add('tour-tip-label');
-      changeTag(shepherdTitle, 'h2');
-      shepherdText.outerHTML = shepherdText.innerHTML;
-    }
-
+    shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
+    shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
+    shepherdContent.appendChild(shepherdCancel);
+    shepherdContent.querySelector('.shepherd-header').remove();
+    shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
+    shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
+    shepherdTitle.classList.add('tour-tip-label');
+    changeTag(shepherdTitle, 'h2');
+    shepherdText.outerHTML = shepherdText.innerHTML;
     changeTag(shepherdElement.querySelector('.joyride-close-tip'), 'a');
     changeTag(shepherdElement.querySelector('.joyride-next-tip'), 'a');
     const shepherdArrow = shepherdElement.querySelector('.shepherd-arrow');
