internal,static: search design review updates

Change-Id: I3686eae51d687edb3b8afda4dead7b3469a04019
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/345512
Trust: Jamal Carvalho <jamal@golang.org>
Run-TryBot: Jamal Carvalho <jamal@golang.org>
Reviewed-by: Julie Qiu <julie@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
diff --git a/internal/frontend/paginate.go b/internal/frontend/paginate.go
index 5114597..37ac83d 100644
--- a/internal/frontend/paginate.go
+++ b/internal/frontend/paginate.go
@@ -12,6 +12,8 @@
 	"golang.org/x/pkgsite/internal/log"
 )
 
+const maxLimit = 100
+
 // pagination holds information related to paginated display. It is intended to
 // be part of a view model struct.
 //
@@ -20,7 +22,8 @@
 // 1, 2, 3, .... Each page except possibly the last has the same number of results.
 type pagination struct {
 	baseURL     *url.URL // URL common to all pages
-	Limit       int      // the maximum number of results on a page
+	Limit       int      // the number of results requested on a page
+	MaxLimit    int      // the maximum number of results allowed for any request
 	ResultCount int      // number of results on this page
 	TotalCount  int      // total number of results
 	Approximate bool     // whether or not the total count is approximate
@@ -69,6 +72,7 @@
 		ResultCount: resultCount,
 		Offset:      params.offset(),
 		Limit:       params.limit,
+		MaxLimit:    maxLimit,
 		Page:        params.page,
 		PrevPage:    prev(params.page),
 		NextPage:    next(params.page, params.limit, totalCount),
diff --git a/internal/frontend/search_test.go b/internal/frontend/search_test.go
index 55580c5..3958ad4 100644
--- a/internal/frontend/search_test.go
+++ b/internal/frontend/search_test.go
@@ -176,6 +176,7 @@
 					PrevPage:    0,
 					NextPage:    0,
 					Limit:       20,
+					MaxLimit:    100,
 					Page:        1,
 					Pages:       []int{1},
 					Limits:      []int{10, 30, 100},
@@ -203,6 +204,7 @@
 					PrevPage:    0,
 					NextPage:    0,
 					Limit:       20,
+					MaxLimit:    100,
 					Page:        1,
 					Pages:       []int{1},
 					Limits:      []int{10, 30, 100},
diff --git a/internal/frontend/server_test.go b/internal/frontend/server_test.go
index 47f8b48..771fea4 100644
--- a/internal/frontend/server_test.go
+++ b/internal/frontend/server_test.go
@@ -1136,7 +1136,7 @@
 		urlPath:        fmt.Sprintf("/search?q=%s", sample.PackageName),
 		wantStatusCode: http.StatusOK,
 		want: in("",
-			in(`[data-test-id="pagination"]`, hasText("Show"), hasText("results")),
+			in(`[data-test-id="pagination"]`, hasText("See  search help")),
 			in(`[data-test-id="snippet-title"]`,
 				href("/"+sample.ModulePath+"/foo"),
 				hasText("foo"))),
@@ -1146,9 +1146,7 @@
 		urlPath:        fmt.Sprintf("/search?q=%s", sample.PackageName),
 		wantStatusCode: http.StatusOK,
 		want: in("",
-			in(`[data-test-id="pagination"]`,
-				hasText("Show"),
-				hasText("results")),
+			in(`[data-test-id="pagination"]`, hasText("See  search help")),
 			notIn(".Pagination-navInner")),
 	},
 	{
diff --git a/static/frontend/search/search.css b/static/frontend/search/search.css
index 079f53e..6295c84 100644
--- a/static/frontend/search/search.css
+++ b/static/frontend/search/search.css
@@ -37,10 +37,11 @@
   display: flex;
   flex-direction: column;
   gap: 0.5rem;
-  padding: 0 0 2.5rem 0;
+  padding: 0 0 3.5rem 0;
 }
 .SearchSnippet h2 {
   font-size: 1.25rem;
+  font-weight: 400;
 }
 .SearchSnippet:last-of-type {
   padding: 0 0 1rem 0;
diff --git a/static/frontend/search/search.min.css b/static/frontend/search/search.min.css
index e7923f9..38956cc 100644
--- a/static/frontend/search/search.min.css
+++ b/static/frontend/search/search.min.css
@@ -3,5 +3,5 @@
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
  */
-.SearchResults{font-size:.875rem}.SearchResults-instead{font-size:1.25rem;margin-top:-.5rem}.SearchResults-insteadPrefix{color:var(--color-text)}.SearchResults-summary{color:var(--color-text-subtle);display:flex;flex-direction:column;gap:1rem;justify-content:space-between;line-height:1.5rem;margin-top:.5rem}@media only screen and (min-width: 64rem){.SearchResults-summary{align-items:baseline;flex-direction:row}}.SearchResults-emptyContentMessage{text-align:center}.SearchSnippet{display:flex;flex-direction:column;gap:.5rem;padding:0 0 2.5rem}.SearchSnippet h2{font-size:1.25rem}.SearchSnippet:last-of-type{padding:0 0 1rem}.SearchSnippet-synopsis{-webkit-box-orient:vertical;display:-webkit-box;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis}.SearchSnippet-infoLabel{display:flex;flex-wrap:wrap;gap:.5rem 1rem}.SearchSnippet-sub{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem}.SearchSnippet-symbolCode{font-size:.75rem;margin:.25rem 0}.SearchSnippet-sub a[data-hidden]{display:none}.SearchSnippet-sub a{color:var(--color-text-subtle)}.SearchSnippet-sub a:hover{color:var(--color-brand-primary)}.SearchSnippet-headerContainer{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem}.SearchSnippet-header-name{color:var(--color-text)}.SearchSnippet-header-dash{color:var(--color-text-subtle)}.SearchSnippet-symbolKind{color:var(--color-text)}.SearchPagination{height:1.5rem}
+.SearchResults{font-size:.875rem}.SearchResults-instead{font-size:1.25rem;margin-top:-.5rem}.SearchResults-insteadPrefix{color:var(--color-text)}.SearchResults-summary{color:var(--color-text-subtle);display:flex;flex-direction:column;gap:1rem;justify-content:space-between;line-height:1.5rem;margin-top:.5rem}@media only screen and (min-width: 64rem){.SearchResults-summary{align-items:baseline;flex-direction:row}}.SearchResults-emptyContentMessage{text-align:center}.SearchSnippet{display:flex;flex-direction:column;gap:.5rem;padding:0 0 3.5rem}.SearchSnippet h2{font-size:1.25rem;font-weight:400}.SearchSnippet:last-of-type{padding:0 0 1rem}.SearchSnippet-synopsis{-webkit-box-orient:vertical;display:-webkit-box;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis}.SearchSnippet-infoLabel{display:flex;flex-wrap:wrap;gap:.5rem 1rem}.SearchSnippet-sub{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem}.SearchSnippet-symbolCode{font-size:.75rem;margin:.25rem 0}.SearchSnippet-sub a[data-hidden]{display:none}.SearchSnippet-sub a{color:var(--color-text-subtle)}.SearchSnippet-sub a:hover{color:var(--color-brand-primary)}.SearchSnippet-headerContainer{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem}.SearchSnippet-header-name{color:var(--color-text)}.SearchSnippet-header-dash{color:var(--color-text-subtle)}.SearchSnippet-symbolKind{color:var(--color-text)}.SearchPagination{height:1.5rem}
 /*# sourceMappingURL=search.min.css.map */
diff --git a/static/frontend/search/search.min.css.map b/static/frontend/search/search.min.css.map
index f38574d..07893ad 100644
--- a/static/frontend/search/search.min.css.map
+++ b/static/frontend/search/search.min.css.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["search.css"],
-  "sourcesContent": ["/*\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.SearchResults {\n  font-size: 0.875rem;\n}\n.SearchResults-instead {\n  font-size: 1.25rem;\n  margin-top: -0.5rem;\n}\n.SearchResults-insteadPrefix {\n  color: var(--color-text);\n}\n.SearchResults-summary {\n  color: var(--color-text-subtle);\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n  justify-content: space-between;\n  line-height: 1.5rem;\n  margin-top: 0.5rem;\n}\n@media only screen and (min-width: 64rem) {\n  .SearchResults-summary {\n    align-items: baseline;\n    flex-direction: row;\n  }\n}\n.SearchResults-emptyContentMessage {\n  text-align: center;\n}\n\n.SearchSnippet {\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n  padding: 0 0 2.5rem 0;\n}\n.SearchSnippet h2 {\n  font-size: 1.25rem;\n}\n.SearchSnippet:last-of-type {\n  padding: 0 0 1rem 0;\n}\n.SearchSnippet-synopsis {\n  -webkit-box-orient: vertical;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.SearchSnippet-infoLabel {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.5rem 1rem;\n}\n.SearchSnippet-sub {\n  align-items: center;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.5rem;\n}\n.SearchSnippet-symbolCode {\n  font-size: 0.75rem;\n  margin: 0.25rem 0;\n}\n.SearchSnippet-sub a[data-hidden] {\n  display: none;\n}\n.SearchSnippet-sub a {\n  color: var(--color-text-subtle);\n}\n.SearchSnippet-sub a:hover {\n  color: var(--color-brand-primary);\n}\n.SearchSnippet-headerContainer {\n  align-items: center;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.5rem;\n}\n.SearchSnippet-header-name {\n  color: var(--color-text);\n}\n.SearchSnippet-header-dash {\n  color: var(--color-text-subtle);\n}\n.SearchSnippet-symbolKind {\n  color: var(--color-text);\n}\n.SearchPagination {\n  height: 1.5rem;\n}\n"],
-  "mappings": ";;;;;AAMA,eACE,kBAEF,uBACE,kBACA,kBAEF,6BACE,wBAEF,uBACE,+BACA,aACA,sBACA,SACA,8BACA,mBACA,iBAEF,0CACE,uBACE,qBACA,oBAGJ,mCACE,kBAGF,eACE,aACA,sBACA,UAtCF,mBAyCA,kBACE,kBAEF,4BA5CA,iBA+CA,wBACE,4BACA,oBACA,qBACA,gBACA,uBAEF,yBACE,aACA,eACA,eAEF,mBACE,mBACA,aACA,eACA,UAEF,0BACE,iBAlEF,gBAqEA,kCACE,aAEF,qBACE,+BAEF,2BACE,iCAEF,+BACE,mBACA,aACA,eACA,UAEF,2BACE,wBAEF,2BACE,+BAEF,0BACE,wBAEF,kBACE",
+  "sourcesContent": ["/*\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.SearchResults {\n  font-size: 0.875rem;\n}\n.SearchResults-instead {\n  font-size: 1.25rem;\n  margin-top: -0.5rem;\n}\n.SearchResults-insteadPrefix {\n  color: var(--color-text);\n}\n.SearchResults-summary {\n  color: var(--color-text-subtle);\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n  justify-content: space-between;\n  line-height: 1.5rem;\n  margin-top: 0.5rem;\n}\n@media only screen and (min-width: 64rem) {\n  .SearchResults-summary {\n    align-items: baseline;\n    flex-direction: row;\n  }\n}\n.SearchResults-emptyContentMessage {\n  text-align: center;\n}\n\n.SearchSnippet {\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n  padding: 0 0 3.5rem 0;\n}\n.SearchSnippet h2 {\n  font-size: 1.25rem;\n  font-weight: 400;\n}\n.SearchSnippet:last-of-type {\n  padding: 0 0 1rem 0;\n}\n.SearchSnippet-synopsis {\n  -webkit-box-orient: vertical;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.SearchSnippet-infoLabel {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.5rem 1rem;\n}\n.SearchSnippet-sub {\n  align-items: center;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.5rem;\n}\n.SearchSnippet-symbolCode {\n  font-size: 0.75rem;\n  margin: 0.25rem 0;\n}\n.SearchSnippet-sub a[data-hidden] {\n  display: none;\n}\n.SearchSnippet-sub a {\n  color: var(--color-text-subtle);\n}\n.SearchSnippet-sub a:hover {\n  color: var(--color-brand-primary);\n}\n.SearchSnippet-headerContainer {\n  align-items: center;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.5rem;\n}\n.SearchSnippet-header-name {\n  color: var(--color-text);\n}\n.SearchSnippet-header-dash {\n  color: var(--color-text-subtle);\n}\n.SearchSnippet-symbolKind {\n  color: var(--color-text);\n}\n.SearchPagination {\n  height: 1.5rem;\n}\n"],
+  "mappings": ";;;;;AAMA,eACE,kBAEF,uBACE,kBACA,kBAEF,6BACE,wBAEF,uBACE,+BACA,aACA,sBACA,SACA,8BACA,mBACA,iBAEF,0CACE,uBACE,qBACA,oBAGJ,mCACE,kBAGF,eACE,aACA,sBACA,UAtCF,mBAyCA,kBACE,kBACA,gBAEF,4BA7CA,iBAgDA,wBACE,4BACA,oBACA,qBACA,gBACA,uBAEF,yBACE,aACA,eACA,eAEF,mBACE,mBACA,aACA,eACA,UAEF,0BACE,iBAnEF,gBAsEA,kCACE,aAEF,qBACE,+BAEF,2BACE,iCAEF,+BACE,mBACA,aACA,eACA,UAEF,2BACE,wBAEF,2BACE,+BAEF,0BACE,wBAEF,kBACE",
   "names": []
 }
diff --git a/static/frontend/search/search.tmpl b/static/frontend/search/search.tmpl
index 124e66c..e78c83e 100644
--- a/static/frontend/search/search.tmpl
+++ b/static/frontend/search/search.tmpl
@@ -35,7 +35,6 @@
         Showing <strong>{{len $.Results}}</strong> matching {{.SearchModeSymbol}}s.
         <a href="/search-help">Search help</a>
       </div>
-      {{template "search_pagination" .}}
     </div>
   {{end}}
   {{if eq (len .Results) 0}}
@@ -87,7 +86,6 @@
       <div>
         Showing <strong>{{len .Results}}</strong> modules with matching packages. <a href="/search-help">Search help</a>
       </div>
-      {{template "search_pagination" .}}
     </div>
   {{end}}
   {{if eq (len .Results) 0}}
@@ -182,14 +180,13 @@
 {{end}}
 
 {{define "search_pagination"}}
-  {{ $p := .Pagination }}
-  <label class="go-Label go-Label--inline SearchPagination" data-test-id="pagination">
-    Show
-    <select data-gtmc="search limit select" aria-label="Select number of results" name="limit" class="go-Select js-selectNav">
-      {{range $p.Limits}}
-        <option value="{{$p.URL . $.SearchMode ""}}"{{if eq . $p.Limit}} selected{{end}}>{{.}}</option>
-      {{end}}
-    </select>
-    results
-  </label>
+  {{$p := .Pagination}}
+  <div class="SearchPagination" data-test-id="pagination">
+    Didn't find what you were looking for?&nbsp;
+    {{- if and (lt $p.Limit $p.MaxLimit) (eq $p.Limit (len .Results)) -}}
+      <a href="{{$p.URL $p.MaxLimit $.SearchMode ""}}" data-gtmc="search more results">Show more results.</a>
+    {{- else -}}
+      See <a href="/search-help" data-gtmc="search help"> search help.</a>
+    {{- end -}}
+  </div>
 {{end}}
diff --git a/tests/e2e/__image_snapshots__/ci/grouped-search--identifier-context-snap.png b/tests/e2e/__image_snapshots__/ci/grouped-search--identifier-context-snap.png
new file mode 100644
index 0000000..557a09a
--- /dev/null
+++ b/tests/e2e/__image_snapshots__/ci/grouped-search--identifier-context-snap.png
Binary files differ
diff --git a/tests/e2e/__image_snapshots__/ci/grouped-search--identifier-no-results-snap.png b/tests/e2e/__image_snapshots__/ci/grouped-search--identifier-no-results-snap.png
new file mode 100644
index 0000000..ef72839
--- /dev/null
+++ b/tests/e2e/__image_snapshots__/ci/grouped-search--identifier-no-results-snap.png
Binary files differ
diff --git a/tests/e2e/__image_snapshots__/ci/grouped-search--package-http-snap.png b/tests/e2e/__image_snapshots__/ci/grouped-search--package-http-snap.png
new file mode 100644
index 0000000..05f4dbd
--- /dev/null
+++ b/tests/e2e/__image_snapshots__/ci/grouped-search--package-http-snap.png
Binary files differ
diff --git a/tests/e2e/__image_snapshots__/ci/grouped-search--package-no-results-snap.png b/tests/e2e/__image_snapshots__/ci/grouped-search--package-no-results-snap.png
new file mode 100644
index 0000000..b7260f4
--- /dev/null
+++ b/tests/e2e/__image_snapshots__/ci/grouped-search--package-no-results-snap.png
Binary files differ