static,internal: remove new-unit-layout experiment

Change-Id: Ib7d3a51fdc427cabcbec998130c6973497c1a750
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/344394
Trust: Jamal Carvalho <jamal@golang.org>
Run-TryBot: Jamal Carvalho <jamal@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/frontend/server.go b/internal/frontend/server.go
index 0d15648..081e4f2 100644
--- a/internal/frontend/server.go
+++ b/internal/frontend/server.go
@@ -268,11 +268,6 @@
 	// Enables the two and three column layouts on the unit page.
 	UseResponsiveLayout bool
 
-	// UseSiteWrapper indicates whether the page content should be wrapped in the
-	// Site class. This is only used for unit pages until the migration to the new
-	// layout base page is completed.
-	UseSiteWrapper bool
-
 	// SearchMode is the search mode for the current search request.
 	SearchMode string
 
@@ -565,40 +560,7 @@
 	tsc := template.TrustedSourceFromConstant
 	join := template.TrustedSourceJoin
 
-	legacyHtmlSets := [][]template.TrustedSource{
-		{tsc("unit_details.tmpl"), tsc("unit.tmpl")},
-		{tsc("unit_importedby.tmpl"), tsc("unit.tmpl")},
-		{tsc("unit_imports.tmpl"), tsc("unit.tmpl")},
-		{tsc("unit_licenses.tmpl"), tsc("unit.tmpl")},
-		{tsc("unit_versions.tmpl"), tsc("unit.tmpl")},
-	}
-
 	templates := make(map[string]*template.Template)
-	for _, set := range legacyHtmlSets {
-		t, err := template.New("frontend.tmpl").Funcs(templateFuncs).ParseFilesFromTrustedSources(join(base, tsc("frontend/frontend.tmpl")))
-		if err != nil {
-			return nil, fmt.Errorf("ParseFiles: %v", err)
-		}
-		helperGlob := join(base, tsc("legacy/html/helpers/*.tmpl"))
-		if _, err := t.ParseGlobFromTrustedSource(helperGlob); err != nil {
-			return nil, fmt.Errorf("ParseGlob(%q): %v", helperGlob, err)
-		}
-		header := join(base, tsc("shared/header/header.tmpl"))
-		footer := join(base, tsc("shared/footer/footer.tmpl"))
-		if _, err := t.ParseFilesFromTrustedSources(header, footer); err != nil {
-			return nil, fmt.Errorf("ParseFilesFromTrustedSources(%v, %v): %v", header, footer, err)
-		}
-
-		var files []template.TrustedSource
-		for _, f := range set {
-			files = append(files, join(base, tsc("legacy/html/pages"), f))
-		}
-		if _, err := t.ParseFilesFromTrustedSources(files...); err != nil {
-			return nil, fmt.Errorf("ParseFilesFromTrustedSources(%v): %v", files, err)
-		}
-		templates[set[0].String()] = t
-	}
-
 	htmlSets := [][]template.TrustedSource{
 		{tsc("badge")},
 		{tsc("error")},
diff --git a/internal/frontend/server_test.go b/internal/frontend/server_test.go
index c02f9f5..47f8b48 100644
--- a/internal/frontend/server_test.go
+++ b/internal/frontend/server_test.go
@@ -677,7 +677,7 @@
 			name:           "static",
 			urlPath:        "/static/",
 			wantStatusCode: http.StatusOK,
-			want:           in("", hasText("doc"), hasText("frontend"), hasText("legacy"), hasText("markdown.ts"), hasText("shared"), hasText("worker")),
+			want:           in("", hasText("doc"), hasText("frontend"), hasText("markdown.ts"), hasText("shared"), hasText("worker")),
 		},
 		{
 			name:           "license policy",
@@ -1189,15 +1189,6 @@
 			},
 		},
 		{
-			name: "new layout experiment",
-			testCasesFunc: func() []serverTestCase {
-				return append(serverTestCases(), linksTestCases...)
-			},
-			experiments: []string{
-				internal.ExperimentNewUnitLayout,
-			},
-		},
-		{
 			name: "search grouping",
 			testCasesFunc: func() []serverTestCase {
 				return append(serverTestCases(), searchGroupingTestCases...)
@@ -1598,20 +1589,20 @@
 		{"search", nil, SearchPage{}},
 		{"legacy_search", nil, SearchPage{}},
 		{"search-help", nil, basePage{}},
-		{"unit_details.tmpl", nil, UnitPage{}},
+		{"unit/main", nil, UnitPage{}},
 		{
-			"unit_details.tmpl",
-			[]string{"unit_outline", "unit_readme", "unit_doc", "unit_files", "unit_directories"},
+			"unit/main",
+			[]string{"unit-outline", "unit-readme", "unit-doc", "unit-files", "unit-directories"},
 			MainDetails{},
 		},
-		{"unit_importedby.tmpl", nil, UnitPage{}},
-		{"unit_importedby.tmpl", []string{"importedby"}, ImportedByDetails{}},
-		{"unit_imports.tmpl", nil, UnitPage{}},
-		{"unit_imports.tmpl", []string{"imports"}, ImportsDetails{}},
-		{"unit_licenses.tmpl", nil, UnitPage{}},
-		{"unit_licenses.tmpl", []string{"licenses"}, LicensesDetails{}},
-		{"unit_versions.tmpl", nil, UnitPage{}},
-		{"unit_versions.tmpl", []string{"versions"}, VersionsDetails{}},
+		{"unit/importedby", nil, UnitPage{}},
+		{"unit/importedby", []string{"importedby"}, ImportedByDetails{}},
+		{"unit/imports", nil, UnitPage{}},
+		{"unit/imports", []string{"imports"}, ImportsDetails{}},
+		{"unit/licenses", nil, UnitPage{}},
+		{"unit/licenses", []string{"licenses"}, LicensesDetails{}},
+		{"unit/versions", nil, UnitPage{}},
+		{"unit/versions", []string{"versions"}, VersionsDetails{}},
 	} {
 		t.Run(c.name, func(t *testing.T) {
 			tm := templates[c.name]
diff --git a/internal/frontend/tabs.go b/internal/frontend/tabs.go
index 690ff76..89cee21 100644
--- a/internal/frontend/tabs.go
+++ b/internal/frontend/tabs.go
@@ -64,39 +64,13 @@
 			TemplateName: "unit/licenses",
 		},
 	}
-	unitTabLookup  = make(map[string]TabSettings, len(unitTabs))
-	legacyUnitTabs = []TabSettings{
-		{
-			Name:         tabMain,
-			TemplateName: "unit_details.tmpl",
-		},
-		{
-			Name:         tabVersions,
-			TemplateName: "unit_versions.tmpl",
-		},
-		{
-			Name:         tabImports,
-			TemplateName: "unit_imports.tmpl",
-		},
-		{
-			Name:         tabImportedBy,
-			TemplateName: "unit_importedby.tmpl",
-		},
-		{
-			Name:         tabLicenses,
-			TemplateName: "unit_licenses.tmpl",
-		},
-	}
-	legacyUnitTabLookup = make(map[string]TabSettings, len(legacyUnitTabs))
+	unitTabLookup = make(map[string]TabSettings, len(unitTabs))
 )
 
 func init() {
 	for _, t := range unitTabs {
 		unitTabLookup[t.Name] = t
 	}
-	for _, t := range legacyUnitTabs {
-		legacyUnitTabLookup[t.Name] = t
-	}
 }
 
 // fetchDetailsForPackage returns tab details by delegating to the correct detail
diff --git a/internal/frontend/unit.go b/internal/frontend/unit.go
index b1ecdb3..6d51750 100644
--- a/internal/frontend/unit.go
+++ b/internal/frontend/unit.go
@@ -18,7 +18,6 @@
 	"golang.org/x/pkgsite/internal"
 	"golang.org/x/pkgsite/internal/cookie"
 	"golang.org/x/pkgsite/internal/derrors"
-	"golang.org/x/pkgsite/internal/experiment"
 	"golang.org/x/pkgsite/internal/log"
 	"golang.org/x/pkgsite/internal/middleware"
 	"golang.org/x/pkgsite/internal/stdlib"
@@ -175,18 +174,12 @@
 		// Don't fail, but don't display a banner either.
 		log.Errorf(ctx, "extracting AlternativeModuleFlash cookie: %v", err)
 	}
-	tabSettings := legacyUnitTabLookup[tab]
 	title := pageTitle(um)
 	basePage := s.newBasePage(r, title)
-	basePage.UseSiteWrapper = true
-
-	if experiment.IsActive(ctx, internal.ExperimentNewUnitLayout) {
-		tabSettings = unitTabLookup[tab]
-		basePage.UseSiteWrapper = false
-		basePage.AllowWideContent = true
-		if tabSettings.Name == "" {
-			basePage.UseResponsiveLayout = true
-		}
+	tabSettings := unitTabLookup[tab]
+	basePage.AllowWideContent = true
+	if tabSettings.Name == "" {
+		basePage.UseResponsiveLayout = true
 	}
 	lv := linkVersion(um.ModulePath, info.requestedVersion, um.Version)
 	page := UnitPage{
diff --git a/internal/middleware/secureheaders.go b/internal/middleware/secureheaders.go
index 4ae968d..4094c15 100644
--- a/internal/middleware/secureheaders.go
+++ b/internal/middleware/secureheaders.go
@@ -26,14 +26,6 @@
 	"'sha256-cB+y/oSfWGFf7lHk8KX+ZX2CZQz/dPamIICuPvHcB6w='",
 	// From static/frontend/unit/versions/versions.tmpl
 	"'sha256-7mi5SPcD1cogj2+ju8J/+/qJG99F6Qo+3pO4xQkRf6Q='",
-	// From static/legacy/html/pages/unit.tmpl
-	"'sha256-V0I0c9gVBohHALcsk23X2c1nd3GO+Kpc1BNCpLhEj7Y='",
-	// From static/legacy/html/pages/unit_details.tmpl
-	"'sha256-bHZGfbft0NNI4pr8JS2ajCVFIrvcY1o07hbUL2Lfdls='",
-	"'sha256-NgMe1ssApnbzZAEDkxSBAFfCNRfW6F7ajTmp08jUrPI='",
-	"'sha256-lK9quwyQtvjVXRYCc2nYBfam6X9NN7FitPdCEVd3wpE='",
-	// From static/legacy/html/pages/unit_versions.tmpl
-	"'sha256-86HQcJ6uexGUBJWyPdp/1pozG9N7B3EUGT0ooKXwWzY='",
 	// From static/worker/index.tmpl
 	"'sha256-rEbn/zvLCsDDvDrVWQuUkKGEQsjQjFvIvJK4NVIMqZ4='",
 }
diff --git a/internal/testing/integration/integration_test.go b/internal/testing/integration/integration_test.go
index dca279e..4a5be8f 100644
--- a/internal/testing/integration/integration_test.go
+++ b/internal/testing/integration/integration_test.go
@@ -74,8 +74,8 @@
 		{"example.com/single", "This is the README"},
 		{"example.com/single/pkg", "hello"},
 		{"example.com/single@v1.0.0/pkg", "hello"},
-		{"example.com/deprecated", "UnitHeader-banner--deprecated"},
-		{"example.com/retractions@v1.1.0", "UnitHeader-banner--retracted"},
+		{"example.com/deprecated", "go-Message go-Message--warning"},
+		{"example.com/retractions@v1.1.0", "go-Message go-Message--warning"},
 		{"example.com/deprecated?tab=versions", "deprecated"},
 		{"example.com/retractions?tab=versions", "retracted"},
 	} {
diff --git a/static/frontend/frontend.tmpl b/static/frontend/frontend.tmpl
index e07d196..32e4f8a 100644
--- a/static/frontend/frontend.tmpl
+++ b/static/frontend/frontend.tmpl
@@ -29,10 +29,7 @@
     <meta class="js-gtmID" data-gtmid="{{.GoogleTagManagerID}}">
     <link rel="shortcut icon" href="/static/shared/icon/favicon.ico">
     {{block "canonical" .}}{{end}}
-    <!-- Only load the css reset for non-legacy pages -->
-    {{if not .UseSiteWrapper}}
-      <link href="/static/shared/reset.css?version={{.AppVersionLabel}}" rel="stylesheet">
-    {{end}}
+    <link href="/static/shared/reset.css?version={{.AppVersionLabel}}" rel="stylesheet">
     <link href="/static/frontend/frontend.css?version={{.AppVersionLabel}}" rel="stylesheet">
     {{block "title" .}}
       <title>pkg.go.dev</title>
@@ -53,21 +50,9 @@
       }
       loadScript("/static/frontend/frontend.js");
     </script>
-    {{if .UseSiteWrapper}}
-      <div class="Site Site--wide Site--redesign">
-    {{end}}
     {{template "header" .}}
-    {{if .UseSiteWrapper}}
-      <div class="Site-content">
-    {{end}}
-      {{template "main" .}}
-    {{if .UseSiteWrapper}}
-      </div>
-    {{end}}
+    {{template "main" .}}
     {{template "footer" .}}
-    {{if .UseSiteWrapper}}
-      </div>
-    {{end}}
     {{if .GoogleTagManagerID}}
       <script>
         // this will throw if the querySelector can’t find the element
diff --git a/static/legacy/css/importedby.css b/static/legacy/css/importedby.css
deleted file mode 100644
index 6c86556..0000000
--- a/static/legacy/css/importedby.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.ImportedBy-list {
-  list-style: none;
-  padding: 0;
-}
-.ImportedBy .Pagination-nav,
-.ImportedBy .Pagination-navInner {
-  justify-content: flex-start;
-}
-.ImportedBy-detailsContent {
-  margin-left: 2.5rem;
-}
-.ImportedBy-detailsIndent {
-  margin-left: 1.1rem;
-}
diff --git a/static/legacy/css/imports.css b/static/legacy/css/imports.css
deleted file mode 100644
index 6c523f4..0000000
--- a/static/legacy/css/imports.css
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.Imports-list {
-  list-style: none;
-  padding: 0;
-}
-.Imports-heading {
-  font-size: 1.125rem;
-  line-height: 1.125rem;
-}
diff --git a/static/legacy/css/licenses.css b/static/legacy/css/licenses.css
deleted file mode 100644
index 0058648..0000000
--- a/static/legacy/css/licenses.css
+++ /dev/null
@@ -1,25 +0,0 @@
-/*!
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.License-contents {
-  background-color: var(--gray-10);
-  border: 0.0625rem solid var(--gray-8);
-  border-radius: 0.1875rem;
-  font-size: 0.875rem;
-  line-height: 1.375rem;
-  margin: 0;
-  overflow-x: auto;
-  padding: 1.5rem;
-  tab-size: 4;
-}
-.License-source {
-  color: var(--gray-3);
-  font-size: 0.875rem;
-  padding-top: 0.5rem;
-}
-.Disclaimer-link {
-  font-style: italic;
-}
diff --git a/static/legacy/css/sidenav.css b/static/legacy/css/sidenav.css
deleted file mode 100644
index c7c4e2e..0000000
--- a/static/legacy/css/sidenav.css
+++ /dev/null
@@ -1,264 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-/*
- * Styling the sidenav.
- */
-
-.Documentation-nav,
-.Documentation-index,
-.DocNav,
-.DocNav-index {
-  display: none;
-}
-.DocNavMobile {
-  background-color: var(--white);
-  display: block;
-  height: 3rem;
-  margin: 0 -1rem;
-  position: sticky;
-  top: calc(var(--header-height, 0) + var(--banner-height, 0));
-  transition: box-shadow 0.2s linear;
-  z-index: 1;
-}
-@media print {
-  .DocNavMobile {
-    display: none;
-  }
-}
-.DocNavMobile--withShadow {
-  box-shadow: 0 0.1875rem 0.1875rem rgba(0, 0, 0, 0.2);
-}
-.DocNavMobile-label,
-.DocNavMobile-select {
-  height: 2rem;
-  left: 1rem;
-  position: absolute;
-  top: 0.5rem;
-  width: calc(100% - 2rem);
-}
-.DocNavMobile-label {
-  align-items: center;
-  color: var(--gray-2);
-  display: flex;
-  padding: 0 0.5rem;
-}
-.DocNavMobile-label::after {
-  border-bottom: 0;
-  border-left: 0.3em solid transparent;
-  border-right: 0.3rem solid transparent;
-  border-top: 0.3rem solid var(--gray-4);
-  content: '';
-  display: block;
-  height: 0;
-  position: absolute;
-  right: 0.625rem;
-  top: 0.875rem;
-  width: 0;
-}
-.DocNavMobile-selectIcon {
-  fill: var(--gray-3);
-  height: 1.4375rem;
-  margin-right: 0.5rem;
-  transform: rotate(180deg);
-  width: 1.4375rem;
-}
-.DocNavMobile-selectText {
-  flex: 1;
-  margin-right: 1.2rem;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.DocNavMobile-select {
-  -webkit-appearance: none;
-  -moz-appearance: none;
-  appearance: none;
-  background: transparent;
-  border: 0.0625rem solid var(--gray-8);
-  border-radius: 0.1875rem;
-  color: transparent;
-  display: block;
-}
-
-/**
- * Firefox allows for styling of option and optgroup tags.
- * Ensure they don’t inherit the clear styling of their parent.
- */
-.DocNavMobile-select option {
-  color: var(--gray-1);
-}
-.DocNavMobile-select optgroup {
-  color: var(--gray-3);
-}
-@media only screen and (min-width: 64rem) {
-  .Documentation {
-    column-gap: 2rem;
-    display: grid;
-    grid-template-columns: 17.5rem minmax(0, auto);
-  }
-
-  /**
-   * Remove once Doc HTML is fully rolled out, as js-* styles should NEVER be
-   * styled per https://golang.org/wiki/CSSStyleGuide.
-   */
-  .js-docContent,
-  .Documentation-content {
-    max-width: 60rem;
-    min-width: 0;
-    width: 100%;
-  }
-  .Documentation-build {
-    grid-column: span 2;
-    text-align: center;
-  }
-  .DocNav {
-    display: block;
-    max-height: calc(100vh - var(--header-height));
-    overflow-x: hidden;
-    overflow-y: auto;
-    padding-left: 0.25rem;
-    padding-top: 1rem;
-    position: sticky;
-    top: var(--header-height);
-  }
-  .DocNavMobile {
-    display: none;
-  }
-  .DocNav [role='tree'],
-  .DocNav [role='group'] {
-    margin: 0;
-    padding: 0 0 2rem 0;
-  }
-  .DocNav [role='treeitem'][aria-level='1'] {
-    margin-bottom: 0.5rem;
-  }
-  .DocNav [role='group'] {
-    font-size: 0.875rem;
-    padding: 0;
-  }
-  .DocNav [role='treeitem'] {
-    padding: 0.125rem 0 0.125rem 1.25rem;
-    position: relative;
-    user-select: none;
-  }
-  .DocNav [role='treeitem']:focus,
-  .DocNav [role='treeitem']:hover {
-    outline: 0;
-    text-decoration: underline;
-  }
-  .DocNav [role='group'] [role='treeitem'] {
-    padding-left: 2.5rem;
-  }
-  .DocNav ul[role='group'] > :last-child {
-    margin-bottom: 0.375rem;
-  }
-  .DocNav [aria-selected='true'] {
-    color: var(--gray-1);
-    font-weight: 500;
-  }
-  .DocNav [aria-selected='true']:not(.DocNav-groupLabel)::before {
-    background-color: var(--turq-dark);
-    border-radius: 50%;
-    content: '';
-    display: block;
-    height: 0.3125rem;
-    left: 0.4688rem;
-    position: absolute;
-    top: 0.6875rem;
-    width: 0.3125rem;
-  }
-  .DocNav [role='group'] [aria-selected='true']::before {
-    left: 1.5rem;
-    top: 0.75rem;
-  }
-  .DocNav [role='group'] [role='group'] [role='treeitem'] {
-    border-left: 0.125rem solid var(--gray-9);
-    margin-left: 2.5rem;
-    padding-left: 0.5rem;
-  }
-  .DocNav [role='group'] [role='group'] [aria-selected='true']::before {
-    display: none;
-  }
-  .DocNav [role='group'] [role='group'] [aria-selected='true'] {
-    border-left: 0.125rem solid var(--turq-dark);
-  }
-  .DocNav-groupLabel {
-    cursor: pointer;
-    display: block;
-  }
-  .DocNav a,
-  .DocNav a:link,
-  .DocNav a:visited {
-    color: var(--gray-2);
-    display: block;
-    opacity: 1;
-    overflow: hidden;
-    text-decoration: none;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-  }
-  .DocNav a:hover,
-  .DocNav a[aria-selected='true'] {
-    color: var(--gray-1);
-  }
-  .DocNav-groupLabel::before {
-    border-bottom: 0.25rem solid transparent;
-    border-left: 0.25rem solid var(--gray-4);
-    border-right: 0;
-    border-top: 0.25rem solid transparent;
-    content: '';
-    display: block;
-    height: 0;
-    left: 0.5rem;
-    position: absolute;
-    top: 0.625rem;
-    transition: transform 0.1s linear;
-    width: 0;
-  }
-  .DocNav-groupLabel--empty::before {
-    content: unset;
-  }
-
-  /* Added to increase hit target on triangle above. */
-  .DocNav-groupLabel::after {
-    content: '';
-    display: block;
-    height: 2rem;
-    left: 0;
-    position: absolute;
-    top: 0;
-    width: 2rem;
-  }
-
-  /**
-   * Expandable nodes at this level have smaller text and more left padding,
-   * so adjust for that.
-   */
-  .DocNav [role='group'] .DocNav-groupLabel::before {
-    left: 1.5625rem;
-    top: 0.6875rem;
-  }
-  .DocNav-groupLabel[aria-expanded='true'] {
-    margin-bottom: 0.375em;
-  }
-  .DocNav-groupLabel[aria-expanded='true']::before {
-    transform: rotate(90deg);
-  }
-  .DocNav [aria-expanded='false'] + [role='group'] {
-    display: none;
-  }
-}
-@media only screen and (min-width: 100rem) {
-  .Documentation {
-    grid-template-columns: 22rem minmax(0, auto);
-  }
-}
-@media only screen and (min-width: 130rem) {
-  .Documentation {
-    grid-template-columns: 35rem minmax(0, auto);
-  }
-}
diff --git a/static/legacy/css/stylesheet.css b/static/legacy/css/stylesheet.css
deleted file mode 100644
index 7d47327..0000000
--- a/static/legacy/css/stylesheet.css
+++ /dev/null
@@ -1,699 +0,0 @@
-/*
- * Copyright 2019-2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-:root {
-  --gray-1: #202224;
-  --gray-2: #3e4042;
-  --gray-3: #555759;
-  --gray-4: #6e7072;
-  --gray-5: #848688;
-  --gray-6: #aaacae;
-  --gray-7: #c6c8ca;
-  --gray-8: #dcdee0;
-  --gray-9: #f0f1f2;
-  --gray-10: #fafafa;
-
-  --turq-light: #5dc9e2;
-  --turq-med: #00add8;
-  --turq-dark: #007d9c;
-
-  --blue: #bfeaf4;
-  --black: #000;
-  --green: #3a6e11;
-  --pink: #ce3262;
-  --purple: #542c7d;
-  --slate: #253443; /* Footer background. */
-  --white: #fff;
-  --yellow: #fddd00;
-  --yellow-light: #fff8cc;
-
-  --header-height: 3.5rem;
-}
-
-*,
-:before,
-:after {
-  box-sizing: border-box;
-}
-html,
-body {
-  /**
-   * This is used to programatically detect whether overflow needs to be altered
-   * to prevent jitter when focusing within fixed elements on iOS.
-   * It also must be set to 'touch' for the fix to work.
-   */
-  -webkit-overflow-scrolling: touch;
-  height: 100%;
-}
-body {
-  color: var(--gray-1);
-  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif,
-    'Apple Color Emoji', 'Segoe UI Emoji';
-  margin: 0;
-}
-button,
-input,
-select,
-textarea {
-  font: inherit;
-}
-a,
-a:link,
-a:visited {
-  color: var(--turq-dark);
-  text-decoration: none;
-}
-a:hover {
-  text-decoration: underline;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  word-break: break-word;
-}
-h1,
-h2,
-h3 {
-  font-weight: 600;
-}
-h4,
-h5,
-h6 {
-  font-weight: 500;
-}
-h1 {
-  font-size: 1.5rem;
-}
-h2 {
-  font-size: 1.125rem;
-}
-h3 {
-  font-size: 1rem;
-}
-/**
-  * As header elements are not interactive, it’s okay to remove the visual
-  * indicator. https://css-tricks.com/focus-styles-non-interactive-elements/
-  */
-h1:focus,
-h2:focus,
-h3:focus,
-h4:focus,
-h5:focus,
-h6:focus {
-  outline: 0;
-}
-p {
-  font-size: 1rem;
-  line-height: 1.5rem;
-}
-.u-breakWord {
-  word-break: break-word;
-}
-code,
-pre,
-.Documentation textarea {
-  font-size: 1rem;
-  font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-}
-
-.Site {
-  display: flex;
-  flex-direction: column;
-  min-height: 100%;
-}
-.Site-content {
-  flex: 1;
-  margin-bottom: 5rem;
-  padding: 0 1rem;
-}
-.Site--redesign.Site--wide .Site-content {
-  padding: 0;
-}
-.Site-footer {
-  margin-top: 5rem;
-}
-@media only screen and (min-width: 57.7rem) {
-  .Site-content {
-    padding: 0 1.5rem;
-  }
-  .Site--redesign.Site--wide .Site-content {
-    padding: 0;
-  }
-}
-.Site-margin {
-  margin: auto;
-  max-width: 97rem;
-  width: 100%;
-  padding-left: 1rem;
-  padding-right: 1rem;
-}
-@media only screen and (min-width: 57.5rem) {
-  .Site-margin {
-    max-width: 98rem;
-    padding-left: 1.5rem;
-    padding-right: 1.5rem;
-  }
-}
-
-.Banner {
-  /**
-   * Only show on wide viewports so the
-   * text never wraps or gets cut off.
-   */
-  display: none;
-  background-color: var(--gray-1);
-}
-.Banner-inner {
-  align-items: center;
-  display: flex;
-  justify-content: space-between;
-  margin: 0 auto;
-  max-width: 75.75rem;
-  min-height: 2.5rem;
-  padding: 0.5rem 1.5rem;
-}
-.Site--wide .Banner-inner {
-  max-width: none;
-}
-.Site--redesign .Banner-inner {
-  max-width: 98rem;
-}
-.Banner-message {
-  color: #fff;
-  margin-right: 1.25rem;
-}
-.Banner-action:link,
-.Banner-action:visited {
-  color: #fff;
-  text-decoration: underline;
-  white-space: nowrap;
-}
-@media only screen and (min-width: 52rem) {
-  .Banner {
-    display: block;
-  }
-}
-
-.Header {
-  margin: 0 auto;
-  max-width: 75.75rem;
-}
-.Site--wide .Header {
-  max-width: none;
-}
-.Site--redesign .Header {
-  max-width: 98rem;
-}
-.Site-header {
-  background: var(--turq-dark);
-  box-shadow: 0 0.0625rem 0.125rem rgba(171, 171, 171, 0.3);
-  width: 100%;
-  z-index: 1;
-}
-.Header-logoLink {
-  margin-right: auto;
-}
-.Header-nav {
-  align-items: center;
-  display: flex;
-  height: var(--header-height);
-  justify-content: space-between;
-}
-.Header-logo {
-  display: block;
-  height: 2rem;
-  margin: 0 2.25rem 0 1rem;
-  width: 5.125rem;
-}
-.Header-menu {
-  display: flex;
-  list-style: none;
-  height: 100%;
-  margin: 0;
-  padding: 0;
-}
-.Header-menuItem {
-  display: none;
-}
-@media only screen and (min-width: 57.7rem) {
-  .Header {
-    padding: 0 1.5rem;
-  }
-  .Header-logo {
-    margin-left: 1.4rem;
-  }
-  .Header-menuItem {
-    display: inline-flex;
-    flex: none;
-  }
-  .Header-menu {
-    justify-content: flex-end;
-    margin-left: 1.4rem;
-  }
-  .Header-navOpen {
-    display: none;
-  }
-  .Header-logo {
-    margin-left: 0;
-  }
-}
-.Header-menuItem a:link,
-.Header-menuItem a:visited {
-  align-items: center;
-  border-bottom: 0.1875rem solid transparent;
-  border-top: 0.1875rem solid transparent; /* To ensure the text remains centered. */
-  color: var(--white);
-  display: inline-flex;
-  margin: 0 0.3125rem;
-  padding: 0 0.9375rem;
-  text-align: center;
-  text-decoration: none;
-  width: 100%;
-}
-.Header-menuItem--active a:link,
-.Header-menuItem--active a:visited {
-  border-bottom-color: var(--turq-med);
-  font-weight: bold;
-}
-.Header-menuItem a:hover {
-  border-bottom-color: var(--white);
-}
-.Header-navOpen {
-  background: no-repeat center/2rem url('/static/legacy/img/menu-24px-white.svg');
-  border: none;
-  height: 2.5rem;
-  margin: auto 1rem;
-  width: 2.5rem;
-}
-.Header-searchForm {
-  align-items: center;
-  background-color: transparent;
-  border: 0.0625rem solid transparent;
-  border-radius: 0.25rem;
-  display: flex;
-  font-size: 1rem;
-  height: 2rem;
-  position: relative;
-  width: 2.25rem;
-}
-.Header-searchForm:focus-within {
-  background-color: var(--white);
-  border-color: var(--gray-8);
-  flex: 1;
-  left: 1rem;
-  position: absolute;
-  width: calc(100% - 5.25rem);
-}
-.Header-searchFormInput {
-  background-color: transparent;
-  border: none;
-  box-sizing: border-box;
-  color: transparent;
-  flex: 1;
-  height: 100%;
-  outline: none;
-  position: absolute;
-  width: 100%;
-}
-.Header-searchFormInput::placeholder {
-  color: transparent;
-}
-.Header-searchForm:focus-within .Header-searchFormInput {
-  color: var(--gray-1);
-  height: auto;
-  position: relative;
-  width: auto;
-}
-.Header-searchForm:focus-within .Header-searchFormInput::placeholder {
-  color: var(--gray-4);
-}
-.Header-searchFormSubmit {
-  background-color: transparent;
-  border: none;
-  box-sizing: border-box;
-  cursor: pointer;
-  display: flex;
-}
-.Header-searchFormSubmitIcon {
-  box-sizing: border-box;
-  cursor: pointer;
-  fill: var(--white);
-  width: 1.4375rem;
-}
-.Header-searchForm:focus-within .Header-searchFormSubmitIcon {
-  fill: var(--gray-4);
-}
-@media only screen and (min-width: 26.875rem) {
-  .Header-searchForm {
-    background-color: var(--white);
-    border-color: var(--gray-8);
-    flex: 1;
-    width: auto;
-  }
-  .Header-searchForm:focus-within {
-    left: 0;
-    position: relative;
-    width: auto;
-  }
-  .Header-searchFormSubmitIcon {
-    fill: var(--gray-4);
-  }
-  .Header-searchFormInput {
-    color: var(--gray-1);
-    height: auto;
-    position: relative;
-    width: auto;
-  }
-  .Header-searchFormInput::placeholder {
-    color: var(--gray-4);
-  }
-}
-.NavigationDrawer {
-  background: var(--white);
-  display: none;
-  height: 100%;
-  left: auto;
-  max-width: 27rem;
-  position: fixed;
-  right: 0;
-  top: 0;
-  width: 85%;
-  z-index: 10;
-}
-.NavigationDrawer.is-active {
-  display: initial;
-}
-.NavigationDrawer-header {
-  display: flex;
-  justify-content: space-between;
-}
-.NavigationDrawer-logo {
-  display: block;
-  height: 2rem;
-  margin: 1rem 1rem;
-  width: 5.125rem;
-}
-.NavigationDrawer-close {
-  background: no-repeat center/2rem url('/static/legacy/img/close-24px.svg');
-  border: none;
-  height: 2.5rem;
-  margin: auto 1rem;
-  width: 2.5rem;
-}
-.NavigationDrawer-list {
-  list-style: none;
-  margin: 0;
-  padding: 0;
-}
-.NavigationDrawer-listItem {
-  font-size: 1.5rem;
-  margin: 0 0.5rem;
-}
-.NavigationDrawer-listItem a:link,
-.NavigationDrawer-listItem a:visited {
-  display: block;
-  margin: 0 1rem;
-  padding: 1rem;
-}
-.NavigationDrawer-listItem--active {
-  background-color: var(--gray-8);
-  border-radius: 0.4rem;
-}
-.NavigationDrawer-scrim {
-  display: none;
-  height: 100%;
-  left: 0;
-  position: fixed;
-  top: 0;
-  width: 100%;
-  z-index: 5;
-}
-.NavigationDrawer.is-active + .NavigationDrawer-scrim {
-  background-color: rgba(0, 0, 0, 0.32);
-  display: block;
-}
-
-.DetailsHeader-badge {
-  border-radius: 1rem;
-  display: inline-block;
-  font-size: 0.75rem;
-  padding: 0.25rem 0.75rem;
-  position: relative;
-  top: -0.125rem;
-}
-
-.DetailsHeader-badge--latest {
-  background: var(--turq-dark);
-}
-.DetailsHeader-badge--latest a {
-  display: none;
-}
-.DetailsHeader-badge--latest span.DetailsHeader-span--notAtLatest {
-  display: none;
-}
-
-.Error-gopher,
-.EmptyContent-gopher,
-.Fetch-gopher,
-.SearchResults-emptyContentGopher {
-  display: block;
-  margin: auto;
-  max-width: 15rem;
-  padding: 1.25rem 0;
-}
-.Error-message,
-.EmptyContent-message,
-.SearchResults-emptyContentMessage {
-  text-align: center;
-}
-.Error-gopher,
-.EmptyContent-gopher,
-.NotFound-gopher,
-.SearchResults-emptyContentGopher {
-  display: block;
-  height: 15rem;
-  margin: auto;
-  padding: 1.25rem 0;
-  width: 15rem;
-}
-.Error-message,
-.EmptyContent-message,
-.SearchResults-emptyContentMessage {
-  text-align: center;
-}
-
-.CopyToClipboardButton {
-  background-color: transparent;
-  border: none;
-  cursor: pointer;
-  height: 1.5rem;
-  margin: 0 0.5rem;
-  position: relative;
-}
-.CopyToClipboardButton:not([data-tooltip])::before,
-.CopyToClipboardButton:not([data-tooltip])::after,
-.CopyToClipboardButton[data-tooltip='']::before,
-.CopyToClipboardButton[data-tooltip='']::after {
-  display: none;
-}
-.CopyToClipboardButton::before {
-  background-color: rgba(0, 0, 0, 0.75);
-  border-radius: 3px;
-  color: var(--white);
-  content: attr(data-tooltip);
-  display: block;
-  font-size: 0.9em;
-  left: calc(100% + 0.125rem);
-  position: absolute;
-  padding: 0.25rem 0.3rem;
-  text-transform: uppercase;
-  top: 2px;
-  white-space: nowrap;
-  z-index: 1000;
-}
-.CopyToClipboardButton::after {
-  border-bottom: 0.25rem solid transparent;
-  border-left: 0;
-  border-right: 0.25rem solid rgba(0, 0, 0, 0.75);
-  border-top: 0.25rem solid transparent;
-  content: '';
-  display: block;
-  position: absolute;
-  right: -0.125rem;
-  top: 9px;
-  z-index: 1000;
-}
-.CopyToClipboardButton:hover {
-  background-color: var(--gray-9);
-}
-.CopyToClipboardButton:active {
-  background-color: var(--gray-8);
-}
-.CopyToClipboardButton-image {
-  display: block;
-  height: 0.9375rem;
-}
-
-.Container {
-  color: var(--gray-1);
-  flex-grow: 1;
-  margin: 0 auto;
-  max-width: 60em;
-  position: relative;
-}
-.Site--wide .Container {
-  max-width: none;
-}
-
-.Content {
-  min-height: 32rem;
-  margin: 0 auto;
-  max-width: 60em;
-  padding: 2rem 0;
-}
-.Content-header {
-  margin: 0;
-  font-size: 1.875rem;
-}
-.Content h2 {
-  margin: 0;
-}
-.Content p {
-  color: var(--gray-3);
-}
-
-.Dialog {
-  padding: 0;
-  position: fixed;
-  border: 0.0625rem solid rgba(0, 0, 0, 0.2);
-  border-radius: 6px;
-  box-shadow: 0 0.3125rem 0.9375rem rgba(0, 0, 0, 0.5);
-  top: 50%;
-  transform: translate(0, -50%);
-}
-.Dialog-title {
-  font-size: 1.125rem;
-  padding: 0 0.8rem;
-}
-.Dialog-actions {
-  text-align: right;
-  padding: 0.8rem;
-}
-.Dialog-button {
-  background: none;
-  border-radius: 0.625rem;
-  border: 0.0625rem solid var(--gray-8);
-  color: var(--turq-dark);
-  font-size: 1rem;
-  max-width: 6.25rem;
-  padding: 0.625rem;
-  text-align: center;
-}
-
-/* Used in search bar */
-.ImageButton {
-  border: none;
-  border-radius: 0.2rem;
-  cursor: pointer;
-  background-color: transparent;
-  padding: 0.2rem 0.375rem;
-  background-color: transparent;
-  display: inline-flex;
-}
-.ImageButton:hover {
-  background-color: var(--gray-9);
-}
-.ImageButton:active {
-  background-color: var(--gray-8);
-}
-
-.Site-footer {
-  background-color: var(--slate);
-  color: var(--white);
-  font-size: 0.875rem;
-}
-.Footer-links {
-  display: flex;
-  flex-wrap: wrap;
-  justify-content: space-between;
-  margin: auto;
-  max-width: 75.75rem;
-  padding: 2rem 1.5rem 2.625rem 1.5rem;
-}
-.Footer-linkColumn {
-  flex: 0 0 9.5rem;
-}
-a.Footer-link {
-  color: var(--white);
-  display: flex;
-  flex: 1;
-  font-size: 0.875rem;
-  line-height: 2rem;
-}
-a.Footer-link--primary {
-  font-size: 1.125rem;
-  line-height: 1.75rem;
-  margin-bottom: 0.5rem;
-  margin-top: 0.75rem;
-}
-.Footer-bottom {
-  align-items: center;
-  border-top: 0.0625rem solid var(--gray-8);
-  display: flex;
-  margin: 0 1.5rem;
-  min-height: 4.125rem;
-}
-.Footer-gopher {
-  align-self: flex-end;
-  height: 3.147rem;
-  width: 5rem;
-}
-.Footer-listRow {
-  display: flex;
-  flex: 1;
-  flex-wrap: wrap;
-  list-style: none;
-  margin: 0;
-  padding: 0;
-  text-align: center;
-}
-.Footer-listItem {
-  align-items: center;
-  display: flex;
-  flex: 1 100%;
-  justify-content: center;
-  margin: 0.4rem 0;
-  padding: 0 1rem;
-}
-.Footer-listItem a:link,
-.Footer-listItem a:visited {
-  color: var(--white);
-}
-@media only screen and (min-width: 52rem) {
-  .Footer-listItem {
-    flex: initial;
-  }
-  .Footer-listItem + .Footer-listItem {
-    border-left: 0.0625rem solid var(--gray-7);
-  }
-}
-.Footer-googleLogo {
-  align-self: flex-end;
-  height: 1.5rem;
-  margin-bottom: 1.3rem;
-  text-align: right;
-}
-.Footer-googleLogoImg {
-  height: 1.5rem;
-  width: 4.529rem;
-}
-.Container--fullBleed {
-  margin: 0;
-  max-width: none;
-}
diff --git a/static/legacy/css/unit.css b/static/legacy/css/unit.css
deleted file mode 100644
index 79ea13c..0000000
--- a/static/legacy/css/unit.css
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-@import './unit_header.css';
-
-.Unit-content {
-  margin: auto;
-  max-width: 98rem;
-  min-height: 32rem;
-  padding: 0 1rem;
-}
-@media only screen and (min-width: 57.7rem) {
-  .Unit-content {
-    padding: 0 1.5rem;
-  }
-}
-.Unit-content > div,
-section {
-  margin-top: 2rem;
-  max-width: 60rem;
-}
diff --git a/static/legacy/css/unit_build_context.css b/static/legacy/css/unit_build_context.css
deleted file mode 100644
index 75354f5..0000000
--- a/static/legacy/css/unit_build_context.css
+++ /dev/null
@@ -1,35 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.UnitBuildContext-titleContext label,
-.UnitBuildContext-singleContext {
-  color: var(--gray-4);
-  font-size: 0.875rem;
-}
-.UnitBuildContext-singleContext {
-  padding: 0.35rem 0;
-}
-.UnitBuildContext-titleContext select {
-  border-color: var(--gray-7);
-  color: var(--gray-4);
-  margin-left: 0.25rem;
-  min-width: 6rem;
-  padding: 0.25rem 0.125rem;
-}
-.UnitBuildContext-titleContext option {
-  color: var(--gray-4);
-}
-
-.UnitDoc .UnitBuildContext-titleContext {
-  position: relative;
-}
-
-.UnitDoc .UnitBuildContext-titleContext label,
-.UnitDoc .UnitBuildContext-singleContext {
-  bottom: 0.875rem;
-  position: absolute;
-  right: 0;
-}
diff --git a/static/legacy/css/unit_details.css b/static/legacy/css/unit_details.css
deleted file mode 100644
index 120610d..0000000
--- a/static/legacy/css/unit_details.css
+++ /dev/null
@@ -1,131 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-@import './readme.css';
-@import './sidenav.css';
-@import './unit_readme.css';
-@import './unit_doc.css';
-@import './unit_files.css';
-@import './unit_directories.css';
-@import './unit_meta.css';
-@import './unit_build_context.css';
-
-.UnitDetails {
-  column-gap: 2rem;
-  display: grid;
-  grid-template-columns: minmax(0, auto);
-  margin: auto;
-  margin-top: 1rem;
-  max-width: 98rem;
-  min-height: 32rem;
-  padding: 0 1rem;
-}
-@media only screen and (min-width: 57.7rem) {
-  .UnitDetails {
-    padding: 0 1.5rem;
-  }
-}
-@media only screen and (min-width: 64rem) {
-  .UnitDetails {
-    grid-template-columns: 15.5rem minmax(30.5rem, 43.125rem) minmax(10rem, 15.5rem);
-  }
-}
-@media only screen and (min-width: 80rem) {
-  .UnitDetails {
-    grid-template-columns: 15.5rem minmax(43.125rem, 60rem) 15.5rem;
-    justify-content: center;
-  }
-}
-.UnitDetails :target {
-  scroll-margin-top: calc(var(--header-height) + 3.75rem);
-}
-@media only screen and (min-width: 64rem) {
-  .UnitDetails :target {
-    scroll-margin-top: calc(var(--header-height) + 0.75rem);
-  }
-}
-
-.UnitDetails :target:not(details, h2) {
-  background-color: var(--blue);
-  padding: 0.25rem;
-}
-.UnitDetails-outline {
-  display: none;
-  height: calc(100vh - 7.8475rem);
-  margin-top: 1.5rem;
-  position: sticky;
-  top: calc(var(--header-height) + var(--banner-height) + 1rem);
-}
-@media only screen and (min-width: 64rem) {
-  .UnitDetails-outline {
-    display: block;
-  }
-}
-.UnitDetails-content {
-  margin-top: 0.5rem;
-  max-width: 60rem;
-}
-@media only screen and (min-width: 64rem) {
-  .UnitDetails-content {
-    margin-top: 1rem;
-  }
-}
-.UnitDetails-meta {
-  order: -1;
-}
-@media only screen and (min-width: 64rem) {
-  .UnitDetails-meta {
-    display: block;
-    margin-top: 2rem;
-    order: initial;
-  }
-}
-.UnitDetails-contentEmpty {
-  background-color: var(--gray-10);
-  color: var(--gray-2);
-  height: 15rem;
-  padding-top: 1rem;
-  text-align: center;
-}
-.UnitDetails-contentEmpty img {
-  height: 7.8125rem;
-  width: auto;
-}
-
-.JumpDialog {
-  width: 25rem;
-}
-.JumpDialog-body {
-  height: 12rem;
-  overflow-y: scroll;
-  padding: 0 0 0 0.8rem;
-}
-.JumpDialog-list {
-  display: flex;
-  flex-direction: column;
-}
-.JumpDialog-filter {
-  margin: 0.5rem 0.8rem;
-}
-.JumpDialog-input {
-  font-size: 1.125rem;
-  width: 100%;
-}
-.JumpDialog a {
-  padding: 0.25rem;
-  text-decoration: none;
-}
-.JumpDialog .JumpDialog-active {
-  background-color: var(--turq-dark);
-  color: var(--white);
-}
-
-.ShortcutsDialog-key {
-  text-align: right;
-}
-.ShortcutsDialog table {
-  padding: 0 1rem;
-}
diff --git a/static/legacy/css/unit_directories.css b/static/legacy/css/unit_directories.css
deleted file mode 100644
index 3b9c2d1..0000000
--- a/static/legacy/css/unit_directories.css
+++ /dev/null
@@ -1,153 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.UnitDirectories {
-  margin-bottom: 2rem;
-}
-.UnitDirectories h2 a.UnitDirectories-idLink,
-.UnitDirectories summary a {
-  opacity: 0;
-}
-.UnitDirectories h2:hover a,
-.UnitDirectories summary:focus a {
-  opacity: 1;
-}
-.UnitDirectories-title {
-  border-bottom: 0.0625rem solid var(--gray-8);
-  font-size: 1.375rem;
-  margin: 0.5rem 0 0 0;
-  padding-bottom: 1rem;
-}
-.UnitDirectories-title img {
-  height: 1rem;
-  margin: auto 1rem auto 0;
-  width: auto;
-}
-.UnitDirectories-table {
-  border-collapse: collapse;
-  height: 0;
-  table-layout: auto;
-  width: 100%;
-}
-.UnitDirectories-table--tree {
-  margin-top: -2rem;
-}
-.UnitDirectories-tableHeader {
-  background-color: var(--gray-9);
-}
-.UnitDirectories-tableHeader--tree {
-  visibility: hidden;
-}
-.UnitDirectories td {
-  border-bottom: 0.0625rem solid var(--gray-8);
-  max-width: 32rem;
-  min-width: 12rem;
-  padding: 0.25rem 1rem;
-  word-break: break-word;
-}
-.UnitDirectories th {
-  padding: 0.5rem 1rem;
-  text-align: left;
-}
-.UnitDirectories tr.hidden {
-  display: none;
-}
-.UnitDirectories tr[aria-controls] {
-  cursor: pointer;
-}
-.UnitDirectories tr[aria-controls]:hover {
-  background-color: var(--gray-10);
-}
-.UnitDirectories th.UnitDirectories-toggleHead {
-  font-size: 0;
-  max-width: 0.625rem;
-  padding: 0;
-  width: 0.625rem;
-}
-.UnitDirectories td.UnitDirectories-toggleCell,
-th.UnitDirectories-toggleCell {
-  background-color: var(--white);
-  border: var(--white);
-  max-width: 0.625rem;
-  padding: 0;
-  width: 0.625rem;
-}
-.UnitDirectories-toggleButton {
-  background-color: transparent;
-  border: none;
-  left: -0.75rem;
-  margin: 0 0 -1rem -0.875rem;
-  padding: 0;
-  position: absolute;
-  vertical-align: top;
-}
-.UnitDirectories-subSpacer {
-  border-right: 0.0625rem solid var(--gray-8);
-  display: inline;
-  margin-right: 0.875rem;
-  width: 0.0625rem;
-}
-.UnitDirectories-toggleButton[aria-expanded='true'] img {
-  transform: rotate(90deg);
-}
-.UnitDirectories-pathCell {
-  align-items: flex-start;
-  display: flex;
-  flex-direction: column;
-  line-height: 1.75rem;
-  word-break: break-all;
-}
-.UnitDirectories-pathCell > div {
-  position: relative;
-}
-.UnitDirectories-subdirectory {
-  border-left: 0.0625rem solid var(--gray-8);
-  display: flex;
-  flex-direction: column;
-  margin-left: 0.375rem;
-  padding: 0.5rem 1rem;
-}
-.UnitDirectories-mobileSynopsis {
-  display: none;
-  line-height: 1.25rem;
-  margin-top: 0.25rem;
-  word-break: keep-all;
-}
-@media only screen and (max-width: 52rem) {
-  .UnitDirectories-mobileSynopsis {
-    display: initial;
-  }
-  .UnitDirectories-table th.UnitDirectories-desktopSynopsis,
-  .UnitDirectories-table td.UnitDirectories-desktopSynopsis {
-    display: none;
-  }
-}
-.UnitDirectories-expandButton {
-  position: relative;
-}
-.UnitDirectories-expandButton button {
-  background-color: transparent;
-  border: none;
-  bottom: 1rem;
-  color: var(--turq-dark);
-  cursor: pointer;
-  display: none;
-  font-size: 0.875rem;
-  position: absolute;
-  right: 0;
-  text-decoration: none;
-}
-.UnitDirectories-badge {
-  border: 0.0625rem solid var(--gray-4);
-  border-radius: 0.125rem;
-  font-size: 0.6875rem;
-  font-weight: 500;
-  line-height: 1rem;
-  margin-left: 0.5rem;
-  margin-top: 0.125rem;
-  padding: 0 0.35rem;
-  text-align: center;
-}
diff --git a/static/legacy/css/unit_doc.css b/static/legacy/css/unit_doc.css
deleted file mode 100644
index 5af3b08..0000000
--- a/static/legacy/css/unit_doc.css
+++ /dev/null
@@ -1,364 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-/* stylelint-disable no-descending-specificity */
-.UnitDoc {
-  margin-bottom: 2rem;
-  word-break: break-word;
-}
-.UnitDoc h2 a.UnitDoc-idLink,
-.UnitDoc summary a {
-  opacity: 0;
-}
-.UnitDoc h2:hover a,
-.UnitDoc summary:focus a {
-  opacity: 1;
-}
-.UnitDoc-title {
-  border-bottom: 0.0625rem solid var(--gray-8);
-  font-size: 1.375rem;
-  margin: 0.5rem 0 0 0;
-  padding-bottom: 1rem;
-}
-.UnitDoc-title img {
-  height: 1rem;
-  margin: auto 1rem auto 0;
-  width: auto;
-}
-.UnitDoc-emptySection {
-  background-color: var(--gray-10);
-  color: var(--gray-2);
-  height: 12.25rem;
-  margin-top: 1.5rem;
-  text-align: center;
-}
-.UnitDoc-emptySection img {
-  height: 7.8125rem;
-  width: auto;
-}
-.UnitDoc .Documentation h4 {
-  font-size: 1.375rem;
-}
-.Documentation {
-  color: var(--gray-1);
-  display: block;
-}
-.Documentation h2,
-.Documentation h3 {
-  font-size: 1.5rem;
-}
-.Documentation a {
-  color: var(--turq-dark);
-  text-decoration: none;
-}
-.Documentation a:hover {
-  text-decoration: underline;
-}
-.Documentation h2 a,
-.Documentation h3 a,
-.Documentation h4 a.Documentation-idLink,
-.Documentation summary a {
-  opacity: 0;
-}
-.Documentation a:focus {
-  opacity: 1;
-}
-.Documentation h3 a.Documentation-source {
-  opacity: 1;
-}
-.Documentation h2:hover a,
-.Documentation h3:hover a,
-.Documentation h4:hover a,
-.Documentation summary:hover a,
-.Documentation summary:focus a {
-  opacity: 1;
-}
-.Documentation ul {
-  line-height: 1.5rem;
-  list-style: none;
-  padding-left: 0;
-}
-.Documentation ul ul {
-  padding-left: 2em;
-}
-.Documentation code,
-.Documentation pre,
-.Documentation textarea {
-  background-color: var(--gray-10);
-  border: 0.0625rem solid var(--gray-7);
-  border-radius: 0.3em;
-  font-size: 0.875rem;
-  line-height: 1.375rem;
-  line-height: 1.25rem;
-  margin: 0;
-  overflow-x: auto;
-  padding: 0.625rem;
-  tab-size: 4;
-}
-.Documentation pre + pre {
-  margin-top: 0.625rem;
-}
-
-.Documentation .Documentation-declarationLink + pre {
-  border-radius: 0 0 0.3em 0.3em;
-  border-top: 0.03125rem solid var(--gray-8);
-  margin-top: 0;
-}
-.Documentation pre .comment {
-  color: var(--green);
-}
-
-.Documentation-toc,
-.Documentation-overview,
-.Documentation-index,
-.Documentation-examples {
-  padding-bottom: 0;
-}
-.Documentation-empty {
-  color: var(--gray-3);
-  margin-top: -0.5rem;
-}
-@media only screen and (min-width: 64rem) {
-  .Documentation-toc {
-    margin-left: 2rem;
-    white-space: nowrap;
-  }
-  .Documentation-toc-columns {
-    columns: 2;
-  }
-}
-.Documentation-toc:empty {
-  display: none;
-}
-.Documentation-tocItem {
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.Documentation-tocItem--constants,
-.Documentation-tocItem--funcsAndTypes,
-.Documentation-tocItem--functions,
-.Documentation-tocItem--types,
-.Documentation-tocItem--variables,
-.Documentation-tocItem--notes {
-  display: none;
-}
-
-.Documentation-overviewHeader,
-.Documentation-indexHeader,
-.Documentation-constantsHeader,
-.Documentation-variablesHeader,
-.Documentation-examplesHeader,
-.Documentation-filesHeader,
-.Documentation-functionHeader,
-.Documentation-typeHeader,
-.Documentation-typeMethodHeader,
-.Documentation-typeFuncHeader {
-  margin-bottom: 0.5rem;
-}
-
-.Documentation-function h4,
-.Documentation-type h4,
-.Documentation-typeFunc h4,
-.Documentation-typeMethod h4 {
-  align-items: baseline;
-  display: flex;
-  justify-content: space-between;
-}
-.Documentation-sinceVersion {
-  color: var(--gray-5);
-  font-size: 1rem;
-  font-weight: 400;
-}
-
-.Documentation-constants br:last-of-type,
-.Documentation-variables br:last-of-type {
-  display: none;
-}
-
-.Documentation-build {
-  color: var(--gray-3);
-  font-size: 0.875rem;
-  padding-top: 1.5rem;
-  text-align: right;
-}
-.Documentation-declaration pre {
-  scroll-padding-top: calc(var(--header-height) + 3.75rem);
-}
-@media only screen and (min-width: 64rem) {
-  .Documentation-declaration pre {
-    scroll-padding-top: calc(var(--header-height) + 0.75rem);
-  }
-}
-.Documentation-declaration + .Documentation-declaration {
-  margin-top: 0.625rem;
-}
-.Documentation-declarationLink {
-  background-color: var(--gray-10);
-  border: 0.0625rem solid var(--gray-7);
-  border-bottom: none;
-  border-radius: 0.3em 0.3em 0 0;
-  display: block;
-  font-size: 0.75rem;
-  line-height: 0.5rem;
-  padding: 0.375rem;
-  text-align: right;
-}
-.Documentation-exampleButtonsContainer {
-  align-items: center;
-  display: flex;
-  justify-content: flex-end;
-  margin-top: 0.5rem;
-}
-.Documentation-examplePlayButton {
-  background-color: var(--white);
-  border: 0.15rem solid var(--turq-med);
-  color: var(--turq-med);
-  cursor: pointer;
-  flex-shrink: 0;
-  height: 2.5rem;
-  width: 4.125rem;
-}
-.Documentation-exampleRunButton,
-.Documentation-exampleShareButton,
-.Documentation-exampleFormatButton {
-  border: 0.0625rem solid var(--turq-dark);
-  border-radius: 0.25rem;
-  cursor: pointer;
-  height: 2rem;
-  margin-left: 0.5rem;
-  padding: 0 1rem;
-}
-.Documentation-exampleRunButton {
-  background-color: var(--turq-dark);
-  color: var(--white);
-}
-.Documentation-exampleShareButton,
-.Documentation-exampleFormatButton {
-  background-color: var(--white);
-  color: var(--turq-dark);
-}
-.Documentation-exampleDetails {
-  margin-top: 1rem;
-}
-.Documentation-exampleDetailsBody pre {
-  border-radius: 0 0 0.3rem 0.3rem;
-  margin-bottom: 1rem;
-  margin-top: -0.25rem;
-}
-.Documentation-exampleDetailsBody textarea {
-  border: 0.0625rem solid var(--gray-7);
-  height: 100%;
-  outline: none;
-  overflow-x: auto;
-  resize: none;
-  white-space: pre;
-  width: 100%;
-}
-
-/**
- * We add another selector here to these two classes to increase CSS specificity,
- * the selector .Documentation pre + pre overrides .Documentation-exampleCode
- * and .Documentation-exampleOutput by itself and would replace the styles.
- */
-.Documentation-exampleDetailsBody .Documentation-exampleCode {
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0;
-  margin: 0;
-}
-.Documentation-exampleDetailsBody .Documentation-exampleOutput {
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-  margin: 0 0 0.5rem;
-}
-.Documentation-exampleDetailsHeader {
-  color: var(--turq-dark);
-  cursor: pointer;
-  margin-bottom: 2rem;
-  outline: none;
-  text-decoration: none;
-}
-.Documentation-exampleOutputLabel {
-  color: var(--gray-4);
-}
-.Documentation-exampleError {
-  color: var(--pink);
-  margin-right: 0.4rem;
-  padding-right: 0.5rem;
-}
-
-/* See https://golang.org/issue/43368 for context. */
-.Documentation-function pre,
-.Documentation-typeFunc pre,
-.Documentation-typeMethod pre {
-  white-space: pre-wrap;
-  word-break: break-all;
-  word-wrap: break-word;
-}
-
-.Documentation-indexDeprecated {
-  margin-left: 0.5rem;
-}
-.Documentation-deprecatedBody {
-  color: var(--gray-3);
-  font-size: 0.875rem;
-  font-weight: 400;
-  margin-left: 0.25rem;
-  margin-right: 0.5rem;
-}
-.Documentation-deprecatedTag {
-  background-color: var(--gray-6);
-  border-radius: 0.125rem;
-  color: var(--white);
-  font-size: 0.75rem;
-  font-weight: normal;
-  line-height: 1.375;
-  padding: 0.125rem 0.25rem;
-  text-transform: uppercase;
-  vertical-align: middle;
-}
-.Documentation-deprecatedTitle {
-  align-items: center;
-  display: flex;
-  gap: 0.5rem;
-}
-.Documentation-deprecatedDetails {
-  color: var(--gray-4);
-}
-.Documentation-deprecatedDetails a {
-  color: var(--gray-4);
-}
-.Documentation-deprecatedDetails[open] {
-  color: var(--gray-1);
-}
-.Documentation-deprecatedDetails[open] a {
-  color: var(--turq-dark);
-}
-.Documentation-deprecatedDetails .Documentation-deprecatedBody::after {
-  color: var(--turq-dark);
-  content: 'Show';
-}
-.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody::after {
-  color: var(--turq-dark);
-  content: 'Hide';
-}
-.Documentation-deprecatedDetails > summary {
-  list-style: none;
-  opacity: 1;
-}
-.Documentation-deprecatedDetails .Documentation-source {
-  opacity: 1;
-}
-.Documentation-deprecatedItemBody {
-  background-color: var(--yellow-light);
-  padding: 1rem 1rem 0.5rem 1rem;
-}
-.Documentation-deprecatedMessage {
-  align-items: center;
-  display: flex;
-  gap: 0.5rem;
-  margin-bottom: 1rem;
-}
diff --git a/static/legacy/css/unit_files.css b/static/legacy/css/unit_files.css
deleted file mode 100644
index d266176..0000000
--- a/static/legacy/css/unit_files.css
+++ /dev/null
@@ -1,57 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.UnitFiles {
-  margin-bottom: 2rem;
-}
-.UnitFiles-titleLink {
-  position: relative;
-}
-.UnitFiles-titleLink a {
-  bottom: 1rem;
-  font-size: 0.875rem;
-  position: absolute;
-  right: 0;
-}
-.UnitFiles-titleLink a::after {
-  background-image: url(/static/legacy/img/icon-launch.svg);
-  background-repeat: no-repeat;
-  background-size: 0.875rem 1.25rem;
-  content: '';
-  display: inline-block;
-  height: 1rem;
-  left: 0.3125rem;
-  position: relative;
-  top: 0.125rem;
-  width: 1rem;
-}
-.UnitFiles h2 a.UnitFiles-idLink,
-.UnitFiles summary a {
-  opacity: 0;
-}
-.UnitFiles h2:hover a,
-.UnitFiles summary:focus a {
-  opacity: 1;
-}
-.UnitFiles-title {
-  border-bottom: 0.0625rem solid var(--gray-8);
-  font-size: 1.375rem;
-  margin: 0.5rem 0 0 0;
-  padding-bottom: 1rem;
-}
-.UnitFiles-title img {
-  height: 1.25rem;
-  margin: auto 1rem auto 0;
-  width: auto;
-}
-.UnitFiles-fileList {
-  column-count: 5;
-  column-width: 12.5rem;
-  line-height: 1.5rem;
-  list-style: none;
-  padding-left: 0;
-  word-break: break-all;
-}
diff --git a/static/legacy/css/unit_header.css b/static/legacy/css/unit_header.css
deleted file mode 100644
index 8491839..0000000
--- a/static/legacy/css/unit_header.css
+++ /dev/null
@@ -1,312 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.UnitHeader {
-  min-height: calc(var(--full-header-height));
-  position: sticky;
-  top: calc(var(--full-header-height) * -1 + var(--banner-height) + var(--header-height));
-  white-space: nowrap;
-  z-index: 1;
-}
-
-.UnitHeader-breadcrumbs {
-  background-color: var(--white);
-  line-height: 1.5rem;
-  padding-top: 1rem;
-  white-space: initial;
-}
-.UnitHeader-breadcrumbItem {
-  color: var(--gray-4);
-  display: inline-flex;
-  font-size: 0.875rem;
-}
-.UnitHeader-breadcrumbItem:not(:last-child)::after {
-  content: '>';
-  padding: 0 0.5rem;
-}
-
-.UnitHeader-content {
-  background-color: var(--white);
-  border-bottom: 0.0625rem solid var(--gray-8);
-  position: sticky;
-  top: var(--banner-height);
-}
-.UnitHeader-content > div {
-  display: flex;
-  flex-direction: column;
-  justify-content: space-between;
-  min-height: var(--header-height);
-  padding-bottom: 1rem;
-}
-.UnitHeader--sticky .UnitHeader-content > div {
-  align-items: center;
-  flex-direction: row;
-  padding-bottom: 0;
-}
-
-.UnitHeader-title {
-  align-items: center;
-  display: flex;
-  overflow: hidden;
-}
-.UnitHeader-logo {
-  align-items: center;
-  display: flex;
-  margin-right: 0;
-  opacity: 0;
-  transition: opacity 0.25s ease-in-out, margin 0.25s ease-in, width 0.25s ease-out;
-  visibility: hidden;
-  width: 0;
-}
-.UnitHeader-logo img {
-  height: 1.695625rem;
-  width: 4.5rem;
-}
-.UnitHeader--sticky .UnitHeader-logo {
-  margin-right: 0.5rem;
-  opacity: 1;
-  visibility: visible;
-  width: 4.5rem;
-}
-@media only screen and (min-width: 37.5rem) {
-  .UnitHeader--sticky .UnitHeader-logo {
-    height: 1.9541rem;
-    margin-right: 1rem;
-    width: 5.1875rem;
-  }
-}
-.UnitHeader-title h1 {
-  font-size: 1.75rem;
-  font-weight: 600;
-  line-height: 2.25rem;
-  margin: 0.5rem 0;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.UnitHeader--sticky .UnitHeader-title h1 {
-  font-size: 1.125rem;
-  font-weight: 600;
-  line-height: 1.5;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-@media only screen and (min-width: 37.5rem) {
-  .UnitHeader--sticky .UnitHeader-title h1 {
-    font-size: 1.5rem;
-  }
-}
-.UnitHeader-content .CopyToClipboardButton {
-  display: none;
-}
-.UnitHeader--sticky .UnitHeader-content .CopyToClipboardButton {
-  display: initial;
-}
-
-.UnitHeader-details {
-  display: none;
-  flex-direction: column;
-  white-space: nowrap;
-}
-.UnitHeader--full .UnitHeader-details {
-  display: flex;
-}
-@media only screen and (min-width: 52rem) {
-  .UnitHeader-details {
-    align-items: center;
-    flex-direction: row;
-  }
-  .UnitHeader--full .UnitHeader-details {
-    flex-wrap: wrap;
-  }
-}
-@media only screen and (min-width: 70rem) {
-  .UnitHeader-details {
-    display: flex;
-  }
-}
-.UnitHeader-detailItem {
-  color: var(--gray-4);
-  display: inline;
-  font-size: 0.875rem;
-  line-height: 1.75rem;
-}
-
-@media only screen and (min-width: 52rem) {
-  .UnitHeader-detailItem:not(:last-of-type)::after {
-    content: '|';
-    padding: 1rem;
-  }
-}
-.UnitHeader-detailItemSubtle {
-  color: var(--gray-4);
-}
-
-.UnitHeader-overflowContainer {
-  display: none;
-  height: 1.5rem;
-  position: absolute;
-  right: 1rem;
-  width: 1.5rem;
-}
-.UnitHeader--sticky .UnitHeader-overflowContainer {
-  display: block;
-}
-@media only screen and (min-width: 70rem) {
-  .UnitHeader--sticky .UnitHeader-overflowContainer {
-    display: none;
-  }
-}
-.UnitHeader-overflowImage {
-  fill: var(--gray-3);
-  height: 100%;
-  left: 0;
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-.UnitHeader-overflowSelect {
-  -webkit-appearance: none;
-  -moz-appearance: none;
-  appearance: none;
-  background: transparent;
-  border: 0;
-  color: transparent;
-  cursor: pointer;
-  font-size: 1rem;
-  height: 100%;
-  left: 0;
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-.UnitHeader-overflowSelect option {
-  color: var(--gray-1);
-}
-
-.UnitHeader-badge {
-  border: 0.0625rem solid var(--gray-4);
-  border-radius: 0.125rem;
-  display: none;
-  font-size: 0.6875rem;
-  font-weight: 500;
-  line-height: 1rem;
-  margin-left: 0.5rem;
-  margin-top: 0.125rem;
-  padding: 0 0.35rem;
-  text-align: center;
-}
-.UnitHeader--full .UnitHeader-badge {
-  display: block;
-}
-@media only screen and (min-width: 80rem) {
-  .UnitHeader--sticky .UnitHeader-badge {
-    display: block;
-  }
-}
-
-.UnitHeader-banners {
-  z-index: 1;
-}
-.UnitHeader-banner {
-  display: flex;
-  padding: 0.75rem 0;
-}
-.UnitHeader-bannerContent {
-  align-items: center;
-  display: flex;
-}
-.UnitHeader-banner--majorVersion,
-.UnitHeader-banner--redirected {
-  background-color: var(--gray-9);
-}
-.UnitHeader-banner--deprecated,
-.UnitHeader-banner--retracted {
-  background-color: var(--yellow);
-}
-.UnitHeader-banner-icon {
-  color: var(--gray-3);
-  margin-right: 0.5rem;
-  width: 1rem;
-}
-.UnitHeader-versionBadge,
-.DetailsHeader-badge {
-  border-radius: unset;
-  color: var(--white);
-  font-size: 0.7rem;
-  line-height: 0.85rem;
-  margin: -1rem 0 -1rem 0.5rem;
-  padding: 0.25rem 0.5rem;
-  text-transform: uppercase;
-  top: -0.0625rem;
-}
-.UnitHeader-versionBadge--latest,
-.DetailsHeader-badge--latest {
-  background: var(--turq-dark);
-}
-.UnitHeader-versionBadge--goToLatest,
-.DetailsHeader-badge--goToLatest {
-  background: var(--pink);
-}
-.UnitHeader-versionBadge--unknown,
-.DetailsHeader-badge--unknown {
-  display: none;
-}
-
-a.UnitHeader-backLink {
-  color: var(--black);
-  display: block;
-  font-size: 1rem;
-}
-.UnitHeader-backLink img {
-  height: 0.8125rem;
-  margin-right: 0.5rem;
-  width: auto;
-}
-
-.DetailsHeader-badge--notAtLatest {
-  background: var(--turq-dark);
-}
-.DetailsHeader-badge--notAtLatest a {
-  display: none;
-}
-.DetailsHeader-badge--notAtLatest span.DetailsHeader-span--latest {
-  display: none;
-}
-.DetailsHeader-badge--notAtLatest .UnitMetaDetails-icon {
-  z-index: 1;
-}
-.DetailsHeader-badge--notAtLatest .UnitMetaDetails-toggletipBubble {
-  color: var(--black);
-  text-transform: none;
-}
-.DetailsHeader-span--notAtLatest .UnitMetaDetails-toggletip {
-  height: 0;
-}
-.DetailsHeader-span--notAtLatest .UnitMetaDetails-toggletip button {
-  height: 0.8125rem;
-  line-height: 0;
-}
-.DetailsHeader-span--notAtLatest .UnitMetaDetails-toggletip img {
-  vertical-align: middle;
-}
-
-.DetailsHeader-badge--goToLatest {
-  background: var(--pink);
-}
-.DetailsHeader-badge--goToLatest a {
-  color: var(--white);
-}
-.DetailsHeader-badge--goToLatest span {
-  display: none;
-}
-.DetailsHeader-badge--unknown a {
-  display: none;
-}
-.DetailsHeader-badge--unknown span {
-  display: none;
-}
diff --git a/static/legacy/css/unit_meta.css b/static/legacy/css/unit_meta.css
deleted file mode 100644
index 4614e6c..0000000
--- a/static/legacy/css/unit_meta.css
+++ /dev/null
@@ -1,169 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.UnitMeta {
-  align-items: baseline;
-  display: flex;
-  flex-direction: column;
-  margin-bottom: 0.5rem;
-  position: relative;
-}
-@media screen and (max-width: 51.9375rem), (min-width: 64rem) {
-  .UnitMeta > div {
-    padding-bottom: 0.75rem;
-  }
-  .UnitMeta > h2 {
-    padding-bottom: 0.5rem;
-  }
-}
-@media only screen and (min-width: 52rem) and (max-width: 63.9375rem) {
-  .UnitMeta {
-    align-items: baseline;
-    display: grid;
-    gap: 0.5rem 2.5rem;
-    grid-auto-columns: auto 1fr auto;
-    grid-template-areas:
-      'a b c'
-      'd e .'
-      'f g .';
-    justify-content: space-between;
-    position: initial;
-    word-break: break-word;
-  }
-  .UnitMeta-detailsTitle {
-    grid-area: a;
-  }
-  .UnitMeta-details {
-    grid-area: b;
-  }
-  .UnitMeta-learn {
-    grid-area: c;
-    position: initial;
-    text-align: right;
-  }
-  .UnitMeta-repoTitle {
-    grid-area: d;
-  }
-  .UnitMeta-repo {
-    grid-area: e;
-  }
-  .UnitMeta-linksTitle {
-    grid-area: f;
-  }
-  .UnitMeta-links {
-    grid-area: g;
-  }
-}
-.UnitMeta-learn {
-  font-size: 0.875rem;
-  position: absolute;
-  right: 1rem;
-}
-@media only screen and (min-width: 52rem) and (max-width: 63.9375rem) {
-  .UnitMeta-learn {
-    padding-top: 0.25rem;
-  }
-}
-.UnitMeta-repo a {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.UnitMeta-detailsTitle,
-.UnitMeta-linksTitle,
-.UnitMeta-repoTitle {
-  font-size: 1rem;
-  margin: 0;
-  white-space: nowrap;
-}
-.UnitMeta-links,
-.UnitMeta-repo {
-  width: 100%;
-}
-.UnitMeta-details ul,
-.UnitMeta-links ul,
-.UnitMeta-repo {
-  color: var(--gray-4);
-  display: flex;
-  flex-direction: column;
-  font-size: 0.875rem;
-  line-height: 1.75rem;
-  list-style: none;
-  margin: 0;
-  padding: 0;
-  white-space: nowrap;
-  width: 100%;
-}
-@media only screen and (min-width: 52rem) and (max-width: 63.9375rem) {
-  .UnitMeta-details ul,
-  .UnitMeta-links ul,
-  .UnitMeta-repo {
-    display: flex;
-    flex-direction: row;
-    flex-wrap: wrap;
-    gap: 0.125rem 1rem;
-    list-style: none;
-    margin: 0;
-    padding: 0;
-    white-space: nowrap;
-  }
-}
-.UnitMeta-details li,
-.UnitMeta-links li {
-  overflow: hidden;
-  padding-right: 1rem;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.UnitMetaDetails-icon {
-  height: auto;
-  margin-right: 0.25rem;
-  position: relative;
-  top: 0.125rem;
-  width: 0.875rem;
-  z-index: -1;
-}
-.UnitMetaDetails-toggletip button {
-  background: none;
-  border: none;
-  cursor: pointer;
-  width: 1.625rem;
-}
-.UnitMetaDetails-toggletip [role='status'] {
-  height: 0;
-  position: absolute;
-  width: 0;
-}
-.UnitMetaDetails-toggletipBubble {
-  background: var(--white) 80%;
-  border: 0.0625rem solid var(--gray-8);
-  border-radius: 0.25rem;
-  display: block;
-  font-size: 0.75rem;
-  left: -6rem;
-  letter-spacing: 0.01875rem;
-  line-height: 1rem;
-  padding: 0.5rem;
-  position: relative;
-  top: 1.5rem;
-  white-space: initial;
-  width: 12rem;
-}
-@media only screen and (min-width: 64rem) {
-  .UnitMetaDetails-toggletipBubble {
-    left: -12rem;
-  }
-}
-@media only screen and (min-width: 70rem) {
-  .UnitMetaDetails-toggletipBubble {
-    left: -12rem;
-  }
-}
-@media only screen and (min-width: 82rem) {
-  .UnitMetaDetails-toggletipBubble {
-    left: -8rem;
-  }
-}
diff --git a/static/legacy/css/unit_outline.css b/static/legacy/css/unit_outline.css
deleted file mode 100644
index dc07b4f..0000000
--- a/static/legacy/css/unit_outline.css
+++ /dev/null
@@ -1,172 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-/* TODO(jamal): remove these styles with legacy code. */
-.Documentation-index,
-.DocNav-index {
-  display: block;
-}
-
-.UnitOutline {
-  display: flex;
-  flex-direction: column;
-  max-height: 100%;
-  position: sticky;
-  top: calc(var(--header-height) + var(--banner-height) + 1rem);
-}
-.UnitOutline-jumpTo {
-  display: flex;
-  margin-bottom: -0.1625rem;
-}
-.UnitOutline-jumpTo button {
-  background-color: var(--white);
-  border: 0.0625rem solid var(--gray-8);
-  border-radius: 0.25rem;
-  color: var(--gray-4);
-  cursor: pointer;
-  height: 2rem;
-  padding-left: 1.5rem;
-  text-align: left;
-  width: 100%;
-}
-.UnitOutline-jumpTo button:hover:not([disabled]) {
-  border-color: var(--gray-7);
-}
-.UnitOutline-jumpTo::after {
-  align-self: center;
-  background-color: var(--gray-9);
-  border-radius: 0.5rem;
-  color: var(--gray-6);
-  content: 'f';
-  content: 'f' / 'find';
-  font-size: 0.75rem;
-  padding: 0.0625rem 0;
-  position: absolute;
-  right: 0.75rem;
-  text-align: center;
-  width: 1.5rem;
-}
-.UnitOutline-jumpTo::before {
-  align-self: center;
-  border-radius: 0.5rem;
-  color: var(--gray-6);
-  content: url('/static/legacy/img/pkg-icon-jumpTo_16x16.svg');
-  font-size: 0.75rem;
-  left: 0.4rem;
-  position: absolute;
-  text-align: center;
-  top: 0.5rem;
-}
-.UnitOutline-jumpToInput:disabled {
-  background-color: var(--gray-9);
-}
-.UnitOutline ul[role='tree'],
-.UnitOutline ul[role='treeitem'],
-.UnitOutline ul[role='group'] {
-  list-style: none;
-  padding-left: 0;
-}
-.UnitOutline li:last-of-type {
-  padding-bottom: 0.25rem;
-}
-.UnitOutline [role='treeitem'][aria-expanded='false'] + ul[role='group'] {
-  display: none;
-}
-.UnitOutline [role='treeitem'][aria-expanded='true'] + ul[role='group'] {
-  display: block;
-}
-.UnitOutline [role='treeitem'][aria-level='1'] + ul[role='group'] {
-  max-height: calc(100vh - 20rem);
-  overflow-y: auto;
-  padding: 0.5rem 0.25rem 0 0.25rem;
-}
-.UnitOutline a {
-  color: var(--gray-2);
-  display: block;
-  line-height: 1.5rem;
-  overflow: hidden;
-  padding: 0.125rem 0 0.125rem 1.25rem;
-  position: relative;
-  text-overflow: ellipsis;
-  user-select: none;
-  white-space: nowrap;
-}
-.UnitOutline a:focus,
-.UnitOutline a:hover {
-  outline: transparent;
-  text-decoration: underline;
-}
-.UnitOutline [role='treeitem'][aria-selected='true'] {
-  color: var(--gray-1);
-  font-weight: 500;
-}
-.UnitOutline [role='treeitem'][aria-level='1'] {
-  display: block;
-  font-size: 1.125rem;
-  font-weight: 500;
-  line-height: 2.5rem;
-  padding: 0 1rem;
-}
-.UnitOutline [role='treeitem'][aria-level='1'][aria-selected='true'],
-.UnitOutline [role='treeitem'][aria-level='1'][aria-expanded='true'] {
-  background-color: var(--gray-9);
-}
-.UnitOutline [role='treeitem'][aria-level='3'][aria-expanded='true'] {
-  margin-bottom: 0.375em;
-}
-.UnitOutline [role='treeitem'][aria-level='2'] {
-  margin-bottom: 0.25rem;
-  position: relative;
-}
-.UnitOutline [role='treeitem'][aria-level='3'] {
-  font-size: 0.875rem;
-  padding-left: 2.5rem;
-}
-.UnitOutline [role='treeitem'][aria-level='4'] {
-  border-left: 0.125rem solid var(--gray-9);
-  font-size: 0.875rem;
-  margin-left: 2.5rem;
-  padding-left: 0.5rem;
-}
-.UnitOutline [role='treeitem'][aria-selected='true'][aria-level='2']:not([aria-expanded])::before,
-.UnitOutline [role='treeitem'][aria-selected='true'][aria-level='3']:not([aria-expanded])::before {
-  background-color: var(--turq-dark);
-  border-radius: 50%;
-  content: '';
-  display: block;
-  height: 0.3125rem;
-  left: 0.4688rem;
-  position: absolute;
-  top: 0.6875rem;
-  width: 0.3125rem;
-}
-.UnitOutline [role='treeitem'][aria-expanded][aria-owns][aria-level='2']::before,
-.UnitOutline [role='treeitem'][aria-expanded][aria-owns][aria-level='3']::before {
-  border-bottom: 0.25rem solid transparent;
-  border-left: 0.25rem solid var(--gray-4);
-  border-right: 0;
-  border-top: 0.25rem solid transparent;
-  content: '';
-  display: block;
-  height: 0;
-  left: 0.5rem;
-  position: absolute;
-  top: 0.625rem;
-  transition: transform 0.1s linear;
-  width: 0;
-}
-.UnitOutline [role='treeitem'][aria-expanded='true'][aria-level='2']::before,
-.UnitOutline [role='treeitem'][aria-expanded='true'][aria-level='3']::before {
-  transform: rotate(90deg);
-}
-.UnitOutline [role='treeitem'][aria-expanded][aria-level='3']:not([empty])::before,
-.UnitOutline [role='treeitem'][aria-selected][aria-level='3']:not([empty])::before {
-  left: 1.5rem;
-  top: 0.75rem;
-}
-.UnitOutline [role='treeitem'][aria-selected='true'][aria-level='4'] {
-  border-left: 0.125rem solid var(--turq-dark);
-}
diff --git a/static/legacy/css/unit_readme.css b/static/legacy/css/unit_readme.css
deleted file mode 100644
index 8249c21..0000000
--- a/static/legacy/css/unit_readme.css
+++ /dev/null
@@ -1,77 +0,0 @@
-/*!
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.UnitReadme {
-  margin-bottom: 2rem;
-}
-.UnitReadme h2 a.UnitReadme-idLink,
-.UnitReadme summary a {
-  opacity: 0;
-}
-.UnitReadme h2:hover a,
-.UnitReadme summary:focus a {
-  opacity: 1;
-}
-.UnitReadme-title {
-  border-bottom: 0.0625rem solid var(--gray-8);
-  font-size: 1.375rem;
-  margin: 0.5rem 0 0 0;
-  padding-bottom: 1rem;
-}
-.UnitReadme-title img {
-  margin-right: 1rem;
-  vertical-align: bottom;
-}
-.UnitReadme-content {
-  max-height: 20rem;
-  overflow: hidden;
-  position: relative;
-}
-.UnitReadme-content ul {
-  line-height: 1.5rem;
-}
-.UnitReadme-fadeOut {
-  background-image: linear-gradient(to bottom, transparent, var(--white));
-  bottom: 0;
-  left: 0;
-  margin: 0;
-  padding: 1.875rem 0;
-  position: absolute;
-  text-align: center;
-  width: 100%;
-}
-.UnitReadme-expandLink {
-  background: none;
-  border: none;
-  color: var(--turq-dark);
-  cursor: pointer;
-  padding: 0;
-}
-.UnitReadme-collapseLink {
-  background: none;
-  border: none;
-  color: var(--turq-dark);
-  cursor: pointer;
-  display: none;
-  padding: 0;
-}
-.UnitReadme--expanded .UnitReadme-content {
-  max-height: initial;
-  overflow: initial;
-}
-.UnitReadme--expanded .UnitReadme-fadeOut {
-  display: none;
-}
-.UnitReadme--expanded .UnitReadme-expandLink {
-  display: none;
-}
-.UnitReadme--expanded .UnitReadme-collapseLink {
-  display: block;
-}
-
-.Overview-readmeContent {
-  overflow-wrap: break-word;
-}
diff --git a/static/legacy/css/versions.css b/static/legacy/css/versions.css
deleted file mode 100644
index 2326c56..0000000
--- a/static/legacy/css/versions.css
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-.Unit-content .Versions {
-  margin-top: 1rem;
-  max-width: unset;
-}
-.Versions table {
-  border-spacing: 0;
-}
-.Versions th {
-  text-align: left;
-}
-.Versions td {
-  padding-bottom: 1rem;
-}
-.Versions td:nth-child(1) {
-  padding-right: 3rem;
-  vertical-align: top;
-}
-.Versions td:nth-child(2) {
-  border-right: 0.0625rem solid var(--gray-8);
-  padding-right: 1rem;
-  text-align: right;
-  vertical-align: top;
-  white-space: nowrap;
-}
-.Versions td:nth-child(3) {
-  padding-left: 1rem;
-}
-.Versions-commitTime {
-  font-size: 1rem;
-  font-weight: 400;
-}
-.Versions-major {
-  font-weight: 600;
-}
-.Versions-symbols {
-  margin-left: 2rem;
-}
-.Versions-symbolBulletNew {
-  color: var(--gray-3);
-  padding-right: 0.5rem;
-}
-.Versions-symbolBuilds,
-.Versions-symbolBuildsDash,
-.Versions-symbolOld {
-  color: var(--gray-3);
-}
-.Versions-symbolChild {
-  padding-left: 2rem;
-}
-.Versions-symbolSection,
-.Versions-symbolType {
-  margin-bottom: 0.625rem;
-}
-.Versions-symbolsHeader {
-  margin: 0.625rem 0;
-}
-
-.Versions-title {
-  align-items: center;
-  display: flex;
-  flex-wrap: wrap;
-  gap: 1rem 2.5rem;
-  margin-bottom: 1rem;
-}
-.Versions-title h2 {
-  margin: 0;
-}
-.Versions-titleButtonGroup {
-  display: none;
-}
-.Versions-titleButtonGroup button {
-  background-color: transparent;
-  border: none;
-  bottom: 1rem;
-  color: var(--turq-dark);
-  cursor: pointer;
-  font-size: 0.875rem;
-  text-decoration: none;
-}
-.Versions-titleButtonGroup button:disabled {
-  color: var(--gray-8);
-  cursor: initial;
-}
-.Versions-list {
-  gap: 0 1rem;
-  line-height: 2.25rem;
-}
-@media only screen and (min-width: 37.5rem) {
-  .Versions-list {
-    display: grid;
-    grid-template-columns: fit-content(8rem) fit-content(20rem) min-content auto;
-  }
-}
-.Version-major {
-  align-items: baseline;
-  display: flex;
-  margin-bottom: 1rem;
-  min-width: 4rem;
-}
-@media only screen and (min-width: 37.5rem) {
-  .Version-major {
-    margin-bottom: 0;
-  }
-}
-.Version-tag {
-  text-align: left;
-}
-@media only screen and (min-width: 37.5rem) {
-  .Version-tag {
-    text-align: right;
-  }
-}
-.Version-dot {
-  border: 0.0625rem solid var(--gray-9);
-  color: var(--gray-8);
-  display: none;
-  font-size: 2.75rem;
-  justify-content: center;
-  line-height: 1.75rem;
-  -webkit-text-stroke: 0.125rem var(--white);
-  width: 0;
-}
-.Version-dot::before {
-  content: '•';
-}
-@media only screen and (min-width: 37.5rem) {
-  .Version-dot {
-    display: flex;
-  }
-}
-.Version-dot--minor {
-  color: var(--turq-dark);
-}
-.Version-commitTime {
-  align-items: center;
-  display: flex;
-  margin-left: 1rem;
-  white-space: nowrap;
-}
-.Version-details {
-  line-height: 1.25rem;
-}
-.Version-summary {
-  align-items: center;
-  cursor: pointer;
-  line-height: 2.25rem;
-  padding-right: 0.5rem;
-  white-space: nowrap;
-  width: min-content;
-}
-
-.Version-badge {
-  border: 0.0625rem solid var(--gray-4);
-  border-radius: 0.125rem;
-  font-size: 0.6875rem;
-  font-weight: 500;
-  line-height: 1rem;
-  margin-left: 0.5rem;
-  margin-top: 0.125rem;
-  padding: 0 0.35rem;
-  text-align: center;
-}
diff --git a/static/legacy/html/helpers/_empty_content.tmpl b/static/legacy/html/helpers/_empty_content.tmpl
deleted file mode 100644
index c2c60e4..0000000
--- a/static/legacy/html/helpers/_empty_content.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-<!--
-  Copyright 2019 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "empty_content"}}
-  <div>
-    <img class="EmptyContent-gopher" src="/static/legacy/img/gopher-airplane.svg" alt="The Go Gopher">
-    <h3 class="EmptyContent-message" data-test-id="gopher-message">{{.}}</h3>
-  </div>
-{{end}}
diff --git a/static/legacy/html/helpers/_importedby.tmpl b/static/legacy/html/helpers/_importedby.tmpl
deleted file mode 100644
index e6fcf05..0000000
--- a/static/legacy/html/helpers/_importedby.tmpl
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
-  Copyright 2019 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "importedby"}}
-  <div class="ImportedBy">
-    {{if .ImportedBy}}
-      <b>Known {{pluralize .Total "importer"}}:</b> {{.NumImportedByDisplay}}
-      {{template "sections" .ImportedBy}}
-    {{else}}
-      {{template "empty_content" "No known importers for this package!"}}
-    {{end}}
-  </div>
-{{end}}
-
-{{define "sections"}}
-  <ul class="ImportedBy-list">
-    {{range .}}
-      {{template "section" .}}
-    {{end}}
-  </ul>
-{{end}}
-
-{{define "section"}}
-  {{if .Subs}}
-    <details>
-      <summary>{{.Prefix}} ({{.NumLines}})</summary>
-      <div class="ImportedBy-detailsContent">
-        {{template "sections" .Subs}}
-      </div>
-    </details>
-  {{else}}
-    <li class="ImportedBy-detailsIndent"><a class="u-breakWord" href="/{{.Prefix}}">{{.Prefix}}</a></li>
-  {{end}}
-{{end}}
diff --git a/static/legacy/html/helpers/_imports.tmpl b/static/legacy/html/helpers/_imports.tmpl
deleted file mode 100644
index df11147..0000000
--- a/static/legacy/html/helpers/_imports.tmpl
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "imports"}}
-  <div>
-    {{if or .ExternalImports .InternalImports .StdLib}}
-      {{if .ExternalImports}}
-        <h2 class="Imports-heading">Imports</h2>
-        <ul class="Imports-list">
-        {{range .ExternalImports}}
-          <li><a href="/{{.}}">{{.}}</a></li>
-        {{end}}
-        </ul>
-      {{end}}
-      {{if .InternalImports}}
-        <h2 class="Imports-heading">Imports in module “{{.ModulePath}}”</h2>
-        <ul class="Imports-list">
-        {{range .InternalImports}}
-          <li><a href="/{{.}}">{{.}}</a></li>
-        {{end}}
-        </ul>
-      {{end}}
-      {{if .StdLib}}
-        <h2 class="Imports-heading">Standard library imports</h2>
-        <ul class="Imports-list">
-        {{range .StdLib}}
-          <li><a href="/{{.}}">{{.}}</a></li>
-        {{end}}
-        </ul>
-      {{end}}
-    {{else}}
-      {{template "empty_content" "This package does not have any imports!"}}
-    {{end}}
-  </div>
-{{end}}
diff --git a/static/legacy/html/helpers/_licenses.tmpl b/static/legacy/html/helpers/_licenses.tmpl
deleted file mode 100644
index f26b4af..0000000
--- a/static/legacy/html/helpers/_licenses.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "licenses"}}
-  {{range .Licenses}}
-    <section class="License" id="{{.Anchor}}">
-      <h2><div id="#{{.Anchor}}">{{range $i, $e := .Types}}{{if $i}}, {{end}}{{$e}}{{end}}</div></h2>
-      <p>This is not legal advice. <a href="/license-policy">Read disclaimer.</a></p>
-      <pre class="License-contents">{{printf "%s" .Contents}}</pre>
-    </section>
-    <div class="License-source">Source: {{.Source}}</div>
-  {{end}}
-{{end}}
diff --git a/static/legacy/html/helpers/_pagination.tmpl b/static/legacy/html/helpers/_pagination.tmpl
deleted file mode 100644
index 00158a8..0000000
--- a/static/legacy/html/helpers/_pagination.tmpl
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-  Copyright 2019 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "pagination_summary"}}
-  {{- if gt .TotalCount .ResultCount -}}
-    {{- add .Offset 1}} – {{add .Offset .ResultCount}} of
-  {{- end}} {{if .Approximate}}about {{end}}{{.TotalCount -}}
-{{end}}
-
-{{define "pagination_nav"}}
-  {{if gt (len .Pages) 1}}
-    <div class="Pagination-nav">
-      <div class="Pagination-navInner">
-        {{ $pagination := . }}
-        {{if .PrevPage}}
-          <a class="Pagination-previous" href="{{.PageURL .PrevPage}}">Previous</a>
-        {{else}}
-          <span class="Pagination-previous" aria-disabled="true">Previous</span>
-        {{end}}
-        {{$page := .Page}}
-        {{range $i := .Pages}}
-          {{if eq $i $page}}
-            <b class="Pagination-number">{{$i}}</b>
-          {{else}}
-            <a class="Pagination-number" href="{{$pagination.PageURL $i}}">{{$i}}</a>
-          {{end}}
-        {{end}}
-        {{if .NextPage}}
-          <a class="Pagination-next" href="{{.PageURL .NextPage}}">Next</a>
-        {{else}}
-          <span class="Pagination-next" aria-disabled="true">Next</span>
-        {{end}}
-      </div>
-    </div>
-  {{end}}
-{{end}}
diff --git a/static/legacy/html/helpers/_search_bar.tmpl b/static/legacy/html/helpers/_search_bar.tmpl
deleted file mode 100644
index de5f543..0000000
--- a/static/legacy/html/helpers/_search_bar.tmpl
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-  Copyright 2019 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "header_search"}}
-  <form class="Header-searchForm"
-        action="/search"
-        role="search"
-        data-gtmc="header search form"
-        aria-label="Search for a Package">
-    <button class="Header-searchFormSubmit" aria-label="Search for a package">
-      <svg class="Header-searchFormSubmitIcon" focusable="false" viewBox="0 0 24 24" aria-hidden="true" role="presentation"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path><path fill="none" d="M0 0h24v24H0z"></path></svg>
-    </button>
-    <input class="Header-searchFormInput js-searchFocus"
-      aria-label="Search for a package"
-      type="text"
-      name="q"
-      placeholder="Search for a package"
-      autocapitalize="off"
-      autocomplete="off"
-      autocorrect="off"
-      spellcheck="false"
-      title="Search for a package"
-      value="{{.Query}}"
-      {{block "search_additional_attrs" .}}{{end}}>
-  </form>
-{{end}}
diff --git a/static/legacy/html/helpers/_unit_build_context.tmpl b/static/legacy/html/helpers/_unit_build_context.tmpl
deleted file mode 100644
index 5c3dcdc..0000000
--- a/static/legacy/html/helpers/_unit_build_context.tmpl
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  Copyright 2021 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_build_context"}}
-  {{if .BuildContexts}}
-    {{if gt (len .BuildContexts) 1}}
-      <div class="UnitBuildContext-titleContext">
-        <label><a href="https://go.dev/about#build-context">Rendered for</a>
-          <select class="js-buildContextSelect">
-            {{range .BuildContexts}}
-              <option{{if eq .GOOS $.GOOS}} selected{{end}} value="{{.GOOS}}">{{.GOOS}}/{{.GOARCH}}</option>
-            {{end}}
-          </select>
-        </label>
-      </div>
-    {{else if not (eq .GOOS "all")}}
-      <div class="UnitBuildContext-titleContext">
-        <div class="UnitBuildContext-singleContext"><a href="/about#build-context">Rendered for</a> {{.GOOS}}/{{.GOARCH}}</div>
-      </div>
-    {{end}}
-  {{end}}
-{{end}}
diff --git a/static/legacy/html/helpers/_unit_directories.tmpl b/static/legacy/html/helpers/_unit_directories.tmpl
deleted file mode 100644
index eea8805..0000000
--- a/static/legacy/html/helpers/_unit_directories.tmpl
+++ /dev/null
@@ -1,79 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_directories"}}
-  <div class="UnitDirectories js-unitDirectories">
-    <h2 class="UnitDirectories-title" id="section-directories">
-      <img height="25px" width="20px" src="/static/legacy/img/pkg-icon-folder_20x16.svg" alt="">Directories
-      <a class="UnitDirectories-idLink" href="#section-directories">¶</a>
-    </h2>
-    <div class="UnitDirectories-expandButton">
-      <button class="js-expandAllDirectories" data-test-id="directories-toggle"
-          data-gtmc="directories button" aria-label="Expand All Directories">
-        Expand all
-      </button>
-    </div>
-    <table class="UnitDirectories-table UnitDirectories-table--tree js-expandableTable"
-          data-test-id="UnitDirectories-table">
-      <tr class="UnitDirectories-tableHeader UnitDirectories-tableHeader--tree">
-        <th>Path</th>
-        <th class="UnitDirectories-desktopSynopsis">Synopsis</th>
-      </tr>
-      {{range $dir := .Directories.External}}
-          {{template "directory" .}}
-      {{end}}
-      {{if .Directories.Internal}}
-          {{template "directory" .Directories.Internal}}
-      {{end}}
-    </table>
-  </div>
-{{end}}
-
-{{define "directory"}}
-  {{$prefix := .Prefix}}
-  <tr{{if .Subdirectories}} data-aria-controls="{{range .Subdirectories}}{{$prefix}}-{{.Suffix}} {{end}}"{{end}}>
-    <td data-id="{{$prefix}}" data-aria-owns="{{range .Subdirectories}}{{$prefix}}-{{.Suffix}} {{end}}">
-      <div class="UnitDirectories-pathCell">
-        <div>
-          {{- if .Subdirectories -}}
-            <button type="button" class="UnitDirectories-toggleButton"
-                aria-expanded="false"
-                aria-label="{{len .Subdirectories}} more from"
-                data-aria-controls="{{range .Subdirectories}}{{$prefix}}-{{.Suffix}} {{end}}"
-                data-aria-labelledby="{{$prefix}}-button {{$prefix}}"
-                data-id="{{$prefix}}-button">
-              <img alt="" src="/static/legacy/img/pkg-icon-arrowRight_24x24.svg" height="24" width="24">
-            </button>
-          {{- end -}}
-          {{- if .Root -}}
-            <a href="{{.Root.URL}}">{{.Root.Suffix}}</a>
-            {{if .Root.IsModule}}<span class="UnitDirectories-badge">module</span>{{end}}
-          </div>
-          <div class="UnitDirectories-mobileSynopsis">{{.Root.Synopsis}}</div>
-        </div>
-      </td>
-      <td class="UnitDirectories-desktopSynopsis">{{.Root.Synopsis}}</td>
-    {{- else -}}
-        <span>{{.Prefix}}</span>
-      </td>
-      <td class="UnitDirectories-desktopSynopsis"></td>
-    {{- end -}}
-  </tr>
-  {{- range .Subdirectories -}}
-    <tr data-id="{{$prefix}}-{{.Suffix}}">
-      <td>
-        <div class="UnitDirectories-subdirectory">
-          <span>
-            <a href="{{.URL}}">{{.Suffix}}</a>
-            {{if .IsModule}}<span class="UnitDirectories-badge">Module</span>{{end}}
-          </span>
-          <div class="UnitDirectories-mobileSynopsis">{{.Synopsis}}</div>
-        </div>
-      </td>
-      <td class="UnitDirectories-desktopSynopsis">{{.Synopsis}}</td>
-    {{- end -}}
-  </tr>
-{{end}}
diff --git a/static/legacy/html/helpers/_unit_doc.tmpl b/static/legacy/html/helpers/_unit_doc.tmpl
deleted file mode 100644
index 533762a..0000000
--- a/static/legacy/html/helpers/_unit_doc.tmpl
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_doc"}}
-  <div class="UnitDoc">
-    <h2 class="UnitDoc-title" id="section-documentation">
-      <img height="25px" width="20px" src="/static/legacy/img/pkg-icon-doc_20x12.svg" alt="">Documentation
-      <a class="UnitDoc-idLink" href="#section-documentation">¶</a>
-    </h2>
-    {{template "unit_build_context" .}}
-    <div class="Documentation js-documentation">
-      {{if .DocBody.String}}
-        {{.DocBody}}
-      {{else}}
-        <div class="UnitDoc-emptySection">
-          <img src="/static/legacy/img/gopher-airplane.svg" alt="The Go Gopher"/>
-          <p>There is no documentation for this package.</p>
-        </div>
-      {{end}}
-    </div>
-  </div>
-{{end}}
diff --git a/static/legacy/html/helpers/_unit_files.tmpl b/static/legacy/html/helpers/_unit_files.tmpl
deleted file mode 100644
index a4d7dc0..0000000
--- a/static/legacy/html/helpers/_unit_files.tmpl
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_files"}}
-  <div class="UnitFiles js-unitFiles">
-    <h2 class="UnitFiles-title" id="section-sourcefiles">
-      <img height="16px" width="12px" src="/static/legacy/img/pkg-icon-file_16x12.svg" alt="">Source Files
-      <a class="UnitFiles-idLink" href="#section-sourcefiles">¶</a>
-    </h2>
-    <div class="UnitFiles-titleLink">
-      <a href="{{.SourceURL}}" target="_blank" rel="noopener">View all</a>
-    </div>
-    <div>
-      <ul class="UnitFiles-fileList">
-        {{- range .SourceFiles -}}
-          <li>
-            <a href="{{.URL}}" target="_blank" rel="noopener" title="{{.Name}}">{{.Name}}</a>
-          </li>
-        {{- end -}}
-      </ul>
-    </div>
-  </div>
-{{end}}
diff --git a/static/legacy/html/helpers/_unit_header.tmpl b/static/legacy/html/helpers/_unit_header.tmpl
deleted file mode 100644
index 8368eec..0000000
--- a/static/legacy/html/helpers/_unit_header.tmpl
+++ /dev/null
@@ -1,262 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{/* . is internal/frontend.UnitPage */}}
-
-{{define "unit_header"}}
-  <header class="js-unitHeader UnitHeader{{if eq .SelectedTab.Name ""}} UnitHeader--full UnitHeader--main{{if .Unit.IsPackage}}--package{{end}}{{end}}" aria-label="{{if eq .PageType "std"}}module{{else}}{{.PageType}}{{end}} {{.Title}} information" role="complementary">
-    <div class="js-headerSentinel"></div>
-    {{template "unit_header_banners" .}}
-    {{template "unit_header_breadcrumbs" .}}
-    {{template "unit_header_content" .}}
-  </header>
-{{end}}
-
-{{define "unit_header_breadcrumbs"}}
-  <div class="UnitHeader-breadcrumbs" data-test-id="UnitHeader-breadcrumb">
-    <div class="Site-margin">
-      {{with .Breadcrumb}}
-        {{range .Links}}
-          <span class="UnitHeader-breadcrumbItem" data-test-id="UnitHeader-breadcrumbItem">
-            <a data-gtmc="breadcrumbs link" href="{{.Href}}">{{.Body}}</a>
-          </span>
-        {{end}}
-        <span class="UnitHeader-breadcrumbItem">
-          <span data-test-id="UnitHeader-breadcrumbCurrent">{{.Current}}</span>
-          {{if .CopyData}}
-            <button class="CopyToClipboardButton js-copyToClipboard"
-                title="Copy path to clipboard.&#10;&#10;{{.CopyData}}"
-                data-to-copy="{{.CopyData}}"
-                data-gtmc="breadcrumbs button" aria-label="Copy to Clipboard">
-              <img class="CopyToClipboardButton-image" src="/static/legacy/img/copy-click.svg" alt="">
-            </button>
-          {{end}}
-        </span>
-      {{end}}
-    </div>
-  </div>
-{{end}}
-
-{{define "unit_header_content"}}
-  <div class="UnitHeader-content">
-    <div class="Site-margin">
-      {{template "unit_header_title" .}}
-      {{with .Breadcrumb}}
-        {{if .CopyData}}
-          <button class="CopyToClipboardButton js-copyToClipboard"
-              title="Copy path to clipboard.&#10;&#10;{{.CopyData}}"
-              data-to-copy="{{.CopyData}}"
-              data-gtmc="title button"
-              aria-label="Copy to Clipboard"
-              tabindex="-1">
-            <img class="CopyToClipboardButton-image" src="/static/legacy/img/copy-click.svg" alt="">
-          </button>
-        {{end}}
-      {{end}}
-      <div style="flex-grow: 1;"></div>
-      <div class="UnitHeader-details">
-        {{if (eq .SelectedTab.Name "")}}
-          {{template "detail_item_version" .}}
-          {{template "detail_item_commit_time" .}}
-          {{template "detail_item_licenses" .}}
-          {{if .Unit.IsPackage}}
-            {{template "detail_item_imports" .}}
-            {{template "detail_item_importedby" .}}
-          {{end}}
-        {{else}}
-          {{template "detail_page_nav" .}}
-        {{end}}
-      </div>
-      {{template "detail_items_overflow" .}}
-    </div>
-  </div>
-{{end}}
-
-{{define "unit_header_title"}}
-  <div class="UnitHeader-title">
-    <div class="UnitHeader-logo">
-      <a href="https://go.dev/" tabindex="-1" data-gtmc="header link" aria-label="Link to Go Homepage">
-        <img height="72px" width="72px" class="UnitHeader-logo" src="/static/legacy/img/go-logo-blue.svg" alt="Go">
-      </a>
-    </div>
-    <h1 data-test-id="UnitHeader-title">{{.Title}}</h1>
-    {{range .PageLabels}}
-      <span class="UnitHeader-badge">{{.}}</span>
-    {{end}}
-  </div>
-{{end}}
-
-{{define "detail_item_version"}}
-  <span class="UnitHeader-detailItem" data-test-id="UnitHeader-version">
-    <a href="?tab=versions" aria-label="Go to Versions" data-gtmc="header link"><span class="UnitHeader-detailItemSubtle">Version: </span>{{.DisplayVersion}}</a>
-    <!-- Do not reformat the data attributes of the following div: the server uses a regexp to extract them. -->
-    <div class="DetailsHeader-badge {{.LatestMinorClass}}"
-        data-test-id="UnitHeader-minorVersionBanner"
-        data-version="{{.LinkVersion}}"
-        data-mpath="{{.Unit.ModulePath}}"
-        data-ppath="{{.Unit.Path}}"
-        data-pagetype="{{.PageType}}">
-      <span class="DetailsHeader-span--latest">Latest</span>
-      <span class="DetailsHeader-span--notAtLatest">
-        Latest
-        {{template "severity_toggletip" "This package is not in the latest version of its module."}}
-      </span>
-      <a href="{{.LatestURL}}" aria-label="Go to Latest Version" data-gtmc="header link">Go to latest</a>
-    </div>
-  </span>
-{{end}}
-
-{{define "detail_item_commit_time"}}
-  <span class="UnitHeader-detailItem" data-test-id="UnitHeader-commitTime">
-    Published: {{.Details.CommitTime}}
-  </span>
-{{end}}
-
-{{define "detail_item_licenses"}}
-  <span class="UnitHeader-detailItem" data-test-id="UnitHeader-licenses">
-    License:{{" "}}
-    {{- if .Details.Licenses -}}
-      {{- if .Unit.IsRedistributable -}}
-        <a href="{{$.URLPath}}?tab=licenses" data-test-id="UnitHeader-license"
-            aria-label="Go to Licenses" data-gtmc="header link">
-          {{- range $i, $e := .Details.Licenses -}}
-            {{if $i}}, {{end}}{{$e.Type}}
-          {{- end -}}
-        </a>
-      {{else}}
-        <span>
-          {{- range $i, $e := .Details.Licenses -}}
-            {{if $i}}, {{end}} {{$e.Type}}
-          {{- end -}}
-        </span>
-        <a href="/license-policy" class="Disclaimer-link"
-            aria-label="Go to License Policy" data-gtmc="info link">
-          <em>not legal advice</em>
-        </a>
-      {{end}}
-    {{else}}
-      <span>None detected</span>
-      <a href="/license-policy" class="Disclaimer-link"
-          aria-label="Go to License Policy" data-gtmc="info link">
-        <em>not legal advice</em>
-      </a>
-    {{end}}
-  </span>
-{{end}}
-
-{{define "detail_item_imports"}}
-  <span class="UnitHeader-detailItem" data-test-id="UnitHeader-imports">
-    <a href="{{$.URLPath}}?tab=imports" aria-label="Go to Imports"
-        data-gtmc="header link">
-      <span class="UnitHeader-detailItemSubtle">Imports: </span>{{.Details.NumImports}}
-    </a>
-  </span>
-{{end}}
-
-{{define "detail_item_importedby"}}
-  <span class="UnitHeader-detailItem" data-test-id="UnitHeader-importedby">
-    <a href="{{$.URLPath}}?tab=importedby" aria-label="Go to Imported By"
-        data-gtmc="header link">
-       <span class="UnitHeader-detailItemSubtle">Imported by: </span>{{.Details.ImportedByCount}}
-    </a>
-  </span>
-{{end}}
-
-{{define "detail_items_overflow"}}
-  <div class="UnitHeader-overflowContainer">
-    <svg class="UnitHeader-overflowImage" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24">
-      <path d="M0 0h24v24H0z" fill="none"/>
-      <path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/>
-    </svg>
-    <select class="UnitHeader-overflowSelect js-overflowSelect" tabindex="-1">
-      <option>Main</option>
-      <option value="{{$.URLPath}}?tab=versions">
-        Versions
-      </option>
-      <option value="{{$.URLPath}}?tab=licenses">
-        Licenses
-      </option>
-      {{if .Unit.IsPackage}}
-        <option value="{{$.URLPath}}?tab=imports">
-          Imports
-        </option>
-        <option value="{{$.URLPath}}?tab=importedby">
-          Imported By
-        </option>
-      {{end}}
-    </select>
-  </div>
-{{end}}
-
-{{define "detail_page_nav"}}
-  <span class="UnitHeader-detailItem">
-    <!-- Do not reformat the data attributes of the following div: the server uses a regexp to extract them. -->
-    <div style="display: none;" class="DetailsHeader-badge {{.LatestMinorClass}}"
-        data-version="{{.LinkVersion}}" data-mpath="{{.Unit.ModulePath}}" data-ppath="{{.Unit.Path}}" data-pagetype="{{.PageType}}">
-    </div>
-    <a class="UnitHeader-backLink" href="{{.URLPath}}" data-gtmc="header link">
-      <img height="16px" width="16px" src="/static/legacy/img/pkg-icon-arrowLeft_16x16.svg" alt=""> Go to main page
-    </a>
-  </span>
-{{end}}
-
-{{define "unit_header_banners"}}
-  <div class="UnitHeader-banners">
-    {{with .RedirectedFromPath}}
-      <div class="UnitHeader-banner UnitHeader-banner--redirected">
-        <span class="Site-margin UnitHeader-bannerContent">
-          <img height="19px" width="16px" class="UnitHeader-banner-icon" src="/static/legacy/img/pkg-icon-info_19x16.svg" alt="">
-          <span>
-          Redirected from <span data-test-id="redirected-banner-text">{{.}}</span>.
-          </span>
-        </span>
-      </div>
-    {{end}}
-    {{if .Unit.Deprecated}}
-      <div class="UnitHeader-banner UnitHeader-banner--deprecated">
-        <span class="Site-margin UnitHeader-bannerContent">
-          <strong>Deprecated</strong>
-          {{with .Unit.DeprecationComment}}
-            <strong>:</strong>&nbsp;{{.}}
-          {{end}}
-        </span>
-      </div>
-    {{end}}
-    {{if .Unit.Retracted}}
-      <div class="UnitHeader-banner UnitHeader-banner--retracted">
-        <span class="Site-margin UnitHeader-bannerContent">
-          <strong>Retracted</strong>
-            {{with .Unit.RetractionRationale}}
-            <strong>:</strong>&nbsp;{{.}}
-          {{end}}
-        </span>
-      </div>
-    {{end}}
-    {{if .LatestMajorVersion}}
-      <div class="UnitHeader-banner UnitHeader-banner--majorVersion" data-test-id="UnitHeader-majorVersionBanner">
-        <span class="Site-margin UnitHeader-bannerContent">
-          <img height="19px" width="16px" class="UnitHeader-banner-icon" src="/static/legacy/img/pkg-icon-info_19x16.svg" alt="">
-          <span>
-            The highest tagged major version is
-            <a href="/{{.LatestMajorVersionURL}}" data-gtmc="banner link" aria-label="Go to Latest Major Version">
-              {{.LatestMajorVersion}}
-            </a>.
-          </span>
-        </span>
-      </div>
-    {{end}}
-  </div>
-{{end}}
-
-{{define "severity_toggletip"}}
-  <span class="UnitMetaDetails-toggletip">
-    <button type="button" data-gtmc="toggle tip button"
-        aria-label="More Info" data-toggletip-content="{{.}}">
-      <img src="/static/legacy/img/severity.svg" alt="" height="14" width="15">
-    </button>
-    <span role="status"></span>
-  </span>
-{{end}}
diff --git a/static/legacy/html/helpers/_unit_meta.tmpl b/static/legacy/html/helpers/_unit_meta.tmpl
deleted file mode 100644
index 9140348..0000000
--- a/static/legacy/html/helpers/_unit_meta.tmpl
+++ /dev/null
@@ -1,90 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_meta"}}
-  <div class="UnitMeta">
-    <h2 class="UnitMeta-detailsTitle">Details</h2>
-    <div class="UnitMeta-details">
-      {{template "unit_meta_details" .}}
-    </div>
-    <div class="UnitMeta-learn">
-      <a href="/about#best-practices-h2">Learn more</a>
-    </div>
-    <h2 class="UnitMeta-repoTitle">Repository</h2>
-    <div class="UnitMeta-repo">
-      {{if .Details.RepositoryURL}}
-        <a href="{{.Details.RepositoryURL}}" title="{{.Details.RepositoryURL}}" target="_blank" rel="noopener">
-          {{stripscheme .Details.RepositoryURL}}
-        </a>
-      {{else}}
-        Repository URL not available.
-      {{end}}
-    </div>
-    {{if or .Details.ReadmeLinks .Details.DocLinks .Details.ModuleReadmeLinks}}
-      <h2 class="UnitMeta-linksTitle">Links</h2>
-    {{end}}
-    <div class="UnitMeta-links">
-      <ul>
-        {{template "unit_meta_links" .Details.ReadmeLinks}}
-        {{template "unit_meta_links" .Details.DocLinks}}
-        {{template "unit_meta_links" .Details.ModuleReadmeLinks}}
-      </ul>
-    </div>
-  </div>
-{{end}}
-
-{{define "unit_meta_links"}}
-  {{range .}}
-    <li>
-      <a href="{{.Href}}" title="{{.Href}}" target="_blank" rel="noopener"
-          data-test-id="meta-link-{{.Body}}">{{.Body}}</a>
-    </li>
-  {{end}}
-{{end}}
-
-{{define "unit_meta_details_toggletip"}}
-  <span class="UnitMetaDetails-toggletip">
-    <button type="button" aria-label="more info" data-toggletip-content="{{.}}">
-      <img class="UnitMetaDetails-icon" src="/static/legacy/img/pkg-icon-help_24x24.svg" alt="" height="24" width="24">
-    </button>
-    <span role="status"></span>
-  </span>
-{{end}}
-
-{{define "unit_meta_details_check"}}
-  <img class="UnitMetaDetails-icon"
-    {{- if . -}}
-      src="/static/legacy/img/pkg-icon-checkCircleOutline_24x24.svg" alt="checked"
-    {{- else -}}
-      src="/static/legacy/img/pkg-icon-cancel_24x24.svg" alt="unchecked"
-    {{- end -}}
-  height="24" width="24">
-{{end}}
-
-{{define "unit_meta_details"}}
-  <ul>
-    <li>
-      {{template "unit_meta_details_check" .Unit.HasGoMod}}
-      Valid {{if .Unit.HasGoMod}}<a href="{{.Details.ModFileURL}}" target="_blank">{{end}}go.mod{{if .Unit.HasGoMod}}</a>{{end}} file
-      {{template "unit_meta_details_toggletip" "The Go module system was introduced in Go 1.11 and is the official dependency management solution for Go."}}
-    </li>
-    <li>
-      {{template "unit_meta_details_check" .Unit.IsRedistributable}}
-      Redistributable license
-      {{template "unit_meta_details_toggletip" "Redistributable licenses place minimal restrictions on how software can be used, modified, and redistributed."}}
-    </li>
-    <li>
-      {{template "unit_meta_details_check" .Details.IsTaggedVersion}}
-      Tagged version
-      {{template "unit_meta_details_toggletip" "Modules with tagged versions give importers more predictable builds."}}
-    </li>
-    <li>
-      {{template "unit_meta_details_check"  .Details.IsStableVersion}}
-      Stable version
-      {{template "unit_meta_details_toggletip" "When a project reaches major version v1 it is considered stable."}}
-    </li>
-  </ul>
-{{end}}
diff --git a/static/legacy/html/helpers/_unit_outline.tmpl b/static/legacy/html/helpers/_unit_outline.tmpl
deleted file mode 100644
index 9b1f1c2..0000000
--- a/static/legacy/html/helpers/_unit_outline.tmpl
+++ /dev/null
@@ -1,98 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_outline"}}
-  <div class="UnitOutline">
-    <div class="UnitOutline-jumpTo">
-      <button class="UnitOutline-jumpToInput js-jumpToInput"
-          aria-label="Open Jump to Identifier"
-          data-test-id="jump-to-button" data-gtmc="outline button">
-        Jump to ...
-      </button>
-    </div>
-    <ul class="js-tree" role="tree" aria-label="Outline">
-      {{if .Readme.String}}
-        <li role="none" class="js-readmeOutline">
-          <a href="#section-readme" role="treeitem" aria-expanded="false" aria-selected="false"
-              aria-level="1" aria-owns="readme-outline" tabindex="0" data-gtmc="outline link">
-            README
-          </a>
-          {{template "readme_outline" .ReadmeOutline}}
-        </li>
-      {{end}}
-      {{if .IsPackage}}
-        <li role="none">
-          <a href="#section-documentation" role="treeitem" aria-expanded="false" aria-level="1"
-              aria-selected="false"aria-owns="doc-outline" tabindex="-1" data-gtmc="outline link">
-            Documentation
-          </a>
-          {{.DocOutline}}
-        </li>
-      {{end}}
-      {{if .SourceFiles}}
-        <li role="none">
-          <a href="#section-sourcefiles" role="treeitem" aria-expanded="false"
-              aria-selected="false" aria-level="1" tabindex="-1" data-gtmc="outline link">
-            Source Files
-          </a>
-        </li>
-      {{end}}
-      {{if .Directories}}
-        <li role="none">
-          <a href="#section-directories" role="treeitem" aria-expanded="false"
-              aria-selected="false" aria-level="1" tabindex="-1"
-              data-gtmc="outline link">
-            Directories
-          </a>
-        </li>
-      {{end}}
-    </ul>
-  </div>
-{{end}}
-
-{{define "readme_outline"}}
-  <ul role="group" id="readme-outline">
-    {{range .}}
-      <li role="none">
-        <a href="#{{.ID}}" role="treeitem" aria-level="2" aria-owns="nav-group-readme"
-            tabindex="-1" {{if gt (len .Children) 0}}aria-expanded="false"{{end}}
-            data-gtmc="readme outline link">
-          {{.Text}}
-        </a>
-        <ul role="group" id="nav-group-readme">
-          {{range .Children}}
-            {{$tname := .Text}}
-            <li role="none">
-              {{if .Children}}
-                {{$navgroupid := (printf "nav.group.%s" $tname)}}
-                <a href="#{{.ID}}" role="treeitem" aria-expanded="false" aria-level="3"
-                    tabindex="-1" data-aria-owns="{{$navgroupid}}"
-                    data-gtmc="readme outline link">
-                  {{$tname}}
-                </a>
-                <ul role="group" >
-                  {{range .Children}}
-                    <li role="none">
-                      <a href="#{{.ID}}" role="treeitem" aria-level="4" tabindex="-1"
-                          data-gtmc="readme outline link">
-                        {{.Text}}
-                      </a>
-                    </li>
-                  {{end}} {{/* range .Children */}}
-                </ul>
-              {{else}}
-                <a href="#{{.ID}}" role="treeitem" aria-level="3" tabindex="-1"
-                    data-gtmc="readme outline link">
-                  {{$tname}}
-                </a>
-              {{end}} {{/* if .Children */}}
-            </li>
-          {{end}} {{/* range .Children */}}
-        </ul>
-      </li>
-    {{end}}
-  </ul>
-{{end}}
\ No newline at end of file
diff --git a/static/legacy/html/helpers/_unit_outline_mobile.tmpl b/static/legacy/html/helpers/_unit_outline_mobile.tmpl
deleted file mode 100644
index 52e526f..0000000
--- a/static/legacy/html/helpers/_unit_outline_mobile.tmpl
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  Copyright 2021 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_outline_mobile"}}
-  <nav class="DocNavMobile js-mobileNav">
-    <label for="DocNavMobile-select" class="DocNavMobile-label">
-      <svg class="DocNavMobile-selectIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="black" width="18px" height="18px">
-        <path d="M0 0h24v24H0z" fill="none"/><path d="M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10v2h2V7h-2zm0 6h2v-2h-2v2z"/>
-      </svg>
-      <span class="DocNavMobile-selectText js-mobileNavSelectText">Outline</span>
-    </label>
-    <select id="DocNavMobile-select" class="DocNavMobile-select">
-      <option value="">Outline</option>
-      <optgroup label="README">
-        {{range .ReadmeOutline}}<option value="{{.ID}}">{{.Text}}</option>{{end}}
-      </optgroup>
-      {{.MobileOutline}}
-      <option class="js-sourcefilesOption" value="section-sourcefiles">Source Files</option>
-      <option class="js-directoriesOption" value="section-directories">Directories</option>
-    </select>
-  </nav>
-{{end}}
diff --git a/static/legacy/html/helpers/_unit_readme.tmpl b/static/legacy/html/helpers/_unit_readme.tmpl
deleted file mode 100644
index 3ae2e4a..0000000
--- a/static/legacy/html/helpers/_unit_readme.tmpl
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_readme"}}
-  <div class="UnitReadme {{if .ExpandReadme}}UnitReadme--expanded{{end}} js-readme">
-    <h2 class="UnitReadme-title" id="section-readme">
-      <img height="25px" width="20px" src="/static/legacy/img/pkg-icon-readme_20x16.svg" alt="">README
-      <a class="UnitReadme-idLink" href="#section-readme">¶</a>
-    </h2>
-    {{if .Readme.String }}
-      <div class="UnitReadme-content" data-test-id="Unit-readmeContent">
-        <div class="Overview-readmeContent js-readmeContent">{{.Readme}}</div>
-        <div class="UnitReadme-fadeOut"></div>
-      </div>
-      <button class="UnitReadme-expandLink js-readmeExpand"
-          data-test-id="readme-expand" data-gtmc="readme button"
-          aria-label="Expand Readme">Expand â–¾</button>
-      <button class="UnitReadme-collapseLink js-readmeCollapse"
-          data-test-id="readme-collapse" data-gtmc="readme button"
-          aria-label="Expand Readme">Collapse â–´</button>
-    {{end}}
-  </div>
-{{end}}
diff --git a/static/legacy/html/helpers/_versions.tmpl b/static/legacy/html/helpers/_versions.tmpl
deleted file mode 100644
index bfcf41b..0000000
--- a/static/legacy/html/helpers/_versions.tmpl
+++ /dev/null
@@ -1,108 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{/* . is internal/frontend.VersionsDetails */}}
-
-{{define "versions"}}
-  <div class="Versions">
-    <div class="Versions-title">
-      <h2>Versions in this module</h2>
-      <div class="Versions-titleButtonGroup js-buttonGroup">
-        <button class="js-versionsExpand" data-gtmc="versions button"
-            aria-label="Expand All Versions">
-          Expand all
-        </button>
-        <button class="js-versionsCollapse" data-gtmc="versions button"
-            aria-label="Collapse All Versions">
-          Collapse all
-        </button>
-      </div>
-    </div>
-    {{template "version_list" .ThisModule}}
-    {{if .IncompatibleModules}}
-      <h2>Incompatible versions in this module</h2>
-      {{template "version_list" .IncompatibleModules}}
-    {{end}}
-    {{if .OtherModules}}
-      <h2>Other modules containing this package</h2>
-      {{range .OtherModules}}
-        <div><a href="/{{.}}">{{.}}</a></div>
-      {{end}}
-    {{end}}
-  </div>
-{{end}}
-
-{{/* . is []*internal/frontend.VersionList */}}
-
-{{define "version_list"}}
-  <div class="Versions-list">
-    {{range $major := .}}
-      {{range $i, $v := $major.Versions}}
-        <div class="Version-major">
-          {{if and (eq $i 0) (not $major.Incompatible)}}
-            <strong>{{$major.Major}}</strong>
-            {{if $major.Deprecated}}<span class="Version-badge">deprecated</span>{{end}}
-          {{end}}
-        </div>
-        <div class="Version-tag">
-          <a class="js-versionLink" href="{{$v.Link}}">{{$v.Version}}</a>
-        </div>
-        <div class="Version-dot{{if and $v.IsMinor (not $major.Incompatible)}} Version-dot--minor{{end}}"></div>
-        {{if and $v.Symbols (not $major.Incompatible)}}
-          {{template "symbol_history" $v}}
-        {{else}}
-          <div class="Version-commitTime">
-            {{$v.CommitTime}}{{if $v.Retracted}}<span class="Version-badge">retracted</span>{{end}}
-          </div>
-        {{end}}
-      {{end}}
-    {{end}}
-  </div>
-{{end}}
-
-{{define "symbol_history"}}
-  <details class="Version-details js-versionDetails">
-    <summary class="Version-summary">
-      {{.CommitTime}}{{if .Retracted}}<span class="Version-badge">retracted</span>{{end}}
-    </summary>
-    <div class="Versions-symbols">
-      <div class="Versions-symbolsHeader">Changes in this version</div>
-      {{range .Symbols}}
-        <div class="Versions-symbolSection">
-          {{range .}}
-            {{if eq .Kind "Type"}}
-              <div class="Versions-symbolType">
-                {{template "symbol" .}}
-                {{range .Children}}
-                  <div class="Versions-symbolChild">{{template "symbol" .}}</div>
-                {{end}}
-              </div>
-            {{else}}
-              <div>{{template "symbol" .}}</div>
-            {{end}}
-          {{end}}
-        </div>
-      {{end}}
-    </div>
-  </details>
-{{end}}
-
-{{define "symbol"}}
-  <div>
-    {{if .New}}
-      <span class="Versions-symbolBulletNew">+</span>
-      <a class="Versions-symbolSynopsis" href="{{.Link}}">{{.Synopsis}}</a>
-    {{else}}
-      <span class="Versions-symbolOld Versions-symbolSynopsis">{{.Synopsis}}</span>
-    {{end}}
-    {{if .Builds}}
-      <span class="Versions-symbolBuildsDash">—</span>
-      <span class="Versions-symbolBuilds">
-        {{range $i, $b := .Builds}}{{if $i}}, {{end}}{{$b}}{{end}}
-      </span>
-    {{end}}
-  </div>
-{{end}}
diff --git a/static/legacy/html/pages/not_implemented.tmpl b/static/legacy/html/pages/not_implemented.tmpl
deleted file mode 100644
index 7da029c..0000000
--- a/static/legacy/html/pages/not_implemented.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<!--
-  Copyright 2019 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "details_content"}}
-  {{template "empty_content" "Page has not been implemented yet!"}}
-{{end}}
diff --git a/static/legacy/html/pages/unit.tmpl b/static/legacy/html/pages/unit.tmpl
deleted file mode 100644
index d7fe0f9..0000000
--- a/static/legacy/html/pages/unit.tmpl
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "title"}}<title>{{.Title}} · pkg.go.dev</title>{{end}}
-
-{{define "description"}}{{.MetaDescription}}{{end}}
-
-{{define "pre-content"}}
-  <link href="/static/legacy/css/stylesheet.css?version={{.AppVersionLabel}}" rel="stylesheet">
-  <link href="/static/legacy/css/unit.css?version={{.AppVersionLabel}}" rel="stylesheet">
-  {{block "unit_pre_content" .}}{{end}}
-  <link href="/static/legacy/css/unit_outline.css?version={{.AppVersionLabel}}" rel="stylesheet">
-{{end}}
-
-{{define "main"}}
-  <main class="Container">
-    {{block "unit_header" .}}{{end}}
-    {{block "unit_content" .}}{{end}}
-  </main>
-
-  <dialog class="JumpDialog Dialog">
-    <h2 class="Dialog-title">Jump to</h2>
-    <form method="dialog" data-gmtc="jump to form" aria-label="Jump to Identifier">
-      <div class="JumpDialog-filter">
-        <input class="JumpDialog-input" autocomplete="off" type="text">
-      </div>
-      <div class="JumpDialog-body">
-        <div class="JumpDialog-list"></div>
-      </div>
-      <div class="Dialog-actions">
-        <button class="Dialog-button" data-test-id="close-dialog">Close</button>
-      </div>
-    </form>
-  </dialog>
-
-  <dialog class="ShortcutsDialog Dialog">
-    <h2 class="Dialog-title">Keyboard shortcuts</h2>
-    <table>
-      <tbody>
-        <tr><td class="ShortcutsDialog-key"><b>?</b></td><td> : This menu</td></tr>
-        <tr><td class="ShortcutsDialog-key"><b>/</b></td><td> : Search site</td></tr>
-        <tr><td class="ShortcutsDialog-key"><b>f</b> or <b>F</b></td><td> : Jump to</td></tr>
-      </tbody>
-    </table>
-    <form method="dialog">
-      <div class="Dialog-actions">
-        <button class="Dialog-button">Close</button>
-      </div>
-    </form>
-  </dialog>
-{{end}}
-
-{{define "post-content"}}
-  <div class="js-canonicalURLPath" data-canonical-url-path="{{.CanonicalURLPath}}" hidden />
-  <script>
-    loadScript('/static/legacy/js/keyboard.js', {type: 'module', async: true, defer: true})
-    loadScript('/static/legacy/js/unit.js', {type: 'module', async: true, defer: true})
-  </script>
-  {{block "unit_post_content" .}}{{end}}
-{{end}}
diff --git a/static/legacy/html/pages/unit_details.tmpl b/static/legacy/html/pages/unit_details.tmpl
deleted file mode 100644
index 9c755db..0000000
--- a/static/legacy/html/pages/unit_details.tmpl
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_pre_content"}}
-  <link href="/static/legacy/css/unit_details.css?version={{.AppVersionLabel}}" rel="stylesheet">
-{{end}}
-
-{{define "unit_content"}}
-  <div class="UnitDetails" data-test-id="UnitDetails">
-    {{block "unit_outline_mobile" .Details}}{{end}}
-    <div class="UnitDetails-outline" role="navigation"
-        aria-label="{{if eq .PageType "std"}}module
-        {{else}}{{.PageType}}{{end}}details navigation">
-      {{block "unit_outline" .Details}}{{end}}
-    </div>
-    <div class="UnitDetails-content js-unitDetailsContent" role="main" data-test-id="UnitDetails-content">
-      {{if .Details.Readme.String}}
-        {{block "unit_readme" .Details}}{{end}}
-      {{end}}
-
-      {{if .Details.IsPackage}}
-        {{if .Unit.IsRedistributable}}
-          {{block "unit_doc" .Details}}{{end}}
-        {{else}}
-          <div class="UnitDetails-contentEmpty">
-            <img src="/static/legacy/img/gopher-airplane.svg" alt="The Go Gopher"/>
-            <p>Documentation not displayed due to license restrictions.</p>
-            <p>See our <a href="/license-policy">license policy</a>.</p>
-          </div>
-        {{end}}
-      {{end}}
-
-      {{if .Details.SourceFiles}}
-        {{block "unit_files" .Details}}{{end}}
-      {{end}}
-      {{if .Details.Directories}}
-        {{block "unit_directories" .Details}}{{end}}
-      {{end}}
-    </div>
-    <div class="UnitDetails-meta" role="complementary" aria-label="links">
-      {{block "unit_meta" .}}{{end}}
-    </div>
-  </div>
-{{end}}
-
-{{define "unit_post_content"}}
-  <script>
-    loadScript("/static/legacy/js/jump.js", {type: 'module', async: true, defer: true});
-  </script>
-  <script>
-    loadScript("/static/legacy/js/playground.js", {type: 'module', async: true, defer: true});
-  </script>
-  <script>
-    loadScript('/static/legacy/js/sidenav.js', {type: 'module', async: true, defer: true})
-  </script>
-{{end}}
diff --git a/static/legacy/html/pages/unit_importedby.tmpl b/static/legacy/html/pages/unit_importedby.tmpl
deleted file mode 100644
index 4360556..0000000
--- a/static/legacy/html/pages/unit_importedby.tmpl
+++ /dev/null
@@ -1,15 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_pre_content"}}
-  <link href="/static/legacy/css/importedby.css?version={{.AppVersionLabel}}" rel="stylesheet">
-{{end}}
-
-{{define "unit_content"}}
-  <div class="Unit-content" role="main">
-    {{block "importedby" .Details}}{{end}}
-  </div>
-{{end}}
diff --git a/static/legacy/html/pages/unit_imports.tmpl b/static/legacy/html/pages/unit_imports.tmpl
deleted file mode 100644
index f006708..0000000
--- a/static/legacy/html/pages/unit_imports.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-
-{{define "unit_pre_content"}}
-  <link href="/static/legacy/css/imports.css?version={{.AppVersionLabel}}" rel="stylesheet">
-{{end}}
-
-{{define "unit_content"}}
-  <div class="Unit-content" role="main">
-    {{block "imports" .Details}}{{end}}
-  </div>
-{{end}}
diff --git a/static/legacy/html/pages/unit_licenses.tmpl b/static/legacy/html/pages/unit_licenses.tmpl
deleted file mode 100644
index 54d4155..0000000
--- a/static/legacy/html/pages/unit_licenses.tmpl
+++ /dev/null
@@ -1,15 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_pre_content"}}
-  <link href="/static/legacy/css/licenses.css?version={{.AppVersionLabel}}" rel="stylesheet">
-{{end}}
-
-{{define "unit_content"}}
-  <div class="Unit-content" role="main">
-    {{block "licenses" .Details}}{{end}}
-  </div>
-{{end}}
diff --git a/static/legacy/html/pages/unit_versions.tmpl b/static/legacy/html/pages/unit_versions.tmpl
deleted file mode 100644
index af83438..0000000
--- a/static/legacy/html/pages/unit_versions.tmpl
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  Copyright 2020 The Go Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style
-  license that can be found in the LICENSE file.
--->
-
-{{define "unit_pre_content"}}
-  <link href="/static/legacy/css/versions.css?version={{.AppVersionLabel}}" rel="stylesheet">
-{{end}}
-
-{{define "unit_content"}}
-  <div class="Unit-content" role="main" data-test-id="UnitVersions">
-    {{block "versions" .Details}}{{end}}
-  </div>
-{{end}}
-
-{{define "unit_post_content"}}
-  <script>
-    loadScript("/static/legacy/js/versions.js", {type: 'module', async: true, defer: true})
-  </script>
-{{end}}
diff --git a/static/legacy/img/close-24px.svg b/static/legacy/img/close-24px.svg
deleted file mode 100644
index dea8678..0000000
--- a/static/legacy/img/close-24px.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/copy-click.svg b/static/legacy/img/copy-click.svg
deleted file mode 100644
index 10afe91..0000000
--- a/static/legacy/img/copy-click.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg fill="#00add8" width="13" height="15" xmlns="http://www.w3.org/2000/svg"><path d="M8 0H2a2 2 0 00-2 2v8a2 2 0 002 2V2h8a2 2 0 00-2-2zm3 3H5a2 2 0 00-2 2v8a2 2 0 002 2h6a2 2 0 002-2V5a2 2 0 00-2-2zM5 13h6V5H5v8z" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/favicon.ico b/static/legacy/img/favicon.ico
deleted file mode 100644
index 8d22584..0000000
--- a/static/legacy/img/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/static/legacy/img/go-logo-blue.svg b/static/legacy/img/go-logo-blue.svg
deleted file mode 100644
index da6ea83..0000000
--- a/static/legacy/img/go-logo-blue.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="78" viewBox="0 0 207 78" width="207" xmlns="http://www.w3.org/2000/svg"><g fill="#00acd7" fill-rule="evenodd"><path d="m16.2 24.1c-.4 0-.5-.2-.3-.5l2.1-2.7c.2-.3.7-.5 1.1-.5h35.7c.4 0 .5.3.3.6l-1.7 2.6c-.2.3-.7.6-1 .6z"/><path d="m1.1 33.3c-.4 0-.5-.2-.3-.5l2.1-2.7c.2-.3.7-.5 1.1-.5h45.6c.4 0 .6.3.5.6l-.8 2.4c-.1.4-.5.6-.9.6z"/><path d="m25.3 42.5c-.4 0-.5-.3-.3-.6l1.4-2.5c.2-.3.6-.6 1-.6h20c.4 0 .6.3.6.7l-.2 2.4c0 .4-.4.7-.7.7z"/><g transform="translate(55)"><path d="m74.1 22.3c-6.3 1.6-10.6 2.8-16.8 4.4-1.5.4-1.6.5-2.9-1-1.5-1.7-2.6-2.8-4.7-3.8-6.3-3.1-12.4-2.2-18.1 1.5-6.8 4.4-10.3 10.9-10.2 19 .1 8 5.6 14.6 13.5 15.7 6.8.9 12.5-1.5 17-6.6.9-1.1 1.7-2.3 2.7-3.7-3.6 0-8.1 0-19.3 0-2.1 0-2.6-1.3-1.9-3 1.3-3.1 3.7-8.3 5.1-10.9.3-.6 1-1.6 2.5-1.6h36.4c-.2 2.7-.2 5.4-.6 8.1-1.1 7.2-3.8 13.8-8.2 19.6-7.2 9.5-16.6 15.4-28.5 17-9.8 1.3-18.9-.6-26.9-6.6-7.4-5.6-11.6-13-12.7-22.2-1.3-10.9 1.9-20.7 8.5-29.3 7.1-9.3 16.5-15.2 28-17.3 9.4-1.7 18.4-.6 26.5 4.9 5.3 3.5 9.1 8.3 11.6 14.1.6.9.2 1.4-1 1.7z"/><path d="m107.2 77.6c-9.1-.2-17.4-2.8-24.4-8.8-5.9-5.1-9.6-11.6-10.8-19.3-1.8-11.3 1.3-21.3 8.1-30.2 7.3-9.6 16.1-14.6 28-16.7 10.2-1.8 19.8-.8 28.5 5.1 7.9 5.4 12.8 12.7 14.1 22.3 1.7 13.5-2.2 24.5-11.5 33.9-6.6 6.7-14.7 10.9-24 12.8-2.7.5-5.4.6-8 .9zm23.8-40.4c-.1-1.3-.1-2.3-.3-3.3-1.8-9.9-10.9-15.5-20.4-13.3-9.3 2.1-15.3 8-17.5 17.4-1.8 7.8 2 15.7 9.2 18.9 5.5 2.4 11 2.1 16.3-.6 7.9-4.1 12.2-10.5 12.7-19.1z" fill-rule="nonzero"/></g></g></svg>
\ No newline at end of file
diff --git a/static/legacy/img/go-logo-white.svg b/static/legacy/img/go-logo-white.svg
deleted file mode 100644
index 727a62e..0000000
--- a/static/legacy/img/go-logo-white.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="78" viewBox="0 0 207 78" width="207" xmlns="http://www.w3.org/2000/svg"><g fill="#ffffff" fill-rule="evenodd"><path d="m16.2 24.1c-.4 0-.5-.2-.3-.5l2.1-2.7c.2-.3.7-.5 1.1-.5h35.7c.4 0 .5.3.3.6l-1.7 2.6c-.2.3-.7.6-1 .6z"/><path d="m1.1 33.3c-.4 0-.5-.2-.3-.5l2.1-2.7c.2-.3.7-.5 1.1-.5h45.6c.4 0 .6.3.5.6l-.8 2.4c-.1.4-.5.6-.9.6z"/><path d="m25.3 42.5c-.4 0-.5-.3-.3-.6l1.4-2.5c.2-.3.6-.6 1-.6h20c.4 0 .6.3.6.7l-.2 2.4c0 .4-.4.7-.7.7z"/><g transform="translate(55)"><path d="m74.1 22.3c-6.3 1.6-10.6 2.8-16.8 4.4-1.5.4-1.6.5-2.9-1-1.5-1.7-2.6-2.8-4.7-3.8-6.3-3.1-12.4-2.2-18.1 1.5-6.8 4.4-10.3 10.9-10.2 19 .1 8 5.6 14.6 13.5 15.7 6.8.9 12.5-1.5 17-6.6.9-1.1 1.7-2.3 2.7-3.7-3.6 0-8.1 0-19.3 0-2.1 0-2.6-1.3-1.9-3 1.3-3.1 3.7-8.3 5.1-10.9.3-.6 1-1.6 2.5-1.6h36.4c-.2 2.7-.2 5.4-.6 8.1-1.1 7.2-3.8 13.8-8.2 19.6-7.2 9.5-16.6 15.4-28.5 17-9.8 1.3-18.9-.6-26.9-6.6-7.4-5.6-11.6-13-12.7-22.2-1.3-10.9 1.9-20.7 8.5-29.3 7.1-9.3 16.5-15.2 28-17.3 9.4-1.7 18.4-.6 26.5 4.9 5.3 3.5 9.1 8.3 11.6 14.1.6.9.2 1.4-1 1.7z"/><path d="m107.2 77.6c-9.1-.2-17.4-2.8-24.4-8.8-5.9-5.1-9.6-11.6-10.8-19.3-1.8-11.3 1.3-21.3 8.1-30.2 7.3-9.6 16.1-14.6 28-16.7 10.2-1.8 19.8-.8 28.5 5.1 7.9 5.4 12.8 12.7 14.1 22.3 1.7 13.5-2.2 24.5-11.5 33.9-6.6 6.7-14.7 10.9-24 12.8-2.7.5-5.4.6-8 .9zm23.8-40.4c-.1-1.3-.1-2.3-.3-3.3-1.8-9.9-10.9-15.5-20.4-13.3-9.3 2.1-15.3 8-17.5 17.4-1.8 7.8 2 15.7 9.2 18.9 5.5 2.4 11 2.1 16.3-.6 7.9-4.1 12.2-10.5 12.7-19.1z" fill-rule="nonzero"/></g></g></svg>
\ No newline at end of file
diff --git a/static/legacy/img/google-white.png b/static/legacy/img/google-white.png
deleted file mode 100644
index bf03674..0000000
--- a/static/legacy/img/google-white.png
+++ /dev/null
Binary files differ
diff --git a/static/legacy/img/google-white.svg b/static/legacy/img/google-white.svg
deleted file mode 100644
index d017d2a..0000000
--- a/static/legacy/img/google-white.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="74" height="24" xmlns="http://www.w3.org/2000/svg"><g fill="#fff" fill-rule="evenodd"><path d="M.128 9.276c0-5.105 4.32-9.261 9.457-9.261 2.842 0 4.865 1.107 6.388 2.552l-1.796 1.785c-1.091-1.017-2.569-1.807-4.592-1.807-3.75 0-6.683 3.004-6.683 6.731s2.932 6.732 6.683 6.732c2.432 0 3.82-.971 4.706-1.853.727-.722 1.204-1.761 1.386-3.184H9.585V8.44h8.57c.091.451.137.993.137 1.58 0 1.898-.523 4.248-2.206 5.92-1.636 1.693-3.728 2.597-6.5 2.597-5.139 0-9.458-4.156-9.458-9.262M25.218 16.189c-1.819 0-3.387-1.491-3.387-3.615 0-2.146 1.568-3.614 3.387-3.614 1.818 0 3.387 1.468 3.387 3.614 0 2.124-1.569 3.615-3.387 3.615m0-9.578c-3.32 0-6.024 2.507-6.024 5.963 0 3.434 2.705 5.964 6.024 5.964 3.318 0 6.024-2.53 6.024-5.964 0-3.456-2.706-5.963-6.024-5.963M38.36 16.189c-1.82 0-3.388-1.491-3.388-3.615 0-2.146 1.569-3.614 3.387-3.614 1.819 0 3.387 1.468 3.387 3.614 0 2.124-1.568 3.615-3.387 3.615m0-9.578c-3.319 0-6.024 2.507-6.024 5.963 0 3.434 2.705 5.964 6.024 5.964s6.024-2.53 6.024-5.964c0-3.456-2.705-5.963-6.024-5.963M51.466 16.189c-1.818 0-3.341-1.514-3.341-3.592 0-2.1 1.523-3.637 3.341-3.637 1.796 0 3.206 1.536 3.206 3.637 0 2.078-1.41 3.592-3.206 3.592zm3.024-9.217v.972h-.091c-.591-.7-1.728-1.333-3.16-1.333-3 0-5.751 2.62-5.751 5.986 0 3.343 2.75 5.941 5.75 5.941 1.433 0 2.57-.633 3.16-1.356h.092v.859c0 2.281-1.228 3.501-3.206 3.501-1.614 0-2.614-1.152-3.023-2.123l-2.296.949c.66 1.581 2.41 3.524 5.32 3.524 3.091 0 5.705-1.808 5.705-6.212V6.972h-2.5zM61.446 18.176h-2.637V.647h2.637zM68.47 8.915c1.046 0 1.932.52 2.228 1.265l-5.365 2.214c-.068-2.305 1.796-3.48 3.137-3.48m.205 7.275c-1.342 0-2.296-.61-2.91-1.807l8.025-3.298-.273-.678c-.5-1.333-2.024-3.795-5.138-3.795-3.092 0-5.66 2.417-5.66 5.963 0 3.344 2.546 5.964 5.956 5.964 2.75 0 4.342-1.672 5-2.643L71.63 14.54c-.682.994-1.614 1.649-2.955 1.649"/></g></svg>
\ No newline at end of file
diff --git a/static/legacy/img/google.svg b/static/legacy/img/google.svg
deleted file mode 100644
index 61081d8..0000000
--- a/static/legacy/img/google.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="36" viewBox="0 0 112 36" width="112" xmlns="http://www.w3.org/2000/svg"><path d="m14.75 26.5c-7.23 0-13.31-5.89-13.31-13.12s6.07-13.12 13.31-13.12c4 0 6.85 1.57 8.99 3.62l-2.53 2.53c-1.54-1.44-3.62-2.56-6.46-2.56-5.28 0-9.41 4.26-9.41 9.54s4.13 9.54 9.41 9.54c3.42 0 5.38-1.38 6.62-2.62 1.02-1.02 1.7-2.5 1.95-4.51h-8.32v-3.6h11.81c.13.64.19 1.41.19 2.24 0 2.69-.74 6.02-3.1 8.38-2.31 2.4-5.25 3.68-9.15 3.68z" fill="#4285f4"/><path d="m45.95 18.06c0 4.86-3.8 8.45-8.45 8.45-4.66 0-8.45-3.58-8.45-8.45 0-4.9 3.79-8.45 8.45-8.45 4.65.01 8.45 3.56 8.45 8.45zm-3.7 0c0-3.04-2.2-5.12-4.75-5.12s-4.75 2.08-4.75 5.12c0 3.01 2.2 5.12 4.75 5.12s4.75-2.11 4.75-5.12z" fill="#ea4335"/><path d="m64.95 18.05c0 4.86-3.79 8.45-8.45 8.45s-8.45-3.58-8.45-8.45c0-4.9 3.79-8.45 8.45-8.45s8.45 3.56 8.45 8.45zm-3.7 0c0-3.04-2.2-5.12-4.75-5.12s-4.75 2.08-4.75 5.12c0 3.01 2.2 5.12 4.75 5.12s4.75-2.11 4.75-5.12z" fill="#fbbc05"/><path d="m83 10.12v15.17c0 6.24-3.68 8.8-8.03 8.8-4.1 0-6.56-2.75-7.49-4.99l3.23-1.34c.58 1.38 1.98 3.01 4.26 3.01 2.78 0 4.51-1.73 4.51-4.96v-1.22h-.13c-.83 1.02-2.43 1.92-4.45 1.92-4.22 0-7.9-3.68-7.9-8.42 0-4.77 3.68-8.48 7.9-8.48 2.02 0 3.62.9 4.45 1.89h.13v-1.38zm-3.26 7.97c0-2.98-1.98-5.15-4.51-5.15-2.56 0-4.51 2.18-4.51 5.15 0 2.94 1.95 5.09 4.51 5.09 2.52-.01 4.51-2.15 4.51-5.09z" fill="#4285f4"/><path d="m89.71 1.17v24.83h-3.71v-24.83z" fill="#34a853"/><path d="m104.54 20.84 2.88 1.92c-.93 1.38-3.17 3.74-7.04 3.74-4.8 0-8.38-3.71-8.38-8.45 0-5.02 3.62-8.45 7.97-8.45 4.38 0 6.53 3.49 7.23 5.38l.38.96-11.3 4.67c.86 1.7 2.21 2.56 4.1 2.56s3.2-.93 4.16-2.33zm-8.86-3.04 7.55-3.14c-.42-1.06-1.66-1.79-3.14-1.79-1.88 0-4.51 1.66-4.41 4.93z" fill="#ea4335"/><path d="m0 0h112v36h-112z" fill="none"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/gopher-airplane.svg b/static/legacy/img/gopher-airplane.svg
deleted file mode 100644
index 275283a..0000000
--- a/static/legacy/img/gopher-airplane.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg viewBox="0 0 1200 945" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2"><path d="M811 927c-4-1-11-3-14-4-7-3-23-12-35-20-10-6-12-8-12-9-1-1-3-2-4-2-2-1-5-3-7-5-13.823-6.912-28.998-19.998-40-31-8-5-15-11-22-17-3-2-11-8-18-14-23.578-17.427-46.246-36.246-67-57-4-3-10-7-12-10-14.3-9.533-13.184-10.638-27-21-8.686-8.686-9.993-8.669-24-4-10.285 2.236-20.648 4.1-31 6-2.387.438-4.353-.32-6.125 2-2.625 3.436-4.696 7.265-6.875 11-4 8-4 9-3 13 0 2 3 6 6 9 5.328 6.659 20 21.344 20 32 3.552 5.92 4.288 16.413 4 23-.478 10.941-1.368 23.278-9 32-10 12-22 21-32 22-3 0-8 1-10 2-12 2-13 2-15 0l-3-3h-1c-2 1-11-1-13-3-2-1-5-3-8-5-14.272-8.92-23.364-26.642-25-43 0-6 0-13 1-16v-8l-1-2 2-2c1-1 3-4 4-6 0-3 3-7 5-11 4-6 4-6 3-12 0-7-3-12-11-19-6.34-6.34-15.705-6.478-24-7-4.477-.282-10.363-.637-14 3-2 1-5 3-5 4-1 2-12 10-19 13-7.726 5.795-17.398-.196-25.625 3.75C302.22 776.141 298.508 789 287 789h-1v-1s2-3 5-6c9-11 11-15 7-18-6.865-6.865-20.118 13-25 13h-1v-1c0-1 3-4 7-8 10-9 11-12 6-19-2-2-4-7-4-9-1-3-3-7-4-8-9.798-6.532-21.839-8.075-32.625-12.125-7.128-2.676-7.424-4.57-13.546-8.795-1.195-.826-2.377-2.08-3.829-2.08h-1v2s3 5 6 9c9 9 15 18 15 20 0 0 1 1 1 2 5 5 16 24 20 34 3 6 6 14 8 17 3 7 3 13 0 17-1 2-2 4-2 5-8.517 12.296-20.837 11.568-32 2-1.789-1.789-24-16.507-24-25l-4-6c-8-15-10-18-14-30-9.49-22.144-10.381-47.144-18-70-2-4-3-4-11-7-6-1-14-5-16-8-4.539-4.539-2.519-17.962 0-23 7.288-10.932-3.601-21.772-10-30-14-16-24-29-26-32-3-6-11-18-14-22-7-10-19-33-22-41-4-13-4-18-3-24 2.268-7.937 6.132-15.556 15.805-12.171 1.915.67 3.455 2.127 5.195 3.171 18.572 9.286 29.634 28.668 38.299 46.61 3.081 6.379 6.755 12.578 8.701 19.39 2 8 10 29 13 37 1.282 3.845 2.074 10.148 4 14 2 3 4 8 5 12 2 4 4 9 5 10l2 1 3-1c3-2 10-19 13-33 4-17 6-22 9-23 7.141-7.141 9.419-17.551 12.75-26.625 1.232-3.355 3.496-10.498 7.25-12.375 2-2 11-13 14-17 1-2 3-5 5-6 1 0 4-4 6-6 2-3 4-6 5-8 5-5 2-7-29-31-7.928-5.285-16.265-12.265-23-19-4.561-1.52-7.439-6.48-12-8-2-1-5-4-7-6-3-1-7-5-10-7-11.658-5.829-18.587-13.19-29-21-9-7-17-14-18-18-1-1-2-6-3-10 0-9.501 2.849-24 15-24 3-1 8-2 12-3 3.788-1.337 25.045-3.047 20.54-13.352-1.06-2.425-2.622-4.598-3.97-6.876-3.401-5.75-6.68-11.577-10.277-17.207-3.597-5.632-7.061-11.393-11.293-16.565-6-6-16-19-27-32-7.063-7.063-9.317-12.78-8-22 1-10 3-13 18-24 5-4 15-11 19-12l10-5c11-5 30-12 38-13 3-1 9-2 12-3 5.211 0 28.294-1.823 33-3 17-3 37-2 51 2 13 5 35 17 56 33 3 3 8 6 12 8 3 2 9 6 13 9 10 8 28 21 33 24 2 1 8 6 13 10 5 3 15 10 22 15 6 4 15 10 18 13 4 2 9 6 12 7l4 2 2-1c0-12.429 9.324-25.408 18-33 11-7 15-9 30-7l6 1v-1c0-2 23-19 26-19l8-4c7-3 8-4 11-10 1.82-2.73 3.833-5.426 6.381-7.493 5.981-4.85 11.76 4.774 13.619 8.493 3 4 3 4 14 7 11 2 31 8 40 12 2 1 6 3 9 5 7 6 18 13 23 15 2 1 5 2 7 2 1-1 5-1 9-2 4 0 6 0 9 2 8.637 4.318 18.088 12.401 11.587 22.907-2.324 3.756-5.263 7.184-8.587 10.093-4 5-4 5-4 18 1 14 1 14-2 21-6.854 13.708-3.462 16.385-8 30-2 10 0 12 11 6 9-4 19-14 26-25 6-8 10-12 18-17 5-3 7-5 9-10 7-12 10-14 23-18 9-2 17 0 44 10 11 4 17 8 25 13 2.588 1.849 7.653 5.36 11.068 5.566 11.949.721 18.209-9.981 23.932-18.566 6-11 9-14 19-21 4-3 7-9 12-9 0 0 3-1 5-2 1.083-1.083 16.356-10 19-10 10-6 33-12 40-11 14.29 2.382 29.991 10.991 40 21 3.584 0 11.414 10.349 13 12 2 0 6 4 8 9 1 3 3 7 4 8 8 9 12 45 8 64-1 5-2 12-3 17 0 5-2 12-3 17-1.412 3.529-1.74 7.414-3 11-3.065 8.725-5.138 11.221-10 19-3 3-3 4-2 6 0 1 5 6 11 12 22 21 43 44 48 52 1 2 4 6 6 10 8 10 9 21 3 29-2 3-4 4-10 6-6.326 1.054-14.524 6.397-21 7-5.285.492-22.08-2.032-27-4-13.874-6.937-14.373-5.567-28-13-11-5-23-11-25-12-3-2-6-4-7-5l-4-2c-1 0-3-1-5-2-6.905-6.905-11.439-.468-18 5-14 12-19 15-32 22-6 3-13 7-16 9-2.25 2.25-24.376 17.782-26 19-4 4-7 6-11 7-2 1-6 2-8 3-5 3-4 6 5 13 4 4 11 10 15 15 5 4 12 10 16 14 13 10 30 24 37 29 3 3 12 10 18 17 13.647 12.282 25.416 29.168 16 48-3 7-11 16-20 23-12.134 9.1-11.775 9.632-17 24-2.713 9.947-8.778 26.177 1 34 3 2 10 7 15 10 12 8 17 14 22 22 3.58 7.16 5.824 21.764 1 29-2 5-11 13-18 16-45 20-80 33-93 35-4 1-13 1-20 2-8 0-16 1-18 1-2 1-7 0-10 0zM83 700c-1.581-1.581-2-4-3-6-.333-.667-.255-2-1-2-3-2-9-27-11-45-4-37-2-62 7-80 2-3 3-7 4-9l1-4h2l-1 3c0 2-2 6-3 10-8 18-9 34-7 64 1.463 26.342 3.722 29.533 10 55 .82 3.327 1.341 8.341 4 11 1 2 2 4 2 6v2h-1s-2-2-3-5zm-30-62c0-7.364-.959-14.71-2-22-2-24 1-44 9-60 6-14 10-20 13-20h1v3h-1s-2 3-4 7c-3 4-5 9-6 11-3 4-7 16-8 23-2 10-1 46 1 53 0 2 0 4-1 4l-1 2-1-1zm886-441c0-2.907 4.981-5.341 6.75-6.375 4.941-2.886 19.103-10.478 23.25-14.625 2-1 5-2 9-2 4-1 11-2 16-4 20-7 31-9 54-11 20-1 22-1 29 0 11.498 2.3 27.183 2.637 37 10l10 5c3 1 7 4 9 6 2 1 5 4 8 5 2 1 5 3 5 4l1 2v1h-1l-8-4c-4-3-8-5-8-5-1 0-2-1-3-1-2-3-19-12-26-13-4-1-9-3-11-3-6-2-34-2-42-1-4 1-12 2-16 2-11 1-27 5-47 12-8.989 2.996-16.266 2.633-25 7-6.726 2.883-13.825 5.825-19 11l-2 1v-1zm-41-26c0-1 8-8 15-12 3-3 10-8 16-13 14-10 21-15 30-17 4-2 11-4 15-5 3-2 9-4 12-5 2 0 11-3 18-6 15-5 25-8 36-8 3-1 11-2 16-3 7.546-2.322 14.874-3.669 22.774-3.953 3.027-.109 10.226-.031 10.226 4.953v1l-2-1c-5-2-18-1-32 4-5 1-12 2-15 3-5.082 0-16.806 2.403-22 5-2 0-9 2-16 5-6 3-13 5-13 5-1 0-2 1-3 2l-1 1h-2c-1-1-19 5-26 8-13.671 6.835-26.81 15.858-39 25-10 8-15 11-18 11h-2v-1z" fill="#0e0e0e" fill-rule="nonzero"/><path d="M809 922c-7-2-18-8-22-11-2-2-5-3-7-4-3-2-23-15-31-21-3.399-3.399-7.993-5.344-12-8-12.089-8.013-12.273-7.465-23-17-24-19-26-20-33-26-4-2-11-7-14-10-15-12-18-14-24-19-5.035-2.518-22.383-17.383-25-20-5-4-11-9-12-11-2-3-5-6-8-8-5-4-11-9-15-13-1-2-6-6-17-15-2.247-1.966-9.223-6.07-8.459-10.562.974-5.722 9.107-2.79 11.459-.438 10.018 5.009 18.254 13.003 27 20 36 31 51 43 58 49 10 10 37 32 46 39 4.472 2.236 8.007 5.99 12 9 17.674 13.324 35.822 26.043 53 40 8 7 22 16 27 18 2 1 9 3 15 4 17 3 36 2 58-4 15-4 19-5 39-12 11-4 24-8 29-10 5-1 14-4 19-7 5-2 9-4 10-4h2l1 2c1 5-5 9-22 17-6 2-13 5-17 7-3 2-6 3-7 3 0 0-2 1-5 2-9 4-46 16-59 19-22.814 3.802-22.741 2-46 2zm9-17c-8 0-18-3-23-6-6-2-17-10-22-14-2-2-8-6-12-9-5-4-11-9-14-12-3-2-11-8-17-13-6.853-3.916-9.264-6.697-15-12-1.424-1.317-3.697-4-6-4-1-1-4-3-7-6-4.192-6.288-25.784-22.088-31-26-7-6-13-10-38-30-14-11-33-27-36-30-1-2-6-6-11-10l-9-9c-1-3 0-5 3-6 7-1 17-5 23-8 3-1 10-4 15-6 4-2 12-4 16-6 9.537-6.358 15.28.21 23 6 10 8 24 19 28 22 5 4 26 21 30 25 11.368 12.992 26.465 21.279 41 30 10.726 7.15 19.164 10.582 30 16 .117.039 19.555 4.555 21 6 3 1 9 9 14 18 23 39 32 52 36 54 2 0 9-3 9-6 1-2-1-12-3-18-6.312-13.772-13.121-28.364-18-43-3.556-9.779 2.403-14.282 11-17 10.382-3.282 17.8-6.08 28-2 9 4 14 8 16 13v11c-1.188 7.72-1.43 15.567-1.625 23.375-.139 5.544-.173 11.137.625 16.625 1.61 11.063 10.536 1.902 12.484-2.501 2.106-4.757 6.558-21.062 9.516-25.499 3-9 7-9 15-1 2 1 6 4 9 6 7 3 14 9 16 14 6.151 12.303-7.63 25.726-19 28-1 0-3 1-4 2-3 2-14 7-37 14-4 1-9 3-12 4-3 2-8 3-10 3-3 1-10 3-16 4-14 5-34 7-45 6zm-369-28c-5-1-11-2-13-3l-9-3c-5-3-15-13-19-20-5-8-6-15-6-28 1-10 1-11 4-18 3.844-9.61 8.804-17.483 18-23 9-6 29-12 35-10 3 0 21 9 27 13 7 5 16 18 18 26 3 10 2 15-3 30-3 11-5 15-8 18-8 10-22 17-31 18h-13zm19-33c3.169-1.584 10.061-5.373 10.375-10 .248-3.66-.07-7.344-.375-11 0-12 0-13-3-16-3-4-10-9-14-10-2 0-5 1-9 3-3.062 1.413-7.63 3.631-10.36 6.169-7.543 7.012-7.693 20.41-2.64 28.831.995 1.493 3.49 5.875 5 7 1.255.936 2.787 1.506 4.313 1.859 5.988 1.388 13.653 2.554 19.687.141zm386 22c-6-8-14-20-16-24 0-1-2-5-3-7-4.549-7.278-13.594-22.051-17-30-.487-1.136 1.386-3.329 2.25-3.625 2.172-.745 4.455-1.294 6.75-1.375 4.825-.169 5.674 1.123 8 5 3 2 6 8 7 12 2 4 6 12 8 17 11 22 13 30 11 33-1 3-4 2-7-1zm50-19c-1-3 0-13 4-34 1-5 2-16 2-23 1-17 2-20 5-22 3-3 10-4 11-2 3 2 2 6-3 23-2 9-5 21-6 26-1 9-7 29-8 32-1 1-2 2-3 2h-1l-1-2zm-652-29c-5-3-13-8-15-12-1-1-2-3-3-3 0 0-3-3-5-6-1.671-3.342-3.924-7.413-7-10 0-1-2-3-3-6-9-13-11-20-22-61-2-6-3-14-4-17 0-4-2-12-3-19-2-7-3-13-3-14l1-1 1 1c1 1 4 6 7 12 3 5 7 12 9 15 3 3 8 10 13 16 4 5 10 13 14 17 7 9 12 17 23 38 8.193 16.386 10.588 20.924 14 39 .536 2.842-1.08 6.08-3 8-3 4-9 5-14 3zm553-24c-3.113 0-15.814-2.271-18-3-17-8-26-13-37-21-6-5-14-10-16-11-3-2-10-8-16-13-14.872-14.872-23.396-21.166-40-34-3.956-3.058-7.528-6.764-12-9-20-14-29-21-42-32-4-3-10-8-14-10-4-3-12-9-17-15-11-10-30-25-39-30-24.216-15.135-42.575-38.345-67-53-8-6-14-10-30-23-2-1-8-6-14-11-7-5-13-10-15-12-3-1-8-6-12-9-5.576-3.834-11.079-7.787-16.375-12-4.125-3.282-7.756-8.565-12.625-11l-3-1v-1c0-1-4-4-9-8-5-3-10-7-11-9-2-1-6-5-10-8-9.372-12.496-23.203-21.042-36-30-4-2-11-8-16-12-16-14-33-27-45-35-12.158-7.599-22.176-18.588-35-25-11.165-8.374-21.278-18.065-32-27-14-10-29-23-32-27-1-2-6-6-10-9-12-11-27-27-31-34-3-6-4-12-1-13h1l1 2c1 2 2 4 4 4 1 1 8 8 15 16 14 14 20 20 38 34 11.482 7.655 21.518 17.345 33 25 3 3 12 9 18 14 7 5 17 12 22 16 16 10 21 14 44 33 12 10 24 20 27 22 4 3 8 7 11 9 8.541 8.541 18.568 15.455 28 23 16 15 27 23 57 44 3 3 9 7 14 11 4 3 11 8 15 11 4 2 12 9 18 14 7 5 16 12 21 15 4 4 13 11 20 16 4.802 4.162 9.361 8.638 14.5 12.375 2.061 1.498 7.597 1.722 9.5 3.625 0 1 2 2 4 3 2 2 9 7 15 12 7 5 16 13 21 16 5 4 11 9 13 12 2 2 8 6 12 9 20.137 15.49 40.082 31.23 60 47 14.659 11.606 28.162 23.921 44 34 5 4 12 10 16 13 3 4 7 7 7 7 1 0 19 14 26 20 12 12 33 27 39 30 17.404 4.351 41.14 7.43 58-1 9-6 83-31 95-33 3.302-1.101 6.707-1.875 10-3 1.383-.473 6.486-4.029 8-1h1l-1 3c-2 4-8 7-17 12-5 2-9 4-9 5-1 0-4 2-7 3-4 0-14 4-23 8-9 3-19 7-22 8-7.987 1.997-19.971 11-29 11-3 1-10 3-16 5-11 3-22 5-27 3zm89-7c-2-2-5-5-5-6l-1-1 1-2c2.743-2.743 7.514-4.325 11.224-4.948 1.825-.307 4.135.254 5.023 2.059 1.571 3.192.566 6.637-.247 9.889-2 6-4 6-11 2zm-474-15c-1-1-3-3-4-5-3-5-10-13-15-18-4-5-7-11-6-14 0-2.815 4.313-3.235 5.866-3.277 9.19-.249 24.979.585 34.134-.723 4-1 15-2 24-3 14-1 16-2 22-4 7-3 8-4 10-1 2 1 1 5-4 15-4 7-9 19-9 25-1 2-2 4-3 5l-1 1-5-2c-10.874-5.437-31.29-2.474-41 4-4 2-6 2-8 1zm383 0c-4-1-9-2-12-3-11-6-20-12-27-17-4-3-10-8-14-10-3-3-7-6-8-8-1-1-3-4-6-6-6-5-33-26-40-32-3-3-10-8-15-12-30-20-31-21-44-33-2-2-11-9-19-15-9-6-18-13-21-15-3-3-8-7-12-9-7.517-7.517-15.834-14.195-24-21-3.841-3.201-8.464-5.464-12-9-5-4-12-9-16-12-8-5-15-11-25-19-3-2-8-6-12-9-4-2-7-5-8-6 0-1-4-4-8-6-11.455-11.455-26.04-19.28-39-29-8-5-11-8-33-24-6-5-15-11-20-15-5-3-12-8-16-12-4-3-7-6-8-6 0 0-5-4-11-10-6-5-13-11-14-12-2-1-6-3-9-6-22.095-19.333-36.73-32.076-60-50-7.495-5.773-24.23-16.23-31-23-3-2-7-5-10-7-13-8-34-24-42-32-4-3-8-6-10-7-4.298-1.719-7.926-4.85-11.47-7.828C150.418 276.474 138.957 259.957 125 246c-4-5-5-11-2-17 3-5 12-12 27-19 13-7 20-9 35-13 6-2 14-4 18-5 5-2 8-2 58-5 8 0 12 0 16 1 16.051 8.025 17.362 4.47 33 13 27 15 39 23 43 27 1 2 5 5 9 8 4 2 8 6 11 8 4 4 7 7 39 28 12 8 26 17 29 20 4 2 13 9 21 14 14 10 18 13 22 23 3 6 3 7 3 13-2.72 8.161-5.194 29.548-6 36-1 15-1 16 1 22 2 4 4 9 6 11 3.792 6.635 13.631 15.932 20 20 3.394 2.168 7.546 2.928 11 5 12 7 12 7 25 10 17 3 35 5 51 4 8 0 15-1 16-1 0-3.029 3.821-2.51 5.621-2.355 12.112 1.048 23.936 1.587 35.379 6.355 7 3 14 7 15 8 2 1 6 4 10 8 4 3 10 7 12 9 3 1 5 4 6 4l6 6c3 1 11 7 18 13 16.659 13.883 33.898 28.932 52 41 5 4 15 12 22 18 7 5 15 12 18 14 16 12 27 21 32 25 3 3 9 8 14 11 8.515 8.515 18.485 15.485 27 24 7 5 26 22 41 35 6 5 15 13 20 16 7 6 14 14 16 19 3.775 3.775 1.333 18.532-3.056 20.952-8.799 4.852-25.24 10.125-34.944 13.048-2.514.757-6.927.927-9 3-2 1-6 3-9 4-3 0-6 2-7 2-6.613 2.48-14.123 3.082-20 7-4 1-9 3-12 4-2 0-9 3-14 5-7 3-12 5-29 9-4 1-9 1-20 0zm-471-24c3-2 8-3 14-1 8 3 6 7-7 15-6 3-9 4-13 5-2.49 0-5.732.558-8-1-1.306-.897-1.215-3.546-1-4.75.559-3.124 1.387-6.735 4.25-8.625 3.317-2.19 7.828-1.703 10.75-4.625zm-30 11c-4-4-4-6-1-11 3-4 6-4 9 0 .553.553 1.114 1.115 1.536 1.773 2.021 3.157 1.361 6.397-.911 9.227-1.086 1.353-2.699 3-4.625 3 0 0-2-2-4-3zm-13-12c-3-2-5-9-3-10 2-3 11-2 13 2 1 4-4 10-8 10 0 0-2-1-2-2zm69-6c-4 0-8-1-9 0-2 0-14-2-18-3-4-2-4-4-3-14v-14l1-7-2-1h-1v3c0 5-3 22-4 24-3.342 5.012-7.019 4.491-12 2-1-2-1-3 0-9 1-8 2-17 4-33v-9h-3v7c-2 13-3 26-4 33-2 10-3 11-13 8-9-3-15-5-15-7l-1-2 2-2c3-2 13-24 15-32 1-3 2-7 2-9 4.729-18.916 5.774-39.739.25-58.625-3.097-10.588-8.48-21.494-13.25-31.375-5.264-11.844-16.382-26.953-29-32-10.362-5.181-8.912-7.217-19.25-12.125-2.716-1.289-6.772.247-9.139-2.301-2.318-2.495 1.683-7.938 2.571-9.141 3.426-4.642 13.682-15.297 16.818-18.433 10-9 15-13 25-19 6-4 12-7 13-7 0 0 4-2 8-5 13.526-8.695 32.694-20.107 50-20 4.346.027 8.789 3.707 12 6 12 10 21 16 24 17 8.028 8.028 17.135 14.908 26 22 5 3 10 7 12 8 1 2 5 4 7 6 .96.32 20.921 14.947 21 15 4 3 11 8 27 22 3 2 8 6 10 8 3 2 11 10 18 16 7 7 16 15 21 17 6.248 4.686 11.752 10.314 18 15 11 10 12 11 7 15-7.861 4.866-17.855 8.122-22.359 17.016-3.2 6.317 2.378 10.984 8.359 10.984 7-1 25-6 32-10 6-3 7-3 12-3 5 1 17 7 20 11 3 3 17 13 18 13l8 6c4 4 9 8 11 10 2 3 4 5 4 6-1 2-10 7-21 10-4 2-10 4-13 5-18 7-22 8-28 10-4 0-12 2-17 3-13 4-25 7-34 9-4 1-9 3-11 4-2.246 1.021-4.538 2.134-6.984 2.453-9.347 1.219-7.296-9.013-10.016-14.453-3-3-4-3-14 1-1.693.423-16.243 2.622-19 4-3 0-9 2-15 2-7 1-16 1-20 2-11.119 0-24.001-.124-35 2-3.908.755-3.222 10.222-5 12-3 1-22 2-29 0zm-102-22c-10-3-17-6-20-10-9-7-27-25-27-26v-2h4c5 0 14-2 19-4 3-2 13-12 15-15 5.952-17.855 4.527-37.982-12-49-10-7-17-10-26-10-5-1-9-2-9-2-1-1-1-3 0-5 0-2 0-5 1-7 1-8 14-37 18-40 7.017-4.678 22.999.999 28 6 2 1 6 5 10 7 12.547 9.411 19.672 17.565 27 31 3 7 7 15 7 19 3 11 6 39 4 43-1 1-2 7-2 15-2 17-5 24-12 35-5 8-6 9-11 11-7 4-11 4-14 3zm-90-49c-7.444-3.722-11.362-16.532-3.781-22.141C169.441 642.516 178.206 641 187 641c3.028.303 7.332.697 10.125 2.125 5.271 2.694 6.218 9.368 5.875 14.625-.107 1.645-.68 5.93-2 7.25-2 3-5 2-12-4-3-3-7-6-8-6h-2v2c-.687 0-.861 1.57-.875 1.875-.13 2.79.031 5.596-.25 8.375-.097.957-.195 2.07-.875 2.75-1 3-6 3-11 0zm44 1c-4.283-8.566.973-19.036-5-27-3-6-8-11-10-12-7-1-8-8-3-14 4-6 10-9 17-9 7-1 12 1 22 7 9 6 12 10 13 20 1 7 1 8 0 15-3 10-4 12-9 15-6 4-10 5-17 6-5 0-7 0-8-1zm319-20l-2-1v-2c0-1.777 2.046-4.436 3.25-5.5 6.153-5.435 9.535-7.899 17-11.375 3.342-1.556 7.887-2.975 11.578-1.438 3.728 1.554 11.003 8.207 4.172 10.938A218.176 218.176 0 01551 645c-16 6-19 7-22 6zm-368-22c-1-1-6-8-11-15-6-7-13-16-15-19-3-4-8-12-12-16-6.614-8.267-10.401-19.401-18-27-9.786-15.378-18.184-29.393-19.648-47.666-1.248-15.568 19.495-6.345 24.648-.334 8 9 21 27 26 38 6 13 11 26 14 34 8 21 16 48 16 53v3h-1c-1 0-3-1-4-3zm683-38c-17-12-25-18-33-24-5-4-13-10-17-14-13-10-28-22-28-23-1-1-16-14-23-19-10-7-16-11-24-18-.453-.226-14.761-9.761-16-11-2-3-8-7-12-10-5-4-10-8-11-9l-3-3 3-7c1-3 4-9 5-13 0-3 2-7 3-8 1 0 5-2 9-2 6-1 11-2 32-6 5-1 14-3 19-3 5-1 13-3 17-4 5.959 0 31.04-2.434 35-3 22-5 21-5 19 14v2l6 2c5 2 8 2 16 1 6-1 14-1 18-2 3-1 13-2 22-3 8-1 17-3 19-3 3-1 7-1 9-1 2 1 8 0 14-1 13-2 11-2 33 0 24 1 37 5 38 10v2l-2 1c-2 1-15 2-53 2-28 1-53 1-55 2-3.956.989-14.709 5.801-12.5 12.375 1.07 3.185 6.193 7.548 8.5 9.625 5 4 13 10 18 14 5 3 11 8 14 10 2 2 10 8 18 13 6.885 4.711 13.543 9.75 20.125 14.875 1.732 1.348 5.904 5.459 5.875 8.125-.023 2.153-4.399 6.909-5.659 8.149-9.38 9.229-20.863 17.474-32.341 23.851-7.168 4.301-21.497 15.832-31 19-2 1-6 4-9 5-8.311 5.541-23.919 18.041-34 13zm205-37c-12-4-33-15-55-29-6.289-3.145-13.028-6.028-18-11-7-6-13-10-22-16-16-10-21-14-25-17-2-2-5-4-5-4s-3-2-5-4c-6.483-4.322-21.03-16.03-26-21l-6-6 1-1c0-1.121 1.418-1.955 2.5-2.25 2.744-.748 5.656-.726 8.5-.75 27.332-.227 54.667-.002 82 0 11.168.001 15.333-1 26 3 4 2 9 5 12 6 6 5 31 28 37 36 3 3 9 10 14 15 10 9 16 18 22 31 4 9 4 11-1 16-2 3-4 4-11 6-12 3-20 3-31-1zm-27-2c-3-2-7-4-10-6-4.669-1.556-8.708-4.592-13-7-9.375-5.259-18.884-10.303-28-16-4-3-10-7-13-9-4-2-10-6-13-10-9.68-8.066-20.052-15.274-30.375-22.5-7.284-5.099-8.371-3.246-14.625-9.5-5-3-10-8-12-10-7-5-8-6-8-8v-2h2c1-1 6 1 11 5l5 5c8.527 4.264 14.473 12.736 23 17 3 3 9 7 14 10 6.779 6.779 19.158 13.733 27 19 28.574 19.192 27.746 20.36 58 37 7 3 12 7 12 8v1h-3c-1 0-5-1-7-2zm-768-68c-7-4-14-10-28-22-8.693-8.693-12.761-10.071-22-17-7-5-10-7-21-14-3-3-8-7-10-9-4.16-2.774-7.847-6.215-12-9-2.192-1.47-9-2.938-9-7-8.148-8.148-24-16.388-24-30v-3l1-1c5.254 0 8.839 6.032 12 9 9.267 8.701 14.416 12.944 25 20 6.76 6.76 30.816 24.012 35 27 6 5 14 11 17 14 3 2 9 7 14 11 17 13 33 26 34 29l2 2-1 2c-2 2-5 1-13-2zm17-8c-2-1-7-5-11-8-3-3-11-9-16-13-5-3-11-8-13-10-2-1-6-4-9-5-3-2-5-4-6-4-1-2-9-9-16-13-5-4-12-10-33-28-5-5-11-10-13-11-6.601-4.401-30.276-23.945-10-28 9.524-2.597 19.19-4.902 29-6 1.367-.153 2.518 1.299 3.375 2.375 1.726 2.169 15.862 29.269 23.625 17.625 1-3 1-3-3-13-2-8-3-10-2-11l1-2 2 1c2 1 23 16 33 24 3 3 8 6 11 7 2.754 1.377 5.938 4.938 8 7 5 3 21 15 29 22 3 3 8 7 10 8 10 7 24 19 27 23 3 3 6 18 4 20-1.068 3.205-5.881 5.673-8.5 7-4.788 2.425-9.739 4.522-14.5 7-7.131 3.713-17.334 12.933-26 6zm54-21c-1 0-1-3-2-5 0-3 0-5 1-6l2-1 2 2c2 2 3 6 0 9-1 2-3 3-3 1zm338-7c-3-1-6-3-8-4-1-2-3-2-5-2-1 1-4 0-7 0-4-2-9-1-27 0-15 1-22 1-23 0l-1-1 1-2 1-2-3-3c-5-5-14-8-19-5-2 1-3 1-5 0-1-1-3-1-3 0h-1l1 4c0 4-2 6-7 9-4.389 1.755-11.174.247-15.235-1.088-19.517-6.415-39.58-17.239-49.765-35.912-4-8-4-8-4-18 1-17 4-34 5-35 2-3 5-2 7 1 2 2 2 7 0 11 0 3 4 7 9 8 4 1 4 1 7-2 5.431-7.241 16.582-4.279 23 0 8 7 20 12 28 12 13 2 23-2 37-14 6-6 7-6 12-6 5 1 7 1 10 4 8.583 5.364 9.796 11.322 13 21 2.525 7.627 3.748 17.874 12 22 1 1 8 3 16 5 7 2 13 4 14 4 2 2 1 5-1 15-4 13-4 15-7 16-3 2-3 2-10-1zm-91-4c-3-2-2-4 2-9 3-4 4-4 7-4 2 1 4 1 6 2l3 2v1c-.284.851-1.38 2.116-2.047 2.672-3.33 2.778-4.322 3.435-8.219 5.344-.812.398-2.799 1.044-3.734.984l-4-1zm441-3c-3-2-9-7-12-11-6-5-9-7-14-9-12.031-5.156-25.457-2.579-38-3-10.643-.357-23.629-4.186-34 1-3 0-10 1-17 2-8 0-15 1-16 1-3 2-41 4-46 3-2 0-5-1-6-1-2-2-1-8 2-13 8.607-17.214 19.316-34.503 32-49 4-3 8-8 10-11 22-37 36-51 63-64 6-3 13-6 17-6 8.886-2.962 19.588-5.345 29-4 15 3 27 10 41 28 5 6 9 11 10 15 1 3 3 7 4 9 6.945 11.111 6.434 25.614 6 38-.351 10.016-.352 20.114-2 30 0 5-1 12-2 14 0 6-6 22-8 26-2.286 3.048-6.896 7.449-11 8-1.797.241-6.649-3.324-8-4zm-320-19l-2-2 1-3c1-1 6-5 15-9 7-4 15-8 16-10 4-3 8-9 15-19 6.047-8.063 21.201-27.377 33.612-19.992 5.812 3.458 6.656 6.655 11.388 10.992 6 6 14 13 16 16 6 5 14 14 14 16v2l-1 1c-11.785 0-24.459-.27-35 5-7 2-24 5-36 6-6 1-14 2-18 3-4 0-9 1-13 2-4 0-8 1-9 2-4 1-5 1-8-1zm-30-13c-12-3-17-8-19-19 0-2-2-8-3-13-.486-1.783-2.554-8.073-1.375-10.125 1.369-2.383 6.524-1.696 8.375-1.875 10.575-1.024 20.071-1.745 30-6 3-2 6-3 8-3h2v1c1 1 0 4 0 6-2.428 8.498-6.872 32.643 9.391 27.085 2.59-.885 5.332-1.567 7.609-3.085 7-4 20-14 25-22 10-14 16-19 23-21 2.37-1.58 5.161-2.772 8-3 3.766-.302 7.911 3.179 6 7 0 0-4 3-9 6-5 2-11 6-14 9-10.505 8.754-8.431 10.397-17 21-7.882 9.754-11.711 13.356-23 19-8 5-10 5-19 6-13 1-14 1-22 0zm163-16c-15.484-8.602-26.704-19.704-39-32 0-1 1-4 3-6 7-8 6-14 0-21-4.877-6.503-11.975-3.756-19-2-11.122 3.707-7.991-6.221-2.234-9.829 9.021-5.657 21.333-5.371 31.234-3.171 11 3 33 12 39 17 3 2 8 6 11 8 10 5 10 8 4 20-7 13-21 31-24 31l-4-2zm-267-19c-11-4-18-8-21-13-1-3-1-10 0-10l1-1 1 1s2 2 4 5c3 4 12 9 19 11 2 0 6 0 10-2 8-2 15-6 20-16 4.901-8.169 5.991-18.011 0-26-3-7-10-12-19-15-8-3-17-2-26 1-2.519 1.44-5.277 2.62-7.375 4.625-3.37 3.22-6.706 14.267-12.625 6.375-1-1-4-3-5-4-5-2-6-5-5-10 1-3 2-7 2-10 2-9-4-18-13-22-3 0-6-2-6-2l-1-1 2-2c1-1 3-1 8-1 10 1 19 6 30 15 8 7 8 8 21 12 7 2 16 5 19 5 7 2 14 7 22 14 9.033 10.324 14.096 24.857 6 37-5 9-16 19-23 22-8 3-19 4-26 1zm-52-7a4.828 4.828 0 01-1.045-.958c-2.112-2.579.388-6.042 2.045-8.042.57-.688 1.733-2.254 2.875-2.25 1.052.004 1.71 1.627 2.125 2.25 2 2 2 6-1 9-2 3-3 2-5 0zm-320-6c-1.302-3.907-1.935-3.507-4-7-5.066-8.568-5.546-10.091-10-19-3-5-5-10-5-11l-1-2 1-1c4-1 14 9 17 18 1 2 3 8 5 14 2 5 4 10 4 11-2 2-4 1-7-3zm368-5c-6-4-10-8-11-13-1-10 2-22 9-27 3.114-2.076 7.448-2.339 11-2 12.122 1.158 24.931 6.102 26 20 2 9-2 16-12 22-7.36 2.944-16.041 5.219-23 0zm5-15c4-3 1-9-5-9h-3l-1 2c-1 3 1 7 3 8 3 1 4 1 6-1zm69 16c-2.216-.511-11.498-.909-13.032-5.697-.814-2.542-.974-12.182 3.032-12.303 2.107-.064 4.114 1.057 6 2 7 3 13 3 28 2 14-1 20-3 34-9 5-2 7-3 8-2l2 1-1 2c-1 5-19 18-29 21-9 3-27 4-38 1zm-107-1c-2.362 0-4.145-1.881-6-3-2.301-1.389-4.596-2.798-7-4-3.591-1.539-7.018-4.339-7.705-8.408-.144-.852-.075-1.739.065-2.591.17-1.036.417-2.078.857-3.031 2.205-4.769 6.065-3.201 9.783-.97 2 2 6 3 9 4 6 1 9 4 10 9 1 6-3 10-9 9zm254-15l1-3 3-1c1.982 0 4.025.183 5.563 1.591a20.269 20.269 0 011.837 1.927c.421.501.806 1.297.725 1.982-.187 1.574-2.059 2.7-3.125 3.5-.92.92-2.051 2.198-3.5 2.25-1.232.044-2.358-1.145-3.103-1.909-1.403-1.44-2.397-3.291-2.397-5.341zm-143-3c-8-2-11-4-17-14-4-9-13-18-21-22-3-2-11-5-17-7-7-2-15-5-17-5-2-1-6-2-7-3-3 0-16-13-19-18l-1-2 3-3c13.4-16.08 36.751-20 56-20 18-1 19-1 26 1 8 2 16 6 18 8 1 0 4 1 6 1 4 1 6 2 8 4 2 1 6 4 9 6 2 2 6 5 9 7 4 5 5 7 2 12l-1 3 4 5c4 4 5 6 7 12 .641 3.848 3.583 13.209 10 10 5-1 8 5 5 10-3 3-21 13-27 14-8 1-31 2-36 1zm-116-7c-3-2-4-5-1-7 2-3 5-2 8 0 2 3 3 4 0 6-1 2-4 2-7 1zm-30-16c-4.529-4.529-7.821-12.864-5.762-19.266 2.44-7.582 8.987-13.79 16.762-15.734 6-1 9-1 12 3 3 3 4 17 2 22-2.614 6.969-9.834 14.184-17.892 13.074-3.66-.504-4.069-1.048-7.108-3.074zm5-7c.701-.654 1.736-1.591 2.347-2.438 1.255-1.738 1.461-4.292.777-6.305-.81-2.384-3.188-5.636-5.96-3.622-2.035 1.479-3.767 3.987-2.83 6.596.374 1.043 1.207 2.19 1.916 3.019.845.989 2.188 2.75 3.75 2.75zm197-3c-1.946 0-2.323-3.072-1.313-4.234 2.188-2.517 4.321-4.27 7.313-5.766l3-2v-4l-6-1c-4 0-8 0-9-1h-2v-2c1.252-3.757 6.299-5.781 9.844-6.328 6.637-1.024 16.624-.98 18.375 7.344.402 1.913.199 4.101-.219 5.984-2 5-13 15-18 15 0 0-2-1-2-2zm-109-69c-2-1-1-5 1-7 1.966-1.475 5.781-2.815 7.313 0 .224.412.39.858.507 1.313.115.444.179.905.184 1.363.017 1.552-1.004 2.807-1.004 4.324-1 1-7 1-8 0zM451 837c-3-1-5.845-3.873-8-6-.93-.918-2.385-2.489-2.625-3.875-.349-2.015-.294-4.081-.375-6.125-.064-1.614-.056-4.189.5-5.75 1.207-3.388 5.195-6.249 7.861-8.145 4.369-3.106 10.516-6.1 15.849-3.437 3.411 1.703 5.925 5.135 7.79 8.332 3 5 3 10-1 17-5 11-10 13-20 8z" fill="#fff" fill-rule="nonzero"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/gopher-footer.jpg b/static/legacy/img/gopher-footer.jpg
deleted file mode 100644
index fafe104..0000000
--- a/static/legacy/img/gopher-footer.jpg
+++ /dev/null
Binary files differ
diff --git a/static/legacy/img/gopher-homepage.jpg b/static/legacy/img/gopher-homepage.jpg
deleted file mode 100644
index 3c6e41a..0000000
--- a/static/legacy/img/gopher-homepage.jpg
+++ /dev/null
Binary files differ
diff --git a/static/legacy/img/icon-launch.svg b/static/legacy/img/icon-launch.svg
deleted file mode 100644
index c40f29b..0000000
--- a/static/legacy/img/icon-launch.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#5f6368"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/icon-search.svg b/static/legacy/img/icon-search.svg
deleted file mode 100644
index ce2d9df..0000000
--- a/static/legacy/img/icon-search.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" role="presentation" fill="#6e7072"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path><path fill="none" d="M0 0h24v24H0z"></path></svg>
\ No newline at end of file
diff --git a/static/legacy/img/logo.svg b/static/legacy/img/logo.svg
deleted file mode 100644
index baaae77..0000000
--- a/static/legacy/img/logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="77" viewBox="0 0 206 77" width="206" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" x1="100%" x2="0%" y1="50%" y2="50%"><stop offset="0" stop-color="#00a29c"/><stop offset="1" stop-color="#00add8"/></linearGradient><path d="m127.481483 31.4343267c1.445351-4.5790807 3.790459-8.9059246 6.918517-13 7.3-9.59999996 16.1-14.59999996 28-16.69999996 10.2-1.8 19.8-.8 28.5 5.1 7.9 5.39999996 12.8 12.69999996 14.1 22.29999996 1.7 13.5-2.2 24.5-11.5 33.9-6.6 6.7-14.7 10.9-24 12.8-2.7.5-5.4.6-8 .9-9.1-.2-17.4-2.8-24.4-8.8-4.923224-4.2556681-8.314592-9.4861534-9.999798-15.5752516-1.1695 2.3617137-2.567865 4.6235348-4.200202 6.7752516-7.2 9.5-16.6 15.4-28.5 17-9.8 1.3-18.9-.6-26.9-6.6-7.4-5.6-11.6-13-12.7-22.2-1.3-10.9 1.9-20.7 8.5-29.3 7.1-9.29999996 16.5-15.19999996 28-17.29999996 9.4-1.70000001 18.4-.6 26.5 4.9 5.3 3.5 9.1 8.29999996 11.6 14.09999996.6.9.2 1.4-1 1.7-6.3 1.6-10.6 2.8-16.8 4.4-1.5.4-1.6.5-2.9-1-1.5-1.7-2.6-2.8-4.7-3.8-6.3-3.1-12.4-2.2-18.1 1.5-6.8 4.4-10.3 10.9-10.2 19 .1 8 5.6 14.6 13.5 15.7 6.8.9 12.5-1.5 17-6.6.9-1.1 1.7-2.3 2.7-3.7-3.6 0-8.1 0-19.3 0-2.1 0-2.6-1.3-1.9-3 1.3-3.1 3.7-8.3 5.1-10.9.3-.6 1-1.6 2.5-1.6zm-111.981483-8.2c-.4 0-.5-.2-.3-.5l2.1-2.7c.2-.3.7-.5 1.1-.5h35.7c.4 0 .5.3.3.6l-1.7 2.6c-.2.3-.7.6-1 .6zm-15.1 9.2c-.4 0-.5-.2-.3-.5l2.1-2.7c.2-.3.7-.5 1.1-.5h45.6c.4 0 .6.3.5.6l-.8 2.4c-.1.4-.5.6-.9.6zm24.2 9.2c-.4 0-.5-.3-.3-.6l1.4-2.5c.2-.3.6-.6 1-.6h20c.4 0 .6.3.6.7l-.2 2.4c0 .4-.4.7-.7.7zm160.7-5.3c-.1-1.3-.1-2.3-.3-3.3-1.8-9.9-10.9-15.5-20.4-13.3-9.3 2.1-15.3 8-17.5 17.4-1.8 7.8 2 15.7 9.2 18.9 5.5 2.4 11 2.1 16.3-.6 7.9-4.1 12.2-10.5 12.7-19.1z" fill="url(#a)"/></svg>
diff --git a/static/legacy/img/menu-24px-white.svg b/static/legacy/img/menu-24px-white.svg
deleted file mode 100644
index b7e5807..0000000
--- a/static/legacy/img/menu-24px-white.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" fill="#FFFFFF"/></svg>
diff --git a/static/legacy/img/menu-24px.svg b/static/legacy/img/menu-24px.svg
deleted file mode 100644
index 14f99cd..0000000
--- a/static/legacy/img/menu-24px.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></svg>
diff --git a/static/legacy/img/pilot-bust.svg b/static/legacy/img/pilot-bust.svg
deleted file mode 100644
index a654dc7..0000000
--- a/static/legacy/img/pilot-bust.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg viewBox="0 0 1431 901" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2"><path d="M335.6 867.8c-.6-33-1.1-47.7-2.2-69.6-.6-10.6-.7-11.2-2.4-10-1 .7-5.7 4.6-10.6 8.6-15.4 12.5-25.1 16.2-47.4 17.7-12.7.9-17.2 2.1-32 9-7.5 3.5-15.5 6.8-17.8 7.5-3.1.8-15.6.9-45 .4l-40.7-.7-9.5 4c-18.4 7.8-31.9 11-41.5 9.8-9-1.2-21.4-4.4-26.4-7-11.5-5.8-23.1-18.3-38.8-42-19.7-29.6-24.6-42-19.2-48.9 1.2-1.5 4.9-4.1 8.3-5.8 11.3-5.6 11.9-6.4 14.1-17.1 1.2-6 7.3-8.4 13.3-5.3 3.7 2 9.4 8.1 13.4 14.6 4.4 7.1 4.6 7.5 6.9 20.5 2.8 15.5 8.5 38.9 10.8 44 1.8 4 2.4 4.5 7.7 6.1 8.5 2.4 23.5 1.5 32.9-2.1 3.9-1.4 12.2-4 18.5-5.6 11.1-2.9 12.5-3.1 36.5-3.4 35-.4 54.8-3.6 62.5-10.1 7-5.9 28-56.1 35.4-84.8 5.2-19.7 5.7-30.9 2.2-46.5-5.3-23.4-13.3-77.8-14.3-96.6-.6-11.5 1-23.3 6-46l2.2-10-5.1-5.2c-6.2-6.1-11.4-15.1-14.4-24.8-3-9.6-3.8-28.1-1.6-38.4.9-4.1 1.5-7.5 1.3-7.6-.1-.1-3.1-2.2-6.7-4.7-22-15.4-33.1-36.4-33.3-62.8-.1-13.6 1.3-22.8 5.9-37 4.6-14.5 10.8-24.6 21.3-35 10.1-10 18.1-14.9 30.8-19 13.1-4.2 20.8-5.3 38.3-5.3h15.6l2.3-11.1c3.4-16.3 8.6-32.9 13.7-43.4 7.5-15.5 20.5-27 45.1-39.9 8.5-4.4 12.6-7.4 19.3-13.8 5.3-5.1 14.5-12.1 24.5-18.8 18.3-12.1 35.8-26.7 47.2-39.4 11.3-12.7 14.6-15.6 26.8-23.7 18.8-12.5 55-31.8 79.1-42.1 14.6-6.3 23-8.3 62.4-14.9 18.4-3.2 39.1-6.9 46-8.4C689.2.6 690.3.5 723.5.5c35.9 0 51.2.9 82.5 5.1 21.1 2.8 34.6 6 44 10.2 6.9 3.2 34.5 13.3 62 22.7 43.7 15.1 57 19.9 62.5 22.7 14.2 7.1 36.1 24.7 70 56.3 20.2 18.8 22 20.2 42.9 34.5 32.3 22 35.4 26.2 48.7 67.5 12.3 38.2 11 35 14.5 34.8 5.6-.3 24.6 1.7 31.3 3.3 3.6.8 11.2 3.8 16.8 6.5 21.8 10.7 35.3 28.8 43.1 57.8 2.1 8.1 2.6 11.8 2.6 24.1.1 13.4-.1 15.2-2.8 23.3-4.6 14-14.3 27.1-25.6 34.8l-5.1 3.4.8 10c1.3 16.4.8 39-1.1 48.4-1.8 8.9-6.1 19.3-9.2 22.5-1.6 1.7-1.8 3.2-1.6 10.2.4 8.1-1.6 26.9-4.3 40.7-1.3 7-1.3 7.3 1 11.2 1.3 2.2 5.1 7.2 8.5 11 3.4 3.9 7 8.7 8.1 10.8 5.5 10.4 8.6 35.4 7.5 60-1.3 29.3-4.8 40.9-26.6 86.4-8.6 18-11.4 25.6-10.6 29.7.8 4.3 5.3 10.7 10.6 15.1 6.7 5.6 29 20.3 40.9 26.9 7.7 4.4 12.9 8.3 20.5 15.5 13.2 12.5 18.7 15.5 28.1 15.5 12.6-.1 19.7-5.3 28.4-21 7.6-13.7 11-18 26.9-34.5 15.4-15.9 23.6-22.5 35.2-28.4 19.8-10 37.8-9.9 49.2.3 5.7 5.2 7.8 9.2 7.8 15.1 0 5.5-1.3 8.4-6.2 13.7-8.2 8.9-22 16.5-44.2 24.3-13.7 4.9-18.2 7.7-29.8 19.1l-10.6 10.5-4.1 12.8c-2.2 7-5.3 14.6-7 17-6.8 9.8-24.2 23.7-31.5 25.1-2.5.5-5.8-.2-13-2.8-11.8-4.3-21-6.3-35.2-7.5-18.2-1.7-31.8-7.6-66.6-29.4-16.9-10.5-27.8-16.7-29.3-16.7-.3 0-.3 14.5.1 32.3.4 17.7.4 36.1 0 41l-.8 8.7H336.3l-.7-33.2z" fill="#0a0a0a" fill-rule="nonzero"/><g fill="#fefefe" fill-rule="nonzero"><path d="M348 874.8c0-14.5-.7-42.9-1.5-63.3l-1.4-37 3.7-3c13.5-10.9 22.7-22.5 31.7-39.8 6.6-12.9 6.9-15.6 2.8-35.8-4.9-24.8-3.7-39.6 5.9-75.9 1.7-6.3 3.3-12.5 3.6-13.7.2-1.3.8-2.3 1.1-2.3.4 0 5.4 2.4 11.2 5.4 12.3 6.5 27.3 11.8 41.3 14.8 8.1 1.7 13.6 2.1 27.6 2.2 36.6.1 71.3-8.2 103.4-24.6 10.3-5.3 29.9-17.9 31.3-20.1.4-.6 1.2 2.6 1.9 7.1 2.7 19.2 13 30 32 33.5l6.9 1.3-.3 7.5c-.1 4.1-.7 16.4-1.2 27.4-1.5 32-1.4 37.2 1.4 43.1 6.6 14.1 24 21.9 41 18.4 7.5-1.5 19.9-7.9 26.2-13.4l4.9-4.3 4.4 3.4c9.7 7.4 24.6 12.6 36.1 12.5 15.9-.1 29.1-10.4 33.7-26.4 2.3-8.3 2.8-35.4.9-53.4-.9-8.3-1.6-15.6-1.6-16.2 0-.7 1.2-1.2 2.8-1.2 4.6 0 15.6-2.7 20.5-5 11.2-5.3 19.3-16.8 21.8-31.2.7-4 1.3-7.4 1.5-7.6.1-.2 2.8 1.3 6 3.4 16 10.2 42.3 20.6 65.4 25.8 21.5 4.8 32.9 6 57 6 24.9.1 33.7-1.2 51.9-7.6 21.5-7.5 49.1-24.7 63-39.2 1.9-2 3.8-3.6 4.2-3.6.4 0 1 4.6 1.3 10.3 1.9 28.8 5.2 44.5 12.6 59.2 8 16.1 9.4 22.4 9.4 45.5l.1 19.5-5.1 17.5c-7.1 24.1-9.6 36.5-9.8 48.5-.1 8.7.2 10.6 2.3 14.4 4.8 9.1 17.7 20.5 33.8 30l7.3 4.3.2 43.7.3 43.6v14.95c4.5.9-86 3.267-390.7 3.367L348 914.264V874.8z"/><path d="M1288.5 863.9c-9.3-3.7-23.3-6.8-35.4-7.9-19.1-1.6-30.4-6.5-65.8-28.6-10.1-6.3-25.1-15-33.4-19.4-26.6-14.2-40.8-24.9-45.5-34.6-2.5-5-2.6-6.2-2.1-13.4.8-9.8 4.4-26.3 10.4-46.9 4.1-14.3 4.5-16.8 5-29.9.9-23.2-2.5-40.5-10.8-55.7-6.9-12.7-10.5-31.3-11.5-59.5l-.6-16.5 5.8-7c9.6-11.7 18.8-26.7 24.2-39.3l2.3-5.3 4.7.8c2.6.4 11.9.7 20.7.6 15.3-.1 23.9-1.3 32.9-4.9 1.8-.7 1.9-.3 1.2 8.2-.3 4.9-1.8 16.3-3.2 25.4-1.4 9-2.3 17.7-2 19.3.7 3.4 5 9.8 12.9 19 3.3 3.8 6.8 9.2 7.9 11.9 3.2 8.4 4.8 22.9 4.8 42.8 0 34-2.1 41.6-24.5 89.5-5.7 12.1-10.8 23.8-11.4 26-3.6 13.4 1.7 24.2 18.2 36.4 10.2 7.6 27 18.4 38.7 24.9 4.6 2.5 11.7 8.1 18.4 14.2 6.3 5.9 13.5 11.5 17 13.3 5.7 3 6.8 3.2 16.1 3.2 8.9 0 10.6-.3 15.7-2.8 7.4-3.6 15.4-12.4 21.3-23.2 2.6-4.7 6.3-10.7 8.3-13.4 4.6-6 28-30.7 28.5-30.1.2.3 2.3 6 4.5 12.8l4.1 12.2-5.7 3.6c-7.1 4.6-25.8 22.7-28.2 27.4-.9 1.9-3.1 8-4.8 13.5-3.6 11.5-7.2 17.5-14.5 24.1-6.4 5.8-15 11.4-17.4 11.4-1-.1-4-1-6.8-2.1zM77.5 833.4c-10.4-2.2-16.8-5.6-24.2-12.6-7.8-7.5-15.4-17.3-26.3-34-8.1-12.2-18-30.7-18-33.4 0-.7 3.5-3.1 7.8-5.3 10.6-5.3 14.7-10.2 16.4-19.6.4-1.7 1-1.4 4.6 2.4 6.5 7.1 8.7 12.3 11.7 27.6 5.4 28.8 10.4 45.2 14.8 49.4 8 7.5 31.7 8.7 48.8 2.5 19.8-7.2 22.1-7.6 52.9-8.4 46.7-1.3 64-5.5 71.8-17.8 11.3-17.5 31.6-70.9 36.2-94.9 2.9-15.5 2.5-29-1.8-48.8-6.4-30.2-13.7-85.3-12.7-96 .6-6.2 7-40.4 7.7-41 .2-.2 4.1 1 8.8 2.6 10.8 3.6 21.3 5.2 30.7 4.7 4.8-.2 7.3 0 7.3.8 0 .6 2 5.2 4.5 10.2 12.5 25.9 39.2 56.8 62.9 73.1 3.5 2.4 4.6 3.7 4.1 4.9-1.3 3.4-9.5 36.1-11.7 46.7-3.1 15.5-3 31.5.6 49.4 3.5 18.2 3.4 21.5-1 30.4-4.7 9.4-13.2 22.1-18.6 27.7-2.4 2.5-11.1 10.4-19.2 17.5-34.1 29.8-37.2 31.5-62.2 33.5-16.9 1.3-21.2 2.5-36.9 10.2l-13 6.3-44.5.1-44.5.2-12.5 5c-20.9 8.5-29.4 9.8-44.5 6.6zM1375.5 785.8c-3.7-10-4.4-13.2-3.3-13.9 1.9-1.2 2.6-.3 4.3 5.9.9 3.1 1.8 6.5 2.1 7.5.6 2-2.4 2.5-3.1.5zM1380.7 782.6c-.4-1 1.3-2 5.6-3.6 9.5-3.4 23.7-10.8 28.5-14.7 7.2-5.9 8.8-11.1 5.2-17.1-5.7-9.4-24.3-9.7-43.7-.7-8.6 4-10.7 2.9-3.1-1.5 11.9-6.8 25.5-10 34.3-8.1 9.4 2.1 17.5 9.3 17.5 15.5 0 8.6-11.6 18.1-33.3 27.4-5.4 2.3-9.9 4.2-10.1 4.2-.2 0-.6-.6-.9-1.4z"/><path d="M1378.2 774.3c-1.1-3.7-.9-5.3 1-5.3 1.7 0 18.1-7.9 20-9.7 2.5-2.2 2.3-5.1-.5-5.8-2.3-.6-10 1.5-19.5 5.4l-5.3 2.1-1.8-4.2-1.8-4.3 4.6-2.4c7.3-3.8 18-7.1 25.1-7.7 5.4-.5 7.5-.3 11.3 1.4 5.1 2.3 9 7.4 8.1 10.7-1 3.7-10.1 11.1-18.6 15.3-8.7 4.2-18.5 8.2-20.4 8.2-.6 0-1.6-1.6-2.2-3.7z"/><path d="M1369.6 769.3c-2.3-2.3 4.7-6.4 19.3-11.3 12.2-4.1 11.8-1.5-.6 4.3-10.9 5-18 7.7-18.7 7zM1365.6 756.5c-3.1-9.5-1.6-10.9 2.4-2.1 3.4 7.5 3.5 8.2 1.6 8.9-1.1.4-2.1-1.4-4-6.8zM672.3 707.4c-4.9-1.8-12-8.5-13-12.3-.7-2.6 1.3-60.3 2.3-67.7l.6-4.2 5.8-.6c3.3-.4 8.3-1.4 11.2-2.2 16.2-4.5 24.1-6.3 30.7-6.9l7.3-.7-.3 38.7-.4 38.7-6 5.6c-11.6 10.8-27.3 15.6-38.2 11.6zM754.1 705.5c-8.1-1.8-17.6-6.3-22.2-10.6l-3.7-3.4.5-39.4.6-39.4 7.8.7c9.7.8 44.1 6.5 45.1 7.4.4.4 1.4 8.1 2.3 17.2 2.1 20.4 1.7 45-.9 52.1-4.6 12.6-15.6 18.4-29.5 15.4zM453.8 616.5c-43.5-6.8-87.7-37.3-116.7-80.4-16.4-24.3-20-36.7-20.8-72.2-.6-25.1.4-39.1 4.2-58.4 11.4-57.3 38.8-101 81.4-129.6 49-33 132.7-53.8 248.6-61.9 31.8-2.2 107.8-3.3 140.9-2.1 138.2 5 222.7 27 270 70.2 33.4 30.6 55.2 72.2 63.6 121.3 6 35.2 4 78.4-4.7 99-3.5 8.5-12 22.7-18.8 31.6-26.9 34.8-59.3 57.1-97 66.7-10.5 2.7-12.1 2.8-34 2.8-28.6 0-44.5-2.2-70.4-9.7-18.9-5.4-39.3-14.7-52.6-23.9-6.4-4.4-7.2-5.4-9-10.6-5.2-15.2-21.8-29.7-44.9-38.9l-8-3.3-1.1-4.9c-1.3-5.7-4.1-9.9-9.3-14-17.4-13.8-52.1-18.1-79.7-10-20.3 5.9-32.2 18.1-29.5 30.2l.7 3.3-8.6 3.9c-18.5 8.3-35 22.2-41.9 35.2-2.6 4.9-5.1 7.7-11 12.4-19.6 15.7-43 27.7-68.4 35.4-27.3 8.2-60.7 11.3-83 7.9zm83.7-50.9c29.7-5.2 58.3-17.2 80.7-33.8 11.1-8.2 30.3-25.4 37-33.1 17.2-19.7 27.5-39.9 32.9-64.7 3.1-13.7 3.3-39.7.6-53.3-9.1-44.9-38-81.8-79.8-101.6-39.3-18.7-79.7-19.9-123.9-3.8-66.2 24.1-109.2 65.8-122.5 118.7-3.7 14.8-4.8 24.2-4.7 41 .1 16.9 1.6 28 5.7 40.9 13.5 42.7 49.3 74.4 97.5 86.6 8.3 2.1 12.5 2.8 27.5 4.9 6.1.9 41.3-.4 49-1.8zm413-18.6c37.9-3.7 70.6-17.5 93.5-39.6 18.4-17.7 29.5-39.4 33.7-65.8 2.4-15.5 1.4-48.9-2.1-65.3-14.4-68.2-64.7-110.1-147.6-122.8-14.5-2.2-48.3-3.1-59.1-1.6-47 6.8-86.5 33-109.3 72.8-13.1 22.8-18.3 44.6-17.3 73.1.6 18.3 2.7 29.3 8.7 44.7 9.5 24.5 27.9 48 49.7 63.7 10.4 7.5 35 20.7 48.3 26 32.7 12.8 68.2 18 101.5 14.8z"/><path d="M480.2 557.4c-24.5-3.5-48.5-13.1-67.2-26.7-14.4-10.5-30.4-30.5-37-46.3-11.8-28.3-12.8-63.9-2.8-95.3 7.1-22.5 17.4-38.9 35.7-57.1 10.8-10.7 22.1-20.2 22.1-18.7 0 .3-1.6 2.5-3.7 4.9-9.6 11.4-19.2 28.7-24.1 43.5-5.7 16.8-6.7 23.8-6.7 45.3.1 17 .4 20.7 2.4 29 7 28.4 20.6 52 41.3 71.5 26.5 24.9 59.6 38.6 96.8 40.2 13.1.5 30-.6 34.5-2.3.8-.3 1.5-.1 1.5.4 0 1.2-14.5 6.1-25.5 8.7-19.5 4.5-47.9 5.8-67.3 2.9z"/><path d="M527.5 535.4c-17.2-2.5-29.8-6.2-43.4-12.5-39.8-18.6-67.6-54.5-74.7-96.4-2.4-14.3-1.5-37.3 2-50.5 6.5-24.4 16.8-42.3 34.5-60.1 34.1-34 84.4-47.5 132.1-35.4 50.9 13 89.1 52.6 99.1 103 2.1 10.4 1.8 36.8-.5 47.3-5.4 25.2-17.3 47-35.6 65.2-18.8 18.9-42.4 31.5-70 37.5-7.3 1.6-36.9 2.9-43.5 1.9zm110.6-82.6c12.1-6 21.1-16.9 24.3-29.3 6.9-26.1-10.1-52-37.1-56.7-21.6-3.7-43.4 9.8-50.3 31.1-1.9 6.1-2.2 8.6-1.8 16.7.5 8.4 1 10.3 4.2 16.9 5.9 11.9 15.2 19.9 28.1 24.1 2.5.9 7.8 1.3 14.6 1.1 9.9-.2 11-.4 18-3.9z"/><path d="M627.8 428.4c-3.1-1.6-5.8-6.1-5.8-9.5 0-3.4 3.8-8.6 7.1-9.8 6-2.1 13 1.7 14.4 7.9.9 4-1.7 9.6-5.4 11.4-3.7 2-6.8 2-10.3 0zM912.5 538.4c-18.5-2.1-25.8-4.4-13.7-4.4 10.9 0 27.8-3.4 42.2-8.5 42.7-15.1 77-50.6 89.8-93 4.6-15 5.7-23.3 5.6-41-.1-12.5-.6-18.3-2.3-26.5-4-18.9-11.8-36.8-23.2-53-6.8-9.7-24.4-27.2-33.7-33.5-4-2.7-6.9-5.1-6.4-5.3 1.6-.5 19.7 7.4 28.7 12.5 30.2 17.2 52.1 43.1 62.5 74.1 8.9 26.7 11 65.2 5 90.1-11.9 48.9-53.3 80.6-115 88.1-7.8.9-32.4 1.2-39.5.4z"/><path d="M880 522.3c-51.6-3.7-96.5-34.8-116.1-80.3-6.8-15.7-9-26.1-9.6-45-.4-12.4-.1-18.7 1.1-25.5 8.4-48.5 46.6-90.1 95.1-103.6 18.9-5.2 43.3-6.6 62.2-3.3 50.5 8.5 92.4 44.5 106.7 91.4 7.5 24.7 7.2 51.4-.9 75.7-6.1 18.2-15.1 33.4-28.2 47.3-23.4 24.9-54.3 39.8-88.8 43-10.7 1-12.2 1-21.5.3zM980.2 441c12.3-4.6 23.2-15.9 27.4-28.2 2.8-8.2 2.5-21.5-.6-30.1-4.6-12.9-15.6-23.4-29-27.7-5.8-1.9-8.6-2.2-16.4-1.8-8.3.3-10.2.8-16.8 4.1-9.7 4.7-16.8 11.8-21.5 21.5-3.2 6.4-3.7 8.5-4.1 16.4-.6 11.1 1.5 19.5 6.7 27.6 6.5 9.9 17.7 17.9 28.4 20.2 6.7 1.4 19.5.5 25.9-2z"/><path d="M971.3 412.5c-3.2-3.2-3.5-3.9-3-7.8 1.5-11.3 16-13.4 20.4-3 2.8 6.9-2.3 14.3-9.9 14.3-3.2 0-4.7-.7-7.5-3.5zM646.5 610.9c-7.7-1.2-15.6-5.1-18.9-9.4-3.6-4.7-6-14.5-5.2-21.5 1.4-11.8 9.9-24.1 23.2-33.6 5.9-4.2 25.7-14.4 28-14.4.6 0 3.8 1.6 7 3.5 21.6 13 61.7 13.9 85.6 1.9 3.7-1.9 8.3-4.7 10.2-6.4l3.4-3.1 6.7 2.5c13 5 22.7 10.7 30.1 18.1 9.9 9.8 11.9 14.3 11.9 27 0 8.9-.4 10.7-2.9 16.3-7.8 17-23.1 20.3-62.1 13.3-30.8-5.5-58.7-5.2-77.3.9-14.3 4.7-29 6.5-39.7 4.9zM290.1 500.9c-22.4-4.4-35.5-15.2-41.9-34.7-2.1-6.5-2.5-9.6-2.6-20.2 0-6.9.2-13 .6-13.5.4-.7 5.1-.6 14.5.3 12 1.1 41.3 1.2 45 .1 1-.3 1.4 5.5 1.7 25.6.3 22.6 1 31.8 3.1 41.3.5 2.1.4 2.2-7.7 2.1-4.6-.1-10.3-.5-12.7-1zM1139 492.1c-3-.3-5.4-1-5.3-1.6 2.4-15 3.4-29.6 3.1-47.7l-.3-20.8 3.5.8c7.5 1.6 29.2.5 45.4-2.2 8.7-1.5 16.1-2.4 16.5-2.1 1.3 1.4.6 41.8-.8 47.5-2.1 8.5-5.5 15.3-8.9 18.2-8.5 7.2-30.1 10.4-53.2 7.9zM279.3 423.4c.3-1.1 1.8-7.3 3.2-13.9 3.6-16.3 10.1-42.3 13-52.1 5.4-17.8 20.8-45.6 47.9-86.6l1.8-2.8-2.8-1.1c-4.2-1.6-17.4-4.9-19.6-4.9-3 0-3-2-.3-14.1 3.6-16.2 8-30.1 12.5-39.5 6.1-12.8 18.3-23.5 39.1-34.8l8.6-4.6.7 3.1c.3 1.7.6 5.7.6 8.8 0 7.9 2.6 31.5 5 45.2 2.3 13.7 6.1 27.2 9.5 34.3l2.5 5.1-2.2 1.5c-16.6 11.1-37 30.2-47.9 45-20.7 28.1-34.8 62.8-40.5 100.2-1.4 8.9-2.2 11.7-3.4 11.7-.8 0-7.5.4-14.9.7-12.7.6-13.3.6-12.8-1.2z"/><path d="M256.5 416.7c-24.4-9.9-39.4-26.4-44.1-48.8-4.5-21 2.8-52 16.3-69.9 10.7-14.1 28.1-23.2 49.8-26.1 14.5-1.9 47.4.7 46.8 3.7-.1.6-4.2 7.4-9.1 15.3-5 7.8-11.2 18.3-13.8 23.2l-4.9 8.9-4.5-.7c-18.2-2.6-30.5 2.3-33.8 13.3-2.1 7.1-1.5 16.3 1.3 22.1 2.3 4.5 8.7 11.7 15.2 17l2.2 1.8-2.8 12c-1.6 6.6-3.9 16.4-5.1 21.8-1.7 7.5-2.5 9.7-3.8 9.7-.9 0-5.3-1.5-9.7-3.3zM1141 413.7c-4.7-1-5.5-1.5-5.8-3.7-.9-7.2-5.6-28.7-8.2-37.3-16.7-56.1-53.4-101.8-100.5-125.4-4.9-2.5-9.1-4.6-9.2-4.7-.2-.2 2.4-6.5 5.8-14.2 3.3-7.6 7.8-18.4 10.1-23.9 3.1-7.8 26.3-58 27.3-59.3.1-.2 4.7 2.8 10.1 6.6 5.5 3.8 15 10.4 21.2 14.7 11.5 8 20.7 17.6 25.1 26.3 1 2.1 5.9 16.3 10.9 31.7 5 15.4 9.4 28.8 9.7 29.7.5 1.3 0 1.9-2.2 2.4-7.5 1.6-18 4.6-19.2 5.4-1.1.6.9 5.7 9.8 25 22.5 48.6 29.9 67.4 32.7 83 1.8 10.1 4 41 3.1 43.4-.5 1.3-2 1.6-7.9 1.5-4 0-9.8-.6-12.8-1.2z"/><path d="M1173.6 399.3c-.3-4.3-1.1-12.9-1.7-19.1-.6-6.3-.9-11.5-.7-11.6.2-.2 2.8-1.7 5.8-3.4 6.7-3.7 13.5-10.3 16.3-15.7 4.8-9 1.6-22.9-7-30.5-6.5-5.7-12.3-7.3-24.9-6.9l-10.5.4-9.8-21.3c-5.4-11.7-9.6-21.4-9.2-21.6 1.4-.9 16.6-2.6 23.1-2.6 38 0 62.8 18.4 73.6 54.5 2.1 6.9 2.8 11.9 3.1 21.5.6 14.1-.6 20.9-5.4 30.8-3.9 8-15.9 19.8-24.8 24.4-6.3 3.3-22.7 8.8-26 8.8-.9 0-1.5-2.3-1.9-7.7zM402.2 254.3c-6-15.6-10.2-39.8-12.3-70.7l-1.3-17.9 8-7.6c4.7-4.6 14.3-11.9 23.9-18.3 19-12.5 33.2-24.5 51.5-43.5 17.6-18.2 29.4-26 72.5-47.8 36.7-18.6 41.3-20 95-28.9 14.9-2.5 32.8-5.7 39.9-7.1 7-1.4 12.9-2.5 13.1-2.5.7 0 1.5 5.5 3.9 26 5.6 47.8 5.9 52.8 6.1 105.5.1 27.5.5 52.5.9 55.6l.8 5.7-15.8.6c-122.7 5-210.4 22-270.4 52.7-6.4 3.2-12 5.9-12.3 5.9-.3 0-1.9-3.5-3.5-7.7zM1000.4 236c-35.5-13.7-89.9-24.5-147.9-29.4-36.8-3.2-54.1-3.9-98-4l-45-.1-.7-13.5c-.4-7.4-.6-31.7-.6-54 .2-43.2-.6-55.3-6.7-104.9-1.4-10.7-2.2-19.7-1.9-20 1-1.1 51.7-.4 66.4.8 33.4 2.7 58.8 6.4 70.5 10.1 3.3 1 11.4 4.1 18 6.8 10.7 4.4 43.9 16.3 70.5 25.3 20.3 6.8 41.7 14.7 46.6 17.2 11.3 5.7 37.8 27.4 68.6 56.1l15.7 14.6-2.8 6.3c-1.6 3.4-6.3 13.4-10.6 22.2-4.2 8.8-9.8 21.2-12.4 27.5-10 24-18.4 43-19 42.9-.3 0-5.2-1.8-10.7-3.9z"/></g></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-arrowBranch_16x16.svg b/static/legacy/img/pkg-icon-arrowBranch_16x16.svg
deleted file mode 100644
index f8479be..0000000
--- a/static/legacy/img/pkg-icon-arrowBranch_16x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" x="0" y="0" version="1.1" viewBox="0 0 16 16" xml:space="preserve"><style>.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#80868b}</style><path d="M.8 1.2c0-.3.3-.6.6-.6h4.7c.3 0 .6.3.6.6s-.3.6-.6.6H2v4.1c0 .3-.3.6-.6.6s-.6-.3-.6-.6V1.2zM15 1.2c0-.3-.3-.6-.6-.6H9.7c-.3 0-.6.3-.6.6s.3.6.6.6h4.1v4.1c0 .3.3.6.6.6s.6-.3.6-.6V1.2z" class="st0"/><path d="M9 6.5c.2.2.6.2.8 0l4.8-4.8c.2-.2.2-.6 0-.8-.2-.2-.6-.2-.8 0L9 5.7c-.2.2-.2.6 0 .8zM8.6 8c0-.2 0-.3-.2-.5L2 1.1c-.2-.2-.6-.2-.8 0s-.2.6 0 .8l6.2 6.2c.1.1.1.2.1.3v6.5c0 .3.3.6.6.6s.6-.3.6-.6v-4.7L8.6 8z" class="st0"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-arrowLeft_16x16.svg b/static/legacy/img/pkg-icon-arrowLeft_16x16.svg
deleted file mode 100644
index 90b34a0..0000000
--- a/static/legacy/img/pkg-icon-arrowLeft_16x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><path id="a" d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20z"/></defs><g fill="none" fill-rule="evenodd" transform="translate(-4 -4)"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g fill="#5F6368" mask="url(#b)"><path d="M0 0h24v24H0z"/></g></g></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-arrowRight_24x24.svg b/static/legacy/img/pkg-icon-arrowRight_24x24.svg
deleted file mode 100644
index 5938446..0000000
--- a/static/legacy/img/pkg-icon-arrowRight_24x24.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="black" width="18px" height="18px"><path d="M10 17l5-5-5-5v10z"/><path d="M0 24V0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-boxClosed_16x16.svg b/static/legacy/img/pkg-icon-boxClosed_16x16.svg
deleted file mode 100644
index 3bcf2fb..0000000
--- a/static/legacy/img/pkg-icon-boxClosed_16x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#80868b" fill-rule="evenodd" d="M7.8 1.1h.4l6 2.4-2.4 1L5.6 2l2.2-.9zM4.2 2.5L10.4 5 8 6 1.8 3.5l2.4-1zM1 4.2l6.5 2.6v7.9L1 12.2v-8zm7.5 10.6v-8l1.9-.8v1.4l1.4-.7V5.5L15 4.2v7.9l-6.5 2.7zM8.6.2C8.2 0 7.8 0 7.4.2L.3 3c-.2.1-.3.3-.3.5v8.7c0 .4.2.8.6.9L7.8 16h.4l7.2-2.9c.4-.2.6-.5.6-.9V3.5c0-.2-.1-.4-.3-.5L8.6.2z" clip-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-cancel_24x24.svg b/static/legacy/img/pkg-icon-cancel_24x24.svg
deleted file mode 100644
index c4fc476..0000000
--- a/static/legacy/img/pkg-icon-cancel_24x24.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none" opacity=".87"/><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3.59-13L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41z"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-checkCircleOutline_24x24.svg b/static/legacy/img/pkg-icon-checkCircleOutline_24x24.svg
deleted file mode 100644
index 37a8761..0000000
--- a/static/legacy/img/pkg-icon-checkCircleOutline_24x24.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0zm0 0h24v24H0V0z" fill="none" /><path fill="#007d9c" d="M16.59 7.58L10 14.17l-3.59-3.58L5 12l5 5 8-8zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-chevronDown_16x16.svg b/static/legacy/img/pkg-icon-chevronDown_16x16.svg
deleted file mode 100644
index c322933..0000000
--- a/static/legacy/img/pkg-icon-chevronDown_16x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#555759" fill-rule="evenodd" d="M1.6 4.6c.2-.2.5-.2.7 0L8 10.3l5.6-5.6c.2-.2.5-.2.7 0 .2.2.2.5 0 .7l-6 6c-.2.2-.5.2-.7 0l-6-6c-.1-.2-.1-.6 0-.8z" clip-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-chevronUp_16x16.svg b/static/legacy/img/pkg-icon-chevronUp_16x16.svg
deleted file mode 100644
index 78268ee..0000000
--- a/static/legacy/img/pkg-icon-chevronUp_16x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#555759" fill-rule="evenodd" d="M7.6 4.6c.2-.2.5-.2.7 0l6 6c.2.2.2.5 0 .7-.2.2-.5.2-.7 0L8 5.7l-5.6 5.6c-.2.2-.5.2-.7 0-.2-.2-.2-.5 0-.7l5.9-6z" clip-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-circularArrows_16x16.svg b/static/legacy/img/pkg-icon-circularArrows_16x16.svg
deleted file mode 100644
index 8f37722..0000000
--- a/static/legacy/img/pkg-icon-circularArrows_16x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" x="0" y="0" version="1.1" viewBox="0 0 16 16" xml:space="preserve"><style>.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#80868b}</style><path d="M2.9 7.1c-.2-.1-.6-.1-.8 0l-2 2c-.1.2-.1.6 0 .8.2.2.5.2.7 0l1.6-1.6L4 9.9c.2.2.5.2.7 0 .3-.2.3-.6.2-.8l-2-2zM15.9 6.1c-.2-.2-.5-.2-.7 0l-1.6 1.6L12 6.1c-.2-.2-.5-.2-.7 0s-.2.5 0 .7l2 2c.2.2.5.2.7 0l2-2c0-.1 0-.5-.1-.7z" class="st0"/><path d="M8 3c-1.8 0-3.3.9-4.2 2.3-.1.2-.5.3-.7.1-.2-.1-.3-.4-.1-.7C4 3.1 5.9 2 8 2c3.3 0 6 2.7 6 6 0 .3-.2.5-.5.5S13 8.3 13 8c0-2.8-2.2-5-5-5zM2.5 7.5c.3 0 .5.2.5.5 0 2.8 2.2 5 5 5 1.8 0 3.3-.9 4.2-2.3.2-.2.5-.3.7-.1s.3.5.1.7c-1 1.6-2.9 2.7-5 2.7-3.3 0-6-2.7-6-6 0-.3.2-.5.5-.5z" class="st0"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-doc_20x12.svg b/static/legacy/img/pkg-icon-doc_20x12.svg
deleted file mode 100644
index e2a056c..0000000
--- a/static/legacy/img/pkg-icon-doc_20x12.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="12"><defs><path id="a" d="M16 6l-1.41 1.41L19.17 12l-4.58 4.59L16 18l6-6-6-6zM8 18l1.41-1.41L4.83 12l4.58-4.59L8 6l-6 6 6 6z"/></defs><g fill="none" fill-rule="evenodd" transform="translate(-2 -6)"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g fill="#7627BB" mask="url(#b)"><path d="M0 0h24v24H0z"/></g></g></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-file_16x12.svg b/static/legacy/img/pkg-icon-file_16x12.svg
deleted file mode 100644
index 413cbbc..0000000
--- a/static/legacy/img/pkg-icon-file_16x12.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="12" height="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path d="M10.5 1.5h-6c-.825 0-1.493.675-1.493 1.5L3 15c0 .825.667 1.5 1.492 1.5H13.5c.825 0 1.5-.675 1.5-1.5V6l-4.5-4.5zM4.5 15V3h5.25v3.75h3.75V15h-9z" id="a"/></defs><g transform="translate(-3 -1)" fill="none" fill-rule="evenodd"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g mask="url(#b)" fill="#5F6368"><path d="M0 0h18v18H0z"/></g></g></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-folder_20x16.svg b/static/legacy/img/pkg-icon-folder_20x16.svg
deleted file mode 100644
index 2b18852..0000000
--- a/static/legacy/img/pkg-icon-folder_20x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="16"><defs><path id="a" d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z"/></defs><g fill="none" fill-rule="evenodd" transform="translate(-2 -4)"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g fill="#5F6368" mask="url(#b)"><path d="M0 0h24v24H0z"/></g></g></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-github_16x16e.svg b/static/legacy/img/pkg-icon-github_16x16e.svg
deleted file mode 100644
index 9f9858c..0000000
--- a/static/legacy/img/pkg-icon-github_16x16e.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#80868b" fill-rule="evenodd" d="M8.1.7C3.9.7.5 4.1.5 8.3c0 3.4 2.2 6.2 5.2 7.2.4.1.5-.2.5-.4v-1.3c-2.1.5-2.6-1-2.6-1-.3-.9-.8-1.1-.8-1.1-.7-.5.1-.5.1-.5.7.1 1.1.8 1.1.8.7 1.2 1.8.8 2.2.6.1-.5.3-.8.5-1-1.7-.2-3.5-.8-3.5-3.7 0-.8.3-1.5.8-2-.1-.2-.3-1 .1-2 0 0 .6-.2 2.1.8.6-.2 1.3-.3 1.9-.3.6 0 1.3.1 1.9.3 1.4-1 2.1-.8 2.1-.8.4 1 .2 1.8.1 2 .5.5.8 1.2.8 2 0 2.9-1.8 3.6-3.5 3.7.3.2.5.7.5 1.4v2.1c0 .2.1.4.5.4 3-1 5.2-3.8 5.2-7.2C15.6 4.1 12.2.7 8.1.7z" clip-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-help_24x24.svg b/static/legacy/img/pkg-icon-help_24x24.svg
deleted file mode 100644
index 2508a31..0000000
--- a/static/legacy/img/pkg-icon-help_24x24.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path fill="#6e7072" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-info_19x16.svg b/static/legacy/img/pkg-icon-info_19x16.svg
deleted file mode 100644
index ee4d7d7..0000000
--- a/static/legacy/img/pkg-icon-info_19x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" fill="currentcolor" viewBox="0 0 426.667 426.667"><path d="M192 192h42.667v128H192z"/><path d="M213.333 0C95.467 0 0 95.467 0 213.333s95.467 213.333 213.333 213.333S426.667 331.2 426.667 213.333 331.2 0 213.333 0zm0 384c-94.08 0-170.667-76.587-170.667-170.667S119.253 42.667 213.333 42.667 384 119.253 384 213.333 307.413 384 213.333 384z"/><path d="M192 106.667h42.667v42.667H192z"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-jumpTo_16x16.svg b/static/legacy/img/pkg-icon-jumpTo_16x16.svg
deleted file mode 100644
index dcaad7b..0000000
--- a/static/legacy/img/pkg-icon-jumpTo_16x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><defs><filter id="a" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation=".2"/></filter><filter id="c"><feGaussianBlur stdDeviation=".2"/></filter><filter id="b"><feGaussianBlur stdDeviation=".2"/></filter></defs><path fill="none" d="M-1-1h802v602H-1z"/><g><path d="M-1-1h802v602H-1V-1z" fill="none"/><path fill="none" d="M-.823-1h18v18h-18V-1z"/><g fill="#4c4c4c"><path filter="url(#a)" d="M2.169 4h12v1h-12V4z"/><path filter="url(#b)" d="M6.139 10.367h4v1h-4v-1z"/><path filter="url(#c)" d="M4.262 7.13h8v1h-8v-1z"/></g></g></svg>
diff --git a/static/legacy/img/pkg-icon-readme_20x16.svg b/static/legacy/img/pkg-icon-readme_20x16.svg
deleted file mode 100644
index 99ca762..0000000
--- a/static/legacy/img/pkg-icon-readme_20x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 20 16"><defs><path id="a" d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 18V6h7v12H4zm16 0h-7V6h7v12zm-6-9.5h5V10h-5V8.5zm0 2.5h5v1.5h-5V11zm0 2.5h5V15h-5v-1.5z"/></defs><g fill="none" fill-rule="evenodd" transform="translate(-2 -4)"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g fill="#098591" mask="url(#b)"><path d="M0 0h24v24H0z"/></g></g></svg>
\ No newline at end of file
diff --git a/static/legacy/img/pkg-icon-scale_16x16.svg b/static/legacy/img/pkg-icon-scale_16x16.svg
deleted file mode 100644
index 52f1eca..0000000
--- a/static/legacy/img/pkg-icon-scale_16x16.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" x="0" y="0" version="1.1" viewBox="0 0 455 455" xml:space="preserve"><style>.st0{fill:#80868b}</style><path d="M149.4 389.2l-17.9 47.1c-.5 1.3.5 2.7 1.9 2.7h188.2c1.4 0 2.4-1.4 1.9-2.7l-17.9-47.1c-.7-1.9-2.6-3.2-4.7-3.2H154.1c-2.1 0-4 1.3-4.7 3.2z" class="st0"/><path d="M188.6 359.4l-8.7 26c-.4 1.3.5 2.6 1.9 2.6h91.4c1.4 0 2.3-1.3 1.9-2.6l-8.7-26c-.3-.8-1-1.4-1.9-1.4h-74c-.9 0-1.6.5-1.9 1.4zM7.4 252.1c0 36.8 30 66.6 67.1 66.6s67.1-29.8 67.1-66.6H7.4zm306 0c0 36.8 30 66.6 67.1 66.6s67.1-29.8 67.1-66.6H313.4z" class="st0"/><path d="M75.4 173.7L109 253h32.6L98.3 150.8c-.6-1.3.4-2.8 1.8-2.8h49.1c2.1 0 4-1.4 4.7-3.4l13.7-25.3c.3-.8 1-1.3 1.9-1.3h40.9c1.1 0 2 .9 2 2v238h30V120c0-1.1.9-2 2-2h40.4c.9 0 1.6.5 1.9 1.4l13.6 25.3c.7 2 2.6 3.4 4.7 3.4h49.7c1.4 0 2.4 1.5 1.8 2.8L313.4 253H346l33.6-79.3c.3-.8 1.5-.8 1.8 0L415 253h32.6l-55.1-130.1c-1.3-3-4.2-4.9-7.4-4.9h-68.4c-1.9 0-3.7-1.1-4.5-2.9L298.3 90c-.6-1.2-1.8-2-3.2-2h-51.2c-.8 0-1.4-.6-1.4-1.4V75c11.8-6.8 18.5-21.3 13.1-36.7-2.9-8.3-9.6-14.8-17.9-17.6-20.9-6.9-40.2 8.4-40.2 28.3 0 11.1 6 20.8 15 26v11.6c0 .8-.6 1.4-1.4 1.4h-51.6c-1.4 0-2.6.8-3.2 2l-13.4 25c-.8 1.8-2.6 2.9-4.5 2.9H69.9c-3.2 0-6.1 1.9-7.4 4.9L7.4 253H40l33.6-79.3c.3-.9 1.5-.9 1.8 0z" class="st0"/></svg>
\ No newline at end of file
diff --git a/static/legacy/img/severity.svg b/static/legacy/img/severity.svg
deleted file mode 100644
index 75820ba..0000000
--- a/static/legacy/img/severity.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="15" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.452.778l6.222 10.889H1.229L7.452.777zm-.777 7h1.556v-3.89H6.675v3.89zm1.556 2.333H6.675V8.556h1.556v1.555z" fill="#fff"/></svg>
diff --git a/static/legacy/js/clipboard.js b/static/legacy/js/clipboard.js
deleted file mode 100644
index 4bb5c60..0000000
--- a/static/legacy/js/clipboard.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * @license
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */export class CopyToClipboardController{constructor(t){this._el=t,this._data=t.dataset.toCopy??"",t.addEventListener("click",o=>this.handleCopyClick(o))}handleCopyClick(t){t.preventDefault();const o=1e3;if(!navigator.clipboard){this.showTooltipText("Unable to copy",o);return}navigator.clipboard.writeText(this._data).then(()=>{this.showTooltipText("Copied!",o)}).catch(()=>{this.showTooltipText("Unable to copy",o)})}showTooltipText(t,o){this._el.setAttribute("data-tooltip",t),setTimeout(()=>this._el.setAttribute("data-tooltip",""),o)}}
-//# sourceMappingURL=clipboard.js.map
diff --git a/static/legacy/js/clipboard.js.map b/static/legacy/js/clipboard.js.map
deleted file mode 100644
index 0dcdb76..0000000
--- a/static/legacy/js/clipboard.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "version": 3,
-  "sources": ["clipboard.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This class decorates an element to copy arbitrary data attached via a data-\n * attribute to the clipboard.\n */\nexport class CopyToClipboardController {\n  private _el: HTMLButtonElement;\n  /**\n   * The data to be copied to the clipboard.\n   */\n  private _data: string;\n\n  /**\n   * @param el The element that will trigger copying text to the clipboard. The text is\n   * expected to be within its data-to-copy attribute.\n   */\n  constructor(el: HTMLButtonElement) {\n    this._el = el;\n    this._data = el.dataset['toCopy'] ?? '';\n    el.addEventListener('click', e => this.handleCopyClick(e));\n  }\n\n  /**\n   * Handles when the primary element is clicked.\n   */\n  handleCopyClick(e: MouseEvent): void {\n    e.preventDefault();\n    const TOOLTIP_SHOW_DURATION_MS = 1000;\n\n    // This API is not available on iOS.\n    if (!navigator.clipboard) {\n      this.showTooltipText('Unable to copy', TOOLTIP_SHOW_DURATION_MS);\n      return;\n    }\n    navigator.clipboard\n      .writeText(this._data)\n      .then(() => {\n        this.showTooltipText('Copied!', TOOLTIP_SHOW_DURATION_MS);\n      })\n      .catch(() => {\n        this.showTooltipText('Unable to copy', TOOLTIP_SHOW_DURATION_MS);\n      });\n  }\n\n  /**\n   * Shows the given text in a tooltip for a specified amount of time, in milliseconds.\n   */\n  showTooltipText(text: string, durationMs: number): void {\n    this._el.setAttribute('data-tooltip', text);\n    setTimeout(() => this._el.setAttribute('data-tooltip', ''), durationMs);\n  }\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWO,sCAAgC,CAWrC,YAAY,EAAuB,CACjC,KAAK,IAAM,EACX,KAAK,MAAQ,EAAG,QAAQ,QAAa,GACrC,EAAG,iBAAiB,QAAS,GAAK,KAAK,gBAAgB,IAMzD,gBAAgB,EAAqB,CACnC,EAAE,iBACF,KAAM,GAA2B,IAGjC,GAAI,CAAC,UAAU,UAAW,CACxB,KAAK,gBAAgB,iBAAkB,GACvC,OAEF,UAAU,UACP,UAAU,KAAK,OACf,KAAK,IAAM,CACV,KAAK,gBAAgB,UAAW,KAEjC,MAAM,IAAM,CACX,KAAK,gBAAgB,iBAAkB,KAO7C,gBAAgB,EAAc,EAA0B,CACtD,KAAK,IAAI,aAAa,eAAgB,GACtC,WAAW,IAAM,KAAK,IAAI,aAAa,eAAgB,IAAK",
-  "names": []
-}
diff --git a/static/legacy/js/clipboard.test.ts b/static/legacy/js/clipboard.test.ts
deleted file mode 100644
index 28ef5ad..0000000
--- a/static/legacy/js/clipboard.test.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/*!
- * @license
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-import { CopyToClipboardController } from './clipboard';
-
-describe('CopyToClipboardController', () => {
-  let button: HTMLButtonElement;
-  let controller: CopyToClipboardController;
-  const dataToCopy = 'Hello, world!';
-
-  beforeEach(() => {
-    document.body.innerHTML = `
-      <div>
-        <button class="js-copyToClipboard" data-to-copy="${dataToCopy}"></button>
-      </div>
-    `;
-    button = document.querySelector<HTMLButtonElement>('.js-copyToClipboard');
-    controller = new CopyToClipboardController(button);
-  });
-
-  afterEach(() => {
-    document.body.innerHTML = '';
-  });
-
-  it('copys text when clicked', () => {
-    Object.assign(navigator, { clipboard: { writeText: () => Promise.resolve() } });
-    jest.spyOn(navigator.clipboard, 'writeText');
-    button.click();
-    expect(navigator.clipboard.writeText).toHaveBeenCalledWith(dataToCopy);
-  });
-
-  it('shows error when clicked if clipboard is undefined', () => {
-    Object.assign(navigator, { clipboard: undefined });
-    jest.spyOn(controller, 'showTooltipText');
-    button.click();
-    expect(controller.showTooltipText).toHaveBeenCalledWith('Unable to copy', 1000);
-  });
-});
diff --git a/static/legacy/js/clipboard.ts b/static/legacy/js/clipboard.ts
deleted file mode 100644
index 51a43e6..0000000
--- a/static/legacy/js/clipboard.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-/*!
- * @license
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-/**
- * This class decorates an element to copy arbitrary data attached via a data-
- * attribute to the clipboard.
- */
-export class CopyToClipboardController {
-  private _el: HTMLButtonElement;
-  /**
-   * The data to be copied to the clipboard.
-   */
-  private _data: string;
-
-  /**
-   * @param el The element that will trigger copying text to the clipboard. The text is
-   * expected to be within its data-to-copy attribute.
-   */
-  constructor(el: HTMLButtonElement) {
-    this._el = el;
-    this._data = el.dataset['toCopy'] ?? '';
-    el.addEventListener('click', e => this.handleCopyClick(e));
-  }
-
-  /**
-   * Handles when the primary element is clicked.
-   */
-  handleCopyClick(e: MouseEvent): void {
-    e.preventDefault();
-    const TOOLTIP_SHOW_DURATION_MS = 1000;
-
-    // This API is not available on iOS.
-    if (!navigator.clipboard) {
-      this.showTooltipText('Unable to copy', TOOLTIP_SHOW_DURATION_MS);
-      return;
-    }
-    navigator.clipboard
-      .writeText(this._data)
-      .then(() => {
-        this.showTooltipText('Copied!', TOOLTIP_SHOW_DURATION_MS);
-      })
-      .catch(() => {
-        this.showTooltipText('Unable to copy', TOOLTIP_SHOW_DURATION_MS);
-      });
-  }
-
-  /**
-   * Shows the given text in a tooltip for a specified amount of time, in milliseconds.
-   */
-  showTooltipText(text: string, durationMs: number): void {
-    this._el.setAttribute('data-tooltip', text);
-    setTimeout(() => this._el.setAttribute('data-tooltip', ''), durationMs);
-  }
-}
diff --git a/static/legacy/js/jump.js b/static/legacy/js/jump.js
deleted file mode 100644
index 6daa5ab..0000000
--- a/static/legacy/js/jump.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * @license
- * Copyright 2019-2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */const jumpDialog=document.querySelector(".JumpDialog"),jumpBody=jumpDialog?.querySelector(".JumpDialog-body"),jumpList=jumpDialog?.querySelector(".JumpDialog-list"),jumpFilter=jumpDialog?.querySelector(".JumpDialog-input"),searchInput=document.querySelector(".js-searchFocus"),doc=document.querySelector(".js-documentation");function loadPolyfill(){return import(`${window.location.origin}/third_party/dialog-polyfill/dialog-polyfill.esm.js`)}jumpDialog&&!jumpDialog.showModal&&loadPolyfill().then(({default:t})=>{t.registerDialog(jumpDialog)});let jumpListItems;function collectJumpListItems(){const t=[];if(!!doc){for(const e of doc.querySelectorAll("[data-kind]"))t.push(newJumpListItem(e));for(const e of t)e.link.addEventListener("click",function(){jumpDialog?.close()});return t.sort(function(e,n){return e.lower.localeCompare(n.lower)}),t}}function newJumpListItem(t){const e=document.createElement("a"),n=t.getAttribute("id");e.setAttribute("href","#"+n),e.setAttribute("tabindex","-1"),e.setAttribute("data-gtmc","jump to link");const o=t.getAttribute("data-kind");return{link:e,name:n??"",kind:o??"",lower:n?.toLowerCase()??""}}let lastFilterValue,activeJumpItem=-1;function updateJumpList(t){for(lastFilterValue=t,jumpListItems||(jumpListItems=collectJumpListItems()),setActiveJumpItem(-1);jumpList?.firstChild;)jumpList.firstChild.remove();if(t){const e=t.toLowerCase(),n=[],o=[],c=[],l=(i,r,s)=>i.name.substring(0,r)+"<b>"+i.name.substring(r,s)+"</b>"+i.name.substring(s);for(const i of jumpListItems??[]){const r=i.name.toLowerCase();if(r===e)i.link.innerHTML=l(i,0,i.name.length),n.push(i);else if(r.startsWith(e))i.link.innerHTML=l(i,0,t.length),o.push(i);else{const s=r.indexOf(e);s>-1&&(i.link.innerHTML=l(i,s,s+t.length),c.push(i))}}for(const i of n.concat(o).concat(c))jumpList?.appendChild(i.link)}else{if(!jumpListItems||jumpListItems.length===0){const e=document.createElement("i");e.innerHTML="There are no identifiers on this page.",jumpList?.appendChild(e)}for(const e of jumpListItems??[])e.link.innerHTML=e.name+" <i>"+e.kind+"</i>",jumpList?.appendChild(e.link)}jumpBody&&(jumpBody.scrollTop=0),jumpListItems?.length&&jumpList&&jumpList.children.length>0&&setActiveJumpItem(0)}function setActiveJumpItem(t){const e=jumpList?.children;if(!(!e||!jumpBody)){if(activeJumpItem>=0&&e[activeJumpItem].classList.remove("JumpDialog-active"),t>=e.length&&(t=e.length-1),t>=0){e[t].classList.add("JumpDialog-active");const n=e[t].offsetTop-e[0].offsetTop,o=n+e[t].clientHeight;n<jumpBody.scrollTop?jumpBody.scrollTop=n:o>jumpBody.scrollTop+jumpBody.clientHeight&&(jumpBody.scrollTop=o-jumpBody.clientHeight)}activeJumpItem=t}}function incActiveJumpItem(t){if(activeJumpItem<0)return;let e=activeJumpItem+t;e<0&&(e=0),setActiveJumpItem(e)}jumpFilter?.addEventListener("keyup",function(){jumpFilter.value.toUpperCase()!=lastFilterValue.toUpperCase()&&updateJumpList(jumpFilter.value)}),jumpFilter?.addEventListener("keydown",function(t){const e=38,n=40,o=13;switch(t.which){case e:incActiveJumpItem(-1),t.preventDefault();break;case n:incActiveJumpItem(1),t.preventDefault();break;case o:activeJumpItem>=0&&jumpList&&(jumpList.children[activeJumpItem].click(),t.preventDefault());break}});const shortcutsDialog=document.querySelector(".ShortcutsDialog");shortcutsDialog&&!shortcutsDialog.showModal&&loadPolyfill().then(({default:t})=>{t.registerDialog(shortcutsDialog)}),document.addEventListener("keypress",function(t){if(jumpDialog?.open||shortcutsDialog?.open)return;const e=t.target,n=e?.tagName;if(n=="INPUT"||n=="SELECT"||n=="TEXTAREA"||e?.contentEditable=="true"||t.metaKey||t.ctrlKey)return;switch(String.fromCharCode(t.which)){case"f":case"F":t.preventDefault(),jumpFilter&&(jumpFilter.value=""),jumpDialog?.showModal(),updateJumpList("");break;case"?":shortcutsDialog?.showModal();break;case"/":searchInput&&!window.navigator.userAgent.includes("Firefox")&&(t.preventDefault(),searchInput.focus());break}});const jumpOutlineInput=document.querySelector(".js-jumpToInput");jumpOutlineInput&&jumpOutlineInput.addEventListener("click",()=>{jumpFilter&&(jumpFilter.value=""),jumpDialog?.showModal(),updateJumpList("")});
-//# sourceMappingURL=jump.js.map
diff --git a/static/legacy/js/jump.js.map b/static/legacy/js/jump.js.map
deleted file mode 100644
index 85b9eba..0000000
--- a/static/legacy/js/jump.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "version": 3,
-  "sources": ["jump.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2019-2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the behavior of the \"jump to identifer\" dialog for Go\n// package documentation, as well as the simple dialog that displays keyboard\n// shortcuts.\n\n// The DOM for the dialogs is at the bottom of content/static/legacy/html/pages/pkg_doc.tmpl.\n// The CSS is in content/static/legacy/css/stylesheet.css.\n\n// The dialog is activated by pressing the 'f' key. It presents a list\n// (#JumpDialog-list) of all Go identifiers displayed in the documentation.\n// Entering text in the dialog's text box (#JumpDialog-filter) restricts the\n// list to identifiers containing the text. Clicking on an identifier jumps to\n// its documentation.\n\n// This code is based on\n// https://go.googlesource.com/gddo/+/refs/heads/master/gddo-server/assets/site.js.\n// It was modified to remove the dependence on jquery and bootstrap.\n\nconst jumpDialog = document.querySelector<HTMLDialogElement>('.JumpDialog');\nconst jumpBody = jumpDialog?.querySelector<HTMLDivElement>('.JumpDialog-body');\nconst jumpList = jumpDialog?.querySelector<HTMLDivElement>('.JumpDialog-list');\nconst jumpFilter = jumpDialog?.querySelector<HTMLInputElement>('.JumpDialog-input');\nconst searchInput = document.querySelector<HTMLInputElement>('.js-searchFocus');\nconst doc = document.querySelector<HTMLDivElement>('.js-documentation');\n\nfunction loadPolyfill() {\n  return import(`${window.location.origin}/third_party/dialog-polyfill/dialog-polyfill.esm.js`);\n}\n\nif (jumpDialog && !jumpDialog.showModal) {\n  loadPolyfill().then(({ default: dialogPolyfill }) => {\n    dialogPolyfill.registerDialog(jumpDialog);\n  });\n}\n\ninterface JumpListItem {\n  link: HTMLAnchorElement;\n  name: string;\n  kind: string;\n  lower: string;\n}\n\nlet jumpListItems: JumpListItem[] | undefined; // All the identifiers in the doc; computed only once.\n\n// collectJumpListItems returns a list of items, one for each identifier in the\n// documentation on the current page.\n//\n// It uses the data-kind attribute generated in the documentation HTML to find\n// the identifiers and their id attributes.\n//\n// If there are no data-kind attributes, then we have older doc; fall back to\n// a less precise method.\nfunction collectJumpListItems() {\n  const items = [];\n  if (!doc) return;\n  for (const el of doc.querySelectorAll('[data-kind]')) {\n    items.push(newJumpListItem(el));\n  }\n\n  // Clicking on any of the links closes the dialog.\n  for (const item of items) {\n    item.link.addEventListener('click', function () {\n      jumpDialog?.close();\n    });\n  }\n  // Sort case-insensitively by identifier name.\n  items.sort(function (a, b) {\n    return a.lower.localeCompare(b.lower);\n  });\n  return items;\n}\n\n// newJumpListItem creates a new item for the DOM element el.\n// An item is an object with:\n// - name: the element's id (which is the identifer name)\n// - kind: the element's kind (function, variable, etc.),\n// - link: a link ('a' tag) to the element\n// - lower: the name in lower case, just for sorting\nfunction newJumpListItem(el: Element): JumpListItem {\n  const a = document.createElement('a');\n  const name = el.getAttribute('id');\n  a.setAttribute('href', '#' + name);\n  a.setAttribute('tabindex', '-1');\n  a.setAttribute('data-gtmc', 'jump to link');\n  const kind = el.getAttribute('data-kind');\n  return {\n    link: a,\n    name: name ?? '',\n    kind: kind ?? '',\n    lower: name?.toLowerCase() ?? '', // for sorting\n  };\n}\n\nlet lastFilterValue: string; // The last contents of the filter text box.\nlet activeJumpItem = -1; // The index of the currently active item in the list.\n\n// updateJumpList sets the elements of the dialog list to\n// everything whose name contains filter.\nfunction updateJumpList(filter: string) {\n  lastFilterValue = filter;\n  if (!jumpListItems) {\n    jumpListItems = collectJumpListItems();\n  }\n  setActiveJumpItem(-1);\n\n  // Remove all children from list.\n  while (jumpList?.firstChild) {\n    jumpList.firstChild.remove();\n  }\n\n  if (filter) {\n    // A filter is set. We treat the filter as a substring that can appear in\n    // an item name (case insensitive), and find the following matches - in\n    // order of priority:\n    //\n    // 1. Exact matches (the filter matches the item's name exactly)\n    // 2. Prefix matches (the item's name starts with filter)\n    // 3. Infix matches (the filter is a substring of the item's name)\n    const filterLowerCase = filter.toLowerCase();\n\n    const exactMatches = [];\n    const prefixMatches = [];\n    const infixMatches = [];\n\n    // makeLinkHtml creates the link name HTML for a list item. item is the DOM\n    // item. item.name.substr(boldStart, boldEnd) will be bolded.\n    const makeLinkHtml = (item: JumpListItem, boldStart: number, boldEnd: number) => {\n      return (\n        item.name.substring(0, boldStart) +\n        '<b>' +\n        item.name.substring(boldStart, boldEnd) +\n        '</b>' +\n        item.name.substring(boldEnd)\n      );\n    };\n\n    for (const item of jumpListItems ?? []) {\n      const nameLowerCase = item.name.toLowerCase();\n\n      if (nameLowerCase === filterLowerCase) {\n        item.link.innerHTML = makeLinkHtml(item, 0, item.name.length);\n        exactMatches.push(item);\n      } else if (nameLowerCase.startsWith(filterLowerCase)) {\n        item.link.innerHTML = makeLinkHtml(item, 0, filter.length);\n        prefixMatches.push(item);\n      } else {\n        const index = nameLowerCase.indexOf(filterLowerCase);\n        if (index > -1) {\n          item.link.innerHTML = makeLinkHtml(item, index, index + filter.length);\n          infixMatches.push(item);\n        }\n      }\n    }\n\n    for (const item of exactMatches.concat(prefixMatches).concat(infixMatches)) {\n      jumpList?.appendChild(item.link);\n    }\n  } else {\n    if (!jumpListItems || jumpListItems.length === 0) {\n      const msg = document.createElement('i');\n      msg.innerHTML = 'There are no identifiers on this page.';\n      jumpList?.appendChild(msg);\n    }\n    // No filter set; display all items in their existing order.\n    for (const item of jumpListItems ?? []) {\n      item.link.innerHTML = item.name + ' <i>' + item.kind + '</i>';\n      jumpList?.appendChild(item.link);\n    }\n  }\n\n  if (jumpBody) {\n    jumpBody.scrollTop = 0;\n  }\n  if (jumpListItems?.length && jumpList && jumpList.children.length > 0) {\n    setActiveJumpItem(0);\n  }\n}\n\n// Set the active jump item to n.\nfunction setActiveJumpItem(n: number) {\n  const cs = jumpList?.children as HTMLCollectionOf<HTMLElement> | null | undefined;\n  if (!cs || !jumpBody) {\n    return;\n  }\n  if (activeJumpItem >= 0) {\n    cs[activeJumpItem].classList.remove('JumpDialog-active');\n  }\n  if (n >= cs.length) {\n    n = cs.length - 1;\n  }\n  if (n >= 0) {\n    cs[n].classList.add('JumpDialog-active');\n\n    // Scroll so the active item is visible.\n    // For some reason cs[n].scrollIntoView() doesn't behave as I'd expect:\n    // it moves the entire dialog box in the viewport.\n\n    // Get the top and bottom of the active item relative to jumpBody.\n    const activeTop = cs[n].offsetTop - cs[0].offsetTop;\n    const activeBottom = activeTop + cs[n].clientHeight;\n    if (activeTop < jumpBody.scrollTop) {\n      // Off the top; scroll up.\n      jumpBody.scrollTop = activeTop;\n    } else if (activeBottom > jumpBody.scrollTop + jumpBody.clientHeight) {\n      // Off the bottom; scroll down.\n      jumpBody.scrollTop = activeBottom - jumpBody.clientHeight;\n    }\n  }\n  activeJumpItem = n;\n}\n\n// Increment the activeJumpItem by delta.\nfunction incActiveJumpItem(delta: number) {\n  if (activeJumpItem < 0) {\n    return;\n  }\n  let n = activeJumpItem + delta;\n  if (n < 0) {\n    n = 0;\n  }\n  setActiveJumpItem(n);\n}\n\n// Pressing a key in the filter updates the list (if the filter actually changed).\njumpFilter?.addEventListener('keyup', function () {\n  if (jumpFilter.value.toUpperCase() != lastFilterValue.toUpperCase()) {\n    updateJumpList(jumpFilter.value);\n  }\n});\n\n// Pressing enter in the filter selects the first element in the list.\njumpFilter?.addEventListener('keydown', function (event) {\n  const upArrow = 38;\n  const downArrow = 40;\n  const enterKey = 13;\n  switch (event.which) {\n    case upArrow:\n      incActiveJumpItem(-1);\n      event.preventDefault();\n      break;\n    case downArrow:\n      incActiveJumpItem(1);\n      event.preventDefault();\n      break;\n    case enterKey:\n      if (activeJumpItem >= 0) {\n        if (jumpList) {\n          (jumpList.children[activeJumpItem] as HTMLElement).click();\n          event.preventDefault();\n        }\n      }\n      break;\n  }\n});\n\nconst shortcutsDialog = document.querySelector<HTMLDialogElement>('.ShortcutsDialog');\nif (shortcutsDialog && !shortcutsDialog.showModal) {\n  loadPolyfill().then(({ default: dialogPolyfill }) => {\n    dialogPolyfill.registerDialog(shortcutsDialog);\n  });\n}\n\n// Keyboard shortcuts:\n// - Pressing '/' focuses the search box\n// - Pressing 'f' or 'F' opens the jump-to-identifier dialog.\n// - Pressing '?' opens up the shortcut dialog.\n// Ignore a keypress if a dialog is already open, or if it is pressed on a\n// component that wants to consume it.\ndocument.addEventListener('keypress', function (e) {\n  if (jumpDialog?.open || shortcutsDialog?.open) {\n    return;\n  }\n  const target = e.target as HTMLElement | null;\n  const t = target?.tagName;\n  if (t == 'INPUT' || t == 'SELECT' || t == 'TEXTAREA') {\n    return;\n  }\n  if (target?.contentEditable == 'true') {\n    return;\n  }\n  if (e.metaKey || e.ctrlKey) {\n    return;\n  }\n  const ch = String.fromCharCode(e.which);\n  switch (ch) {\n    case 'f':\n    case 'F':\n      e.preventDefault();\n      if (jumpFilter) {\n        jumpFilter.value = '';\n      }\n      jumpDialog?.showModal();\n      updateJumpList('');\n      break;\n    case '?':\n      shortcutsDialog?.showModal();\n      break;\n    case '/':\n      // Favoring the Firefox quick find feature over search input\n      // focus. See: https://github.com/golang/go/issues/41093.\n      if (searchInput && !window.navigator.userAgent.includes('Firefox')) {\n        e.preventDefault();\n        searchInput.focus();\n      }\n      break;\n  }\n});\n\nconst jumpOutlineInput = document.querySelector('.js-jumpToInput');\nif (jumpOutlineInput) {\n  jumpOutlineInput.addEventListener('click', () => {\n    if (jumpFilter) {\n      jumpFilter.value = '';\n    }\n    jumpDialog?.showModal();\n    updateJumpList('');\n  });\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAwBA,KAAM,YAAa,SAAS,cAAiC,eACvD,SAAW,YAAY,cAA8B,oBACrD,SAAW,YAAY,cAA8B,oBACrD,WAAa,YAAY,cAAgC,qBACzD,YAAc,SAAS,cAAgC,mBACvD,IAAM,SAAS,cAA8B,qBAEnD,uBAAwB,CACtB,MAAc,WAAG,OAAO,SAAS,6DAGnC,AAAI,YAAc,CAAC,WAAW,WAC5B,eAAe,KAAK,CAAC,CAAE,QAAS,KAAqB,CACnD,EAAe,eAAe,cAWlC,GAAI,eAUJ,+BAAgC,CAC9B,KAAM,GAAQ,GACd,GAAI,EAAC,IACL,UAAW,KAAM,KAAI,iBAAiB,eACpC,EAAM,KAAK,gBAAgB,IAI7B,SAAW,KAAQ,GACjB,EAAK,KAAK,iBAAiB,QAAS,UAAY,CAC9C,YAAY,UAIhB,SAAM,KAAK,SAAU,EAAG,EAAG,CACzB,MAAO,GAAE,MAAM,cAAc,EAAE,SAE1B,GAST,yBAAyB,EAA2B,CAClD,KAAM,GAAI,SAAS,cAAc,KAC3B,EAAO,EAAG,aAAa,MAC7B,EAAE,aAAa,OAAQ,IAAM,GAC7B,EAAE,aAAa,WAAY,MAC3B,EAAE,aAAa,YAAa,gBAC5B,KAAM,GAAO,EAAG,aAAa,aAC7B,MAAO,CACL,KAAM,EACN,KAAM,GAAQ,GACd,KAAM,GAAQ,GACd,MAAO,GAAM,eAAiB,IAIlC,GAAI,iBACA,eAAiB,GAIrB,wBAAwB,EAAgB,CAQtC,IAPA,gBAAkB,EACb,eACH,eAAgB,wBAElB,kBAAkB,IAGX,UAAU,YACf,SAAS,WAAW,SAGtB,GAAI,EAAQ,CAQV,KAAM,GAAkB,EAAO,cAEzB,EAAe,GACf,EAAgB,GAChB,EAAe,GAIf,EAAe,CAAC,EAAoB,EAAmB,IAEzD,EAAK,KAAK,UAAU,EAAG,GACvB,MACA,EAAK,KAAK,UAAU,EAAW,GAC/B,OACA,EAAK,KAAK,UAAU,GAIxB,SAAW,KAAQ,gBAAiB,GAAI,CACtC,KAAM,GAAgB,EAAK,KAAK,cAEhC,GAAI,IAAkB,EACpB,EAAK,KAAK,UAAY,EAAa,EAAM,EAAG,EAAK,KAAK,QACtD,EAAa,KAAK,WACT,EAAc,WAAW,GAClC,EAAK,KAAK,UAAY,EAAa,EAAM,EAAG,EAAO,QACnD,EAAc,KAAK,OACd,CACL,KAAM,GAAQ,EAAc,QAAQ,GACpC,AAAI,EAAQ,IACV,GAAK,KAAK,UAAY,EAAa,EAAM,EAAO,EAAQ,EAAO,QAC/D,EAAa,KAAK,KAKxB,SAAW,KAAQ,GAAa,OAAO,GAAe,OAAO,GAC3D,UAAU,YAAY,EAAK,UAExB,CACL,GAAI,CAAC,eAAiB,cAAc,SAAW,EAAG,CAChD,KAAM,GAAM,SAAS,cAAc,KACnC,EAAI,UAAY,yCAChB,UAAU,YAAY,GAGxB,SAAW,KAAQ,gBAAiB,GAClC,EAAK,KAAK,UAAY,EAAK,KAAO,OAAS,EAAK,KAAO,OACvD,UAAU,YAAY,EAAK,MAI/B,AAAI,UACF,UAAS,UAAY,GAEnB,eAAe,QAAU,UAAY,SAAS,SAAS,OAAS,GAClE,kBAAkB,GAKtB,2BAA2B,EAAW,CACpC,KAAM,GAAK,UAAU,SACrB,GAAI,GAAC,GAAM,CAAC,UASZ,IANI,gBAAkB,GACpB,EAAG,gBAAgB,UAAU,OAAO,qBAElC,GAAK,EAAG,QACV,GAAI,EAAG,OAAS,GAEd,GAAK,EAAG,CACV,EAAG,GAAG,UAAU,IAAI,qBAOpB,KAAM,GAAY,EAAG,GAAG,UAAY,EAAG,GAAG,UACpC,EAAe,EAAY,EAAG,GAAG,aACvC,AAAI,EAAY,SAAS,UAEvB,SAAS,UAAY,EACZ,EAAe,SAAS,UAAY,SAAS,cAEtD,UAAS,UAAY,EAAe,SAAS,cAGjD,eAAiB,GAInB,2BAA2B,EAAe,CACxC,GAAI,eAAiB,EACnB,OAEF,GAAI,GAAI,eAAiB,EACzB,AAAI,EAAI,GACN,GAAI,GAEN,kBAAkB,GAIpB,YAAY,iBAAiB,QAAS,UAAY,CAChD,AAAI,WAAW,MAAM,eAAiB,gBAAgB,eACpD,eAAe,WAAW,SAK9B,YAAY,iBAAiB,UAAW,SAAU,EAAO,CACvD,KAAM,GAAU,GACV,EAAY,GACZ,EAAW,GACjB,OAAQ,EAAM,WACP,GACH,kBAAkB,IAClB,EAAM,iBACN,UACG,GACH,kBAAkB,GAClB,EAAM,iBACN,UACG,GACH,AAAI,gBAAkB,GAChB,UACD,UAAS,SAAS,gBAAgC,QACnD,EAAM,kBAGV,SAIN,KAAM,iBAAkB,SAAS,cAAiC,oBAClE,AAAI,iBAAmB,CAAC,gBAAgB,WACtC,eAAe,KAAK,CAAC,CAAE,QAAS,KAAqB,CACnD,EAAe,eAAe,mBAUlC,SAAS,iBAAiB,WAAY,SAAU,EAAG,CACjD,GAAI,YAAY,MAAQ,iBAAiB,KACvC,OAEF,KAAM,GAAS,EAAE,OACX,EAAI,GAAQ,QAOlB,GANI,GAAK,SAAW,GAAK,UAAY,GAAK,YAGtC,GAAQ,iBAAmB,QAG3B,EAAE,SAAW,EAAE,QACjB,OAGF,OADW,OAAO,aAAa,EAAE,YAE1B,QACA,IACH,EAAE,iBACE,YACF,YAAW,MAAQ,IAErB,YAAY,YACZ,eAAe,IACf,UACG,IACH,iBAAiB,YACjB,UACG,IAGH,AAAI,aAAe,CAAC,OAAO,UAAU,UAAU,SAAS,YACtD,GAAE,iBACF,YAAY,SAEd,SAIN,KAAM,kBAAmB,SAAS,cAAc,mBAChD,AAAI,kBACF,iBAAiB,iBAAiB,QAAS,IAAM,CAC/C,AAAI,YACF,YAAW,MAAQ,IAErB,YAAY,YACZ,eAAe",
-  "names": []
-}
diff --git a/static/legacy/js/jump.ts b/static/legacy/js/jump.ts
deleted file mode 100644
index 5ae899f..0000000
--- a/static/legacy/js/jump.ts
+++ /dev/null
@@ -1,324 +0,0 @@
-/*!
- * @license
- * Copyright 2019-2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-// This file implements the behavior of the "jump to symbol" dialog for Go
-// package documentation, as well as the simple dialog that displays keyboard
-// shortcuts.
-
-// The DOM for the dialogs is at the bottom of content/static/legacy/html/pages/pkg_doc.tmpl.
-// The CSS is in content/static/legacy/css/stylesheet.css.
-
-// The dialog is activated by pressing the 'f' key. It presents a list
-// (#JumpDialog-list) of all Go symbols displayed in the documentation.
-// Entering text in the dialog's text box (#JumpDialog-filter) restricts the
-// list to symbols containing the text. Clicking on an symbol jumps to
-// its documentation.
-
-// This code is based on
-// https://go.googlesource.com/gddo/+/refs/heads/master/gddo-server/assets/site.js.
-// It was modified to remove the dependence on jquery and bootstrap.
-
-const jumpDialog = document.querySelector<HTMLDialogElement>('.JumpDialog');
-const jumpBody = jumpDialog?.querySelector<HTMLDivElement>('.JumpDialog-body');
-const jumpList = jumpDialog?.querySelector<HTMLDivElement>('.JumpDialog-list');
-const jumpFilter = jumpDialog?.querySelector<HTMLInputElement>('.JumpDialog-input');
-const searchInput = document.querySelector<HTMLInputElement>('.js-searchFocus');
-const doc = document.querySelector<HTMLDivElement>('.js-documentation');
-
-function loadPolyfill() {
-  return import(`${window.location.origin}/third_party/dialog-polyfill/dialog-polyfill.esm.js`);
-}
-
-if (jumpDialog && !jumpDialog.showModal) {
-  loadPolyfill().then(({ default: dialogPolyfill }) => {
-    dialogPolyfill.registerDialog(jumpDialog);
-  });
-}
-
-interface JumpListItem {
-  link: HTMLAnchorElement;
-  name: string;
-  kind: string;
-  lower: string;
-}
-
-let jumpListItems: JumpListItem[] | undefined; // All the symbols in the doc; computed only once.
-
-// collectJumpListItems returns a list of items, one for each symbol in the
-// documentation on the current page.
-//
-// It uses the data-kind attribute generated in the documentation HTML to find
-// the symbols and their id attributes.
-//
-// If there are no data-kind attributes, then we have older doc; fall back to
-// a less precise method.
-function collectJumpListItems() {
-  const items = [];
-  if (!doc) return;
-  for (const el of doc.querySelectorAll('[data-kind]')) {
-    items.push(newJumpListItem(el));
-  }
-
-  // Clicking on any of the links closes the dialog.
-  for (const item of items) {
-    item.link.addEventListener('click', function () {
-      jumpDialog?.close();
-    });
-  }
-  // Sort case-insensitively by symbol name.
-  items.sort(function (a, b) {
-    return a.lower.localeCompare(b.lower);
-  });
-  return items;
-}
-
-// newJumpListItem creates a new item for the DOM element el.
-// An item is an object with:
-// - name: the element's id (which is the identifer name)
-// - kind: the element's kind (function, variable, etc.),
-// - link: a link ('a' tag) to the element
-// - lower: the name in lower case, just for sorting
-function newJumpListItem(el: Element): JumpListItem {
-  const a = document.createElement('a');
-  const name = el.getAttribute('id');
-  a.setAttribute('href', '#' + name);
-  a.setAttribute('tabindex', '-1');
-  a.setAttribute('data-gtmc', 'jump to link');
-  const kind = el.getAttribute('data-kind');
-  return {
-    link: a,
-    name: name ?? '',
-    kind: kind ?? '',
-    lower: name?.toLowerCase() ?? '', // for sorting
-  };
-}
-
-let lastFilterValue: string; // The last contents of the filter text box.
-let activeJumpItem = -1; // The index of the currently active item in the list.
-
-// updateJumpList sets the elements of the dialog list to
-// everything whose name contains filter.
-function updateJumpList(filter: string) {
-  lastFilterValue = filter;
-  if (!jumpListItems) {
-    jumpListItems = collectJumpListItems();
-  }
-  setActiveJumpItem(-1);
-
-  // Remove all children from list.
-  while (jumpList?.firstChild) {
-    jumpList.firstChild.remove();
-  }
-
-  if (filter) {
-    // A filter is set. We treat the filter as a substring that can appear in
-    // an item name (case insensitive), and find the following matches - in
-    // order of priority:
-    //
-    // 1. Exact matches (the filter matches the item's name exactly)
-    // 2. Prefix matches (the item's name starts with filter)
-    // 3. Infix matches (the filter is a substring of the item's name)
-    const filterLowerCase = filter.toLowerCase();
-
-    const exactMatches = [];
-    const prefixMatches = [];
-    const infixMatches = [];
-
-    // makeLinkHtml creates the link name HTML for a list item. item is the DOM
-    // item. item.name.substr(boldStart, boldEnd) will be bolded.
-    const makeLinkHtml = (item: JumpListItem, boldStart: number, boldEnd: number) => {
-      return (
-        item.name.substring(0, boldStart) +
-        '<b>' +
-        item.name.substring(boldStart, boldEnd) +
-        '</b>' +
-        item.name.substring(boldEnd)
-      );
-    };
-
-    for (const item of jumpListItems ?? []) {
-      const nameLowerCase = item.name.toLowerCase();
-
-      if (nameLowerCase === filterLowerCase) {
-        item.link.innerHTML = makeLinkHtml(item, 0, item.name.length);
-        exactMatches.push(item);
-      } else if (nameLowerCase.startsWith(filterLowerCase)) {
-        item.link.innerHTML = makeLinkHtml(item, 0, filter.length);
-        prefixMatches.push(item);
-      } else {
-        const index = nameLowerCase.indexOf(filterLowerCase);
-        if (index > -1) {
-          item.link.innerHTML = makeLinkHtml(item, index, index + filter.length);
-          infixMatches.push(item);
-        }
-      }
-    }
-
-    for (const item of exactMatches.concat(prefixMatches).concat(infixMatches)) {
-      jumpList?.appendChild(item.link);
-    }
-  } else {
-    if (!jumpListItems || jumpListItems.length === 0) {
-      const msg = document.createElement('i');
-      msg.innerHTML = 'There are no symbols on this page.';
-      jumpList?.appendChild(msg);
-    }
-    // No filter set; display all items in their existing order.
-    for (const item of jumpListItems ?? []) {
-      item.link.innerHTML = item.name + ' <i>' + item.kind + '</i>';
-      jumpList?.appendChild(item.link);
-    }
-  }
-
-  if (jumpBody) {
-    jumpBody.scrollTop = 0;
-  }
-  if (jumpListItems?.length && jumpList && jumpList.children.length > 0) {
-    setActiveJumpItem(0);
-  }
-}
-
-// Set the active jump item to n.
-function setActiveJumpItem(n: number) {
-  const cs = jumpList?.children as HTMLCollectionOf<HTMLElement> | null | undefined;
-  if (!cs || !jumpBody) {
-    return;
-  }
-  if (activeJumpItem >= 0) {
-    cs[activeJumpItem].classList.remove('JumpDialog-active');
-  }
-  if (n >= cs.length) {
-    n = cs.length - 1;
-  }
-  if (n >= 0) {
-    cs[n].classList.add('JumpDialog-active');
-
-    // Scroll so the active item is visible.
-    // For some reason cs[n].scrollIntoView() doesn't behave as I'd expect:
-    // it moves the entire dialog box in the viewport.
-
-    // Get the top and bottom of the active item relative to jumpBody.
-    const activeTop = cs[n].offsetTop - cs[0].offsetTop;
-    const activeBottom = activeTop + cs[n].clientHeight;
-    if (activeTop < jumpBody.scrollTop) {
-      // Off the top; scroll up.
-      jumpBody.scrollTop = activeTop;
-    } else if (activeBottom > jumpBody.scrollTop + jumpBody.clientHeight) {
-      // Off the bottom; scroll down.
-      jumpBody.scrollTop = activeBottom - jumpBody.clientHeight;
-    }
-  }
-  activeJumpItem = n;
-}
-
-// Increment the activeJumpItem by delta.
-function incActiveJumpItem(delta: number) {
-  if (activeJumpItem < 0) {
-    return;
-  }
-  let n = activeJumpItem + delta;
-  if (n < 0) {
-    n = 0;
-  }
-  setActiveJumpItem(n);
-}
-
-// Pressing a key in the filter updates the list (if the filter actually changed).
-jumpFilter?.addEventListener('keyup', function () {
-  if (jumpFilter.value.toUpperCase() != lastFilterValue.toUpperCase()) {
-    updateJumpList(jumpFilter.value);
-  }
-});
-
-// Pressing enter in the filter selects the first element in the list.
-jumpFilter?.addEventListener('keydown', function (event) {
-  const upArrow = 38;
-  const downArrow = 40;
-  const enterKey = 13;
-  switch (event.which) {
-    case upArrow:
-      incActiveJumpItem(-1);
-      event.preventDefault();
-      break;
-    case downArrow:
-      incActiveJumpItem(1);
-      event.preventDefault();
-      break;
-    case enterKey:
-      if (activeJumpItem >= 0) {
-        if (jumpList) {
-          (jumpList.children[activeJumpItem] as HTMLElement).click();
-          event.preventDefault();
-        }
-      }
-      break;
-  }
-});
-
-const shortcutsDialog = document.querySelector<HTMLDialogElement>('.ShortcutsDialog');
-if (shortcutsDialog && !shortcutsDialog.showModal) {
-  loadPolyfill().then(({ default: dialogPolyfill }) => {
-    dialogPolyfill.registerDialog(shortcutsDialog);
-  });
-}
-
-// Keyboard shortcuts:
-// - Pressing '/' focuses the search box
-// - Pressing 'f' or 'F' opens the jump-to-symbol dialog.
-// - Pressing '?' opens up the shortcut dialog.
-// Ignore a keypress if a dialog is already open, or if it is pressed on a
-// component that wants to consume it.
-document.addEventListener('keypress', function (e) {
-  if (jumpDialog?.open || shortcutsDialog?.open) {
-    return;
-  }
-  const target = e.target as HTMLElement | null;
-  const t = target?.tagName;
-  if (t == 'INPUT' || t == 'SELECT' || t == 'TEXTAREA') {
-    return;
-  }
-  if (target?.contentEditable == 'true') {
-    return;
-  }
-  if (e.metaKey || e.ctrlKey) {
-    return;
-  }
-  const ch = String.fromCharCode(e.which);
-  switch (ch) {
-    case 'f':
-    case 'F':
-      e.preventDefault();
-      if (jumpFilter) {
-        jumpFilter.value = '';
-      }
-      jumpDialog?.showModal();
-      updateJumpList('');
-      break;
-    case '?':
-      shortcutsDialog?.showModal();
-      break;
-    case '/':
-      // Favoring the Firefox quick find feature over search input
-      // focus. See: https://github.com/golang/go/issues/41093.
-      if (searchInput && !window.navigator.userAgent.includes('Firefox')) {
-        e.preventDefault();
-        searchInput.focus();
-      }
-      break;
-  }
-});
-
-const jumpOutlineInput = document.querySelector('.js-jumpToInput');
-if (jumpOutlineInput) {
-  jumpOutlineInput.addEventListener('click', () => {
-    if (jumpFilter) {
-      jumpFilter.value = '';
-    }
-    jumpDialog?.showModal();
-    updateJumpList('');
-  });
-}
diff --git a/static/legacy/js/keyboard.js b/static/legacy/js/keyboard.js
deleted file mode 100644
index e990223..0000000
--- a/static/legacy/js/keyboard.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * @license
- * Copyright 2019-2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */const canonicalURLPath=document.querySelector(".js-canonicalURLPath")?.dataset.canonicalUrlPath;canonicalURLPath&&canonicalURLPath!==""&&document.addEventListener("keydown",t=>{const e=t.target?.tagName;if(!(e==="INPUT"||e==="SELECT"||e==="TEXTAREA")&&!t.target?.isContentEditable&&!(t.metaKey||t.ctrlKey))switch(t.key){case"y":window.history.replaceState(null,"",canonicalURLPath);break}});
-//# sourceMappingURL=keyboard.js.map
diff --git a/static/legacy/js/keyboard.js.map b/static/legacy/js/keyboard.js.map
deleted file mode 100644
index 199162f..0000000
--- a/static/legacy/js/keyboard.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "version": 3,
-  "sources": ["keyboard.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2019-2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the behavior of the keyboard shortcut which allows\n// for users to press 'y' to to change browser URL to the canonical URL\n// without triggering a reload.\n\nconst canonicalURLPath = document.querySelector<HTMLDivElement>('.js-canonicalURLPath')?.dataset[\n  'canonicalUrlPath'\n];\nif (canonicalURLPath && canonicalURLPath !== '') {\n  document.addEventListener('keydown', e => {\n    // TODO(golang.org/issue/40246): consolidate keyboard shortcut behavior across the site.\n    const t = (e.target as HTMLElement)?.tagName;\n    if (t === 'INPUT' || t === 'SELECT' || t === 'TEXTAREA') {\n      return;\n    }\n    if ((e.target as HTMLElement)?.isContentEditable) {\n      return;\n    }\n    if (e.metaKey || e.ctrlKey) {\n      return;\n    }\n    switch (e.key) {\n      case 'y':\n        window.history.replaceState(null, '', canonicalURLPath);\n        break;\n    }\n  });\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWA,KAAM,kBAAmB,SAAS,cAA8B,yBAAyB,QACvF,iBAEF,AAAI,kBAAoB,mBAAqB,IAC3C,SAAS,iBAAiB,UAAW,GAAK,CAExC,KAAM,GAAK,EAAE,QAAwB,QACrC,GAAI,MAAM,SAAW,IAAM,UAAY,IAAM,aAGxC,GAAE,QAAwB,mBAG3B,IAAE,SAAW,EAAE,SAGnB,OAAQ,EAAE,SACH,IACH,OAAO,QAAQ,aAAa,KAAM,GAAI,kBACtC",
-  "names": []
-}
diff --git a/static/legacy/js/keyboard.ts b/static/legacy/js/keyboard.ts
deleted file mode 100644
index d3fdaed..0000000
--- a/static/legacy/js/keyboard.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/*!
- * @license
- * Copyright 2019-2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-// This file implements the behavior of the keyboard shortcut which allows
-// for users to press 'y' to to change browser URL to the canonical URL
-// without triggering a reload.
-
-const canonicalURLPath = document.querySelector<HTMLDivElement>('.js-canonicalURLPath')?.dataset[
-  'canonicalUrlPath'
-];
-if (canonicalURLPath && canonicalURLPath !== '') {
-  document.addEventListener('keydown', e => {
-    // TODO(golang.org/issue/40246): consolidate keyboard shortcut behavior across the site.
-    const t = (e.target as HTMLElement)?.tagName;
-    if (t === 'INPUT' || t === 'SELECT' || t === 'TEXTAREA') {
-      return;
-    }
-    if ((e.target as HTMLElement)?.isContentEditable) {
-      return;
-    }
-    if (e.metaKey || e.ctrlKey) {
-      return;
-    }
-    switch (e.key) {
-      case 'y':
-        window.history.replaceState(null, '', canonicalURLPath);
-        break;
-    }
-  });
-}
diff --git a/static/legacy/js/playground.js b/static/legacy/js/playground.js
deleted file mode 100644
index b608aed..0000000
--- a/static/legacy/js/playground.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * @license
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */const n={PLAY_HREF:".js-exampleHref",PLAY_CONTAINER:".js-exampleContainer",EXAMPLE_INPUT:".Documentation-exampleCode",EXAMPLE_OUTPUT:".Documentation-exampleOutput",EXAMPLE_ERROR:".Documentation-exampleError",PLAY_BUTTON:".Documentation-examplePlayButton",SHARE_BUTTON:".Documentation-exampleShareButton",FORMAT_BUTTON:".Documentation-exampleFormatButton",RUN_BUTTON:".Documentation-exampleRunButton"};export class PlaygroundExampleController{constructor(t){this.exampleEl=t;this.exampleEl=t,this.anchorEl=t.querySelector("a"),this.errorEl=t.querySelector(n.EXAMPLE_ERROR),this.playButtonEl=t.querySelector(n.PLAY_BUTTON),this.shareButtonEl=t.querySelector(n.SHARE_BUTTON),this.formatButtonEl=t.querySelector(n.FORMAT_BUTTON),this.runButtonEl=t.querySelector(n.RUN_BUTTON),this.inputEl=this.makeTextArea(t.querySelector(n.EXAMPLE_INPUT)),this.outputEl=t.querySelector(n.EXAMPLE_OUTPUT),this.playButtonEl?.addEventListener("click",()=>this.handleShareButtonClick()),this.shareButtonEl?.addEventListener("click",()=>this.handleShareButtonClick()),this.formatButtonEl?.addEventListener("click",()=>this.handleFormatButtonClick()),this.runButtonEl?.addEventListener("click",()=>this.handleRunButtonClick()),!!this.inputEl&&(this.resize(),this.inputEl.addEventListener("keyup",()=>this.resize()),this.inputEl.addEventListener("keydown",e=>this.onKeydown(e)))}makeTextArea(t){const e=document.createElement("textarea");return e.classList.add("Documentation-exampleCode"),e.spellcheck=!1,e.value=t?.textContent??"",t?.parentElement?.replaceChild(e,t),e}getAnchorHash(){return this.anchorEl?.hash}expand(){this.exampleEl.open=!0}resize(){if(this.inputEl?.value){const t=(this.inputEl.value.match(/\n/g)||[]).length;this.inputEl.style.height=`${(20+t*20+12+2)/16}rem`}}onKeydown(t){t.key==="Tab"&&(document.execCommand("insertText",!1,"	"),t.preventDefault())}setInputText(t){this.inputEl&&(this.inputEl.value=t)}setOutputText(t){this.outputEl&&(this.outputEl.textContent=t)}setErrorText(t){this.errorEl&&(this.errorEl.textContent=t),this.setOutputText("An error has occurred\u2026")}handleShareButtonClick(){const t="https://play.golang.org/p/";this.setOutputText("Waiting for remote server\u2026"),fetch("/play/share",{method:"POST",body:this.inputEl?.value}).then(e=>e.text()).then(e=>{const r=t+e;this.setOutputText(`<a href="${r}">${r}</a>`),window.open(r)}).catch(e=>{this.setErrorText(e)})}handleFormatButtonClick(){this.setOutputText("Waiting for remote server\u2026");const t=new FormData;t.append("body",this.inputEl?.value??""),fetch("/play/fmt",{method:"POST",body:t}).then(e=>e.json()).then(({Body:e,Error:r})=>{this.setOutputText(r||"Done."),e&&(this.setInputText(e),this.resize())}).catch(e=>{this.setErrorText(e)})}handleRunButtonClick(){this.setOutputText("Waiting for remote server\u2026"),fetch("/play/compile",{method:"POST",body:JSON.stringify({body:this.inputEl?.value,version:2})}).then(t=>t.json()).then(async({Events:t,Errors:e})=>{this.setOutputText(e||"");for(const r of t||[])this.setOutputText(r.Message),await new Promise(a=>setTimeout(a,r.Delay/1e6))}).catch(t=>{this.setErrorText(t)})}}const l=location.hash.match(/^#(example-.*)$/);if(l){const o=document.getElementById(l[1]);o&&(o.open=!0)}const i=[...document.querySelectorAll(n.PLAY_HREF)],s=o=>i.find(t=>t.hash===o.getAnchorHash());for(const o of document.querySelectorAll(n.PLAY_CONTAINER)){const t=new PlaygroundExampleController(o),e=s(t);e?e.addEventListener("click",()=>{t.expand()}):console.warn("example href not found")}
-//# sourceMappingURL=playground.js.map
diff --git a/static/legacy/js/playground.js.map b/static/legacy/js/playground.js.map
deleted file mode 100644
index 1d7b4a5..0000000
--- a/static/legacy/js/playground.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "version": 3,
-  "sources": ["playground.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the playground implementation of the documentation\n// page. The playground involves a \"play\" button that allows you to open up\n// a new link to play.golang.org using the example code.\n\n// The CSS is in content/static/legacy/css/stylesheet.css.\n\n/**\n * CSS classes used by PlaygroundExampleController\n */\nconst PlayExampleClassName = {\n  PLAY_HREF: '.js-exampleHref',\n  PLAY_CONTAINER: '.js-exampleContainer',\n  EXAMPLE_INPUT: '.Documentation-exampleCode',\n  EXAMPLE_OUTPUT: '.Documentation-exampleOutput',\n  EXAMPLE_ERROR: '.Documentation-exampleError',\n  PLAY_BUTTON: '.Documentation-examplePlayButton',\n  SHARE_BUTTON: '.Documentation-exampleShareButton',\n  FORMAT_BUTTON: '.Documentation-exampleFormatButton',\n  RUN_BUTTON: '.Documentation-exampleRunButton',\n};\n\n/**\n * This controller enables playground examples to expand their dropdown or\n * generate shareable Go Playground URLs.\n */\nexport class PlaygroundExampleController {\n  /**\n   * The anchor tag used to identify the container with an example href.\n   * There is only one in an example container div.\n   */\n  private readonly anchorEl: HTMLAnchorElement | null;\n\n  /**\n   * The error element\n   */\n  private readonly errorEl: Element | null;\n\n  /**\n   * Buttons that redirect to an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly playButtonEl: Element | null;\n  private readonly shareButtonEl: Element | null;\n\n  /**\n   * Button that formats the code in an example's playground.\n   */\n  private readonly formatButtonEl: Element | null;\n\n  /**\n   * Button that runs the code in an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly runButtonEl: Element | null;\n\n  /**\n   * The executable code of an example.\n   */\n  private readonly inputEl: HTMLTextAreaElement | null;\n\n  /**\n   * The output of the given example code. This only exists if the\n   * author of the package provides an output for this example.\n   */\n  private readonly outputEl: Element | null;\n\n  /**\n   * @param exampleEl The div that contains playground content for the given example.\n   */\n  constructor(private readonly exampleEl: HTMLDetailsElement) {\n    this.exampleEl = exampleEl;\n    this.anchorEl = exampleEl.querySelector('a');\n    this.errorEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_ERROR);\n    this.playButtonEl = exampleEl.querySelector(PlayExampleClassName.PLAY_BUTTON);\n    this.shareButtonEl = exampleEl.querySelector(PlayExampleClassName.SHARE_BUTTON);\n    this.formatButtonEl = exampleEl.querySelector(PlayExampleClassName.FORMAT_BUTTON);\n    this.runButtonEl = exampleEl.querySelector(PlayExampleClassName.RUN_BUTTON);\n    this.inputEl = this.makeTextArea(exampleEl.querySelector(PlayExampleClassName.EXAMPLE_INPUT));\n    this.outputEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_OUTPUT);\n\n    // This is legacy listener to be replaced the listener for shareButtonEl.\n    this.playButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.shareButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.formatButtonEl?.addEventListener('click', () => this.handleFormatButtonClick());\n    this.runButtonEl?.addEventListener('click', () => this.handleRunButtonClick());\n\n    if (!this.inputEl) return;\n\n    this.resize();\n    this.inputEl.addEventListener('keyup', () => this.resize());\n    this.inputEl.addEventListener('keydown', e => this.onKeydown(e));\n  }\n\n  /**\n   * Replace the pre element with a textarea. The examples are initially rendered\n   * as pre elements so they're fully visible when JS is disabled.\n   */\n  makeTextArea(el: Element | null): HTMLTextAreaElement {\n    const t = document.createElement('textarea');\n    t.classList.add('Documentation-exampleCode');\n    t.spellcheck = false;\n    t.value = el?.textContent ?? '';\n    el?.parentElement?.replaceChild(t, el);\n    return t;\n  }\n\n  /**\n   * Retrieve the hash value of the anchor element.\n   */\n  getAnchorHash(): string | undefined {\n    return this.anchorEl?.hash;\n  }\n\n  /**\n   * Expands the current playground example.\n   */\n  expand(): void {\n    this.exampleEl.open = true;\n  }\n\n  /**\n   * Resizes the input element to accomodate the amount of text present.\n   */\n  private resize(): void {\n    if (this.inputEl?.value) {\n      const numLineBreaks = (this.inputEl.value.match(/\\n/g) || []).length;\n      // min-height + lines x line-height + padding + border\n      this.inputEl.style.height = `${(20 + numLineBreaks * 20 + 12 + 2) / 16}rem`;\n    }\n  }\n\n  /**\n   * Handler to override keyboard behavior in the playground's\n   * textarea element.\n   *\n   * Tab key inserts tabs into the example playground instead of\n   * switching to the next interactive element.\n   * @param e input element keyboard event.\n   */\n  private onKeydown(e: KeyboardEvent) {\n    if (e.key === 'Tab') {\n      document.execCommand('insertText', false, '\\t');\n      e.preventDefault();\n    }\n  }\n\n  /**\n   * Changes the text of the example's input box.\n   */\n  private setInputText(output: string) {\n    if (this.inputEl) {\n      this.inputEl.value = output;\n    }\n  }\n\n  /**\n   * Changes the text of the example's output box.\n   */\n  private setOutputText(output: string) {\n    if (this.outputEl) {\n      this.outputEl.textContent = output;\n    }\n  }\n\n  /**\n   * Sets the error message text and overwrites\n   * output box to indicate a failed response.\n   */\n  private setErrorText(err: string) {\n    if (this.errorEl) {\n      this.errorEl.textContent = err;\n    }\n    this.setOutputText('An error has occurred\u2026');\n  }\n\n  /**\n   * Opens a new window to play.golang.org using the\n   * example snippet's code in the playground.\n   */\n  private handleShareButtonClick() {\n    const PLAYGROUND_BASE_URL = 'https://play.golang.org/p/';\n\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/share', {\n      method: 'POST',\n      body: this.inputEl?.value,\n    })\n      .then(res => res.text())\n      .then(shareId => {\n        const href = PLAYGROUND_BASE_URL + shareId;\n        this.setOutputText(`<a href=\"${href}\">${href}</a>`);\n        window.open(href);\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs gofmt on the example snippet in the playground.\n   */\n  private handleFormatButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n    const body = new FormData();\n    body.append('body', this.inputEl?.value ?? '');\n\n    fetch('/play/fmt', {\n      method: 'POST',\n      body: body,\n    })\n      .then(res => res.json())\n      .then(({ Body, Error }) => {\n        this.setOutputText(Error || 'Done.');\n        if (Body) {\n          this.setInputText(Body);\n          this.resize();\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs the code snippet in the example playground.\n   */\n  private handleRunButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/compile', {\n      method: 'POST',\n      body: JSON.stringify({ body: this.inputEl?.value, version: 2 }),\n    })\n      .then(res => res.json())\n      .then(async ({ Events, Errors }) => {\n        this.setOutputText(Errors || '');\n        for (const e of Events || []) {\n          this.setOutputText(e.Message);\n          await new Promise(resolve => setTimeout(resolve, e.Delay / 1000000));\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n}\n\nconst exampleHashRegex = location.hash.match(/^#(example-.*)$/);\nif (exampleHashRegex) {\n  const exampleHashEl = document.getElementById(exampleHashRegex[1]) as HTMLDetailsElement;\n  if (exampleHashEl) {\n    exampleHashEl.open = true;\n  }\n}\n\n// We use a spread operator to convert a nodelist into an array of elements.\nconst exampleHrefs = [\n  ...document.querySelectorAll<HTMLAnchorElement>(PlayExampleClassName.PLAY_HREF),\n];\n\n/**\n * Sometimes exampleHrefs and playContainers are in different order, so we\n * find an exampleHref from a common hash.\n * @param playContainer - playground container\n */\nconst findExampleHash = (playContainer: PlaygroundExampleController) =>\n  exampleHrefs.find(ex => {\n    return ex.hash === playContainer.getAnchorHash();\n  });\n\nfor (const el of document.querySelectorAll(PlayExampleClassName.PLAY_CONTAINER)) {\n  // There should be the same amount of hrefs referencing examples as example containers.\n  const playContainer = new PlaygroundExampleController(el as HTMLDetailsElement);\n  const exampleHref = findExampleHash(playContainer);\n  if (exampleHref) {\n    exampleHref.addEventListener('click', () => {\n      playContainer.expand();\n    });\n  } else {\n    console.warn('example href not found');\n  }\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgBA,KAAM,GAAuB,CAC3B,UAAW,kBACX,eAAgB,uBAChB,cAAe,6BACf,eAAgB,+BAChB,cAAe,8BACf,YAAa,mCACb,aAAc,oCACd,cAAe,qCACf,WAAY,mCAOP,wCAAkC,CA4CvC,YAA6B,EAA+B,CAA/B,iBAiB3B,AAhBA,KAAK,UAAY,EACjB,KAAK,SAAW,EAAU,cAAc,KACxC,KAAK,QAAU,EAAU,cAAc,EAAqB,eAC5D,KAAK,aAAe,EAAU,cAAc,EAAqB,aACjE,KAAK,cAAgB,EAAU,cAAc,EAAqB,cAClE,KAAK,eAAiB,EAAU,cAAc,EAAqB,eACnE,KAAK,YAAc,EAAU,cAAc,EAAqB,YAChE,KAAK,QAAU,KAAK,aAAa,EAAU,cAAc,EAAqB,gBAC9E,KAAK,SAAW,EAAU,cAAc,EAAqB,gBAG7D,KAAK,cAAc,iBAAiB,QAAS,IAAM,KAAK,0BACxD,KAAK,eAAe,iBAAiB,QAAS,IAAM,KAAK,0BACzD,KAAK,gBAAgB,iBAAiB,QAAS,IAAM,KAAK,2BAC1D,KAAK,aAAa,iBAAiB,QAAS,IAAM,KAAK,wBAEnD,EAAC,KAAK,SAEV,MAAK,SACL,KAAK,QAAQ,iBAAiB,QAAS,IAAM,KAAK,UAClD,KAAK,QAAQ,iBAAiB,UAAW,GAAK,KAAK,UAAU,KAO/D,aAAa,EAAyC,CACpD,KAAM,GAAI,SAAS,cAAc,YACjC,SAAE,UAAU,IAAI,6BAChB,EAAE,WAAa,GACf,EAAE,MAAQ,GAAI,aAAe,GAC7B,GAAI,eAAe,aAAa,EAAG,GAC5B,EAMT,eAAoC,CAClC,MAAO,MAAK,UAAU,KAMxB,QAAe,CACb,KAAK,UAAU,KAAO,GAMhB,QAAe,CACrB,GAAI,KAAK,SAAS,MAAO,CACvB,KAAM,GAAiB,MAAK,QAAQ,MAAM,MAAM,QAAU,IAAI,OAE9D,KAAK,QAAQ,MAAM,OAAS,GAAI,IAAK,EAAgB,GAAK,GAAK,GAAK,SAYhE,UAAU,EAAkB,CAClC,AAAI,EAAE,MAAQ,OACZ,UAAS,YAAY,aAAc,GAAO,KAC1C,EAAE,kBAOE,aAAa,EAAgB,CACnC,AAAI,KAAK,SACP,MAAK,QAAQ,MAAQ,GAOjB,cAAc,EAAgB,CACpC,AAAI,KAAK,UACP,MAAK,SAAS,YAAc,GAQxB,aAAa,EAAa,CAChC,AAAI,KAAK,SACP,MAAK,QAAQ,YAAc,GAE7B,KAAK,cAAc,+BAOb,wBAAyB,CAC/B,KAAM,GAAsB,6BAE5B,KAAK,cAAc,mCAEnB,MAAM,cAAe,CACnB,OAAQ,OACR,KAAM,KAAK,SAAS,QAEnB,KAAK,GAAO,EAAI,QAChB,KAAK,GAAW,CACf,KAAM,GAAO,EAAsB,EACnC,KAAK,cAAc,YAAY,MAAS,SACxC,OAAO,KAAK,KAEb,MAAM,GAAO,CACZ,KAAK,aAAa,KAOhB,yBAA0B,CAChC,KAAK,cAAc,mCACnB,KAAM,GAAO,GAAI,UACjB,EAAK,OAAO,OAAQ,KAAK,SAAS,OAAS,IAE3C,MAAM,YAAa,CACjB,OAAQ,OACR,KAAM,IAEL,KAAK,GAAO,EAAI,QAChB,KAAK,CAAC,CAAE,OAAM,WAAY,CACzB,KAAK,cAAc,GAAS,SACxB,GACF,MAAK,aAAa,GAClB,KAAK,YAGR,MAAM,GAAO,CACZ,KAAK,aAAa,KAOhB,sBAAuB,CAC7B,KAAK,cAAc,mCAEnB,MAAM,gBAAiB,CACrB,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAM,KAAK,SAAS,MAAO,QAAS,MAE1D,KAAK,GAAO,EAAI,QAChB,KAAK,MAAO,CAAE,SAAQ,YAAa,CAClC,KAAK,cAAc,GAAU,IAC7B,SAAW,KAAK,IAAU,GACxB,KAAK,cAAc,EAAE,SACrB,KAAM,IAAI,SAAQ,GAAW,WAAW,EAAS,EAAE,MAAQ,QAG9D,MAAM,GAAO,CACZ,KAAK,aAAa,MAK1B,KAAM,GAAmB,SAAS,KAAK,MAAM,mBAC7C,GAAI,EAAkB,CACpB,KAAM,GAAgB,SAAS,eAAe,EAAiB,IAC/D,AAAI,GACF,GAAc,KAAO,IAKzB,KAAM,GAAe,CACnB,GAAG,SAAS,iBAAoC,EAAqB,YAQjE,EAAkB,AAAC,GACvB,EAAa,KAAK,GACT,EAAG,OAAS,EAAc,iBAGrC,SAAW,KAAM,UAAS,iBAAiB,EAAqB,gBAAiB,CAE/E,KAAM,GAAgB,GAAI,6BAA4B,GAChD,EAAc,EAAgB,GACpC,AAAI,EACF,EAAY,iBAAiB,QAAS,IAAM,CAC1C,EAAc,WAGhB,QAAQ,KAAK",
-  "names": []
-}
diff --git a/static/legacy/js/playground.test.ts b/static/legacy/js/playground.test.ts
deleted file mode 100644
index bd5fec5..0000000
--- a/static/legacy/js/playground.test.ts
+++ /dev/null
@@ -1,197 +0,0 @@
-/*!
- * @license
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-import { PlaygroundExampleController } from './playground';
-import { mocked } from 'ts-jest/utils';
-
-const flushPromises = () => new Promise(setImmediate);
-const el = <T extends HTMLElement>(selector: string) => document.querySelector<T>(selector);
-const codeSnippet = `package main
-
-import (
-  "fmt"
-  "io"
-  "os"
-)
-
-func main() {
-  const name, age = "Kim", 22
-  s := fmt.Sprintln(  name, "is", age, "years old.")
-
-  io.WriteString( os.Stdout, s)    // Ignoring error for simplicity.
-
-  // HTML special characters: & ' < > "
-}
-`;
-
-const escapeHTML = (s: string) => {
-  return s
-    .replace(/&/g, '&amp;')
-    .replace(/</g, '&lt;')
-    .replace(/>/g, '&gt;')
-    .replace(/'/g, '&#39;')
-    .replace(/"/g, '&#34;');
-};
-
-describe('PlaygroundExampleController', () => {
-  let example: HTMLDetailsElement;
-  window.fetch = jest.fn();
-  window.open = jest.fn();
-
-  beforeEach(() => {
-    document.body.innerHTML = `
-      <details tabindex="-1" id="example-Sprintln" class="Documentation-exampleDetails js-exampleContainer">
-      <summary class="Documentation-exampleDetailsHeader">Example <a href="#example-Sprintln">¶</a></summary>
-      <div class="Documentation-exampleDetailsBody">
-      <p>Code:</p>
-
-      <pre class="Documentation-exampleCode">${escapeHTML(codeSnippet)}</pre>
-
-      <pre>
-        <span class="Documentation-exampleOutputLabel">Output:</span>
-        <span class="Documentation-exampleOutput">Kim is 22 years old.</span>
-      </pre>
-      </div>
-      <div class="Documentation-exampleButtonsContainer">
-        <p class="Documentation-exampleError" role="alert" aria-atomic="true"></p>
-        <button class="Documentation-exampleShareButton" aria-label="Share Code">Share</button>
-        <button class="Documentation-exampleFormatButton" aria-label="Format Code">Format</button>
-        <button class="Documentation-exampleRunButton" aria-label="Run Code">Run</button>
-      </div></details>
-    `;
-    example = el('.js-exampleContainer') as HTMLDetailsElement;
-    new PlaygroundExampleController(example);
-  });
-
-  afterEach(() => {
-    document.body.innerHTML = '';
-    mocked(window.fetch).mockClear();
-    mocked(window.open).mockClear();
-  });
-
-  it('expands and collapses example when summary is clicked', () => {
-    const summary = example.firstElementChild as HTMLDetailsElement;
-    summary.click();
-    expect(example.open).toBeTruthy();
-    summary.click();
-    expect(example.open).toBeFalsy();
-  });
-
-  it('replaces the pre element with a text area', () => {
-    const input = document.querySelector('.Documentation-exampleCode');
-    expect(input.tagName).toBe('TEXTAREA');
-  });
-
-  it('opens playground after pressing share', async () => {
-    mocked(window.fetch).mockResolvedValue({
-      text: () => Promise.resolve('abcdefg'),
-    } as Response);
-    el('[aria-label="Share Code"]').click();
-    await flushPromises();
-
-    expect(window.fetch).toHaveBeenCalledWith('/play/share', {
-      body: codeSnippet,
-      method: 'POST',
-    });
-    expect(window.open).toHaveBeenCalledWith('https://play.golang.org/p/abcdefg');
-  });
-
-  it('replaces textarea with formated code after pressing format', async () => {
-    mocked(window.fetch).mockResolvedValue({
-      json: () =>
-        Promise.resolve({
-          Body: '// mocked response',
-          Error: '',
-        }),
-    } as Response);
-    el('[aria-label="Format Code"]').click();
-    const body = new FormData();
-    body.append('body', codeSnippet);
-    await flushPromises();
-
-    expect(window.fetch).toHaveBeenCalledWith('/play/fmt', {
-      body: body,
-      method: 'POST',
-    });
-    expect(el<HTMLTextAreaElement>('.Documentation-exampleCode').value).toBe('// mocked response');
-  });
-
-  it('displays error message after pressing format with invalid code', async () => {
-    mocked(window.fetch).mockResolvedValue({
-      json: () =>
-        Promise.resolve({
-          Body: '',
-          Error: '// mocked error',
-        }),
-    } as Response);
-    el('[aria-label="Format Code"]').click();
-    const body = new FormData();
-    body.append('body', codeSnippet);
-    await flushPromises();
-
-    expect(window.fetch).toHaveBeenCalledWith('/play/fmt', {
-      body: body,
-      method: 'POST',
-    });
-    expect(el<HTMLTextAreaElement>('.Documentation-exampleCode').value).toBe(codeSnippet);
-    expect(el('.Documentation-exampleOutput').textContent).toContain('// mocked error');
-  });
-
-  it('displays code output after pressing run', async () => {
-    mocked(window.fetch).mockResolvedValue({
-      json: () =>
-        Promise.resolve({
-          Events: [{ Message: '// mocked response', Kind: 'stdout', Delay: 0 }],
-          Errors: null,
-        }),
-    } as Response);
-    el('[aria-label="Run Code"]').click();
-    await flushPromises();
-
-    expect(window.fetch).toHaveBeenCalledWith('/play/compile', {
-      body: JSON.stringify({ body: codeSnippet, version: 2 }),
-      method: 'POST',
-    });
-    expect(el('.Documentation-exampleOutput').textContent).toContain('// mocked response');
-  });
-
-  it('displays error message after pressing run with invalid code', async () => {
-    mocked(window.fetch).mockResolvedValue({
-      json: () =>
-        Promise.resolve({
-          Events: null,
-          Errors: '// mocked error',
-        }),
-    } as Response);
-    el('[aria-label="Run Code"]').click();
-    await flushPromises();
-
-    expect(window.fetch).toHaveBeenCalledWith('/play/compile', {
-      body: JSON.stringify({ body: codeSnippet, version: 2 }),
-      method: 'POST',
-    });
-    expect(el('.Documentation-exampleOutput').textContent).toContain('// mocked error');
-  });
-
-  it('escapes example output', async () => {
-    mocked(window.fetch).mockResolvedValue({
-      json: () =>
-        Promise.resolve({
-          Events: [{ Message: '\u003cinput required\u003e', Kind: 'stdout', Delay: 0 }],
-          Errors: null,
-        }),
-    } as Response);
-    el('[aria-label="Run Code"]').click();
-    await flushPromises();
-
-    expect(window.fetch).toHaveBeenCalledWith('/play/compile', {
-      body: JSON.stringify({ body: codeSnippet, version: 2 }),
-      method: 'POST',
-    });
-    expect(el('.Documentation-exampleOutput').innerHTML).toBe('&lt;input required&gt;');
-  });
-});
diff --git a/static/legacy/js/playground.ts b/static/legacy/js/playground.ts
deleted file mode 100644
index 0c430ca..0000000
--- a/static/legacy/js/playground.ts
+++ /dev/null
@@ -1,290 +0,0 @@
-/*!
- * @license
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-// This file implements the playground implementation of the documentation
-// page. The playground involves a "play" button that allows you to open up
-// a new link to play.golang.org using the example code.
-
-// The CSS is in content/static/legacy/css/stylesheet.css.
-
-/**
- * CSS classes used by PlaygroundExampleController
- */
-const PlayExampleClassName = {
-  PLAY_HREF: '.js-exampleHref',
-  PLAY_CONTAINER: '.js-exampleContainer',
-  EXAMPLE_INPUT: '.Documentation-exampleCode',
-  EXAMPLE_OUTPUT: '.Documentation-exampleOutput',
-  EXAMPLE_ERROR: '.Documentation-exampleError',
-  PLAY_BUTTON: '.Documentation-examplePlayButton',
-  SHARE_BUTTON: '.Documentation-exampleShareButton',
-  FORMAT_BUTTON: '.Documentation-exampleFormatButton',
-  RUN_BUTTON: '.Documentation-exampleRunButton',
-};
-
-/**
- * This controller enables playground examples to expand their dropdown or
- * generate shareable Go Playground URLs.
- */
-export class PlaygroundExampleController {
-  /**
-   * The anchor tag used to identify the container with an example href.
-   * There is only one in an example container div.
-   */
-  private readonly anchorEl: HTMLAnchorElement | null;
-
-  /**
-   * The error element
-   */
-  private readonly errorEl: Element | null;
-
-  /**
-   * Buttons that redirect to an example's playground, this element
-   * only exists in executable examples.
-   */
-  private readonly playButtonEl: Element | null;
-  private readonly shareButtonEl: Element | null;
-
-  /**
-   * Button that formats the code in an example's playground.
-   */
-  private readonly formatButtonEl: Element | null;
-
-  /**
-   * Button that runs the code in an example's playground, this element
-   * only exists in executable examples.
-   */
-  private readonly runButtonEl: Element | null;
-
-  /**
-   * The executable code of an example.
-   */
-  private readonly inputEl: HTMLTextAreaElement | null;
-
-  /**
-   * The output of the given example code. This only exists if the
-   * author of the package provides an output for this example.
-   */
-  private readonly outputEl: Element | null;
-
-  /**
-   * @param exampleEl The div that contains playground content for the given example.
-   */
-  constructor(private readonly exampleEl: HTMLDetailsElement) {
-    this.exampleEl = exampleEl;
-    this.anchorEl = exampleEl.querySelector('a');
-    this.errorEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_ERROR);
-    this.playButtonEl = exampleEl.querySelector(PlayExampleClassName.PLAY_BUTTON);
-    this.shareButtonEl = exampleEl.querySelector(PlayExampleClassName.SHARE_BUTTON);
-    this.formatButtonEl = exampleEl.querySelector(PlayExampleClassName.FORMAT_BUTTON);
-    this.runButtonEl = exampleEl.querySelector(PlayExampleClassName.RUN_BUTTON);
-    this.inputEl = this.makeTextArea(exampleEl.querySelector(PlayExampleClassName.EXAMPLE_INPUT));
-    this.outputEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_OUTPUT);
-
-    // This is legacy listener to be replaced the listener for shareButtonEl.
-    this.playButtonEl?.addEventListener('click', () => this.handleShareButtonClick());
-    this.shareButtonEl?.addEventListener('click', () => this.handleShareButtonClick());
-    this.formatButtonEl?.addEventListener('click', () => this.handleFormatButtonClick());
-    this.runButtonEl?.addEventListener('click', () => this.handleRunButtonClick());
-
-    if (!this.inputEl) return;
-
-    this.resize();
-    this.inputEl.addEventListener('keyup', () => this.resize());
-    this.inputEl.addEventListener('keydown', e => this.onKeydown(e));
-  }
-
-  /**
-   * Replace the pre element with a textarea. The examples are initially rendered
-   * as pre elements so they're fully visible when JS is disabled.
-   */
-  makeTextArea(el: Element | null): HTMLTextAreaElement {
-    const t = document.createElement('textarea');
-    t.classList.add('Documentation-exampleCode');
-    t.spellcheck = false;
-    t.value = el?.textContent ?? '';
-    el?.parentElement?.replaceChild(t, el);
-    return t;
-  }
-
-  /**
-   * Retrieve the hash value of the anchor element.
-   */
-  getAnchorHash(): string | undefined {
-    return this.anchorEl?.hash;
-  }
-
-  /**
-   * Expands the current playground example.
-   */
-  expand(): void {
-    this.exampleEl.open = true;
-  }
-
-  /**
-   * Resizes the input element to accomodate the amount of text present.
-   */
-  private resize(): void {
-    if (this.inputEl?.value) {
-      const numLineBreaks = (this.inputEl.value.match(/\n/g) || []).length;
-      // min-height + lines x line-height + padding + border
-      this.inputEl.style.height = `${(20 + numLineBreaks * 20 + 12 + 2) / 16}rem`;
-    }
-  }
-
-  /**
-   * Handler to override keyboard behavior in the playground's
-   * textarea element.
-   *
-   * Tab key inserts tabs into the example playground instead of
-   * switching to the next interactive element.
-   * @param e input element keyboard event.
-   */
-  private onKeydown(e: KeyboardEvent) {
-    if (e.key === 'Tab') {
-      document.execCommand('insertText', false, '\t');
-      e.preventDefault();
-    }
-  }
-
-  /**
-   * Changes the text of the example's input box.
-   */
-  private setInputText(output: string) {
-    if (this.inputEl) {
-      this.inputEl.value = output;
-    }
-  }
-
-  /**
-   * Changes the text of the example's output box.
-   */
-  private setOutputText(output: string) {
-    if (this.outputEl) {
-      this.outputEl.textContent = output;
-    }
-  }
-
-  /**
-   * Sets the error message text and overwrites
-   * output box to indicate a failed response.
-   */
-  private setErrorText(err: string) {
-    if (this.errorEl) {
-      this.errorEl.textContent = err;
-    }
-    this.setOutputText('An error has occurred…');
-  }
-
-  /**
-   * Opens a new window to play.golang.org using the
-   * example snippet's code in the playground.
-   */
-  private handleShareButtonClick() {
-    const PLAYGROUND_BASE_URL = 'https://play.golang.org/p/';
-
-    this.setOutputText('Waiting for remote server…');
-
-    fetch('/play/share', {
-      method: 'POST',
-      body: this.inputEl?.value,
-    })
-      .then(res => res.text())
-      .then(shareId => {
-        const href = PLAYGROUND_BASE_URL + shareId;
-        this.setOutputText(`<a href="${href}">${href}</a>`);
-        window.open(href);
-      })
-      .catch(err => {
-        this.setErrorText(err);
-      });
-  }
-
-  /**
-   * Runs gofmt on the example snippet in the playground.
-   */
-  private handleFormatButtonClick() {
-    this.setOutputText('Waiting for remote server…');
-    const body = new FormData();
-    body.append('body', this.inputEl?.value ?? '');
-
-    fetch('/play/fmt', {
-      method: 'POST',
-      body: body,
-    })
-      .then(res => res.json())
-      .then(({ Body, Error }) => {
-        this.setOutputText(Error || 'Done.');
-        if (Body) {
-          this.setInputText(Body);
-          this.resize();
-        }
-      })
-      .catch(err => {
-        this.setErrorText(err);
-      });
-  }
-
-  /**
-   * Runs the code snippet in the example playground.
-   */
-  private handleRunButtonClick() {
-    this.setOutputText('Waiting for remote server…');
-
-    fetch('/play/compile', {
-      method: 'POST',
-      body: JSON.stringify({ body: this.inputEl?.value, version: 2 }),
-    })
-      .then(res => res.json())
-      .then(async ({ Events, Errors }) => {
-        this.setOutputText(Errors || '');
-        for (const e of Events || []) {
-          this.setOutputText(e.Message);
-          await new Promise(resolve => setTimeout(resolve, e.Delay / 1000000));
-        }
-      })
-      .catch(err => {
-        this.setErrorText(err);
-      });
-  }
-}
-
-const exampleHashRegex = location.hash.match(/^#(example-.*)$/);
-if (exampleHashRegex) {
-  const exampleHashEl = document.getElementById(exampleHashRegex[1]) as HTMLDetailsElement;
-  if (exampleHashEl) {
-    exampleHashEl.open = true;
-  }
-}
-
-// We use a spread operator to convert a nodelist into an array of elements.
-const exampleHrefs = [
-  ...document.querySelectorAll<HTMLAnchorElement>(PlayExampleClassName.PLAY_HREF),
-];
-
-/**
- * Sometimes exampleHrefs and playContainers are in different order, so we
- * find an exampleHref from a common hash.
- * @param playContainer - playground container
- */
-const findExampleHash = (playContainer: PlaygroundExampleController) =>
-  exampleHrefs.find(ex => {
-    return ex.hash === playContainer.getAnchorHash();
-  });
-
-for (const el of document.querySelectorAll(PlayExampleClassName.PLAY_CONTAINER)) {
-  // There should be the same amount of hrefs referencing examples as example containers.
-  const playContainer = new PlaygroundExampleController(el as HTMLDetailsElement);
-  const exampleHref = findExampleHash(playContainer);
-  if (exampleHref) {
-    exampleHref.addEventListener('click', () => {
-      playContainer.expand();
-    });
-  } else {
-    console.warn('example href not found');
-  }
-}
diff --git a/static/legacy/js/sidenav.js b/static/legacy/js/sidenav.js
deleted file mode 100644
index 83aa2f3..0000000
--- a/static/legacy/js/sidenav.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * @license
- * Copyright 2019-2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */const Key={UP:"ArrowUp",DOWN:"ArrowDown",LEFT:"ArrowLeft",RIGHT:"ArrowRight",ENTER:"Enter",ASTERISK:"*",SPACE:" ",END:"End",HOME:"Home",Y:"y",FORWARD_SLASH:"/",QUESTION_MARK:"?"};class DocNavTreeController{constructor(e){this.el=e;this.focusedIndex=0;this.visibleItems=[];this.searchString="";this.lastKeyDownTimeStamp=-Infinity;this.el=e,this.selectedEl=null,this.focusedIndex=0,this.visibleItems=[],this.searchString="",this.lastKeyDownTimeStamp=-Infinity,this.addEventListeners(),this.updateVisibleItems(),this.initialize()}initialize(){this.el.querySelectorAll("[role='treeitem']").forEach(e=>{e.addEventListener("click",t=>this.handleItemClick(t))}),this.el.querySelectorAll("[data-aria-owns]").forEach(e=>{e.setAttribute("aria-owns",e.getAttribute("data-aria-owns")??"")})}addEventListeners(){this.el.addEventListener("keydown",e=>this.handleKeyDown(e))}setFocusedIndex(e){if(e===this.focusedIndex||e===-1)return;let t=this.visibleItems[this.focusedIndex];t.setAttribute("tabindex","-1"),t=this.visibleItems[e],t.setAttribute("tabindex","0"),t.focus(),this.focusedIndex=e}setSelectedId(e){if(this.selectedEl&&(this.selectedEl.removeAttribute("aria-selected"),this.selectedEl=null),e?this.selectedEl=this.el.querySelector(`[role='treeitem'][href='#${e}']`):this.visibleItems.length>0&&(this.selectedEl=this.visibleItems[0]),!this.selectedEl)return;const t=this.el.querySelector('[aria-level="1"][aria-expanded="true"]');t&&!t.parentElement?.contains(this.selectedEl)&&this.collapseItem(t),this.selectedEl.getAttribute("aria-level")==="1"&&this.selectedEl.setAttribute("aria-expanded","true"),this.selectedEl.setAttribute("aria-selected","true"),this.expandAllParents(this.selectedEl),this.scrollElementIntoView(this.selectedEl)}expandAllSiblingItems(e){const t=e.getAttribute("aria-level");this.el.querySelectorAll(`[aria-level='${t}'][aria-expanded='false']`).forEach(i=>{i.setAttribute("aria-expanded","true")}),this.updateVisibleItems(),this.focusedIndex=this.visibleItems.indexOf(e)}expandAllParents(e){if(!this.visibleItems.includes(e)){let t=this.owningItem(e);for(;t;)this.expandItem(t),t=this.owningItem(t)}}scrollElementIntoView(e){const t=55,i=document.documentElement.clientHeight,s=e.getBoundingClientRect(),r=(i-t)/2;if(s.top<t)this.el.scrollTop-=t-s.top-s.height+r;else if(s.bottom>i)this.el.scrollTop=s.bottom-i+r;else return}handleItemClick(e){const t=e.target;!t||(this.setFocusedIndex(this.visibleItems.indexOf(t)),t.hasAttribute("aria-expanded")&&this.toggleItemExpandedState(t),this.closeInactiveDocNavGroups(t))}closeInactiveDocNavGroups(e){if(e.hasAttribute("aria-expanded")){const t=e.getAttribute("aria-level");document.querySelectorAll(`[aria-level="${t}"]`).forEach(i=>{i.getAttribute("aria-expanded")==="true"&&i!==e&&i.setAttribute("aria-expanded","false")}),this.updateVisibleItems(),this.focusedIndex=this.visibleItems.indexOf(e)}}handleKeyDown(e){const t=e.target;switch(e.key){case Key.ASTERISK:t&&this.expandAllSiblingItems(t),e.stopPropagation(),e.preventDefault();return;case Key.FORWARD_SLASH:case Key.QUESTION_MARK:return;case Key.DOWN:this.focusNextItem();break;case Key.UP:this.focusPreviousItem();break;case Key.LEFT:t?.getAttribute("aria-expanded")==="true"?this.collapseItem(t):this.focusParentItem(t);break;case Key.RIGHT:{switch(t?.getAttribute("aria-expanded")){case"false":this.expandItem(t);break;case"true":this.focusNextItem();break}break}case Key.HOME:this.setFocusedIndex(0);break;case Key.END:this.setFocusedIndex(this.visibleItems.length-1);break;case Key.ENTER:if(t?.tagName==="A")return;case Key.SPACE:t?.click();break;default:this.handleSearch(e);return}e.preventDefault(),e.stopPropagation()}handleSearch(e){if(e.metaKey||e.altKey||e.ctrlKey||e.isComposing||e.key.length>1||!e.key.match(/\S/))return;const t=1e3;e.timeStamp-this.lastKeyDownTimeStamp>t&&(this.searchString=""),this.lastKeyDownTimeStamp=e.timeStamp,this.searchString+=e.key.toLocaleLowerCase();const i=this.visibleItems[this.focusedIndex].textContent?.toLocaleLowerCase();(this.searchString.length===1||!i?.startsWith(this.searchString))&&this.focusNextItemWithPrefix(this.searchString),e.stopPropagation(),e.preventDefault()}focusNextItemWithPrefix(e){let t=this.focusedIndex+1;for(t>this.visibleItems.length-1&&(t=0);t!==this.focusedIndex;){if(this.visibleItems[t].textContent?.toLocaleLowerCase().startsWith(e)){this.setFocusedIndex(t);return}t>=this.visibleItems.length-1?t=0:t++}}toggleItemExpandedState(e){e.getAttribute("aria-expanded")==="true"?this.collapseItem(e):this.expandItem(e)}focusPreviousItem(){this.setFocusedIndex(Math.max(0,this.focusedIndex-1))}focusNextItem(){this.setFocusedIndex(Math.min(this.visibleItems.length-1,this.focusedIndex+1))}collapseItem(e){e.setAttribute("aria-expanded","false"),this.updateVisibleItems()}expandItem(e){e.setAttribute("aria-expanded","true"),this.updateVisibleItems()}focusParentItem(e){const t=this.owningItem(e);t&&this.setFocusedIndex(this.visibleItems.indexOf(t))}owningItem(e){const t=e?.closest("[role='group']");return t?t.parentElement?.querySelector(`[aria-owns='${t.id}']`):null}updateVisibleItems(){const e=Array.from(this.el.querySelectorAll("[role='treeitem']")),t=Array.from(this.el.querySelectorAll("[aria-expanded='false'] + [role='group'] [role='treeitem']"));this.visibleItems=e.filter(i=>!t.includes(i))}}class DocPageController{constructor(e,t,i){this.contentEl=i;if(!e||!i){console.warn("Unable to find all elements needed for navigation");return}this.navController=new DocNavTreeController(e),t&&(this.mobileNavController=new MobileNavController(t)),window.addEventListener("hashchange",()=>this.handleHashChange()),this.updateSelectedIdFromWindowHash()}handleHashChange(){this.updateSelectedIdFromWindowHash()}updateSelectedIdFromWindowHash(){const e=this.targetIdFromLocationHash();if(this.navController?.setSelectedId(e),this.mobileNavController&&this.mobileNavController.setSelectedId(e),e!==""){const t=this.contentEl?.querySelector(`[id='${e}']`);t&&t.focus()}}targetIdFromLocationHash(){return window.location.hash&&window.location.hash.substr(1)}}class MobileNavController{constructor(e){this.el=e;this.selectEl=e.querySelector("select"),this.labelTextEl=e.querySelector(".js-mobileNavSelectText"),this.selectEl?.addEventListener("change",i=>this.handleSelectChange(i));const t="-57px";this.intersectionObserver=new IntersectionObserver(i=>this.intersectionObserverCallback(i),{rootMargin:`${t} 0px 0px 0px`,threshold:1}),this.intersectionObserver.observe(this.el)}setSelectedId(e){!this.selectEl||(this.selectEl.value=e,this.updateLabelText())}updateLabelText(){if(!this.labelTextEl||!this.selectEl)return;const e=this.selectEl?.selectedIndex;if(e===-1){this.labelTextEl.textContent="";return}this.labelTextEl.textContent=this.selectEl.options[e].textContent}handleSelectChange(e){window.location.hash=`#${e.target.value}`,this.updateLabelText()}intersectionObserverCallback(e){const t="DocNavMobile--withShadow";e.forEach(i=>{const s=i.intersectionRatio===1;i.target.classList.toggle(t,!s)})}}new DocPageController(document.querySelector(".js-tree"),document.querySelector(".js-mobileNav"),document.querySelector(".js-unitDetailsContent"));
-//# sourceMappingURL=sidenav.js.map
diff --git a/static/legacy/js/sidenav.js.map b/static/legacy/js/sidenav.js.map
deleted file mode 100644
index a5bf3d4..0000000
--- a/static/legacy/js/sidenav.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "version": 3,
-  "sources": ["sidenav.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2019-2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Possible KeyboardEvent key values.\n * @private @enum {string}\n */\nconst Key = {\n  UP: 'ArrowUp',\n  DOWN: 'ArrowDown',\n  LEFT: 'ArrowLeft',\n  RIGHT: 'ArrowRight',\n  ENTER: 'Enter',\n  ASTERISK: '*',\n  SPACE: ' ',\n  END: 'End',\n  HOME: 'Home',\n\n  // Global keyboard shortcuts.\n  // TODO(golang.org/issue/40246): consolidate keyboard shortcut handling to avoid\n  // this duplication.\n  Y: 'y',\n  FORWARD_SLASH: '/',\n  QUESTION_MARK: '?',\n};\n\n/**\n * The navigation tree component of the documentation page.\n */\nclass DocNavTreeController {\n  /**\n   * The currently selected element.\n   */\n  private selectedEl: HTMLElement | null;\n  /**\n   * The index of the currently focused item. Used when navigating the tree\n   * using the keyboard.\n   */\n  private focusedIndex = 0;\n  /**\n   * The elements currently visible (not within a collapsed node of the tree).\n   */\n  private visibleItems: HTMLElement[] = [];\n  /**\n   * The current search string.\n   */\n  private searchString = '';\n  /**\n   * The timestamp of the last keydown event. Used to track whether to use the\n   * current search string.\n   */\n  private lastKeyDownTimeStamp = -Infinity;\n\n  /**\n   * Instantiates a navigation tree.\n   */\n  constructor(private el: Element) {\n    this.el = el;\n    this.selectedEl = null;\n    this.focusedIndex = 0;\n    this.visibleItems = [];\n    this.searchString = '';\n    this.lastKeyDownTimeStamp = -Infinity;\n    this.addEventListeners();\n    this.updateVisibleItems();\n    this.initialize();\n  }\n\n  /**\n   * Initializes the tree. Should be called only once.\n   */\n  private initialize() {\n    this.el.querySelectorAll(`[role='treeitem']`).forEach(el => {\n      el.addEventListener('click', e => this.handleItemClick(e as MouseEvent));\n    });\n\n    // TODO: remove once safehtml supports aria-owns with dynamic values.\n    this.el.querySelectorAll('[data-aria-owns]').forEach(el => {\n      el.setAttribute('aria-owns', el.getAttribute('data-aria-owns') ?? '');\n    });\n  }\n\n  private addEventListeners() {\n    this.el.addEventListener('keydown', e => this.handleKeyDown(e as KeyboardEvent));\n  }\n\n  /**\n   * Sets the visible item with the given index with the proper tabindex and\n   * focuses it.\n   */\n  setFocusedIndex(index: number) {\n    if (index === this.focusedIndex || index === -1) {\n      return;\n    }\n\n    let itemEl = this.visibleItems[this.focusedIndex];\n    itemEl.setAttribute('tabindex', '-1');\n\n    itemEl = this.visibleItems[index];\n    itemEl.setAttribute('tabindex', '0');\n    itemEl.focus();\n\n    this.focusedIndex = index;\n  }\n\n  /**\n   * Marks the navigation node with the given ID as selected. If no ID is\n   * provided, the first visible item in the tree is used.\n   */\n  setSelectedId(opt_id: string) {\n    if (this.selectedEl) {\n      this.selectedEl.removeAttribute('aria-selected');\n      this.selectedEl = null;\n    }\n    if (opt_id) {\n      this.selectedEl = this.el.querySelector(`[role='treeitem'][href='#${opt_id}']`);\n    } else if (this.visibleItems.length > 0) {\n      this.selectedEl = this.visibleItems[0];\n    }\n\n    if (!this.selectedEl) {\n      return;\n    }\n\n    // Close inactive top level item if selected id is not in its tree.\n    const topLevelExpanded = this.el.querySelector<HTMLElement>(\n      '[aria-level=\"1\"][aria-expanded=\"true\"]'\n    );\n    if (topLevelExpanded && !topLevelExpanded.parentElement?.contains(this.selectedEl)) {\n      this.collapseItem(topLevelExpanded);\n    }\n\n    if (this.selectedEl.getAttribute('aria-level') === '1') {\n      this.selectedEl.setAttribute('aria-expanded', 'true');\n    }\n    this.selectedEl.setAttribute('aria-selected', 'true');\n    this.expandAllParents(this.selectedEl);\n    this.scrollElementIntoView(this.selectedEl);\n  }\n\n  /**\n   * Expands all sibling items of the given element.\n   */\n  private expandAllSiblingItems(el: HTMLElement) {\n    const level = el.getAttribute('aria-level');\n    this.el.querySelectorAll(`[aria-level='${level}'][aria-expanded='false']`).forEach(el => {\n      el.setAttribute('aria-expanded', 'true');\n    });\n    this.updateVisibleItems();\n    this.focusedIndex = this.visibleItems.indexOf(el);\n  }\n\n  /**\n   * Expands all parent items of the given element.\n   */\n  private expandAllParents(el: HTMLElement) {\n    if (!this.visibleItems.includes(el)) {\n      let owningItemEl = this.owningItem(el);\n      while (owningItemEl) {\n        this.expandItem(owningItemEl);\n        owningItemEl = this.owningItem(owningItemEl);\n      }\n    }\n  }\n\n  /**\n   * Scrolls the given element into view, aligning the element in the center\n   * of the viewport. If the element is already in view, no scrolling occurs.\n   */\n  private scrollElementIntoView(el: HTMLElement) {\n    const STICKY_HEADER_HEIGHT_PX = 55;\n    const viewportHeightPx = document.documentElement.clientHeight;\n    const elRect = el.getBoundingClientRect();\n    const verticalCenterPointPx = (viewportHeightPx - STICKY_HEADER_HEIGHT_PX) / 2;\n    if (elRect.top < STICKY_HEADER_HEIGHT_PX) {\n      // Element is occluded at top of view by header or by being offscreen.\n      this.el.scrollTop -=\n        STICKY_HEADER_HEIGHT_PX - elRect.top - elRect.height + verticalCenterPointPx;\n    } else if (elRect.bottom > viewportHeightPx) {\n      // Element is below viewport.\n      this.el.scrollTop = elRect.bottom - viewportHeightPx + verticalCenterPointPx;\n    } else {\n      return;\n    }\n  }\n\n  /**\n   * Handles when a tree item is clicked.\n   */\n  private handleItemClick(e: MouseEvent) {\n    const el = e.target as HTMLSelectElement | null;\n    if (!el) return;\n    this.setFocusedIndex(this.visibleItems.indexOf(el));\n    if (el.hasAttribute('aria-expanded')) {\n      this.toggleItemExpandedState(el);\n    }\n    this.closeInactiveDocNavGroups(el);\n  }\n\n  /**\n   * Closes inactive top level nav groups when a new tree item clicked.\n   */\n  private closeInactiveDocNavGroups(el: HTMLElement) {\n    if (el.hasAttribute('aria-expanded')) {\n      const level = el.getAttribute('aria-level');\n      document.querySelectorAll(`[aria-level=\"${level}\"]`).forEach(nav => {\n        if (nav.getAttribute('aria-expanded') === 'true' && nav !== el) {\n          nav.setAttribute('aria-expanded', 'false');\n        }\n      });\n      this.updateVisibleItems();\n      this.focusedIndex = this.visibleItems.indexOf(el);\n    }\n  }\n\n  /**\n   * Handles when a key is pressed when the component is in focus.\n   */\n  handleKeyDown(e: KeyboardEvent) {\n    const targetEl = e.target as HTMLElement | null;\n\n    switch (e.key) {\n      case Key.ASTERISK:\n        if (targetEl) {\n          this.expandAllSiblingItems(targetEl);\n        }\n        e.stopPropagation();\n        e.preventDefault();\n        return;\n\n      // Global keyboard shortcuts.\n      // TODO(golang.org/issue/40246): consolidate keyboard shortcut handling\n      // to avoid this duplication.\n      case Key.FORWARD_SLASH:\n      case Key.QUESTION_MARK:\n        return;\n\n      case Key.DOWN:\n        this.focusNextItem();\n        break;\n\n      case Key.UP:\n        this.focusPreviousItem();\n        break;\n\n      case Key.LEFT:\n        if (targetEl?.getAttribute('aria-expanded') === 'true') {\n          this.collapseItem(targetEl);\n        } else {\n          this.focusParentItem(targetEl);\n        }\n        break;\n\n      case Key.RIGHT: {\n        switch (targetEl?.getAttribute('aria-expanded')) {\n          case 'false':\n            this.expandItem(targetEl);\n            break;\n          case 'true':\n            // Select the first child.\n            this.focusNextItem();\n            break;\n        }\n        break;\n      }\n\n      case Key.HOME:\n        this.setFocusedIndex(0);\n        break;\n\n      case Key.END:\n        this.setFocusedIndex(this.visibleItems.length - 1);\n        break;\n\n      case Key.ENTER:\n        if (targetEl?.tagName === 'A') {\n          // Enter triggers desired behavior by itself.\n          return;\n        }\n      // Fall through for non-anchor items to be handled the same as when\n      // the space key is pressed.\n      // eslint-disable-next-line no-fallthrough\n      case Key.SPACE:\n        targetEl?.click();\n        break;\n\n      default:\n        // Could be a typeahead search.\n        this.handleSearch(e);\n        return;\n    }\n    e.preventDefault();\n    e.stopPropagation();\n  }\n\n  /**\n   * Handles when a key event isn\u2019t matched by shortcut handling, indicating\n   * that the user may be attempting a typeahead search.\n   */\n  private handleSearch(e: KeyboardEvent) {\n    if (\n      e.metaKey ||\n      e.altKey ||\n      e.ctrlKey ||\n      e.isComposing ||\n      e.key.length > 1 ||\n      !e.key.match(/\\S/)\n    ) {\n      return;\n    }\n\n    // KeyDown events should be within one second of each other to be considered\n    // part of the same typeahead search string.\n    const MAX_TYPEAHEAD_THRESHOLD_MS = 1000;\n    if (e.timeStamp - this.lastKeyDownTimeStamp > MAX_TYPEAHEAD_THRESHOLD_MS) {\n      this.searchString = '';\n    }\n    this.lastKeyDownTimeStamp = e.timeStamp;\n    this.searchString += e.key.toLocaleLowerCase();\n    const focusedElementText = this.visibleItems[\n      this.focusedIndex\n    ].textContent?.toLocaleLowerCase();\n    if (this.searchString.length === 1 || !focusedElementText?.startsWith(this.searchString)) {\n      this.focusNextItemWithPrefix(this.searchString);\n    }\n    e.stopPropagation();\n    e.preventDefault();\n  }\n\n  /**\n   * Focuses on the next visible tree item (after the currently focused element,\n   * wrapping the tree) that has a prefix equal to the given search string.\n   */\n  focusNextItemWithPrefix(prefix: string) {\n    let i = this.focusedIndex + 1;\n    if (i > this.visibleItems.length - 1) {\n      i = 0;\n    }\n    while (i !== this.focusedIndex) {\n      if (this.visibleItems[i].textContent?.toLocaleLowerCase().startsWith(prefix)) {\n        this.setFocusedIndex(i);\n        return;\n      }\n      if (i >= this.visibleItems.length - 1) {\n        i = 0;\n      } else {\n        i++;\n      }\n    }\n  }\n\n  private toggleItemExpandedState(el: HTMLElement) {\n    el.getAttribute('aria-expanded') === 'true' ? this.collapseItem(el) : this.expandItem(el);\n  }\n\n  private focusPreviousItem() {\n    this.setFocusedIndex(Math.max(0, this.focusedIndex - 1));\n  }\n\n  private focusNextItem() {\n    this.setFocusedIndex(Math.min(this.visibleItems.length - 1, this.focusedIndex + 1));\n  }\n\n  private collapseItem(el: HTMLElement) {\n    el.setAttribute('aria-expanded', 'false');\n    this.updateVisibleItems();\n  }\n\n  private expandItem(el: HTMLElement) {\n    el.setAttribute('aria-expanded', 'true');\n    this.updateVisibleItems();\n  }\n\n  private focusParentItem(el: HTMLElement | null) {\n    const owningItemEl = this.owningItem(el);\n    if (owningItemEl) {\n      this.setFocusedIndex(this.visibleItems.indexOf(owningItemEl));\n    }\n  }\n\n  /**\n   * @returnThe first parent item that \u201Cowns\u201D the group that el is a member of,\n   * or null if there is none.\n   */\n  owningItem(el: HTMLElement | null) {\n    const groupEl = el?.closest(`[role='group']`);\n    if (!groupEl) {\n      return null;\n    }\n    return groupEl.parentElement?.querySelector<HTMLElement>(`[aria-owns='${groupEl.id}']`);\n  }\n\n  /**\n   * Updates which items are visible (not a child of a collapsed item).\n   */\n  private updateVisibleItems() {\n    const allEls = Array.from(this.el.querySelectorAll<HTMLElement>(`[role='treeitem']`));\n    const hiddenEls = Array.from(\n      this.el.querySelectorAll(`[aria-expanded='false'] + [role='group'] [role='treeitem']`)\n    );\n    this.visibleItems = allEls.filter(el => !hiddenEls.includes(el));\n  }\n}\n\n/**\n * Primary controller for the documentation page, handling coordination between\n * the navigation and content components. This class ensures that any\n * documentation elements in view are properly shown/highlighted in the\n * navigation components.\n *\n * Since navigation is essentially handled by anchor tags with fragment IDs as\n * hrefs, the fragment ID (referenced in this code as simply \u201CID\u201D) is used to\n * look up both navigation and content nodes.\n */\nclass DocPageController {\n  private navController?: DocNavTreeController;\n  private mobileNavController?: MobileNavController;\n  /**\n   * Instantiates the controller, setting up the navigation controller (both\n   * desktop and mobile), and event listeners. This should only be called once.\n   */\n  constructor(\n    sideNavEl: HTMLElement | null,\n    mobileNavEl: HTMLElement | null,\n    private contentEl: HTMLElement | null\n  ) {\n    if (!sideNavEl || !contentEl) {\n      console.warn('Unable to find all elements needed for navigation');\n      return;\n    }\n\n    this.navController = new DocNavTreeController(sideNavEl);\n\n    if (mobileNavEl) {\n      this.mobileNavController = new MobileNavController(mobileNavEl);\n    }\n    window.addEventListener('hashchange', () => this.handleHashChange());\n\n    this.updateSelectedIdFromWindowHash();\n  }\n\n  /**\n   * Handles when the location hash changes.\n   */\n  private handleHashChange() {\n    this.updateSelectedIdFromWindowHash();\n  }\n\n  private updateSelectedIdFromWindowHash() {\n    const targetId = this.targetIdFromLocationHash();\n    this.navController?.setSelectedId(targetId);\n    if (this.mobileNavController) {\n      this.mobileNavController.setSelectedId(targetId);\n    }\n    if (targetId !== '') {\n      const targetEl = this.contentEl?.querySelector<HTMLElement>(`[id='${targetId}']`);\n      if (targetEl) {\n        targetEl.focus();\n      }\n    }\n  }\n\n  targetIdFromLocationHash() {\n    return window.location.hash && window.location.hash.substr(1);\n  }\n}\n\n/**\n * Controller for the navigation element used on smaller viewports. It utilizes\n * a native <select> element for interactivity and a styled <label> for\n * displaying the selected option.\n *\n * It presumes a fixed header and that the container for the control will be\n * sticky right below the header when scrolled enough.\n */\nclass MobileNavController {\n  private selectEl: HTMLSelectElement | null;\n  private labelTextEl: HTMLElement | null;\n  private intersectionObserver: IntersectionObserver;\n\n  constructor(private el: HTMLElement) {\n    this.selectEl = el.querySelector<HTMLSelectElement>('select');\n    this.labelTextEl = el.querySelector<HTMLElement>('.js-mobileNavSelectText');\n\n    this.selectEl?.addEventListener('change', e => this.handleSelectChange(e));\n\n    // We use a slight hack to detect if the mobile nav container is pinned to\n    // the bottom of the site header. The root viewport of an IntersectionObserver\n    // is inset by the header height plus one pixel to ensure that the container is\n    // considered \u201Cout of view\u201D when in a fixed position and can be styled appropriately.\n    const ROOT_TOP_MARGIN = '-57px';\n\n    this.intersectionObserver = new IntersectionObserver(\n      entries => this.intersectionObserverCallback(entries),\n      {\n        rootMargin: `${ROOT_TOP_MARGIN} 0px 0px 0px`,\n        threshold: 1.0,\n      }\n    );\n    this.intersectionObserver.observe(this.el);\n  }\n\n  setSelectedId(id: string) {\n    if (!this.selectEl) return;\n    this.selectEl.value = id;\n    this.updateLabelText();\n  }\n\n  private updateLabelText() {\n    if (!this.labelTextEl || !this.selectEl) return;\n    const selectedIndex = this.selectEl?.selectedIndex;\n    if (selectedIndex === -1) {\n      this.labelTextEl.textContent = '';\n      return;\n    }\n    this.labelTextEl.textContent = this.selectEl.options[selectedIndex].textContent;\n  }\n\n  private handleSelectChange(e: Event) {\n    window.location.hash = `#${(e.target as HTMLSelectElement).value}`;\n    this.updateLabelText();\n  }\n\n  private intersectionObserverCallback(entries: IntersectionObserverEntry[]) {\n    const SHADOW_CSS_CLASS = 'DocNavMobile--withShadow';\n    entries.forEach(entry => {\n      // entry.isIntersecting isn\u2019t reliable on Firefox.\n      const fullyInView = entry.intersectionRatio === 1.0;\n      entry.target.classList.toggle(SHADOW_CSS_CLASS, !fullyInView);\n    });\n  }\n}\n\nnew DocPageController(\n  document.querySelector('.js-tree'),\n  document.querySelector('.js-mobileNav'),\n  document.querySelector('.js-unitDetailsContent')\n);\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWA,KAAM,KAAM,CACV,GAAI,UACJ,KAAM,YACN,KAAM,YACN,MAAO,aACP,MAAO,QACP,SAAU,IACV,MAAO,IACP,IAAK,MACL,KAAM,OAKN,EAAG,IACH,cAAe,IACf,cAAe,KAMjB,0BAA2B,CA2BzB,YAAoB,EAAa,CAAb,UAlBZ,kBAAe,EAIf,kBAA8B,GAI9B,kBAAe,GAKf,0BAAuB,UAM7B,KAAK,GAAK,EACV,KAAK,WAAa,KAClB,KAAK,aAAe,EACpB,KAAK,aAAe,GACpB,KAAK,aAAe,GACpB,KAAK,qBAAuB,UAC5B,KAAK,oBACL,KAAK,qBACL,KAAK,aAMC,YAAa,CACnB,KAAK,GAAG,iBAAiB,qBAAqB,QAAQ,GAAM,CAC1D,EAAG,iBAAiB,QAAS,GAAK,KAAK,gBAAgB,MAIzD,KAAK,GAAG,iBAAiB,oBAAoB,QAAQ,GAAM,CACzD,EAAG,aAAa,YAAa,EAAG,aAAa,mBAAqB,MAI9D,mBAAoB,CAC1B,KAAK,GAAG,iBAAiB,UAAW,GAAK,KAAK,cAAc,IAO9D,gBAAgB,EAAe,CAC7B,GAAI,IAAU,KAAK,cAAgB,IAAU,GAC3C,OAGF,GAAI,GAAS,KAAK,aAAa,KAAK,cACpC,EAAO,aAAa,WAAY,MAEhC,EAAS,KAAK,aAAa,GAC3B,EAAO,aAAa,WAAY,KAChC,EAAO,QAEP,KAAK,aAAe,EAOtB,cAAc,EAAgB,CAW5B,GAVI,KAAK,YACP,MAAK,WAAW,gBAAgB,iBAChC,KAAK,WAAa,MAEpB,AAAI,EACF,KAAK,WAAa,KAAK,GAAG,cAAc,4BAA4B,OAC3D,KAAK,aAAa,OAAS,GACpC,MAAK,WAAa,KAAK,aAAa,IAGlC,CAAC,KAAK,WACR,OAIF,KAAM,GAAmB,KAAK,GAAG,cAC/B,0CAEF,AAAI,GAAoB,CAAC,EAAiB,eAAe,SAAS,KAAK,aACrE,KAAK,aAAa,GAGhB,KAAK,WAAW,aAAa,gBAAkB,KACjD,KAAK,WAAW,aAAa,gBAAiB,QAEhD,KAAK,WAAW,aAAa,gBAAiB,QAC9C,KAAK,iBAAiB,KAAK,YAC3B,KAAK,sBAAsB,KAAK,YAM1B,sBAAsB,EAAiB,CAC7C,KAAM,GAAQ,EAAG,aAAa,cAC9B,KAAK,GAAG,iBAAiB,gBAAgB,8BAAkC,QAAQ,GAAM,CACvF,EAAG,aAAa,gBAAiB,UAEnC,KAAK,qBACL,KAAK,aAAe,KAAK,aAAa,QAAQ,GAMxC,iBAAiB,EAAiB,CACxC,GAAI,CAAC,KAAK,aAAa,SAAS,GAAK,CACnC,GAAI,GAAe,KAAK,WAAW,GACnC,KAAO,GACL,KAAK,WAAW,GAChB,EAAe,KAAK,WAAW,IAS7B,sBAAsB,EAAiB,CAC7C,KAAM,GAA0B,GAC1B,EAAmB,SAAS,gBAAgB,aAC5C,EAAS,EAAG,wBACZ,EAAyB,GAAmB,GAA2B,EAC7E,GAAI,EAAO,IAAM,EAEf,KAAK,GAAG,WACN,EAA0B,EAAO,IAAM,EAAO,OAAS,UAChD,EAAO,OAAS,EAEzB,KAAK,GAAG,UAAY,EAAO,OAAS,EAAmB,MAEvD,QAOI,gBAAgB,EAAe,CACrC,KAAM,GAAK,EAAE,OACb,AAAI,CAAC,GACL,MAAK,gBAAgB,KAAK,aAAa,QAAQ,IAC3C,EAAG,aAAa,kBAClB,KAAK,wBAAwB,GAE/B,KAAK,0BAA0B,IAMzB,0BAA0B,EAAiB,CACjD,GAAI,EAAG,aAAa,iBAAkB,CACpC,KAAM,GAAQ,EAAG,aAAa,cAC9B,SAAS,iBAAiB,gBAAgB,OAAW,QAAQ,GAAO,CAClE,AAAI,EAAI,aAAa,mBAAqB,QAAU,IAAQ,GAC1D,EAAI,aAAa,gBAAiB,WAGtC,KAAK,qBACL,KAAK,aAAe,KAAK,aAAa,QAAQ,IAOlD,cAAc,EAAkB,CAC9B,KAAM,GAAW,EAAE,OAEnB,OAAQ,EAAE,SACH,KAAI,SACP,AAAI,GACF,KAAK,sBAAsB,GAE7B,EAAE,kBACF,EAAE,iBACF,WAKG,KAAI,kBACJ,KAAI,cACP,WAEG,KAAI,KACP,KAAK,gBACL,UAEG,KAAI,GACP,KAAK,oBACL,UAEG,KAAI,KACP,AAAI,GAAU,aAAa,mBAAqB,OAC9C,KAAK,aAAa,GAElB,KAAK,gBAAgB,GAEvB,UAEG,KAAI,MAAO,CACd,OAAQ,GAAU,aAAa,sBACxB,QACH,KAAK,WAAW,GAChB,UACG,OAEH,KAAK,gBACL,MAEJ,UAGG,KAAI,KACP,KAAK,gBAAgB,GACrB,UAEG,KAAI,IACP,KAAK,gBAAgB,KAAK,aAAa,OAAS,GAChD,UAEG,KAAI,MACP,GAAI,GAAU,UAAY,IAExB,WAKC,KAAI,MACP,GAAU,QACV,cAIA,KAAK,aAAa,GAClB,OAEJ,EAAE,iBACF,EAAE,kBAOI,aAAa,EAAkB,CACrC,GACE,EAAE,SACF,EAAE,QACF,EAAE,SACF,EAAE,aACF,EAAE,IAAI,OAAS,GACf,CAAC,EAAE,IAAI,MAAM,MAEb,OAKF,KAAM,GAA6B,IACnC,AAAI,EAAE,UAAY,KAAK,qBAAuB,GAC5C,MAAK,aAAe,IAEtB,KAAK,qBAAuB,EAAE,UAC9B,KAAK,cAAgB,EAAE,IAAI,oBAC3B,KAAM,GAAqB,KAAK,aAC9B,KAAK,cACL,aAAa,oBACf,AAAI,MAAK,aAAa,SAAW,GAAK,CAAC,GAAoB,WAAW,KAAK,gBACzE,KAAK,wBAAwB,KAAK,cAEpC,EAAE,kBACF,EAAE,iBAOJ,wBAAwB,EAAgB,CACtC,GAAI,GAAI,KAAK,aAAe,EAI5B,IAHI,EAAI,KAAK,aAAa,OAAS,GACjC,GAAI,GAEC,IAAM,KAAK,cAAc,CAC9B,GAAI,KAAK,aAAa,GAAG,aAAa,oBAAoB,WAAW,GAAS,CAC5E,KAAK,gBAAgB,GACrB,OAEF,AAAI,GAAK,KAAK,aAAa,OAAS,EAClC,EAAI,EAEJ,KAKE,wBAAwB,EAAiB,CAC/C,EAAG,aAAa,mBAAqB,OAAS,KAAK,aAAa,GAAM,KAAK,WAAW,GAGhF,mBAAoB,CAC1B,KAAK,gBAAgB,KAAK,IAAI,EAAG,KAAK,aAAe,IAG/C,eAAgB,CACtB,KAAK,gBAAgB,KAAK,IAAI,KAAK,aAAa,OAAS,EAAG,KAAK,aAAe,IAG1E,aAAa,EAAiB,CACpC,EAAG,aAAa,gBAAiB,SACjC,KAAK,qBAGC,WAAW,EAAiB,CAClC,EAAG,aAAa,gBAAiB,QACjC,KAAK,qBAGC,gBAAgB,EAAwB,CAC9C,KAAM,GAAe,KAAK,WAAW,GACrC,AAAI,GACF,KAAK,gBAAgB,KAAK,aAAa,QAAQ,IAQnD,WAAW,EAAwB,CACjC,KAAM,GAAU,GAAI,QAAQ,kBAC5B,MAAK,GAGE,EAAQ,eAAe,cAA2B,eAAe,EAAQ,QAFvE,KAQH,oBAAqB,CAC3B,KAAM,GAAS,MAAM,KAAK,KAAK,GAAG,iBAA8B,sBAC1D,EAAY,MAAM,KACtB,KAAK,GAAG,iBAAiB,+DAE3B,KAAK,aAAe,EAAO,OAAO,GAAM,CAAC,EAAU,SAAS,KAchE,uBAAwB,CAOtB,YACE,EACA,EACQ,EACR,CADQ,iBAER,GAAI,CAAC,GAAa,CAAC,EAAW,CAC5B,QAAQ,KAAK,qDACb,OAGF,KAAK,cAAgB,GAAI,sBAAqB,GAE1C,GACF,MAAK,oBAAsB,GAAI,qBAAoB,IAErD,OAAO,iBAAiB,aAAc,IAAM,KAAK,oBAEjD,KAAK,iCAMC,kBAAmB,CACzB,KAAK,iCAGC,gCAAiC,CACvC,KAAM,GAAW,KAAK,2BAKtB,GAJA,KAAK,eAAe,cAAc,GAC9B,KAAK,qBACP,KAAK,oBAAoB,cAAc,GAErC,IAAa,GAAI,CACnB,KAAM,GAAW,KAAK,WAAW,cAA2B,QAAQ,OACpE,AAAI,GACF,EAAS,SAKf,0BAA2B,CACzB,MAAO,QAAO,SAAS,MAAQ,OAAO,SAAS,KAAK,OAAO,IAY/D,yBAA0B,CAKxB,YAAoB,EAAiB,CAAjB,UAClB,KAAK,SAAW,EAAG,cAAiC,UACpD,KAAK,YAAc,EAAG,cAA2B,2BAEjD,KAAK,UAAU,iBAAiB,SAAU,GAAK,KAAK,mBAAmB,IAMvE,KAAM,GAAkB,QAExB,KAAK,qBAAuB,GAAI,sBAC9B,GAAW,KAAK,6BAA6B,GAC7C,CACE,WAAY,GAAG,gBACf,UAAW,IAGf,KAAK,qBAAqB,QAAQ,KAAK,IAGzC,cAAc,EAAY,CACxB,AAAI,CAAC,KAAK,UACV,MAAK,SAAS,MAAQ,EACtB,KAAK,mBAGC,iBAAkB,CACxB,GAAI,CAAC,KAAK,aAAe,CAAC,KAAK,SAAU,OACzC,KAAM,GAAgB,KAAK,UAAU,cACrC,GAAI,IAAkB,GAAI,CACxB,KAAK,YAAY,YAAc,GAC/B,OAEF,KAAK,YAAY,YAAc,KAAK,SAAS,QAAQ,GAAe,YAG9D,mBAAmB,EAAU,CACnC,OAAO,SAAS,KAAO,IAAK,EAAE,OAA6B,QAC3D,KAAK,kBAGC,6BAA6B,EAAsC,CACzE,KAAM,GAAmB,2BACzB,EAAQ,QAAQ,GAAS,CAEvB,KAAM,GAAc,EAAM,oBAAsB,EAChD,EAAM,OAAO,UAAU,OAAO,EAAkB,CAAC,MAKvD,GAAI,mBACF,SAAS,cAAc,YACvB,SAAS,cAAc,iBACvB,SAAS,cAAc",
-  "names": []
-}
diff --git a/static/legacy/js/sidenav.ts b/static/legacy/js/sidenav.ts
deleted file mode 100644
index 4afc671..0000000
--- a/static/legacy/js/sidenav.ts
+++ /dev/null
@@ -1,542 +0,0 @@
-/*!
- * @license
- * Copyright 2019-2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-/**
- * Possible KeyboardEvent key values.
- * @private @enum {string}
- */
-const Key = {
-  UP: 'ArrowUp',
-  DOWN: 'ArrowDown',
-  LEFT: 'ArrowLeft',
-  RIGHT: 'ArrowRight',
-  ENTER: 'Enter',
-  ASTERISK: '*',
-  SPACE: ' ',
-  END: 'End',
-  HOME: 'Home',
-
-  // Global keyboard shortcuts.
-  // TODO(golang.org/issue/40246): consolidate keyboard shortcut handling to avoid
-  // this duplication.
-  Y: 'y',
-  FORWARD_SLASH: '/',
-  QUESTION_MARK: '?',
-};
-
-/**
- * The navigation tree component of the documentation page.
- */
-class DocNavTreeController {
-  /**
-   * The currently selected element.
-   */
-  private selectedEl: HTMLElement | null;
-  /**
-   * The index of the currently focused item. Used when navigating the tree
-   * using the keyboard.
-   */
-  private focusedIndex = 0;
-  /**
-   * The elements currently visible (not within a collapsed node of the tree).
-   */
-  private visibleItems: HTMLElement[] = [];
-  /**
-   * The current search string.
-   */
-  private searchString = '';
-  /**
-   * The timestamp of the last keydown event. Used to track whether to use the
-   * current search string.
-   */
-  private lastKeyDownTimeStamp = -Infinity;
-
-  /**
-   * Instantiates a navigation tree.
-   */
-  constructor(private el: Element) {
-    this.el = el;
-    this.selectedEl = null;
-    this.focusedIndex = 0;
-    this.visibleItems = [];
-    this.searchString = '';
-    this.lastKeyDownTimeStamp = -Infinity;
-    this.addEventListeners();
-    this.updateVisibleItems();
-    this.initialize();
-  }
-
-  /**
-   * Initializes the tree. Should be called only once.
-   */
-  private initialize() {
-    this.el.querySelectorAll(`[role='treeitem']`).forEach(el => {
-      el.addEventListener('click', e => this.handleItemClick(e as MouseEvent));
-    });
-
-    // TODO: remove once safehtml supports aria-owns with dynamic values.
-    this.el.querySelectorAll('[data-aria-owns]').forEach(el => {
-      el.setAttribute('aria-owns', el.getAttribute('data-aria-owns') ?? '');
-    });
-  }
-
-  private addEventListeners() {
-    this.el.addEventListener('keydown', e => this.handleKeyDown(e as KeyboardEvent));
-  }
-
-  /**
-   * Sets the visible item with the given index with the proper tabindex and
-   * focuses it.
-   */
-  setFocusedIndex(index: number) {
-    if (index === this.focusedIndex || index === -1) {
-      return;
-    }
-
-    let itemEl = this.visibleItems[this.focusedIndex];
-    itemEl.setAttribute('tabindex', '-1');
-
-    itemEl = this.visibleItems[index];
-    itemEl.setAttribute('tabindex', '0');
-    itemEl.focus();
-
-    this.focusedIndex = index;
-  }
-
-  /**
-   * Marks the navigation node with the given ID as selected. If no ID is
-   * provided, the first visible item in the tree is used.
-   */
-  setSelectedId(opt_id: string) {
-    if (this.selectedEl) {
-      this.selectedEl.removeAttribute('aria-selected');
-      this.selectedEl = null;
-    }
-    if (opt_id) {
-      this.selectedEl = this.el.querySelector(`[role='treeitem'][href='#${opt_id}']`);
-    } else if (this.visibleItems.length > 0) {
-      this.selectedEl = this.visibleItems[0];
-    }
-
-    if (!this.selectedEl) {
-      return;
-    }
-
-    // Close inactive top level item if selected id is not in its tree.
-    const topLevelExpanded = this.el.querySelector<HTMLElement>(
-      '[aria-level="1"][aria-expanded="true"]'
-    );
-    if (topLevelExpanded && !topLevelExpanded.parentElement?.contains(this.selectedEl)) {
-      this.collapseItem(topLevelExpanded);
-    }
-
-    if (this.selectedEl.getAttribute('aria-level') === '1') {
-      this.selectedEl.setAttribute('aria-expanded', 'true');
-    }
-    this.selectedEl.setAttribute('aria-selected', 'true');
-    this.expandAllParents(this.selectedEl);
-    this.scrollElementIntoView(this.selectedEl);
-  }
-
-  /**
-   * Expands all sibling items of the given element.
-   */
-  private expandAllSiblingItems(el: HTMLElement) {
-    const level = el.getAttribute('aria-level');
-    this.el.querySelectorAll(`[aria-level='${level}'][aria-expanded='false']`).forEach(el => {
-      el.setAttribute('aria-expanded', 'true');
-    });
-    this.updateVisibleItems();
-    this.focusedIndex = this.visibleItems.indexOf(el);
-  }
-
-  /**
-   * Expands all parent items of the given element.
-   */
-  private expandAllParents(el: HTMLElement) {
-    if (!this.visibleItems.includes(el)) {
-      let owningItemEl = this.owningItem(el);
-      while (owningItemEl) {
-        this.expandItem(owningItemEl);
-        owningItemEl = this.owningItem(owningItemEl);
-      }
-    }
-  }
-
-  /**
-   * Scrolls the given element into view, aligning the element in the center
-   * of the viewport. If the element is already in view, no scrolling occurs.
-   */
-  private scrollElementIntoView(el: HTMLElement) {
-    const STICKY_HEADER_HEIGHT_PX = 55;
-    const viewportHeightPx = document.documentElement.clientHeight;
-    const elRect = el.getBoundingClientRect();
-    const verticalCenterPointPx = (viewportHeightPx - STICKY_HEADER_HEIGHT_PX) / 2;
-    if (elRect.top < STICKY_HEADER_HEIGHT_PX) {
-      // Element is occluded at top of view by header or by being offscreen.
-      this.el.scrollTop -=
-        STICKY_HEADER_HEIGHT_PX - elRect.top - elRect.height + verticalCenterPointPx;
-    } else if (elRect.bottom > viewportHeightPx) {
-      // Element is below viewport.
-      this.el.scrollTop = elRect.bottom - viewportHeightPx + verticalCenterPointPx;
-    } else {
-      return;
-    }
-  }
-
-  /**
-   * Handles when a tree item is clicked.
-   */
-  private handleItemClick(e: MouseEvent) {
-    const el = e.target as HTMLSelectElement | null;
-    if (!el) return;
-    this.setFocusedIndex(this.visibleItems.indexOf(el));
-    if (el.hasAttribute('aria-expanded')) {
-      this.toggleItemExpandedState(el);
-    }
-    this.closeInactiveDocNavGroups(el);
-  }
-
-  /**
-   * Closes inactive top level nav groups when a new tree item clicked.
-   */
-  private closeInactiveDocNavGroups(el: HTMLElement) {
-    if (el.hasAttribute('aria-expanded')) {
-      const level = el.getAttribute('aria-level');
-      document.querySelectorAll(`[aria-level="${level}"]`).forEach(nav => {
-        if (nav.getAttribute('aria-expanded') === 'true' && nav !== el) {
-          nav.setAttribute('aria-expanded', 'false');
-        }
-      });
-      this.updateVisibleItems();
-      this.focusedIndex = this.visibleItems.indexOf(el);
-    }
-  }
-
-  /**
-   * Handles when a key is pressed when the component is in focus.
-   */
-  handleKeyDown(e: KeyboardEvent) {
-    const targetEl = e.target as HTMLElement | null;
-
-    switch (e.key) {
-      case Key.ASTERISK:
-        if (targetEl) {
-          this.expandAllSiblingItems(targetEl);
-        }
-        e.stopPropagation();
-        e.preventDefault();
-        return;
-
-      // Global keyboard shortcuts.
-      // TODO(golang.org/issue/40246): consolidate keyboard shortcut handling
-      // to avoid this duplication.
-      case Key.FORWARD_SLASH:
-      case Key.QUESTION_MARK:
-        return;
-
-      case Key.DOWN:
-        this.focusNextItem();
-        break;
-
-      case Key.UP:
-        this.focusPreviousItem();
-        break;
-
-      case Key.LEFT:
-        if (targetEl?.getAttribute('aria-expanded') === 'true') {
-          this.collapseItem(targetEl);
-        } else {
-          this.focusParentItem(targetEl);
-        }
-        break;
-
-      case Key.RIGHT: {
-        switch (targetEl?.getAttribute('aria-expanded')) {
-          case 'false':
-            this.expandItem(targetEl);
-            break;
-          case 'true':
-            // Select the first child.
-            this.focusNextItem();
-            break;
-        }
-        break;
-      }
-
-      case Key.HOME:
-        this.setFocusedIndex(0);
-        break;
-
-      case Key.END:
-        this.setFocusedIndex(this.visibleItems.length - 1);
-        break;
-
-      case Key.ENTER:
-        if (targetEl?.tagName === 'A') {
-          // Enter triggers desired behavior by itself.
-          return;
-        }
-      // Fall through for non-anchor items to be handled the same as when
-      // the space key is pressed.
-      // eslint-disable-next-line no-fallthrough
-      case Key.SPACE:
-        targetEl?.click();
-        break;
-
-      default:
-        // Could be a typeahead search.
-        this.handleSearch(e);
-        return;
-    }
-    e.preventDefault();
-    e.stopPropagation();
-  }
-
-  /**
-   * Handles when a key event isn’t matched by shortcut handling, indicating
-   * that the user may be attempting a typeahead search.
-   */
-  private handleSearch(e: KeyboardEvent) {
-    if (
-      e.metaKey ||
-      e.altKey ||
-      e.ctrlKey ||
-      e.isComposing ||
-      e.key.length > 1 ||
-      !e.key.match(/\S/)
-    ) {
-      return;
-    }
-
-    // KeyDown events should be within one second of each other to be considered
-    // part of the same typeahead search string.
-    const MAX_TYPEAHEAD_THRESHOLD_MS = 1000;
-    if (e.timeStamp - this.lastKeyDownTimeStamp > MAX_TYPEAHEAD_THRESHOLD_MS) {
-      this.searchString = '';
-    }
-    this.lastKeyDownTimeStamp = e.timeStamp;
-    this.searchString += e.key.toLocaleLowerCase();
-    const focusedElementText = this.visibleItems[
-      this.focusedIndex
-    ].textContent?.toLocaleLowerCase();
-    if (this.searchString.length === 1 || !focusedElementText?.startsWith(this.searchString)) {
-      this.focusNextItemWithPrefix(this.searchString);
-    }
-    e.stopPropagation();
-    e.preventDefault();
-  }
-
-  /**
-   * Focuses on the next visible tree item (after the currently focused element,
-   * wrapping the tree) that has a prefix equal to the given search string.
-   */
-  focusNextItemWithPrefix(prefix: string) {
-    let i = this.focusedIndex + 1;
-    if (i > this.visibleItems.length - 1) {
-      i = 0;
-    }
-    while (i !== this.focusedIndex) {
-      if (this.visibleItems[i].textContent?.toLocaleLowerCase().startsWith(prefix)) {
-        this.setFocusedIndex(i);
-        return;
-      }
-      if (i >= this.visibleItems.length - 1) {
-        i = 0;
-      } else {
-        i++;
-      }
-    }
-  }
-
-  private toggleItemExpandedState(el: HTMLElement) {
-    el.getAttribute('aria-expanded') === 'true' ? this.collapseItem(el) : this.expandItem(el);
-  }
-
-  private focusPreviousItem() {
-    this.setFocusedIndex(Math.max(0, this.focusedIndex - 1));
-  }
-
-  private focusNextItem() {
-    this.setFocusedIndex(Math.min(this.visibleItems.length - 1, this.focusedIndex + 1));
-  }
-
-  private collapseItem(el: HTMLElement) {
-    el.setAttribute('aria-expanded', 'false');
-    this.updateVisibleItems();
-  }
-
-  private expandItem(el: HTMLElement) {
-    el.setAttribute('aria-expanded', 'true');
-    this.updateVisibleItems();
-  }
-
-  private focusParentItem(el: HTMLElement | null) {
-    const owningItemEl = this.owningItem(el);
-    if (owningItemEl) {
-      this.setFocusedIndex(this.visibleItems.indexOf(owningItemEl));
-    }
-  }
-
-  /**
-   * @returnThe first parent item that “owns” the group that el is a member of,
-   * or null if there is none.
-   */
-  owningItem(el: HTMLElement | null) {
-    const groupEl = el?.closest(`[role='group']`);
-    if (!groupEl) {
-      return null;
-    }
-    return groupEl.parentElement?.querySelector<HTMLElement>(`[aria-owns='${groupEl.id}']`);
-  }
-
-  /**
-   * Updates which items are visible (not a child of a collapsed item).
-   */
-  private updateVisibleItems() {
-    const allEls = Array.from(this.el.querySelectorAll<HTMLElement>(`[role='treeitem']`));
-    const hiddenEls = Array.from(
-      this.el.querySelectorAll(`[aria-expanded='false'] + [role='group'] [role='treeitem']`)
-    );
-    this.visibleItems = allEls.filter(el => !hiddenEls.includes(el));
-  }
-}
-
-/**
- * Primary controller for the documentation page, handling coordination between
- * the navigation and content components. This class ensures that any
- * documentation elements in view are properly shown/highlighted in the
- * navigation components.
- *
- * Since navigation is essentially handled by anchor tags with fragment IDs as
- * hrefs, the fragment ID (referenced in this code as simply “ID”) is used to
- * look up both navigation and content nodes.
- */
-class DocPageController {
-  private navController?: DocNavTreeController;
-  private mobileNavController?: MobileNavController;
-  /**
-   * Instantiates the controller, setting up the navigation controller (both
-   * desktop and mobile), and event listeners. This should only be called once.
-   */
-  constructor(
-    sideNavEl: HTMLElement | null,
-    mobileNavEl: HTMLElement | null,
-    private contentEl: HTMLElement | null
-  ) {
-    if (!sideNavEl || !contentEl) {
-      console.warn('Unable to find all elements needed for navigation');
-      return;
-    }
-
-    this.navController = new DocNavTreeController(sideNavEl);
-
-    if (mobileNavEl) {
-      this.mobileNavController = new MobileNavController(mobileNavEl);
-    }
-    window.addEventListener('hashchange', () => this.handleHashChange());
-
-    this.updateSelectedIdFromWindowHash();
-  }
-
-  /**
-   * Handles when the location hash changes.
-   */
-  private handleHashChange() {
-    this.updateSelectedIdFromWindowHash();
-  }
-
-  private updateSelectedIdFromWindowHash() {
-    const targetId = this.targetIdFromLocationHash();
-    this.navController?.setSelectedId(targetId);
-    if (this.mobileNavController) {
-      this.mobileNavController.setSelectedId(targetId);
-    }
-    if (targetId !== '') {
-      const targetEl = this.contentEl?.querySelector<HTMLElement>(`[id='${targetId}']`);
-      if (targetEl) {
-        targetEl.focus();
-      }
-    }
-  }
-
-  targetIdFromLocationHash() {
-    return window.location.hash && window.location.hash.substr(1);
-  }
-}
-
-/**
- * Controller for the navigation element used on smaller viewports. It utilizes
- * a native <select> element for interactivity and a styled <label> for
- * displaying the selected option.
- *
- * It presumes a fixed header and that the container for the control will be
- * sticky right below the header when scrolled enough.
- */
-class MobileNavController {
-  private selectEl: HTMLSelectElement | null;
-  private labelTextEl: HTMLElement | null;
-  private intersectionObserver: IntersectionObserver;
-
-  constructor(private el: HTMLElement) {
-    this.selectEl = el.querySelector<HTMLSelectElement>('select');
-    this.labelTextEl = el.querySelector<HTMLElement>('.js-mobileNavSelectText');
-
-    this.selectEl?.addEventListener('change', e => this.handleSelectChange(e));
-
-    // We use a slight hack to detect if the mobile nav container is pinned to
-    // the bottom of the site header. The root viewport of an IntersectionObserver
-    // is inset by the header height plus one pixel to ensure that the container is
-    // considered “out of view” when in a fixed position and can be styled appropriately.
-    const ROOT_TOP_MARGIN = '-57px';
-
-    this.intersectionObserver = new IntersectionObserver(
-      entries => this.intersectionObserverCallback(entries),
-      {
-        rootMargin: `${ROOT_TOP_MARGIN} 0px 0px 0px`,
-        threshold: 1.0,
-      }
-    );
-    this.intersectionObserver.observe(this.el);
-  }
-
-  setSelectedId(id: string) {
-    if (!this.selectEl) return;
-    this.selectEl.value = id;
-    this.updateLabelText();
-  }
-
-  private updateLabelText() {
-    if (!this.labelTextEl || !this.selectEl) return;
-    const selectedIndex = this.selectEl?.selectedIndex;
-    if (selectedIndex === -1) {
-      this.labelTextEl.textContent = '';
-      return;
-    }
-    this.labelTextEl.textContent = this.selectEl.options[selectedIndex].textContent;
-  }
-
-  private handleSelectChange(e: Event) {
-    window.location.hash = `#${(e.target as HTMLSelectElement).value}`;
-    this.updateLabelText();
-  }
-
-  private intersectionObserverCallback(entries: IntersectionObserverEntry[]) {
-    const SHADOW_CSS_CLASS = 'DocNavMobile--withShadow';
-    entries.forEach(entry => {
-      // entry.isIntersecting isn’t reliable on Firefox.
-      const fullyInView = entry.intersectionRatio === 1.0;
-      entry.target.classList.toggle(SHADOW_CSS_CLASS, !fullyInView);
-    });
-  }
-}
-
-new DocPageController(
-  document.querySelector('.js-tree'),
-  document.querySelector('.js-mobileNav'),
-  document.querySelector('.js-unitDetailsContent')
-);
diff --git a/static/legacy/js/table.js b/static/legacy/js/table.js
deleted file mode 100644
index 9a90f6b..0000000
--- a/static/legacy/js/table.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * @license
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */export class ExpandableRowsTableController{constructor(t,e){this.table=t;this.toggleAll=e;this.expandAllItems=()=>{this.toggles.map(t=>t.setAttribute("aria-expanded","true")),this.update()};this.collapseAllItems=()=>{this.toggles.map(t=>t.setAttribute("aria-expanded","false")),this.update()};this.update=()=>{this.updateVisibleItems(),setTimeout(()=>this.updateGlobalToggle())};this.rows=Array.from(t.querySelectorAll("[data-aria-controls]")),this.toggles=Array.from(this.table.querySelectorAll("[aria-expanded]")),this.setAttributes(),this.attachEventListeners(),this.update()}setAttributes(){for(const t of["data-aria-controls","data-aria-labelledby","data-id"])this.table.querySelectorAll(`[${t}]`).forEach(e=>{e.setAttribute(t.replace("data-",""),e.getAttribute(t)??""),e.removeAttribute(t)})}attachEventListeners(){this.rows.forEach(t=>{t.addEventListener("click",e=>{this.handleToggleClick(e)})}),this.toggleAll?.addEventListener("click",()=>{this.expandAllItems()}),document.addEventListener("keydown",t=>{(t.ctrlKey||t.metaKey)&&t.key==="f"&&this.expandAllItems()})}handleToggleClick(t){let e=t.currentTarget;e?.hasAttribute("aria-expanded")||(e=this.table.querySelector(`button[aria-controls="${e?.getAttribute("aria-controls")}"]`));const l=e?.getAttribute("aria-expanded")==="true";e?.setAttribute("aria-expanded",l?"false":"true"),t.stopPropagation(),this.update()}updateVisibleItems(){this.rows.map(t=>{const e=t?.getAttribute("aria-expanded")==="true";t?.getAttribute("aria-controls")?.trimEnd().split(" ")?.map(s=>{const a=document.getElementById(`${s}`);e?(a?.classList.add("visible"),a?.classList.remove("hidden")):(a?.classList.add("hidden"),a?.classList.remove("visible"))})})}updateGlobalToggle(){if(!this.toggleAll)return;this.rows.some(e=>e.hasAttribute("aria-expanded"))&&(this.toggleAll.style.display="block"),this.toggles.some(e=>e.getAttribute("aria-expanded")==="false")?(this.toggleAll.innerText="Expand all",this.toggleAll.onclick=this.expandAllItems):(this.toggleAll.innerText="Collapse all",this.toggleAll.onclick=this.collapseAllItems)}}
-//# sourceMappingURL=table.js.map
diff --git a/static/legacy/js/table.js.map b/static/legacy/js/table.js.map
deleted file mode 100644
index f7c13d0..0000000
--- a/static/legacy/js/table.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "version": 3,
-  "sources": ["table.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Controller for a table element with expandable rows. Adds event listeners to\n * a toggle within a table row that controls visiblity of additional related\n * rows in the table.\n *\n * @example\n * ```typescript\n * import {ExpandableRowsTableController} from '/static/legacy/js/table';\n *\n * const el = document .querySelector<HTMLTableElement>('.js-myTableElement')\n * new ExpandableRowsTableController(el));\n * ```\n */\nexport class ExpandableRowsTableController {\n  private rows: HTMLTableRowElement[];\n  private toggles: HTMLButtonElement[];\n\n  /**\n   * Create a table controller.\n   * @param table - The table element to which the controller binds.\n   */\n  constructor(private table: HTMLTableElement, private toggleAll?: HTMLButtonElement | null) {\n    this.rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('[data-aria-controls]'));\n    this.toggles = Array.from(this.table.querySelectorAll('[aria-expanded]'));\n    this.setAttributes();\n    this.attachEventListeners();\n    this.update();\n  }\n\n  /**\n   * setAttributes sets data-aria-* and data-id attributes to regular\n   * html attributes as a workaround for limitations from safehtml.\n   */\n  private setAttributes() {\n    for (const a of ['data-aria-controls', 'data-aria-labelledby', 'data-id']) {\n      this.table.querySelectorAll(`[${a}]`).forEach(t => {\n        t.setAttribute(a.replace('data-', ''), t.getAttribute(a) ?? '');\n        t.removeAttribute(a);\n      });\n    }\n  }\n\n  private attachEventListeners() {\n    this.rows.forEach(t => {\n      t.addEventListener('click', e => {\n        this.handleToggleClick(e);\n      });\n    });\n    this.toggleAll?.addEventListener('click', () => {\n      this.expandAllItems();\n    });\n\n    document.addEventListener('keydown', e => {\n      if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n        this.expandAllItems();\n      }\n    });\n  }\n\n  private handleToggleClick(e: MouseEvent) {\n    let target = e.currentTarget as HTMLTableRowElement | null;\n    if (!target?.hasAttribute('aria-expanded')) {\n      target = this.table.querySelector(\n        `button[aria-controls=\"${target?.getAttribute('aria-controls')}\"]`\n      );\n    }\n    const isExpanded = target?.getAttribute('aria-expanded') === 'true';\n    target?.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');\n    e.stopPropagation();\n    this.update();\n  }\n\n  private expandAllItems = () => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'true'));\n    this.update();\n  };\n\n  private collapseAllItems = () => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'false'));\n    this.update();\n  };\n\n  private update = () => {\n    this.updateVisibleItems();\n    setTimeout(() => this.updateGlobalToggle());\n  };\n\n  private updateVisibleItems() {\n    this.rows.map(t => {\n      const isExpanded = t?.getAttribute('aria-expanded') === 'true';\n      const rowIds = t?.getAttribute('aria-controls')?.trimEnd().split(' ');\n      rowIds?.map(id => {\n        const target = document.getElementById(`${id}`);\n        if (isExpanded) {\n          target?.classList.add('visible');\n          target?.classList.remove('hidden');\n        } else {\n          target?.classList.add('hidden');\n          target?.classList.remove('visible');\n        }\n      });\n    });\n  }\n\n  private updateGlobalToggle() {\n    if (!this.toggleAll) return;\n    if (this.rows.some(t => t.hasAttribute('aria-expanded'))) {\n      this.toggleAll.style.display = 'block';\n    }\n    const someCollapsed = this.toggles.some(el => el.getAttribute('aria-expanded') === 'false');\n    if (someCollapsed) {\n      this.toggleAll.innerText = 'Expand all';\n      this.toggleAll.onclick = this.expandAllItems;\n    } else {\n      this.toggleAll.innerText = 'Collapse all';\n      this.toggleAll.onclick = this.collapseAllItems;\n    }\n  }\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoBO,0CAAoC,CAQzC,YAAoB,EAAiC,EAAsC,CAAvE,aAAiC,iBAmD7C,oBAAiB,IAAM,CAC7B,KAAK,QAAQ,IAAI,GAAK,EAAE,aAAa,gBAAiB,SACtD,KAAK,UAGC,sBAAmB,IAAM,CAC/B,KAAK,QAAQ,IAAI,GAAK,EAAE,aAAa,gBAAiB,UACtD,KAAK,UAGC,YAAS,IAAM,CACrB,KAAK,qBACL,WAAW,IAAM,KAAK,uBA9DtB,KAAK,KAAO,MAAM,KAAK,EAAM,iBAAsC,yBACnE,KAAK,QAAU,MAAM,KAAK,KAAK,MAAM,iBAAiB,oBACtD,KAAK,gBACL,KAAK,uBACL,KAAK,SAOC,eAAgB,CACtB,SAAW,KAAK,CAAC,qBAAsB,uBAAwB,WAC7D,KAAK,MAAM,iBAAiB,IAAI,MAAM,QAAQ,GAAK,CACjD,EAAE,aAAa,EAAE,QAAQ,QAAS,IAAK,EAAE,aAAa,IAAM,IAC5D,EAAE,gBAAgB,KAKhB,sBAAuB,CAC7B,KAAK,KAAK,QAAQ,GAAK,CACrB,EAAE,iBAAiB,QAAS,GAAK,CAC/B,KAAK,kBAAkB,OAG3B,KAAK,WAAW,iBAAiB,QAAS,IAAM,CAC9C,KAAK,mBAGP,SAAS,iBAAiB,UAAW,GAAK,CACxC,AAAK,GAAE,SAAW,EAAE,UAAY,EAAE,MAAQ,KACxC,KAAK,mBAKH,kBAAkB,EAAe,CACvC,GAAI,GAAS,EAAE,cACf,AAAK,GAAQ,aAAa,kBACxB,GAAS,KAAK,MAAM,cAClB,yBAAyB,GAAQ,aAAa,uBAGlD,KAAM,GAAa,GAAQ,aAAa,mBAAqB,OAC7D,GAAQ,aAAa,gBAAiB,EAAa,QAAU,QAC7D,EAAE,kBACF,KAAK,SAkBC,oBAAqB,CAC3B,KAAK,KAAK,IAAI,GAAK,CACjB,KAAM,GAAa,GAAG,aAAa,mBAAqB,OAExD,AADe,GAAG,aAAa,kBAAkB,UAAU,MAAM,MACzD,IAAI,GAAM,CAChB,KAAM,GAAS,SAAS,eAAe,GAAG,KAC1C,AAAI,EACF,IAAQ,UAAU,IAAI,WACtB,GAAQ,UAAU,OAAO,WAEzB,IAAQ,UAAU,IAAI,UACtB,GAAQ,UAAU,OAAO,gBAMzB,oBAAqB,CAC3B,GAAI,CAAC,KAAK,UAAW,OACrB,AAAI,KAAK,KAAK,KAAK,GAAK,EAAE,aAAa,mBACrC,MAAK,UAAU,MAAM,QAAU,SAGjC,AADsB,KAAK,QAAQ,KAAK,GAAM,EAAG,aAAa,mBAAqB,SAEjF,MAAK,UAAU,UAAY,aAC3B,KAAK,UAAU,QAAU,KAAK,gBAE9B,MAAK,UAAU,UAAY,eAC3B,KAAK,UAAU,QAAU,KAAK",
-  "names": []
-}
diff --git a/static/legacy/js/table.test.ts b/static/legacy/js/table.test.ts
deleted file mode 100644
index 681bc01..0000000
--- a/static/legacy/js/table.test.ts
+++ /dev/null
@@ -1,150 +0,0 @@
-/*!
- * @license
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-import { ExpandableRowsTableController } from './table';
-
-describe('ExpandableRowsTableController', () => {
-  let table: HTMLTableElement;
-  let toggle1: HTMLButtonElement;
-  let toggle2: HTMLButtonElement;
-  let toggleAll: HTMLButtonElement;
-
-  beforeEach(() => {
-    document.body.innerHTML = `
-      <div>
-        <button class="js-toggleAll">Expand all</button>
-      </div>
-      <table class="js-table">
-        <tbody>
-          <tr>
-            <th>Toggle</th>
-            <th>Foo</th>
-            <th>Bar</th>
-          </tr>
-          <tr>
-            <td></td>
-            <td data-id="label-id-1">Hello World</td>
-            <td>Simple row with no toggle or hidden elements</td>
-          </tr>
-          <tr data-aria-controls="hidden-row-id-1 hidden-row-id-2">
-            <td>
-              <button
-                type="button"
-                aria-expanded="false"
-                aria-label="2 more from"
-                data-aria-controls="hidden-row-id-1 hidden-row-id-2"
-                data-aria-labelledby="toggle-id-1 label-id-2"
-                data-id="toggle-id-1"
-              >
-                +
-              </button>
-            </td>
-            <td data-id="label-id-2">
-              <span>Baz</span>
-            </td>
-            <td></td>
-          </tr>
-          <tr data-id="hidden-row-id-1">
-            <td></td>
-            <td>First hidden row</td>
-            <td></td>
-          </tr>
-          <tr data-id="hidden-row-id-2">
-            <td></td>
-            <td>Second hidden row</td>
-            <td></td>
-          </tr>
-          <tr data-aria-controls="hidden-row-id-3">
-            <td>
-              <button
-                type="button"
-                aria-expanded="false"
-                aria-label="2 more from"
-                data-aria-controls="hidden-row-id-3"
-                data-aria-labelledby="toggle-id-2 label-id-3"
-                data-id="toggle-id-2"
-              >
-                +
-              </button>
-            </td>
-            <td data-id="label-id-3">
-              <span>Baz</span>
-            </td>
-            <td></td>
-          </tr>
-          <tr data-id="hidden-row-id-3">
-            <td></td>
-            <td>First hidden row</td>
-            <td></td>
-          </tr>
-        </tbody>
-      </table>
-    `;
-    table = document.querySelector<HTMLTableElement>('.js-table');
-    toggleAll = document.querySelector<HTMLButtonElement>('.js-toggleAll');
-    new ExpandableRowsTableController(table, toggleAll);
-    toggle1 = document.querySelector<HTMLButtonElement>('#toggle-id-1');
-    toggle2 = document.querySelector<HTMLButtonElement>('#toggle-id-2');
-  });
-
-  afterEach(() => {
-    document.body.innerHTML = '';
-  });
-
-  it('sets data-aria-* and data-id attributes to regular html attributes', () => {
-    expect(document.querySelector('#label-id-1')).toBeTruthy();
-    expect(
-      document.querySelector('[aria-controls="hidden-row-id-1 hidden-row-id-2"]')
-    ).toBeTruthy();
-    expect(document.querySelector('[aria-labelledby="toggle-id-1 label-id-2"]')).toBeTruthy();
-    expect(document.querySelector('#toggle-id-1')).toBeTruthy();
-    expect(document.querySelector('#label-id-2')).toBeTruthy();
-    expect(document.querySelector('#hidden-row-id-1')).toBeTruthy();
-    expect(document.querySelector('#hidden-row-id-2')).toBeTruthy();
-  });
-
-  it('hides rows with unexpanded toggles', () => {
-    expect(document.querySelector('#hidden-row-id-1').classList).toContain('hidden');
-    expect(document.querySelector('#hidden-row-id-2').classList).toContain('hidden');
-  });
-
-  it('shows rows with expanded toggles', () => {
-    toggleAll.click();
-    expect(document.querySelector('#hidden-row-id-1').classList).toContain('visible');
-    expect(document.querySelector('#hidden-row-id-2').classList).toContain('visible');
-  });
-
-  it('expands rows when entering text search', () => {
-    document.dispatchEvent(new KeyboardEvent('keydown', { key: 'f', ctrlKey: true }));
-    expect(document.querySelector('#hidden-row-id-1').classList).toContain('visible');
-    expect(document.querySelector('#hidden-row-id-2').classList).toContain('visible');
-  });
-
-  it('toggle expands and collapses all elements', async () => {
-    jest.useFakeTimers();
-    toggleAll.click();
-    jest.runAllTimers();
-    expect(document.querySelector('#hidden-row-id-1').classList).toContain('visible');
-    expect(document.querySelector('#hidden-row-id-2').classList).toContain('visible');
-    expect(toggleAll.innerText).toBe('Collapse all');
-    toggleAll.click();
-    jest.runAllTimers();
-    expect(document.querySelector('#hidden-row-id-1').classList).toContain('hidden');
-    expect(document.querySelector('#hidden-row-id-2').classList).toContain('hidden');
-    expect(toggleAll.innerText).toBe('Expand all');
-  });
-
-  it('toggle changes text only when all items expanded', () => {
-    jest.useFakeTimers();
-    toggle1.click();
-    jest.runAllTimers();
-    expect(toggleAll.innerText).toBe('Expand all');
-    toggle2.click();
-    jest.runAllTimers();
-    expect(toggleAll.innerText).toBe('Collapse all');
-  });
-});
diff --git a/static/legacy/js/table.ts b/static/legacy/js/table.ts
deleted file mode 100644
index d53c8a0..0000000
--- a/static/legacy/js/table.ts
+++ /dev/null
@@ -1,126 +0,0 @@
-/*!
- * @license
- * Copyright 2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-/**
- * Controller for a table element with expandable rows. Adds event listeners to
- * a toggle within a table row that controls visiblity of additional related
- * rows in the table.
- *
- * @example
- * ```typescript
- * import {ExpandableRowsTableController} from '/static/legacy/js/table';
- *
- * const el = document .querySelector<HTMLTableElement>('.js-myTableElement')
- * new ExpandableRowsTableController(el));
- * ```
- */
-export class ExpandableRowsTableController {
-  private rows: HTMLTableRowElement[];
-  private toggles: HTMLButtonElement[];
-
-  /**
-   * Create a table controller.
-   * @param table - The table element to which the controller binds.
-   */
-  constructor(private table: HTMLTableElement, private toggleAll?: HTMLButtonElement | null) {
-    this.rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('[data-aria-controls]'));
-    this.toggles = Array.from(this.table.querySelectorAll('[aria-expanded]'));
-    this.setAttributes();
-    this.attachEventListeners();
-    this.update();
-  }
-
-  /**
-   * setAttributes sets data-aria-* and data-id attributes to regular
-   * html attributes as a workaround for limitations from safehtml.
-   */
-  private setAttributes() {
-    for (const a of ['data-aria-controls', 'data-aria-labelledby', 'data-id']) {
-      this.table.querySelectorAll(`[${a}]`).forEach(t => {
-        t.setAttribute(a.replace('data-', ''), t.getAttribute(a) ?? '');
-        t.removeAttribute(a);
-      });
-    }
-  }
-
-  private attachEventListeners() {
-    this.rows.forEach(t => {
-      t.addEventListener('click', e => {
-        this.handleToggleClick(e);
-      });
-    });
-    this.toggleAll?.addEventListener('click', () => {
-      this.expandAllItems();
-    });
-
-    document.addEventListener('keydown', e => {
-      if ((e.ctrlKey || e.metaKey) && e.key === 'f') {
-        this.expandAllItems();
-      }
-    });
-  }
-
-  private handleToggleClick(e: MouseEvent) {
-    let target = e.currentTarget as HTMLTableRowElement | null;
-    if (!target?.hasAttribute('aria-expanded')) {
-      target = this.table.querySelector(
-        `button[aria-controls="${target?.getAttribute('aria-controls')}"]`
-      );
-    }
-    const isExpanded = target?.getAttribute('aria-expanded') === 'true';
-    target?.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');
-    e.stopPropagation();
-    this.update();
-  }
-
-  private expandAllItems = () => {
-    this.toggles.map(t => t.setAttribute('aria-expanded', 'true'));
-    this.update();
-  };
-
-  private collapseAllItems = () => {
-    this.toggles.map(t => t.setAttribute('aria-expanded', 'false'));
-    this.update();
-  };
-
-  private update = () => {
-    this.updateVisibleItems();
-    setTimeout(() => this.updateGlobalToggle());
-  };
-
-  private updateVisibleItems() {
-    this.rows.map(t => {
-      const isExpanded = t?.getAttribute('aria-expanded') === 'true';
-      const rowIds = t?.getAttribute('aria-controls')?.trimEnd().split(' ');
-      rowIds?.map(id => {
-        const target = document.getElementById(`${id}`);
-        if (isExpanded) {
-          target?.classList.add('visible');
-          target?.classList.remove('hidden');
-        } else {
-          target?.classList.add('hidden');
-          target?.classList.remove('visible');
-        }
-      });
-    });
-  }
-
-  private updateGlobalToggle() {
-    if (!this.toggleAll) return;
-    if (this.rows.some(t => t.hasAttribute('aria-expanded'))) {
-      this.toggleAll.style.display = 'block';
-    }
-    const someCollapsed = this.toggles.some(el => el.getAttribute('aria-expanded') === 'false');
-    if (someCollapsed) {
-      this.toggleAll.innerText = 'Expand all';
-      this.toggleAll.onclick = this.expandAllItems;
-    } else {
-      this.toggleAll.innerText = 'Collapse all';
-      this.toggleAll.onclick = this.collapseAllItems;
-    }
-  }
-}
diff --git a/static/legacy/js/toggle-tip.js b/static/legacy/js/toggle-tip.js
deleted file mode 100644
index 557e16a..0000000
--- a/static/legacy/js/toggle-tip.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * @license
- * Copyright 2019-2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */const toggles=document.querySelectorAll("[data-toggletip-content]");toggles.forEach(t=>{const i=t.getAttribute("data-toggletip-content"),e=t.nextElementSibling;t.addEventListener("click",()=>{!e||(e.innerHTML="",setTimeout(()=>{e.innerHTML='<span class="UnitMetaDetails-toggletipBubble">'+i+"</span>"},100))}),document.addEventListener("click",n=>{if(t!==n.target){if(!e)return;e.innerHTML=""}}),t.addEventListener("keydown",n=>{!e||n.key==="Escape"&&(e.innerHTML="")})});
-//# sourceMappingURL=toggle-tip.js.map
diff --git a/static/legacy/js/toggle-tip.js.map b/static/legacy/js/toggle-tip.js.map
deleted file mode 100644
index 2a16f6e..0000000
--- a/static/legacy/js/toggle-tip.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "version": 3,
-  "sources": ["toggle-tip.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2019-2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nconst toggles = document.querySelectorAll('[data-toggletip-content]');\n\n/**\n * Adds event listeners to toggletip elements to display their\n * content when the toggle button is pressed. Used in the right\n * sidebar details section.\n */\ntoggles.forEach(toggle => {\n  const message = toggle.getAttribute('data-toggletip-content');\n  const tip = toggle.nextElementSibling;\n  toggle.addEventListener('click', () => {\n    if (!tip) {\n      return;\n    }\n    tip.innerHTML = '';\n    setTimeout(() => {\n      tip.innerHTML = '<span class=\"UnitMetaDetails-toggletipBubble\">' + message + '</span>';\n    }, 100);\n  });\n\n  // Close on outside click\n  document.addEventListener('click', e => {\n    if (toggle !== e.target) {\n      if (!tip) {\n        return;\n      }\n      tip.innerHTML = '';\n    }\n  });\n\n  // Remove toggletip on ESC\n  toggle.addEventListener('keydown', e => {\n    if (!tip) {\n      return;\n    }\n    if ((e as KeyboardEvent).key === 'Escape') {\n      tip.innerHTML = '';\n    }\n  });\n});\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOA,KAAM,SAAU,SAAS,iBAAiB,4BAO1C,QAAQ,QAAQ,GAAU,CACxB,KAAM,GAAU,EAAO,aAAa,0BAC9B,EAAM,EAAO,mBACnB,EAAO,iBAAiB,QAAS,IAAM,CACrC,AAAI,CAAC,GAGL,GAAI,UAAY,GAChB,WAAW,IAAM,CACf,EAAI,UAAY,iDAAmD,EAAU,WAC5E,QAIL,SAAS,iBAAiB,QAAS,GAAK,CACtC,GAAI,IAAW,EAAE,OAAQ,CACvB,GAAI,CAAC,EACH,OAEF,EAAI,UAAY,MAKpB,EAAO,iBAAiB,UAAW,GAAK,CACtC,AAAI,CAAC,GAGA,EAAoB,MAAQ,UAC/B,GAAI,UAAY",
-  "names": []
-}
diff --git a/static/legacy/js/toggle-tip.ts b/static/legacy/js/toggle-tip.ts
deleted file mode 100644
index 9db2e0e..0000000
--- a/static/legacy/js/toggle-tip.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/*!
- * @license
- * Copyright 2019-2020 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-const toggles = document.querySelectorAll('[data-toggletip-content]');
-
-/**
- * Adds event listeners to toggletip elements to display their
- * content when the toggle button is pressed. Used in the right
- * sidebar details section.
- */
-toggles.forEach(toggle => {
-  const message = toggle.getAttribute('data-toggletip-content');
-  const tip = toggle.nextElementSibling;
-  toggle.addEventListener('click', () => {
-    if (!tip) {
-      return;
-    }
-    tip.innerHTML = '';
-    setTimeout(() => {
-      tip.innerHTML = '<span class="UnitMetaDetails-toggletipBubble">' + message + '</span>';
-    }, 100);
-  });
-
-  // Close on outside click
-  document.addEventListener('click', e => {
-    if (toggle !== e.target) {
-      if (!tip) {
-        return;
-      }
-      tip.innerHTML = '';
-    }
-  });
-
-  // Remove toggletip on ESC
-  toggle.addEventListener('keydown', e => {
-    if (!tip) {
-      return;
-    }
-    if ((e as KeyboardEvent).key === 'Escape') {
-      tip.innerHTML = '';
-    }
-  });
-});
diff --git a/static/legacy/js/unit.js b/static/legacy/js/unit.js
deleted file mode 100644
index 102256d..0000000
--- a/static/legacy/js/unit.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * @license
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */import{CopyToClipboardController as p}from"./clipboard.js";import"./toggle-tip.js";import{ExpandableRowsTableController as y}from"./table.js";document.querySelectorAll(".js-expandableTable").forEach(e=>new y(e,document.querySelector(".js-expandAllDirectories"))),document.querySelectorAll(".js-copyToClipboard").forEach(e=>{new p(e)});const t=document.querySelector(".js-readme"),l=document.querySelector(".js-readmeContent"),s=document.querySelector(".js-readmeOutline"),o=document.querySelectorAll(".js-readmeExpand"),i=document.querySelector(".js-readmeCollapse"),E=document.querySelector(".DocNavMobile-select");t&&l&&s&&o.length&&i&&(window.location.hash.includes("readme")&&t.classList.add("UnitReadme--expanded"),E?.addEventListener("change",e=>{e.target.value.startsWith("readme-")&&t.classList.add("UnitReadme--expanded")}),o.forEach(e=>e.addEventListener("click",n=>{n.preventDefault(),t.classList.add("UnitReadme--expanded"),t.scrollIntoView()})),i.addEventListener("click",e=>{e.preventDefault(),t.classList.remove("UnitReadme--expanded"),o[1]&&o[1].scrollIntoView({block:"center"})}),l.addEventListener("keyup",()=>{t.classList.add("UnitReadme--expanded")}),l.addEventListener("click",()=>{t.classList.add("UnitReadme--expanded")}),s.addEventListener("click",()=>{t.classList.add("UnitReadme--expanded")}),document.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&e.key==="f"&&t.classList.add("UnitReadme--expanded")}));for(const e of document.querySelectorAll(".js-deprecatedTagLink")){const n=new URL(e.href).hash,d=document.querySelector(n)?.parentElement?.parentElement;d&&(e.addEventListener("click",()=>{d.open=!0}),location.hash===n&&(d.open=!0))}const m=document.querySelector(".js-readmeOption");m&&!t&&m.setAttribute("disabled","true");const L=document.querySelector(".js-unitDirectories"),u=document.querySelector(".js-directoriesOption");!L&&u&&u.setAttribute("disabled","true"),document.querySelectorAll(".js-buildContextSelect").forEach(e=>{e.addEventListener("change",n=>{window.location.search=`?GOOS=${n.target.value}`})});const r=document.querySelector(".js-unitHeader");r?.addEventListener("dblclick",e=>{e.target===r.firstElementChild&&r.classList.contains("UnitHeader--sticky")&&(window.getSelection()?.removeAllRanges(),window.scrollTo({top:0}))});const c=document.querySelector(".UnitHeader"),f=c?.querySelector(".UnitHeader-breadcrumbs"),g=c?.querySelector(".UnitHeader-content"),a=()=>{document.documentElement.style.removeProperty("--full-header-height"),document.documentElement.style.setProperty("--full-header-height",`${(c?.getBoundingClientRect().height??0)/16}rem`),document.documentElement.style.setProperty("--banner-height","0rem"),document.documentElement.style.setProperty("--breadcrumbs-height",`${(f?.getBoundingClientRect().height??0)/16}rem`),document.documentElement.style.setProperty("--content-height",`${(g?.getBoundingClientRect().height??0)/16}rem`)};a(),window.addEventListener("resize",function(){a()});const S=new IntersectionObserver(([e])=>{e.intersectionRatio<1?(r?.classList.add("UnitHeader--sticky"),r?.classList.remove("UnitHeader--full")):(r?.classList.remove("UnitHeader--sticky"),r?.classList.add("UnitHeader--full"),a())},{threshold:1,rootMargin:"40px"}),h=document.querySelector(".js-headerSentinel");h&&S.observe(h);
-//# sourceMappingURL=unit.js.map
diff --git a/static/legacy/js/unit.js.map b/static/legacy/js/unit.js.map
deleted file mode 100644
index a4ed7cf..0000000
--- a/static/legacy/js/unit.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "version": 3,
-  "sources": ["unit.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { CopyToClipboardController } from './clipboard.js';\nimport './toggle-tip.js';\nimport { ExpandableRowsTableController } from './table.js';\n\ndocument\n  .querySelectorAll<HTMLTableElement>('.js-expandableTable')\n  .forEach(\n    el =>\n      new ExpandableRowsTableController(\n        el,\n        document.querySelector<HTMLButtonElement>('.js-expandAllDirectories')\n      )\n  );\n\n/**\n * Instantiates CopyToClipboardController controller copy buttons\n * on the unit page.\n */\ndocument.querySelectorAll<HTMLButtonElement>('.js-copyToClipboard').forEach(el => {\n  new CopyToClipboardController(el);\n});\n\n/**\n * Event handlers for expanding and collapsing the readme section.\n */\nconst readme = document.querySelector('.js-readme');\nconst readmeContent = document.querySelector('.js-readmeContent');\nconst readmeOutline = document.querySelector('.js-readmeOutline');\nconst readmeExpand = document.querySelectorAll('.js-readmeExpand');\nconst readmeCollapse = document.querySelector('.js-readmeCollapse');\nconst mobileNavSelect = document.querySelector<HTMLSelectElement>('.DocNavMobile-select');\nif (readme && readmeContent && readmeOutline && readmeExpand.length && readmeCollapse) {\n  if (window.location.hash.includes('readme')) {\n    readme.classList.add('UnitReadme--expanded');\n  }\n  mobileNavSelect?.addEventListener('change', e => {\n    if ((e.target as HTMLSelectElement).value.startsWith('readme-')) {\n      readme.classList.add('UnitReadme--expanded');\n    }\n  });\n  readmeExpand.forEach(el =>\n    el.addEventListener('click', e => {\n      e.preventDefault();\n      readme.classList.add('UnitReadme--expanded');\n      readme.scrollIntoView();\n    })\n  );\n  readmeCollapse.addEventListener('click', e => {\n    e.preventDefault();\n    readme.classList.remove('UnitReadme--expanded');\n    if (readmeExpand[1]) {\n      readmeExpand[1].scrollIntoView({ block: 'center' });\n    }\n  });\n  readmeContent.addEventListener('keyup', () => {\n    readme.classList.add('UnitReadme--expanded');\n  });\n  readmeContent.addEventListener('click', () => {\n    readme.classList.add('UnitReadme--expanded');\n  });\n  readmeOutline.addEventListener('click', () => {\n    readme.classList.add('UnitReadme--expanded');\n  });\n  document.addEventListener('keydown', e => {\n    if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n      readme.classList.add('UnitReadme--expanded');\n    }\n  });\n}\n\n/**\n * Expand details items that are focused. This will expand\n * deprecated symbols when they are navigated to from the index\n * or a direct link.\n */\nfor (const a of document.querySelectorAll<HTMLAnchorElement>('.js-deprecatedTagLink')) {\n  const hash = new URL(a.href).hash;\n  const heading = document.querySelector(hash);\n  const details = heading?.parentElement?.parentElement as HTMLDetailsElement | null;\n  if (details) {\n    a.addEventListener('click', () => {\n      details.open = true;\n    });\n    if (location.hash === hash) {\n      details.open = true;\n    }\n  }\n}\n\n/**\n * Disable unavailable sections in navigation dropdown on mobile.\n */\nconst readmeOption = document.querySelector('.js-readmeOption');\nif (readmeOption && !readme) {\n  readmeOption.setAttribute('disabled', 'true');\n}\nconst unitDirectories = document.querySelector('.js-unitDirectories');\nconst directoriesOption = document.querySelector('.js-directoriesOption');\nif (!unitDirectories && directoriesOption) {\n  directoriesOption.setAttribute('disabled', 'true');\n}\ndocument.querySelectorAll('.js-buildContextSelect').forEach(el => {\n  el.addEventListener('change', e => {\n    window.location.search = `?GOOS=${(e.target as HTMLSelectElement).value}`;\n  });\n});\n\n/**\n * Adds double click event listener to the header that will\n * scroll the page back to the top.\n */\nconst unitHeader = document.querySelector('.js-unitHeader');\nunitHeader?.addEventListener('dblclick', e => {\n  const target = e.target as HTMLElement;\n  if (\n    target === unitHeader.firstElementChild &&\n    unitHeader.classList.contains('UnitHeader--sticky')\n  ) {\n    window.getSelection()?.removeAllRanges();\n    window.scrollTo({ top: 0 });\n  }\n});\n\n/**\n * Calculates dynamic heights values for header elements to support\n * variable size sticky positioned elements in the header so that banners\n * and breadcumbs may overflow to multiple lines.\n */\nconst header = document.querySelector<HTMLElement>('.UnitHeader');\nconst breadcrumbs = header?.querySelector<HTMLElement>('.UnitHeader-breadcrumbs');\nconst content = header?.querySelector<HTMLElement>('.UnitHeader-content');\nconst calcSize = () => {\n  document.documentElement.style.removeProperty('--full-header-height');\n  document.documentElement.style.setProperty(\n    '--full-header-height',\n    `${(header?.getBoundingClientRect().height ?? 0) / 16}rem`\n  );\n  document.documentElement.style.setProperty('--banner-height', `0rem`);\n  document.documentElement.style.setProperty(\n    '--breadcrumbs-height',\n    `${(breadcrumbs?.getBoundingClientRect().height ?? 0) / 16}rem`\n  );\n  document.documentElement.style.setProperty(\n    '--content-height',\n    `${(content?.getBoundingClientRect().height ?? 0) / 16}rem`\n  );\n};\ncalcSize();\nwindow.addEventListener('resize', function () {\n  calcSize();\n});\n\n/**\n * Observer for header that applies classnames to transition\n * header elements into their sticky position and back into the\n * full size position.\n */\nconst observer = new IntersectionObserver(\n  ([e]) => {\n    if (e.intersectionRatio < 1) {\n      unitHeader?.classList.add('UnitHeader--sticky');\n      unitHeader?.classList.remove('UnitHeader--full');\n    } else {\n      unitHeader?.classList.remove('UnitHeader--sticky');\n      unitHeader?.classList.add('UnitHeader--full');\n      calcSize();\n    }\n  },\n  { threshold: 1.0, rootMargin: '40px' }\n);\n\nconst headerSentinel = document.querySelector('.js-headerSentinel');\nif (headerSentinel) {\n  observer.observe(headerSentinel);\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOA,2DACA,wBACA,2DAEA,SACG,iBAAmC,uBACnC,QACC,GACE,GAAI,GACF,EACA,SAAS,cAAiC,8BAQlD,SAAS,iBAAoC,uBAAuB,QAAQ,GAAM,CAChF,GAAI,GAA0B,KAMhC,KAAM,GAAS,SAAS,cAAc,cAChC,EAAgB,SAAS,cAAc,qBACvC,EAAgB,SAAS,cAAc,qBACvC,EAAe,SAAS,iBAAiB,oBACzC,EAAiB,SAAS,cAAc,sBACxC,EAAkB,SAAS,cAAiC,wBAClE,AAAI,GAAU,GAAiB,GAAiB,EAAa,QAAU,GACjE,QAAO,SAAS,KAAK,SAAS,WAChC,EAAO,UAAU,IAAI,wBAEvB,GAAiB,iBAAiB,SAAU,GAAK,CAC/C,AAAK,EAAE,OAA6B,MAAM,WAAW,YACnD,EAAO,UAAU,IAAI,0BAGzB,EAAa,QAAQ,GACnB,EAAG,iBAAiB,QAAS,GAAK,CAChC,EAAE,iBACF,EAAO,UAAU,IAAI,wBACrB,EAAO,oBAGX,EAAe,iBAAiB,QAAS,GAAK,CAC5C,EAAE,iBACF,EAAO,UAAU,OAAO,wBACpB,EAAa,IACf,EAAa,GAAG,eAAe,CAAE,MAAO,aAG5C,EAAc,iBAAiB,QAAS,IAAM,CAC5C,EAAO,UAAU,IAAI,0BAEvB,EAAc,iBAAiB,QAAS,IAAM,CAC5C,EAAO,UAAU,IAAI,0BAEvB,EAAc,iBAAiB,QAAS,IAAM,CAC5C,EAAO,UAAU,IAAI,0BAEvB,SAAS,iBAAiB,UAAW,GAAK,CACxC,AAAK,GAAE,SAAW,EAAE,UAAY,EAAE,MAAQ,KACxC,EAAO,UAAU,IAAI,2BAU3B,SAAW,KAAK,UAAS,iBAAoC,yBAA0B,CACrF,KAAM,GAAO,GAAI,KAAI,EAAE,MAAM,KAEvB,EAAU,AADA,SAAS,cAAc,IACd,eAAe,cACxC,AAAI,GACF,GAAE,iBAAiB,QAAS,IAAM,CAChC,EAAQ,KAAO,KAEb,SAAS,OAAS,GACpB,GAAQ,KAAO,KAQrB,KAAM,GAAe,SAAS,cAAc,oBAC5C,AAAI,GAAgB,CAAC,GACnB,EAAa,aAAa,WAAY,QAExC,KAAM,GAAkB,SAAS,cAAc,uBACzC,EAAoB,SAAS,cAAc,yBACjD,AAAI,CAAC,GAAmB,GACtB,EAAkB,aAAa,WAAY,QAE7C,SAAS,iBAAiB,0BAA0B,QAAQ,GAAM,CAChE,EAAG,iBAAiB,SAAU,GAAK,CACjC,OAAO,SAAS,OAAS,SAAU,EAAE,OAA6B,YAQtE,KAAM,GAAa,SAAS,cAAc,kBAC1C,GAAY,iBAAiB,WAAY,GAAK,CAE5C,AACE,AAFa,EAAE,SAEJ,EAAW,mBACtB,EAAW,UAAU,SAAS,uBAE9B,QAAO,gBAAgB,kBACvB,OAAO,SAAS,CAAE,IAAK,OAS3B,KAAM,GAAS,SAAS,cAA2B,eAC7C,EAAc,GAAQ,cAA2B,2BACjD,EAAU,GAAQ,cAA2B,uBAC7C,EAAW,IAAM,CACrB,SAAS,gBAAgB,MAAM,eAAe,wBAC9C,SAAS,gBAAgB,MAAM,YAC7B,uBACA,GAAI,IAAQ,wBAAwB,QAAU,GAAK,SAErD,SAAS,gBAAgB,MAAM,YAAY,kBAAmB,QAC9D,SAAS,gBAAgB,MAAM,YAC7B,uBACA,GAAI,IAAa,wBAAwB,QAAU,GAAK,SAE1D,SAAS,gBAAgB,MAAM,YAC7B,mBACA,GAAI,IAAS,wBAAwB,QAAU,GAAK,UAGxD,IACA,OAAO,iBAAiB,SAAU,UAAY,CAC5C,MAQF,KAAM,GAAW,GAAI,sBACnB,CAAC,CAAC,KAAO,CACP,AAAI,EAAE,kBAAoB,EACxB,IAAY,UAAU,IAAI,sBAC1B,GAAY,UAAU,OAAO,qBAE7B,IAAY,UAAU,OAAO,sBAC7B,GAAY,UAAU,IAAI,oBAC1B,MAGJ,CAAE,UAAW,EAAK,WAAY,SAG1B,EAAiB,SAAS,cAAc,sBAC9C,AAAI,GACF,EAAS,QAAQ",
-  "names": []
-}
diff --git a/static/legacy/js/unit.ts b/static/legacy/js/unit.ts
deleted file mode 100644
index 82d0115..0000000
--- a/static/legacy/js/unit.ts
+++ /dev/null
@@ -1,182 +0,0 @@
-/*!
- * @license
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-import { CopyToClipboardController } from './clipboard.js';
-import './toggle-tip.js';
-import { ExpandableRowsTableController } from './table.js';
-
-document
-  .querySelectorAll<HTMLTableElement>('.js-expandableTable')
-  .forEach(
-    el =>
-      new ExpandableRowsTableController(
-        el,
-        document.querySelector<HTMLButtonElement>('.js-expandAllDirectories')
-      )
-  );
-
-/**
- * Instantiates CopyToClipboardController controller copy buttons
- * on the unit page.
- */
-document.querySelectorAll<HTMLButtonElement>('.js-copyToClipboard').forEach(el => {
-  new CopyToClipboardController(el);
-});
-
-/**
- * Event handlers for expanding and collapsing the readme section.
- */
-const readme = document.querySelector('.js-readme');
-const readmeContent = document.querySelector('.js-readmeContent');
-const readmeOutline = document.querySelector('.js-readmeOutline');
-const readmeExpand = document.querySelectorAll('.js-readmeExpand');
-const readmeCollapse = document.querySelector('.js-readmeCollapse');
-const mobileNavSelect = document.querySelector<HTMLSelectElement>('.DocNavMobile-select');
-if (readme && readmeContent && readmeOutline && readmeExpand.length && readmeCollapse) {
-  if (window.location.hash.includes('readme')) {
-    readme.classList.add('UnitReadme--expanded');
-  }
-  mobileNavSelect?.addEventListener('change', e => {
-    if ((e.target as HTMLSelectElement).value.startsWith('readme-')) {
-      readme.classList.add('UnitReadme--expanded');
-    }
-  });
-  readmeExpand.forEach(el =>
-    el.addEventListener('click', e => {
-      e.preventDefault();
-      readme.classList.add('UnitReadme--expanded');
-      readme.scrollIntoView();
-    })
-  );
-  readmeCollapse.addEventListener('click', e => {
-    e.preventDefault();
-    readme.classList.remove('UnitReadme--expanded');
-    if (readmeExpand[1]) {
-      readmeExpand[1].scrollIntoView({ block: 'center' });
-    }
-  });
-  readmeContent.addEventListener('keyup', () => {
-    readme.classList.add('UnitReadme--expanded');
-  });
-  readmeContent.addEventListener('click', () => {
-    readme.classList.add('UnitReadme--expanded');
-  });
-  readmeOutline.addEventListener('click', () => {
-    readme.classList.add('UnitReadme--expanded');
-  });
-  document.addEventListener('keydown', e => {
-    if ((e.ctrlKey || e.metaKey) && e.key === 'f') {
-      readme.classList.add('UnitReadme--expanded');
-    }
-  });
-}
-
-/**
- * Expand details items that are focused. This will expand
- * deprecated symbols when they are navigated to from the index
- * or a direct link.
- */
-for (const a of document.querySelectorAll<HTMLAnchorElement>('.js-deprecatedTagLink')) {
-  const hash = new URL(a.href).hash;
-  const heading = document.querySelector(hash);
-  const details = heading?.parentElement?.parentElement as HTMLDetailsElement | null;
-  if (details) {
-    a.addEventListener('click', () => {
-      details.open = true;
-    });
-    if (location.hash === hash) {
-      details.open = true;
-    }
-  }
-}
-
-/**
- * Disable unavailable sections in navigation dropdown on mobile.
- */
-const readmeOption = document.querySelector('.js-readmeOption');
-if (readmeOption && !readme) {
-  readmeOption.setAttribute('disabled', 'true');
-}
-const unitDirectories = document.querySelector('.js-unitDirectories');
-const directoriesOption = document.querySelector('.js-directoriesOption');
-if (!unitDirectories && directoriesOption) {
-  directoriesOption.setAttribute('disabled', 'true');
-}
-document.querySelectorAll('.js-buildContextSelect').forEach(el => {
-  el.addEventListener('change', e => {
-    window.location.search = `?GOOS=${(e.target as HTMLSelectElement).value}`;
-  });
-});
-
-/**
- * Adds double click event listener to the header that will
- * scroll the page back to the top.
- */
-const unitHeader = document.querySelector('.js-unitHeader');
-unitHeader?.addEventListener('dblclick', e => {
-  const target = e.target as HTMLElement;
-  if (
-    target === unitHeader.firstElementChild &&
-    unitHeader.classList.contains('UnitHeader--sticky')
-  ) {
-    window.getSelection()?.removeAllRanges();
-    window.scrollTo({ top: 0 });
-  }
-});
-
-/**
- * Calculates dynamic heights values for header elements to support
- * variable size sticky positioned elements in the header so that banners
- * and breadcumbs may overflow to multiple lines.
- */
-const header = document.querySelector<HTMLElement>('.UnitHeader');
-const breadcrumbs = header?.querySelector<HTMLElement>('.UnitHeader-breadcrumbs');
-const content = header?.querySelector<HTMLElement>('.UnitHeader-content');
-const calcSize = () => {
-  document.documentElement.style.removeProperty('--full-header-height');
-  document.documentElement.style.setProperty(
-    '--full-header-height',
-    `${(header?.getBoundingClientRect().height ?? 0) / 16}rem`
-  );
-  document.documentElement.style.setProperty('--banner-height', `0rem`);
-  document.documentElement.style.setProperty(
-    '--breadcrumbs-height',
-    `${(breadcrumbs?.getBoundingClientRect().height ?? 0) / 16}rem`
-  );
-  document.documentElement.style.setProperty(
-    '--content-height',
-    `${(content?.getBoundingClientRect().height ?? 0) / 16}rem`
-  );
-};
-calcSize();
-window.addEventListener('resize', function () {
-  calcSize();
-});
-
-/**
- * Observer for header that applies classnames to transition
- * header elements into their sticky position and back into the
- * full size position.
- */
-const observer = new IntersectionObserver(
-  ([e]) => {
-    if (e.intersectionRatio < 1) {
-      unitHeader?.classList.add('UnitHeader--sticky');
-      unitHeader?.classList.remove('UnitHeader--full');
-    } else {
-      unitHeader?.classList.remove('UnitHeader--sticky');
-      unitHeader?.classList.add('UnitHeader--full');
-      calcSize();
-    }
-  },
-  { threshold: 1.0, rootMargin: '40px' }
-);
-
-const headerSentinel = document.querySelector('.js-headerSentinel');
-if (headerSentinel) {
-  observer.observe(headerSentinel);
-}
diff --git a/static/legacy/js/versions.js b/static/legacy/js/versions.js
deleted file mode 100644
index 2165e32..0000000
--- a/static/legacy/js/versions.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * @license
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */class VersionsController{constructor(){this.expand=document.querySelector(".js-versionsExpand");this.collapse=document.querySelector(".js-versionsCollapse");this.details=[...document.querySelectorAll(".js-versionDetails")];if(!!this.expand?.parentElement){this.details.some(e=>e.tagName==="DETAILS")&&(this.expand.parentElement.style.display="block");for(const e of this.details)e.addEventListener("click",()=>{this.updateButtons()});this.expand?.addEventListener("click",()=>{this.details.map(e=>e.open=!0),this.updateButtons()}),this.collapse?.addEventListener("click",()=>{this.details.map(e=>e.open=!1),this.updateButtons()}),this.updateButtons(),this.setCurrent()}}setCurrent(){const e=document.querySelector(".js-canonicalURLPath")?.dataset?.canonicalUrlPath,t=document.querySelector(`.js-versionLink[href="${e}"]`);t&&(t.style.fontWeight="bold")}updateButtons(){setTimeout(()=>{if(!this.expand||!this.collapse)return;let e,t;for(const s of this.details)e=e||s.open,t=t||!s.open;this.expand.style.display=t?"inline-block":"none",this.collapse.style.display=t?"none":"inline-block"})}}new VersionsController;
-//# sourceMappingURL=versions.js.map
diff --git a/static/legacy/js/versions.js.map b/static/legacy/js/versions.js.map
deleted file mode 100644
index 028d44d..0000000
--- a/static/legacy/js/versions.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "version": 3,
-  "sources": ["versions.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * VersionsController encapsulates event listeners and UI updates\n * for the versions page. As the the expandable sections containing\n * the symbol history for a package are opened and closed it toggles\n * visiblity of the buttons to expand or collapse them. On page load\n * it adds an indicator to the version that matches the version request\n * by the user for the page or the canonical url path.\n */\nclass VersionsController {\n  private expand = document.querySelector<HTMLButtonElement>('.js-versionsExpand');\n  private collapse = document.querySelector<HTMLButtonElement>('.js-versionsCollapse');\n  private details = [...document.querySelectorAll<HTMLDetailsElement>('.js-versionDetails')];\n\n  constructor() {\n    if (!this.expand?.parentElement) return;\n    if (this.details.some(d => d.tagName === 'DETAILS')) {\n      this.expand.parentElement.style.display = 'block';\n    }\n\n    for (const d of this.details) {\n      d.addEventListener('click', () => {\n        this.updateButtons();\n      });\n    }\n\n    this.expand?.addEventListener('click', () => {\n      this.details.map(d => (d.open = true));\n      this.updateButtons();\n    });\n\n    this.collapse?.addEventListener('click', () => {\n      this.details.map(d => (d.open = false));\n      this.updateButtons();\n    });\n\n    this.updateButtons();\n    this.setCurrent();\n  }\n\n  /**\n   * setCurrent applies the active style to the version dot\n   * for the version that matches the canonical URL path.\n   */\n  private setCurrent() {\n    const canonicalPath = document.querySelector<HTMLElement>('.js-canonicalURLPath')?.dataset\n      ?.canonicalUrlPath;\n    const versionLink = document.querySelector<HTMLElement>(\n      `.js-versionLink[href=\"${canonicalPath}\"]`\n    );\n    if (versionLink) {\n      versionLink.style.fontWeight = 'bold';\n    }\n  }\n\n  private updateButtons() {\n    setTimeout(() => {\n      if (!this.expand || !this.collapse) return;\n      let someOpen, someClosed;\n      for (const d of this.details) {\n        someOpen = someOpen || d.open;\n        someClosed = someClosed || !d.open;\n      }\n      this.expand.style.display = someClosed ? 'inline-block' : 'none';\n      this.collapse.style.display = someClosed ? 'none' : 'inline-block';\n    });\n  }\n}\n\nnew VersionsController();\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAeA,wBAAyB,CAKvB,aAAc,CAJN,YAAS,SAAS,cAAiC,sBACnD,cAAW,SAAS,cAAiC,wBACrD,aAAU,CAAC,GAAG,SAAS,iBAAqC,uBAGlE,GAAI,EAAC,KAAK,QAAQ,cAClB,CAAI,KAAK,QAAQ,KAAK,GAAK,EAAE,UAAY,YACvC,MAAK,OAAO,cAAc,MAAM,QAAU,SAG5C,SAAW,KAAK,MAAK,QACnB,EAAE,iBAAiB,QAAS,IAAM,CAChC,KAAK,kBAIT,KAAK,QAAQ,iBAAiB,QAAS,IAAM,CAC3C,KAAK,QAAQ,IAAI,GAAM,EAAE,KAAO,IAChC,KAAK,kBAGP,KAAK,UAAU,iBAAiB,QAAS,IAAM,CAC7C,KAAK,QAAQ,IAAI,GAAM,EAAE,KAAO,IAChC,KAAK,kBAGP,KAAK,gBACL,KAAK,cAOC,YAAa,CACnB,KAAM,GAAgB,SAAS,cAA2B,yBAAyB,SAC/E,iBACE,EAAc,SAAS,cAC3B,yBAAyB,OAE3B,AAAI,GACF,GAAY,MAAM,WAAa,QAI3B,eAAgB,CACtB,WAAW,IAAM,CACf,GAAI,CAAC,KAAK,QAAU,CAAC,KAAK,SAAU,OACpC,GAAI,GAAU,EACd,SAAW,KAAK,MAAK,QACnB,EAAW,GAAY,EAAE,KACzB,EAAa,GAAc,CAAC,EAAE,KAEhC,KAAK,OAAO,MAAM,QAAU,EAAa,eAAiB,OAC1D,KAAK,SAAS,MAAM,QAAU,EAAa,OAAS,kBAK1D,GAAI",
-  "names": []
-}
diff --git a/static/legacy/js/versions.ts b/static/legacy/js/versions.ts
deleted file mode 100644
index 6ee0cd9..0000000
--- a/static/legacy/js/versions.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-/*!
- * @license
- * Copyright 2021 The Go Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-/**
- * VersionsController encapsulates event listeners and UI updates
- * for the versions page. As the the expandable sections containing
- * the symbol history for a package are opened and closed it toggles
- * visiblity of the buttons to expand or collapse them. On page load
- * it adds an indicator to the version that matches the version request
- * by the user for the page or the canonical url path.
- */
-class VersionsController {
-  private expand = document.querySelector<HTMLButtonElement>('.js-versionsExpand');
-  private collapse = document.querySelector<HTMLButtonElement>('.js-versionsCollapse');
-  private details = [...document.querySelectorAll<HTMLDetailsElement>('.js-versionDetails')];
-
-  constructor() {
-    if (!this.expand?.parentElement) return;
-    if (this.details.some(d => d.tagName === 'DETAILS')) {
-      this.expand.parentElement.style.display = 'block';
-    }
-
-    for (const d of this.details) {
-      d.addEventListener('click', () => {
-        this.updateButtons();
-      });
-    }
-
-    this.expand?.addEventListener('click', () => {
-      this.details.map(d => (d.open = true));
-      this.updateButtons();
-    });
-
-    this.collapse?.addEventListener('click', () => {
-      this.details.map(d => (d.open = false));
-      this.updateButtons();
-    });
-
-    this.updateButtons();
-    this.setCurrent();
-  }
-
-  /**
-   * setCurrent applies the active style to the version dot
-   * for the version that matches the canonical URL path.
-   */
-  private setCurrent() {
-    const canonicalPath = document.querySelector<HTMLElement>('.js-canonicalURLPath')?.dataset
-      ?.canonicalUrlPath;
-    const versionLink = document.querySelector<HTMLElement>(
-      `.js-versionLink[href="${canonicalPath}"]`
-    );
-    if (versionLink) {
-      versionLink.style.fontWeight = 'bold';
-    }
-  }
-
-  private updateButtons() {
-    setTimeout(() => {
-      if (!this.expand || !this.collapse) return;
-      let someOpen, someClosed;
-      for (const d of this.details) {
-        someOpen = someOpen || d.open;
-        someClosed = someClosed || !d.open;
-      }
-      this.expand.style.display = someClosed ? 'inline-block' : 'none';
-      this.collapse.style.display = someClosed ? 'none' : 'inline-block';
-    });
-  }
-}
-
-new VersionsController();