Skip to content

Commit 7cb6785

Browse files
committed
Implement concise view switch in API members
1 parent 26036ba commit 7cb6785

File tree

7 files changed

+132
-2
lines changed

7 files changed

+132
-2
lines changed

scaladoc-js/common/src/utils/SafeLocalStorage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class SafeLocalStorage[T <: js.Any](key: String, defaultValue: T) {
2020
def checkSupport[U](defaultValue: U)(callback: () => U): U =
2121
if isLocalStorageSupported then callback() else defaultValue
2222

23-
def parseData(data: String): T =
23+
private def parseData(data: String): T =
2424
try {
2525
Option(JSON.parse(data).asInstanceOf[T]).getOrElse(defaultValue)
2626
} catch {

scaladoc-js/main/src/ux/Ux.scala

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dotty.tools.scaladoc
22

3+
import scala.scalajs.js
34
import org.scalajs.dom._
45
import org.scalajs.dom.ext._
56

@@ -20,4 +21,31 @@ class Ux():
2021
case e: html.Span => e
2122
}.foreach(modifySpan)
2223

23-
sideMenuItemsWordBreaking()
24+
def loadConciseView(): Unit =
25+
val localStorageValue = SafeLocalStorage("__CONCISE_VIEW__", js.Array(false)) // One-element js.Array is a hack for having type extending js.Any
26+
val conciseViewSwitchInput = Option(document.getElementById("concise-view-switch"))
27+
.map(_.querySelector("input").asInstanceOf[html.Input])
28+
29+
def modifyContent(concise: Boolean) =
30+
if (concise) {
31+
document.querySelector(".membersList").classList.add("concise")
32+
} else {
33+
document.querySelector(".membersList").classList.remove("concise")
34+
}
35+
36+
conciseViewSwitchInput.foreach { input =>
37+
val storedValue = localStorageValue.getData.head
38+
modifyContent(storedValue)
39+
input.checked = storedValue
40+
input.addEventListener("change", e => {
41+
val target = e.target.asInstanceOf[html.Input]
42+
localStorageValue.setData(js.Array(target.checked))
43+
modifyContent(target.checked)
44+
})
45+
}
46+
47+
sideMenuItemsWordBreaking()
48+
loadConciseView()
49+
50+
51+

scaladoc/resources/dotty_res/styles/theme/color-tokens.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@
9292
--shadow-first: var(--shadow1);
9393
--shadow-second: var(--shadow2);
9494
--shadow-inset: var(--grey7);
95+
96+
/* switch */
97+
--switch-button: var(--grey1);
98+
--switch-background-default: var(--grey9);
99+
--switch-background-selected: var(--indigo8);
95100
}
96101

97102
:root.theme-dark {
@@ -187,4 +192,9 @@
187192
--shadow-first: var(--shadow1);
188193
--shadow-second: var(--shadow2);
189194
--shadow-inset: var(--grey7);
195+
196+
/* switch */
197+
--switch-button: var(--grey12);
198+
--switch-background-default: var(--grey9);
199+
--switch-background-selected: var(--indigo11);
190200
}

scaladoc/resources/dotty_res/styles/theme/components/api-member.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
.documentableElement .signature {
1515
margin-right: calc(3 * var(--base-spacing));
16+
line-height: 1.5;
1617
}
1718

1819
.documentableElement:hover {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
.switch {
2+
position: relative;
3+
display: inline-block;
4+
width: 32px;
5+
height: 18px;
6+
margin: var(--base-spacing);
7+
}
8+
9+
.switch input {
10+
opacity: 0;
11+
width: 0;
12+
height: 0;
13+
}
14+
15+
.slider {
16+
position: absolute;
17+
cursor: pointer;
18+
top: 0;
19+
left: 0;
20+
right: 0;
21+
bottom: 0;
22+
background-color: var(--switch-background-default);
23+
-webkit-transition: .4s;
24+
transition: .4s;
25+
border-radius: 34px;
26+
}
27+
28+
.slider:before {
29+
position: absolute;
30+
content: "";
31+
height: 16px;
32+
width: 16px;
33+
left: 1px;
34+
bottom: 1px;
35+
background-color: var(--switch-button);
36+
-webkit-transition: .4s;
37+
transition: .4s;
38+
border-radius: 50%;
39+
}
40+
41+
input:checked + .slider {
42+
background-color: var(--switch-background-selected);
43+
}
44+
45+
input:focus + .slider {
46+
box-shadow: 0 0 1px var(--switch-background-selected);
47+
}
48+
49+
input:checked + .slider:before {
50+
-webkit-transform: translateX(14px);
51+
-ms-transform: translateX(14px);
52+
transform: translateX(14px);
53+
}

scaladoc/resources/dotty_res/styles/theme/layout/content.css

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,3 +424,34 @@
424424
#content section:last-child {
425425
margin-bottom: calc(6 * var(--base-spacing));
426426
}
427+
428+
.membersList {
429+
position: relative;
430+
}
431+
432+
#concise-view-switch {
433+
position: absolute;
434+
right: 0;
435+
top: var(--base-spacing);
436+
display: flex;
437+
flex-direction: row;
438+
align-items: center;
439+
}
440+
441+
.membersList.concise .documentableElement {
442+
padding-top: var(--base-spacing);
443+
padding-bottom: var(--base-spacing);
444+
margin: var(--base-spacing);
445+
}
446+
447+
.membersList.concise .documentableBrief p {
448+
margin-block-start: 0.5em;
449+
}
450+
451+
.membersList.concise .documentableElement .modifiers {
452+
display: none;
453+
}
454+
455+
.membersList.concise .documentableElement.expand .modifiers {
456+
display: unset;
457+
}

scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,13 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
328328

329329
div(cls := "membersList expand")(
330330
h2(cls := "h500")("Members list"),
331+
div(cls := "body-small", id := "concise-view-switch")(
332+
span("Concise view"),
333+
label(cls := "switch")(
334+
input(Attr("type") := "checkbox")(),
335+
span(cls := "slider")()
336+
)
337+
),
331338
renderTabs(
332339
singleSelection = false,
333340
buildGroup("Packages", Seq(

0 commit comments

Comments
 (0)