Skip to content

Commit d83571f

Browse files
authored
feat: dark mode (#1055)
Closes #18
1 parent 93bb2fe commit d83571f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+1233
-772
lines changed

Cargo.lock

+235-123
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/Cargo.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ deno_semver = "0.7.1"
7878
flate2 = "1"
7979
thiserror = "2"
8080
async-tar = "0.4.2"
81-
deno_graph = "0.87.0"
82-
deno_ast = { version = "0.44.0", features = ["view"] }
83-
deno_doc = { version = "0.165.0", features = ["comrak"] }
81+
deno_graph = "0.89.4"
82+
deno_ast = { version = "0.46.5", features = ["view"] }
83+
deno_doc = { version = "0.171.1", features = ["comrak"] }
8484
deno_error = "0.5.5"
8585
comrak = { version = "0.29.0", default-features = false }
8686
ammonia = "4.0.0"

api/src/analysis.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use deno_ast::ModuleSpecifier;
1313
use deno_ast::ParsedSource;
1414
use deno_ast::SourceRange;
1515
use deno_ast::SourceRangedForSpanned;
16-
use deno_doc::DocNodeKind;
16+
use deno_doc::DocNodeDef;
1717
use deno_error::JsErrorBox;
1818
use deno_graph::source::load_data_url;
1919
use deno_graph::source::JsrUrlProvider;
@@ -161,6 +161,7 @@ async fn analyze_package_inner(
161161
reporter: None,
162162
executor: Default::default(),
163163
locker: None,
164+
skip_dynamic_deps: false,
164165
},
165166
)
166167
.await;
@@ -301,7 +302,7 @@ fn generate_score(
301302
.get(main_entrypoint)
302303
.unwrap()
303304
.iter()
304-
.find(|node| node.kind() == DocNodeKind::ModuleDoc)
305+
.find(|node| matches!(node.def, DocNodeDef::ModuleDoc))
305306
.map(|node| &node.js_doc)
306307
});
307308

@@ -346,7 +347,7 @@ fn all_entrypoints_have_module_doc(
346347
) -> bool {
347348
'modules: for (specifier, nodes) in doc_nodes_by_url {
348349
for node in nodes {
349-
if node.kind() == DocNodeKind::ModuleDoc {
350+
if matches!(node.def, DocNodeDef::ModuleDoc) {
350351
continue 'modules;
351352
}
352353
}
@@ -371,8 +372,7 @@ fn percentage_of_symbols_with_docs(doc_nodes_by_url: &DocNodesByUrl) -> f32 {
371372

372373
for (_specifier, nodes) in doc_nodes_by_url {
373374
for node in nodes {
374-
if node.kind() == DocNodeKind::ModuleDoc
375-
|| node.kind() == DocNodeKind::Import
375+
if matches!(node.def, DocNodeDef::ModuleDoc | DocNodeDef::Import { .. })
376376
|| node.declaration_kind == deno_doc::node::DeclarationKind::Private
377377
{
378378
continue;
@@ -591,6 +591,7 @@ async fn rebuild_npm_tarball_inner(
591591
reporter: Default::default(),
592592
executor: Default::default(),
593593
locker: None,
594+
skip_dynamic_deps: false,
594595
},
595596
)
596597
.await;

api/src/api/package.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1984,6 +1984,7 @@ async fn analyze_deps_tree(
19841984
reporter: None,
19851985
executor: Default::default(),
19861986
locker: None,
1987+
skip_dynamic_deps: false,
19871988
},
19881989
)
19891990
.await;
@@ -3569,7 +3570,7 @@ ggHohNAjhbzDaY2iBW/m3NC5dehGUP4T2GBo/cwGhg==
35693570
let search: serde_json::Value = resp.expect_ok().await;
35703571
assert_eq!(
35713572
search,
3572-
json!({"nodes":[{"kind":[{"kind":"Variable","char":"v","title":"Variable"}],"name":"hello","file":".","doc":"This is a test constant.","url":"/@scope/[email protected]/doc/~/hello","deprecated":false},{"kind":[{"kind":"Variable","char":"v","title":"Variable"}],"name":"读取多键1","file":".","doc":"","url":"/@scope/[email protected]/doc/~/读取多键1","deprecated":false}]}),
3573+
json!({"kind":"search","nodes":[{"kind":[{"kind":"Variable","char":"v","title":"Variable"}],"name":"hello","file":".","doc":"This is a test constant.","url":"/@scope/[email protected]/doc/~/hello","deprecated":false},{"kind":[{"kind":"Variable","char":"v","title":"Variable"}],"name":"读取多键1","file":".","doc":"","url":"/@scope/[email protected]/doc/~/读取多键1","deprecated":false}]}),
35733574
);
35743575

35753576
// symbol doesn't exist

api/src/docs.rs

+22-25
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ use deno_doc::html::ShortPath;
1616
use deno_doc::html::UrlResolveKind;
1717
use deno_doc::html::UsageComposerEntry;
1818
use deno_doc::html::HANDLEBARS;
19-
use deno_doc::DocNode;
20-
use deno_doc::DocNodeKind;
2119
use deno_doc::Location;
20+
use deno_doc::{DocNode, DocNodeDef};
2221
use deno_semver::RangeSetOrTag;
2322
use indexmap::IndexMap;
2423
use std::borrow::Cow;
@@ -78,7 +77,7 @@ lazy_static::lazy_static! {
7877
.add_tag_attributes("rect", ["x", "y", "width", "height", "fill"])
7978
.add_tag_attributes("video", ["src", "controls"])
8079
.add_allowed_classes("pre", ["highlight"])
81-
.add_allowed_classes("button", ["context_button"])
80+
.add_allowed_classes("button", ["copyButton"])
8281
.add_allowed_classes(
8382
"div",
8483
[
@@ -571,7 +570,7 @@ pub fn generate_docs_html(
571570
partitions_by_kind.into_iter().map(|(path, nodes)| {
572571
(
573572
render_ctx.clone(),
574-
deno_doc::html::SectionHeaderCtx::new_for_namespace(
573+
deno_doc::html::SectionHeaderCtx::new_for_all_symbols(
575574
&render_ctx,
576575
&path,
577576
),
@@ -751,7 +750,7 @@ fn generate_symbol_page(
751750
let mut nodes = doc_nodes
752751
.iter()
753752
.filter(|node| {
754-
!(matches!(node.kind(), DocNodeKind::ModuleDoc | DocNodeKind::Import)
753+
!(matches!(node.def, DocNodeDef::ModuleDoc | DocNodeDef::Import { .. })
755754
|| node.declaration_kind == deno_doc::node::DeclarationKind::Private)
756755
&& node.get_name() == next_part
757756
})
@@ -769,8 +768,8 @@ fn generate_symbol_page(
769768

770769
if name_parts.peek().is_some() {
771770
for node in &nodes {
772-
let drilldown_node = match node.kind() {
773-
DocNodeKind::Class => {
771+
let drilldown_node = match &node.def {
772+
DocNodeDef::Class { class_def: class } => {
774773
let mut drilldown_parts = name_parts.clone().collect::<Vec<_>>();
775774
let mut is_static = true;
776775

@@ -788,8 +787,6 @@ fn generate_symbol_page(
788787

789788
let drilldown_name = drilldown_parts.join(".");
790789

791-
let class = node.class_def().unwrap();
792-
793790
class
794791
.methods
795792
.iter()
@@ -828,12 +825,12 @@ fn generate_symbol_page(
828825
})
829826
})
830827
}
831-
DocNodeKind::Interface => {
828+
DocNodeDef::Interface {
829+
interface_def: interface,
830+
} => {
832831
let drilldown_name =
833832
name_parts.clone().collect::<Vec<_>>().join(".");
834833

835-
let interface = node.interface_def().unwrap();
836-
837834
interface
838835
.methods
839836
.iter()
@@ -861,9 +858,9 @@ fn generate_symbol_page(
861858
})
862859
})
863860
}
864-
DocNodeKind::TypeAlias => {
865-
let type_alias = node.type_alias_def().unwrap();
866-
861+
DocNodeDef::TypeAlias {
862+
type_alias_def: type_alias,
863+
} => {
867864
if let Some(ts_type_literal) =
868865
type_alias.ts_type.type_literal.as_ref()
869866
{
@@ -900,9 +897,9 @@ fn generate_symbol_page(
900897
None
901898
}
902899
}
903-
DocNodeKind::Variable => {
904-
let variable = node.variable_def().unwrap();
905-
900+
DocNodeDef::Variable {
901+
variable_def: variable,
902+
} => {
906903
if let Some(ts_type_literal) = variable
907904
.ts_type
908905
.as_ref()
@@ -941,12 +938,12 @@ fn generate_symbol_page(
941938
None
942939
}
943940
}
944-
DocNodeKind::Import
945-
| DocNodeKind::Enum
946-
| DocNodeKind::ModuleDoc
947-
| DocNodeKind::Function
948-
| DocNodeKind::Namespace
949-
| DocNodeKind::Reference => None,
941+
DocNodeDef::Import { .. }
942+
| DocNodeDef::Enum { .. }
943+
| DocNodeDef::ModuleDoc
944+
| DocNodeDef::Function { .. }
945+
| DocNodeDef::Namespace { .. }
946+
| DocNodeDef::Reference { .. } => None,
950947
};
951948

952949
if let Some(drilldown_node) = drilldown_node {
@@ -975,7 +972,7 @@ fn generate_symbol_page(
975972

976973
if let Some(namespace_node) = nodes
977974
.iter()
978-
.find(|node| matches!(node.kind(), DocNodeKind::Namespace))
975+
.find(|node| matches!(node.def, DocNodeDef::Namespace { .. }))
979976
{
980977
namespace_paths.push(next_part.to_string());
981978
doc_nodes = namespace_node

api/src/npm/emit.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
use deno_ast::emit;
44
use deno_ast::fold_program;
5-
use deno_ast::swc::visit::VisitMutWith;
5+
use deno_ast::swc::ecma_visit::VisitMutWith;
66
use deno_ast::EmittedSourceText;
77
use deno_ast::ParsedSource;
88
use deno_ast::SourceMap;
@@ -62,7 +62,7 @@ pub fn transpile_to_js(
6262
&source_map,
6363
&comments,
6464
marks,
65-
source.diagnostics(),
65+
Box::new(source.diagnostics().iter()),
6666
)?;
6767

6868
let EmittedSourceText { text, source_map } =

api/src/npm/import_transform.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use deno_ast::swc::ast::Lit;
99
use deno_ast::swc::ast::NamedExport;
1010
use deno_ast::swc::ast::Str;
1111
use deno_ast::swc::ast::TsImportType;
12-
use deno_ast::swc::visit::VisitMut;
13-
use deno_ast::swc::visit::VisitMutWith;
12+
use deno_ast::swc::ecma_visit::VisitMut;
13+
use deno_ast::swc::ecma_visit::VisitMutWith;
1414

1515
use super::specifiers::RewriteKind;
1616
use super::specifiers::SpecifierRewriter;

frontend/components/ErrorDisplay.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { APIResponseError } from "../utils/api.ts";
33

44
export function ErrorDisplay({ error }: { error: APIResponseError }) {
55
return (
6-
<div class="border-t-8 border-red-600 p-4 bg-jsr-gray-50">
6+
<div class="border-t-8 border-red-600 p-4 bg-jsr-gray-50 dark:bg-jsr-gray-900">
77
<h1 class="text-2xl font-semibold">{error.status} - {error.code}</h1>
88
<p class="mt-4">{error.message as string}</p>
99
<p class="mt-4 text-sm">Need help? Contact [email protected]</p>
1010
<div class="flex gap-4 mt-1">
11-
<div class="bg-jsr-gray-200 py-1 px-2 font-bold text-sm inline-block">
11+
<div class="bg-jsr-gray-200 dark:bg-jsr-gray-700 py-1 px-2 font-bold text-sm inline-block">
1212
x-deno-ray: <span class="font-mono">{error.traceId as "string"}</span>
1313
</div>
1414
</div>

frontend/components/GitHubRepoInput.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export function GitHubRepoInput(
4646
}
4747

4848
return (
49-
<div class="flex items-center w-full md:w-88 rounded-md text-jsr-gray-900 shadow-sm pl-3 py-[2px] pr-[2px] sm:text-sm sm:leading-6 bg-white input-container">
49+
<div class="flex items-center w-full md:w-88 rounded-md text-primary shadow-sm pl-3 py-[2px] pr-[2px] sm:text-sm sm:leading-6 bg-white dark:bg-jsr-gray-900 input-container">
5050
<span class="block">
5151
<TbBrandGithub class="!size-5" />
5252
</span>
@@ -77,7 +77,7 @@ export function GitHubRepoInput(
7777
}}
7878
disabled={disabled}
7979
/>
80-
<span class="block text-jsr-gray-500">/</span>
80+
<span class="block text-tertiary">/</span>
8181
<input
8282
ref={repoRef}
8383
class="py-1.5 pr-4 pl-1 grow w-0 input rounded-md"

frontend/components/Header.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { UserMenu } from "../islands/UserMenu.tsx";
66
import TbBrandGithub from "tb-icons/TbBrandGithub";
77
import { SearchKind } from "../util.ts";
88
import { HeaderLogo } from "../islands/HeaderLogo.tsx";
9+
import DarkModeToggle from "../islands/DarkModeToggle.tsx";
910

1011
export function Header({
1112
user,
@@ -103,6 +104,8 @@ export function Header({
103104
</>
104105
)}
105106
<Divider />
107+
<DarkModeToggle />
108+
<Divider />
106109
{user
107110
? <UserMenu user={user} sudo={sudo} logoutUrl={logoutUrl} />
108111
: (
@@ -130,7 +133,10 @@ export function Header({
130133

131134
function Divider() {
132135
return (
133-
<span class="text-jsr-gray-200 select-none" aria-hidden="true">
136+
<span
137+
class="text-jsr-gray-200 dark:text-jsr-gray-700 select-none"
138+
aria-hidden="true"
139+
>
134140
|
135141
</span>
136142
);

frontend/components/HomepageHero.tsx

+10-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export function HomepageHero(
2525
) {
2626
return (
2727
<div
28-
class="w-screen -ml-[calc(50vw-50%)] -mt-6 bg-repeat py-32 lg:pt-48 relative before:absolute before:left-0 before:right-0 before:h-32 before:bg-gradient-to-t before:from-white before:bottom-0 before:z-10 before:pointer-events-none"
28+
class="w-screen -ml-[calc(50vw-50%)] -mt-6 bg-repeat py-32 lg:pt-48 relative before:absolute before:left-0 before:right-0 before:h-32 before:bg-gradient-to-t before:from-white dark:before:from-jsr-gray-950 before:bottom-0 before:z-10 before:pointer-events-none"
2929
id="particles-js"
3030
>
3131
<script src={asset("/scripts/particles.js")} defer></script>
@@ -38,18 +38,24 @@ export function HomepageHero(
3838
<AnimatedLogo />
3939
<div
4040
class="pointer-events-auto text-2xl text-balance leading-[1.1] sm:text-3xl md:text-3xl lg:text-4xl opsize-normal md:opsize-sm text-center -mt-5 md:-mt-6 max-w-[20em]"
41-
style="text-shadow: 0 0 2em white, 0 0 1em white, 0 0 0.5em white, 0 0 0.25em white, 0 0 3em white, 0 0 0.5em white;"
41+
style={{
42+
textShadow:
43+
"var(--text-shadow, 0 0 2em white, 0 0 1em white, 0 0 0.5em white, 0 0 0.25em white, 0 0 3em white, 0 0 0.5em white)",
44+
}}
4245
>
4346
The{" "}
44-
<b class="font-semibold text-jsr-gray-900">
47+
<b class="font-semibold text-primary">
4548
open-source package registry
4649
</b>{" "}
4750
for modern JavaScript and TypeScript
4851
</div>
4952
</h1>
5053
<div
5154
class="flex flex-row gap-3 items-center justify-center mt-4 pointer-events-auto"
52-
style="text-shadow: 0 0 2em white, 0 0 1em white, 0 0 0.5em white, 0 0 0.25em white, 0 0 3em white, 0 0 0.5em white;"
55+
style={{
56+
textShadow:
57+
"var(--text-shadow, 0 0 2em white, 0 0 1em white, 0 0 0.5em white, 0 0 0.25em white, 0 0 3em white, 0 0 0.5em white)",
58+
}}
5359
>
5460
<a class="underline text-sm relative z-10" href="/docs">
5561
Docs

0 commit comments

Comments
 (0)